mirror of
https://github.com/boshu2/agentops.git
synced 2026-09-14 15:08:13 +08:00
ao-pre-reduction@5b334a13f
17 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
ee748d580d |
feat(rip)!: retire factory command + contract corpus (soc-2rtm0 #cascade-rip) (#512)
**Wave 1 of the orchestration-substrate cascade rip** (soc-2rtm0). The
full cascade (daemon + dream/overnight + schedule/plans/watch + gc-glue
+ factory) is ~50K LOC across deeply-entangled packages — far past one
reviewable PR. Per the bead's slice directive and the recon map's
serial-by-wave verdict, this ships as sequential PRs by wave. **This is
the factory wave** (the only cleanly-disjoint slice — no KEEP-feature
entanglement).
## What this retires (operator-confirmed FULL factory retire)
**Go command surface** (no external non-test caller — clean delete):
- `cmd/ao/factory.go`, `factory_admit.go`, `factory_pilot.go`,
`factory_admission_adapter.go` (+ all tests)
- `internal/ports/factory_admission.go` +
`inmemory_factory_admission.go` (+ test) — the port was only wired to
the daemon by the deleted production adapter
- severed factory flag save/restore + command-tree assertions from
`cobra_commands_test.go` / `testutil_test.go`
**Contract corpus** (scripts, schemas, contract docs, runbooks,
fixtures, tests):
- `scripts/check-factory-{admission,claim-ledger,yield-ledger}.sh`
- `schemas/factory-{admission,work-order,yield}.v1.schema.json`
- `docs/contracts/factory-{admission,claim-ledger,yield-ledger}.*`
-
`docs/runbooks/{factory-manual-merge,daemon-factory-admission,cloud-frontier-pilot}.md`
- `tests/e2e/factory-operator-canary.sh`,
`tests/integration/test-factory-claim-ledger-ci-job.sh`,
`tests/scripts/test-factory-admission-contracts.py`,
`tests/fixtures/factory-*`
- orphaned `aggregate-observation-log` subsystem (script + integration
test + fixtures) — its only data source was the deleted
`factory-claim-ledger-strict` CI job
**CI / generated reconciliation:**
- removed 3 factory jobs from `validate.yml` (+ both `needs:` arrays +
verdict echoes); removed entries from `ci-jobs.yaml`; regenerated
`AGENTS-CI.md` (63 jobs)
- removed factory gate-ids from `GOALS.md`; trimmed
`contracts-structural-floor` factory references
- regenerated `registry.json` (177→174 CLI commands), `COMMANDS.md` (−70
lines), `cli-skills-map.md` (73→72 headings)
- updated `cli-command-surface-matrix` canary spec + fixture counts
(`top=72 sub=194 all=266`); scrubbed deleted-file links from
`documentation-index.md`, `SCHEMAS.md`, `contracts/index.md`,
`agentopsd-control-plane.md`, `insert-schema-practices.py`
## Deliberately left for the daemon-carve wave
Daemon-owned factory job types (`factory.admission`,
`factory.local-pilot`) and the `agentopsd` routing-policy schema remain
— they belong to `internal/daemon/` and retire when the daemon does.
## Gates verified green locally
`gofmt`/`go build`/`go vet`, full Go test (**11830 pass**),
`validate-ci-policy-parity`, `contract-compatibility`,
`contracts-structural-floor`, `registry --check`, `doc-release` (0
broken links), `smoke-test`, `json-flag-consistency` (0 errors),
**`contract-canaries` (failures=0)**, codex-hashes, `pre-push-gate.bats`
(55).
Diff: 66 files changed, ~16 insertions / ~5680 deletions.
Closes-scenario: soc-2rtm0#cascade-rip
Bounded-context: BC5-Runtime
Evidence: .agents/discovery/2026-05-24-rip-caller-map.md
|
||
|
|
585b3da5f9 |
test(e2e): no-mocks harness — factory, JSON-line logger, prod guards (soc-acte) (#342)
Adopts the `testing-real-service-e2e-no-mocks` skill in `tests/e2e/`.
The agentops e2e suite was already mock-free in behavior; this PR makes
the contract explicit, adds the missing harness pieces, and proves the
wiring on two scripts.
**Bead:** soc-acte
**Closes-scenario:** soc-acte#e2e-harness-adoption
**Bounded-context:** BC4-Tests
**Evidence:** tests/e2e/README.md (Mock Risk Assessment Matrix); local
proof-run.sh 20/20 PASS; goals-scenarios-link.sh F1 PASS; shellcheck -S
warning clean
## What landed
- `tests/lib/e2e-guards.sh` — refuse-to-run if `$HOME` / repo dir / `ao`
binary look real. Strict defaults per the skill's "never hit prod from
tests" rule. Documented `AGENTOPS_E2E_ALLOW_UNSAFE=1` bypass logs loudly
to stderr.
- `tests/lib/e2e-logger.sh` — JSON-line CI-parseable sidecar. Stable
schema: `{ts, suite, phase, event, message, data}` where `event ∈
{suite_start, phase_start, pass, fail, assert, artifact, db_snapshot,
suite_end}`. jq-graceful degrade.
- `tests/lib/e2e-factory.sh` — sandbox + repo + ao binary + `.agents/`
skeleton + fixture-copy builders. `PROOF_AO_BIN` / `PROOF_FORCE_BUILD`
resolution preserved verbatim.
- `tests/e2e/proof-run.sh` — adopts all three across all 6 phases.
**20/20 checks PASS** end-to-end.
- `tests/e2e/goals-scenarios-link.sh` — adopts factory + guards. **F1
e2e PASS.**
- `tests/e2e/README.md` — e2e contract + Mock Risk Assessment Matrix (11
paths scored).
## Mock Risk audit
Score≥8 mock-free coverage: **6/11 → 11/11**. The 2 acceptable ⚠ rows
(openclaw `httptest` fixture, Claude CLI non-determinism) score <8 /
advisory respectively — see README for the rationale on each.
## Sibling pattern
Mirrors the shared-lib + per-script-adoption shape from
`tests/lib/colors.sh` (the existing convention for cross-script shell
helpers in this repo).
## Follow-up (not in this PR)
The remaining `goals-*.sh` and `closure-integrity-grace.sh` adopt the
same harness pattern (~5 lines each); mechanical and low-risk.
Co-authored-by: Codex <codex@example.invalid>
|
||
|
|
1f0e545a51 |
Executable spec layer (epic soc-58nt, F2–F5): GOALS as BDD acceptance criteria (#292)
* feat(goals): F2.0 scenario-result artifact contract + producer/writer
bead: soc-58nt.2.6
* docs(goals): F4.0 trace link convention ADR-0005
bead: soc-58nt.4.8
* docs(goals): F3.0 domain-slice manifest contract + ADR-0004
bead: soc-58nt.3.8
- schemas/domain-slice-manifest.v1.schema.json: JSON Schema (draft/2020-12,
additionalProperties:false) for domain-slice manifests. All required fields:
domain, version, bounded_context, directive_ids (d-<slug> pattern), scenario_ids,
context_roots, allowed_read_globs, denied_read_globs, validation_commands, owner.
- docs/adr/ADR-0004-domain-slice-manifest-contract.md: records four decisions:
(A) command shape is ao rpi phased --domain <name>; (B) manifest is durable
tracked artifact at docs/domains/<name>/manifest.yaml; (C) reconciles with the
domain skill (vocabulary), context-map.md (architecture view), and skill
frontmatter — no overlap; (D) Go model named domainSliceManifest, explicitly
distinct from rpi_phased_manifest.go's phaseManifest. Cross-references ADR-0003.
- docs/domains/README.md: explains the directory, field table, relationship to
the three pre-existing domain surfaces, and how to add a new slice.
- docs/domains/example/manifest.yaml: fully populated example; validated against
the schema via jsonschema (PASSED).
* feat(goals): F2.1 scenario-result aggregation reader
bead: soc-58nt.2.1
* feat(rpi): F3.1 domainSliceManifest model + loader
Implements the domainSliceManifest Go model and loader in
cli/internal/domainslice/ per the F3.0 contract (ADR-0004, Decision D).
Uses gopkg.in/yaml.v3 with KnownFields(true) to reject unknown fields,
mirrors the schema's additionalProperties:false. Validates all required
fields, directive_id pattern (^d-[a-z0-9][a-z0-9-]*$), context_roots
minItems:1, and validation_commands sub-fields with field-named errors.
Explicitly distinct from phaseManifest (rpi_phased_manifest.go).
28 tests pass (L1 unit + L2 fixture round-trip via docs/domains/example/manifest.yaml).
bead: soc-58nt.3.1
* feat(goals): F4.1 read-only executable-spec trace graph walker
bead: soc-58nt.4.1
* feat(goals): F2.2 per-directive scenario_satisfaction + threshold verdict
bead: soc-58nt.2.2
* feat(rpi): F3.2 ao rpi phased --domain scoping
bead: soc-58nt.3.2
* feat(goals): F4.2/F4.3 ao goals trace --from / --orphans
beads: soc-58nt.4.2 soc-58nt.4.3
* feat(goals): F4.4 ao goals render — GOALS.md to Gherkin
bead: soc-58nt.4.4
* feat(rpi): F3.3a domain-scope audit evidence
bead: soc-58nt.3.3
* feat(goals): F2.3 scenario_satisfaction JSON field + --scenarios-only
Per-directive scenario satisfaction added to ao goals measure: 0 -> 8
new JSON fields and a --scenarios-only mode that skips gate execution.
bead: soc-58nt.2.3
* feat(rpi): F3.4 ao rpi phased --scaffold-domain
bead: soc-58nt.3.4
* test(goals): commit missing goals-trace scenario-results fixture
The F4.1/F4.2 walker tests reference a scenario-results.json fixture under
a gitignored .agents/ subpath; it was never force-added and a clean
checkout (and CI) lacks it, failing 5 scenario_result tests. Force-add it.
bead: soc-58nt.4.1
* fix(goals): F4.1 tighten goalstrace scenario-claim heuristic
bead: soc-58nt.4.9
- Tighten scenarioTokenRe: auto- tokens now require at least two
hyphen-separated slug segments (auto-X-Y…), so single-word English
compounds like auto-merge and auto-update are no longer matched.
- Downgrade broken_bead_scenario_claim from error to warning when the
claim comes from a heuristic (ConfidenceLow) free-text match; per
ADR-0005 §4.1 only an explicit Scenarios: line constitutes a broken
explicit link and may produce an error.
- Add beads_test.go with table-driven tests covering: English auto-*
false-positive rejection, real multi-segment auto-* ID detection,
explicit missing scenario → error, heuristic missing → warning only,
resolvable scenario → no defect, end-to-end Walk with auto-merge bead
produces no error-severity finding.
* test(goals): F2.T1 regression-coverage audit + gap fill
bead: soc-58nt.2.4
* ci(goals): F1.6 wire executable-spec link lint + trace-orphans (warn-first)
bead: soc-58nt.1.9
* feat(rpi): F3.3b runtime hook enforcement of domain scope
bead: soc-58nt.3.9
* test(goals): F2.T2 e2e script for scenario-satisfaction gate
bead: soc-58nt.2.5
* docs(goals): F5.0 re-steer policy + mutation-safety contract (ADR-0006)
bead: soc-58nt.5.9
* docs(goals): fix streak-reset prose in ADR-0006 (cleanup)
bead: soc-58nt.5.9
[no-sibling] prose fixup only, no structural change
0 → 0 schema fields changed
* test(goals): F4.T1 regression-coverage audit + gap fill
bead: soc-58nt.4.6
* feat(wiki): land wiki bounded context waves 1-4 (epic soc-behj)
Phased strangler consolidating ao's .agents/-touching logic into one
cli/internal/wiki bounded context. Each wave gated by the 102 cmd/ao
integration tests staying green; legacy command surface untouched.
- W1 soc-1lju FrontmatterCodec — all 5 frontmatter parsers delegate
- W2 soc-36lw CorpusLocator — agentsDirIn moved, 17 call sites migrated
- W2 soc-f4tr Artifact + Claim domain types with subtype invariants
- W3 soc-vot0 persistent WikiIndex — JSONL, incremental by content-hash
- W3 soc-r08p FreshnessPolicy — claim-level evidence-driven freshness
- W4 soc-ijp8 WikiPipeline — subsumes llmwiki loop, 3 stages wired
- W4 soc-q50a port conformance suite
Also anchors .gitignore's bare wiki/ pattern with a !cli/internal/wiki/
negation — the new package was being silently ignored.
Wave 5 (ao wiki command group) is not included in this commit.
* test(goals): F4.T2 e2e script for trace chain
bead: soc-58nt.4.7
* test(rpi): F3.T1 regression-coverage audit + gap fill
bead: soc-58nt.3.6
* test(rpi): F3.T2 e2e script for domain-scoped RPI
bead: soc-58nt.3.7
* feat(goals): F5.1 verdict ledger schema + writer
bead: soc-58nt.5.1
* feat(goals): F5.2 re-steer policy engine + verdict-ledger producer hookup
bead: soc-58nt.5.2
* feat(goals): F5.4 feedback-to-learning compiler
Adds cli/internal/feedbackcompiler — scans the verdict ledger for
fail->pass directive transitions and drafts a learning entry in
docs/learnings/ for each transition found. Drafts carry status: draft
and directive_id frontmatter (ADR-0005 §2.6). Never auto-promotes.
Idempotent: skips existing drafts on re-run.
Also documents the auto-draft workflow in
skills/forge/references/feedback-compiler-drafts.md with a compact
reference-link in skills/forge/SKILL.md (under 248-line limit).
Synced to skills-codex/forge/ and regenerated codex hashes.
bead: soc-58nt.5.4
* docs(goals): F5.5 compound-engineering retro in /post-mortem
Extend the /post-mortem skill with a Compound-Engineering Retro section
that compares iteration N vs N-1 for a domain slice using the F5.1 verdict
ledger (.agents/goals/verdict-ledger.json). The mode emits a comparative
delta — directives that improved (fail→pass, satisfaction up), regressed
(pass→fail, satisfaction down), or held stable — plus learning yield since
N-1, written as a status:draft learning to .agents/learnings/.
Detailed step-by-step procedure (CE.0–CE.5) lives in
references/compound-engineering-retro.md; SKILL.md carries a compact
trigger/commands summary and links to it. Both files synced to
skills-codex/post-mortem/ with updated codex hashes.
bead: soc-58nt.5.5
* feat(goals): F5.3 ao goals steer --auto with human-gated confirmation
bead: soc-58nt.5.3
* test(goals): F5.T1 regression-coverage audit + gap fill
bead: soc-58nt.5.7
* test(goals): F5.T2 e2e script for auto re-steer
bead: soc-58nt.5.8
* docs(goals): F2.4 docs regen for scenario-satisfaction gate + epic CLI artifacts
Regenerate cli/docs/COMMANDS.md and registry.json from a clean worktree at
HEAD so the soc-58nt command surface is documented without leaking unrelated
peer WIP into the generated docs.
F2 (soc-58nt.2.7): document scenario_satisfaction JSON shape, --scenarios-only,
result-artifact resolution, and exit codes in skills/goals/SKILL.md +
references/executable-spec-chain.md; cross-ref ao goals measure/trace from
skills/scenario/SKILL.md.
Epic-wide artifacts also landed here because they regenerate atomically across
F2-F5: COMMANDS.md/registry.json (all new ao goals/rpi surface), cli-skills-map
heading count, skills-codex hashes, ADR-0004/0005/0006 documentation-index
links, and the F2-F5 e2e CI lanes in validate.yml.
ao capabilities and ao robot-docs need no manual edits — both build their
command/flag surface from the live cobra tree, so new commands register
automatically (Global Rule G5 satisfied by construction).
bead: soc-58nt.2.7
* docs(domain): F3.5 domain-as-loop docs for domain-scoped RPI
Document the domain-slice runtime in skills/domain/SKILL.md (a "Domain as a
scoped RPI loop" section connecting the Slice primitive to ao rpi phased
--domain / --scaffold-domain / --force) and add the Domain-Slice row to the
modes table in skills/scaffold/SKILL.md, mirroring the existing Project/
Component/CI mode-row shape. The scaffold skill's Domain-Slice Mode section
already covered the workflow; this lands the missing modes-table entry so the
mode count is 3 -> 4.
The COMMANDS.md/registry/CI-lane regen for F3 landed in soc-58nt.2.7.
skills-codex hashes for the two changed skills refreshed via
scripts/regen-codex-hashes.sh; codex-parity audit clean.
bead: soc-58nt.3.5
* docs(goals): F5.6 re-steer loop docs in /post-mortem
Cross-reference the auto re-steer loop from the Compound-Engineering Retro
section of skills/post-mortem/SKILL.md: when the compound retro names a
chronically regressing directive, ao goals steer recommend prints
policy-driven directive mutations from the same verdict ledger and ao goals
steer apply writes the mutation to GOALS.md, human-gated via the non-lossy
patcher (ADR-0006). Mirrors the existing "closing the loop" cross-ref shape
used elsewhere in the skill's See Also prose.
The ao goals steer recommend/apply COMMANDS.md surface, the F5 e2e CI lane,
and the ADR-0006 documentation-index link landed atomically in soc-58nt.2.7's
epic-wide regen; the re-steer contract detail lives in
skills/goals/references/executable-spec-chain.md (also in 2.7).
skills-codex/post-mortem hash refreshed; codex-parity audit clean.
bead: soc-58nt.5.6
* docs(goals): F4.5 docs regen for goals trace + render (epic-subsumed)
F4's docs deliverables — the `ao goals trace` and `ao goals render` entries in
cli/docs/COMMANDS.md, the F4 trace-chain e2e CI lane in validate.yml, the
ADR-0005 documentation-index link, and the Trace/Render mode sections plus the
trace contract in skills/goals/SKILL.md + references/executable-spec-chain.md —
all co-landed atomically in soc-58nt.2.7's epic-wide CLI-reference regen
(commit
|
||
|
|
0b65c1ac3b |
test(goals): F1 executable-spec link e2e script
F1.7 of epic soc-58nt. tests/e2e/goals-scenarios-link.sh exercises 'ao goals scenarios --create' and '--lint' end-to-end in an isolated temp repo: bidirectional link creation, a clean lint pass, a broken-link lint failure, and byte-for-byte preservation of non-target GOALS.md content. shellcheck --severity=error clean, set -euo pipefail, per-step logging (argv, temp root, scenario path, GOALS.md link, lint JSON, exit codes). Registered in CI as a step of the validate-goals-validate job (which already builds cli/bin/ao). Closes soc-58nt.1.7. |
||
|
|
729fbf8ab6 |
Sharpen RPI lifecycle: criterion contract + isolation enforcement + daemon executor swap (soc-bcrn) (#255)
* feat(rpi): executionPacket criterion contract foundation (UW0 of soc-bcrn) Extend executionPacket with EpicCriteria []rpi.Criterion and BeadCriteria map[string][]rpi.Criterion, backed by a new exported rpi.Criterion type. Add JSON schema (draft 2020-12) covering envelope + criterion shape; if/then enforces agent_judge when check_type == custom_rubric (pre-mortem advisory fix #1). DoneCriteria preserved verbatim for v1 back-compat. New round-trip tests cover criteria-populated, v1-no-criteria, custom-rubric, and omitempty cases. Lands soc-bcrn.1.1 (E1.1). go test ./... → 11911 passed in 50 packages. * feat(skills): acceptance_criteria contract across discovery/plan/crank/validation (UW1 of soc-bcrn) Wire the per-criterion contract through the lifecycle skills (text-only; no code changes). Skill text now references the JSON schema landed in UW0 (schemas/execution-packet.schema.json) as canonical. soc-bcrn.1.2 — discovery/plan emit acceptance_criteria fences: - skills/discovery/SKILL.md STEP 4 + STEP 6 amendments - skills/discovery/references/output-templates.md links the schema - skills/plan/SKILL.md issue-decomposition step requires the block soc-bcrn.1.3 — crank pre-spawn read + per-criterion checkpoint: - Step 4 instructs orchestrator to inject metadata.validation.acceptance_criteria - Step 5.7 checkpoint format adds criterion_verdicts[] soc-bcrn.1.4 (E1.4+E1.5 merged on shared file) — validation: - Per-criterion verdict table replaces vibe-only - Back-compat WARN until 2026-06-30, then FAIL (pre-mortem fix #2) - New skills/validation/references/per-criterion-rubric.md go test ./... → 11833 passed in 50 packages. * fix(skills): correct check_type terminology in crank acceptance-criteria injection Worker B's UW1 amendment hallucinated `kind (test|structure|content|command|lint)` as the criterion field/enum. Actual schema uses `check_type` with enum `test_pass | command_exit_zero | file_exists | grep_match | manual | council_judge | custom_rubric`, plus the conditional `agent_judge` field for `custom_rubric`. Replace with the verbatim shape from schemas/execution-packet.schema.json $defs/Criterion. Caught by self-review of 81d729fc. * feat(rpi,skills): isolation contract + lint + addSignalWithEvidence (UW2 of soc-bcrn) soc-bcrn.2.1 (E2.1+E2.3 merged): - skills/rpi/references/isolation-contract.md (NEW): codifies PRODUCT.md operational principle #5 with declaration-vs-enforcement framing, four-lever table (text / hook / daemon / combination — recommends D), compression patterns + false-positive guard. - scripts/check-skill-isolation.sh (NEW, executable): bash lint that greps phase-skill SKILL.md for compression patterns. Runs clean on current tree; injection-regression test passes (rc=1 on 'I will research' violation). soc-bcrn.3.3 (E3.S2): - session_outcome.go: addSignalWithEvidence(regex, evidence, weight) override path; tests_pass now credited via either regex or evidence. - internal/rpi/artifacts.go: LaneResult + ParseValidationLanesResults (forward-compat — accepts {passed:bool}, {status:"PASS"}, {result:"PASSED"}; empty slice when packet field absent). - rpi_evaluator.go: collectPhaseSessionOutcome reads packet validation_lanes_results and threads any-PASS reduce to evidence path. - session_outcome_test.go: 3 new tests cover override, both-false, regex-alone. UW2 verify-only beads (closed without code): - soc-bcrn.3.1 (E3.S1): captureCreatedEpicID already merged at rpi_phased_discovery.go:43, primary callsite rpi_phased_gates.go:83. - soc-bcrn.3.2 (E3.S3): preserveWorktreeCommits already merged at rpi_cleanup.go:399, called BEFORE git worktree remove --force. go test ./... → 11833 passed in 50 packages. * feat(skills,scripts): isolation-contract cross-links + RPI surface smoke (UW3 of soc-bcrn) soc-bcrn.2.2 (E2.2): Cross-link skills/{rpi,discovery,crank,validation}/SKILL.md to the isolation contract reference doc landed in UW2. Each link uses the lint-allowed `See [...](path)` form. lint runs clean. soc-bcrn.3.4 (E3.S4): scripts/test-rpi-surface-smoke.sh (NEW, executable). Static-surface smoke covering 6 checks: bin presence, schema validity, skill-isolation lint, dangling commits (informational), bd workspace, schema-criterion-fields. Returns PASS/FAIL summary. Path-collision recovery: bead body said scripts/test-evolve-cycle-smoke.sh, but that path was already taken by PR #241 (end-to-end cycle smoke wired into pre-push-gate's --smoke-evolve flag). Restored the original; renamed this new static-surface smoke to scripts/test-rpi-surface-smoke.sh. The two scripts have distinct purposes (cycle E2E vs static surface) and should coexist. go test ./... → 11832 passed in 50 packages. * docs(rpi): rollback discipline note in phase-data-contracts.md (UW4 of soc-bcrn) soc-bcrn.3.5 (E3.W3): document phase-3-first / phase-2-second rollback discipline. Re-routed from the plan's `program-templates/phase-{2,3}.md` path (which doesn't exist in the repo) to the existing phase-data-contracts.md ref doc. Pre-mortem F3 of soc-bcrn flagged this as the primary rollback risk for E3 (consolidated daemon epic). E3.S3 (already merged) is the worked example: preserveWorktreeCommits (phase-3 logic) shipped BEFORE the phase-2 cleanup-removal. soc-bcrn.2.3 (E2.4 verify): closed without code change — isolation-contract.md already has 3 forward-references to rpi_run.go from UW2. go test ./... → 11834 passed in 50 packages. * feat(daemon): RPIRunExecutor in-process runner replaces CLI-fallback shell-out (UW5/5a of soc-bcrn) soc-bcrn.3.6 (E3.W4 sub-wave 5a, additive): - NEW cli/internal/daemon/rpi_run.go: RPIRunExecutor with function-pointer pattern (RPIRunFunc). Mirrors DreamExecutor structure. Validates full-cycle specs (start_phase=1, max_phase=3) and emits artifacts tagged executor_policy=in-process / backend=in-process. - NEW cli/internal/daemon/rpi_run_test.go: 5 tests (runs-via-func, rejects-wrong-jobtype, propagates-runner-error, validate-full-run, requires-fields). - agentopsd.go: buildAgentOpsDaemonCLIFallbackRPIExecutor now wires RPIRunExecutor with defaultCLIFallbackRPIRunFunc that calls runPhasedEngine in-process. New CLIFallbackRPIRunFunc option lets tests inject fakes. buildPhasedEngineOptionsFromSpec maps obvious fields (RunID, TestFirst, ExecutionPacketPath→DiscoveryArtifact, PhaseTimeout); other phasedEngineOptions fields use defaults. - agentopsd_test.go: TestAgentOpsDaemonCLIFallbackExecutorPolicyCompletesRPIRunJob rewritten to inject a fake RPIRunFunc instead of writing fake shell scripts. Asserts executor_policy=in-process, backend=in-process, rpi_run_status=completed. ADDITIVE only — RPICLIExecutor and scripts/ao-rpi-autonomous-cycle.sh preserved for nightly-evolution.sh until sub-waves 5b/5c migrate them. RPICLIExecutor has zero production callers after this change (only its own test file references the type). go test ./... → 11832 passed in 50 packages. * fix(daemon): RPIRunExecutor wraps supervisor (gates+landing+cycles) (UW5/5a-fix of soc-bcrn) soc-bcrn.3.8 — fix the regression sub-wave 5a introduced. Sub-wave 5a's defaultCLIFallbackRPIRunFunc called runPhasedEngine alone, silently losing the gate/landing/cycle semantics of the old shell wrapper that ran ao rpi loop --supervisor. Daemon-submitted rpi.run jobs would have skipped landing-policy enforcement. Changes: - RPIRunJobSpec gains 7 supervisor policy fields (all omitempty for back-compat): MaxCycles, GatePolicy, LandingPolicy, LandingBranch, BDSyncPolicy, FailurePolicy, KillSwitchPath. - agentopsd.go:defaultCLIFallbackRPIRunFunc now calls executeLoopCyclesCtx (thin context-aware wrapper around executeLoopCycles) — full supervisor loop with gates + landing + cycle management. - New buildSupervisorConfigFromSpec(spec, root) helper translates spec policy fields into rpiLoopSupervisorConfig, then validates via the supervisor's own validateLoopConfigPolicies. - Lease disabled in daemon path (cfg.LeaseEnabled=false) — daemon already owns queue-level claim; lease would deadlock. - Deleted dead helper buildPhasedEngineOptionsFromSpec. - 5 new tests: spec round-trip with policy fields, defaults-empty back-compat, spec→cfg mapping (3 cases incl. invalid-enum rejection). Forward-compat caveats noted in worker discoveries (NOT fully wired): - MaxCycles in spec is read but rpiLoopSupervisorConfig has no MaxCycles field; cycle count comes from the cobra-bound rpiMaxCycles global. Daemon path runs one cycle (matches nightly script default). - RunID, ExecutionPacketPath, TestFirst, PhaseTimeout in spec are not yet projected onto the cfg. go test ./... → 11835 passed in 50 packages. * feat(scripts,docs): nightly-evolution + 3 docs migrate to ao daemon submit (UW5/5b of soc-bcrn) soc-bcrn.3.7 (E3.W4 sub-wave 5b): scripts/nightly-evolution.sh — replace shell wrapper invocation (`scripts/ao-rpi-autonomous-cycle.sh`) with `ao daemon jobs submit --type=rpi.run` + `ao daemon jobs wait`. Liveness-probe via `ao daemon jobs list --json` before submit. Payload now carries supervisor policy fields (max_cycles, gate_policy, landing_policy, optional landing_branch) via the spec extension landed in 5a-fix; daemon executor runs the full supervisor loop (cycles + gates + landing). docs/contracts/agentops-daemon.md, docs/runbooks/daemon-factory-admission.md, docs/contracts/factory-admission.md — replace stale references to `scripts/ao-rpi-autonomous-cycle.sh` with the new in-process path (RPIRunExecutor, cli/internal/daemon/rpi_run.go). scripts/ao-rpi-autonomous-cycle.sh and cli/internal/daemon/rpi_cli_executor.go remain in-tree pending sub-wave 5c (deletion). go test ./... → 11835 passed in 50 packages. bash -n scripts/nightly-evolution.sh → clean. * chore(daemon): delete RPICLIExecutor + ao-rpi-autonomous-cycle.sh shell wrapper (UW5/5c of soc-bcrn) soc-bcrn.3 final E3.W4 cleanup. After sub-waves 5a (RPIRunExecutor), 5a-fix (supervisor wrapping + policy fields), and 5b (nightly migration to ao daemon submit), all production callers of these surfaces have been retired. Deleting: - cli/internal/daemon/rpi_cli_executor.go (5.6KB) — old shell-shelling executor - cli/internal/daemon/rpi_cli_executor_test.go (6.6KB) - scripts/ao-rpi-autonomous-cycle.sh (4.7KB) — legacy shell wrapper Final consumer audit: zero non-comment references to RPICLIExecutor or NewRPICLIExecutor remain. The new in-process path (cli/internal/daemon/rpi_run.go → executeLoopCyclesCtx) carries the same gate + landing semantics via supervisor wrapping. go test ./... → 11833 passed in 50 packages (down from 11835 — the 2 diff is from the deleted RPICLIExecutor's own tests). go build ./... + go vet ./... → clean. UW5 (E3.W4 / M3.5 daemon executor swap) complete. * docs(skills): best-practices citation table + 4 SKILL.md cross-links (UW6 of soc-bcrn) soc-bcrn.4 (E4 — Best-practices encoding): E4.1: NEW skills/rpi/references/best-practices.md. Table A (14 lifecycle principles) + Table B (6 anti-patterns) extracted verbatim from .agents/research/2026-05-07-rpi-lifecycle-sharpening.md §Objective 4. Each row carries a source citation and which skills should encode it. The doc explicitly says lifecycle skills MUST cite by # — never duplicate the body. E4.2: skills/{rpi,discovery,crank,validation}/SKILL.md — one-line cross-link added next to the existing isolation-contract.md citation. Each link uses the lint-allowed `See [...](path)` form. lint runs clean. Mechanical-enforcement section in best-practices.md cross-references prior soc-bcrn waves (UW0 schema $defs/Criterion, UW1 per-criterion-rubric, UW2 check-skill-isolation lint). go test ./... → 11832 passed in 50 packages. * feat(daemon,schema): agent-update protocol surface (UW7-1 of soc-y0ct) soc-y0ct.1 — protocol surface (schema + event types + payload structs). Defers ac-aup.3 (rpi_run.go emission) to a follow-up bead since it requires careful integration with the supervisor's existing event flow. - schemas/agent-update.schema.json (NEW): draft 2020-12 envelope {agent_update_version, event_type, payload}; 4 $defs (phase_start, phase_complete, criterion_verdict, phase_handoff) with allOf+if/then for type-tagged payload dispatch (mirrors UW0 Criterion's custom_rubric pattern). - cli/internal/daemon/types.go: 4 new EventType constants registered in the const block AND eventTypeSet (required for ValidateEventType). - cli/internal/daemon/agent_update.go (NEW): AgentUpdateVersion=1, 4 payload structs, 4 NewAgentUpdate*Event constructors that stamp the version, default empty timestamps, emit only-non-zero optional fields. Constructors deliberately leave EventID/RequestID/JobID/Actor unset — emission caller populates those. - cli/internal/daemon/agent_update_test.go (NEW): 7 test functions covering const + ValidateEventType registration, 4 payload round-trips, version stamping, and timestamp default. Status enums per spec: phase_complete uses lowercase (success|failure| timeout) matching JobResultStatus; criterion_verdict uses uppercase (PASS|FAIL|SKIP) matching the verdict vocabulary in schemas/verdict.v1.schema.json. go test ./... → 11842 passed in 50 packages (up from 11833 — the +9 is the new tests under ./internal/daemon/). * feat(tests,docs): wave 0 operator canary + software-factory drift stopgap (soc-kizn.11) Adds tests/e2e/factory-operator-canary.sh: narrow L1/L2 smoke that prints the five operator-surface anchors (briefing, next delivery, validation, evidence, closeout) and reports each as resolved-path or explicit-unavailable. Does not claim factory yield, autonomous merge, or L3 proof. Reframes the Codex section of docs/software-factory.md so the canonical hookless route is `agentopsd` (`ao daemon submit ...`), and `ao codex *` is documented only as deprecated legacy fallback. Strips routine `ao codex *` recommendations from the Surface Map. Validation now passes: `rg 'ao codex (start|stop)|ao codex ensure-(start|stop)' docs/software-factory.md | rg -v 'hookless|compat|legacy|fallback|deprecated'` returns empty. Full Codex skill/runtime parity cleanup remains tracked in soc-kizn.8. * docs(skills): move forge Examples to references/ to fit 248-line CI limit (soc-pul8) skills/forge/SKILL.md was 260 lines after the soc-yjzp.3 cross-vendor analog edit, over the 248-line skill-lint ceiling. Moves the two Examples walkthroughs (SessionEnd hook invocation + manual transcript mining) to skills/forge/references/examples.md, replacing the section body with a link. Now 237 lines. heal.sh --strict clean (new references file is linked). hooks/skill-lint-gate.sh exits 0. Codex parity audit passes. * fix(skills): copy rpi references into crank/discovery/validation, fix dead-ref gate UW3 ( |
||
|
|
02c0649c02 |
Nightly 2026-04-26 v3 — 10 productive cycles, 0 stale-audits, +0 code-driven goals (corpus-state isolated) (#152)
* gate(flywheel-compounding): split σ=0/ρ=0 dormant hint from ρ=0-only The flywheel-compounding gate had one branched hint (ρ=0 → "use --cite applied|reference"), but ρ=0 covers two distinct corpus states: - σ=0 AND ρ=0 — no citations of ANY kind in the measurement window; the corpus is dormant. The fix is "run any ao lookup", not "switch --cite kind". The high-confidence hint is misleading here. - σ>0 AND ρ=0 — citation activity exists but only as retrieved-only hits; the existing hint applies. Add the σ=0 ρ=0 → dormant branch and a 6-case bats fixture pinning the three hint branches (PASS, σ=0 ρ=0 dormant, ρ=0-only, generic) plus the ao-failure path. Operators now see the right remediation per failure mode without inferring it from the σρδ numbers. This is a heavy-goal observability improvement, not a metric flip — the goal stays fail until corpus citations land over multiple sessions. https://claude.ai/code/session_01TVzMVJ8FXdctstCrzTcM7T * refactor(codex_runtime): split detectLifecycleRuntimeProfile (CC 20→<14) detectLifecycleRuntimeProfileWithOptions sat at the cli/ CC ceiling (20). Any future case-arm tweak (e.g., a new runtime kind, or a new sub-state in the existing four) would have pushed it past the gate's threshold. Refactor: bundle the per-runtime config paths into a small struct (lifecycleManifestPaths) shared by four per-runtime helpers (populateCodexProfile / populateClaudeProfile / populateOpenCodeProfile / populateUnknownProfile). The detector body shrinks to a switch over the four helpers; each helper is straight-line and testable in isolation. Behavior unchanged — verified via: - go test -race ./cmd/ao -run "Lifecycle|Codex|Runtime" - ./bin/ao codex status --json (live invocation, same JSON shape and same "Detected Codex runtime without native hook support" reason) - go-complexity-ceiling gate: cli/ <20, cli/internal/ <18 https://claude.ai/code/session_01TVzMVJ8FXdctstCrzTcM7T * test(hooks): pin research-loop-detector behavior across 14 cases The PostToolUse research-spiral detector at hooks/research-loop-detector.sh had zero test coverage. A bad edit to the threshold ladder, the read-only-bash classification, the kill-switch short-circuits, or the JSON nudge formatting would ship silently. Add a bats fixture covering: - counter increment on Read/Grep/Glob/WebSearch/WebFetch - WARN/STRONG/STOP threshold transitions at 8/12/15 with the exact nudge text for each band - reset on Edit/Write/NotebookEdit - read-only Bash (grep/rg/cat/...) increments; execution Bash resets - AGENTOPS_HOOKS_DISABLED and AGENTOPS_RESEARCH_LOOP_DISABLED kill switches both short-circuit before any state mutation - threshold env-var overrides (AGENTOPS_RESEARCH_WARN_THRESHOLD) - STOP precedence over STRONG/WARN when all three are tied at 1 - emitted JSON parses round-trip via jq -e Run against the live hook in a tmpdir mock-repo to keep tests hermetic. All 14 scenarios PASS. Pure-test addition: no production code touched, no fitness regression. https://claude.ai/code/session_01TVzMVJ8FXdctstCrzTcM7T * refactor(notebook): split runNotebookUpdate (CC 19→11) for headroom runNotebookUpdate sat at CC=19 — close to the cli/ ceiling of 20 — and mixed three concerns: memory-file resolution, entry resolution, and the update pipeline itself. A single new branch (e.g., a third entry source) would have failed the gate. Extract two helpers: - resolveNotebookMemoryFile(cwd) (string, bool) - resolveNotebookEntry(cwd) *pendingEntry Each is straight-line and individually testable; the main function now reads as a four-step pipeline (memory-file → entry → cursor-skip → parse/render/write). Behavior preserved — `ao notebook update --quiet` exit 0, no output, no state mutation when no MEMORY.md / no session entry. All cmd/ao tests pass; CC drops to 11 (well clear of the 20 ceiling). https://claude.ai/code/session_01TVzMVJ8FXdctstCrzTcM7T * test(beads): pin five 0%-coverage helpers behind 19 cases Five small pure helpers in cli/cmd/ao/beads.go and beads_audit_cluster.go had 0% line coverage: - beadMinInt — drives matches[:min(3, len)] citation clipping - beadTruncate — wraps the bd parse-error message - representativeIsEpic — picks epic vs leaf rendering for cluster output - firstNNonEmptyLines — derives the cluster summary excerpt - sortedMapKeys — supplies deterministic JSON ordering A regression in any of them would corrupt user-visible output silently (wrong message text, garbled cluster summary, non-deterministic JSON ordering breaking diffs) rather than panicking. None had a test pinning behavior. Add 19 cases covering: smaller-of-two and equal-args boundaries (incl. negatives and zeros), under/at/over the truncation limit (incl. n=0 on non-empty), epic-found / leaf-found / representative-missing / empty-cluster branches of representativeIsEpic, whitespace-handling and trim semantics of firstNNonEmptyLines, deterministic key order of sortedMapKeys regardless of bool values. All cases assert exact expected values (per .claude/rules/go.md). No production code touched; fitness unchanged at 92.66. https://claude.ai/code/session_01TVzMVJ8FXdctstCrzTcM7T * refactor(contradict): split runContradict (CC 19→5) into 5 helpers runContradict bundled four concerns at CC=19 — close to the cli/ ceiling of 20: directory existence checks, file collection, entry parsing, pair-comparison loop, and dual-format output. A new file source or a new output format would have failed the gate. Extract: - collectContradictFiles: globs *.jsonl + *.md from learnings/patterns - parseContradictEntries: reads + tokenizes, drops empty/zero-word files - compareContradictPairs: O(n²) jaccard ≥ 0.4 + detectContradiction - relPathOrAbs: Rel-with-fallback path helper (lifted from inline blocks) - emitContradictResult: JSON-or-human writer Behavior preserved — verified via: - go test ./cmd/ao -run Contradict - ./bin/ao contradict (human output identical: 20 files, 190 pairs) - ./bin/ao contradict --output json (same {"total_files":20,...} shape) CC drops: runContradict 19→5; new helpers all ≤6. Headroom for future file-source additions. https://claude.ai/code/session_01TVzMVJ8FXdctstCrzTcM7T * refactor(rpi_serve): split serveRPIState (CC 19→5) into 4 helpers serveRPIState mixed five HTTP-handler concerns at CC=19 — close to the cli/ ceiling: query-param parsing/validation, run-id resolution against the registry, fallback phased-state.json read, per-phase result gathering, and the active-runs listing. A new state source or response key would have failed the gate. Extract: - parseServeStateRunID: Validate run-id, write 400 on path traversal - resolveStateForRunID: Look up the run via resolveServeRun, write to resp on success, return the resolved root - loadFallbackPhasedState: Read .agents/rpi/phased-state.json directly only if the resolver did not already populate phased_state - loadPhaseResults: Gather phase-{1,2,3}-result.json into a phase_N map Behavior preserved — verified via: - go test ./cmd/ao -run TestServeRPIState (existing handler test) - go test ./cmd/ao (full package, 30s, all pass) - go vet clean CC drops: serveRPIState 19→below-5 (not in --threshold 5 listing); each new helper ≤6. https://claude.ai/code/session_01TVzMVJ8FXdctstCrzTcM7T * test(hooks): pin write-time-quality across 16 per-language scenarios hooks/write-time-quality.sh ran every Edit/Write but had zero test coverage. A regression in any branch — Go fmt.Println in non-main, Python bare-except / eval / missing-return-type-hint, shell missing set -euo pipefail, the IS_TEST exemptions, the kill switch, the JSON envelope shape — would silently degrade quality signal. Add a 16-case bats fixture covering: - tool-name filter (only Edit/Write trigger) - missing/non-existent file are silent - unsupported extension is silent - AGENTOPS_HOOKS_DISABLED kill switch short-circuits - Go: fmt.Println warns in non-main packages, silent in main and *_test.go - Python: bare except warns; eval warns outside tests, silent in test_*.py; missing return-type-hint on def-without-arrow warns - Shell: missing 'set -euo pipefail' warns; presence suppresses warning - JSON envelope (stdout-only) parses and includes hookEventName, file, language, warning_count, warnings array Each scenario uses a per-test temp file so cases don't bleed state. Pure test addition; no production code changed. NOTE: post-commit fitness measurement showed flywheel-proof transiently fail due to a 503 on sum.golang.org (DNS cache overflow downloading the go1.26.0 toolchain) — same network-flake mode PR #147 and #150 documented on the same gate. Re-measure passes (score 92.66). Not caused by this cycle (only test files touched). https://claude.ai/code/session_01TVzMVJ8FXdctstCrzTcM7T * fix(standards): add javascript.md so .js Edit/Write injects standards hooks/standards-injector.sh maps .js → "javascript" and reads skills/standards/references/javascript.md, but the file did not exist — so every .js Edit/Write silently dropped the standards-context inject. The hook's "fail-open on missing file" guard hid the gap. Add references/javascript.md (Tier 1 baseline: ESM, prettier+eslint, const/let, async/await, eqeqeq, common pitfalls, security defaults) and link it in skills/standards/SKILL.md (table row + linked-references list — required by skills/heal-skill --strict and the cmd/ao TestSkillContract_ReferencesLinkedInSKILLMD test). Sync the embedded copy via `cd cli && make sync-hooks` so the runtime manifest matches the source. Add a 12-case bats fixture for standards-injector.sh covering all six languages (go, ts, tsx, sh, js, yaml/yml), the extensionless / missing / unsupported / kill-switch silent paths, and exact-body-match assertions against the on-disk references files. Verified: - hooks/standards-injector.sh on /x.js now returns 2111-byte body matching the new file - cd cli && go test -race ./cmd/ao -run TestSkillContract — pass - bash skills/heal-skill/scripts/heal.sh --strict — All clean - cd cli && make sync-hooks idempotent NOTE: post-commit measurement shows flywheel-proof failing — same network-environmental issue as cycle 8 (sum.golang.org 503 / DNS cache overflow when the proof-run script downloads the go1.26.0 toolchain into a fresh HOME). System Go is 1.24.7 but go.mod requires 1.26.0, so GOTOOLCHAIN=local fallback also fails. Not caused by this cycle — the proof-run path does not touch standards or hooks. Same pattern PR #147 and #150 documented and shipped through. https://claude.ai/code/session_01TVzMVJ8FXdctstCrzTcM7T * fix(proof-run): reuse cli/bin/ao when present so 503s on sum.golang.org don't fail flywheel-proof tests/e2e/proof-run.sh always rebuilt ao in a fresh \$HOME, so each gate invocation re-downloaded the go1.26.0 toolchain via sum.golang.org. When the sum DB returns 503 ("DNS cache overflow") the entire flywheel-proof gate (w=7) fails — even though the local cli/bin/ao is fresh and behavior is testable. Three changes: - PROOF_AO_BIN=/path env override: caller can pin a pre-built binary - Auto-detect \$REPO_ROOT/cli/bin/ao when present (and the override is unset) — covers the common case where `make build` ran first - PROOF_FORCE_BUILD=1 escape hatch: opt back into build-from-source when the goal IS to verify the toolchain path `require_cmd go` now only fires on the build path, so machines without go installed can still run the proof against a shipped binary. Verified: - bash tests/e2e/proof-run.sh — auto-detects cli/bin/ao, all 20 flywheel checks PASS in ~6s (was failing in 90s before) - PROOF_FORCE_BUILD=1 — still attempts go build (so the toolchain- path regression test still exists) - PROOF_AO_BIN=/path/to/ao — copies binary, skips build flywheel-proof flips fail→pass after this cycle. This is a code-driven flip (the script is the gate's only build path), not a runtime artifact. https://claude.ai/code/session_01TVzMVJ8FXdctstCrzTcM7T --------- Co-authored-by: Claude <noreply@anthropic.com> |
||
|
|
2156c627ca | test(runtime): add runtime proof gates | ||
|
|
fb3584dfa4 |
fix(proof-run): split Phase 2 to use 'pool ingest' before close-loop
The flywheel-proof gate regressed after
|
||
|
|
b396c44aaa |
feat(post-mortem): closure-integrity-audit short-circuits on evidence-only packets
Teaches closure-integrity-audit.sh to recognize evidence-only closure
packets at .agents/releases/evidence-only-closures/<target>.json (or
legacy .agents/council/evidence-only-closures/...) as the strongest
proof surface — a short-circuit that bypasses scoped-file classification,
parser_miss, timing_miss, and discovery_miss paths entirely.
Adds has_evidence_only_packet(target_id) helper: returns 0 iff the
packet file exists AND jq confirms the JSON has BOTH evidence_mode and
repo_state keys (the schema written by write-evidence-only-closure.sh).
classify_child() checks the packet first before any other classification.
When it fires, emits status=pass, evidence_mode=evidence-only-packet,
detail='evidence-only closure packet accepted (short-circuit)'. The
discovery-miss WARN policy from
|
||
|
|
3af1c409ae |
fix(post-mortem): downgrade discovery-phase closure misses to WARN
closure-integrity-audit flagged timing_miss FAILs on closed beads whose cited discovery artifacts (.agents/brainstorm/, .agents/research/, .agents/discovery/) were never persisted as durable proof surfaces. Legitimately closed work with a non-discovery proof surface (commit, plan, finding, evidence-only packet) should not hard-fail here. Adds helpers is_discovery_phase_path, all_scoped_files_are_discovery, child_has_nondiscovery_proof_surface. Downgrade fires only when EVERY scoped file is discovery-phase AND at least one non-discovery proof surface exists. Non-discovery misses still hard-fail as timing_miss. Summary JSON now emits warned count and warnings[] array; evidence_modes gains discovery-seed-missing. na-22xi audit: 2 FAIL / 2 WARN -> 0 FAIL / 4 WARN. Tests 7 and 8 added to tests/e2e/closure-integrity-grace.sh covering the WARN path + the non-discovery-still-FAILS guard. Full suite: 8 passed, 0 failed. Consumes na-22xi.4 from .agents/rpi/next-work.jsonl. |
||
|
|
d584c8379f | feat(flywheel): strengthen provenance and nightly proof | ||
|
|
bfff7c1bb5 |
fix(rpi): closure-integrity audit evidence-only packets and negative-path coverage
Teach closure-integrity-audit.sh to consume evidence-only closure packets from .agents/releases/ and .agents/council/ before failing with parser_miss. Improve bead file extraction for multi-line backticked filenames and bullet-point file lists. Narrow evidence_modes catch-all to explicit allowed modes. Add 3 negative-path e2e tests (no-packet, invalid-schema, expired-grace). |
||
|
|
3534af872c |
fix(closure): add 24h grace window for close-before-commit evidence
When a bead is closed before its qualifying commit lands, the time-bounded git search misses the evidence. Added a 24h grace window that retries the search with an extended deadline. Also classifies failures as parser_miss (no scoped files extracted) vs timing_miss (files found but no evidence), making it easy to distinguish description-parsing gaps from close-timing issues. Regression test covers: grace-window pass, outside-grace fail with correct timing_miss classification, and parser_miss classification. Closes: ag-we8 |
||
|
|
8bf08b1745 | fix(flywheel): add executable lifecycle proof | ||
|
|
4abd2a69be |
docs(context): sweep remaining ao inject references across docs/tests/scripts
Wave 3 of context-enforcement-phase3: replace ao inject workflow guidance with ao lookup across documentation, test fixtures, and scripts. Remaining 32 references are legitimate (inject command implementation, CHANGELOG history, CLI reference tables, test fixtures for command detection). Files updated: - 11 core docs (context-packet, seed-definition, leverage-points, etc.) - 7 workflow diagram docs (brief, system-map, cli-skills-map, HOOKS, etc.) - 4 scripts (proof-run, test-flywheel, check-skill-flag-refs, etc.) - 3 shell tests (proof-run e2e, token-budgets, no-compaction) - 1 Go test (json_validity_test.go) - Production code: metrics_nudge.go, metrics_flywheel.go, hooks.go |
||
|
|
88e8e46eb3 |
feat(docs,tests): wave 1 — testing & documentation improvements (na-xjw)
- Fix 11 stale `tests/claude-code/` paths in testing-skills.md - Remove phantom e2e-install-test.sh reference and --skip-e2e-install flag - Add validate.sh to athena, grafana-platform-dashboard, push skills - Create docs/TESTING.md umbrella testing guide - Create docs/CI-CD.md CI architecture document - Add README.md to 6 test subdirectories - Add 17 BATS unit tests for lib/hook-helpers.sh functions - Wire orphaned tests into runners (run-all.sh + validate.yml) Issues: na-xjw.1, na-xjw.2, na-xjw.3, na-xjw.4, na-xjw.5, na-xjw.6, na-xjw.8, na-xjw.10 |
||
|
|
0ca05fd77d |
feat(flywheel): add proof-run harness and progressive skill disclosure
Adds mechanical proof that AgentOps sessions compound across 3 scripted sessions (Discovery → Compounding → Maturation), with 25/25 assertions passing including real `ao inject` CLI integration. - tests/fixtures/proof-repo/: toy Go module with 4 known issues (missing error handling, unused variable, no tests, no input validation) - tests/e2e/proof-run.sh: CI-runnable 3-session proof harness; asserts learning file creation, valid frontmatter, inject output, retrieval_count maturation, and knowledge chaining across sessions - GOALS.yaml: add flywheel-proof-passes goal (weight 6, knowledge-compounding pillar); update comment to 26 total - skills/quickstart/SKILL.md: add Step 8 "Prove the Flywheel Works" with ao inject invocation and aha-moment explanation - skills/using-agentops/SKILL.md: progressive disclosure — 8 starters visible by default (/quickstart /research /council /vibe /rpi /implement /learn /status); remaining skills in Advanced/Expert sections |