Skip to content

docs(skills): the retirement kit becomes a playbook — plus the form.data correction the docs missed - #4080

Merged
os-zhuang merged 1 commit into
mainfrom
claude/sharing-rules-schema-bypass-h4c7xr
Jul 30, 2026
Merged

docs(skills): the retirement kit becomes a playbook — plus the form.data correction the docs missed#4080
os-zhuang merged 1 commit into
mainfrom
claude/sharing-rules-schema-bypass-h4c7xr

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

The #3896 enforce-or-remove line retired 20+ authorable keys across six metadata types, and every batch re-derived the same procedure from scratch — including the parts that only announce themselves as a red build. This sediments it as an internal skill, and fixes one docs defect the last batch left behind.

.claude/skills/spec-property-retirement/SKILL.md

Covers what nothing else in the repo documents: the disposition gate (enforce vs experimental vs remove, and the docs-shaped fields deliberately exempt), the three removal routes and how to pick one, the fourteen surfaces a removal touches, the gate loop, and the traps that each cost a red build. It deliberately does not repeat liveness/README.md (how a verdict is reached) or AGENTS.md (the eight generated artifacts) — it points at them.

Two findings earned their own sections:

The ledger discipline is OPPOSITE per route, and the two failures are not symmetric. retiredKey() leaves the key in the walked shape, so its liveness entry must stay (dead + verifiedAt + a REMOVED note); a strict removal takes the key out of the shape, so its entry must go. Deleting a tombstoned key's entry reports it UNCLASSIFIED and fails CI — 14 at once during the sweep. The reverse is never checked at all: the gate walks the schema and looks entries up, and never walks entries looking for absent schema keys, so a leftover entry after a strict removal rots invisibly. That asymmetry is how the stale report aria/performance entries survived a release before a human deleted them as hygiene. One direction fails loudly; the other never fails.

The build is the referee, not the ledger. A dead verdict is an input to removal, not a substitute for the build's own proof. view.form.data was on the worklist and the removal broke gen:schemadefineForm writes data: { provider: 'schema', schemaId } onto every metadata form and metadata-protocol serves it. The correct response is to correct the ledger, not force the removal. One of fourteen keys was refuted this way; the skill says to budget for it.

The bug this fixes

That correction is exactly what went wrong. When form.data flipped back to live in #4054, the schema, ledger entry, conversion and tests were all corrected — but two prose surfaces were not:

  • content/docs/releases/v17.mdx — the dead-cluster row still listed form data as removed
  • packages/spec/liveness/README.md — the view row said form.{data,defaultSort,aria} REMOVED

Both told authors to delete a key defineForm requires. Both now state it stays live, with the reason. Note the ledger counts were right the whole time (4 dead = responsive/performance/defaultSort/aria) — only the prose drifted, which is why no gate caught it. The correction path is precisely the one nobody had a checklist for, so the skill now carries one.

AGENTS.md

Two pointers it was missing:

  • The Post-Task Checklist's retirement note said only UNKNOWN_KEY_GUIDANCE, while build-schemas.ts has prescribed retiredKey() first since [P3] Retire the three deprecated aliases — via the ADR-0087 D2 conversion layer, not by deleting the keys #3855. Now names both routes and flags that they imply opposite ledger dispositions.
  • The Skills section listed only the published skills/ catalog, leaving both internal playbooks undiscoverable from the file agents are told to read first. Now names dogfood-verification and spec-property-retirement, with the metadata.internal: true requirement.

Verification

  • All ten spec gates pass: check:liveness, check:empty-state, check:authorable-surface, check:docs, check:api-surface, check:spec-changes, check:upgrade-guide, check:skill-refs, check:skill-docs, check:skill-examples.
  • check:i18n, check:doc-authoring, check:release-notes, check:nul-bytes clean.
  • The skills-catalog boundary test (packages/create-objectstack/src/template-consistency.test.ts, 18/18) enforces metadata.internal: true on every SKILL.md outside skills/ — it reads git ls-files, so the new file was staged before the run actually validated it.
  • Confirmed the skill-docs/skill-refs generators are scoped to root skills/ + an objectstack- prefix, so an internal skill does not move those artifacts.
  • The gate loop the skill ships was run as written. It captures exit codes explicitly instead of piping — the skill's own §6 warns that | tail -1 masks them, and the first draft of that loop leaned on an implicit $?.
  • Empty-frontmatter changeset: this releases nothing.

Generated by Claude Code

The #3896 enforce-or-remove line retired 20+ authorable keys across six
metadata types, and every batch re-derived the same procedure from scratch —
including the parts that only announce themselves as a red build. Sediment it
as an internal skill so the next retirement executes instead of excavates.

`.claude/skills/spec-property-retirement/SKILL.md` covers what nothing else
documents: the disposition gate (enforce vs experimental vs remove, and the
docs-shaped fields deliberately exempt), the three removal routes and how to
pick one, the fourteen surfaces a removal touches, and the traps that each
cost a red build. Two findings are load-bearing enough to have their own
sections:

- **The ledger discipline is OPPOSITE per route, and the failures are not
  symmetric.** `retiredKey()` leaves the key in the walked shape, so its
  liveness entry must STAY; a strict removal takes the key out, so its entry
  must GO. Deleting a tombstoned key's entry reports UNCLASSIFIED and fails CI
  (14 at once in the sweep). The reverse — a leftover entry after a strict
  removal — is never checked at all, because the gate walks the schema and
  never walks entries looking for absent keys. One direction fails loudly; the
  other rots silently, which is how the stale report `aria`/`performance`
  entries survived a release.
- **The build is the referee, not the ledger.** A `dead` verdict is an input
  to removal, not a substitute for the build's own proof. `view.form.data` was
  on the worklist and the removal broke `gen:schema` — `defineForm` writes
  `data.provider='schema'` onto every metadata form. The correct response is
  to correct the ledger, not force the removal.

That correction is also the bug this commit fixes. When `form.data` flipped
back to `live`, the schema, ledger, conversion and tests were all corrected,
but the v17 dead-cluster row and the liveness README's view row kept listing
it as removed — telling authors to delete a key `defineForm` requires. Both
now say it stays live, with the reason. The correction path is precisely what
had no checklist, so the skill carries one.

AGENTS.md gets the two pointers it was missing: the retirement note in the
Post-Task Checklist said only `UNKNOWN_KEY_GUIDANCE` while `build-schemas.ts`
has prescribed `retiredKey()` first since #3855, and the Skills section listed
only the published catalog, leaving both internal playbooks undiscoverable
from the file agents are told to read first.

Verification: all ten spec gates pass (`check:liveness`, `check:empty-state`,
`check:authorable-surface`, `check:docs`, `check:api-surface`,
`check:spec-changes`, `check:upgrade-guide`, `check:skill-refs`,
`check:skill-docs`, `check:skill-examples`), plus `check:i18n`,
`check:doc-authoring`, `check:release-notes` and the skills-catalog boundary
test that enforces `metadata.internal: true` on every SKILL.md outside
`skills/`. The gate loop the skill ships was run as written — it is the same
loop, exit codes captured explicitly rather than piped.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QuViRSR1j6GJjf9qGbnqFX
@vercel

vercel Bot commented Jul 30, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Jul 30, 2026 8:43am

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/spec.

105 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/spec)
  • content/docs/automation/approvals.mdx (via packages/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/cli.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via packages/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/permissions/authorization.mdx (via @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.mdx (via @objectstack/spec)
  • content/docs/releases/v17.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@github-actions github-actions Bot added documentation Improvements or additions to documentation tooling size/m labels Jul 30, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review July 30, 2026 09:10
@os-zhuang
os-zhuang merged commit 575dd6c into main Jul 30, 2026
18 checks passed
@os-zhuang
os-zhuang deleted the claude/sharing-rules-schema-bypass-h4c7xr branch July 30, 2026 09:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants