docs(meta): signature-queue artefacts (north star, pending queue, selection dedupe) - #528
Conversation
Three artefacts from the maintainer's meta request: stop discovering the signature queue conversationally, align queued decisions to a stated goal, and bound the orchestration layer. - dec.north-star-continuous-loop (proposed, cairn.root): the goal as the alignment referent, a reachable terminal state for "done", the rubric every queued decision must carry (tier, unblocks, alignment, options, no acceptance by silence), and the orchestration boundary: continuation lives in a consumer layer beside cairn, per dec.product-perimeter, with truth in-repo and coordination state outside. - todo.maintainer-pending-queue (cairn.kernel.query): `cairn pending` plus a read-only webui panel. Measured motivation: six proposed decisions were waiting today, the maintainer had been told about two. - todo.lint-selection-folding: cite dec.loop-selection-deferred-findings (proposed 2026-07-27) as prior art the folding items compose with, and fix a stale example that pointed at the now-enforced shape-drift rule. No status flips: every proposed decision stays proposed until the maintainer ratifies the convergence sheet in the PR body.
…nt framing, live count)
|
Warning Review limit reached
Next review available in: 53 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. 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: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
📝 WalkthroughWalkthroughAdds documentation defining continuous-loop governance, maintainer ratification queue semantics, pending CLI/webui behavior, and lint-selection rules aligned with deferred findings. ChangesContinuous loop documentation
Estimated code review effort: 2 (Simple) | ~10 minutes Possibly related issues
Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
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 |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@meta/decisions/north-star-continuous-loop.md`:
- Around line 16-20: Update the decision document’s self-referential queue-entry
claim and its corresponding queue entry to satisfy the contract: explicitly
provide values for Tier, Unblocks, Alignment, and Options, or revise the claim
so it no longer states that this decision carries its own rubric. Keep the
wording consistent across both referenced sections.
In `@meta/todos/todo.maintainer-pending-queue.md`:
- Around line 29-33: Clarify the pending decision listing specification for the
`cairn pending` and `cairn pending --json` behavior: calculate age from each
decision’s canonical frontmatter `date`, explicitly define timezone handling and
rounding, and resolve equal-age items deterministically using a stable
tie-breaker such as decision ID. Preserve the existing descending-age ordering
and listed fields.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: a456fefa-a863-459a-bace-47fa0340afa2
📒 Files selected for processing (3)
meta/decisions/north-star-continuous-loop.mdmeta/todos/todo.lint-selection-folding.mdmeta/todos/todo.maintainer-pending-queue.md
Review adjudicationSequential lenses per the pre-submit gate, simplification then adversarial, plus CodeRabbit.
|
Sheet correction: W7W7 previously read "accept W7 is now: deprecate as fulfilled. Direct frontmatter flip to Two reference touch-ups ride the same batch:
The rest of the sheet is unchanged, including the one-word protocol. |
…ngs from loop selection todo.lint-selection-folding item 2, ratified 2026-07-29 (PR #528 sheet W2), recorded as accepted dec.loop-selection-strict-green-fold. Success criterion: cairn lint --json publishes a truthful envelope-level strict-green verdict consumed by both loop-mode.md copies' Info fold, pinned by render, query-wire, CLI, and pack phrase tests, with cairn scan --strict still exit 0. One shared predicate (map::graph::strict_green) feeds the published field and every strict exit path, so the wire cannot drift from the gate: the lint/scan data payload carries strict_green, true exactly when --strict would exit zero over the emitted set (no Error, no Warning, deferral state irrelevant). Query and webui envelopes bump to schema_version 6. Under --strict the shared-JSON exit code reads the published field itself; previously lint/scan --json silently ignored --strict and exited 0 on warnings. Loop-mode selection (canonical pack copy plus synced .claude render) folds every info finding while the wire publishes strict_green true, in default selection, both MISSION paths, and the stop evidence; trusts only the published field (an older wire folds nothing); and keeps an error or warning with no published deferred_by always selectable. Verify's blocking bar is scan --strict exit 0 with zero findings kept as the target, so the fold cannot strand an iteration at the gate. Items 1a, 1b, and 3 of the umbrella todo remain open by design.
…ngs from loop selection todo.lint-selection-folding item 2, ratified 2026-07-29 (PR #528 sheet W2), recorded as accepted dec.loop-selection-strict-green-fold. Success criterion: cairn lint --json publishes a truthful envelope-level strict-green verdict consumed by both loop-mode.md copies' Info fold, pinned by render, query-wire, CLI, and pack phrase tests, with cairn scan --strict still exit 0. One shared predicate (map::graph::strict_green) feeds the published field and every strict exit path, so the wire cannot drift from the gate: the lint/scan data payload carries strict_green, true exactly when --strict would exit zero over the emitted set (no Error, no Warning, deferral state irrelevant). Query and webui envelopes bump to schema_version 6. Under --strict the shared-JSON exit code reads the published field itself; previously lint/scan --json silently ignored --strict and exited 0 on warnings. Loop-mode selection (canonical pack copy plus synced .claude render) folds every info finding while the wire publishes strict_green true, in default selection, both MISSION paths, and the stop evidence; trusts only the published field (an older wire folds nothing); and keeps an error or warning with no published deferred_by always selectable. Verify's blocking bar is scan --strict exit 0 with zero findings kept as the target, so the fold cannot strand an iteration at the gate. Items 1a, 1b, and 3 of the umbrella todo remain open by design.
…ngs from loop selection (#532) todo.lint-selection-folding item 2, ratified 2026-07-29 (PR #528 sheet W2), recorded as accepted dec.loop-selection-strict-green-fold. Success criterion: cairn lint --json publishes a truthful envelope-level strict-green verdict consumed by both loop-mode.md copies' Info fold, pinned by render, query-wire, CLI, and pack phrase tests, with cairn scan --strict still exit 0. One shared predicate (map::graph::strict_green) feeds the published field and every strict exit path, so the wire cannot drift from the gate: the lint/scan data payload carries strict_green, true exactly when --strict would exit zero over the emitted set (no Error, no Warning, deferral state irrelevant). Query and webui envelopes bump to schema_version 6. Under --strict the shared-JSON exit code reads the published field itself; previously lint/scan --json silently ignored --strict and exited 0 on warnings. Loop-mode selection (canonical pack copy plus synced .claude render) folds every info finding while the wire publishes strict_green true, in default selection, both MISSION paths, and the stop evidence; trusts only the published field (an older wire folds nothing); and keeps an error or warning with no published deferred_by always selectable. Verify's blocking bar is scan --strict exit 0 with zero findings kept as the target, so the fold cannot strand an iteration at the gate. Items 1a, 1b, and 3 of the umbrella todo remain open by design.
…rap-fixture-repair-or-delete) Executes the maintainer-ratified REPAIR verdict (PR #528 sheet W10): flatten the nested pointer directories into flat slug-named decisions and research, drop the nine phantom src/* paths (declaration-only corpus), populate the six missing contracts, delete the expected-findings.json burn-down, and fold the bootstrap case in tests/examples_gate.rs into a direct clean-scan assertion. The fixture's evidence corpus (meta/sources/, meta/research/) stays deliberately unclaimed so the smoke-test corpus premise holds; the corpus split is recorded in dec.bootstrap-fixture-corpus-split (proposed) with evidence in res.bootstrap-fixture-repair. The two scan --strict exit-code tests own an inline warning-only project instead of borrowing fixture dirt. Success criterion: a temp-copy scan of tests/fixtures/cairn-bootstrap reports zero findings, asserted by test_bootstrap_fixture_scans_clean; fixtures_smoke stays green; the root scan gains no finding.
…rap-fixture-repair-or-delete) Executes the maintainer-ratified REPAIR verdict (PR #528 sheet W10): flatten the nested pointer directories into flat slug-named decisions and research, drop the nine phantom src/* paths (declaration-only corpus), populate the six missing contracts, delete the expected-findings.json burn-down, and fold the bootstrap case in tests/examples_gate.rs into a direct clean-scan assertion. The fixture's evidence corpus (meta/sources/, meta/research/) stays deliberately unclaimed so the smoke-test corpus premise holds; the corpus split is recorded in dec.bootstrap-fixture-corpus-split (proposed) with evidence in res.bootstrap-fixture-repair. The two scan --strict exit-code tests own an inline warning-only project instead of borrowing fixture dirt. Success criterion: a temp-copy scan of tests/fixtures/cairn-bootstrap reports zero findings, asserted by test_bootstrap_fixture_scans_clean; fixtures_smoke stays green; the root scan gains no finding.
…rap-fixture-repair-or-delete) (#535) Executes the maintainer-ratified REPAIR verdict (PR #528 sheet W10): flatten the nested pointer directories into flat slug-named decisions and research, drop the nine phantom src/* paths (declaration-only corpus), populate the six missing contracts, delete the expected-findings.json burn-down, and fold the bootstrap case in tests/examples_gate.rs into a direct clean-scan assertion. The fixture's evidence corpus (meta/sources/, meta/research/) stays deliberately unclaimed so the smoke-test corpus premise holds; the corpus split is recorded in dec.bootstrap-fixture-corpus-split (proposed) with evidence in res.bootstrap-fixture-repair. The two scan --strict exit-code tests own an inline warning-only project instead of borrowing fixture dirt. Success criterion: a temp-copy scan of tests/fixtures/cairn-bootstrap reports zero findings, asserted by test_bootstrap_fixture_scans_clean; fixtures_smoke stays green; the root scan gains no finding.
…ne acceptance (#544) * feat(artefacts): decision ratification tiers with receipt-bound machine acceptance Implements todo.decision-ratification-tiers (ratified 2026-07-29, PR #528 sheet W8) via the decision-ratification-tiers change, now archived. A decision declares `ratification: local` or `binding` (absent means binding, so existing artefacts keep their protection). The loop may accept a local decision on its own only under the receipt protocol: two committed Review receipts from independent lenses, each bound by `subject_hash` to a canonical manifest of everything the decision governs, with a queryable `ratified_by: machine` marker and a For/Against/Verdict record in the body. - Schema: `ratification`, `affects`, `ratified_by`, `receipts` on Decision; `subject_hash`, `lens_prompt_hash` on Review; per-field findings CA045-CA050. - Manifest: governed-content stripping mirroring the frontmatter parser, identity-based receipt exclusion, directory expansion, symlink containment, and the keystone invariance that the acceptance flip never changes the hash. - Scanner: CA051-CA057 (span via structural parent links, supersession, binding-surface allowlist with both-sides canonicalisation, convergence with committed lens-prompt hash binding, machine-on-binding, stale receipts). - Hook: range-based gate over merge-base..index (pre-commit) or ..HEAD (CI), NUL-delimited paths, rename-safe, untracked/unstaged governed refusal, and binding-surface classification against the MERGE-BASE allowlist so a range cannot weaken its own gate. Fails closed without a merge base. - Wire: schema_version 8, tri-state `ratified_by`, typed pending tier, and the candidate `subject_hash` receipts must carry. - Assets: tier-aware never-self-ratify rule in both skill copies, committed correctness and simplicity lens prompts, docs, registries, and copy. Provenance: dec.decision-ratification-tiers (accepted, W8), src.pr-528-w8-ratification. Both live pending decisions now declare their tier. * fix(hooks): reach the CI ratification mode and gate only on acceptance Two CI failures from the tiers unit, both real: - `cairn hook all --head` was rejected by the flag allowlist: the help spec row never learned the flag, so the CI ratification gate could not run. Adds `head` to the spec and its copy key. - The gate resolved the merge base whenever any local-tier decision existed, including proposed ones, so a shallow checkout failed closed with nothing to validate. The ratified trigger is a range flip to accepted at tier local, so the accepted filter now runs before merge-base resolution. - Dogfood CI checks out with `fetch-depth: 0`, so the base ref exists once an accepted local decision does; the hooks job already fetched full history. * fix(hooks): read the ratification trigger from the candidate tree Post-review delta review found the trigger still trusted the worktree: an acceptance staged in the index, then reverted to `proposed` in the unstaged copy, emptied the local-decision set and skipped the gate for a commit that did accept the decision. The trigger now enumerates decisions from the candidate tree itself (the index in pre-commit mode, HEAD in CI mode) and parses each candidate blob. Outside a Git work tree the gate is silent, because nothing can be committed there; inside one, an unanswerable Git always fails closed rather than inferring safety from worktree contents. A candidate acceptance whose subject the working tree cannot load is refused rather than skipped. Regression tests: staged-accepted with proposed worktree stays gated, and a merely proposed local decision without `origin/main` stays silent. Git plumbing moves to src/hooks/ratification/git.rs to stay under the size gate.
Meta-streamlining artefacts from the maintainer's request: stop discovering the
signature queue conversationally, align queued decisions to a stated goal, and
bound the orchestration layer. Both review lenses ran sequentially
(simplification then adversarial); all eleven findings applied, plus a staged
goal 5 so the decision and its implementing todo agree.
What this adds
dec.north-star-continuous-loop(proposed, cairn.root): the goal as analignment referent with a reachable terminal state, the rubric every queued
decision must carry, and the orchestration boundary (consumer layer beside
cairn per
dec.product-perimeter; truth in-repo, coordination outside;informed_by: res.gas-city-cairn-integration).todo.maintainer-pending-queue(cairn.kernel.query):cairn pendingplus aread-only webui panel, typed data only in v1. Measured motivation: six
proposed decisions were waiting today; the maintainer had been told about two.
todo.lint-selection-foldingamendment: names the three selection rules andthe pre-existing
dec.loop-selection-deferred-findingsthey compose with;fixes a stale example that pointed at the now-enforced shape-drift rule.
The convergence sheet (ratification happens in conversation, not here)
Recommended signing order, so nothing ambushes: W1
dec.loop-selection-deferred-findings; W2 folding items 1a+2 (go-ahead); W3dec.source-tracked-verification; W4dec.source-file-never-self; W5dec.brownfield-discovery-cycle-severity(option A: supersededec.order-containment-ruleper its own clause 6); W6dec.autodocs-head-to-head-arm-b; W7dec.contract-node-shape-drift-deferred(historical; its rule shipped in #515/#516); W8 tiers go-ahead; W9
dec.north-star-continuous-loop; W10 bootstrap verdict (recommend repair).Known side effect, sequenced for: full signing puts cairn.root at 12 and
cairn.kernel.cli at 11 direct accepted decisions against the flat threshold of
10, so two
CAIRN_DECISION_ACCUMULATIONInfos fire. With W1+W2 landed firstthey are non-selecting and sit in the queue for folding item 3, instead of
eating the next two loop iterations the way #518-#520 did.
No status flips in this PR: every proposed decision stays proposed until the
maintainer ratifies.