Files
claude 9124275bf3 fieldtest: m1-self-description — 5 examples, 1 bug / 3 friction / 3 spec-gap
Binary-only milestone fieldtest for milestone 36 (self-description): a
fieldtester agent bootstrapped from the release binary (d26f0c8) alone —
no engine sources, no repo docs, no bootstrap card — and drove five
end-to-end scenarios: cold bootstrap -> author -> validate (green,
synthetic + real EURUSD, 3944 trades), execution semantics +
latch/edge-pulse idiom (green), vocabulary breadth (33 nodes / 7 folds /
17 metrics / 6+6 blocks, every entry with a meaning), document ramp from
a bare {} (green, 3 members), trace/measurement path (dead-ends,
tracked).

Verdict: the bootstrap card (#267, closed as superseded) is empirically
redundant for the bootstrap->author->validate spine. Two seams keep the
promise short of end-to-end, both tracked outside M1: the declared-tap
drop on the registration path (#327, the missing mechanism of #312/M6)
and the sugar<->document axis namespace (#328, prerequisite of the #319
retirement). Friction routed: #329 #330 #331; evidence comments on #312
and #324. Milestone 36 closed with this adjudication; the fieldtest spec
remains the usual git-ignored working file.

refs #267, refs #312, refs #319
2026-07-24 11:06:22 +02:00
..

s4 — document-first ramp (grow from {} to a runnable campaign)

Protected property: using only --unwired introspection and validation diagnostics, a consumer can grow a process document and a campaign document from a bare {} to a registered, runnable state, and run the campaign green.

Trail (binary-only)

  1. echo '{}' > x.json; aura process introspect --unwired x.json — lists the whole envelope (format_version, kind, name, pipeline).
  2. Grow process.json: --unwired on a doc with pipeline:[] says "a process needs at least one stage"; a stage {} is told pipeline[0].block (required, block id) → correct shape is {"block":"std::sweep"}. aura process validate → valid; aura process register → content id.
  3. Grow campaign.json similarly (aura campaign introspect --unwired, --block std::*). aura campaign validate passes all three tiers (intrinsic / referential / executable); register → content id; campaign run <id> → 3 members, green.

process.json and campaign.json in this dir are the final registered forms; ema_open.oplist.json is the strategy authored with an open fast.length param (see friction 2).

Frictions recorded

  1. process.ref shape under-documented. campaign introspect --block std::process_ref and --unwired both describe it as "content id of a process document" (reads as a bare string), but the validator rejects the bare string: unknown variant '<id>', expected 'content_id' or 'identity_id' — the tagged {"content_id": "<id>"} form is required and appears nowhere in the introspection. Recoverable only via the validate error.
  2. Two-layer axis-namespace seam. aura sweep <bp> --list-axes presents graph.fast.length as sweepable (overriding the bound default, #246), and the sugar aura sweep --axis graph.fast.length=… accepts it. But the canonical document form rejects that same name: axis "graph.fast.length" is not in the param space — a campaign axis must be an open param, named without the graph. prefix (fast.length, per graph introspect --params, which prints nothing for a fully-bound blueprint). The name a consumer learns from the sugar (graph.fast.length) is not the name the document layer wants (fast.length), and no surface reconciles the two.