Skip to content

docs(spec): correct #4610's falsified "zero importers" evidence and its uncompilable FROM → TO, forward-note the stale rc.2 areas caveat (#5781, #5809) - #6495

Merged
os-project-manager merged 1 commit into
mainfrom
claude/issue-5781-changelog-truth-pack
Aug 8, 2026
Merged

docs(spec): correct #4610's falsified "zero importers" evidence and its uncompilable FROM → TO, forward-note the stale rc.2 areas caveat (#5781, #5809)#6495
os-project-manager merged 1 commit into
mainfrom
claude/issue-5781-changelog-truth-pack

Conversation

@os-project-manager

@os-project-manager os-project-manager commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

Fixes #5781
Fixes #5809

Text-only. Zero acceptance-surface bytes: no .zod.ts validator, schema, export, conversion or baseline moves, and metadata legal before this change is byte-for-byte legal after. Neither retirement is reopened — only the sentences that justified them, and one stale caveat, change. ⛔ content/docs/releases/ untouched.

Editorial class rule applied (stated, not just used)

The PM ruling on #5809, adopted here as a rule for the whole class so future same-class cards inherit it without a round-trip:

(a) Forward-note in place. Shipped CHANGELOG sections are never rewritten — a changelog's value is in being a faithful record of what was shipped and said. Factual corrections are added as clearly-marked forward-notes inside the stale section, pointing at where the corrected statement lives. Still-unconsumed .changeset/*.md files are GA inputs, not shipped records, and are corrected directly. Live source prose (tombstones, migration-registry rationale, guidance strings) is live contract text, not a shipped record — corrected directly.

The repo is in changesets pre mode (.changeset/pre.json"mode": "pre"), so every .changeset/*.md accumulated during the RC train is still a legal input to the v17 GA release notes. That is why notification-dual-source-c3.md is edited at the source while the rc.2 section that already consumed it only receives a note. Precedent verified in git history: #4709 / commit 61cc079ec corrected a tombstone's premise the same way and shipped it as @objectstack/spec: patch.

Per-item checklist

Every row is one work item; the git diff --stat file list matches this table exactly, with zero changes beyond it.

# Site Before After
1 packages/spec/src/ui/notification.zod.ts#4610 tombstone (live source, corrected directly) "The ./ui … wrappers had ZERO consumers across framework, cloud and objectui" The claim is named and refuted: objectui held both names at 17.0.0-rc.1 via an export … from re-export and an @object-ui/types barrel hop (objectui#3310). Adds: the retirement stands, and why (bridge had zero in-repo callers; @object-ui/react's own NotificationSystemConfig is what runs; objectui deleted the bridge to follow the retirement)
1 packages/spec/src/ui/notification.zod.ts#5015 carrier-key aside (live source) "deleted in #4610 for having zero consumers" "deleted in #4610 (see the corrected note below — that retirement's 'zero consumers' evidence did not hold, the removal did)"
1 packages/spec/src/migrations/registry.ts — protocol-17 ui-notification-action-embed-config-retired reason (live contract text; projects verbatim into the published upgrade guide) "NotificationSchema / NotificationConfigSchema, deleted for zero consumers" "…, the #4535 C3 dual-source cleanup — that retirement's published 'zero consumers' evidence was later falsified for objectui and is corrected on ui/notification.zod's tombstone; the removal itself stands, #5781"
1 packages/spec/src/ui/notification-embed-retirement.test.ts — header comment (live source) "deleted for zero consumers" Same correction, one line, pointing at the tombstone
1 .changeset/notification-dual-source-c3.md — GA input, corrected directly "with zero importers in all three repos"; "Both declarations had zero importers in all three repos"; "was never adopted by objectui" A Correction (#5781) block naming both missed hops; the two bullets re-scoped to what was actually measured (./system had no importers; ./ui was held by the objectui bridge, since deleted)
1 packages/spec/CHANGELOG.md## 17.0.0-rc.2, entry 0a936ea (shipped record) unchanged Forward-note after the scan paragraph: the statement-level scan could not see the re-export or the barrel hop, so the "zero importers" claims below are false for ./ui; removal stands; corrected tombstone named
2 packages/spec/src/ui/notification.zod.ts (live source) #4610 published FROM '@objectstack/spec/ui' → TO '@objectstack/spec/api' "There is NO migration target" — following it does not compile; ./api's Notification is the REST inbox row (id / type / title / body / read / data / actionUrl / createdAt) and shares zero fields with the removed toast shape (message / severity / position / duration / dismissible / actions). Keep the ./ui presentation enums; declare the instance shape locally
2 .changeset/notification-dual-source-c3.md — GA input TO import … from '@objectstack/spec/api'. **Shape change**: … TO: **no replacement.** Do NOT re-point this import at @objectstack/spec/api + the disjoint-field evidence + "declare the instance shape locally, as objectui does"
2 packages/spec/CHANGELOG.md## 17.0.0-rc.2, same entry (shipped record) unchanged Forward-note after the FROM → TO bullet: no replacement, does not compile, keep the ./ui enums
3 packages/spec/src/ui/notification.zod.ts — methodology, beside the corrected tombstone absent "a cross-repo liveness verdict must be read off the RESOLVED SYMBOL GRAPH, not off import … from statement text — at minimum it has to cover export … from re-exports and consumption that reaches the spec indirectly through a downstream barrel package", naming #4667 / #4709 as the two prior misses
4 packages/spec/CHANGELOG.md## 17.0.0-rc.2, entry ad047d2 (shipped record) "per-item gating inside an area is enforced by the shell only, because the server does not walk areas" — left byte-for-byte intact Forward-note: the caveat has not held since #4722 (same 17.0.0 window); filterAppForUser runs the same filterNav over every areas[].navigation; points at the ## 17.0.0-rc.4 entry e4c8b6c (#5337 / PR #5796) that carries the corrected statement
docs/protocol-upgrade-guide.md, packages/spec/spec-changes.json Regenerated by gen:upgrade-guide / gen:spec-changes, committed unedited (one clause each, exactly item 1's registry correction)
packages/spec/src/ui/notification.test.ts, packages/spec/src/migrations/migrations.test.ts New pin tests (below)
.changeset/notification-retirement-evidence-corrected.md This PR's changeset, @objectstack/spec: patch

That is all ten changed files: three source, one test-only source, two CHANGELOG/changeset text, two regenerated artifacts, two test files, one new changeset.

Deviations from the dispatch card — reported, not silently absorbed

Three, all measured against fresh origin/main:

  1. "four enums" would have been a new false statement. The card's dictated replacement wording says "for presentation vocabulary keep ./ui's four enums". On fresh main only three survive — NotificationType / NotificationSeverity / NotificationPosition — because ADR-0049 定去留:NotificationActionSchema / EmbedConfigSchema 实测没有授权门(#4001 批 14 改判的两个站点) #5015 retired NotificationAction at 17.0.0-rc.3. Writing "four" into a factual-correction PR would have shipped a fresh error, so every rewritten site says three and names them, and the changeset records why the count moved. notification.zod.ts already said "three" twelve lines up, so the file was internally inconsistent as well.
  2. The rc.4 entry is above rc.2, not below. This CHANGELOG is newest-first (rc.5 at :3, rc.4 at :287, rc.2 at :5690), so the [spec] packages/spec/CHANGELOG.md 的 17.0.0-rc.2 段落仍带着「the server does not walk areas」—— GA 段落改对后同一文件会自相矛盾 #5809 note says "higher up in this file" rather than the card's example wording "below".
  3. packages/spec/src/system/notification.zod.ts is deliberately NOT touched. Its zero-consumer claim is scoped to the ./system NotificationConfig declaration, and objectui#3310 does not falsify that one: objectui re-exported from @objectstack/spec/ui, so the ./system declaration genuinely had no consumers. Correcting an unfalsified sentence would be manufacturing evidence. Its neighbouring sentence about the ./ui twin makes no consumer claim, so nothing there is stale.

Item 1's claim also lived in more places than the card anticipated — five sites, not the two named — including a restatement inside the unrelated #5015 rationale in registry.ts. That one is the reason the predicted regen fired: the reason field is projected verbatim into docs/protocol-upgrade-guide.md, i.e. the page an author upgrading 16 → 17 actually reads, so the false clause was published guidance rather than a code comment.

Tests

New pins, both able to go red, in the two places where the corrected statement is machine-readable:

  • packages/spec/src/migrations/migrations.test.ts — the protocol-17 #5015 entry's reason may never assert /(deleted|removed) for (having )?zero consumers/i, must name the correction and #5781, and must keep "removal itself stands". Same class as the existing #5337 rationale block one screen up.
  • packages/spec/src/ui/notification.test.ts — a source-text pin over the #4610 tombstone, comment markers stripped and whitespace collapsed so assertions cannot pass or fail on line wrapping (the #6085 expression-dialect-docs.pin.test.ts pattern). Six cases with an anti-vacuity guard: the tombstone exists; it does not assert "wrappers had ZERO consumers"; it records both hops and objectui#3310; it does not read as reopening the retirement; it refuses ./api as the migration target and says why; and it carries the methodology sentence.

Both pins are on the verdict, not the wording — the notes quote the old claims in order to withdraw them, which is required (a tombstone that merely goes quiet leaves the reader holding the old belief) and which is the discipline #5337's rationale pin recorded.

Reverse verification, direction predicted before running it: RED. Reverting notification.zod.ts + registry.ts to origin/main and re-running the two files turned 8 of the new cases red with no other test disturbed — expected '[#4610] …' not to match /wrappers had ZERO consumers/i, to match /That was false for objectui/, to match /retirement STANDS/, to match /NO migration target/, to match /RESOLVED SYMBOL GRAPH/, and on the registry side expected 'Both shapes were published …' not to match /(deleted|removed) for (having )?zero…/i and to match /falsified/. Restoring the corrections returned all 97 to green.

Full runs, all green:

  • pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2339 files / 8708 tests passed
  • pnpm --filter @objectstack/spec typechecktsc --noEmit + check:scripts-typecheck + check:test-typecheck all clean
  • Every check:* step enumerated from .github/workflows/lint.yml, run one by one — 29 root gates in the ESLint job plus pnpm lint on the changed files, and the type-check job's check:type-check-coverage / check:driver-conformance / check:stall-guard / check:generated --reconcile-only / check:skill-docs / check:spec-changes / check:upgrade-guide / check:authorable-surface / check:docs / check:skill-refs / check:skill-frame-sync / check:skill-compatibility / check:react-blocks / check:api-surface / check:exported-any / check:dual-source-exports / check:skill-examples / check:doc-formula-expressions / check:i18n / check:i18n-coverage. check:nul-bytes clean, plus a manual control-byte self-scan over every changed file (the change discusses no control characters, but the scan is cheap).
  • Workspace build (turbo run build --concurrency=2 --filter='./packages/*' --filter='./examples/*^...') → 66/66; examples and @objectstack/downstream-contract typecheck clean.

check:i18n / check:i18n-coverage / check:doc-formula-expressions first reported the stale-artefact failure mode (they run the built CLI / @objectstack/formula); they pass after the workspace build, which is the §9 trap, not a defect in this change.

Note on formatting: the > blockquote markers this body originally used were HTML-escaped to > by the body sanitizer at rest and rendered as literal text, so the class-rule quote above is set in italics instead. The > forward-notes committed to packages/spec/CHANGELOG.md are file content and are unaffected.

…ts uncompilable FROM to TO, forward-note the stale rc.2 areas caveat (#5781, #5809)

Text-only. No schema byte, export, conversion or baseline moves; the #4610 and
#4651 retirements are not reopened.

#5781 — two published claims about the Notification retirement were false:

  1. "zero importers in all three repos". objectui#3310 measured both `./ui`
     names alive at 17.0.0-rc.1: `packages/types/src/index.ts` re-exported them
     with `export ... from '@objectstack/spec/ui'`, and
     `packages/core/src/protocols/NotificationProtocol.ts` consumed them via the
     `@object-ui/types` barrel in two public signatures. The three-repo scan
     matched `import ... from` statement text and saw neither hop.
  2. The FROM `./ui` to TO `./api` migration line does not compile: `./api`'s
     `Notification` is the REST inbox row, disjoint from the removed toast
     shape. Rewritten to "no replacement"; counted honestly while rewriting it,
     three `./ui` enums survive, not four (#5015 took `NotificationAction`).

  A methodology sentence lands beside the tombstone: a cross-repo liveness
  verdict is read off the resolved SYMBOL GRAPH, covering `export ... from`
  re-exports and barrel-indirect consumption. Third miss of that class, after
  #4667 / #4709.

#5809 — the shipped `## 17.0.0-rc.2` section still asserted "the server does not
walk `areas`", which #4722 falsified and the same file's `## 17.0.0-rc.4` entry
already refutes. Forward-note added in place.

Editorial class rule applied (PM ruling on #5809): shipped CHANGELOG sections are
never rewritten, only forward-noted; still-unconsumed `.changeset/*.md` are GA
inputs and are corrected directly; live source prose is corrected directly.

`docs/protocol-upgrade-guide.md` and `spec-changes.json` are regenerated by
`gen:upgrade-guide` / `gen:spec-changes`, never hand-edited.
`content/docs/releases/` is untouched.

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

vercel Bot commented Aug 8, 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 8, 2026 2:14am

Request Review

@github-actions github-actions Bot added the size/m label Aug 8, 2026
@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

112 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/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/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/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)

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment