Risk-regime axis is undiscoverable from the authoring/introspection surface #216

Closed
opened 2026-07-07 10:45:38 +02:00 by Brummel · 4 comments
Owner

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 variant vol{length,k}) works end to end, but a consumer with only the public interface cannot discover its shape:

  • aura campaign introspect --unwired {} never lists the risk slot (it is #[serde(default)], so omitted); there is no --block / vocabulary introspection for RiskRegime.
  • The glossary has zero occurrences of "regime" / "risk section".
  • The authoring-guide's §3 campaign worked example has no risk section.
  • aura campaign validate reports 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:

  • Add a risk section to the authoring-guide §3 campaign worked example + a glossary entry for the risk-regime axis.
  • List the risk slot in aura campaign introspect --unwired.
  • Count regimes / cells in the aura campaign validate summary.

Evidence: fieldtests/milestone-verb-dissolution/mvd_bare.json (introspection probe) and the mvd_3_* matrix scenario.

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 variant `vol{length,k}`) works end to end, but a consumer with only the public interface cannot discover its shape: - `aura campaign introspect --unwired {}` never lists the `risk` slot (it is `#[serde(default)]`, so omitted); there is no `--block` / vocabulary introspection for `RiskRegime`. - The glossary has zero occurrences of "regime" / "risk section". - The authoring-guide's §3 campaign worked example has no `risk` section. - `aura campaign validate` reports 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: - Add a `risk` section to the authoring-guide §3 campaign worked example + a glossary entry for the risk-regime axis. - List the `risk` slot in `aura campaign introspect --unwired`. - Count regimes / cells in the `aura campaign validate` summary. Evidence: `fieldtests/milestone-verb-dissolution/mvd_bare.json` (introspection probe) and the `mvd_3_*` matrix scenario.
Brummel added the feature label 2026-07-07 10:45:38 +02:00
Author
Owner

Design reconciliation (specify)

Spec: risk-axis-discoverability. The issue body settles the headline (three
asks: authoring-guide + glossary coverage, an --unwired risk listing, a
regime/cell count in the validate summary). The finer-grained forks below are
left open by the body; this records their resolution.

  • Fork: how --unwired represents an optional slot → the risk axis is
    listed as a normal open slot: line carrying an optional hint (contrast
    with the existing required hints), and only while risk is absent or
    empty — a bound, non-empty risk list closes the slot and drops the line.
    Basis: derived — flipping risk to required is excluded (it would break the
    content-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 shipped
    grammar with an honest qualifier.
  • Fork: vocabulary/block coverage → the campaign section roster gains a
    fifth block, std::risk, so aura campaign introspect --vocabulary lists it
    and --block std::risk describes the regime shape
    ({"vol":{"length":..,"k":..}}, list semantics, absent = one default
    regime). Basis: derived — the issue diagnoses the vocabulary surface itself
    as the gap ("there is no --block / vocabulary introspection for RiskRegime");
    a slot that --unwired names but no --block can describe reproduces half
    the gap. The roster is descriptive only (introspection), so the addition is
    additive with no content-id or validation impact.
  • Fork: validate summary shape → the intrinsic summary line is extended to
    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 different
    aggregate for validate would fork the counting vocabulary across surfaces.
  • Fork: concrete default-stop numbers in introspection hints → the
    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::Fixed variant (future additive seam); the
sweep/walkforward/mc/generalize verb surfaces are untouched; description
(the other optional field) stays unlisted — it is inert metadata, not a
structural axis.

## Design reconciliation (specify) Spec: risk-axis-discoverability. The issue body settles the headline (three asks: authoring-guide + glossary coverage, an `--unwired` risk listing, a regime/cell count in the validate summary). The finer-grained forks below are left open by the body; this records their resolution. - **Fork: how `--unwired` represents an optional slot** → the risk axis is listed as a normal `open slot:` line carrying an `optional` hint (contrast with the existing `required` hints), and only while `risk` is absent or empty — a bound, non-empty risk list closes the slot and drops the line. Basis: derived — flipping `risk` to required is excluded (it would break the content-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 shipped grammar with an honest qualifier. - **Fork: vocabulary/block coverage** → the campaign section roster gains a fifth block, `std::risk`, so `aura campaign introspect --vocabulary` lists it and `--block std::risk` describes the regime shape (`{"vol":{"length":..,"k":..}}`, list semantics, absent = one default regime). Basis: derived — the issue diagnoses the vocabulary surface itself as the gap ("there is no --block / vocabulary introspection for RiskRegime"); a slot that `--unwired` names but no `--block` can describe reproduces half the gap. The roster is descriptive only (introspection), so the addition is additive with no content-id or validation impact. - **Fork: validate summary shape** → the intrinsic summary line is extended to 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 different aggregate for validate would fork the counting vocabulary across surfaces. - **Fork: concrete default-stop numbers in introspection hints** → the 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::Fixed` variant (future additive seam); the sweep/walkforward/mc/generalize verb surfaces are untouched; `description` (the other optional field) stays unlisted — it is inert metadata, not a structural axis.
Author
Owner

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).

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).
Author
Owner

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.

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.
Author
Owner

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).

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).
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Brummel/Aura#216