Risk-regime axis is undiscoverable from the authoring/introspection surface #216
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Surfaced by the milestone "Verb dissolution" (#210) close fieldtest (2026-07-07, corpus
fieldtests/milestone-verb-dissolution/).The structural risk-regime axis (
CampaignDoc.risk: [RiskRegime], sole variantvol{length,k}) works end to end, but a consumer with only the public interface cannot discover its shape:aura campaign introspect --unwired {}never lists theriskslot (it is#[serde(default)], so omitted); there is no--block/ vocabulary introspection forRiskRegime.risksection.aura campaign validatereports e.g. "2 axes (4 points), 2 window(s)" with no mention of the regimes / cells — an 8-cell matrix reads as if it had none.The only ways to learn the shape are the design ledger (a design record, not a how-to) or reverse-engineering a verb's generated campaign document — which is what the fieldtest had to do to author its 2×2×2 matrix scenario.
Asks:
risksection to the authoring-guide §3 campaign worked example + a glossary entry for the risk-regime axis.riskslot inaura campaign introspect --unwired.aura campaign validatesummary.Evidence:
fieldtests/milestone-verb-dissolution/mvd_bare.json(introspection probe) and themvd_3_*matrix scenario.Design reconciliation (specify)
Spec: risk-axis-discoverability. The issue body settles the headline (three
asks: authoring-guide + glossary coverage, an
--unwiredrisk listing, aregime/cell count in the validate summary). The finer-grained forks below are
left open by the body; this records their resolution.
--unwiredrepresents an optional slot → the risk axis islisted as a normal
open slot:line carrying anoptionalhint (contrastwith the existing
requiredhints), and only whileriskis absent orempty — a bound, non-empty risk list closes the slot and drops the line.
Basis: derived — flipping
riskto required is excluded (it would break thecontent-id parity of every risk-less document, the documented reason for the
serde default, and contradict the stop-defaulting contract shipped 2026-07-09
under issue 217); a new output class ("default slot:") would mint vocabulary
for a single case, while
open slot: … (optional, …)reuses the shippedgrammar with an honest qualifier.
fifth block,
std::risk, soaura campaign introspect --vocabularylists itand
--block std::riskdescribes the regime shape(
{"vol":{"length":..,"k":..}}, list semantics, absent = one defaultregime). Basis: derived — the issue diagnoses the vocabulary surface itself
as the gap ("there is no --block / vocabulary introspection for RiskRegime");
a slot that
--unwirednames but no--blockcan describe reproduces halfthe gap. The roster is descriptive only (introspection), so the addition is
additive with no content-id or validation impact.
count instruments, regimes, and cells, mirroring exactly the execution
cross-product (strategies × instruments × windows × regimes; absent risk
counts as one default regime and is marked as such). Basis: derived — the
summary should report the realized matrix as execution expands it
(aura-campaign exec builds cells over precisely this product, and "cell" is
the established read-back term in
campaign runs); inventing a differentaggregate for validate would fork the counting vocabulary across surfaces.
research-crate hint text names no concrete default constants (it says
"default regime", not the numbers). Basis: derived — the default constants
live at the CLI layer (single-sourced there since issue 217/219); duplicating
the values into a research-crate string would create a second source that
drifts silently. The authoring guide, as CLI-facing prose, may state the
effective default in its risk section.
Non-goals confirmed: the validate referential/executable tier lines stay
unchanged; no
RiskRegime::Fixedvariant (future additive seam); thesweep/walkforward/mc/generalize verb surfaces are untouched;
description(the other optional field) stays unlisted — it is inert metadata, not a
structural axis.
Spec sign-off record (autonomous run, 2026-07-09): the spec for making the risk-regime axis discoverable (introspection slot listing, vocabulary/block entry, validate matrix counts, authoring-guide + glossary coverage) was signed autonomously on an independent grounding-check PASS — every load-bearing assumption about current behaviour traced to a currently-green test (exec cell cross-product, regime validation, optional-slot rendering, block/vocabulary resolution, content-id parity of risk-less documents, unpinned summary counts). No human was in the loop; the design decisions are recorded in the reconciliation comment on this issue (issues/216#issuecomment — the comment titled "Design reconciliation (specify)", 2026-07-09).
Design addendum (specify, 2026-07-09): after the initial grounding PASS, plan recon surfaced two aura-research unit tests that pin the exact open-slot vector of a risk-less document (open_slots_report_partial_documents_by_path; presentation_open_slot_hint_names_the_tap_vocabulary) — they encode the old invisibility and break under the new optional risk line. Resolution: sanctioned migrations, recorded in the spec — the first becomes an exact pin that a complete risk-less document has exactly one open slot (the optional risk line, doubling as the new-probe unit pin; the shared fixture stays byte-identical for the content-id parity test), the second migrates from full-vector equality to locating the presentation entry and asserting its hint (the test's purpose is the hint text, not the vector length). The spec was re-grounded after the edit: fresh PASS, all anchors verified exact.
Cycle-close record (autonomous run, 2026-07-09): all three asks shipped — the --unwired probe lists the optional risk slot (absent/empty/non-array = open; bound = closed; never a required flip, preserving content-id parity), the campaign vocabulary gained std::risk with --block describing the regime shape, the intrinsic validate summary now reports the realized matrix (strategies x instruments x windows x regimes -> cells, absent risk marked '(default)', mirroring execution exactly), and the authoring guide §3 (all transcripts + a two-regime worked example + prose) and glossary ('risk regime') cover the axis. One audit-stage decision: the glossary entry initially declared 'Avoid: stop regime', but the shipped hint strings and guide prose themselves say 'stop regimes' — an Avoid line the codebase violates records intent, not reality, so 'stop regime' was dropped from Avoid ('risk section' stays avoided). Audit drift-clean; full suite green (62 groups / 0 failures).