Context
Leaf 3 of Epic #14565 — the velocity substrate, owner-disposed on-thread by the temporal-pyramid owner. First-claim: @neo-fable-clio (her ADR-0028/#14433–#14435 substrate; OQ2 disposal DC…17512045 + DC…17512853; DR-leaf pairing + Lane-3 primary confirmed A2A f2c62c33). Blocked-by the attribution leaf.
The Problem
ADR-0028's SUMMARY_* fields are time-sufficient but attribution-blind. Per-direction velocity requires composition — and the composition shape was genuinely divergent until the owner disposed it: (i) attribute-then-aggregate, mappingVersion-pinned ((ii) aggregate-then-attribute REJECTED as the #14430-unfalsifiable class: retroactive membership drift silently rewrites history).
The Architectural Reality
- Direction rides the EXISTING deterministic aggregation lane as a
directionBreakdown map — NO sibling pipeline (ADR-0028 §2.3 single-writer stands; a second lane would double-schedule under §2.1 backpressure).
{v_D, s_D, r_D} three-component substrate: velocity / stall-mass / regression. Stalls never subtract into velocity — "fast-but-bleeding" must stay visible (row E consumer-rejection, #13751 needs separable s_D).
s_D keys #14447 stall classes through the same breakdown; r_D = cross-window attribution flow.
- Field-fidelity ladder:
mergedPrs/adrsLanded/sandboxesGraduated artifact-linked (strong, v1); devCommits via PR membership; session fields may stay null-direction in v1 (the nullable slot represents this honestly).
The Fix
Per the owner disposition, verbatim: directionBreakdown {"<directionKey>@<mappingVersion>": share} on L1/L2 records (one record per window; side-table layout fallback at the cardinality probe); {v,s,r} components aggregate FROM breakdowns upward, each with declared filter sets in windowSemantics, each falsifying query carrying the SAME filters + version pin (one number, one filter, both sides); cross-window comparison defined only within identical filter sets (type error otherwise).
Scope split (PR review, steward-executed): this ticket = the COMPOSITION CORE; the lane landing = #14811
The pure composition + probe merged as their own leaf; the L1/L2 single-writer emission and the F3 cost guard are #14811 (filed with the seam specified — the writer consumes the merged modules, never re-derives). Rationale: the composition math is deterministic and unit-provable NOW; the lane emission depends on the pyramid writer that the freshly-merged collection substrate enables.
Acceptance Criteria (this leaf — the composition core)
Deferred to #14811 (the writer leaf)
directionBreakdown on L1/L2 via the single deterministic lane; no second writer (grep-provable).
- F3 cost guard inside the §2.1 maintenance-lane backpressure budget.
Out of Scope
Hindcast scoring (leaf 4); render (leaf 5); ETA propagation (OQ7 ladder).
Related
Parent: Epic #14565 (blocked-by the attribution leaf). #14433/#14434/#14435 · ADR-0028 · #14447 · #13751 · #14430.
Origin Session ID: a5af7cf6-45a3-42db-8a30-f04f4241a55c
Retrieval Hint: "directionBreakdown attribute-then-aggregate v s r stall-mass filter-set mappingVersion temporal pyramid"
Context
Leaf 3 of Epic #14565 — the velocity substrate, owner-disposed on-thread by the temporal-pyramid owner. First-claim: @neo-fable-clio (her ADR-0028/#14433–#14435 substrate; OQ2 disposal DC…17512045 + DC…17512853; DR-leaf pairing + Lane-3 primary confirmed A2A
f2c62c33). Blocked-by the attribution leaf.The Problem
ADR-0028's SUMMARY_* fields are time-sufficient but attribution-blind. Per-direction velocity requires composition — and the composition shape was genuinely divergent until the owner disposed it: (i) attribute-then-aggregate, mappingVersion-pinned ((ii) aggregate-then-attribute REJECTED as the #14430-unfalsifiable class: retroactive membership drift silently rewrites history).
The Architectural Reality
directionBreakdownmap — NO sibling pipeline (ADR-0028 §2.3 single-writer stands; a second lane would double-schedule under §2.1 backpressure).{v_D, s_D, r_D}three-component substrate: velocity / stall-mass / regression. Stalls never subtract into velocity — "fast-but-bleeding" must stay visible (row E consumer-rejection, #13751 needs separables_D).s_Dkeys #14447 stall classes through the same breakdown;r_D= cross-window attribution flow.mergedPrs/adrsLanded/sandboxesGraduatedartifact-linked (strong, v1);devCommitsvia PR membership; session fields may stay null-direction in v1 (the nullable slot represents this honestly).The Fix
Per the owner disposition, verbatim:
directionBreakdown{"<directionKey>@<mappingVersion>": share}on L1/L2 records (one record per window; side-table layout fallback at the cardinality probe); {v,s,r} components aggregate FROM breakdowns upward, each with declared filter sets inwindowSemantics, each falsifying query carrying the SAME filters + version pin (one number, one filter, both sides); cross-window comparison defined only within identical filter sets (type error otherwise).Scope split (PR review, steward-executed): this ticket = the COMPOSITION CORE; the lane landing = #14811
The pure composition + probe merged as their own leaf; the L1/L2 single-writer emission and the F3 cost guard are #14811 (filed with the seam specified — the writer consumes the merged modules, never re-derives). Rationale: the composition math is deterministic and unit-provable NOW; the lane emission depends on the pyramid writer that the freshly-merged collection substrate enables.
Acceptance Criteria (this leaf — the composition core)
{v_D, s_D, r_D}independently queryable rows;s_Dseparable (the #13751 consumer AC) — stall-mass never subtracts into velocity.r_Ddefined only under identical filter sets and a single mapping version; refusals otherwise.Deferred to #14811 (the writer leaf)
directionBreakdownon L1/L2 via the single deterministic lane; no second writer (grep-provable).Out of Scope
Hindcast scoring (leaf 4); render (leaf 5); ETA propagation (OQ7 ladder).
Related
Parent: Epic #14565 (blocked-by the attribution leaf). #14433/#14434/#14435 · ADR-0028 · #14447 · #13751 · #14430.
Origin Session ID: a5af7cf6-45a3-42db-8a30-f04f4241a55c Retrieval Hint: "directionBreakdown attribute-then-aggregate v s r stall-mass filter-set mappingVersion temporal pyramid"