Skip to content

TrueForm increment 3: reclaim split and mis-fitted fillets (stl2step-fc) - #18

Merged
BlinkingSun merged 8 commits into
mainfrom
train/fc-inc3
Oct 16, 2026
Merged

BlinkingSun merged 8 commits into
mainfrom
train/fc-inc3

Conversation

@BlinkingSun

Copy link
Copy Markdown
Owner

Third increment of the fillet/chamfer work. It reclaims geometry that earlier stages split or mis-fitted, using relations to surfaces the engine has already certified. Every threshold is τ = 2q or a quantity measured on the certified set.

What changes

  • Relational extrusion anchors: when a wall plane has absorbed some of an adjacent fillet's facets, its anchor is seeded from the provisional's own largest facet and certified at τ as before. The slab sector around a fillet uses the contact line's propagated position bound, (anchor tolerance + τ) / (r·sin dihedral). Pair sides are pruned losslessly by anchor contact windows, so Body11 converts faster than before.
  • Uncertified cylinder regions: a cylinder fit that is more than τ off its own mesh gives its triangles to a certified fillet running through it, instead of shipping as a phantom large-radius face.
  • Relational reclaim (Line mode):
    • Certified pieces of one cylinder are merged into one face. The on-surface triangles between them are filled in, but only when the result is a single disk.
    • A hole wall that the revolve donor test refused is re-certified on its τ-inliers.

On the training files

  • Tray: the corner round and the four floor-outline rounds ship as cylinders.
  • Drill holder:
    • Its R2 edge rounds ship without the 13 phantom large-radius cylinders.
    • Volume error 0.007 % → 0.0001 %.
  • Plate: the four R3 slot ends are one face each (27 → 22 cylinder faces, 191 → 112 faces).
  • Shelf bracket: the R2.5 cross holes are one face each. They still ship open where they exit.
  • Reverts: no training file or corpus fixture reverts.
  • Visible-feature score (private manifests): 59 → 71 of 84 rows.

Instruments

Orchestrator rulings are recorded in the commit messages:

  • edge-class: the linkage tier-2 ceiling is 125 → 139. The increase is 15 overCap R3 | R10-puncture-plane chord edges, each 0.0028–0.0033 mm against a 0.0018 mm cap. It tightens once the R10 bore ships as one face.
  • gate_130:
    • A mesh-referenced cell with no exact volume may carry a measured ceiling, meshVolumeDeltaPctMax. The linkage value is 0.0100255 %: the analytic R3 surfaces move off the inscribed mesh by their sagitta volume.
    • Every exactVolume cell is unchanged.
  • shelf_bracket: the built-cylinder floor is 20 → 18, because each hole is now one face.
  • expected-red: the S27 rows in gates_full and p1_compose_gate are retired (XPASS).

Local CI

All 95 tests pass on each platform:

  • macOS: fresh clone at e5c80bd.
  • Linux (NUC): b67332f.
  • Windows (shop PC): b67332f plus the local Windows preflight root change.

e5c80bd differs from b67332f only in one note and the CHANGELOG text.

🤖 Generated with Claude Code

https://claude.ai/code/session_01HnaoqUzrjXaN8n4om4TREw

BlinkingSun and others added 8 commits October 15, 2026 22:53
…face closure (D-fc-4.4, D-fc-4.5)

Line mode at H0, after claimRelRevolve(Line); Torus mode stays a no-op for
the tori lane (separate function, dispatch on mode).

D-fc-4.5: an accepted CylGrow region whose own LS residual exceeds tau (the
revolve donor test refuses it) is re-certified on its tau-inliers I
(columns >= minStations(kParamsCircle), levels >= 2); every other triangle
must be chord-bounded cover (>= 2 vertices within tau, third within I's own
mid-edge sagitta). It grows from I over free triangles, refits and regrows
to a fixed point capped by p.maxRefineIters (unstable => refused), and
takes a same-surface partial reached only through the healed gap.

D-fc-4.4: certified partial CylGrow regions merge greedily to a fixed
point (mutual vertex dev <= tau, strict axial overlap, joint LS <= tau);
Unclaimed I/Cover triangles inside the group's extent fill the gap
(D-fc-3.2.7, s = claimChordSagitta of the group). Commit only if the
result is one edge-component and a disk (domain-not-disk / not-joined
defer unchanged). Region fields by the existing D2 rule, dVolCylinderSector
over the committed set. Claimed triangles leave the provisionals by the
D-fc-1.6(12) straddle trim. Print-only DIAG_REL_BAND stage=reclaim.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HnaoqUzrjXaN8n4om4TREw
Lane: fx-reclaim
…1 robbing (D-fc-4.1, D-fc-4.2, D-fc-4.3)

claimRelExtrude:
- D-fc-4.1: when the stored A2 plane does not certify, the REV ORCH-4 peel
  starts from the plane of the provisional's own maximum-area facet (ties:
  smallest local id). Certificate unchanged (tau fixed point + a3WouldCommit).
- D-fc-4.2: the slab slack at each contact generator is its propagated
  position bound, contactSlack = (anchorTol(other) + tau) / (r |nA x nB|),
  replacing tau / r on both sides. I membership unchanged.
- D-fc-4.3: triangles of an accepted CylGrow region whose own maxVertexDev
  exceeds tau are vote candidates; a certified band that commits with them
  dissolves the region (its own provisionals back to Unclaimed, the region
  leaves the accepted list, a chamfer cone's accepted index follows its
  cylinder). Regions within tau are never touched. DIAG_REL_ROB prints
  under STL2STEP_DIAG_REL only.

relational_extrude_unit: contactSlack pins and cases 19-22 (peel seed,
contact slack, robbed region dissolves, certified region untouched).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HnaoqUzrjXaN8n4om4TREw
Lane: fx-extrude
…D-fc-4 performance law)

A committed band is tangent to A and B and its contact vertices are
boundary vertices of the anchor bodies within tau of its circle. Per side,
every boundary vertex of A gives the radii of the side's circle family whose
tau-inflated circle contains it (radiusWindow, a widened superset of the
exact set); likewise B. When the two unions do not meet, no radius of that
side can be a claim and the side is skipped before the vote. The boundary
lists were already built per anchor (fillBoundary) and unused.

Body11: evaluatedSides 1855892 -> 50768, prunedSides 1805124; convert
72.0 s -> 22.9 s at --threads 3 (ee21b3b 37.6 s). DIAG_REL_SUM gains
prunedSides. relational_extrude_unit case 23.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HnaoqUzrjXaN8n4om4TREw
Lane: fx-extrude
…nchor plane (D-fc-3.2.2)

A band can meet a different piece of the same wall than the anchor that
claims it (Body28: one far coplanar pair claimed six R0.54 bands in a row).
Its contact vertices are then candidates within tanDistTol(anchorTol, tau)
of the anchor plane, not boundary vertices of that anchor's body. Each
side's contact set is now the body boundary plus those candidates; the
windows stay supersets.

51-file sweep (--engine trueform --threads 3): canonical STEP identical to
the unpruned 57b805a on 51/51 (974dfb5 differed on Body28 only).
Body11 evaluatedSides 50960 (unpruned 1855892). relational_extrude_unit
case 24.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HnaoqUzrjXaN8n4om4TREw
Lane: fx-extrude
…-1.14)

- edge-class: linkage_bores_chamfer tier2Ceiling 125 -> 139 (macOS, fc3-int
  a7d2776): the four R3 slot ends ship as one certified cylinder each and
  their cyl x cyl quartic contacts with the R10 cross bore are lawful tier-2
  polylines replacing facet|facet lines that were counted analytic.
- gate_130: a mesh-referenced volume cell (no exactVolume) may carry its own
  measured ceiling, meshVolumeDeltaPctMax (D-130-15(1)); never applies to an
  exactVolume cell, default stays 0.01 %. linkage: 0.0100255 (analytic R3
  sagitta volume, +2 mm3).
- shelf_bracket builtCylindersFloor 20 -> 18: each R2.5 cross hole is one
  face instead of two (authorised target).
- expected-red: S27_sphere_corner_fine retired from gates_full and
  p1_compose_gate (XPASS: all three R3 fillets match); reverts note updated
  (sphere stays faceted).
- CHANGELOG [Unreleased]: third increment.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HnaoqUzrjXaN8n4om4TREw
…the shelf-hole wording (audit-fc3-instruments F1/F2)

Text only: no value or gate logic changes. The +14 linkage tier-2 edges are
15 overCap R3 | R10-puncture-plane chord edges (overCap 43 -> 58), not the
R3 x R10 quartic contact; the shelf R2.5 holes ship as one face each but
stay open.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HnaoqUzrjXaN8n4om4TREw
@BlinkingSun
BlinkingSun merged commit e5c80bd into main Oct 16, 2026
3 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.

1 participant