docs,engine: drop coined "compilat", use FlatGraph / "flat graph"
"Compilat" (German "Kompilat") was a coined noun for the product of the
bootstrap compilation — neither English nor a natural fit. The runtime
artifact already has a code identifier for exactly this thing: the
`FlatGraph` struct (harness.rs). Replace the coinage with that identifier:
- prose mentions -> "flat graph" (mirrors the type, reads plainly)
- definitional anchors -> `FlatGraph` (C11, C23, the running-graph line)
- `render_compilat` -> `render_flat_graph` (historical render symbol;
keeps the `render_blueprint` / `render_flat_graph`
source-vs-product pairing)
- `intra-compilat` -> `intra-graph`
- `from_compilat` (test) -> `from_flat`
"compilation" / "re-compilation" / "bootstrap-as-compilation" (the process,
ordinary English) are deliberately left untouched. Behaviour-preserving:
only comments, design ledger, specs/plans, one test-local variable and its
assert messages change. Full workspace test suite green; clippy clean.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
# Blueprint → compilat: composite inlining — Design Spec
|
||||
# Blueprint → flat graph: composite inlining — Design Spec
|
||||
|
||||
**Date:** 2026-06-05
|
||||
**Status:** Draft — awaiting user spec review
|
||||
@@ -8,13 +8,13 @@
|
||||
|
||||
Introduce the **construction layer** that turns a hand-written, raw-index graph
|
||||
into named **graph-as-data** (a `Blueprint`) that **compiles** to the flat,
|
||||
type-erased instance the run loop already runs (the **compilat**). The unit of
|
||||
type-erased instance the run loop already runs (the **flat graph**). The unit of
|
||||
reuse is the **composite**: a nestable sub-graph fragment that exposes one output
|
||||
port and named input roles, and that the compile step **inlines** into the flat
|
||||
`(nodes, sources, edges)` the unchanged `Harness::bootstrap` consumes.
|
||||
|
||||
This realizes C9 (fractal composition), C19 (bootstrap = compilation), and C23
|
||||
(blueprint → flat compilat, wired by raw index; names non-load-bearing). It is the
|
||||
(blueprint → flat graph, wired by raw index; names non-load-bearing). It is the
|
||||
anchor of the *Construction layer* milestone (Gitea #12).
|
||||
|
||||
**What ships:** a `Blueprint` / `Composite` representation in `aura-engine`, a
|
||||
@@ -51,9 +51,9 @@ edges *into* a composite are resolved through its input roles (a fan-out: one
|
||||
blueprint edge may become several flat edges), and edges *out of* a composite are
|
||||
resolved to its interior output port. Nesting is handled by compiling
|
||||
inside-out / recursively. After lowering, `bootstrap`'s existing kind-check and
|
||||
Kahn cycle-check cover the flat compilat for free (C7/C8).
|
||||
Kahn cycle-check cover the flat graph for free (C7/C8).
|
||||
|
||||
The compilat is **wired by raw index, not by name** (C23): the composite boundary
|
||||
The flat graph is **wired by raw index, not by name** (C23): the composite boundary
|
||||
dissolves entirely; field/input-role names, where kept, are non-load-bearing debug
|
||||
symbols (as `FieldSpec.name` already is, `crates/aura-core/src/node.rs:37`).
|
||||
|
||||
@@ -198,20 +198,20 @@ pub struct Blueprint {
|
||||
impl Blueprint {
|
||||
pub fn new(nodes: Vec<BlueprintNode>, sources: Vec<SourceSpec>,
|
||||
edges: Vec<Edge>) -> Self;
|
||||
/// Lower to the flat compilat: inline every composite (recursive), offset
|
||||
/// Lower to the flat graph: inline every composite (recursive), offset
|
||||
/// interior indices, rewrite edges, fan input roles out. Run loop unchanged.
|
||||
pub fn compile(self) -> Result<(Vec<Box<dyn Node>>, Vec<SourceSpec>, Vec<Edge>), CompileError>;
|
||||
/// Compile, then hand the flat compilat to the unchanged Harness::bootstrap.
|
||||
/// Compile, then hand the flat graph to the unchanged Harness::bootstrap.
|
||||
pub fn bootstrap(self) -> Result<Harness, CompileError>;
|
||||
}
|
||||
|
||||
/// A construction-phase fault, caught before the flat compilat reaches bootstrap.
|
||||
/// A construction-phase fault, caught before the flat graph reaches bootstrap.
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub enum CompileError {
|
||||
BadInteriorIndex, // an interior edge/role/output index is out of range
|
||||
RoleKindMismatch { role: usize }, // a role fans into interior slots of differing kinds
|
||||
OutputPortOutOfRange, // the output port names a missing interior node/field
|
||||
Bootstrap(BootstrapError), // the lowered flat compilat failed bootstrap's checks
|
||||
Bootstrap(BootstrapError), // the lowered flat graph failed bootstrap's checks
|
||||
}
|
||||
```
|
||||
|
||||
@@ -232,7 +232,7 @@ trait are **unchanged**.
|
||||
items at an offset, rewrite interior edges, resolve edges into a composite via
|
||||
its input roles (fan-out), resolve edges out of a composite to its output port.
|
||||
- **`CompileError`** — construction-phase faults, with `Bootstrap(BootstrapError)`
|
||||
for the lowered-compilat failure.
|
||||
for the lowered flat-graph failure.
|
||||
|
||||
## Data flow
|
||||
|
||||
@@ -251,10 +251,10 @@ Authoring → `Blueprint` (graph-as-data, blueprint indices) → `compile()`:
|
||||
`from: base_c + output.node`, `from_field: output.field`.
|
||||
4. Result: flat `(nodes, sources, edges)` with no composites, wired by raw index.
|
||||
`Blueprint::bootstrap` hands these to the unchanged `Harness::bootstrap`, whose
|
||||
kind-check + Kahn cycle-check (`harness.rs:142-192`) validate the compilat.
|
||||
kind-check + Kahn cycle-check (`harness.rs:142-192`) validate the flat graph.
|
||||
|
||||
Then `Harness::run` drives the flat compilat exactly as today (C1 determinism
|
||||
preserved — the compilat is the same flat topology the hand-wiring produced).
|
||||
Then `Harness::run` drives the flat graph exactly as today (C1 determinism
|
||||
preserved — the flat graph is the same flat topology the hand-wiring produced).
|
||||
|
||||
## Error handling
|
||||
|
||||
@@ -263,10 +263,10 @@ preserved — the compilat is the same flat topology the hand-wiring produced).
|
||||
(`BadInteriorIndex`), a role fanning into interior slots of differing scalar
|
||||
kinds (`RoleKindMismatch`), an output port naming a missing interior node/field
|
||||
(`OutputPortOutOfRange`).
|
||||
- The lowered flat compilat is validated by `bootstrap`'s **existing** checks; any
|
||||
- The lowered flat graph is validated by `bootstrap`'s **existing** checks; any
|
||||
`BootstrapError` (kind mismatch, bad index, cycle) is wrapped as
|
||||
`CompileError::Bootstrap(..)`. No duplication of bootstrap's validation in the
|
||||
inliner — the compilat is checked once, where it always was (C7/C8).
|
||||
inliner — the flat graph is checked once, where it always was (C7/C8).
|
||||
- A composite's *derived* `schema()` is what the enclosing graph kind-checks
|
||||
against; a same-name role fanning to mismatched kinds is caught at compile, not
|
||||
hidden until run.
|
||||
@@ -278,7 +278,7 @@ preserved — the compilat is the same flat topology the hand-wiring produced).
|
||||
an edge out of a composite resolves to its output port; a **nested** composite
|
||||
(composite-in-composite) inlines correctly.
|
||||
- **Unit (errors):** `BadInteriorIndex`, `RoleKindMismatch`, `OutputPortOutOfRange`
|
||||
each provoked by a malformed composite; a lowered compilat with a kind mismatch
|
||||
each provoked by a malformed composite; a lowered flat graph with a kind mismatch
|
||||
or cycle surfaces as `CompileError::Bootstrap(..)`.
|
||||
- **Integration (headline, C1):** the SMA-cross composite, compiled and run,
|
||||
produces equity + exposure sink traces **bit-identical** to the hand-wired flat
|
||||
@@ -307,7 +307,7 @@ possible once params and the sweep orchestration land (C12/C21).
|
||||
4. The SMA-cross composite produces a run **bit-identical** to the hand-wired
|
||||
graph (C1) — the headline test passes.
|
||||
5. `compile()` rejects malformed wiring with a typed `CompileError`; the lowered
|
||||
flat compilat is validated by `bootstrap`'s existing kind/cycle checks (no
|
||||
flat graph is validated by `bootstrap`'s existing kind/cycle checks (no
|
||||
re-implementation).
|
||||
6. `Harness::bootstrap`, `Harness::run`, `Edge`, `Target`, `SourceSpec`, and the
|
||||
`Node` trait are **unchanged**; the run loop is untouched.
|
||||
|
||||
@@ -22,7 +22,7 @@ Two views are rendered, selectable:
|
||||
- `aura graph` — the **blueprint** view: the authored graph *before* inlining,
|
||||
with each composite drawn as a labelled cluster box (C9 fractal structure as
|
||||
written).
|
||||
- `aura graph --compiled` — the **compilat** view: the flat, post-inline
|
||||
- `aura graph --compiled` — the **flat graph** view: the flat, post-inline
|
||||
`(nodes, sources, edges)` that actually runs; composite boundaries are
|
||||
dissolved (C23). This is the same graph the run loop and the deferred C23
|
||||
optimiser see.
|
||||
@@ -54,7 +54,7 @@ reason the work is split across crates rather than landing in one:
|
||||
*with its parameters*, so two `Sma` nodes read `SMA(2)` and `SMA(4)` and a
|
||||
swap is visible. The method is additive, non-load-bearing, and never read by
|
||||
the run loop — a C8 refinement aligned with C23, not a behavioural change. It
|
||||
must live on `Node` (not a side table) because the compilat view holds
|
||||
must live on `Node` (not a side table) because the flat graph view holds
|
||||
`Vec<Box<dyn Node>>` and labels each node by asking the trait object directly.
|
||||
|
||||
## Concrete code shapes
|
||||
@@ -151,7 +151,7 @@ pub trait Node {
|
||||
The default takes `&self` and returns an owned `String`, so `Node` stays
|
||||
object-safe and `Box<dyn Node>::label()` dispatches (a `type_name::<Self>()`
|
||||
default would require `Self: Sized` and is therefore rejected — it would not be
|
||||
callable on the `dyn Node` the compilat holds).
|
||||
callable on the `dyn Node` the flat graph holds).
|
||||
|
||||
**2. aura-std overrides — one shown, the rest analogous (aura-std/src/sma.rs).**
|
||||
|
||||
@@ -221,7 +221,7 @@ use ascii_dag::graph::{Graph, RenderMode};
|
||||
|
||||
// Compiled view: trivial — compile(), then one display node per flat node, one
|
||||
// edge per flat edge, each label from the boxed node itself.
|
||||
pub fn render_compilat(nodes: &[Box<dyn Node>], sources: &[SourceSpec],
|
||||
pub fn render_flat_graph(nodes: &[Box<dyn Node>], sources: &[SourceSpec],
|
||||
edges: &[Edge]) -> String {
|
||||
let labels: Vec<String> = /* source labels ++ nodes.iter().map(|n| n.label()) */;
|
||||
let mut g = Graph::with_mode(RenderMode::Vertical);
|
||||
@@ -236,7 +236,7 @@ pub fn render_compilat(nodes: &[Box<dyn Node>], sources: &[SourceSpec],
|
||||
// leaves render inside it; blueprint-level edges/source-targets resolve through
|
||||
// composite input-roles (fan) and output ports to interior display ids — the
|
||||
// same boundary resolution compile() performs, but emitting cluster-grouped
|
||||
// display nodes instead of a flat compilat.
|
||||
// display nodes instead of a flat graph.
|
||||
pub fn render_blueprint(bp: &Blueprint) -> String { /* … */ }
|
||||
```
|
||||
|
||||
@@ -252,7 +252,7 @@ match args.next().as_deref() {
|
||||
let bp = sample_blueprint();
|
||||
let out = if compiled {
|
||||
let (nodes, sources, edges) = bp.compile().expect("valid sample blueprint");
|
||||
graph::render_compilat(&nodes, &sources, &edges)
|
||||
graph::render_flat_graph(&nodes, &sources, &edges)
|
||||
} else {
|
||||
graph::render_blueprint(&bp)
|
||||
};
|
||||
@@ -296,7 +296,7 @@ fn swapped_sma_inputs_render_differently() {
|
||||
internal test call sites. No dependency added.
|
||||
- **aura-cli** (`Cargo.toml`, `src/main.rs`, new `src/graph.rs`): the
|
||||
`ascii-dag` dependency; `sample_blueprint()` (+ a swapped variant for the
|
||||
test); the `graph` module with `render_blueprint` / `render_compilat`; the
|
||||
test); the `graph` module with `render_blueprint` / `render_flat_graph`; the
|
||||
`graph` dispatch arm; the rendering tests.
|
||||
|
||||
## Data flow
|
||||
@@ -308,7 +308,7 @@ edges/source-targets through composite roles/output to interior display ids,
|
||||
labels each leaf via `node.label()` → `Graph::render()` → `println!` to stdout.
|
||||
|
||||
`aura graph --compiled` → `sample_blueprint()` → `bp.compile()` yields the flat
|
||||
`(nodes, sources, edges)` → `render_compilat(...)` assigns one display id per
|
||||
`(nodes, sources, edges)` → `render_flat_graph(...)` assigns one display id per
|
||||
source and per flat node, draws the flat edges, labels each `Box<dyn Node>` via
|
||||
`.label()` → `Graph::render()` → stdout. Composite boundaries are gone (C23):
|
||||
the cluster boxes of the blueprint view are absent, by design.
|
||||
@@ -365,7 +365,7 @@ commitment* — and is met:
|
||||
C1 determinism are untouched (`label()` is never read during a run); the C8
|
||||
node contract is *refined*, not broken (the addition is the non-load-bearing
|
||||
render symbol C23 already reserves and cites #13 for); composites still inline
|
||||
to a name-free index-wired compilat (C23 — the compiled view demonstrates it).
|
||||
to a name-free index-wired flat graph (C23 — the compiled view demonstrates it).
|
||||
|
||||
Issue #13's own acceptance checklist is satisfied: `ascii-dag` added as the
|
||||
rendering crate's dependency; a `graph → ascii_dag::Graph` adapter in Vertical
|
||||
|
||||
@@ -44,10 +44,10 @@ Two layers, both resting on machinery that already exists:
|
||||
the deterministic depth-first item order that `lower_items` (the inliner)
|
||||
already uses. **`compile`/`inline_composite` are not touched**: the param-space
|
||||
is a separate read-only projection of the blueprint (a further C9
|
||||
introspection, like `nodes()`), not a change to the flat compilat.
|
||||
introspection, like `nodes()`), not a change to the flat graph.
|
||||
|
||||
The **identity** of a param is **positional** — its slot index in the flat
|
||||
param-space — exactly as the compilat wires by raw index, not by name (C23). The
|
||||
param-space — exactly as the flat graph wires by raw index, not by name (C23). The
|
||||
name is a **non-load-bearing debug symbol**, path-qualified at aggregation time
|
||||
(`strategy.combine.weights[0]`) so a reader can trace a knob back to its node.
|
||||
|
||||
@@ -270,7 +270,7 @@ whose kind could mismatch (that check lands with the bind in #31).
|
||||
param-space; an empty blueprint yields an empty space.
|
||||
|
||||
Build/test/clippy green across the workspace; existing compile/bootstrap/run and
|
||||
render tests stay green (the compilat is unchanged — `compile`/`inline_composite`
|
||||
render tests stay green (the flat graph is unchanged — `compile`/`inline_composite`
|
||||
are not touched, so every existing bit-identical and golden-snapshot test is
|
||||
unaffected by construction).
|
||||
|
||||
@@ -292,7 +292,7 @@ applies, read against aura's domain invariants:
|
||||
Determinism (C1) holds — aggregation order is a pure structural function.
|
||||
Topology-invariance (C19) holds — a vector knob's arity `N` is topology-fixed
|
||||
(it equals the node's input arity), declared as `N` fixed entries, never a
|
||||
sweep param. The compilat is untouched (C23) — params are a read-only
|
||||
sweep param. The flat graph is untouched (C23) — params are a read-only
|
||||
projection, not a change to the wired graph; every existing bit-identical test
|
||||
stays green by construction.
|
||||
|
||||
@@ -300,7 +300,7 @@ applies, read against aura's domain invariants:
|
||||
|
||||
- **Param-set binding / injection (#31)** — binding an injected typed value-vector
|
||||
to the param-space slot-by-slot, with the kind-check that declaration defers.
|
||||
- **Sweep enumeration (#32)** — building a family of compilats over the
|
||||
- **Sweep enumeration (#32)** — building a family of flat graphs over the
|
||||
param-space.
|
||||
- **The run-supplied search-range (#32 / C20)** — which subset/grid a run sweeps
|
||||
lives in the experiment-builder, not in the node (the param declaration carries
|
||||
|
||||
@@ -302,7 +302,7 @@ not the node (C20, established at #30's close), and full domain validation is
|
||||
- **Bit-identity (the central proof).** `bootstrap_with_params(vec![I64(2),
|
||||
I64(4), F64(0.5)])` on the SMA-cross harness produces equity + exposure traces
|
||||
bit-identical to the hand-wired `sma_cross(2, 4)` graph — build-then-wire does
|
||||
not change the compilat for a given point. (Re-expresses
|
||||
not change the flat graph for a given point. (Re-expresses
|
||||
`composite_sma_cross_runs_bit_identical_to_hand_wired`.)
|
||||
- **Injection is observable.** A different vector (`[I64(5), I64(20), F64(1.0)]`)
|
||||
yields a different, populated trace from the same blueprint — distinct instances,
|
||||
|
||||
@@ -20,7 +20,7 @@ reused composite's body once, removes the current nested-composite `unimplemente
|
||||
and renders on ascii-dag's **flat** layout only — sidestepping the cluster-layout
|
||||
bug at the root.
|
||||
|
||||
The **compiled view** (`render_compilat`, flat fully-inlined, C23) is unchanged,
|
||||
The **compiled view** (`render_flat_graph`, flat fully-inlined, C23) is unchanged,
|
||||
byte-for-byte.
|
||||
|
||||
## Architecture
|
||||
@@ -30,10 +30,10 @@ Two ontological tiers map onto two render shapes:
|
||||
| View | What it shows | Mechanism |
|
||||
|------|---------------|-----------|
|
||||
| Blueprint (`render_blueprint`) | authored source: harness wiring + composites as named subroutines, each body rendered once | main flat graph (composite = opaque node) + a `where:` block of per-type definitions |
|
||||
| Compiled (`render_compilat`) | inlined machine form, boundaries dissolved (C23) | one flat graph (unchanged) |
|
||||
| Compiled (`render_flat_graph`) | inlined machine form, boundaries dissolved (C23) | one flat graph (unchanged) |
|
||||
|
||||
The redesign is **CLI-render-only**. No change to the engine, the Node/Blueprint
|
||||
data model, or `render_compilat`. The blueprint data model already carries
|
||||
data model, or `render_flat_graph`. The blueprint data model already carries
|
||||
everything needed (`Composite::name/nodes/edges/input_roles/output`,
|
||||
`Blueprint::nodes/sources/edges`).
|
||||
|
||||
@@ -47,7 +47,7 @@ everything needed (`Composite::name/nodes/edges/input_roles/output`,
|
||||
`Barycentric`/`BrandesKopf` are unimplemented stubs; `render()` takes no config).
|
||||
The **flat** layout reserves `width + 3` per node and is collision-free at all
|
||||
widths. The new model renders only flat graphs, so the bug cannot arise.
|
||||
2. **Scale.** The blueprint is authored structure, not the compilat. A composite
|
||||
2. **Scale.** The blueprint is authored structure, not the flat graph. A composite
|
||||
with 50 interior nodes is **one** node in the main graph; blueprint size tracks
|
||||
top-level wiring, not inlined node count. Real strategies stay displayable.
|
||||
3. **Render-once.** A composite reused N times appears N times as an opaque node in
|
||||
@@ -182,7 +182,7 @@ fn render_definition(c: &Composite) -> String {
|
||||
`where:` block. Uses only flat ascii-dag graphs.
|
||||
- **`render_flat(labels, edges) -> String`** (new internal helper, or inline). A
|
||||
thin wrapper over the existing flat-graph build (`Graph::with_mode(Vertical)`,
|
||||
`add_node`, `add_edge`, `render`) — exactly what `render_compilat` already does,
|
||||
`add_node`, `add_edge`, `render`) — exactly what `render_flat_graph` already does,
|
||||
with **no** `add_subgraph` / `put_nodes`.
|
||||
- **`collect_distinct_composites(bp) -> Vec<&Composite>`** (new). Walks top-level
|
||||
items and, recursively, composite interiors; returns distinct composites in
|
||||
@@ -191,7 +191,7 @@ fn render_definition(c: &Composite) -> String {
|
||||
- **`render_definition(c) -> String`** (new). One composite interior → flat graph
|
||||
with `[in:k]` / `[out]` port markers, prefixed `"<name>:\n"`.
|
||||
- **`ItemDisplay`**, **`producer_id`**, **`consumer_ids`** (simplified as above).
|
||||
- **`render_compilat`** — untouched.
|
||||
- **`render_flat_graph`** — untouched.
|
||||
|
||||
## Data flow
|
||||
|
||||
@@ -264,7 +264,7 @@ Unchanged and must stay green: `compiled_view_dissolves_the_composite_boundary`,
|
||||
- `aura graph` (no flag) prints the sample as a small main graph with `[sma_cross]`
|
||||
opaque, followed by a `where:` block defining `sma_cross` once, on a flat layout
|
||||
(no `╔═╗` subgraph boxes).
|
||||
- `aura graph --compiled` output is byte-identical to before (`render_compilat`
|
||||
- `aura graph --compiled` output is byte-identical to before (`render_flat_graph`
|
||||
untouched; its golden unchanged).
|
||||
- The `unimplemented!("nested-composite cluster rendering")` at `graph.rs:75` is
|
||||
gone; a one-level-nested composite renders.
|
||||
|
||||
@@ -50,9 +50,9 @@ boundary; it does not widen the node contract.
|
||||
base column; the record is a bundle of base columns, as today.
|
||||
- **C4** (one record per cycle) — unchanged. One `eval`, one row, K columns,
|
||||
co-fresh by construction.
|
||||
- **C23** (compilat wired by raw index; names are non-load-bearing debug
|
||||
- **C23** (flat graph wired by raw index; names are non-load-bearing debug
|
||||
symbols) — **honoured**: the re-export *names* live at the blueprint boundary
|
||||
only. The compilat lowering drops them and carries raw `(node, field)` indices,
|
||||
only. The flat graph lowering drops them and carries raw `(node, field)` indices,
|
||||
exactly as `FieldSpec.name` and `Composite.name` are dropped at inline today.
|
||||
|
||||
A strategy composite still outputs **one** exposure (C10/C7): it is simply a
|
||||
@@ -144,7 +144,7 @@ pub struct OutPort {
|
||||
/// One re-exported field of a composite's output record: an interior
|
||||
/// `(node, output-field)` surfaced at the boundary under `name`. `name` is a
|
||||
/// non-load-bearing render/debug symbol (C23) — like `FieldSpec.name` and
|
||||
/// `Composite.name`, it does not reach the compilat.
|
||||
/// `Composite.name`, it does not reach the flat graph.
|
||||
pub struct OutField {
|
||||
pub node: usize,
|
||||
pub field: usize,
|
||||
@@ -322,7 +322,7 @@ Authoring → compile → run is unchanged in shape; only the boundary arity wid
|
||||
3. **Edge rewrite (`rewrite_edge`):** a consumer edge reading the composite with
|
||||
`from_field = k` resolves to `output[k]` — the k-th re-exported flat
|
||||
`(node, field)`. Out-of-range `k` → `BadInteriorIndex`.
|
||||
4. **Bootstrap:** the flat compilat is unchanged in kind — ordinary
|
||||
4. **Bootstrap:** the flat graph is unchanged in kind — ordinary
|
||||
`(from_node, from_field) → (to_node, slot)` edges. Existing per-field
|
||||
kind-checks at bootstrap (`slot_kind`) apply to each re-exported field as they
|
||||
already do for any producer field. No new kind rule.
|
||||
@@ -349,7 +349,7 @@ Unit tests in `blueprint.rs` (alongside the existing compile tests):
|
||||
|
||||
1. **Multi-output happy path:** a composite re-exporting 2 interior fields; two
|
||||
downstream consumers read `from_field: 0` and `from_field: 1`; assert the
|
||||
compilat wires each consumer to the correct distinct flat `(node, field)`.
|
||||
flat graph wires each consumer to the correct distinct flat `(node, field)`.
|
||||
2. **Nested multi-output:** an outer composite re-exporting two fields of an
|
||||
**inner** multi-output composite (exercises the nested arm's
|
||||
`nested.get(field)`); assert correct flat resolution.
|
||||
@@ -383,7 +383,7 @@ preserving).
|
||||
record; the histogram remains reachable as one selected field.
|
||||
5. `aura graph` renders K `[out:<name>]` markers per multi-output composite.
|
||||
6. Single-field output records (every strategy composite, `sma_cross`) compile
|
||||
and run identically to today — C8 / C7 / C4 untouched; the compilat for an
|
||||
and run identically to today — C8 / C7 / C4 untouched; the flat graph for an
|
||||
unchanged blueprint is byte-identical.
|
||||
7. `cargo build --workspace`, `cargo test --workspace`, and
|
||||
`cargo clippy --workspace --all-targets -- -D warnings` are green.
|
||||
|
||||
@@ -56,13 +56,13 @@ Consequence, made explicit so the implementation cannot drift: a param's identit
|
||||
in `param_space()` stays its **slot** (position), never its name. Aliases relabel
|
||||
in place; they never reorder, add, or remove a slot. The existing invariant test
|
||||
`param_space_mirrors_compiled_flat_node_param_order` (slot order mirrors the flat
|
||||
compilat) therefore stays green unchanged — it is the C23 anchor for this cycle.
|
||||
flat graph) therefore stays green unchanged — it is the C23 anchor for this cycle.
|
||||
|
||||
### Invariant-neutrality
|
||||
|
||||
- **C23 honoured.** Names are non-load-bearing debug symbols dropped at lowering;
|
||||
identity is positional everywhere (param slot, role index, output field index).
|
||||
The compilat is byte-identical — `compiled_view_golden` is the regression guard,
|
||||
The flat graph is byte-identical — `compiled_view_golden` is the regression guard,
|
||||
exactly as #40 honoured it. The role/param/output *names* never reach a
|
||||
`Box<dyn Node>`.
|
||||
- **C8 / C7 / C4 untouched.** This is authoring-surface legibility only: no change
|
||||
@@ -369,7 +369,7 @@ Engine unit tests (`crates/aura-engine/src/blueprint.rs`):
|
||||
→ `param_space()` identical to today's path-qualified factory names.
|
||||
3. **Slot order invariant (C23 anchor).** `param_space_mirrors_compiled_flat_node_param_order`
|
||||
stays green unchanged — aliases relabel, never reorder; the slot still mirrors
|
||||
the flat compilat. (No new test; the existing one is the guard.)
|
||||
the flat graph. (No new test; the existing one is the guard.)
|
||||
4. **Out-of-range alias → `BadInteriorIndex`** at `compile_with_params`
|
||||
(alias `node`/`slot` past the interior leaf's params).
|
||||
5. **Partial aliasing.** A composite aliasing one of two slots → the aliased slot
|
||||
|
||||
@@ -55,7 +55,7 @@ labels — stale prose this cycle corrects.
|
||||
compile path, and the run are untouched. Files: `graph.rs` (`render_definition`),
|
||||
`main.rs` (render tests/goldens), `node.rs` (doc comment only).
|
||||
- **C23.** `compiled_view_golden` is byte-identical — only the blueprint-definition
|
||||
render changes; the compiled/flat view and the compilat are unaffected. Boundary
|
||||
render changes; the compiled/flat view and the flat graph are unaffected. Boundary
|
||||
names still never reach a `Box<dyn Node>`.
|
||||
- **C8/C7/C4 untouched** — authoring-surface legibility only. `aura run --macd`
|
||||
is deterministic and unchanged (render-only).
|
||||
|
||||
@@ -98,7 +98,7 @@ one composite share a name — uniqueness is at the slot". That stays true for
|
||||
(C12/C19/C23 untouched). This cycle adds a *separate* authoring well-formedness
|
||||
rule that bites only at fan-in nodes whose colliding sources have an unnamed
|
||||
configuration axis. C23 is not violated — the check runs during construction,
|
||||
before the type-erased compilat; runtime names stay non-load-bearing debug
|
||||
before the type-erased flat graph; runtime names stay non-load-bearing debug
|
||||
symbols. What changes is that a composite which was silently accepted (then
|
||||
rendered ambiguously) is now rejected at compile. This is a deliberate contract
|
||||
refinement, recorded in the ledger.
|
||||
@@ -341,7 +341,7 @@ Render (aura-cli):
|
||||
- **New focused render test**: per-node-call uniqueness, role-name passthrough
|
||||
(`#price`), the recursive descent (`[Sub(#SEf,#SEu)]`), and the interchangeable
|
||||
positional fallback (`[Join(#A,#B)]`-style).
|
||||
- **`compiled_view_golden`** (`main.rs:533`): byte-stable — compilat labels via
|
||||
- **`compiled_view_golden`** (`main.rs:533`): byte-stable — flat graph labels via
|
||||
`Box<dyn Node>::label()`, no fan-in stubs, no `#` identifier. C23 guard.
|
||||
|
||||
Fixture knock-on (the constraint-driven set):
|
||||
@@ -364,7 +364,7 @@ Per aura's feature-acceptance: a strategy author cannot accidentally ship a
|
||||
fan-in whose inputs differ in configuration but share a rendered identity — the
|
||||
engine rejects it at construction, where aura makes invariants structural;
|
||||
genuinely-interchangeable inputs stay legal; the graph view communicates input
|
||||
provenance correctly; no runtime/compilat behaviour changes (C1/C12/C19/C23
|
||||
provenance correctly; no runtime/flat graph behaviour changes (C1/C12/C19/C23
|
||||
intact).
|
||||
|
||||
- [ ] A composite with a fan-in node whose two sources have equal signatures and
|
||||
|
||||
@@ -33,7 +33,7 @@ interior nodes — histogram included. There is no case where an `OutField` warr
|
||||
a real extra node, so the fix is uniform: fold the name into the producer.
|
||||
|
||||
This is **pure render-layer legibility**, not a capability. `OutField.name` is a
|
||||
non-load-bearing render/debug symbol (C23) that never reaches the compilat; the
|
||||
non-load-bearing render/debug symbol (C23) that never reaches the flat graph; the
|
||||
engine, blueprint data model, and bootstrap are untouched. The implementation
|
||||
commit closes #46.
|
||||
|
||||
@@ -80,7 +80,7 @@ test asserts it verbatim.
|
||||
- **C23 honoured.** `OutField.name` stays a non-load-bearing render symbol dropped
|
||||
at lowering; output identity is the `(node, field)` position, which survives.
|
||||
The `:=` form changes only where the name is *printed*, never what it *is*. The
|
||||
compiled view (`render_compilat`) is name-free and byte-identical —
|
||||
compiled view (`render_flat_graph`) is name-free and byte-identical —
|
||||
`compiled_view_golden` is the regression guard, unchanged.
|
||||
- **C8 / C7 untouched.** No change to the runtime record shape, the four base
|
||||
scalars, or one-record-per-cycle. This is authoring-surface legibility only.
|
||||
@@ -244,7 +244,7 @@ The MACD author site (`fn macd` in `main.rs`) and every engine type are
|
||||
3. **Blueprint render** (`render_definition`): for each interior node, the output
|
||||
names re-exporting it are folded onto its label as a `:=` binding; no standalone
|
||||
output node is emitted. Input roles still render as entry nodes.
|
||||
4. **Compiled render** (`render_compilat`) is name-free and byte-identical
|
||||
4. **Compiled render** (`render_flat_graph`) is name-free and byte-identical
|
||||
(`compiled_view_golden`).
|
||||
|
||||
## Error handling
|
||||
|
||||
@@ -242,7 +242,7 @@ fn field_label(producer_outputs: usize, from_field: usize, name: Option<&str>) -
|
||||
label. Composite-opaque rendering retained.
|
||||
- `render_flat` / the `add_edge` call (`graph.rs:81-94`) — gains an optional
|
||||
per-edge label argument; used by `render_blueprint`, `render_definition`,
|
||||
and `render_compilat` alike (shared, so the label mechanism is single-owned).
|
||||
and `render_flat_graph` alike (shared, so the label mechanism is single-owned).
|
||||
- `leaf_label` — generalised (or paralleled by a top-level variant) to source
|
||||
param names from `LeafFactory::params()` when there is no `ParamAlias` list.
|
||||
- a `from_field` → name resolver using `Composite::output()` with an
|
||||
|
||||
@@ -63,10 +63,10 @@ a root role is a bound ingestion feed (C3). That filter is semantic, not
|
||||
cosmetic, and is the sole remaining distinction; the *rendering* of a role is now
|
||||
identical across levels.
|
||||
|
||||
**The compiled view is deliberately left as `[source:F64]`.** `render_compilat`
|
||||
**The compiled view is deliberately left as `[source:F64]`.** `render_flat_graph`
|
||||
(graph.rs:495) builds source labels from the flat `SourceSpec.kind` — post-inline
|
||||
the role *name* has dissolved (C23, names are non-load-bearing debug symbols that
|
||||
do not reach the compilat), so only the kind survives there. Thus `[price]`
|
||||
do not reach the flat graph), so only the kind survives there. Thus `[price]`
|
||||
pre-inline (name alive) and `[source:F64]` post-inline (name gone) is not an
|
||||
inconsistency — it is C23 made visible, and it is the negative control proving the
|
||||
change is confined to the structural blueprint view.
|
||||
@@ -165,7 +165,7 @@ slot stubs in both views (the "root has no context" carve-out is removed).
|
||||
- **`render_graph` / `leaf_label`** (graph.rs): `stub_ctx` becomes `&Composite`;
|
||||
the fan-in gate keys on `slots.len() > 1` alone.
|
||||
- **`render_definition`** (graph.rs): passes `c` instead of `Some(c)` (mechanical).
|
||||
- **`render_compilat`** (graph.rs): **unchanged** — keeps `source:{kind}` from the
|
||||
- **`render_flat_graph`** (graph.rs): **unchanged** — keeps `source:{kind}` from the
|
||||
flat `SourceSpec` (C23).
|
||||
- **`slot_source` / `fan_in_identifiers` / `signature_of`**: unchanged, reused
|
||||
verbatim.
|
||||
@@ -180,7 +180,7 @@ an edge-fed slot resolves through `signature_of(bp.nodes(), bp.edges(),
|
||||
bp.input_roles(), bp.params(), e.from)`; a role-fed slot returns the role name.
|
||||
The `where:` definitions still flow through `render_definition(c)` →
|
||||
`render_graph(…, stub_ctx = c)`, untouched and byte-stable. The compiled view
|
||||
flows through the independent `render_compilat`, untouched.
|
||||
flows through the independent `render_flat_graph`, untouched.
|
||||
|
||||
## Error handling
|
||||
|
||||
@@ -217,7 +217,7 @@ All affected tests live in `crates/aura-cli/src/main.rs`:
|
||||
(acceptance #1 for `--macd` + acceptance #2).
|
||||
|
||||
4. **`compiled_view_golden`** (~line 569): asserted **unchanged** — renders
|
||||
through `render_compilat`, a separate path that keeps `[source:F64]` (C23:
|
||||
through `render_flat_graph`, a separate path that keeps `[source:F64]` (C23:
|
||||
name dissolved post-inline) and `[SimBroker(0.0001)]`. The negative control.
|
||||
|
||||
5. **`nested_composite_renders_without_panic`** (~437) and
|
||||
|
||||
@@ -177,13 +177,13 @@ leaf `#45475a`, composite `#5b4b8a`, source `#2e5a3a`, sink `#5a2e3e`.
|
||||
### Implementation shape — before → after (secondary)
|
||||
|
||||
`crates/aura-cli/src/graph.rs` (the ascii-dag adapter, ~505 lines) is **retired**. Its
|
||||
public entry points (`render_blueprint`, `render_compilat`) and the `ascii-dag`
|
||||
public entry points (`render_blueprint`, `render_flat_graph`) and the `ascii-dag`
|
||||
dependency in `crates/aura-cli/Cargo.toml` are removed.
|
||||
|
||||
```rust
|
||||
// BEFORE — ascii-dag adapter (graph.rs), point-nodes + invented label notation:
|
||||
pub fn render_blueprint(bp: &Composite, color: Color) -> String { /* ascii_dag::Graph … */ }
|
||||
pub fn render_compilat(nodes: &[Box<dyn Node>], …) -> String { /* ascii_dag::Graph … */ }
|
||||
pub fn render_flat_graph(nodes: &[Box<dyn Node>], …) -> String { /* ascii_dag::Graph … */ }
|
||||
|
||||
// AFTER — a read-only model serializer (new module, e.g. graph_model.rs),
|
||||
// hand-rolled deterministic JSON in the RunReport::to_json house style (no serde):
|
||||
|
||||
@@ -258,7 +258,7 @@ contributes one `ParamSpec` per param slot, named
|
||||
prefix by its own name and recurses. Slot order and arity are **unchanged** from
|
||||
today (the mirror test against the compiled flat-node order stays green); only
|
||||
the per-knob *string* changes (it gains the node segment and, where a
|
||||
`ParamAlias` used to relabel, reverts to `<node>.<factory-param>`). The compilat
|
||||
`ParamAlias` used to relabel, reverts to `<node>.<factory-param>`). The flat graph
|
||||
remains name-free and wired by raw index (C23): node names are construction-time
|
||||
identity and debug symbols, dropped at lowering, exactly as alias names were.
|
||||
|
||||
|
||||
@@ -344,14 +344,14 @@ existing resolve → lower → bootstrap flow is unchanged.
|
||||
injectivity.
|
||||
- **C12/C19 (255–270).** The 0015-era line "same-type siblings in one composite
|
||||
share a name, uniqueness is at the slot" is now refined: identity in the
|
||||
**compilat** stays positional (C23, unchanged), but the `param_space()` **name
|
||||
**flat graph** stays positional (C23, unchanged), but the `param_space()` **name
|
||||
projection** — the authoring/by-name address space — must be **injective** for a
|
||||
blueprint to compile. The two layers are distinct: positional wiring below,
|
||||
injective name address space above.
|
||||
- **C23.** The injectivity check is part of bootstrap-as-compilation; node names
|
||||
stay non-load-bearing (dropped at lowering, compilat wired by raw index). The
|
||||
stay non-load-bearing (dropped at lowering, flat graph wired by raw index). The
|
||||
check reads the boundary name projection; it does not make names load-bearing in
|
||||
the compilat.
|
||||
the flat graph.
|
||||
|
||||
## Testing strategy
|
||||
|
||||
|
||||
@@ -59,10 +59,10 @@ closure-wrapping.
|
||||
against the node's declared `ParamSpec.name`. This follows the C23
|
||||
authoring-address-space convention as amended in cycle 0032
|
||||
(`check_param_namespace_injective`): the by-name *authoring* address space is
|
||||
injective, while the *compilat* stays wired by raw index (C23 unchanged). Name at
|
||||
the authoring surface, index in the compilat; `.bind()` sits on the authoring
|
||||
injective, while the *flat graph* stays wired by raw index (C23 unchanged). Name at
|
||||
the authoring surface, index in the flat graph; `.bind()` sits on the authoring
|
||||
side and resolves the name to a position immediately — the name is not persisted
|
||||
into the compilat, so C23's "names are non-load-bearing in the compilat" holds.
|
||||
into the flat graph, so C23's "names are non-load-bearing in the flat graph" holds.
|
||||
|
||||
`.bind()` is **not** the `builder_const(2)` per-node constructor the issue rejects
|
||||
(which "explodes combinatorially — which subset is constant?"): it is one method,
|
||||
@@ -227,7 +227,7 @@ Construction (unchanged): `Composite::param_space()` → `collect_params` iterat
|
||||
bound knob. `compile_with_params(params)` checks arity against the (shrunk)
|
||||
`param_space`, then `lower_items` slices `n = builder.params().len()` open values
|
||||
and calls `builder.build(open_slice)`; the wrapped closure reconstructs the full
|
||||
positional vector and delegates to the node constructor. The compilat is wired by
|
||||
positional vector and delegates to the node constructor. The flat graph is wired by
|
||||
raw index exactly as before (C23).
|
||||
|
||||
## Error handling
|
||||
@@ -307,6 +307,6 @@ currently-green test):
|
||||
`PrimitiveBuilder::bind`.
|
||||
- Chained and single binds reconstruct the correct positional argument vector for
|
||||
multi-param nodes (invariant test 3 green).
|
||||
- C23 holds: the compilat is still wired by raw index; bound param names are
|
||||
resolved to positions at authoring time and never reach the compilat.
|
||||
- C23 holds: the flat graph is still wired by raw index; bound param names are
|
||||
resolved to positions at authoring time and never reach the flat graph.
|
||||
- No new dependency (C16); no node registry or by-name runtime lookup (C9/C10).
|
||||
|
||||
@@ -59,7 +59,7 @@ the standalone HTML):
|
||||
`name: ` declaration prefix to the box head when a name is present.
|
||||
|
||||
**Invariant check.** The name is a render/debug symbol on the model surface
|
||||
only; it is **not** carried into the compilat (lowering drops it, exactly as
|
||||
only; it is **not** carried into the flat graph (lowering drops it, exactly as
|
||||
today — C23). The model gains a deterministic field sourced from an
|
||||
author-controlled identifier (C14: same input → same model bytes). No hot-path,
|
||||
determinism, or causality surface is touched. This is the same render/model-only
|
||||
@@ -294,7 +294,7 @@ cellLabel ── o.name present ⇒ prefix "fast: " + head "SMA" + sig "[lengt
|
||||
⇒ fast: SMA[length]
|
||||
```
|
||||
|
||||
The name is dropped at lowering (compilat wiring is by raw index, C23); it never
|
||||
The name is dropped at lowering (flat graph wiring is by raw index, C23); it never
|
||||
re-enters the engine — there is no runtime path here, only the render/model
|
||||
surface.
|
||||
|
||||
@@ -351,7 +351,7 @@ exported and headlessly drivable), the `named()`/`node_name()` tests above.
|
||||
- `cargo build --workspace`, `cargo test --workspace`, and
|
||||
`cargo clippy --workspace --all-targets -- -D warnings` are green; the
|
||||
`viewer_dot.rs`/`.mjs` guard passes.
|
||||
- C23 (name dropped at lowering, not in the compilat) and C14 (deterministic
|
||||
- C23 (name dropped at lowering, not in the flat graph) and C14 (deterministic
|
||||
model bytes) hold — verified by the unchanged lowering path and the
|
||||
re-captured goldens.
|
||||
- Out-of-scope items (collapsed-composite visibility, composite-box prefix, INFO
|
||||
|
||||
@@ -67,7 +67,7 @@ param-space")` is exactly that check). Every *unbound* param therefore forces a
|
||||
sweep axis. Binding `blend.weights[2]` removes it from the param-space, so it
|
||||
needs no axis — a bound param is a structural constant that drops out of the
|
||||
tuning surface (C23: `bind` resolves the param *name* to a fixed position; the
|
||||
compilat is unchanged).
|
||||
flat graph is unchanged).
|
||||
|
||||
**Blast radius.**
|
||||
|
||||
|
||||
@@ -475,7 +475,7 @@ render/debug surface only, never read by bootstrap or the run loop (C23).
|
||||
deterministic (C14). Unbound nodes' model bytes are unchanged.
|
||||
3. The bound slot remains absent from the tunable surface (`params()` /
|
||||
`param_space` / sweep axes) — `bind`'s tuning-side behaviour is unchanged
|
||||
(C12/C19), and the compilat is unchanged (C23: render/debug symbol only).
|
||||
(C12/C19), and the flat graph is unchanged (C23: render/debug symbol only).
|
||||
4. New unit tests pin the recorded original position and the conditional model
|
||||
field; a headless guard pins the dimmed `name=value` render and slot-order
|
||||
faithfulness (including a non-trailing bind). All existing goldens, viewer
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
Add an additive, fluent `GraphBuilder` that authors a blueprint's topology by
|
||||
**typed node handles** and **port names** instead of raw positional indices, and
|
||||
resolves them to the existing index-wired `Composite` at a single fallible
|
||||
terminal `build()`. The compilat stays wired by raw index (C23): name resolution
|
||||
terminal `build()`. The flat graph stays wired by raw index (C23): name resolution
|
||||
happens at the authoring boundary, the same posture param-name resolution already
|
||||
has (`Binder`/`with` → `bootstrap`, `crates/aura-engine/src/blueprint.rs:259,413`).
|
||||
|
||||
@@ -66,7 +66,7 @@ mistyped; only port/field names are strings, and they are resolved at `build()`.
|
||||
|
||||
From `build()` onward the pipeline is byte-for-byte today's: `validate_wiring` →
|
||||
`lower_items`/`inline_composite` → `rewrite_edge`/`resolve_target` → `FlatGraph`.
|
||||
The compilat never sees a name; the run loop (C1/C2) is untouched. Kind checks
|
||||
The flat graph never sees a name; the run loop (C1/C2) is untouched. Kind checks
|
||||
are **not** duplicated in the builder — a resolved edge that connects mismatched
|
||||
kinds still surfaces through the existing `validate_wiring` / bootstrap kind-check
|
||||
(name resolution is necessary, not sufficient; kinds remain the structural gate).
|
||||
@@ -270,7 +270,7 @@ representation is byte-identical to a hand-written `Composite::new`.
|
||||
BlueprintNode`, addressed by derived role/output names.
|
||||
- [ ] The raw-index `Composite::new` stays public and unchanged; all existing call
|
||||
sites compile and pass; both authoring forms interoperate.
|
||||
- [ ] The compilat is unchanged: no name reaches `FlatGraph`; `compile_with_params`
|
||||
- [ ] The flat graph is unchanged: no name reaches `FlatGraph`; `compile_with_params`
|
||||
/ `inline_composite` / `rewrite_edge` / `Harness::bootstrap` / the run loop
|
||||
are untouched. Determinism (C1) and no-look-ahead (C2) hold by construction.
|
||||
- [ ] `cargo build --workspace`, `cargo test --workspace`, and
|
||||
|
||||
@@ -23,7 +23,7 @@ run. Today an unwired input slot is bootstrapped with an empty column
|
||||
forgotten connection runs a deterministic but wrong backtest, and two producers
|
||||
into one slot is ill-formed (a slot holds exactly one column) yet uncompiled-
|
||||
against. A single new structural check at the existing compile boundary closes
|
||||
both, for both authoring surfaces, without touching the compilat (C23).
|
||||
both, for both authoring surfaces, without touching the flat graph (C23).
|
||||
|
||||
Non-goal (explicitly out of scope, dropped this cycle): promoting port/field/node
|
||||
names to load-bearing wiring keys; node-name or port/field-name uniqueness;
|
||||
@@ -216,7 +216,7 @@ pub enum CompileError {
|
||||
> concept**: every declared input port is required (no shipped node runs
|
||||
> meaningfully without one; an unwarmed mode-A input is *wired-but-not-yet-valued*,
|
||||
> not unwired). The check is **index-based and name-free** — it touches no name
|
||||
> machinery and emits nothing into the compilat, so C23 is untouched (it proves the
|
||||
> machinery and emits nothing into the flat graph, so C23 is untouched (it proves the
|
||||
> existing raw-index wiring is total and single-valued). Inherited identically by
|
||||
> the raw `Composite::new` path and the `GraphBuilder::build()` path (both compile
|
||||
> via `compile_with_params`).
|
||||
@@ -227,7 +227,7 @@ pub enum CompileError {
|
||||
→ [existing index/kind checks] → `check_ports_connected(nodes, edges, roles)` →
|
||||
[recurse per nested composite] → (on Ok) `UnboundRootRole` check → `lower_items`
|
||||
→ `FlatGraph`. The new check is a pure read over the same three slices
|
||||
`validate_wiring` already holds; it adds no data to the compilat and no work to the
|
||||
`validate_wiring` already holds; it adds no data to the flat graph and no work to the
|
||||
run loop.
|
||||
|
||||
## Error handling
|
||||
@@ -260,7 +260,7 @@ need all faults are out of scope (the existing variants are first-fault too).
|
||||
(`crates/aura-engine/src/test_fixtures.rs`) and the builder harness
|
||||
(`builder_harness_compiles_identically_to_hand_wired`) still compile green; the
|
||||
aura-cli sample / sweep / param_space / render tests stay green.
|
||||
6. **C23 regression — compilat byte-identical.** For any graph that still compiles,
|
||||
6. **C23 regression — flat graph byte-identical.** For any graph that still compiles,
|
||||
the lowered `FlatGraph` is unchanged (the existing identity test covers this; the
|
||||
check adds nothing to lowering).
|
||||
|
||||
@@ -329,7 +329,7 @@ slot is covered by its role target, and `UnboundRootRole` is checked after
|
||||
asserting their original deep-fault variant; and the param-order test
|
||||
(`param_space_mirrors_compiled_flat_node_param_order_under_nesting`) fully wired and
|
||||
still asserting its `param_space == compiled-flat-param-order` equality.
|
||||
- The full existing suite stays green (regression 5) and the compilat is
|
||||
- The full existing suite stays green (regression 5) and the flat graph is
|
||||
byte-identical for graphs that still compile (regression 6).
|
||||
- The C8 ledger realization note is landed.
|
||||
- `cargo test --workspace` green; `cargo clippy --workspace --all-targets -D
|
||||
|
||||
Reference in New Issue
Block a user