Skip to content

fix: deliver the remaining fork delta of the 1112 sync wave - #874

Merged
Blogbotana merged 2 commits into
Apibim-com:masterfrom
axisrow:ao/beamcraft-304/chore/upstream-batch-1112
Nov 12, 2026
Merged

Blogbotana merged 2 commits into
Apibim-com:masterfrom
axisrow:ao/beamcraft-304/chore/upstream-batch-1112

Conversation

@axisrow

@axisrow axisrow commented Nov 12, 2026 •

Copy link
Copy Markdown
Collaborator

What this changes

Delivers the remaining fork delta of the 1112 sync wave on top of master, as two commits byte-faithful to the fork squashes (bare fork issue refs qualified):

The wave-1111 batch was already merged as #869; this PR carries only what the fork gained since (the fork's own sync merge is axisrow/BeamCraft at 510768d2). Excluded per the established strip rules: fork-only CI (ci-platform.yml pin hunk, retired lanes), tools/test-gate local-receipt tweaks, docs/plan, ROADMAP, visual evidence and fork-only workflows.

How you verified it

  • cargo fmt --all -- --check
  • cargo clippy --workspace --all-targets -- -D warnings
  • cargo test --workspace

Run as the recorded local full gate on this exact head: 2858/2858 runnable tests executed plus mandatory doctests, format, clippy and docs with warnings denied (the receipt is published to this PR). Every behaviour above is covered by the tests the commits bring (grid depth, callout stacking, mirror refusal, label stepping, strip layout).

Never-crash

Every model file, IFC/DSTV import and keystroke is untrusted input (AGENTS.md §4).

  • No new unwrap/expect/panic!/todo! outside tests
  • No indexing or slicing with input-derived positions; allocations sized by input are capped
  • No unsafe

Provenance

  • Nothing taken from Tekla Structures or any Trimble product (assets, code, documentation, tables)
  • No GPL/AGPL code copied in
  • Every new asset has an entry in ATTRIBUTION.md

Anything a reviewer should look at first

The commits are verbatim fork squashes, so they land on top of #873's reframed view flow untouched; the picks only re-derived the select_id/select_kind split where #873 added the axis-point reset. The macos-15 pin changes a lane this CI itself runs on, so the platform track exercises it directly.

axisrow and others added 2 commits November 12, 2026 12:09
…584 recheck regressions) (#590)

* fix: keep the status rows apart and let the wheel scroll the snap strip
* chore: pin the CI macOS lane to macos-15
* fix: close the remaining #562 visual-audit defects

The recheck of the #562 fixes on f7a8158 found six items only
partly fixed, two not fixed and one regression. This closes them, except item
12, which the frozen F06/F04 0.1.0 contracts define as discontinuous by design.

Drawings:
- B draws a straight spine with chamfered right bowls, so it no longer reads
  as 8 ("DET B" read "DET 8") (item 26).
- The decimal point is centred between its digits; "3000.000" read
  "3000 .000" (item 27).
- A dimension label steps at most two text heights to clear the body and
  otherwise stays beside its line: the item 27 stepping walked a height
  label inside a 3000 mm beam to the far end, metres from its line.
- A detail's parent-side circle carries the detail's title, and callouts of
  details on one region stack instead of overwriting each other (item 8).

Engine:
- A member mirror completes the roll re-encode with the section's symmetry:
  an equal-leg angle takes a quarter turn and a section symmetric left to
  right a half turn, with the section position rotated back, so both are the
  exact world mirror. An unequal angle, a Z or an asymmetric custom outline
  refuses with UNSUPPORTED_GEOMETRY instead of rendering the true image
  composed with a flip (item 4).

Window:
- A selected bolt group is named in the status line and shown with a neutral
  note instead of a red load failure (item 15).
- The snap strip scrolls in the room the entity strip leaves instead of being
  painted over it at 800 px (item 47).
- The library's selected-model panel measures its details and lets the image
  shrink or go, so State and Open model fit at 1100x680 on both tabs (item 25).
- The mass row shows the engine's kg_display (22.54), as every report does.
- Grid bubbles keep clear of the pane frame stroke (item 38).

Refs #562

Claude-Session: https://claude.ai/code/session_01HF6nmWCNmnwESuVYDnreeF

* fix: address the review of the remaining #562 fixes

Review findings on the previous commit, each checked against the code:

- A mirror of an element that shares an instance definition refuses with
  DEPENDENCY_CONFLICT, as a split does. The update rebuilt the other
  instances' patch without the mirror, so they took the mirrored body under
  their unmirrored authored state; the mirror branch added to shared_with
  could never run and is removed.
- A dimension label blocked on its own side within the step cap tries the
  other side of its line before falling back beside the line, so a deep body
  no longer puts the label back on its strokes.
- Custom outlines compare as cyclic sequences (the image read backwards must
  equal a contour from some start), not as vertex sets, so two polygons on one
  symmetric vertex set are no longer classified as symmetric.
- Detail callouts get twice the names placed plus one tries: one placed name
  can block two consecutive lines.
- The world-mirror test covers every section anchor (Right/Front, Centre/Back)
  for the equal angle and the hat; the CLI test asserts the stored roll and
  the shared-instance refusal.
- The library keys the measured details height on the tab and the model; the
  quantities rows carry their formatter instead of matching the label; the
  bolt-group lookup compares typed ids.

Refs #562

Claude-Session: https://claude.ai/code/session_01HF6nmWCNmnwESuVYDnreeF

* fix: keep the mirror contract of the 1111 review and document the shared-instance refusal

---------

Co-authored-by: Claude <[email protected]>
Co-authored-by: axisrow <[email protected]>
@axisrow
axisrow requested a review from Blogbotana as a code owner November 12, 2026 04:18

@axisrow axisrow left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Review

Approving. Reviewed the full 12-file diff (+834/−90) of the two commits against master.

Verified in detail:

  • Mirror refusal (crates/commands/src/edit.rs): instances.group_size() resolves a plain element to Ok(1) (its own definition), so only genuinely shared groups refuse; the check sits after the element lookup, so a missing element still reports NOT_FOUND, and the P-Degenerate authored-edit path returns earlier, unaffected. A replay can never hit the refusal, because a refused mirror was never accepted. The CLI test drives the refusal end to end.
  • Callout stacking (sheet.rs): the 2n+1 tries bound is sound — each placed name band blocks at most two consecutive candidate lines on the 5 mm pitch, so a free line always exists within the tries.
  • Label stepping and decimal point (svg.rs): own side up to 7 mm, then the mirrored side, then back beside the line; bounded and terminating, with the deep-body fallback documented and pinned by tests. Both dot sites route through the shared decimal_point, centred with equal clearance by construction.
  • Grid depth slab (grid.rs): restricting the slab test to vertical views is geometrically right — a vertical grid plane crosses every plan or inclined slab (their normals are never parallel), while a vertical view plane distance is height-independent, so the two ground endpoints still carry the whole line there. The section-on-2 test pins the kept vertical behavior.
  • Bolt-group selection (app.rs): the failed details load lands the panel in State::Unknown, the neutral note renders before the red banner and skips only details-driven sections that have no data anyway; the snapshot lookup compares typed ids, the name lookup reads the parsed Listing, and an empty name degrades to the unnamed sentence.
  • Mass row: mass_kg already parses kg_display; printing it verbatim removes the double rounding that disagreed with the BOM and the schedule. Volume keeps display_round.
  • Strip slot (workbench.rs) and library preview (start.rs): the measured details height is stable across frames (the rows below do not depend on the image height, so no oscillation), and the three new headless strip tests pin the row layout at four window sizes.
  • CI pin: macos-15 on the build-timings lane matches the known runner-image drift.

Non-blocking remarks (no change requested):

  1. unreadable_kind maps every ElementKind::Connection to "bolt group"; correct while connections are bolt groups only — worth revisiting when a second connection kind appears.
  2. The "bolt group" kind literal lives in both unreadable_kind and unsupported_kind_note; a shared constant would keep the two in step.
  3. When neither side of a dimension line clears the body within LABEL_MAX_STEPS, the label lands back on the body strokes — documented and tested; recorded here as a deliberate trade-off.

Receipt check: head be3d1125 matches the recorded full local gate (2858/2858 plus mandatory doctests, format, clippy and docs green), and the provenance and never-crash checklists are in order.

@Blogbotana
Blogbotana merged commit d7448c1 into Apibim-com:master Nov 12, 2026
27 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants