Skip to content

docs(adr): un-flatten ADR-0082's decision-6 chain diagram severity label - #11981

Merged
os-trump merged 1 commit into
mainfrom
claude/issue-11914-adr-0082-chain-diagram-severity
Aug 25, 2026
Merged

docs(adr): un-flatten ADR-0082's decision-6 chain diagram severity label#11981
os-trump merged 1 commit into
mainfrom
claude/issue-11914-adr-0082-chain-diagram-severity

Conversation

@os-steve

Copy link
Copy Markdown
Collaborator

Fixes#11914

docs/adr/0082-react-component-contract-governance.md decision 6's chain diagram flattens the severity split that decision 5 of the same ADR records fifteen lines earlier. The prop-gate box read:

 prop gate (os validate — decision 5)
(hard: missing-required / typo)

putting missing-required and typo on the same side of one word, hard — as if both fail the gate.

Why it's wrong

Decision 5's own body splits the two by severity:

  • missing a required binding (e.g. ObjectForm with no objectName) → error (fails os build).
  • a near-miss of a known prop (edit distance ≤ 2, e.g. onSuccesonSuccess) → warning.

and the TL;DR line (decision 5) states it the same way: "a missing required binding is an error; a near-miss prop typo is a warning." The measured CLI behaviour (captured in #11914 and re-derived for #11912, a sibling repair on the adjacent line 99) agrees with decision 5, not with the diagram: a missing required objectName exits 1, an onSucces typo alone exits 0 with a advisory.

The edit

One line. The parenthetical now uses the same two words decision 5 uses for the two severities, so a reader following the arrow lands on the same distinction decision 5 makes:

 prop gate (os validate — decision 5)
(missing-required → error / typo → warning)

No other line in the file changed — decision 5 itself and the golden-page citation on the line immediately below the diagram (already being repaired separately by #11912) are untouched.

Scope

  • Only the decision-6 diagram label. Decision 5's prose, the golden-page citation line, and everything else in the ADR are unchanged.
  • No counts, shas, or line numbers are added to the ADR prose itself.

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 HEAD c93e1844d 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; 28016 citation(s) across 3518 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 6658 text file(s) -- 6658 tracked, 0 untracked-not-ignored; skipped 6 binary; no raw ASCII control bytes).

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

Deliberately not done

  • Stays 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. Decision 5 and the rest of the ADR were not otherwise re-audited; only the one flattened label was in scope.

Generated by Claude Code


Generated by Claude Code

The chain diagram's prop-gate box read `(hard: missing-required / typo)`,
putting both mistakes on the same severity. Decision 5 of the same ADR
already splits them — a missing required binding is an error, a near-miss
prop typo is a warning — and the CLI matches decision 5, not the diagram.
Reword the label to the same two words decision 5 uses.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015ahemw8RcTgqtxrj15PEZx
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 25, 2026
@claude
claudeBot requested a review from os-zhuangAugust 25, 2026 03:43
@github-actionsgithub-actionsBot added size/xs documentation Improvements or additions to documentation labels Aug 25, 2026
@os-steveClaude

Copy link
Copy Markdown
CollaboratorAuthor

ACCEPT. ⛔ Stays draft — docs/adr/** is governed; os-zhuang's hand-merge is the review record. Verified draft: true, requested_reviewers: [os-zhuang], 1 file, +1/−1.

The label now borrows decision 5's own notation, not just its meaning

- (hard: missing-required / typo)+ (missing-required → error / typo → warning)

Decision 5, fifteen lines above, reads:

  • missing a required binding→ error (fails os build).
  • a near-miss of a known prop→ warning.

So the diagram now uses the same arrow form and the same two words. That is better than a paraphrase that merely agrees: a reader comparing the two sees one vocabulary, and a future editor changing one has an obvious reason to change the other.

The fence held where it mattered

The line immediately below the diagram — the golden-page citation at :99 — is untouched, and the diff context confirms it still carries its pre-repair text. That line belongs to PR #11912 and is still unmerged. Two devs working four lines apart in the same ADR, and neither trod on the other.

Checking on origin/main that #11912's repair had not landed before proceeding was the right first action: had it landed, the premise and the surrounding text would both have moved.

⚠️ Co-tenancy note for whoever merges these

#11981 (line 96) and #11912 (line 99) are both governed drafts on the same file, in the same reviewer's queue. Whichever merges first makes the other dirty. The resolution is a merge of origin/main, keeping both edits — they are disjoint by construction, one line each. ⛔ Never a rebase or force-push on a governed branch.

Order does not matter; only that the second one merges rather than rebases.

Running check:nul-bytes even though it is not path-derived, because the diff was hand-edited, is the right instinct — and saying so explicitly is what keeps it from reading as an unexplained extra.


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 c93e1844d: 26 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 71e0214Aug 25, 2026
27 checks passed
@os-trump
os-trump deleted the claude/issue-11914-adr-0082-chain-diagram-severity 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

3 participants

@os-steve@os-trump@claude