chore(openspec): archive closeout follow-up (spec zh-TW, archive refs, projection) - #481
Conversation
…re-contracts Adopts the #480 review findings: the canonical spec prose is now Traditional Chinese per openspec/AGENTS.md (parser headings and SHALL protocol identifiers preserved), the ledger row's evidence_refs point at the dated archive directory, subject_commit rebinds to the landed archive snapshot (#480 squash c41e29d - sources unchanged since), and the NOW projection drops the archived row per the ledger-first rule. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015QTVFY89rS2xRwRB2TpFP6
… NOW.md evidence moved docs/plans/NOW.md is that row's evidence file; dropping the archived projection row changed it, so the row rebinds to the commit carrying the change (post-merge it rebinds to the squash per the #477 convention). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015QTVFY89rS2xRwRB2TpFP6
|
Warning Review limit reached
Next review available in: 5 minutes You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (3)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
monkey1sai-blip
left a comment
There was a problem hiding this comment.
Approved by monkey1sai-blip (the reviewer account pinned by the repo's merge governance).
Submitted through scripts/blip_review.py — a scripted approval carrying the operator's authority, pinned to head 933430c34a32230fe89069ce17e2505cf5f20aa0. This is the mechanism the GitHub App cannot satisfy: an App's approving review does not count toward required_approving_review_count.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 933430c34a
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
Pull request overview
This PR is an archive-closeout follow-up for the introduce-executable-architecture-contracts OpenSpec change, adopting review findings from #480. It has no code impact — it updates spec prose, lifecycle-ledger data, and the current-scope projection so the machine-truth reconciliation stays consistent after the change was archived.
Changes:
- Translates the canonical capability spec (
openspec/specs/executable-architecture-contracts/spec.md) from placeholder/English into Traditional Chinese per openspec/AGENTS.md, preserving parser-required English headings (### Requirement:,#### Scenario:) and SHALL protocol identifiers, and replacing theTBDPurpose. - Repoints the archived ledger row's
evidence_refsto the dated archive directory and rebinds itssubject_committo the #480 squash (c41e29d); also rebinds theisolated-branch-stack-browser-e2erow'ssubject_commitsince NOW.md (one of its evidence files) changed. - Drops the now-archived row from
docs/plans/NOW.md, which projects onlyscope: current(non-archived) ledger rows.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
openspec/specs/executable-architecture-contracts/spec.md |
zh-TW translation of spec prose + real Purpose; English parser headings and SHALL identifiers preserved (verifier treats specs/ paths as non-owned, so no source-drift). |
openspec/lifecycle-ledger.json |
Archived row evidence_refs moved to archive dir and subject_commit rebound to c41e29d; isolated-branch-stack-browser-e2e subject_commit rebound to 64cab2c (NOW.md evidence changed). |
docs/plans/NOW.md |
Removes the archived change from the current-scope projection, matching currentLedger() which excludes archived rows. |
💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.
squash (#482) The #477 convention's second half: the row bound its evidence-carrying branch commit inside #481 so the pre-merge gate could verify it; the squash landed, so the row now binds the permanently reachable trusted snapshot. Claude-Session: https://claude.ai/code/session_015QTVFY89rS2xRwRB2TpFP6 Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…achine truth (#485) * fix(governance): gate the real repository against its own lifecycle machine truth scripts/lib/openspec-machine-truth.mjs already owns a complete lifecycle comparator, but its CLI needs a GitHub observation and a pinned openspec binary, so CI could only ever exercise it against synthetic temporary fixtures. The one assertion that touched the real tree was a hand-written regex for a single change id, so drift between openspec/changes, the machine ledger and the NOW projection was corrected by hand after landing (#477, #481, #482) instead of being refused at PR time. This adds the repository-local subset of that comparison as a gate that needs no network, git or external binary, and wires it into the already required agent-governance check. It compares the change directories and their proposal markers, openspec/lifecycle-ledger.json, and the NOW projection, reports disagreement rather than resolving it, and fails closed on any input it cannot read as declared. Proven on a real historical commit: run against main at c41e29d the gate reports now_unexpected_change for introduce-executable-architecture-contracts, drift that existed on main and was only fixed later by #481. Claude-Session: cowork scheduled task ai-bim-geo Co-authored-by: Claude Opus 5 <noreply@anthropic.com> * fix(governance): close the ship-gate survivors on the lifecycle parity gate Codex tri-adversarial gate on PR #485 returned SHIP with five non-blocking survivors. Four are closed here; the fifth is disclosed. - L1-1: the current-change cap counted the mandatory archive namespace, so the filesystem observation could not represent the same 512-row boundary the NOW parser accepts. One raw slot is now reserved and the filtered set is bounded instead. - SEC-001: path-derived values reached the text renderers verbatim, so a directory name carrying a newline or ESC byte could forge extra report lines. Values with control characters are now JSON-quoted; JSON output is unchanged. - TG-001: the input_too_large budgets had no coverage. Added the accepted boundary and one past it for change directories, NOW rows, ledger rows and file bytes. - TG-003: the non-regular proposal.md predicate was only reachable through a skippable symlink fixture. Added a portable directory-named-proposal.md case. Not closed: SEC-002 (readdirSync materialises the full Dirent list before the entry cap is applied). Rated low by the apex; incremental opendirSync iteration is a larger refactor and is left as disclosed follow-up. Claude-Session: cowork scheduled task ai-bim-geo Co-authored-by: Claude Opus 5 <noreply@anthropic.com> * fix(governance): close the marker fail-open pair found by the second gate run Second Codex tri-adversarial run on head 40d93c6 returned SHIP with four survivors; the two medium ones were real fail-open defects in the marker parser, which this gate promotes to merge-blocking authority. - L1-1: the canonical marker regex had no trailing token boundary, so `> **Status: active123**` captured `active` and read as a clean active row. The status token must now end at `**`, whitespace or end of line; anything else is reported as an unreadable marker. - L1-2: near-miss detection ran only when no canonical marker was found, so a proposal carrying two disagreeing declarations resolved silently to the canonical one. Every bolded status-like line in the prologue is now inventoried and an unconsumed one is reported even beside a canonical marker. - L1-3: the raw namespace budget is now separate from the canonical change budget, so one stray entry beside a full change set stays a targeted `change_entry_not_a_directory` mismatch instead of a generic budget error. - TG-1: added a control-character assertion for the text input-error path. Verified against all 120 real proposals: the ten current ones are unchanged; only one archived proposal reads `invalid` (`Status: closeout reconciled`), and archived markers are outside this gate's scope. Claude-Session: cowork scheduled task ai-bim-geo Co-authored-by: Claude Opus 5 <noreply@anthropic.com> * fix(governance): correct the orphan-directory record and per-declaration marker counting Both from PR #485 review threads. - The `directory_without_ledger_row` record had its observations reversed: the directory is present in `openspec/changes` and absent from the ledger, so the record now names the directory as the observed value and `absent` as what the ledger was expected to carry. - Status-like declarations are now counted per declaration rather than per line, so `> **Status: active** **Status: deferred**` on a single blockquote line is reported as an unreadable marker instead of resolving to `active`. Claude-Session: cowork scheduled task ai-bim-geo Co-authored-by: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
What
Archive closeout follow-up for
introduce-executable-architecture-contracts, adopting the #480 review findings:openspec/specs/executable-architecture-contracts/spec.md) is now Traditional Chinese per openspec/AGENTS.md, preserving the parser-required English headings and SHALL protocol identifiers.evidence_refspoint at the dated archive directory, andsubject_commitrebinds to the landed archive snapshot (chore(openspec): archive introduce-executable-architecture-contracts #480 squashc41e29d- sources unchanged since, the chore(openspec): rebind the Phase 4 ledger row to its landed squash commit #477 convention).docs/plans/NOW.mddrops the archived row from the current-scope projection (ledger-first rule). NOW.md is also the evidence file ofisolated-branch-stack-browser-e2e, so that row re-reconciles to the commit carrying the change; post-merge it rebinds to this PR's squash per convention.Validation
node scripts/tests/test-openspec-machine-truth.mjs- 24/24npx openspec validate --all --strict- 71 passed, 0 failedgit diff --check- clean🤖 Generated with Claude Code
https://claude.ai/code/session_015QTVFY89rS2xRwRB2TpFP6