compass(rules): the reviewer checks gates 1-3 as they apply per task, so approval never waits for the per-wave GPU tier (#369) - #371
Conversation
…es per task (#369) The landing precondition said the reviewer checks gates 1-3 before approving. Gate 1 has two tiers, the GPU-free tier per task and the GPU superset per wave, so a literal reader could withhold APPROVE until a per-wave GPU delta existed. The landing rule says landing does not wait for that superset. Qualify the clause with "as they apply per task". Gate 1 applies per task only as its GPU-free tier, so the per-wave superset is no longer a pre-approval check. Two lines change, and no neighbouring line is rewrapped. The optional ponytail shrink is not taken. Its two-line saving needs four byte-identical neighbour lines rewrapped, and without that reflow it saves no line. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
| on that PR; every escalation rule in this file holds through this label), an | ||
| APPROVE covering each head (the reviewer checks gates 1-3 before approving, and | ||
| the approval is gate 4), and the tree check below. A | ||
| APPROVE covering each head (the reviewer checks gates 1-3 as they apply per task |
There was a problem hiding this comment.
Non-blocking (follow-up issue, not a change to this PR): after this clause is narrowed, no sentence in the file says who runs gate 1's per-wave GPU superset, or when.
Rules quoted:
- L121-122: "the GPU-free tier per task, the GPU superset per wave as a delta."
- L154-155: "it does not wait for the per-wave GPU superset."
- Principle 6: "Refuse rather than fall back. A declined answer with a named reason is a result. A guessed one is a defect."
What I checked. grep -n -i -E "gpu|superset|wave|tier" at the head gives only L121-122 and L155 for the superset. L120 still says "Four gates land a task, all required", and L155 exempts landing from the superset. Before this PR, the only reading that gave the superset an owner was the literal one at L161: the reviewer runs it before approving. That reading contradicted L154-155, and this PR removes it, as #369 asked.
Why it does not block. It drops no duty a reviewer has in practice. That reading could never be followed without breaking L154-155, and the PR's own named result is that the reviewer does not wait. The gap was already in the file. This PR only makes it visible.
Suggested follow-up. File an issue asking the owner or planner who runs the per-wave delta, and when it runs, for example the landing agent after a wave's last landing. Until that is answered, a literal reader will find the tier required at L120 with nobody assigned to run it.
|
Agent-authored review (cycle 1). I read the eight principles in Verdict: APPROVE for head 1. Word diff and meaning
2. Ruling on "as they apply per task" (principle 6)Principle 6: "Refuse rather than fall back. A declined answer with a named reason is a result. A guessed one is a defect."
3. The three-sentence argument, and a sweep
4. ponytail-review over the diffI read the raw
Lean already. Ship. 5. Gate: the merged tree at the current tip, gated once
The +3 against the PR body's 5265 is explained by the moved tip. #355 (
Blocking: none. Non-blocking: 1, inline at L161 (the per-wave superset has no named owner; needs a follow-up issue). No owner ruling needed. |
Closes #369
What changed
atom/compass/AI_DEV_RULES.md: one clause at L161-162, +2/−2, with no other file touched. Five words are inserted: "as they apply per task".git diff --word-diffshows that one insertion and nothing else. No neighbouring line is rewrapped.Sentence-level diff
The changed sentence is the three-precondition sentence at L158-162. It is split below into the clauses #367's review used. Every other sentence in the file is byte-identical.
need humanon the PR or below it (a label on an issue a PR delivers counts as on that PR; every escalation rule in this file holds through this label)"Why gates 2 and 3 do not move. Every term in them is already per task:
So for gates 2 and 3, "as they apply per task" selects everything they contain. The qualifier removes only gate 1's per-wave tier, which is the only per-wave requirement among gates 1-3.
Named result: no reading makes a reviewer wait for the per-wave GPU superset
The three sentences, side by side (head):
need humanon it or anywhere below it in its stack; it does not wait for the per-wave GPU superset."Why they now agree:
The file has no other route to that wait. I read every sentence that names a gate, a review or an approval:
grep -n -i -E "gate|review|approv", 36 lines.L161-162 was the only sentence that tied the reviewer's approval to gate 1, and it now names the per-task scope.
Ponytail
shrink:: not takenThe suggested wording was "(gate 4; the reviewer checks gates 1-3 before it)", plus a reflow. Its −2 lines depend on rewrapping L162-165, which are four byte-identical neighbours. The brief allows the shrink only if it does not rewrap unrelated lines. Without the reflow it saves no line: the qualified short form still spans the same two lines. It would also swap "before approving" for "before it", whose referent is less direct. So I took the minimal insertion, and the diff stays at +2/−2 with no rewrap.
I considered a second wording, from the #367 inline r4088381014: "gate 1's GPU-free tier, 2 and 3". It is explicit, but longer, and it restates gate 1's tier name. "As they apply per task" keys on gate 1's own scope word instead, so the clause keeps following gate 1 if the tiers are ever renamed.
Gate 1: ATOM's suite, unmodified, on node 18
Setup:
xiaobizh_n18_cpu, using the tree's ownscripts/compass/gate_cpu.sh.git archiveof agit commit-treestamp commit, with.compass-commitand.compass-changedwritten from the same ref. The tar md5 matched on both ends. It was piped throughdocker exec -i … tar -xinto/tmp/i369gates/…. The shared mount was not touched.timeout -k 10 2400with--junitxml, unpiped.atom.__file__: asserted under the staged root before each run, and printed again by the gate.The tip moved from
aff86031eto177f65ef5during the work (#365, which changes onlytests/compass/test_spec_verbs.py). So I gated the merged tree against a fresh control at the new tip as well.commit:lineatom.__file__GATE_CPU_RCaff86031eaff86031e (stamp),.compass-changedempty/tmp/i369gates/control/ATOM/atom/__init__.pyaff86031e99f7e411a (stamp),.compass-changed=atom/compass/AI_DEV_RULES.md,gpu: not required/tmp/i369gates/branch/ATOM/atom/__init__.py177f65ef5177f65ef5 (stamp),.compass-changedempty/tmp/i369gates/t2/control/ATOM/atom/__init__.py177f65ef517df04a99 (stamp),.compass-changed=atom/compass/AI_DEV_RULES.md,gpu: not required/tmp/i369gates/t2/branch/ATOM/atom/__init__.pyclassname::nameand outcome. Each side has 5423 ids: 5265 passed and 158 skipped (junit records the 3 xfailed as skipped). At both tips: 0 only in the control, 0 only in the merged tree, 0 with a changed outcome.aff86031e,git merge-tree --write-tree aff86031e 805fb0e82returns rc 0 andf5297f2051c06845cf95b2ec4e4b0174f0edfcec, which equals805fb0e82^{tree}.177f65ef5,git merge-tree --write-tree 177f65ef5 805fb0e82returns rc 0 and5e0a16cc4665b0e57aab42317ccae23a10e7e6d2. That is the tree gated as17df04a99.99f7e411aand17df04a99are objects only. No ref was created for them.git grep AI_DEV_RULES -- tests scriptsreturns rc 1 at the head.AI_DEV_RULES.md. I checked the file lists of all open PRs over REST.Gate 2 does not apply: the change is to a rules document, with no code and no tests.
Dev record
🤖 Generated with Claude Code