Skip to content

Semantic editing

An edit in Artifact Forge is never mesh surgery. It is a typed patch against the YAML source, previewed CAD-free, and — on apply — a full rebuild whose preserve contract is verified: the parameters and features you said must survive are checked to have survived. The Cockpit’s REGION / EDIT lens is the front end of this machinery.

Click a region in the viewport, or pick one from the Target region selector. The selector is honest about what is editable:

  • listed and selectable — editable regions that have compatible modifiers;
  • listed but disabled, under protected — not editable — mounting surfaces, fastener keepouts, high-stress roots, contact surfaces. Clicking one in the viewport is rejected with “protected — not a valid edit target”.
  • — auto — lets the engine pick the target when it is unambiguous.

You never edit region geometry directly. An editable region is a canvas for modifiers; a protected region is a keepout every modifier must respect.

Three ways, all producing the same thing: a typed patch/v1.

Intent buttons. Four deterministic, engine-defined edits:

IntentWhat it actually does
make_support_freemigrates to a support-free sibling archetype when one exists (e.g. the molded clip → its side-print variant), otherwise switches to a self-supporting cavity roof; refuses if neither applies
make_strongerbumps the thickness-family parameters the archetype actually has (wall +0.8 mm, plate/flange +1 mm); refuses if none exist
make_biomorphica style patch (organic surface sliders) that preserves every functional parameter
remove_perforationremoves field modifiers; refuses if there are none

“Refuses” is literal: an intent that cannot honestly do its job on this product returns a finding, not a best-effort guess.

The natural-language box. Type “make it stronger” or “сделай без поддержек” and hit Propose patch:

  • LLM OFF — bilingual keyword matching onto the four intents; no match is an honest failure (“LLM OFF and no known intent matched — use an intent button or a patch”).
  • LLM ON — the model returns either a known intent or a typed patch, but it is schema-constrained to real parameter names, real modifier ids and the compatible-region enum (your selected region pins the target). The server re-grounds everything and the result still goes through the same preview — LLM output is never trusted raw and never touches geometry.

A hand-written patch (via Create from YAML or the CLI) — the same patch/v1 document:

schema: patch/v1
type: functional # functional | manufacturing | structural | style
reason: wider bundle
preserve: [mounting_flange, screw_spacing]
params:
bundle_d: +10mm # absolute, ±delta, or expr(...) — percentages are rejected
modifiers:
update:
- id: add_hex_perforation
params: {cell_d: 6mm}

Modifier operations are add / remove / update (update merges parameters of an already-present modifier — “more voronoi” is a bump, not a duplicate). A patch may migrate the product to a sibling archetype of the same object class; a cross-class migration is rejected as a new product, not an edit.

Preview is CAD-free and mandatory. The panel shows the patch as YAML, the edited product’s validation verdict, and the honest warnings:

  • NO-OP — the patch changes nothing; apply is disabled;
  • field cells before → after — with a warning when cells dropped: “fewer cells — likely the OPPOSITE of the intent”;
  • did-you-mean — a modifier aimed at a non-existent region gets a Fix target → 〈region〉 button that rewrites the patch and re-previews;
  • a failing validation disables Apply: “applying would fail the build with these findings”.

Apply patch (rebuild + verify preserve) runs as a job: build the before state, apply the patch, rebuild, and verify the preserve contract — the listed parameters must come out numerically identical and the listed features still validator-built. A violated preserve fails the edit; it is checked, not promised. The report shows what was preserved (verified), what changed, and the support/overhang situation before → after; on success the workspace switches to the edited product.

The four intents and the patch grammar are engine code (repair/), not UI sugar — forge edit --intent make_support_free from the CLI runs exactly the same path.