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
2 changes: 1 addition & 1 deletion .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
22 changes: 22 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
18 changes: 18 additions & 0 deletions skills/dev-cycle/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -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."
Expand Down
Loading