Home Blog

Execution edits, captured in the model

12 June 2026

At a glance — Obstructions and blocks inserted during Execute now land in the shared object store as typed ExecutionDelta records — structured inputs, not just a prose log line — so they show up in the Data Analysis monitor and are kept for replay.

An obstruction captured as a typed ExecutionDelta in the Data Analysis monitor

The problem

REMIT’s Execute phase lets the operator perturb a live run: drop a +25 min obstruction in the vehicle’s path, or block the next cell and force an in-flight re-route. The wingman handled both correctly — splicing a hold, re-timing the tail through the tide-aware chooser, bending the route around the block.

But the maintainer noticed something on the way home (issue #7): “when I insert obstructions or delays they aren’t captured in the model.” Each edit appended a human-readable note to the execution log — but its structured facts (which cell, how many minutes, the resulting RV) lived only in transient UI state. Nothing reached the content-addressed object store. So unlike SteeringDelta — the operator’s denied cells, already a first-class shared write — the perturbations were invisible to the Data Analysis monitor and carried no structured inputs for replay (NF3).

Options

The strategy

Model the data, re-use the seam. Two additions to the schema:

schema/generate.sh regenerates the JSON Schema, the TypeScript types, and the HTML reference. The wingman then calls seam.putObject('ExecutionDelta', …) on each edit — the same write path SteeringDelta uses, attributed to the operator wearing the Ops hat. The prose log entry stays (it still reads well in the after-action record); the delta is its structured sibling. The share is non-fatal — the append-only log already recorded the event, so a failed write never breaks the live loop.

The results

Insert a +25 min obstruction on the exfil drive and an ExecutionDelta lands in the store with event: 'obstruction', delay_min: 25, and the vehicle’s cell.h3 — and it appears in the Data Analysis index alongside every other object, drilling down to its fields. A new e2e test pins this; npm run typecheck stays at 0 errors (the imported type is generated, not hand-shaped) and the 12 golden/unit tests are unchanged.

One thing this does not do yet: re-running a stamp does not automatically re-apply the captured perturbations — they’re exogenous operator acts. Capturing their structured inputs is the prerequisite; automatic re-application is the natural next step.

Screenshots

An obstruction captured as a typed ExecutionDelta, drilled down in the Data Analysis monitor