Frahan StonePack — session log¶
Append-only. Newest entries at the top. One block per meaningful work session. Use the format below.
## YYYY-MM-DD — short subject
Agent: claude_cloud | codex_cloud | qwen_local | …
Branch: <git branch>
Commits: <short SHA>, <short SHA>
Tests: PASS / FAIL / SKIP
Done:
- bullet
- bullet
Files touched (top-level):
- path/
Next:
- bullet
2026-05-31 — Fabrication-bridge checkpoint (G-code + wire-saw)¶
Agent: claude_cloud (Opus 4.7, 1M ctx) Branch: docs/frahan-autonomous-nightshift Commits: not yet committed (HITL gate per AGENTS.md §6; 7 in-scope files) Tests: not re-run this window; last green 19/19 PASS on MatcherRegistryTests. Build: Frahan.StonePack.GH Debug net48 -> Build succeeded.
Done — 3 of 5 Stage F (Robot Targets) components shipped + 3 dossiers:
Components (in src/Frahan.StonePack.GH/Fabrication/):
- D5F10030 GCodeParserComponent — ISO 6983 parser, CutPath typed-record emitter.
- D5F10031 GCodeToPlanesComponent — CutPath -> Plane[] with arc discretisation + tool-axis frame.
- D5F10034 WireSawToolpathAdapterComponent — Frahan-original; robot-mounted diamond-wire saw toolpath; cites Zhang 2024 JCDE 11(6) DOI 10.1093/jcde/qwae094 + Moult 2018 USyd.
Typed record (in src/Frahan.StonePack.Core/Fabrication/):
- CutPath.cs — Segments + Bounds + Units + Dialect + per-segment FeedRate / SpindleSpeed.
Dossiers landed (in wiki/research/):
- robot_ingest_pipeline/gcode_to_kukaprc_robots.md — KUKAprc + visose Robots + wire-saw survey.
- mrac_workshop_2023/exercise_dossier.md — Metashape exercise (92 photos, 5 markers).
- mrac_workshop_2023/submissions_dossier.md — Submissions inventory (Pink Joinery + Yellow Joinery groups, Speckle 2.11.1 bridge, Open3D pipeline).
In flight (sub-agent):
- wiki/research/fabrication_bridge_gap_map.md — avoid-double-work map.
Files touched (top-level):
- Template-General/outputs/2026-05-01/frahan_stonepack/src/Frahan.StonePack.Core/Fabrication/
- Template-General/outputs/2026-05-01/frahan_stonepack/src/Frahan.StonePack.GH/Fabrication/
- wiki/research/robot_ingest_pipeline/
- wiki/research/mrac_workshop_2023/
- outputs/2026-05-31/future_work/frahan_handoff_compact.md
Next: - Build PlanesToKukaPrcCommands (D5F10032) + PlanesToRobotTargets (D5F10033). Thin wrappers, ~1 day each. - Phase A scan-side components per MRAC submissions dossier §6. - ETH1100 tuning sweep (task #62).
2026-05-21 — Kim 2024 polygonal-masonry install-order DAG (Phases 1-4)¶
Agent: claude_cloud (Opus 4.7, 1M ctx) Branch: docs/frahan-autonomous-nightshift Commits: 64333b6, 13b994b, b59dbdc (+ today's docs commit) Tests: 756 PASS / 0 FAIL / 91 SKIP (was 747 / 0 / 91 at session start). Build: 0 errors, 0 warnings.
Done — full implementation of DETC2024-142563 (Kim 2024) shipped:
Phase 1 — Python reference: - outputs/2026-05-20/polygonal_masonry_sequence/ — 5 modules + 7 examples covering paper Figs. 4-7, sec. 5.4 holes, Fig. 13 (Perlin), Fig. 14 (Voronoi + bunny), Fig. 15 (3D Voronoi, 50 stones). 15/15 unit tests pass; 7 PNGs saved.
Phase 2 — C# Core port: - Frahan.StonePack.Core/Masonry/Sequencing/{Geom2D, Pslg, Wall}.cs in namespace Frahan.Masonry.Sequencing. - Half-edge PSLG with T-junction pre-splitting; chains+bbox -> DAG via rules (5)-(8); reversed Kahn's per Code 1. 14 unit tests.
Phase 3 — Grasshopper component (2D): - PolygonalMasonrySequenceComponent on Frahan > Masonry ribbon, GUID B4E07A3C-7F4D-4E5B-9C71-0EAF21C9B6A1. Curves + Rectangle in -> stone polylines + install order + DAG edges out. Metadata test.
Phase 4 — Wall3D + 3D Grasshopper component: - Wall3D.cs (structural, geometry-kernel-free): cells + adjacency in, install plan out. 7 tests covering tower, side-by-side no-edge, pyramid, holes, dedup, unbounded skip, duplicate-id throw. - PolygonalMasonrySequence3DComponent: closed Meshes in, install order + DAG edges out. Auto-detects adjacency via face-centroid quantisation. GUID C5F18B4D-8A6F-4E72-AC83-1FBD32D8C7B2. Metadata test.
Deploy: - Release build 2026-05-20 21:38. .gha + Core.dll + EdgeMatching.Core.dll copied to %APPDATA%/Grasshopper/Libraries/Frahan.StonePack.MeshHeightmap/.
Files touched (top-level): - Template-General/outputs/2026-05-20/ (Python reference + figures + NEXT_STEPS) - Template-General/outputs/2026-05-01/frahan_stonepack/src/ Frahan.StonePack.Core/Masonry/Sequencing/ (4 .cs files) - Template-General/outputs/2026-05-01/frahan_stonepack/src/ Frahan.StonePack.GH/Masonry/Sequencing/ (2 .cs files) - Template-General/outputs/2026-05-01/frahan_stonepack/tests/ Frahan.StonePack.Tests/ (4 new .cs files + Program.cs edits) - Template-General/raw/references/computation-13-00211.pdf - wiki/algorithms/polygonal_masonry/ (this session, both pages) - wiki/index.md, wiki/log.md (this entry), wiki/audit_trail.jsonl
Next: - Visual canvas validation pass — drop Polygonal Masonry Sequence on the canvas, confirm install order and DAG arrows match expectation. That's the truth-criterion-(c) gate before promotion. Detailed recipe in Template-General/outputs/2026-05-20/future_work/NEXT_STEPS.md and wiki/algorithms/polygonal_masonry/validation_log.md. - Phase 5 (turnkey "seeds in, plan out" C# pipeline): MIConvexHull NuGet (HITL gate) OR hand-rolled Bowyer-Watson 3D Voronoi. Deferred pending Libish's call.
2026-05-19 (final) — K2 + Phase G + Phase H + Phase I in one push¶
Agent: claude_cloud (Opus 4.7, 1M ctx) Branch: docs/frahan-autonomous-nightshift Tests: 733 PASS / 0 FAIL / 91 SKIP (was 724 / 0 / 82). Build: 0 errors, 0 warnings.
Done — four phases shipped in this session:
K2 (Kim 2025 extensions beyond the paper): - CutSurfaceWeight option subtracts Jalalian I11 surface cost from score. - Parallel.For forest growth (bitwise identical to serial via per-forest seed). - MemoryBudgetBytes option auto-caps ForestCount. - Async GH wrapper deliberately skipped per Frahan's own empirical evidence (IrregularSheetFillComponentAsync marked Obsolete). - 4 new tests; commit 5767e8a.
Phase G (mesh-bench support): - Frahan.Core.Quarry.BenchBoundary value type with Aabb + optional Mesh + ContainsBoxCentre / ContainsBox helpers. - BenchFromMesh GH component (Mesh → Box + Mesh + BenchBoundary). - ClipBoxesByMesh GH component (filter Box[] BCO outputs by mesh containment + recompute recovery fraction). - Design choice: composition over invasive edits to the 11 BCO components — preserves all GUIDs and tests. - 8 new tests; commit not yet pushed at point of writing this log.
Phase H (reconstruction primitives): - frahan_cgal.cpp + .h gain alpha_shape_3 + advancing_front_reconstruct + estimate_normals exports (build-gated by FRAHAN_CGAL_ENABLE_RECONSTRUCTION). - frahan_geogram.cpp + .h gain poisson_reconstruct stub (build-gated; PoissonRecon library wiring TODO documented). - ReconstructionNative.cs: 6 Try* safe wrappers that catch DllNotFoundException + EntryPointNotFoundException so the .gha loads cleanly even before the native rebuild. - ScanReconstruct + EstimateCloudNormals GH components.
Phase I (cloud-cloud ICP at 10M+ scale): - frahan_geogram.cpp gains voxel_downsample (pure C++ hash grid) + kdtree_query (GEO::NearestNeighborSearch). - Frahan.Core.ScanIngest.PointCloudIcp: coarse-to-fine trimmed point-to-point ICP. Native KD-tree + voxel downsample when available; managed brute-force + hash-grid fallback otherwise. Reuses RigidTransformRecovery (Horn 1987) for per-iteration solves. - VoxelDownsample + CloudIcp GH components. - 6 new tests; all PASS via managed fallback paths.
Files touched: ~17 across native shim sources, Core, GH, and tests.
Pending HITL: - Native rebuild with -DFRAHAN_CGAL_ENABLE_RECONSTRUCTION + a PoissonRecon link target to enable Phase H exports. - 10M-point Cloud ICP canvas validation per UX report §7.7.F gate (target wall-clock 30-40 s with native KD-tree). - Visual validation of all 11 new GH components on a Rhino 8 canvas.
Phase F8 (HITL canvas validation) and the K2 + G + H + I HITL gates remain user-side work.
2026-05-19 (last) — Kim 2025 K1 port + 3 extensions¶
Agent: claude_cloud (Opus 4.7, 1M ctx) Branch: docs/frahan-autonomous-nightshift Tests: 724 PASS / 0 FAIL / 82 SKIP (was 719 / 0 / 74). Build: 0 errors, 0 warnings.
Done:
- Kim 2025 K1 port — implements the forest+slab+score algorithm
from wiki/papers/kim2025_tree_packing.md (CC BY 4.0 paper synthesis).
Solves multi-container guillotine cuboid packing with element values
and container prices — a problem none of the existing Frahan packers
cover.
- Frahan.Core.Packing namespace (pure managed, no MathNet/no Rhino
native needed by the algorithm itself):
- GuillotineRotationMode enum: None / OneAxis / ThreeAxis.
- GuillotinePackOptions: ForestCount, Seed, RotationMode, KerfWidth.
- GuillotinePackResult: BestForestIndex + Score + Placements[]
(each with element/container indices + PlacedBox + Transform) +
UsedContainerIndices + AllElementsPacked + ForestsRun + SeedUsed.
- GuillotinePlacement struct.
- TreePackForest.Pack(...) — main entry. Per forest: shuffle elements
+ containers + rotations, grow forest using leaf-and-slab queue,
split slab into 3 sub-slabs along one of 6 axis-orderings on each
placement, compute score per Kim 2025 §2.4. Best forest wins.
- Three extensions beyond the paper (close documented gaps):
1. Deterministic seed. Master seed input; forest k uses
(seed + k). SplitMix64 RNG. Same seed → same placement order.
2. Saw kerf width. Each axis-aligned cut consumes this much
material along its direction. Slabs that collapse to <=0 size
after kerf are dropped from the leaf queue. Closes paper's
silent zero-kerf assumption.
3. Per-container Forbidden Boxes (e.g. fracture-intersected
cells from HeteroExt). Elements that would overlap any
forbidden box in their target container are rejected during
placement. Closes Kim §8.2 gap (fracture-aware containers).
- BlockPackTreeComponent (C2D3E4F5-3001-...) on Masonry /
secondary row. 9 inputs (Elements + Element Values + Containers +
Container Prices + Rotation Mode + Forests + Seed + Kerf + optional
Forbidden Boxes flat list, auto-bucketed by container centre).
9 outputs (Placed Boxes + Transforms + Element Ids + Container Ids +
Used Containers + Score + All Packed + Best Forest + Report).
- 13 new tests (TreePackForestTests): input validation (null,
mismatched, empty), single-fit, oversized rejection, cheap-container
preference, deterministic seed reproducibility, seed exploration
diversity, kerf reduces packed count, forbidden box blocks single
fit, forbidden box redirects to free container, 3-axis rotation
fits elongated element, all-packed score formula.
Deferred to a future K2 batch: - Jalalian I11 cutting-surface cost as an optional score term. - Parallel forests via Parallel.For / PLINQ. - Memory-budget cap (auto-reduce forests when budget exceeded). - Async via GH_TaskCapableComponent for large f.
Files touched:
- Template-General/outputs/2026-05-01/frahan_stonepack/src/Frahan.StonePack.Core/Packing/GuillotinePackOptions.cs (new, ~65 LOC)
- Template-General/outputs/2026-05-01/frahan_stonepack/src/Frahan.StonePack.Core/Packing/GuillotinePackResult.cs (new, ~80 LOC)
- Template-General/outputs/2026-05-01/frahan_stonepack/src/Frahan.StonePack.Core/Packing/TreePackForest.cs (new, ~440 LOC)
- Template-General/outputs/2026-05-01/frahan_stonepack/src/Frahan.StonePack.GH/Packing/BlockPackTreeComponent.cs (new, ~220 LOC)
- Template-General/outputs/2026-05-01/frahan_stonepack/tests/Frahan.StonePack.Tests/TreePackForestTests.cs (new, ~235 LOC)
- Template-General/outputs/2026-05-01/frahan_stonepack/tests/Frahan.StonePack.Tests/Program.cs (+13 test registrations)
Next: - HITL canvas validation: open Rhino 8, drop BlockPackTree on canvas with the Inst_01 / Inst_02 instances from the paper (Tables 2/3 of the synthesis at wiki/papers/kim2025_tree_packing.md) and confirm the score converges to 1245.52 / 1087.36 within ~50-1000 forests. - K2 batch — adaptive-MC + parallel + async (deferred items above).
2026-05-19 (late) — Phase F6/F7 duplicate component cleanup¶
Agent: claude_cloud (Opus 4.7, 1M ctx) Branch: docs/frahan-autonomous-nightshift Tests: 719 PASS / 0 FAIL / 74 SKIP (unchanged from F5). Build: 0 errors, 0 warnings.
Done:
- Phase F6 — MeshFix dup removal (UX architecture report §5.2):
Dropped Template-General/.../Masonry/MeshRepairComponent.cs (GUID
F2D000B5-CADC-4F2D-A0B5-7E60CADA15A0, committed 2026-05-08).
The older root-level MeshRepairComponent.cs (GUID
AB12C00A-1A2B-4C3D-9E4F-5A6B7C8D9E0A, committed 2026-05-04)
survives per AGENTS.md §8 stability rule (longer commit lineage).
Both shared nickname MeshFix; only one survived a .gha reload,
so the dropped declaration was already unreachable from canvas
search.
- Phase F7 — MeshDiag dup removal (UX architecture report §5.3):
Dropped Template-General/.../Masonry/MeshDiagnosticsComponent.cs
(GUID CDEF0123-4567-89AB-CDEF-0123456789AB, committed 2026-05-08).
Root MeshDiagnosticsComponent.cs (GUID
AB12C005-1A2B-4C3D-9E4F-5A6B7C8D9E05, committed 2026-05-04)
survives. MQ Mesh Quality Report stays as the richer alternative
in the Masonry subcategory.
- Updated Gh_MeshRepairComponent_Metadata (BvhAndBestFitTests.cs)
and Gh_MeshDiagnosticsComponent_Metadata (MeshSolverTests.cs) to
assert against the surviving root-variant GUIDs and port counts
(Repair: 3 in / 4 out; Diag: 1 in / 10 out). Both tests now PASS
cleanly.
- Added using Frahan.GH; to both test files so the simple class
names resolve to the root variants now that the Masonry dups are
gone.
Files touched:
- DELETED: Template-General/outputs/2026-05-01/frahan_stonepack/src/Frahan.StonePack.GH/Masonry/MeshRepairComponent.cs
- DELETED: Template-General/outputs/2026-05-01/frahan_stonepack/src/Frahan.StonePack.GH/Masonry/MeshDiagnosticsComponent.cs
- MODIFIED: Template-General/outputs/2026-05-01/frahan_stonepack/tests/Frahan.StonePack.Tests/BvhAndBestFitTests.cs (metadata expectations + using directive)
- MODIFIED: Template-General/outputs/2026-05-01/frahan_stonepack/tests/Frahan.StonePack.Tests/MeshSolverTests.cs (metadata expectations + using directive)
Next:
- Phase F8: HITL canvas validation gate (user-side, Rhino 8). Save
.gh files into outputs/<date>/canvas_validation/scan_pack/.
- PackRpt duplicate (UX report §A.12) — needs deliberation; both
PackingReportComponent and PackingPlanReportComponent have
functional code with same Name + Nickname. NEXT_STEPS says drop
PackingReportComponent but it has the older lineage. Defer until
a clear policy call on Name disambiguation vs deletion.
2026-05-19 (later still) — Phase F5 3D-pack diagnostics¶
Agent: claude_cloud (Opus 4.7, 1M ctx) Branch: docs/frahan-autonomous-nightshift Tests: 719 PASS / 0 FAIL / 74 SKIP (was 717 / 0 / 66 → +2 PASS, +8 SKIP). Build: 0 errors, 0 warnings (Core, EdgeMatching.Core, GH, Tests).
Done:
- Phase F5 — 3D Pack diagnostics (UX architecture report §7.7.C):
Three pragmatic diagnostics that catch obvious 3D-pack failures
without the cost of a full RBE solve.
- Frahan.Core.ScanIngest.PackDiagnostics (pure managed):
- PerStoneOverlap(meshes, tol) — fraction of each stone's
vertices inside any other closed mesh. Cheap volumetric-overlap
stand-in.
- CentreOfMassInContainer(meshes, container, tol) — projects
each stone's vertex centroid and tests inside the container.
- PileStability(meshes, up, floorZ, zTol) — two-test geometric
proxy: (a) stone is grounded and CoM lies in its own XY footprint,
or (b) CoM lies in the XY footprint of a stone whose top is within
zTol of this stone's bottom.
- VertexCentroid(mesh) helper.
- GH components on 3D Packing / secondary row:
- PackOverlap (B1C2D3A4-2003-...) — per-stone overlap
fractions + penetrating-ids list + max overlap + warning bubble
above 1 % vertex-inside threshold.
- PackComCheck (B1C2D3A4-2004-...) — per-stone inside-bools +
CoM points + marginal-ids + warning bubble.
- PackStability (B1C2D3A4-2005-...) — per-stone stable bool +
falling-ids + all-stable verdict + warning bubble.
- 10 new tests (PackDiagnosticsTests):
- 4 PerStoneOverlap (null guard, single-stone-zero, disjoint-zero,
fully-contained-1.0).
- 3 ComCheck (null guard, stone-inside-passes, stone-outside-fails).
- 3 PileStability (grounded-stable, stack-of-two-stable,
floating-falling).
- 2 PASS pure managed; 8 SKIP requiring Rhino native
(Mesh.CreateFromBox + Mesh.IsPointInside paths) per existing
FRAHAN_SKIP_NATIVE convention.
Files touched:
- Template-General/outputs/2026-05-01/frahan_stonepack/src/Frahan.StonePack.Core/ScanIngest/PackDiagnostics.cs (new, ~180 LOC)
- Template-General/outputs/2026-05-01/frahan_stonepack/src/Frahan.StonePack.GH/ScanIngest/PackOverlapComponent.cs (new, ~95 LOC)
- Template-General/outputs/2026-05-01/frahan_stonepack/src/Frahan.StonePack.GH/ScanIngest/PackComCheckComponent.cs (new, ~105 LOC)
- Template-General/outputs/2026-05-01/frahan_stonepack/src/Frahan.StonePack.GH/ScanIngest/PackStabilityComponent.cs (new, ~110 LOC)
- Template-General/outputs/2026-05-01/frahan_stonepack/tests/Frahan.StonePack.Tests/PackDiagnosticsTests.cs (new, ~160 LOC)
- Template-General/outputs/2026-05-01/frahan_stonepack/tests/Frahan.StonePack.Tests/Program.cs (+10 test registrations)
Next:
- Phase F6/F7: drop the duplicate MeshRepairComponent and
MeshDiagnosticsComponent declarations (§5.2 / §5.3 collisions in
the UX architecture report). Keep the GUID with the longer commit
lineage per AGENTS.md §8.
- Phase F8: HITL canvas validation gate.
2026-05-19 (still later) — Phase F3+F4 scan-prep components¶
Agent: claude_cloud (Opus 4.7, 1M ctx) Branch: docs/frahan-autonomous-nightshift Tests: 717 PASS / 0 FAIL / 66 SKIP (was 713 / 0 / 57 → +4 PASS, +9 SKIP). Build: 0 errors, 0 warnings (Core, EdgeMatching.Core, GH, Tests).
Done:
- Phase F3 — ScaleCal (UX architecture report §7.7.A scan ingest):
Frahan.Core.ScanIngest.ScaleCalibration — pure-managed
Solve(measuredLength, referenceLength) and SolveFromCurve(curve, ref)
static façade. Returns a ScaleCalibrationResult with the uniform
scale factor, a Rhino Transform.Scale ready to apply, and a
human-readable summary. ScaleCalibrateComponent GH wrapper
(B1C2D3A4-2001-...) on Mesh / secondary row: input the measured
Curve + reference length + optional Meshes; output transform +
factor + scaled meshes + report. Sanity warning for scale factors
outside [1e-4, 1e4].
- Phase F4 — StonePrep (UX architecture report §7.7.A one-button
scan cleanup): Frahan.Core.ScanIngest.StonePreparation wraps the
existing Frahan.Surface.MeshRepair.RepairAll (cull degenerate →
weld → fill holes) + RhinoCommon's managed Mesh.Reduce (quadric
edge collapse) + Frahan.Surface.StoneDescriptorBuilder.BuildFromMesh.
Per-stage toggles (Repair, Decimate, Target Triangle Count), per-
stone trace, batch + single APIs. StonePrepComponent GH wrapper
(B1C2D3A4-2002-...) on Mesh / secondary row.
- 13 new tests: 8 for ScaleCal (identity, mm-to-m, km-to-m,
transform geometry, negative/zero/null guards, LineCurve length),
5 for StonePrep (null guard, box mesh round-trip, repair-disabled
trace, decimate triangle-count drop, batch with nulls preserving
positions). 4 PASS pure managed; 9 SKIP requiring Rhino native
(Mesh.CreateFromBox + Curve.GetLength + Transform.Scale paths) —
appropriate skip per the existing FRAHAN_SKIP_NATIVE convention.
Files touched:
- Template-General/outputs/2026-05-01/frahan_stonepack/src/Frahan.StonePack.Core/ScanIngest/ScaleCalibration.cs (new, ~115 LOC)
- Template-General/outputs/2026-05-01/frahan_stonepack/src/Frahan.StonePack.Core/ScanIngest/StonePreparation.cs (new, ~175 LOC)
- Template-General/outputs/2026-05-01/frahan_stonepack/src/Frahan.StonePack.GH/ScanIngest/ScaleCalibrateComponent.cs (new, ~115 LOC)
- Template-General/outputs/2026-05-01/frahan_stonepack/src/Frahan.StonePack.GH/ScanIngest/StonePrepComponent.cs (new, ~150 LOC)
- Template-General/outputs/2026-05-01/frahan_stonepack/tests/Frahan.StonePack.Tests/ScanPrepTests.cs (new, ~200 LOC)
- Template-General/outputs/2026-05-01/frahan_stonepack/tests/Frahan.StonePack.Tests/Program.cs (+13 test registrations)
Next: - Phase F5: 3D Pack diagnostics (PackOverlap, PackComCheck, PackStability) on 3D Packing / secondary row. - Phase F6/F7: drop MeshFix + MeshDiag duplicate declarations (§5.2/§5.3 collisions). - Phase F8: HITL canvas validation gate — Rhino-side.
2026-05-19 (later) — Phase F1+F2 scan ingest + Kim 2025 paper synthesis¶
Agent: claude_cloud (Opus 4.7, 1M ctx) Branch: docs/frahan-autonomous-nightshift Tests: 713 PASS / 0 FAIL / 57 SKIP (was 702 → +11 new tests). Build: 0 errors, 0 warnings (Core, EdgeMatching.Core, GH, Tests — Debug).
Done:
- Kim 2025 paper synthesis (wiki/papers/kim2025_tree_packing.md):
Engineering summary of Kim, T. "Packing and Cutting Stone Blocks
Based on the Nonlinear Programming of Tree Cases", Computation 13:211
(CC BY 4.0). Algorithm (forest growth + slab-split guillotine cuts +
randomised parallel scoring), comparison to current Frahan packers,
adoption recommendation. Verdict: Kim 2025 solves a problem none
of the current Frahan packers cover (multi-container guillotine
cuboid packing with prices). Add as a new component, do not replace
anything. Defer to a self-contained ~1-2 week mini-phase between
Phase G and Phase H of the UX architecture rollout.
- Phase F1+F2 multi-format scan reader (UX report §7.7.A-B):
- Frahan.Core.ScanIngest namespace with three pure-managed parsers:
ObjMeshReader (multi-group OBJ with v/f, vertex/tex/normal triplet
syntax, negative indices, fan-triangulation), StlMeshReader
(ASCII + binary, vertex welding via quantised hash at 1e-7
tolerance), and MultiFormatMeshReader dispatcher (extension +
magic-byte detection).
- ScanMesh value type (Name + flat vertex/index arrays + optional
RGB) shared across the scan path.
- Rescue-extend of ReadPlyMeshComponent per UX report §9.14:
same GUID (789ABCDE-F012-3456-789A-BCDEF0123456), subcategory
moved Masonry → Mesh, inputs grew 1 → 2 (File Path + Format enum),
outputs grew 3 → 5 (Meshes[] + Names[] + V[] + T[] + Detected
Format). Multi-group OBJ files surface as parallel Mesh + Name
lists.
- 11 new tests covering OBJ (single tri, quad fan-triangulate,
triplet face syntax, two-group split, negative indices, empty),
STL (ASCII tetra welding, binary single tri), and dispatcher
(extension detect, forced format override, missing file).
- 2 existing ReadPlyMesh metadata tests updated to assert the new
SubCategory ("Mesh") and port counts (2 in / 5 out).
Files touched:
- wiki/papers/kim2025_tree_packing.md (new)
- Template-General/outputs/2026-05-01/frahan_stonepack/src/Frahan.StonePack.Core/ScanIngest/ (new dir; 3 files, ~565 LOC)
- Template-General/outputs/2026-05-01/frahan_stonepack/src/Frahan.StonePack.GH/Masonry/ReadPlyMeshComponent.cs (rewritten in-place; GUID stable)
- Template-General/outputs/2026-05-01/frahan_stonepack/tests/Frahan.StonePack.Tests/ScanIngestTests.cs (new, ~210 LOC)
- Template-General/outputs/2026-05-01/frahan_stonepack/tests/Frahan.StonePack.Tests/MasonryGhComponentTests.cs (Phase F metadata expectations)
- Template-General/outputs/2026-05-01/frahan_stonepack/tests/Frahan.StonePack.Tests/Program.cs (+11 test registrations)
Next: - Phase F3 ScaleCal (scan scale calibration from reference length + measured Curve). - Phase F4 StonePrep (one-button Repair→Decimate→OBB→StoneDesc wrapper). - Phase F5 3D Pack diagnostics (PackOverlap, PackComCheck, PackStability). - Phase F6/F7 MeshFix + MeshDiag dup removals (§5.2/§5.3 collisions). - Phase F8 HITL canvas validation: scan two real stones, run full ScanRead → StonePrep → Pack3DContainer chain in Rhino 8.
2026-05-19 — UX architecture report + Phase I1-I5 registration shipped¶
Agent: claude_cloud (Opus 4.7, 1M ctx) Branch: docs/frahan-autonomous-nightshift Tests: 702 PASS / 0 FAIL / 57 SKIP (was 694 → +8 new tests, +1 SKIP requires Rhino native) Build: 0 errors, 0 warnings (Core, EdgeMatching.Core, GH, Tests — Debug)
Done:
- UX architecture report (outputs/2026-05-18/UX_ARCHITECTURE_REPORT.md,
2734 lines, 5 appendices) — full ribbon-consolidation analysis with
three iterations:
- Initial pass: 17 panels / ~131 visible components → 11 / ~70.
§1-§8 + Appendix A/B + §9 open questions framed for claude.ai
refinement.
- 2026-05-19 morning: folded in scan ingest (§3.8) and quarry
mesh-boundary input (§3.9) workflows; added §6.6 / §6.7 friction
items; §7.7.A-D + §7.8 layout impact; Appendix C BCO bench-input
port audit (11 components Box-only, 1 Mesh).
- 2026-05-19 afternoon: added §3.8.1 reconstruction primitives
(Alpha Shape / Poisson / Advancing-Front) via existing CGAL +
Geogram shim extension — no new native deps; key finding is
Geogram already bundles Misha Kazhdan's PoissonRecon per
NOTICE.md line 33. Appendix D library comparison
(Geogram / CGAL / Open3D / MeshLab).
- 2026-05-19 evening: added §3.8.0 registration upstream
(marker / reference / georeferenced + cloud-cloud ICP at 10M+
point quarry-bench scale); §7.7.F components; Appendix E
registration / cloud-cloud ICP library matrix.
- NEXT_STEPS.md Phase F-L rollout (outputs/2026-05-15/NEXT_STEPS.md,
+226 lines): 47 numbered checkpoints across four workstreams (scan
ingest, mesh-bench, reconstruction, registration) + 5-week phasing
table + cross-phase blockers + open-question gate.
- Phase I1-I5 implementation shipped (UX report §7.7.F easy-80%,
pure managed, zero new deps, zero native code):
- Frahan.Core.Registration.RegistrationApi — public Rhino-friendly
façade over existing RigidTransformRecovery (Horn 1987 QAO).
Returns Rhino Transform + RMS + per-pair residuals from N≥3
Point3d pairs.
- Frahan.Core.Registration.GeoreferenceMath — WGS84 + Bowring
LLH↔ECEF (closed-form non-iterative) + ENU rotation about a
chosen origin + Karney UTM↔LLH (series order 6). Round-trip
verified at 4 latitudes (equator, mid-lat, southern, near-pole).
- GH components on Mesh / quarternary row: MarkerReg
(B1C2D3A4-1111-...), Georef (B1C2D3A4-1112-...) with
Coord System enum (LLH-WGS84 / UTM / Local-ENU). Mis-picked
marker warning bubble when any residual > 5× RMS.
- 9 new tests covering identity / translation / rotation /
combined / noisy / mismatched-count / N<3 + LLH↔ECEF +
ENU↔ECEF + UTM↔LLH round-trips.
Files touched:
- outputs/2026-05-18/UX_ARCHITECTURE_REPORT.md (new, 2734 lines)
- outputs/2026-05-15/NEXT_STEPS.md (modified, +226 lines)
- Template-General/outputs/2026-05-01/frahan_stonepack/src/Frahan.StonePack.Core/Registration/ (new dir, 2 files, ~395 LOC)
- Template-General/outputs/2026-05-01/frahan_stonepack/src/Frahan.StonePack.GH/Registration/ (new dir, 2 files, ~380 LOC)
- Template-General/outputs/2026-05-01/frahan_stonepack/tests/Frahan.StonePack.Tests/RegistrationApiTests.cs (new, 200 LOC)
- Template-General/outputs/2026-05-01/frahan_stonepack/tests/Frahan.StonePack.Tests/Program.cs (+9 test registrations)
Next:
- HITL canvas validation for Phase I5 gate: register a synthetic
3-marker case + a synthetic UTM-control-point case in Rhino,
verify RMS < 1 mm on noise-free input. Save .gh files into
outputs/<date>/canvas_validation/registration/.
- Phase F (scan ingest workflow), Phase G (mesh-bench), Phase H
(reconstruction primitives via shim extension), and Phase I6-I15
(hard-20% Cloud ICP with KD-tree / voxel / normal shim exports)
per NEXT_STEPS.md §F-§I.
- Architecture report hand-off to claude.ai for §9.1-§9.14
refinement pass before Phase F begins.
2026-05-15 (later) — Monument packing + BCO inspector / ingestion / heterogeneous track¶
Agent: claude_cloud (Opus 4.7, 1M ctx) Branch: docs/frahan-autonomous-nightshift Tests: 694 PASS / 0 FAIL / 56 SKIP (was 680 → +14 new tests) Build: 0 errors, 0 warnings (4 projects, Debug + Release)
Done:
- Monument packing (3 GH + 4 Core + 1 test file):
- Frahan.Masonry.Quarry.Monuments namespace: Monument,
MonumentInventory, MonumentPlacement,
MonumentOrientationSampler (24-rotation SO(3) axis-aligned group,
det=+1), BenchMonumentPacker + BenchMonumentPlan (per-cell
largest-first AABB-greedy, 8-corner half-space containment,
fracture-respecting).
- GH components: MonInv, MonPack, MonInCell.
- 7 tests covering 24-rotation invariants, single-cell place,
oversized → unplaced, fracture-split → one-cell only.
- BlockCutOpt inspector / extension components (gaps 1–7 of the
2026-05-15 coverage audit; 7 GH components in 2 new GH files):
- BCOPareto — 4-axis Pareto extrema per sub-zone (recovery, revenue,
kerf-time, BCSdbBV — the fourth was hidden in BCOOmni).
- BCORobust — Fisher-robust Monte Carlo wrapper (synthesis I8).
- BCOWatershed — density-watershed adaptive sub-division (I5).
- VtuOut — ParaView .vtu export of the optimal grid.
- Photo2Ply — CSV-driven photogrammetry → PLY (Phase 11.5).
- AlgConv — Zhang 2024 algebraic input → ConvexPolyhedron (I14).
- TnGran — deterministic synthetic Tamil Nadu granite DFN.
- 3D DLBF generalisation + heterogeneous-extraction composite:
- Dlbf3dMixedSizePacker in Core (Chehrazad 2025 §5; variable-height
pieces with optional floorOnly mode — default true for quarry).
- 6 tests covering floor-only fill, stacked fill, heterogeneous
heights, revenue-per-volume preference, forbidden columns, oversized
pieces.
- GH: BCOMixedPack3D (direct exposure) and HeteroExt (4-step
composite: BCO at prime dim → forbidden = intersected cells →
3D DLBF on the full catalogue → optional MonPack with monument
meshes on a derived BlockGraph).
- Docs: outputs/2026-05-14/connection_map/GRASSHOPPER_CONNECTIONS.md
updated with §2.1.8 (Monument) + §2.1.9 (BCO extensions) + §3.7
(heterogeneous workflow) + §6.1 (new GUIDs).
Files touched (top-level): - Template-General/.../src/Frahan.StonePack.Core/Masonry/Quarry/Monuments/ - Template-General/.../src/Frahan.StonePack.Core/Masonry/Quarry/BlockCutOpt/Dlbf3dMixedSizePacker.cs - Template-General/.../src/Frahan.StonePack.GH/MonumentPackingComponents.cs - Template-General/.../src/Frahan.StonePack.GH/BlockCutOptInspectorComponents.cs - Template-General/.../src/Frahan.StonePack.GH/BlockCutOptIngestionComponents.cs - Template-General/.../src/Frahan.StonePack.GH/BlockCutOptHeterogeneousComponents.cs - Template-General/.../tests/Frahan.StonePack.Tests/MonumentPackingTests.cs - Template-General/.../tests/Frahan.StonePack.Tests/Dlbf3dMixedSizePackerTests.cs - Template-General/.../tests/Frahan.StonePack.Tests/Program.cs (test registrations) - outputs/2026-05-14/connection_map/GRASSHOPPER_CONNECTIONS.md - wiki/log.md, wiki/index.md
Pending:
- HUMAN: Rhino canvas smoke test for the 14 new components (3
Monument + 11 BCO-extension). Drop each on a Rhino 8 canvas, walk
through the heterogeneous workflow in §3.7 of the connection map,
log the result in wiki/algorithms/<topic>/validation_log.md.
2026-05-15 — Health check + 7-item improvements punchlist¶
Agent: claude_cloud (Opus 4.7, 1M ctx)
Branch: docs/frahan-autonomous-nightshift
Commits: add473a, f34e418, 6fb604a, c1fa4c0, bb5d57f,
a81ce4b, 478d6b9, 7b5ce0a (8 commits this session)
Tests: 681 PASS / 0 FAIL / 56 SKIP (requires Rhino runtime)
Build: 0 errors, 0 code warnings
Done (all agent-doable items from the post-health-sweep punchlist):
- Stale GH-metadata test expectations refreshed against actual
component GUIDs (commit 7e709ae earlier same day; suite 665→680).
- Health sweep: build clean, tests green, LFS clean, branch in
sync. Identified 8 improvement items.
- Wiki orchestration files (index.md, health.md, log.md,
audit_trail.jsonl) landed at the wiki root (f34e418).
- Stray untracked items resolved: wiki/papers/equations_and_diagrams/24_granite_scan_citation_network.md
committed (6fb604a); local-only tasks/ duplicate at repo root
removed (canonical copy already tracked under
outputs/2026-05-05/tasks/).
- Quarry → Masonry integration test added; suite 680 → 681 PASS
(c1fa4c0).
- CI workflow .github/workflows/build-and-test.yml lands;
builds Core + EdgeMatching.Core on Windows runners (bb5d57f).
- 62 nullable warnings → 0 by adding #nullable disable to 2
production files + 13 test files per project convention, and
removing the unused bool any in PlyMeshReader.cs (a81ce4b).
- Component icon design brief written; raster art deferred to
human pass (478d6b9).
- Stability solver Phase B closed: defensive
EnsureDefaultSolver() call in GH component + stale TODOs cleared
(7b5ce0a).
- Refreshed outputs/2026-05-14/connection_map/GRASSHOPPER_CONNECTIONS.md
with the post-fix state (add473a).
Files touched (top-level): - wiki/ (4 new orchestration files + updated health.md, log.md, audit_trail.jsonl) - .github/workflows/ (new) - outputs/2026-05-14/connection_map/, outputs/2026-05-15/icon_design/ - Template-General/.../src/Frahan.StonePack.Core/, src/Frahan.StonePack.GH/, tests/Frahan.StonePack.Tests/
Pending (last item on the punchlist):
- HUMAN: Rhino canvas smoke test for the 15 new components — drop
each on a Rhino 8 canvas, walk through the four canonical workflows
in outputs/2026-05-14/connection_map/GRASSHOPPER_CONNECTIONS.md §3,
append the result to a wiki/algorithms/<topic>/validation_log.md
entry, tag the commit, snapshot to checkpoints/<tag>/. Tracked as
P1 in wiki/health.md.
Open (post-session improvements): - P2 component icons (PNG drop, code path documented). - P2 IPOPT P/Invoke (Phase C) for the stability solver. - P2 Full-solution CI (requires RhinoCommon NuGet migration).
2026-05-14 — Layer 7 + GeoCut + GeoPack v0 + Quarry→Masonry bridge¶
Agent: claude_cloud (Opus 4.7, 1M ctx)
Branch: docs/frahan-autonomous-nightshift
Commits: 7e709ae
Done:
- New Frahan.Masonry.Quarry.CutOpt namespace: BenchBlock,
QuarryInventory, BlockYieldEstimator, ExtractionOrderOptimizer,
SawBedScheduler, QuarryReportBuilder, BenchBlockSlabBuilder.
- New Frahan.Masonry.Quarry.Ingestion: GprRadargram + reader,
GeoFractNetFracture + reader.
- New Frahan.Masonry.Quarry.GeoCut: SlabPlan, SlabYieldOptimizer,
BilletCutter (spec 09 slice).
- New Frahan.Masonry.Quarry.GeoPack: CrackGraph, BlockGraph,
BlockCandidate, builders (spec 08 v0, manual input).
- BlockCutOptSolver.SolveAndExtract — returns the winning OBB list.
- BestFitInventoryPacker rubble path fixed (per-course height bins).
- AshlarPack / BestFitPack: optional Start Plane + Display Transform.
- 15 new GH components, stable new GUIDs.
- 17 new tests; suite from 656 → 673 PASS at end of day.
- Docs: FRAHAN_PIPELINE_MAP.md, GRASSHOPPER_CONNECTIONS.md.
Files touched (top-level): - Template-General/outputs/2026-05-01/frahan_stonepack/src/ - Template-General/outputs/2026-05-01/frahan_stonepack/tests/ - outputs/2026-05-14/connection_map/
Next: - Refresh stale GH-metadata tests (deferred to 2026-05-15). - Visual canvas validation (truth criterion (c)) on the new components.
2026-05-08 — Zhang 2024 parity + module README¶
Agent: claude_cloud (assumed; recorded from git log)
Branch: docs/frahan-autonomous-nightshift
Commits: c36fcf3, 2e165b6, 8869ab3, 5d8351a, 5d7e4dd
Done: - BlockCutOpt I14 + Zhang cut-code parity: CompositeBlock + algebraic store + helpers. - BlockCutOpt module README at module root. - Zhang 2024 vs Frahan v2 gap analysis + build-out plan. - Zhang 2024 cut-code distillation + cross-validation plan. - Email draft for Porsani 2006 granite data.
(Earlier history available via git log --oneline and the spec
section "Roadmap and timeline" in wiki/specs/17_….)
2026-06-04 (autonomous nightshift + morning)¶
Promoted nightshift deliverables to wiki (HITL-approved mapping): workflow+architecture study -> specs/03_frahan_workflows_spec.md; 15 workflow SLM spines -> research/slm_spines/; 10 algorithm gap-spines -> research/slm_cards/ (now 20 cards, full workflow coverage, unified _INDEX); plugin-wide interdisciplinary ROSES -> research/roses_synthesis/ROSES_plugin_wide_review.md; quarry->monument/building evolved workflow -> fabrication_workflows/quarry_to_monument.md. Reconciled an R4 duplicate (a new RecenterTransform was reverted; GeometryNumerics already existed + committed 9418bd6). Validated GeometryNumerics in the real Rhino runtime via MCP (run_csharp on slot armadillo): 5/5 PASS incl. the T6 int64-overflow guard. A1-A5 validation fixtures re-baked in metres. Checkpoint/handoff automation (hooks) installed in settings.local.json. Drafts + generators remain under outputs/2026-06-04/nightshift/.