Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions docs/project_notes/decisions.md
Original file line number Diff line number Diff line change
Expand Up @@ -730,3 +730,33 @@ consequences. Link evidence (e.g. `specs/<feature>/evidence/`) where relevant.
(an e2e re-asserts tune ⇒ committed Plan ids unchanged); spec-004 drafts load intact. **Out of scope
(deferred):** a richer place-on-map interaction and true NATO frame shapes (a later slice); any
routing/kernel influence (the avoid-assess capability, DEC-51).

## ADR-0028 (2026-06-14) — Skeleton-gate reconciliation (DEC-47 → register DEC-62)

- **Context:** the DEC-44 walking skeleton (PR #2, issue [#3](https://github.com/DeepBlueCLtd/REMIT/issues/3))
surfaced three build discoveries that out-ran or contradicted the register, held as local deviations under
DEC-47's batch-reconciliation policy for the skeleton-complete gate. All three had since been **baked into the
LinkML source of truth** (DEC-57) when the schema was reconciled against the skeleton's real object shapes — but
the **Doc-owned register** (DEC-37) and the prose spine `docs/remit-data-model.md` §6/§7 still showed the
pre-skeleton wording. The maintainer asked to close the gate.
- **Decision:** record **DEC-62** in `docs/remit-register.md` ratifying the three, and bring the prose spine into
line with the schema. **(A) Stamp gains a platform/start axis** — `profile_version` (own-force profile, DEC-19)
+ `start{x,y,clock_min}` are identity inputs (a plan depends on both; identical stamps with different profiles
would collide, breaking NF3); refines DEC-29/35. **(B) Plan-id within-handful discriminator** — one stamp
legitimately yields a handful (DEC-22/40-C), so `Plan.id = hash(Stamp ⊕ strategy)`, not `hash(Stamp)`; the stamp
stays the comparability basis (A3), the strategy distinguishes siblings; clarifies DEC-29. **(C) No-build
`// @ts-check`+JSDoc ratified as DEC-41's TypeScript realisation** — a mechanism note, not a reversal: v1 keeps
the no-build deploy/preview contract (Principle II, ADR-0001/0005, DEC-58) and meets DEC-41's typing intent via
JSDoc checked by `tsc --checkJs --noEmit` (ADR-0024) consuming the LinkML-generated `.ts` types (DEC-57).
- **Why ratify, not reverse:** (A) and (B) are NF3 necessities the schema already enforces — the only open work
was recording them so the register ≡ the generated source. (C)'s register revisit-trigger ("when DEC-57's
generated TS lands") had fired, and the no-build constitution is now firmly established (Principle II; ADR-0024
enforces TypeScript-grade checking *without* a build), so the gate conclusion is ratify, following DEC-40's
caveat-not-reversal pattern.
- **Scope — docs/governance only:** `remit-register.md` (DEC-62 + version → v28), `remit-data-model.md` §6/§7
squared to the schema, the skeleton spec's deviations section annotated with the gate outcome, project memory.
**No schema or code change** — the schema already carries `profile_version`/`start`/`StartState` and
`Plan.strategy` / `id = hash(Stamp, strategy)`; `schema/gen/` untouched, no regenerate needed.
- **Remaining skeleton notes:** World-before-Capture tool-order, mock band-calibration, and the `entities/` vs
`views/projection/` module placement were reviewed and **held as-is** (no register change); the mid-stream
coincidence H2→H1-lite edit (ADR-0009/DEC-53) was already reconciled. Closes issue #3.
2 changes: 2 additions & 0 deletions docs/project_notes/issues.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,5 @@ evidence (e.g. `specs/<feature>/evidence/`).
| 2026-06-13 | `claude/spec-04-implement-0u0s9y` | **ORBAT blue/red/green authoring scaffolding (spec 004, ADR-0026).** Brought all three ORBAT sides forward as **display-only** authoring (DEC-56/NF9): each asset a first-class allegiance-typed `Entity` (DEC-52), reusing the entity → map / Sync-Matrix projection. Schema (Principle I, regenerated): `Allegiance` enum + `Entity.allegiance` + new `schema/orbat.yaml` (`Orbat`/`Asset`/`Blue|Red|GreenParams`/`Protection`, reusing `Waypoint`/`Lineage`/`TimeWindow`). New pure model `app/js/orbat/orbat.js` (add/duplicate/tune/remove/reconcile/validate/canonical/commit + `assetToEntity`, localStorage draft + content-addressed commit with lineage); authoring panel `app/js/shell/orbat-panel.js` (the **SME-Int** role-tab — roster, per-instance tuners, duplicate/remove, commit, selection); allegiance-coloured map markers (`map.js`) + Sync-Matrix tracks for time-windowed assets (`entities.js`/`sync-matrix.js`). **Blue is display-only:** ROVER-1 reconciled as the single `canonical_own_force` blue asset (protected from removal), plan unchanged by any tune (e2e-asserted). Determinism (NF3): assets sorted by id + canonicalised. 11 new unit + 5 new e2e (one per user story) green; 0 typecheck errors. Deferred (NF9): reactive adversary (DEC-51), capability-matched blue allocation (H2), live ROE/collateral emission (DEC-60 J3). | ADR-0026 · `specs/004-orbat-red-green-assets/` |

| 2026-06-14 | `claude/spec-04-implement-0u0s9y` | **ORBAT asset enrichment (spec 005, ADR-0027).** Display-only, additive enrichment of the SME-Int ORBAT (NF9): shared `kind` (`PlatformKind` enum) → allegiance-framed map **symbols** (deck.gl `TextLayer` glyphs via a `SYMBOLS` lookup, no icon atlas) with a per-asset `symbol` override; intel `confidence` (reusing `ConfidenceLevel`) → marker **opacity**; red **dual range rings** (`detection_range_m`/`engagement_range_m`, `engagement ≤ detection`) replacing the single extent for red; descriptive `strength`/`notes` + red `threat_type` / green `category` (`GreenCategory` enum) / blue `role`. All schema-defined + regenerated (Principle I); model/panel/map extended in place. Backward-compatible: idempotent `normalize()` migrates spec-004 red drafts (`extent_m` → detection). 12 new unit (30 total) + 4 new e2e (9 total) green; 0 typecheck errors. Deferred: place-on-map + NATO frame shapes (later slice); routing influence (DEC-51). | ADR-0027 · `specs/005-orbat-asset-enrichment/` |

| 2026-06-14 | issue [#3](https://github.com/DeepBlueCLtd/REMIT/issues/3) | **Walking-skeleton gate reconciliation (DEC-47 → register DEC-62).** Closed the three held skeleton deviations at the skeleton-complete gate: (A) the stamp gains `profile_version`+`start` identity axes (refines DEC-29/35); (B) `Plan.id = hash(Stamp ⊕ strategy)` within-handful discriminator (clarifies DEC-29); (C) the no-build `// @ts-check`+JSDoc approach ratified as DEC-41's TypeScript realisation (ADR-0024 typecheck + DEC-57 generated TS), a caveat not a reversal. All three were already baked into the LinkML schema (DEC-57); here recorded in the Doc-owned register (DEC-62, v28) + prose spine §6/§7 + skeleton spec gate note. Remaining notes (tool-order, band-calibration, module placement) held as-is. **Docs/governance only — no schema or code change.** | ADR-0028 · DEC-62 · [#3](https://github.com/DeepBlueCLtd/REMIT/issues/3) |
11 changes: 7 additions & 4 deletions docs/remit-data-model.md
Original file line number Diff line number Diff line change
Expand Up @@ -166,26 +166,29 @@ Aspect {
// Full planning-AGAINST entities (multi-actor) = C9/H3; v1 entities are display-only.
```

## 6. Stamp (plan identity) — DEC-23/24/29
## 6. Stamp (plan identity) — DEC-23/24/29/62

```
Stamp {
requirement_version
baseline_version, excursions: [excursion_version]
config_core_hash // DEC-48: world-defining config core (medium/channels/
// movement-model/providers/vocabulary); instance shell excluded
profile_version, start: { x, y, clock_min } // DEC-62: own-force profile (DEC-19) + start state — the plan
// depends on both, so both are identity inputs (NF3)
appetites: { axis → setting } // implementer's, DEC-6
steering: [Constraint] // interpreted gestures, DEC-24
kernel_version, strategy_seed // DEC-29: part of identity
}
```

## 7. Plan — DEC-5/22/29
## 7. Plan — DEC-5/22/29/62

```
Plan {
id = hash(Stamp) // stamp IS the identity (DEC-29)
stamp: Stamp // authoritative
id = hash(Stamp, strategy) // stamp ⊕ strategy: one stamp yields a handful (DEC-62/29)
strategy: Strategy // the candidate's axis within the handful (the discriminator)
stamp: Stamp // authoritative — the comparability basis (A3)
materialisation: { // cached, regenerable
schedule: [ { activity_ref | leg, start: t, end: t } ]
trajectory: [ (cell, t) ]
Expand Down
Loading
Loading