compass(clock): apply the ponytail-audit of atom/compass/clock/ (#406 phase 2) - #410
Conversation
Remove what the audit of #406 measured as unused or redundant in the clock package and its tests, keeping every retained public answer unchanged. Production: - LookaheadMatrix loses tightest(), serializing(), links() and __len__; no caller in atom/, tests/ or scripts/ besides their own tests. - LookaheadMatrix.inbound finds its missing peers by filtering undeclared() instead of a private second walk of the same pairs. - LinkClass members are their label strings; the unread scale_seconds, label and tuple-valued __init__ are gone, and __str__ returns the value. - LpRegistry.ids() sorts on every call instead of caching; __repr__ is gone. __contains__ stays, so an unhashable operand still raises TypeError. - LpId drops a strip() clause that any(c.isspace()) already implies. Tests: the seven tests that only exercised removed members, restated a literal, or checked the test's own rotation constants are removed, and one comment that named links() now names what still hands out a link. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
| @@ -76,6 +72,3 @@ def __iter__(self): | |||
|
|
|||
| def __len__(self) -> int: | |||
| return len(self._members) | |||
There was a problem hiding this comment.
Non-blocking. The F7b ruling has no test that fires. This is at __contains__, L67 above; the anchor is here because L67 is outside the diff.
Principle 6: "Refuse rather than fall back. A declined answer with a named reason is a result. A guessed one is a defect."
AI_DEV_RULES, gate 4: "A check counts only once someone has seen it fire."
The coordinator skipped F7b so that [] in registry keeps raising TypeError rather than returning a silent False. The head keeps that behaviour: the probe on node 18 at the merged tree d58491587 (its clock files are byte-identical to 5f9ee034e) gives [] in registry → TypeError: unhashable type: 'list'.
No test holds it, though. With mutate.py contains_via_iter, which deletes LpRegistry.__contains__ and changes nothing else, the three clock files give 67 passed, 0 failed (test_clock_lp_identity.py, test_clock_order_across_processes.py, test_backend_kv_geometry.py). test_membership_and_size still passes, because the __iter__ fallback gives the same answer for every LpId.
So the next ponytail pass will measure F7b as free and propose it again. Two lines in test_membership_and_size would pin the ruling:
with pytest.raises(TypeError):
[] in registryThis is not blocking: the PR follows the ruling, and the behaviour is intact at the head.
|
|
||
| def __str__(self) -> str: | ||
| return self.label | ||
| return self.value |
There was a problem hiding this comment.
Non-blocking, and already true at the tip. No test covers LinkClass.__str__, and this PR rewrites its body.
Principle 6: "A declined answer with a named reason is a result."
str(link_class) has one reader: InterLpLink.__repr__. That repr is the named reason in declare's duplicate refusal (... is already declared as InterLpLink(prefill -> decode, prefill_to_decode, floor=0.001s)).
With mutate.py str_is_name, return self.name in place of return self.value:
- at the head, 67 passed and 0 failed;
- at the tip, the same mutant on
return self.labelgives 74 passed and 0 failed.
test_declaring_the_same_link_twice_is_refused matches only "already declared". So the evidence that self.label → self.value is equivalent is the probe, not a test.
My probe on node 18 agrees with the developer's: str(member) and repr(InterLpLink) are byte-identical on both sides for all 3 classes. The change is correct.
Optional one-line pin: add match="already declared as InterLpLink\(prefill -> decode, prefill_to_decode" to that test's pytest.raises.
| print("hash", hash(names[0])) | ||
| print("module", atom.__file__) | ||
| print("arrival", " ".join(arrival)) | ||
| print("registry", " ".join(str(lp_id) for lp_id in registry.ids())) |
There was a problem hiding this comment.
Non-blocking. ponytail-review.
test_clock_order_across_processes.py:L22-24, L63-64, L67, L74-77, L82, L104: delete: the arrival rotation, which no remaining test checks and no mutant needs. The children register namesdirectly, and_child(seed) drops the rotate argument. About −12 lines.
Once T2 removed test_the_children_really_did_register_in_different_orders, nothing reads the rotation. Nothing it does is needed for detection either. Measured on node 18 over the three clock files at the merged tree d58491587 (its clock files are byte-identical to 5f9ee034e):
| Mutant | Failures |
|---|---|
ids_insertion (tuple(self._members)), rotation on |
4 failed |
ids_insertion with the child's rotate = 0 |
the same 4 failed |
ids_hash with rotate = 0 |
the same 4 failed |
The 4 failures are the same tests each time, test_the_total_order_is_the_same_in_every_process among them. NAMES is not sorted, so orders[0] == " ".join(sorted(NAMES)) catches an insertion-order registry without any rotation. In-process, test_the_order_does_not_depend_on_the_order_of_registration catches it too.
Removing the rotation also removes the reason for the docstring's "built from the unrotated list on purpose" clause (L16-18) and for the comment at L74-77.
This is a suggestion, not a condition. The rotation is harmless, and removing it goes beyond the audit's 12 findings.
|
Review cycle 1 of PR #410 (#406 phase 2), at head Verdict: APPROVE at head I read the eight Design principles in There are 3 non-blocking findings, posted inline:
1. Tip and merged tree
2. Callers of removed membersI grepped Names searched: Where I searched:
Hits:
Runtime check: I computed
Textual conflicts, measured against the tip alone and then against the stamp:
This matches the audit's prediction, and the owner ruled to go ahead anyway. 3. Ruling on
|
| tip | head | |
|---|---|---|
.value |
('traffic_to_engine', 0.01), ('prefill_to_decode', 0.001), ('pipeline_stage_to_stage', 1e-06) |
'traffic_to_engine', 'prefill_to_decode', 'pipeline_stage_to_stage' |
LinkClass('<label>') |
ValueError |
the member |
LinkClass((label, scale)) |
the member | ValueError |
LinkClass('bogus') |
ValueError |
ValueError |
str(member), repr(InterLpLink) |
identical | identical |
pickle round-trip is member |
True | True |
member == str(member) |
False | False |
hash(member) == hash(member.name) |
True | True |
json.dumps(member) |
TypeError |
TypeError |
declare(P, D, "prefill_to_decode", …) |
TypeError: link_class must be a LinkClass, got str |
same |
enum repr(member) |
<LinkClass.X: ('x', s)> |
<LinkClass.X: 'x'> |
Why this is not a fallback:
LinkClass('traffic_to_engine')is an exact lookup of the member's own canonical value. Nothing is guessed, and any other string still refuses withValueError.- The refusal that matters to callers is
declare's refusal of astr. It is unchanged and pinned. The mutantdeclare_coerces_strcoerces astrthroughLinkClass(link_class)before the type check. It failstest_a_link_class_is_not_a_stringat the head (1 failed, 66 passed) and at the tip (1 failed, 73 passed).
Why this is harmless:
- Nothing serialises or compares a
LinkClassvalue. At no ref is there aLinkClass(,.valueor!ron a link class. - compass: both clock transports from one implementation (CA-3, #46) #63's transport JSON carries
message.kind.value, not a link class. - compass: what a run of the clock says about itself (CA-7, #50) #67's dump prints
link.sourceandlink.floor_secondsonly. - The enum
reprchanges, but nothing formats it.
4. The 7 removed tests
Mutants were applied by mutate.py, which refuses unless the target text occurs exactly once. They ran over the three clock files on node 18 at the merged tree. Without a mutant, the tip gives 74 passed and the merged tree 67.
| Removed test | What it pinned | Pinned now by | Mutant → result at head |
|---|---|---|---|
test_a_nonzero_floor_is_not_reported_as_serializing |
serializing(), which is removed |
Acceptance of a zero floor, the part that remains: test_a_zero_floor_is_a_declaration_and_not_an_error |
zero_refused (floor < 0.0 → <= 0.0): FAIL test_a_zero_floor… (1 failed, 66 passed) |
test_inbound_links_come_back_in_the_total_order_whatever_order_they_were_declared |
inbound returns the row in total order |
test_inserting_a_participant_moves_nothing_that_was_already_declared (L298) |
inbound_decl: FAIL test_inserting… (1 failed, 66 passed). inbound_rev: FAIL test_inserting… (1 failed, 66 passed) |
test_the_tightest_link_is_the_one_that_bounds_the_run |
tightest(), which is removed |
nothing remains to pin | n/a |
test_links_are_listed_in_a_stable_order |
links() and LookaheadMatrix.__len__, which are removed |
nothing remains. bool(empty matrix) goes False → True, and no truth test exists at any ref |
n/a |
test_the_three_link_classes_carry_the_scales_that_were_modelled |
scale_seconds, which is removed |
nothing remains. The scale prose stays in the member comments | n/a |
test_the_admission_delay_is_kept_per_path |
the literal TRAFFIC_TO_ENGINE_FLOOR_SECONDS |
nothing: now unpinned. Accepted, as the audit reasoned: the constant has no reader at the tip, and the test would equally block a deliberate re-measurement. Its reader arrives with #75 (deployments.py:42) |
serving_floor (9.0e-3 → 8.0e-3): 67 passed at the head. At the tip it fails only the removed test (1 failed, 73 passed) |
test_the_children_really_did_register_in_different_orders |
the test's own rotation (the child's arrival order) | The production property it guarded, a registry that follows arrival order, is pinned by test_the_total_order_is_the_same_in_every_process and, in-process, by test_the_order_does_not_depend_on_the_order_of_registration |
ids_insertion: FAIL, both named (4 failed, 63 passed). ids_insertion + child rotate = 0: the same 4 fail. ids_hash + rotate = 0: the same 4 fail |
Coverage of the refactored production code:
- F5:
inbound_missing_emptyfailstest_a_row_missing_a_peer_is_refused_rather_than_handed_over_short.inbound_missing_outboundfailstest_a_complete_row_has_one_entry_for_every_registered_peerandtest_inserting…. - F6:
ids_insertion, above. - F8:
strip_only, which keeps only the removed clause, failstest_a_name_that_would_not_survive_a_timeline_row_is_refused[pp stage 0]. Separately,strip()-differs andisspace()disagree on 0 of 1,114,112 code points.
Suite delta: --collect-only over the gate's own selection collects 5417 at the tip and 5410 at the merged tree. The node-id diff is exactly the 7 tests above, with nothing added.
5. F7b was skipped
LpRegistry.__contains__is present at the head.[] in registryraisesTypeError: unhashable type: 'list'at the head and at the tip.'decode' in registrygivesFalseon both sides.
A gap in pinning this is non-blocking finding 1: the mutant contains_via_iter gives 67 passed.
6. Comments and docstrings
I read every sentence touched by the diff, and every sentence in the five files that named a removed member.
lookahead.py:- the module docstring no longer names
serializing; - the
LinkClassdocstring and member comments say nothing about attributes that no longer exist; - the
InterLpLinkdocstring's "the accessors below hand the object itself to a caller" is still true:declareandinboundboth do.
- the module docstring no longer names
registry.py: the module docstring's "every ordered answer it gives is sorted at the point of iteration" is now literally true, and theids()docstring dropped "cheapest to call repeatedly", which would now be false.test_clock_lp_identity.py: the comment at L272 now namesinboundanddeclare, which is correct.test_clock_order_across_processes.py: the docstring's L22-24 on rotation is still true of the code. It no longer has a witness, which is what finding 3 is about.- A grep of the five files at the head for design-doc ids, "principle", gate labels, issue numbers, "audit" and "ponytail" finds nothing (AI_DEV_RULES: "No design-doc references in code or runtime output.").
- No design doc names a removed member.
ruff 0.16.7 on the five files: check gives rc 0 on both sides. format --check gives rc 1 on both sides, for the same pre-existing hunk in test_the_total_order_is_the_same_in_every_process, shifted 6 lines. The delta is 0.
7. ponytail-review
I read the raw skills/ponytail-review/SKILL.md (md5 438e2414…).
test_clock_order_across_processes.py:L22-24,L63-64,L67,L74-77,L82,L104: delete: arrival rotation, unread since T2 and not needed by any mutant (ids_insertion/ids_hash caught identically with rotate=0). Register `names` directly; _child(seed).
net: -12 lines possible.
The production diff is lean. StrEnum for LinkClass would save the 2-line __str__, but it would make every member compare equal to its label string. That is a looser equality, not a simplification, so I do not list it.
8. Gate 1
- How it was staged:
git archiveof the tip and of the stamp, with.compass-commitand.compass-changedwritten from the same refs. It was copied intoxiaobizh_n18_cpu:/tmp/pr410r1/{control,merged}/ATOMwithdocker exec -i … tar -x, and the tarball md5eb901f0e…matched on both ends. - How it was run: with each tree's own
scripts/compass/gate_cpu.sh, bounded bytimeout -k 10 3600and not piped.atom.__file__was asserted under each root. No othergate_cpu.shwas running.
| Tree | commit: stamp |
Result | GATE_CPU_RC |
|---|---|---|---|
Merged: 5f9ee034ec6d, tip 60186b80c + head |
1024cf908 |
5273 passed, 155 skipped, 3 xfailed (189 s) | 0 |
Control: tip 4116a63a9 |
4116a63a9 |
5280 passed, 155 skipped, 3 xfailed (183 s) | 0 |
Merged at the earlier tip: d58491587e6c |
dbb5fcc60 |
5273 passed, 155 skipped, 3 xfailed (181 s) | 0 |
- Delta: 5280 → 5273, −7 passed. The skipped and xfailed counts are unchanged.
- Why the
4116a63a9control stands for the new tip:--collect-onlynode ids are identical for the tips4116a63a9and60186b80c(5417), and identical for the two merged trees (5410). Between tip and merged tree, the collect diff is 7 removed and 0 added, and those are the 7 tests in §4. gpu: not requiredon every tree.- No timing flake fired, so nothing was re-run.
Blocking: none.
Non-blocking: the 3 inline findings. None of them needs to be answered before landing.
…k refusal text; drop the arrival rotation (#417) Follow-ups from the review of #410 (the clock ponytail audit). - test_membership_and_size now requires `[] in registry` to raise TypeError. This pins the ruling that kept LpRegistry.__contains__ (principle 6). Before, deleting __contains__ passed all 67 clock tests. - test_declaring_the_same_link_twice_is_refused now matches "already declared as .*prefill_to_decode, floor=0\.001s". The refusal must name the declaration that stands, which exercises LinkClass.__str__ through InterLpLink.__repr__. - The arrival rotation in test_clock_order_across_processes.py is removed. Each child registers NAMES, which is unsorted. That alone lets the cross-process test catch an insertion-order registry; with NAMES sorted, that test passes under the mutant. Mutants that each turn one named test red: - contains_via_iter - contains_isinstance - str_is_name - del_str - repr_drops_class - refusal_names_attempt ids_insertion and ids_hash fail the same tests with and without the rotation. All 67 tests pass under five parent hash seeds. The suite delta is +0; the collect-only diff is empty. Gate (node 18, CPU tier, merged tree on 09891e1): 5275 passed, 155 skipped, 3 xfailed, GATE_CPU_RC=0. Closes #414 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…rule
Base update authorized by the owner on 2026-09-24 ("go ahead and update
the clock chain"). The PR keeps its need human label. This commit only
resolves the merge.
Resolved files:
- atom/compass/clock/identity.py, lookahead.py, registry.py,
tests/compass/test_clock_lp_identity.py,
tests/compass/test_clock_order_across_processes.py: took the
integration side whole. This branch carried each one byte-identical to
the pre-#410 tip (the #52 landing), so every differing line came from
#410 or #417.
- atom/compass/clock/__init__.py: this branch's docstring, imports and
__all__ (ClockAuthority, the state types), plus the paragraph #53 added
on the tip. That paragraph holds for authority.py and state.py: both
import only math, enum and dataclasses, and build no set.
- atom/compass/design/12_open_items.md: kept both sides' rows. The tip
had meanwhile landed P0.6's T83 and T84, so this branch's two rows are
renumbered T89 (no retire call on the protocol) and T90 (grant count
depends on arrival order), and T90's pointer to "T83 above" now reads
T89. The register header now reads 90 rows, T1-T90 with no gaps, 84
open, counted with the header's own grep rule; the allocation sentence
names T88 with #196 and T89-T90 with CA-2.
- atom/compass/design/README.md: the TODO count line reads 90 registered,
T1-T90 with no gaps, 84 open, with the tip's struck list.
No member removed by #410 appears anywhere in the merged tree.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Base update authorized by the owner on 2026-09-24 ("go ahead and update
the clock chain"). This commit only resolves the merge, which brings in
#59's merge of fork/feature/atomcompass_new (3a3267a).
Resolved files:
- atom/compass/design/12_open_items.md: conflicted on the two TODO rows
this branch edits. #59's merge renumbered them T83 -> T89 and T84 -> T90,
because the tip had landed P0.6's T83 and T84. Kept this branch's edited
text of both rows under the new numbers, after the tip's T88. T90's
pointer to "T83 above" now reads T89. This branch's T70 edit merged
cleanly. The register still counts 90 rows, T1-T90, 5 struck.
- atom/compass/design/01_execution_and_time_model.md (merged without a
conflict, edited here so it stays true): this branch's two citations of
those rows now use the new numbers, "(T90 records CA-2's reviewer ...)"
and "T89: a run whose work is finished ...". The other T83/T84 mentions
in the tree are P0.6's and are unchanged.
No member removed by #410 appears anywhere in the merged tree.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…arness
Base update authorized by the owner on 2026-09-24 ("go ahead and update
the clock chain"). This commit only records the merge, which brings in
#59's merge of fork/feature/atomcompass_new (3a3267a).
Resolved files: none. The merge had no conflicts, and no file was edited
beyond what git merged. This branch's own files (tests/compass/clock/)
read TRAFFIC_TO_ENGINE_FLOOR_SECONDS and the LinkClass members, all of
which #410 kept.
No member removed by #410 appears anywhere in the merged tree.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…an PR (#437) The need human label stopped every commit on a held PR, with one exception: gh stack link. So a held branch could not take the base update the branch-update rule calls for, and it drifted further from the tip with every landing. After #410 and #417, the held clock chain conflicted with the tip in 8 files, and the owner had to authorize each update by hand (2026-09-24). This adds a second exception. An agent may merge as the branch-update rule calls for, and nothing else: - For an unlinked child whose parent landed, the agent patches the PR's base via REST just before the push. A refused merge therefore never leaves a patched base. - The merge keeps every change from both sides. Where it cannot, the agent commits nothing and names the conflict hunk in a PR comment. This also rules out -s ours and -X ours. - A PR comment lists each resolved file. - The label allows one delta review of the resolutions. - Only the owner removes the label. The review measured why the patch timing matters on #61. Merging without patching the base shows 122 files. Patching and then refusing the merge shows 7 files / +2208, of which 1457 lines are the landed #60. Merging and patching keeps #61's own 3 files. No test or script reads the file. Gate (node 18, CPU tier, merged tree on 1dc8939): 5280 passed, 155 skipped, 3 xfailed, GATE_CPU_RC=0. Closes #434 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Closes #406
What this does
This is phase 2 of #406. It applies the
ponytail-auditofatom/compass/clock/(the audit is the phase-1 comment), with the coordinator's ruling: 11 of 12 findings are applied. F7b is skipped, soLpRegistry.__contains__stays. Without it,[] in registrywould return a silentFalseinstead of raisingTypeError.compass/issue-406, from tip3eb94cfa7.37fba4df0, so every audit line number still holds.identity.py,lookahead.py,registry.py,test_clock_lp_identity.py,test_clock_order_across_processes.py.clock/__init__.pyand__all__are unchanged.No blocking issues.
Findings applied, each beside its measurement
"Audit" means the measurement in the phase-1 comment. "Here" means a measurement re-run for this PR on node 18 (
xiaobizh_n18_cpu), ongit archivetrees of the tip and of this head.atom.__file__was asserted under each staged root before every run.LookaheadMatrix.tightest()andtest_the_tightest_link_is_the_one_that_bounds_the_rungrep '\.tightest\b'overatom/ tests/ scripts/at3eb94cfa7finds only that test. Audit: no use in any held head (#59 #63 #67 #75 #91 #96 #266).serializing()and the module-docstring sentence that names it;test_a_nonzero_floor_is_not_reported_as_serializing; theserializingassert intest_a_zero_floor_is_a_declaration_and_not_an_error, which still pins that a zero floor is acceptedgrep '\.serializing\b'finds only the docstring and those two tests. Audit: held heads are clean.links(),LookaheadMatrix.__len__,test_links_are_listed_in_a_stable_order. The comment intest_a_declared_floor_cannot_be_rewritten_through_a_handed_out_linkthat namedlinksnow namesinboundanddeclare(a comment only; the AST is identical)grep '\.links\('finds onlyserializing,tightestand that test. Nolen(matrix)or truth test on a matrix anywhere. Probe:bool(empty matrix)goesFalse→True, a pre-tagged line.LinkClassmembers become their label strings.__init__,.labeland.scale_secondsgo, and__str__returnsself.value.test_the_three_link_classes_carry_the_scales_that_were_modelledgoes.scale_secondsis read only by that test..labelis read only by__str__. Nothing readsLinkClass(...)orlink_class.value. Probe:str(member)andrepr(InterLpLink)are byte-identical over 3 classes × 5 floors..valuegoes tuple → str, a pre-tagged line.test_the_admission_delay_is_kept_per_pathand itsTRAFFIC_TO_ENGINE_FLOOR_SECONDSimport. The constant stays, and held #75 reads it.serving_floor(9.0e-3 → 8.0e-3) fails only this test (1 failed, 68 passed).# --- the configured scalessection header, which F4 and T3 leave emptytest_inbound_links_come_back_in_the_total_order_whatever_order_they_were_declaredinbound_declandinbound_revare both still caught bytest_inserting_a_participant_moves_nothing_that_was_already_declared(1 failed, 42 passed each).inboundfiltersundeclared()rather than calling the private_missing_intowalkinbound(t)outcome (value orKeyErrortext) is byte-identical over 600 random registries and partial matrices, including an unregisteredt.LpRegistry.__repr__repr(,str(, or{…registry}of a registry anywhere. Probe: the pre-tagged lineregistry-repr-is-customgoesTrue→False.LpRegistry.__contains__staysunhashable-in-registryline ([] in registry→TypeError) is now identical on both sides. The audit had tagged it to differ.test_the_children_really_did_register_in_different_orders, plus the child'sprint("arrival", …), which then has no reader (the audit's optional −1)child_no_rotatefails only this guard.ids_insertionandids_hash, with or without rotation, are caught bytest_the_total_order_is_the_same_in_every_process. Here: nothing else readsrun["arrival"]._orderedcache:ids()returnstuple(sorted(self._members))ids()andlist(registry)are byte-identical in all 600 cases. Audit: 0.041 µs → 3.73 µs per call at 12 participants, and there is no per-grant caller.LpId.__post_init__:any(c.isspace() …)alone; thestrip()clause is impliedstrip()andisspace()disagree on 0 of 1,114,112 code points.git diff --numstatexactly:identity.py1/1,lookahead.py53/7,registry.py9/2,test_clock_lp_identity.py70/4,test_clock_order_across_processes.py6/0 (removed/added).Differential probe: byte-identical except the pre-tagged lines
The probe is the audit's
probe_equiv.py, unchanged: 39,252 lines covering every retained public answer. It ran at the tip and at this head.sha_kept 7357322c45be4660on both sides. That is the same digest the audit recorded, so every untagged line is byte-identical.diffshows 4 changed lines, all taggedEXPECTED-DIFFin advance:unhashable-in-registry, no longer differs, because F7b is skipped.Two consequences of the tagged
linkclass-valuechange are not a separate probe line:LinkClass("traffic_to_engine")now returns the member where the tip raisedValueError.LinkClass(("traffic_to_engine", 0.01))now raises where the tip returned the member.Nothing in
atom/,tests/orscripts/callsLinkClass(...).Suite delta: exactly the 7 removed tests
pytest --collect-onlyover the gate's own selection (tests/minuscpu_gate_exclude.txtandtests/plugin) collects 5413 at the tip and 5406 at this head. The node-id diff is exactly these 7 removals, with nothing added:tests/compass/test_clock_lp_identity.py::test_a_nonzero_floor_is_not_reported_as_serializingtests/compass/test_clock_lp_identity.py::test_inbound_links_come_back_in_the_total_order_whatever_order_they_were_declaredtests/compass/test_clock_lp_identity.py::test_links_are_listed_in_a_stable_ordertests/compass/test_clock_lp_identity.py::test_the_admission_delay_is_kept_per_pathtests/compass/test_clock_lp_identity.py::test_the_three_link_classes_carry_the_scales_that_were_modelledtests/compass/test_clock_lp_identity.py::test_the_tightest_link_is_the_one_that_bounds_the_runtests/compass/test_clock_order_across_processes.py::test_the_children_really_did_register_in_different_ordersThe clock files (
test_clock_lp_identity.py,test_clock_order_across_processes.py,test_backend_kv_geometry.py) give 74 passed at the tip and 67 passed at this head.Gate 1, run with each tree's own
scripts/compass/gate_cpu.sh, stamps written, one gate at a time:commit:stampGATE_CPU_RC3eb94cfa73eb94cfa7git merge-tree --write-tree 3eb94cfa7 7e22e1576=9b75e93d6, which is this head's tree7e22e1576gpu: not requiredon both trees.AST and line changes, production and tests separately
These counts are per definition (
ast.dumpof each function, class header and module-level statement), comparing the tip against this head.Production (
identity.py,lookahead.py,registry.py): −63 / +10 lines.LookaheadMatrix.tightest,.serializing,.links,.__len__,._missing_into,LinkClass.__init__,LpRegistry.__repr__.LpId.__post_init__;LinkClass: the member values and the class docstring;LinkClass.__str__;LookaheadMatrix.inbound;LpRegistry.__init__,.registerand.ids.lookahead.pymodule docstring.Tests (
test_clock_lp_identity.py,test_clock_order_across_processes.py): −76 / +4 lines.test_a_zero_floor_is_a_declaration_and_not_an_error.from atom.compass.clock import (…)import, which counts as 1 removed and 1 added statement;CHILDsource string, which loses itsprint("arrival", …)line.test_a_declared_floor_cannot_be_rewritten_through_a_handed_out_link, whose change is a comment only.Other checks:
checkpasses on both sides.format --checkflags the same pre-existing hunk intest_clock_order_across_processes.py(test_the_total_order_is_the_same_in_every_process) on both sides, so the delta is 0.Held-PR overlap
Measured with REST
pulls/<n>/filesand withgit merge-tree --write-tree <held head> <this head>, against the same heads the audit used; none has moved since.atom/compass/clock/identity.pyatom/compass/clock/lookahead.pyatom/compass/clock/registry.pytests/compass/test_clock_lp_identity.pytests/compass/test_clock_order_across_processes.pyNew conflicting files after this PR:
clock/__init__.py,design/12_open_items.md,design/README.md). compass: both clock transports from one implementation (CA-3, #46) #63 already conflicted ontest_clock_lp_identity.pyat the tip.tests/compass/test_runner_non_allocating.py, as at the tip.How the conflicts resolve:
from atom.compass.clock import (…)block (test_clock_lp_identity.py:47at the tip). This PR dropsTRAFFIC_TO_ENGINE_FLOOR_SECONDSfrom it, and compass: both clock transports from one implementation (CA-3, #46) #63 rewrites the same block when it moves the package-boundary tests out. The merged import has to take compass: both clock transports from one implementation (CA-3, #46) #63's shape without that name.🤖 Generated with Claude Code