diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 4de84ff..95921d5 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "ooda-loop", "displayName": "OODA-loop", - "version": "1.10.0", + "version": "1.10.1", "description": "An autonomous operations layer for your live side project. It watches, re-orients from which PRs you merge and reject, and opens small revertible PRs — bounded by a HALT file, protected paths, and a hard cost cap. Built on Boyd's OODA loop. You stay in command.", "author": { "name": "Taeil Ma", diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ac10bd..a97a33b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,28 @@ independently. Bump there signals migration work for downstream projects. --- +## [v1.10.1] — 2026-06-20 + +### Fixed/clarified — gate integrity (f1 probe, overnight) + +The overnight f1 campaign surfaced that the per-cycle gate (`node --check` + smoke) +is necessary but NOT sufficient, and a sub-agent's self-reported "gate passed" is +not trustworthy — both misses were caught only by loading the artifact in its +runtime (the orchestrator's render-verify): + +- **`node --check` misses ES-module redeclarations.** A duplicate same-scope + `const` (two cycles each declaring `speedN`) exits 0 under `node --check` but the + browser ES-module parser rejects it — the game wouldn't boot, yet the cycle + reported PASS. dev-cycle Step 4 now requires a **module-load check** (import the + changed modules in their module system) for ES-module/browser artifacts. +- **Visual regressions pass every unit gate.** A cumulative over-exposed-to-white + frame passed `node --check` + smoke; only a rendered critique (evolve 5-G) + caught it. Rule added: for rich-runtime artifacts, verification MUST load the + artifact the way its runtime does (module-load + render/screenshot), and evolve + re-checks the gate from recorded facts — it does not take the build skill's word. + +plugin 1.10.0→1.10.1. (Docs/spec only; verify.py unchanged at 63.) + ## [v1.10.0] — 2026-06-20 ### Added — asset hand-off; restored v1.9.0 engine prose (probe-found gap) diff --git a/skills/dev-cycle/SKILL.md b/skills/dev-cycle/SKILL.md index 63112f8..4015c8e 100644 --- a/skills/dev-cycle/SKILL.md +++ b/skills/dev-cycle/SKILL.md @@ -259,6 +259,24 @@ in_progress. ## Step 4: Verify +> **Gate integrity (v1.10.1 — earned by the f1 probe).** A static check is +> necessary but NOT sufficient, and a sub-agent's *self-reported* gate result is +> not trustworthy — the orchestrator must verify from facts. Two real misses the +> f1 overnight run surfaced, BOTH caught only by loading the artifact in its real +> runtime, never by the unit gate: +> 1. `node --check` exits 0 on a same-scope `const` REDECLARATION that the browser +> ES-module parser rejects — the game wouldn't boot, yet the cycle's +> `node --check + smoke` gate "passed". For an ES-module/browser artifact, also +> do a **module-load check** (import the changed modules in their module system, +> e.g. `node --input-type=module -e 'import("./src/x.js")'`, or load the page) +> — that catches what `node --check` cannot. +> 2. A cumulative **visual regression** (over-exposed-to-white frame) passed every +> unit gate; only a **rendered critique** caught it. +> Rule: for rich-runtime artifacts (browser/UI/graphics/game), the verification +> MUST load the artifact the way its runtime does (module-load + render/screenshot +> critique, i.e. evolve Step 5-G), and evolve re-checks the gate from recorded +> facts — it does NOT take the build skill's word for "tests passed". + **If `config.test_command` is not configured or is empty:** ``` Print "No test_command configured. Skipping tests."