feat(engine): FlatTap type + FlatGraph.taps field (#282)

Second slice: the resolved-tap carrier. FlatTap { name, node, field } is the
output-side twin of SourceSpec — its name survives compile, load-bearing for
by-name binding (#275). FlatGraph gains a taps field, threaded (empty) through
every construction site the compiler enumerates. Bootstrap ignores it (taps
materialize as real recorder nodes/edges before bootstrap in a later slice).
Purely additive: the inert-producer pin and full suite stay green.

refs #282
This commit is contained in:
2026-07-17 22:52:21 +02:00
parent 7239106f4e
commit 17e125a90a
8 changed files with 155 additions and 5 deletions
@@ -187,7 +187,7 @@ pub fn build_harness() -> (Harness, Taps) {
.map(|slot| SourceSpec::raw(ScalarKind::F64, vec![Target { node: RESAMPLE, slot }]))
.collect();
let h = Harness::bootstrap(FlatGraph { nodes, signatures, sources, edges })
let h = Harness::bootstrap(FlatGraph { nodes, signatures, sources, edges, taps: Vec::new() })
.expect("valid breakout DAG");
(h, Taps { equity: rx_equity, held: rx_held, bars: rx_bars, breakout: rx_breakout })
}
+1
View File
@@ -60,6 +60,7 @@ fn run_sample_over(prices: Vec<(Timestamp, Scalar)>) -> RunReport {
Edge { from: 4, to: 5, slot: 0, from_field: 0 }, // equity -> sink 5
Edge { from: 3, to: 6, slot: 0, from_field: 0 }, // exposure -> sink 6
],
taps: Vec::new(),
})
.expect("valid signal-quality DAG");
@@ -66,6 +66,7 @@ fn run_sample(window: (Timestamp, Timestamp), source: Box<dyn Source>) -> RunRep
Edge { from: 4, to: 5, slot: 0, from_field: 0 },
Edge { from: 3, to: 6, slot: 0, from_field: 0 },
],
taps: Vec::new(),
})
.expect("valid signal-quality DAG");