7deb38edd8
Cycle 0053 (multi-tap trace join on timestamp, #93) closes drift-clean. Audit (architect drift review over 066638e..HEAD against docs/design + the CLAUDE.md domain invariants): - C8/C18 honoured: join_on_ts is a post-run reduction over recorded (Timestamp, Vec<Scalar>) sink streams, a true sibling of summarize/f64_field in the report layer — correct architectural home. - C3 not violated: the join runs post-run over already-recorded output, not in-graph; no as-of join smuggled into the DAG. C1 ts-uniqueness is a documented precondition, not a runtime check — consistent with how the engine leaves wiring-time invariants to contract. - Option-per-side keeps the engine honest (reports presence; the consumer owns the 0.0/-1/false defaults). The hand-rolled *_by_ts HashMaps are fully gone; the two RED unit tests pin the #93 cardinality-misalignment + spine-drop. - No drift, no debt, no ledger entry needs updating. Recommendation: carry on. Regression gate: no dedicated regression scripts configured (optional per the conventions); build/test/clippy --workspace --all-targets is the gate and ran green — the gated GER40 byte-identity tests executed against the local archive (not skipped), proving drain_trace's trace is byte-preserved across the refactor. Per the artifact lifecycle (committed while the cycle is live, git rm at cycle close), the ephemeral spec and plan are retired here; their durable rationale lives in the implementation commits74324d1/35c5adcand the git history.