diff --git a/.github/workflows/prepare-release-metadata.yml b/.github/workflows/prepare-release-metadata.yml index fc3cb15..ef6f9e3 100644 --- a/.github/workflows/prepare-release-metadata.yml +++ b/.github/workflows/prepare-release-metadata.yml @@ -56,9 +56,12 @@ jobs: const readmePath = "README.md" const readme = fs.readFileSync(readmePath, "utf8") - const marker = /\*\*Current release: `[^`]+`\.\*\*/ - if (!marker.test(readme)) throw new Error("README current release marker not found") - fs.writeFileSync(readmePath, readme.replace(marker, `**Current release: \`${version}\`.**`)) + const marker = /((?:>\s*)?)\*\*Current(?: stable)? release: `[^`]+`\.\*\*/ + if (!marker.test(readme)) throw new Error("README current stable release marker not found") + fs.writeFileSync( + readmePath, + readme.replace(marker, (_match, prefix = "") => `${prefix}**Current stable release: \`${version}\`.**`), + ) NODE - name: Prepend changelog notes diff --git a/CHANGELOG.md b/CHANGELOG.md index e1e3f16..a3d3405 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## 0.5.36 + +Empty-turn fail-safe release. + +- Distinguish a completed assistant message from a meaningful completed Loop turn instead of treating a timestamp-only blank reply as success. +- Count non-empty assistant text and tool/file/patch/artifact activity anywhere in the logical run as meaningful work, including tool-only runs with a blank final assistant tail. +- Refund a completed-but-empty logical run so it does not consume `runCount`, `--max-runs`, or normal success finalization/checkpoint behavior. +- Persist consecutive empty-turn state across reloads, retry one empty completion with bounded delay, then pause safely after the second consecutive empty turn with a visible warning instead of injecting prompts forever. +- Recover stale host `busy` state for already-completed empty turns so the fail-safe can finalize them rather than leaving the Loop stuck between busy and due states. +- Keep release metadata automation compatible with the README's `Current stable release` marker so future release prep does not fail on the documented format. +- Add focused regressions for blank/whitespace replies, tool activity, max-run refund/re-enable, bounded retry, fail-safe pause, successful streak reset, and generated-bundle parity; full Ubuntu/Windows CI, real-host, Goal coexistence, lifecycle, and single-file bundle gates are green on the feature head. + ## 0.5.35 - Treat OpenCode `session.status=retry` as authoritative provider ownership: retry and unreadable status can no longer age into idle and cause an overlapping Loop turn; a genuinely completed current assistant message can still release stale retry safely. diff --git a/README.md b/README.md index 9a4b17a..d05981e 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ OpenCode Loop adds `/loop`, scheduled prompt/command/shell jobs, compact scheduling, verification/checkpoints, and the `opencode-loopd` background daemon. -> **Current stable release: `0.5.35`.** +> **Current stable release: `0.5.36`.** ## Install or update diff --git a/package-lock.json b/package-lock.json index a1fab2a..caf490d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@bybrawe/opencode-loop", - "version": "0.5.35", + "version": "0.5.36", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@bybrawe/opencode-loop", - "version": "0.5.35", + "version": "0.5.36", "license": "MIT", "bin": { "opencode-loop": "scripts/install-with-goals.mjs", diff --git a/package.json b/package.json index e8b6dea..6def286 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bybrawe/opencode-loop", - "version": "0.5.35", + "version": "0.5.36", "description": "Claude Code/Codex style /loop and experimental goal mode for OpenCode: heartbeat scheduler, idle-safe loops, scheduled commands, compact scheduling, verification, checkpoints, and persistent coding goals.", "type": "module", "main": "src/index.js",