diff --git a/docs/design/INDEX.md b/docs/design/INDEX.md index fe13ef7..e7411f5 100644 --- a/docs/design/INDEX.md +++ b/docs/design/INDEX.md @@ -742,6 +742,32 @@ notation — superseding the cycle-0017 flat-ascii model and its renderer-defect workaround. The DOT/SVG are Graphviz-version-dependent and not golden-tested; the deterministic JSON model is the asserted contract. +**Realization (cycle 0034 — structural-constant bind: a knob *removed* from +param_space, #55).** `PrimitiveBuilder::bind(slot, value)` adds the **third** param +category beside the topology factory-arg (C7/C19) and the tuning param (the +cycle-0016 value-pin): a **structural constant**. The cycle-0016 binding *pins* a +value in the injected vector while the knob **stays** in `param_space` (a tuning +param the sweep varies); `bind` instead **removes** the slot from `param_space` +entirely — the knob is gone, not fixed. The discriminator is the #55 +deform-vs-tune test: a value whose variation yields another valid point of the +*same* strategy is a **tuning param** (stays in `param_space`); a value whose +variation *deforms* the strategy into a different one (e.g. the `2` of an +"SMA2-entry" bound to its two-candle construction) is a **structural constant** +(bound out), so a sweep never enumerates deformed strategies as valid family +members. Mechanically `bind` shrinks the builder's declared param surface +(`schema.params`) and wraps its build closure to re-splice the constant at its +original positional slot; the construction layer +(`collect_params`/`lower_items`/`param_space`/`compile_with_params`) is +**byte-unchanged** — both dock sites already key off `builder.params()`, so the +shrink propagates for free, and chained binds reconstruct the correct positional +vector because each layer computes its slot index relative to the param list it +sees. C23 is unaffected: `bind` resolves the param **name** to a position at +**authoring** time (the by-name authoring address space, the 0032 amendment) and +the compilat stays wired by raw index — the name never reaches it. The +complementary question — exporting a **named frozen** strategy (all/most knobs +bound) as a reusable blueprint *value* — is deferred (#60); `bind` ships only the +per-knob overlay, no registry (C9/C10 intact). + ### C20 — Strategy ↔ harness; the harness is the root sim graph **Guarantee.** A **strategy** is a reusable composite-node blueprint (C9): broker-, data-, and viz-independent, with inputs declared as named **roles**