Skip to content

docs(memory): record the two landing-loop traps #946 paid for - #955

Draft
wenzowski wants to merge 1 commit into
mainfrom
claude/markdown-yaml-frontmatter-gkj9ty
Draft

wenzowski wants to merge 1 commit into
mainfrom
claude/markdown-yaml-frontmatter-gkj9ty

Conversation

@wenzowski

Copy link
Copy Markdown
Contributor

Refs CLOUD-1663

Two traps that each cost a lap on #946, written nowhere a later session would find them. Neither could ride in the commit body it belonged to: both surfaced after those messages were written — the first during CI, the second during the second rebase.

The fan-in hole

mem:workflow/landing-loop's Verdicts section already states the principle: a cancelled read as red wedges a branch with no exit. What it did not say is that this repository currently does exactly that on its second fan-in.

CI_FANIN_CHECK holds one name against final and action-final, so the superseded-run handling never applies to the latter. A cancelled action-final writes a real failure — its if: always() fails the needs: assertion — and a failure conclusion is an answer, so it outranks the newer run's non-answer and reads as red.

Verified the engine is not misreading anything, by feeding checks green the two real rows via CHECKS_GREEN_RUNS:

  • later skipped alone → pending — required check(s) with no verdict, exit 3. Correct: a skip is not an answer.
  • earlier failure + later skippedred, exit 1. Correct in isolation.

What made it expensive rather than merely wrong: the conclusion is permanent on its sha. An unchanged sha creates no new run, so re-lapping re-reads the identical failure for a full verify's cost — measured, twice on #946. Only a new sha clears it, which is free when main has moved and unavailable when it has not.

CLOUD-1663 is open and owns the fix (measured there independently on #848). This is the operating note until it lands.

A union is the wrong resolution when one side removed

MUTANT_GATES is one long comma-separated line both sides append to, so most conflicted laps conflict there and a union looks obviously right.

It is right only while both sides added. 8b619266 removed release-trigger-independentmutate sweep answered no-suite, so the row was a coverage claim with nothing behind it and moved to #MUTANT-EXEMPT. A mechanical union silently resurrects exactly that, re-reddening mutate census with a name main had just retired, and nothing in the conflict markers says so. Caught on #946 only because the entry's name looked unfamiliar.

The rule: diff against origin/main, not the merge base, so a deliberate removal survives the resolution.

Also records the neighbouring trap in the opposite direction — $MUTANT_GATES entries are module names resolved against policy/{name}.rego on disk, never rule ids, so renaming them to follow a rule-id rename stands the census's subjects up against names no file carries.

Scope

Memory file only; no code, no gate behaviour changes.


Generated by Claude Code

Both cost a lap on #946 and neither was written anywhere a later session
would find it: the commit bodies could not carry them, because both surfaced
after the messages they belonged in were already written.

THE FAN-IN HOLE IS NAMED WHERE THE PRINCIPLE ALREADY LIVES. The Verdicts
section already says a `cancelled` read as red wedges a branch with no exit.
It does not say that this repository currently does exactly that on its second
fan-in: `CI_FANIN_CHECK` holds one name against `final` and `action-final`, so
a cancelled `action-final` writes a real `failure` — `if: always()` fails its
`needs:` assertion — and a failure conclusion is an ANSWER, outranking the
newer run's non-answer. What made it expensive rather than merely wrong is
that the conclusion is permanent on its sha: an unchanged sha creates no new
run, so re-lapping re-reads the same failure for a full `verify`. CLOUD-1663
is open and owns the fix; this is the operating note until it lands.

A UNION IS THE WRONG RESOLUTION WHEN ONE SIDE REMOVED. `MUTANT_GATES` is one
long comma-separated line both sides append to, so most conflicted laps
conflict there and a union looks obviously right. `8b619266` removed
`release-trigger-independent` because `mutate sweep` answered `no-suite`, and
a union silently resurrects that retired coverage claim with nothing in the
conflict markers to say so. The rule is to diff against `origin/main` rather
than the merge base, so a deliberate removal survives the resolution.

Refs: CLOUD-1663, CLOUD-1787, CLOUD-1790
@coderabbitai

coderabbitai Bot commented Sep 15, 2026

Copy link
Copy Markdown

Review Change StackReview Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: 0bdca062-f034-498a-959d-3cf52e6e3945

📥 Commits

Reviewing files that changed from the base of the PR and between c2755e2 and 4605850.

📒 Files selected for processing (1)
  • .serena/memories/workflow/landing-loop.md

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

The landing-loop documentation now describes that CI_FANIN_CHECK names one of two fan-ins, and that a cancelled action-final can create a permanent sha-specific failure. It also documents when to union MUTANT_GATES lists, when to resolve against the current main list, and that entries are module names.

Priority: ⬇️ Low

Merge Risk: ⚪ Minimal · up to 46058

This documentation-only change does not alter runtime behavior, and no merge-blocking risk remains.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies a documentation change that records the two landing-loop traps described in the pull request.
Description check ✅ Passed The description directly explains both documented traps, their impact, and the scope of the documentation-only change.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0…
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 claude/markdown-yaml-frontmatter-gkj9ty

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.

wenzowski added a commit that referenced this pull request Sep 18, 2026
…d it

Three mechanics cost this session a lap each and none was written down.

`plan cover partial` is tree-scoped, so an in-flight plan entry reds every
`batten-check`, so `verify` writes no receipt, so `turn mint ahead` refuses
every write. `deleted` via `batten record plan` is the gate's own free exit
and stays reachable while the write gate holds.

A red `verify` at HEAD with the marker set is a real deadlock rather than a
gate to argue with: the fix for the red needs a write, and the write needs a
receipt only that fix can earn. Push first, then `git reset --soft` to a
commit that already carries a green `verify.<sha>`, and land the fix in that
window. The leased push back must name the sha it replaces.

`refusal::first_sighting` keys its store under `$GIT_DIR`, so a fixture
without its own repository shares the enclosing one's sighting history and a
cold state root controls nothing — the escape that produced three wrong
diagnoses, none reproduced before it was reported and one filed as an Urgent
row. The habit that would have caught all three is recorded with them: a
control must control the thing the code actually reads.

Refs: CLOUD-1832

Admits: 47a19db059f65de2feac7b648ed213b79ff615846ce848f7040efcad469c7685
Admits-rule: diff ship early
Admits-verdict: diff ship early
Admits-subject: 1
Admits-anchor: finding:16d69d6efc2185c0f225a253dc19dc0f9328129fcb11b39debac4e2e717015f9
Admits-epoch: e62b450968208680e4ed7d5cd6b5be263da64f3598c306ced4a0b8d845f3564d
Admits-author: alec@wenzowski.com
Admits-prev: -
Admits-answer-lost: The three traps exist only in one session's chat and die with this container. Each already cost a wasted lap; the first was escalated to a human as an override request because the rule was not written down, and the third produced three wrong diagnoses, one filed as an Urgent row that then needed a correction. Not landing it means the next session pays them again.
Admits-answer-precondition: The prose IS the deliverable: this commit's only content is a memory recording three landing-loop traps this session paid a lap each for — the plan-store deadlock, the HEAD-keyed receipt window, and the $GIT_DIR-keyed sightings store. There is no code change it describes, so there is nothing for it to ride.
Admits-answer-rejected-route: task run first — let the next change to these files carry the prose. It does not apply because nothing scheduled touches `.serena/memories/workflow/landing-loop.md`; the memory is read on demand and a change to it is always prose-only by construction, so waiting is waiting for a code change that will never come. PR #955 is the precedent: the same shape, landed as its own PR.
wenzowski added a commit that referenced this pull request Sep 18, 2026
…d it

Three mechanics cost this session a lap each and none was written down.

`plan cover partial` is tree-scoped, so an in-flight plan entry reds every
`batten-check`, so `verify` writes no receipt, so `turn mint ahead` refuses
every write. `deleted` via `batten record plan` is the gate's own free exit
and stays reachable while the write gate holds.

A red `verify` at HEAD with the marker set is a real deadlock rather than a
gate to argue with: the fix for the red needs a write, and the write needs a
receipt only that fix can earn. Push first, then `git reset --soft` to a
commit that already carries a green `verify.<sha>`, and land the fix in that
window. The leased push back must name the sha it replaces.

`refusal::first_sighting` keys its store under `$GIT_DIR`, so a fixture
without its own repository shares the enclosing one's sighting history and a
cold state root controls nothing — the escape that produced three wrong
diagnoses, none reproduced before it was reported and one filed as an Urgent
row. The habit that would have caught all three is recorded with them: a
control must control the thing the code actually reads.

Refs: CLOUD-1832

Admits: 47a19db059f65de2feac7b648ed213b79ff615846ce848f7040efcad469c7685
Admits-rule: diff ship early
Admits-verdict: diff ship early
Admits-subject: 1
Admits-anchor: finding:16d69d6efc2185c0f225a253dc19dc0f9328129fcb11b39debac4e2e717015f9
Admits-epoch: e62b450968208680e4ed7d5cd6b5be263da64f3598c306ced4a0b8d845f3564d
Admits-author: alec@wenzowski.com
Admits-prev: -
Admits-answer-lost: The three traps exist only in one session's chat and die with this container. Each already cost a wasted lap; the first was escalated to a human as an override request because the rule was not written down, and the third produced three wrong diagnoses, one filed as an Urgent row that then needed a correction. Not landing it means the next session pays them again.
Admits-answer-precondition: The prose IS the deliverable: this commit's only content is a memory recording three landing-loop traps this session paid a lap each for — the plan-store deadlock, the HEAD-keyed receipt window, and the $GIT_DIR-keyed sightings store. There is no code change it describes, so there is nothing for it to ride.
Admits-answer-rejected-route: task run first — let the next change to these files carry the prose. It does not apply because nothing scheduled touches `.serena/memories/workflow/landing-loop.md`; the memory is read on demand and a change to it is always prose-only by construction, so waiting is waiting for a code change that will never come. PR #955 is the precedent: the same shape, landed as its own PR.
wenzowski added a commit that referenced this pull request Sep 18, 2026
…d it

Three mechanics cost this session a lap each and none was written down.

`plan cover partial` is tree-scoped, so an in-flight plan entry reds every
`batten-check`, so `verify` writes no receipt, so `turn mint ahead` refuses
every write. `deleted` via `batten record plan` is the gate's own free exit
and stays reachable while the write gate holds.

A red `verify` at HEAD with the marker set is a real deadlock rather than a
gate to argue with: the fix for the red needs a write, and the write needs a
receipt only that fix can earn. Push first, then `git reset --soft` to a
commit that already carries a green `verify.<sha>`, and land the fix in that
window. The leased push back must name the sha it replaces.

`refusal::first_sighting` keys its store under `$GIT_DIR`, so a fixture
without its own repository shares the enclosing one's sighting history and a
cold state root controls nothing — the escape that produced three wrong
diagnoses, none reproduced before it was reported and one filed as an Urgent
row. The habit that would have caught all three is recorded with them: a
control must control the thing the code actually reads.

Refs: CLOUD-1832

Admits: 47a19db059f65de2feac7b648ed213b79ff615846ce848f7040efcad469c7685
Admits-rule: diff ship early
Admits-verdict: diff ship early
Admits-subject: 1
Admits-anchor: finding:16d69d6efc2185c0f225a253dc19dc0f9328129fcb11b39debac4e2e717015f9
Admits-epoch: e62b450968208680e4ed7d5cd6b5be263da64f3598c306ced4a0b8d845f3564d
Admits-author: alec@wenzowski.com
Admits-prev: -
Admits-answer-lost: The three traps exist only in one session's chat and die with this container. Each already cost a wasted lap; the first was escalated to a human as an override request because the rule was not written down, and the third produced three wrong diagnoses, one filed as an Urgent row that then needed a correction. Not landing it means the next session pays them again.
Admits-answer-precondition: The prose IS the deliverable: this commit's only content is a memory recording three landing-loop traps this session paid a lap each for — the plan-store deadlock, the HEAD-keyed receipt window, and the $GIT_DIR-keyed sightings store. There is no code change it describes, so there is nothing for it to ride.
Admits-answer-rejected-route: task run first — let the next change to these files carry the prose. It does not apply because nothing scheduled touches `.serena/memories/workflow/landing-loop.md`; the memory is read on demand and a change to it is always prose-only by construction, so waiting is waiting for a code change that will never come. PR #955 is the precedent: the same shape, landed as its own PR.
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