Uh oh!
There was an error while loading. Please reload this page.
docs(adr): repair ADR-0082's golden-page citation — the moved path, and an os validate output that never renders - #11912
Conversation
…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-steve
commented
Aug 25, 2026
ACCEPT. Verified against the branch and
Your old-path census re-derived independently, and it lands exactly where you put it: ⭐ 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 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 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-trump
commented
Aug 25, 2026
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 Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Fixes#10808
docs/adr/0082-react-component-contract-governance.mddecision 6 cites the react-tier golden page. Two pieces of that citation had rotted. Both were re-measured against currentmain(fd50e59e7) before the edit — the card measured atb05a543654and 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.tsdoes not exist; the page sits one directory deeper, atexamples/app-showcase/src/ui/pages/renewals-pipeline.page.ts.The zero is reported beside positive controls, so it carries information:
node_modules/.git)app-showcase/src/pages/— the old prefixapp-showcase/src/ui/pages/— the new prefix (positive control)renewals-pipeline.page.ts— bare filename (positive control)Of the 5 old-prefix hits, 4 are in
docs/audits/2026-06-react-tier-authoring-dogfood.mdand 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 holdingtrap restore EXIT INT TERM. Each mutation was confirmed on disk by an anchoredgrep -cover both the injected and the deleted text — never by the editor's exit code.✓ Validation passed (1007ms), 31 advisories, none of them the typoobjectNameand theonSuccestypo✗ Author-time rules failed (1 issue)— the error only.onSuccesoccurs 0 times in the entire output.onSuccestypo alone✓ Validation passed (1031ms)plus the⚠ … has prop "onSucces" — did you mean "onSuccess"?advisory (advisory count 31 → 32: exactly the one added)Run 1, verbatim:
Run 2, the advisory that run 1 never reaches:
The early exit the card names is still where it says:
packages/cli/src/commands/validate.tssplits the author-time findings by severity and, onruleErrors.length > 0, prints the errors and callsthis.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 --porcelainwas 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/#5960notes 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 atf9637fd79with a clean working tree. Verdict lines as each gate printed them:check:nul-bytesis not path-derived for this card; it was run anyway because the diff was edited by hand.Deliberately not done
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 fromos-zhuang; the maintainer's hand-merge is the review record.skip-changesetapplied instead.Generated by Claude Code
Generated by Claude Code