Commit Graph

243 Commits

Author SHA1 Message Date
Bo 6d5d111faf feat(skills): land four-vendor skill corpus (#803)
## Summary
- Lands the AgentOps skill corpus across source and Codex wrappers,
including Gemini image targets.
- Integrates the skill branch onto current origin/main and refreshes
generated manifests/catalogs.
- Normalizes local next-work queue enum drift and fixes shellcheck in
alias-collision validation.

## Validation
- bash scripts/regen-all.sh --check
- bash scripts/validate-skill-schema.sh
- bash tests/skills/test-token-budgets.sh
- bash tests/skills/run-all.sh
- bash scripts/audit-codex-parity.sh && bash
scripts/validate-codex-override-coverage.sh && bash
scripts/validate-codex-generated-artifacts.sh --scope worktree && bash
scripts/validate-codex-api-conformance.sh && bash
scripts/validate-codex-runtime-sections.sh && bash
scripts/lint-codex-native.sh
- bash skills/heal-skill/scripts/heal.sh --strict
- PRE_PUSH_SKIP_MKDOCS=1 bash scripts/pre-push-gate.sh --fast

MkDocs strict remains skipped locally via the documented
PRE_PUSH_SKIP_MKDOCS=1 override because the repo currently emits
repo-wide strict-link warnings unrelated to this landing; CI remains
authoritative.
2026-06-06 23:44:42 -04:00
Bo bdd62816ea docs(skills): add trigger markers to judgment-tier skills (ag-okfu #judgment-wave) (#767)
## What

Wave 1 of **ag-okfu** — adds an explicit `Use when:` discovery trigger
clause to the 8 **judgment-tier** skills: `council`, `design`,
`post-mortem`, `pre-mortem`, `red-team`, `review`, `validate`, `vibe`.

`scan_descriptions.py` flagged 73/81 skills with no trigger marker — a
silent skill-selection risk since runtime discovery is pure LLM
reasoning over the `description` field. The judgment tier ships first
because mis-selection there (e.g. grabbing `review` when you needed
`validate`) is the most costly.

## Why this slice

The bead says *"wave by metadata.tier."* This is one coherent wave = one
PR with a single rollback semantic. Remaining tiers (execution 22,
knowledge 8, meta 8, session 6, background 5, product 5, contribute 4,
cross-vendor 3, library 3, orchestration 1) ship as follow-on waves.

## Evidence

- Corpus missing-trigger count: **73 → 65** (the 8 judgment skills now
pass).
- `python3 skills/skill-builder/scripts/scan_descriptions.py skills
--strict` — all 8 judgment skills report `has_trigger=True`.
- `bash scripts/generate-registry.sh --check` → `OK: registry.json is up
to date` (regenerated, descriptions embedded).
- `markdownlint` clean on all 8 changed SKILL.md files.

## Notes

- Does **not** close ag-okfu — the `--strict` gate stays red until all
tiers are done. Advances the bead; unblocks nothing yet (ag-cx7d ratchet
waits on full corpus clean).

Bounded-context: BC1-Corpus
Evidence: skill-domain-map golden gate
2026-06-06 11:33:18 -04:00
Bo ca172387f9 docs(contracts): single declared gate-runner discipline (ag-8rns #gate-runner-contract) (#755)
## What

Encode the **"run the full declared gate, never a remembered subset"**
rule into the two loop-execution contracts, so autonomous consumers
(`/evolve` Step 5, `/rpi` validation) stop reconstructing the validation
bundle from memory.

- **`docs/contracts/autodev-program.md`** — new **Gate Runner
Discipline** section + a `Validation Commands` note. The bundle is run
via a single canonical runner (a repo gate script, or per gate the typed
BC2 `GateRunnerPort` surfaced as `ao gate run <name>`), in full,
**fail-closed**; a slice is "validated" only once the full declared gate
ran and passed.
- **`docs/contracts/repo-execution-profile.md`** — `validation_commands`
runs as a unit via the canonical runner; lane-narrowing is **declared**
(`validation_lanes`), never recalled; fail-closed; cross-link to the
autodev contract.

## Why

Origin (in the bead notes): 2026-06-04 a `/evolve` cycle ran a
**subset** of its declared validation bundle (skipped `PROGRAM.md`
grounding greps), reported slices green, and an independent `/validate`
caught the red. Generic failure mode: a loop that rebuilds its gate from
prose eventually runs a subset. This is the **contract** defense; it
aligns the docs to the already-shipped `ao gate`/`GateRunnerPort`.

## Scope / non-scope

- **This PR = the docs-contract (substrate) half of ag-8rns.**
Verified-cold surface (no active worktree touches these two files).
- **Deferred:** the `skills/evolve` Step-5 wiring is a **hot** surface
(live `ag-llni` delete-evolve-CLI + `ag-ro1i` evolve-backport branches)
— left to those branches to avoid collision. **Bead stays OPEN.**

## Validation

- Diff is docs-only (+21/-2). markdownlint clean; `mkdocs strict build`,
`doc-release gate`, `executable-spec link integrity`, `context map
drift` all **ok** locally.
- Local omnibus `pre-push-gate.sh` reported pre-existing substrate reds
(contract-canaries eval/bats, `context-packet-ab-wave0` off=fail
[known-expected A/B state], baseline-audit policy mismatch). **Verified
pre-existing:** pristine `origin/main` passes
`tests/scripts/pre-push-gate.bats` 56/56 (exit 0); none are reachable
from a `docs/contracts/*.md` change.

Closes-scenario: ag-8rns#gate-runner-contract
Bounded-context: BC3-Loop
Evidence: docs/contracts/autodev-program.md
2026-06-06 10:17:03 -04:00
Bo 57ec8f3290 docs(memory): remove legacy bd-memory guidance
Implements ag-i788 W4.3. Cross-model ACKs recorded in Agent Mail: RubyMoose #214 and WindyCastle #213. Required checks green; merge proceeds under the recorded Cursor Bugbot non-required instability exception.
2026-06-05 04:06:57 -04:00
Bo f735779124 docs(memory): re-source lesson recall contract
Resolve ag-qa01 by re-sourcing lesson recall contracts to markdown-as-source while preserving legacy bd memory lineage during W4 transition.\n\nQuorum: WindyCastle ACK #202 and RubyMoose ACK #203 at 6b47d8c5. Required checks green; Cursor Bugbot pending handled under recorded non-required Bugbot exception.
2026-06-05 03:20:32 -04:00
Bo 419bda7532 feat(memory): classify bd remember notes (ag-u1zi) (#745)
## Summary

Implements ag-u1zi W4.1: a deterministic classifier for migrating `bd
remember` notes into the memory architecture without promoting
bead-local operational chatter into pull-learning memory.

Changes:
- adds `scripts/classify-bd-remember.py` with JSON/markdown output,
`--input`, `--expected-count`, and `--generated-at` options
- adds fixture and Bats coverage for classification coverage, lineage
preservation, markdown manifest, and expected-count mismatch
- adds `docs/contracts/bd-remember-migration-manifest.md` plus
documentation-index entry

Classification policy:
- `bead`: bead-linked, session-local, one-off, or tracker-operational
notes
- `pull-learning`: reusable project learning candidates, emitted as
`reach=pull`, `maturity=provisional`, `source=migrated-bd-remember`
- `discard`: empty/stale/deprecated/obsolete notes

Dolt/bd caveat: `bd update ag-u1zi --claim` and `bd ready` are failing
via the known Dolt/MySQL write/read path (`context canceled` / invalid
connection), so claim/provenance is recorded in Agent Mail rather than
bd state.

## Validation

Focused:
- `bats tests/scripts/bd-remember-classifier.bats` PASS
- `python3 -m py_compile scripts/classify-bd-remember.py` PASS
- `bash scripts/check-contracts-structural-floor.sh` PASS after indexing
the new contract doc
- `git diff --check` PASS

Required push path:
- `bash scripts/regen-all.sh` ran; failed only known CMDAO surface
parity red, timestamp-only `registry.json` drift reverted
- `PRE_PUSH_FAIL_FAST=false bash scripts/pre-push-gate.sh` completed
with the known red set: 4 failures (`test-fixture parity`,
canonical-root worktree disposition, corpus freshness, contract canary
pre-push-governance); no observed diff-caused failure

## Review Request

Requesting cross-model ACK before merge. Do not merge unless PR checks
reach CLEAN and quorum is satisfied.

Closes-scenario: ag-u1zi
Bounded-context: BC1-Corpus
Validation-evidence: classifier script + Bats coverage; see Validation
section above.
2026-06-05 02:24:15 -04:00
Bo 015bb52286 ci(ci): wire scan_descriptions --probe as I0-informational receipt lane (ag-iyu4 #probe-i0) (#738)
Wires `scripts/skill-probe-i0.sh` — the deterministic lexical trigger
ranker (`scan_descriptions.py --probe`, ag-7led) — as an
**I0-INFORMATIONAL** step inside the `skill-eval` job.

## What it does
- Runs the probe over every `trigger_probes:` phrase in the corpus,
writes a per-skill JSON receipt to `.agents/ao/skill-eval/<id>.json`,
and uploads it as the `skill-retrieval-probe-receipts` workflow
artifact.
- Asserts byte-stable **determinism** across two runs; a
non-deterministic probe is surfaced as a `::warning::` only.
- **Not a PR check:** `continue-on-error: true` lives INSIDE the
existing `skill-eval` job, so no new GitHub check is created and the
step can never block (or even advisory-fail) a merge. I0 =
informational.
- No-ops cleanly (exit 0, no receipts) until a skill opts in with
`trigger_probes:`.

## Acceptance
- Probe emits the JSON-receipt artifact AND no new PR check appears
(verify absent from `gh pr checks`).
- A deliberately non-deterministic probe input is caught by the
determinism assertion before it could become a gate —
`tests/scripts/skill-probe-i0.bats` (3 specs, all green).

## 2-week stability baseline
Documented in three places (validate.yml comment,
`docs/contracts/ci-jobs.yaml` skill-eval entry,
`skills/skill-builder/SKILL.md` trigger_probes note): keep `--probe`
I0-only until the receipt lane runs green + byte-stable across the
corpus for a 2-week baseline of merges before any blocking-gate
promotion.

Closes-scenario: ag-iyu4#probe-i0
Bounded-context: BC1-Corpus
Evidence: scripts/skill-probe-i0.sh
2026-06-05 01:00:52 -04:00
Bo 2a09d29a0e ci(ci): wire skill-eval as T1 changed-files-scoped CI job + pinned ms install (ag-ktjb #skill-eval) (#731)
Wire the existing `scripts/skill-eval.sh` (#726) as a **T1 (≤5min)
changed-files-scoped** CI job in `.github/workflows/validate.yml`.

## What
- New `skill-eval` job (T1, `timeout-minutes: 5`), gated on
`skills`/`ci` path changes.
- **Setup installs PINNED `ms` v0.1.2** (`git+meta_skill@b0bb6bd541…`)
and **gates on `ms --version` + exact-0.1.2 check BEFORE running**. A
failed install or version mismatch **HARD-FAILS the job (red)** — never
green-skips. This is deliberate: the silent-skip-on-absent-ms
anti-pattern recreates the exact "no skill evaluation" gap this gate
exists to close (the same contract `skill-eval.sh` enforces internally).
- **Changed-files scoping** reuses the repo's existing `eval`-job
`skilldelta` convention (`git diff --name-only` against the PR merge
base), kept to `skills/<id>/**` so `ms` runs **only** for skills the PR
touched (`_fixtures`/`_scaffolding` excluded).
- Reports as its own check in `gh pr checks`: added to `summary.needs`,
the parity-gated `docs/contracts/ci-jobs.yaml` manifest, and the
regenerated `AGENTS-CI.md` table.

## Verification (local)
- `scripts/generate-ci-jobs-table.sh --check` → parity PASS (manifest ↔
summary.needs).
- `tests/scripts/generate-ci-jobs-table.bats`,
`test-ci-policy-parity.sh`, `test-pathfilter-gate-coverage.bats` → all
green.
- `validate.yml` parses as valid YAML; both embedded `run:` scripts are
`shellcheck -S warning` clean.
- `markdownlint AGENTS-CI.md` clean.
- `scripts/skill-eval.sh` smoke against the installed `ms 0.1.2`: bad
fixture → non-zero (names no-secrets/required-metadata), good fixture →
0.

Closes-scenario: ag-ktjb#skill-eval
Bounded-context: BC4-Validation
Evidence: docs/contracts/ci-jobs.yaml
2026-06-05 02:24:12 +00:00
Bo 7e8197ba93 ci(skills): consolidate live skill gates into one required skill-gates job (ag-87sv #skill-gates-job) (#723)
Consolidates the live skill-authoring CI gates into one named, required
`skill-gates` job (pure regroup of already-live gates — no behavior
change). Replaces the phantom `scenario-hash-stability` reference in
`CLAUDE.md` with the real `check-scenario-test-linkage` gate now grouped
under `skill-gates`. Adds the `skill-gates` row to the CI-policy-parity
manifest (`docs/contracts/ci-jobs.yaml` + `AGENTS-CI.md`) and the
`gate:skill-gates` SKU to `registry.json` (11→12 gates). New
`tests/scripts/skill-gates.bats` (12 tests) locks the job's structure,
required-check wiring, and drift-sweep behavior.

Part of epic ag-czzf.

Closes-scenario: ag-87sv#skill-gates-job
Bounded-context: BC2-Validation
Evidence: .github/workflows/validate.yml

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
2026-06-04 16:16:04 -04:00
Bo b10316af38 fix(docs): heal mkdocs strict deploy red — absolutize 14 cross-tree links (ag-xhf6 #mkdocs-blob-links) (#714)
## Problem

The **Deploy Docs (MkDocs Material)** workflow (`docs.yml` → `mkdocs
build --strict`) has failed on the last 3 `main` commits (`78fc0e64`,
`72219bed`, `e74d8899`) — a persistent main-red docs-site deploy,
**pre-existing** (predates the most recent merge).

Root cause: 14 links in 5 docs files use `../../` to reach source files
**above** the `docs/` tree (`skills/`, `schemas/`, `scripts/`, `tests/`,
`CLAUDE.md`). MkDocs can't resolve targets outside the site → strict
mode aborts. On the published site those links 404 anyway.

## Fix

Convert each to `https://github.com/boshu2/agentops/blob/main/<path>` —
the repo's established source-link convention (already used in
`SCHEMAS.md`, `sovereignty-proof/`). All 11 unique targets verified to
exist; single-`../` docs-internal links untouched (pure `](../../` →
blob substitution).

Files:
`docs/contracts/{agent-native-mechanism,orchestration-backend,orchestration-result,outcomes-rubric-projection}.md`,
`docs/convergence/google-sre.md`.

## Verification

- `mkdocs build --strict` (`scripts/docs-build.sh --check`) → **exit
0**, 0 unresolved-link warnings (was aborting on these 14)
- `markdownlint` → 0 errors (5 files)
- Diff is pure URL substitution (13/13), scope-checked against
`origin/main`

Closes-scenario: ag-xhf6#mkdocs-blob-links
Bounded-context: BC1-Corpus
Evidence: docs/convergence/google-sre.md
2026-06-03 23:08:05 -04:00
Bo e74d8899fd feat(ci): gate live-hooks reintroduction in docs/ (ag-rryf #doc-hooks-drift-gate) (#713)
## What

Adds `scripts/check-doc-hooks-drift.sh` — a CI regression guard that
fails when a **live-facing** doc reintroduces a live hooks runtime after
the 3.0 hookless teardown:

- `hooks/hooks.json` (retired manifest), a `hooks/<name>.sh` runtime
path,
- `ao hooks` (not a registered command — verified absent from
`cli/cmd/ao/`),
- a bare `session-{start,end,autostart}*.sh` hook-file ref

…unless the **same line** hedges it as hookless / opt-in / historical /
removed / a git-hook. Companion to `sync-skill-counts.sh` (skill-count
drift) and `check-hookless-cold-start.sh` (fixed-list cold-start gate).

## Scope (and why the exclusions)

`docs/` **minus** surfaces that legitimately/archivally name hooks:
- **archival history** — `CHANGELOG.md`, `releases/`, `learnings/`,
`plans/`, `adr/`, `convergence/`, `sovereignty-proof/` (document the
past / the removal itself)
- **opt-in subsystem** — `contracts/` (hooks-authoring opt-in specs),
`runbooks/` (diagnostic enumeration), `code-map/` (point-in-time audits)

The gate keeps the onboarding / operator / architecture narrative
hookless.

## Also: finishes the ag-t1ca residue the gate flags

The ag-t1ca de-hooking missed 8 live-facing lines (gate caught them);
each is reframed:
- stale `ao hooks` command/smoke refs → removed / `ao doctor`
(`cli-skills-map`, `UPGRADING`, `release-e2e-checklist`,
`contracts/release-readiness`)
- present-tense hooks-as-rules → CI gates (`strategic-direction`)
- hook-runtime mentions → `ao curate constrain` / opt-in framing
(`curation-pipeline`, `leverage-points`, `SCHEMAS` legacy-manifest
label, `workflows/session-lifecycle`)

## Verification

- `scripts/check-doc-hooks-drift.sh` → PASS on this branch (FAILed on
all 8 before the reframes)
- `tests/scripts/check-doc-hooks-drift.bats` → 8/8 (positive /
negative×3 / hedge×2 / exclusion / no-docs error)
- `shellcheck` clean · `markdownlint` 0 errors (9 docs) ·
`validate-cli-skills-map.sh` PASS · `generate-ci-jobs-table.sh --check`
PASS · existing `check-hookless-cold-start.sh` still green
- Wired into `validate.yml` lint/contracts (gated on docs/ci/shell
changes) + auto-run via the bats suite

Closes-scenario: ag-rryf#doc-hooks-drift-gate
Bounded-context: BC2-Validation
Evidence: scripts/check-doc-hooks-drift.sh
2026-06-03 22:38:26 -04:00
Bo 6072dceac5 docs(substrate): reconcile doctrine — skill-dispatch + drop Gas City reference (ag-88y5 #docs-skills-dispatch-reframe) (#696)
## What
Two bounded doctrine-reconciliation slices (one coherent arc):

**ag-88y5** — the out-of-session dispatch unit is the `/rpi`·`/evolve`
**skill**, not the `ao rpi`/`ao evolve` CLI. Per the 3.0
skills-are-the-runtime thesis (using-ntm #693 already frames it this
way), re-narrate the **live** doctrine surfaces so the substrate spawns
an agent that *runs the /rpi skill* over a bead:
- docs/3.0.md, docs/architecture/canonical-loop-model.md,
docs/runbooks/nightly-evolution.md
- skills/using-agentops, skills/agent-native,
skills/domain/references/factory.md

Historical surfaces (MIGRATION-3.0, ADR-0009, release notes) +
CLI-reference left as-is; the actual `ao rpi`/`ao evolve` CLI removal is
the **ag-iowf** epic (live automation callers — overnight-evolve,
release-smoke — must migrate first).

**ag-ogp5** — drop the 4 docs still asserting Gas City as THE reference
substrate → NTM+MCP+managed-agents:
- docs/ARCHITECTURE.md, docs/SCHEMAS.md,
docs/contracts/agents-write-surfaces.md,
docs/patterns/completion-notifications.md (Pattern C)

The ~37 historical/illustrative GC refs are intentionally retained (per
ag-ogp5 scope).

## Verification
regen-all --check, embedded-sync, heal --strict, registry-drift,
codex-rpi-contract, codex-artifacts --scope head — all green.

Closes-scenario: ag-88y5#docs-skills-dispatch-reframe
Bounded-context: BC4-Factory
Evidence: docs/3.0.md
2026-06-03 12:11:23 +00:00
Bo 59b2391b6d feat(skills): add AgentOps-owned using-ntm substrate-orchestration skill (ag-zaoj #using-ntm-skill) (#693)
## What

Adds an **AgentOps-owned, shippable `using-ntm` skill** — the missing
NTM leg of the `NTM + MCP + managed-agents` substrate doctrine
(**ag-zaoj**). Until now `automation-shape-routing` pointed **by name**
at the *proprietary* `ntm`/`vibing-with-ntm` skills, which AgentOps
can't ship — a dangling pointer for standalone users. This is original
content modeled on (not copied from) those.

## The seam: skills are the runtime, not the CLI

The skill teaches driving the open `ntm` CLI as the out-of-session
substrate: **NTM spawns Claude/Codex panes that run the `/rpi` and
`/evolve` *skills*** over a bead queue. It explicitly does **not** use
`ao rpi`/`ao evolve` CLI subprocesses — those terminal wrappers are
retired; the substrate dispatches the whole loop as one invocable skill.

## What lands (15 files, +~440)

- `skills/using-ntm/SKILL.md` + `skills-codex/using-ntm/SKILL.md` (twin)
— the new skill.
- `automation-shape-routing` (+ codex twin) — dangling
`ntm`/`vibing-with-ntm` pointers now route to the owned `/using-ntm`;
`ntm` stays as the CLI tool.
- Six derived surfaces regenerated: `registry.json`, skill-domain-map,
SKU catalog, codex hashes/manifest, context-map; + skill-disposition row
and skill-count bumps (80 → 81) in PRODUCT / ARCHITECTURE / SKILLS /
domain-map / BDD-Gherkin.

## E2E verification (against the real `ntm` CLI)

Per the directive (no `ao rpi`/`ao evolve`): verified every `ntm`
subcommand the skill cites exists
(`spawn/send/activity/attach/doctor/deps/kill/health`) and **fixed the
documented flag to the real `--pane=N` syntax** (it had `--pane N`).
`ntm doctor` runs (bv ✓ / bd ✓ / am ⚠). `docs/cli-surface.*` drift
excluded (pre-existing, unrelated).

## Follow-up (not in this PR)

`ao rpi`/`ao evolve` CLI are slated for retirement; `docs/3.0.md` + the
recent Gas City-prune PRs still reference `ao rpi <bead>` as the
dispatch unit and need a skills-not-CLI reconciliation pass.

## Verification

- `regen-all.sh --check` ALL GREEN · registry-drift PASS · codex parity
PASS · skill-isolation/size PASS · markdownlint 0.

Closes-scenario: ag-zaoj#using-ntm-skill
Bounded-context: BC4-Factory
Evidence: skills/using-ntm/SKILL.md

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
2026-06-03 00:19:22 +00:00
Bo b830d163c4 feat(skills): bd-first memory migration — Phase 1 audit (ag-5u50 #phase1-audit) (#691)
## Phase 1 — read-only memory-layer audit (the first arc of epic
`ag-5u50`)

First slice of the **bd-first-memory-migration** skill: a generic,
3-phase AgentOps skill that consolidates fragmented agent-memory layers
(Claude `MEMORY.md`, ao/flywheel, `.agents/*`, openclaw) onto **bd** as
the single source of truth, then GC/retires the rest. This PR ships the
**read-only audit half** — it cannot mutate anything; it produces the
Gate A manifest a human approves before any later migration.

### What's in it (beads ag-5u50.5–.9)
- **`.5` scaffold** — `SKILL.md` (trigger-matched) + references +
`scripts/`.
- **`.6` data model** — `references/DATA-MODEL.md`: type taxonomy
(fact/feedback/project/episodic/procedural), per-memory fields,
decay/utility formula, maturity ladder **wired to eviction** (the fix
for ao's 99%-provisional stall).
- **`.7` scanner** — `scripts/audit_scan.py`: read-only inventory of
every layer (counts, bytes, dup-rate, maturity), `--json`/`--human`.
- **`.8` classifier** — `scripts/classify.py`: keep/drop manifest
(authored=keep, `-pend-`/dups=drop, bloated `MEMORY.md`=drop), dry-run.
- **`.9` Gate A report** — `scripts/audit_report.py`: current-state
table + manifest summary + **reversibility plan naming every later
destructive action and its rollback**.

### Verification
- **6 hermetic L2 tests** (`tests/test_phase1_audit.py`), no `bd`/`ao`
CLI dependency — all green.
- **5 Gherkin scenarios** (`references/audit.feature`).
- Scripts are 100-col clean and `py_compile`-verified.
- **Live-validated** against a real fragmented box: the scanner
auto-found 2 bloated `MEMORY.md` indexes + the 62k-file /
99%-provisional / dup-pile signals.
- Context-map regenerated; drift gate green.

### Scope guardrails
Read-only only. No Phase-2/3 (migrate / GC / retire) code here — those
are gated behind Gate A and ship in later PRs. The destructive dogfood
on the live box stays human-gated (Gate C).

Closes-scenario: ag-5u50#phase1-audit
Bounded-context: BC1-Corpus
Evidence: skills/bd-first-memory-migration/tests/test_phase1_audit.py
2026-06-02 17:10:17 -04:00
Bo 7455382416 refactor(gc): strip Gas City coupling; adopt NTM+MCP+managed-agents (ag-124p) (#679)
## What

Operator-authorized (Bo, 2026-06-02). Strips the remaining **Gas City**
(`gastown`) coupling from AgentOps and reconciles the **split-doctrine
state** on `main` that the #672–#676 post-mortem flagged: canonical docs
(#676) said NTM+MCP+managed-agents while user-facing docs still
described Gas City as the reference substrate.

The out-of-session substrate is now uniformly **NTM** (local tmux swarm)
+ **MCP** (`ao mcp serve`, shipped) + **managed-agents** (`ao agent`).
AgentOps adopts a substrate; it owns none. Closes **ag-124p** (and
resolves **ag-h93p** — the claude.json gc-hook decouple).

## Deleted (load-bearing surfaces, per the bead's verified scope)

- `packs/agentops/` (the reference City) + root `city.toml`
- `skills/using-gc` + `skills-codex/using-gc` (+
`tests/scripts/using-gc-skill.bats`)
- `gc prime/nudge/mail/hook` wiring in `cli/hooks/claude.json` → now
hookless, matching 3.0 doctrine

## Doc sweep (the split-doctrine fix the post-mortem required)

- **README.md, docs/MIGRATION-3.0.md, docs/dependencies.md,
docs/activation-profiles.md** re-narrated to the substrate trio (the
four files the verdict named)
- AGENTS.md / CLAUDE.md substrate bullets; `dream` skill (+codex twin)
retirement pointer; `shared` / `agent-native` / `using-agentops`
cross-refs; skill-dispositions, context-map, sku-catalog, google-sre
convergence map

## Regenerated derived surfaces

Skill counts (81→80), `registry.json`, `skills/catalog.json`,
context-map, skill-domain-map, codex hashes (14) + manifest, SKILL-TIERS
— all via the generators, validated drift-free.

## Scope boundaries / follow-ups

- **`cli/internal/doctor/fix_bridges.go`** still carries a gc-bridge
detector/fixer subsystem. Out of the bead's verified scope; degrades
gracefully (stat-checks, returns empty when `gc`/`city.toml` absent);
removing it is a test-backed Go change → **follow-up bead**.
- **CLAUDE.md "Gas City bridge — REMOVED"** note kept intentionally:
it's an anti-re-coupling record, not substrate-framing.
- The local-only **bd-closeout** pre-push check (not in CI) is a
pre-existing gap on `main` (its AGENTS.md has no `bd dolt push` line) —
untouched here.
- `thesis-stability` gate FAIL, if present, is the pre-existing
README/PRODUCT/GOALS tagline drift, unrelated to this PR (my
README/PRODUCT edits are the dependency table + skill-count numbers, not
the tagline).

## Verification

`go build ./...` + `go vet` green · skill schema (80/80) + integrity
(heal --strict clean) + lint suite (0 fail) + codex parity green ·
sku-catalog & context-map drift gates green · zero broken markdown links
to deleted paths.

Closes-scenario: ag-124p#gc-coupling-strip
Bounded-context: BC5-Runtime
Evidence: docs/MIGRATION-3.0.md
2026-06-02 09:06:41 -04:00
Bo 3702761e75 feat(canon): earned-promotion team-knowledge tier (ag-bw5s #earned-promotion-gate) (#672)
## What

A team-knowledge **canon**: learnings *earned* into a shared trusted
set, not self-asserted. Adapts Doug Dan's warmind (#671) to the
post-ACFS direction — moat = knowledge earned by verification, not
self-certification.

Promotion requires **two independent, self-guarded signals**:
- **citation** — another engineer/agent USED it (proves useful)
- **verification** — another engineer/agent CHECKED it (proves true;
receipt-bearing)

An independent refutation hard-blocks. The anti-self-certification guard
is generalized to *all* promotion signals: the factory may not grade its
own homework.

## Slices (3 commits, one coherent arc)
1. **Earned-promotion gate** — `internal/canon` (identity guard,
citation + verification JSONL ledgers, gate); `ao canon
cite/verify/status/promote`.
2. **Inject trusted tier** — `collectLearnings` surfaces
`.agents/canon/learnings/` deduped + boosted 1.15× over equal-utility
local; flagged `Canon`.
3. **IdentityResolver port** — `--as` > `AGENTOPS_ACTOR` env > git. Env
tier is the seam to Agent Mail (`whois`) with **no MCP coupling** — `ao`
stays portable. Makes the cross-actor guard hold for humans AND agents.

## Deliberately dropped from #671
Resurrected `hooks/` + session-end auto-sync (hookless regression), the
"Gas City Dispatch (CRITICAL)" doctrine (contradicts
prune-the-coordination-plane), the parallel scoring/maturity engine
(duplicated inject primitives), and the "warmind" name.

## Verification
- `go build`/`vet` clean, gofmt clean
- 9,388 tests green (`cmd/ao` + `internal/canon` + `internal/search`)
- e2e: apollo self-attesting excluded; witness (distinct agent via
`AGENTOPS_ACTOR`) earns promotion; `ao inject` ranks canon first at
equal utility

## Deferred (next)
Wire `verify` → `ao verify`/council (currently operator-attested — the
load-bearing gap); tier-aware gate (heuristics earn citation, not
verification).

Closes-scenario: ag-bw5s#earned-promotion-gate
Closes-scenario: ag-bw5s#inject-trusted-tier
Closes-scenario: ag-bw5s#agent-identity-resolver
Bounded-context: BC1-Corpus
Evidence: cli/internal/canon/promote.go
2026-06-01 00:57:12 -04:00
Bo efb7fd66e9 feat(ci): repo-wide path-filter/gate-target coverage audit + gap fixes (ag-g9ex #pathfilter-audit) (#666)
## What

Repo-wide audit of every file-reading CI gate in
`.github/workflows/validate.yml` against the invariant the #634/#638
trunk-heal proved: **a gate that READS a file must be TRIGGERED by a
path-filter covering that file.** A docs-thinning commit (`bbfd278e`)
silently disabled the security redteam canary because the `contracts`
filter didn't cover `AGENTS.md`, and it surfaced only on a later
unrelated PR.

Closes **ag-g9ex** (Slice5[GOVERNANCE]). Derived from
`.agents/retro/2026-05-31-bead-crank-postmortem.md` §4(#2) + §7(#5).

## Audit

`docs/contracts/ci-pathfilter-coverage-audit.md` enumerates every gate
that reads specific files, the files it reads, the filter(s) that
trigger it, and a COVERED/GAP verdict. 13 gates audited + verified
non-findings.

## Gaps found and fixed (2)

1. **AGENTS tiered-split siblings uncovered (direct #634 class).**
`scripts/validate-agents-split.sh` validates `AGENTS.md` +
`AGENTS-{WORKFLOW,CI,CODEX,RUNTIME}.md`, but the gate triggered on
`docs/ci/shell` and the four siblings were covered by **no** consumed
filter. A sibling-only edit would skip the split gate. **Fix:** added
the siblings to the `contracts` filter + `contracts` to the gate trigger
(mirrors #638).
2. **wiring-closure not re-triggered by GOALS.md de-wire.**
`scripts/check-wiring-closure.sh` greps `GOALS.md`/`GOALS.yaml` to
confirm every `check-*.sh` is referenced, but triggered on
`go/hooks/shell/ci` — not `goals`. A GOALS.md-only de-wire would skip
it. **Fix:** added `goals` to the gate trigger.

## Governance (--admin self-merge, §7 #4)

Documented as policy in the audit doc rather than shipped as a
half-working CI gate (GitHub Actions cannot observe `--admin` from
inside a `pull_request` workflow; building a fake gate would be
over-engineering against the bead's explicit guidance). Mechanical
enforcement filed as a follow-up.

## Guard test

Extended `tests/scripts/test-pathfilter-gate-coverage.bats` (the #638
guard) with 3 new assertions: AGENTS-split targets ⊂ `contracts`, split
gate triggers on `contracts`, wiring-closure triggers on `goals`. All 10
tests pass.

## Gates run (local)
- `python3 yaml.safe_load(validate.yml)` → VALID
- `bats test-pathfilter-gate-coverage.bats` → 10/10 ok
- `scripts/check-contracts-structural-floor.sh` → PASS (46 contracts)
- `scripts/validate-ci-policy-parity.sh` → PASS (11 rows)
- `git diff origin/main --stat` → scope-only (4 files)

Closes-scenario: ag-g9ex#pathfilter-audit
Bounded-context: BC2-Validation
Evidence: docs/contracts/ci-pathfilter-coverage-audit.md
2026-05-31 16:31:59 -04:00
Bo cfaeb356a9 docs(spike): characterize Dreaming/memory writers + Anthropic export shape (ag-cj8mk #dreaming-characterization) (#643)
Spike **ag-cj8mk**: characterizes the three foreign Dreaming/memory
writers and the Anthropic Dreaming export shape, to unblock the
Dreaming→corpus converter family (ag-5vozd / ag-5lllu / ag-8lyx5 /
ag-onf37).

Deliverable: a tracked contract/decision doc (`.agents/` is gitignored
in this repo, so spikes that unblock later work persist under
`docs/contracts/`).

## What it characterizes
- **Anthropic Dreaming (Managed Agents):** `POST /v1/dreams` (`drm_...`)
async job → output **memory store**; notes read via Memory Stores REST
(`memories.list`/`retrieve`) as `{path, content (freeform markdown),
content_sha256}` + immutable `memver_...` versions. **Go/no-go verdict:
GO — stable REST pull**, not opportunistic SSE capture (`content_sha256`
is the dedup/high-water key). SSE is an optional live-progress view
only.
- **OpenClaw memory-wiki indexer (bushido):** chunk+embedding SQLite
(`main.sqlite`) over source `~/wiki`/memory markdown; cron is empty
post-retirement. Does not touch `.agents/`.
- **Local gc-dream / T3 synthesis (bushido, retired):** dream-draft
front-matter markdown + scored T3 verdict JSON. Does not touch
`.agents/`.
- **Normalized target:** `.agents/learnings/*.md` (Lesson Format) via
`ao corpus capture` — current flag surface + the `--source` delta
(ag-onf37).

## Load-bearing constraint
**Managed Agents are NOT ZDR.** Dream/session transcripts + memory
versions are retained server-side, so holdout/eval ground-truth and PII
must NEVER reach the cloud feeders. The converter + leak guard (ag-5vozd
/ ag-onf37) enforce refuse-to-persist on the `ao corpus capture` write
path; nightly CI is the backstop. The doc characterizes SHAPES only — no
holdout/eval/PII content.

## Verification
- `scripts/check-contracts-structural-floor.sh` → PASS (45 contracts)
- `git diff origin/main --stat` → scope-only (new contract + 1 index
line)

Closes-scenario: ag-cj8mk#dreaming-characterization
Bounded-context: BC1-Corpus
Evidence: docs/contracts/dreaming-writers-characterization.md
2026-05-31 12:43:46 -04:00
Bo 49562ffc0b docs(agent-native): decision doc mapping Managed Agents + Agent SDK to the hookless waist (ag-uphk9 #agent-native-mechanism) (#631)
## What

Spike output for **ag-uphk9** — a committed decision doc,
`docs/contracts/agent-native-mechanism.md`, that nails the mechanism by
which an out-of-session Claude/Codex loop stays under AgentOps
guardrails **without hooks**. Documents the **as-built** mechanism (the
`/agent-native` skill #616, `ao agent bundle` #618, `ao mcp serve`
#619/#621, `agent-output-validate.yml` #617), not design-ahead.

## Deliverables (per the bead)

- **Hook-intent → hookless mapping table** — orientation / standards /
scope-guard / commit-review / holdout-isolation, each → a skill + an
`ao` subcommand + a CI job. Two columns throughout: **Claude** (Managed
Agents / SDK / MCP-`ao`) and **Codex/NTM** (shell-`ao` / tmux / `ssh
bushido`). Confirms **zero hooks required**.
- **Managed-Agents Agent shape** (`model` / `instructions` / `tools` /
`skills`) + **self-hosted bushido sandbox** declaration reaching the
in-boundary `ao` over MCP + Dolt over tailnet (`100.109.17.108:3306`).
- **Agent SDK hooks** (PreToolUse/PostToolUse/Stop/SessionStart) scoped
strictly as the **OPTIONAL adapter** (wiring in
`skills/agent-native/references/sdk-hook-adapter.md`) + a one-paragraph
"why CI is the default gate, not these hooks".
- **Explicit non-goals**: no marketplace-hook port; eval substrate
(`~/.agents/evals/SCHEMA.md`) untouched; holdout/eval corpus excluded
from hosted bundles (Managed Agents are **not** ZDR).

## Why this is bounded + safe

One new contract doc + one index link. No CLI/skill/Go surfaces touched
→ no regen/build needed. No holdout payload, no out-of-repo contract
dependency. Unblocks the heavier (operator/ops-gated) managed-dispatch +
grader slices by fixing the mechanism first.

## Validation

- `check-contracts-structural-floor`: **PASS (44 contracts)** — the new
contract recognized + linked.
- Catalogued in `docs/documentation-index.md` (contract-catalogue gate).
- All relative links verified to resolve (`/agent-native` skill,
sdk-hook-adapter ref, sibling contracts, `agent.go`/`mcp_serve.go`,
`agent-output-validate.yml`).
- Scope: 2 files, +102 insertions, zero deletions.

Closes-scenario: ag-uphk9#agent-native-mechanism
Bounded-context: BC5-Runtime
Evidence: docs/contracts/agent-native-mechanism.md
2026-05-31 11:14:03 -04:00
Bo 0f16a574bc feat(eval): outcomes-rubric projection contract + schema (ag-hguuf #outcomes-rubric) (#624)
## What

Defines the machine-checkable contract for projecting the **locked eval
substrate** into an **Outcomes-style grading payload** (Anthropic
Managed Agents Outcomes analog) — holdout-safe by construction *and* by
schema.

The schema validates the **actual** output of `ao eval outcomes compile`
(`evalsubstrate.Rubric`), not the bead's pre-implementation prose sketch
(which imagined `suite_id`/`metric`/`decision_rule`/`split`). Per
source-of-truth precedence (executable > narrative), the shipped
projection deliberately emits *fewer* fields — a smaller cloud boundary
is a smaller leak surface. The "deliberately NOT projected" rationale is
documented in the contract.

## The load-bearing invariant

**Managed Agents are not ZDR** — a rubric crossing the cloud boundary
must never carry a ground-truth answer / holdout value / `target` /
`expected_output`. Enforced three ways:
1. **By construction** — `ProjectRubric` can't copy ground truth
(existing).
2. **By re-scan** — `Rubric.ContainsAny` guard (existing).
3. **By schema (this PR)** — `additionalProperties:false` at **every
nesting level** → a malformed compiler emission that smuggles a leak
field **fails schema validation**, not merely a code check.

## Files
- `schemas/outcomes-rubric.v1.schema.json` — the contract schema
-
`tests/fixtures/outcomes-rubric/{valid-dev,valid-holdout-criteria-only,invalid-contains-target}.json`
- `scripts/validate-outcomes-rubric.sh` — standalone validator (python
`jsonschema`, mirrors `validate-next-work.sh`); `--selftest` asserts
pass/pass/fail
- `tests/scripts/validate-outcomes-rubric.bats` — 9 acceptance tests
- `cli/internal/evalsubstrate/rubric_schema_test.go` — Go schema↔struct
drift guard (reflection)
- `docs/contracts/outcomes-rubric-projection.md` —
SCHEMA-field→Outcomes-field mapping; catalogued in doc index;
cross-linked from `eval-verdict-pipeline.md`

The contract **references** the LOCKED `~/.agents/evals/SCHEMA.md`
§rc2/§4 — it never edits it. Substrate EXTENDED, never relitigated.

## Evidence
- `scripts/validate-outcomes-rubric.sh --selftest` → PASS/PASS/FAIL
(exit 0)
- `bats tests/scripts/validate-outcomes-rubric.bats` → 9/9 ok
- `go test ./internal/evalsubstrate/` → 82 passed; `go vet` clean; `go
build ./...` success
- `check-contract-compatibility.sh` → contract catalogued + schema
reference OK
- `shellcheck scripts/validate-outcomes-rubric.sh` → clean

Closes-scenario: ag-hguuf#outcomes-rubric-projection-contract
Bounded-context: BC4-Evaluation
Evidence: schemas/outcomes-rubric.v1.schema.json
2026-05-30 07:07:36 -04:00
Bo 03d2aaa8d7 feat(skills): add /agent-native — make out-of-session agents AgentOps-native, hooklessly (ag-2wln #agent-native) (#616)
## What

First child of **ag-7s9fo** (Make Managed/SDK agents AgentOps-native).
Adds the **/agent-native** dual-runtime skill documenting the **hookless
reframe** of the retired "port the ~50 hooks" idea.

An out-of-session Claude (Managed Agent / Agent SDK loop / self-hosted
sandbox) becomes AgentOps-native via three things — **never hooks**:
1. **Bundle AgentOps skills** into the Agent definition (same `skills/`
files, no fork).
2. **Expose the `ao` CLI as a callable tool** (MCP/shell-tool) so the
loop self-bootstraps + self-validates.
3. **Gate outputs through the SAME CI** as interactive work.

Extends `standards` + `converter`. The SDK hooks become an *optional
thin adapter*, never the enforcement boundary. Managed Agents are NOT
ZDR → no holdout/PII in the agent definition.

## How

Built through the hardened scaffold (ag-cw2y → ag-ekyq → ag-j4l1) — all
6 derived surfaces regenerated in one shot (registry, domain-map,
context-map, counts, codex twin+manifest+marker, dispositions
BC5-Runtime, SKILL-TIERS, using-agentops catalog, embedded sync).
Reverted the swept-in pre-existing drift (6 codex hashes + cli-surface)
per the changed-files-scoped triage.

Caught + fixed an `INVALID_AO_CMD` heal finding: `ao standards` isn't a
command — `standards` is a loaded checklist enforced via `ao validate` +
CI (corrected the references).

## Scope note

The skill documents the *intended* `ao agent bundle` / `ao mcp serve` /
`agent-output-validate.yml` surfaces — those are the sibling child beads
(ag-jspr, ag-higd, ag-mptr). This PR is the skill-doc slice only.

## Evidence

- `heal.sh --strict skills/agent-native` → clean
- `audit-codex-parity.sh --skill agent-native` → pass
- `validate-codex-generated-artifacts.sh --scope worktree` → pass
- `generate-{registry,skill-domain-map}.sh --check` → clean;
`check-registry-drift.sh` → no drift

Closes-scenario: ag-2wln#agent-native
Bounded-context: BC5-Runtime
Evidence: skills/agent-native/SKILL.md
2026-05-29 23:28:11 -04:00
Bo 79a4558902 feat(skills): add /eval-outcomes — Outcomes as a holdout-safe projection of the locked eval substrate (ag-hdqu0.8 #eval-outcomes-skill) (#613)
## What

Adds the **/eval-outcomes** dual-runtime skill — the user-facing
documentation wrapper for the already-merged `ao eval outcomes
compile/ingest` capability (the Outcomes epic ag-hdqu0, capability beads
.1/.2/.4/.5/.6/.7/.9 all merged). This is the final ag-hdqu0 child.

eval-outcomes documents Outcomes as a **grading transport** that EXTENDS
`validation` + `ratchet` — a *projection* of the locked eval substrate
(`SCHEMA.md`), never an alternate bar. Holdout `target`/`ground_truth`
never leaves the boundary (Managed Agents are not ZDR).

## How

Built through the ag-cw2y scaffold + the 6-surface new-skill discipline
in one shot:
- `skills/eval-outcomes/SKILL.md` + `skills-codex/eval-outcomes/`
(parity_only twin + prompt.md)
- override catalog + manifest/marker (`register-new-codex-skill.sh`)
- dispositions row (BC2 Validation) + SKILL-TIERS row + using-agentops
catalog
- registry.json SKU catalog + domain-map + context-map + narrative
counts + embedded sync

Reverted pre-existing-main drift swept in by generators (6 unrelated
codex artifact hashes, cli-surface.*) per the changed-files-scoped
triage.

## Evidence

- `audit-codex-parity.sh --skill eval-outcomes` → pass
- `heal.sh --strict skills/eval-outcomes` → clean
- `validate-codex-override-coverage.sh` → 80 skills pass
- `validate-codex-generated-artifacts.sh --scope worktree` → pass
- `generate-{registry,skill-domain-map,context-map}.sh --check` → clean;
`check-registry-drift.sh` → no drift

(Local fast pre-push gate references a missing
`scripts/audit-codex-hooks.sh` — pre-existing gate-infra drift absent on
main, not this PR; CI is the authoritative gate.)

Closes-scenario: ag-hdqu0.8#eval-outcomes-skill
Bounded-context: BC2-Validation
Evidence: skills/eval-outcomes/SKILL.md
2026-05-29 21:35:17 -04:00
Bo 606ae03b84 feat(skills): add /burndown — bounded epic-completion loop (ag-3yl8 #burndown-skill) (#600)
## What
Adds **`/burndown`** — the bounded, finite-end counterpart to open-ended
`/evolve`. Drives a finite target (epic / set of epics / explicit bead
list) to *every in-scope bead merged on main* via bounded `/rpi` cycles,
then **STOPS**.

## Why (the gap it fills)
| Command | Shape |
|---|---|
| `/evolve` | open-ended compounding loop — goes dormant, never
*completes* |
| `/crank` | parallel-**wave** one-shot fan-out |
| `/autodev` | contract layer only (not a loop) |
| **`/burndown`** | **serial, resumable, finite-end drive-to-merge
loop** |

## Per-cycle (idempotent — cron / ScheduleWakeup / in-session)
reconcile one outstanding tick-PR (CI-green→merge, pending→skip,
red→fix) → completion-check (all in-scope merged → DONE/STOP) → pick ONE
in-scope ready bead → drive in a worktree → PR with trailers → loop.
Finite stops: target merged · `--max-cycles=N` · operator
STOP/`--hold-merges` · genuine blocker.

This is the generalized, named form of the cron loop we validated
landing PR #599.

## Dual-runtime + gates
- `skills/burndown/SKILL.md` (canonical) +
`skills-codex/burndown/SKILL.md` (Codex-native).
- `audit-codex-parity.sh --skill burndown` **PASS**; `heal.sh --strict`
**PASS**.
- Skill counts synced 76→77 (SKILL-TIERS, PRODUCT, docs/SKILLS,
docs/ARCHITECTURE, using-agentops catalog); `context-map.md`
regenerated; embedded skills synced; `go build ./...` success.

Closes-scenario: ag-3yl8#burndown-skill
Bounded-context: BC5-Runtime
Evidence: skills/burndown/SKILL.md
2026-05-29 21:06:19 -04:00
Bo fe731d12b9 feat(skills): skill-flow connectivity gate + closed consumes vocabulary (#597)
## Do all skills flow together?

**No — not until this PR.** Investigating the question surfaced a
structural gap: skill dependencies are declared across **three
overlapping frontmatter fields that drifted apart and were never
reconciled**, and nothing enforced connectivity or constrained the
`consumes` vocabulary.

| Field | Meaning | Read by context-map? |
|-------|---------|----------------------|
| `consumes` | upstream inputs | yes (data-flow table) |
| `context_rel` | DDD relationship | yes (mermaid) |
| `metadata.dependencies` | upstream skill slugs | **no** |

Findings (76 skills):
- **33 skills** where `consumes` (skills) ≠ `metadata.dependencies` —
the two skill-slug fields disagree.
- The generated `context-map.md` **ignored `metadata.dependencies`
entirely** (34 skills, the richest layer).
- Counting all three layers, **16 true orphans** (incl. core skills like
`push`, `session-bootstrap`) with zero skill-to-skill edges — silently.
- `consumes` was an **open free-text field**: no check that a token
resolves to anything.

`scripts/audit-skill-metadata.sh` already flagged the
`consumes`-vocabulary and connectivity checks as *"discovered
follow-ups, not enforced."* This is that follow-up.

## What this PR does

**1. Connectivity gate** — `scripts/validate-skill-flow.sh` (+
`validate-skill-flow` CI job):
- **Closed `consumes` vocabulary**: every token must resolve to a skill
slug, a whitelisted external input (`repo-context`, `external-api`,
`bd`, `github-pr`, `onboard`), or an artifact some skill produces.
Catches typos/undeclared deps.
- **`metadata.dependencies` resolution**: every entry must name a real
skill.
- **Orphan detection** across all three edge layers; un-allowlisted
orphans fail.
- Reports (non-fatal): cross-layer disagreement + dead-end artifacts, so
they can be reconciled later.

**2. Wire the genuine-gap edges** — added `context_rel` for 6
disconnected skills and regenerated `context-map.md`:
- `deps` → `vibe`, `red-team` → `vibe` (mirrors
`security`/`security-suite`)
- `provenance` ↔ `trace`
- `scenario` → `validation`
- `release` → `ship-loop`

**3. Close the vocabulary** — the closed `consumes` namespace is
enforced by the gate and documented in `docs/contracts/skill-flow.md`
(linked in `documentation-index.md`). 14 intentionally-standalone leaves
are allowlisted in `scripts/skill-flow-standalone.txt` with a rationale
per entry.

## Verification

```
$ bash scripts/validate-skill-flow.sh
validate-skill-flow: 76 skill(s), 121 skill-to-skill edge(s)
  orphans: 14 (allowlisted standalone: 14)
OK: skill flow is connected and the consumes vocabulary is closed.
```

- `validate-skill-flow.sh`: exit 0 ✅
- `validate-context-map-drift.sh`: exit 0 ✅
- `check-contracts-structural-floor.sh`: PASS (contract cataloged) ✅
- 11 acceptance tests in `tests/scripts/validate-skill-flow.bats` (bats
not installed locally; exercised via manual smoke + will run in CI
`bats-tests`).

Bounded-context: BC1-Corpus
Evidence: OK: skill flow is connected and the consumes vocabulary is
closed.

---
_Generated by [Claude
Code](https://claude.ai/code/session_01WLdHEva31cixBjxo8z9TXK)_

Co-authored-by: Claude <noreply@anthropic.com>
2026-05-29 18:26:05 -04:00
Bo e4e32a3374 feat(orchestration): dual-runtime OrchestrationPort foundation (ag-nk67 #orchestration-foundation) (#598)
## What

The **dual-runtime OrchestrationPort foundation** — the seam that gates
the
`[EPIC] AgentOps × Claude Managed Agents integration (dual-runtime)`
application epics.
Implements the 3-category model (Claude Workflow / NTM swarm / plain
skill) behind a
single `OrchestrationPort` with safe degradation **NTM → Claude-native →
beads floor**
and a global `AGENTOPS_ORCHESTRATION=off` opt-out.

Derived from a live 3-legged spike (`~/dev/agentops-3cat-spike/`): safe
degradation is
solvable at the selection layer; parallel buys quality/independence not
wall-clock at
small N; NTM is a multi-vendor control plane that runs Claude/Codex as
panes.

## What's in it (10 slices, agent-team driven)

- **Port + adapters** — `cli/internal/ports/orchestration.go` (idiomatic
to existing ports pattern) + new `cli/internal/orchestration/` pkg:
`Selector`, `ntm_probe` (capability detection via `ntm
--robot-capabilities`, not `command -v`), `beads_floor` +
`OrchestrationResult` parity type, degradation-conformance test.
- **Live CLI** — `ao orchestrate select` (`--pin`/`--opt-out`/`--json`);
COMMANDS.md regenerated.
- **Contracts** — `schemas/orchestration-{backend,result}.v1` + paired
`docs/contracts/` docs (structural-floor gated: 41 contracts).
- **Prose** — swarm/shared/crank rewritten NTM>native>beads; **gc
demoted** (soc-2rtm0); `rpi_phased_stream.go` doc-comment fixed.
- **Skills** — `automation-shape-routing` (the 3-category router) +
`workflow-builder` + meta-skill authoring chain wired (`context_rel`);
skill counts synced.
- `lib/orchestrate-select.sh` selector seam.

## Verification (local)

`go build ./...` clean · `go vet` clean · **56 Go tests pass**
(orchestration 31, ports 10, cmd/ao orchestrate 15) · structural-floor
PASS (41) · `lib/orchestrate-select.sh --self-test` 6/6 · live command:
`--json`→claude (NTM absent), `--opt-out`→beads, `--pin claude`→claude.

## Notes

- Bundles the foundation + the routing/authoring skills as one coherent
dual-runtime arc.
- NTM/Claude executors are stubs (the parity contract is real); concrete
executors land in the application epics this gates.
- Two-ladders distinction preserved (spawn-backend ladder A vs CLI
phase-executor ladder B) — see `docs/contracts/orchestration-ports.md`.

Closes-scenario: ag-nk67#orchestration-foundation
Bounded-context: BC5-Runtime
Evidence: cli/internal/orchestration/conformance_test.go
2026-05-29 18:42:45 +00:00
Bo 4107bbed1c refactor(ci): rebuild validate.yml — 67 jobs → 10 purpose-grouped (ag-877 #gate-rebuild) (#592)
## What

First-principles rebuild of `.github/workflows/validate.yml` (ag-877 /
epic ag-5ck, no strangler). Collapses the **67-job** orchestration into
**9 purpose-grouped jobs** (+ `changes` + `summary` = 12 total). All
**59** `scripts/{check,validate}-*` are preserved verbatim — the checks
are the safety logic; the 67-way job fan-out was accretion slop.

Design: `spec/teardown-2026-05-28/gate-rebuild-first-principles.md`

## How

Each purpose job runs its script family as **path-gated steps**
(per-step `if: needs.changes.outputs.X`), with advisory checks marked
`continue-on-error: true` at the **step** level (no whole-job
non-blocking). Notable structural moves:

- **correctness** = matrix `[ubuntu, windows]` — folds `windows-smoke`
in as a Windows leg (it runs `tests/windows/*.ps1`, no `scripts/`
family) instead of a standalone job.
- **doctrine-proof** = the doctrine/GOALS proofs **+ spec-linkage**
(executable-spec link, scenario↔test linkage, AGENTS split,
docs↔learning) — both prove the GOALS/spec apparatus is consistent and
share the Go+ao+Python setup (10→9).
- **summary** absorbs **AP#7** Evidence verification (was
`validate-pr-evidence-claims`) — it needs every sibling job's logs, so
it must run last, not in a parallel group.

## Acceptance (ag-877)

- **ac-gr.1 coverage-proof empty** — `comm -23` of old-vs-new
`scripts/*` invocations is empty (no script dropped). ✅
- **ac-gr.2 job count ≤12** — `grep -cE '^  [a-z][a-z0-9-]+:$'` = 12. ✅
- **ac-gr.3 self-CI green** — this PR runs the new `validate.yml`
against itself (changes `.github/**` → all paths trigger). ⏳ this run.

Coupled job-name contract projections updated in lockstep:
`docs/contracts/ci-jobs.yaml` manifest (64→9), regenerated
`AGENTS-CI.md` table + `registry.json` (gate SKUs 66→11; skills/cli/ref
untouched), and 3 structural bats tests re-anchored to the grouped jobs.
Local: `validate-ci-policy-parity`, `registry-check`,
`validate-sku-catalog-drift`, `check-wiring-closure` all PASS; full bats
suite **740 tests, 0 failures**.

## ⚠️ Operator-gated cutover (do NOT auto-merge)

Branch protection still lists the **64 old** required-check names. This
PR **cannot auto-merge** until an admin swaps them for the new ~10
(**ag-7hpl**), then verifies a no-op PR is gated by exactly the new set
(**ag-1eqi**). Both are repo-admin, repo-wide blast radius →
operator-coordinated.

Closes-scenario: ag-877#uniform-gates-consolidated
Closes-scenario: ag-877#heterogeneous-setup-ported
Closes-scenario: ag-877#changes-preserved-summary-rewired
Closes-scenario: ag-877#coverage-proof-empty-ci-green
Bounded-context: BC2-Validation
Evidence: CI_JOBS_TABLE: PASS
2026-05-29 00:16:47 -04:00
Bo de0699a493 feat(skills): operating-loop-workflow skill ships the workflow to plugin users (agentops-7m7a #plugin-deliver-operating-loop) (#595)
## What
Adds a `operating-loop-workflow` skill that delivers the
`operating-loop` Workflow-tool script to **installed plugin users** and
invokes it.

## Why
Claude Code plugins do **not** load `.claude/workflows/*.js` (recognized
components are `skills/`, `commands/`, `agents/`, `hooks/`, …). PR #594
force-added the script so it *ships in the plugin cache*, but an
installed user still wouldn't see `/operating-loop`. This skill is the
delivery vehicle.

## How
On `/operating-loop-workflow`, the skill:
1. Idempotently copies
`${CLAUDE_PLUGIN_ROOT}/.claude/workflows/operating-loop.js` →
`~/.claude/workflows/operating-loop.js` (copy-if-newer; never clobbers
user edits).
2. Invokes `Workflow({name:'operating-loop', args})` (supports
`{mode:'plan'}` for the plan-only half).

Named `operating-loop-workflow` (not `operating-loop`) to avoid
colliding with the workflow's own auto-surfaced `/operating-loop` in the
dev repo.

## Registries updated
- `skills/SKILL-TIERS.md` row + `sync-skill-counts.sh` (→ 76 total, 66
user-facing)
- `docs/contracts/skill-dispositions.yaml` + regenerated
`docs/reference/agentops-skill-domain-map.md` (76/76)
- `docs/contracts/context-map.md`,
`docs/reference/agentops-domain-evolution-bdd.md` count

## Validation
- `scripts/pre-push-gate.sh --fast` passed (registry-drift,
skill-domain-map golden gate, domain-evolution plan all green)
- `generate-skill-domain-map.sh`: 76 skills, 76 dispositions, clean

Closes-scenario: agentops-7m7a#plugin-deliver-operating-loop
Bounded-context: BC3-Loop
Evidence: docs/reference/agentops-skill-domain-map.md

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-05-29 02:30:09 +00:00
Bo 450f06f62f docs(skills): autodev reads as config not loop (soc-ozoqh #autodev-config) (#572)
## Summary

Reposition the `/autodev` skill so it reads as **config, not a loop**,
per the canonical vocabulary rule
`skills/domain/references/autodev.md:9,13` — autodev is the
config/intent layer the loop reads each tick, and its description must
never lead with "bounded autonomous dev loops".

- `skills/autodev/SKILL.md`: new `description:` leads with managing the
PROGRAM.md/AUTODEV.md contract and names autodev as the config layer
Evolve and Factory read; "Loop position" prose reframed so the drivers
run the loop, autodev does not.
- `skills-codex/autodev/SKILL.md`: codex mirror description synced.
- Regenerated derived artifacts: `skills/catalog.json`, `registry.json`,
`docs/contracts/context-map.md`, codex hash manifest/marker (autodev
only).
- No command logic changes. Scenario 2 (factory-noun de-collision)
re-sliced to `ag-0qz` (premise drifted — no `ao factory` command
exists).

## Test plan

- [x] `bats tests/scripts/autodev-skill-positioning.bats` (new gate, 6/6
— pins the description + body + derived catalogs + codex mirror to the
config-not-loop rule; written failing-first)
- [x] `scripts/validate-codex-generated-artifacts.sh --scope head`
(parity + manifest)
- [x] `scripts/validate-context-map-drift.sh`,
`scripts/check-skill-catalog-drift.sh`,
`scripts/check-registry-drift.sh`
- [x] `skills/heal-skill/scripts/heal.sh --strict` (autodev clean)

Closes-scenario: soc-ozoqh#autodev-reads-as-config-not-loop
Bounded-context: BC1-Corpus
Evidence: bats tests/scripts/autodev-skill-positioning.bats;
skills/domain/references/autodev.md:13
2026-05-28 06:34:13 -04:00
Bo 3e069b278a feat(corpus): machine-checkable schema + validator for next-work harvest (ag-yma #typed-next-work-contract) (#564)
## Summary

Makes `.agents/rpi/next-work.jsonl` — the post-mortem → /evolve harvest
queue — a machine-checkable **typed contract**. Previously the shape was
only a human-readable doc plus jq enum logic duplicated across scripts;
there was no committed JSON Schema.

- **`schemas/next-work-item.v1.schema.json`** +
**`schemas/next-work-batch.v1.schema.json`** — draft-07. Enums, required
fields, and conditional `proof_ref` rules; `additionalProperties: true`
for forward-compat (readers MUST tolerate unknown fields).
- **`scripts/validate-next-work.sh`** — reusable validator. Advisory by
default; `--strict` exits non-zero naming the offending `file:line` +
field; `--json` emits a machine-readable verdict. It **reads
enums/required lists from the schema files** so the committed schema is
the single source of truth. jq is authoritative and runs everywhere; a
`python jsonschema` structural pass runs when present (catches
type-shape gaps jq can't); `ajv` is recorded but non-gating.
- **`tests/scripts/validate-next-work.bats`** — golden valid fixture +
broken fixtures (bad type/severity, missing title, malformed
`proof_ref`, malformed JSON). Auto-run by CI's `bats
tests/scripts/*.bats`.
- Skill + contract docs (`skills/post-mortem/SKILL.md`,
`references/harvest-next-work.md`, `docs/contracts/next-work.schema.md`)
name the schema + validator canonical; the inline bash stays as a
dependency-free fallback.

**No Go change** (repo validates schemas via shell) — `go build`/`vet`
stay green.

## Scope / staging

Gate ships **advisory only** this PR. The advisory run over the live
queue found exactly **1 finite legacy violation** (line 14,
`source=evolve-scouting`, epic `soc-owed.7` — data-only, no producer
emits it). Follow-ups filed:
- `ag-blp` — backfill the legacy `evolve-scouting` row (blocks
promotion).
- `ag-taa` — promote `--strict` to a required CI gate after the backfill
lands.
- `ag-jda` — de-dup the enum source of truth onto the schema.

## Test plan

- [x] `bats tests/scripts/validate-next-work.bats` — 13/13 green
- [x] `scripts/validate-next-work.sh` advisory run vs live
`.agents/rpi/next-work.jsonl` — 1 finite legacy violation, exit 0
- [x] `--strict` structural-gap check (e.g. `consumed:"yes"`) rejected
via python jsonschema pass
- [x] `shellcheck -x scripts/validate-next-work.sh` clean
- [x] `scripts/validate-next-work-contract-parity.sh` /
`check-contracts-structural-floor.sh` /
`check-contract-compatibility.sh` / `heal.sh --strict` pass
- [x] `cd cli && go build ./... && go vet ./cmd/ao` clean; `ao autodev
validate --file PROGRAM.md` → valid

Closes-scenario: ag-yma#typed-next-work-contract
Bounded-context: BC1-Corpus
Evidence: tests/scripts/validate-next-work.bats +
scripts/validate-next-work.sh advisory run vs
.agents/rpi/next-work.jsonl
2026-05-28 01:12:14 -04:00
Bo 39f0850640 ci(validation): test-count non-regression gate for cli/internal (ag-h2z #test-count-noregress) (#562)
## Summary

Adds a blocking T1 CI gate that ratchets test coverage in
`cli/internal/` packages: once tests are added, a PR cannot delete them
without a deliberate, recorded justification. Motivated by PR #558–#561,
which added 248 tests across 6 internal packages with nothing preventing
a future PR from silently removing them.

- `scripts/check-test-count-regression.sh` — for each
`cli/internal/<pkg>` with a changed `_test.go` file between the PR base
and HEAD, sums `^func Test` declarations per package at both refs. A net
per-package decrease fails the gate **unless** a `Test-Removal-Reason:`
trailer is present in a commit body in the range. Counts are summed per
package (not per file), so moving a test between files in the same
package is net-zero. Emergency bypass:
`AGENTOPS_TEST_COUNT_NOREGRESS=skip` (logged). Fail-open when the base
ref is unresolvable (shallow clone), fail-closed only on a verifiable
decrease.
- `tests/scripts/check-test-count-regression.bats` — 8 scenarios (add /
remove-no-trailer / remove-with-trailer / rename / skip-bypass / no-op /
unresolvable-base / cross-file move) driven by throwaway git repos.
Auto-discovered by the `bats-tests` job.
- Wired as blocking `validate-test-count-noregress` (T1): job block +
`summary.needs` + `validate-pr-evidence-claims.needs` in
`.github/workflows/validate.yml`, manifest entry in
`docs/contracts/ci-jobs.yaml`, and regenerated `AGENTS-CI.md` (parity
gate green, 66 rows). `fetch-depth: 0` so the base ref resolves for the
before/after diff.

Green by construction on this PR: it changes no
`cli/internal/**/_test.go`, so the gate is a no-op PASS.

## Acceptance scenarios (from ag-h2z)

- PR adds tests to `cli/internal/X` → gate passes (count up or stable).
✅ bats #1
- PR removes a test without a trailer → gate fails, naming the test +
pkg. ✅ bats #2
- PR removes a test **with** `Test-Removal-Reason:` trailer → gate
passes. ✅ bats #3
- PR renames a test (`Test_X` → `TestX`) → net count stable → gate
passes. ✅ bats #4

## Test plan

- `bats tests/scripts/check-test-count-regression.bats` — 8/8 green
- `shellcheck scripts/check-test-count-regression.sh` — clean
- `bash scripts/validate-ci-policy-parity.sh` — PASS (66 rows)

## Follow-ups (out of scope, immutable)

- Promoting `validate-test-count-noregress` to a GitHub
branch-protection *required status* is repo-admin (immutable scope) —
not done here. The job is blocking via `summary.needs`.

Closes-scenario: ag-h2z#test-count-noregress
Bounded-context: BC2-Validation
Evidence: PASS: no cli/internal/*_test.go changes
2026-05-27 23:22:53 -04:00
Bo 8af560f678 fix(ci): reconcile hookless gates and flywheel snapshot
Squash merge PR #546. Local evidence: doc-release, smoke, snapshot gate, pre-push Bats, snapshot Bats, structural gates, and pre-push --fast passed. PR GitHub Actions were blocked in runner setup by GitHub codeload/action download failures before repository code executed. Snapshot records current corpus as DECAYING rather than preserving stale compounding evidence.
2026-05-26 08:19:50 -04:00
Bo b4c6aec361 feat(skills)!: 3.0 consolidation — merge 4, cut 2, resolve 6 keep-flags (81→75) (#533)
## AgentOps 3.0 skill consolidation — reconcile-and-tighten

Resolves all 12 skills flagged `merge-review`/`cut-review` in
`docs/contracts/skill-dispositions.yaml` per the operator-approved
dispositions. **Zero capability loss** — every merged skill's content
lives in its target as a mode/section.

### MERGE (4) — content folded into target, source removed
| Source | Target | How |
|---|---|---|
| expert-council | council | `--mode=debate` (alias triggers documented
in council) |
| oss-docs | doc | `--mode=oss` (refs + `audit-oss-docs.sh` copied into
`doc/`) |
| readme | doc | `--mode=readme` (`readme-craft.md`; `bootstrap`
consumer repointed readme→doc) |
| pr-retro | post-mortem | `--scope=pr` (`pr-scope.md` + gh PR-outcome
mining) |

### CUT (2) — genuinely redundant, no live consumer
- **pr-plan** — folds into `/plan` + `/pr-research`; pr-* chain
repointed.
- **update** — install-script concern; refresh note added to
`using-agentops` + install one-liner.

### KEEP — resolved 6 flags (rationale in `skill-dispositions.yaml`)
`validate` + `curate` (designed-future canonical validator/miner; epic
`soc-cp7pv` GO/REVERT is a separate decision) · `security` (release-gate
driver, distinct from security-suite) · `converter` (packaging adapter
skill-builder consumes) · `knowledge-activation` (outer-loop
operationalization) · `grafana-platform-dashboard` (marketplace
specialization).

### Result
**81 → 75 skills** (65 user-facing + 10 internal). Trunk regenerated
once: skill-counts, skill-catalog, skill-domain-map, context-map,
registry, sku-catalog, codex hashes, embedded-sync. Evals repointed to
absorbed locations.

### Gates verified locally (all green)
lint-skills · heal.sh --strict · skill-schema · skill-frontmatter ·
skill-dependency-check · scenario-test-linkage ·
validate-context-map-drift · check-registry-drift · generate-registry
--check · skill-domain-map golden · validate-sku-catalog-drift ·
bounded-contexts-drift · ci-policy-parity · codex
parity/override-coverage/manifest/generated-artifacts/skill-parity/runtime-sections/backbone/lifecycle
· regen-codex-hashes --check · embedded-sync · validate-skill-count ·
markdownlint · shellcheck (--severity=error) · `cd cli && go build && go
vet && go test ./cmd/ao` (9126 passed).

Closes-scenario: ag-cons#consolidation
Bounded-context: BC1-Corpus
Evidence: .agents/discovery/2026-05-24-skill-consolidation-plan.md
2026-05-24 23:17:27 -04:00
Bo c88d0f0d88 feat(ci): skill-body command-ref gate — block stale ao refs in prose (ag-4x8) (#532)
## What

New CI gate `validate-skill-body-refs` (T1) that scans the **inline-code
prose** of every `SKILL.md` + `references/*.md` (under `skills/` and
`skills-codex/`) for `` `ao <command>` `` / `` `ao <command> --flag` ``
tokens and validates each against the **live `ao` help tree**.

This is the systemic fix for oracle gap #3:
`validate-skill-cli-snippets.sh` only inspects fenced/`ao`-leading
snippets, so a stale command/flag named inside an inline code span
mid-sentence (e.g. `` `ao schedule` `` , `` `ao context assemble` ``)
regenerated after every CLI rename. This gate is the **complement** of
the snippet gate — together they cover both fenced snippets and prose.

## How the gate works

- Builds a robust live command tree: `ao capabilities` (authoritative
top-level) + recursive grouped-help subcommand parse (handles `ao
goals`' category-grouped help that the standard "Available Commands:"
parser misses) + command aliases (`quickstart` → `quick-start`) +
per-command flags.
- Only validates `ao` refs inside inline `` `code` `` spans — bare-prose
English ("if ao available", "ao not installed") is never treated as a
command, eliminating false positives while still catching the genuine
(always backtick-quoted) stale refs.
- Justified historical refs skip via an inline marker (`Superseded` /
`Historical` / `removed in` / `retained for history` / `(historical)`)
on the line/file, or `scripts/skill-body-refs-allowlist.txt`.

## Prose sweep (what made main pass)

The gate detected genuine stale refs on main; swept them to keep the
gate green:

- `ao context assemble` → `ao lookup` (8 sites — the command was never
built; `ao lookup` is the real co-cited replacement)
- `ao cite` → `ao metrics cite`
- `ao worktree gc` → `git worktree prune` (4 sites — `ao worktree` never
existed)
- `ao hooks` removal note → reworded to "removed in 3.0" (matches the
`removed in` historical marker)

## Allowlist contents

- `skills/standards/references/cli-wireup-template.md` — illustrative
naming template (deliberately names `ao loop-history` / `ao loop write`
/ `ao loop tail` as good/bad examples + future placeholders)
- `skills/release/references/release-notes.md`,
`skills-codex/release/references/release-notes.md` — historical
changelog prose (e.g. `ao daemon status` from the daemon era)

## Wiring

- `.github/workflows/validate.yml` — new T1 job + `summary.needs` +
`validate-pr-evidence-claims.needs` + summary echo (65 jobs)
- `docs/contracts/ci-jobs.yaml` — manifest entry (keeps
`validate-ci-policy-parity` green)
- `AGENTS-CI.md` — regenerated via `scripts/generate-ci-jobs-table.sh
--write`
- `tests/scripts/validate-skill-body-refs.bats` — 6 cases (clean pass,
stale-cmd fail, stale-flag fail, historical-marker skip, bare-prose
ignore, committed-tree pass)

## Verification (local, green)

- `bash scripts/validate-skill-body-refs.sh` → exit 0
- `scripts/validate-ci-policy-parity.sh` → PASS (65 rows)
- `scripts/validate-skill-cli-snippets.sh` → passed (no regression)
- `scripts/check-codex-parity-drift.sh` +
`validate-codex-generated-artifacts.sh --scope worktree` → passed (codex
hashes regenerated for the 6 edited skills only)
- `bats tests/scripts/validate-skill-body-refs.bats` → 6/6 ok
- `shellcheck scripts/validate-skill-body-refs.sh` → clean
- `markdownlint` on changed docs → clean

Closes-scenario: ag-4x8#body-ref-gate
Bounded-context: BC1-Corpus
Evidence: scripts/validate-skill-body-refs.sh
2026-05-24 22:42:40 -04:00
Bo 95fd65cfea docs(3.0): final daemon-prose stragglers (dream-report + UPGRADING) (#530)
Clears the last 2 active stale daemon refs after the ag-p7j swarm (grep
48 → 3 → 0 live):
- docs/contracts/dream-report.md: ao overnight report consumer →
in-session /dream report
- docs/UPGRADING.md: Superseded-in-3.0 banner on the v2.x daemon entry
(migration record, historical refs retained by design)
The 3rd file (plans/2026-05-11 roadmap) already has a Historical banner.

Closes-scenario: ag-p7j#final-stragglers
Bounded-context: BC1-Corpus
Evidence: docs/UPGRADING.md
2026-05-24 21:57:58 -04:00
Bo dde214825b docs(3.0): ag-p7j W1 — delete daemon contracts, regen generated docs, reframe skills (ag-p7j) (#529)
W1 (structural) of the 3-way ag-p7j doc-sweep. Owns
shared/generated/structural artifacts + skills + contracts. Disjoint
from W2 (#527, core narrative) and W3 (#528, peripheral docs), both
already merged; this branch is rebased on top of them.

## Deleted (deleted-surface docs)
-
`docs/contracts/{agentops-daemon,ao-watch,daemon-idempotency,dream-run-contract,agent-worker,ao-outcomes,openclaw-consumer-api,gascity-integration}.md`
- `docs/code-map/agentopsd-codebase-map.md`
- `gascity-integration.md` deleted because it described the OLD
daemon↔GasCity adapter (`ao daemon run --executor-policy=gascity`,
daemon ledger, OpenClaw consumer endpoints). The current GC story is the
using-gc skill + the reference City.
- Removed every deleted doc's row from `docs/documentation-index.md`,
`docs/contracts/index.md`, and `mkdocs.yml` nav.

## Regenerated (generators, not hand-edited)
- `docs/cli-surface.{md,json}` via `check-cmdao-surface-parity.sh
--write-surface` — daemon/schedule/overnight/plans/watch/factory rows
gone (live `ao` binary no longer registers them; the docs were stale).
- `registry.json`, `skills/catalog.json`, SKU catalog, codex
`.agentops-generated.json` hashes + manifest.
- Skill counts verified in sync (81 skills).

## Reframed to in-session / GC / hookless
- Skills: `dream` (+codex twin, neutralized literal `agentopsd`/`ao
schedule`/`ao overnight`/`ao watch`/`ao plans` while keeping the
retirement message), `compile` (+codex), `scaffold/recommended-reading`
(+codex), `discovery/best-practices`, `validation/best-practices`.
- Generated narrative: `docs/SKILLS.md` /dream block,
`docs/ARCHITECTURE.md` dream paragraph, `skills/SKILL-TIERS.md` dream
row.
- Contracts prose: `docs/contracts/ubiquitous-language.md`,
`docs/contracts/agents-write-surfaces.md` (kept catalog rows for
surviving load-bearing-lane subdirs; dropped deleted-command references
in descriptions).

## 3.0.md:150
Restored the strong claim: "...gone from the CLI **and from live doc
prose** (only historical surfaces — ADRs, the CHANGELOG, release notes,
and the 3.0 migration record — still name them, by design)"; kept the
`validate-sku-catalog-drift` linkage-gate mention.

## Collateral (minimal dead-link repairs to my deleted targets)
- `docs/daemon-migration.md` (gascity-integration link →
dependencies.md), `cli/README.md` (dropped dream-run-contract link). The
comparisons-file dead link was resolved by W3's merge.

## Gates (all green locally)
doc-release (2765 links, 0 broken) · contract-compatibility (0 failures)
· structural-floor · agents-write-surfaces · registry --check ·
validate-sku-catalog-drift · validate-ci-policy-parity ·
validate-skill-cli-snippets · validate-codex-runtime-sections · codex
parity (5 skills) + regen-codex-hashes --check · skill-catalog drift ·
cli-skills-map · markdownlint (changed files) · mkdocs --strict · `cd
cli && go build ./...`

Closes-scenario: ag-p7j#w1-structural
Bounded-context: BC1-Corpus
Evidence: docs/3.0.md
2026-05-24 21:55:17 -04:00
Bo e90d6d79f9 feat(registry): SKU capability catalog (schema v2) — generated skill×command×BC join (ag-cbm) (#525)
## What

Extends `registry.json` into a **generated SKU capability catalog**
(schema_version 2) — the flagship 3.0 inventory feature. It is a 4th
DERIVED projection (alongside DDD-vocab / Hex-frontmatter /
Gherkin-acceptance), a JOIN of existing sources — **never
hand-authored** (repo bans hand-edited inventory maps). Oracle-validated
design: `.agents/discovery/2026-05-24-capability-inventory-and-gaps.md`.

## Catalog

214 SKU entries: **81 skills + 66 cli-commands + 64 gates + 3
reference-impls**. Each entry: `sku` (stable id), `name`, `type`,
`bounded_context`, `hex_role`, `tier`, `purpose`, `status` (active |
deprecated | planned | alias-of:&lt;sku&gt;), `disposition`, `consumes`,
`produces`, `drives_commands`, `driven_by_skills`.

`registry.json` schema v2 is a strict **superset** of v1 — existing
`summary`/`surfaces`/`cadence_recommendations` consumers (the Go `ao
registry` command) keep working; new
`capabilities`/`capability_summary`/`cli_top_level_commands` blocks are
added.

## The join key — `drives_commands`

Derived from each skill **BODY** (SKILL.md + `references/*`), resolved
against the live cobra tree (`scripts/lib/sku_extract.py`). Stale refs
that resolve to nothing (e.g. the removed `ao schedule`) never become
edges. `driven_by_skills` is the cmd→skill reverse. This closes oracle
gap #1 (no skill↔command linkage anywhere).

## New gate — `validate-sku-catalog-drift`

Three required checks: **(a) drift** (regenerate + diff), **(b) linkage
integrity** (every `drives_commands` edge resolves to a real `ao`
command — closes gaps #1/#2/#3), **(c) coverage** (every BC + every
operating-loop move has an active skill; every BC has a cli-command).
Wired into `validate.yml` + the verdict aggregator.

## Stale refs fixed

`ao schedule` in `skills/crank` + `skills/rpi` best-practices and
`agentopsd` in `skills/swarm` shared-checkout-discipline → reframed to
the hookless / out-of-session (cron-driven `ao rpi`/`ao evolve` via Gas
City) model. Disjoint from PR #524 (which fixed the hooks/inject refs);
rebased on it — `validate-skill-cli-snippets.sh` is now 0.

## Retired

The bogus "163 cli_commands" count (Go-file count, oracle gap #6) → **66
real top-level cobra nodes** from the live tree.

## Gates (all green locally)

registry-check · validate-sku-catalog-drift (3/3) ·
validate-context-map-drift · skill-domain-map-golden ·
bounded-contexts-drift · codex-parity-drift · regen-codex-hashes --check
· contract-compatibility (sku-catalog.md catalogued) · doc-release ·
validate-skill-cli-snippets (0) · skill-frontmatter · heal --strict ·
markdownlint (0) · shellcheck (0 errors) · mkdocs --strict · `go test
./cmd/ao` (9207) · new bats suite (5/5).

Closes-scenario: ag-cbm#sku-catalog
Bounded-context: BC1-Corpus
Evidence: .agents/discovery/2026-05-24-capability-inventory-and-gaps.md
2026-05-24 20:47:04 -04:00
Bo ad69fec1d7 feat(skills): using-gc agent guide + complete tool-dependency declaration (ag-p4p) (#523)
## What

Builds the GC on-ramp for AgentOps 3.0: a `using-gc` skill that guides
agents on the `gc` (Gas City) CLI exactly like the `bd` protocol guides
them, plus a complete, accurate tool-dependency declaration. **Additive
— no existing behavior changed.**

THE MODEL (operator): "use gc like we use bd" — skills GUIDE agents on
the gc workflow; `ao` does NOT wrap gc. gc is a guided out-of-session
dependency, same as bd.

## Changes

1. **New skill `skills/using-gc/`** — agent-facing guide to running
AgentOps on Gas City, mirroring the bd-protocol style. Covers the gc
primitives (City/`city.toml`, Rig, Pack, Agent, Order, Formula, mayor +
refinery), the end-to-end workflow (`gc start` → `gc rig add` → the
mayor-driven dispatch loop: `bd ready` → `gc sling <rig>/refinery
<bead>` → worker runs `ao rpi <bead>`), cron `exec` Orders for
maintenance (`ao compile`/`ao maturity`), and is HONEST about the
order-auto-dispatch gap (no per-fire var-binding → dispatch is
mayor-driven today; order-auto-dispatch is an upstream-GC item,
soc-5jwah). References the real pack at `packs/agentops/` and
`docs/3.0.md`. Two reference docs + a `.feature` (linked +
`@covered-by:` a new bats test).

2. **Complete dependency declaration** — derived from `ao doctor` tool
checks (`ao`, `awk`, `bash`, `bd`, `cass`, `gc`, `git`, `tmux`) +
`scripts/install*.sh` + the shared fallback table. Classified REQUIRED
(ao, git, runtime), TRACKING (bd + Dolt), ORCHESTRATION (gc,
out-of-session), PR/CI (gh), BUILD-FROM-SOURCE (go), UTILITIES (jq, rg,
curl, openssl, sha256sum, tmux, cass). Landed in: `docs/dependencies.md`
(canonical detail, catalogued in documentation-index), a README
"Requirements" section (summary), and the expanded
`skills/shared/SKILL.md` fallback table (now includes gc, gh, go, jq,
rg).

3. **Fixed stale `using-agentops/SKILL.md:212`** — the runtime-mode `gc`
row described the DELETED `runtime=gc` auto-executor ("ao rpi
auto-selects gc executor", "gc event bus"). Reframed to the mayor-driven
reference City: gc dispatches whole `ao rpi`/`ao evolve` loops; there is
no in-CLI `runtime=gc` mode.

4. **Brief gc pointer** in repo `CLAUDE.md` + `AGENTS.md` near the bd
section, pointing to the using-gc skill (no skill content duplicated).

## Gates (all green locally)

- `sync-skill-counts.sh`: 80→81 total, 9→10 internal — PASS, verified
consistent.
- `validate-context-map-drift`: regenerated
docs/contracts/context-map.md — matches.
- Codex twin `skills-codex/using-gc/` created (`$skill` notation, no
Claude primitives); registered across the 4 catalog surfaces;
`regen-codex-hashes.sh` clean; `audit-codex-parity` PASS; 81 codex
artifacts.
- `generate-registry.sh` (81 skills) — up to date.
- skill-domain-map disposition added (BC5 Runtime) + regenerated golden
— matches; registry-drift narrative counts fixed (80→81).
- plugin-load-test (no symlinks — references copied), skill-schema
(81/81), skill-frontmatter (81/81), skill-dependency-check, heal.sh
--strict (clean), scenario-test-linkage (PASS, new .feature linked via
bats), markdownlint (0 errors), doc-release-gate (PASS).
- New bats test `tests/scripts/using-gc-skill.bats` (5/5).
- Codex description aggregate budget bumped 2700→2800 (catalog grew to
81; same precedent as the 2600→2700 bump when expert-council landed).
- `cd cli && go build && go vet && go test ./cmd/ao/` green (embedded
using-agentops copy synced via `make sync-hooks`).

Closes-scenario: ag-p4p#gc-onramp
Bounded-context: BC5-Runtime
Evidence: skills/using-gc/SKILL.md
2026-05-24 19:39:54 -04:00
Bo 46ed7fee5a docs(3.0): sweep remaining daemon/schedule/hook prose + MIGRATION-3.0 (ag-qbw) (#520)
## What

Wave 2 of the AgentOps 3.0 honest-docs sweep (post-#518 audit, bead
ag-qbw). Makes the `docs/` prose match the shipped code: the daemon,
scheduler, factory, and all hooks were **DELETED** (not deprecated).
AgentOps is the in-session loop + context compiler; out-of-session
orchestration is delegated to a substrate (Gas City reference City /
Olympus). Mirrors the already-correct `docs/3.0.md`.

This makes `docs/3.0.md:150` ("the standalone
daemon/scheduler/overnight-runner surfaces are gone from ... live doc
prose") true for the enumerated wave-2 surfaces.

## Deleted (whole docs about deleted commands)

- `docs/scheduling.md` — entire `ao schedule` + `ao daemon` guide
-
`docs/contracts/{agentopsd-control-plane,agentopsd-schedule,routing-policy}.md`
- `docs/contracts/jobspec-openapi-v0.yaml`
- `docs/templates/dark-factory-schedule.yaml.example`
- `docs/design/olympus-v4-specs/*.md` — v4-port reference for the dead
Olympus → agentopsd extraction

## Reframed (prose → in-session + Gas City)

- Daemon/schedule/overnight: `agentops-3-youtube-starter-series.md`,
`agentops-3-pmf-evidence-loop.md`, `wiki-for-agents.md`,
`activation-profiles.md` (+ `profiles/README.md` profile rename),
`CI-CD.md` (overnight lane)
- Hooks → hookless + CI-as-authoritative-gate (hooks removed #511):
`knowledge-flywheel.md`, `troubleshooting.md`, `reference.md`,
`CI-CD.md`, `release-e2e-checklist.md`, `seed-definition.md`

## Catalog + cross-link cleanup (no broken links)

- `documentation-index.md` — removed deleted-doc rows + the v4 section
- `contracts/index.md` — removed deleted-contract cards
- `rfcs/0002-jobspec-openapi-v0.md` marked superseded; `SCHEMAS.md`,
`templates/README.md` cross-links fixed

## Created

- `docs/MIGRATION-3.0.md` (from the approved draft) + catalog row +
mkdocs nav entry

## Gates (green for this PR's surfaces)

- Link check: **2723 links, 0 broken**
- Contracts structural floor: **PASS (45 contracts)**
- Contract compatibility (orphans): **PASS**
- markdownlint (all changed/new files): **clean**
- `heal.sh --strict`: **All clean**
- mkdocs-strict: my new doc + nav entry build cleanly. The strict build
is **red on main for pre-existing reasons outside this scope** —
`docs/_hooks/gen_cli_reference.py` FATALs on missing `cli/docs/HOOKS.md`
(hooks removed #511, generator not updated; release-mechanics domain)
and `docs/3.0.md:172` links `../PRODUCT.md`/`../GOALS.md` (root files
outside the docs tree). Both confirmed present on `origin/main`; filed
for wave 3.

## Scope notes

- Did **not** touch `CHANGELOG.md`, `cli/`, or version files (parallel
worker owns release mechanics).
- The audit grep still matches ~40 more out-of-scope `docs/` files
(contracts/*, code-map, comparisons, narrative pages, runbooks). Filed
as **wave 3 (ag-p7j)**.

Closes-scenario: ag-qbw#doc-sweep-2
Bounded-context: BC1-Corpus
Evidence: docs/3.0.md
2026-05-24 18:27:24 -04:00
Bo ee748d580d feat(rip)!: retire factory command + contract corpus (soc-2rtm0 #cascade-rip) (#512)
**Wave 1 of the orchestration-substrate cascade rip** (soc-2rtm0). The
full cascade (daemon + dream/overnight + schedule/plans/watch + gc-glue
+ factory) is ~50K LOC across deeply-entangled packages — far past one
reviewable PR. Per the bead's slice directive and the recon map's
serial-by-wave verdict, this ships as sequential PRs by wave. **This is
the factory wave** (the only cleanly-disjoint slice — no KEEP-feature
entanglement).

## What this retires (operator-confirmed FULL factory retire)

**Go command surface** (no external non-test caller — clean delete):
- `cmd/ao/factory.go`, `factory_admit.go`, `factory_pilot.go`,
`factory_admission_adapter.go` (+ all tests)
- `internal/ports/factory_admission.go` +
`inmemory_factory_admission.go` (+ test) — the port was only wired to
the daemon by the deleted production adapter
- severed factory flag save/restore + command-tree assertions from
`cobra_commands_test.go` / `testutil_test.go`

**Contract corpus** (scripts, schemas, contract docs, runbooks,
fixtures, tests):
- `scripts/check-factory-{admission,claim-ledger,yield-ledger}.sh`
- `schemas/factory-{admission,work-order,yield}.v1.schema.json`
- `docs/contracts/factory-{admission,claim-ledger,yield-ledger}.*`
-
`docs/runbooks/{factory-manual-merge,daemon-factory-admission,cloud-frontier-pilot}.md`
- `tests/e2e/factory-operator-canary.sh`,
`tests/integration/test-factory-claim-ledger-ci-job.sh`,
`tests/scripts/test-factory-admission-contracts.py`,
`tests/fixtures/factory-*`
- orphaned `aggregate-observation-log` subsystem (script + integration
test + fixtures) — its only data source was the deleted
`factory-claim-ledger-strict` CI job

**CI / generated reconciliation:**
- removed 3 factory jobs from `validate.yml` (+ both `needs:` arrays +
verdict echoes); removed entries from `ci-jobs.yaml`; regenerated
`AGENTS-CI.md` (63 jobs)
- removed factory gate-ids from `GOALS.md`; trimmed
`contracts-structural-floor` factory references
- regenerated `registry.json` (177→174 CLI commands), `COMMANDS.md` (−70
lines), `cli-skills-map.md` (73→72 headings)
- updated `cli-command-surface-matrix` canary spec + fixture counts
(`top=72 sub=194 all=266`); scrubbed deleted-file links from
`documentation-index.md`, `SCHEMAS.md`, `contracts/index.md`,
`agentopsd-control-plane.md`, `insert-schema-practices.py`

## Deliberately left for the daemon-carve wave
Daemon-owned factory job types (`factory.admission`,
`factory.local-pilot`) and the `agentopsd` routing-policy schema remain
— they belong to `internal/daemon/` and retire when the daemon does.

## Gates verified green locally
`gofmt`/`go build`/`go vet`, full Go test (**11830 pass**),
`validate-ci-policy-parity`, `contract-compatibility`,
`contracts-structural-floor`, `registry --check`, `doc-release` (0
broken links), `smoke-test`, `json-flag-consistency` (0 errors),
**`contract-canaries` (failures=0)**, codex-hashes, `pre-push-gate.bats`
(55).

Diff: 66 files changed, ~16 insertions / ~5680 deletions.

Closes-scenario: soc-2rtm0#cascade-rip
Bounded-context: BC5-Runtime
Evidence: .agents/discovery/2026-05-24-rip-caller-map.md
2026-05-24 12:29:22 -04:00
Bo e431339c40 feat(hookless)!: remove all hooks — skills + CLI only (soc-57b7f #remove-all-hooks) (#511)
## What

AgentOps 3.0 goes **fully hookless**. This removes the entire hook
product surface — the product is now skills + the `ao` CLI with **zero
hooks**. CI is the authoritative gate.

## Deleted

- `hooks/` — 46 hook scripts + `hooks.json` + examples (whole directory)
- `cli/embedded/hooks/` + embedded `hooks.json` +
`embedded/lib/hook-helpers.sh`
- `lib/hook-helpers.sh`
- `ao hooks` CLI command: `cli/cmd/ao/hooks.go`, `hooks_run.go` + 5 hook
test files; `cli/internal/bridge/hooks.go`;
`cli/internal/doctor/fix_hooks.go` + test
- Codex hook manifest (`hooks/codex-hooks.json`) + handler/audit scripts
(`scripts/audit-codex-hooks.sh`, `install-dev-hooks.sh`,
`test-hooks-output.sh`, `test-codex-hookless-lifecycle.sh`,
`test-hookless-rpi-phased.sh`)
- Hook lease surface: `docs/contracts/hook-lease-*`,
`schemas/hook-lease.v1.schema.json`,
`scripts/check-hook-lease-inventory.sh`,
`check-hook-port-replacements.sh`, `generate-hook-lease-inventory.py`
- Hook docs: `docs/HOOKS.md`, `cli/docs/HOOKS.md`,
`docs/architecture/hook-noise-audit.md`,
`docs/contracts/hook-runtime-contract.md`
- `tests/hooks/` (whole dir) + hook test scripts; 5 hook eval suites +
fixtures

## CI gates removed

`hook-preflight`, `validate-hooks-doc-parity`, `hook-output-schema-lint`
(+ scripts/bats), the hook eval suites, the `test-runtime-codex-smoke` /
`test-codex-native-install` / `test-codex-plugin-install` hook-handler
assertions, the cli-integration hook-lifecycle steps, the bats
`tests/hooks/*` glob + orphan-hooks audit, and the `--with-hooks`
install path. `embedded-sync` now validates only lib/skills. Both
summary `needs:` lists + the summary echo +
`docs/contracts/ci-jobs.yaml` updated; `validate-ci-policy-parity`
passes (66 rows). `.codex-plugin/plugin.json` drops the "Hooks"
capability.

## Load-bearing PRESERVED (reported, not forced)

- **`cli/cmd/ao/codex_runtime.go`** — the codex runtime *lifecycle
profile* (`HookCapable`/`HookConfigured` detection) is a
runtime-capability abstraction used by 6 `validate-codex-*` CI gates,
distinct from the hook product. Deleting it is a separate refactor.
- **`hooks-authoring` skill** + `schemas/hooks-manifest.v1.schema.json`
— reframed as an opt-in "author your own hooks" guide. Deleting the
skill cascades into catalog/domain-map/dispositions/context-map golden
files (skill-count sync), out of scope for the hook-product removal.
- **`scripts/pre-push-gate.sh`** — retired local gate (not in CI);
self-skips deleted hook scripts via `[[ -x ]]` guards; its 55 bats tests
still pass.
- Domain-enforcement audit keeps the `enforced`-mode schema for
backward-compatible JSON readers, but the hookless resolver only returns
`audited`/`unavailable`.

## Verification

`go build` / `go vet` clean; `go test ./...` = **11849 passed, 0
failed** (68 pkgs). gofmt clean on all touched files. Green: registry
`--check` (0 hooks), `regen-codex-hashes --check`,
`validate-ci-policy-parity`, `check-wiring-closure`,
`validate-embedded-sync`, `validate-manifests`, `validate-agents-split`,
`doc-release` (0 broken links), `generate-cli-reference --check`,
`heal.sh --strict`, codex/claude/plugin smoke tests, baseline-audit (0
stale). Diff: 231 files, +354 / −39803.

Closes-scenario: soc-57b7f#remove-all-hooks
Bounded-context: BC5-Runtime
Evidence: .github/workflows/validate.yml
2026-05-24 11:19:37 -04:00
Bo f4380065f7 feat(ci): promote executable-spec-link-integrity warn→blocking (soc-x7y9f #spec-link-blocking) (#506)
## What

Now that PR #490/soc-m8tdn linked all 14 GOALS.md directives to
scenarios, the directive↔scenario link lint (`ao goals scenarios
--lint`) is clean. This promotes the `executable-spec-link-integrity` CI
gate from **warn-only** to a **required (T1)** check.

## Changes

- **`.github/workflows/validate.yml`**: removed `continue-on-error:
true`; renamed job `(warn-only, F1.6)` → `(T1, soc-x7y9f)`; `ao goals
scenarios --lint` now runs strict (no `|| echo WARN`), so it fails the
job — and the summary — on any broken directive↔scenario edge. The inner
`ao goals trace --orphans` whole-chain audit stays warn-only inside the
now-required job (it surfaces pre-existing `broken_bead_scenario_claim`
parse defects that are out of this gate's scope, tracked under soc-gqhrz
— flipping it would red main).
- **`docs/contracts/ci-jobs.yaml`**: `reason`/`failure` prose updated
warn-only/Non-blocking → **Blocking (T1, soc-x7y9f)**, mirroring sibling
`validate-scenario-test-linkage`.
- **`AGENTS-CI.md`**: regenerated `### CI Jobs` table via
`scripts/generate-ci-jobs-table.sh --write` (drops the `(non-blocking)`
marker) + hand-maintained blocking-policy + triage-SLA prose updated.

The gate was already present in both summary `needs:` lists and the
summary echo — removing `continue-on-error` is what makes its `failure`
result reach the summary's `contains(needs.*.result, 'failure')`
failset.

## Proof it's safe to flip (blocking-mode local result)

```
$ cli/bin/ao goals scenarios --lint
No executable-spec link defects found.        # exit 0 — all 14 directives resolve
$ bash scripts/validate-ci-policy-parity.sh
CI_JOBS_TABLE: PASS (69 rows)                  # job table synced
```

YAML parse OK on both validate.yml and ci-jobs.yaml.

Closes-scenario: soc-x7y9f#spec-link-blocking
Bounded-context: BC4-Evidence
Evidence: docs/contracts/ci-jobs.yaml
2026-05-23 23:18:35 -04:00
Bo c012b6c1ee feat(bdd): scenario→test linkage runner + CI gate (soc-63xfx #scenario-test-runner) (#503)
## What

Mechanizes the scenario→test linkage gap. 71 `.feature` files existed
under `skills/*/references/` but only a handful had an executing test;
the rest were unverified documentation. This adds a linkage **convention
+ checker + blocking CI gate** — a linkage check, not a full Gherkin
step-interpreter (that scope was deliberately avoided per the bead's
pragmatic-scope guidance).

## Convention

`@covered-by:<test-path>[::<Name>]` Gherkin tag placed directly above a
`Scenario:` (or above `Feature:` for file-wide coverage). Lightest
convention that resolves "scenario X is covered by test Y" without
maintaining a separate registry. The `::<Name>` form additionally
asserts a named test (Go func / bats `@test` / bash func) exists in the
file.

## Deliverables

- **`scripts/check-scenario-test-linkage.sh`** — parses every `.feature`
scenario, resolves `@covered-by` targets, and FAILS on:
unlinked-and-unallowlisted scenarios, dangling links (missing path or
named test), allowlist/tag conflicts, and stale allowlist entries.
Flags: `--warn-only`, `--json`, `--help`. Exit 0/1/2.
- **`scripts/.scenario-linkage-allow`** — 68 doc-only feature files, a
*draining backlog* (drain as skills gain executing tests). The gate is
real: a scenario not here and not tagged fails CI.
- **Starter set** — `rpi`, `goals`, `scenario` features fully linked (11
scenarios) to their `tests/e2e/*` tests, proving the mechanism end to
end.
- **`validate.yml`** — `validate-scenario-test-linkage` T1 blocking job
+ summary `needs` + summary echo; manifest entry in
`docs/contracts/ci-jobs.yaml` + regenerated `AGENTS-CI.md` table (parity
gate green).
- **`docs/contracts/scenario-test-linkage.md`** +
`documentation-index.md` catalog entry.
- **`tests/scripts/check-scenario-test-linkage.bats`** — 13 regression
tests (pass/fail/warn/json/file-level-tag/misuse).

Sibling to `executable-spec-link-integrity` (directive→scenario).
Together they close the GOALS-directive → scenario → test evidence
chain.

## Verification (all green)

- `shellcheck scripts/check-scenario-test-linkage.sh` — clean
- gate run locally — PASS (256 scenarios, 71 files; 11 linked, 245
allowlisted)
- 5 failure paths manually exercised → exit 1; `--warn-only` → exit 0;
misuse → exit 2
- `bats tests/scripts/check-scenario-test-linkage.bats` — 13/13 ok
- `check-contracts-structural-floor.sh` — PASS (new contract catalogued)
- `validate-ci-policy-parity.sh` — PASS (manifest + AGENTS table synced)
- `validate.yml` + `ci-jobs.yaml` YAML parse OK
- diff stat: +639/−2, all-additions, no collateral data loss

Closes-scenario: soc-63xfx#scenario-test-runner
Bounded-context: BC4-Evidence
Evidence: scripts/check-scenario-test-linkage.sh
2026-05-23 23:03:01 -04:00
Bo 211f04cfbe chore(hooks): delete commit-review-gate — hookless S3 (soc-vpmzg #rm-commit-review-gate) (#494)
## Summary

Deletes `commit-review-gate` — a value-negative noise-injector. Despite
its name it never blocked: it always exited 0 and injected the staged
diff + a "SELF-REVIEW" prompt on every `git commit` (A/B showed Δ=0).
Hookless S3 of the go-hookless epic (`soc-e2ju0`).

The "+7 conditional injectors" the original audit grouped with it were
reclassified as kept-gates (they speak only on a real violation) — **out
of scope, not deleted**. S3 removes only `commit-review-gate`.

## Changes

- **Hook scripts:** `git rm` of `hooks/commit-review-gate.sh` +
`cli/embedded/hooks/commit-review-gate.sh`
- **Go runtime:** removed `runCommitReviewHook` managed-backend + its
exclusive helpers (`gitOutput`, `countDiffFiles`, `hookCountLines`,
`firstLines`, `redactSensitiveDiff` + credential regexes) and the
now-dead `TestHooksRunRedactsSensitiveDiff` test
- **Manifests:** pruned from `hooks/hooks.json`,
`hooks/codex-hooks.json`, `registry.json`,
`hook-lease-classification.v1.json` (lease-inventory regenerated)
- **Codex handler count 15 → 14:** assertions in
`test-runtime-codex-smoke.sh` + `test-codex-native-install.sh`, plus
require-handler arrays in `install-codex-plugin.sh` /
`install-codex.ps1` / `test-codex-native-install.sh` /
`audit-codex-hooks.sh`
- **Test blocks:** removed commit-review @test blocks from
`test-hooks.bats`/`.sh`, `hook-output-schema.bats`,
`hook-stdin-contracts.bats`, the eval fixture, and
manifest-runtime-contracts
- **Docs:** `HOOKS.md`, `software-factory.md`, `how-it-works.md`,
`update-principles.md`, `SDK-INVENTORY.md`; `hook-noise-audit.md`
records the S3 deletion (46 hooks remaining)
- **Drive-by:** fixed pre-existing stale `length == 20` assertions in
`test-audit-codex-hooks.sh` (codex bundle is 14 post-delete; this test
is not CI-gated and was already failing on main)

## Verification (all green)

`check-hook-lease-inventory` · `validate-hooks-doc-parity` ·
`check-hook-port-replacements` · `validate-hook-preflight` ·
`generate-registry --check` · `smoke-test` · `test-runtime-codex-smoke`
(33/0) · `bats tests/hooks/*.bats tests/scripts/pre-push-gate.bats`
(297/0) · `test-agentops-contract-canaries` (failures=0, incl
pre-push-gate-governance + runtime-smoke-matrix) ·
`test-codex-native-install` · `test-audit-codex-hooks` (4/4) · `go
build/vet/test ./cmd/ao/`

Diff stat: 30 files, +26 / −569 (deletion-heavy, as expected).

Closes-scenario: soc-vpmzg#rm-commit-review-gate
Bounded-context: BC5-Runtime
Evidence: docs/contracts/hook-lease-inventory.md
2026-05-23 21:43:03 -04:00
Bo 29e0acc26e chore(hooks): delete standards-injector + retire its CI gate — hookless S2 (soc-khev6 #rm-standards-injector) (#488)
## What

Hookless epic S2 (`soc-khev6`): delete the `standards-injector`
PreToolUse hook and **fully retire** its dedicated CI gate.

`standards-injector` is a value-negative noise-injector — it injects
language standards on every Edit/Write regardless of relevance (A/B Δ=0,
per `docs/architecture/hook-noise-audit.md`). The replacement is the
`standards` skill, read on demand: a PRODUCT surface, not hook magic.

## Teardown (all of it)

- **Hook + tests:** `git rm hooks/standards-injector.sh`, its embedded
copy, and `tests/hooks/standards-injector.bats`.
- **Manifests:** pruned the Edit + Write entries from `hooks/hooks.json`
and `hooks/codex-hooks.json`, dropping the now-empty matcher groups.
**Codex native handlers 17 → 15** (two entries removed, not one — Edit
retains `codex-parity-warn.sh`, Write group dropped).
- **CI gate retired:** removed the `standards-injector-completeness` job
from `validate.yml` + both `needs:` lists
(`validate-pr-evidence-claims`, `summary`) + the summary echo; `git rm`
the check script + its bats; removed from `ci-jobs.yaml` manifest and
regenerated `AGENTS-CI.md`; removed from `pre-push-gate.sh` + its bats
stub.
- **Codex test assertions (the S1 bite):** `test-runtime-codex-smoke.sh`
and `test-codex-native-install.sh` length `17 → 15`; removed
`standards-injector.sh` from the require-handlers array.
- **Shared iterators:** pruned the `@test`/section blocks from
`test-hooks.bats`, `hook-output-schema.bats`,
`hook-stdin-contracts.bats`, `test-hook-chain.sh`,
`test-hook-lifecycle.sh`, `test-hooks.sh`, and the eval fixture
`hook-context-value-smoke.sh`.
- **Other surfaces:** `validate-hook-preflight.sh`,
`install-codex-plugin.sh`, `install-codex.ps1` owned-script lists;
`hooks_test.go` (swapped synthetic name to a live hook);
`context_compiler.go` port doc comment.
- **Regen:** hook-lease classification + inventory, registry, embedded
sync.
- **Docs:** `HOOKS.md`, `hook-noise-audit.md` (records S2 deletion),
`ENV-VARS.md` (`AGENTOPS_STANDARDS_*` vars), `LOOP-BUDGET.md`,
`cli-skills-map.md`, `software-factory.md`, `SDK-INVENTORY.md`.

## Verify (all green locally)

`check-hook-lease-inventory`, `validate-hooks-doc-parity`,
`check-hook-port-replacements`, `validate-hook-preflight`,
`generate-registry --check`, `validate-ci-policy-parity`,
`tests/smoke-test.sh` (codex smoke + native install),
`test-runtime-codex-smoke.sh`, the 3 bats hook suites, `go
build/vet/test`. `grep standards-injector validate.yml
ci-local-release.sh` → empty.

Diff stat: 39 files, +32 / -1045 (deletion-heavy, as expected for a
teardown).

Closes-scenario: soc-khev6#rm-standards-injector
Bounded-context: BC5-Runtime
Evidence: docs/contracts/hook-lease-inventory.md
2026-05-23 20:54:24 -04:00
Bo 09b4a95cb0 chore(hooks): delete 5 noise-injector hooks — hookless S1 (soc-s1i3b #rm-noise-hooks) (#483)
**GO HOOKLESS** epic `soc-e2ju0`, slice 1. Delete the 5
lowest-entanglement value-negative noise-injectors (A/B Δ=0). The
workflow is carried by the **product** (skills + `ao` CLI), not these
hooks.

Deleted (**53→48 hooks**): research-loop-detector, context-monitor,
write-time-quality, edit-knowledge-surface, go-vet-post-edit (all
pure-noise, 0 blocks, no dedicated CI gate).

Governed teardown per hook: rm .sh + .bats; prune hooks.json +
codex-hooks.json; remove hook-lease-classification entry (37→32) + regen
hook-lease-inventory.md; remove per-hook @test blocks from shared
iterators (heredoc-aware, bats re-run green); sync-hooks + regen
registry (44→38); update HOOKS.md + hook-noise-audit.md. Replacement =
product surfaces (skills + ao inject/lookup); go vet stays CI's job
(factory, not product).

Gates: check-hook-lease-inventory ✓, check-hook-port-replacements ✓,
validate-hooks-doc-parity ✓, validate-hook-preflight ✓, registry --check
✓, go build ✓, bats 81/15/78 green. Deletion-heavy diff = intentional
removal.

NOTE: claude-review infra-red (weekly limit, resets May 25) —
operator-authorized bypass when sole red.

Closes-scenario: soc-s1i3b#rm-noise-hooks
Bounded-context: BC5-Runtime
Evidence: docs/contracts/hook-lease-inventory.md
2026-05-23 19:55:07 -04:00
Bo 207eea3282 feat(recover): hexagon consumes + executable acceptance for session recovery (soc-nc7mj #recover-hexagon) (#467)
soc-qk4b skill-hexagon-crank — full crank. /recover had EMPTY consumes
despite reading rpi phased-state + bd work queue.

- frontmatter: consumes [] → [bd, rpi] (evidence: Call 1 reads
.agents/rpi/phased-state.json; Call 4 reads bd in-progress/ready)
- skills/recover/references/recover.feature (NEW): detect rpi phase;
surface bd work; recent git; --json
- context-map.md regenerated (recover←bd + recover←rpi edges;
deterministic); SKILL.md linked

How tested: lint-skills ✓ recover (368 lines); scenarios --lint 0
errors; codex parity passed; registry up to date.
Sibling: full crank like /doc #466.

NOTE: claude-review infra-red (weekly limit, resets May 25) —
operator-authorized bypass when sole red.

Closes-scenario: soc-nc7mj#recover-hexagon
Bounded-context: BC5-Runtime
Evidence: skills/recover/references/recover.feature
2026-05-23 08:57:35 -04:00
Bo 8ff97a7b43 feat(doc): hexagon consumes + executable acceptance for repo documentation (soc-vltp0 #doc-hexagon) (#466)
soc-qk4b skill-hexagon-crank — full crank. /doc had EMPTY consumes
despite reading source + existing docs.

- frontmatter: consumes [] → [repo-context] (evidence: Step 1 detects
type from manifests; reads source to document)
- skills/doc/references/doc.feature (NEW): detect type; type-appropriate
docs from source; validate existing docs vs source
- context-map.md regenerated (doc←repo-context edge; deterministic);
SKILL.md linked

How tested: lint-skills ✓ doc (277 lines); scenarios --lint 0 errors;
codex parity passed; registry up to date.
Sibling: full crank like /test #464.

NOTE: claude-review infra-red (weekly limit, resets May 25) —
operator-authorized bypass when sole red.

Closes-scenario: soc-vltp0#doc-hexagon
Bounded-context: BC1-Corpus
Evidence: skills/doc/references/doc.feature
2026-05-23 08:40:08 -04:00
Bo ac6ad326f5 feat(test): hexagon consumes + executable acceptance for test generation (soc-5c5ds #test-hexagon) (#464)
soc-qk4b skill-hexagon-crank — full crank. /test had EMPTY consumes
despite loading standards + reading code.

- frontmatter: consumes [] → [standards, repo-context] (evidence: Step 0
loads /standards; generate reads existing code)
- skills/test/references/test.feature (NEW): load-standards-first;
generate real passing tests (not a plan); coverage gap-fill →
.agents/test/
- context-map.md regenerated (test←standards + test←repo-context);
SKILL.md linked

Incidental: regen also fixed /refactor's stale codex source_hash (#463
follow-on, .feature edited after final regen). Deterministic across 2
checkouts; needed for codex-drift gate.

How tested: lint-skills ✓ test (405 lines); scenarios --lint 0 errors;
regen --check all up to date; registry up to date.
Sibling: full crank like /refactor #463.

NOTE: claude-review infra-red (weekly limit, resets May 25) —
operator-authorized bypass when sole red.

Closes-scenario: soc-5c5ds#test-hexagon
Bounded-context: BC4-Validation
Evidence: skills/test/references/test.feature
2026-05-23 08:26:14 -04:00
Bo e14e9e6eda feat(refactor): hexagon consumes + executable acceptance for safe refactoring (soc-ntzpd #refactor-hexagon) (#463)
soc-qk4b skill-hexagon-crank — full crank. /refactor had EMPTY consumes
despite reading code + running /complexity in sweep mode.

- frontmatter: consumes [] → [complexity, repo-context] (evidence:
--sweep runs /complexity first; all modes read/transform the code)
- skills/refactor/references/refactor.feature (NEW):
one-transform/one-test/one-commit, revert-on-fail, --sweep
complexity-first, target mode
- context-map.md regenerated (refactor←complexity +
refactor←repo-context; deterministic); SKILL.md linked

How tested: lint-skills ✓ refactor (454 lines, under cap); scenarios
--lint 0 errors; codex parity passed; registry up to date; diff-stat
clean.
Sibling: full crank like /red-team #462.

NOTE: claude-review infra-red (weekly limit, resets May 25) —
operator-authorized bypass when sole red.

Closes-scenario: soc-ntzpd#refactor-hexagon
Bounded-context: BC5-Runtime
Evidence: skills/refactor/references/refactor.feature
2026-05-23 08:05:54 -04:00
Bo 96e571ce93 feat(red-team): hexagon consumes + executable acceptance for usability probing (soc-k37pg #red-team-hexagon) (#462)
soc-qk4b skill-hexagon-crank — full crank. /red-team had EMPTY consumes
despite probing a surface (docs/skills = repo files).

- frontmatter: consumes [] → [repo-context] (evidence: probes docs/ or a
skill's SKILL.md — repo files; --surface=docs <target>)
- skills/red-team/references/red-team.feature (NEW): persona attempts
real tasks → reports what breaks; usability-not-judgment/code-quality;
--surface selects target
- context-map.md regenerated (red-team←repo-context edge;
deterministic); SKILL.md linked

How tested: lint-skills ✓ red-team (344 lines, under cap); scenarios
--lint 0 errors; codex parity passed; registry up to date; diff-stat
clean.
Sibling: full crank like /perf #461.

NOTE: claude-review infra-red (weekly limit, resets May 25) —
operator-authorized bypass when sole red.

Closes-scenario: soc-k37pg#red-team-hexagon
Bounded-context: BC4-Validation
Evidence: skills/red-team/references/red-team.feature
2026-05-23 07:47:29 -04:00