test(#787): a tripwire under the one-fine-worker premise, with its limits measured - #836
Conversation
… rests on `NavStatus.local_planner_dead` is latched and WORKER-scoped; the agent is told it is SESSION-scoped. Those are the same span only while exactly one fine steering worker is built per client process — a premise that was true, verified twice, and held up by nothing but prose. Four sentences rest on it directly and none of them would have gone red. Adds `exactly_one_production_fine_worker_is_built_in_the_tree_787`: a whole-tree scan asserting exactly one unmarked `Walker::new(` site (in `ActionLoop::new`) and exactly one unmarked `LocalPlanner::spawn(` site (inside `Walker::new`). Its failure message enumerates the four sentences and says the session-scoped name has become wrong. The four sentences now name the guard instead of saying nothing pins them. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HQVEpaaKeXsZcW9VT2roeV
Independent adversarial review — PR #836Reviewed at Verdict: BLOCKING. The code does what the PR says it does, and the PR's disclosure discipline is BLOCKINGB1 — Eight production construction forms are INVISIBLE to the guard. Measured, one green run.
I planted all eight simultaneously and ran Simultaneity is the proof: any one of them becoming visible would have pushed the count to 2 and gone Positive control, same tree, immediately after reverting — a plain unmarked site appended to So the guard is live, its reach does cover repo-root
Three of these deserve naming individually: A1 is a measured survivor against a different pin in this repo already (#828 round 3). The name is A2 is a one-line defect, not a philosophical limit.
The rustdoc says the plain form is "closed" and that only "a rename in an intermediate module that A5 falsifies the specific evasion M7 advertises as closed. A4 shows the marker is an unpinned opt-out. Nothing asserts where markers may appear or how many B2 — The guard's subject is not the premise's subject, and #787's own decay scenario slips through#787 is explicit about the failure it exists to catch: "The day an in-process relogin lands — which An in-process relogin re-enters an existing construction path. It adds zero new textual sites. A8, measured: I moved the production construction into a helper in the same file and called that The premise is "exactly one fine steering worker is constructed per client process" — a runtime The PR body lists under REASONED-not-measured: "That the guard would have caught the historical I accept the PR's case against shape (b) — E1's B3 — Reach control: a 20-file subtree can vanish with all three controls greenThis is the #778 lesson turned back on the guard. I ran it rather than reading it. Mutation: make the walk skip 152 ≥ the 150 floor ( Is the 150 floor doing any work, or is it decorative? It is not decorative, but it is thin. Anchors sit in Suggested fix, cheap and exact: assert B4 — False completeness claims in tracked filesFour of the five prose edits overstate what was built. On a source-scan pin, an unqualified "every" /
The honest form of all five is roughly: "a source scan that catches a plainly-written second B5 —
|
| predicate | count |
|---|---|
^test result: ok\. 0 passed; 0 failed; 0 ignored (anchored) |
14 |
^running 0 tests$ |
14 — identical set by name |
0 passed; 0 failed; 0 ignored (unanchored) |
16 |
[^0-9]0 passed; (left-guarded, any ignored) |
18 |
0 passed (bare) |
20 |
14 is the true figure. The 14 (both predicates, same set):
unittests src/main.rs (eqoxide)
unittests src/bin/render_model.rs
unittests src/bin/crash_probe.rs
unittests src/diagnose_glb.rs (tools)
unittests src/validate_glb.rs (tools)
Doc-tests eqoxide
Doc-tests eqoxide_assets
Doc-tests eqoxide_command
Doc-tests eqoxide_crash
Doc-tests eqoxide_nav
Doc-tests eqoxide_protocol
Doc-tests eqoxide_renderer
Doc-tests eqoxide_telemetry
Doc-tests eqoxide_ui
16 − 14 = the two substring false hits, both of which actually ran tests:
tests/shadow_caster_selection.rs test result: ok. 20 passed; 0 failed; 0 ignored; …
tests/shadow_shader.rs test result: ok. 10 passed; 0 failed; 0 ignored; …
18 − 14 = four genuinely ignored-only targets (0 passed but nonzero ignored), which the
anchored triple correctly excludes:
tests/asset_sync_live.rs 0 passed; 0 failed; 1 ignored
tests/water_capability.rs 0 passed; 0 failed; 5 ignored
Doc-tests eqoxide_http 0 passed; 0 failed; 2 ignored
Doc-tests eqoxide_net 0 passed; 0 failed; 1 ignored
20 = 18 + the 2 substring hits. So the "different trees" hypothesis was correctly refuted, and the
correct replacement is: the number depends entirely on whether the predicate is line-anchored and
whether it guards the digit to the left of 0 passed. Anyone quoting an empty-target count must
quote the predicate with it. Recommend the repo standardise on ^running 0 tests$, which cannot be
fooled by a substring.
Method / hygiene
- Detached worktree at the PR head; the author's branch worktree untouched.
- Every mutation at a call site, never in a callee body; wrap mutations run, not only deletions
(A8 is a wrap; A5/A6 are rewrites; A4 is an annotation). - Universals attacked in both directions: forcing the condition → RED (positive control,
use-rename);
changing what the claim does not constrain → SURVIVING (S3 reproduced). - All five mutated files restored from
cp -pcopies and verified bymd5sum; the review worktree and
the shared checkout both end with an emptygit status --porcelain.
… misses Round-1 review of #836 measured the guard's argument false, not its code. I argued the residual holes push toward a false RED (safe); the review planted eight second-worker constructions at once and the guard reported `ok` — the residual is dominated by misses the scan cannot see. Closes the two cheap holes: * `pub use …::Walker as W;` — the alias check tested `starts_with("use ")` and a re-export can only be spelled `pub use`, so the form that actually matters was green. Visibility is now stripped first (`pub`, `pub(crate)`, `pub(in …)`). * `Walker /* x */ ::new(` — whitespace-only flattening never forms the needle. Every file is now scanned twice, raw and with comments blanked, combined by MAX per line so two constructions on one line still count as two. Fixes the reach control. `files.len() >= 150` was a tolerance band: review measured a 20-file crate (11.6%) vanishing under it with every other control green and a planted production site inside it invisible. The corpus is now `git ls-files` unioned with the walk, and the walk is asserted EQUAL to the index; an empty corpus fails rather than passes. Corrects the four dependent sentences, which is the agent-facing half. They said "pinned", "ever", "the day that stops being true". A source scan counts SITES; the premise is about WORKERS. One site executed twice — the in-process relogin shape #787 is filed about — adds zero text and leaves the guard green. That was measured. The sentences now say tripwire, name the uncaught forms, and tell the reader to read "session-scoped" as accurate today and cheaply checked, not as guaranteed. The rustdoc evasion table is now measured row by row against the shipped code, including the rows that say NOT caught, and including two false-RED directions (needle in a block comment, needle in a string literal). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HQVEpaaKeXsZcW9VT2roeV
… workers The round-2 reach fix made the git index the corpus and hard-failed when `git ls-files` did not run. The remote builder that compiles and runs this workspace receives an rsync'd copy of the worktree with NO `.git`, so the whole suite went red there with a message about corpus enumeration — a missing index dressed up as a finding about fine workers, which is the same class of dishonesty #787 is about. The index is now optional and the guard states which control was in force: * git present (developer/agent worktree) — walk asserted EQUAL to the index, per FILE; * git absent (builder) — every workspace member read from the root `Cargo.toml` must contribute at least one walked file, per MEMBER. The per-member control is weaker and the rustdoc and the failure text both say so ("git index available: false"). It still catches the failure that was actually measured, because that failure was a whole crate directory dropping out of the walk, not a single file. Measured, all on the shipped code: BASE git present, tree intact SURVIVING C2 no git, tree intact (the builder case) SURVIVING C1 no git + walk skips crates/eqoxide-http RED (member control) C3 no git + planted unmarked site RED C4 git present + walk skips a member RED (index equality) C5 git succeeds but lists nothing RED C6 workspace member list unparseable RED Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HQVEpaaKeXsZcW9VT2roeV
…ot drop a zone silently (#835) `open_corpus_zone` becomes the single owner of the corpus prologue: open the zone, load the `.glb`, build collision, load the `.wtr`, and close the zone on every failure path — so a corpus loop can no longer drop a zone without the rollup recording it. Five corpora move onto it (the four `*_blast_radius` loops in `tests/walker_sim.rs` and `water_grid_budget_measurement`). The honesty argument, unchanged from #807: these corpora end by printing a headline figure that is read as being about the zone list the test names. A zone that fell out at a bare `continue` was simply absent from the denominator, so the printed number claimed a coverage it did not have. The prologue now ends with `is_complete()` and an `over N/M zones` breakdown. Closes #807. ## Review Reviewed adversarially across three rounds. Round 1 raised five findings; the orchestrator ruled four MUST and one out of scope (an assert reorder, now tracked). Round 2 was APPROVE with two findings marked non-blocking — and those two were taken anyway, because both were false sentences in the very paragraph this PR exists to make accurate. Round 3 was three exact sentence swaps plus one word, verified at source by the orchestrator rather than by a third reviewer dispatch. What the doc now says, and did not before: * The guarantee is narrowed to what is true: every `Err` return is preceded by a `skip`/`add` that closes the zone. The `Ok` tail is deliberately the caller's obligation, and a named test pins that. An earlier draft claimed no path through the function could leave a zone open — that was false, and it was deleted rather than qualified. * A disclosure bullet states plainly that CI does not exercise this function body at all. Every test that pins the three drop paths injects closures via `open_corpus_zone_with`, so a mutation of the path construction or the `cell` pass-through would survive the whole suite. Closing that needs an asset fixture CI does not have. * The completeness claim about corpora existing "once" is gone; one owner describes five corpora, not six. ## Known remaining, tracked not hidden Ten further zone-drop sites across five loops in `collision.rs` are untouched, four of them silent. They are enumerated per-line in **#839**, and the doc points there rather than restating a tally that would drift. #839's first draft undercounted them as seven — this PR's reviewer caught it, and the issue was corrected in public with the reason: the scan pattern used to answer "which drops are silent" could by construction only match the bare form, and was then reused to answer "how many drop sites are there". Same shape as #778 and #836-B3. The assert-ordering finding (the pre-#807 "set ZONE_DIR" message fires before the accounting assert, giving a misleading diagnosis on the most common failure) is also carried by #839.
|
Round 2 pushed — back to the same reviewer, since the diff grew rather than moved.
The three things worth checking first:
I did not chase A1/A6/A3/A8 with more asserts, per the scope ruling. They are measured survivors in the table and named rows in the guard's rustdoc. |
Independent adversarial review — round 2, head
|
| run | that line | walk | result |
|---|---|---|---|
| M3 | with the marker | intact for this file | test result: ok. 1 passed — SURVIVING |
| M5b | without the marker, byte-identical otherwise | intact | RED, found 3 site(s), naming crates/eqoxide-http/src/observe.rs:670 |
One variable. Two production fine-worker construction sites exist in the tree, in different files,
the original is untouched, and the guard is green. The marker does not merely relocate the production
site within its own file — it hides an additional site, anywhere, with no edit to the original.
The four rows that back the claim (A4c / A4d / A4e / A4b-iso) all put the marker on the existing
production line. The conclusion generalises past every row that supports it. That is the exact shape
of finding B4 from round 1, re-committed in a new sentence.
It is also self-contradicted twice inside this PR:
- row S1 — "planted site that carries the marker | SURVIVING (the documented escape works)"
— is literally this mutation, tabled as a feature two sections above the sentence that says it
cannot happen; - row A3 — "a
macro_rules!body carrying the marker, invoked from production | NOT caught"
— is a marked non-production-line site in a different file, i.e. the same class again; - and
four_sentences()itself already says it correctly: "nothing checks WHERE a marker may appear,
so a marker on a production line disarms this guard for that site silently."
Fix: delete the narrowing sentence from the PR body and from the rustdoc row. Keep the
four_sentences NOTE, which is accurate. The A4c/A4d/A4e rows are fine as measurements; only the
generalisation is wrong.
2. "every workspace member … must contribute at least one walked file" is false — the parse silently drops tools
workspace_members_787 (crates/eqoxide-nav/src/walker.rs:3181) keeps a manifest entry only if
p.contains('/'). The root manifest's list is
members = ["tools", "crates/eqoxide-core", ...]"tools" has no slash, so it is discarded without comment: 12 of the 13 workspace members are
covered, not every member. tools/ is not an anchor either, so nothing checks it at all under the
git-absent path.
Measured. Walk mutated to skip the directory tools, plus a plainly-written unmarked production
construction appended to tools/src/main.rs:
| run | walk | that line | result |
|---|---|---|---|
| M3 | skips tools |
present, unmarked | SURVIVING (green) |
| M5b | intact | same line | RED, tools/src/main.rs:1968 listed among found 3 site(s) |
So an entire workspace member can drop out of the corpus, with a plainly-written second fine worker
inside it, and no reach control fires. PR-body row C1 ("no git + walk skips a member → RED")
holds for 12 members and fails for the 13th.
Secondary, same function: a glob member ("crates/*") would be kept (it contains /) and its
prefix would never match a walked path, so the guard would be permanently red. Not a defect today;
worth one line of comment given the parse is hand-rolled.
Fix: accept manifest entries without a slash (and skip glob entries explicitly), or stop saying
"every workspace member".
3. "so a builder-only run is never mistaken for the stronger check having passed" is false
crates/eqoxide-nav/src/walker.rs, last line of the reach section. The premise is true — the assert
does print git index available: false; I saw it:
#787 guard reach: workspace member `crates/eqoxide-http` contributed ZERO files to the walk —
… git index available: false. Walked 152 file(s).
— but the conclusion does not follow, because that text only exists on the failure path. A
passing run under the degraded control prints nothing whatsoever and is byte-for-byte
indistinguishable from a passing run under index equality (M3: test result: ok. 1 passed; 0 failed,
nothing else). Every green run — which is every run anyone looks at — is exactly the state the
sentence promises cannot arise. This is the #778 property the guard was written to avoid, reproduced
in the guard's own mode reporting.
Fix: drop the sentence, or make the pass path disclose the mode.
4. The degraded control is materially weaker than "it cannot catch one missing file"
Stated twice — rustdoc ("This still catches the failure that was actually measured … it cannot catch
one missing file") and PR body ("It still catches the failure that was actually measured, because
that failure was a whole crate directory dropping out of the walk, not a single file").
What the git-absent path actually permits, with every control green: all but one .rs file per
crates/ member, plus all of tools/ (3 files, per finding 2), all of src/ except src/app.rs
(12 files), and all of tests/ except tests/walker_sim.rs (9 files) — because the root package's
src/ and tests/ are not member entries and are reached only by the two named anchors.
Minimum corpus that satisfies every git-absent control: 12 member representatives + 2 non-member
anchors = 14 of 172 tracked .rs files. Up to 158 files (92%) can be dark. The round-1 defect
this replaced left 20 files / 11.6% dark. So on the path that actually executes here, the reach
control is weaker than the tolerance band it was written to remove — and the rustdoc's Reach paragraph
states the strong version unconditionally ("the filesystem walk is asserted EQUAL to it") before the
qualifier arrives.
Verified mitigation, which the PR should state: .github/workflows/test.yml:26,63 uses
actions/checkout@v4, so .git exists in CI and line 147 (cargo test --workspace --locked) runs
the strong control. The merge gate is fine. What is not fine is that every pre-merge run performed
by whoever is authoring the change takes the weak path (git index available: false, measured on this
head), so the author never sees the strong check and the docs describe the check the author never runs.
Fix: say which control runs where, and correct "cannot catch one missing file" to the actual
bound.
NON-BLOCKING
N5. docs/http-api.md lists "a macro-wrapped site" among the forms not caught. Over-general, and
it disagrees with this PR's own A3 row and the matching rustdoc row, both of which say the macro
evasion requires the marker. An unmarked macro_rules! body containing a plainly-written
Walker::new( is ordinary text and would be counted. Under-claiming the guard is the harmless
direction, but it is still a false sentence in a tracked doc and the two documents disagree.
N6. observe.rs ("scans the tracked tree"), eqoxide-ipc/src/lib.rs ("a whole-tree source
scan") and docs/http-api.md ("a scan of the tracked tree") all describe the strong mode only. True
in effect at this head, but these are the three places an agent reads, and on the builder the tracked
set is never consulted. Fold into finding 4.
N7. The suite figures are published as a three-term sum: 1831 passed + 0 failed + 47 ignored = 1878. The standard is four terms. I measured the fourth on my own round-1 workspace log (same
1831 / 0 / 47): all 55 result lines report 0 filtered out, four-term sum
1831 + 0 + 47 + 0 = 1878 = header sum. So the term is genuinely zero there; I did not re-run the
workspace at 93ff1c2, so for this head it is unverified — publish the four-term identity. Separately:
the round-2 aggregate is identical to my round-1 aggregate across a base move and a 405-line diff.
Plausible (the diff adds no #[test]), but say so.
What I could NOT break
- The A8 retraction is correct. I checked it rather than deferring: the residual really is
dominated by invisible-to-the-scan misses (7 NOT-caught rows) rather than false REDs (1 row), which
matches my round-1 measurement of eight Direction-B evasions green in a single run against two
false-RED directions. The earlier "the holes push into the safe direction" argument was wrong and
the retraction states it plainly. - The two disclosed false REDs (F1 block comment, F2 string literal) are adequately disclosed and
undermine no claimed row. They are consequences of the MAX-per-line combine, they are in both the
rustdoc table and the PR body, and no row claimed as caught depends on the raw pass alone — the
A5a/A5b/A5c rows are all carried by the blanked pass. - The narrowing's true halves. Marker alone on the production line → caught (count falls to 0
againstassert_eq!(found.len(), 1)); marker + unmarked replacement in a different file → caught by
thestarts_with(where_)locality anchor. Both are necessary from the code, not merely measured.
Only the "that is the whole of it" step is wrong. - B3a reproduced exactly, and it now tells you which control fired: walk skips
crates/eqoxide-http, nothing planted → RED,contributed ZERO files … git index available: false. Walked 152 file(s)— the same 152 I measured in round 1. The row's without-git half is confirmed. - The positive control is real.
marked >= 7matches the message, and stripping a marker goes RED
(I did not re-run M9; the count is arithmetic). four_sentencesitem 4's grep-ability claim: verified, exactly one match.
NOT completed
- The with-git half of row C4 (index equality firing on a skipped member). The remote builder has
no.gitby construction — that is the whole reason this mode exists — and I am barred from local
cargo runs, so I could not execute the strong path at all. Reported as not-completed rather than
inferred. Note this cuts both ways: the strong control is the one branch neither of us has executed
in this environment, and CI is where it first runs for real. - I did not re-measure A2a–A2d or A5a–A5c; the round-1 GREENs are closed by code I read, and the
fixer's rows are consistent with it.
Summary. Findings 1 and 2 are the substantive ones: a second production fine worker can be added
today, in a different file, and go unseen — by pasting the marker on it (1), or by living in tools/
if the walk ever narrows (2) — while the PR asserts in three documents that neither is possible.
Findings 3 and 4 are the guard describing a check it does not run where it runs. Fix the four
sentences and the one-character member filter and this is a good tripwire, honestly labelled.
…lose the mode on pass Round-2 review, four must-fix. M1. The marker hole is NOT narrower than round 1 recorded, and my claim that it was is withdrawn. Review refuted it by construction: a MARKED second production construction in a different file, original untouched, leaves the guard green (measured in observe.rs; removing the marker went RED naming the file). Rows S1 and A3 of my own table were already instances of the form the narrowing said could not exist. The rustdoc now carries the round-1 characterisation — a marked line is invisible wherever it is — plus an explicit note that the narrowing was wrong. M2. "every workspace member must contribute at least one walked file" was false. The parser kept entries only where the path contained '/', silently dropping the manifest's first member, `tools`: 12 of 13. The predicate now takes every quoted string between the `members` brackets, with no path-shape filter. Measured both ways: walk skips `tools` -> RED with the fix, SURVIVING with the old predicate. Count is now 13 and the guard prints it. M3. The mode disclosure existed only on the failure path, so a passing degraded run was byte-identical to a passing strong one — #778 reproduced inside this guard's own reporting. It is now printed unconditionally, ahead of every assert, and through the real stderr HANDLE rather than a macro, because libtest captures macro output and shows it only for tests that fail. Verified to appear in a captured, passing run. M4. The degraded control's real weakness is now stated with numbers: 13 member representatives plus 2 non-member anchors = 15 of 172 files, so up to 157 (91%) could be dark with every git-absent control green — worse than the 11.6% band round 1 made me delete. Both halves of the mitigation are stated: the merge gate has a git checkout so nothing reaches main on the weak path, and it is every pre-merge run that takes it. On the suggested walk-only corpus: measured on two trees that have both, `git ls-files '*.rs'` and the walk produce the same 172 files IDENTICAL BY NAME, not merely the same count. So the corpus is already the walk either way and dropping the index would not simplify it — it would delete the one per-FILE reach control the merge gate runs. Kept, and the reasoning is in the rustdoc. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HQVEpaaKeXsZcW9VT2roeV
|
Round 3 pushed as M1 — the narrowing is withdrawn as measured false. I reproduced your construction: a marked second production M2 — fixed the predicate, not the claim. M3 — the fix needed more than moving the call. M4 — both halves are in. 13 member representatives + 2 non-member anchors = 15 of 172; up to 157 (91%) could be dark, worse than the 11.6% band I was made to delete. CI's On the walk-only corpus — measured, and I did not adopt it. By name, not count, on two trees with both: 172 = 172, Non-blocking items are in: the |
Independent adversarial review — round 3, head
|
| run | root Cargo.toml |
result |
|---|---|---|
| 3a | unmodified | RED — workspace member `crates/eqoxide-ui` contributed ZERO files to the walk … Walked 143 file(s). Members checked: 13. |
| 3b | default-members = ["tools"] added above members |
GREEN — test result: ok. 1 passed |
Run 3b's own disclosure line:
#787 guard: reach control = PER WORKSPACE MEMBER only (weaker); walked 143 .rs file(s); git index available = false (0 tracked); workspace members checked = 1
29 .rs files dark, a plainly-written unmarked second fine-worker construction inside them, every
control green. default-members is not an exotic edit — it is what you add to make a bare
cargo build skip tools. Adding it disarms the only reach control the builder ever runs, silently
and permanently, and the guard reports its corpus as covered.
The number is printed (members checked = 1) but nothing asserts it, so this degrades exactly
the way #778 did: the passing output changes by one digit that nobody diffs. Printing is not a control.
Related, same root cause, safe direction — measured. The predicate reads unstripped comment text.
On a completely pristine tree, with the members array reflowed and one comment added:
members = [
"tools",
# historically "crates/eqoxide-legacy" lived here
"crates/eqoxide-core", ...→ RED, Members checked: 14, Walked 172 file(s), accusing the tree of a dark crate that does not
exist. A # comment in the manifest now fails the suite. This is the #837 M3/M5 class — a scanner
reading raw text while its prose describes a property of the effective configuration.
Fix suggestion (cheap and independently grounded). There is already a second, independent
enumeration of the same set: every directory under the root that contains a Cargo.toml. I checked it
on this head and it gives exactly the same 13. Assert the two agree, and the scanner gains the reach
control it currently lacks:
- anchor the key (require it at the start of a line, and/or require the
[workspace]table first) so
default-memberscannot capture it; - strip
#comments to end-of-line while scanning; - assert
membersequals the set of directories containing aCargo.toml(excluding the root), which
fails loudly on both of the above instead of silently shrinking.
2. "Every row below was RUN against the code as shipped, not reasoned about" is false for at least two rows
The rustdoc table's umbrella claim, restated two paragraphs later as "what follows is what was
measured, nothing inferred from it". Two rows have no measured backing anywhere in the PR:
a `Default`/`Clone` impl for `Walker` | NOT caught. `Walker` derives neither today, and the private `planner`/`local_planner` fields keep a bare struct literal inside this crate— the
justification is transparently an argument about the current type, not an observation of the guard.
Establishing "NOT caught" would require writing the impl and a call site. There is no
Default/Clonerow in any of the PR's mutation tables (Reach controls, Positive controls, Not
caught, False REDs, Orthogonality).same, for `LocalPlanner::spawn`(the fn-pointer row's sibling) — row A1 covers
Walker::newonly; there is no measured row for theLocalPlanner::spawnfn-pointer binding.
This is the defect class that has produced a finding in all three rounds on this PR, and it is exactly
the "any every X phrasing on a source-scan pin is a defect on sight" rule. The fix is one of: run the
two mutations, mark the two rows as reasoned, or drop the umbrella and label rows individually.
NON-BLOCKING
N1 — the --nocapture parenthetical is false, in the paragraph M3 fixed.
crates/eqoxide-nav/src/walker.rs:3416 reads "prints its mode and its file count unconditionally,
before any finding (cargo test -- --nocapture)". The flag is not needed and the parenthetical
tells a reader it is. Its own code comment says so — "A direct handle write is not captured, so this
line is in the default suite log of a PASSING run" — and I measured it twice with no --nocapture:
in this PR's CI log (below) and in five builder runs. Drop the parenthetical or make it
cargo test, plain.
N2 — the 15-of-172 floor is 16-of-172; the ceiling is 156 (90.7%), not 157 (91%).
Correctly labelled REASONED-not-measured in the body, so this is arithmetic, not a class violation.
The derivation "13 member representatives + the two anchors outside any member" undercounts, because
crates/eqoxide-nav must contribute two files, not one: walker.rs and planner.rs are both
named anchors, and both are also needed for marked >= 7 (4 fixtures + 3 fixtures). Enumerating
instead of formula-ing: 7 anchors + 9 members that no anchor covers = 16 visible, ≤156 dark.
For the record my round-2 figure (14) was wrong the same way — against the 12-member predicate the
correct floor was 15, not 14. The author's parenthetical crediting me is crediting a wrong number.
N3 — a re-export can only be spelled `pub use` is still there (pub use table row), and the
code directly beneath it strips pub(crate) / pub(super) / pub(in …), with row A2c measuring
pub(crate) use. An "only" that the adjacent code and an adjacent measurement both contradict. I
raised this in round 2; it is small, but it is the same category as finding 2.
N4 — cite the CI measurement rather than reasoning to it. The body lists "CI's
actions/checkout@v4" under MEASURED, but what is measured there is the workflow file; the
load-bearing step — that the merge gate therefore runs index equality — was an inference. It is now
measured. See below; put the line in the body.
What I could NOT break
M1 — the replacement text is true, verified by my own construction, not the author's. Marked
second production Walker::new( at crates/eqoxide-http/src/observe.rs:670, the real site at
action_loop.rs:626 untouched:
| run | that line | result |
|---|---|---|
| 1 | with // #787-NOT-PRODUCTION |
GREEN, test result: ok. 1 passed |
| 2 | marker removed, byte-identical otherwise | RED, left: 2 / right: 1 |
The row's wording ("a marked line is invisible wherever it is") is the correct characterisation and I
could not find a case it overstates or understates. I read the whole surrounding paragraph, not the
hunk: the withdrawal, the "two rows in this very table" sentence, and the note about generalising from
A4c/A4e are all accurate. The one problem in that region is the umbrella claim, filed as must-fix 2.
M3 — fixed, and I verified it on the pass path in the log CI actually keeps. libtest's capture
applies to the print macros, not to a direct std::io::stderr() handle, so no flag is required. From
this PR's own CI run on ace1f6f (run 30701244278, workflow step cargo test --workspace --locked,
passing, no --nocapture):
#787 guard: reach control = INDEX EQUALITY, per FILE; walked 172 .rs file(s); git index available = true (172 tracked); workspace members checked = 13
and from my own passing builder run on the same head:
#787 guard: reach control = PER WORKSPACE MEMBER only (weaker); walked 172 .rs file(s); git index available = false (0 tracked); workspace members checked = 13
It also survives a failing run — it was present in every RED above, printed ahead of the assert.
M4 / F — the CI half is true, and it is now measured rather than reasoned. That same CI line
settles it directly: the merge gate reports INDEX EQUALITY, per FILE and git index available = true (172 tracked). The strong control is not a mode that exists only in the docs — it runs where merges
happen. The degraded path is the builder, exactly as the PR says. This is the answer to "is it
backwards"; it is not.
M2's stated fix works for its stated case. The round-2 defect is gone: the p.contains('/') filter
that silently dropped tools is no longer there, and the printed count of 13 matches an independent
count two ways — 13 quoted entries in the members array, and 13 directories containing a Cargo.toml
under the root. (I measured the per-member assertion firing on crates/eqoxide-ui, not on tools
specifically; that tools is now in the list is read from the count and the code, not from a mutation.)
The defect in finding 1 is a new failure mode of the new predicate, not a persistence of the old one.
The declined walk-only option is correctly declined — verified at source, not from the prose.
crates/eqoxide-nav/src/walker.rs:3507-3510 really does compute the union
(Some(t) => t.union(&walked), None => walked), so the corpus is the walk either way. And the set
equality is real: on this worktree, git ls-files '*.rs' and a walk replicating rs_files_787
(skipping target and dot-directories) both give 172 files, comm empty in both directions
under LC_ALL=C — the earlier sort-order artifact is not present when the locale is pinned. Dropping
the index would delete the per-FILE control the merge gate runs and change nothing about what is
scanned. I originated no preference here and found no reason to favour the option.
docs/http-api.md's round-3 rewrite is accurate. "Every one of those gaps was measured, not
inferred" — I checked all five against the mutation tables (A1, A6, A3, M1a, A8) and all five are
there. The macro claim now matches the A3 row. Unlike the rustdoc table, this list contains no
unmeasured member.
The four-term identity is published and sums (1831 + 0 + 47 + 0 = 1878, matching the header
sum), which closes my round-2 N7, and the compile sentinel is quoted alongside it rather than a
test result line alone.
Not attempted
- I did not re-measure A2a–A2d, A5a–A5c, M6, M9, F1, F2, S1–S3. They are consistent with code I read
and with rounds 1–2. - I did not run the full workspace at this head; the compile is 30-plus minutes under current
contention and the PR's figures are internally consistent, four-term, and match CI's success. - I did not construct the
Default/CloneorLocalPlannerfn-pointer mutations — that is the
author's claim to substantiate, and it is finding 2.
Summary. Fix the members predicate — anchor the key, strip comments, and cross-check the 13
against the directories that contain a Cargo.toml — and delete or substantiate the "every row was
RUN" umbrella. Everything else I attacked held up, including the three things I most expected to
break: the rewritten marker row, the pass-path disclosure, and the CI claim. The disclosure line in
particular is a genuinely good instrument — it is what let me confirm the merge gate's mode from
outside without running CI myself.
…o reasoned rows
Round-3 review broke the per-member reach control from its own input. The
workspace member list was parsed with a suffix match, so `default-members`
armed it and collapsed the list to one member -- 29 .rs files dark with a
planted production construction among them, guard GREEN, printing
`workspace members checked = 1`. In the other direction a `#` comment
containing a quoted string inside the members array was swept in as a
14th member and turned an intact tree RED. The count was printed and never
compared, and a number nothing checks is not a control.
The key is now anchored (a trimmed line must START with `members`), the
manifest is comment-stripped first by a quote-aware stripper that carries
its own reach control probe, and -- the part that actually matters -- the
parsed list is ASSERTED equal to the set of directories that contain a
Cargo.toml. That oracle needs no git and does not depend on the parser
being right: with the anchor deliberately removed the parser still
collapses to {"tools"} and the tree is RED anyway.
Also: the two evasion-table rows review identified as reasoned rather than
run have been run. The LocalPlanner::spawn fn-pointer row survived as
claimed. The Default/Clone row did NOT -- a struct-literal Default impl
goes RED on the spawn needle, because filling `local_planner` at all
spells the second needle -- so that row is rewritten to what the run
showed rather than deleted. The blanket "every row was RUN" sentence is
replaced by per-row provenance.
Fixes three further false statements: the degraded-mode floor is 16 of 172
with <=156 (90.7%) dark, not 15/157/91% (eqoxide-nav carries two anchors);
the mode disclosure needs no --nocapture, because it is written to the real
stderr handle precisely so that it does not; and a re-export is not "only
spellable pub use" -- every visibility form leads one, which is why the
parenthesised forms are stripped.
Addresses #787
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HQVEpaaKeXsZcW9VT2roeV
Addresses #787.
Round 4. Round-3 review returned five must-fix. All five are done. Four of them were false sentences I had written about code that was already right — the same defect class as rounds 1 and 2 — and the fifth was a real hole in the reach control's own input.
The premise, and what actually goes wrong
NavStatus.local_planner_deadis latched for the life of a fine worker. The agent is told it is session-scoped. Those are the same span only because exactly oneLocalPlanneris constructed per client process. That premise is true today. Four tracked sentences rest on it and nothing went red when it stopped being true.crates/eqoxide-ipc/src/lib.rs— theNavStatus::local_planner_deadfield doc, sentence 1crates/eqoxide-ipc/src/lib.rs— the same field doc, sentence 2crates/eqoxide-http/src/observe.rs— thenav_local_planner_deadpublication commentdocs/http-api.md—### nav_local_planner_dead — fine-planner liveness, session-scopedMechanism, and why the others were rejected
Chosen: a source scan over the whole tree —
walker::tests::exactly_one_production_fine_worker_is_built_in_the_tree_787. Exactly one unmarkedWalker::new(site (inActionLoop::new), exactly one unmarkedLocalPlanner::spawn(site (insideWalker::new). Its failure message enumerates all four sentences and says the session-scoped name has become wrong. That message is the deliverable; the scan is the trigger.Rejected: a process-global runtime counter.
cfg(test)is per-compilation: wheneqoxide-navis built as a dependency ofeqoxide-net,cfg(test)is FALSE for it, so a#[cfg(not(test))]trip is live insideeqoxide-net's own suite — which builds twoActionLoops, hence twoWalkers, in one process. Measured: I built the probe and it fired there whileeqoxide-nav's own suite was unaffected.Rejected: a
FineWorkerSlottoken. ChangesWalker::new's signature, forcing an edit to the in-flightaction_loop.rs, and needs apubtest escape hatch that degrades it back to a source convention.Round-4 must-fixes
M1 — the member list was printed and never checked
Review broke the per-member reach control from its own input, in both directions:
workspace_members_787armed onbuf.ends_with("members"), anddefault-membersends withmembers. Addingdefault-members = ["tools"]collapsed the list to one member, took 29.rsfiles dark with a planted production construction among them, and the guard passed while printingworkspace members checked = 1.#comment containing a quoted string inside the members array was swept in as a phantom 14th member and turned a fully intact tree RED.Fixed as recommended, and the third part is the one that matters: anchor the key (a trimmed line must start with
members), strip comments first, and assert the parsed list equal to the set of directories that actually contain aCargo.toml. The manifest lists 13; the filesystem yields the same 13 (toolsplus twelvecrates/*).All rows below were run by me on a copy of this branch with no
.git— the builder shape, where the per-member control is the only reach control in force. VerdictGREEN= guard reportedok.walked 172 … workspace members checked = 13eqoxide-ui, unmarked productionWalker::new(planted inside itworkspace member `crates/eqoxide-ui` contributed ZERO files;Walked 143 file(s). Members checked: 13.default-members = ["tools"]added aftermembersMembers checked: 13default-members = ["tools"]added beforemembersMembers checked: 13membersreflowed multi-line with# the "tools" crate must stay first — see #787inside the arrayworkspace members checked = 13crates/eqoxide-zzz787/Cargo.toml) the manifest does not listParsed 13 …; on disk 14 …"crates/eqoxide-renderer"deleted frommembersParsed 12 …; on disk 13 …walked 172 … members checked = 13M4a/M4b are the positive control the review asked for: the assertion binds in both directions.
The stripper is itself a scanner, so it carries its own reach control — an inline probe over
a = "x # not-a-comment" # yes-a-comment\nb = 'y # also-not', asserting the quoted#survives in both string forms, that the real comment is gone, and that the line structure is unchanged. Both failure directions were mutated:strip_toml_comments_787return text.to_string())line.split('#').next(), quote-unaware)Got: "a = \"x \nb = 'y ""And the strongest row, which is why the assertion and not just the anchor is the fix. With the anchor deliberately removed (
key.trim_end().ends_with("members")— the round-3 behaviour) anddefault-memberspresent and the violation planted:default-members+ planted violationParsed 1 ({"tools"}); on disk 13 (…)The parser still collapses to one member, exactly as review measured — and the tree is red anyway, because the list is now compared to something. That is the difference between a printed number and a control.
M2 — "every row below was RUN" was false; the two rows have now been run
Not scoped, not deleted — run, and one of them turned out to be wrong:
let ctor = LocalPlanner::spawn;thenctor()fn second_fine_worker_787()added towalker.rsDefault/Cloneimpl forWalkerimpl Default for Walkerwhose body is a struct literal fillinglocal_plannerfound 2 site(s). The row's "NOT caught" was wrong. To be a fine worker the literal has to filllocal_planner, and the plain spelling of that isLocalPlanner::spawn(, which is the second needlelet make = LocalPlanner::spawn; … make()Both
Defaultplants were text-level: the guard is a text scan, and a fullWalkerstruct literal does not compile outside its own module. That limitation is stated in the row. The blanket sentence is replaced by per-row provenance, so the claim is checkable one row at a time — which is the form the false one took.M3 — the degraded-mode floor was wrong: 16 of 172, ≤156 dark, 90.7%
eqoxide-navcarries two named anchors (walker.rsandplanner.rs) and one representative cannot be both. So the minimum satisfying corpus is 13 member representatives + 1 (nav's second anchor) + 2 outside any member (src/app.rs,tests/walker_sim.rs) = 16 of 172. Up to 156 — 90.7% — could be dark with every control green. My round-3 figures (15 / 157 / 91%) countedeqoxide-navonce. Corrected in the rustdoc; the figures did not appear indocs/http-api.md.M4 — the
--nocaptureparenthetical contradicted its own codeRemoved. The disclosure is written to the process's real stderr handle precisely so that no flag is needed;
--nocapturewould be required only for theprintln!form, which is the form this deliberately does not use. Confirmed again in this round's builder log of a passing run with no--nocapture:M5 — "a re-export can only be spelled
pub use" was falseIt is contradicted by the code's own
pub(crate)/pub(super)/pub(in path)stripping and by row A2c. The row and the code comment now say: every re-export leads with a visibility,pubis only the shortest of them, which is why the parenthesised forms are stripped rather than assumed away.Standing from earlier rounds
The walk-only corpus was measured and declined; review confirmed the decision.
git ls-files '*.rs'and the filesystem walk produce the same 172 files, identical by name (commempty both directions,LC_ALL=C) on two trees. So the corpus is already the walk —union(index, walk)with equal sets — and dropping the index would delete the one per-FILE reach control the merge gate runs, leaving the 16-of-172 floor in force everywhere instead of only where git is absent. A difference in checking, not in what is scanned.The marker narrowing stays withdrawn. A marked second production construction in any file, original untouched, leaves the guard green; removing the marker goes RED naming the file.
Retraction, standing from round 2. My round-1 body claimed the guard "would have caught the historical in-process-relogin shape #774 hardened against". That is measured and false. It is the one shape the guard structurally cannot see.
The honest name for this instrument: a TRIPWIRE, not a pin
The premise is a RUNTIME count — one worker per process. The guard is a TEXT count — one construction SITE written.
Mutation table (earlier rounds, still standing)
RED= guard failed.SURVIVING/GREEN= guard reportedok.Reach controls (#778: a positive control is not enough)
Walker::new(insrc/app.rs,action_loop.rs,command/nav.rs,tests/walker_sim.rs,http/observe.rscrates/eqoxide-http, nothing plantedtools(the 13th member)contains('/')predicatePositive controls and closed holes
LocalPlanner::spawn()inplanner.rsuse/pub use/pub(crate) use…as X, for both typesNot caught — measured survivors, not assumed
let mk = Walker::new;thenmk(..)— fn-pointer binding<Walker>::new(..)— qualified pathmacro_rules!body carrying the marker, invoked twice unmarkedLocalPlanner::spawnreached through a fn-pointer bindingFalse REDs — the harmless direction, disclosed
/* … */block commentBoth follow from combining the raw and comment-blanked passes by MAX, which is what keeps two constructions on one line counting as two.
Orthogonality — attacked where the claim does not constrain
#787paragraph indocs/http-api.mdreworded to say something falseLocalPlanner::is_dead()forced tofalse— behaviour, no site touchedEvery mutation script asserts
count(old) == 1before writing; three attempts across the rounds asserted out rather than producing a silent false result, and were re-run. Restores arecp -p/rsync+touch, nevergit checkout, and every round-4 run above was preceded by atouchso cargo could not hand back a stale binary.Workspace suite over the final pushed text
cargo test --workspace --locked --no-fail-fast, remote builder, commitdec5b14.Finished `test` profileFinished `test` profile [unoptimized + debuginfo] target(s) in 15m 04s^running [0-9]+ tests?$= 55,^test result:= 55^test result:not matching^test result: (ok|FAILED)\.^running 0 tests$^test result: ok\. 0 passed; 0 failed; 0 ignored= 14)Zero failures;
^error= 0;^warning= 0. 55 targets = 42 unit binaries (Running (unittests|tests)= 42) + 13 doc-test targets (^ Doc-tests= 13).One measured wrinkle worth stating rather than smoothing over: the anchored predicate
^ *Runningreturns 41, not 42, because at one point a cargoRunningline is glued to the tail of a test's output line —test the_extracted_plan_emits_the_pre_741_command_stream ... ok Running tests/zone_pass_routing.rs (…). The log path is branch-unique and was deleted before this run, and stdout and stderr were merged into it, so an interleave is the expected cause — though I did not prove no other writer, so treat the cause as reasoned and the line as measured. It changed no figure above: headers and result lines are both anchored, both count 55, and the header sum equals the four-term total.Completion was required on both signals:
ps -pshowed the process gone AND the log ends with a completetest result:line.Finished `test` profileis the compile sentinel, not run completion. The header regex istests?— singular;running 1 testis singular and a plural-only regex fakes a lost binary. The empty-target predicate is anchored: unanchored,0 passed; 0 failed; 0 ignoredmatches20 passed;and10 passed;as substrings and reports 16.scripts/check-no-local-detail.shandscripts/check-wrapped-literals.pyboth pass; the latter independently reports 172 tracked.rsfiles, the same corpus size the guard prints.NOT verified, and not claimed
MEASURED:
#[cfg(not(test))]probe firing insideeqoxide-net's suite--nocapturerbuild's rsync exclusions, and that none of them holds a tracked.rsactions/checkout@v4Cargo.tomlare the same setREASONED, not measured:
LocalPlanner::spawnother than throughWalker::new. The guard checks text, not reachability.Runningline in the suite log.strip_toml_comments_787is correct for TOML forms its probe does not cover — multi-line basic strings (""") and literal strings (''') in particular. The probe covers single-line"and'only.NOT verified at all:
Known evasions, stated plainly
In the guard's rustdoc as a per-row table marked caught / caught-since-round-N / not-caught, and summarised for agents in
docs/http-api.md: a fn-pointer binding (for either type), an angle-bracket qualified path, a marker-carryingmacro_rules!body, any marked line in any file, and — the one that matters — the same single site executed twice.Addresses #787rather thanCloses: what this delivers is a cheap alarm on the likely edit plus four sentences that no longer overstate themselves. The strongest form of the check is not buildable here, and I would rather leave the issue open with an accurate instrument under it than close it behind a confident label.