diff --git a/docs/design/INDEX.md b/docs/design/INDEX.md index 488e108..a04a777 100644 --- a/docs/design/INDEX.md +++ b/docs/design/INDEX.md @@ -245,6 +245,24 @@ so a graph render (C9 graph-as-data, #13) disambiguates identical node types and surfaces a mis-wiring. Like `FieldSpec.name`, it is an informative debug symbol, not part of the C8 dataflow contract — adding it changes no run behaviour. +**Realization (cycle 0015 — param declaration).** The tunable-parameter half of +this contract is now realized: a node declares its knobs in `schema()` as +`params: Vec` (`ParamSpec { name: String, kind: ScalarKind }`), and +`Blueprint::param_space()` aggregates them into one flat, path-qualified list — a +read-only projection of the graph-as-data (C9), mirroring the inline order +(C19/C23) so a param's slot matches the later flat-node order. Two refinements to +the guarantee's "typed, with ranges": (1) the declaration carries `name` + `kind` +only — the **search-range is the run's, not the node's** (which subset / grid a +sweep covers is an experiment axis, #32/C20; the node declares the knob's existence +and type, never its search interval). (2) Identity is **positional** (the slot, +C23 "by index, not name"); the path-qualified `name` is a non-load-bearing debug +symbol (like `FieldSpec.name`) — same-type siblings in one composite share a name, +uniqueness is at the slot. A vector knob (`LinComb.weights`) expands to `N` flat +`weights[i]` entries, `N` topology-fixed (C19). Permitted kinds are `i64`/`f64`/ +`bool` (a `timestamp` knob is a structural axis, C20, never a numeric sweep param). +Binding a value to a slot (#31) and enumerating a sweep (#32) are the deferred next +layers. + ### C9 — Fractal, acyclic composition **Guarantee.** A composite is itself a `Node` that wires a sub-graph and exposes one output; signal, combined signal, and (with execution) strategy are all the @@ -662,8 +680,9 @@ blueprint → inline / compile → flat instance — is the load-bearing substra **first**; the optimisation passes (intra-compilat CSE/DCE, sweep-invariant hoisting) are **deferred**, behaviour-preserving follow-on work, each gated by a "compilat with pass ≡ compilat without pass, bit-identical run" test (C1). The -sweep-level pass further presupposes per-node param declarations (C8 — *deliberately -not in the schema yet*) and the sweep orchestration itself (C12/C21). +sweep-level pass further presupposes per-node param declarations (C8 — landed in +cycle 0015 as `name`+`kind`; the swept *range* still pending #32/C20) and the sweep +orchestration itself (C12/C21). ---