mirror of
https://github.com/boshu2/agentops.git
synced 2026-09-14 15:08:13 +08:00
ao-pre-reduction@5b334a13f
243 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
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. |
||
|
|
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 |
||
|
|
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 |
||
|
|
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. |
||
|
|
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
|
||
|
|
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. |
||
|
|
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 |
||
|
|
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 |
||
|
|
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> |
||
|
|
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 |
||
|
|
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
|
||
|
|
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 |
||
|
|
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> |
||
|
|
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 |
||
|
|
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 |
||
|
|
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 |
||
|
|
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 |
||
|
|
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
|
||
|
|
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 |
||
|
|
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
|
||
|
|
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
|
||
|
|
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
|
||
|
|
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 |
||
|
|
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> |
||
|
|
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
|
||
|
|
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
|
||
|
|
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) |
||
|
|
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 |
||
|
|
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 |
||
|
|
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 |
||
|
|
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. |
||
|
|
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 |
||
|
|
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 |
||
|
|
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 |
||
|
|
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 |
||
|
|
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:<sku>), `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 |
||
|
|
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
|
||
|
|
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
|
||
|
|
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
|
||
|
|
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 |
||
|
|
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 |
||
|
|
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 |
||
|
|
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 |
||
|
|
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 |
||
|
|
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 |
||
|
|
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 |
||
|
|
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 |
||
|
|
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 |
||
|
|
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 |
||
|
|
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 |