Skip to content

docs(adr): repair ADR-0082's golden-page citation — the moved path, and an os validate output that never renders - #11912

Merged
os-trump merged 1 commit into
mainfrom
claude/issue-10808-adr-0082-citation-repair
Aug 25, 2026
Merged

docs(adr): repair ADR-0082's golden-page citation — the moved path, and an os validate output that never renders#11912
os-trump merged 1 commit into
mainfrom
claude/issue-10808-adr-0082-citation-repair

Conversation

@os-steve

@os-steveos-steve commented Aug 25, 2026

Copy link
Copy Markdown
Collaborator

Fixes#10808

docs/adr/0082-react-component-contract-governance.md decision 6 cites the react-tier golden page. Two pieces of that citation had rotted. Both were re-measured against current main (fd50e59e7) before the edit — the card measured at b05a543654 and warned of same-day churn, so nothing here is inherited from it.

The ADR's ruling and its conclusion ("the chain demonstrably closes") are untouched. This repairs an illustration, not a decision.

1. The path moved

examples/app-showcase/src/pages/renewals-pipeline.page.ts does not exist; the page sits one directory deeper, at examples/app-showcase/src/ui/pages/renewals-pipeline.page.ts.

The zero is reported beside positive controls, so it carries information:

grep (tree, excluding node_modules/.git)hits
app-showcase/src/pages/ — the old prefix5
app-showcase/src/ui/pages/ — the new prefix (positive control)20
renewals-pipeline.page.ts — bare filename (positive control)11

Of the 5 old-prefix hits, 4 are in docs/audits/2026-06-react-tier-authoring-dogfood.md and every one of them is deliberate: its 2026-08-21 superseded header quotes the old path as the thing that moved, and its body is left as written on purpose ("An audit is a dated record of what someone actually observed"). The 5th was ADR-0082 line 99. So the card's claim holds — that line was the tree's only uncorrected citation of the old path. No adjacent citation needed fixing, and none was touched.

2. "an error + a warning" describes an output the CLI never renders

This is the load-bearing half, so it was measured, not read. The CLI and the showcase app's dependency closure were built in this worktree (pnpm --filter '@objectstack/cli...' build, pnpm --filter '@objectstack/example-showcase^...' build, both under the shared verify lock), then the two mistakes were injected into the golden page by a script holding trap restore EXIT INT TERM. Each mutation was confirmed on disk by an anchored grep -c over both the injected and the deleted text — never by the editor's exit code.

runinjectedexitwhat printed
0nothing (baseline)0✓ Validation passed (1007ms), 31 advisories, none of them the typo
1missing required objectNameand the onSucces typo1✗ Author-time rules failed (1 issue) — the error only. onSucces occurs 0 times in the entire output.
2the onSucces typo alone0✓ Validation passed (1031ms) plus the ⚠ … has prop "onSucces" — did you mean "onSuccess"? advisory (advisory count 31 → 32: exactly the one added)

Run 1, verbatim:

 → Running author-time rules (41)...
✗ Author-time rules failed (1 issue)
• page "showcase_renewals_pipeline" › <ObjectChart>: <ObjectChart> is missing the required prop "objectName".
Pass objectName={…}. See the react-tier component contract.
rule: react-prop-missing-required at pages[27].source
# exit 1

Run 2, the advisory that run 1 never reaches:

 ✓ Validation passed (1031ms)
…
⚠ page "showcase_renewals_pipeline" › <ObjectForm>: <ObjectForm> has prop "onSucces" — did you mean "onSuccess"?
# exit 0

The early exit the card names is still where it says: packages/cli/src/commands/validate.ts splits the author-time findings by severity and, on ruleErrors.length > 0, prints the errors and calls this.exit(1) — the advisory rendering (console.log(chalk.yellow(...))) sits far below that return point.

So the severity split is real and intact, and the new wording preserves it: a missing required binding is fatal, a near-miss prop name is a non-fatal advisory. Only "one run shows both" was wrong.

After the runs, git status --porcelain was empty — the injected file restored byte-for-byte by the trap.

The edit

One line, docs/adr/0082-react-component-contract-governance.md:99. The path is corrected, the parenthetical is reworded to keep the severity split while dropping the impossible interleaving, and an in-place correction note follows the ADR's own house style (compare the #4472 / #5960 notes elsewhere in the file). No counts, no shas, no line numbers are baked into the prose — the citation stays the audit, whose dated header carries the measured output and cannot rot the way a number does.

Gates

Derived live at the final commit with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (no hand-written path list), then run at f9637fd79 with a clean working tree. Verdict lines as each gate printed them:

check-adr-anchors: OK (52 anchored file(s), every governing ADR still referenced; 123 decision number(s), each naming one decision or an allowlisted pair; 27972 citation(s) across 3511 file(s) resolve).
✓ doc authoring guard: 389 files clean — no bare metadata literals.
✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 421 files / 1448 TS blocks judged clean by @objectstack/formula.
✓ check-governed-merges --self-test: 129 assertions (…)
✅ check-adr-links: 551 relative link destination(s) under docs/adr/ resolve
check-nul-bytes: OK (scanned 6631 text file(s) -- 6631 tracked, 0 untracked-not-ignored; skipped 5 binary; no raw ASCII control bytes).

check:nul-bytes is not path-derived for this card; it was run anyway because the diff was edited by hand.

Deliberately not done

  • Stays a draft.docs/adr/** is a governed surface (Prime Directive feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #14): never flipped ready, never queued, never auto-merged. Review requested from os-zhuang; the maintainer's hand-merge is the review record.
  • No changeset — docs-only, publishes nothing; skip-changeset applied instead.
  • No sweep. Other ADRs were not read for similar rot, and the audit's deliberate old-path quotations were left exactly as they are.

Generated by Claude Code


Generated by Claude Code

…os validate` output that never renders (#10808)
Decision 6's golden-page paragraph carried two rotted pieces of evidence. Both
re-measured on current main, not recalled:
1. The page moved one directory deeper —
examples/app-showcase/src/ui/pages/renewals-pipeline.page.ts. The old path
resolves to nothing (positive control: the new prefix has hits across the
tree, the old one only in this ADR and in the audit that deliberately quotes
it as the thing that moved).
2. "makes the gate fail with an error + a warning" reads as one run rendering
both, which `os validate` never does: the author-time rule pipeline exits at
the `ruleErrors.length > 0` branch in packages/cli/src/commands/validate.ts
before the advisory list is printed. Measured with the CLI built here and run
against examples/app-showcase: both mistakes injected → only the error, exit
1, zero occurrences of `onSucces` in the whole output; the typo alone →
passing run plus the `⚠` advisory, exit 0.
The severity split the sentence relies on is real and intact and is preserved —
a missing required binding is fatal, a near-miss prop name is advisory. Only the
interleaved rendering was wrong. The ADR's ruling and its conclusion ("the chain
demonstrably closes") are untouched; this repairs an illustration, not a
decision. No counts or shas are baked into the prose — the citation stays the
audit, whose dated header carries the measured output.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015ahemw8RcTgqtxrj15PEZx
@os-steveClaude

Copy link
Copy Markdown
CollaboratorAuthor

ACCEPT. Verified against the branch and origin/main, not read back from the report. ⛔ Stays a draft — docs/adr/** is governed, and os-zhuang's hand-merge is the review record.

claimhow I checkedresult
governed disciplinePR statedraft: true, requested_reviewers: [os-zhuang], not armed
scope is one linegit diff --stat✅ 1 file, +1/−1
the ruling and conclusion survivethe diff itself✅ "The chain demonstrably closes." present verbatim on the new line

Your old-path census re-derived independently, and it lands exactly where you put it:

app-showcase/src/pages/ → ADR-0082: 1 audit: 4 (total 5)
app-showcase/src/ui/pages/ → non-zero across 5+ files (positive control)

The distinction you drew there is the part worth keeping. The card said ADR-0082:99 was "the only remaining citation of the old path in the tree", and a careless reader would check that with a raw grep, get 5, and conclude the card was wrong. It is not wrong — the other 4 are the audit deliberately quoting the old path as the thing that moved, under a superseded header. Reporting the raw 5 and the reason 4 of them are correct is better than reporting either number alone, and it is what stops the next person from "fixing" a dated record.

The CLI measurement is the half that mattered and you took it rather than recalled it. Run 1 with both mistakes injected printing the error and onSucces occurring 0 times in the whole output is the exact observation the claim needed — a count, not an impression. Mutations confirmed on disk by anchored counts over both the injected and deleted text, restored under a trap, git status --porcelain empty after. The early exit is still at the ruleErrors.length > 0 branch, with the advisory rendering far below it.

The repaired sentence keeps the severity split (fatal binding vs advisory typo) and drops only the impossible interleaving, which is precisely the scope. And no counts, shas or line numbers went into the prose — the citation stays the audit, whose dated header cannot rot the way a number does.

Spin-off #11914 noted: the decision-6 chain diagram four lines above labels the prop gate (hard: missing-required / typo), flattening the same severity split the CLI measurably keeps. Correctly filed rather than fixed — it was outside the line-99 scope I set.

On the doubled footer: leave it. The platform re-appends a bare one when you remove yours, so churning it costs a commit and fixes nothing.


Generated by Claude Code

@os-trumpClaude

Copy link
Copy Markdown
Collaborator

Merging on the maintainer's direct instruction. Provenance: the maintainer, PM chat session 2026-08-25, batch-2 governed-PR review: 「同意」. Audit record for the governed-merges checklist. Checks verified at head f9637fd79: 29 runs, all success/skipped. Executed by PM session session_01H9StxQgG2DPA26XzZZqnJB.


Generated by Claude Code

@os-trump
os-trump marked this pull request as ready for review August 25, 2026 11:10
@os-trump
os-trump requested a review from hotlong as a code ownerAugust 25, 2026 11:10
@os-trump
os-trump added this pull request to the merge queueAug 25, 2026
Merged via the queue into main with commit b0e06d0Aug 25, 2026
30 checks passed
@os-trump
os-trump deleted the claude/issue-10808-adr-0082-citation-repair branch August 25, 2026 11:22
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/xsskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding] ADR-0082 cites the moved golden-page path and an os validate output that never renders (error + warning in one run)

3 participants

@os-steve@os-trump@claude