Skip to content

finding: page.json's _note justifies its prose-in-note citation convention with a parser limitation #5623 removed — the convention now rests on a false premise #7188

Description

@os-help

Observation-class finding surfaced by sweep #7142's review (PR #7179, spec-surface seat, session session_016R9de1FqP7NvwKvqXi92Gh). Filed unassigned; grading/routing is triage's call (suggested lane: domain:spec-surface; harmless today, prose-accuracy only).

Fact

packages/spec/liveness/page.json carries a file-level _note declaring that objectui citations belong in note prose rather than the evidence field, justified with words to the effect of "not evidence, which resolves framework file:line" — i.e. the claim that the machine parser can only resolve repo-local paths and a foreign path in evidence would break the gate.

That premise has been false since #5623 taught check:liveness realm attribution: an objectui:-prefixed path in evidence is counted in the foreign bucket and never resolved locally. PR #7179 exercised this at scale the other way — 19 new foreign evidence citations in view.json / field.json, gate green, and a reverse-verification run proving the realm marker is exactly what keeps them green (dropping one marker produced one MISSING).

Why it matters (mildly)

  • The practice itself is harmless — the gate treats foreign paths identically whether they sit in evidence or note; only the evidenceForeign tally differs.
  • But the stated reason is dead, and a convention resting on a false premise invites two failure shapes: someone "fixes" page.json to match its siblings and gets reverted citing the _note, or someone extends the false premise to a new ledger file. fix(spec): re-cite measured readers for 11 stale liveness-ledger rows (#7132) (#7133) #7179 deliberately honored the _note (adding evidence there would have contradicted a sentence in the same file — new prose rot of exactly the class that sweep repaired) and flagged instead.

Fix shapes (either is decision-free)

  1. Re-anchor the _note's rationale to the true present-day reason (stylistic uniformity within the file / historical), keeping the convention; or
  2. Retire the convention: move page.json's objectui citations into evidence with realm markers, matching view.json / field.json, and delete the obsolete clause — one file, E22-dated.

Precedents: #7128 house style; #7179's convention note (where this was first recorded).

Dedup

Searched open issues for page.json _note, prose-in-note, evidence realm — nothing. #7176 (from the same sweep) is a verdict question, different rows, different class.

Activity

  1. os-zhuang commented on Aug 10, 2026

    @os-zhuang
    Contributor

    Triage: finding + domain:spec-surface (was fully bare).

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  2. self-assigned this
    on Aug 10, 2026
  3. os-help commented on Aug 10, 2026

    @os-help
    CollaboratorAuthor

    Claim — spec-surface seat (session session_016R9de1FqP7NvwKvqXi92Gh, seat card #6298). pm:queue → pm:dispatched.

    PM-selected route: fix shape 2 from the card (retire the convention — move page.json's objectui citations into evidence with objectui: realm markers matching view.json/field.json, delete the obsolete _note clause, E22-dated). Both shapes were graded decision-free by the card; shape 2 removes the false-premise text and the divergence from siblings in one move. Report channel: issue comment with the os-dev-report HTML-comment marker at draft-PR time.


    Generated by Claude Code

  4. os-help commented on Aug 10, 2026

    @os-help
    CollaboratorAuthor

    OS-DEV-REPORT

    Issue: #7188
    Status: done
    Branch: claude/issue-7188-pagejson-note
    PR: #7424 (draft)

    What changed

    packages/spec/liveness/page.json only, matching the PM-selected fix shape 2:

    • Moved the two RE-CITED 2026-08-10 (#7133/#7142) entries (template, regions) — page.json's counterparts to PR fix(spec): re-cite measured readers for 11 stale liveness-ledger rows (#7132) (#7133) #7179's sweep, which had deliberately left them in note to honor this file's now-obsolete _note — from note prose into evidence, with an objectui: realm marker.
    • Deleted the obsolete _note clause ("not evidence, which resolves framework file:line") and replaced it with the accurate present-day description (paths get the objectui: realm marker and are counted, not resolved — check:liveness 的 stale-evidence 检测只 ⚠ 不判红 —— ADR-0087 证据路径可以静默腐烂,且摘要行的 “N resolved” 数的是路径总数不是解析成功数 #5623), matching view.json's equivalent sentence. Kept the still-true clauses (Studio dogfood provenance, container-drill note, roadmap-type removal).
    • Finding surfaced while implementing: the gate's PATH_RE (in evidence.mts) only recognizes tokens rooted at one of apps|content|docker|docs|examples|packages|scripts|skills. The original prose paths (components/src/renderers/layout/page.tsx, no packages/ prefix) don't match that regex, so a byte-for-byte move of the citation text would have been silently invisible to the scanner — neither local nor foreign — and the required reverse-verification (drop marker → expect one MISSING) would have failed to reproduce. Confirmed by probing scanEvidence() directly with both path forms before editing. Fixed by prefixing packages/ (packages/components/src/renderers/layout/page.tsx), which is the same convention every sibling evidence citation already uses.
    • Appended — measured objectui @11c1e71e to both new evidence strings, matching the sibling convention exactly — 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 "Measurement provenance" and echoed in regions' own RE-CITED note text), so this makes an already-true fact explicit rather than asserting something new.
    • No other page.json properties were touched — their citations are older-style, undated, non-RE-CITED prose matching the convention still used throughout untouched entries in view.json / field.json.

    Verification evidence

    • node -e "JSON.parse(...)" — valid JSON.
    • check:liveness (tsx scripts/liveness/check-liveness.mts, under the shared verification lock) — green, exit 0:
      > evidence paths: 353 repo-local path(s) declared by 'live' entries, 353 resolved against this checkout; 133 attributed to another repo
      Measured pre-edit baseline (via --ledger-root against a copy holding the original page.json): 131 foreign. Delta: 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 from template's new evidence string (via --ledger-root against a mutated scratch copy — tracked worktree file never touched) and re-ran the gate:

    evidence paths: 354 repo-local path(s) declared by 'live' entries, 353 resolved against this checkout, 1 MISSING; 132 attributed to another repo
    ✗ 1 'live' entr(ies) cite a file that is missing from THIS repo:
        page/template → packages/components/src/renderers/layout/page.tsx
    

    Exactly one MISSING, naming the row touched. Restored (mutated copy discarded from scratchpad).

    PM 机制假设 check

    Held exactly: the gate never attempted to resolve the moved objectui: paths locally; the only observable delta was evidenceForeign (+2). No contradiction surfaced.

    Scope / process

    • No changeset — ledger prose, no user-visible surface, matching PR fix(spec): re-cite measured readers for 11 stale liveness-ledger rows (#7132) (#7133) #7179's precedent exactly ("No changeset: this is ledger prose with no user-visible surface").
    • Labels read back after bot settle: ["size/xs"] → wrote union ["size/xs", "skip-changeset"] → confirmed ["size/xs","skip-changeset"].
    • PR left in draft — no ready flip, no auto-merge armed.
    • No out-of-scope findings.

    Generated by Claude Code

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions