Repository navigation
fix(skills): review every skill against the code - #32
Merged
Merged
Conversation
…otion mechanisms Cart, Discovery and mass operation examples used fields that do not exist, and the docs said the most specific price list wins when the lowest price does. Adds the cart price context, volume tiers and the promotion admin API.
Most Core examples and several Shop and Discovery ones used fields, arguments and types that do not exist, so they failed validation. Also corrects Discovery auth, path wildcards, Shop order paging and the order sync.
…ndoing stage moves The helpers built invalid mutations and could not rewrite payments. Pipelines take ids, Crystallize does not retry webhooks, and Shop writes reset stages moved in the App.
…iour Replace cart mutations that do not exist, fix arguments and defaults, and correct what deleting, unpublishing, publishing and Core order edits do. Add the Shop API token flow and the /customer endpoint.
Component defaults, Item Relation and validation limits, choice config and localization behaviour now match the API. SKILL.md is split into references.
…data loss The API examples could not run, the runner's identity and required fields were wrong, and templating failures were misdescribed. Documents two new price list intents, volume tiers, and fields the runner silently drops.
A price variant with tierType or tiers fails their validation, so those files need the CLI or the raw API.
…ples The rerank window is the first N by sorting, not the top matches, and taste-only queries rank the whole result set. Also fixes field names, the item taste query, and publish and ignition behaviour.
…axonomy
Topics are a built-in field and Discovery filters them with filters: { topics: ... }. The skill now says what createTopic and topic/create accept, and that Discovery returns one topics facet across all maps.
…ing and topics Discovery orders by itemId unless sorting says otherwise, taste changes need a publish rather than an ignition, an omitted stacks argument errors on a tenant already served for ranking, and shapes do not reference topics.
Bearer tokens only work on Core APIs and cannot fetch Shop API tokens, and tenant-scoped tokens are refused on /@me. Shop pipelines take ids, and examples no longer chain writes that race.
…aims Two bookings racing on one cart now refuse the loser instead of losing it silently, and availability, hydrate pairing and refusal names follow the current API. Adds the /booking/admin reference and the gotchas around plain lines, capacity counting and unit renames.
The client calls /booking, which has no GraphQL endpoint. The admin API is at /booking/admin.
…points Crystallize renews and activates contracts on schedule and fires due webhooks, while billing stays with the merchant, and Shop and Core contracts stay in sync. Corrects the lifecycle, webhook, plan and pricing claims.
…e and deleted-tenant behaviour Provisioning has its own rate limit and can answer 503 at capacity. Invites work once, a past expiresAt gives a dead link, promoting a human claims the tenant, and calls after deletion answer 403.
…and token reach Documented placements never rendered in the App, installs omitted required terms flags, and examples trusted unverified payloads. Adds private installs, reinstall, the real payload claims, where the Backend Token works, and the plugin-signal channel.
Both APIs accept a plugin Backend Token.
…level claims Replaces invented role GraphQL with the real Core API calls and corrects the token model: tokens belong to users. Documents conditions, allow-list UI preferences and full-replace updates.
The skill rejected text on formatting and block nodes, which is what the App and html input write, and put src in image metadata, which nothing renders. It now lists what the App editor keeps, what html input loses, and how json reads back.
…load to the API json:itemData is not an API payload, so the skill now routes writes to mass-operations or mutation and maps each field to the API input. SKU rules and enforced shape constraints are corrected.
Neither is part of the mass operation schema: prices and stock go in priceVariants and stockLocations.
…component behaviour
Variant formats depend on the source format, Discovery's focalPoint is a scalar that returns {}, and variants can be null. The docs now cover the Image component's real width, height, className and fetchPriority behaviour.
…ion-architecture The folder example used a field that does not exist and could not run. Rewrites it, and documents how paths, shortcuts, ordering, publishing and redirects behave.
A later Shop write to the order puts the stage back, so the warning belongs next to the order mutations as well as in the payments skill.
…f silently A refused Core read looked like an order in no pipeline, a stale Shop pipeline survived the sync, and a timeout looked like a missing customer, which then replaced a known customer. The stage webhook now surfaces a failed read as well.
… exists Container upserts replace the whole definition, so consolidation on a live tenant skips phases 1 and 2. The worked example also needs its seo piece.
…ription billing updateSubscriptionContract replaces meta, and renew fires for a called renewal too, so day-ahead billing has to come off that webhook.
Plopix
marked this pull request as ready for review
November 2, 2026 18:16
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Every skill was checked against the Crystallize source, and what was wrong is fixed. One commit per skill, plus a few follow-ups where one skill's fix changed what another should say, so it reads best commit by commit.
Why
The skills ship to everyone who installs the plugin, and agents act on them without checking. They had drifted: many examples could not run at all, and some behaviour was described backwards.
What changed
agent-tenantsbookable-resources/booking/adminreferencecontent-jsonsrcin metadata renders nowherecontent-modelSKILL.mdfrom 1,046 to under 500 lines. Component defaults, limits and choice config. Upsert replaces whole definitionsdata-creationinformation-architecturejs-api-clientshopBookingApicannot reach the booking admin APImass-operationsmutationpaymentsSKILL.mdfrom 641 to under 500 lines. Helpers built invalid mutations. Crystallize does not retry webhooks. Shop writes can undo stage movespermissionspluginspricingqueryresponsive-imagesfocalPoint. TheImagecomponent's real behavioursubscriptionstaxonomyvector-rankingsorting, not the top matches. Taste changes need a publish, not an ignitionAlso adds five new references (
crystallize-payments-lib,booking-admin,shape-consolidation,mass-operation-example,role-api) with eval cases for them. No version bump: releases are a separate workflow.Review these first
These reverse what the skills used to say, so they matter most if they are wrong:
subscriptions: a contract renews by itself nearrenewAt, and callingrenewSubscriptionContracton top moves it a second period. The old text told integrators to renew it themselves. It was verified live, but a scheduled renewal would not show up in a short test.pricing: the lowest price wins across price lists.mutationandpayments: a stage moved in Core or the App does not reach the Shop order, and the next Shop write puts it back.mass-operations: the runner acts as the user who created the task.vector-ranking: how the rerank window is chosen.How it was checked
crystallize-payments-lib.mdtype-checks against@crystallize/js-api-client7.6.0.priceandstock.SKILL.mdis under 500 lines, and every description is within 1,024 characters.tsc,oxlintand the 211 tests pass. A/code-reviewpass found ten issues, all resolved in the last three commits; the one that cannot be fixed in code (syncStageswrites pipelines one at a time) is documented.Not settled
data-creation: thejson:itemDatagrid format itself could not be checked, so those claims stand as written.pricing: "customer groups are a dead end" stays as written. The code shows no cause, so it needs a live test.payments: the Crystallize side was checked, the providers' own APIs were not.The rest of the unsettled claims were reported in the internal review notes.