Skip to content

docs(meta): signature-queue artefacts (north star, pending queue, selection dedupe) - #528

Merged
George-RD merged 6 commits into
mainfrom
meta/signature-queue
Jul 29, 2026
Merged

docs(meta): signature-queue artefacts (north star, pending queue, selection dedupe)#528
George-RD merged 6 commits into
mainfrom
meta/signature-queue

Conversation

@George-RD

Copy link
Copy Markdown
Collaborator

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 an
    alignment 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 pending plus a
    read-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-folding amendment: names the three selection rules and
    the pre-existing dec.loop-selection-deferred-findings they 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); W3
dec.source-tracked-verification; W4 dec.source-file-never-self; W5
dec.brownfield-discovery-cycle-severity (option A: supersede
dec.order-containment-rule per its own clause 6); W6
dec.autodocs-head-to-head-arm-b; W7 dec.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_ACCUMULATION Infos fire. With W1+W2 landed first
they 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.

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.
@coderabbitai

coderabbitai Bot commented Jul 29, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@George-RD, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 53 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

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 configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 92f7c971-9ce8-46a7-b7d5-2e51aae30b6c

📥 Commits

Reviewing files that changed from the base of the PR and between 5561dcb and a70bb3a.

📒 Files selected for processing (2)
  • meta/decisions/north-star-continuous-loop.md
  • meta/todos/todo.maintainer-pending-queue.md
📝 Walkthrough

Walkthrough

Adds documentation defining continuous-loop governance, maintainer ratification queue semantics, pending CLI/webui behavior, and lint-selection rules aligned with deferred findings.

Changes

Continuous loop documentation

Layer / File(s) Summary
North star governance
meta/decisions/north-star-continuous-loop.md
Defines continuous agent progress, reversible decision-chain corrections, maintainer signing boundaries, queue ordering, and decision-accumulation thresholds.
Pending queue contract
meta/todos/todo.maintainer-pending-queue.md
Specifies proposed-decision output for cairn pending, JSON fields and ordering, read-only webui rendering, non-goals, and acceptance criteria.
Selection rule alignment
meta/todos/todo.lint-selection-folding.md
Documents deferred-finding selection rules and clarifies handling of decision-deferred findings without registry rows.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related issues

Possibly related PRs

Poem

A rabbit reads the queue at dawn,
While quiet stars mark work withdrawn.
Deferred clues hop into line,
Pending signatures wait and shine.
“Keep looping clean,” I twitch my nose—
The North Star guides where Cairn goes.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title matches the PR’s main docs changes: a north-star decision, pending queue, and selection-folding updates.
Description check ✅ Passed The description is directly about the same meta-streamlining artefacts and their intended effects.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch meta/signature-queue

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between 884c8a5 and 5561dcb.

📒 Files selected for processing (3)
  • meta/decisions/north-star-continuous-loop.md
  • meta/todos/todo.lint-selection-folding.md
  • meta/todos/todo.maintainer-pending-queue.md

Comment thread meta/decisions/north-star-continuous-loop.md
Comment thread meta/todos/todo.maintainer-pending-queue.md Outdated
@George-RD

Copy link
Copy Markdown
Collaborator Author

Review adjudication

Sequential lenses per the pre-submit gate, simplification then adversarial, plus CodeRabbit.

  • Simplification (8 findings, all applied): incomplete binding boundary in goal 3 (cross-container span added); stale citation (dec.beads-task-layer is superseded; now dec.task-tracking-authority); dead provenance note (the gas-city research is already registered as res.gas-city-cairn-integration, now in informed_by); pending queue narrowed to typed data only, no Depends-on prose parsing; mutable six-decision acceptance check replaced with a status-partition fixture; the three selection rules named explicitly; wire-internals bullet dropped; the binding End-step edit split out of the query unit.
  • Adversarial (3 findings, all applied): goal 4's late-discovery path made operational and non-gameable (same enqueue-and-reroute path, plus a Context note that feeds the Scope audit); referent framing tied to acceptance; live proposed-decision count corrected to seven.
  • Advisory during authoring: goal 5 staged (age-sorted typed v1, unblock-sorted once dec.todo-relationship-model lands) so the decision and its implementing todo agree.
  • CodeRabbit: self-applied rubric section (landed in 9429a6a); age basis and tie-break now defined (date: frontmatter, whole days, id-ascending ties).

@George-RD
George-RD merged commit 13dd4c0 into main Jul 29, 2026
15 checks passed
@George-RD

Copy link
Copy Markdown
Collaborator Author

Sheet correction: W7

W7 previously read "accept dec.contract-node-shape-drift-deferred as historical". Wrong move, caught in review: that decision's operative clause is "the rule stays pending ... until the enforcer lands", and the enforcer HAS landed (#515 re-record surface, #516 enforcer; CAIRN_CONTRACT_NODE_SHAPE_DRIFT is enforced in docs/registries/spec-rules.md, its todo is done). Accepting now would attach present-tense authority to cairn.kernel.scanner describing a parking that no longer exists.

W7 is now: deprecate as fulfilled. Direct frontmatter flip to status: deprecated plus a dated body note stating the plan completed rather than being repudiated. deprecated is the schema's non-accepted terminal (docs/artefacts.md:56), and deprecated decisions drop out of default neighbourhood/rationale views while staying queryable with --include-deprecated-decisions, which is the right end state for a fulfilled deferral.

Two reference touch-ups ride the same batch:

  • meta/todos/todo.lint-selection-folding.md:20 mis-attributes the standing CAIRN_SPEC_RULE_UNIMPLEMENTED to this decision; the live deferral is dec.revisit-trigger-correlator-deferred (spec:634).
  • meta/todos/todo.decision-ratification-tiers.md:19 cites it in present tense as a decision that "parks a spec rule"; moves to past tense.

The rest of the sheet is unchanged, including the one-word protocol.

George-RD added a commit that referenced this pull request Jul 29, 2026
…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.
George-RD added a commit that referenced this pull request Jul 29, 2026
…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.
George-RD added a commit that referenced this pull request Jul 29, 2026
…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.
George-RD added a commit that referenced this pull request Jul 30, 2026
…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.
George-RD added a commit that referenced this pull request Jul 30, 2026
…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.
George-RD added a commit that referenced this pull request Jul 30, 2026
…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.
George-RD added a commit that referenced this pull request Jul 31, 2026
…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.
@coderabbitai coderabbitai Bot mentioned this pull request Aug 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant