mirror of
https://github.com/Heretek-AI/heretek-rigs.git
synced 2026-11-07 10:55:57 -10:00
feat(bump-075): implement stage requirements
This commit is contained in:
1 parent
a64b437007
commit
1427a6e192
14 files changed
+360
-24
No files matched your search
@@ -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/[email protected].4` (`rig`), Pi 1.4.0 (`pi`), `@gotgenes/[email protected]`,
|
||||
Stack: `@openrig/[email protected].5` (`rig`, tarball sha256 `22d67c2c…`), Pi 1.4.0 (`pi`), `@gotgenes/[email protected]`,
|
||||
`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/[email protected]` (tarball sha256 `22d67c2c…`), 8 true-pin files, zero generator-input changes.
|
||||
@@ -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/[email protected] ("*..*": "deny" guard)
|
||||
# Primary Model: opencode-go/muse-spark-1.3-contributor:high (OpenCode Go)
|
||||
|
||||
@@ -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/[email protected].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/<domain>/<role-slug>/` + `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/[email protected]`) 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/[email protected]` enforces least-privilege tool rules with mandatory `"*..*": "deny"` path traversal protection, command-backed `"!cat"` secrets in `0600` `auth.json`/`mcp.json`, per-seat `<agentDir>/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/[email protected].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/<domain>/<role-slug>/` + `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/[email protected]`) 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/[email protected]` enforces least-privilege tool rules with mandatory `"*..*": "deny"` path traversal protection, command-backed `"!cat"` secrets in `0600` `auth.json`/`mcp.json`, per-seat `<agentDir>/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/[email protected].4`, `pi --version` from `@earendil-works/[email protected]`). 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/[email protected].5`, `pi --version` from `@earendil-works/[email protected]`). 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 (`[email protected]`) 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 `[email protected]` can mutate arbitrary files bypassing `path_write`!
|
||||
- **Shared `<cwd>/AGENTS.md` `guidance_merge` Collision**: `PiRuntimeAdapter` (`pi-runtime-adapter.ts:360`) keys `guidance_merge` blocks in `<cwd>/AGENTS.md` by `entry.path` (`guidance/role.md`), causing seats sharing `<cwd>` 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/[email protected].4` (`rig spec validate`, `rig bundle check`, `rig agent validate`, `rig spec preflight`, `rig up`), `@earendil-works/[email protected]`, `@gotgenes/[email protected]`, `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/[email protected].5` (`rig spec validate`, `rig bundle check`, `rig agent validate`, `rig spec preflight`, `rig up`), `@earendil-works/[email protected]`, `@gotgenes/[email protected]`, `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 <rig.yaml> --json` and `rig bundle check <rig-dir> --json` across all 8 `rigs/<rig-slug>/` 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/[email protected].4 offline validation across all 8 rigs
|
||||
# 2. Real @openrig/[email protected].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
|
||||
|
||||
@@ -6,7 +6,7 @@ catalog and enforced at runtime by Pi's permission system.
|
||||
|
||||
| Stack | Pin |
|
||||
|---|---|
|
||||
| Orchestration | `@openrig/[email protected].4` (binary `rig`) |
|
||||
| Orchestration | `@openrig/[email protected].5` (binary `rig`) |
|
||||
| Agent runtime | `@earendil-works/[email protected]` (binary `pi`) |
|
||||
| Permission enforcement | `@gotgenes/[email protected]` (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/[email protected].4 @earendil-works/[email protected]
|
||||
# 0. Prerequisites: rig 0.7.5, pi 1.4.0, Python 3.10+ (pyyaml, jsonschema), tmux 3.2+
|
||||
npm install -g @openrig/[email protected].5 @earendil-works/[email protected]
|
||||
|
||||
# 1. Secrets (0700 dir, 0600 files; strict mode refuses anything else)
|
||||
mkdir -p -m 700 ~/.config/heretek-rigs/secrets
|
||||
|
||||
+1
-1
@@ -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 ---
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Heretek-Rigs Technical & Architecture Documentation
|
||||
|
||||
**Repository**: `Heretek-AI/heretek-rigs`
|
||||
**Target Orchestration Framework**: OpenRig v0.7.4 (`@openrig/[email protected].4`, commit `6d9e8e27`, CLI binary `rig`)
|
||||
**Target Orchestration Framework**: OpenRig v0.7.5 (`@openrig/[email protected].5`, commit `b57c4da3`, CLI binary `rig`)
|
||||
**Primary Agent Runtime Harness**: Pi Coding Agent v1.4.0 (`@earendil-works/[email protected]`, CLI binary `pi`)
|
||||
**Runtime Permission Enforcement**: `@gotgenes/[email protected]` (fail-closed policy engine with mandatory `"*..*": "deny"` traversal guard)
|
||||
**Optional Builder AST/LSP Extensions**: `[email protected]` and `[email protected]` (enabled on 21 builder and code-analysis seats)
|
||||
|
||||
+6
-6
@@ -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/[email protected]`**, 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/[email protected]`**, 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/[email protected].4` (`better-sqlite3` ABI) and `@earendil-works/[email protected]`. (Node 20 is unsupported.) |
|
||||
| **Node.js & npm** | Node.js `22.x` or `24.x` (`>=22.19.0`) | Required by `@openrig/[email protected].5` (`better-sqlite3` ABI) and `@earendil-works/[email protected]`. (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/[email protected].4`) and Pi Coding Agent (`@earendil-works/[email protected]`) globally:
|
||||
Install the exact pinned versions of the OpenRig CLI (`@openrig/[email protected].5`) and Pi Coding Agent (`@earendil-works/[email protected]`) globally:
|
||||
|
||||
```bash
|
||||
npm install -g @openrig/[email protected].4 @earendil-works/[email protected]
|
||||
rig --version # Expect: 0.7.4 (6d9e8e27)
|
||||
npm install -g @openrig/[email protected].5 @earendil-works/[email protected]
|
||||
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-<commit>` / `:sha-<commit>-full` | Pinned releases (provenance + SBOM attestations) | — |
|
||||
|
||||
|
||||
@@ -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).
|
||||
@@ -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/[email protected]` 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 <id> --on external:<what> --wake-after <duration> --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/[email protected]`; `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:[email protected]`) — 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 <name>` (#80); operator `rig send` semantics (#9/#81); `rig send` 60s-wait behavior note.
|
||||
|
||||
## 6. Rollback
|
||||
|
||||
1. `rig daemon stop`, `npm i -g @openrig/[email protected]`.
|
||||
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).
|
||||
@@ -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/[email protected]`: `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/[email protected]`:
|
||||
`rig --version` → `0.7.5 (b57c4da3)` (global install,
|
||||
`~/.npm-global/bin/rig`).
|
||||
|
||||
## Change shape (minimal)
|
||||
|
||||
1. `npm install -g @openrig/[email protected]` 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:<what> --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.
|
||||
@@ -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/[email protected]` (`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/[email protected]` (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`).
|
||||
@@ -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/[email protected]` (`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.
|
||||
@@ -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/[email protected]`; 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).
|
||||
@@ -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) ==")
|
||||
|
||||
Reference in new issue
Block a user