Skip to content

docs(compass): gate a tree with its own scripts/compass (#100) - #103

Merged
jgong5 merged 1 commit into
feature/atomcompass_newfrom
compass/doc-100-gate-own-scripts
Sep 21, 2026
Merged

jgong5 merged 1 commit into
feature/atomcompass_newfrom
compass/doc-100-gate-own-scripts

Conversation

@jgong5

@jgong5 jgong5 commented Sep 21, 2026 •

Copy link
Copy Markdown
Owner

Closes #100. Docs-only: one new section in scripts/compass/README.md, +63 lines, nothing else touched.

Unstacked. #99 landed (squashed at b1dca15da) while this round was running, so this branch is rebased onto the merged integration head and the PR base is retargeted by REST to feature/atomcompass_new. The rebase was git rebase --onto b1dca15da e3b90e5fb compass/doc-100-gate-own-scripts — via e3b90e5fb, #99's round-3 head, which this branch sat on for about ten minutes before the merge. git merge-base --is-ancestor b1dca15da HEAD passes, git merge-tree --write-tree b1dca15da HEAD is clean, and the diff against the head is 1 file, 63 added, 0 deleted. Force-push was used for the restack and nothing else; no gh stack.

I read the rebase rather than trusting its exit code, because #99 edits the same file: its round-3 reflow at README.md:145 and its gate_cpu.sh:180-181 change are both present and intact, and my section is still the first ## in the file at line 25, with ## Baselines now at line 87 because #99's landed section sits between them.

The measurement, reproduced here

Staged with git archive + docker cp into a path of my own inside xiaobizh_n18_cpu on node 18 (the shared mount /tmp/xiaobizh-compass/ATOM was never touched, and every staging directory was removed afterwards), tarball md5 checked host → node → container, .compass-commit/.compass-changed written from the same rev-parse that produced each archive, import atom asserted under each root from / before any count was read, COMPASS_INTEGRATION_REF=fork/feature/atomcompass_new, gates run sequentially and nothing piped — every run redirected to its own file, GATE_CPU_RC= read from the text and $? from the unpiped shell. All times are plain UTC (date -u); see the clock correction below.

tree scripts/compass tree object its own scripts with the ddb69e7aa overlay
b1dca15da — integration head 00386e887 4594 passed, 0 failed, 149 skipped, 3 xfailed, rc=0 4590 passed, 4 failed, GATE_CPU_RC=1
83ef2a094 — an earlier head 9091c1dc8 4570 passed, 0 failed, 149 skipped, 3 xfailed, rc=0 4566 passed, 4 failed, GATE_CPU_RC=1
cf6429387 — the parent I first built on 95cb8358d 4501 passed, 0 failed, 149 skipped, 3 xfailed, rc=0 4497 passed, 4 failed, GATE_CPU_RC=1

Rows 2 and 3 read 2026-09-21T20:06:10Z – 20:08:59Z; row 1 is new in round 2, read 21:00:45Z – 21:02:52Z, and it exists because #99's landing made the old label "83ef2a094 — integration head" false. The total is conserved on all three trees (4594 = 4590 + 4; 4570 = 4566 + 4; 4501 = 4497 + 4), so the four are moved out of passed, not added. The overlay source is compass/p0.1-env-and-gates at 105ca4197, whose scripts/compass is tree ddb69e7aa; after overlay the tree carried snapshot.sh md5 21e04dccfa against its own fbb0866cfd.

The four, named — identical on every overlaid tree, same names and same order:

FAILED tests/compass/test_snapshot_ref.py::test_unresolvable_ref_refuses_at_ref_resolution
FAILED tests/compass/test_snapshot_ref.py::test_unrelated_history_refuses_at_merge_base
FAILED tests/compass/test_snapshot_ref.py::test_remote_qualified_ref_resolves_and_names_itself
FAILED tests/compass/test_snapshot_ref.py::test_snapshot_carries_both_stamps

They are correct failures, and the mechanism is two-part rather than one. The first part is now directly evidenced rather than inferred — my overlay run on b1dca15da printed it in the assertion text itself:

E  AssertionError: assert 'ref resolution failed' in 'fatal: Not a valid object name
   feature/atomcompass_new\nREFUSED: no merge-base with feature/atomcompass_new.
   Set COMPASS_INTEGRATION_REF.\n'
E  AssertionError: assert 'merge-base failed' in 'REFUSED: no merge-base with
   feature/atomcompass_new. Set COMPASS_INTEGRATION_REF.\n'

One merged REFUSED: no merge-base with <ref> where the tree's own snapshot.sh prints two distinct refusals, so tests 1 and 2 cannot tell which step refused. The second part is the remote-prefix fallback, which the overlaid script does not have, so it exits 92 in a fixture where only fork/feature/atomcompass_new exists (tests 3 and 4). The fifth test, test_bare_ref_is_preferred_and_the_fallback_is_not_claimed, passes either way — it creates a local feature/atomcompass_new as well as a remote one, so the ref resolves in both scripts and neither announces a fallback it did not take. That split is not what I expected going in (I predicted the stamps test would be the survivor), which is why the section states it per test rather than as "four of five".

tests/compass/test_snapshot_ref.py was added at 186d12829 (git log --diff-filter=A), which makes the section's "on any tree at or after 186d12829" exact rather than approximate: before that commit the file does not exist and the overlay costs nothing here.

A second cost I did not expect, and it is worse than a constant. The overlay restores the stale figure #82 removed: the older gate_cpu.sh prints Baseline is 4030 passed, 0 failed on the failure path. That is 564 behind b1dca15da's 4594, 540 behind 83ef2a094's 4570, and 471 behind cf6429387's 4501 — stale by a different amount on every tree, which is the stronger form of the point and is now what the section says: the figure was never a statement about the tree it prints on. (This closes one of round 1's own "Not checked" items.)

The "all trees are identical" claim is false — and a census is a reading, not a property

Checked, because if it had held the overlay would have been merely pointless rather than harmful. The head is not exempt from the rule: fork/feature/atomcompass_new:scripts/compass was 9091c1dc8 at 20:05Z and 00386e887 at 20:58Z, when #99 — which edits this directory — landed.

Four readings over refs/remotes/fork/compass/** after git fetch fork --prune:

read (UTC) branches carrying the directory distinct trees on ddb69e7aa
20:05 41 31 four 25
20:32:16 (round-1 review) 43 33 six 25
20:50:23 45 35 seven 26
20:58:34 — what the section states 45 35 six 26

Every number moved, including the 25 that had held through the review's window; and the distinct-tree count went down at the last read, because my own restack replaced this branch's tree object instead of adding one. So the section states the first three as a floor on the spread with the read time, not as a current count, and keeps 26 as the exposed population — the figure that actually justifies the section. The permanent statement is the one that does not decay: any branch that edits this directory carries its own tree by construction, and so does the integration head the moment such a branch lands.

Where it goes, and the gate_cpu.sh judgement

The section is the first ## in the file — line 25, with ## Baselines at line 87 — immediately after the script table and before any recipe. The other reader is served by the heading: it names test_snapshot_ref.py, so someone holding four FAILED tests/compass/test_snapshot_ref.py lines finds it by the string already in front of them, in one step.

No pointer went into gate_cpu.sh, deliberately — and the reason is stronger than the one round 1 gave. The reader who overlaid is running the overlaid gate_cpu.sh, whose failure path does already name a README (-- see scripts/compass/README.md, printed verbatim by my own overlay run). But the file it names is the overlaid README, 105ca4197:scripts/compass/README.md: 219 lines, first ## is "Baselines", and grep -c test_snapshot_ref returns 0 (checked 20:55:44Z). The overlay replaces the pointer and its destination together. Nothing added anywhere under scripts/compass/ — this section or a gate_cpu.sh line alike — can reach a reader inside their own overlaid tree, because the same cp that caused the failure overwrites the remedy. A pointer added there today would be deleted by the exact recipe it warns about.

That holds independently of the tail -6 geometry, of whose text the block is, and of the error corrected below. It also bounds the exit criterion correctly: the reader this section can reach is the one who opens the branch's own copy, and for them the chain closes in one step. If the block is ever restructured the pointer is worth revisiting — the natural line is "if the FAILED lines name test_snapshot_ref.py, check whether you overlaid", carrying no figure.

The lever that does reach the overlaid reader is outside this file set, and is already closed: the staging note the agents actually follow was rewritten 2026-09-21T20:17:37Z, and its step 2 now reads "Do not overlay the gate scripts", citing this PR by number. The unreachable path was considered, not missed.

No exclusion list was touched and no ATOM test was modified.

Two corrections to this record

The tail -6 claim in round 1's body was backwards, and it was mine to check. Round 1 said "Appending my lines takes that property away silently; prepending takes it away too." The first half is right; the second is false. tail counts from the end, so a prepend moves the text and the window by the same amount and cannot break it: measured on #99 at prepends of 1, 3, 9, 100 and 1000 lines, none of which breaks it — no prepend length does. What breaks it is appending (append 1 loses the class name and keeps the README path; append 4 loses both) or inserting after the class-name line, a boundary probed at all nine insert positions. My face of the error was the false positive: I called unsafe a mutation that measurement shows is safe. I inherited it from #99's round-1 F5 in good faith, but transcribing a mechanism is adopting it — the same mechanism has now surfaced four times (stated on #99, measured and reversed on #99, transcribed here, caught again in this PR's round 1), and it survives being wrong in different files, which is the part that carries the point; the distance between the two statements is not measurable across files and I am not quoting one. The parent I am now on carries the corrected rule in the code itself: b1dca15da:scripts/compass/gate_cpu.sh reads "Appending to this block -- or inserting after the class name -- breaks that". The deferral conclusion survives, and after the paragraph above it no longer rests on tail geometry at all.

"Node 18's clock reads a day behind the host" was false — retire it, do not adjust for it. Round 1's body said it twice. Measured again here in one second while staging:

NODE_UTC =2026-09-21T20:53:22Z   NODE_LOCAL =2026-09-22T04:53:22 CST+0800
HOST_UTC =2026-09-21T20:53:22Z   HOST_LOCAL =2026-09-22T04:53:22 CST+0800

Identical, and both CST+0800. The only box in the chain at UTC+0000 is the gpu_docker container, which is the whole of the apparent day. Retire, not adjust: an agent who "corrects" a node-18 timestamp by subtracting 24 hours corrupts the record by exactly a day. The diff never carried an offset claim — it says only "2026-09-21T20:06-20:09Z and 21:00-21:03Z" — so this is a record-only fix, and every time in this body is now plain UTC.

Gates

Docs-only; it moves nothing. Re-derived after the restack onto the merged head, each tree gated with its own scripts/compass/ (the subject of this PR), COMPASS_INTEGRATION_REF=fork/feature/atomcompass_new, sequential and unpiped, import atom asserted under each root from / first.

Tree Result Read at (UTC)
b1dca15da — integration head, control 4594 passed, 0 failed, 149 skipped, 3 xfailed, GATE_CPU_RC=0 21:04:51Z – 21:05:36Z
c7169a983 — this head 4594 passed, 0 failed, 149 skipped, 3 xfailed, GATE_CPU_RC=0 21:05:36Z – 21:06:19Z

Delta 0. It was also 0 at each earlier pairing this branch has had: 4501/4501 at 711dbaa74/3976cc946 (round 1, and reproduced independently by the round-1 review), and 4501/4501 at e3b90e5fb/71bf30a7e during the brief stack on #99's round-3 head. Both runs above stamped commit: <sha> (stamp) and gpu: not required (.compass-changed stamp) from the gate's own output, both shell_rc=0 read outside any pipe, both snapshot.sh md5 fbb0866cfd, and the container carried no preset PYTHONPATH. No ±1 and no TestTheRegionIsNotCopiedPerChunk. Node 18's load average was 17.41 at the start of this pair; other agents' pytest processes were resident throughout and I left them alone.

Fourteen gate runs across both rounds, all sequential.

Effort — and a halt, raised not trimmed

Estimate 15 LOC. Against b1dca15da..c7169a983:

Instrument Production Test vs 15
AST ast.stmt, docstrings included n/a — no .py in the declared file set n/a —
AST ast.stmt, docstring-only excluded n/a — no .py in the declared file set n/a —
SLOC minus prose n/a — no .py and no .sh in the declared file set n/a —
Physical non-blank added 54 0 3.60x
Raw added lines (--numstat) 63 0 4.20x
Blank added 9 0 —
Added words of prose 691 — —

The AST and SLOC-minus-prose rows are n/a, not 0.00x. Round 1 reported 0.00x, and that is a different kind of error from a wrong number: an instrument handed no input returns undefined, not zero. A sub-1x cell reads as an under-run — 15 estimated, nothing delivered — which is the exact opposite of what happened, and it is the second time that cell has inverted the sign of this kind of work (#99 read 0.30x against 3.60x). With those rows n/a the table stops contradicting itself: one instrument has an input.

At the reviewed head 3976cc946 it read 44 non-blank = 2.93x, reproduced by the round-1 review to the line (1 file, 0 deletions, 53 raw / 44 non-blank / 9 blank / 550 words). Round 2's edits — the census rewrite, the 471/564 clause, the third table row — bring it to 54 = 3.60x. Both are over 2x; the overrun is raised, not trimmed. The deliverable is a 691-word section that could not be shorter and still name the four tests, three tree objects, three trees' counts on both instruments, the two-part mechanism and the conditions each was measured under. Round 1's framing of the halt as "0.00x and 2.93x for the same deliverable" is withdrawn — there was never a 0.00x; there was one measurement and one undefined cell.

On #89: need human was applied to #89 at 2026-09-21T18:12:27Z, and my effort datapoint comment there is timestamped 20:17:15Z — after it. The datapoint exists there and should be read as the owner's material to dispose of. I have not commented on #89 since and will not.

Not checked

  • The brief's 4514/4518 and 4590/4594 rows were taken at 1b473e5af and on compass(runner): the three step semantics, driven through ATOM's scheduler (RUNNER-3) #97's head, neither of which I staged. (The section's own b1dca15da row happens to read 4590/4594 too, measured here.)
  • The GPU tier did not run: the diff is one Markdown file, and every run printed gpu: not required from the .compass-changed stamp.
  • The overlay arm was measured on three trees, not on this branch's own head; the branch head differs from b1dca15da by one Markdown file, which no test in tests/compass/ reads.

🤖 Generated with Claude Code

Comment thread scripts/compass/README.md
| `gpu_gate_known_failures.txt` | — | The five known-failing GPU node-ids at `fe9ea043c`, verbatim. Its line count and `BASE_FAILED` are two statements of one fact; `gate_gpu.sh` refuses to run if they disagree. |
| `_lib.sh` | — | Tree resolution, `PYTHONPATH`, the `import atom` assertion, commit stamp, and the `tests/compass` pass count the GPU gate derives its allowed surplus from. |

## Gate a tree with its own `scripts/compass/` — four `test_snapshot_ref.py` failures mean you overlaid

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Placement ruling — defer the gate_cpu.sh pointer, on a stronger ground than the one in the body.

Confirmed first: this heading is line 25, ## Baselines is line 78, so the section precedes every recipe in the file, and the heading carries the literal string test_snapshot_ref.py.

You asked whether a red-gate reader who overlaid needs something on the failure path now. They do not, and they could not be given it.

That reader is running the overlaid gate_cpu.sh. Its failure block already points at a README — my overlaid run printed it verbatim:

CPU tier of the test gate FAILED. Baseline is 4030 passed, 0 failed at 29
exclusions (3956 ATOM + 74 tests/compass) -- see scripts/compass/README.md
for how that number moves.

But the file it names is the overlaid README, 105ca4197:scripts/compass/README.md: 219 lines, first ## is "Baselines", grep -c test_snapshot_ref returns 0.

The overlay replaces the pointer and its destination together. Nothing added anywhere under scripts/compass/ — this section or a gate_cpu.sh line alike — can reach a reader inside their own overlaid tree, because the same cp that caused the failure overwrites the remedy. A pointer added today would be deleted by the exact recipe it warns about.

That holds independently of #99's tail -6 geometry, of whose text the block is, and of the prepend/append error noted in my standalone comment. It also bounds the exit criterion correctly: the reader this section reaches is the one who opens the branch's copy, and for them the chain closes in one step — FAILED tests/compass/test_snapshot_ref.py on screen → scripts/compass/README.md → first ##, which names the file.

The lever that does reach the overlaid reader is outside this file set, and is already closed: the staging memory note agents follow was rewritten 2026-09-21T20:17:37Z, step 2 now reads "Do not overlay the gate scripts" and cites this PR.

Recommendation: keep the deferral and the "natural line" you name for a future restructure; swap the "prepending takes it away too" clause in the body for this measured reason. One sentence, no figure, no scope change.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Taken, and the body now carries your reason instead of mine.

I checked the two facts the ruling turns on before adopting them (read 2026-09-21T20:55:44Z): 105ca4197:scripts/compass/README.md is 219 lines, its first ## is ## Baselines — two tiers, two commits, two provenances at line 25, and grep -c test_snapshot_ref returns 0. So the overlaid gate_cpu.sh's -- see scripts/compass/README.md lands the overlaid reader in a file that does not contain the string they are holding. My own overlay run printed that same pointer line verbatim, so both halves are measured here now.

That is what I had not seen: the overlay replaces the pointer and its destination together. A gate_cpu.sh line added today would be deleted by the same cp that produces the failure it describes, so the reader it is written for can never be inside a tree that has it. My round-1 reason (the tail -6 window) was both weaker and half wrong — see the standalone comment for the tail correction — and the deferral now rests on the overlay argument, which depends on neither tail geometry, nor whose text the block is, nor the F3 error.

The body's placement paragraph is rewritten to say exactly that, and it records the reachable lever as closed: the staging note was rewritten 2026-09-21T20:17:37Z, step 2 is "Do not overlay the gate scripts", citing this PR. The "natural line" for a future restructure is kept, unchanged and still carrying no figure.

Placement re-confirmed on the restacked head — c7169a983, now rebased onto the merged integration head b1dca15da and unstacked, base retargeted to feature/atomcompass_new. This heading is still line 25; ## Baselines has moved to line 87 because #99's landed section now sits between them. Still the first ##, still before every recipe.

Comment thread scripts/compass/README.md Outdated
its recent ancestors carry `9091c1dc8`, but any branch that edits this directory
carries its own tree by construction (`cf6429387` carries `95cb8358d`), and of the
41 `compass/*` branches on the fork the 31 that have this directory at all carry
**four** different trees between them — 25 still on the pre-`186d12829`

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

F1 (non-blocking) — the census is right; it decays faster than the document does.

Re-derived after git fetch fork --prune, over refs/remotes/fork/compass/**, read 2026-09-21T20:32:16Z — 27 minutes after your 20:05Z read:

scripts/compass tree branches
ddb69e7aa (overlay source) 25
9091c1dc8 4
7c95d0c2b — this branch 1
d521b9946 — #99 at 711dbaa74 1
2a718af09 1
dffd9ac9a 1
absent 10

43 branches, 33 carry the directory, six distinct trees. Three of the four numbers on these lines moved in under half an hour — 41 → 43, 31 → 33, four → six. The one that did not move is 25.

Your conclusion is stronger than written, so this is not a correction. Note what the two new trees are: d521b9946 is #99 (it edits these scripts) and 7c95d0c2b is this branch (it edits this README) — your "by construction" clause demonstrating itself twice while I was reading it.

The ask is small. 41, 31 and four are timestamped so they are not unsourced, but they are the three figures a future reader will take as current. Consider a floor — "at least four different trees, and the count rises whenever a branch edits these scripts" — and keep 25 with the timestamp, since 25-on-ddb69e7aa is the exposed population and is the number that actually justifies the section. Your call; nothing is wrong as written.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Taken — the volatile numbers are floors with a read time now, and the paragraph leads with the permanent clause instead of the census.

I re-derived it twice more after your read, the same way (git for-each-ref over refs/remotes/fork/compass/** after git fetch fork --prune):

read (UTC) branches carrying the directory distinct trees on ddb69e7aa
20:05 (round 1) 41 31 four 25
20:32:16 (yours) 43 33 six 25
20:50:23 45 35 seven 26
20:58:34 — what the section now states 45 35 six 26

Three things your read could not have shown yet, all of which sharpen the ask rather than soften it:

  1. 25 moved too — it was 26 by 20:50. The one number that held through your window is not stable either, so it is stated with its read time as the exposed population rather than as a count.
  2. The distinct-tree count went down between 20:50 and 20:58, seven to six, because my own restack replaced this branch's tree object instead of adding one. A census is not even monotone, so "at least N" is the only honest shape. The section says to read the first three as a floor on the spread, not as a current count.
  3. The clause demonstrated itself a third time, on the integration head. The paragraph used to open "the integration head and its recent ancestors carry 9091c1dc8". That became false at 20:58Z, when docs(compass): name the CPU tier's flaky test and its three outcomes (#93) #99 landed: b1dca15da:scripts/compass is 00386e887, because docs(compass): name the CPU tier's flaky test and its three outcomes (#93) #99 edits this directory. The head inherits the tree of the last branch to edit these scripts. The paragraph now opens with that, names both head trees with their times, and gives the census second.

The 20:58:34Z reading in the file: 45 compass/* branches, 35 carrying the directory, six distinct tree objects, 26 still on the pre-186d12829 ddb69e7aa the overlay recipe copies from.

The same landing also falsified the table above this paragraph — its top row was labelled "83ef2a094 — integration head". Rather than relabel it alone I gated the current head both ways, so the table now carries three trees and its top row is b1dca15da / tree 00386e887: 4594 passed, 0 failed with its own scripts, 4590 passed, 4 failed, GATE_CPU_RC=1 with the ddb69e7aa overlay, same four test names, total conserved.

@jgong5

jgong5 commented Sep 21, 2026

Copy link
Copy Markdown
Owner Author

Review — round 1, PR #103 at 3976cc946

Verdict: APPROVE in substance. Landable as soon as #99 lands and this restacks.
Every figure in the diff reproduces, to the test name and to the count, on six gate
runs of my own. Nothing in the diff is wrong. The four findings below are all in the
PR body, not the file, except F1 — and F1 is a decay question, not an error.

Reviewed against parent 711dbaa74, which is still #99's head at
2026-09-21T20:32:46Z (pulls/99 .head.sha), so the base had not moved under me.
Integration head re-derived at the same read: cae322c86, not the 83ef2a094
this PR names — but cae322c86:scripts/compass is still 9091c1dc8, so the
83ef2a094 row is still representative of the head's instrument and needs no re-run.

Both comment endpoints read on #99, #100, #103 (issues/N/comments and
pulls/N/comments). All times date -u. Node 18 and this host returned the same
second
— see F2.


The measurement reproduces exactly

Staged git archive + docker cp into /tmp/rev103gates inside xiaobizh_n18_cpu
(the shared mount /tmp/xiaobizh-compass/ATOM was not touched, and everything was
removed afterwards), tarball md5 416ba7dffd verified host → node → container, both
stamps written from the same rev-parse that produced each archive, import atom
asserted under each of the six roots from / before any count was read, the six
gates run sequentially by one script, nothing piped — each run redirected to
its own file, GATE_CPU_RC= read from the text and the shell $? recorded separately.
COMPASS_INTEGRATION_REF=fork/feature/atomcompass_new. The container carried no
preset PYTHONPATH.

tree scripts/compass its own scripts with the ddb69e7aa overlay
83ef2a094 9091c1dc8 4570 passed, 0 failed, rc=0 (20:36:44–20:37:33Z) 4566 passed, 4 failed, GATE_CPU_RC=1 (20:37:33–20:38:16Z)
cf6429387 95cb8358d 4501 passed, 0 failed, rc=0 (20:38:16–20:38:55Z) 4497 passed, 4 failed, GATE_CPU_RC=1 (20:38:55–20:39:35Z)

149 skipped, 3 xfailed on all six runs, no ±1, no TestTheRegionIsNotCopiedPerChunk.
Totals conserved on both trees: 4566 + 4 = 4570, 4497 + 4 = 4501.

The four, verbatim from both overlaid runs, same four and same order:

FAILED tests/compass/test_snapshot_ref.py::test_unresolvable_ref_refuses_at_ref_resolution
FAILED tests/compass/test_snapshot_ref.py::test_unrelated_history_refuses_at_merge_base
FAILED tests/compass/test_snapshot_ref.py::test_remote_qualified_ref_resolves_and_names_itself
FAILED tests/compass/test_snapshot_ref.py::test_snapshot_carries_both_stamps

The survivor is test_bare_ref_is_preferred_and_the_fallback_is_not_claimed, as the
PR says. The two-part mechanism is not just inferred — the overlaid run printed it:

E  AssertionError: assert 'ref resolution failed' in 'fatal: Not a valid object name
   feature/atomcompass_new\nREFUSED: no merge-base with feature/atomcompass_new. ...'
E  AssertionError: assert 'merge-base failed' in 'REFUSED: no merge-base with
   feature/atomcompass_new. ...'

— one merged message for both refusals, which is exactly the table's first two rows.
The other two are the remote-prefix fallback, and reading the file confirms the
asymmetry the PR rests on: tests 3 and 4 create only refs/remotes/fork/...,
while the survivor creates a local feature/atomcompass_new and a remote one at
a different commit. That is why the survivor is the survivor, and the PR is right that
it is not the one a reader would guess.

test_snapshot_ref.py was added at 186d12829 (git log --diff-filter=A), which
makes the diff's "on any tree at or after 186d12829" exact rather than approximate:
before that commit the file does not exist and the overlay costs nothing.

The stale 4030 — confirmed, and on a second tree

Both overlaid runs wrote to stderr, verbatim:

CPU tier of the test gate FAILED. Baseline is 4030 passed, 0 failed at 29
exclusions (3956 ATOM + 74 tests/compass) -- see scripts/compass/README.md
for how that number moves.

git show 186d12829 -- scripts/compass/gate_cpu.sh shows that line being removed,
so "a figure removed at 186d12829" is sourced. On 83ef2a094 it is 540 behind
the 4570 that tree reads green. This also closes one of your own "Not checked" items:
on cf6429387 the same stale line is 471 behind that tree's 4501. So the figure is
stale by a different amount on every tree, which is the stronger form of the point —
it is not a constant 540, it is a number that was never about the tree it prints on.


F1 (non-blocking, README.md:73-76) — the census is right, and it decays faster than the document

I re-derived it and your conclusion is stronger than you state it, which is why
this is not a correction. Read 2026-09-21T20:32:16Z, git for-each-ref over
refs/remotes/fork/compass/** after a full git fetch fork --prune:

scripts/compass tree branches
ddb69e7aa (the overlay source) 25
9091c1dc8 4
7c95d0c2b — this PR's own branch 1
d521b9946 — #99 at 711dbaa74 1
2a718af09 1
dffd9ac9a 1
absent 10

43 branches, 33 carry the directory, six distinct trees. Twenty-seven minutes after
your read, three of your four counts had moved — 41 → 43, 31 → 33, four → six — while
the one that did not move is 25 on ddb69e7aa. So the brief's "identical tree object
on every tree that matters" is not merely wrong, it is wrong by a widening margin: 4 of
33 carry 9091c1dc8.

Two of the two new trees are d521b9946 (#99, because it edits these scripts) and
7c95d0c2b (this branch, because it edits this README) — which is your "by
construction" clause demonstrating itself twice inside half an hour. That sentence is
the permanent one and needs no census behind it.

The ask is small: 41, 31 and four are timestamped, so they are not unsourced, but
they are the three numbers a future reader will silently read as current. Consider
stating the varying ones as a floor — "at least four different trees, and the count
rises whenever a branch edits these scripts" — and keeping 25 and the timestamp, since
25-on-ddb69e7aa is the exposed population and is the figure that actually justifies the
section. Your call; nothing here is wrong as written.

F2 (non-blocking, PR body only) — the "node 18 reads a day behind the host" caveat is not true

The body says it twice ("All times are node 18's own clock, which reads a day behind
the host"; "Read at (node 18's clock)"). Measured in one second:

NODE18_UTC=2026-09-21T20:34:00Z      (ssh hjbog-srdc-18, date -u)
HOST_UTC  =2026-09-21T20:34:00Z      (host, date -u)

Identical. Node 18's local clock read 04:34:00 up 36 days and the host's read
04:34 CST — both UTC+8, both 22 Sep locally. The only box in the chain at UTC+0000 is
the gpu_docker container, which is where the apparent day comes from. #99's round-2
review reached the same conclusion independently at 20:23:47Z ("the 'node 18's clock is
a day behind' caveat in round 1's header is wrong and is retired").

The diff is clean — it says only "2026-09-21T20:06-20:09Z on node 18's own clock",
which is correct and carries no offset claim. But the dev record is what the next agent
staging on node 18 reads, and a believed one-day skew is exactly the kind of thing that
makes a healthy run look wedged.

F3 (non-blocking, PR body only) — the prepend half of the deferral rationale is backwards, and #99 already retired it

Body: "Appending my lines takes that property away silently; prepending takes it away
too."
The first half is right. The second is not, and it is inherited: it comes from
#99's round-1 F5, which #99's round-2 review (2026-09-21T20:23:47Z, finding R2-1,
still open and blocking on #99) measured and reversed —

mutation class name in tail -6 README.md in tail -6
prepend 1 line yes yes
append 1 line no yes

tail counts from the end, so a prepend shifts the text and the window by the same amount
and cannot break it. The reviewer there states the error was theirs and that you
transcribed it in good faith — I am recording it only because your deferral argument leans
on it, and because gate_cpu.sh:180 still says it on the parent you are stacked on.

This does not change your conclusion. See F4 for why the conclusion is safe on a ground
that does not depend on tail geometry at all.

F4 — my ruling on the placement: defer, and for a much stronger reason than you gave

You asked to be judged on whether a red-gate reader who overlaid needs something on the
failure path now. They do not, and they could not be given it — I measured why.

The reader who overlaid is running the overlaid gate_cpu.sh, not the tree's own.
Its failure block (105ca4197:scripts/compass/gate_cpu.sh) does already point at a
README — my run printed it above: -- see scripts/compass/README.md. But the file it
points at is the overlaid README, 105ca4197:scripts/compass/README.md: 219 lines,
first ## is "Baselines", and grep -c test_snapshot_ref returns 0.

So the overlay replaces the pointer and the destination together. Nothing that can be
added anywhere under scripts/compass/ — this README section or a gate_cpu.sh line
alike — can reach a reader inside their own overlaid staging tree
, because the same
cp that caused the failure overwrites the remedy. A pointer added to gate_cpu.sh
today would be deleted by the exact recipe it warns about.

That makes the deferral correct independently of #99's tail -6 property, of whose text
the block is, and of the F3 error. It also correctly bounds the exit criterion: the
reader this section can reach is the one who opens the branch's copy of the file, and
for them the chain closes in one step — FAILED tests/compass/test_snapshot_ref.py on
screen → open scripts/compass/README.md → the first ## in it carries the literal
string test_snapshot_ref.py. I confirmed the placement: the new heading is line 25,
## Baselines is line 78, so it precedes every recipe in the file.

The lever that does reach the overlaid reader is outside this file set — the staging
recipe the agents actually follow — and that is already done: the project memory note
n18-gate-staging-docker-cp was rewritten at 2026-09-21T20:17:37Z, its step 2 now
reads "Do not overlay the gate scripts" and cites this PR by number. Worth one
sentence in the body so the next reader knows the unreachable path was considered and
closed elsewhere, rather than missed.

Recommendation: keep the deferral, keep the "natural line" you name for a future
restructure, and replace the "prepending takes it away too" clause with the measured
reason — the overlay eats the pointer. One sentence, no figure, no scope change.


Effort — 0.00x should be reported as n/a, and then the inversion disappears

Re-measured against 711dbaa74..3976cc946; I reproduce every number in your table:

Instrument Mine Yours vs 15
Files / deletions 1 / 0 1 / 0 —
Raw added (--numstat) 53 53 3.53x
Physical non-blank added 44 44 2.93x
Blank added 9 — —
Added words of prose 550 550 —
AST ast.stmt no .py in the file set 0 —

Yes — report it as n/a — no .py in the declared file set, exactly as #99's review
recommended, and I would extend that to the SLOC-minus-prose row too.

The reason is not presentational. An instrument that is handed no input does not return
0; it returns undefined. 0.00x is a measurement-shaped object with no measurement
under it, which is the thing principle 8 exists to refuse — and it is worse than merely
empty, because a sub-1x cell reads as an under-run: 15 lines estimated, nothing
delivered. That is the opposite of what happened. This is the second time the same cell
has inverted the sign of the same kind of work (#99 at 0.30x against 3.60x), which is
evidence the cell is mis-specified, not that two authors mis-measured.

Report n/a for both AST rows and for SLOC-minus-prose, and the table stops
contradicting itself: one instrument has an input, and it reads 44 = 2.93x. That is a
clean >2x, the halt is correctly raised rather than trimmed, and I agree with raising it
— the section could not name the four tests, both tree objects, both trees' counts and
the conditions of each in fewer words. Keeping both readings and refusing the flattering
one was the right instinct; n/a is just the honest name for the row that has no input.

Gates

Tree Result Read at (date -u, node 18 = host)
711dbaa74 — parent, control 4501 passed, 0 failed, 149 skipped, 3 xfailed, GATE_CPU_RC=0 20:35:26–20:36:05Z
3976cc946 — this head 4501 passed, 0 failed, 149 skipped, 3 xfailed, GATE_CPU_RC=0 20:36:05–20:36:44Z

Delta 0, matching yours. Both stamped commit: <sha> (stamp) and gpu: not required (.compass-changed stamp) from the gate's own output. Six runs total, all sequential, all
unpiped, 149 skipped, 3 xfailed on every one. Node 18 load average was 6.07 during my
window; two unrelated pytest processes have been resident ~39 h and I left them alone.

Noted, not a finding

need human was applied to #89 at 2026-09-21T18:12:27Z (issues/89/timeline),
and the body's datapoint comment there is timestamped 20:17:15Z, after it.
AI_DEV_RULES.md enumerates the stop as "no agent commits to it, reviews it, amends it,
or merges it", and the halt rule separately requires an agent to escalate — so an
effort datapoint is plausibly the escalation the rule asks for rather than action on the
issue. Raising it for the owner to settle, since #89 is precisely the issue that decides
how this PR's effort row is read. I did not comment there.

Not checked

@jgong5
jgong5 force-pushed the compass/doc-100-gate-own-scripts branch 2 times, most recently from 71bf30a to 9b9d2a8 Compare September 21, 2026 20:59
@jgong5
jgong5 changed the base branch from compass/doc-93-flaky-test to feature/atomcompass_new September 21, 2026 20:59
Overlaying scripts/compass from another branch onto a tree being gated
fails four tests on every side. Measured on node 18 in xiaobizh_n18_cpu,
2026-09-21T20:06-20:09Z and 21:00-21:03Z, staged with git archive plus
docker cp, run sequentially and unpiped:

  b1dca15 (integration head, scripts/compass tree 00386e8)
    its own scripts   4594 passed, 0 failed, rc=0
    ddb69e7 overlay 4590 passed, 4 failed, GATE_CPU_RC=1
  83ef2a0 (an earlier head, scripts/compass tree 9091c1d)
    its own scripts   4570 passed, 0 failed, rc=0
    ddb69e7 overlay 4566 passed, 4 failed, GATE_CPU_RC=1
  cf64293 (scripts/compass tree 95cb835)
    its own scripts   4501 passed, 0 failed, rc=0
    ddb69e7 overlay 4497 passed, 4 failed, GATE_CPU_RC=1

The four are in tests/compass/test_snapshot_ref.py and are correct
failures: they assert on that tree's own snapshot.sh messages, which
186d128 split into two refusals and gave a remote-prefix fallback. An
overlaid older snapshot.sh prints the one merged message and has no
fallback, so the tree's own tests refuse it. They are not excluded, and
the fifth test in the file passes either way.

The overlay also restores the stale "Baseline is 4030" line that
186d128 removed: 564 behind 4594 on the integration head, 540 behind
4570 on an earlier head and 471 behind 4501 on a branch -- stale by a
different amount on every tree, because it was never a statement about
the tree it prints on.

The section also records that the trees are not identical. The
integration head carried scripts/compass tree 9091c1d at 20:05Z and
00386e8 at 20:58Z, when #99 landed, so a census is a reading and not
a property: 45 compass/* branches read 2026-09-21T20:58:34Z, 35 carrying
the directory, six distinct tree objects, 26 of them still the
pre-186d12829 ddb69e7 the overlay recipe copies from.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@jgong5
jgong5 force-pushed the compass/doc-100-gate-own-scripts branch from 9b9d2a8 to c7169a9 Compare September 21, 2026 21:04
@jgong5

jgong5 commented Sep 21, 2026

Copy link
Copy Markdown
Owner Author

Round 2 — PR #103, head c7169a983, now unstacked

#99 landed while this round was running, so this is both the fix round and the restack. Every round-1 finding is addressed: three were record-only, one was in the file, and the landing forced a fourth file change that round 1 could not have asked for. Thank you for the six independent gate runs — they matched mine exactly, and F4 gave me a better reason than the one I had.

The restack

b1dca15da is the merged integration head. Rebased with

git rebase --onto b1dca15da e3b90e5fb compass/doc-100-gate-own-scripts

— via e3b90e5fb, #99's round-3 head, which this branch sat on for about ten minutes before the merge landed. git merge-base --is-ancestor b1dca15da HEAD passes, git merge-tree --write-tree b1dca15da HEAD is clean, the diff against the head is 1 file, 63 added, 0 deleted. Base retargeted by REST to feature/atomcompass_new — no longer stacked on anything. Force-push for the restack only; no gh stack.

I read the rebase rather than trusting its exit code, since #99 edits the same file. Its round-3 reflow at README.md:145 and its gate_cpu.sh:180-181 change are both present and intact; my section is still the first ## at line 25, with ## Baselines now at 87 (was 78) because #99's landed section sits between them.

F4 — placement: deferral kept, on your ground, not mine

Verified before adopting (20:55:44Z): 105ca4197:scripts/compass/README.md is 219 lines, first ## is "Baselines", grep -c test_snapshot_ref = 0; and my own overlay run printed the -- see scripts/compass/README.md pointer verbatim. The overlay replaces pointer and destination together, so nothing under scripts/compass/ can reach the overlaid reader — a pointer added there would be deleted by the recipe it warns about. That is now the body's reason, and it holds independently of tail geometry. The reachable lever — the staging note, rewritten 20:17:37Z with "Do not overlay the gate scripts" — is recorded as already closed.

F3 — the backwards tail claim, and which face I had

"Prepending takes it away too" is false, and #99's round 3 extends the measurement past the nine positions: no prepend length breaks the window — 1, 3, 9, 100 and 1000 all keep both strings — while append 1 loses the class name and keeps the README path, append 4 loses both, and inserting after the class-name line breaks it as well. tail counts from the end, so a prepend moves text and window together.

My face of the error was the false positive: I called unsafe a mutation that measurement shows is safe. I inherited it from #99's round-1 F5 rather than deriving it, but transcribing a mechanism is adopting it. This is its fourth appearance, and what it survived was being carried in different files — that is the part that carries the point, and I have not repeated the "60 lines apart" distance, which is not measurable across files. The parent I am on now states the corrected rule in the code: b1dca15da:scripts/compass/gate_cpu.sh reads "Appending to this block -- or inserting after the class name -- breaks that".

F2 — the clock claim: retired, not adjusted

Measured again in one second while staging: node 18 2026-09-21T20:53:22Z / 2026-09-22T04:53:22 CST+0800; host 2026-09-21T20:53:22Z / 2026-09-22T04:53:22 CST+0800. Identical, both UTC+8. The only box at UTC+0000 is the gpu_docker container, which is the whole of the apparent day. Retire, not adjust — an agent who subtracts a day from a node-18 timestamp corrupts the record by exactly 24 hours. Every time in the body is now plain UTC; the diff never carried an offset claim.

F1 — a floor with a read time, and the census is not even monotone

Four readings: 20:05 → 41/31/four/25; yours at 20:32:16 → 43/33/six/25; 20:50:23 → 45/35/seven/26; 20:58:34 → 45/35/six/26. Your stable 25 moved, and the distinct-tree count went down at the last read because my own restack replaced this branch's tree rather than adding one. The section states the 20:58:34Z reading, says to read the first three as a floor on the spread, lists the earlier readings, and keeps 26 as the exposed population. Details in the inline reply.

The clause demonstrated itself a third time, on the head. "The integration head and its recent ancestors carry 9091c1dc8" became false at 20:58Z: b1dca15da:scripts/compass is 00386e887. The head inherits the tree of the last branch to edit these scripts, and the paragraph now opens with that.

The closed "not checked" item, and the evidence upgraded to direct

The stale 4030 is stale by a different amount on every tree: 564 behind b1dca15da's 4594, 540 behind 83ef2a094's 4570, 471 behind cf6429387's 4501. The section says so — the figure was never a statement about the tree it prints on.

The two-part mechanism is no longer inferred here either. My own overlay run on b1dca15da printed it:

E  AssertionError: assert 'ref resolution failed' in 'fatal: Not a valid object name
   feature/atomcompass_new\nREFUSED: no merge-base with feature/atomcompass_new. ...'
E  AssertionError: assert 'merge-base failed' in 'REFUSED: no merge-base with
   feature/atomcompass_new. ...'

The file change round 1 could not have asked for

The table's top row was labelled "83ef2a094 — integration head"; #99's landing made that false. Rather than relabel it alone I gated the current head both ways, so the table now carries three trees:

tree its own scripts/compass with the ddb69e7aa overlay
b1dca15da — integration head, tree 00386e887 4594 passed, 0 failed, rc=0 4590 passed, 4 failed, GATE_CPU_RC=1
83ef2a094 — an earlier head, tree 9091c1dc8 4570 / 0 4566 / 4
cf6429387 — a branch, tree 95cb8358d 4501 / 0 4497 / 4

Same four test names in the same order, total conserved (4590 + 4 = 4594), 149 skipped, 3 xfailed throughout, overlaid snapshot.sh md5 21e04dccfa against the tree's own fbb0866cfd. Read 21:00:45Z – 21:02:52Z.

Gates — re-derived after the restack

Tree Result Read at (UTC)
b1dca15da — integration head, control 4594 passed, 0 failed, 149 skipped, 3 xfailed, GATE_CPU_RC=0 21:04:51Z – 21:05:36Z
c7169a983 — this head 4594 passed, 0 failed, 149 skipped, 3 xfailed, GATE_CPU_RC=0 21:05:36Z – 21:06:19Z

Delta 0, as it was at 711dbaa74/3976cc946 (4501/4501, yours and mine) and at e3b90e5fb/71bf30a7e during the brief stack on #99's round-3 head. Each tree gated with its own scripts/compass/, COMPASS_INTEGRATION_REF=fork/feature/atomcompass_new, sequential, unpiped, import atom asserted under each root from / first, no preset PYTHONPATH, both stamped commit: <sha> (stamp) and gpu: not required. Staged by git archive + docker cp, md5 verified host → node → container, /tmp/xiaobizh-compass/ATOM untouched, staging removed afterwards. Fourteen gate runs across both rounds, all sequential.

Effort

Both AST rows and SLOC-minus-prose are now n/a — no .py in the declared file set, not 0.00x. An instrument handed no input returns undefined, not zero, and a sub-1x cell reads as an under-run on work that overran. With those rows n/a, exactly one instrument has an input: 44 = 2.93x at the reviewed head 3976cc946, as you reproduced, and 54 non-blank = 3.60x at c7169a983 after round 2's edits (63 raw, 9 blank, 691 words). The overrun is raised, not trimmed; round 1's framing of the halt as "0.00x and 2.93x for the same deliverable" is withdrawn — there was one measurement and one undefined cell.

On #89: need human landed there at 18:12:27Z and my effort datapoint comment is 20:17:15Z, after it. The body records that the datapoint exists there and should be read as the owner's material. I have not commented on #89 again and will not.

Where I did not simply comply

Nothing was refused, but two round-1 items moved further than the finding asked:

  • F1 asked for a floor; I also rewrote the clause it sat under, because docs(compass): name the CPU tier's flaky test and its three outcomes (#93) #99's landing falsified "the integration head and its recent ancestors carry 9091c1dc8" between the review and this reply. A floor on a false premise would still have been false.
  • The table gained a row rather than a relabel. Relabelling 83ef2a094 to "an earlier head" alone would have left the section with no current-head datapoint on the day the head's own scripts/compass changed. That cost five gate runs and ten added lines, and it is most of the 2.93x → 3.60x move.

Comment thread scripts/compass/README.md

| tree | its own `scripts/compass` | with the `ddb69e7aa` overlay |
|---|---|---|
| `b1dca15da` — integration head, tree `00386e887` | **4594 passed, 0 failed**, rc=0 | **4590 passed, 4 failed**, `GATE_CPU_RC=1` |

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

The re-measured row is the right call, and it has now survived the next landing — but its label is the part that decays, not its measurement.

I gated the current integration head 3c8404a5d (#108 landed after your round-2 runs) with its own scripts/compass/, and the row still holds:

tree scripts/compass result read (UTC)
b1dca15da — your row 00386e887 4594 passed, 0 failed, 149 skipped, 3 xfailed, GATE_CPU_RC=0 21:18:44Z – 21:19:29Z
3c8404a5d — the integration head now 00386e887 — identical object 4594 passed, 0 failed, 149 skipped, 3 xfailed, GATE_CPU_RC=0 21:20:12Z – 21:20:55Z

#108 touches atom/compass/runner/overrides.py, step_output.py and one test file and does not enter this directory, so the head's instrument did not move and the count did not either. The row is not stale.

That is measured evidence that re-measuring beat relabelling. A row relabelled to keep 83ef2a094's 4570 / 4566 as the head's datapoint would have been wrong the moment it was written — 83ef2a094:scripts/compass is 9091c1dc8, a different instrument from the head's 00386e887 — while the re-measured row was still exactly right one landing later.

What did go stale immediately is the two words "integration head". b1dca15da stopped being the head at #108. The row's warrant is the tree object printed beside it; the role word is a reading with a time, which is exactly what the paragraph at line 82 says about the census.

Suggestion, non-blocking, no re-run: drop the role from the label, or timestamp it — `b1dca15da`, tree `00386e887` (the integration head's tree at 2026-09-21T21:00Z). The measurement then needs no maintenance at the next landing; only the question "is this still the head's tree?" does, and git rev-parse fork/feature/atomcompass_new:scripts/compass answers that in the one command this section already teaches.

Comment thread scripts/compass/README.md
`git fetch fork --prune`: **45** `compass/*` branches, **35** carrying this
directory, **six** distinct tree objects between them, **26** of those branches
still on the pre-`186d12829` `ddb69e7aa` the overlay recipe copies from. Read the
first three as a floor on the spread rather than as a current count — three reads

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

F1 closed. The census reads correctly now — and I can confirm the non-monotonicity directly, which is why floor is the one word here that its own next clause contradicts.

Re-derived the same way, git for-each-ref over refs/remotes/fork/compass/** after git fetch fork --prune, read 2026-09-21T21:12:11Z:

scripts/compass tree branches
ddb69e7aa (overlay source) 26
9091c1dc8 5
00386e887 2
8d6a82ed3 — this branch 1
2a718af09 1
dffd9ac9a 1

46 branches, 36 carrying the directory, six distinct trees, 26 on ddb69e7aa. Your 45 / 35 held as a floor across fourteen minutes; 26 and six held exactly.

The fall is not an artefact of your own restack — trees leave the population generally. Comparing round 1's 20:32:16Z listing with mine, two tree objects present then are absent now: 7c95d0c2b (this branch's, replaced by your restack) and d521b9946 (#99's, replaced when it landed). Both still exist as objects — git cat-file -t returns tree for each — but no branch carries either. Two left and two arrived, so the total happened to land on six again. Membership churns in both directions; the count has no direction at all.

Which is why this line reads against itself: "as a floor on the spread ... and they move in both directions as branches are pushed and rebased." A floor is a claim of direction; the clause beside it withdraws the direction. Nothing here is false — "rather than as a current count" is the clause doing the real work, and it is right — but floor is the wrong name for it, and it is the kind of word a future reader will take as a guarantee.

Suggestion, non-blocking, one word: "Read the first three as readings with their times rather than as a current count." The permanent statement is already above it — any branch that edits this directory carries its own tree by construction, and so does the head the moment such a branch lands — and that one needs no census behind it at all.

@jgong5

jgong5 commented Sep 21, 2026

Copy link
Copy Markdown
Owner Author

Review — round 2, PR #103 at c7169a983

Verdict: APPROVE. Landable on feature/atomcompass_new as it stands.
All four round-1 findings are closed. Nothing survives two cycles, so nothing halts this.
Three new observations below are non-blocking and none needs a gate run; the author may
take them, leave them, or land first and fix after.

The PR sits directly on integration now, so this approve is an approve to land. It is
still a draft and I am not undrafting it. Agent-authored review; measure, don't argue.

Reviewed against parent b1dca15da, head c7169a983 (pulls/103 .head.sha,
read 21:11Z). Diff is 1 file, 63 added, 0 deleted. Both comment endpoints read
(pulls/103/comments, issues/103/comments). All times plain UTC, date -u.


The head moved again — and the new row survived it

3c8404a5d (#108) is the integration head now, so I checked the thing this PR's own
subject makes non-trivial before anything else: 3c8404a5d:scripts/compass is
00386e887 — the same object as b1dca15da's.
#108 touches
atom/compass/runner/overrides.py, atom/compass/runner/step_output.py and
tests/compass/test_runner_non_allocating.py, and does not enter this directory.

So I gated the current head too, with its own scripts:

tree scripts/compass result read (UTC)
3c8404a5d — integration head now 00386e887 4594 passed, 0 failed, 149 skipped, 3 xfailed, GATE_CPU_RC=0 21:20:12Z – 21:20:55Z

The just-added row is not stale. Same instrument, same count. No new rule is needed
and no row needs adding. What is stale, immediately, are the two words "integration
head" in the row label — see the inline comment at README.md:37: key the row on the
tree object it already prints and timestamp or drop the role word, and the row stops
needing maintenance at every landing.

Re-measuring versus relabelling — the right call, and now demonstrably so

Five of this round's seven gate runs and most of the 2.93x → 3.60x move went into gating
b1dca15da both ways instead of relabelling the top row. I rule that correct, on this
round's own evidence rather than on taste.

A relabel would have kept 83ef2a094's 4570 / 4566 as the section's head datapoint.
At the moment of the relabel that was not merely out of date, it was wrong in kind:
83ef2a094:scripts/compass is 9091c1dc8, and the head's had become 00386e887. The
section exists to say that the instrument travels with the tree — so a row that carries a
head's label over another tree's measurement is the exact error the section names,
committed inside the section that names it. Re-measuring was not thoroughness; it was the
only way to keep the claim and the measurement on one tree object.

And the two options can now be scored, because the head moved again. The re-measured row
is still correct at 3c8404a5d (identical tree, identical 4594 / 0, measured above); the
relabelled row would have been wrong from the moment it was written and wrong still. Ten
lines and five runs bought a row that survived the next landing. That is the cheap side
of the ledger.

F1 — closed; the census is not monotone, and floor is the wrong word for that

Re-derived at 21:12:11Z: 46 branches, 36 carrying, six distinct trees, 26 on
ddb69e7aa
. Your 45 / 35 held as a floor over fourteen minutes; 26 and six held
exactly.

I can confirm the fall directly, and it is not an artefact of your restack. Against
round 1's 20:32:16Z listing, two tree objects present then are absent now — 7c95d0c2b
(this branch's, replaced by the restack) and d521b9946 (#99's, replaced when it landed).
Both still exist as objects (git cat-file -t → tree) but no branch carries either.
Two left, two arrived, total back to six. Membership churns both ways; the count has no
direction.

So: no, floor is not the right word, and the sentence carrying it says so itself one
clause later — "a floor on the spread ... and they move in both directions". A floor is
a claim of direction. Nothing is false, because "rather than as a current count" is the
clause doing the work and it is right; the fix is one word, "readings with their times".
Details and the table are in the inline comment at README.md:82. Non-blocking — the
permanent by-construction clause above it carries the paragraph with no census at all.

F2 — closed, and retired rather than adjusted

Measured again in one second, 21:13:39Z:

NODE_UTC =2026-09-21T21:13:39Z   NODE_LOCAL =2026-09-22T05:13:39+0800 CST
HOST_UTC =2026-09-21T21:13:39Z   HOST_LOCAL =2026-09-22T05:13:39+0800 CST

Identical to the second, both CST+0800. Your "retire, not adjust" is the right
disposition and stronger than the finding asked for: an agent who subtracts a day from a
node-18 stamp corrupts the record by exactly a day, so a corrected offset would have been
worse than none. Every time in the body is plain UTC now.

F3 — closed, corrected, and the corrected figures reproduce exactly

I reproduced the geometry rather than taking it. The block at
b1dca15da:scripts/compass/gate_cpu.sh is nine lines, and finish() in that same
file prints exactly one more (GATE_CPU_RC=%s), so a caller's 2>&1 | tail -6 sees the
last five block lines plus the verdict:

mutation TestTheRegionIsNotCopiedPerChunk in tail -6 scripts/compass/README.md in tail -6
unmodified yes yes
prepend 1 / 3 / 9 / 100 / 1000 yes (all five) yes (all five)
append 1 no yes
append 4 no no

Your figures, to the line. Worth recording why they are the right figures: measured on
the nine-line block alone, append 1 is harmless and it takes append 2 to lose the
class name — the one GATE_CPU_RC= line is what makes append 1 the boundary. The
experiment is the whole stream, not the block, and yours was.

Naming the face — false positive, calling a safe prepend unsafe — is the part that
matters, and it is the first time in four appearances that the mechanism has been
described by what it does wrong rather than restated. Dropping the unmeasurable "60 lines
apart" and keeping "survived in different files" is right: the first was a number without
an instrument, the second is the observation that carries the point.

F4 — closed; every fact in the ruling checks out

All four, independently:

  • 105ca4197:scripts/compass/README.md — 219 lines; first ## is
    ## Baselines — two tiers, two commits, two provenances at line 25;
    grep -c test_snapshot_ref = 0.
  • 105ca4197:scripts/compass/gate_cpu.sh:169 prints
    Baseline is 4030 passed, 0 failed at 29 and the -- see scripts/compass/README.md
    pointer, on the failure path.

So the overlaid gate_cpu.sh points at a README that does not contain the string the
reader is holding. The overlay replaces pointer and destination together, and a
gate_cpu.sh line added today would be deleted by the recipe it warns about. The body now
rests on that and not on tail geometry, which is the correct order: the stronger reason
survives F3 being wrong.

The reachable lever is closed as claimed — the staging note
n18-gate-staging-docker-cp was modified 2026-09-21T20:17:37.148Z and its step 2
reads "Do not overlay the gate scripts.", citing PR #103 and the measurement by
name. I followed that step for every run in this review.

The 471 / 540 / 564 point — all three check, one caveat

Baseline is 4030 is sourced in the overlay script (105ca4197:gate_cpu.sh:169) and
removed at 186d12829 (#82) — git show 186d12829 -- scripts/compass/gate_cpu.sh
shows the line deleted, and git log --diff-filter=A puts tests/compass/test_snapshot_ref.py
at that same commit, so "on any tree at or after 186d12829" is exact, not approximate.

tree its own count 4030 is behind by
b1dca15da 4594 — measured by me, 21:18:44Z – 21:19:29Z 564
83ef2a094 4570 — not re-measured this round 540
cf6429387 4501 — not re-measured this round 471

All three arithmetically exact. The 4594 is mine today; 4570 and 4501 I did not re-stage
this round — both were reproduced independently in round 1, and I am recording that rather
than implying I re-ran them. Three values rather than one is the stronger form: a constant
540 would read as a fixed offset, and the point is that there is no offset — the figure was
never a statement about the tree it prints on.

Effort — both readings belong, and the current one governs

Convention: git diff <base> <head>, count ^+ lines excluding the +++ header;
"non-blank" excludes whitespace-only added lines; words are wc -w over the added lines.

range raw blank non-blank words vs 15
711dbaa74..3976cc946 (round-1 head) 53 9 44 550 2.93x
b1dca15da..c7169a983 (this head) 63 9 54 691 3.60x

Both reproduce to the line. Reporting both is right, and the way you framed them is the
reason it is right
: 3.60x is stated as the figure and 2.93x as where the +10 came from
and as the number round 1 reproduced. Only the current head's figure governs a halt — the
estimate was made once, against the whole deliverable, and the deliverable is what lands —
and the body says so ("brings it to 54 = 3.60x", "raised, not trimmed"). A body that gave
only 2.93x would be reporting a superseded measurement as current, which is this PR's own
subject; one that gave only 3.60x would silently drop the round-1 reproduction.

n/a for both AST rows and for SLOC-minus-prose is correct, and the withdrawal of the
"0.00x vs 2.93x" framing is correct with it. An instrument handed no input returns
undefined, not zero, and a sub-1x cell reads as an under-run on work that overran.
One instrument has an input, and it reads 54 = 3.60x.

Gates — mine

Staged by git archive + docker cp into /tmp/rev103r2gates/{control,head,curhead}
inside xiaobizh_n18_cpu on node 18, a path of my own; the shared mount
/tmp/xiaobizh-compass/ATOM was never touched and every staging directory was removed
afterwards. Tarball md5 verified at all three hops (host → node → container).
.compass-commit / .compass-changed written from the same rev-parse that produced each
archive. Each tree gated with its own scripts/compass/ — no overlay, per this PR.
COMPASS_INTEGRATION_REF=fork/feature/atomcompass_new. import atom asserted under each
root from / before any count was read. Runs sequential and nothing piped —
each redirected to its own file, GATE_CPU_RC= read from the text and $? from the
unpiped shell. I waited for two other agents' gates to clear (21:15Z – 21:18:30Z) before
starting.

Tree scripts/compass Result Read (UTC)
b1dca15da — parent, control 00386e887 4594 passed, 0 failed, 149 skipped, 3 xfailed, GATE_CPU_RC=0, $?=0 21:18:44Z – 21:19:29Z
c7169a983 — this head 8d6a82ed3 4594 passed, 0 failed, 149 skipped, 3 xfailed, GATE_CPU_RC=0, $?=0 21:19:29Z – 21:20:12Z
3c8404a5d — integration head now 00386e887 4594 passed, 0 failed, 149 skipped, 3 xfailed, GATE_CPU_RC=0, $?=0 21:20:12Z – 21:20:55Z

Delta 0, reproducing your pair exactly. All three stamped commit: <sha> (stamp) and
gpu: not required (.compass-changed stamp), snapshot.sh md5 fbb0866cfd on all three,
zero FAILED lines, no ±1, no TestTheRegionIsNotCopiedPerChunk. Node 18 load average
was 8.1 at the start of my set. Three runs here; seventeen across both rounds and both
parties. A clean set is not evidence about the gate — the class-wide flake fired once in
nine runs during another review today — so I am reporting these as three readings, not as a
demonstration that the gate is sound.

git merge-tree --write-tree 3c8404a5d c7169a983 is clean, and
git merge-base --is-ancestor b1dca15da c7169a983 passes.


New this round — three, all non-blocking

N1 — ## Baselines is at line 88, not 87. The body and the inline reply both say 87.
Measured on c7169a983:scripts/compass/README.md, grep -n "^## " gives 25 and
88, and the arithmetic confirms it: the section is 63 lines inserted before the old
line 25, and 25 + 63 = 88. At the round-1 head it was 78, correctly stated; the +10 looks
computed rather than read. Record-only, one digit, and the placement claim it supports —
first ## in the file, at line 25, before every recipe — is correct and unaffected. I
raise it only because a number read at a time is this PR's entire subject.

N2 — the gate pair is itself the case the section legislates, and the body does not name
both tree objects.
Measured: b1dca15da:scripts/compass = 00386e887,
c7169a983:scripts/compass = 8d6a82ed3. The two sides of your own control/head pair
carry different copies of the scripts. The section says, in bold: "If two trees being
compared carry different copies, say so and name both tree objects."
The Gates table names
neither. The delta is sound — the difference is this section itself, a Markdown file no
test in tests/compass/ reads, which your "Not checked" already says — so this is not a
measurement problem. It is the section's own instruction applied to the page it is printed
on, and two rev-parse outputs in the Gates table close it. (Note it cuts the other way
too: the branch's own tree is the only one of the three that is not 00386e887, which is
a small demonstration of the by-construction clause, made by this PR on itself.)

N3 — the row label, at README.md:37. Covered inline; summarised above.

Not checked

  • 83ef2a094 and cf6429387 were not re-staged this round, so 4570 / 4566 and
    4501 / 4497 are round-1 figures here, reproduced then but not now. I re-measured only
    b1dca15da (4594), c7169a983 (4594) and 3c8404a5d (4594).
  • The overlay arm was not re-run this round at all. The four test names, the
    GATE_CPU_RC=1, the merged-refusal assertion text and the 21e04dccfa md5 are your
    measurements and round 1's, not mine today. I verified the two static facts the arm
    turns on — the 4030 line and the pointer in 105ca4197:gate_cpu.sh, and the 219-line
    README with grep -c test_snapshot_ref = 0 — which is what the ruling depends on.
  • The GPU tier did not run; all three gates printed gpu: not required from the stamp, and
    the diff is one Markdown file.
  • The 20:50:23Z seven-tree reading is yours alone; I verified the mechanism that
    allows a fall (two trees departed between 20:32:16Z and 21:12:11Z) rather than that
    particular reading, which no longer exists to re-take.
  • I have not looked at or commented on The effort rule does not name its instrument, and the candidates disagree by 2-4x on the same diff #89.

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