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
Conversation
…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
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
Contributor
📓 Docs Drift CheckThis PR changes 1 package(s): 112 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
|
os-project-manager
marked this pull request as ready for review
August 8, 2026 02:33
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.
Fixes #5781
Fixes #5809
Text-only. Zero acceptance-surface bytes: no
.zod.tsvalidator, 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/*.mdfiles 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/*.mdaccumulated during the RC train is still a legal input to the v17 GA release notes. That is whynotification-dual-source-c3.mdis edited at the source while the rc.2 section that already consumed it only receives a note. Precedent verified in git history: #4709 / commit61cc079eccorrected 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 --statfile list matches this table exactly, with zero changes beyond it.packages/spec/src/ui/notification.zod.ts— #4610 tombstone (live source, corrected directly)./ui… wrappers had ZERO consumers across framework, cloud and objectui"export … fromre-export and an@object-ui/typesbarrel hop (objectui#3310). Adds: the retirement stands, and why (bridge had zero in-repo callers;@object-ui/react's ownNotificationSystemConfigis what runs; objectui deleted the bridge to follow the retirement)packages/spec/src/ui/notification.zod.ts— #5015 carrier-key aside (live source)packages/spec/src/migrations/registry.ts— protocol-17ui-notification-action-embed-config-retiredreason(live contract text; projects verbatim into the published upgrade guide)NotificationSchema/NotificationConfigSchema, deleted for zero consumers"ui/notification.zod's tombstone; the removal itself stands, #5781"packages/spec/src/ui/notification-embed-retirement.test.ts— header comment (live source).changeset/notification-dual-source-c3.md— GA input, corrected directlyCorrection (#5781)block naming both missed hops; the two bullets re-scoped to what was actually measured (./systemhad no importers;./uiwas held by the objectui bridge, since deleted)packages/spec/CHANGELOG.md—## 17.0.0-rc.2, entry0a936ea(shipped record)./ui; removal stands; corrected tombstone namedpackages/spec/src/ui/notification.zod.ts(live source)'@objectstack/spec/ui'→ TO'@objectstack/spec/api'./api'sNotificationis 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./uipresentation enums; declare the instance shape locally.changeset/notification-dual-source-c3.md— GA inputTO 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"packages/spec/CHANGELOG.md—## 17.0.0-rc.2, same entry (shipped record)./uienumspackages/spec/src/ui/notification.zod.ts— methodology, beside the corrected tombstoneimport … fromstatement text — at minimum it has to coverexport … fromre-exports and consumption that reaches the spec indirectly through a downstream barrel package", naming #4667 / #4709 as the two prior missespackages/spec/CHANGELOG.md—## 17.0.0-rc.2, entryad047d2(shipped record)areas" — left byte-for-byte intactfilterAppForUserruns the samefilterNavover everyareas[].navigation; points at the## 17.0.0-rc.4entrye4c8b6c(#5337 / PR #5796) that carries the corrected statementdocs/protocol-upgrade-guide.md,packages/spec/spec-changes.jsongen: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.changeset/notification-retirement-evidence-corrected.md@objectstack/spec: patchThat 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:./ui's four enums". On fresh main only three survive —NotificationType/NotificationSeverity/NotificationPosition— because ADR-0049 定去留:NotificationActionSchema/EmbedConfigSchema实测没有授权门(#4001 批 14 改判的两个站点) #5015 retiredNotificationActionat 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.tsalready said "three" twelve lines up, so the file was internally inconsistent as well.rc.5at:3,rc.4at:287,rc.2at:5690), so the [spec]packages/spec/CHANGELOG.md的 17.0.0-rc.2 段落仍带着「the server does not walkareas」—— GA 段落改对后同一文件会自相矛盾 #5809 note says "higher up in this file" rather than the card's example wording "below".packages/spec/src/system/notification.zod.tsis deliberately NOT touched. Its zero-consumer claim is scoped to the./systemNotificationConfigdeclaration, and objectui#3310 does not falsify that one: objectui re-exported from@objectstack/spec/ui, so the./systemdeclaration genuinely had no consumers. Correcting an unfalsified sentence would be manufacturing evidence. Its neighbouring sentence about the./uitwin 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: thereasonfield is projected verbatim intodocs/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#5015entry'sreasonmay 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#5337rationale block one screen up.packages/spec/src/ui/notification.test.ts— a source-text pin over the#4610tombstone, comment markers stripped and whitespace collapsed so assertions cannot pass or fail on line wrapping (the#6085expression-dialect-docs.pin.test.tspattern). 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./apias 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.tstoorigin/mainand 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 sideexpected 'Both shapes were published …' not to match /(deleted|removed) for (having )?zero…/iandto match /falsified/. Restoring the corrections returned all 97 to green.Full runs, all green:
pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2→ 339 files / 8708 tests passedpnpm --filter @objectstack/spec typecheck→tsc --noEmit+check:scripts-typecheck+check:test-typecheckall cleancheck:*step enumerated from.github/workflows/lint.yml, run one by one — 29 root gates in the ESLint job pluspnpm linton the changed files, and the type-check job'scheck: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-bytesclean, plus a manual control-byte self-scan over every changed file (the change discusses no control characters, but the scan is cheap).turbo run build --concurrency=2 --filter='./packages/*' --filter='./examples/*^...') → 66/66; examples and@objectstack/downstream-contracttypecheck clean.check:i18n/check:i18n-coverage/check:doc-formula-expressionsfirst 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 topackages/spec/CHANGELOG.mdare file content and are unaffected.