Skip to content

chore: deliver the fork delta since the 1105 sync wave - #833

Merged
Blogbotana merged 1 commit into
Apibim-com:masterfrom
axisrow:chore/upstream-delta-1105-2
Nov 5, 2026
Merged

Blogbotana merged 1 commit into
Apibim-com:masterfrom
axisrow:chore/upstream-delta-1105-2

Conversation

@axisrow

@axisrow axisrow commented Nov 5, 2026

Copy link
Copy Markdown
Collaborator

What this changes

Delivers the fork delta accumulated since the 1104/1105 sync waves as one batch commit on top
of master (the single-batch delivery the fork sync policy prescribes). Nothing here changes
the recorded contracts; it is feature, fix, test and harness work that master predates.

  • Drawing and report fixes: dimension labels clear their lines in every direction, view titles
    clear the geometry they annotate, the title block closes its box and keeps long values off
    their labels, the letters B, S and O draw distinguishable shapes, the colon draws two dots,
    dash patterns follow tessellated circles and arcs in SVG and PDF, and mass prints at one
    precision everywhere.
  • V18 contour plate grips: the selected plate's contour gets draggable vertex and edge grips
    with a corner editor; a holding grip takes the primary drag from the camera.
  • V19 slice 1 and V10: the ribbon Weld and bolt-group tools place a weld and a bolt group
    through their existing commands.
  • Q01 stories: the curved/poly member, bent/lofted plate, transform, bolt-group, model-data
    tool, contour plate, part class, cut lifecycle, fits-and-combine, hole record and storey
    assignment stories run in their own published stores so the numbered frame keeps its counts;
    the alpha matrix and scenario documents describe the split.
  • The E04 IFC input study: ifc-inspect reads a received IFC file behind the minimal input
    contract and changes nothing (a study, not the deferred I01–I03 item workflow).
  • The N03 USD SDK differential harness with its fixtures.
  • The recorded gate: a selection without a library target passes the doctest step vacuously,
    with the stage's stderr log retained, and the gate's own tests cover the behaviour.

The fork-only policy (its workflow forms, docs/plan/, visual evidence, fork tooling) is not
part of this delivery; the upstream-owned Python CI tools are untouched.

How you verified it

  • cargo fmt --all -- --check (recorded gate stage, exit 0)
  • cargo clippy --workspace --all-targets -- -D warnings (recorded gate stage, exit 0)
  • cargo test --workspace (recorded gate: 2603/2603 runnable tests executed nextest
    0.9.149 on macOS aarch64, plus mandatory doctests and cargo doc -D warnings, all exit 0;
    the committed tree equals the tested tree, receipt in the runner report)

New behaviour carries tests in the same commit: the grip, weld, bolt-group and story suites
exercise the new paths, and the drawing fixes are pinned by path- and shape-level asserts that
failed before the fixes.

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

Read AGENTS.md §1 and §2 before adding any asset.

  • 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 (the USD SDK differential fixtures are
    contributor-original synthetic files under the existing test-data entry)

Anything a reviewer should look at first

The label-placement change in crates/engine/src/drawing/svg.rs replaces the horizontal
above/below rule with the line-normal rule and moves the call sites; the two finding-4 tests pin
the vertical and the inclined case. The E04 ifc-inspect study is read-only by contract; its
scope is deliberately narrow.

One batch commit of the fork work that the 1104/1105 waves predate:

- Drawing and report fixes: dimension labels clear their lines on every
  direction, view titles clear the geometry they annotate, the title block
  closes its box and keeps long values off their labels, letters B, S and O
  draw shapes of their own, the colon draws two dots, dash patterns follow
  tessellated circles and arcs in SVG and PDF, and mass prints at one
  precision everywhere.
- V18 contour plate grips: the selected plate's contour gets draggable
  vertex and edge grips with a corner editor, and a holding grip takes the
  primary drag from the camera.
- V19 slice 1 and V10: the ribbon Weld and bolt-group tools place a weld
  and a bolt group through their commands.
- Q01 stories: the curved/poly member, bent/lofted plate, transform,
  bolt-group, model-data tool, contour plate, part class, cut lifecycle,
  fits-and-combine, hole record and storey assignment stories run in their
  own published stores, and the alpha matrix documents them.
- The E04 IFC input study: ifc-inspect reads a received IFC file behind the
  minimal input contract and changes nothing.
- The N03 USD SDK differential harness with its fixtures and the G14.2
  gate ignore retirement.
- The gate: a selection without a library target passes the doctest step
  vacuously, and the test-gate tests cover it.
@axisrow
axisrow requested a review from Blogbotana as a code owner November 5, 2026 05:38

@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 of PR 833 (fork delta since the 1105 sync wave)

Reviewed the full diff of f953e8c against master 66ee62e (57 files, +10779/-108): the new IFC scanner and its CLI command, the drawing/report fixes, the V18/V19 UI surfaces, the model-command tests, the test-gate change, the USD differential harness with its fixtures, and the docs.

Verdict: approved. No inline findings — nothing in this delta requires a change.

Checked in depth:

  • crates/ifc/src/read.rs — a bounded scanner of untrusted input. The size cap is re-checked before parsing, non-UTF-8 bytes are refused, slicing is byte-safe on non-ASCII text, argument splitting tracks bracket depth, the name inventory and losses are capped, and the units resolution refuses instead of guessing (the no-fallback rule is pinned by tests). No panic or unbounded-allocation path found: interpreted bodies are slices of lines already bounded by MAX_LINE_BYTES, and first_string/split_args walk bytes via get, never by index.
  • Drawing fixes (svg.rs, pdf.rs, sheet.rs) — the line-normal label placement reproduces the old above/below result for horizontal lines and clears the line for vertical and inclined ones (offset = LABEL_GAP plus half the box extent projected onto the normal); polyline chaining compares 4-decimal formatted points, so it cannot merge distinct geometry; the title block now closes at the top and its divider follows the label column. SVG and PDF carry equivalent fixes and tests.
  • Report precision (bom.rs, schedule.rs) — quantity trimming is dot-anchored (the formatted value always contains a point, so trailing-zero trimming cannot eat integer digits) with a -0 fix-up; the mass column is matched per template column and falls back safely to the old rendering when cell and column counts disagree.
  • V18 grips and V19/V10 benches — every vertex and edge access goes through get/get_mut, the modulo is only reached with a nonzero count, single-flight covers all new job kinds through other_command_running, a worker that dies without a result lands in the CLI_FAILED path, and the corner editor is bound to the selection id so a changed selection cannot author on the wrong plate.
  • The gate change (tools/test-gate/src/local.rs) — the vacuous doctest pass triggers only on a nonzero exit without a timeout plus the exact cargo refusal line in the retained stderr log; the new process tests pin both sides (a real doctest failure is never vacuous).
  • registry.rs and COMMANDS.md agree on the new ifc-inspect entry and on --decimals 0..3; the engine already refused decimal_places > 3 (crates/engine/src/drawing.rs:376), so the registry/docs edit only aligns the documented contract with the enforced one.
  • tools/usd-sdk-differential/run.sh — writes only under a mktemp directory it removes on exit, asserts with fixed-string grep, and reads the oracle exit status from the assignment rather than a pipeline.

Non-blocking notes, for the record only:

  • In weld_click and bolt_click, clicking the already-picked main part as the second pick fills the secondary slot and is refused only at Create. Refusing the duplicate pick at click time would be friendlier; the current behaviour writes nothing.
  • The two 32 MiB cap tests (read.rs and ifc_inspect.rs) allocate or write the full cap on every run — acceptable, but they are the heaviest additions to the suite on a loaded machine.
  • In the scanner, once MAX_DISTINCT_NAMES names are present, further instances of already-known names also land in unclassified_instances. That matches the documented cap wording; worth knowing when reading the JSON.

The recorded gate receipt covers the full workspace; the new behaviour carries tests in the same commit, including real-binary CLI suites and egui-driven UI suites that assert both the refusal path and hand-typed equivalence.

@Blogbotana
Blogbotana merged commit f00260e into Apibim-com:master Nov 5, 2026
27 checks passed
axisrow added a commit to axisrow/BeamCraft that referenced this pull request Nov 6, 2026
Connect the fork's master to the upstream history delivered since the 1105
wave: upstream commit f00260e ("Deliver the fork delta since the 1105 sync
wave (Apibim-com#833)") carries the fork's own E04 IFC input study, contour grips,
weld panel, bolt panel, A10 bent plates, expanded alpha scenario and the
usd-sdk-differential fixtures back into the shared ancestry with their
upstream SHAs and parents. The merged tree equals the fork master tree byte
for byte - every upstream change is already present in the fork by content,
so this merge changes no fork behaviour; it restores the shared history.
The fork-only form stays: the recorded-gate ci.yml, the no-Python rule, the
fork policy documents and the fork's newer fixes that the upstream copies
predate. The fork delta accumulated since the Apibim-com#833 cut (V09/V10/V13 drawing
and sheet work) leaves as the next single batch pull request toward
upstream.

BeamCraft-Test-Gate: {"version":1,"commit":"f3b4ff252295c9d824e13633987f54aeae659d8f","tree":"087ce0ace2921f323399f2129ea841eae1b0503c","base":"f3b4ff252295c9d824e13633987f54aeae659d8f","merge_parent":"f00260ef8bf0b006b826e3b5c4ca6f247c40a853","os":"macos","arch":"aarch64","scope":"full","ui_independent_reason":null,"ui_tested":true,"rustc":"rustc 1.99.1 (58cf8f9c3 2026-10-13)","cargo":"cargo 1.99.1 (5f94df478 2026-08-27)","nextest":"cargo-nextest 0.9.149 (3fe4ef319 2026-10-20)\nrelease: 0.9.149\ncommit-hash: 3fe4ef31972f24e0c94cfe291718eab0fe678260\ncommit-date: 2026-10-20\nhost: aarch64-apple-darwin","expected_tests":2642,"executed_tests":2642,"ignored_tests":["beamcraft-test-gate::process::process_fixture"],"source_unchanged":true,"stages":[{"name":"format","exit_code":0,"elapsed_ms":1587,"timed_out":false},{"name":"clippy","exit_code":0,"elapsed_ms":379,"timed_out":false},{"name":"prepare","exit_code":0,"elapsed_ms":501,"timed_out":false},{"name":"tests","exit_code":0,"elapsed_ms":191471,"timed_out":false},{"name":"doctests","exit_code":0,"elapsed_ms":3016,"timed_out":false},{"name":"docs","exit_code":0,"elapsed_ms":386,"timed_out":false}]}
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