From d12a6ea805b50f0a585f27ecfda14010ba71ae2d Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 12 Jun 2026 20:49:38 +0000 Subject: [PATCH] Capture execution-phase edits as typed ExecutionDelta objects (issue #7) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In-flight obstructions and blocks during Execute appended a prose Observation to the append-only log but never reached the content-addressed object store, so their structured inputs were invisible to the Data Analysis monitor and absent for replay (NF3) — unlike SteeringDelta, the first DEC-61 write. Model them in LinkML and write them via the same attributed-delta path: - schema/common.yaml: ExecutionEventKind (obstruction|block) + a HexCell value object (the hex successor to Waypoint). - schema/records.yaml: ExecutionDelta (is_a Delta) — event, at_min, cell, delay_min, rv_min, absorbed_min. Regenerated schema/gen/ + HTML ref. - app/js/wingman/wingman.js: shareExecutionDelta() calls seam.putObject('ExecutionDelta', ...) on each edit, attributed to the operator on the Ops hat. Prose log kept; share is non-fatal. The edits now surface in Data Analysis (with change-glow) and are kept structurally for replay. Replay re-application is deferred (follow-up). New e2e capture test; 0 typecheck errors, 12 unit + 13 e2e green. ADR-0025; specs/004-capture-execution-deltas/. https://claude.ai/code/session_01DhuYTVRy3iJ9j9ha15FcUC --- app/js/wingman/wingman.js | 33 +++++ docs/project_notes/decisions.md | 30 +++++ docs/project_notes/issues.md | 2 + e2e/skeleton.spec.ts | 33 +++++ schema/common.yaml | 19 +++ schema/gen/remit.schema.json | 121 ++++++++++++++++++ schema/gen/remit.ts | 42 ++++++ schema/records.yaml | 24 ++++ site/data-model/index.html | 26 ++-- .../004-capture-execution-deltas/blog/post.md | 68 ++++++++++ .../screenshots/01-execution-delta.png | Bin 0 -> 97035 bytes specs/004-capture-execution-deltas/spec.md | 68 ++++++++++ 12 files changed, 458 insertions(+), 8 deletions(-) create mode 100644 specs/004-capture-execution-deltas/blog/post.md create mode 100644 specs/004-capture-execution-deltas/evidence/screenshots/01-execution-delta.png create mode 100644 specs/004-capture-execution-deltas/spec.md diff --git a/app/js/wingman/wingman.js b/app/js/wingman/wingman.js index 1787c4a..ca58c1d 100644 --- a/app/js/wingman/wingman.js +++ b/app/js/wingman/wingman.js @@ -230,6 +230,25 @@ export function mountWingman(el, ctx) { `
≋ H+${Math.round(exec.simT)} — tide re-assessed: ${oldMode} → ${cur.mode} · ${cur.narrative}
`; } + // Capture an in-flight perturbation as a typed, content-addressed store object + // (issue #7), not just a prose log note: structured inputs that survive for the + // Data Analysis monitor and replay (NF3). Re-uses the DEC-61 attributed-delta + // write path (cf. SteeringDelta) — operator wearing the Ops hat. Non-fatal: the + // append-only log entry already records the event, so a failed share never + // breaks the live loop. + async function shareExecutionDelta(/** @type {Partial} */ fields) { + /** @type {import('../../../schema/gen/remit').ExecutionDelta} */ + const delta = { + scope: 'execution', by: 'operator', role: 'duty-officer-ops', + at: new Date().toISOString(), + event: 'obstruction', + ...fields, + }; + await ctx.seam.putObject('ExecutionDelta', delta).catch((/** @type {any} */ err) => + $('#wx-alerts').innerHTML += + `
could not share execution delta (logged locally): ${err?.message ?? err}
`); + } + async function addObstruction(/** @type {number} */ mins) { if (exec.complete || !world) return; const tau = exec.lastTau; @@ -274,6 +293,14 @@ export function mountWingman(el, ctx) { }, source: 'operator', confidence: 'reported', }); + await shareExecutionDelta({ + event: 'obstruction', + at_min: Math.round(exec.simT), + cell: { h3: cell.h3, lat: cell.lat, lng: cell.lng }, + delay_min: mins, + rv_min: missionEnd, + absorbed_min: absorbed > 0 ? absorbed : 0, + }); await maybeTideAlert(oldMode); await refreshLog(); await tick(0); @@ -318,6 +345,12 @@ export function mountWingman(el, ctx) { fact_delta: { note: `Cell ${shortH3(next.h3)} blocked — re-routed in flight`, tag: 'track-state' }, source: 'operator', confidence: 'reported', }); + await shareExecutionDelta({ + event: 'block', + at_min: Math.round(exec.simT), + cell: { h3: next.h3, lat: next.lat, lng: next.lng }, + rv_min: missionEnd, + }); await maybeTideAlert(oldMode); await refreshLog(); await tick(0); diff --git a/docs/project_notes/decisions.md b/docs/project_notes/decisions.md index b33035c..cb88086 100644 --- a/docs/project_notes/decisions.md +++ b/docs/project_notes/decisions.md @@ -631,3 +631,33 @@ consequences. Link evidence (e.g. `specs//evidence/`) where relevant. (new typedefs incl. `HexAO`, `Strat`/`Leg`/`RerouteOpts`, `Entity`/`Aspect`). `app/hexviz.js` (a standalone evidence page) is outside `include`; type-checking the Node-side tooling (`test`/`e2e`/`run-playwright.mjs`) is a possible follow-up under a second, Node-lib config. + +## ADR-0025 (2026-06-12) — Capture execution-phase perturbations as typed `ExecutionDelta` store objects (issue #7) + +- **Context:** the Execute phase lets the operator perturb a live run — an obstruction + (`+5`/`+25 min` hold) or a blocked cell forcing a re-route. Both appended a prose + `Observation` to the append-only execution log, but their *structured* inputs (cell, + minutes, resulting RV) lived only in transient wingman UI state. Nothing reached the + content-addressed object store, so — unlike `SteeringDelta` (the first DEC-61 write) — the + perturbations were invisible to the Data Analysis monitor and carried no structured inputs + for replay (NF3). The maintainer raised this as issue #7: *"they aren't captured in the + model. Should they be?"* +- **Decision:** **Yes.** Model the perturbation in LinkML and write it via the existing + DEC-61 attributed-delta path. Added `ExecutionEventKind` (`obstruction`|`block`) + a + `HexCell` value object (`h3` + optional `lat`/`lng`, the hex successor to `Waypoint`) to + `common`, and a concrete `ExecutionDelta (is_a: Delta)` to `records` (`event`, `at_min`, + `cell`, `delay_min`, `rv_min`, `absorbed_min`); regenerated `schema/gen/` + the HTML + reference. The wingman calls `seam.putObject('ExecutionDelta', …)` on each edit, attributed + to the operator wearing the **Ops** hat (`role: 'duty-officer-ops'`). +- **Options considered:** (a) pack the fields into the prose log entry — still invisible to + the store-backed monitor/replay; rejected. (b) a hand-written wingman UI-state object — + violates the LinkML one-source-of-truth rule (ADR-0012) the moment it crosses into the + shared store; rejected. (c) a generated typed delta mirroring `SteeringDelta` — **chosen**. +- **Consequences:** in-flight edits now appear in Data Analysis (with change-glow) and are + structurally preserved for replay. The prose log entry is **kept** (it reads well in the + after-action record) — the delta is its structured sibling, not a replacement; the share is + **non-fatal** (a failed write never breaks the live loop, since the log already recorded + the event). **Not done:** re-running a stamp does not yet *re-apply* the captured + perturbations (they're exogenous operator acts) — capturing the inputs is the prerequisite, + automatic re-application is the follow-up. `HexCell` is now the natural type to migrate the + documented square-vs-hex `Constraint.cells` drift in `SteeringDelta` onto (bugs.md). diff --git a/docs/project_notes/issues.md b/docs/project_notes/issues.md index 500527e..1a33085 100644 --- a/docs/project_notes/issues.md +++ b/docs/project_notes/issues.md @@ -51,4 +51,6 @@ evidence (e.g. `specs//evidence/`). | 2026-06-12 | PR #5 | Just-in-time departure (maintainer suggestion). A COA whose exfil would hold *at the exposed bank* for the tide now **leaves base late instead**, reaching the wath exactly at low water — same RV, no exposed wait. The tide-waiting (blue/`tracked`) COA departs ~51 min after the drive-the-road (`direct`) COA, so you watch **two vehicles move at different times** rather than one overlapping marker (`kernel.js materialise()`). Schedule becomes `[hold(delay), transit, visit, exfil]`; plan ids unchanged (they key off the decision inputs, not the materialisation — NF3), so only the golden's schedule/wait assertions moved. 12 unit + 12 e2e green. | ADR-0023 · [#5](https://github.com/DeepBlueCLtd/REMIT/pull/5) | +| 2026-06-12 | issue [#7](https://github.com/DeepBlueCLtd/REMIT/issues/7) | **Capture execution-phase edits in the model (ADR-0025).** In-flight obstructions/blocks during Execute appended a prose `Observation` to the log but never reached the content-addressed store, so their structured inputs were invisible to Data Analysis and absent for replay (NF3). Modelled them in LinkML — `ExecutionEventKind` + a `HexCell` value object (hex successor to `Waypoint`) in `common`, a concrete `ExecutionDelta(is_a Delta)` in `records` (`event`/`at_min`/`cell`/`delay_min`/`rv_min`/`absorbed_min`); regenerated `schema/gen/` + HTML ref (62→64 classes, 20→21 enums). The wingman now `seam.putObject('ExecutionDelta', …)` on each edit (operator wearing the Ops hat), mirroring `SteeringDelta`; prose log kept, share non-fatal. New e2e capture test; 0 typecheck errors, 12 unit green. Replay re-application deferred (follow-up). | ADR-0025 · `specs/004-capture-execution-deltas/` | + | 2026-06-12 | [#8](https://github.com/DeepBlueCLtd/REMIT/pull/8) | **Enforced the JSDoc type-checking the app already declared (ADR-0024).** Every `app/js` file carried `// @ts-check` + JSDoc but nothing ran it; added root `tsconfig.json` (checkJs+strict, noEmit, types:[], DOM/bundler), pinned `typescript`, added `npm run typecheck`, and a `typecheck.yml` CI gate (PR + push-to-main). Drove the app **442 → 0** type errors across 18 files — precise types for DOM/primitives/shared shapes (new typedefs `HexAO`, `Strat`/`Leg`/`RerouteOpts`, `Cell`/`Profile`/`TrajPoint`, `Entity`/`Aspect`…), `any` only for opaque serialisable blobs (plan/requirement/log/viz, per ADR-0012); **zero `@ts-ignore`/`@ts-nocheck`**. Fixed real drift it surfaced: stale pre-hex `wingman.js` annotations (`grid`→`ao`, `{x,y}`→`{h3}` callbacks), two `stateAt` null-guards, an `Entity.domain` tuple, a `@types/node` `setTimeout`→`Timeout` leak, and a documented **SteeringDelta hex-vs-square schema drift** (both in `bugs.md`). No source migrated to `.ts`, no runtime build step added; 12 unit green, e2e in CI. | ADR-0024 · [#8](https://github.com/DeepBlueCLtd/REMIT/pull/8) | diff --git a/e2e/skeleton.spec.ts b/e2e/skeleton.spec.ts index 31470b1..a568edb 100644 --- a/e2e/skeleton.spec.ts +++ b/e2e/skeleton.spec.ts @@ -152,6 +152,39 @@ test('the hex grid can be toggled off and on (basemap shows through)', async ({ await expect(map).toHaveAttribute('data-hexes', 'on'); // and back }); +test('execute: an obstruction is captured in the model as a typed ExecutionDelta (issue #7)', async ({ page }) => { + await page.goto('/'); + await walkToPlan(page); + await page.getByTestId('continue-compare').click(); + await page.getByTestId('pick-direct').check(); + await page.getByTestId('cmp-commit').click(); + await page.getByTestId('continue-execute').click(); + + // Step past the visit into the exfil drive (where an obstruction applies — the + // vehicle is on the move), then insert a +25 min obstruction. + for (let i = 0; i < 7; i++) await page.getByTestId('wx-step10').click(); + await page.getByTestId('wx-delay').click(); + + // The perturbation lands in the shared content store as a typed ExecutionDelta — + // structured inputs (event/cell/delay), not just a prose log note (issue #7). + await expect.poll(() => page.evaluate(() => { + const w = (window as any).__remit; + const rec = w.objects.list().reverse().find((o: any) => o.type === 'ExecutionDelta'); + if (!rec) return false; + const d = w.objects.get(rec.id).body; + return d.event === 'obstruction' && d.delay_min === 25 && typeof d.cell?.h3 === 'string'; + })).toBe(true); + + // It surfaces in the Data Analysis monitor like any other store object. + await page.getByTestId('tab-data-analysis').click(); + await expect(page.getByTestId('da-index')).toContainText('ExecutionDelta'); + await page.locator('.da-group[data-group="ExecutionDelta"] .da-row').first().click(); + await page.screenshot({ + path: 'specs/004-capture-execution-deltas/evidence/screenshots/01-execution-delta.png', + fullPage: true }); + await noFault(page); +}); + test('execute: blocking the next hex re-routes in flight', async ({ page }) => { await page.goto('/'); await walkToPlan(page); diff --git a/schema/common.yaml b/schema/common.yaml index 86ce76f..22cbc72 100644 --- a/schema/common.yaml +++ b/schema/common.yaml @@ -161,6 +161,13 @@ enums: Observation: {} Waiver: {} Replan: {} + ExecutionEventKind: + description: The kind of in-flight operator perturbation applied during Execute (issue #7). + permissible_values: + obstruction: + description: a +N min hold spliced at the vehicle's current cell, re-timed through the tide-aware chooser (ADR-0006/0007) + block: + description: a cell ahead declared impassable, forcing an in-flight re-route around it classes: Attribution: description: Who decided, under what authority, when. Stamped on every committing act — this is universal rule 2 (DEC-15, NF2). @@ -202,3 +209,15 @@ classes: required: true alias: description: a human-friendly name, e.g. "OP-21,3" + HexCell: + description: A single H3 hex location — the hex-grid successor to Waypoint (ADR-0014). Identified by its H3 index, with an optional lat/lng centre for rendering. + attributes: + h3: + required: true + description: the H3 cell index (res 9) + lat: + range: float + description: cell-centre latitude + lng: + range: float + description: cell-centre longitude diff --git a/schema/gen/remit.schema.json b/schema/gen/remit.schema.json index 0380832..a41faaa 100644 --- a/schema/gen/remit.schema.json +++ b/schema/gen/remit.schema.json @@ -1290,6 +1290,98 @@ "title": "Excursion", "type": "object" }, + "ExecutionDelta": { + "additionalProperties": false, + "description": "An in-flight operator perturbation during Execute (issue #7): an obstruction (a +N min hold at the vehicle's current cell) or a blocked cell forcing a re-route. Previously these survived only as a prose Observation note; capturing them as a typed, content-addressed store object preserves their structured inputs for inspection (the Data Analysis monitor) and replay (NF3), and re-uses the DEC-61 attributed-delta write path. Identity is content (DEC-35).", + "properties": { + "absorbed_min": { + "description": "minutes the downstream holds absorbed, so the RV slipped less than delay_min (ADR-0007)", + "type": [ + "number", + "null" + ] + }, + "at": { + "description": "when it was contributed (DEC-15, NF2)", + "format": "date-time", + "type": [ + "string", + "null" + ] + }, + "at_min": { + "description": "mission minutes when applied (sim-time \u2261 plan-time, ADR-0007)", + "type": [ + "integer", + "null" + ] + }, + "by": { + "description": "the contributing author", + "type": [ + "string", + "null" + ] + }, + "cell": { + "anyOf": [ + { + "$ref": "#/$defs/HexCell" + }, + { + "type": "null" + } + ], + "description": "where the perturbation bites \u2014 the vehicle's cell for an obstruction, the blocked cell for a block" + }, + "delay_min": { + "description": "the hold added by an obstruction (absent for a block)", + "type": [ + "number", + "null" + ] + }, + "event": { + "$ref": "#/$defs/ExecutionEventKind", + "description": "which perturbation \u2014 obstruction or block" + }, + "role": { + "description": "\"the contributing role-hat \u2014 e.g. duty-officer-plans\"", + "type": [ + "string", + "null" + ] + }, + "rv_min": { + "description": "the re-planned RV / mission-end after the perturbation", + "type": [ + "number", + "null" + ] + }, + "scope": { + "description": "\"the write-scope this delta falls under \u2014 e.g. steering\"", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "event" + ], + "title": "ExecutionDelta", + "type": "object" + }, + "ExecutionEventKind": { + "description": "The kind of in-flight operator perturbation applied during Execute (issue", + "enum": [ + "obstruction", + "block" + ], + "title": "ExecutionEventKind", + "type": "string" + }, "ExecutionLog": { "additionalProperties": false, "description": "The append-only live history of a mission (DEC-23/25/26): alerts when a band is crossed, observations that update truth, waivers, and replans \u2014 never overwritten. Together with rationales and stamps it gives a complete after-action record with perfect replay (F1).", @@ -1370,6 +1462,35 @@ "title": "Grid2D", "type": "object" }, + "HexCell": { + "additionalProperties": false, + "description": "A single H3 hex location \u2014 the hex-grid successor to Waypoint (ADR-0014). Identified by its H3 index, with an optional lat/lng centre for rendering.", + "properties": { + "h3": { + "description": "the H3 cell index (res 9)", + "type": "string" + }, + "lat": { + "description": "cell-centre latitude", + "type": [ + "number", + "null" + ] + }, + "lng": { + "description": "cell-centre longitude", + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "h3" + ], + "title": "HexCell", + "type": "object" + }, "Lineage": { "additionalProperties": false, "description": "Hash-link back to the version this one supersedes (universal rule 1).", diff --git a/schema/gen/remit.ts b/schema/gen/remit.ts index 18268b8..3e95522 100644 --- a/schema/gen/remit.ts +++ b/schema/gen/remit.ts @@ -213,6 +213,16 @@ export enum LogEntryKind { Waiver = "Waiver", Replan = "Replan", }; +/** +* The kind of in-flight operator perturbation applied during Execute (issue +*/ +export enum ExecutionEventKind { + + /** a +N min hold spliced at the vehicle's current cell, re-timed through the tide-aware chooser (ADR-0006/0007) */ + obstruction = "obstruction", + /** a cell ahead declared impassable, forcing an in-flight re-route around it */ + block = "block", +}; /** @@ -264,6 +274,19 @@ export interface Waypoint { } +/** + * A single H3 hex location — the hex-grid successor to Waypoint (ADR-0014). Identified by its H3 index, with an optional lat/lng centre for rendering. + */ +export interface HexCell { + /** the H3 cell index (res 9) */ + h3: string, + /** cell-centre latitude */ + lat?: number, + /** cell-centre longitude */ + lng?: number, +} + + /** * A commitment's ownership and waiver authority (B3). */ @@ -1011,4 +1034,23 @@ export interface SteeringDelta extends Delta { } +/** + * An in-flight operator perturbation during Execute (issue #7): an obstruction (a +N min hold at the vehicle's current cell) or a blocked cell forcing a re-route. Previously these survived only as a prose Observation note; capturing them as a typed, content-addressed store object preserves their structured inputs for inspection (the Data Analysis monitor) and replay (NF3), and re-uses the DEC-61 attributed-delta write path. Identity is content (DEC-35). + */ +export interface ExecutionDelta extends Delta { + /** which perturbation — obstruction or block */ + event: string, + /** mission minutes when applied (sim-time ≡ plan-time, ADR-0007) */ + at_min?: number, + /** where the perturbation bites — the vehicle's cell for an obstruction, the blocked cell for a block */ + cell?: HexCell, + /** the hold added by an obstruction (absent for a block) */ + delay_min?: number, + /** the re-planned RV / mission-end after the perturbation */ + rv_min?: number, + /** minutes the downstream holds absorbed, so the RV slipped less than delay_min (ADR-0007) */ + absorbed_min?: number, +} + + diff --git a/schema/records.yaml b/schema/records.yaml index 7832409..118fb8b 100644 --- a/schema/records.yaml +++ b/schema/records.yaml @@ -155,3 +155,27 @@ classes: multivalued: true inlined_as_list: true description: the interpreted steering gestures shared (DEC-24) — e.g. no-go regions + ExecutionDelta: + is_a: Delta + description: 'An in-flight operator perturbation during Execute (issue #7): an obstruction (a +N min hold at the vehicle''s current cell) or a blocked cell forcing a re-route. Previously these survived only as a prose Observation note; capturing them as a typed, content-addressed store object preserves their structured inputs for inspection (the Data Analysis monitor) and replay (NF3), and re-uses the DEC-61 attributed-delta write path. Identity is content (DEC-35).' + attributes: + event: + range: ExecutionEventKind + required: true + description: which perturbation — obstruction or block + at_min: + range: integer + description: mission minutes when applied (sim-time ≡ plan-time, ADR-0007) + cell: + range: HexCell + inlined: true + description: where the perturbation bites — the vehicle's cell for an obstruction, the blocked cell for a block + delay_min: + range: float + description: the hold added by an obstruction (absent for a block) + rv_min: + range: float + description: the re-planned RV / mission-end after the perturbation + absorbed_min: + range: float + description: minutes the downstream holds absorbed, so the RV slipped less than delay_min (ADR-0007) diff --git a/site/data-model/index.html b/site/data-model/index.html index fbd562f..8c51772 100644 --- a/site/data-model/index.html +++ b/site/data-model/index.html @@ -90,10 +90,10 @@

Generated reference · LinkML (DEC-57)

REMIT — v1 Data Model

The serialisable object core of REMIT's v1 mission-planning model — the shapes mission planning is built from. This LinkML schema is the Doc-owned source of truth (DEC-57): one schema generates JSON Schema, TypeScript types, and this hyperlinked reference + ER diagrams. `docs/remit-data-model.md` is the prose spine; the field names and structures here are reconciled against the objects the walking-skeleton app actually constructs (`app/js/**`), so the schema agrees with the running code.

-
7 modules62 classes -20 enumsJSON Schema & TypeScript generated alongside
-
-

The model at a glance

The serialisable object core, split into 7 modules.

Whole-model ER diagram

Every typed association across the modules, drawn in your browser (Mermaid). Scroll to zoom, drag to pan, click a box to jump to its class.

Show the 62-class diagram
erDiagram
+
7 modules64 classes +21 enumsJSON Schema & TypeScript generated alongside
+
+

The model at a glance

The serialisable object core, split into 7 modules.

Whole-model ER diagram

Every typed association across the modules, drawn in your browser (Mermaid). Scroll to zoom, drag to pan, click a box to jump to its class.

Show the 64-class diagram
erDiagram
   Attribution {
   }
   DataProvenance {
@@ -102,6 +102,8 @@ 

REMIT — v1 Data Model

The serialisable object core of } Waypoint { } + HexCell { + } CommitmentProvenance { } Requirement { @@ -218,6 +220,8 @@

REMIT — v1 Data Model

The serialisable object core of } SteeringDelta { } + ExecutionDelta { + } Requirement ||--o| Attribution : "provenance" Requirement ||--o{ Commitment : "commitments" Requirement ||--o| Lineage : "lineage" @@ -293,7 +297,8 @@

REMIT — v1 Data Model

The serialisable object core of Replan ||..o| Plan : "from" Replan ||..o| Plan : "to" Replan ||..o| SelectionRationale : "rationale_ref" - SteeringDelta ||--o{ Constraint : "constraints"

contains (inlined)  ·  references (by id)  ·  o{ many  || one  o| optional. Boxes outside the module are classes defined elsewhere.

Common 4 classes · 20 enums

Shared value objects and the enum vocabulary used across the REMIT data model. Imported by every other module.

erDiagram
+  SteeringDelta ||--o{ Constraint : "constraints"
+  ExecutionDelta ||--o| HexCell : "cell"

contains (inlined)  ·  references (by id)  ·  o{ many  || one  o| optional. Boxes outside the module are classes defined elsewhere.

Common 5 classes · 20 enums

Shared value objects and the enum vocabulary used across the REMIT data model. Imported by every other module.

erDiagram
   Attribution {
   }
   DataProvenance {
@@ -301,7 +306,9 @@ 

REMIT — v1 Data Model

The serialisable object core of Lineage { } Waypoint { - }

contains (inlined)  ·  references (by id)  ·  o{ many  || one  o| optional. Boxes outside the module are classes defined elsewhere.

Attribution

Who decided, under what authority, when. Stamped on every committing act — this is universal rule 2 (DEC-15, NF2).

fieldtypecarddescription
issuing_rolestring0..1the role-hat the author wore
authoritystring0..1the authority the act was taken under
bystring0..1the author
atdatetime0..1ISO timestamp of the act

DataProvenance

The source and trust of a datum or entity (DEC-19). Trivial defaults in v1.

fieldtypecarddescription
kindstring1source-class — one of: self, planned, forecast, observed, provider. The prose model separates entity kind (self/actor/feature/phenomenon) from data provenance (planned/forecast/observed); the skeleton folds them, using self/forecast/provider. A documented string rather than an enum (see the AspectType note).
confidenceConfidenceLevel0..1
freshnessstring0..1how recent — e.g. "provisioned"

Lineage

Hash-link back to the version this one supersedes (universal rule 1).

fieldtypecarddescription
previous_versionstring0..1id of the prior Requirement version
amending_order_refstring0..1reference to the amending order, if any

Waypoint

A single grid location.

fieldtypecarddescription
xinteger1
yinteger1
aliasstring0..1a human-friendly name, e.g. "OP-21,3"

Requirement 12 classes

The requirement and the promises in it: Requirement -> Commitment -> Activity (DEC-5/16/17/18).

erDiagram
+  }
+  HexCell {
+  }

contains (inlined)  ·  references (by id)  ·  o{ many  || one  o| optional. Boxes outside the module are classes defined elsewhere.

Attribution

Who decided, under what authority, when. Stamped on every committing act — this is universal rule 2 (DEC-15, NF2).

fieldtypecarddescription
issuing_rolestring0..1the role-hat the author wore
authoritystring0..1the authority the act was taken under
bystring0..1the author
atdatetime0..1ISO timestamp of the act

DataProvenance

The source and trust of a datum or entity (DEC-19). Trivial defaults in v1.

fieldtypecarddescription
kindstring1source-class — one of: self, planned, forecast, observed, provider. The prose model separates entity kind (self/actor/feature/phenomenon) from data provenance (planned/forecast/observed); the skeleton folds them, using self/forecast/provider. A documented string rather than an enum (see the AspectType note).
confidenceConfidenceLevel0..1
freshnessstring0..1how recent — e.g. "provisioned"

Lineage

Hash-link back to the version this one supersedes (universal rule 1).

fieldtypecarddescription
previous_versionstring0..1id of the prior Requirement version
amending_order_refstring0..1reference to the amending order, if any

Waypoint

A single grid location.

fieldtypecarddescription
xinteger1
yinteger1
aliasstring0..1a human-friendly name, e.g. "OP-21,3"

HexCell

A single H3 hex location — the hex-grid successor to Waypoint (ADR-0014). Identified by its H3 index, with an optional lat/lng centre for rendering.

fieldtypecarddescription
h3string1the H3 cell index (res 9)
latfloat0..1cell-centre latitude
lngfloat0..1cell-centre longitude

Requirement 12 classes

The requirement and the promises in it: Requirement -> Commitment -> Activity (DEC-5/16/17/18).

erDiagram
   CommitmentProvenance {
   }
   Requirement {
@@ -457,7 +464,7 @@ 

REMIT — v1 Data Model

The serialisable object core of ScheduleLeg ||..o| Commitment : "commitment_id" Scores ||--o{ Satisfaction : "satisfaction" Satisfaction ||..o| Commitment : "commitment_id" - Conflict ||..o{ Commitment : "parties"

contains (inlined)  ·  references (by id)  ·  o{ many  || one  o| optional. Boxes outside the module are classes defined elsewhere.

Stamp

Every input that determines a plan, bundled into one identity (DEC-23/24/29): which requirement, which world, which config core, what appetites and steering, which kernel and seed. A plan's id IS the hash of its Stamp, so two plans are comparable only when their stamps share a basis (the comparability guard). Skeleton additions (DEC-47): `profile_version` and `start` are part of identity because the plan depends on the platform and the starting state.

fieldtypecarddescription
requirement_versionRequirement0..1id of the requirement version
baseline_versionBaseline0..1id of the baseline version
excursionsExcursion0..*ids of the excursion versions (empty in v1)
config_core_hashstring0..1hash of the world-defining config core — medium/channels/movement-model/providers/vocabulary; the instance shell is excluded (DEC-48)
profile_versionProfile0..1id of the profile version (skeleton addition, DEC-47)
startStartState0..1the starting state (skeleton addition, DEC-47)
appetitesAppetite0..*the implementer's risk dials (DEC-6)
steeringConstraint0..*interpreted operator gestures / no-go constraints (DEC-24)
kernel_versionstring0..1e.g. "mock-0.1" — part of identity (DEC-29)
strategy_seedinteger0..1RNG seed for strategy ordering — part of identity (DEC-29)

StartState

The starting position and clock baked into a Stamp (skeleton, DEC-47).

fieldtypecarddescription
xinteger0..1
yinteger0..1
clock_mininteger0..1

Appetite

One risk-appetite dial setting (DEC-6) — e.g. tempo = rapid, exposure = cautious.

fieldtypecarddescription
axisstring0..1"e.g. tempo, exposure"
settingstring0..1"e.g. deliberate/balanced/rapid, bold/balanced/cautious"

Constraint

One interpreted operator steering gesture (DEC-24) — e.g. a no-go region.

fieldtypecarddescription
typestring0..1"e.g. no-go"
cellsWaypoint0..*

Strategy

One candidate strategy in the plan handful (skeleton).

fieldtypecarddescription
keyStrategyKey1
labelstring0..1
axisstring0..1the axis it optimises, e.g. "time/speed"
blurbstring0..1a one-line description

Plan

identified

A candidate solution whose id IS the hash of its Stamp (DEC-5/22/29). Its materialisation (schedule, trajectory, state curves) is cached and regenerable; its scores and first-class conflicts make it comparable. The skeleton also carries the chosen `strategy` and the `tide_decision` weighing.

fieldtypecarddescription
ididstring1"= hash(Stamp, strategy)"
strategyStrategy0..1
stampStamp0..1authoritative — the plan's identity basis
materialisationMaterialisation0..1cached, regenerable; null when infeasible
scoresScores0..1
tide_decisionTideDecision0..1the exfil wait-vs-detour weighing (ADR-0006); null when no ford
conflictsConflict0..*first-class, named clashes (C1)

Materialisation

The cached, regenerable working-out of a plan; absent when the plan is infeasible.

fieldtypecarddescription
scheduleScheduleLeg0..*
trajectoryTrajectoryPoint0..*
state_curvesStateCurves0..1
tideTideDecision0..1the tide decision at plan time
verifiedboolean0..1
kernel_version_verifiedstring0..1the kernel version that verified the materialisation

ScheduleLeg

One leg of a plan's schedule. Exfil legs may carry a tide hold (ADR-0006).

fieldtypecarddescription
kindScheduleLegKind1
labelstring0..1
start_minfloat0..1
end_minfloat0..1
commitment_idCommitment0..1the commitment this leg serves (visit/exfil legs)

TrajectoryPoint

One sampled point on the platform's path; coordinates may be fractional, time/fuel rounded to 1 dp for IEEE stability.

fieldtypecarddescription
xfloat0..1
yfloat0..1
tfloat0..1mission minutes
fuel_pctfloat0..1

StateCurves

The end-state of the platform's curves over the plan (v1 carries fuel only).

fieldtypecarddescription
fuel_end_pctfloat0..1

Scores

A plan's comparable scores, read under the comparability guard (A2/C2/C6, NF10).

fieldtypecarddescription
satisfactionSatisfaction0..*
cost_bandBand0..1
robustness_bandBand0..1

Satisfaction

One commitment's verdict and slack within a plan.

fieldtypecarddescription
commitment_idCommitment0..1
labelstring0..1
margin_minfloat0..1slack in minutes; may be negative
margin_bandMarginBand0..1
verdictVerdict0..1

TideDecision

The result of the tidal-ford wait-vs-detour weighing (ADR-0006): the kernel materialises the exfil both ways — wait at the bank vs a ford-free detour — and commits to the earlier RV arrival, publishing the choice here.

fieldtypecarddescription
modeTideMode1
wait_minfloat0..1minutes held at the bank before crossing
ford_rvfloat0..1mission minutes the ford route reaches the RV
detour_rvfloat0..1mission minutes the detour route reaches the RV; null when no detour exists
narrativestring0..1the choice, in words

Conflict

identified

A first-class, named clash when commitments cannot all be kept (C1) — not a silent failure.

fieldtypecarddescription
ididstring1
kindConflictKind1
partiesCommitment0..*the commitments in tension
narrativestring0..1what the clash is, in words

Records 12 classes

The decision and execution record: SelectionRationale and the append-only ExecutionLog (DEC-23/25/26).

erDiagram
+  Conflict ||..o{ Commitment : "parties"

contains (inlined)  ·  references (by id)  ·  o{ many  || one  o| optional. Boxes outside the module are classes defined elsewhere.

Stamp

Every input that determines a plan, bundled into one identity (DEC-23/24/29): which requirement, which world, which config core, what appetites and steering, which kernel and seed. A plan's id IS the hash of its Stamp, so two plans are comparable only when their stamps share a basis (the comparability guard). Skeleton additions (DEC-47): `profile_version` and `start` are part of identity because the plan depends on the platform and the starting state.

fieldtypecarddescription
requirement_versionRequirement0..1id of the requirement version
baseline_versionBaseline0..1id of the baseline version
excursionsExcursion0..*ids of the excursion versions (empty in v1)
config_core_hashstring0..1hash of the world-defining config core — medium/channels/movement-model/providers/vocabulary; the instance shell is excluded (DEC-48)
profile_versionProfile0..1id of the profile version (skeleton addition, DEC-47)
startStartState0..1the starting state (skeleton addition, DEC-47)
appetitesAppetite0..*the implementer's risk dials (DEC-6)
steeringConstraint0..*interpreted operator gestures / no-go constraints (DEC-24)
kernel_versionstring0..1e.g. "mock-0.1" — part of identity (DEC-29)
strategy_seedinteger0..1RNG seed for strategy ordering — part of identity (DEC-29)

StartState

The starting position and clock baked into a Stamp (skeleton, DEC-47).

fieldtypecarddescription
xinteger0..1
yinteger0..1
clock_mininteger0..1

Appetite

One risk-appetite dial setting (DEC-6) — e.g. tempo = rapid, exposure = cautious.

fieldtypecarddescription
axisstring0..1"e.g. tempo, exposure"
settingstring0..1"e.g. deliberate/balanced/rapid, bold/balanced/cautious"

Constraint

One interpreted operator steering gesture (DEC-24) — e.g. a no-go region.

fieldtypecarddescription
typestring0..1"e.g. no-go"
cellsWaypoint0..*

Strategy

One candidate strategy in the plan handful (skeleton).

fieldtypecarddescription
keyStrategyKey1
labelstring0..1
axisstring0..1the axis it optimises, e.g. "time/speed"
blurbstring0..1a one-line description

Plan

identified

A candidate solution whose id IS the hash of its Stamp (DEC-5/22/29). Its materialisation (schedule, trajectory, state curves) is cached and regenerable; its scores and first-class conflicts make it comparable. The skeleton also carries the chosen `strategy` and the `tide_decision` weighing.

fieldtypecarddescription
ididstring1"= hash(Stamp, strategy)"
strategyStrategy0..1
stampStamp0..1authoritative — the plan's identity basis
materialisationMaterialisation0..1cached, regenerable; null when infeasible
scoresScores0..1
tide_decisionTideDecision0..1the exfil wait-vs-detour weighing (ADR-0006); null when no ford
conflictsConflict0..*first-class, named clashes (C1)

Materialisation

The cached, regenerable working-out of a plan; absent when the plan is infeasible.

fieldtypecarddescription
scheduleScheduleLeg0..*
trajectoryTrajectoryPoint0..*
state_curvesStateCurves0..1
tideTideDecision0..1the tide decision at plan time
verifiedboolean0..1
kernel_version_verifiedstring0..1the kernel version that verified the materialisation

ScheduleLeg

One leg of a plan's schedule. Exfil legs may carry a tide hold (ADR-0006).

fieldtypecarddescription
kindScheduleLegKind1
labelstring0..1
start_minfloat0..1
end_minfloat0..1
commitment_idCommitment0..1the commitment this leg serves (visit/exfil legs)

TrajectoryPoint

One sampled point on the platform's path; coordinates may be fractional, time/fuel rounded to 1 dp for IEEE stability.

fieldtypecarddescription
xfloat0..1
yfloat0..1
tfloat0..1mission minutes
fuel_pctfloat0..1

StateCurves

The end-state of the platform's curves over the plan (v1 carries fuel only).

fieldtypecarddescription
fuel_end_pctfloat0..1

Scores

A plan's comparable scores, read under the comparability guard (A2/C2/C6, NF10).

fieldtypecarddescription
satisfactionSatisfaction0..*
cost_bandBand0..1
robustness_bandBand0..1

Satisfaction

One commitment's verdict and slack within a plan.

fieldtypecarddescription
commitment_idCommitment0..1
labelstring0..1
margin_minfloat0..1slack in minutes; may be negative
margin_bandMarginBand0..1
verdictVerdict0..1

TideDecision

The result of the tidal-ford wait-vs-detour weighing (ADR-0006): the kernel materialises the exfil both ways — wait at the bank vs a ford-free detour — and commits to the earlier RV arrival, publishing the choice here.

fieldtypecarddescription
modeTideMode1
wait_minfloat0..1minutes held at the bank before crossing
ford_rvfloat0..1mission minutes the ford route reaches the RV
detour_rvfloat0..1mission minutes the detour route reaches the RV; null when no detour exists
narrativestring0..1the choice, in words

Conflict

identified

A first-class, named clash when commitments cannot all be kept (C1) — not a silent failure.

fieldtypecarddescription
ididstring1
kindConflictKind1
partiesCommitment0..*the commitments in tension
narrativestring0..1what the clash is, in words

Records 13 classes

The decision and execution record: SelectionRationale and the append-only ExecutionLog (DEC-23/25/26).

erDiagram
   SelectionRationale {
   }
   ChosenBands {
@@ -482,6 +489,8 @@ 

REMIT — v1 Data Model

The serialisable object core of } SteeringDelta { } + ExecutionDelta { + } SelectionRationale ||..o| Plan : "chosen" SelectionRationale ||..o{ Plan : "beaten" SelectionRationale ||--o{ Appetite : "appetites" @@ -493,7 +502,8 @@

REMIT — v1 Data Model

The serialisable object core of Replan ||..o| Plan : "from" Replan ||..o| Plan : "to" Replan ||..o| SelectionRationale : "rationale_ref" - SteeringDelta ||--o{ Constraint : "constraints"

contains (inlined)  ·  references (by id)  ·  o{ many  || one  o| optional. Boxes outside the module are classes defined elsewhere.

SelectionRationale

identified

The record of a choice (DEC-23): which plan won, which it beat, on which axis, with the after-mitigation bands, and who decided. Content-addressed.

fieldtypecarddescription
ididstring1content id of the canonical form (DEC-35)
chosenPlan0..1the winning plan
beatenPlan0..*the field it beat
deciding_axisstring0..1"what tipped it — e.g. time/speed, exposure, robustness, completeness"
notestring0..1the justification narrative
appetitesAppetite0..*the risk-appetite selections at the time
mitigationsstring0..*"e.g. armed-escort"
chosen_bandsChosenBands0..1cost/robustness bands after mitigations
bystring0..1
rolestring0..1"e.g. implementer"
atdatetime0..1

ChosenBands

fieldtypecarddescription
costBand0..1
robBand0..1

ExecutionLog

The append-only live history of a mission (DEC-23/25/26): alerts when a band is crossed, observations that update truth, waivers, and replans — never overwritten. Together with rationales and stamps it gives a complete after-action record with perfect replay (F1).

fieldtypecarddescription
entriesLogEntry0..*

LogEntry

abstract

Base of the append-only execution log; the store stamps each with a `seq`.

fieldtypecarddescription
kindLogEntryKind1
seqinteger0..10-indexed sequence, stamped on append
atinteger0..1mission minutes

Alert

is a LogEntry

A band crossing or hard-infeasibility raised during execution (E3).

fieldtypecarddescription
causeAlertCause0..1
kindinheritedLogEntryKind1
seqinheritedinteger0..10-indexed sequence, stamped on append
atinheritedinteger0..1mission minutes

AlertCause

fieldtypecarddescription
typeAlertCauseType1
commitmentstring0..1the phased commitment being tracked (e.g. "observe", "exfil")
fromstring0..1the prior band state
tostring0..1the new band state

Observation

is a LogEntry

A fact delta appended to the baseline's fact layer (E5).

fieldtypecarddescription
fact_deltaFactDelta0..1
sourcestring0..1"e.g. operator"
confidencestring0..1"e.g. reported"
kindinheritedLogEntryKind1
seqinheritedinteger0..10-indexed sequence, stamped on append
atinheritedinteger0..1mission minutes

FactDelta

fieldtypecarddescription
notestring0..1
tagstring0..1"e.g. track-state, sighting, weather"

Waiver

is a LogEntry

A relaxed commitment, attributed (B3). Not yet logged in the v1 skeleton.

fieldtypecarddescription
commitment_idCommitment0..1
bystring0..1
authoritystring0..1
rationalestring0..1
kindinheritedLogEntryKind1
seqinheritedinteger0..10-indexed sequence, stamped on append
atinheritedinteger0..1mission minutes

Replan

is a LogEntry

A move from one committed plan to another, with rationale (DEC-36). Not yet logged in the v1 skeleton.

fieldtypecarddescription
fromPlan0..1
toPlan0..1
rationale_refSelectionRationale0..1
kindinheritedLogEntryKind1
seqinheritedinteger0..10-indexed sequence, stamped on append
atinheritedinteger0..1mission minutes

Delta

abstract

A stamped cross-role write to the shared store (DEC-61): a role's contribution is an attributed delta — the same write path that serialises over `/sync` later (DEC-25), so going multi-node is transport, not re-architecture. Base of the concrete delta kinds; v1 emits SteeringDelta. Write-scope *enforcement* is designed-for — the delta is attributed (NF2) but not yet scope-checked.

fieldtypecarddescription
scopestring0..1"the write-scope this delta falls under — e.g. steering"
bystring0..1the contributing author
rolestring0..1"the contributing role-hat — e.g. duty-officer-plans"
atdatetime0..1when it was contributed (DEC-15, NF2)

SteeringDelta

is a Delta

The first DEC-61 write built in v1: an operator's *applied intel* — denied (no-go) cells — shared to the store as steering constraints, where every surface (e.g. the Data Analysis monitor, including a popped-out one) sees it land. Risk appetites, by contrast, stay local (a ranking lens). Identity is content (DEC-35): the store keys it by the hash of its canonical form.

fieldtypecarddescription
constraintsConstraint0..*the interpreted steering gestures shared (DEC-24) — e.g. no-go regions
scopeinheritedstring0..1"the write-scope this delta falls under — e.g. steering"
byinheritedstring0..1the contributing author
roleinheritedstring0..1"the contributing role-hat — e.g. duty-officer-plans"
atinheriteddatetime0..1when it was contributed (DEC-15, NF2)

Enums 20 value sets

The closed value vocabularies (in common) used by the fields above.

Criticality

enum

Whether a commitment must hold or is best-effort (DEC-22).

  • hard — must hold
  • soft — best-effort; carries a priority, with authority from provenance

ActivityType

enum

The verb of an activity (DEC-16); v1 set, pluggable registry (NF7).

  • visit
  • loiter
  • avoid
  • transit
  • maintain

CommitmentState

enum

The lifecycle state of a commitment (B4). `at-risk` is live-only (E2) and not stored.

  • proposed
  • negotiated
  • committed
  • satisfied
  • violated
  • waived
  • superseded

AnswerStatus

enum

  • confirmed — answered by the operator
  • defaulted — filled from a stamped default

AmbiguityStatus

enum

  • open
  • resolved

Domain

enum

The medium a baseline / profile / movement model operates in (DEC-20).

  • land
  • sea
  • air

Terrain

enum

Per-cell land-cover class used by the skeleton's mobility raster.

  • road
  • track
  • open
  • rough
  • forest
  • marsh
  • ford
  • water

Realisation

enum

How a channel or movement model is realised (DEC-49). `provider` = a computed service behind the seam.

  • raster
  • analytic
  • parametric
  • provider

Predictability

enum

How predictable a channel is over time (DEC-21) — drives sampling.

  • static
  • periodic
  • dynamic

ConfidenceLevel

enum

  • high
  • medium
  • low

AspectType

enum

The render-class of one time-varying facet of an entity (DEC-52/53).

  • cell — a position → map glyph / distance-along-track
  • scalar — a numeric value → a line (altitude, fuel, distance)
  • window — a time interval → a band
  • status — an up/down or phase value → ticks

StrategyKey

enum

The skeleton's three candidate strategies (the "handful" of plans).

  • direct — fastest by time/speed
  • tracked — keeps to tracked/road surfaces
  • covered — favours exposure-reducing cover

Band

enum

A coarse three-level qualitative band for cost / robustness (C2/C6, NF10).

  • robust
  • marginal
  • fragile

MarginBand

enum

The slack band on a single commitment's satisfaction (A2, NF10). `crossed` = violated.

  • robust
  • marginal
  • tight
  • crossed

Verdict

enum

A commitment's verdict in a plan's scores.

  • satisfied
  • violated
  • waived

ScheduleLegKind

enum

The kind of one leg in a plan's schedule.

  • transit
  • hold — a wait — e.g. "await low-tide window" at a tidal ford
  • visit
  • exfil

TideMode

enum

The outcome of the tidal-ford wait-vs-detour weighing (ADR-0006).

  • no-ford — no tidal ford on the route
  • open — ford open at the bank — cross now
  • wait — hold at the bank for the low-tide window, then cross
  • detour — ford-free detour reaches the RV sooner

ConflictKind

enum

Whether a clash is built into the request or emerges from the schedule (C1).

  • structural — e.g. no route exists
  • emergent — e.g. the schedule is infeasible

AlertCauseType

enum

Why the wingman raised an execution alert (E3).

  • hard_infeasible
  • band_crossing
  • tide_reassessment — a re-plan changed the tide decision's mode (ADR-0007)

LogEntryKind

enum

  • Alert
  • Observation
  • Waiver
  • Replan
+ SteeringDelta ||--o{ Constraint : "constraints" + ExecutionDelta ||--o| HexCell : "cell"

contains (inlined)  ·  references (by id)  ·  o{ many  || one  o| optional. Boxes outside the module are classes defined elsewhere.

SelectionRationale

identified

The record of a choice (DEC-23): which plan won, which it beat, on which axis, with the after-mitigation bands, and who decided. Content-addressed.

fieldtypecarddescription
ididstring1content id of the canonical form (DEC-35)
chosenPlan0..1the winning plan
beatenPlan0..*the field it beat
deciding_axisstring0..1"what tipped it — e.g. time/speed, exposure, robustness, completeness"
notestring0..1the justification narrative
appetitesAppetite0..*the risk-appetite selections at the time
mitigationsstring0..*"e.g. armed-escort"
chosen_bandsChosenBands0..1cost/robustness bands after mitigations
bystring0..1
rolestring0..1"e.g. implementer"
atdatetime0..1

ChosenBands

fieldtypecarddescription
costBand0..1
robBand0..1

ExecutionLog

The append-only live history of a mission (DEC-23/25/26): alerts when a band is crossed, observations that update truth, waivers, and replans — never overwritten. Together with rationales and stamps it gives a complete after-action record with perfect replay (F1).

fieldtypecarddescription
entriesLogEntry0..*

LogEntry

abstract

Base of the append-only execution log; the store stamps each with a `seq`.

fieldtypecarddescription
kindLogEntryKind1
seqinteger0..10-indexed sequence, stamped on append
atinteger0..1mission minutes

Alert

is a LogEntry

A band crossing or hard-infeasibility raised during execution (E3).

fieldtypecarddescription
causeAlertCause0..1
kindinheritedLogEntryKind1
seqinheritedinteger0..10-indexed sequence, stamped on append
atinheritedinteger0..1mission minutes

AlertCause

fieldtypecarddescription
typeAlertCauseType1
commitmentstring0..1the phased commitment being tracked (e.g. "observe", "exfil")
fromstring0..1the prior band state
tostring0..1the new band state

Observation

is a LogEntry

A fact delta appended to the baseline's fact layer (E5).

fieldtypecarddescription
fact_deltaFactDelta0..1
sourcestring0..1"e.g. operator"
confidencestring0..1"e.g. reported"
kindinheritedLogEntryKind1
seqinheritedinteger0..10-indexed sequence, stamped on append
atinheritedinteger0..1mission minutes

FactDelta

fieldtypecarddescription
notestring0..1
tagstring0..1"e.g. track-state, sighting, weather"

Waiver

is a LogEntry

A relaxed commitment, attributed (B3). Not yet logged in the v1 skeleton.

fieldtypecarddescription
commitment_idCommitment0..1
bystring0..1
authoritystring0..1
rationalestring0..1
kindinheritedLogEntryKind1
seqinheritedinteger0..10-indexed sequence, stamped on append
atinheritedinteger0..1mission minutes

Replan

is a LogEntry

A move from one committed plan to another, with rationale (DEC-36). Not yet logged in the v1 skeleton.

fieldtypecarddescription
fromPlan0..1
toPlan0..1
rationale_refSelectionRationale0..1
kindinheritedLogEntryKind1
seqinheritedinteger0..10-indexed sequence, stamped on append
atinheritedinteger0..1mission minutes

Delta

abstract

A stamped cross-role write to the shared store (DEC-61): a role's contribution is an attributed delta — the same write path that serialises over `/sync` later (DEC-25), so going multi-node is transport, not re-architecture. Base of the concrete delta kinds; v1 emits SteeringDelta. Write-scope *enforcement* is designed-for — the delta is attributed (NF2) but not yet scope-checked.

fieldtypecarddescription
scopestring0..1"the write-scope this delta falls under — e.g. steering"
bystring0..1the contributing author
rolestring0..1"the contributing role-hat — e.g. duty-officer-plans"
atdatetime0..1when it was contributed (DEC-15, NF2)

SteeringDelta

is a Delta

The first DEC-61 write built in v1: an operator's *applied intel* — denied (no-go) cells — shared to the store as steering constraints, where every surface (e.g. the Data Analysis monitor, including a popped-out one) sees it land. Risk appetites, by contrast, stay local (a ranking lens). Identity is content (DEC-35): the store keys it by the hash of its canonical form.

fieldtypecarddescription
constraintsConstraint0..*the interpreted steering gestures shared (DEC-24) — e.g. no-go regions
scopeinheritedstring0..1"the write-scope this delta falls under — e.g. steering"
byinheritedstring0..1the contributing author
roleinheritedstring0..1"the contributing role-hat — e.g. duty-officer-plans"
atinheriteddatetime0..1when it was contributed (DEC-15, NF2)

ExecutionDelta

is a Delta

An in-flight operator perturbation during Execute (issue #7): an obstruction (a +N min hold at the vehicle's current cell) or a blocked cell forcing a re-route. Previously these survived only as a prose Observation note; capturing them as a typed, content-addressed store object preserves their structured inputs for inspection (the Data Analysis monitor) and replay (NF3), and re-uses the DEC-61 attributed-delta write path. Identity is content (DEC-35).

fieldtypecarddescription
eventExecutionEventKind1which perturbation — obstruction or block
at_mininteger0..1mission minutes when applied (sim-time ≡ plan-time, ADR-0007)
cellHexCell0..1where the perturbation bites — the vehicle's cell for an obstruction, the blocked cell for a block
delay_minfloat0..1the hold added by an obstruction (absent for a block)
rv_minfloat0..1the re-planned RV / mission-end after the perturbation
absorbed_minfloat0..1minutes the downstream holds absorbed, so the RV slipped less than delay_min (ADR-0007)
scopeinheritedstring0..1"the write-scope this delta falls under — e.g. steering"
byinheritedstring0..1the contributing author
roleinheritedstring0..1"the contributing role-hat — e.g. duty-officer-plans"
atinheriteddatetime0..1when it was contributed (DEC-15, NF2)

Enums 21 value sets

The closed value vocabularies (in common) used by the fields above.

Criticality

enum

Whether a commitment must hold or is best-effort (DEC-22).

  • hard — must hold
  • soft — best-effort; carries a priority, with authority from provenance

ActivityType

enum

The verb of an activity (DEC-16); v1 set, pluggable registry (NF7).

  • visit
  • loiter
  • avoid
  • transit
  • maintain

CommitmentState

enum

The lifecycle state of a commitment (B4). `at-risk` is live-only (E2) and not stored.

  • proposed
  • negotiated
  • committed
  • satisfied
  • violated
  • waived
  • superseded

AnswerStatus

enum

  • confirmed — answered by the operator
  • defaulted — filled from a stamped default

AmbiguityStatus

enum

  • open
  • resolved

Domain

enum

The medium a baseline / profile / movement model operates in (DEC-20).

  • land
  • sea
  • air

Terrain

enum

Per-cell land-cover class used by the skeleton's mobility raster.

  • road
  • track
  • open
  • rough
  • forest
  • marsh
  • ford
  • water

Realisation

enum

How a channel or movement model is realised (DEC-49). `provider` = a computed service behind the seam.

  • raster
  • analytic
  • parametric
  • provider

Predictability

enum

How predictable a channel is over time (DEC-21) — drives sampling.

  • static
  • periodic
  • dynamic

ConfidenceLevel

enum

  • high
  • medium
  • low

AspectType

enum

The render-class of one time-varying facet of an entity (DEC-52/53).

  • cell — a position → map glyph / distance-along-track
  • scalar — a numeric value → a line (altitude, fuel, distance)
  • window — a time interval → a band
  • status — an up/down or phase value → ticks

StrategyKey

enum

The skeleton's three candidate strategies (the "handful" of plans).

  • direct — fastest by time/speed
  • tracked — keeps to tracked/road surfaces
  • covered — favours exposure-reducing cover

Band

enum

A coarse three-level qualitative band for cost / robustness (C2/C6, NF10).

  • robust
  • marginal
  • fragile

MarginBand

enum

The slack band on a single commitment's satisfaction (A2, NF10). `crossed` = violated.

  • robust
  • marginal
  • tight
  • crossed

Verdict

enum

A commitment's verdict in a plan's scores.

  • satisfied
  • violated
  • waived

ScheduleLegKind

enum

The kind of one leg in a plan's schedule.

  • transit
  • hold — a wait — e.g. "await low-tide window" at a tidal ford
  • visit
  • exfil

TideMode

enum

The outcome of the tidal-ford wait-vs-detour weighing (ADR-0006).

  • no-ford — no tidal ford on the route
  • open — ford open at the bank — cross now
  • wait — hold at the bank for the low-tide window, then cross
  • detour — ford-free detour reaches the RV sooner

ConflictKind

enum

Whether a clash is built into the request or emerges from the schedule (C1).

  • structural — e.g. no route exists
  • emergent — e.g. the schedule is infeasible

AlertCauseType

enum

Why the wingman raised an execution alert (E3).

  • hard_infeasible
  • band_crossing
  • tide_reassessment — a re-plan changed the tide decision's mode (ADR-0007)

LogEntryKind

enum

  • Alert
  • Observation
  • Waiver
  • Replan

ExecutionEventKind

enum

The kind of in-flight operator perturbation applied during Execute (issue

  • obstruction — a +N min hold spliced at the vehicle's current cell, re-timed through the tide-aware chooser (ADR-0006/0007)
  • block — a cell ahead declared impassable, forcing an in-flight re-route around it
Generated from the modular LinkML schema under schema/ by schema/build-reference.py. Cardinality: 1 required · 0..1 optional · 0..*/1..* list.
diff --git a/specs/004-capture-execution-deltas/blog/post.md b/specs/004-capture-execution-deltas/blog/post.md new file mode 100644 index 0000000..fb8d0f9 --- /dev/null +++ b/specs/004-capture-execution-deltas/blog/post.md @@ -0,0 +1,68 @@ +--- +layout: default +title: "Execution edits, captured in the model" +--- + +> **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](screenshots/01-execution-delta.png) + +## 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](https://github.com/DeepBlueCLtd/REMIT/issues/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 + +- **Richer log entries.** Pack the structured fields into the prose `Observation`. Cheap, + but the log is append-only history keyed by mission, not the content-addressed store the + monitor and replay read from — it would still be invisible there. +- **A bespoke UI-state object.** Hand-write a perturbation shape in the wingman. Fast, but + it violates the LinkML one-source-of-truth rule (ADR-0012) the moment it crosses a + boundary — and this one crosses straight into the shared store. +- **A typed delta, mirroring `SteeringDelta`** *(chosen)*. Model the perturbation in LinkML, + generate the type, and write it via the existing DEC-61 attributed-delta path. + +## The strategy + +Model the data, re-use the seam. Two additions to the schema: + +- a `HexCell` value object (`h3` + optional `lat`/`lng`) — the hex-grid successor to the + square-grid `Waypoint`, and +- an `ExecutionDelta` (an `is_a: Delta`) carrying `event` (`obstruction` | `block`), + `at_min`, `cell`, `delay_min`, `rv_min`, and `absorbed_min`. + +`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](screenshots/01-execution-delta.png) diff --git a/specs/004-capture-execution-deltas/evidence/screenshots/01-execution-delta.png b/specs/004-capture-execution-deltas/evidence/screenshots/01-execution-delta.png new file mode 100644 index 0000000000000000000000000000000000000000..60c51d5b230e591a056e14eae32561b9c9596d54 GIT binary patch literal 97035 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 Maintainer-raised: *"in execute phase, when I insert obstructions or delays they aren't +> captured in the model. Should they be?"* — **Yes.** This spec makes each in-flight +> perturbation a first-class, content-addressed store object. + +## Problem + +During Execute, the operator can perturb the live run two ways: + +- **Obstruction** (`+5` / `+25 min`) — a hold spliced at the vehicle's current cell, the + remainder re-timed through the tide-aware chooser (ADR-0006/0007). +- **Block next cell** — a cell ahead declared impassable, forcing an in-flight re-route. + +Both already appended a prose `Observation` to the append-only **execution log** — but +their *structured* inputs (which cell, how many minutes, the resulting RV) lived only in +transient wingman UI state. Nothing landed in the **content-addressed object store**, so — +unlike `SteeringDelta` (the first DEC-61 write) — the perturbations: + +1. were **invisible** to the Data Analysis monitor (which browses store objects), and +2. carried **no structured inputs** for replay (NF3) — only a human-readable note. + +## Scope + +Model execution-phase perturbations as a typed delta and write them to the store. + +| Piece | What | Where | +|---|---|---| +| Schema — enum | `ExecutionEventKind` (`obstruction` \| `block`) | `schema/common.yaml` | +| Schema — value object | `HexCell` (`h3` + optional `lat`/`lng`) — the hex successor to `Waypoint` | `schema/common.yaml` | +| Schema — delta | `ExecutionDelta (is_a: Delta)` — `event`, `at_min`, `cell`, `delay_min`, `rv_min`, `absorbed_min` | `schema/records.yaml` | +| App write | `shareExecutionDelta()` → `seam.putObject('ExecutionDelta', …)` on each obstruction/block | `app/js/wingman/wingman.js` | + +Cross-cutting: re-uses the DEC-61 attributed-delta write path (`scope`/`by`/`role`/`at`, +operator wearing the **Ops** hat) exactly as `SteeringDelta` does; the prose log entry is +**kept** (it reads well in the after-action record) — the delta is the structured sibling, +not a replacement. The share is **non-fatal**: a failed write never breaks the live loop, +because the append-only log already recorded the event. + +## Out of scope + +- **Replay re-application** — re-running a stamp does not yet *re-apply* the captured + perturbations (they are exogenous operator acts). Capturing the structured inputs is the + prerequisite; automatic re-application is a noted follow-up. +- Resolving the documented square-vs-hex `Constraint.cells` drift in `SteeringDelta` + (bugs.md) — `HexCell` is introduced here and is the natural type to migrate it onto later. + +## Exit criteria → evidence + +Asserted by `e2e/skeleton.spec.ts` ("an obstruction is captured in the model as a typed +ExecutionDelta"), captured in `evidence/screenshots/`: + +1. **Captured** — after a `+25 min` obstruction on the exfil drive, an `ExecutionDelta` + lands in the store with `event: 'obstruction'`, `delay_min: 25`, and a `cell.h3`. +2. **Visible** — the object appears in the Data Analysis monitor index and drills down to + its structured fields. `01-execution-delta.png` +3. **Generated, not hand-shaped** — the TypeScript type the app imports comes from LinkML + (`schema/generate.sh` → `schema/gen/remit.ts`); no hand-authored shape (ADR-0012). + +## Verification + +- `npm run typecheck` — 0 errors (the imported `ExecutionDelta` type resolves from `gen/`). +- `npm run test:unit` — 12 golden/unit tests green (kernel set-pieces unchanged). +- `node run-playwright.mjs` — e2e lap + the new capture test green.