## Docs site — boshu2.github.io/agentops
- Replace Jekyll minima with MkDocs Material (slate dark palette default)
- Landing hero scoped to .landing-hero (no gradient bleed on inner pages)
- Section landings (getting-started, architecture, reference, contracts, levels) with narrative ledes
- Generate skill catalog + per-skill pages from skills/*/SKILL.md at build
- Generate CLI reference from cli/docs/ at build (fails build on missing source)
- Fix every internal link via one-shot migration (scripts/migrations/2026-04-19-fix-docs-links.py)
- Wire mkdocs build --strict into pre-push gate (Check 25a)
- Replace .github/workflows/pages.yml with .github/workflows/docs.yml (actions/deploy-pages)
- README + docs/CONTRIBUTING updated with docs-build toolchain on-ramp
- tests/docs/validate-links.sh patched to understand mkdocs-generated paths
## RPI orchestrator strict-delegation contract
- Strict sub-skill delegation is now the default for /rpi, /discovery, /validation. No --full flag — always on.
- Canonical contract in skills/shared/references/strict-delegation-contract.md (plus Codex mirror)
- Forged learning with detection phrases + corrective actions (ao-inject-ready)
- Rename --no-lifecycle -> --no-scaffold in /discovery (Claude + Codex) with deprecation alias through v2.40.0
- Harden inline-work hotspots with orchestrator-owned markers in /crank STEPS 3a.3, 6.5, 8.7 + Inline Work Policy footer
- Flag consistency: --auto and --interactive scopes documented; --complexity syntax formalized
- CHANGELOG [Unreleased] documents + scaffolds; runtime hook enforcement explicitly deferred
## fix(hooks): go-test-precommit skips when no Go files staged
- Previously ran go vet + go build unconditionally, blocking non-Go commits when Go toolchain was missing or at a different version
- Now checks staged diff and exits cleanly if no *.go or go.{mod,sum,work} files are staged
- Applied to both hooks/ (source) and cli/embedded/hooks/ (synced)
Provenance: full RPI lifecycle with strict delegation at every phase boundary (Phase 1 Skill(discovery) -> Phase 2 Skill(crank) -> Phase 3 Skill(validation) -> Skill(vibe), Skill(post-mortem), Skill(retro)).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds scripts/check-cmd-ao-coverage.sh: reads the existing coverage.out
profile (no second test run), aggregates statement coverage for
cli/cmd/ao/, compares against MIN_COVERAGE floor, exits non-zero on
shortfall. Reads threshold from --min, $MIN_COVERAGE env, or default.
Wires a new 'Enforce cmd/ao coverage floor' step into validate.yml
immediately after the existing go test step, invoking the script with
--profile cli/coverage.out.
Initial floor: 76%. Current measured: 76.8% against the full-suite
coverage.out (2026-04-15). Source epic evolve-cycle-6-coverage-85pct
is driving this to 85%. Ratchet convention: bump MIN_COVERAGE one
whole percent each time real coverage rises, so the floor never
silently regresses.
Consumes evolve-cycle-6-coverage-85pct 'Add 85% coverage gate to CI
validate.yml for cmd/ao' (as a ratchet floor, not a cliff).
New retrieval-quality job runs retrieval-bench against the offline
corpus on every push/PR. Reports precision@K and warns when below
0.1 threshold. Currently advisory (warn-then-fail pattern) — will
flip to blocking once baseline stabilizes above 0.3.
Note: --eval flag was planned but existing --live mode + overnight
wiring already provides labeled eval against real corpus. The CI
job uses the offline corpus for determinism (no network deps).
Changed concurrency.cancel-in-progress from false to true in
release.yml. When retag-release.sh deletes and repushes a tag, the
new push now cancels any still-running workflow for the same version
key instead of queuing a redundant second run.
Root cause: with cancel-in-progress:false, both the original tag push
AND the retag push would run simultaneously against the same
concurrency group, producing duplicate Release Publisher runs.
Closes ag-wyf.
Adds a blocking windows-smoke job, native PowerShell smoke script, Windows docs updates, and moves a Unix-only RPI lock permission test out of the Windows test path.
Single commit covering the tractable slice of the Dream RunLoop Correctness
wake-check follow-ups. na-h61 remains deferred per handoff (requires a
dedicated --complexity=full --mixed session).
ci(validate): fix content-hash gate snapshot wiring (na-lij)
The M9 bracket captured to mktemp but the path was discarded, so the
post-test diff step always hit "ERROR: diff requires a valid snapshot
file path" and the warning fired unconditionally. This explains the M9
"drift on first main run" signal at dbf6d02a. Thread HASH_GATE_SNAPSHOT
through GITHUB_ENV so the diff step actually sees the pre-test path,
and treat a missing snapshot as ::notice:: rather than warn. The gate
now only fires on real drift; ratchet upgrade (warn->fail) is still
gated on 1-2 clean main runs before flipping.
feat(hash-gate): add --ignore-untracked escape hatch (na-5dr)
scripts/check-agents-hash-snapshot.sh: parse --ignore-untracked (no-op
for the ~/.agents/ case since the hub is not a git repo; future-proofs
against a repo'd hub and documents the flag).
scripts/pre-push-gate.sh: honor HASH_GATE_IGNORE_UNTRACKED=1 by
skipping the content-hash block entirely. CI is unchanged (strict
behaviour preserved); operators with local scratch state get a
documented way to push through transient hub drift.
test(overnight): add TestRunLoop_WarnOnlyBudgetExhausted (na-jn9)
Covers the M6 L2 rescue-drain path. Uses an oscillating regression
injector (good<->bad per iter) rather than a plateau injector because
PlateauState.halted is sticky and can only consume one rescue per
run. Regression detection is stateless, so N+1 bad iters drain the
budget exactly. Asserts WarnOnlyBudgetRemaining==0, RegressionReason
contains "warn-only budget exhausted", last iter status ==
StatusHaltedOnRegressionPostCommit, and at least N warn-only rescue
notes in prior iters.
na-khk (bushido env leak in rpi/toolchain_test.go): investigated; zero
"bushido" matches anywhere in cli/, toolchain_test.go has no Setenv/HOME
calls, ./internal/rpi test suite runs clean. Closed as not-reproducible
on HEAD post-M1 HOME isolation (394bfa51).
Wires scripts/check-agents-hash-snapshot.sh into the validate.yml Go
test job so CI catches any test that mutates ~/.agents/ without honoring
HOME isolation. This is the remote-CI completion of Micro-epic 1 (which
landed the local pre-push gate wiring as ae4d84ca).
Two new workflow steps bracket the existing "Run Go tests" step:
1. "Capture pre-test ~/.agents content hash snapshot" — runs before the
tests, captures the hub state. Tolerant of missing shasum so the
step never blocks CI on tooling issues.
2. "Diff post-test ~/.agents content hash snapshot" — runs with
if: always() so it executes even when the test step fails. A diff
detection emits ::warning:: annotations on the workflow run with a
clear investigation hint, but deliberately does NOT fail the job:
CI ephemeral hubs may have uninitialised baseline state and a hard
failure would block the pipeline until the baseline lands. The
warn-only posture lets operators see drift without blocking
unrelated work.
Scope: single file. No new tests (the script itself is covered by its
own shellcheck run in the pre-push gate). YAML syntax validated via
python yaml.safe_load.
Defeats the os.Chtimes mtime bypass that the existing mtime-only gate
cannot detect — content hash changes regardless of whether mtime was
rolled back to the original timestamp.
Refs: .agents/handoff/2026-04-10-dream-runloop-correctness.md §Micro-epic 9
Remove coverage-ratchet job, cmd/ao coverage floor check, and all
associated scripts/tests/baseline. Coverage percentages are noisy
during test migrations and architectural refactors — they block CI
without catching real bugs.
Deleted: .coverage-baseline.json, scripts/check-cmdao-coverage-floor.sh,
scripts/coverage-ratchet.sh, tests/scripts/check-cmdao-coverage-floor.bats
Updated: validate.yml, pre-push-gate.sh, ci-local-release.sh, pre-push-gate.bats
Add -shuffle=on to go test in validate.yml and Makefile to detect
test ordering dependencies at CI time.
Fix 5 tests that failed under shuffle:
- TestCobraIndexCheckCommand: add resetCommandState(t)
- TestDoctor_Integration_*: add resetCommandState(t) + env isolation
- TestMaturity_Integration_ScanPendingTransitions: add env isolation
- TestInjectForFlag_NoDeclaration: add env isolation
- TestRunGoals_GoroutineLeak: use goleak.IgnoreCurrent() to avoid
false positives from parallel test subprocess cleanup
Root causes: leaked cobra flag values, missing maturity var resets in
testutil, and missing AGENTOPS_RPI_RUNTIME env var isolation.
Rename the athena skill to compile — a descriptive name that communicates
what it actually does. Extend with Karpathy's LLM Knowledge Bases architecture:
- New compile phase: LLM reads raw .agents/ artifacts and produces interlinked
markdown wiki at .agents/compiled/ with index.md, log.md, backlinks
- New lint phase: detects contradictions, orphan pages, stale claims, coverage gaps
- Pluggable compute backend via AGENTOPS_COMPILE_RUNTIME (ollama|claude|openai)
- Hash-based incremental compilation (only recompile changed sources)
- compile.sh engine with security fixes (no shell injection, path traversal guard)
- Full rename across 93 files: skills, docs, CLI, tests, hooks, scripts, codex
Existing Mine → Grow → Defrag cycle preserved as phases within the larger
compile workflow. No vector DB — compiled wiki IS the retrieval layer.
go-build: Fix L2 integration tests to use cmd.SetOut(&buf) instead of
captureStdout (race-safe cobra output capture). Fix hooksDryRun leak
in TestForgeTranscriptAccess_WithDir.
bats-tests: Update coverage floor expectation 78→81%. Add
validate-embedded-sync.sh stub to pre-push-gate bats setup.
security-scan: Exclude build artifact dirs and filter Go env var reads
from secret pattern matching.
skill-lint: Trim crank SKILL.md 847→639 lines by extracting inline
content to references/gc-pool-dispatch.md.
ci-policy-parity: Add swarm-evidence job to AGENTS.md CI table.
All 6 categories addressed. heal.sh --strict passes.
Epic D: Add pre-spawn worker detection to git-worker-guard (blocks worktree-add
and agent-spawn from workers). Enhance check-file-manifest-overlap.sh edge cases.
Wire validate-swarm-evidence.sh into CI. Fix .agents/retros→retro in index.go
and init.go. Add grep-for-existing-functions to swarm worker template.
Epic E: Replace partial embedded check in pre-push-gate with full
validate-embedded-sync. Lazy-init git rev-parse in research-loop-detector.
Add retag idempotency guard (skip if tag already at HEAD). Add git_sha to
release-artifacts.json manifest. Empty stdin guard in go-test-precommit.
F4: scripts/purge-global-garbage.sh removes auto-extracted fragments
with body < 50 chars from ~/.agents/learnings/. Dry-run found 33/1612
garbage files; executed purge on local machine.
F5: Add retrieval-bench job to nightly CI. Runs synthetic corpus bench
and fails if P@3 drops below 0.67 (the minimum precision target).
Completes all 5 failure modes from docs/flywheel-audit.md.
The sync-codex-native-skills.sh script is unreliable and overwrites manual
edits to skills-codex/. Codex skills are now manually maintained.
- Remove validate-codex-skill-parity step from validate.yml
- Comment out from ci-local-release.sh
- Skip in pre-push-gate.sh
- Keep codex-runtime-sections and install-bundle checks (structural, not parity)
The runGoals() function had a lock ordering bug that could deadlock: it
acquired exclusive.Lock() before the semaphore, so readers holding sem
slots and blocked on RLock() would prevent the writer from ever getting
a slot. Fix by always acquiring the semaphore first (same order as
readers).
Also add timeout-minutes to all nightly and key validate jobs to prevent
any future job from silently hanging for the 6h GitHub default timeout.
https://claude.ai/code/session_013zgSZWWx7inP69cUUPRDNe
- Fix hardcoded /tmp path in test-json-flag-consistency.sh (use mktemp)
- Add graceful skip for missing jq/python3 in check-contract-compatibility.sh
- Fix import grouping in maturity_test.go
- Update .agents/retros/ → .agents/learnings/ in ratchet gate.go
- Extract _validate_restricted_cmd to lib/hook-helpers.sh (shared lib)
- Wire test-json-flag-consistency.sh into CI (new validate.yml job)
- Add post-merge naming cleanup step to swarm local-mode.md
- Document operationalization heuristics in plan SKILL.md
- Create check-file-manifest-overlap.sh for pre-spawn conflict detection
- Wire file manifest overlap check into CI with self-tests
- Pre-mortem fixes: bash 4+ guard, mktemp in CI self-tests
- Add bats-tests job to validate.yml (184 tests across 6 files)
- Add coverage-ratchet job to validate.yml (needs go-build)
- Fix 3 Go hooks to use stdin JSON instead of broken env vars
(go-test-precommit, go-complexity-precommit, go-vet-post-edit)
- Add cmd/ao to coverage baseline at 84%
- Broaden audit-assertion-density.sh from *coverage*_test.go to *_test.go
- Add 8 fuzz seed correctness tests (5 parsers, was no-panic only)
- Sync embedded hook copies via make sync-hooks
Swarm: 8 tasks across 2 waves, TDD on all Go changes.
HIGH fixes:
- rpi serve --run-id now matches 12-hex IDs (was misclassifying as goals)
- cherry-pick-wave.sh: pattern validation + prefix-scoped rm fallback
- -o flag contract: rename local --output to --output-dir/--output-file
on defrag, memory, context_assemble (stops shadowing root format flag)
MEDIUM fixes:
- defrag --json now emits JSON (was printing text unconditionally)
- Remove dead promote-anti-patterns from doctor suggestions
- Pin install scripts to tagged releases instead of mutable main
- Add ao doctor + skill-lint CI jobs to validate.yml
- Add learning coherence quality gate script
Process:
- Drain 7 unconsumed next-work.jsonl entries (0% → 100% resolution)
- 192 lines of new tests (TDD: test-first across all Go changes)