2261 Commits

Author SHA1 Message Date
Bo 20f9d4a338 Release AgentOps 3.7.0 (#1144)
## What

Release the prepared AgentOps update as **3.7.0**, the minor release
after 3.6.0. Align the CLI and plugin versions, regenerate the Gemini
manifest, and rename/update the curated notes and changelog links.

## Why

The operator selected a minor release. No 4.0.0 tag or release was
published. Migration instructions and the documented removed
commands/skills remain accurate.

## How I tested

- Go lint and focused version/manifest tests passed.
- Full regeneration parity, changelog mirror parity, and release-note
coverage from v3.6.0 passed.
- The exact 3.7.0 release rehearsal passed in 143 seconds; all 73 full
repository gates passed. All 12 security tools ran with zero
missing/error tools, critical findings or security-high findings;
existing advisories remain reported.
- All nine hosted checks passed on
`092e1814b6cba46cd9ac1d797dab2a5c8c7c188c`, including Go race/shuffle
tests and 1,509 executed Bats passes (31 environment-dependent skips,
zero failures). A new CLI wiring regression confirms `ao version --json`
reports the build version.
- Actual fresh native Claude/Codex 3.7.0 installs and upgrades from
3.6.0 passed with exact 34-skill inventories. Existing implementation
validation from PR #1143 remains applicable to unchanged source.
- Fresh author-distinct correction review passed for exact head
`092e1814b6cba46cd9ac1d797dab2a5c8c7c188c`, covering all changed paths
and four acceptance criteria with no unchecked scope. Verdict digest:
`e7b24a297a0b232138de011473df8be6eb3eeaf47afd1f300398eecafab2fbab`.

## Checklist

- [x] Version owners and generated metadata agree on 3.7.0.
- [x] Migration/removal guidance is preserved.
- [x] Exact-candidate release checks pass before tagging.
- [x] Fresh correction review is recorded before tagging.
2026-09-13 20:28:12 -04:00
Bo d972fa2090 Prepare AgentOps 4.0.0 plugins, skills and CLI release (#1143)
## What

Prepare AgentOps 4.0.0 across the Claude plugin, Codex plugin, skills
and CLI. Claude writers capture the supplied check status during its
original invocation, and plugin conformance verifies exact skill
membership and link destinations. Full release security now scans the
repository and blocks on Python collection failures that previously
produced a false green result.

## Why

The 3.6.0-to-current interval removes published commands and 20 skill
names, so this is a major release with migration instructions. Release
validation also exposed stale skill assertions and test prerequisites
that need to match the current product contracts without weakening
acceptance.

## How I tested

- Native Claude Opus/Haiku success, failing-check and direct-writer
trials: each check ran once, and the direct child returned plain JSON.
- Actual fresh installs and upgrades from 3.6.0 in isolated Codex and
Claude homes: 34 skills, expected agents, and exact installed package
bytes.
- Exact candidate `b721d02559e1495be6095ad97b820e88ceb4a049`: all 73
full repository gates, regeneration parity, and the complete local
release rehearsal passed. All 12 security tools ran with zero skips,
tool errors, critical findings or high-severity security findings. The
unchanged advisory policy reports 35 quality-high findings on unchanged
files.
- Python: 327 tests and 72 subtests passed. Hosted Bats: 1,509 passed,
31 environment-dependent skips, zero failures. Go
lint/build/vet/race/shuffle checks and CLI smoke/integration passed.
- All 11 hosted checks passed, including Windows correctness,
macOS/Linux installation, security, and the six-target no-publish
GoReleaser snapshot. Local archive checksums and a real macOS CLI
initialization/status/version smoke also passed.
- Fresh author-distinct review passed all four acceptance criteria and
all 35 changed paths with no unchecked acceptance. Canonical subject and
caller-intent verification passed; verdict digest
`68af2c935ed0106cd91b3950f5d168e662f4071f660fcbd113c36b7cd0f0426e` binds
manifest
`7affc77e25eaff69ba36c5ce05582b4f0385c954b76b62c02b97f97041f489b2`.

## Checklist

- [x] Breaking changes documented in the migration guide and complete
release notes.
- [x] No credentials or private runtime proof included.
- [x] Final full release checks pass on the exact candidate.
- [x] Fresh author-distinct final PASS is recorded before merge.

This prepares the release candidate; it does not publish a tag or
release.

Coverage limits remain explicit: native plugin tests used isolated macOS
homes and local marketplaces, guard installation remains opt-in, and
reader instructions do not prove sandbox confinement. Semgrep retains
pre-existing warning-level parser diagnostics. Snapshot metadata follows
the existing 3.6.0 tag; this is a packaging rehearsal, not a published
4.0.0 archive.
2026-09-13 17:21:16 -04:00
Bo 66323acc64 fix: protect session mining and ground skill feedback in evidence (#1134)
Session mining could overwrite its source when the checkpoint referred
to the same file, consume pending events during `--dry-run`, and miss
native Codex custom-tool input edits when checking for transcript
rewrites. The CLI now rejects source/checkpoint aliases before output or
writes, previews from the current watermark without persisting it, and
preserves native custom input so edits invalidate the checkpoint.
Regression controls retain normal incremental mining and legacy argument
handling.

Postmortem now accepts real goal/session evidence without requiring a
fabricated verdict file, uses current Memory ownership and protected
external storage, and separates structural checks from causal support.
Implement guidance emphasizes early representative checks and exact
repair verification. The Go standard and its local rule now point to the
actual CI complexity gate and explain its committed-file scope. Normal
projections are regenerated; no skill roots, framework or gate
thresholds were added or weakened.

The bounded evaluation used three useful coding tasks with fixed
behavior acceptance. Trial two exposed a real workflow defect: lint and
fast checks passed while CI rejected complexity 25. Checkpoint
construction was extracted, reducing MineSession to 20, and the Go
guidance was corrected before the third task. The failed attempt stays
in the evidence; this is an observational result, not proof of token
savings or superiority over native prompting. Final local Go
build/vet/test, lint, strict whole-campaign complexity and 37 selected
gates pass. [CI run
34628874411](https://github.com/boshu2/agentops/actions/runs/34628874411)
is green on `62205367e91946f84723147763662ca39ad4b580`, including Linux
race/shuffle tests, Windows, Bats and security. The independent review
checked all 27 changed paths and returned PASS with no unresolved
findings or unchecked acceptance; its earlier complexity FAIL remains
preserved. The local aggregate retains its existing skip for the absent
legacy OL test directory.
2026-09-11 17:35:50 -04:00
Bo c6558508d1 Consolidate AgentOps into a 34-skill engineering menu (#1133)
AgentOps' 55-skill catalog contained overlapping entry points, stale
routes and descriptions that could lose meaningful guidance in the Codex
projection. This change consolidates 21 roots into existing owners,
leaving 34 distinct skills and a generated, task-oriented menu. README
documents every retired name and its replacement.

Planning now establishes observable behavior in the caller's existing
intent, using proportional Given/When/Then examples and domain language.
Implementation and final validation carry those same examples forward.
Original adaptations informed by Matt Pocock's engineering skills
strengthen existing owners rather than adding a new workflow. Routine
edits need no mandatory plan, coverage report, mutation exercise or
learning artifact.

Codex retains complete source descriptions and translates explicit-only
invocation policy. All descriptions fit the existing 180-character
limit; the root instructions retain their 250-line limit. Generated
catalogs, projections, routers, moved references/helpers and their live
consumers are updated together. RPI remains explicitly selected.

Validation passed: projection/conformance checks, the local aggregate
(10 passed; one existing optional-directory skip), and exact-commit CI
covering the complete gate registry, Bats, Go build/vet/race/coverage,
Windows and security. A fresh author-distinct reviewer passed all
acceptance criteria over the complete 573-path subject at
aa642a55d6, including the installed-link
and protected-backup changes. Review findings were repaired and
revalidated. Existing ranker goldens are regression checks, not
model-quality measurements. A fixed six-case fresh-context pilot
supplied an exact candidate menu: three of four targeted cases loaded
expected guidance, a simple refactor selected no skill, and both
no-skill controls selected none. No wrong owner was selected. This pilot
preceded final wording repairs for existing ranker/context limits; it
does not establish installed automatic activation, coding benefit or
savings. No live coding task was run in that pilot.
2026-09-10 22:18:05 -04:00
Bo 4f5fd6301c Use CASS and MS for evidence-led instruction improvement (#1131)
## What

Use CASS to discover session evidence and MS to find existing skill
guidance. Reserve AO exact excerpts for an identified source-precision
gap. Correct guidance and helpers that treated repetition as success,
inferred user prompts from early line numbers, or refreshed the index
before every search.

Repeated failed prompts now remain unassessed. Native message roles
identify user prompts, search helpers preserve unavailable reads, and
recovery requires observed state before attempting repairs. Existing
CASS/MS documentation explains their respective roles without adding
another mining framework.

## Validation

- Seven focused helper behavior tests and CASS/MS skill validators pass.
- Generated projections are current. The local aggregate passed 10
groups with no failures; its absent OL integration suite was explicitly
skipped. Full AO gates passed all 73 selected checks.
- Fresh independent review caught an incomplete-status recovery edge
case. The repair, regression test, and generated copies have been
rechecked with no remaining findings; final local checks pass.
- CI passed on the exact final commit, including Linux/Windows
correctness, Go race tests, security and the required summary check.
- A bounded private exercise used three CASS query families and MS
search/full loads. It reached a justified no-change decision because
selected native sources were unavailable or did not match returned
locations. Retrieval success was not credited as learning, and no AO
extraction was needed. No private session content or locators are
included in this PR.

## Limits

This establishes retrieval and evidence-handling behavior. It does not
establish that a new instruction improves later task outcomes. The CASS
artifact validator deliberately skipped its opt-in live corpus smoke
test; the separately bounded retrieval exercise is described above.
2026-09-10 18:14:35 -04:00
Bo 36b3c00ad7 Extract bounded session evidence for instruction improvement (#1130)
## What

Extend `ao provenance mine-session` with `--view excerpts` and an
explicit instruction target. Native agents can inspect bounded
Codex/Claude records with literal text, JSON field pointers, exact byte
spans and SHA-256 identities, then propose a supported skill, AGENTS.md
or task-prompt edit. Existing event JSONL and checkpoint behavior stay
the default.

## Why

Instruction improvement needs precise session evidence. The existing
normalized parser truncates long text and does not provide bounded,
directly citable extraction. This view supplies the deterministic
reading step; native agents retain interpretation and review.

## How I tested

- Focused application and command regressions passed, including legacy
checkpoints, native message/tool forms, long Unicode text, malformed
data, continuation, limits and writer errors.
- Source-built AO extracted nine selected records from real AgentOps
sessions. All selected range hashes matched; analysis produced one
candidate prompt clarification and one justified no-change finding.
Private source material and proposals remain outside Git. This
demonstrates usability, not causal uplift.
- Go build/vet/race-shuffle passed. Full gates: 73/73 passed, including
lint. Aggregate: 10 passed, one optional absence. Generated projections
passed. All seven GitHub checks passed at
`31c128015a2e48a2a787b165e02966938381cf65`, including Linux, Windows and
security.
- A fresh author-distinct reviewer verified all eight changed paths,
exact source ranges and targets, the private proposal/no-change support,
and the clean-commit demo binary; no implementation or support findings.

The command reads explicit authorized files and writes JSON to stdout.
It runs no model, creates no index or checkpoint in excerpt mode, and
automatically edits or publishes nothing. It does not enforce
restricted-source isolation or redact output.

## Checklist

- [x] Required Go build, vet and tests pass
- [x] No private session content or credentials added to this diff
- [x] Existing event interface preserved; new flags documented
2026-09-10 17:25:45 -04:00
Bo 3213afcf1c Default to native execution and report independently accepted work (#1129)
## Change

Make native coding-agent execution the default AgentOps entry path with
zero mandatory skills. Preserve full bundles and add repeatable `ao
skills link --skill NAME` selection, validating the entire selection
before writes. Align product, installation, architecture and generated
command documentation.

Extend the existing trial readout to separate endpoint test results,
execution state and independently accepted work. Bind supplied judgments
to exact content, acceptance and native evidence. Reject empty
implementation subjects and require the caller's complete criterion ID
set before reporting acceptance. Preserve genuine nonempty and
deletion-only subjects, valid failures and missing-proof outcomes.

## Validation

- Native onboarding from empty home/consumer directories produces no
setup files; selective/full linking and failure boundaries are covered.
- Actual RED/GREEN regressions cover empty subjects and the
partial-criterion omission found by independent review.
- Full Go build, vet and race/shuffle tests; affected Go lint; 88 Python
readout/statistics tests passed.
- All 73 gates, generated projections, strict documentation build and
local aggregate passed (10 passed; one documented optional absence).
- All nine PR checks succeeded at
`7df0d42b12f35ffc22008cc10a40339afcfbb6a0`.
- Fresh author-distinct review passed all six acceptance criteria over
all 59 changed paths, with no findings or unchecked scope, after
repairing the criterion-coverage finding.

## Evidence limits

The real native coding repair demonstrates usability, not comparative
skill uplift. The strict live-session machine replay remains NOT_PROVEN
where execution/identity observations are unavailable; the source review
PASS is retained separately. Existing cohort limits and the historical
aggregate-enforcement gap remain unwaived. No new comparative cohort,
scheduler, skill-corpus deletion, memory migration or global
installation is included.
2026-09-10 20:28:22 +00:00
Bo 5e874b55cf Evaluate installed skills on isolated Go work (#1125)
AgentOps previously relied on behavioral probes and retrospective
summaries to assess skills. This adds a development-only evaluator that
runs a frozen installed skill package on isolated Go tasks, preserves
failed and interrupted attempts, and rebuilds a comparison readout from
native results without another model call.

The suite contains six task families, separate executable verifiers,
frozen launch identities, native session accounting, and a focused
`skill-eval` maintenance workflow. The readout separates passing code
from completed trials, retains incomplete cost information, and reports
missing evidence without claiming equivalence or uplift. `ao eval`
remains retired; no new runtime controller or required core skill is
introduced.

Validation: Go build/vet/race checks and all repository CI passed.
Focused reader/statistics, receipt integrity, verifier integrity,
fixture calibration, generated projections, and the local aggregate
runner passed. A real two-variant Docker preparation check verifies that
frozen worker and verifier images survive later staging.

The bounded coding pilot retained all 24 starts and produced eight
comparable pairs across six task families, with no observed paired
endpoint difference. The separate eight-start memory experiment did not
demonstrate incremental benefit and does not promote another guidance
rule. Individual runtime limits were enforced; aggregate desktop
deadline enforcement remains unproven. Raw trial evidence and
credentials stay outside Git.
2026-09-10 13:29:10 -04:00
Bo 9eb4aed225 Tighten RPI handoffs and exercise them on a Go gate repair (#1124)
## What

Clarify the existing RPI and Implement skills so delegated work
preserves consumer input selection, carries a short check list, uses
task-only runtime dispatch, and leaves final subject evidence to the
integrating caller. Exact identity, required checks, affected evidence
handling, and fresh independent judgment remain required.

Exercise the revised guidance on one real Go defect: learning-file read
errors now fail the gate with the affected path, while genuinely deleted
files retain their existing skip behavior. Routing, learning roots,
exclusions, and frontmatter rules are preserved.

## Why

The prior repair run finished successfully but repeatedly loaded context
and assembled overlapping evidence. This change refines existing skill
instructions and their architecture/projections, then tests observable
behavior with a bounded coding task. It adds no scheduler, skill,
schema, or benchmark framework; one trial does not establish general
token savings.

## How I tested

- Existing skill contract checks pass before and after; generated
projections are current.
- Go regression is RED for unreadable learning paths under both roots;
repaired tests and deletion controls pass.
- Combined Go build/race-shuffle coverage tests, coverage floor,
complexity, and local aggregate pass. Exact-source worker lint and hook
vet results are reused.
- All 52 selected gates pass. Authoritative CI passed after one
unchanged rerun of a timeout-test fixture failure; the original failure
and uncertain cause remain retained. No test tolerance or source change
was used to obtain green.
- Fresh author-distinct Codex/OpenAI validation passed every criterion
and all 13 changed paths at `dd7714ea4eee2f6525656fb70c2ac8b264a39a03`;
no actionable findings or unchecked acceptance.

## Checklist

- [x] Go build and tests pass
- [x] No secrets or credentials added
- [x] Changed skill output boundary documented in architecture and
generated copies
2026-09-10 09:51:08 -04:00
Bo 8a9a01a70a Fix Go recovery, gate routing, evidence, and handoff defects (#1123)
## What

Repair 13 audited Go CLI defects across doctor recovery, gate routing,
evidence ingestion, and session handoffs. Doctor preserves recoverable
snapshots and reports unresolved findings; gates retain exact
changed-file scope and advisory semantics; malformed evidence fails
closed; handoffs report observed Git state and chronological recency.

## Why

These failures could overwrite recovery data, skip required checks,
admit malformed evidence, or restore stale context. Each defect has a
regression witness. Existing skill contracts remain unchanged for this
bounded workflow evaluation.

## How I tested

- Regression witnesses failed before repair and pass after repair.
- Combined Go build, vet, race/shuffle tests with coverage, coverage
floor, pinned lint, and complexity checks pass.
- Generated projections are current; local aggregate reports 10 passed,
0 failed, 1 optional skip.
- All 52 selected gates pass. Authoritative Linux/Windows correctness,
security, full registry, and installation CI pass.
- Fresh author-distinct OpenAI/Codex review verified all 13 repairs and
all 33 changed paths on `84029ee533be0a73ac6c882eb9cf7369d52a0055`,
including independent critical race regressions; no findings or
unchecked acceptance.
- Directory reverse moves retain the existing advisory-lock concurrency
boundary; this does not claim exhaustive hostile filesystem-race
coverage.

## Checklist

- [x] Go build and tests pass, including race detection
- [x] No secrets or credentials added
- [x] Compatibility behavior documented in the changed contract where
applicable
2026-09-10 00:13:04 -04:00
Bo 17849bbc24 Improve CLI checkpoint recovery, evidence status, and skill search (#1120)
A failed mining-checkpoint write could truncate the saved watermark and
cause retry to replay older events. The CLI also wrote evidence to
external roots that status could not inspect. This batch fixes those
behaviors and removes duplicate normalization from skill search.

- Mining checkpoints use the existing atomic storage writer. A real
partial-write regression test proves old bytes survive and retry retains
stable event IDs. Existing mode bits are preserved; new checkpoints use
0600. Symlink and special-file destinations are rejected before reading.
Before replacement, an empty same-directory probe checks ownership and
permission metadata, including ACLs and inherited permissions.
Unverifiable or different metadata returns an error and leaves the prior
checkpoint intact. This is a conservative refusal, not ACL migration. A
directory-sync error after rename can leave the new state visible.
- `ao status --evidence-root PATH` inspects an explicit existing non-Git
store, with matching text/JSON/YAML reports, no fallback on invalid
roots, and no reads through evidence symlinks. Omitted-flag behavior
remains unchanged.
- Skill-query normalization has one implementation, preserving
repetition versus first-occurrence semantics. Nine fixed shipped-catalog
queries remain byte-identical against a source-pinned baseline.

Validation: Go build, vet, tests, race/shuffle with atomic coverage,
repository Bats and aggregate suites, regeneration, applicable gates and
lint passed. Final Linux and Windows correctness CI and all required
checks passed. A fresh author-distinct review verified every acceptance
criterion across all 23 changed paths with no unchecked scope. Nine
production-query outputs match the source-pinned baseline.

The first CI attempt exposed a test-child coverage flush under its
temporary file-size limit; the test now restores that limit before exit.
Fresh review then exposed ACL loss despite green CI. The permission
guard and native regression tests repair that defect while preserving
the original access requirement. The failure cases and repair costs are
retained in the evaluation.
2026-09-09 18:48:58 -04:00
Bo 1091de1670 Fix OKF frontmatter boundary and reduce checksum allocations (#1117)
## What

Fix the inclusive 64 KiB frontmatter limit in `ao provenance check-okf`,
which rejected valid near-limit LF/CRLF headers. Stream session prefix
checksums through a fixed buffer while preserving existing digests,
events and watermark state.

## Why

The boundary now measures header payload bytes correctly. Checksum
allocation for synthetic 1 MiB and 8 MiB tool outputs drops from
approximately 2.1 MB and 16.8 MB to 4.4 KB. Small inputs incur the
fixed-buffer cost; this is not a total-CLI memory claim.

## How I tested

Regression tests demonstrated the boundary failure before its fix.
Thirteen frozen checksum cases passed before and after the refactor; ten
actual CLI scenarios preserved exact event/error/state bytes. Go build,
vet, full tests, race/shuffle, lint, Bats, aggregate checks,
regeneration verification and applicable worktree gates passed. Fresh
author-distinct reviews covered each exact change. Existing optional
Bats skips are retained.

## Checklist

- [x] Go build and tests pass
- [x] No secrets or credentials in changes
- [x] Public APIs and output contracts preserved
2026-09-09 17:28:06 -04:00
Bo db1a0573ea Add bounded source reads and pinned OKF profile checks (#1114)
Adds two explicit read-only operations for the context delivery
lifecycle: bounded raw source reads with reversible bytes and integrity
checks, and structural checking of the pinned AgentOps OKF page profile.

Source reads require independently selected context policy and enforce a
measured serialized-output bound before emitting content. Emitted bytes
do not establish host delivery or understanding; restricted-source
processing remains unavailable without native enforcement. The OKF
checker rejects missing status and incompatible profiles, and never
grants truth, disclosure, or usefulness approval.

Validation: focused tests and Linux/Windows source-reader builds passed.
The combined candidate is undergoing the required full repository checks
and fresh independent review before landing.
2026-09-09 09:37:34 -04:00
Bo 57ece9fb7b Restore private context routes and verify native judgment receipts (#1112)
Add explicit, recoverable private context routing through `ao config
context`, binding native source, owner, task, model and destination to
existing policy and external storage. Recovery reads the original Beads
maintenance anchor; configuration reports native access enforcement as
unattested.

Add `ao provenance verify-judgments` to check required review profiles
against exact native transcript receipts, independent subject and
acceptance, distinct contexts, completion and permitted providers.
Requested identity and unreported effort do not count as runtime
evidence. The verdict schema is unchanged.

Repair the existing cleanup test: a 0.3-second budget could expire
during preparation before either fixture process started. A separate
controlled-delay test now proves preparation cannot renew that deadline.
The running-cleanup case requires parent/child readiness, preserved
partial output, the postlaunch cleanup result and both processes stopped
within its existing four-second bound. Production timeout behavior is
unchanged.

Validation: fresh author-distinct review passed the exact 55-path final
subject and all T05/T21 acceptance. The complete local Bats run passed
(1,333 passed, two existing skips), as did Go build/vet/test/race, all
72 full-mode gates, the aggregate and generated-output checks.
Ubuntu/Windows CI, security and both installation jobs passed on the
final commit. The final evidence scan found no new orphaned bindings; 73
historical bindings remain preserved. Earlier failed results and private
evidence remain outside the PR.
2026-09-08 18:57:08 -04:00
Bo 8061085c89 Ship native evidence helpers and fresh-family review defaults (#1110)
AO now performs intent snapshots, subject manifests, strict evidence
verification, atomic verdict storage, and orphan inspection through the
Go binary. The command handler keeps verification separate from
presentation so it meets the existing complexity limit. These operations
preserve the existing evidence formats, require explicit protected
storage where applicable, and run outside a checkout without Python. The
unchanged Python implementation remains a developer oracle; agents still
provide semantic judgment.

Codex and Claude skills now default to a fresh reviewer from the
author’s model family. Callers can explicitly request cross-model review
or pin its model. Reviewer adapters use a finite caller timeout or
remaining deadline instead of a fixed ten-minute default, while
retaining output limits and abnormal-termination cleanup.

Validation: Go build, vet, tests and race/shuffle tests; 1,334 shell
tests; aggregate runner; regeneration check; 72 full-mode gates.
Independent checks exercised 84 storage-boundary rejections and 21
evidence operations with an empty PATH. Both canonical and generated RPI
reference suites pass all 48 tests after updating the migrated oracle
import without weakening assertions.

Change-sensitive checks explicitly compare the final committed candidate
with the original PR base. Linux, Windows, installer, security, and
required summary checks are green.
2026-09-08 16:06:33 -04:00
renovate[bot] 10ac80e6f2 fix(deps): update module golang.org/x/text to v0.42.0 (#1111)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [golang.org/x/text](https://pkg.go.dev/golang.org/x/text) | [`v0.41.0`
→
`v0.42.0`](https://cs.opensource.google/go/x/text/+/refs/tags/v0.41.0...refs/tags/v0.42.0)
|
![age](https://developer.mend.io/api/mc/badges/age/go/golang.org%2fx%2ftext/v0.42.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/golang.org%2fx%2ftext/v0.41.0/v0.42.0?slim=true)
|

---

### Configuration

📅 **Schedule**: (in timezone America/New_York)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/boshu2/agentops).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC42OS4xIiwidXBkYXRlZEluVmVyIjoiNDQuNjkuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-08 20:06:23 +00:00
Bo af1e530159 Adopt CDLC contracts and reconcile BD tooling (#1108)
AgentOps now describes the selected Context Delivery Lifecycle alongside
standalone RPI: external reviewed memory, native work and runtime
ownership, independent validation, and explicit limits on what the
pilots proved. The active ADRs name which historical prescriptions are
superseded and which invariants remain.

This integrates the BD foundation, including doctor diagnostics that
distinguish BD from BR and protection against private tracker data
entering outgoing Git history. It also fixes skills audit resolution of
explicit relative reference paths. Source-owned projections were
regenerated, and the landed stopping behavior is preserved.

Validation: Go build/vet/test and race/shuffle, 1,325 Bats cases, the
local aggregate, and full AO gates. The gate registry reports 71 passes
and one nonblocking preamble-adoption failure on the existing report
script; that advisory remains disclosed. Historical probe receipts whose
source hashes changed remain historical evidence.

This is foundation adoption. It does not claim that the later memory,
goal, background, privacy-release, or benefit-measurement work is
implemented.

Independent Astra and Fable judgments both PASS over the exact
integrated content. Earlier negative results and their factual
resolution remain preserved in private work evidence.
2026-09-07 19:07:21 -04:00
Bo 2ef932b617 RPI flow: premortem on risky plans, finding class in the law, adjudicated splits, orphaned evidence, doc claims gated (#1104)
## RPI flow: premortem on risky plans, finding class in the law,
adjudicated splits, orphaned evidence, doc claims gated

Provenance: running the loop for real across three trains on 2026-09-03
(#1099, #1100, #1101). The spine held; the flow around it did not. A
risky-surface design shipped with no premortem and needed six repair
passes. The open finding set grew three rounds running inside one class
while the id-counting law watched. A same-family PASS and a cross-family
FAIL had no tie-break until the caller named one afterwards. Every
harness edit orphaned bound evidence with no warning until verify
failed. A doc called an egress log published while the repository's
`*.log` rule kept it out of the tree, and the same overclaim class came
back four rounds.

**What changes.**
- **Premortem at plan exit.** When the write scope hits a risky surface,
one fresh judge reads the frozen plan before Implement; a blocking
finding returns NOT_PLANNED with the findings. The caller may declare
`premortem: skip`; the report says so.
- **A split is recorded, never elected and never closed inside the
loop.** The law stands: a risky surface converges only when both legs
PASS, and no finding leaves the open set because someone chose a judge.
Plan declares `binding_judge` as the caller's disposition for a split
that survives repair; it is bound in the plan identity, carried in the
report, and never mutates the verdict. On a risky split that survives
the repair budget (never after a law stop), one council leg receives a
bounded packet marked untrusted and returns per-finding rulings, exactly
one per id, which the traversal validates and records under
`council.rulings` for the caller's next intent; the verdict and the open
finding set stay exactly as repair left them. A council closure
mechanism was built, drew a new finding class in three consecutive judge
rounds (path containment, digest exclusion, presence-as-evidence,
partial closure downgrading a FAIL), and was cut under the train's own
class rule rather than hardened again. A non-risky split stays worst-of.
- **Finding class in the convergence law.** Findings carry an optional
stable `class`. A class carried by a resolved id that reappears on a new
id with no surviving prior id carrying it is `class_reopened`, whether
or not a classless round sits between; a blank class is an invalid
round; a round can carry both a reopened id and a reopened class and
stops on either. Repair stops, the traversal returns NOT_PROVEN, and the
caller goes back to Plan, because the design is wrong, not the patch.
Same rule in `run_once.py` and `workflows/rpi.js`, driven by one shared
fixture file, with executed canaries in the cathedral gate.
- **Plan identity, and the premortem's risky test.** On a risky scope
the Plan carries `binding_judge` and the evidence it expects to orphan;
`plan_digest`, when the plan declares one, must equal the script's
digest over the acceptance, the write scope, the binding judge, and the
intent-source digest, or the traversal stops before Implement. The risky
test over a declared scope is glob intersection: witness paths, the
risky regexes over the glob with wildcards instantiated, and any literal
prefix that reaches a risky root; a bare `**` or `*` is risky.
- **Intent is verified before anything is built.** An `intent-snapshot`
receipt re-derives the digest and compares the snapshot bytes to the
caller intent before premortem or Implement; absent, mis-hashed, or
wrong stops the traversal with `plan_identity_mismatch`. The Python
reference refuses on the same rule. Declared scopes are canonicalized
(repeated `./` collapsed; absolute paths and `..` refused at plan exit),
and the four spellings of `tests/**` share one plan digest while
`tests/` does not.
- **Orphaned evidence is a receipt, not a surprise.** After Implement
and after every repair round the workflow runs
`scripts/evidence-orphans.sh` over the runtime-derived path union, keyed
on the round so a same-set repair still reruns it and appends every
scorecard and fixture set whose bound evaluator or skill digests cover
them to the check receipts the validator reads, each with a cause
(`changed_path`, `digest_drift`, `both`, `skill_changed`). Plan budgets
that recapture up front. On today's tree the receipt already lists the
08-16 and 08-26 sets whose bound harness digests moved long ago.
- **Doc claims are gated.** The stronger scan already caught one stale
claim in the tree (a 2026-06-22 harvest note calling evidence committed
after Train 2 had removed that tree); the sentence now says where the
evidence went. `docs.claims-tracked` (blocking) requires backticked repo
paths in `evals/` and `docs/evals/` markdown to be tracked, and
sentences that say published, tracked, or committed to name files that
exist.
- **Risky scope is a glob intersection, not a heuristic.** One
segment-wise `globsIntersect` over one list of risky segment globs
answers both the declared-scope question at Plan exit and the
changed-path question for the cross-family rule; two heuristic designs
missed in opposite directions and were replaced rather than patched.
- **Contracts.** rpi gains a judgment dispatch table: risky scope routes
to premortem, a risky split to council, an irreversible landing to
one-way-door as a caller choice. plan, implement, validate, premortem,
council, and learn carry their halves; learn proposes a deterministic
check for any finding class that repeats.
`docs/architecture/rpi-traversal.md` is the source of record and was
updated with the flow.

**Evidence on the tip.** Regen check clean; Go bar; full gate green with
a HEAD-built binary (the new gate fires and passes); CI's literal bats
command green; rpi unit tests; cathedral gate with executed canaries for
the class law; routing goldens; token budgets; gate-tightening ratchet;
coverage 1 of 12 unchanged.

**Judgment, stated plainly.** Six judging rounds, each on a frozen tip.
The caller elected Fable 5.1 as the binding validator; its round-6
verdict is PASS with no verdict-driving findings (lows: a council
payload outside the schema throws a raw error instead of recording
`invalid-rulings`; two stale comments; a dead parameter; a dead fixture
element; the contracts say exactly one ruling per finding while the code
enforces at most one). The cross-family Codex read of the same tip
failed on three input-validation items, which the final commit closes:
control characters are now refused on the original scope value with the
full Unicode control class and the caller scope is canonicalized in
place so one spelling reaches every prompt; the intent receipt no longer
forgives a trailing-newline difference; and the Python reference accepts
a digest string only from a verifier callback and matches digests with
`fullmatch`. One half of one Codex item stays open and is disclosed: the
workflow does not itself hash the caller intent's bytes to compare with
the plan's declared digest (it relies on the receipt's exact-bytes match
plus digest equality); binding that locally means every probe fixture
carries a real digest of its intent text, which is the next pass. Also
open, pre-existing and outside this train: the risky-surface list names
`lib/**` while the preamble every gate sources lives under
`scripts/lib/`. Across the rounds the loop behaved as designed once: the
council closure mechanism drew a fresh finding class three rounds
running and was cut under the train's own class rule instead of hardened
a fourth time.
2026-09-05 23:03:51 +00:00
Bo 10f0277bdb Legible membrane, Train 2: what a stranger meets (#1100)
## Legible membrane, Train 2: what a stranger meets

Provenance: the 2026-09-02 field audit of this repo against
mattpocock/skills, compound-engineering, and the jsm corpus, findings F5
through F9. This train is sized by a consumer inventory built with `rg`
on the tip before any lane was written; the promoted-set directory move
the audit proposed is deferred because that inventory shows
skill-builder backing two blocking gates, swarm pinned by the cathedral
gate and a routing golden, using-gc required by Go code, and `ao skills
link` unable to install a second root. That inventory is the plan for a
later train.

**What changes.**
- **Archival sweep by consumer disposition.** 172 audit snapshots, 29
pawl receipts, the `evals/workbench` and `evals/membrane` trees with
their two bats consumers, four stray scratch docs, four retired eval
contracts, and nine caller-less `scripts/check-*.sh` are deleted; git
history is the archive. Every machine list that referenced them is
pruned (evidence-grounding baseline, preamble grandfather, broken-links
allowlist, `.gitattributes`, `.gitignore`, two eval fixtures, the
workflow-coverage deferred list). `docs/audits/manifests/` and
`.agents/ao/config.yaml` survive because they have live readers. About
48,000 lines.
- **Three skills retired.** `goals` (alias of fitness), `shared`
(tombstone), and `scope` (folded into plan step 3 as five write-scope
checks). Consumers edited; the probe denominator exclusion for goals
pruned; Codex package and golden count pins updated.
- **Negative routing** on research, codebase-recon, reverse-engineer,
premortem, one-way-door, and council, all within the 180-char budget,
with a teardown golden (`rq-08`). One wording was changed after the
router's prefix stemming showed "repository teardown" leaking into the
wrong skill.
- **Every promoted skill answers "It's working if"** with observable
tells in backticks, and carries a paste-ready `## Prompt` with a
concrete subject. Two fictional `ao` subcommands a draft prompt named
were caught by the body-ref validator and replaced with real commands.
- **Doctrine diet on the core five.** rpi, plan, implement, validate,
and anti-ceremony drop from about 5,100 words to 3,600 (bodies from
4,700 to 3,150) by moving the shared ownership boundary, dated
incidents, and mechanics tables into step-loaded references
(`skills/rpi/references/boundaries.md`,
`skills/validate/references/mechanics.md`,
`skills/plan/references/ground-truth-routing.md`). Every cathedral
canary and every skill validator grep survives unchanged.

- **ADR-0018** records the goals, shared, and scope retirement; the
cathedral gate tombstone and the routing goldens cite it instead of
ADR-0017.
- **Router and twins.** `ao skills find` holds a description's "Not for
X; that is <sibling>." sentence out of its haystack, so premortem no
longer ranks first for "is this live decision reversible" (golden
`rq-10` pins the reciprocal of `rq-02`); a penalty variant was tried and
reverted because it suppressed skills the caller named outright. A
declared trigger phrase of two or more words quoted whole in the query
now earns the name weight once, so "check this change" lands on validate
rather than on reality-check's name token; a live-catalog test pins
seven such queries. Single-quoted YAML descriptions unescape `''`. The
Codex catalog keeps the exclusion sentence, and a closing `>` no longer
turns `<run-id>/codebase-recon.json` into an invocation.
- **Residue the judges found.** handoff, learn, and status open a `##
Contract` heading after their tells; validate's prompt names its helper
at `skills/validate/scripts/validate.py`; the explicit-skill prompt
catalog names only live skills (five stale prompts replaced by nine,
floor 20 restored, TESTING.md names the suite); the corpus-delta receipt
binds the runner's path and SHA-256 and labels a `live_agent` claim as
an unverified caller declaration; the probe README and ledger describe
the 12-skill denominator; SKILL-API counts 30 of 54.

**Evidence on the tip.** Regen check clean; full gate green with a
HEAD-built binary; CI's bats command green; Go build/vet/test green;
lint clean; security gate quick PASS; docs-build warnings did not rise.
Fresh validation by Fable 5.1 (caller-elected) and a cross-family read
by Codex, both recorded in the PR thread.

---------

Co-authored-by: Bo <bofuller55@gmail.com>
2026-09-03 19:52:55 +00:00
Bo 568e99d436 Loop restore: converge and crank as control flow under the verdict contract (ADR-0017) (#1099)
## Loop restore: converge and crank as control flow under the verdict
contract (ADR-0017)

Intent source: `docs/plans/2026-09-03-loop-restore.md` (in this PR).
Decision record:
`docs/adr/ADR-0017-loop-as-control-flow-not-knowledge.md`.

**Why.** The 2026-07-14 single-pass cut (`482307762`) removed the
iterate loop (discovery, crank, converge, evolve, the learn write-half)
together with the unproven compounding claim, although ADR-0011 demoted
only the latter. The control flow was never demoted, and its absence
showed on 2026-09-02, when a three-lane fix needed eight validators and
two stops because the contract had no repair phase. This restores the
loop as control flow and nothing else: no knowledge store, no `ao
converge`/`ao crank`, no evolve, no canary. ADR-0004 and ADR-0011 stay
in force.

**What changes.**
- **RPI gains a bounded repair phase.** On `FAIL` or `NOT_PROVEN` with
findings, repair and re-validate freshly under the convergence law:
caller-declared `repair_rounds` (default 2); open finding set keyed by
stable `findings[].id`, union across validator families, non-growing; no
closed id reopens; the subject digest changed or, for `NOT_PROVEN`, new
digest-bound evidence resolved a named gap. Converged = fresh PASS plus
cross-family PASS on risky surfaces. Plan and Implement keep their
single dispatch. `skills/rpi/scripts/run_once.py` models the law as pure
data (33 tests): rounds are validated for shape (digest required, no
duplicate ids, no PASS with findings, no FAIL without findings),
condition 4's evidence branch needs a NOT_PROVEN previous round, a
non-FAIL current round, new evidence, and a resolved finding, and a PASS
over unchanged bytes after a FAIL is a flip that reports NOT_PROVEN.
`workflows/rpi.js` runs validation as legs (spawned or external primary,
plus a caller-supplied `crossFamily.command` on risky surfaces) merged
worst-of with a union of stable ids; a risky surface without a
cross-family leg is `diversity_unsatisfied` and never converges or
enters repair; a failed repair or re-validation returns NOT_PROVEN with
no stale verdict. Validators return `subjectDigest`, stable finding ids,
and `evidenceRefs`.
- **crank returns as a thin wave executor** (113 lines): the caller
selects the wave and the repair bound, crank invokes RPI per lane
(parallel only on disjoint write and regen scopes), runs the wave
acceptance once, returns evidence, and stops. No retry, budget, queue,
claim, lease, Git, closure, or next-work ownership. Routing golden
`rq-07-wave-execution` ranks it first.
- **validate is cross-family by default on risky surfaces**
(`cli/internal/gates/**`, `scripts/check-*.sh`, `tests/**`,
`skills/*/scripts/**`, hook policies, `lib/**`, security-scanned paths)
with the LAW-0 dispatch table: Claude orchestrating uses read-only
`codex exec`; Codex orchestrating uses an interactive Claude session in
an NTM pane, never `claude -p`. No live adapter means
`diversity_unsatisfied`, which on a risky surface is `NOT_PROVEN`. The
full literal CI command set runs once on the final integrated subject;
routine rounds keep the receipt-driven freshness contract.
- **Conformance assertions flipped under ADR-0017 only:**
`scripts/check-cathedral-cut-conformance.py` (crank live; "Stop
regardless" replaced by positive canaries for the law's four conditions;
a bounded `for` loop that compares against `repair_rounds` is required
in `run_repair_phase`, and the gate executes the law's canaries against
the reference behavior), `workflows/rpi.js`,
`skills/rpi/scripts/validate.sh`,
`evals/agentops-core/rpi-behavior.json`,
`skills/rpi/references/rpi.feature`. Every single-pass public surface
(README, AGENTS.md, PRODUCT.md, CI-CD, agent-workflow-reference,
rpi-traversal, cli/README, quickstart and demo commands, the
operating-contract and product-boundary bats, the Codex-description
oracle) now states repair to convergence.

**Known approximation, disclosed.** The Claude conveyor has no
deterministic shell primitive, so changed paths are derived by the fresh
validator (git status and diff against the clean pre-run tree) and
unioned with the implementer's report; risk is classified over that
union and unreported paths are coverage findings. A validator is still a
model; runtime derivation outside every agent is a follow-up. Family
distinctness of the cross-family leg is asserted by the caller's choice
of command and not verified by the script.

**Not in scope.** Premortem stays a single advisory judge and Plan still
only names the first check (phase boundaries unchanged). No `verdict.v2`
or `rpi-report.v1` change. The loop's own effect on outcomes is
unmeasured and owed a seeded-defect probe, like the rest of the corpus.

**Evidence on the tip.** Regen check clean; full gate green with a
HEAD-built binary; CI's bats command green; Go build/vet/test green;
golangci-lint clean; security gate quick PASS; one fresh validator over
the whole diff; one cross-family read of the design before
implementation (13 findings folded) and two of the integrated diff (9
findings in round one, 11 by round two, 15 by round three, each round
repaired and re-reviewed; the fresh validator passed the tip after round
two and the final tip 1e8adb72d passed a fresh validator (14-scenario
independent harness of the law, full gate 71/71 with a HEAD-built
binary, CI bats 1164/0) and a cross-family read by Gemini 3.8 via AGY,
which closed all six remaining residues with no new findings; Codex was
unreachable at push time).

**Follow-ups filed from the final reviews, not blockers:** the JS
violation check tests growth before reopen while Python tests reopen
first (same stop, different label when both occur in one round);
`cli/testdata/compatibility-baseline/families/{demo,quickstart}/case.json`
assert help-text substrings Cobra never prints (pre-existing, no
consumer); runtime derivation of changed paths outside every agent in
the Claude conveyor.
2026-09-03 15:16:08 +00:00
Bo e556834d3d Legible membrane, Train 1: Codex projection, executable entry points, green run-all, honest runtime docs (#1097)
## Legible membrane, Train 1: fix what ships

Intent source: `docs/plans/2026-09-02-legible-membrane-plan.md` (added
in this PR). Provenance: the 2026-09-02 field audit of this repo against
mattpocock/skills, compound-engineering, and the jsm corpus.

Three defects a stranger hits today, all verified on `main` before the
change:

1. **Codex projection truncated 51 of 56 skill descriptions mid-clause**
(`scripts/codex-sync.sh` capped prose at 44 chars, so the Codex router
read "Freshly judge whether a finished change is Triggers: …"). Now:
first sentence of the source prose plus the full `Triggers:` clause,
abbreviation- and quote-aware; the per-catalog bound is computed live as
"Codex prose average may not exceed Claude's" (cross-multiplied,
floor-free) with a 180-char hard ceiling. `using-flywheel` is exempted
from runtime-phrase rewriting so its cross-runtime text projects
verbatim. The dormant `ao codex ensure-start` emitter and the `# /x`→`#
$x` title rewrite are removed. A literal oracle pins five twins and a
rule oracle covers all 56.
2. **23 shebang-bearing shell entry points were committed
non-executable**, including `scripts/regen-all.sh` and three gate
scripts. Now `100755`, with an advisory gate `shell.exec-bits`
(fast+full, fail-closed on enumeration error, reads the index blob,
skips symlinks by stated policy).
3. **`tests/run-all.sh` was red on `main`**: the GOALS validator
asserted a pre-08-25 file shape, and validate's description exceeded the
180-char budget. The validator now parses only the `## Gates` block
(stops at any heading, like production), requires cited script paths to
exist, takes its path via argv, and fails closed on tokenization; four
negative fixtures. validate's description is 177 chars and gains the
reality-check negative. `AGENTS.md` quotes CI's authoritative bats and
Go commands.

README and `docs/install-day2-ops.md` replace "No other runtime is
required" with a runtime table derived by reading each skill's procedure
(HARD / OPTIONAL / conditional), covered by a bats test that grounds
every HARD row in an invocation line.

Evidence on the tip: full gate 71/71 (HEAD binary), CI's bats command
green across `tests/scripts/*.bats`, `tests/run-all.sh` green, Go
build/vet/test green, golangci-lint clean, security gate quick PASS,
`scripts/regen-all.sh --check` clean. Each lane was validated by a fresh
context; the integrated train had two cross-family (Codex) review rounds
and every finding is closed on this tip.

Out of scope (successor intent): promoted set / `skills-internal/`, the
process-artifact sweep, "It's working if" blocks, routing clusters,
doctrine diet. One pre-existing drift noted for a follow-up:
`packs/agentops-executor/agents/validator/skills/validate/SKILL.md`
carries a stale third description that no gate binds.
2026-09-02 23:29:33 +00:00
renovate[bot] 3cb39ab1b1 chore(deps): update go toolchain directive to v1.27.1 (#1094)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [go](https://go.dev/)
([source](https://redirect.github.com/golang/go)) | toolchain | patch |
`1.27.0` → `1.27.1` |

---

### Configuration

📅 **Schedule**: (in timezone America/New_York)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/boshu2/agentops).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC40OS4wIiwidXBkYXRlZEluVmVyIjoiNDQuNDkuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-01 20:18:55 +00:00
Bo e69144d6d1 Train 2: seeded-defect probes + gate hardening — the instrument catches its own contamination (#1088)
> **⚠ Open review residues — merge is Bo's call (spiral stop: second
non-PASS on this train's intent).** The cross-family re-check affirmed
the substance (contaminated fixture reproducibly UNMEASURED with four
real reads; all six scorecards match fresh replay; coverage honestly
12/12; single-level rule strictly tightening; 70/70 gates; full suite,
lint, validators green) and states plainly that **the zero-result
acceptance miss is not the reason for failure**. What failed, each with
its fix:
> 1. `evals/skill-probes/LEDGER.md:71` + `RUNBOOK.md:75` — a summary
block my withdrawal sweep missed still says "Exactly one row was earned…
1/12… council SEPARATED… worked for one of four". Fix: rewrite that
block to the post-withdrawal truth (zero rows earned, 12/12, council
UNMEASURED pending a second level).
> 2. `scripts/lib/probe-fixture-metadata.py` — the contamination
docstring overclaims: "a failed attempt loaded no bytes" is false for
`cat …SKILL.md; false` (read succeeds, compound exits nonzero), and
glob/copy-then-read indirection evades. Fix: state the detector's honest
boundary (exact-string, final-exit heuristic; evasions listed) — the
mechanism is a floor, not a seal, which the RUNBOOK already says.
> 3. **Caller decision:** the `scripts/probe-skill.sh` stderr-literal
exclusion is validator-verified fail-closed but sits outside L2's
declared write scope — it needs your explicit scope blessing (or
reversion, which re-voids all live dispatch on codex-cli ≥ 0.14).
> 4. Minor, for the record: my commit message reports security-gate
quick PASS (true in my run); the re-checker's environment reported
WARN_QUALITY from a missing radon + a govulncheck toolchain mismatch
unrelated to this diff — and the grounding gate's dead-SHA class is
UNCHECKED on shallow clones, including both our checkouts.

> **Acceptance status, told straight: L2's plan clause ("≥ 2 skills move
off UNMEASURED") is NOT met — the honest count is zero.** The lane filed
one BEHAVIORAL row (premortem); its fresh validator dumped the committed
transcripts and proved every rep, both arms, had fetched the skill off
disk mid-run — the separation was band-spray variance between two arms
holding the same bytes. The row is withdrawn, the ledger honestly reads
12/12 unmeasured again, and the train's deliverable became something
better than the number: the harness now mechanically catches that
contamination class forever. Merge is Bo's call.

## What

Train 2 of the [instrument-panel
roadmap](docs/plans/2026-08-26-instrument-panel-roadmap.md):
seeded-defect probes for the judgment spine (L2) and gate hardening
(L3), plus one repair commit responding to L2's validator findings.

**L3 — gate hardening** (`instrument/gate-hardening`, lane verdict
**PASS 11/11**)
- `gate.tightening-ratchet` (advisory): diffs `BASE_REF...HEAD` and
fails on six textual loosening shapes in the gate surface unless a
`Gate-Loosen-Reason:` trailer justifies it; tightening always free.
Detection boundary documented in the script header — silent on semantic
weakening it cannot parse, fail-closed on what it can.
- `evidence.grounding` (advisory): mechanical scan of `docs/audits/**` +
`docs/evidence/**` for cited paths that don't exist, unresolvable
full-length hashes, and scaffold leaks. 45 real findings on the live
tree, each **baselined with its argument** (directory-pinned baseline
with the added-line rule as teeth: a finding on a newly-added line is
never excused). One genuine live defect surfaced:
`docs/evidence/membrane-receipts.md` claims a generator that no longer
exists.
- Registry 68 → 70; `ao gate check --full` 70/70.

**L2 — seeded-defect probes** (`instrument/seeded-probes` + repair
`927be2184`)
- Four tier-2 probe packages (validate, premortem, council,
one-way-door): sub-40-line realistic artifacts, two planted defects
each, `canonical-skill` treatment, act-grading discriminators calibrated
both directions (21 hand-written transcript cases) — the lane's
validator wrote its *own* counterexamples and the discriminators held.
- 28 live dispatches (gpt-5.6-luna, low + xhigh) through the sanctioned
executor with `CODEX_HOME` isolated. Six immutable v3 fixture sets
replay deterministically.
- **What the run actually measured:** `one-way-door` and `validate`
scenarios SATURATED (retired to the RUNBOOK, no ledger rows — the
headroom gate doing its job); `council` was measured at one level and
the lane *refused* to file the row the gate's labeling bug would have
allowed ("filing it would have laundered a void row into the acceptance
number"); `premortem`'s BEHAVIORAL row was filed, then **withdrawn**
when the validator proved contamination.

## The repair commit (one bounded round, per the plan's validation
strategy)

- **`skill-read-contamination`**: `classify_bytes` now degrades any rep
whose transcript shows a successful command reading a `SKILL.md` — one
insertion covering live and replay. RED proven against the committed
contaminated fixture (replayed BEHAVIORAL before; UNMEASURED 0/0 after),
bats case added (probe-skill 37/37). The six scorecards were false
records under the rule: deleted (the harness's immutability guard
rightly refuses overwrite; git keeps the bytes) and regenerated —
contamination turned out broader than the lane knew (validate lost both
arms at xhigh, one treatment rep at low; one-way-door lost an xhigh
rep).
- **Headroom gate single-level fix** (L2's disclosed gate finding): a
group measured at one effort level whose control aced it is now
UNMEASURED ("capture a second level before any verdict row"), not
SEPARATED. RED test first; strictly tightening; the council group now
reads honestly.
- LEDGER row → WITHDRAWN with the full story; RUNBOOK's two falsified
sentences corrected; `CODEX_HOME` isolation documented as proven
insufficient, the transcript-level trap as the floor until dispatch is
sealed at the filesystem.
- Ride-along accepted with justification (validator-verified
fail-closed): the harness's stderr rule now excludes exactly one
whole-line literal — codex-cli ≥ 0.14's own "Reading prompt from
stdin..." announcement, which was degrading 100% of live reps on a clean
exit.

## Evidence

Full Go suite exit 0 · go-lint clean · `ao gate check --full` **70/70**
· security-gate quick **PASS** · four skill validators · probe-skill
37/37 · headroom 10/10 · tightening-ratchet + grounding bats green ·
`regen-all.sh --check` current. Per-lane fresh validators (L3 PASS; L2
FAIL → this repair); cross-family Codex verdict on the integrated train
recorded in the session report.

## What this train proves

The membrane worked on its own measurement pipeline, three layers deep:
the lane refused to launder a void row; the fresh validator caught
contamination the lane's isolation missed; the repair turned that catch
into a permanent mechanical trap. The cost is the honest headline — zero
skills measured — and the asset is that the *next* live wave runs
against a harness that cannot silently repeat any of this.

## Follow-ups

- Seal live dispatch at the filesystem (arms must not be able to read
any skill corpus) — then re-run the premortem and council waves for real
measurements; council additionally needs its second effort level.
- `docs/evidence/membrane-receipts.md` generator claim (surfaced by
evidence.grounding).
- The `Gate-Loosen-Reason` ratchet does not yet cover
`scripts/probe-skill.sh` — the stderr-literal class belongs under it.

---------

Co-authored-by: Bo <bofuller55@gmail.com>
2026-08-28 15:47:54 +00:00
Bo 8cdcb5a903 Train 1: measurement substrate, context diet, retrieval-eval contract (instrument-panel roadmap) (#1087)
> **Residues closed on the caller's merge instruction** (`499d916a6`):
the round-2 findings were the same failure shape — round-1 repairs
patched cited lines instead of sweeping the class — so this commit
sweeps each file whole: every remaining SATURATED-row-append site in
skill-eval now routes to RUNBOOK retirement, the human-only-skills
*description* is runtime-conditional, premortem's "(MEASURED)" label is
gone, SKILL-API's context table carries all 25 rows and the enforcement
table gains `disable-model-invocation`, and the fixture-identity claim
is stated precisely (probe id, honesty note, and control arm are the
only differing fields — as the acceptance permits). Post-sweep:
validators, full Go suite, 68/68 gates, goldens + headroom bats green,
projections current, gemini in sync. Merging per Bo's instruction.

## What

Train 1 of the accepted [instrument-panel
roadmap](docs/plans/2026-08-26-instrument-panel-roadmap.md) (intent
landed at `986a4feaf`): the measurement substrate, the skill-context
diet, and the retrieval-eval contract. Three worktree-isolated lanes,
each independently validated by a fresh context, plus one integration
commit. 103 files, +5,510/−76.

**L1 — measurement substrate** (`instrument/measurement-substrate`)
- Gate `skill.probe-headroom` (advisory, Fast|Full): answers the
question `skill.probe-coverage` cannot — not "does a probe result exist"
but "could one have existed at all". The rule, ported to Go
(`cli/internal/probeheadroom` + `cli/cmd/probe-headroom` behind a thin
check script — the witness-crosscheck pattern, **no new `ao` root
command**): control arm ≥ 0.75 with ≥ 2 usable reps at ≥ 2 effort levels
⇒ SATURATED (void row, not an honest null); UNMEASURED outranks it;
treatment-silent ⇒ FLOOR; else SEPARATED. RED first: both committed
fixture pairs read `INERT` to everything else in the repo; the failing
separation test predates the implementation, and a bats negative-control
swaps fixture bytes and asserts the gate flips.
- **First reading on real data: 7 of 11 historical probe groups are
SATURATED** — including both `validate-not-proven` runs. Those INERT
rows were never honest nulls; they were void. The 0/12 ledger number now
argues itself.
- Declared denominator for probe-coverage:
`scripts/.skill-probe-denominator-exclusions`, fail-closed parser (entry
without an argument, stale slug, or duplicate ⇒ exit 2). One entry
(`goals`, a pure alias-of `fitness`). Net effect deliberately zero (0/12
→ 0/12: alias left, `one-way-door` entered) — the gain is a declared
number, not a better-looking one.
- Re-landed from the recovered clean-room commit (`9872483bd`),
re-validated against *current* main: `skill-eval` (defers saturation to
the gate id; its shell scripts dropped, not shipped — ratchet intent),
`route`, `one-way-door`, premortem reversibility check, council
`caller_challenge` (schema + validator, per the agent-core boundary that
the panel may challenge, never overrule).

**L4 — context diet** (`instrument/context-diet`)
- `disable-model-invocation: true` on 4 human-only skills (key verified
verbatim against Anthropic's docs). The plan guessed 35 candidates; the
graph said otherwise — 23 carry `user-invocable: true`, and 19 of those
are excluded on cited evidence (rpi consumes
anti-ceremony/implement/plan/validate; workflow scripts reach others;
`goals` is a live migration tombstone). The exclusion evidence is
retained in the lane report.
- One router skill (`human-only-skills`) — the single always-loaded
description that replaces four; it hints, never fires.
- `.out-of-scope/` formalized with this week's three refusals
(checked-in knowledge corpus; ee self-improvement loops; whole-skill A/B
as the measurement unit), each citing its evidence.
- Deterministic proof, no model eval: before/after bytes of
always-loaded description load reported in the lane summary.

**L5 — retrieval-eval contract** (`instrument/retrieval-contract`, lane
verdict PASS 10/10)
- `AGENTS.md` federated row now names **ee (eidetic-engine)** as a
concrete caller-selected memory system — consume, never build; symlink
intact.
- `schemas/pack-quality-expectations.v1.schema.json` + 4 routing goldens
+ `scripts/check-routing-probe-goldens.sh` graded against `ao skills
find`, wired as an **advisory** nightly job. Zero goldens is a failing
state — no new zero-denominator green.
- **The instrument caught a real miss on day one — and its own
prescription fixed it.** Golden `rq-04` expects `validate` for "judge
whether this finished change is actually proven before I merge it"; at
authoring, `ao skills find` ranked the *forbidden* `premortem` first and
`validate` nowhere in six natural phrasings. The pointer-wording-first
repair (validate's description gained the caller's own words: finished,
proven, verdict, merge) now ranks it #1 at 0.333; grader 6/6, and the
golden pins the repair — a description regression reopens it.

## Integration

`regen-all.sh` once over the merged lanes (catalog 52 → 56, four new
codex twins, mesh, router, manifests); `skills/route/SKILL.md`
catalog/router links became prose repo-root references (the projected
twin cannot resolve `../catalog.json` — this was both the
portable-conformance failure and the sole broken doc link);
`codex-portable-conformance.bats` pin 52 → 56.

## Evidence

- `cd cli && go build ./... && go vet ./... && go test ./...` exit 0 ·
`ao gate check --full` **68/68** · four skill validators PASS ·
probe-headroom / routing-goldens / probe-coverage bats PASS ·
`regen-all.sh --check` all current.
- Per-lane fresh validators re-ran every suite on detached content; L5
PASS; L1/L4 NOT_PROVEN solely on the projection-regen clause reserved
for integration (their remaining acceptance observed green), settled
above. Cross-family (Codex) review of the integrated diff recorded in
the session report.
- Two disclosed scope stretches accepted at integration: a one-line
`.gitignore` entry mirroring the witness-crosscheck precedent, and the
probe LEDGER.md fact-correction L1's own change made necessary (noted
for Train 2's L2, which owns that file next).

## Cross-family review (Codex, fresh context)

Round 1: **FAIL** — two blockers (the RED fixtures didn't isolate the
control arm; the goldens grader was red where the plan's acceptance says
green) and eight majors (contract contradictions in the re-landed
skills, a converter-substitution false claim in the codex router twin,
two overreaching `.out-of-scope` entries, stale SKILL-API counts). All
repaired in one bounded round (`db68935a3`): fixtures now byte-identical
outside the control arm, the routing miss actually fixed rather than
tolerated, every cited contradiction reconciled at the source and
re-projected. Post-repair: full Go suite exit 0, `gate check --full`
68/68, all validators and probe/goldens bats green, projections current,
gemini byte-identity restored. Focused re-check verdict recorded in the
session report.

## Follow-ups (Train 2, already planned)

Seeded-defect probes for the judgment spine (every ledger row citing a
passing headroom pre-screen) and the gate-hardening pair
(`Gate-Loosen-Reason` tightening ratchet; mechanical
grounding-validation over evidence docs). Plus, surfaced by this train:
a latent `valid_keys`/schema divergence in `validate-skill-schema.sh`
(two keys the schema defines are absent from the script's allowlist —
pre-existing).
2026-08-26 23:16:51 +00:00
Bo 2207c5b278 estate: goals fail-closed, contract map, verdict guard, workflow + docs honesty (5 lanes) (#1083)
> **Review findings closed.** The re-check's residue (`perl -pibak`
bundled-cluster bypass) is applied in `2675bb383`: the perl alternation
accepts any non-space run after the in-place flag, a new FIRE bats
proves the deny, 48/48 policy-dispatch bats green, codex twins
regenerated. Merging on Bo's instruction.

## What

Five semantic lanes from the 2026-08-23 estate audit, each implemented
in an isolated worktree and independently validated by a fresh context,
plus one integration-fixup commit.

**1. Goals: the zero-denominator green is dead** (`estate/goals-honest`)
`GOALS.md` lost its Gates table in the 07-14 cut, so `ao goals validate`
reported `Valid: true` with `GoalCount: 0` in the release smoke on every
push. Now: zero parsed goals ⇒ `Valid: false` with an actionable error
(RED test first); `GOALS.md` carries a real 6-row Gates table whose
every `Check` was executed via `ao goals measure` before shipping;
`goals-affects-files.yaml` pruned of dead ids; the smoke asserts
`goal_count ≥ 1`. Two of the eight fitness properties
(behavior-before-activity, stop-boundary) have no executable check yet —
disclosed in GOALS.md rather than faked.

**2. Front door: the contract file gets a map** (`estate/front-door`)
`AGENTS.md` had zero build/test commands and zero layout — the Go
mechanics lived only in `.claude/rules/go.md`, which Codex (the declared
default runtime) never loads. Added a terse "Repository map and
mechanics" section; compressed the architecture-poetry opener to plain
language; README opens with what-it-does, the maintainer binary install
moved to `docs/install-day2-ops.md`, and the quickstart now ends with an
invitation to open an issue with your verdict. Deleted the dead
`.claude/CLAUDE-base.md` + `build-claude.py` pipeline (zero consumers
since June). `CLAUDE.md` remains a symlink to `AGENTS.md`.

**3. Hooks: first policy that guards the user's invariant**
(`estate/hooks-invariant`)
All four shipped policies guarded this repo's own artifacts. New
`core.verdicts:hand-edit` denies Edit/Write/Bash hand-writes into
`.agents/ao/verdicts/**` — verdicts are content-addressed evidence
written only by the validate flow. RED committed before GREEN
(`d264682c0`); bats prove deny on hand-writes and allow on reads,
intents, and the sanctioned `validate.py` writer. The lane shipped with
in-place editors disclosed as un-matched; the cross-family review
treated that as a blocker and the gap is closed in this PR (see below).

**4. bdd-foundry stops instructing dead commands**
(`estate/workflows-fix`)
The R4 phase told agents to run `ao yield emit`; Phase 5 said pull
holdouts via `ao scenario`; comments cited `ao membrane derive-checks` —
all tombstoned, so R4 failed on every run. Emission is dropped per the
tombstone's guidance (observation stays in the workflow result), Phase 5
grades in-run ground truth plus any caller-supplied register scenarios,
and the lane's initially-overreaching "there is no external holdout
register" wording was caught by its validator and corrected in
integration. Bonus: `workflow-scripts-syntax.yml` globbed the gitignored
`.claude/workflows/` (matched nothing in CI since inception) — now
checks the tracked `workflows/` tree.

**5. Docs honesty: retired vocabulary stops reading as live**
(`estate/docs-honesty`)
`intel_scope` removed from all 24 source SKILL.md + fixture + template +
tutorial (declared by half the corpus, read by zero Go); the schema
keeps accepting it for old-shape third-party skills but now
self-describes as deprecated. `docs/SKILL-API.md` no longer presents
`INTEL`/flywheel/forge/push/ratchet as live.
`docs/knowledge-flywheel.md` states design-vs-implemented truthfully.
ADR-0014's dead link fixed. 25 drifted `images/gemini/skills/` copies
re-synced byte-identical per that bundle's own README contract. All
codex projections regenerated once at integration (`regen-all.sh
--check` passes).

## Evidence

- `cd cli && go test ./...` exit 0 · 4 skill validators PASS ·
`policy-dispatch.bats` + `cross-runtime-hook-baseline.bats` PASS ·
`check-doc-hooks-drift` + `check-hookless-cold-start` PASS ·
`validate-goal-count` PASS · `node --check` on all 8 workflow scripts
PASS · `regen-all.sh --check` PASS
- From repo root: `ao goals validate --json` → `valid: true, goal_count:
6`; from a wrong cwd it now fails closed instead of reporting green.
- Each lane branch carries its own commits; merge commits preserve the
lane structure. Fresh per-lane validators re-ran every suite themselves;
the one FAIL each (workflows wording, cross-lane doc fallout) was fixed
in the integration commit, not waived.

## Cross-family review (Codex, fresh context)

First pass: **FAIL** with one blocker — the new verdict guard explicitly
excluded in-place editors, so `sed -i` silently mutated digest-named
evidence (dispatcher probe returned exit 0). Repaired in `f53945c26`
(one bounded round): three FIRE bats observed RED before the matcher
landed (in-place sed, in-place perl, file deletion), two negative bats
prove reads never fire; policy rationale and SKILL.md updated; codex
twins regenerated; 47/47 bats green. Everything else in the first pass
was affirmed (goals behavior, symlink/build bar, zero retired verbs in
workflows, byte-identical gemini copies, current projections). Focused
re-check: blocker confirmed closed via the dispatcher probe; one regex
corner (`perl -pibak`, header note above) stopped the loop under the
spiral rule.

## Follow-ups (not in this PR)

- `workflows/bdd-foundry.js` `SKILL` constant points at
`skills/behavior-first-planning/SKILL.md`, which was retired in v3.3 —
every phase prompt references a dead path (pre-existing). Needs a design
call: restore the phase discipline inline or repoint honestly.
- Verdict-guard: the noclobber override redirect (`>|`) remains the one
disclosed unmatched write shape.
- `docs/UPGRADING.md` note for third parties still declaring
`intel_scope` (schema accepts, nothing reads).
2026-08-25 03:39:53 +00:00
Bo ffb9f122af refactor(cli): delete the unconsumed eval/redact surfaces — the estate audit's mechanical cut (#1082)
> **Review findings closed.** The re-check's residue (app-seam family
count) is applied in `9a2790ae7` along with the full-tier CI
settlements: regenerated documentation index (generated file, hand-edit
drifted it), regenerated CLI-surface count fixtures (top=18 sub=44
all=62), `Test-Removal-Reason` trailer for the deliberate test
deletions, and the release-tag bats output list updated to the real
changes-job set. 67/67 full-tier gates green locally. Merging on Bo's
instruction.

## What

Deletes the provably-dead 28% of the `ao` CLI and every reference to it,
per the 2026-08-23 estate audit. −19.5K lines in the lane commit plus
integration fixups.

**Removed (each with zero live consumers, verified by consumer-grep +
`go list -deps`):**
- `ao eval` — 13 subcommands, ~10.9K LOC. Its would-be consumers were
already tombstones (`scripts/eval-agentops.sh` printed `RETIRED`),
`release.yml` hardcoded `--eval pass`, release evidence recorded
`suite_count: 0`, and three of its module tests exercised subcommands
that could never register (nil composition seats).
- `ao redact` — its only declared caller
(`skills/compile/scripts/compile.sh`) never existed.
- `cli/internal/types/memrl_policy.go` + the orphan cascade it and eval
left behind (`internal/scenario`, `internal/wiki`,
`internal/runtimecmd`, `internal/redact`) — all with zero importers,
verified before and after.
- `scripts/check-memrl-health.sh` +
`examples/schedules/feedback-drain-hourly.yaml` — a health check for the
feedback loop amputated on 2026-07-14; it exits 1 on main today and the
example instructs a verb (`ao feedback-loop`) that no longer exists.
- `corpus.secret-scan` gate — vacuous: its file filter excluded the
single tracked path its globs could match, so it scanned zero files;
secrets are covered by the pinned gitleaks steps in nightly and release
(validate's quick toolchain mode skips gitleaks).
- Docs for the deleted surface:
`docs/architecture/eval-architecture.md`,
`docs/code-map/eval-lid-primitives.md`; `contracts/eval-baseline-ab.md`
already carried a RETIRED banner and stays as history (delisted from the
live index).

**Kept, deliberately:**
- `ao robot-docs` — the audit's "duplicate of `doctor robot-docs`"
premise was false: they render different handbooks (whole-CLI vs
doctor-scoped). Verified before acting.
- `completion`, `demo`, `quick-start` — interactive human furniture, not
dead code.
- `corpus.witness-dolt-jsonl-crosscheck` gate — retargeted, not retired:
its backing script is a hermetic self-test over real tracked fixtures;
globs now point at the paths it actually exercises.
- `cli/internal/evalsubstrate` — Go-dead but it is the declared mirror
of `schemas/outcomes-rubric.v1.schema.json`; retiring it needs a paired
schemas/docs/scripts decision (package doc comment records this).
- `scripts/ci-local-release.sh` eval-evidence stanza — self-contained
honest bookkeeping (`status: not_applicable`), invokes nothing removed.

**Tombstones + migration:** `eval` and `redact` added to
`removed_command_hint.go` and `docs/MIGRATION.md`; the now-false "(`ao
eval` returned in 3.3 …)" parenthetical deleted; `go-cli.md` spine and
the "Eval — the Learn seat" section updated; the dated research snapshot
got a HISTORICAL banner via the docs-scope self-declaration mechanism
(history not rewritten).

## Why

v3.6.0 binary downloads: 4 darwin-arm64, 3 linux-amd64. Only 7 of 53
shipped skills invoke `ao` at all, and none of them touch this surface.
The eval family was the single largest command surface in the CLI with
zero live consumers — 28% of non-test Go maintained for nobody.

## Evidence

- `cd cli && go build ./... && go vet ./... && go test ./...` — exit 0
(previously-failing `TestGoCLIDocSpineMatchesApprovedSpine` and
`TestRemovedVerbsHaveMigrationRows` now pass)
- `scripts/check-docs-cli-snippets.sh` PASS ·
`check-cmdao-surface-parity.sh` PASS (54 leaf commands) ·
`check-corpus-path-guard.sh` PASS · `check-new-scripts-use-preamble.sh`
PASS · `ao gate check --dry-run` PASS
- Implemented by a worktree-isolated lane, independently validated by a
fresh context that re-ran the suite itself; the two failures it found
were doc files outside the lane's write scope, fixed in the integration
commit. Cross-family (Codex) review verdict included in the final
session report.

## Cross-family review (Codex, fresh context)

First pass: **FAIL** with two majors — (1) `quality.DeprecatedCommands`
still mapped five rewrite entries onto the removed eval family, so `ao
doctor --fix` would have introduced dead commands; (2) retained docs
(formal-verification research links, applied-ood README run block,
evalsubstrate hint strings) still prescribed removed commands. Both
repaired in `4da85a0d4` (one bounded round), plus its two minors
(types/AGENTS.md row, .gitignore unignore, family counts,
gitleaks-coverage comment). Re-verified: full suite green, snippets gate
PASS. Focused re-check: first-round findings confirmed closed; one new
residue (the family count above) stopped the loop under the spiral rule.

## Follow-ups (not in this PR)

- `cli/internal/quality/stale_refs.go` `DeprecatedCommands`: the five
eval-target entries are pruned here; the older pre-existing dead targets
(forge, inject, flywheel, ratchet, …) still need a map-wide
reconciliation against the live registry.
- `cli/internal/evalsubstrate` retirement decision (paired
schemas/docs/scripts change).
- `evals/scenarios/applied-ood/`, `evals/tier2-premortem/`,
`evals/_stats/` retain historical `ao eval` mentions in prereg/holdout
records — dated artifacts, left as history.
2026-08-25 03:34:00 +00:00
renovate[bot] d8accec7f9 chore(deps): update go toolchain directive to v1.27.0 (#1074)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [go](https://go.dev/)
([source](https://redirect.github.com/golang/go)) | toolchain | minor |
`1.26.6` → `1.27.0` |

---

> [!WARNING]
> Some dependencies could not be looked up. Check the [Dependency
Dashboard](../issues/955) for more information.

---

### Release Notes

<details>
<summary>golang/go (go)</summary>

###
[`v1.27.0`](https://redirect.github.com/golang/go/compare/go1.26.7...go1.27rc3)

###
[`v1.26.7`](https://redirect.github.com/golang/go/compare/go1.26.6...go1.26.7)

</details>

---

### Configuration

📅 **Schedule**: (in timezone America/New_York)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/boshu2/agentops).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4zMy4yIiwidXBkYXRlZEluVmVyIjoiNDQuMzMuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Bo <boden.fuller@gmail.com>
2026-08-23 00:45:55 +00:00
Bo e8339105b7 fix(ci): golangci-lint v2.13.1 for Go 1.27; stop archcheck TempDir race (#1080)
## What

Bumps the repo-pinned golangci-lint from v2.11.4 to v2.13.1 (in
`scripts/golangci-lint-v2.sh` plus the toolchain installs in
`validate.yml` and `nightly.yml`), and hardens
`cli/internal/archcheck`'s fixture git helpers against a `t.TempDir`
cleanup race by disabling background git maintenance (`gc.auto=0`,
`gc.autodetach=false`, `maintenance.auto=false`).

## Why

Fixes #1055. Fixes #1077.

Two independent failures were blocking CI:

- **go-gate-shadow red on the open Renovate PRs (#1076, #1074).**
golangci-lint v2.11.4's vendored `x/tools` cannot decode Go 1.27's
export data (`export data version 4 is greater than maximum supported
version 2`), so the `go.lint` gate fails with `typecheck` errors on any
PR that moves CI or the `toolchain` directive to go 1.27.0. v2.13.1
ships `x/tools` v0.49.0 with Go 1.27 support while keeping a `go 1.26.0`
directive, so it still bootstraps under the current go 1.26.6 CI
toolchain with `GOTOOLCHAIN=local`.

- **Nightly failures #1055 (CLI tests, 2026-08-10) and #1077 (security
toolchain go-test lane, 2026-08-21).** Both are the same root cause:
`git commit` in
`TestGoCLIArchitectureAcceptedBoundaryOwnsModuleIntroduction`'s fixture
repo can detach an auto-maintenance child that outlives the test body
and races `t.TempDir` cleanup, failing `RemoveAll` with `.git: directory
not empty`. The fixture git helpers now disable auto gc/maintenance so
no background child is ever spawned.

## How I tested

- `cd cli && go build ./... && go vet ./... && go test ./...` — exit 0
(65 packages ok).
- `scripts/check-go-lint.sh` with golangci-lint v2.13.1: clean (0
findings) under **both** `GOTOOLCHAIN=go1.26.6` (current CI) and
`GOTOOLCHAIN=go1.27.0` (the environment of the Renovate PRs), on the
final tree.
- Reproduced the v2.11.4 failure locally under go1.27.0 (same two
`typecheck` findings as CI) before the bump.
- `go test ./internal/archcheck/ -run 'TestGoCLIArchitecture...'
-count=3` — pass.

## Checklist

- [x] `make build && make test` passes (if Go changes)
- [x] No secrets or credentials in code
- [x] Breaking changes documented (if any) — none

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

Co-authored-by: Claude <noreply@anthropic.com>
2026-08-22 20:35:54 -04:00
Bo 621dbb575f 3.6.0 release prep: version bumps, changelog, curated notes (#1071)
Everything-but-tag for **v3.6.0**. Minor, not major: the post-3.5.0
delta retires the knowledge-flywheel product surface and aligns the
estate on the operations-layer identity, matching the 3.4.0 precedent
where the orchestration pack was removed in a minor.

## What this carries

- **Version 3.5.0 -> 3.6.0 across all seven surfaces**: Claude plugin
manifest, marketplace metadata + plugin entry, Codex manifest, Gemini
image manifest, Claude image verify pin, and the `ao` source fallback.
- **CHANGELOG `[3.6.0]`** (root + docs mirror): operations-layer
alignment, anti-ceremony enforcement, the behavioral eval program, the
flywheel retirement, and the honest 0/12 measured probe coverage.
- **Curated `docs/releases/2026-08-17-v3.6.0-notes.md`**: validator
PASS, tier minor, full changed-path area coverage. The Breaking Changes
section lists all six removals and the handoff write-path move rather
than burying them in a minor.
- **New regression test `cli/cmd/ao/version_manifest_parity_test.go`**
binding the `version` fallback to every version-bearing release surface.
- **PRODUCT.md** reviewed against the 3.6 surface and re-stamped;
**`docs/reference/skill-system-evolution.md`** gains its 3.6.0 row and
drops the "current unreleased tree" framing that the tag would falsify.

## Why the new test exists

This cut missed `images/claude/verify.sh`. Its version guard — whose
entire stated purpose is catching plugin.json drift *behind* the release
— then rejected the **correct** version, so a user following the shipped
`images/claude/README.md` on the v3.6.0 tag would have hit a hard FAIL.
`check_manifest_version_consistency` in `ci-local-release.sh` compares
only the two Claude manifests to each other, so it structurally could
not see this.

The test fails on the drift and passes when correct; both directions
were exercised before committing.

## Honesty notes carried into the release

- Measured behavioral probe coverage is stated as **0/12** under the v3
evidence contract. The earlier wave-1 classifications are retained as
`LEGACY-UNVERIFIED` rather than counted, because the probe harness did
not isolate the skill corpus between control and treatment arms.
Skill-efficacy claims in these notes are directional, not proven.
- The estate-ablation aggregate counts are labeled legacy-unverified and
non-promotable.

## Verification

Full `scripts/ci-local-release.sh --release-version 3.6.0
--readiness-mode official --security-mode full`: **PASSED — 72 checks, 0
failures**.

| Dimension | Status |
|---|---|
| SIL (race suite, 75.8% coverage) | pass |
| VIL (gates, regen, digital twin) | pass |
| HIL (real Darwin/arm64 target) | pass |
| Artifacts (CycloneDX + SPDX SBOM) | pass |
| Security (full mode) | pass |

Readiness **9.0** against threshold 8. HIL used a real target with **no
waiver**: `ao` built from this tree reported `ao version 3.6.0`
(`version_verified=true`) and ran a full `ao init` scaffold plus `ao
status` in a scratch repo. Security full mode: 0 critical, 0 high, 3
medium (non-blocking). Notes validator PASS, doc-release gate PASS.

## Post-merge

Readiness lap at the merged SHA, audit record in `docs/audits/`, then
the tag — per the binding process rule that the record exists **before**
the tag.
2026-08-17 21:24:34 -04:00
Bo f3c6d0ecf2 Converge retained WIP and harden evidence boundaries (#1065)
Summary:
- lands the audited current WIP lanes and excludes stale/process-only
material
- hardens prune path confinement, probe-v3 evidence binding,
codebase-recon identity, handoff/release/reverse-engineer behavior, and
Codex prompt handling
- truth-labels static skill scoring and regenerates all owning
projections

Validation:
- fresh independent PASS on commit
427098ed10
- full Go suite and full Go race suite
- quick local release CI
- focused Bats, scenario/linkage, native-skill, reverse-engineer,
Cathedral, Ruff, Python ratchet, projection, and diff checks

Residual boundaries:
- final-basename ABA remains unclaimed
- live skill-probe coverage remains honestly 0/12
- release-only cross-build, SBOM, vulnerability, and release-evidence
checks are left to delivery CI
2026-08-16 18:32:26 -04:00
renovate[bot] 5c86802c52 chore(deps): update go toolchain directive to v1.26.6 (#1059)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [go](https://go.dev/)
([source](https://redirect.github.com/golang/go)) | toolchain | patch |
`1.26.5` → `1.26.6` |

---

### Release Notes

<details>
<summary>golang/go (go)</summary>

###
[`v1.26.6`](https://redirect.github.com/golang/go/compare/go1.26.5...go1.26.6)

</details>

---

### Configuration

📅 **Schedule**: (in timezone America/New_York)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/boshu2/agentops).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4yNC4wIiwidXBkYXRlZEluVmVyIjoiNDQuMjQuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-13 19:43:45 +00:00
renovate[bot] e24009ec93 fix(deps): update module golang.org/x/text to v0.41.0 (#1058)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [golang.org/x/text](https://pkg.go.dev/golang.org/x/text) | [`v0.40.0`
→
`v0.41.0`](https://cs.opensource.google/go/x/text/+/refs/tags/v0.40.0...refs/tags/v0.41.0)
|
![age](https://developer.mend.io/api/mc/badges/age/go/golang.org%2fx%2ftext/v0.41.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/golang.org%2fx%2ftext/v0.40.0/v0.41.0?slim=true)
|

---

> [!WARNING]
> Some dependencies could not be looked up. Check the [Dependency
Dashboard](../issues/955) for more information.

---

### Configuration

📅 **Schedule**: (in timezone America/New_York)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/boshu2/agentops).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4yNC4wIiwidXBkYXRlZEluVmVyIjoiNDQuMjQuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-11 22:20:24 +00:00
Bo 62cc3b6ee0 Clear the operations-layer alignment residuals (#1054)
Closes out the six residual items #1051 disclosed: terminology residue
on non-authority surfaces, the eval command-surface fixture that failed
when executed (#{3,4} -> #{3,5}), the vacuous retrieval-quality canary
and the nightly job that ran it, the consumer-free dream config block
and its exclusive helpers, the remaining knowledge-shaped writers moved
to the scratch tier, and the MEMORY.md consumer audit.

bin/ralph still resumes legacy .agents/ralph/ checkpoints so the
documented backwards-compat contract holds without a migration; both
paths and the outside-both refusal are now tested.

Fresh author-distinct validation returned PASS with empty not_checked,
after an earlier revision failed on a dangling nightly invoker and a
back-compat test regression that were fixed and independently
re-verified.

Test-Removal-Reason: the dream config subsystem was deleted with its tests (operations-layer residuals)
2026-08-08 14:34:14 -04:00
Bo 7a765cde19 Align AgentOps around its operations-layer identity (#1051)
Executes docs/plans/2026-08-07-agentops-operations-layer-alignment.md:
AgentOps is the operations layer for agentic engineering; the federated
integration graph is the topology, the semantic work-and-proof protocol
is the contract, and RPI is the standard one-experiment traversal.

Retires the ao flywheel command family and all knowledge-flywheel
product state, tombstones the seven-move operating-loop workflow,
narrows ao init and the .agents state writers to declared destinations,
renames the core architecture page to rpi-traversal.md with a
compatibility redirect, aligns AGENTS.md, 25 skills, public and package
copy, regenerates every owned projection, and strengthens the
conformance gates with planted-negative proofs.

Both the alignment subject and the follow-up gate-bookkeeping commit
carry fresh author-distinct validation PASS verdicts with empty
not_checked scope.

Test-Removal-Reason: dead knowledge-flywheel and session-store surfaces were deleted with their tests (operations-layer alignment)
2026-08-07 18:37:03 -04:00
Bo ffe878bf56 Operationalize anti-ceremony guardrails (#1050)
## Summary

- add repository-level anti-ceremony and honest-work policy
- enforce creation gates, oracle integrity, and the RPI spiral breaker
in source skills and generated projections
- add a dual-case behavior probe for justified versus unjustified
process artifacts
- harden doctor Git-root detection against invalid `.git` debris

## Why

The existing workflow could reward control artifacts and weakened checks
instead of working capability. These guardrails make capability the unit
of progress and reject ceremony without a real consumer, decision,
observed defect, and deletion condition.

## Impact

AgentOps now fails closed when process artifacts are manufactured, when
GREEN comes from weakening the oracle, or when repeated control
artifacts replace implementation evidence. Doctor artifacts no longer
get redirected by an empty or invalid ancestor `.git` directory.

## Validation

- `bash scripts/ci-local-release.sh --quick`
- `make regen-check`
- fresh AgentOps validation: `PASS` with `not_checked: []`

The quick release suite skips race, security-scan, SBOM, multi-platform,
and release-evidence lanes.
2026-08-07 13:02:33 -04:00
renovate[bot] fa52533db0 fix(deps): update module github.com/santhosh-tekuri/jsonschema/v6 to v6.0.3 (#1048)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[github.com/santhosh-tekuri/jsonschema/v6](https://redirect.github.com/santhosh-tekuri/jsonschema)
| `v6.0.2` → `v6.0.3` |
![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fsanthosh-tekuri%2fjsonschema%2fv6/v6.0.3?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fsanthosh-tekuri%2fjsonschema%2fv6/v6.0.2/v6.0.3?slim=true)
|

---

### Release Notes

<details>
<summary>santhosh-tekuri/jsonschema
(github.com/santhosh-tekuri/jsonschema/v6)</summary>

###
[`v6.0.3`](https://redirect.github.com/santhosh-tekuri/jsonschema/compare/v6.0.2...v6.0.3)

[Compare
Source](https://redirect.github.com/santhosh-tekuri/jsonschema/compare/v6.0.2...v6.0.3)

</details>

---

### Configuration

📅 **Schedule**: (in timezone America/New_York)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/boshu2/agentops).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMi4wIiwidXBkYXRlZEluVmVyIjoiNDQuMTIuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-06 15:47:05 +00:00
Bo 51f5d64474 feat(evals): eval architecture + probe wave 1 — first BEHAVIORAL skill verdicts (#1033)
## What this is

The eval program for the skill harness, end to end: SOTA research (two
adversarially-verified deep-research passes) → a 12-decision eval
architecture → harness completion → the first measured probe wave →
skill improvements driven by the measurements.

## Wave-1 results (gpt-5.6-luna, xhigh + low effort, N=2/arm/config,
directional)

| Probe | Skill | xhigh C→T | low C→T | Verdict |
|---|---|---|---|---|
| premortem-self-validation | premortem | 0.5→1.0 | 0.0→1.0 |
**BEHAVIORAL** |
| standards-go-conventions | standards | 0.5→1.0 | 0.0→1.0 |
**BEHAVIORAL** |
| validate-not-proven | validate | 1.0→1.0 | 1.0→1.0 | INERT (ceiling) |
| security-coverage-gap | security | 1.0→1.0 | 1.0→1.0 | INERT (ceiling)
|
| reality-check-gap | reality-check | 1.0→1.0 | 1.0→1.0 | INERT
(ceiling) |
| crank-luna | crank | 1.0→1.0 | 1.0→1.0 | INERT (3rd config) |

The effect **grows as the producer weakens** — the SkillsBench gradient
reproduced locally. Full report:
`docs/evals/2026-08-04-probe-wave-1.md`.

## Verification (all in this branch's tree)

- Go build + vet + 415 tests green (adapters/eval, eval, gates)
- validate-skill-frontmatter 51/51; heal --check clean
- shellcheck -S warning clean on all new/modified shell
- probe-coverage gate: 4/11 measured (was 0/11); bats suite green
- `_stats` vendored: 42 pytest green
- Every wave cell replayable: `bash scripts/probe-skill.sh --probe <id>
--replay`

## Notes for review

- `evals/skill-probes/LEDGER.md` is the new hand-maintained MEASURED
ledger — moved out of generated SKILL-TIERS.md because a regen wiped it
there (measured results can't live in generated files).
- skills/premortem + skills/standards gained front-loaded MEASURED
blocks (the exact prelude content the probes proved behavioral); codex
twins regenerated on this clean baseline.
- The architecture doc is PROPOSED — ratification is the repo owner's
call; nothing in it is load-bearing for this PR's code.
2026-08-05 01:06:28 +00:00
Bo 83e1dd0cb5 feat(gc): pre-seed Codex trust for materialized Gas City homes (#1031)
## Defect

Gas City materializes Codex session homes with project-local hooks. The
first
Codex process in an untrusted home can stop at the interactive
workspace/hook
trust dialog, leaving the agent pane alive but unable to take dispatched
work.

Codex persists two independent decisions in `$CODEX_HOME/config.toml`:

1. workspace trust under `[projects."<dir>"]`
2. one content hash per hook under `[hooks.state."<hook-key>"]`

Trusting a parent directory does not trust a session home, and the hook
digest
input is intentionally owned by Codex rather than reimplemented here.

## Change

`ao gc prepare` now discovers the Gas City directories that exist when
it runs
(city and rig roots, materialized agent homes, and materialized rig
worktrees)
and pre-seeds both trust layers for those exact targets.

- Hook identities and current hashes come from Codex's `hooks/list`
app-server
  method.
- Returned hooks are restricted to the discovered targets; user- or
  plugin-level hooks are never granted trust by this command.
- Explicit operator decisions are preserved. An untrusted workspace,
modified
hook, disabled hook, unusable hash, malformed response, or malformed
TOML
  fails loudly rather than being rewritten or accepted as complete.
- The merged TOML is validated in memory and installed with the CLI's
durable
  atomic writer while preserving existing permissions.
- `ao gc check` verifies the same values from local files only. It
starts no
  Codex subprocess and writes nothing.

## Deliberate boundary

Discovery is filesystem-based. A home Gas City creates *after* `prepare`
is not
pre-seeded by an earlier invocation. `prepare` compares configured agent
identities with materialized homes and warns about missing homes,
including the
real dotted-name shape (`gastown.mayor` → `.gc/agents/mayor`). The
operational
rule is documented explicitly:

```text
prepare → start the city → prepare again → dispatch
```

This PR does not claim that one pre-start invocation covers future homes
or
that every future pane can never encounter a prompt.

## Evidence

Automated tests cover:

- value-based workspace and hook trust, including `enabled = false`
- malformed/unexpected `hooks/list` responses
- regular local `hooks.json` files that derive zero hook identities
(`{}`,
`{"hooks":null}`, and `{"hooks":{}}`), keeping `prepare` and `check`
aligned
- real TOML spellings, invalid merges, idempotence, and mode
preservation
- target filtering and derived hook-key fidelity
- subprocess-free `check`
- missing-home identity reporting for nested and dotted qualified names
- operation with no Codex binary
- package-wide HOME isolation

An isolated real-Codex smoke on a disposable Gas City home established
the
behavioral differential: with the home's trust entries removed, Codex
rendered
the trust dialog; after seeding the same home, it reached the composer
without
the prompt. This proves the existing-home mechanism, not future-home
timing.

Final recovery checks on commit
`a4b52b2354b9f96e5e10e07b2916339c87190bfc`:

```text
go test -count=1 ./internal/gcmaintainer
ok github.com/boshu2/agentops/cli/internal/gcmaintainer 11.943s

go test -race -shuffle=on -count=2 ./internal/gcmaintainer
PASS

go test -count=1 ./internal/testsupport
PASS

go vet ./internal/gcmaintainer ./internal/testsupport
PASS

scripts/check-test-home-isolation.sh
PASS

scripts/check-test-isolation.sh
PASS (raw os.Setenv remains at the 10/10 baseline)

GOCACHE=/private/tmp/agentops-gocache \
GOLANGCI_LINT_CACHE=/private/tmp/agentops-golangci-cache \
WORKTREE_DISPOSITION_CI_SKIP=1 \
./bin/ao gate check --full --workflow-coverage --require-workflow-parity
PASS (68/68 full/head checks)

GOCACHE=/private/tmp/agentops-gocache bash scripts/regen-all.sh --check
PASS

git diff --check
PASS
```

Recovery fixed the prior CI findings with `storage.AtomicWriteFile`,
package-wide
HOME isolation, and `json.Encoder.Encode`. The first repaired CI replay
exposed
one further ratchet: raw `os.Setenv` calls in the new `_test.go`
TestMain raised
the repository baseline from 10 to 12. The final commit moves that
one-time
setup into the existing shared test-support boundary, keeps environment
changes
outside `m.Run`, and teaches the HOME-isolation gate only the exact safe
helper
shape. CI will rerun on the exact pushed commit.
2026-08-03 09:51:53 -04:00
Bo 1c1500ce87 3.5.0 release prep: version bumps, changelog, curated notes (#1029)
Everything-but-tag for v3.5.0 (Bo's call: the post-3.4.0 delta carries
two feature surfaces — `ao gc` and plan manifest mode — so minor, not
patch).

- Version 3.4.0 → 3.5.0 across all seven surfaces (plugin manifests,
marketplace, image verify pin, `ao` source fallback).
- CHANGELOG `[3.5.0]` section (root + docs mirror): ao gc family,
manifest mode, Mayor-dispatch doctrine, honest-scoped-PASS,
fresh-install fixes, init gitignore policy.
- Curated `docs/releases/2026-07-31-v3.5.0-notes.md`: validator PASS,
tier minor, full area coverage; upgrade notes call out the
gc-maintainer-ops wrapper deprecation and the new init gitignore block.

Verification: notes validator PASS · `regen-all.sh --check` all ✓ ·
skill-lint 0 · `go build/vet/test` 2947 passed / 73 packages.
Post-merge: official-mode readiness lap at the merged SHA with real HIL,
record in docs/audits/ before any tag.
2026-07-31 10:08:11 -04:00
Bo 2d9f740977 fix(cli): four fresh-install defects in gate check, doctor, and init (#1028)
Four defects observed live in a fresh-install smoke test of the `ao`
CLI: two in `ao gate check`, one in `ao doctor`, one in `ao init`. Each
is fixed at its root and pinned by L2 tests driven through the real
entry points in fixture repos.

## 1. `ao gate check` in a zero-commit repo died raw

**Observed** — in a repository between `git init` and the first commit:

```
gates: detect changed files: git show --name-only --pretty=format: HEAD: exit status 128
```

**Fix** (`cli/internal/gates/changedfiles.go`) —
`GitChangedFiles.Changed` translates the failure into the
`ErrUnbornHead` sentinel with a remedy. Translation runs only on the
failure path (the happy path keeps its single git invocation) and only
for HEAD-resolving scopes. Two probes keep the neighbouring causes
distinct: `rev-parse --git-dir` separates "not a git repository",
`rev-parse --verify HEAD` separates "bad revision in an explicit range".
`--scope staged` is excluded on purpose — `git diff --cached` works
before the first commit, which is why the message points there.

Live, after the fix:

```
ao gate: gate check: gates: detect changed files: no commits yet (unborn HEAD): scope "head"
needs a commit to compare against — make an initial commit, or run with an explicit scope
such as --scope staged after 'git add'
```

**Tests** (`changedfiles_test.go`, `gates_test.go`) — unborn-HEAD
fixture across `head`/`worktree`/`upstream`/`range`:
`errors.Is(ErrUnbornHead)`, no leaked git exit status, remedy text
present. Plus: the advertised `--scope staged` escape hatch actually
returns the staged set; two negative witnesses (non-repo, nonexistent
range base) keep git's own error; an orchestrator-level test proves the
message survives the `gates: detect changed files: %w` wrap.

## 2. Gate failed shellcheck on AgentOps' own installed skill scripts,
with an unusable repair hint

**Observed** — after `ao init` and a first commit in a user's own repo,
`shell.shellcheck-changed` FAILED on
`.agents/skills/cass/scripts/multi_machine_search.sh` (matched by the
`**/*.sh` glob), and the repair text read `inspect native gate
shell.shellcheck-changed in cli/internal/gates` — a path that does not
exist on a machine that installed the CLI.

**Fix A — scope** (`gates/routing.go`, `gates/orchestrator.go`,
`checks/native_inline.go`): paths under `.agents/skills/`,
`.claude/skills/`, `.codex/skills/`, `.gemini/skills/`,
`.cursor/skills/`, `.pi/skills/`, `agent/skills/` are installed copies
owned by their upstream source, never repository source. They are
dropped from the change set once, in the orchestrator, so routing and
every check's `RunContext` describe the same in-scope set; the native
checks' own `origin/main...HEAD` fallback applies the same filter so
Full mode cannot re-admit them. The agentops repository tracks nothing
under those prefixes (`git ls-files` → 0), so the exclusion cannot hide
a first-party change from a gate.

**Fix B — hints** (`gates/gates.go`, `checks/native_inline.go`): the
derived native-check hint now names the gate ID and the published docs
(`GateDocsURL`) instead of a Go source path, and all four native checks
carry an explicit plain-language remedy. Script-backed hints are
unchanged by design — `ScriptRunner` returns a first-class
not-applicable SKIP outside the agentops repo, so their `bash
scripts/...` rerun addresses a reader who has the checkout by
construction.

Live, after the fix — installed copies pass, a first-party file still
fails:

```
FAIL  shell.shellcheck-changed | selected: changed file "scripts/deploy.sh" matched "**/*.sh"
      | repair: run 'shellcheck -S warning <file>' on each reported shell file and fix the
        warnings (install shellcheck if it is missing)
```

**Tests** (`checks/native_inline_test.go`, `gates/routing_test.go`,
`gates/gates_test.go`) — L2 through the real registry + real
orchestrator + real git + real shellcheck: a fixture repo whose only
shellcheck-triggering files are installed skill copies exits 0;
**negative witness** — the same bad script under `scripts/` still exits
1, so the filter narrows scope rather than defanging the gate. Plus a
routing-layer selection test with the same witness, a
path-classification table including near-misses (`skills/`,
`vendor/.claude/skills/`, `.agents/ao/learnings/`), and a registry-wide
invariant that no native check's effective repair hint names a
source-checkout path.

## 3. `ao doctor` gave installed users checkout-only advice and could
overcount broken links

**Observed** — audience `installed-user` was told to run `ao skills link
--dry-run` "from the AgentOps checkout" (they have none, and the command
fails closed outside one), alongside a "2 broken" count that a
dangling-symlink sweep did not corroborate.

**Fix** (`cli/internal/adapters/doctor/legacy.go`):

- *Advice*: the no-checkout branch now names the affected root and the
dangling count, and gives a remedy performable from where the reader
stands — remove the dangling links, then reinstall skills the way they
were installed (plugin, brew, or npx).
- *Counting*: `countLiveSkillLinks` derived brokenness from a single
`os.Stat(<link>/SKILL.md)` probe, which fails for **three** unrelated
reasons — the link dangles, the link resolves to something that is not a
skill package (a shared reference dir, or a plain file), or the target
is unreadable — and reported all three as broken. That conflation is the
overcount. It now returns a tri-state census: `Broken` means **dangling
and only dangling** (exactly what `find -L <root> -maxdepth 1 -type l`
prints), `Foreign` is a link that resolves but names no skill package,
`Live` is a working skill. Non-symlink entries (a plugin's real
directory) are counted in no bucket.

Live, after the fix — and the two reported links are genuinely dangling,
which the new wording now makes checkable:

```
! Skill Links  48 live portable skill link(s), 2 dangling (target no longer exists) under
               /Users/…/.agents/skills; remove the dangling link(s), then reinstall skills
               the way you installed them (plugin, brew, or npx)
```

**Tests** (`legacy_test.go`) — installed-user detail/Fix contain no
checkout-only command and *do* name the root, the count, and a remedy; a
fixture holding live + dangling + foreign-dir + foreign-file + real-dir
entries pins the exact census `{Live:2, Broken:1, Foreign:2}`; a
cross-check computes the dangling count independently (not via
production code) and asserts doctor's `Broken` equals it — the test that
closes the "doctor says N, find says fewer" contradiction.

## 4. `ao init` scaffolded `.agents/ao/**` with no ignore guidance

**Observed** — after one loop the tree was full of untracked scratch and
every user had to invent the same `.gitignore` rules by hand.

**Policy decision** (`cli/internal/initapp/initapp.go`): `ao init`
appends one commented, marker-delimited block to the working directory's
`.gitignore`, creating the file if absent. It ignores only machine-local
scratch — `.agents/ao/index/` (derived), `.agents/ao/sessions/`
(private), `.agents/ao/provenance/` (per-machine, merge-hostile),
`__pycache__/`. It **deliberately does not** ignore
`.agents/ao/intents/` or `.agents/ao/verdicts/`: whether loop evidence
belongs in version control is the consumer repository's policy, and
AgentOps owns no policy there (product boundary). Delete the block to
track everything.

The block targets the working directory rather than the enclosing git
root, so its relative patterns match the `.agents/ao/**` the same run
just created. Idempotency keys on the begin marker, not the body — a
user who trims the lines inside has made a local decision, and a second
init reports and respects it. Documented in the command's `Long` help
and the regenerated `cli/docs/COMMANDS.md`.

**Tests** (`initapp_test.go`, `commands/init/module_test.go`) — init
twice in a fresh dir leaves the marker present exactly once, both at the
app layer and L2 through the cobra command; existing `.gitignore`
content is preserved verbatim with no glued last line; an edited block
is left untouched; dry-run writes nothing and announces the append; help
documents both what is ignored and what is deliberately trackable. The
pre-existing assertion that init never touches ignore state was replaced
by a narrower one — no repository is initialized — since the ignore
block is now the intended behavior.

---

## Verification

- `cd cli && go build ./... && go vet ./... && go test ./...` → **2947
passed in 73 packages**, exit 0 (captured to a file; not piped).
- `golangci-lint run` → no issues.
- `bash scripts/regen-all.sh --check` → all generated projections
current (`cli/docs/COMMANDS.md` regenerated via
`scripts/generate-cli-reference.sh`).
- All four defects re-smoked end-to-end against a freshly built binary
in a throwaway repo.

Write scope stayed inside `cli/**` plus the generated
`cli/docs/COMMANDS.md`. No `skills/**`, `AGENTS.md`, or
`docs/architecture/**` changes.
2026-07-31 13:17:19 +00:00
Bo fd30523a75 docs(skills): install-agnostic loop commands and self-contained rpi examples (#1026)
## Summary

Fresh-install smoke testing found four commands/links in skills and CLI
help that fail verbatim for an installed user (only `skills/**` — not
the full repo tree — ships to an install; `.agents/skills/**` is the
installed skill root).

| # | Defect | Fix | Verified |
|---|---|---|---|
| 1 | `skills/plan/SKILL.md` step 1 told the runtime to run `python3
skills/validate/scripts/validate.py snapshot-intent ...` — a
checkout-only path. In an installed tree the real path is
`.agents/skills/validate/scripts/validate.py`. | Reworded to name both
paths explicitly (checkout: `skills/validate/scripts/validate.py`;
installed: `.agents/skills/validate/scripts/validate.py`),
install-agnostic. | Copied `skills/{validate,plan,rpi}` into a scratch
`.agents/skills/` layout and ran `echo '{"foo":"bar"}' \| python3
.agents/skills/validate/scripts/validate.py snapshot-intent --source -`
verbatim — produced a valid `intent_ref`. Re-ran the checkout-relative
form too. |
| 2 | `skills/rpi/SKILL.md` linked
`../../schemas/rpi-report.v1.schema.json` — `schemas/` isn't shipped to
installs, so the link 404s for an installed user. | Inlined the minimal
required `rpi-report.v1` shape as a fenced JSON block (with field
semantics), plus a note that the schema itself ships in a repo checkout.
No new files added to the skill package. | Validated the exact inlined
shape (with a concrete instance) against
`schemas/rpi-report.v1.schema.json` via `jsonschema.validate()` —
passes. Confirmed all 9 required keys and digest patterns match the real
schema. |
| 3 | `skills/rpi/SKILL.md`'s continuation-envelope example (~lines
115-121) cited this repo's own internal 2026-07-15 intent/verdict
digests (`26a4f2be...eb48`, `b6e759dd...cb6a`, etc.) as a normative
example — not reproducible by an installed user. | Replaced with a
generic, self-contained example (placeholder revisions/verdicts) that
illustrates the same two-stop-checkpoint behavior without citing this
repo's private history. | Reviewed the replaced prose reads correctly in
context; `bash tests/skills/run-all.sh` still passes (no broken
frontmatter/budget). |
| 4 | `ao --help` root epilog (`cli/cmd/ao/root.go`) pointed at
`docs/MIGRATION.md`, a relative path that doesn't exist for a user who
only has the `ao` binary (no `docs/` directory ships with it). | Changed
the epilog to the GitHub blob URL
(`https://github.com/boshu2/agentops/blob/main/docs/MIGRATION.md`), with
a note that a repo checkout also has it locally at `docs/MIGRATION.md`.
Left the internal `removedCommandHint()` machinery (and its
`docs/MIGRATION.md`-literal test assertions) untouched — that's a
separate, heavily-tested mechanism not covered by this defect. | `go run
./cmd/ao --help` shows the new URL. Confirmed `boshu2/agentops` is the
correct remote and `docs/MIGRATION.md` exists at that path on `main`. |

## Process / regen

- `scripts/codex-sync.sh --only plan`, `--only rpi`
- `scripts/regen-codex-hashes.sh --only plan`, `--only rpi`
- `python3 scripts/generate-skill-mesh.py`
- `scripts/generate-cli-reference.sh` (no diff — root epilog text isn't
captured in `COMMANDS.md`)
- `scripts/regen-all.sh --check` — all projections current

## Test plan

- [x] `cd cli && go build ./...` — success
- [x] `cd cli && go vet ./...` — no issues
- [x] `cd cli && go test ./...` — 2923 passed, 0 failed, 73 packages
- [x] `bash tests/skills/run-all.sh` — 54/54 skills pass, 0 failed
- [x] Simulated install (`.agents/skills/...`) and ran the exact
documented `validate.py snapshot-intent` command verbatim — works
- [x] Validated the inlined `rpi-report.v1` JSON shape against the real
schema with `jsonschema.validate()`
- [x] `go run ./cmd/ao --help` shows the corrected epilog

Write scope respected: `skills/plan/SKILL.md`, `skills/rpi/SKILL.md`,
`cli/cmd/ao/root.go` (help text only), and regenerated projections
(`skills-codex/**`, `images/gemini/skills/**`). No changes to
`skills/validate/**`, `CLAUDE.md`, `AGENTS.md`, `cli/internal/gates/**`,
or `cli/internal/doctor/**`.
2026-07-31 09:05:00 -04:00
Bo efcf4879c8 feat(gc): port gc-maintainer-ops into the ao gc command family (#1016)
## What

Ports `scripts/gc-maintainer-ops.sh` (425 lines of bash: prepare / check
/ recover-affinity for stock Gas City rigs) into the Go CLI as **`ao gc
prepare|check|recover-affinity`**, per ADR-0016 (skill logic ships in Go
via `ao`; shell stays thin glue).

**Why:** skills ship via plugin/npx as SKILL.md only — a user without a
repo checkout could not run the commands the shipped `using-gc` skill
teaches. The skill said "From an AgentOps checkout", which was disclosed
but weak.

## Changes

- **`cli/internal/gcmaintainer`** — full port: rig/import pin
verification, bundled pack-cache resolution, PyYAML-capable python
selection, atomic runtime staging, managed check wrappers, skill links
into city/rig Codex sinks, macOS LaunchAgent + doctor/status health
checks, bounded affinity recovery. Output and refusal-message parity
with the shell script (incl. refuse-before-mutation ordering).
- **`cli/internal/commands/gc` + `cmd/ao/gc_composition.go`** — cobra
module on the shared `clicontract.HostOptions` seam; global `--dry-run`
always overrides `--apply`.
- **Skills source resolution without a checkout**: `--skills-source` >
enclosing agentops checkout > installed skills root (`~/.agents/skills`,
`~/.claude/skills`). Existing rigs stay recognized: the `managed-by:
agentops gc-maintainer-ops` wrapper marker is unchanged.
- **Tests migrated**: `tests/python/test_gc_maintainer_ops.py` (7 cases)
→ Go L2 tests in `cli/internal/gcmaintainer` with the same fake-`gc`
harness, plus module wiring tests. `scripts/check-gc-executor.sh` no
longer runs the python suite.
- **`scripts/gc-maintainer-ops.sh`** reduced to a thin wrapper exec'ing
`ao gc`, pinning `--skills-source` to its checkout to preserve
historical semantics (`--ao-bin` now selects the ao binary).
- **Docs/projections**: `skills/using-gc/SKILL.md` now teaches `ao gc
...`; codex, gemini, and executor-pack projections regenerated via their
owning generators; spine/COMMANDS.md/surface artifacts regenerated.

## Verification

- `go build ./... && go vet ./... && go test ./...` — 2923 passed, 73
packages
- `golangci-lint run` on new/touched packages — clean
- `shellcheck -S warning` on wrapper + gate script — clean
- `bash scripts/check-gc-executor.sh` — OK
- Smoke: built `ao`, ran wrapper → `ao gc` delegation end-to-end
2026-07-30 13:16:53 -04:00
Bo e2e2e60aa2 chore(gc): decay retired Gas City prototype wiring to frozen bytes
The 2026-07-29 upstream-factories pivot retired packs/agentops-executor,
packs/agentops-factory, and deploy/gc in place as migration evidence, but
three live wires kept regenerating and gating them:

- scripts/sync-gc-pack.py re-projected canonical skills into the retired
  executor pack on every regen. Remove the regen-all step and delete the
  projector + its test; the pack copy and manifest stay as frozen
  historical bytes (untouched by this commit).
- adapter.gc-executor spanned packs/** and deploy/gc/**. Replace it with
  adapter.gc-maintainer, narrowed to the live surface only:
  scripts/gc-maintainer-ops.sh + tests/python/test_gc_maintainer_ops.py,
  backed by new scripts/check-gc-maintainer-ops.sh.
- tests/python/test_gc33_thin_pack.py coupled the LIVE skills/using-gc
  skill to retired pack bytes (asserted matching strings in both), so any
  future skill edit would break against the frozen copy. Deleted with the
  gate that ran it.

The new gate ships with a red bats case naming its backing script, so the
adapter.gc-executor grandfather line is pruned rather than replaced — the
negative-witness ratchet shrinks by one.

Verified: go build/vet + gates suite (174 pass, includes the witness
closure test), new bats twin 3/3, regen-all --check green, shellcheck +
preamble ratchet green. workflow.install-drift fails pre-existing
(dangling ~/.claude/workflows/bdd-foundry.js estate symlink, unrelated).
2026-07-30 10:18:26 -04:00
Bo 7b45da8d5a fix(gates): negative-witness scan reads only git-tracked tests/ files (#1015)
## Problem

`collectTestBodies()` in
`cli/internal/gates/checks/negative_witness_test.go` walked `tests/` on
disk and read every file — including untracked/gitignored session
transcripts (`tests/claude-code/logs/*.jsonl`). Those transcripts
contain gate-script names next to assertion-shaped text, creating
phantom negative witnesses. On 2026-07-29 this made
`TestBlockingGatesHaveProvenNegativeWitness` fail in a dirty checkout
(demanding `go.cli-reference` be unpinned) while passing in a clean
worktree — the verdict depended on checkout dirt, not committed tests.

## Fix

- `collectTestBodies` now enumerates via `git ls-files -z -- tests`
(with `cmd.Dir` pinned and the package's scrubbed git env), so
untracked/ignored files are never read. Tracked-but-absent files are
skipped.
- New regression test `TestCollectTestBodiesIgnoresUntrackedFiles`: temp
fixture repo with a tracked `.bats` witness plus an untracked decoy
`session.jsonl` naming a gate script with an assertion-shaped string;
asserts the decoy is neither collected nor counted as a witness. Fully
isolated in `t.TempDir()`.
- Shrink-only ratchet semantics (grandfather list, growth guard,
shrink/stale checks) unchanged.

## Verification

- `go vet` / `go build` clean; all 174 tests in `internal/gates/...`
pass.
- End-to-end repro: planted a decoy transcript naming
`check-cli-reference.sh` under `tests/claude-code/logs/` in the live
worktree — the gate test now passes regardless (decoy removed after).
2026-07-29 22:52:14 -04:00
Bo 9dd6e7d3f9 3.4.0 release prep: upstream-factories pivot, version bumps, release notes (#1013)
## Summary

Everything-but-the-tag for v3.4.0, in four commits:

- **docs(gc)**: the factory pivot — README and `using-gc` present the
upstream [Gas City build
pack](https://github.com/gastownhall/gascity-packs/tree/main/gascity)
and [Agentic Coding Flywheel](https://agent-flywheel.com/) as the
supported factory choices; the in-repo prototype (`deploy/gc/`) is
retired in place. AgentOps' lane is the skills + evidence discipline
either factory executes.
- **chore(release)**: version 3.3.0 → 3.4.0 across all six surfaces
(claude/codex/gemini plugin manifests, marketplace, image verify pin,
`ao` source fallback).
- **fix(gates)**: `check-orchestration-skill-boundaries.sh` exited 2 on
every run — it probed adapter files deleted by the 3.3 single-pass
refactor and three contract phrases removed by the skill-overhaul waves.
The live ratchets (retired-skill absence, ATM-era naming) are kept.
- **docs(release)**: 3.4.0 CHANGELOG section (root + docs mirror) and
curated release notes; `validate-release-notes.sh` passes (tier minor,
full area coverage).

## Verification

- Full Go gate in a clean worktree: build ✓ vet ✓ test **2902 passed / 0
failed** (71 packages)
- `scripts/regen-all.sh --check`: all 11 projection/doc checks ✓
(including the doc-release freeze gate)
- `scripts/validate-release-notes.sh v3.4.0 --since v3.3.0`: PASS
- `scripts/check-orchestration-skill-boundaries.sh`: exit 0 (was exit 2
on main)

## Notes

- The earlier read that `go.cli-reference` needed unpinning from the
negative-witness grandfather list was a **false positive**: gitignored
session logs under `tests/claude-code/logs/` pollute the witness scan in
a dirty checkout. On a clean tree the pin is correct; a follow-up task
exists to make the scanner read only tracked files.
- Tagging + Release Publisher run happen after merge, separately; an
official-mode readiness artifact gets produced at the merged SHA
**before** any tag (binding rule from the v3.3.0 record).
2026-07-29 22:09:42 -04:00
Bo a6359795bf Make fresh validation persistence optional (#1012)
Keep fresh author-distinct validation mandatory while making verdict and report persistence consumer-driven. Align the RPI/Validate contracts, executable behavior, current guidance, regression coverage, and generated projections; preserve the Gas City 1.4 cutover.
2026-07-29 19:50:56 -04:00
Bo 142b7ee841 Bounded, cancellable eval subprocess runner with process-group reaping (#1010)
## Summary

Bead `age-eval-subprocess-lifecycle-uf9d6` — the 2026-07-24 Go audit's
G2 program, the last OPEN High-adjacent residue. New
`cli/internal/procrun` runner, migrated onto all four unbounded sites.

**The runner:**
- Head+tail bounded capture: fixed peak memory regardless of child
output; keeps draining so the child never blocks on a full pipe;
under-cap output byte-identical; over-cap preserves true head and true
tail with a discard marker.
- `Run(ctx, ...)`: process-group start (`Setpgid` / windows process
group), cancel kills the group, 3s `WaitDelay` so `Wait` can't hang on
pipes a grandchild holds, and — post-review — the group is reaped
**unconditionally after Wait on every path**, so a descendant surviving
a normal child exit is still killed (witnessed: backgrounded no-`wait`
sleeper reaped).
- Unix ESRCH race mapped to `os.ErrProcessDone` (50×
completion-vs-cancel race under `-race`: a completed command never
reports an error). Windows `taskkill` bounded by its own 5s timeout with
the best-effort no-Job-Object guarantee documented rather than faked.

**Migrated sites:** goals `MeasureOneContext` (SIGINT child-tracker
hooks preserved), gates `ScriptRunner` (gains group-kill + WaitDelay,
4KiB LogTail preserved), eval `executeCaseCommand` and expectations
autodetect — caller ctx threaded end-to-end via
`RunSuiteContext`/`RunBaselineABContext`/`RunContextABContext` +
`CoreRuntime`; no `context.Background()` remains on these paths.
Cancellation is semantic: guards before the suite, before each case,
**and after the loop** (a cancel during the final/only case is terminal,
never scored — single-case witness), A/B never starts its second leg
cancelled. Start-failure error text verified byte-identical at all three
consumer sites. Live-runtime capture and the adapter RunStats call are
explicitly out of scope (noted in commit).

## Validation

- `go build`/`go vet` clean; full `go test ./...` green; `-race
-count=1` clean on procrun/eval/goals; golangci 0 issues on five touched
packages; `GOOS=windows` build ok
- Cross-family review two rounds: round 1 five findings all fixed
(always-reap, bounded windows cancel, ESRCH race, semantic cancellation,
error-text compat); round 2's one residual (final-case cancellation)
fixed with witness

Tracker: `age-eval-subprocess-lifecycle-uf9d6`
2026-07-29 14:28:10 +00:00
Bo 5224f1c808 ao gate check --dry-run: real plan-only mode (#1009)
## Summary

Bead `age-gate-check-dryrun-y8hgz` — the last High from the 2026-07-24
Go audit's dry-run family that remained OPEN after #1008. `ao gate check
--dry-run` accepted the global flag and silently executed the full
registry; it is now a real plan.

- `gates.Plan` reuses the orchestrator's existing execution-free
selection (`selectCheckPlans`) — the same scope/tier/changed-file
routing as `Run`, inside one `CheckService.Execute`, so plan and run
cannot drift structurally.
- Output: every selected and skipped check with name, tier,
blocking/advisory, and the selection reason; `--json` emits a
plan-shaped subset of the run-report contract marked `dry_run: true`;
exit 0 on a successful plan, plan-construction errors exit 2.
- Selection performs read-only repo probes (git changed-file resolution,
repo detection) but never a check body — stated in the contract comment.

## Witness tests

- A blocking would-FAIL check with a side-effect recorder neither runs
nor affects exit code under `--dry-run`; the same request without the
flag runs it and exits 1. A gates-level runner that fails the test if
*any* check routes through it is never touched by `Plan`.
- Selection parity across default (fast), `--full`, and
changed-file-routed invocations; skip reasons rendered; no PASS/FAIL
marks leak into a plan.
- Binary smoke: fast plan 29 selected/40 skipped, full plan 68/1, valid
JSON, ~0.28s (vs a real run spawning go build + python + git).

## Validation

- `go build`/`go vet` clean; `go test ./...` 2873 pass / 70 packages;
golangci 0 issues; COMMANDS.md check current
- Cross-family review: round-1 findings 1–3 were diff artifacts of the
pre-#1008 branch base (rebase resolved; nothing reverted — verifiable in
this diff); finding 4 (scope of the "executes nothing" claim) addressed
with the read-only-probes contract wording

Tracker: `age-gate-check-dryrun-y8hgz`
2026-07-29 12:59:49 +00:00
Bo a305de5c3e Go CLI audit residue: eval id containment hardened, dry-run honored, owned temp dirs (#1008)
## Summary

Bead `age-skill-overhaul-reboot-sjv7v.12` — reconciliation of the
2026-07-24 Go CLI deep audit against current main. Full table with
evidence:
`docs/audits/2026-07-28-skill-overhaul-reboot/wave-reports/s12-go-residue.md`.

**Fixed here (4):**
- **Eval identifier path containment** [High] — new
`evalsubstrate.ValidateID` at every identifier-to-path join, hardened
through two review rounds: rejects separators, absolute/volume refs,
leading/trailing space-or-dot (defeats Win32 trailing-strip
renormalization), C0+C1+DEL controls, non-UTF-8, non-NFC,
whitespace-only, >128 bytes; `ms:*` colons handled by injective one-way
`%3A` encoding at the checked `ModelSpecPath` sink (raw `%` reserved so
encoding cannot alias), both callers migrated, no unchecked join
remains.
- **`provenance add --dry-run`** [High] — was wired but never read; now
honored with a no-write witness test.
- **Live-runtime isolation dirs** — owned, cleaned on all paths, never
claims a caller-supplied root.
- **Stale eval help text** — corrected; COMMANDS.md regenerated via its
owner.

**Already landed (1):** the `--json`/`-o json` divergence for
provenance/skills was resolved by the cmd/ao carve-out (probes confirm
identical output).

**Recorded OPEN with reproductions (3):** `gate check --dry-run`
plan-only mode, bounded subprocess output streaming, and
context/process-group cancellation — each a cross-package refactor (the
audit's own G1/G2 programs), documented with fix sketches rather than
half-fixed here.

## Validation

- `go build` / `go vet` clean; `go test ./...` 2872+ pass across 70
packages; golangci-lint 0 issues on touched packages; CLI reference
check current
- Cross-family review two rounds: round 1 three findings (Windows
renormalization traversal, canonicality bounds, unchecked sink) all
fixed; round 2's one residual (non-injective colon encoding) fixed with
witness cases

Tracker: `age-skill-overhaul-reboot-sjv7v.12`
2026-07-29 06:21:47 +00:00
Bo c88a4514f9 W7 support wave: handoff schema truth, dcg fact corrections, honest support contracts (#1005)
## Summary

Wave W7 of the skill-overhaul reboot
(`age-skill-overhaul-reboot-sjv7v.8`) — the nine support skills, plus
the one Go fix where the skill contract crosses the CLI boundary.

- **handoff** — `ao session handoff --dry-run` output failed its own
`handoff.v1.schema.json` (reproduced: 3 errors). Fixed with a consumer
audit: schema keeps v1 with the doctrine-retired fields as optional
deprecated read-compat properties; the generator keeps its
collision-safe fractional id (schema pattern widened instead); real
jsonschema validation in `TestHandoffDryRunSatisfiesSchema` + a
legacy-artifact compat test; `read_clock` effect declared.
- **dcg** — corrected the false "`rm -rf ./build` allowed" claim (live
0.5.6 blocks it) and a nonexistent rule id in the allowlist example
(silent no-op) across six files; removed a token-splitting "workaround"
that was an executable guard bypass, replaced with file/stdin handling
and a never-reconstruct warning; temp-path rule live-probed and stated
identically in both docs; version/path/upstream corrections.
- **cc-hooks** — ships-by-default contradiction reconciled;
PATH-clobbering recipe fixed; operator-private paths removed from
shipped text; jq preflight added to the edit guard.
- **ms** — validator no longer mechanically asserts the false `effects:
[]`; it extracts the frontmatter and requires the exact honest effects
value.
- **account-rotation / status / sbh / bootstrap** — real effects
declared, both-tools-absent and destructive surfaces defined,
live-output overclaims narrowed, versions pinned.
- **shared** — advertising narrowed to the current no-bundled-references
state; retirement NOT executed (bead `.11`).

Ledger (32+8 fixed across two rounds / 8 rejected-stale / 8
deferred-with-reason):
`docs/audits/2026-07-28-skill-overhaul-reboot/wave-reports/w7.md`.

## Validation

- `go build` + `go vet` + 482 `cmd/ao` tests incl. the new schema-lock
and legacy-compat tests; dry-run validates 0 errors
- 49/49 strict frontmatter; regen clean; scenario-linkage PASS; liveness
+ anti-spiral + policy + edit-guard bats green; python ratchet
no-growth; shellcheck clean
- Cross-family review, two rounds: round 1 eight findings all fixed
(schema compat, id collision, real validation, security bypass removal,
live-probed temp rule, anchored greps); round 2 delta re-review
**VERDICT: PASS** with zero residuals

Tracker: `age-skill-overhaul-reboot-sjv7v.8`
2026-07-28 16:03:12 +00:00