From 2a9a141a6fce00b558418020541148efdeeeba4c Mon Sep 17 00:00:00 2001 From: Brummel Date: Sun, 7 Jun 2026 15:35:10 +0200 Subject: [PATCH] =?UTF-8?q?audit:=20cycle=20A=20(0015)=20=E2=80=94=20ledge?= =?UTF-8?q?r=20amendments=20(C8/C23),=20debt=20#34=20filed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Architect drift review of the #30 cycle (561482c..931109d) against the design ledger. Code holds: param_space() is a read-only C9 projection, compile/inline untouched, compilat bit-identical, positional identity (C23) and topology-fixed vector arity (C19) implemented and well-covered. Two ledger drifts + one debt item. ledger (fixed here): - C23 'Status' parenthetical said the sweep pass 'presupposes per-node param declarations (C8 — deliberately not in the schema yet)' — now stale, the declarations landed this cycle. Reworded to 'landed in cycle 0015 as name+kind; swept range still pending #32/C20'. - C8 guarantee promises params 'typed, with ranges' but cycle 0015 shipped name+ kind only. Added a 'Realization (cycle 0015)' note (the established per-cycle pattern, as C8 already carries for 0005/0006) recording what landed and the load-bearing refinement from the design discussion: the SEARCH-RANGE is the run's, not the node's (#32/C20) — the node declares the knob's existence and type, never its search interval; identity is positional (slot), the path-qualified name a non-load-bearing debug symbol. debt (filed, carry-on): - collect_params (blueprint.rs:217) duplicates lower_items' traversal order rather than sharing it (deliberate — keeps param_space a parallel projection so the compilat stays bit-identical). The E2E mirror guard is shape-specific (no nested- composite compile case). Filed as #34 to harden before #31 binds atop the invariant. Not active drift — the guard exists, only the shape coverage is partial. regression: profile declares no regression scripts and no architect_sweeps — the architect review is the sole gate. No baseline to update. Cycle A is drift-clean after these amendments. NOT a milestone close — that needs the end-to-end milestone fieldtest, deferred until the sweep root (#31-#33) lands. --- docs/design/INDEX.md | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) 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). ---