From 1427a6e192effe6aed79cd500ff72ba8ca28baca Mon Sep 17 00:00:00 2001 From: John Smith Date: Thu, 29 Oct 2026 09:52:06 -0400 Subject: [PATCH] feat(bump-075): implement stage requirements --- AGENTS.md | 3 +- Makefile | 2 +- PROMPT_ADVERSARIAL_FLEET_AUDIT.md | 10 +- README.md | 6 +- docker/Dockerfile | 2 +- docs/TECHNICAL_DOCUMENTATION.md | 2 +- docs/USER_GUIDE.md | 12 +-- docs/reports/bump-075-implementation.md | 99 +++++++++++++++++++ docs/sprints/CLI-0.7.5-BUMP.md | 74 ++++++++++++++ .../changes/2026-10-29-bump-075/design.md | 63 ++++++++++++ .../changes/2026-10-29-bump-075/proposal.md | 42 ++++++++ .../2026-10-29-bump-075/specs/bump/spec.md | 41 ++++++++ openspec/changes/2026-10-29-bump-075/tasks.md | 16 +++ scripts/verify-rigs.sh | 12 +-- 14 files changed, 360 insertions(+), 24 deletions(-) create mode 100644 docs/reports/bump-075-implementation.md create mode 100644 docs/sprints/CLI-0.7.5-BUMP.md create mode 100644 openspec/changes/2026-10-29-bump-075/design.md create mode 100644 openspec/changes/2026-10-29-bump-075/proposal.md create mode 100644 openspec/changes/2026-10-29-bump-075/specs/bump/spec.md create mode 100644 openspec/changes/2026-10-29-bump-075/tasks.md diff --git a/AGENTS.md b/AGENTS.md index de954c5..bd39732 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,7 +1,7 @@ # AGENTS.md — heretek-rigs operator guide (for agents working in this repo) 51 specialist seats across 8 OpenRig v0.2 bundles, generated deterministically. -Stack: `@openrig/cli@0.7.4` (`rig`), Pi 1.4.0 (`pi`), `@gotgenes/pi-permission-system@41.0.0`, +Stack: `@openrig/cli@0.7.5` (`rig`, tarball sha256 `22d67c2c…`), Pi 1.4.0 (`pi`), `@gotgenes/pi-permission-system@41.0.0`, `opencode-go/muse-spark-1.3-contributor:high` via `https://opencode.ai/inference/go/v1`. ## The one rule @@ -74,3 +74,4 @@ NO permission config — always seed before `up`/`expand`/`add`. - `openspec/changes/archive/2026-10-28-77-mission-gates/` — wave 4 spec: mission-row gate ownership (Refs #77, detect/classify/propose-only). - `openspec/changes/archive/2026-10-28-81-seat-idle/` — wave 81 spec: seat idle-park after claim + daemon source label (Refs #81, fixtures-only, propose-only). - `openspec/changes/archive/2026-10-29-15-auth-envelope/` — wave 15 spec: pre-authorization envelopes for slice classes (Refs #15, fixtures-only, propose-only, never auto-commit). +- `docs/sprints/CLI-0.7.5-BUMP.md` — wave `2026-10-29-bump-075` ledger: host toolchain `@openrig/cli@0.7.5` (tarball sha256 `22d67c2c…`), 8 true-pin files, zero generator-input changes. diff --git a/Makefile b/Makefile index 1ab0ad9..edc92f6 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ # Heretek-Rigs Operations & Verification Makefile # -# Target Framework: OpenRig v0.7.4 (CLI binary: `rig`) +# Target Framework: OpenRig v0.7.5 (CLI binary: `rig`) # Primary Harness: Pi Coding Agent v1.4.0 (`pi --mode rpc --no-approve`) # Enforcement: @gotgenes/pi-permission-system@41.0.0 ("*..*": "deny" guard) # Primary Model: opencode-go/muse-spark-1.3-contributor:high (OpenCode Go) diff --git a/PROMPT_ADVERSARIAL_FLEET_AUDIT.md b/PROMPT_ADVERSARIAL_FLEET_AUDIT.md index 8440306..74db7dc 100644 --- a/PROMPT_ADVERSARIAL_FLEET_AUDIT.md +++ b/PROMPT_ADVERSARIAL_FLEET_AUDIT.md @@ -2,7 +2,7 @@ **Target Codebase**: the Git repository this file sits in. Resolve it with `git rev-parse --show-toplevel` and treat every path below as relative to that root. Nothing in this prompt depends on where the checkout lives. **GitHub Remote**: `https://github.com/Heretek-AI/heretek-rigs` -**What it is supposed to be**: `heretek-rigs` is the production OpenRig (`@openrig/cli@0.7.4`, binary `rig`) multi-rig monorepo and agent catalog migrating all 51 specialized autonomous agent roles from `Heretek-AI/Heretek-Crew@5ffb1fc` across 9 domain directories (`specs/agents///` + `specs/agents/_shared/`) and 8 composable pod-aware OpenRig v0.2 bundles (`rigs/executive-and-architecture`, `rigs/fullstack-and-web-studio`, `rigs/systems-and-mobile-foundry`, `rigs/game-dev-and-sim-rig`, `rigs/cloud-sre-and-data-platform`, `rigs/qa-and-verification-gauntlet`, `rigs/defensive-sec-and-red-team`, and the hybrid `rigs/heretek-omni-fleet` with 3-seat `command` pod, 15 `pods/*.yaml` fragments, 51 `members/*.yaml` fragments, `rig.all-51.yaml`, and `rosters/heretek-omni-fleet.json`). `fleet/fleet.yaml` and `fleet/mcp-servers.yaml` are the single canonical YAML source of truth; the unified Python 3 toolchain (`scripts/generate-rigs.py`, `scripts/render-seat.py`, `scripts/seed-rig.py`, `scripts/bootstrap-pi-seats.sh`, `scripts/verify-rigs.sh`, `scripts/gate-role.sh`, `scripts/audit_loop.py`) deterministically generates `specs/`, materialized `rigs/` (zero symlinks), `rosters/`, `registry/` (`status.json` with RFC 8785 JCS `bodyDigest`, `entries/*.yaml`, `views/*/behaviour.json`), and per-seat Pi (`@earendil-works/pi-coding-agent@1.4.0`) configurations wired to `opencode-go/muse-spark-1.3-contributor:high` via OpenCode Go (`https://opencode.ai/inference/go/v1`). Since OpenRig records `permission_policy` for Pi but delegates runtime enforcement (`HONESTY_PIN`), `@gotgenes/pi-permission-system@41.0.0` enforces least-privilege tool rules with mandatory `"*..*": "deny"` path traversal protection, command-backed `"!cat"` secrets in `0600` `auth.json`/`mcp.json`, per-seat `/AGENTS.md` charters (zero `guidance_merge` collisions), and explicit `"deny"` rules on mutating AST/LSP extension tools (`code_rewrite`, `lsp_rename`, `lsp_code_actions`). +**What it is supposed to be**: `heretek-rigs` is the production OpenRig (`@openrig/cli@0.7.5`, binary `rig`) multi-rig monorepo and agent catalog migrating all 51 specialized autonomous agent roles from `Heretek-AI/Heretek-Crew@5ffb1fc` across 9 domain directories (`specs/agents///` + `specs/agents/_shared/`) and 8 composable pod-aware OpenRig v0.2 bundles (`rigs/executive-and-architecture`, `rigs/fullstack-and-web-studio`, `rigs/systems-and-mobile-foundry`, `rigs/game-dev-and-sim-rig`, `rigs/cloud-sre-and-data-platform`, `rigs/qa-and-verification-gauntlet`, `rigs/defensive-sec-and-red-team`, and the hybrid `rigs/heretek-omni-fleet` with 3-seat `command` pod, 15 `pods/*.yaml` fragments, 51 `members/*.yaml` fragments, `rig.all-51.yaml`, and `rosters/heretek-omni-fleet.json`). `fleet/fleet.yaml` and `fleet/mcp-servers.yaml` are the single canonical YAML source of truth; the unified Python 3 toolchain (`scripts/generate-rigs.py`, `scripts/render-seat.py`, `scripts/seed-rig.py`, `scripts/bootstrap-pi-seats.sh`, `scripts/verify-rigs.sh`, `scripts/gate-role.sh`, `scripts/audit_loop.py`) deterministically generates `specs/`, materialized `rigs/` (zero symlinks), `rosters/`, `registry/` (`status.json` with RFC 8785 JCS `bodyDigest`, `entries/*.yaml`, `views/*/behaviour.json`), and per-seat Pi (`@earendil-works/pi-coding-agent@1.4.0`) configurations wired to `opencode-go/muse-spark-1.3-contributor:high` via OpenCode Go (`https://opencode.ai/inference/go/v1`). Since OpenRig records `permission_policy` for Pi but delegates runtime enforcement (`HONESTY_PIN`), `@gotgenes/pi-permission-system@41.0.0` enforces least-privilege tool rules with mandatory `"*..*": "deny"` path traversal protection, command-backed `"!cat"` secrets in `0600` `auth.json`/`mcp.json`, per-seat `/AGENTS.md` charters (zero `guidance_merge` collisions), and explicit `"deny"` rules on mutating AST/LSP extension tools (`code_rewrite`, `lsp_rename`, `lsp_code_actions`). **Execution Context**: OpenCode v2 autonomous audit (`opencode run --model opencode-go/muse-spark-1.3-contributor --variant high`; works identically in any agent CLI that supports subagents and bash execution) **Auditor Formation**: three independent adversarial subagents (Alpha, Beta, Gamma), a cross-examination pass, and a synthesis pass **Output**: `AUDIT_REPORT_FINDINGS.md` at the repository root, ending with a mandatory deterministic status sentinel (`STATUS: NO_FINDINGS` or `STATUS: FINDINGS_DETECTED`) consumed by `scripts/audit_loop.py`. @@ -13,7 +13,7 @@ This prompt is designed to be re-run. Each run audits the current `HEAD`, re-ver ## 0. Preflight (the controller does this before spawning subagents) -1. **Baseline.** Record at the top of the report: `git rev-parse HEAD`, `git log -1 --format='%ci %s'`, the UTC date, and the versions of every tool you will use (`python3 --version`, `node --version`, `npm --version`, `git --version`, `jq --version`, `rg --version`, `docker compose version` if installed, `rig --version` from `@openrig/cli@0.7.4`, `pi --version` from `@earendil-works/pi-coding-agent@1.4.0`). If `git status --porcelain` shows changes other than this prompt file and a previous report, list the dirty files and audit a clean `git worktree` of `HEAD` instead of the working tree. +1. **Baseline.** Record at the top of the report: `git rev-parse HEAD`, `git log -1 --format='%ci %s'`, the UTC date, and the versions of every tool you will use (`python3 --version`, `node --version`, `npm --version`, `git --version`, `jq --version`, `rg --version`, `docker compose version` if installed, `rig --version` from `@openrig/cli@0.7.5`, `pi --version` from `@earendil-works/pi-coding-agent@1.4.0`). If `git status --porcelain` shows changes other than this prompt file and a previous report, list the dirty files and audit a clean `git worktree` of `HEAD` instead of the working tree. 2. **Scratch space.** `export AUDIT_TMP="$(mktemp -d -t heretek-rigs-audit-XXXXXX)"`. Every clone, downloaded binary, packed tarball, sabotage copy, container volume, throwaway `OPENRIG_HOME`, and raw log goes under `$AUDIT_TMP`. Each subagent writes its raw notes to `$AUDIT_TMP/{alpha,beta,gamma}.md`. 3. **Disposable copy for experiments.** `git worktree add --detach "$AUDIT_TMP/wt" HEAD` (or `cp -a . "$AUDIT_TMP/wt"` if uncommitted). Sabotage, patched configs, and any file edits happen only there. The real checkout must end the audit with `git status --porcelain` showing nothing new but `AUDIT_REPORT_FINDINGS.md` (and this prompt file, if untracked). Remove the copy with `git worktree remove --force "$AUDIT_TMP/wt"` (and `rm -rf "$AUDIT_TMP"`) at the end. 4. **Previous run.** If `AUDIT_REPORT_FINDINGS.md` already exists, read it before anything else. Every finding in it gets a row in the Regression Ledger (section 6), re-verified from scratch: never copy a previous verdict forward. @@ -37,7 +37,7 @@ You are a team of **three elite, adversarial principal systems auditors**. Your 2. `classifyToolKind` (`src/access-intent/tool-kind.ts:33-55`) only classifies built-in `read`/`write`/`edit`/`grep`/`find`/`ls` as `ToolKind = "path"` (checked against `path_write`). Third-party Pi extension tools (`pi-lsp-extension@1.4.0`) are classified as `ToolKind = "extension"` and checked only by tool name (`permission[toolName]`). Without explicit `"code_rewrite": "deny"`, `"lsp_rename": "deny"`, and `"lsp_code_actions": "deny"`, any seat loading `pi-lsp-extension@1.4.0` can mutate arbitrary files bypassing `path_write`! - **Shared `/AGENTS.md` `guidance_merge` Collision**: `PiRuntimeAdapter` (`pi-runtime-adapter.ts:360`) keys `guidance_merge` blocks in `/AGENTS.md` by `entry.path` (`guidance/role.md`), causing seats sharing `` to overwrite each other's role instructions if `guidance_merge` is used in `agent.yaml`. - **Hallucinated / Dead Ecosystem Packages**: PyPI `r2mcp==0.2.5` is a Cloudflare R2 storage server (not radare2); npm `aws-mcp` is dead (0.0.1 from 2025); `obra/superpowers` skills in `Heretek-Crew` were truncated to single `SKILL.md` files missing upstream companion prompts and scripts. -- Never conclude that a component works because `./scripts/verify-rigs.sh` exits 0. Prove behavior against **the real thing it plugs into**: `@openrig/cli@0.7.4` (`rig spec validate`, `rig bundle check`, `rig agent validate`, `rig spec preflight`, `rig up`), `@earendil-works/pi-coding-agent@1.4.0`, `@gotgenes/pi-permission-system@41.0.0`, `Draft202012Validator` over `schemas/*.v1.schema.json`, `identity-vectors.json` digest rules, and `Heretek-Crew`'s 51-role catalog. +- Never conclude that a component works because `./scripts/verify-rigs.sh` exits 0. Prove behavior against **the real thing it plugs into**: `@openrig/cli@0.7.5` (`rig spec validate`, `rig bundle check`, `rig agent validate`, `rig spec preflight`, `rig up`), `@earendil-works/pi-coding-agent@1.4.0`, `@gotgenes/pi-permission-system@41.0.0`, `Draft202012Validator` over `schemas/*.v1.schema.json`, `identity-vectors.json` digest rules, and `Heretek-Crew`'s 51-role catalog. ### The Second Rule: DO NOT BELIEVE THE PAPER TRAIL - `docs/OSINT_ECOSYSTEM_REPORT.md`, `docs/OPENRIG_MUSE_GO_ARCHITECTURE.md`, `docs/NOTES.md`, `REMEDIATION_LOG.md`, and `README.md` are **claims under audit**, not evidence. @@ -67,7 +67,7 @@ graph TD ``` ### Subagent Alpha: Runtime, OpenRig Schema & Pi/Muse 1.3 Contributor Integration Inquisitor -* **Focus**: "Do all 51 AgentSpecs, 8 RigBundles, and seeded Pi seats conform to OpenRig `v0.7.4` and Pi `v1.4.0` contracts, pass `rig spec validate` and `rig bundle check`, and launch cleanly?" +* **Focus**: "Do all 51 AgentSpecs, 8 RigBundles, and seeded Pi seats conform to OpenRig `v0.7.5` and Pi `v1.4.0` contracts, pass `rig spec validate` and `rig bundle check`, and launch cleanly?" * **Methodology**: - Audit every `rigs/*/rig.yaml` (plus `rigs/heretek-omni-fleet/rig.all-51.yaml`, `pods/*.yaml`, `members/*.yaml`) against `RIG_KEYS`, `POD_KEYS`, `MEMBER_KEYS`, and `EDGE_KEYS` from `openrig/packages/daemon/src/domain/rigspec-schema.ts`. Verify pod-local unqualified edges, cross-pod `pod.member` edges, and DAG acyclicity on `delegates_to`/`spawned_by`. - Run `rig spec validate --json` and `rig bundle check --json` across all 8 `rigs//` directories. Confirm `rig bundle check --json` reports zero failing checks (0.6.13+ returns `{"standardVersion":"openrig.bundle-standard/v1","checks":[...]}`; count `.checks[] | select(.status=="fail")`) and `find specs rigs -type l` is empty. @@ -164,7 +164,7 @@ cp -a . "$AUDIT_TMP/wt" ./scripts/verify-rigs.sh --check-only | tee "$AUDIT_TMP/logs/verify.log" python3 ./scripts/audit_loop.py --self-test | tee "$AUDIT_TMP/logs/self-test.log" -# 2. Real @openrig/cli@0.7.4 offline validation across all 8 rigs +# 2. Real @openrig/cli@0.7.5 offline validation across all 8 rigs for d in rigs/*/; do rig spec validate "${d}rig.yaml" --json | jq -e '.valid == true' >/dev/null test "$(rig bundle check "$d" --json | jq '[.checks[] | select(.status=="fail")] | length')" -eq 0 diff --git a/README.md b/README.md index 548f596..fc84806 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ catalog and enforced at runtime by Pi's permission system. | Stack | Pin | |---|---| -| Orchestration | `@openrig/cli@0.7.4` (binary `rig`) | +| Orchestration | `@openrig/cli@0.7.5` (binary `rig`) | | Agent runtime | `@earendil-works/pi-coding-agent@1.4.0` (binary `pi`) | | Permission enforcement | `@gotgenes/pi-permission-system@41.0.0` (fail-closed, `*..*` terminal deny) | | Model | `opencode-go/muse-spark-1.3-contributor:high` via `https://opencode.ai/inference/go/v1` | @@ -36,8 +36,8 @@ with `--user 1000:1000` and secrets mounted at `/run/heretek-secrets:ro` — see ## Quickstart ```bash -# 0. Prerequisites: rig 0.7.4, pi 1.4.0, Python 3.10+ (pyyaml, jsonschema), tmux 3.2+ -npm install -g @openrig/cli@0.7.4 @earendil-works/pi-coding-agent@1.4.0 +# 0. Prerequisites: rig 0.7.5, pi 1.4.0, Python 3.10+ (pyyaml, jsonschema), tmux 3.2+ +npm install -g @openrig/cli@0.7.5 @earendil-works/pi-coding-agent@1.4.0 # 1. Secrets (0700 dir, 0600 files; strict mode refuses anything else) mkdir -p -m 700 ~/.config/heretek-rigs/secrets diff --git a/docker/Dockerfile b/docker/Dockerfile index d0cbda6..f41f84a 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -13,7 +13,7 @@ ARG BASE_IMAGE=debian:bookworm-slim@sha256:3783cc01769c7b2b1b83a5c5ad96c815348e28ed7da68e2e3687004faa906251 ARG NODE_VERSION=22.22.1 ARG UV_VERSION=0.13.3 -ARG OPENRIG_VERSION=0.7.4 +ARG OPENRIG_VERSION=0.7.5 ARG PI_VERSION=1.4.0 # ---------------------------------------------------------------- builder --- diff --git a/docs/TECHNICAL_DOCUMENTATION.md b/docs/TECHNICAL_DOCUMENTATION.md index 4837035..d2b1ba2 100644 --- a/docs/TECHNICAL_DOCUMENTATION.md +++ b/docs/TECHNICAL_DOCUMENTATION.md @@ -1,7 +1,7 @@ # Heretek-Rigs Technical & Architecture Documentation **Repository**: `Heretek-AI/heretek-rigs` -**Target Orchestration Framework**: OpenRig v0.7.4 (`@openrig/cli@0.7.4`, commit `6d9e8e27`, CLI binary `rig`) +**Target Orchestration Framework**: OpenRig v0.7.5 (`@openrig/cli@0.7.5`, commit `b57c4da3`, CLI binary `rig`) **Primary Agent Runtime Harness**: Pi Coding Agent v1.4.0 (`@earendil-works/pi-coding-agent@1.4.0`, CLI binary `pi`) **Runtime Permission Enforcement**: `@gotgenes/pi-permission-system@41.0.0` (fail-closed policy engine with mandatory `"*..*": "deny"` traversal guard) **Optional Builder AST/LSP Extensions**: `pi-lsp-extension@1.4.0` and `pi-ast-grep@0.1.0` (enabled on 21 builder and code-analysis seats) diff --git a/docs/USER_GUIDE.md b/docs/USER_GUIDE.md index 47952ba..26616a9 100644 --- a/docs/USER_GUIDE.md +++ b/docs/USER_GUIDE.md @@ -1,6 +1,6 @@ # Heretek-Rigs Operator & User Guide -Welcome to the operator manual for **`heretek-rigs`** — the 51-agent, 8-rig software engineering fleet built on **OpenRig v0.7.4** (`rig`), **Pi Coding Agent v1.4.0** (`pi`), **`@gotgenes/pi-permission-system@41.0.0`**, and **OpenCode Go** (`opencode-go/muse-spark-1.3-contributor:high`). +Welcome to the operator manual for **`heretek-rigs`** — the 51-agent, 8-rig software engineering fleet built on **OpenRig v0.7.5** (`rig`), **Pi Coding Agent v1.4.0** (`pi`), **`@gotgenes/pi-permission-system@41.0.0`**, and **OpenCode Go** (`opencode-go/muse-spark-1.3-contributor:high`). This guide walks you through installing prerequisites, provisioning zero-leak secrets, seeding isolated seat directories, launching and operating domain rigs, dynamically scaling the `heretek-omni-fleet` command center, running Docker sidecars safely, customizing the fleet catalog, and troubleshooting common issues. @@ -11,18 +11,18 @@ This guide walks you through installing prerequisites, provisioning zero-leak se | Component | Required Version | Purpose | | :--- | :--- | :--- | | **Operating System** | Linux or macOS (WSL2 on Windows) | Host environment for OpenRig daemon, `tmux` sessions, and Docker sidecars. | -| **Node.js & npm** | Node.js `22.x` or `24.x` (`>=22.19.0`) | Required by `@openrig/cli@0.7.4` (`better-sqlite3` ABI) and `@earendil-works/pi-coding-agent@1.4.0`. (Node 20 is unsupported.) | +| **Node.js & npm** | Node.js `22.x` or `24.x` (`>=22.19.0`) | Required by `@openrig/cli@0.7.5` (`better-sqlite3` ABI) and `@earendil-works/pi-coding-agent@1.4.0`. (Node 20 is unsupported.) | | **tmux** | `3.2+` | Terminal multiplexer backing all OpenRig agent seats. | | **Python 3** | `3.10+` with `pyyaml` and `jsonschema` (or `uv`) | Runs `generate-rigs.py`, `render-seat.py`, `seed-rig.py`, `verify-rigs.sh`, and `audit_loop.py`. All scripts automatically fall back to `uv run --with pyyaml --with jsonschema` if `uv` is installed. | | **Docker & Compose** | Docker Engine + `docker compose` v2 | Optional for core rig launch; required when starting supporting sidecar profiles (`docker-compose.sidecars.yml`) or the `terraform` MCP container. | ### Step 1: Install OpenRig CLI (`rig`) and Pi Coding Agent (`pi`) -Install the exact pinned versions of the OpenRig CLI (`@openrig/cli@0.7.4`) and Pi Coding Agent (`@earendil-works/pi-coding-agent@1.4.0`) globally: +Install the exact pinned versions of the OpenRig CLI (`@openrig/cli@0.7.5`) and Pi Coding Agent (`@earendil-works/pi-coding-agent@1.4.0`) globally: ```bash -npm install -g @openrig/cli@0.7.4 @earendil-works/pi-coding-agent@1.4.0 -rig --version # Expect: 0.7.4 (6d9e8e27) +npm install -g @openrig/cli@0.7.5 @earendil-works/pi-coding-agent@1.4.0 +rig --version # Expect: 0.7.5 (b57c4da3) pi --version # Expect: 1.4.0 ``` @@ -470,7 +470,7 @@ Public multi-arch images (`linux/amd64`, `linux/arm64`) are published by | Tag | Contents | Approx. size | | :--- | :--- | :--- | -| `:latest` (slim) | `rig` 0.7.4, `pi` 1.4.0, permission system + AST/LSP packages, 8 npm MCP servers, uvx PyPI MCP servers | ~3.5 GB (dominated by the upstream `codebase-memory-mcp` 330 MB Go binary, tree-sitter WASM grammars, and the Node 22 toolchain) | +| `:latest` (slim) | `rig` 0.7.5, `pi` 1.4.0, permission system + AST/LSP packages, 8 npm MCP servers, uvx PyPI MCP servers | ~3.5 GB (dominated by the upstream `codebase-memory-mcp` 330 MB Go binary, tree-sitter WASM grammars, and the Node 22 toolchain) | | `:full` | slim + Playwright Chromium (+`CHROME_PATH` for chrome-devtools-mcp), source-built radare2 6.2.4, compiled `r2mcp -R` | ~4.7 GB | | `:sha-` / `:sha--full` | Pinned releases (provenance + SBOM attestations) | — | diff --git a/docs/reports/bump-075-implementation.md b/docs/reports/bump-075-implementation.md new file mode 100644 index 0000000..ae02fb1 --- /dev/null +++ b/docs/reports/bump-075-implementation.md @@ -0,0 +1,99 @@ +# Implementation report — Wave 1 `2026-10-29-bump-075` (0.7.5 bump-eval ledger) + +- **Stage:** Wave 1 `2026-10-29-bump-075` · **Branch:** `feat/bump-075` @ `c1da1fb` +- **Worktree:** `.lane/trees/bump-075` (repo-relative) +- **Role:** agency-programmer · **Method:** test-first (RED baseline → GREEN pins → red-proof sabotage) +- **Commit:** none (coordinator commits per wave instructions) + +## Deliverables + +1. `openspec/changes/2026-10-29-bump-075/` — `proposal.md`, `specs/bump/spec.md` + (RFC 2119 deltas REQ-BUMP3/REQ-BUMP4 + REQ-G1 updated to V1–V31/SUMMARY 39), + `design.md` (live upstream facts + tarball-diff disposition table + + fail-closed modes), `tasks.md` (all boxes checked; T2 acceptance uses `&&`). +2. `docs/sprints/CLI-0.7.5-BUMP.md` — ledger (version, two-fetch sha, tag, + 8 true-pin files, disposition, verify output, rollback). +3. Host toolchain pins updated in exactly the 8 true-pin files (same set as + the 0.7.4 precedent): `AGENTS.md` (surgical), `README.md`, `Makefile`, + `docs/USER_GUIDE.md`, `docs/TECHNICAL_DOCUMENTATION.md`, + `PROMPT_ADVERSARIAL_FLEET_AUDIT.md`, `docker/Dockerfile`, + `scripts/verify-rigs.sh` (V13 + V18 pin strings only). +4. This report. + +## Files changed + +- Modified (8): `AGENTS.md`, `README.md`, `Makefile`, `docs/USER_GUIDE.md`, + `docs/TECHNICAL_DOCUMENTATION.md`, `PROMPT_ADVERSARIAL_FLEET_AUDIT.md`, + `docker/Dockerfile`, `scripts/verify-rigs.sh` +- Created (6): `openspec/changes/2026-10-29-bump-075/{proposal.md,design.md, + tasks.md,specs/bump/spec.md}`, `docs/sprints/CLI-0.7.5-BUMP.md`, + `docs/reports/bump-075-implementation.md` +- Untouched by design: `fleet/*` (never `yaml.safe_dump`; no edit at all), + `scripts/generate-rigs.py`, `schemas/*`, all generated leaves + (`specs/`, `rigs/`, `rosters/`, `registry/`), canonical `openspec/specs/`, + dated records, `docs/IMPLEMENTATION_PROMPT.md` (not a true-pin file). + +## Live evidence (training data NOT trusted; all captured 2026-10-29) + +- `npm view`: `0.7.5` published `2026-10-29T07:36:19.571Z`; tarball + `https://registry.npmjs.org/@openrig/cli/-/cli-0.7.5.tgz`. +- Two independent `npm pack` fetches → sha256 + `22d67c2c7e0d0ab4a5ec9faac0a725d54f9ead2c0f71564985cf4ae240bb9754` + (identical); control re-fetch of 0.7.4 reproduces `d11dd8a6…` (method sound). +- `git ls-remote https://github.com/mvschwarz/openrig`: `refs/tags/v0.7.5` + = `e9b05fda…`, peeled `v0.7.5^{}` = `b57c4da3c3ac3fb420a09e5a169d3e85f9529e93` + (confirms plan claim `b57c4da`, tag date 2026-10-28 per plan — tag date not + directly verifiable via ls-remote, noted here). npm metadata carries NO + `gitHead` (0.7.4 has none either); `dist.shasum 00ef5b67…` is the tarball + sha1, not a commit — recorded to prevent misreading. +- `npm install -g @openrig/cli@0.7.5` → `rig --version` = `0.7.5 (b57c4da3)` + (binary stamp corroborates the peeled commit). +- Tarball diff 0.7.4→0.7.5: MEMBER_KEYS permission sets IDENTICAL; + run-record + all five bundle/registry schemas byte-IDENTICAL (installed + copies equal tarball copies); 19/19 skill dirs, only `queue-handoff/SKILL.md` + +parking prose (deferred); new one-way DB migration 126; #2200 still open + per upstream whats-new. → **zero generator-input changes demanded.** + +## Commands run (real outputs, exit codes) + +| # | Command | Output / exit | +|---|---|---| +| 1 | `./scripts/verify-rigs.sh --check-only` (baseline, rig 0.7.4) | `SUMMARY: 39 checks passed, 0 failed`, exit 0 | +| 2 | `npm view` / two `npm pack` + `sha256sum` / `git ls-remote` | values above; both shas `22d67c2c…` | +| 3 | `npm install -g @openrig/cli@0.7.5` + `rig --version` | `0.7.5 (b57c4da3)` | +| 4 | `./scripts/verify-rigs.sh --check-only` (RED: pins still 0.7.4) | `[FAIL] V18/#98: host rig --version is not 0.7.4 (got 0.7.5 (b57c4da3))`, `SUMMARY: 38 checks passed, 1 failed`, exit 1 | +| 5 | 8-file pin edits (surgical; schema-provenance comments untouched) | `git status` shows only the 8 files | +| 6 | `./scripts/verify-rigs.sh --check-only` (GREEN) | `SUMMARY: 39 checks passed, 0 failed`, exit 0 | +| 7 | `make test` | `Ran 634 tests … OK`, exit 0 (106.7s) | +| 8 | `python3 scripts/audit_loop.py --self-test` | `SELF-TEST PASSED`, exit 0 | +| 9 | `git diff --stat AGENTS.md` | `1 file changed, 2 insertions(+), 1 deletion(-)` (≤15 ✓) | +| 10 | `openspec validate 2026-10-29-bump-075` | `Change '2026-10-29-bump-075' is valid`, exit 0 | +| 11 | `python3 scripts/generate-rigs.py --check-idempotent` (dirty tree) | exit 2 refusal BY DESIGN (blocking = only my 8 pin files + untracked ledger; no generator-input dirt) | +| 12 | stash-dance → clean tree → `--check-idempotent` | `idempotence check passed (two consecutive runs byte-identical)`, exit 0 | +| 13 | regen side-effect inspection → `git checkout -- fleet/skills-lock.json registry specs rigs` | reverted; `git status` clean of regen (proves regen would vendor deferred 0.7.5 queue-handoff prose — correctly NOT kept) | +| 14 | `git stash pop` + ledger restore | tree back to exactly the 8 pin files + ledger + change dir; stash list empty | +| 15 | `./scripts/verify-rigs.sh --check-only` (post-round-trip sanity) | 39/0, exit 0 | +| 16 | **Red-proof SABOTAGE:** V18 comparison pinned back to `"0.7.4"` | `[FAIL] V18/#98`, `SUMMARY: 38 checks passed, 1 failed`, exit 1 → **RED** | +| 17 | **Red-proof RESTORE:** byte backup restored; `git diff` = exactly the 6 intended pin lines | `SUMMARY: 39 checks passed, 0 failed`, exit 0 → **GREEN** | +| 18 | Stub scan (`TODO\|FIXME\|stub\|NotImplemented` over change + ledger) | no matches (clean) | +| 19 | `git status --short` (final) | only intended wave files (8 M + `?? docs/sprints/CLI-0.7.5-BUMP.md` + sanctioned `?? openspec/changes/2026-10-29-bump-075/`) | + +## Self-audit notes (stated plainly) + +- Nothing unfinished: all Wave 1 Do-items done; compound acceptance green + except the pre-commit `--check-idempotent` refusal, which is BY DESIGN on a + dirty tree and was proven exit-0 on the stashed clean tree with side-effects + reverted (commands 11–14). The coordinator's post-commit run will show exit 0 + directly. +- Deviation from the 0.7.4 precedent (documented, deliberate): the 0.7.4 wave + did NOT run `--check-idempotent` at all; this wave ran it (clean tree, exit 0) + and used the side-effect diff as positive proof that regen vendors deferred + 0.7.5 content — strengthening the no-regen disposition. +- Known upstream risks carried to later waves (not this one): one-way DB + migration 126 before any real-daemon restart; `queue-handoff` parking prose + + `escalates_to` edge adoption owned by a future contract-sync wave; #2200 + still unfixed upstream. +- Secrets: none printed, logged, or committed; no secret-adjacent strings in + any new file (Bearer-shaped values never handled — scratch tarball hashes only). +- No `Closes` used anywhere (bump ledger, no issue); no upstream filing; no + commit made (awaiting coordinator). diff --git a/docs/sprints/CLI-0.7.5-BUMP.md b/docs/sprints/CLI-0.7.5-BUMP.md new file mode 100644 index 0000000..4029b79 --- /dev/null +++ b/docs/sprints/CLI-0.7.5-BUMP.md @@ -0,0 +1,74 @@ +# Slice CLI-4 — OpenRig CLI 0.7.4 → 0.7.5 + +- **Date:** 2026-10-29 +- **Branch:** `feat/bump-075` (from clean `main` `c1da1fb`) +- **Scope:** host toolchain pin + operator-doc pins + this ledger. No generator-input change, no contract sync, no regen, no new V-gate. Pi stays at 1.4.0 and pi-permission-system at 41.0.0. +- **Authority:** Wave 1 (`2026-10-29-bump-075`) of the five-wave remediation plan; Q9 default (no new V-gate). +- **Precedent:** `docs/sprints/CLI-0.7.4-BUMP.md` (same recipe). + +## 1. Version facts (checked 2026-10-29, live) + +| Item | Value | +|---|---| +| npm `latest` | `0.7.5`, published 2026-10-29T07:36:19Z (`time['0.7.5'] = '2026-10-29T07:36:19.571Z'`, registry `modified` `2026-10-29T07:36:19.834Z`) | +| Upstream tag | `v0.7.5`: tag object `e9b05fda…`, peeled commit `b57c4da3c3ac3fb420a09e5a169d3e85f9529e93` (via `git ls-remote`; npm metadata carries no `gitHead` — `dist.shasum 00ef5b67…` is the tarball sha1, not a commit) | +| Installed binary stamp | `rig --version` → `0.7.5 (b57c4da3)` (global install, `~/.npm-global/bin/rig`) | +| Tarball | `npm pack @openrig/cli@0.7.5` sha256 `22d67c2c7e0d0ab4a5ec9faac0a725d54f9ead2c0f71564985cf4ae240bb9754` (TWO independent fetches into separate scratch dirs, byte-identical; control re-fetch of 0.7.4 reproduces the 0.7.4-ledger value `d11dd8a6…`) | +| Engines | `node >=22`, unchanged for this fleet | +| Daemon DB | Scratch-only wave. The real-state daemon was never touched. Upstream ships a NEW one-way migration 126 (`escalation_target_refs`) — never run 0.7.5 against the pre-upgrade snapshot without a restore path (see §5). | + +## 2. What changes for this fleet + +0.7.4 → 0.7.5 tarball diff (read-only, `/tmp` scratch extracts): + +| Upstream change | Fleet impact | +|---|---| +| RigSpec `MEMBER_KEYS` permission sets IDENTICAL (`codex_permissions` ×13 both sides). `rigspec-schema.js` gains only additive `escalates_to` + `isEscalationTargetRef` edge tolerance (deferred same-daemon cross-rig escalation routing). | **No generator-input change.** Pinned key sets, `verify-rigs.sh` key gates, `schemas/rigspec-keys.pinned.json`, and all generated leaves stay 0.7.4-derived and correct. Our specs use none of the new edges. | +| `run-record.v1.schema.json` byte-IDENTICAL (vendored digest `b3c7ac64…` still holds); all five bundle/registry schemas byte-IDENTICAL; installed 0.7.5 copies equal the tarball copies. | **No re-vendor.** V18 byte-comparisons stay green against the installed CLI. | +| 19/19 `openrig-core` skill dirs identical set; only `queue-handoff/SKILL.md` gains parking prose (`rig queue block --on external: --wake-after --continuation "…"`). openrig-core 0.1.21→0.1.22 (plugin.json version bumps only). | **Deferred (out of scope).** Vendored-via-generator content; same deferral rule as the 0.7.4 wave's 3 skill bodies. A future contract-sync wave owns the re-vendor + regen. | +| Daemon behavior notes (upstream `whats-new`, recorded not acted on): `rig send` waits 60s for its result; runtime send refusals return 409 instead of 500 (stale Claude pane names `rig reconcile-session`); `rig down` records an explicit stop after rolled-back launch; terminal follow mode (Linux Herdr 0.9.5 only); `attach --self` tmux separator handling; scope-audit route accepts slice folders ≥100. | None touch our gates. Bearer-grant framing unchanged ("a recorded principal is attribution, not authentication"). #2200 Codex restart refusal still NOT fixed in 0.7.5 (upstream note). | +| Grant/rotation/sandbox/daemon-label surface, snapshot rendering (#80), queue-auth (#107-M3), restart semantics (#11): no issuance-redesign or flag-surface change in the probed paths. | No follow-up owned by this wave. | + +## 3. Repo changes + +| File | Change | +|---|---| +| Host toolchain | `npm install -g @openrig/cli@0.7.5`; `rig --version` → `0.7.5 (b57c4da3)`. | +| `AGENTS.md` (surgical: `git diff --stat` ≤15 lines) | Stack line `0.7.4`→`0.7.5` + tarball sha ref + docs-map row for this wave + ledger path. One Rule / secrets / git conventions verbatim. | +| `README.md` (stack table + prereqs/install), `Makefile` (target framework), `docs/USER_GUIDE.md` (§1 toolchain + `rig --version` expect + Docker `:latest` table), `docs/TECHNICAL_DOCUMENTATION.md` (target framework + commit `b57c4da3`), `PROMPT_ADVERSARIAL_FLEET_AUDIT.md` (stack definition, baseline tool, real-thing rule, Alpha focus, §2 validation heading) | Toolchain assertions 0.7.4 (`6d9e8e27`) → 0.7.5 (`b57c4da3`). | +| `docker/Dockerfile` + V13 check in `scripts/verify-rigs.sh` | `ARG OPENRIG_VERSION=0.7.4` → `0.7.5` (paired; V13 stays green). | +| `scripts/verify-rigs.sh` V18 fail-closed gate | Expected version `0.7.4` → `0.7.5` (comment + check + fail message + ok line; no gate logic touched, no new gate). | + +Intentionally NOT changed (all deferred to a contract-sync wave or owned by dated records): + +- `scripts/generate-rigs.py` (`OPENRIG_VERSION`/`OPENRIG_COMMIT` still 0.7.4/`6d9e8e27`) — a generator input; changing it would force a regen that re-vendors 0.7.5 skills/schema. Hence **no generator input changed → no regen** (leaves stay dirty-free; `--check-idempotent` exit 0). +- `fleet/fleet.yaml` header comment, `fleet/mcp-servers.yaml` (`builtin:rig-mcp-serve-http@0.7.2`) — generator inputs; same reason. (Never `yaml.safe_dump` on fleet.yaml regardless.) +- `schemas/rigspec-schema.pinned.ts`, `schemas/rigspec-keys.pinned.json`, `schemas/contract-schemas.sha256`, `verify-rigs.sh` key-set/provenance strings — provenance of still-0.7.4 bytes; editing provenance without re-vendoring would be a lie (disposition table proves no re-vendor is owed). +- Generated leaves (`registry/*`, `rigs/*/bundle.yaml`, `rigs/*/SETUP.md`, `fleet/skills-lock.json`) — one-rule: generator only. +- Dated records (`docs/sprints/CLI-0.7.4-BUMP.md`, `HANDOFF.md`, `docs/evidence/*`, `docs/reports/*`, `openspec/changes/archive/*`, this change's own proposal/design/tasks) — history is never rewritten. +- `docs/IMPLEMENTATION_PROMPT.md` stack line (still 0.7.4) — not one of the 8 true-pin files (same as the 0.7.4 wave, which did not own it either); V19 scans it for no version string. +- Vendored-byte descriptions: `USER_GUIDE.md` vendor-checkout line, `TECHNICAL_DOCUMENTATION.md` source-verified prose + skills-source table, `PROMPT_ADVERSARIAL_FLEET_AUDIT.md` skills-lock pin list — still true (bytes are 0.7.4 until a contract-sync re-vendors). + +## 4. Verification (this host, 2026-10-29) + +- `rig --version` → `0.7.5 (b57c4da3)`. +- `./scripts/verify-rigs.sh --check-only` → **39 checks passed, 0 failed** (SUMMARY frozen; V13 green on `ARG OPENRIG_VERSION=0.7.5`; V18 green on installed 0.7.5 with byte-identical schema comparisons + `bundle check`/`spec validate` clean; no V1–V31 renames). +- `make test` → full suite result recorded in the wave implementation report (`docs/reports/bump-075-implementation.md`). +- `python3 scripts/audit_loop.py --self-test` → SELF-TEST PASSED. +- `python3 scripts/generate-rigs.py --check-idempotent` → exit 0 byte-identical (no generator input changed, so no regen was owed). +- Red-proof: V18 expected-version pin sabotaged back to `0.7.4` → gate RED (38 passed, 1 failed); restored to `0.7.5` → GREEN (39/0). Commands + outputs in the implementation report. +- `openspec validate 2026-10-29-bump-075` → exit 0. +- `git diff --stat AGENTS.md` → ≤15 lines. + +## 5. Not verified here (needs the fleet host / a contract-sync wave) + +1. Constitution §2.7 pre-relaunch snapshot, then restart the real daemon on 0.7.5 (**migration 126 is new and one-way** — never run 0.7.5 against the pre-upgrade snapshot without a restore path). +2. `rig preflight`, `rig agent validate` (need the real daemon), then re-seed and relaunch one canary rig. +3. Contract-sync wave: generator bump (`OPENRIG_VERSION`/`OPENRIG_COMMIT` + tarball re-vendor), `escalates_to` edge-kind adoption decision, `queue-handoff` parking-prose re-vendor review (1 changed body), then regen + idempotence + full gates. +4. Live checks carried over: `send-authenticated.sh` relay receipt; `sweep-typed-blocks.py --dry-run`; `rig snapshot list ` (#80); operator `rig send` semantics (#9/#81); `rig send` 60s-wait behavior note. + +## 6. Rollback + +1. `rig daemon stop`, `npm i -g @openrig/cli@0.7.4`. +2. Restore the pre-upgrade daemon snapshot if 0.7.5 ran any one-way migration against real state (it did not in this wave — scratch evidence only, real daemon untouched). +3. Revert this wave's doc/pin commits (no regen needed — no generator input changed, no leaf touched). diff --git a/openspec/changes/2026-10-29-bump-075/design.md b/openspec/changes/2026-10-29-bump-075/design.md new file mode 100644 index 0000000..4402f4e --- /dev/null +++ b/openspec/changes/2026-10-29-bump-075/design.md @@ -0,0 +1,63 @@ +# Design: 2026-10-29-bump-075 + +## Architecture + +Single worktree `.lane/trees/bump-075`, branch `feat/bump-075` from clean +`main` (`c1da1fb`). Single triad (programmer → qa → drift-guard). One PR at +end (Refs only; no `Closes` — bump ledger, no issue). + +## Verified upstream facts (live, 2026-10-29) + +- npm `@openrig/cli@0.7.5`: `version = '0.7.5'`, tarball + `https://registry.npmjs.org/@openrig/cli/-/cli-0.7.5.tgz`, + `time['0.7.5'] = '2026-10-29T07:36:19.571Z'` (npm registry `modified` + `2026-10-29T07:36:19.834Z`). +- Tarball sha256 `22d67c2c7e0d0ab4a5ec9faac0a725d54f9ead2c0f71564985cf4ae240bb9754` + (two independent `npm pack` fetches into separate scratch dirs, identical + bytes; re-fetch of 0.7.4 reproduces + the ledger value `d11dd8a6…`, proving the method). +- Upstream tag `v0.7.5`: tag object `e9b05fda…`, peeled commit + `b57c4da3c3ac3fb420a09e5a169d3e85f9529e93` (via `git ls-remote`, matches the + plan claim `b57c4da` and the installed binary stamp below). npm metadata + carries no `gitHead` field (0.7.4 has none either); `dist.shasum` + `00ef5b6777aa02e9cd17a74e013e32c55989d30e` is the tarball sha1, not a commit. +- Installed host `rig` after `npm install -g @openrig/cli@0.7.5`: + `rig --version` → `0.7.5 (b57c4da3)` (global install, + `~/.npm-global/bin/rig`). + +## Change shape (minimal) + +1. `npm install -g @openrig/cli@0.7.5` on the build host; record + `rig --version`. +2. Ledger doc `docs/sprints/CLI-0.7.5-BUMP.md` following the 0.7.4-ledger + pattern (version, tarball SHA with two-fetch evidence, pin locations, + tarball-diff disposition, verify output, rollback). +3. Update the 8 true-pin files that assert 0.7.4 (grep `0.7\.4` / + `6d9e8e27`; change ONLY true version pins, never unrelated text): + `AGENTS.md` (stack line + tarball sha ref + docs-map row; diff-stat MUST + stay ≤15 lines), `README.md`, `Makefile`, `docs/USER_GUIDE.md`, + `docs/TECHNICAL_DOCUMENTATION.md`, `PROMPT_ADVERSARIAL_FLEET_AUDIT.md`, + `docker/Dockerfile` (`ARG OPENRIG_VERSION`), `scripts/verify-rigs.sh` + (V13 Dockerfile assert + V18 fail-closed version gate strings only — + schema-provenance comments stay 0.7.4 because the vendored bytes ARE still + 0.7.4-derived, same as the 0.7.4 wave left 0.7.2 provenance in place). +4. Clean-tree regen ONLY if generator inputs changed (they did not — see §2); + no regen owed, no leaves touched. +5. Full gates green; red-proof sabotage of the V18 pin (back to `0.7.4` → + RED, restore → GREEN). + +## Tarball-diff disposition (0.7.4 → 0.7.5, read-only, `/tmp` scratch extracts) + +| Upstream change | Fleet impact | +|---|---| +| RigSpec `MEMBER_KEYS` permission sets IDENTICAL (`codex_permissions` ×13 both sides). `rigspec-schema.js` gains only additive `escalates_to` + `isEscalationTargetRef` edge tolerance. | **No generator-input change.** Pinned key sets, `verify-rigs.sh` key gates, and `schemas/rigspec-keys.pinned.json` stay correct as-is. | +| `daemon/docs/reference/schemas/run-record.v1.schema.json` byte-IDENTICAL; all five bundle/registry schemas byte-IDENTICAL; installed 0.7.5 copies equal the tarball copies. | **No re-vendor.** V18 byte-comparisons stay green against the installed CLI. | +| 19/19 `openrig-core` skill dirs identical set; only `queue-handoff/SKILL.md` gains parking prose (`rig queue block --on external: --wake-after …`). openrig-core 0.1.21→0.1.22 (plugin.json version bumps only). | **Deferred (out of scope).** Vendored-via-generator content; same deferral rule as the 0.7.4 wave's 3 skill bodies. Our specs use none of the new prose. | +| New DB migration 126 (`escalation_target_refs`); `rig send` 60s result wait; send refusals 409-vs-500; `rig down` explicit stop; #2200 Codex restart refusal still not fixed. | **Recorded, not acted on.** Scratch-DB wave only — the real-state daemon was never touched; migration one-way caution carried in the ledger rollback §. | + +## Fail-closed modes + +- If `rig --version` does not print `0.7.5` after install, halt (do not fake the ledger). +- If any gate regresses vs the `c1da1fb` baseline for reasons unrelated to the version string, record the diff and halt rather than loosening gates. +- If the tarball diff had shown a MEMBER_KEYS or run-record change, this wave would halt and defer to a contract-sync wave (same rule as 0.7.4→Wave B) rather than editing provenance without re-vendoring. +- No new V-gate by default (Q9): V18/V13 pin-string updates are pin bumps of existing gates, not new coverage; V19 freeze stays 39. diff --git a/openspec/changes/2026-10-29-bump-075/proposal.md b/openspec/changes/2026-10-29-bump-075/proposal.md new file mode 100644 index 0000000..aeabde8 --- /dev/null +++ b/openspec/changes/2026-10-29-bump-075/proposal.md @@ -0,0 +1,42 @@ +# Proposal: 2026-10-29-bump-075 — pin @openrig/cli 0.7.5 with ledger + +Status: scope per `2026-10-29-five-wave-remediation-plan.md` Wave 1 (Build-agent handoff, agreed via grilling Q1–Q14). +Issues: none tracked (stack maintenance; bump ledger, no issue — no `Closes`). + +## Why + +The fleet pins `@openrig/cli@0.7.4` (`6d9e8e27`) while npm `latest` is `0.7.5` +(tag `v0.7.5` peels to commit `b57c4da3c3ac3fb420a09e5a169d3e85f9529e93`, +published 2026-10-29T07:36:19Z). Per the 0.7.4 precedent +(`docs/sprints/CLI-0.7.4-BUMP.md`), a stack bump ships with a ledger and a +green tree. Upstream's own `whats-new` for 0.7.5 lists: DB migration 126 +(`escalation_target_refs`), openrig-core 0.1.21→0.1.22 (queue-handoff parking +prose), `rig send` 60s result wait, send-refusal 409-vs-500, #2200 still not +fixed. None of these demand a generator-input change (see design §2). + +## What Changes + +- Pin bump: install `@openrig/cli@0.7.5` (host toolchain) and record the + version/commit/tarball in the bump ledger `docs/sprints/CLI-0.7.5-BUMP.md` + (0.7.4-ledger pattern: version output, pin locations, verify result). +- Update the 8 true-pin files only (AGENTS.md surgical: stack line + tarball + sha ref + docs-map row, diff-stat ≤15 lines; README.md, Makefile, + docs/USER_GUIDE.md, docs/TECHNICAL_DOCUMENTATION.md, + PROMPT_ADVERSARIAL_FLEET_AUDIT.md, docker/Dockerfile, scripts/verify-rigs.sh + V13/V18 pin strings). No generator-input change, no regen, no new V-gate. +- Full tree green on the bumped toolchain: `make verify` (39/0), + `audit_loop --self-test`, idempotent regen check, `make test`. + +## Acceptance + +1. `rig --version` → `0.7.5` on the build host. +2. Ledger exists with version + tarball SHA (two independent fetches) + + verify output + 8 true-pin files + deferred-item notes. +3. `./scripts/verify-rigs.sh --check-only` green (39/0, SUMMARY frozen, no + V-gate added/renamed), `generate-rigs.py --check-idempotent` exit 0, + `audit_loop --self-test` PASSED, `make test` ≥634 passed / 0 failed. +4. `openspec validate 2026-10-29-bump-075` exit 0. +5. Red-proof: pin `0.7.4` tarball-hash expectation back into the V18 gate → + RED; restore `0.7.5` → GREEN (commands + outputs in the implementation + report). +6. Drift-guard `VERDICT: PASS` → PR (Refs only; no `Closes`). diff --git a/openspec/changes/2026-10-29-bump-075/specs/bump/spec.md b/openspec/changes/2026-10-29-bump-075/specs/bump/spec.md new file mode 100644 index 0000000..b98ce67 --- /dev/null +++ b/openspec/changes/2026-10-29-bump-075/specs/bump/spec.md @@ -0,0 +1,41 @@ +# Delta spec: 2026-10-29-bump-075 + +## ADDED Requirements + +### Requirement: REQ-BUMP3 — pinned 0.7.5 toolchain with ledger +The build host toolchain MUST run `@openrig/cli@0.7.5` (`rig --version` → +`0.7.5 (b57c4da3)`). A bump ledger `docs/sprints/CLI-0.7.5-BUMP.md` MUST +record the version output, the published tarball sha256 +(`22d67c2c7e0d0ab4a5ec9faac0a725d54f9ead2c0f71564985cf4ae240bb9754`, +re-verified by two independent fetches), every pin location updated (the 8 +true-pin files), the 0.7.4→0.7.5 tarball-diff disposition (zero +generator-input changes: MEMBER_KEYS identical, run-record byte-identical, +queue-handoff skill-body delta deferred), and the verify result. + +#### Scenario: version and ledger present +- When `rig --version` runs on the build host it prints `0.7.5`, and + `docs/sprints/CLI-0.7.5-BUMP.md` contains the version string, the tarball + SHA with two-fetch evidence, the 8 true-pin files, and the green verify + output. + +### Requirement: REQ-BUMP4 — green tree on bumped toolchain +`./scripts/verify-rigs.sh --check-only` MUST be green on the bumped toolchain +with no gate added, renumbered, or reworded and SUMMARY frozen at 39 +(V18 fail-closed `rig --version` gate MUST assert `0.7.5`; V13 MUST assert +`ARG OPENRIG_VERSION=0.7.5`). `generate-rigs.py --check-idempotent` MUST exit +0 byte-identical (no generator input changed, so no regen is owed) and +`audit_loop.py --self-test` MUST print SELF-TEST PASSED. `make test` MUST +pass with ≥634 tests and 0 failures. + +#### Scenario: gates hold the bump +- When the full gate suite runs after the bump, `SUMMARY: 39 checks passed, 0 + failed` with V18/V13 asserting the 0.7.5 pins, idempotence exit 0, and + self-test passes. + +## MODIFIED Requirements + +### Requirement: REQ-G1 — append-only, generator rule +New coverage MUST be new appended blocks (or new scripts), never renumber/reword of V1–V31. `specs/` `rigs/` `rosters/` `registry/` MUST change only via `generate-rigs.py`. + +#### Scenario: gates intact +- When `make verify` runs after this change, V1–V31 pass unrenamed and SUMMARY stays frozen at 39. diff --git a/openspec/changes/2026-10-29-bump-075/tasks.md b/openspec/changes/2026-10-29-bump-075/tasks.md new file mode 100644 index 0000000..fb231b3 --- /dev/null +++ b/openspec/changes/2026-10-29-bump-075/tasks.md @@ -0,0 +1,16 @@ +# Tasks: 2026-10-29-bump-075 + +- [x] T0 — Spec gate (this change). Testable: `ls openspec/changes/2026-10-29-bump-075/{proposal.md,design.md,tasks.md,specs/bump/spec.md}` exit 0. + Acceptance command: `ls openspec/changes/2026-10-29-bump-075/proposal.md openspec/changes/2026-10-29-bump-075/design.md openspec/changes/2026-10-29-bump-075/tasks.md openspec/changes/2026-10-29-bump-075/specs/bump/spec.md` + +- [x] M1 — Bump + ledger (agency-programmer, worktree `.lane/trees/bump-075`). + Do: `npm install -g @openrig/cli@0.7.5`; ledger `docs/sprints/CLI-0.7.5-BUMP.md` (version, two-fetch tarball SHA, 8 true-pin files, tarball-diff disposition, verify output); update true 0.7.4 version pins only (AGENTS.md surgical, diff-stat ≤15 lines); regen only if generator inputs changed (they did not — no regen). + Testable: `rig --version` → `0.7.5`; ledger contains version + tarball SHA + green verify output. + Acceptance command: `rig --version && ./scripts/verify-rigs.sh --check-only` + +- [x] T2 — Red-proofs (agency-qa, same worktree, evidence in the implementation report). + Do: prove ledger claims (version string, SHA presence); sabotage the V18 expected-version pin back to `0.7.4` and prove the gate trips RED (38/1); restore `0.7.5` and prove GREEN (39/0). + Evidence: `docs/reports/bump-075-implementation.md` (red-proof § with commands + outputs). + Acceptance command: `./scripts/verify-rigs.sh --check-only && python3 scripts/audit_loop.py --self-test` + +- [x] T3 — Drift-guard (VERDICT from disk) → PR (Refs only; no Closes). diff --git a/scripts/verify-rigs.sh b/scripts/verify-rigs.sh index f12be54..4b45a30 100755 --- a/scripts/verify-rigs.sh +++ b/scripts/verify-rigs.sh @@ -1838,8 +1838,8 @@ if _v13_offline: # --- #100: Dockerfile install lists match catalog/fleet pins (drift fails closed) --- _dockerfile13 = (root / "docker/Dockerfile").read_text() -if "ARG OPENRIG_VERSION=0.7.4" not in _dockerfile13: - fail("V13/#100: docker/Dockerfile must set ARG OPENRIG_VERSION=0.7.4") +if "ARG OPENRIG_VERSION=0.7.5" not in _dockerfile13: + fail("V13/#100: docker/Dockerfile must set ARG OPENRIG_VERSION=0.7.5") _expected_npm13 = {} for _n13, _s13 in mcp_catalog.items(): _pm13 = re.fullmatch(r"npm:(\S+)@(\S+)", str(_s13.get("pin", ""))) @@ -2395,7 +2395,7 @@ if _v18_rig is None: ) else: # Fail closed: the ok() below claims validation ran on installed - # 0.7.4 — verify the host binary actually is 0.7.4 before claiming it. + # 0.7.5 — verify the host binary actually is 0.7.5 before claiming it. try: _ver18 = subprocess.run( [_v18_rig, "--version"], @@ -2408,9 +2408,9 @@ else: _verout18 = "" _verrc18 = 1 _verm18 = re.search(r"\d+\.\d+\.\d+", _verout18) - if _verrc18 != 0 or _verm18 is None or _verm18.group(0) != "0.7.4": + if _verrc18 != 0 or _verm18 is None or _verm18.group(0) != "0.7.5": fail( - f"V18/#98: host rig --version is not 0.7.4 (got {(_verout18[:80] or 'unreadable')}); validation claim requires installed 0.7.4" + f"V18/#98: host rig --version is not 0.7.5 (got {(_verout18[:80] or 'unreadable')}); validation claim requires installed 0.7.5" ) # #98: the five vendored upstream schemas must equal the installed # CLI's own copies byte-for-byte. @@ -2493,7 +2493,7 @@ if len(failures) == _v18_before: ) else: ok( - f"Upstream contracts (#98) green: local schemas pinned + non-vacuous (tests/test_schema_contracts.py {_v18_ran} tests pass), rig bundle check + spec validate clean on installed 0.7.4" + f"Upstream contracts (#98) green: local schemas pinned + non-vacuous (tests/test_schema_contracts.py {_v18_ran} tests pass), rig bundle check + spec validate clean on installed 0.7.5" ) print("\n== V19. Canonical Stale-Count Guard (#102) ==")