From c520ab372528caf28cf1e0d82e46c042208ac8a6 Mon Sep 17 00:00:00 2001 From: Ben Richards Date: Fri, 16 Oct 2026 13:09:14 +0300 Subject: [PATCH] Bring the 2026-10-03 review's register entries up to date Content epochs were built as S129-S135, S129 closed the campaignVersion gap on raw deserialize, and #565 decided the public brand. Each entry keeps its history and gains the outcome, following the register's existing Resolved-note convention. --- design/90-decisions.md | 13 ++++++++++--- docs/docs/engine/OPEN-QUESTIONS.md | 13 ++++++++++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/design/90-decisions.md b/design/90-decisions.md index 12c499bc..2e35d1c7 100644 --- a/design/90-decisions.md +++ b/design/90-decisions.md @@ -426,14 +426,17 @@ judgement calls are the 2026-10-08 entries in the decision log, including the th the red team's F1–F3 (`design/redteam/2026-10-08-10-design.md`). Two refinements on the settled directions: absent the seam, a session stays pinned rather than adopting additive change by default, and the replay oracle's new failure widens `campaign_version_missing` rather than -replacing it. **Not yet built** — the next step is `/agentkit:plan`. +replacing it. **Built 2026-10-09 to 2026-10-11** as S129–S135 (#587–#594). What the design left +open is registered under *Found by the content-epochs design* below. **Resolved by design, 2026-10-08 — the `campaignVersion` gap on raw `deserialize`.** S125 made raw `deserialize` reject a `kindId` that is not its campaign's, but left `campaignVersion` uncompared, so a session serialized under one resolution was accepted under another. Content epochs replace the gap rather than patching it: `deserialize` resolves the state's `(campaignId, campaignVersion)` through the archive and refuses `unknown_campaign` when it does -not resolve (`20-contract.md` §4, C22). The gap stays open in code until that slice lands. +not resolve (`20-contract.md` §4, C22). **Closed in code by S129, 2026-10-09** (#587): +`deserialize` in `src/engine/src/core/kernel/engine.ts` resolves the state's epoch before +anything else and refuses `unknown_campaign` when the archive does not hold that version. **The content registry holds the host's campaign objects by reference, so "frozen" means validated, not immutable.** S124 made the engine own the `params` it logs. The review asked for @@ -568,7 +571,11 @@ renamed, the review asks for it to be deliberate: brand, repository and package an alias period, and kind ids and save formats kept stable, because a rename must not break a saved game. This is a product decision, not an engineering one. **Revisit** when the owner decides the ecosystem's public positioning, and before any package is published under a second -name. +name. **Brand decided 2026-10-08** (#565): the public brand is *GodComplex — Consequences*, +positioned beyond games, and the review's shortlist was not taken. The repository name, the npm +package and the domain stay as they are, so kind ids, save formats and package consumers are +untouched. The alias-period constraint above still governs a later rename of the repository or +the package. ### Found by the content-epochs design diff --git a/docs/docs/engine/OPEN-QUESTIONS.md b/docs/docs/engine/OPEN-QUESTIONS.md index 385de15c..65c9d07c 100644 --- a/docs/docs/engine/OPEN-QUESTIONS.md +++ b/docs/docs/engine/OPEN-QUESTIONS.md @@ -416,14 +416,17 @@ judgement calls are the 2026-10-08 entries in the decision log, including the th the red team's F1–F3 (`design/redteam/2026-10-08-10-design.md`). Two refinements on the settled directions: absent the seam, a session stays pinned rather than adopting additive change by default, and the replay oracle's new failure widens `campaign_version_missing` rather than -replacing it. **Not yet built** — the next step is `/agentkit:plan`. +replacing it. **Built 2026-10-09 to 2026-10-11** as S129–S135 (#587–#594). What the design left +open is registered under *Found by the content-epochs design* below. **Resolved by design, 2026-10-08 — the `campaignVersion` gap on raw `deserialize`.** S125 made raw `deserialize` reject a `kindId` that is not its campaign's, but left `campaignVersion` uncompared, so a session serialized under one resolution was accepted under another. Content epochs replace the gap rather than patching it: `deserialize` resolves the state's `(campaignId, campaignVersion)` through the archive and refuses `unknown_campaign` when it does -not resolve (`20-contract.md` §4, C22). The gap stays open in code until that slice lands. +not resolve (`20-contract.md` §4, C22). **Closed in code by S129, 2026-10-09** (#587): +`deserialize` in `src/engine/src/core/kernel/engine.ts` resolves the state's epoch before +anything else and refuses `unknown_campaign` when the archive does not hold that version. **The content registry holds the host's campaign objects by reference, so "frozen" means validated, not immutable.** S124 made the engine own the `params` it logs. The review asked for @@ -558,7 +561,11 @@ renamed, the review asks for it to be deliberate: brand, repository and package an alias period, and kind ids and save formats kept stable, because a rename must not break a saved game. This is a product decision, not an engineering one. **Revisit** when the owner decides the ecosystem's public positioning, and before any package is published under a second -name. +name. **Brand decided 2026-10-08** (#565): the public brand is *GodComplex — Consequences*, +positioned beyond games, and the review's shortlist was not taken. The repository name, the npm +package and the domain stay as they are, so kind ids, save formats and package consumers are +untouched. The alias-period constraint above still governs a later rename of the repository or +the package. ### Found by the content-epochs design