Skip to content

chore(spec): register the #4001 unknown-key strictness wave as one v17 ADR-0087 entry (#7630) - #7927

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-7630-adr-0087-v17-strictness-entry
Aug 12, 2026
Merged

chore(spec): register the #4001 unknown-key strictness wave as one v17 ADR-0087 entry (#7630)#7927
os-zhuang merged 2 commits into
mainfrom
claude/issue-7630-adr-0087-v17-strictness-entry

Conversation

@os-zhuang

@os-zhuang os-zhuang commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Fixes #7630

What the ruling asked for

The maintainer ruled on #7630 (2026-08-12): direction A — one ADR-0087 entry per major. The eleven declared-breaking v17 changesets PR #7624 judged owed fold into a single entry, with per-batch provenance written inside it; an upgrader reads one prescription covering the whole wave, an archaeologist still walks it batch by batch. The two adjacent seams (45 ~ rows, 7 borderline candidates) stay exactly as recorded and are not touched. target:* stays with the triage seat.

That is what this PR does, and nothing else.

The entry

packages/spec/src/migrations/entries/semantic/17.authoring-schemas-strict-unknown-keys.ts — one SemanticMigration, shaped after the registry's only two precedents of this class (ui-schemas-strict-unknown-keys at major 15, dashboard-widget-strict-unknown-keys at major 16), and named by their convention. Registered the #7297 way: one new file under entries/semantic/, then gen:migration-registry. Nothing was typed between the <os-generated …> markers.

Provenance lives in two places on purpose, because the two readers read different artifacts:

  • the entry's leading // comment block — the eleven batches with what each one closed, carried by the generator into registry.ts directly above the entry, for whoever reads the ledger;
  • the reason field — the eleven changeset names in one sentence, so the trace also reaches spec-changes.json and docs/protocol-upgrade-guide.md, which is where an upgrader actually looks. A leading comment does not reach the projections; that was measured, not assumed.

The eleven, re-enumerated against the live tree (all present, none renamed):

batch closed
unknown-key-strictness-tier-a security/permission.zod.ts; automation/flow.zod.ts's four outer shapes
unknown-key-strictness-step2 security/rls.zod.ts, security/sharing.zod.ts, identity/position.zod.ts
strict-automation-control-flow-state-machine five control-flow + six state-machine shapes
unknown-key-strictness-automation-batch11 flow's six nested blocks, time-relative trigger, flow function, webhook
unknown-key-strictness-ui-batch13 all four shapes in ui/responsive.zod.ts
unknown-key-strictness-ui-batch15 ui/theme.zod.ts 14/14, ui/chart.zod.ts 5/7
unknown-key-strictness-ui-batch16 AriaPropsSchema, carried on ~30 live shapes under six metadata roots
view-subblock-strictness-batch18 fifteen ui/view.zod.ts sub-blocks
rare-jars-shave ViewItemSchema split into a strict authoring gate + a .strip() wire variant
user-filters-allow-add-tab-promote-and-close userFilters promoted then closed; the three page-only keys
view-union-identity-precondition the view write-path union stops matching every object

Each of the eleven stock changesets now carries its <!-- adr-0087: registered authoring-schemas-strict-unknown-keys --> disposition marker — +2 lines each, the same shape PR #7624 used — so the judgement is recorded where the next auditor reads rather than only in a PR body.

Acceptance evidence

check-adr-0087-registration.mjs --audit-stock, run on a full history (this container clones shallow, and the mode refuses the ledger-touch signal on a shallow clone rather than approximating it — git fetch --unshallow --filter=blob:none first, or every row reads ?). Measured on the commit before and the commit after:

before after
already answered 51 62
residue 97 86
flagged (!) 52 41
ledger-touched (~) 45 45

52 → 41 is exactly the eleven, and ~ holding at 45 is the positive check that the adjacent seam was not touched. The baseline reproduces the card's own numbers (answered 39 → 48, residue 106 → 97, flagged 61 → 52 after PR #7624).

Both directions of the id are wired: ledgerAt('HEAD') carries authoring-schemas-strict-unknown-keys (145 ids), and so does projectedMigrationIds(spec-changes.json) (71 ids) — so the registered <id> markers resolve against a real entry, not a name.

Gates

gate result
pnpm run check:adr-0087-registration ✅ self-test 153 assertions; "this PR adds no declared-breaking changeset (12 non-breaking seen)"
pnpm --filter @objectstack/spec run typecheck ✅ (tsc --noEmit, scripts, test-layer; debt file unchanged)
pnpm --filter @objectstack/spec run test 380 files / 10017 tests passed, 481s, exit 0
pnpm --filter @objectstack/spec run check:generated all 13 up to date — including check:migration-registry, check:spec-changes, check:upgrade-guide. check:api-surface reads the built dist, so the package was built first and then the gate re-run; it is green.
eslint ✅ on the new entry file. ⚠️ registry.ts answers Parsing error: Maximum call stack size exceededpre-existing: the identical error reproduces on the origin/main copy of the same file with none of my changes in it. Not introduced here, and not fixed here.

origin/main was merged (569611f94) and the three generators re-run after the merge — zero further diff, so no spec-lane regeneration is racing this tree. git check-attr merge on the touched paths: spec-changes.json and docs/protocol-upgrade-guide.md are merge=os-regen (positive control: .gitattributes lists them); registry.ts, the entry file and the changesets are unspecified, as .gitattributes documents for the mixed registry.

Scope held

Changeset

@objectstack/spec: minor, mirroring the precedent this PR's shape copies: PR #7624's ledger-only backfill used minor, and both precedent entries landed alongside a @objectstack/spec: minor changeset (8fc1208c7, 524696a3e). It carries no adr-0087 disposition marker of its own — also per #7624, whose backfill changeset carries none.

claude added 2 commits August 12, 2026 04:15
…7 ADR-0087 entry (#7630)

PR #7624's stock reconciliation judged eleven declared-breaking v17 changesets
owed an ADR-0087 ledger entry and deliberately did not write one: the grouping
was the open question, and the registries are consumed as a SET, so a wrong
grouping produces no error anywhere. The maintainer ruled on #7630 (2026-08-12)
for one entry per major, mirroring the registry's only two precedents of this
shape (`ui-schemas-strict-unknown-keys` at 15, `dashboard-widget-strict-unknown-keys`
at 16), against the alternatives of eleven entries or a per-surface grouping.

The eleven batches fold into a single D3 semantic migration,
`authoring-schemas-strict-unknown-keys`, with the per-batch provenance written
inside the entry so an archaeologist can still walk it batch by batch while an
upgrader reads one prescription covering the whole wave. Each of the eleven stock
changesets carries its `<!-- adr-0087: registered ... -->` disposition marker, so
the judgement is recorded where the next auditor reads.

`registry.ts`'s generated region, `spec-changes.json` and
`docs/protocol-upgrade-guide.md` are regenerated, never hand-edited.

The two adjacent seams recorded on #7630 are deliberately untouched: the 45 `~`
rows and the 7 borderline candidates PR #7624 judged not-owed.

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

vercel Bot commented Aug 12, 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 Aug 12, 2026 4:34am

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

106 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 @objectstack/spec)
  • content/docs/automation/connectors.mdx (via @objectstack/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 @objectstack/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/tenancy-modes.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 @objectstack/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/data-service.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/examples.mdx (via @objectstack/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 @objectstack/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via @objectstack/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/kernel/services.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/permissions/system-context.mdx (via packages/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/http-protocol.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/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/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/apps.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/field-grouping-and-order.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)

7 release-owned page(s) also reference the affected code. These are read-only:

  • 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/releases/ is RELEASE-OWNED (AGENTS.md "Documentation Guardrails"): release
notes are written centrally at release time, and a code PR that edits them is the exact PR
that guardrail exists to stop. They are still audited — read-only. If one of them is actually
wrong, file an issue or open a dedicated docs-only PR; do not edit it here.

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 labels Aug 12, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 12, 2026 06:05
@os-zhuang
os-zhuang added this pull request to the merge queue Aug 12, 2026
Merged via the queue into main with commit 3140f9c Aug 12, 2026
28 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-7630-adr-0087-v17-strictness-entry branch August 12, 2026 06:22
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.

[Decision] The #4001 unknown-key strictness wave is owed ADR-0087 entries — one per major, or one per batch?

2 participants