Files
Aura/docs/design/contracts/c14-headless-two-faces.md
T
claude 8688a60ded docs(ledger): split the design ledger into an INDEX map, per-contract live files, and history sidecars
The single-file ledger had grown to 2968 lines / ~42k tokens, mixing
current design law with accreted history: 59 cycle-stamped realization
blocks, 18 [HISTORY] passages, 22 supersession markers, and the C10 /
C22 / C24 reframe sagas layered several supersessions deep. A
code-grounding audit (31 agents, adversarially verified) confirmed 11
defects stated as current truth: stale crate homes from the C28 #288
roster split (cost nodes, PositionManagement, PositionEvent, Session),
the renamed InputSpec->PortSpec, the pre-#241 project model in C16 and
the open-threads section, a stale HarnessKind retirement deferral in
C24, and three C28-internal inconsistencies.

New shape, per the ailang precedent:

- INDEX.md stays the sole addressable entry point: foundation, external
  components, a C-id-keyed contract map (one line per contract), and
  only the genuinely open architectural threads.
- contracts/cNN-<slug>.md carries each contract's current truth only:
  Guarantee / Forbids / Why with ratified refinements integrated, plus
  a code-anchored Current state. All confirmed defects are fixed here;
  crate anchors were re-verified against the tree.
- contracts/cNN-<slug>.history.md (18 sidecars) and INDEX.history.md
  preserve every superseded block verbatim, stamps and issue refs
  intact, under a frozen-record banner. Nothing was deleted: superseded
  design intent remains an addressable working-tree artifact, off the
  per-cycle audit walk.
- Ledger discipline is now stated in INDEX.md: live files are edited in
  place at cycle close, superseded text moves verbatim to the sidecar,
  and a supersession marker in a live file is itself an audit finding.

Every contract file was verified against its old text by an independent
zero-loss pass (statement-by-statement) plus a code-accuracy spot check;
C-ids and contract titles are unchanged, so existing C-id citations in
code, tests, and issues resolve as before.
2026-07-21 16:40:36 +02:00

5.1 KiB

C14 — Headless core, two faces

Guarantee. The engine is a UI-agnostic library. Two faces sit on it: a programmatic/CLI face (the primary surface for the LLM and automation — author a node, run a sim/sweep, emit structured metrics) and a visual face for human exploration. Visualization is only a downstream consumer node (C8) on the streams.

Forbids. Any UI/pixel knowledge inside the engine.

Why. The LLM drives programmatically, the human visually; a headless core serves both. The visual face is the playground (C22) — a web frontend served from disk-persisted traces (#101, ratified 2026-06): the engine writes recorded traces to disk and a browser charts them. It is staged after the runnable substrate but is core to aura's identity, not optional. Reading a serialized trace file is a stricter form of "no UI knowledge in the engine" than an in-process native UI reaching zero-copy into the live SoA columns — the pivot to the disk-trace frontend keeps this contract's core intact and arguably tightens it.

Current state

The CLI conventions. The programmatic/CLI face is a clap derive parser (aura-cli, crates/aura-cli/src/main.rs) that meets GNU / clig.dev conventions: one declarative source yields scoped aura <sub> --help, --version/-V, per-flag Options sections, and GNU --flag=value / -- / long-option abbreviation. clap is admitted under the C16 per-case dependency policy — a research-side, dev-loop/compile tax confined to aura-cli, a leaf binary the frozen deploy artifact (invariant 8) cannot pick up. Usage lines follow the clap house style (Usage: aura <verb> …); refusal diagnostics stay unprefixed, since a diagnostic is not a usage line.

The exit-code partition is a durable part of the automation contract: a caller branches on the failure class without parsing stderr.

  • 0 — success.
  • 2 — usage error: a command-line fault (clap parse errors + aura's post-parse argument-structure validations, including the content of an argv-named blueprint file, which is itself an argument).
  • 1 — runtime failure: a well-formed command whose needed environment / recorded state is missing, or bad piped stdin data.
  • 3 — campaign completed with failed cells: a well-formed campaign that ran to completion but with at least one failed cell (#272; exit_on_campaign_result in crates/aura-cli/src/main.rs, threaded from the run registry — C18).

Dual grammar. The four dual-grammar subcommands (run/sweep/walkforward/mc) keep both grammars under one token via an optional [blueprint] positional plus a post-parse is_file() dispatch; the execution layer is unchanged (arg-plumbing via thin *_from adapters). The machine-first help surface (JSON/manifest help, stdin op-scripts) is deferred to the #157 / C21 track, distinct from this human/GNU-convention compliance.

Two artifact classes, two redundancy budgets (#249, ratified 2026-07-13). The data layer the programmatic face emits is a public interface read raw (by humans and LLMs), and its records split into two classes with opposite redundancy budgets. Generated outcome records (manifests, metrics, family reports) have a single writer at run time — redundancy there cannot drift and is deliberately spent on direct readability. Authored intent artifacts (blueprints, op-scripts, campaign documents) are author-maintained — every redundancy is a drift site and stays out. Consequence in the run manifest (RunManifest, crates/aura-engine/src/report.rs): the untouched bound defaults are stamped one-directionally beside params (which keeps its "what varied" reproduce semantics, disjoint by construction from defaults, "what was held"), so a raw reader of a fully-bound run no longer sees a misleading "params": []; the blueprint itself carries no such duplication.

The programmatic face is an executor (#295, ratified 2026-07-20). The member-run recipe — the definition of what a standard aura backtest is — is library content (aura-runner / aura-backtest / aura-measurement, C28 assembly position), not CLI content: the binary is argv → document → executor → presentation, and a downstream World program reaches the same recipe with no binary involved. See C25's control-surface amendment for the projection rule.

See also

  • C8 — visualization is a downstream sink/consumer node
  • C16 — the per-case dependency policy under which clap is admitted
  • C18 — the run registry that yields the exit-3 completed-with-failures class
  • C21 — the #157 machine-first help track (deferred)
  • C22 — the visual face / playground
  • C25 — the control-surface amendment (executor projection)
  • C28 — the assembly position of the member-run recipe

History: c14-headless-two-faces.history.md