docs: own test corpus built with SolidCraft, icons made with VectorCraft (#2)

Owner decisions 2026-10-13: no public CAD datasets (Thingi10K included); test parts are
SolidCraft recipes and analytic shapes. Icons are VectorCraft artwork with the editable
source committed; cargo xtask assets now also requires .vectorcraft and .solidcraft files
to be attributed. AGENTS.md: GitHub CI runs the full gate, commit after each working step.


Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm

Co-authored-by: jyviko <2501648+jyviko@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
authored and GitHub committed 2026-10-13 14:18:46 -04:00
1 parent e7f5c83b49
commit 4abfa0845b
4 files changed
+38 -8

No files matched your search

+10 -3
View File
@@ -58,9 +58,14 @@ People trust ModelCraft with their models; a crash loses their work. **This outr
sources. Permissively licensed code (MIT, BSD, Apache-2.0, MPL-2.0) may be read for reference; sources. Permissively licensed code (MIT, BSD, Apache-2.0, MPL-2.0) may be read for reference;
anything adapted is noted in ATTRIBUTION.md with its licence. anything adapted is noted in ATTRIBUTION.md with its licence.
- **Assets — absolutely essential.** ModelCraft contains **no iconography, images, fonts or - **Assets — absolutely essential.** ModelCraft contains **no iconography, images, fonts or
artwork from commercial CAE products — ever.** Icons are drawn in code. Any file asset must be artwork from commercial CAE products — ever.** Icons are original artwork made with VectorCraft:
commit the editable `.vectorcraft` source beside the exported SVG/PNG. Any file asset must be
original or openly licensed and **must have a row in ATTRIBUTION.md** (`cargo xtask assets` original or openly licensed and **must have a row in ATTRIBUTION.md** (`cargo xtask assets`
enforces it). Screenshots of commercial software are never committed. enforces it). Screenshots of commercial software are never committed.
- **Test geometry is our own.** Meshing and solver test parts are built with SolidCraft and
committed as recipes (scripts or designs) that regenerate them; analytic shapes are generated in
code. No public CAD datasets (ABC, MAMBO, Thingi10K, GrabCAD) and nothing made in a commercial
CAD or CAE product.
- **Everything is a command.** User-visible behaviour = a command in `crates/engine/src/cmd/*` - **Everything is a command.** User-visible behaviour = a command in `crates/engine/src/cmd/*`
(`CommandSpec`: our own dotted, lower-case id `<area>.<thing>[.<variant>]` such as (`CommandSpec`: our own dotted, lower-case id `<area>.<thing>[.<variant>]` such as
`mesh.node.add` or `mesh.tet.generate`, never another product's keyword; label; params doc; `mesh.node.add` or `mesh.tet.generate`, never another product's keyword; label; params doc;
@@ -78,8 +83,10 @@ People trust ModelCraft with their models; a crash loses their work. **This outr
MPa); geometry from SolidCraft is in millimetres. Z is up. MPa); geometry from SolidCraft is in millimetres. Z is up.
- **Rust only.** **Never break wasm**: everything below the apps builds for - **Rust only.** **Never break wasm**: everything below the apps builds for
`wasm32-unknown-unknown` (`cargo xtask wasm`, part of `cargo xtask ci`). `wasm32-unknown-unknown` (`cargo xtask wasm`, part of `cargo xtask ci`).
- **Quality gates** before every commit: `cargo xtask ci` (fmt, assets, licences, layers, clippy - **Quality gates:** GitHub CI runs `cargo xtask ci` (fmt, assets, licences, layers, clippy -D
-D warnings, tests, wasm). warnings, tests, wasm) on every PR; don't run the full gate locally. Before pushing: `cargo fmt
--all`, `cargo check` the touched crates, and run the tests you added or changed. Commit after
each working step (a layer that compiles with its tests passing), not one big commit per PR.
- **Publishing**: `origin` is github.com/jyviko/modelcraft. Changes land through pull requests: - **Publishing**: `origin` is github.com/jyviko/modelcraft. Changes land through pull requests:
branch, push, open a PR, let CI run, then `gh pr merge --squash` when green. Rebase onto `main` branch, push, open a PR, let CI run, then `gh pr merge --squash` when green. Rebase onto `main`
(never merge `main` into a branch); never force-push `main`. Never commit `plan/`, (never merge `main` into a branch); never force-push `main`. Never commit `plan/`,
+2 -1
View File
@@ -7,7 +7,8 @@ asset file is missing from this table.
**Policy (mandatory):** ModelCraft contains **no iconography, images, artwork, fonts, templates, **Policy (mandatory):** ModelCraft contains **no iconography, images, artwork, fonts, templates,
example decks or help text from commercial CAE products.** Every asset is original work by example decks or help text from commercial CAE products.** Every asset is original work by
ModelCraft contributors or third-party material under an open licence. Screenshots of commercial ModelCraft contributors or third-party material under an open licence. Screenshots of commercial
software are never committed. software are never committed. Icons are made with VectorCraft; each icon's `.vectorcraft` source
is committed and listed here with its exports.
## Files ## Files
+3 -2
View File
@@ -57,8 +57,9 @@ sources is in `docs/meshing/literature.md`.
**Test geometry** follows the same rule as test data: nothing produced with a commercial CAD or **Test geometry** follows the same rule as test data: nothing produced with a commercial CAD or
CAE product. That excludes ABC (Onshape), MAMBO (files from commercial translators) and the HexMe CAE product. That excludes ABC (Onshape), MAMBO (files from commercial translators) and the HexMe
models that come from ABC, GrabCAD or Siemens NX; HexMe's Gmsh-made models are allowed (CC-BY-4.0). models that come from ABC, GrabCAD or Siemens NX; HexMe's Gmsh-made models are allowed (CC-BY-4.0).
Thingi10K (per-model Creative Commons licences, authoring tool unrecorded) is pending an owner Thingi10K is not used either (owner decision 2026-10-13: authoring tools unrecorded). **The test
decision. The default corpus is generated: SolidCraft-built parts and analytic shapes. corpus is our own:** parts built with SolidCraft (scripts or designs authored in SolidCraft,
committed as their recipes so the geometry is regenerated, not stored) and analytic shapes.
**Commercial products** (Abaqus, Nastran, LS-DYNA, LS-PrePost, HyperMesh, ANSA, Femap, Patran, **Commercial products** (Abaqus, Nastran, LS-DYNA, LS-PrePost, HyperMesh, ANSA, Femap, Patran,
ANSYS) are never run, scripted or used as a source of data. Deck formats come from the vendors' ANSYS) are never run, scripted or used as a source of data. Deck formats come from the vendors'
+23 -2
View File
@@ -3,8 +3,29 @@
use std::path::Path; use std::path::Path;
const ASSET_EXT: &[&str] = const ASSET_EXT: &[&str] = &[
&["png", "jpg", "jpeg", "svg", "ico", "icns", "ttf", "otf", "woff", "woff2", "gif", "bmp", "webp", "wav", "mp3", "stl", "step", "stp", "obj"]; "png",
"jpg",
"jpeg",
"svg",
"ico",
"icns",
"ttf",
"otf",
"woff",
"woff2",
"gif",
"bmp",
"webp",
"wav",
"mp3",
"stl",
"step",
"stp",
"obj",
"vectorcraft",
"solidcraft",
];
const SKIP_DIRS: &[&str] = &["target", ".git", "plan", "dist"]; const SKIP_DIRS: &[&str] = &["target", ".git", "plan", "dist"];
fn walk(dir: &Path, root: &Path, out: &mut Vec<String>) { fn walk(dir: &Path, root: &Path, out: &mut Vec<String>) {