Home/AI Orchestration · Model Risk/Part I

Episode 10 · SOLUTION · Control plane

Pin the clock, name the joints

A feature-and-stress stack a capital gate can actually trust

Pin the information clock, name joint stress bundles, gate on co-break width.

Pin the information clock, name joint stress bundles, gate on co-break width.
flowchart TB
 subgraph PIN["Pin the information clock"]
 PIT["Feature X as-of T - never latest"]
 TOOL["Agent tools inherit job clock"]
 PAR["Notebook/service parity CI"]
 end
 subgraph BUNDLE["Named joint stress bundles"]
 B1["Funding + spread + missing quotes"]
 B2["Curve dislocation + liquidity drought"]
 OWN["Named owner + generation recipe"]
 end
 subgraph GATE["Gate reads co-break width"]
 CALM["Calm 1.50 vs 2.10 width"]
 COB["Co-break fan-out object"]
 POL{"Overlap under bundle?"}
 ALLOW["Allow only if both pass"]
 ESC["Escalate on empty overlap"]
 end
 PIT --> TOOL --> PAR
 B1 & B2 --> OWN
 PAR --> CALM
 OWN --> COB
 CALM & COB --> POL
 POL -->|yes| ALLOW
 POL -->|no| ESC
 classDef input fill:#CCFBF1,stroke:#0F766E,color:#134E4A,stroke-width:2px
 classDef decision fill:#FEF3C7,stroke:#B45309,color:#78350F,stroke-width:2px
 classDef risk fill:#FEE2E2,stroke:#B91C1C,color:#7F1D1D,stroke-width:2px
 classDef gate fill:#DCFCE7,stroke:#15803D,color:#14532D,stroke-width:2px
 classDef process fill:#E0E7FF,stroke:#4338CA,color:#312E81,stroke-width:2px
 classDef artifact fill:#F5F5F4,stroke:#57534E,color:#1C1917,stroke-width:2px
 class PIT,TOOL,B1,B2 input
 class PAR,OWN process
 class CALM,COB artifact
 class POL decision
 class ALLOW gate
 class ESC risk

The problem we left open

In the last post I named two quiet cheats that survive strict gates.

Features can time-travel: a 14:00 mark trained on a 14:10 print sits today's exam with tomorrow's answer key. Stress packs can turn one dial at a time and call the book resilient while real breaks arrive as bundles. Separate columns are not independence. On the never-traded structure, calm width near 0.60 between 1.50 and 2.10 families can widen toward something uglier under co-break, while overlap stays empty.

That creates headaches:

So the question for this post is simple. If that is the failure mode, what does a real feature-and-stress solution look like?

The solution, as one stack

The core idea is dull on purpose: every feature carries an as-of timestamp; every tool fetch inherits the job's clock; offline and online must match under replay; stress packs include named joint bundles; the gate reads co-break fan-out, not only calm width.

I turn that into five moves. Together they are one solution, not five optional add-ons. Dullness is the point. Flashy learners do not fix illegal information. If the stack feels like plumbing, good. Plumbing is where this class of model risk actually lives.

1. Point-in-time features as a hard contract

Build or buy a feature path where a request sounds like: give me feature X as knowable at T. Not latest. Store versions so yesterday's 14:00 can be reconstructed. If a feature cannot declare its as-of semantics, it cannot enter a capital-touching job.

This sounds like data plumbing. It is decision geometry. The mark is a claim about an information set. If the plumbing lies about that set, every downstream object inherits the lie: crowds, ranges, hedges, promotion stories. I would rather fail admission on an undeclared feature than debug a genius that never existed.

2. Agent tools inherit the job clock

Tool gateways accept as-of from the job contract and refuse default-latest for marking paths. If a researcher wants latest for exploration, that is a different tool class without spend tokens. Mixing the two is how leaks return. Research speed and production honesty are different jobs. Give them different doors.

The practical test is simple. Can a marking agent obtain a post-decision revision through any tool path that still ends in a spend token. If yes, the clock is costume.

3. Parity gates in CI

For a frozen job, notebook recipe and service recipe must match marks within a tiny tolerance on a replay pack. Fail the build on mismatch. This is training-serving skew treated as a release blocker, not a wiki page. If the notebook cannot be reproduced at the job clock, it was never evidence. It was a demo.

4. Named joint stress bundles

Write a small catalog: funding squeeze plus spread jump plus missing quotes; curve dislocation plus liquidity drought; and a few more the desk already fears. Each bundle has a name, a generation recipe, and an owner. Re-run near-winner crowds and ranges on bundles, not only on single knobs. Publish calm width and co-break width side by side.

Keep the catalog small enough that people run it. A dozen named co-breaks that block release will change behavior. A hundred lovingly documented ones that nobody executes will not. Ownership matters as much as math. An orphaned scenario file is theater with a filename.

5. Let the gate consume co-break objects

Auto-allow requires tolerances under the relevant bundle set for that structure family, not only under calm holdout. If joint stress makes frames disjoint or coverage breakers trip, escalate. Calm-only green is not a spend license. The gate that cannot see co-break width is still half blind after all the earlier work.

A concrete walkthrough

Same never-traded structure. Same 1.50 versus 2.10 families. Now pin the clock and name the joint.

Job as-of: 14:00 exactly

Tools: pinned; latest blocked on mark path

Parity CI: notebook matches service on replay pack

Bundle co-break A:

frame gap widens ~0.60 to ~0.95

overlap empty

Gate: escalate on co-break

calm allow still blocked by crowd and range rules

1.80 still denied as invented peace

Again the satisfying ending is not a prettier offline score. It is a named escalate with artifacts: as-of stamp, parity pass, co-break widths. Monday can replay why autonomy refused without inventing a story about regime change. That replay is the product.

A practical rollout order that has worked for me: first kill default-latest on any path that can mint a spend token, then add parity CI on a tiny replay pack, then add two or three owned co-break bundles before you grow the catalog. Teams that start by building a museum of scenarios usually ship none.

Parity packs should include the ugly case from the last post: the notebook that looked brilliant because it saw 14:10 information. If that case still passes, your parity gate is naming the wrong equality. Match at the job clock, or admit you are matching two different exams.

When co-break width between the 1.50 and 2.10 families blows out toward 0.95 with empty overlap, the right product outcome is escalate with artifacts, not a cleverer point estimate. The stack succeeds when autonomy refuses for a named joint reason.

The flow in one breath

As-of feature contract, then tools pinned to the job clock, then parity CI, then named joint bundles that re-score crowd and ranges, then a gate that requires co-break tolerances. That is how I want time and dependence to show up in financial AI. Curious how others keep agent fetch paths honest without slowing research to a crawl, and how small they keep a joint-bundle catalog before it becomes shelfware.

Next. Open Ep11: Green averages, unnamed worlds, and free trades that are not hedges. Previous: Ep09 (AI must not sit today's exam with tomorrow's answer key). Part I index.