main is red on 9e5ed895 #276
Labels
No labels
agent
agent:ci
agent:done
agent:failed
agent:needs-input
agent:refined
agent:refining
agent:running
agent:shipped
agent:skip
autonomous
autopilot
driven
local
plan
proposal
qa
qa-gap
research
retro
ship
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
jeroen/cartopolis#276
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
mainat9e5ed895does not compile its test targets. The failing job is run 687, task 1075, job 1285; its log ends🏁 Job failedafter:This is not a runner fault. It is a semantic merge conflict between two crossings branches that both passed on their own and were both cut from the same parent
a76cbbe:0a9836d(#273, "stand every level crossing's boom up") — raises the boom so its bands stack in y fromBOOM_Yupward at a constant x beside the mast (crates/geo/src/crossings.rs:431-453), and adds the two tests atcrossings.rs:752andcrossings.rs:811. Green as a branch head (run 680).b2b9233(#274, "size a level crossing for the road it bars") — splitsCrossingKind::spec()from a 3-tuple into(mast_h, fallback_half)(crossings.rs:220-225) plusboom_span() -> Option<f32>(crossings.rs:237-243), and adds theacross()measurement helper (crossings.rs:500-531) with four tests built on it. Green as a branch head (run 681).git mergejoins them cleanly — they touch different regions of one file — and the result does not type-check.cargo checkwould not have caught it either: perCLAUDE.md, check does not compilecfg(test)code, and both new tests live in#[cfg(test)] mod tests.The two compile errors are not the whole failure. Once they are fixed, four tests will fail at runtime, because
across()was written against the flat boom and now reads a raised one.across()picks the boom tip as the minimum x among vertices with0.5 < y < 1.5(crossings.rs:525-529). With the raised bar, every band sits at a constantboom_x = mx - side * (MAST_HALF_W + BOOM_HALF_FACE)(crossings.rs:442) and the lowest band's bottom face is at exactlyBOOM_Y= 1.05 (crossings.rs:102,crossings.rs:444), which is inside that filter — sotipnow measures a point ~0.24 m inboard of the mast rather than a reach across the road. The four affected assertions:a_wide_road_gets_a_wide_crossingcrossings.rs:909a_narrow_road_gets_a_narrow_crossingcrossings.rs:943a_full_barrier_reaches_the_far_kerbcrossings.rs:957an_unknown_width_falls_back_to_the_old_numberscrossings.rs:979mast_x − reachmast_x − 0.37(Those right-hand numbers are arithmetic off the cited constants, not measurements — the suite run under Verification is what settles them.)
Nothing outside the test module is broken: the only two
CrossingKind::spec()call sites left in the tree are the two failing ones plus the correctcrossings.rs:385, andfurniture.rs:1055'sspec()is a different type's method.Approach
One crate, one file, test module only:
crates/geo/src/crossings.rs— plus one prose line indocs/notes/prorail-level-crossings.md. No production code should change; both landed behaviours are intended and neither is being undone.a_raised_boom_stands_clear_of_the_road(crossings.rs:752-804) — take the two-tuple and get the reach fromboom_span(), the same waypush_crossingdoes atcrossings.rs:394-397:The rest of the test needs no change; it already measures the reach in y (
crossings.rs:779-784). Its two hardcoded0.5s (crossings.rs:789) areVERGE_M(crossings.rs:107) and are worth naming while the lines are being touched.a_lights_crossing_is_two_masts_and_two_lamps(crossings.rs:811-843) — same two-tuple destructure, and move the no-boom claim toCrossingKind::Lights.boom_span().is_none(). Theacross = road_half + 0.5 + 0.30atcrossings.rs:831likewise reads better asVERGE_M.across()(crossings.rs:500-531) — itstipno longer describes anything. The reach is now a bar length, read as the boom bands' maximum y aboveBOOM_Y, which is the idioma_raised_boom_stands_clear_of_the_roadalready uses atcrossings.rs:768-771. Return that instead of a horizontal tip, and rewrite the helper's doc comment (crossings.rs:500-509) to say what it measures now. Keep the mast half of it unchanged — that part still reads correctly.The four tests above — restate each assertion in terms of the bar's length rather than where its tip lands, preserving the numbers #274 pinned: for a form with
boom_span() == son a road of half-widthh, the reach iss * h + VERGE_M. That iscrossings.rs:227-236's own statement, and the fallback table atcrossings.rs:969-975(4.0 / 2.1 / 7.5 / none) carries over unchanged.docs/notes/prorail-level-crossings.md:196-200says a half barrier's boom "reaches backhalf + 0.5so its tip meets the centreline". That is the lowered attitude, and the same file's line 223 says the booms stand raised. Make it a length ("the bar ishalf + 0.5long, so it meets the centreline when lowered") so the two paragraphs stop contradicting each other.Acceptance criteria
cargo test -p cartopolis_geocompiles and passes.cargo test --locked --workspace --exclude cartopolis_androidpasses.CrossingKind::spec()call site destructures three elements:grep -n '\.spec()' crates/geo/src/crossings.rsshows only two-element bindings.push_crossing(crossings.rs:384-455) and everything else outside#[cfg(test)] mod testsis byte-identical to9e5ed895, except for the note edit —git diff main -- crates/geo/src/crossings.rstouches nothing abovecrossings.rs:484.LevelCrossing::road_half.None, matchingcrossings.rs:969-975.docs/notes/prorail-level-crossings.mdno longer describes the boom tip as landing on the centreline or the far kerb in the drawn geometry.cargo fmt -p cartopolis -p cartopolis_geo -p cartopolis_core -p cartopolis_simulator -p cartopolis_android --checkis clean.Verification
No renderer check is needed: nothing this branch changes is drawn. Nothing here requires a workstation.
Watch the merge run, because a second cause of red is sitting behind this one.
f9e457b(run 682, job 1275) failed for something else entirely — the flicker smoke was killed by its 15-minute step timeout (⚙️ [runner]: context deadline exceeded). It had already measuredflicker_px=951against a<=1500gate and written its dump nine seconds earlier; what ran out of time was the shutdown, during which the watchdog loggedMAIN LOOP STALLED — no frame for 2746 ms. The smokes have not run onmainsince, because the compile error ends the job before them. Once this branch merges they will run again and may fail the same way. That is a separate ticket, not this one — but a greentest cartopolison the PR lane does not by itself meanmainwill go green.Out of scope
f9e457bdescribed above. Do not raisetimeout-minutesor loosenflicker_pxon this branch.push_crossing,spec(),boom_span(),place_crossings_againstorWayField.cargo check --all-targets, or a rule that a branch must be rebased before merging. Worth a ticket; it is a workflow change, not this fix.crossings.rs:234-236and the note already accept it.Open questions
None.
Branch:
test/276-crossings-tests-raised-boomOriginal request
The last commit on
mainthat CI ran for is9e5ed895, and it did not pass:test cartopolis— failureNothing can be deployed while this stands —
tools/deploy-maingates on it — so thiscomes before anything on the frontier.
Read the failing job's log, reproduce it locally, and fix the cause. If the failure is
the runner rather than the code (a flake, a cache miss, a missing tool), say so on this
ticket and close it rather than changing code to suit it.
Filed by the autopilot.
🤖 Refined by the viberfox issue agent. Reply with @agent refine and what is wrong to have this rewritten.
🤖 Refining this before anything gets built — reading the code, no branch, no commits. If it turns out I'd have to guess at the requirements I'll stop and ask instead.
🤖 Refined. The description above is now the spec; I'll pick it up for implementation on the next poll.
If the direction is wrong, say so now — @agent refine with a correction rewrites it, and
agent:skipstops me.🤖 viberfox issue agent on the VPS — 39 turns · $3.33 · session
05deabe2-824c-4657-ba60-3713735d9c12. Reply with @agent to continue this session.🤖 Picked this up — working on branch
test/276-crossings-tests-raised-boomin a fresh worktree on the VPS. I'll report back here when I'm done.Label an issue
agent:skipto keep me off it, ordrivento keep it in a session you are driving.mainbuilds and tests again. Here is the report.Fixed the test module in
crates/geo/src/crossings.rs. It was the only thing broken — no production code was changed, and neither of the two behaviours that landed has been undone.What was wrong. Two branches merged cleanly into a tree that does not compile. One raised the level crossing's boom so it stands up beside the mast; the other changed
CrossingKind::spec()to return two numbers instead of three. Two tests still asked for three, which is the compile error CI reported. Behind it, four more tests would have failed at run time: the test helperacross()located the boom by looking for the lowest point across the road between 0.5 m and 1.5 m up, which describes a bar lying flat. With the bar standing up, that filter found a point a few centimetres inboard of the mast instead.What I changed.
spec()and get the boom's reach fromboom_span(), the same way the drawing code does.across()now reports the bar's length — the top of the boom bands above the 1.05 m pivot — instead of where a tip lands. It picks the bands out by the bar's inner face being the most inboard part of an installation: 0.37 m in from the mast centre, against the lamp head's 0.30 m. A form with no boom still answers "none" for free.0.5s with the existingVERGE_Mconstant while those lines were open.docs/notes/prorail-level-crossings.mdsaid a half barrier's boom "reaches back so its tip meets the centreline" two paragraphs before saying the booms stand raised. It now states a bar length.How I verified it.
cargo test -p cartopolis_geo crossings— 19 passed.cargo test --locked -j 6 --workspace --exclude cartopolis_android— 1283 passed, 0 failed, exit code 0.cargo fmtover the five owned crates is clean.git diff origin/main -- crates/geo/src/crossings.rstouches nothing above line 497, so everything outside#[cfg(test)] mod testsis byte-identical to9e5ed895.Nothing here is drawn, so no visual check is needed anywhere.
Two things for you.
.claude/worktrees/test__276-crossings-tests-raised-boom) disappeared partway through the session — everygitcommand from inside it started answeringnot a git repository: (null). I committed and pushed from a second worktree at.claude/worktrees/276-repairinstead. The branch is pushed and correct; the two worktree directories are just clutter to remove when convenient.main. The picture-comparison smoke test last failed onf9e457bby running out of time during shutdown, and it has not run since because the compile error ended the job before it. Once this merges it will run again and may fail that way. That is a separate ticket.No commits were made.
🤖 viberfox issue agent on the VPS — 53 turns · $4.61 · session
b3eb6026-a907-4353-8776-559380c4f118. Reply with @agent to continue this session.🤖 Merged into
mainas pull request #277 (a1d489de).🤖 Deployed to the public services.
mainwas already red, and every merge commit was red #282.git/config.lockwhen two sessions start together, and the ticket is lost (#278) #283alreadyFiledonly ever sees 50 issues, so every autopilot dedupe key silently expires — #206 was QA'd twice #281