mirror of
https://github.com/bherbruck/solidcraft.git
synced 2026-11-06 20:02:16 +00:00
ffb1e650df33d7dbbeaa6ed32c19fdaec347fffb
110 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
5c45570c91 |
Kernel rig: rustfmt; measured values in results are decimals, within tolerance; the ladder records 06/023 passing
The single results form compares a whole number exactly (a count). The construction and inspect cases gave positions and volumes as whole numbers, which the form they were written for compared within tolerance; they are decimals now. The NPT groove fix makes ladder 06/023 pass: its golden entry is the passing run (51 faces, 8226.4042 mm3). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
014a9eced5 |
Kernel rig: a flat_pattern field grades a sheet metal case's flat pattern
From the script's last sheet.flat_pattern result: the outline's size, its area less the cut-outs', and the bend lines, each matched to its own one of the result's either way round. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
70f695c6ba |
Kernel rig: grade construction geometry and the numbers a command replies with
A case's construction field names construction points, axes and planes with the point, line or plane each must be, and results reads values out of the commands' own replies by JSON pointer. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
bc3c9185cd |
Kernel rig: grade the kinds of a result's surfaces, its B-spline degrees and spans, and its free edges
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
235645db50 |
Kernel rig: the ellipse length's Simpson weights as a named step
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
45c9553262 |
Kernel rig: a case can check the files it writes and the commands' answers
A case's expected.json may name files written to $OUT (json, csv rows, or a DXF's entity counts and curve lengths per layer) and a command's answer by step, each matched as a part of what was made. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
e0c7867b9b |
run_strict: the box's volume to 1e-9, as SMLib integrates it
allow_errors_writes_anyway_and_a_saved_design_keeps_failing compared the box's volume with 4000.0 to the bit, which the old kernel's closed-form planar volume gave. SMLib integrates mass properties numerically (relative accuracy 1e-4 asked for) and gives the 20 x 20 x 10 box within a unit or two in the last place (3999.999999999999), the correct answer to the precision the measure has. The test now checks 4000 mm³ to a relative 1e-9. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
39bf63b16a |
Kernel rig: designed continuity cases, G0 to G4, that prove the measurement
A new `continuity` area: seams whose order is certain by construction, each graded `exact` (reads its order and not the next) at picked edges with Continuity Analysis's default stations and tolerances: a box's crease (g0), a chamfer in place of a round (g0), an r5 round on planes (g1), and a profile closed by a g1, g2, g3 or g4 blend curve between lines, extruded (g1 … g4). `continuity.edges` may now be a list of points, picked as `inspect.continuity` picks them, and `continuity.exact` asks for the order and no more. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
c37b0d2f02 |
Kernel rig: a case's expected continuity order at its blend seams
expected.json may give `continuity: {order: g0…g4, edges?: "blend" | "corner"}`: the
seams of each round, chamfer face or corner patch with the faces either side of the edge it
replaced, and of each corner patch with its rounds, are measured as Continuity Analysis
measures them (seam_diagnostics at its default 33 stations and default tolerances), and the
case fails naming the worst seam, its faces, the order it reaches and the next order's worst
value. The seams come from the faces' persistent names (doc::naming::blend_seams). The older
`{near, within_mm, …}` form is kept.
Every fillet-area case with a body gets its order: constant rounds and rolling corners g1,
curvature rounds g2, chamfers g0, the corner: g2 patch g2 at its seams.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
||
|
|
97721ad05f |
Fillet setbacks not past where the rounds meet are refused naming the least; the rig grades a refusal by its reason
A corner setback must reach past where the corner's rounds' contact lines meet without one (smlib_blend_setback); short of it SMLib failed with its own status (1001). The kernel now refuses it before SMLib runs, for the rolling-ball corner (fillet_setback) and the curvature corner (fillet_g2_corners) alike, naming the least: on each face at a corner of planar faces and straight edges the two rails, r tan(psi/2) from their edges, cross (d2 + d1 cos alpha) / sin alpha along an edge (r on faces square to each other). Other corners stay SMLib's to refuse. The rig's `refused` cases now name the reason (`refusal`, a part of the message, required), so a failure for another reason no longer passes; a `solid_or_refused` case may name one. Fillets: the setback cases and 783, 3435 pass; 1390, 896, 4782 past-a-full-round and the no-tangent-chain case are refused for an unclear reason and fail. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
2fed39c85c |
Continuity Analysis measures G3 and G4; the dialogs offer what each construction builds
Each seam now also reports the jump of the curvature's arc-length derivative across it (G3) and of its second derivative (G4), both from the faces' exact partials, and its order: the highest one every station meets within the tolerances (two new tolerances, defaults in the kernel). The verdict keeps its meaning (smooth is G2 or better). inspect.continuity replies with the new metrics, each seam's order and a count per order; the viewport widens G3 and G4 seams, the legend and the marker labels name every order in words. The Patch, Blend and Boundary rows offer the orders the kernel's Construction table says they build. G4's words in en, ar, de, he, ja, ko and zh. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
77bd85cabf |
cli: snapshot --quality coarse|normal|fine|ultra meshes the bodies at that display quality
As the app's Display Quality setting, set before the design opens so every display plan is made at it; a level that isn't one is refused with the levels. For close-up reviews of imported faces. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
8fbb575a5e |
kernel-cases: a continuity check, and ladder 07/015 graded by it
expected.json `continuity`: over the tangent seams wholly within `within_mm` of `near`, the curvature jump across them (exact surfaces, 65 stations a seam) at most `curvature_jump_per_mm` clear (`clear_mm` along the seam) of the vertices where two of them turn, where a neighbour's own G1 seam ends. 07/015, the box corner's three r5 rounds with corner: g2: one valid body of 10 faces within the box, its patch's twelve seams jumping at most 1e-3 per mm clear of the hole's six corners by 1.2 mm (2.7e-4 measured; the ball corner of 009 jumps 0.2). Its golden entry is the passing run's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
9cd655259d |
Profiler: commands, feature evaluation, io; diagnostics.profile; CLI --profile
- Session::execute is a command span; Model::evaluate and each feature computed (by its type) are spans; io's import, export and design read/write too; the STEP reader's topology, pcurves and solid record. - diagnostics.profile (contract + output schema): report, start/stop, reset, Chrome trace file. - A STEP/IGES import's reply carries its own profile while recording. - Every app compiles the profiler in by default (feature `profile`); SOLIDCRAFT_PROFILE=1 starts it. - solidcraft-cli run/eval/bench-open --profile print the table on stderr, --profile-out writes the trace; run --profile works on designs and STEP files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
4e26dc6402 |
The command line and the web app link SMLib by default too
As the desktop app: SMLib is the only kernel, so a build without it models nothing. The web app links the prebuilt wasm archive, so it needs no wasi-sdk. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HoZgkCdAVrscuw2kjQTWDs |
||
|
|
9138e87040 |
Rebase onto main: what the merged code needs to build together
The branch rebased onto main keeps each of its commits; where both sides changed the same code, these are the pieces neither side's commit had. - Cargo: one [features] table in the CLI's manifest (two met in the merge). - geom: a NURBS surface's `closed` set once in a placed copy (both sides added it). - kernel: the whole-face extrude tools (#2040) work around truck's boolean on truck types, which left the workspace with the SMLib kernel; the module, its tests and the doc crate's tool and tests go. The display planner's flat fill (tess/fallback.rs) has no caller with the schema 4 mesher, and the tessellator's seam and uv modules are the branch's. A body's boundary tolerance from a STEP file belongs to the truck body the schema 4 record replaced: `with_boundary_tol` goes. `unmeshed_faces` counts the coarse mesh as the branch does. A loft's section re-split passes the lead's perimeter shares to main's `resample` (a circle breaks there when the matched corners do not go round in order). Main's tests of the mesh-based measure (the SMLib kernel measures exactly) and of the IGES preprocessor name (no such field on the branch's import record) go. - doc: a feature result carries no boolean diagnostics on the branch, so the model cache neither writes nor reads them, and a pattern copy's miss test runs the intersect as it is. A placed body's worker result is a Result: a body taken from the previous placement is Ok. A thread's clipboard remap takes main's arguments, the tapped catalogue names a metric size by ThreadForm::Metric, and main's tests unwrap the placing calls that return their error. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
369c897d85 |
kernel, cli: clippy and the cli tests build again
prism.rs's sheet regions import Surface and Vec3 only where they are built (the smlib feature), so the kernel without it has no unused imports; the cli's tests that measure meshes at their own tolerance depend on solidcraft-kernel. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017itGh5fpMEousnZ91cYcVt |
||
|
|
9a79588575 |
doc, engine, ui: placing the model returns its error; placements are checked where they are set
doc: world_state, world_state_reusing, state_in_frame_at, state_in_frame, face_point_state, face_point_names and construction_state return Result. A body that could not be placed, a frame that could not be inverted, a sketch plane or thread axis that did not survive the placement, or a failed placing worker used to leave things where they were without a word; now the call fails with what could not be placed. is_placement is the one test of an occurrence's placement (finite, a rotation that does not mirror, a translation within 1e9 mm). Opening a design names every occurrence that fails it; add_occurrence refuses one; a joint solution that would place an occurrence outside one is not applied and the joints placing it report it. engine: Session::world_state returns Result and keeps a failure in its cache as it keeps a placed model. bounds, home_camera, open_sketch_plane, the scene builders, the world previews, frames::to_local and auto_operation pass the error on; helpers answering "not found" take the placed model from their caller. Commands setting a placement check it (valid_position, exploded view, fastener at a point, STEP insert matrix). ui: panels, picks and hovers read the session's placed model through open_meshing::session_world; a model that cannot be placed shows no placed bodies, and the viewport says why across its bottom. Pictures and the control channel report the error. cli, mcp: snapshots, renders, benches and the oracle report the error; the kernel-case rig records it as the case's failure. Tests read the new Results with unwrap. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017itGh5fpMEousnZ91cYcVt |
||
|
|
af4e97b648 |
cli: the rig and the oracle reach MeshTolerance through the engine
solidcraft-cli depends on the engine, not the kernel: solidcraft_kernel::MeshTolerance did not resolve; it is solidcraft_engine::kernel::MeshTolerance. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017itGh5fpMEousnZ91cYcVt |
||
|
|
712caf8bf4 |
engine: no boolean retries to report; overlaps are SMLib's exact intersection
The kernel has no boolean retries now, nor their diagnostics (capture_boolean_diagnostics, BooleanDiagnostics, BooleanStrategy), nor the near-coaxial crescent (coaxial_overlap, coaxial_candidate, with_attempt_budget). What read them goes: - doc: FeatureResult and the evaluation cache carry no boolean diagnostics, and no "Boolean retry" warning; the saved model no longer writes them (an older file's are ignored); - engine: timeline.inspect / feature inspection drop `boolean_diagnostics`; fuzz runs and the CLI fuzz summary drop their retry counts; - inspect.interference: each pair is the bodies' Intersect, measured; the near-coaxial crescent, the by-piece intersection of bodies in several pieces and the unverified notes go (the command's doc no longer lists near_coaxial); - inspect.clearance: an overlap is the bodies' Intersect, measured near its region; the pin tries, the cut-down copies of large bodies (clipped, narrowed), the union cross-check (union_disagrees, contradicted) and the malformed-part check (plausible) go, and the measure near the origin passes its move's error on. Tests: the retry test and the unit tests of the deleted checks are removed; the barrel join test (tests/boolean_diagnostics.rs, now tests/barrel_join.rs) keeps its geometry checks; the pin-in-bushing test expects the filleted case measured; assertions on empty diagnostics and on near_coaxial are dropped; the corpus fixtures lose the diagnostics key and the one retry warning. (not built: base in progress) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017itGh5fpMEousnZ91cYcVt |
||
|
|
1ecf00b5ac |
engine: feature replies carry no boolean diagnostics
doc's FeatureResult has no boolean_diagnostics any more (truck's Boolean
retry reports, gone with truck; SMLib's boolean has no retries). The
timeline.inspect and doc.inspect replies drop the key.
Tests of the removed reports: tests/boolean_diagnostics.rs is deleted (it
checked truck's retry events and their survival through the cache, undo and
reopen); the assertions that a feature's report had no events go from
features_more_tests, patterns_tests, hole_face_tests and tests/rim_cut (the
rest of each test stays). The CLI corpus's expected replies
(move-bodies, issue-489-stacked-join, issue-616-lid-ribs) drop the key; the
issue-616 one listed a planar_fallback event. docs/robustness.md: its
section on retries becomes one on SMLib's booleans, which have none.
Left to the blends work: engine fuzz.rs (its retry-event counts) and
clearance/interference (capture_boolean_diagnostics, coaxial_overlap,
with_attempt_budget).
Not built: base in progress (kernel-smlib/no-truck
|
||
|
|
001c62ab16 |
kernel-cases: the rig runs SMLib only and keeps each run's SMLib dumps
SMLib is the only kernel now. cargo xtask kernel-cases ran every case once per kernel asked for (--kernel default|smlib|both), setting SOLIDCRAFT_KERNEL per run, and wrote a column per kernel; solidcraft-cli no longer reads that variable. The rig and the ladder run each case once, through solidcraft-cli built with --features smlib (cargo run passes it), and report one result per case: --kernel and the env var are gone. Each run has an output folder (--out, default target/kernel-cases, target/kernel-ladder for the ladder) holding results.json (every case's full result, which --results used to write on request) and dumps/<area>-<case>/: every case runs with solidcraft-cli kernel-cases --dumps=<out>/dumps, so a failed SMLib call leaves its inputs for replay. The ladder's golden holds one entry per case: golden.json is the last recording's smlib entries, which predate SMLib running every case (its reason says so); record it again after the first SMLib-only run. docs/kernel-cases.md (until the next run regenerates it), tests/kernel-cases/README.md, docs/kernel-smlib-sweeps-shell.md (its truck column and comparisons dropped), xtask's and solidcraft-cli's usage text: one kernel. Nothing was run. clippy -p xtask --all-targets: clean. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017itGh5fpMEousnZ91cYcVt |
||
|
|
beebf22032 |
kernel-cases: --dumps=DIR leaves each failing SMLib call's inputs for replay
A rig case whose SMLib call fails left nothing to replay it from: nothing called solidcraft_smlib::set_dump_dir. `solidcraft-cli kernel-cases --dumps=DIR` now points SMLib's dump folder at DIR/<area>-<case> before each case runs, so a failing call leaves its arguments and B-reps there (smlib_brep_read reads them back into a scratch C program), and turns it off after the run. Off without the flag. The kernel exposes it as smlib_dump_dir, beside smlib_built (the CLI reaches SMLib only through the kernel). (not built: base in progress) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017itGh5fpMEousnZ91cYcVt |
||
|
|
166ebe2ee9 |
The truck crates leave the workspace; the rig and threads run on SMLib alone
truck-modeling, -topology, -shapeops, -stepio and the vendored truck-geometry, -meshalgo, -shapeops, -stepio and matext4cgmath (with their attribution rows and vendor notes) are removed. The kernel-cases runner has one kernel, SMLib, and no build-mismatch check; a modelled thread is cut by SMLib's exact screw-swept groove (the faceted groove path is gone). (not built: base in progress) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017itGh5fpMEousnZ91cYcVt |
||
|
|
42997a62ed |
WIP kernel: Body::mesh(&MeshTolerance) as the one mesher (does not build yet)
Body::mesh / mesh_plan / mesh_of and MeshTolerance (chord, display, display_of, export_of) replace tessellate, tessellate_with, display_mesh*, display_plan*, reference_display_mesh_angular; every caller in kernel, doc, engine, io, ui-egui, gpu and the CLI renamed mechanically; the truck-mesher fallback, mesh_shells*, refined* removed; Body::new orients from the planner; truck-meshalgo dropped from Cargo.toml with the tests of its hooks. Still to fix: trait imports in tess/*, splitface/lumps/preview/step_in/boolean_record meshalgo uses, measure. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017itGh5fpMEousnZ91cYcVt |
||
|
|
e1a2571696 |
kernel-cases: SOLIDCRAFT_KERNEL=truck grades as the default kernel
The kernel accepts `truck` (as well as unset) for its truck backend, and `boolean_kernel()` reports that backend as `default`. The rig compared the raw setting with that name, so a run with SOLIDCRAFT_KERNEL=truck reported every case as "this build runs booleans on the default kernel, not truck" instead of grading it. The rig now names unset, empty and `truck` alike as `default`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017itGh5fpMEousnZ91cYcVt |
||
|
|
d672cfa013 |
kernel: one switch, SOLIDCRAFT_KERNEL, picks the kernel for every operation
All operations move to SMLib at once, so the selector is no longer the booleans' own: `SOLIDCRAFT_KERNEL=smlib|truck` (read once, unset is truck, the same refusals for an unknown value or SMLib in a build without it) is answered by `solidcraft_kernel::backend()` (crates/kernel/src/backend.rs), which every operation's dispatch calls. The boolean's SMLib path moves to smlib_boolean.rs. The regression rig's kernel check (`boolean_kernel`) now answers from the switch, and the rig and CLI set SOLIDCRAFT_KERNEL. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QWhMwdqJYQKQq8RCLSL1LT |
||
|
|
8cb976b9b2 |
kernel-cases: watertight checks the display mesh, welding vertices by distance
Two faults made simple curved solids look open (#818's blind hole: 80 open edges, a stadium slot: 52): - It meshed with `refine`, the measuring mesh, which splits triangles across curved faces on their own and leaves T-junctions on the edges they share with neighbours. It now checks the display mesh, whose faces share each edge's points. - It matched vertices by rounding to a 1e-6 mm grid, which splits points a rounding error apart across a cell boundary. It now joins vertices closer than `tolerance.weld_mm` (default 1e-4 mm). Both cases now have 0 open edges, also with the weld at 1e-6 mm. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
58ce14f45f |
kernel-cases: count ranges, a watertight mesh check, and per-case timeouts
For the history areas' cases (threads, tessellation): - A count may be an inclusive range `[min, max]`, where the geometry only bounds it (a modelled thread's faces). - `"watertight": true` meshes each body (chord tolerance `tolerance.mesh_mm`, default 0.01 mm) and requires no open and no over-shared edges, with vertices matched by position. - `"timeout_s"` gives a case longer than the run's timeout, at most 30 min. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
35ebc816ba |
kernel-cases: a missing capability's message is the case's own text
The report already says "not supported yet" for the status; the error repeated it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QWhMwdqJYQKQq8RCLSL1LT |
||
|
|
bf0761f6b9 |
kernel-cases: base recipes, missing capabilities, and the commands' own time
What the complexity ladder needs from the rig's case runner, kept in the one runner: - A script may name a `base` case directory: that case's commands (and its own base's, up to 32 deep) run first, so a ladder case starts from the previous tier's finished part without copying its commands. `$CASE` is each recipe's own directory; `$OUT` is the running case's scratch directory, in its bases too. - `missing` in expected.json reports the case as not supported yet without running it: a capability with no command or parameter (multi-start threads, fillet setbacks) stays visible instead of being faked with a stand-in. - Each result carries `seconds` (the commands' own time, without process start or grading) and `measured` (body count, face/edge/vertex counts, volume, area), for the ladder's golden. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QWhMwdqJYQKQq8RCLSL1LT |
||
|
|
c24b066d25 |
kernel-cases: an outcome for geometry with no single manifold answer
`"outcome": "solid_or_refused"` takes a clean refusal, or else grades the result as usual. Two bodies that touch along a circle only (#168, #3841) have no one-solid union: a refusal or the two bodies left apart are both right; fusing them is wrong. The two cases said opposite things (two bodies, a refusal) and now agree. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
678a70da2c |
kernel-cases: shells as a graded count, no SMLib verdict where it can't take the record, $OUT
- `"shells": N` in expected.json grades the total number of shells: a body with a sealed void holds two, and some joins keep several lumps in one body. Those cases (#3175, #3455, #3526, #3730) are graded on validity again instead of being marked not valid. - When SMLib's record conversion says "not supported yet" (revolved surfaces, traced intersection curves), its check gives no verdict. That's shown but not graded, since it isn't a fault of the body. solidcraft_kernel::SmlibCheck carries the three outcomes. - `$OUT` in a recipe is a scratch directory outside the repository, for files a case writes. The two STEP-export crash cases write there instead of /tmp. - cargo xtask kernel-cases --results FILE keeps every result as JSON. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
7bb74d1c6b |
kernel-cases: an smlib feature for the CLI, and no grading of a kernel the build isn't running
- solidcraft-cli and solidcraft-engine forward an `smlib` feature to solidcraft-kernel/smlib, so `cargo build -p solidcraft-cli --features smlib` gives the rig SMLib's check. - solidcraft_kernel::boolean_kernel() says which kernel this process runs booleans on. `default` until the SMLib switch (SOLIDCRAFT_BOOLEANS=smlib) lands and answers there. An smlib run on a build without the switch reports "not supported yet" instead of grading the default kernel under SMLib's name. - An area may keep its skipped list in parts (skipped-<part>.json). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
732fd2ace2 |
kernel-cases: a regression rig that grades each kernel against the case's own answer
Every geometry case the old kernel got wrong becomes tests/kernel-cases/<area>/<id>/: an engine script or oracle recipe, and expected.json with the right answer, from analysis or a hand calculation, or else the invariants. Never a kernel's output. - solidcraft-cli kernel-cases <dir>...: runs a case and grades it. The checks are the outcome (succeeds, or refuses cleanly), the body count, and one closed shell per body that passes the record's structure and geometry checks and, with SMLib built, SMLib's check(All). Counts, volume, area, centroid and box are graded where the case gives them. Each run is pass, fail, not supported yet or crash. - cargo xtask kernel-cases [--kernel default|smlib|both]: one process per case, so a native crash or a hang (--timeout) is that case's result. It writes docs/kernel-cases.md: coverage per area and source, results per kernel, and the sources looked at and skipped (<area>/skipped.json). - solidcraft_kernel::validity and smlib_built, which the rig's checks use. tests/kernel-cases/README.md gives the format. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
a8c8f88323 |
naming: list removed lines before added ones in the corpus diff
A failure now reads as a diff does: the recorded line (-) and then the line the rebuild gives (+), and the message says which is which. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QWhMwdqJYQKQq8RCLSL1LT |
||
|
|
a55196e7ad |
naming: the corpus rebuilds with the same names and references
A test over every design the repository keeps (the action matrix's corpus: old design files, examples, regressions, demo and typical designs, the oracle recipes; plus the sample designs, the engine's design fixtures and the older designs of the hole matrix, taper and projection tests: 154 designs). Each is rebuilt and recorded in tests/naming/<group>/<design>.txt: per body the names of its faces and edges with whether each follows exact history, and every stored name (feature face picks, fillet/chamfer/bend edges, sheet metal edges, the face a sketch is attached to) with the face or edge it finds now. A difference fails with the design and the changed lines; record an intended change with NAMING_CORPUS_BLESS=1, as FEATURE_WALK_BLESS does. Face and edge indices are left out on purpose. They are the kernel's order: truck already gives a fillet's or a boolean's faces in another order from one process to the next (oracle 07 and 37 changed on every run), and SMLib will order them differently again, while what must not change is the names and what references find. Names are listed sorted. One design's names themselves change between runs on truck (closed_sweep_torus_cut: level wall halves numbered #1/#2 in kernel face order); it is listed in UNSTABLE with the reason and its difference printed instead of failed on. Records made on this branch (truck), macOS. The whole corpus builds in about 20 s on 14 cores (designs run side by side). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QWhMwdqJYQKQq8RCLSL1LT |
||
|
|
a7c1909766 |
CLI: evaluate scripts on the input design (#6861) (#6872)
* claim: #6861 eval scripts on input designs * fix(cli): evaluate scripts on the input design (#6861) * fix(cli): validate eval options before opening inputs Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
03bf992bc1 |
Keep linked components valid through Undo after Save As (#6860) (#6877)
* claim: #6860 * fix: preserve linked component targets across Save As history (#6860) |
||
|
|
189b47c750 | Chamfer and Fillet refuse a point where several edges meet (#5173) (#5177) | ||
|
|
b3cbbe7bd5 |
CLI: reject incomplete and unsupported run/eval options (#6918) (#6919)
* claim: #6918 validate run and eval options * fix(cli): reject invalid run and eval options (#6918) |
||
|
|
dfde1e032d |
mcp setup: add SolidCraft to the AI clients on this computer; plain mcp finds a late app (#6379)
solidcraft-cli mcp setup (alias install) and Help > Connect AI assistants edit each installed client's own configuration in place, with this program's absolute path: OpenCode, Claude Desktop, Claude Code, Cursor, Codex, Gemini CLI, Copilot CLI, Windsurf, Zed and VS Code. Only the solidcraft entries change; a stale path is refreshed and an entry the user changed is left alone. Plain mcp keeps looking for the app while its headless session has no work, and says on every tool result that it is headless when the app was not found. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
0520910bfd |
Control: name the token file and spot a stale one when a call is unauthorized (#4664) (#4670)
* claim: #4664 * Control: name the token file and spot a stale one when a call is unauthorized (#4664) When the app refuses a token that the MCP client read from a token file, the error now names that file, when it was written and how long ago, without printing the token. The app also writes `<port>.pid` beside the token file (its process id and, on Linux, its start time) and removes both at exit; when that process has exited, the error says the token file is stale. The process check runs only after a refusal, and the token file itself stays one line, so existing clients keep working. Document force-quit leftovers and the MSIX AppData redirection. * Bench assistant: read the token out of the new ClientToken Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> --------- Co-authored-by: bherbruck <brennen.herbruck@gmail.com> Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> |
||
|
|
9e6e0b8df1 |
Render workspace: complete experimental ribbon, resources and effects integration (#5493) (#5494)
* wip(render): reconcile completed material and image pipeline source with 0.20 (#5493) Source-only integration reference for staged review, not a merge-ready aggregate. Donor: 0xlillith/solidcraft@aea20b0115. Upstream: |
||
|
|
b7b25f9e2b |
Render workspace: first basic delivery to main (#6050)
* Normalize UI container violation paths across platforms (#5599) Report repository-relative paths with forward slashes so diagnostics and the existing nested-package regression assertions agree on Windows and Unix. Keep the container detection rules unchanged. Validation: official ui-containers gate and all seven focused xtask tests passed; rustfmt and diff checks passed. Only xtask/dependencies were compiled; no application build or heavy tests. (cherry picked from commit |
||
|
|
5e0e7a4c6a |
CLI: --help on each subcommand prints its usage and exits 0 (#4538) (#4545)
* claim: #4538 * CLI: --help on each subcommand prints its usage and exits 0 (#4538) Every command now answers `--help` and `-h` with its own usage on stdout and exit 0, the way the top level has since #1828. Before, each subcommand answered differently: `fuzz --help` started a fuzz run with the default seeds and ran until it was stopped, `recipe --help` took the flag for a file name, and `snapshot`, `render`, `oracle`, `run`, `eval`, `script` and `crashes` answered with an error on stderr and exit 1. The help is read before the command runs, so `--help` never starts work: no fuzz run, no MCP server, no file read. `fuzz` also refuses an argument it doesn't take, as `snapshot` already did: a flag it doesn't know and a stray word are errors, not arguments to ignore while a hundred seeds run. The usage lives in one place now: each command's lines are a constant, and the top-level usage is composed from them, so the two cannot drift apart. The top-level usage is unchanged, byte for byte. # Conflicts: # apps/solidcraft-cli/src/main.rs |
||
|
|
0dffb206b1 |
Assembly: ground the first part; drag free joint chains (#2804) (#2805)
* assembly(feat): ground first parts and drag free joint chains Ground the first top-level part when it is created and let face dragging reposition free occurrences or any member of a floating joint chain in one undo step. Preserve exact repeated-placement frames, joint values, modifier selection and Escape cancellation. Keep the accumulated fixture, viewport layout and documentation integration fixes from the existing PR. Signed-off-by: Karl Von Richter<karl@embeint.com> * assembly(fix): update movable fixtures for first-part grounding Accept the documented grounded override in component creation, explicitly free movement fixtures, and keep linked clipboard pastes movable even in an empty document. Cover first and reused linked pastes, default insertion grounding, and single-step undo in the existing link tests. Signed-off-by: Karl Von Richter<karl@embeint.com> * assembly(test): keep the motion-cost crank free Unground the first component in the document-level joint-face measurement fixture so its motion samples can rotate after first-part grounding. Preserve the rotation and shared-measurement assertions that caught the Linux CI failure. Signed-off-by: Karl Von Richter<karl@embeint.com> * assembly(test): free the frame placement fixture Create the frame-member placement fixture ungrounded before moving it above its root sketch. Keep its world-space member assertions while respecting first-part grounding in the frame tests added on main. Signed-off-by: Karl Von Richter<karl@embeint.com> --------- Signed-off-by: Karl Von Richter<karl@embeint.com> |
||
|
|
98c4f335e8 |
Control channel and MCP on by default, with a setting to turn it off (#5561)
The app opens its localhost control channel on port 27878 (or the next free one) unless Preferences > Assistant turns it off; --control and SOLIDCRAFT_CONTROL_PORT still win. A current.port discovery file lets solidcraft-cli mcp find the running app with no arguments. Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> |
||
|
|
e33c371e99 |
Model cache: thin the checkpoints of a design too big for its file instead of leaving the cache out (#3220) (#4882)
* claim: #3220 * Model cache: keep fewer states of a design too big for its file instead of none (#3220) A model cache over the container's budget keeps the final state, then the slowest features' states while the bodies they add fit (a body several states hold counts once), and is left out only when not even the final state fits. Opening evaluates just the features whose state the file left out, each from the state before it, so the model is whole afterwards. * Model cache: keep each encoded body apart, copy only what a cache stores Encoding a model too big for its file no longer copies every distinct body into one buffer before thinning: the payload is copied from the encodings once its size fits, so saving holds no more than before. * Model cache tests: canonical runs in the timeline fixture; rustfmt * Model cache: count the records a thinned cache keeps; always try the final state Thinning counted only the bodies, so a model of many copies of one part (records, not bodies, filling the room) shrank its budget to nothing and saved no cache although its final state fitted. The choice now counts the records of what it keeps, always keeps the final state, and says what it counted, so each retry keeps less and the final state alone is always tried. * docs: a thinned model cache counts its records and always tries the final state * Model cache test: the slowest feature's state holds bodies 16 to 23 * Model cache: thinned opens with fingerprints that read the state before a feature Since #3397 a feature's fingerprint reads where the bodies before it lie. After a state the file left out, adopt takes the saved fingerprint and the evaluation that works the state out checks it. A result evaluated ahead is never taken as one the file left out. The thinned round trips include the placed components' design, whose cut reads those placements. --------- Co-authored-by: MateuszSychXpl <151755914+MateuszSychXpl@users.noreply.github.com> |
||
|
|
dad28abecf |
solidcraft-cli bench-assistant: the standard Assistant model test (#4851) (#4930)
* claim: #4851 * solidcraft-cli bench-assistant: the standard Assistant model test Runs the eleven v1 tasks of #4851 against a desktop app that is already running with a control port. Each task starts a new design and a new chat with All permissions, runs only the prescribed setup, sends the prompt once and waits for the turn. The result is checked on the design (document.inspect with measurements): body count, volume within 1% (0.3% for the fillet), bounding-box size in any orientation, the lowest corner, the body name, live feature kinds, and changed or unchanged content; the volume question is checked on the reply. Failures get the issue's categories from the conversation's items. Prints a table, and writes the issue's comment template (--markdown) and the raw results with each conversation (--json). |