Firmament is a deterministic DSL for generating CAD geometry (STEP AP242) via Aetheris.
- primitives and booleans:
box,cylinder,sphere,add,subtract,intersect - placement with
place.onanchors andoffset[3] - validation ops:
expect_exists,expect_selectable,expect_manifold - schema-aware CNC minimum tool radius validation
- deterministic canonical formatting for supported
.firmamentsource - STEP AP242 export for the current single-body golden path
- assembly runtime via
.firmasm(asm exec) and bounded per-instance roundtrip export (asm export)
Open the example at testdata/firmament/examples/box_with_hole.firmament.
Then run the demo-oriented helper test:
export PATH="$HOME/.dotnet:$PATH"
dotnet test Aetheris.Kernel.Firmament.Tests/Aetheris.Kernel.Firmament.Tests.csproj --filter "FullyQualifiedName~FirmamentBuildAndExportTests.Run_BoxWithHoleExample_Writes_Default_Export_Artifact"That flow compiles the example, exports STEP using the current last-successful-body policy, and writes the artifact to:
testdata/firmament/exports/box_with_hole.step
For box_with_hole.firmament, the exported body is currently the deterministic fallback body selected by the existing export contract, so the demo stays behaviorally accurate without changing runtime semantics.
If you want the API entry point instead of the test wrapper, use FirmamentBuildAndExport.Run(string sourcePath) from Aetheris.Kernel.Firmament.
The canonical solution format is Aetheris.slnx for both local and automation workflows. Primary targeting is .NET 10 (net10.0) only; legacy .NET 8 targeting has been removed.
Use the shell script below as the official automation-friendly entrypoint. It runs the canonical solution (Aetheris.slnx) on the sole active framework (net10.0), excludes SlowCorpus by default, and leaves legacy Firmament V1/FrictionLab tests opt-in.
export PATH="$HOME/.dotnet:$PATH"
./scripts/test-all.shIf you need a single project or a smaller local repro, use the project-level commands directly:
export PATH="$HOME/.dotnet:$PATH"
dotnet test Aetheris.Kernel.Firmament.Tests/Aetheris.Kernel.Firmament.Tests.csproj --logger "console;verbosity=minimal"
dotnet test Aetheris.Server.Tests/Aetheris.Server.Tests.csproj --logger "console;verbosity=minimal"
dotnet test Aetheris.Kernel.Core.Tests/Aetheris.Kernel.Core.Tests.csproj --logger "console;verbosity=minimal"If you want the same script with a narrower or broader explicit project list, pass the test projects as arguments:
export PATH="$HOME/.dotnet:$PATH"
DOTNET_BIN=dotnet ./scripts/test-all.sh Aetheris.Kernel.Firmament.Tests/Aetheris.Kernel.Firmament.Tests.csproj Aetheris.Server.Tests/Aetheris.Server.Tests.csprojFor editor/IDE compatibility or solution-wide restore/build flows, use:
export PATH="$HOME/.dotnet:$PATH"
dotnet test Aetheris.slnx -f net10.0 --filter "Category!=SlowCorpus"Use the SlowCorpus category to keep the heavyweight STEP242 NIST audit out of default solution runs. Invoke that corpus explicitly when needed:
export PATH="$HOME/.dotnet:$PATH"
dotnet test Aetheris.slnx -f net10.0 --filter "Category!=SlowCorpus"
dotnet test Aetheris.Kernel.Core.Tests --filter "Category=SlowCorpus"Use Aetheris.slnx as the only solution entrypoint. For legacy Firmament V1/FrictionLab test validation, run AETHERIS_RUN_LEGACY_TESTS=1 dotnet test Aetheris.slnx -f net10.0 or ./scripts/test-legacy.sh. See docs/build-test-policy-net10-and-legacy-v1.md.
- language/compiler/runtime:
Aetheris.Kernel.Firmament/ - examples:
testdata/firmament/examples/ - exported STEP artifacts:
testdata/firmament/exports/
- assembly model and contracts (canonical):
docs/assembly.md - overview:
docs/firmament-overview.md - build/export workflow:
docs/firmament-build-workflow.md - selector contracts:
docs/firmament-selectors.md - demo script:
docs/firmament-demo.md
.firmasmis authoritative for assembly semantics in Aetheris.- STEP is treated as foreign interop input/output.
- Multi-root STEP is assembly-like input and must route through assembly extraction/import, not single-part import.
- Current roundtrip export is intentionally bounded to per-instance STEP +
roundtrip.package.json.
- The repository still contains broader Aetheris server/client scaffolding; the Firmament + CLI paths above are the primary deterministic kernel entry points.