Harden save overwrite handling, make disjoint join intent explicit, improve command reachability and feedback, and add focused driven regressions.
Add the two-and-a-half-minute fast gate plus the expanded audit report and captured evidence.
Agent: Codex
Sixteen findings: where a pick sends you, what the ribbon can show at a given
width, and what the shell says after it acts.
CL-08, the headline: the collapse plan kept an expanded PREFIX of groups, so
one group the row could not afford collapsed every group behind it — at 1280
the Solid tab was seven chevrons with neither sketch nor extrude visible
anywhere. It is now a greedy that skips a group it cannot afford and keeps
spending, priced in pixels per command revealed rather than pixels; that
pricing was measured, because ranking on bare cost hid the Sketch tab's
seventeen constraint tiles to buy one button. Solid's create group declares
sketch and extrude essential and the row paints them ahead of its chevron
wherever it can afford them. At 1600 the tab also paints push/pull, draft,
join, cut and intersect — five buttons the prefix rule had hidden all along.
FC-01, the root of the reported fillet complaint: picking an edge followed
the tab to Solid, which has no fillet or chamfer button on it, so the gesture
a person makes to fillet an edge landed them where they could not. Edge
finishing routes to Modify now.
Also: a pinned tab lets go when the mode changes; a picked face can become
its body; Delete and Backspace reach the delete routes that already existed;
a refusal survives the next click and "geometry has not been rebuilt" goes
when the rebuild arrives instead of standing while the block is rendered,
picked and exported; history refusals stop speaking in internal ids; Fit pick
frames the picked face; a profile keeps its holes, so a washer is one extrude
again; a region pick needs an open sketch; one crossing curve no longer
erases every other region; the pill counts the picked region; a ready ribbon
button carries its own needs sentence; and the status strip leads with a
count and the newest warning rather than the oldest truncated.
Fourteen new gate scripts, each red at aad1d5f with a message naming its
defect. 120 drive scripts, 114 exit 0 — no regressions against the same set.
One batch-2 gate was re-anchored: roomy-status-line-fits used the readout
sentence as its middle column and HV-03 now clears that sentence. It asserts
the readout is empty instead, and was re-checked by mutation to still catch
R2A-04. Three ribbon tests moved from 1200 px to 1040 px because CL-08 paints
sketch on the row at 1200; each asserts its own premise, which is how they
caught it, and each keeps that self-check.
docs/FIXES_2026-09-13_audit-batch-3.md records what was left and why.
Agent: claude-opus-5
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sixteen findings: the whole of batch 2 (the audit's answer to "the UI
sometimes covers itself") and SF-03, which belonged to batch 1 — the audit
lists twelve findings there and f86b74a landed eleven.
SF-03: a plain timeline click now drops a picked body edge or vertex as well
as the face, curve, point and dimension picks. It used to hold two selections
at once — the row lit while the chip read "1 edge" and the ribbon offered
fillet — so the next Enter put a 1 mm fillet on an edge the user believed
they had dropped. It also clears picked_chain, which means nothing without
the edge list and would otherwise make the next single-edge pick read as a
chain.
The card (value_card.rs): its height is bounded, not only its top, and its
body scrolls — a 553 px thin-wall editor climbed 53 px into the ribbon and
covered the status line, the only place a refusal is explained. It is placed
clear of the gizmo handle's reach, so a drag on the handle is no longer taken
by the card. It is withheld while a drawing tool is armed, so draw clicks
reach the sketch, and Cancel keeps it away. A picked body no longer floats a
section card, and the hole card's Enter hint takes its own row rather than
painting over the last chip.
The chrome (mod.rs, view_controls.rs): the View panel's "relocate below the
card" rule had never once run — show() reset the rect the panel reads before
the card, which paints last, could write it; the rect now ages by one frame.
The viewport chip is non-interactable, so it stops eating the Text and Emboss
buttons underneath it. The title bar measures its right-hand group before
laying out the pills, so "sketching · esc leaves" no longer paints under
"settings".
The ribbon (ribbon.rs, sketch_mode.rs, theme.rs): the readout chip is
reserved last and spent first, so it can never be painted over the commands;
the armed sketch tool is a floor rather than a member of the leading prefix,
so it is always visible; the palette dodges the View panel's measured rect;
and the status band's height follows the density, which stops "roomy"
clipping the status line in half.
The windows (six openers) open inside the viewport and stay there, and the
timeline column is one scroll area, so the feature rows always have height.
Two goldens moved and both were read as images before regenerating:
ux-live-line.png in the title bar only (3537 px; viewport, ribbon, tabs,
history and status pixel-identical) and m1-smoke.png in a 242x107 region
where the card moved off the gizmo handle.
Two tests changed because this batch removed their premise, not to make them
pass: the busy-barrier test arms Select (SketchTool::default() is Line, and a
closed profile now withholds its editor while a drawing tool is armed), and
the m5 negative control re-pins its step index 144 -> 148. Twenty-two
committed scripts gained an "arm Select" step for the same reason; nothing
was removed from any of them.
106 drive scripts, 101 exit 0 — the five that do not are the four negative
controls and planar-lettering, the same five as before this batch measured
against the same script set at f86b74a. Every gate was re-verified red with
its own file reverted. docs/FIXES_2026-09-11_audit-batch-2.md has the
measurements, what was left, and the pre-existing failures this does not
take credit for.
Agent: claude-opus-5
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Every expectation the driver has reads the shell's STATE. A covering defect
leaves the state entirely correct and puts the wrong pixels on screen, so
`expect_readout` passes over a sentence painted underneath the value card
and `expect_feature_count` passes over a timeline whose rows have no
height. That is why the 2026-09-10 audit could only reproduce its
covering findings by dumping rects and reading screenshots by eye — there
was nothing to gate them with.
expect_rect asserts the geometry directly: `of` a rect ref, `within`
another, `clear_of` another. The refs are things the harness already
measures for its own reasons — the card's area, the painted galleys, the
ribbon band a `ribbon:` target is looked up in — plus the viewport, which
the shell now publishes beside value_card_rect for the same instrumentation
reason. Touching is not covering: overlap needs half a pixel in both axes,
because galley bounds are inclusive and neighbouring labels abut.
Measured on the unfixed build, the CL-03 case the audit reported by hand:
the value card at [[552 87] - [778.2 640]] overlaps the ribbon band at
[[0 74] - [1000 140]] by 226.2 x 53.0 px
Agent: claude-opus-5
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Eleven findings from docs/GUI_AUDIT_2026-09-10.md, each proved by driving the real
shell rather than by a unit test alone. That distinction is the point: three of these
first landed with passing egui tests and did nothing at all in the app, because the
tests asked a question the shell never asks.
THE VALUE CARD COULD NOT SEE WHO OWNED THE KEYBOARD (HV-01, R2B-01, R2B-05). egui's
single-line TextEdit surrenders focus the instant it reads an Enter, and the card is
painted last so it floats — so the card asked who was focused, was told "nobody", and
committed a keystroke meant for the Variables field, the title-bar path box or the
Items new-folder field. shell::show now records focus once before any widget paints,
and the card takes Enter only when neither that snapshot nor the live answer names an
id the card did not paint itself. It is additionally deaf while the discard prompt
stands.
A TYPED EXPRESSION NEVER CARRIED ITS UNIT INTO THE DOCUMENT (R2A-02). A field whose
text is not a bare number is stored as text and re-evaluated by the server at a bare
scale of 1.0, so in inches the card computed 25.4 mm for "0.5+0.5" and the document
computed 1.0 mm from the same string, for ever. The stored text now says what the
field meant, and the rewrite is verified by evaluation rather than trusted.
OCCT WRITES ONE ASSEMBLY ROW PER EDGE OF THE ASSEMBLY TREE (MB-01). The determinism
guard compared those rows against the body count; the audit proposed the leaf-solid
count; both are wrong, measured. A second defect fired first: the product-name
normaliser accepted one positional level and refused two, which is what a sub-assembly
writes. STEP export of a compound body beside another body works again and is still
byte-identical across two exports.
Also: a delete no longer leaves a stale pending point that kills every later drawing
click (STC-02); a bare second Enter after a dispatch does nothing (PV-07); a typed
value outside a descriptor's range is refused by name instead of silently clamped to
0.001 (SF-07, FC-05, SB-10); a zero-length push/pull is refused at the card instead of
by the kernel (DISC-08); Escape out of a Create session disarms its Cut target (SF-01);
undo during a compile is refused with a readout instead of silently undoing the
operation being built (SF-10); and an export onto any document's storage name is
refused by shape rather than only against the open document (FPR-06).
Five drive scripts are promoted into the gate, each mutation-checked against the
pre-fix binary. What this batch deliberately leaves undone, and three pre-existing
failures it is careful not to claim credit for, are in
docs/FIXES_2026-09-11_audit-batch-1.md.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Nineteen probe cells (thirteen from the coverage matrix, six from a completeness
critic) drove the merged shell headlessly through vernier-drive on RADV, wrote
750 probe scripts, and returned 277 findings. Thirty duplicates were merged and
every remaining finding was handed to an independent verifier that re-examined
the screenshots and dumps, read the cited code, and re-ran the script when the
evidence did not settle the claim: 5 P1, 123 P2 and 87 P3 findings stand, 24
behaviours are recorded as deliberate design that still trips a new user, and
3 reports were rejected as harness artefacts. Every finding's script was also
re-run mechanically and compared with the original report. The probe corpus,
run directories and screenshots stay under target/audit-2026-09-10/claude/.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The merged tree installed as 0.0.2-alpha through scripts/install-local.sh,
with the unmanaged ux-feedback copy that had been sitting under current set
aside and previous kept at 1beb15d.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Merges c0d74cb (the 2026-09-08 audit docs and Codex's UX commit: live sketch
drawing preview, gamma-space UI compositing, HiDPI viewport scale, gizmo axis
latch, tab-pin release) onto the reliability branch's structure, and repairs
what the branch's own drive suite had been silently failing since the
mechanical-modelling batches. docs/MERGE_2026-09-10_main-into-reliability.md
is the full record; the short form:
Ported: DrawingState (serialised across the process codec, snapping with the
click's own camera-derived radius, None under Alt), gamma-space compositing in
the window and the offscreen harness, the HiDPI scale, the axis latch, the tab
pin, distance_mm at 0, main's headless and shell tests.
Dropped: Edit::ReplacePushPull (the branch's acknowledgement barrier already
makes a preview replacement atomic) and the rule hiding the extrude card when
a profile closes (sixty accepted steps type into the branch's editor card,
which sits bottom-right; an open UX question for the audit).
Fixed, each measured through the harness first:
- every value card shares one egui Area id, so a card that changed size was
placed with the previous card's height and jumped 25 px a frame later; a
click aimed from that frame missed the field and the typed number was lost,
and an Enter with no focused field ended the sketch. The card redoes its
frame (quiet frames only) and the driver waits for a stable rect.
- a picked line floated the extrude editor instead of its length card:
extrude is Ready for a line and registered before length. Demoted for
dimension selections only.
- hiding a body, undoing metadata or previewing a boolean sent a support-face
list the face metadata contradicted; the codec abandons the worker on that.
Built from one source and aligned at the reply exit.
- a boss drawn on a face after a cut went into the body: the card's defaults
kept the cut's direction. Defaults keep numbers, not modes.
- the shell-thickness card painted no field: the thin-wall row rule matched
every "thickness" key.
- the derived extrude editor floated for picked sets no profile route accepts
(a construction curve, a degenerate pair); it now floats only for a set the
closed or thin-wall route takes, a ribbon press still aims it.
- thirteen tests the batches had left stale (one-field extrude cards, the
arc's offers, the role count, the clipped-row message, the README's check
count, the hole refusal's layer) repaired to the batches' own behaviour.
- seven scripts asserted document format 35 (the code is at 40), two asserted
a pre-extents extrude payload; all five PNG goldens regenerated on RADV.
Gate: 81 of 86 drive scripts pass on RADV, all 81 deterministic across two
processes; the other five are the four negative controls at their designed
steps and the unfinished planar-lettering (batch 5, still unregistered).
Workspace tests, clippy and fmt green.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Commits the uncommitted batch 5 of the mechanical-modelling programme as it
stood at 2026-09-09 23:16: an Emboss feature over authored sketch text with
height/depth, one target, one Apply/Undo, its document command, compile arm
and shell card, plus the planar-lettering drive script. The batch builds, its
two focused document tests pass, and the drive script is not yet registered
in scripts/check.fish; the merged gate decides whether it is.
Recorded here so the merge of main into this branch starts from a committed
tree rather than a dirty one.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Run native work in a supervised helper with explicit Stop, Restore and Rebuild controls. Preserve acknowledged documents and gesture boundaries across native hangs, and keep staged export cleanup owned by the supervisor.
Validate with 1539 workspace tests, 44 selftests, release GUI recovery tests and 61 driven workflows including two negative controls. Save the handoff and stop after this batch.
Agent: root
Preserve existing exports until complete output is validated and synced. Coordinate with native file operations, refuse ambiguous destinations, and report publication or cleanup uncertainty without replaying writes.
Verify actual palette overwrites, session preservation and bounded child interruption before and after publication. Native worker supervision remains separate work.
Use the approved existing serde workspace dependencies to preserve commands, scene metadata and session checkpoints across a future process boundary. Reject malformed, noncanonical and over-budget messages before publishing either reply or recovery state.
Worker constructors still use the thread implementation; process containment remains separate work.
Validate coherent Headless modifier and focus frames before mutation, retire Runner one-shot modifiers after dispatch, and cover actual palette, timeline and Alt drawing behavior.
Compose drawing geometry and optional inference inside one document command
across all eight drawing sites. Preserve created identities and inference
policy, remove the obsolete command counter, and restore pending drawing
state on refusal without rewinding allocations or changing failed redo.
Add real Slot creation Undo/Redo and three-point Arc solid controls, with
independent review, exact history artifacts and false geometry assertions.
Verify 1467 workspace tests, 25 release Headless tests, 44 selftests,
Clippy, formatting and frozen cross-process regression workflows. Record
the reviewed modifier-harness repair plan for the next isolated lane.
Agent: root
Match complete authored Length, Distance and Angle subjects, seed missing
constraints from current solved geometry, and guard worker mutations with
full expected semantics. Preserve exact existing values, signed angles,
no-op sessions and redo; retain natural card ownership after creation.
Add real natural-dimension and Slot workflows, correct the existing
number-label target, and record Slot Undo and driver modifier follow-ups.
Verify 1462 workspace tests, 25 release Headless tests, 44 selftests,
Clippy, formatting and cross-process controls with intended false oracles.
Agent: root
Recognize explicitly selected closed sketch loops after Undo/Redo and Open using one connected walk shared by readiness and dispatch. Validate current structural references before changing history or drawing state, while leaving solved geometry validation in compilation.
Preserve radius-to-Extrude aiming with action-specific parameter ownership. Add real profile, angle and solved point-measure workflows, retain the broad-gate regression evidence, and record the next natural-dimension repair requirements.
Validation: 1451 workspace tests, 25 release Headless tests, 44 selftests; formatting and workspace Clippy pass. Nine release cross-process workflows pass, including unchanged Cut/Boss and Section goldens on llvmpipe. Five deliberately false assertions fail at their intended steps.
Agent: codex-root
Own card drafts by selected subject, retain exact untouched values and redo, and pair creation defaults with worker acknowledgements. Keep Section local state consistent with the rendered cut plane.
Add actual-control coverage for parameter preservation, circular pattern, mirror, arc, and polygon workflows. Verification: 1435 workspace tests, 25 release Headless tests, 44 selftests, workspace Clippy and formatting; independent review and cross-process geometry/negative controls.
Agent: codex-root
Use camera-scaled Trim capture and a complete shared hover request to keep preview, modifier changes and commits consistent. Suppress popup-covered preview paint in the same frame and preserve foreign point identities.
Correct the Pattern Count card overwriting its own count. Add actual Hole, Push/Pull edit, Pattern Count and small-Trim workflows, with analytic STEP or native-topology checks, history and refusal controls. Record the separately reproduced parameter-card value-loss defect and its next repair requirements.
Validation: 1411 workspace tests, 24 release headless tests, 44 CLI selftests, six deterministic release cross-process workflows, four intended false-oracle failures, workspace Clippy and formatting. llvmpipe functional evidence; no RADV PNG or native hang-containment claim.
Agent: codex-root
Use file-only acknowledgements in both real worker constructors so Save avoids
geometry recomputation and preserves interaction state. Retain current compile
errors while allowing successfully saved broken documents to close. Reject
unallocated face references before command mutation to keep recovery history valid.
Verified: 1403 workspace tests, 23 release Headless tests, 44 CLI selftests,
three release cross-process file workflows, workspace Clippy and formatting.
Independent Save and reference-admission reviews closed.
Agent: codex-root
Wire exact edge and tangent-chain selections into Fillet/Chamfer, refuse impossible IDs before they poison redo, and report Measure/Section failures explicitly. Reuse one section evaluation for its readout and outline.
Add typed full-session server checkpoints and a separate no-compile native Save acknowledgement. These are tested recovery primitives; process transport, GUI recovery and native hang containment remain pending.
Verified: 1,393 workspace tests, 44 selftests, 21 release headless tests, Clippy/formatting, and real-control cross-process geometry checks. Independent reviews closed admission and source-scanner findings.
Agent: codex-root
Add separately versioned document session checkpoints retaining full undo,
redo, allocator and raw rollback state. Reuse native structural validation
and enable lossless float parsing on the existing JSON dependency so
recovery preserves authored dimensions exactly.
Make file-control drives portable across output directories and processes
without bypassing controls. Verify explicit Fresh Open after normal Open
refuses a missing naming store. Add analytic fillet/chamfer creation, size
edit, undo/redo and refusal workflows to the regular regression gates.
Workspace: 1370 passing tests; release headless: 21 passing tests; CLI:
44 selftests. Four affected release workflows pass across processes.
Independent reviews accepted the exact-state and file-control corrections.
Process cancellation, direct-edge operation wiring and remaining capability
coverage are still open.
Agent: codex-root
Wire native file controls with destination protection and crash-recoverable
document/naming transactions. Guard close, document switches, worker failure
and pending operations so stale input cannot edit the wrong state.
Make circle profiles extrudable, scope Cut to one completed extrusion and
derive drawing snap capture from screen scale with Alt override. Expose
Commit/Cancel for fixed-slot builders with shared readiness rules.
Add bounded actual-control regressions, analytic geometry workflows and
independent review records. Workspace: 1355 passing tests; release headless:
20 passing tests; CLI: 44 selftests. Native calls that never return and the
remaining feature/function inventory are explicitly still open.
Agent: codex-root
NOT THIS LANE'S BUG. `SilencedMessenger` arrived with M5 (e575b30,
"deterministic STEP export and opaque STEP import") and is on `main`
unchanged; this lane touches `facade.cpp` only in `shape_edges`,
`shape_vertices` and `tessellate_shape`. It is fixed here because closing
the lane meant running the gate repeatedly, which is what made a rare
failure measurable — see the rates below.
THE DEFECT. The guard saves, clears and restores
`Message::DefaultMessenger()->ChangePrinters()`. That messenger is ONE
object for the whole process and its printer sequence is a refcounted
`NCollection`. `vernier-drive`'s `tests/scripts.rs` runs 40 tests on the
default multi-threaded harness and several of them export STEP, so two
threads sat in the guard at once and mutated the same container. The
shape registry beside it has had `g_registry_mutex` since Phase 1 for
precisely this reason; the messenger had nothing.
TWO FAILURE MODES, BOTH OBSERVED, NEITHER OF WHICH NAMES ITS CAUSE:
malloc(): unaligned tcache chunk detected
... scripts-8110f7a244b7290c (signal: 6, SIGABRT)
and, from the same race losing a printer restore rather than corrupting
the heap, a STEP file that is simply never written:
a_step_volume_may_be_asserted_as_a_delta_from_an_earlier_export
... before.step was not written: No such file or directory (os error 2)
MEASURED, because "flaky" is not a diagnosis:
before `cargo test --workspace` 3 aborts / 6 runs
before `cargo test -p vernier-drive` 1 failure / 6 runs
before `--test scripts` ALONE 0 / 14 runs — it needs the l1 and
l2 binaries ahead of it in the
same invocation to lose the race
after `cargo test -p vernier-drive` 0 / 8 runs
after `cargo test --workspace` 0 / 3 runs
THE FIX is a mutex held for the guard's lifetime, declared as its FIRST
member: members initialize in declaration order and destroy in reverse,
and a destructor body runs before any member is destroyed, so the lock is
held before `saved_` reads the global and still held while the body
restores it. This serializes STEP export against import — the intended
cost, since the messenger they mute is global and two concurrent STEP
calls could not both narrate coherently regardless. Neither call site
nests inside the other, so a plain mutex cannot deadlock.
Nothing about the WRITTEN FILE changes: the timestamp pin, the product
normalization and its count-and-refuse check are untouched, so `m5-step`
asserts the same bytes it did.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Both failures were wrong expectations in the WIP fixture, not defects in
`evaluate_split_faces`. Neither tolerance was widened; both numbers are
what OCCT actually builds, and the reason each moved is recorded at the
assertion.
**The fillet on a split fragment ran the whole edge, not the fragment.**
`BRepFilletAPI_MakeFillet::Add` builds its contour by PROPAGATION along
tangent-continuous edges, and a face split leaves the wall/top edge
collinear across the imprint, so the band is 40 mm and not the fragment's
10 (17965.66370614359, i.e. 18000 − (1 − π/4)·r²·40). Same at the moved
plane, which is why v2's volume is now identical to v1's — the edit is
proved by the fragment's centroid moving 5 → 6, which the test already
asserted, not by a volume.
**The chain cutter's L stopped inside the body.** Measured: a cutter whose
imprint ENDS in the middle of a face leaves a dangling edge on it and
reading the result's faces back out of the façade throws — and this is not
a chain-only limitation, a plane cutter too small to cross does the same.
The fixture's L now leaves through the +X wall (four crossed faces, ten
faces, eight fragments), and the partial imprint is pinned as a refusal
through both cutter kinds instead of being the accident that made the test
red. It fails closed, so the operation ships; giving that refusal a name of
its own is owed work, and the assertion is what will notice when the error
stops being the opaque one.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`evaluate_offset_faces`' doc comment claimed "every face continues,
nothing is minted" and cited a 60-gon prism wall pushed +2 as the one
`Deleted` verdict — a swallowed NEIGHBOUR. Re-measured during the M4-K
closeout, that is not what happens. It is the PUSHED WALL that comes back
`Deleted`; the result is a valid solid of 61 faces; and it is the *same*
solid at 0.5, 1 and 2 mm (23521.063380214622 against the prism's own
23518.904235222028 at every distance). The offset does not happen, the
face's identity is gone with it, and OCCT calls the whole thing a success.
That is invariant #5's wrong-but-plausible body, so the identity claim is
now CHECKED rather than asserted in prose: after `assemble_from_history`,
every requested face must read `Continued(itself)` or the operation fails
with the new `EvaluateError::OffsetFaceLost`. No passing fixture is
affected — box walls, cylinder and cone laterals, a bore, a fillet band
and the 62-face prism's top cap all continue, and the last of those is the
control inside the rewritten test, on the same body that refuses.
`a_swallowed_neighbour_is_deleted_and_every_other_face_continues` asserted
the claim that is false and is replaced by
`a_wall_the_offset_would_lose_is_refused_by_name`, which pins the refusal
at all three distances and that a refused offset mints nothing. Offsetting
a wall of a near-tangent polygon is now recorded as owed work rather than
shipped as a silent no-op.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`0274d00` wrote the fixtures for defeaturing, face splitting and the new
transforms but never committed their golden files, so six of its own tests
failed with "golden ... missing" rather than on anything geometric.
Generated with `VERNIER_UPDATE_GOLDEN=1`, which is only safe because none
of these tests leans on the golden for its claim: every one of them
asserts an analytic volume, a face count and a verdict of its own first
(the boss back to 18000 with the block's six ids, the rotated block's
closed-form centroid, the mid-plane split at 10 faces and one solid). The
golden adds the topology hash and the area on top of that.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
CLOSE-OUT CUT, not a design change. Both of these were added by this lane
for a consumer that lands in lane G, and both are stated as such in their
own doc comments — which is honest, but a field nothing reads and a
constant nothing imports are surfaces a reviewer has to re-derive the
purpose of every time they meet them. Lane G can add each back in the
commit that first reads it, where the reason is visible in the diff.
* `scene::FaceMeta::axis` — populated in `server::compile_scene` from
`FaceRecord::axis` and read by NOTHING in the workspace. Its comment
said "nothing in this lane reads it"; it was for M4-3's radial
push/pull gizmo. `FaceMeta` is re-exported through `headless` and
consumed by `vernier-drive`, so this also narrows a published struct.
The kernel-side `FaceRecord::axis` it copied from is M2-C1's and is
untouched — lane G re-adds one line here, not a survey.
* `render::HALF_WIDTH_PX` — `pub` and re-exported from the crate root
with zero importers. It is interpolated into the ID-pass shader source
ten lines below its declaration and is used nowhere else, so it is now
`pub(crate)`. The constant, its value and its measured-not-guessed
doc comment are unchanged; only the visibility moved.
Nothing else in the lane was cut: `EdgeTarget::Geometric`,
`Selection::{Edges, EdgeChain, Vertices}` and `Edit::TangentChain` all
have either a test, a drive script or both (see the report).
Checks after the cut: fmt, clippy -D warnings.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The lane landed `Boolean`, `SplitBody`, `ImportedBody`, `MoveBody` and the
two `PatternSource::Body` branches with no test that ran any of them: the
kernel ops had golden tests and the doc commands had validation tests, but
nothing compiled a document that reached the arm. An arm no test exercises
is indistinguishable from an arm that does not work, so each of the six now
has one, all analytic:
- boolean: two 10x10x5 blocks overlapping over 5x10x5, cut leaves 250 mm3
and the consumed tool leaves ONE body, with every live face in it.
- split: the same block cut at x = 4 gives 200 + 300 mm3 in two bodies
whose live-face sets are DISJOINT -- the "a face is live in at most one
body" claim `body_of_face` rests on, asserted rather than assumed.
- move: volume unchanged, centroid moved by exactly (8, -5, 5), and the
live id set identical -- the property that lets a reference cross a
motion with no fingerprint tier. The centroid compare is ABSOLUTE, not
`near`: the translated y centroid is exactly 0 and a relative tolerance
admits nothing there.
- import: a real STEP text, written by the kernel from a compiled block
rather than hand-authored, comes back as one 500 mm3 body whose six
faces the store calls opaque -- so no feature may reference one.
- body pattern / body mirror: one NEW body per instance and per source,
each at its analytic centroid, face sets pairwise disjoint.
All six pass as written; nothing was cut back. No production code changed.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>