From 3e2d0384b523c981f582048c4db1fc3ba53c1ba5 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 14 Jun 2026 10:01:52 +0000 Subject: [PATCH] docs: reconcile walking-skeleton gate deviations into the register (DEC-62) Closes the DEC-47 batch-reconciliation for the DEC-44 skeleton gate (issue #3). The three held deviations were already baked into the LinkML source of truth (DEC-57); this records them in the Doc-owned register and squares the prose spine to the schema: - (A) Stamp gains profile_version + start identity axes (refines DEC-29/35) - (B) Plan.id = hash(Stamp + strategy) within-handful discriminator (clarifies DEC-29) - (C) no-build // @ts-check + JSDoc ratified as DEC-41's TypeScript realisation (ADR-0024 typecheck + DEC-57 generated TS) - caveat, not reversal Register DEC-62 (v28), remit-data-model.md s6/s7, skeleton spec gate-outcome note, ADR-0028 + work-log row. Docs-only - no schema or code change. https://claude.ai/code/session_01EhtBoKXg6bHnKdquacyknf --- docs/project_notes/decisions.md | 30 ++++++++++++++++++++++++++++++ docs/project_notes/issues.md | 2 ++ docs/remit-data-model.md | 11 +++++++---- docs/remit-register.md | 3 ++- specs/002-walking-skeleton/spec.md | 9 +++++++++ 5 files changed, 50 insertions(+), 5 deletions(-) diff --git a/docs/project_notes/decisions.md b/docs/project_notes/decisions.md index 3b68337..38e59b2 100644 --- a/docs/project_notes/decisions.md +++ b/docs/project_notes/decisions.md @@ -730,3 +730,33 @@ consequences. Link evidence (e.g. `specs//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. diff --git a/docs/project_notes/issues.md b/docs/project_notes/issues.md index ce00b9f..b8f49ae 100644 --- a/docs/project_notes/issues.md +++ b/docs/project_notes/issues.md @@ -58,3 +58,5 @@ evidence (e.g. `specs//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) | diff --git a/docs/remit-data-model.md b/docs/remit-data-model.md index a644670..9203eeb 100644 --- a/docs/remit-data-model.md +++ b/docs/remit-data-model.md @@ -166,7 +166,7 @@ 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 { @@ -174,18 +174,21 @@ Stamp { 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) ] diff --git a/docs/remit-register.md b/docs/remit-register.md index b724ef5..c80438d 100644 --- a/docs/remit-register.md +++ b/docs/remit-register.md @@ -7,7 +7,7 @@ **Status key:** `raw` (captured, undiscussed) · `discussing` · `decided` · `parked` · `rejected` **Horizon key:** `H1` near-term · `H2` mid-term · `H3` far/speculative -**Register version:** v27 — 2026-06-11 — **DEC-59/60/61 — the command-post stretch batch** (a "grow the app" exploration). DEC-59 **Operation apex** (distinct type above the requirement; carries an End-State of Objectives/Decisive Conditions; its plan a Scheme of Manoeuvre banded by effect profile; objectives = graded predicates now / typed-effect seam later, B1/B3). DEC-60 **ORBAT** (allegiance-typed entities blue/red/green as differentiated machinery: blue capability-assets, red passive + own End-State with reactive/adversarial discipline deferred via DEC-51, green ROE/collateral emitting both hard constraints and soft objectives; one ontology, three stances plan-for/avoid-assess/respect). DEC-61 **role-interfaces** (config-declared role bundles over a shared store, writes-as-stamped-deltas = distribution seam mocked; bespoke surfaces via registered render-components, config-bound; source-provider ingress, NF3 preserved). **Horizon: split** — shape-scaffolding into v1 (not-preclude), capability deferred H2/H3 under the DEC-56 freeze guard; peer docs propagated (concept, architecture 0.3, data-model 0.4, seam-contract 0.3, build-plan 0.4). Previous: v26 — 2026-06-09 — DEC-58 **development → Claude Code; GH repo = canonical home** for the doc-set + register + code (supersedes DEC-4 project-home / optional-commits); register stays Doc-owned (DEC-37), tracker → GH issues/PRs (DEC-47); LinkML schema (DEC-57) + generated artefacts live in the repo. Previous: v25 — 2026-06-09 — DEC-57 **LinkML adopted as the data-model source of truth** (resolves the LinkML-depth question deferred at DEC-56): one LinkML schema → JSON Schema · TypeScript · Pydantic · HTML; `remit-data-model.md` becomes generated; the cross-language canonical-serialisation/identity spec is the load-bearing companion; schema stays living until the freeze is earned (DEC-56). Earlier: v24 — 2026-06-09 — DEC-56 **shape-stabilisation precedes consumer fan-out** (refines DEC-43/55): the data-model-churning modules (identity/canonical-form · kernel spike · Activity expressibility · the two DEC-54 slices) run ahead of the low-churn consumer stages (Compare/Views/Execute/Learn), which fan out in parallel against fixtures; use-order is the *integration* order, not the *construction* order; build plan → draft 0.2 cites it; v23 — 2026-06-08 — DEC-55 build/delivery plan adopted as a Doc-owned peer document (`remit-build-plan.md`, draft 0.1): build-order = the system’s use-order; walking skeleton (DEC-44) as first thin lap; substrate threaded per step; standing element inventory; methodology cited (DEC-43…47/54); v22 — DEC-54 first post-skeleton slices confirmed (**both** tidal-mudflat *and* entity/Sync-Matrix) + doc-set refresh (data-model v0.3, architecture v0.2, concept, seam-contract v0.2); v21 — DEC-52/53 Entity abstraction + projection reframe (A6, D6); v20 — DEC-48…51 configurable instances + section G. +**Register version:** v28 — 2026-06-14 — **DEC-62 — walking-skeleton gate reconciliation (DEC-47)**: the three held skeleton deviations decided — the stamp gains `profile_version`+`start` (refines DEC-29/35), `Plan.id = hash(Stamp ⊕ strategy)` (clarifies DEC-29), and the no-build `// @ts-check`+JSDoc approach is ratified as DEC-41's TypeScript realisation (ADR-0024 typecheck + DEC-57 generated TS); all three were already in the LinkML source, here recorded in the Doc-owned register. Previous: v27 — 2026-06-11 — **DEC-59/60/61 — the command-post stretch batch** (a "grow the app" exploration). DEC-59 **Operation apex** (distinct type above the requirement; carries an End-State of Objectives/Decisive Conditions; its plan a Scheme of Manoeuvre banded by effect profile; objectives = graded predicates now / typed-effect seam later, B1/B3). DEC-60 **ORBAT** (allegiance-typed entities blue/red/green as differentiated machinery: blue capability-assets, red passive + own End-State with reactive/adversarial discipline deferred via DEC-51, green ROE/collateral emitting both hard constraints and soft objectives; one ontology, three stances plan-for/avoid-assess/respect). DEC-61 **role-interfaces** (config-declared role bundles over a shared store, writes-as-stamped-deltas = distribution seam mocked; bespoke surfaces via registered render-components, config-bound; source-provider ingress, NF3 preserved). **Horizon: split** — shape-scaffolding into v1 (not-preclude), capability deferred H2/H3 under the DEC-56 freeze guard; peer docs propagated (concept, architecture 0.3, data-model 0.4, seam-contract 0.3, build-plan 0.4). Previous: v26 — 2026-06-09 — DEC-58 **development → Claude Code; GH repo = canonical home** for the doc-set + register + code (supersedes DEC-4 project-home / optional-commits); register stays Doc-owned (DEC-37), tracker → GH issues/PRs (DEC-47); LinkML schema (DEC-57) + generated artefacts live in the repo. Previous: v25 — 2026-06-09 — DEC-57 **LinkML adopted as the data-model source of truth** (resolves the LinkML-depth question deferred at DEC-56): one LinkML schema → JSON Schema · TypeScript · Pydantic · HTML; `remit-data-model.md` becomes generated; the cross-language canonical-serialisation/identity spec is the load-bearing companion; schema stays living until the freeze is earned (DEC-56). Earlier: v24 — 2026-06-09 — DEC-56 **shape-stabilisation precedes consumer fan-out** (refines DEC-43/55): the data-model-churning modules (identity/canonical-form · kernel spike · Activity expressibility · the two DEC-54 slices) run ahead of the low-churn consumer stages (Compare/Views/Execute/Learn), which fan out in parallel against fixtures; use-order is the *integration* order, not the *construction* order; build plan → draft 0.2 cites it; v23 — 2026-06-08 — DEC-55 build/delivery plan adopted as a Doc-owned peer document (`remit-build-plan.md`, draft 0.1): build-order = the system’s use-order; walking skeleton (DEC-44) as first thin lap; substrate threaded per step; standing element inventory; methodology cited (DEC-43…47/54); v22 — DEC-54 first post-skeleton slices confirmed (**both** tidal-mudflat *and* entity/Sync-Matrix) + doc-set refresh (data-model v0.3, architecture v0.2, concept, seam-contract v0.2); v21 — DEC-52/53 Entity abstraction + projection reframe (A6, D6); v20 — DEC-48…51 configurable instances + section G. ----- @@ -76,6 +76,7 @@ |DEC-59|**Operation apex — a distinct first-class type *above* the requirement (the "move up the command chain" stretch).** Adopt **Operation**: carries an **End-State** (the CO's intent, decomposed into **Objectives / Decisive Conditions**) and **owns a set of Requirements as means** (A) — DEC-5/A1 requirement stays the *tasking* unit but is no longer the *outermost* durable object (D1: distinct type, **not** an Operation=higher-requirement recursion; fresh names mandated to avoid homonym confusion with requirement/plan/COA/effect). Its plan is a **Scheme of Manoeuvre** = an **allocation across the owned Requirements** (mutually-exclusive / contended tasks permitted), **scored by the effect profile produced against the End-State**, offered as a **banded handful** for the CO to juggle priority/risk and drill into temporal/spatial projections (A2). **Objective representation:** ship-now = **graded predicate over the evaluated world+entity+plan state** (NF1 scope, reuses the constraint sub-language, B1); **typed-effect vocabulary** (entity/area/posture/information) is the **designed-for seam** (NF7, mirrors pluggable activity types, DEC-16; B3). **Two-level banding:** Schemes by effect profile, Plans by mission cost (NF10/DEC-14). **Lifecycle parallels requirement→plan** (DEC-5/23): an Operation versions independently and re-scores its Schemes; Schemes carry stamps. **Appetite extends by echelon** (DEC-6): the CO's cross-objective priority is the Operation-level appetite; a superior's insistence is a commitment on the Operation. Wires to DEC-60 (Objectives reference red/green entities) and DEC-61 (the CO face). Horizon **split** (DEC-56 guard): shape-scaffolding into v1, capability designed-for H2/H3.|A CO's real job is **allocating finite force across competing taskings toward an intent**, which the single-requirement planner cannot express; apex-as-effects/intent (A2 over bare container A1) makes the **E and I of REMIT first-class** and gives portfolio banding a principled axis (effect profiles, not arbitrary task-tuples). Graded-predicate objectives reuse the existing evaluation surface so v1 needs no new measurement machinery; the typed-effect seam defers the H3 effect-modelling risk without designing it out. Distinct type (D1) chosen for apex clarity despite the recursion's economy. Independent versioning + stamp + re-score reuse the proven requirement→plan trust model, so NF2 extends as objective→requirement→plan-element→activity-effect with no new principle.|2026-06-11| |DEC-60|**ORBAT — allegiance-typed entities with differentiated machinery; the entry-point that seeds DEC-59.** The process **opens with an ORBAT page** authoring **participants and potential participants** before Operation/Requirement authoring — populating the Entity catalogue (DEC-52/53) and the blue force-pool a **Scheme** (DEC-59) allocates. Add **allegiance** typing on Entity — **blue** (own) / **red** (hostile) / **green** (neutral/host-nation/civilian) — as **differentiated machinery, not a bare label** (E2). **One ontology, three stances:** any force may carry its own **End-State** (DEC-59 intent reused); allegiance selects the kernel **stance** — **plan-for** (blue) / **avoid-assess** (red) / **respect** (green). **Blue = capability-typed allocatable assets:** identity + availability + **capability** matched to a Requirement's Activity needs (NF7) ⇒ a Scheme is **capability-matching under contention**, not bin-packing; **consumption/endurance + multi/shared-assignment = designed-for seam**. **Red = threat/adversary, passive in v1** (threat-source entity; time-varying threat via channels/excursions, DEC-49/52) **carrying its own End-State**, so the **reactive adversarial/game discipline** slots in later via DEC-51's promotion path with **no data-model reshape**. **Green = ROE/collateral generator (J3):** emits **both** hard **ROE constraints** (commitments, DEC-16) **and** soft **collateral objectives** (End-State components, DEC-59/B1), tagged per rule. **Honest floor (NF9):** no fabricated adversary reasoning until the discipline exists. Reuses entities/providers/commitments/Operation wholesale; adds only the asset-capability vocabulary + allegiance attribute. Horizon **split** (DEC-56): allegiance attribute + End-State slots ride v1; capability / red-passive feed / ORBAT authoring designed-for H2/H3.|ORBAT is the **authoring root** the rest of the stretch references, so DEC-59 is inert without it (taken first). Differentiated machinery over a bare label carries the value: blue capability-typing makes the Scheme handful genuinely distinct; green's dual emission is the only faithful ROE model and is near-free (both target-types already exist, DEC-16/59); green hard-vs-soft mirrors DEC-6. Red passive-with-End-State buys wargaming readiness at the price of a threat-source — adversarial discipline (DEC-51) deferred, not designed out — and the one-ontology/three-stances symmetry gives red/green/blue a single intent representation differing only in kernel stance.|2026-06-11| |DEC-61|**Role-interfaces — config-declared bespoke surfaces over a shared store, writes-as-deltas (mocks a future distributed system).** A **role = a config-declared bundle** {view-preset (DEC-53) + **write-scope** (delta-types it may author) + active **mode(s)**} (L2); named roles author as **sample config** (DEC-48), not hardcoded. **Architecture:** all roles share one **content-addressed store**; **every cross-role write is a stamped delta** (DEC-25), so the single-machine v1 mock's write path *is* the future distributed path — multi-node sync becomes transport, not re-architecture (deferred with concurrency; sequential in v1). **Write-scope enforced + attributed at the delta** (DEC-15 hats, NF2); role definitions ride the **DEC-48 shell** (identity-free). **Bespoke UI:** custom surfaces are **registered render-components** (released, conformance-tested, DEC-46) extending the DEC-53 render-type registry up to whole surfaces; **config selects/parameterises/binds** them — **custom in form, constrained in contract** (read via projections NF1, write via scoped stamped deltas). **Release-then-compose:** a new surface is a release, config then composes it freely — the **no-free-language discipline** (DEC-50/51) extended to UI; no config-embedded code (Q15). **Live integration:** the **DEC-49 provider seam run as ingress** — a **source provider** streams external data as **stamped observation/entity deltas** (DEC-52/25), live or mock, swapped with no surface change; **NF3 holds** (determinism over *stamped* inputs). **Starter role→scope (sample config):** CO = End-State + Scheme selection (DEC-59); planning DO = lifecycle transitions; SME-forecast = channel writes; SME-intel = red/green + threat via a bespoke intel-stream surface bound to a source provider; SME-reference = baselines/playbooks; execute-DO = observation deltas in Execute mode (DEC-25). Horizon **split** (DEC-56): writes-as-deltas + role view-presets + write-scopes ride v1; bespoke surfaces + source-provider ingress + portfolio CO face designed-for H2/H3.|Bespoke surfaces (not filtered presets) make "mock a future distributed system" real and demonstrable; routing every write as a stamped delta means the mock's write path *is* the distributed one (DEC-25), so distribution reduces to transport. Config-declared roles keep the command-post composable per deployment (config-everything, DEC-48/50/53). The registered-component + source-provider pattern reuses DEC-34/49/51 wholesale — bespoke UIs and live feeds cost no new architecture and stay auditable via release-then-compose; NF1/NF3 survive because surfaces read via projections and write via stamped deltas. Sharpens **Q15**: custom surfaces + live external feeds are the system's largest classification surface — flagged, not resolved.|2026-06-11| +|DEC-62|**Skeleton-gate reconciliation (DEC-47).** The DEC-44 walking skeleton's three held deviations, decided at the skeleton-complete gate — all three already realised in the LinkML source of truth (DEC-57) when the schema was reconciled against the skeleton's real shapes, here ratified in the register so it stays ≡ the generated schema. **(A) Stamp gains a platform/start axis (refines DEC-29/35):** `profile_version` (own-force profile, DEC-19) and `start{x,y,clock_min}` join the stamp's identity inputs — a plan depends on the platform and the starting state, so runs differing only in either must get distinct ids (NF3); identical stamps with different profiles would otherwise collide. **(B) Plan-id within-handful discriminator (clarifies DEC-29):** one stamped call 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. **(C) No-build `// @ts-check`+JSDoc realises DEC-41's TypeScript intent (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); the shared data-shape/seam discipline DEC-41 protects is unaffected. Remaining skeleton notes (World-before-Capture tool-order; mock band-calibration; `entities/` module placement) reviewed and held as-is — no register change; the mid-stream coincidence H2→H1-lite edit (DEC-53) was already reconciled.|Closes the DEC-47 batch-reconciliation for the walking-skeleton gate. (A)/(B) are NF3 necessities the schema already enforces — recording them keeps the Doc-owned register ≡ the generated source. (C) ratifies the established no-build constitution (Principle II) now that DEC-41's revisit-trigger — LinkML-generated TS (DEC-57) + enforced typecheck (ADR-0024) — has landed; caveat, not reversal (the DEC-40 pattern).|2026-06-14| ----- diff --git a/specs/002-walking-skeleton/spec.md b/specs/002-walking-skeleton/spec.md index 93ef815..6b568d1 100644 --- a/specs/002-walking-skeleton/spec.md +++ b/specs/002-walking-skeleton/spec.md @@ -50,6 +50,15 @@ Each build-plan §4 exit criterion is asserted by `e2e/skeleton.spec.ts` and cap ## Local deviations & build discoveries (hold for the gate, DEC-47) +> **Gate outcome (2026-06-14, DEC-47 → register DEC-62, issue #3):** the three candidate +> register items below were ratified. **Item 1** (no-build ES modules) — ratified as DEC-41's +> TypeScript realisation now that its revisit-trigger landed (ADR-0024 `tsc --checkJs` + DEC-57 +> generated `.ts`). **Item 2** (stamp `profile_version`+`start`) — adopted into stamp identity +> (refines DEC-29/35). **Item 3** (`Plan.id = hash(Stamp ⊕ strategy)`) — adopted as the +> within-handful discriminator (clarifies DEC-29). All three were already in the LinkML schema. +> Items 0/4/5/7 reviewed and held as-is (no register change); item 6 was reconciled mid-stream. +> See `docs/project_notes/decisions.md` ADR-0028. + 0. **World provisioned before Capture (tool order).** The spine narrative is capture→model-world (DEC-2/5), but Capture points at map features, so the tool runs **World first** and renders the candidate OPs on the AO map for Capture to choose from.