mirror of
https://github.com/boshu2/agentops.git
synced 2026-09-14 15:08:13 +08:00
main
2261 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
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. |
||
|
|
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. |
||
|
|
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. |
||
|
|
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
|
||
|
|
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. |
||
|
|
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 |
||
|
|
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. |
||
|
|
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. |
||
|
|
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 |
||
|
|
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 |
||
|
|
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. |
||
|
|
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 |
||
|
|
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. |
||
|
|
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. |
||
|
|
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. |
||
|
|
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) |  |  | --- ### 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> |
||
|
|
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. |
||
|
|
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. |
||
|
|
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> |
||
|
|
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
|
||
|
|
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. |
||
|
|
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> |
||
|
|
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>
|
||
|
|
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). |
||
|
|
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). |
||
|
|
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. |
||
|
|
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> |
||
|
|
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> |
||
|
|
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. |
||
|
|
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
|
||
|
|
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> |
||
|
|
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) |  |  | --- > [!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> |
||
|
|
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) |
||
|
|
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) |
||
|
|
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. |
||
|
|
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` |  |  | --- ### 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> |
||
|
|
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. |
||
|
|
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.
|
||
|
|
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. |
||
|
|
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.
|
||
|
|
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/**`.
|
||
|
|
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 |
||
|
|
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). |
||
|
|
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). |
||
|
|
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). |
||
|
|
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. |
||
|
|
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` |
||
|
|
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` |
||
|
|
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` |
||
|
|
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` |