chore: sync generated artifacts after Wave 1 (COMMANDS.md, embedded hooks, skill counts, cobra registration)

Orchestrator post-wave step. Mechanical updates triggered by Wave 1
landings (soc-irg1.1 through .3):

- cli/cmd/ao/cobra_commands_test.go: add 'scope' and 'skills' to both
  expectedCmds lists (TestCobraCommandTreeRegistration +
  TestCobraExpectedCmdsMatchRegistration), so the cobra registration
  conformance test passes with the new ao subcommands.
- cli/docs/COMMANDS.md: regenerated by scripts/generate-cli-reference.sh
  to include ao scope and ao skills subcommands.
- cli/embedded/hooks/{hooks.json,edit-scope-guard.sh}: re-synced via
  cd cli && make sync-hooks (per CLAUDE.md sync-hooks rule). Wave 2 (I5)
  pre-mortem amendment will re-verify embedded copies after the mass
  refactor.
- skills/SKILL-TIERS.md: add /scope row under Primitives table.
- docs/SKILLS.md, docs/ARCHITECTURE.md, PRODUCT.md: skill counts synced
  by scripts/sync-skill-counts.sh from 69 → 70 (and user-facing 60 → 61).

All Wave 1 issues now closeable. Codex parity audit passes. Full
go test ./... green.
This commit is contained in:
Boden Fuller
2026-05-01 20:47:41 -04:00
parent 8a6ea09605
commit 41b31d087e
8 changed files with 194 additions and 11 deletions
+4 -4
View File
@@ -27,7 +27,7 @@ The April 2026 Claude Code source analysis confirmed that Anthropic's internal t
| Anthropic Concept | AgentOps Equivalent | Status |
|---|---|---|
| **Learning Loop** — memory extraction, dream cycle consolidation, future session injection | Knowledge Flywheel — `/retro``/forge``/harvest``ao inject`, tiered promotion (learning → pattern → rule), plus private local Dream via `/dream` and `ao overnight` | Shipped. On-demand capture/promotion is live, and Dream now provides the bounded private overnight compounding lane. GitHub nightly is the public proof harness for the contracts, not the user's private runtime. |
| **Skillify** — AI watches patterns, packages them as reusable skills, compound growth | Skills system — 69 skills, `/heal-skill` audit, `/converter` cross-runtime export, SKILL-TIERS classification | Prototype built. `ao flywheel close-loop` now drafts review-only skills from repeated patterns; promotion polish is the remaining gap. |
| **Skillify** — AI watches patterns, packages them as reusable skills, compound growth | Skills system — 70 skills, `/heal-skill` audit, `/converter` cross-runtime export, SKILL-TIERS classification | Prototype built. `ao flywheel close-loop` now drafts review-only skills from repeated patterns; promotion polish is the remaining gap. |
| **Verification Agent** — adversarial AI auditing AI, VERDICT system for human review | Council architecture — `/council`, `/pre-mortem`, `/vibe`, `/post-mortem` with multi-model consensus, prediction tracking. Stage 4 behavioral validation adds holdout scenarios + satisfaction scoring in STEP 1.8. | Shipped. On-demand + always-on (STEP 1.8 fires automatically during `/validation`). |
Read the convergence table the right way: AgentOps and every harness like it gets absorbed into the model layer over time. Memory primitives, learning loops, even validation gates — frontier vendors will ship them natively. What stays yours is the corpus. AgentOps is the bridge tool that helps you build the moat *now*, with current models, before the harness layer commoditizes.
@@ -53,7 +53,7 @@ Read the convergence table the right way: AgentOps and every harness like it get
The bridge tool has three layers. Each smooths a sharp edge of current models so you can build the moat (the corpus) underneath.
### 1. Skills (69 skills across 4 runtimes)
### 1. Skills (70 skills across 4 runtimes)
**The discipline layer.**
@@ -94,7 +94,7 @@ The three load-bearing claims, expanded:
- **Compounding context** — the knowledge flywheel. Each session captures learnings scored on specificity, actionability, novelty, context, and confidence. Learnings promote to patterns; patterns become planning rules. Next session starts loaded, not cold. Escape velocity is a measurable condition: retrieval × usage > decay.
- **Hands-free reconciliation** — `/evolve` reads `GOALS.md`, picks the worst fitness gap, fixes it, validates, records the cycle. SRE error budgets meet Kubernetes control loops. `/dream` runs overnight bookkeeping; source code stays untouched.
- **Multi-runtime, multi-model** — same skills target Claude Code, Codex CLI, Cursor, and OpenCode with documented Tier S/I/E proof levels. `/converter` exports to native formats. Mixed-vendor council judges provide independent perspectives — the discipline lives in the system, not the model.
- **Zero setup, zero telemetry** — all state lives in local `.agents/` directories with no cloud dependency. 69 skills, 12 runtime hook event sections, and the flywheel can operate with no external daemon.
- **Zero setup, zero telemetry** — all state lives in local `.agents/` directories with no cloud dependency. 70 skills, 12 runtime hook event sections, and the flywheel can operate with no external daemon.
## Strategic Bet
@@ -108,7 +108,7 @@ As of 2026-04-30:
- GitHub repo: 320 stars, 34 forks, 10 open issues, last pushed 2026-04-30
- Public surface: GitHub Pages mkdocs site live at boshu2.github.io/agentops/; doctrine site live at 12factoragentops.com
- Distribution/runtime reach: 69 shared skills, 69 checked-in Codex artifacts, and 35 Codex overrides
- Distribution/runtime reach: 70 shared skills, 70 checked-in Codex artifacts, and 35 Codex overrides
**Measured operational proof:**
+2 -2
View File
@@ -427,7 +427,7 @@ func TestCobraCommandTreeRegistration(t *testing.T) {
"index", "init", "inject", "knowledge", "lookup", "maturity",
"memory", "metrics", "migrate", "mind", "mine", "notebook", "overnight", "plans",
"pool", "quick-start", "ratchet", "retrieval-bench", "rpi",
"scenario", "schedule", "search", "seed", "session", "session-outcome", "sessions", "status",
"scenario", "schedule", "scope", "search", "seed", "session", "session-outcome", "sessions", "skills", "status",
"store", "task-feedback", "task-status", "task-sync", "temper",
"trace", "version", "vibe-check", "watch", "worktree",
}
@@ -487,7 +487,7 @@ func TestCobraExpectedCmdsMatchRegistration(t *testing.T) {
"index", "init", "inject", "knowledge", "lookup", "maturity",
"memory", "metrics", "migrate", "mind", "mine", "notebook", "overnight", "plans",
"pool", "quick-start", "ratchet", "retrieval-bench", "rpi",
"scenario", "schedule", "search", "seed", "session", "session-outcome", "sessions", "status",
"scenario", "schedule", "scope", "search", "seed", "session", "session-outcome", "sessions", "skills", "status",
"store", "task-feedback", "task-status", "task-sync", "temper",
"trace", "version", "vibe-check", "watch", "worktree",
}
+82 -1
View File
@@ -50,6 +50,7 @@ ao init [flags]
--hooks Also register hooks (full 12-event coverage by default; equivalent to ao hooks install --full)
--minimal-hooks With --hooks, install SessionStart + SessionEnd + Stop hooks (lightweight)
--stealth Use .git/info/exclude instead of .gitignore
--with-schedule Copy .agents/schedule.yaml.example to .agents/schedule.yaml (opt-in continuous-worker scheduling). In a TTY, ao init prompts [Y/n] when this flag is unset. In non-TTY runs, scheduling is silently skipped unless AGENTOPS_INIT_WITH_SCHEDULE=1 is set to opt-in.
```
---
@@ -1066,7 +1067,7 @@ ao daemon soak [flags]
-h, --help help for soak
--interval duration Polling interval for scenario checks (default 15s)
--require-terminal Fail unless scenario jobs reach terminal daemon state
--scenario string Soak scenario (queue-only, fake-executor, dream) (default "queue-only")
--scenario string Soak scenario (queue-only, fake-executor, dream, plans-projection) (default "queue-only")
```
#### `ao daemon status`
@@ -2404,6 +2405,13 @@ Sync pulls plan metadata from beads to prevent drift.
ao plans sync [flags]
```
**Flags:**
```
-h, --help help for sync
--via-daemon Route plans sync through the agentopsd plans.projection job-type. Default false in this release; flipped to true in a later release after the soak window. With --via-daemon=false the command takes the legacy direct path (file-locked).
```
#### `ao plans update`
Update a plan's status or metadata
@@ -3328,3 +3336,76 @@ ao schedule run <name> [flags]
---
### `ao scope`
Declare which directories are in scope for the current work session.
```
ao scope [command]
```
**Flags:**
```
-h, --help help for scope
--json Emit JSON output
--lock string Override scope-lock path (defaults to $AO_SCOPE_LOCK or .agents/scope.lock)
```
**Subcommands:**
#### `ao scope freeze`
Freeze one or more directories (additive)
```
ao scope freeze <dir> [<dir>...] [flags]
```
#### `ao scope status`
Show current scope-lock state
```
ao scope status [flags]
```
#### `ao scope unfreeze`
Unfreeze one (or all if no arg) directories
```
ao scope unfreeze [<dir>...] [flags]
```
---
### `ao skills`
Tooling for the skills/ source-of-truth and its skills-codex/
```
ao skills [command]
```
**Subcommands:**
#### `ao skills check`
Walk skills/ and skills-codex/, validating each skill's YAML
```
ao skills check [flags]
```
**Flags:**
```
-h, --help help for check
--json Emit machine-readable JSON
--skill string Restrict the audit to a single skill name
--strict Exit non-zero on any finding (CI mode)
```
---
+91
View File
@@ -0,0 +1,91 @@
#!/bin/bash
# Edit Scope Guard — PreToolUse hook for /scope skill (issue soc-irg1.3).
#
# Reads Claude Code tool-input JSON from stdin. If `.agents/scope.lock` declares
# one or more `frozen_dirs`, blocks edits whose target path is outside every
# frozen directory.
#
# Defensive defaults (per pre-mortem Finding 3):
# - malformed JSON → exit 0 (fail-open, log warning to stderr)
# - missing target path → exit 0 (nothing to check)
# - missing or empty lock file → exit 0 (no enforcement)
#
# Activation tested by tests/hooks/test-edit-scope-guard-fires.sh.
[ "${AGENTOPS_HOOKS_DISABLED:-}" = "1" ] && exit 0
# --- Finding 3 amendment (verbatim defensive parse) ---
HOOK_INPUT=$(cat)
if ! echo "$HOOK_INPUT" | jq -e . >/dev/null 2>&1; then
echo "edit-scope-guard: malformed JSON input, allowing edit (fail-open)" >&2
exit 0
fi
TARGET_PATH=$(echo "$HOOK_INPUT" | jq -r '.tool.params.file_path // .tool.params.command // empty')
if [ -z "$TARGET_PATH" ]; then
exit 0 # nothing to check; allow
fi
# --- end Finding 3 amendment ---
# Best-effort: if input came from a Bash tool, TARGET_PATH currently holds the
# full command line. Try to extract the first token that looks like a path
# (something with a `/` and no shell metacharacters).
case "$TARGET_PATH" in
*' '*)
BASH_PATH=$(echo "$TARGET_PATH" | tr ' ' '\n' | grep -E '^[A-Za-z0-9_./-]+/' | head -1 || true)
if [ -n "$BASH_PATH" ]; then
TARGET_PATH="$BASH_PATH"
fi
;;
esac
# Resolve repo root and lock-file path. Wave 1 hardcodes `.agents/scope.lock`;
# Wave 2 (issue I5) migrates to `lib/ao-paths.sh`.
ROOT="${AO_SCOPE_LOCK_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"
LOCK="${AO_SCOPE_LOCK:-$ROOT/.agents/scope.lock}"
# Lock missing or empty → no enforcement.
if [ ! -s "$LOCK" ]; then
exit 0
fi
# Lock present but unreadable / malformed → fail-open (do not block edits).
if ! LOCK_CONTENTS=$(cat "$LOCK" 2>/dev/null) || ! echo "$LOCK_CONTENTS" | jq -e . >/dev/null 2>&1; then
echo "edit-scope-guard: malformed lock file at $LOCK, allowing edit (fail-open)" >&2
exit 0
fi
# Empty frozen_dirs → no enforcement.
FROZEN_COUNT=$(echo "$LOCK_CONTENTS" | jq -r '.frozen_dirs // [] | length')
if [ "$FROZEN_COUNT" = "0" ]; then
exit 0
fi
# Normalize target path to repo-relative for prefix comparison.
case "$TARGET_PATH" in
/*)
REL_PATH="${TARGET_PATH#"$ROOT/"}"
;;
*)
REL_PATH="$TARGET_PATH"
;;
esac
FROZEN_DIRS_TXT=$(echo "$LOCK_CONTENTS" | jq -r '.frozen_dirs[]')
while IFS= read -r dir; do
[ -z "$dir" ] && continue
# Strip trailing slash so we can match both "foo" and "foo/bar".
norm="${dir%/}"
case "$REL_PATH" in
"$norm"|"$norm"/*)
exit 0
;;
esac
done <<EOF
$FROZEN_DIRS_TXT
EOF
# No frozen dir matched — block.
JOINED=$(echo "$FROZEN_DIRS_TXT" | tr '\n' ',' | sed 's/,$//')
echo "edit-scope-guard: $REL_PATH outside frozen scope [$JOINED]" >&2
exit 2
+10
View File
@@ -225,6 +225,16 @@
"timeout": 5
}
]
},
{
"matcher": "Edit|Write|Bash",
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/edit-scope-guard.sh",
"timeout": 5
}
]
}
],
"PostToolUse": [
+1 -1
View File
@@ -337,7 +337,7 @@ All hooks can be disabled: `AGENTOPS_HOOKS_DISABLED=1` (kill switch) or per-hook
.
├── .claude-plugin/
│ └── plugin.json # Plugin manifest
├── skills/ # 69 skills (60 user-facing, 9 internal)
├── skills/ # 70 skills (61 user-facing, 9 internal)
│ ├── rpi/ # orchestration — Full RPI lifecycle orchestrator
│ ├── council/ # orchestration — Multi-model validation (core primitive)
│ ├── crank/ # orchestration — Autonomous epic execution
+2 -2
View File
@@ -1,6 +1,6 @@
# Skills Reference
Complete reference for all 69 AgentOps skills (60 user-facing + 9 internal).
Complete reference for all 70 AgentOps skills (61 user-facing + 9 internal).
Skills are the primitive layer of AgentOps. Higher-level entry points like
`/implement`, `/validation`, `/rpi`, and `/evolve` compose those primitives
@@ -471,7 +471,7 @@ Capture lessons from accepted/rejected PR outcomes.
Reinstall all AgentOps skills globally from the latest source.
```bash
/update # Reinstall all 69 skills
/update # Reinstall all 70 skills
```
---
+2 -1
View File
@@ -221,7 +221,7 @@ These are how skills chain in practice:
## Current Skill Tiers
### User-Facing Skills (60)
### User-Facing Skills (61)
**Judgment:**
@@ -260,6 +260,7 @@ These are how skills chain in practice:
| **perf** | execution | Performance profiling, benchmarking, regression detection, and optimization |
| **scaffold** | execution | Project scaffolding, component generation, and boilerplate setup |
| **scenario** | execution | Author and manage holdout scenarios for behavioral validation |
| **scope** | execution | Edit-scope guard — freeze/unfreeze directories with hard-block PreToolUse hook |
**Knowledge:**