fix(spec): retire page.json's obsolete prose-in-note citation mandate - #7424
Conversation
…#7188) page.json's file-level _note justified its "objectui citations belong in `note` prose, not `evidence`" convention with a parser limitation that #5623 removed: an `objectui:`-prefixed path in `evidence` is counted foreign and never resolved locally, same as `view.json` / `field.json` already do. Move the two RE-CITED-2026-08-10 entries (`template`, `regions` — the page.json counterparts of PR #7179's sweep, which deliberately left them in `note` to honor the now-obsolete _note) into `evidence` with `objectui:` realm markers, byte-matching the sibling convention including the `packages/`-rooted path (required for the gate's PATH_RE to recognize the token at all) and the "— measured objectui @11c1e71e" pin already implied by the same entries' own RE-CITED text. Delete the obsolete _note clause; keep the still-true ones. check:liveness stays green; evidenceForeign grows 131 -> 133 (exactly the two moved citations), evidenceLocal/resolved unchanged at 353/353. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016R9de1FqP7NvwKvqXi92Gh
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
📓 Docs Drift CheckThis PR changes 1 package(s): 106 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
⛔ 7 release-owned page(s) also reference the affected code. These are read-only:
|
Fixes #7188
packages/spec/liveness/page.json's file-level_notejustified its "objectui citations belong innoteprose, notevidence" convention with a parser limitation: "notevidence, which resolves framework file:line". That premise has been false since #5623 taughtcheck:livenessrealm attribution — anobjectui:-prefixed path inevidenceis counted in the foreign bucket and never resolved locally, exactly likeview.json/field.jsonalready do.What changed
RE-CITED 2026-08-10 (#7133/#7142)entries (template,regions) fromnoteprose intoevidence, with anobjectui:realm marker — these are page.json's counterparts to PR fix(spec): re-cite measured readers for 11 stale liveness-ledger rows (#7132) (#7133) #7179's sweep, which deliberately left them innotespecifically to honor this file's (now obsolete)_noteclause rather than contradict it._noteclause ("notevidence, which resolves framework file:line") and replaced it with the accurate, present-day description (paths get theobjectui:realm marker and are counted, not resolved —check:liveness的 stale-evidence 检测只 ⚠ 不判红 —— ADR-0087 证据路径可以静默腐烂,且摘要行的 “N resolved” 数的是路径总数不是解析成功数 #5623), matchingview.json's equivalent sentence. The still-true clauses (Studio dogfood provenance, container-drill note, roadmap-type removal) are unchanged.packages/(packages/components/src/renderers/layout/page.tsx) — the gate'sPATH_REonly recognizes tokens rooted at one ofapps|content|docker|docs|examples|packages|scripts|skills; the original prose path (components/src/renderers/layout/page.tsx, nopackages/) doesn't match that regex and so is invisible to the scanner regardless of realm marker. Without this the moved citations would silently not register as foreign at all. Confirmed by probingevidence.mts'sscanEvidence()directly (see report).— measured objectui @11c1e71eto both newevidencestrings, matching the sibling convention exactly — this is the same objectui pin PR fix(spec): re-cite measured readers for 11 stale liveness-ledger rows (#7132) (#7133) #7179 measured everything else in the same sweep against (stated in that PR's own "Measurement provenance" and echoed inregions' own RE-CITED note text), so it's making an already-true fact explicit, not a new claim.No other page.json properties were touched — their citations are older-style, undated, non-RE-CITED prose that matches the same convention still used throughout untouched entries in
view.json/field.json; moving those too was out of this card's scope.Verification
node -e "JSON.parse(...)"— valid JSON.pnpm --filter @objectstack/spechas no workspace deps, so no build-closure step was needed for this ledger-only script.check:liveness(tsx scripts/liveness/check-liveness.mts, under the shared verification lock,NODE_OPTIONS=--max-old-space-size=4096) — green, exit 0.evidence paths: 353 repo-local path(s) declared by 'live' entries, 353 resolved against this checkout; 133 attributed to another repo— up from a measured pre-edit baseline of 131 foreign (via--ledger-rootagainst a copy with the originalpage.json), i.e. exactly +2, one per moved citation. Local declared/resolved unchanged at 353/353 — no local path leaked, no new MISSING.check:empty-state— green, unaffected (unrelated content).node scripts/check-nul-bytes.mjs— OK, 6801 tracked files scanned, no raw control bytes.Reverse verification (route step 7)
Dropped the
objectui:marker fromtemplate's newevidencestring (via--ledger-rootagainst a mutated copy — the tracked file was never touched) and re-ran the gate:Exactly one MISSING, naming the row touched — restored (the mutated copy was a throwaway under scratchpad, discarded afterward; the tracked worktree file was never edited for this probe). Confirms the
objectui:marker is what keeps the two new foreign citations from resolving locally.PM 机制假设 check
The card's assumption — since #5623 the gate treats foreign citations in
noteandevidenceidentically except theevidenceForeigntally — held exactly: the gate output never attempted to resolve the movedobjectui:paths locally, and the only observable delta was theevidenceForeigncounter (+2). No contradiction surfaced.Scope
packages/spec/liveness/page.jsononly, as routed. No changeset — this is ledger prose with no user-visible surface, matching PR #7179's precedent exactly ("No changeset: this is ledger prose with no user-visible surface").skip-changesetlabel applied.Generated by Claude Code