Release v2.18.0

This commit is contained in:
Boden Fuller
2026-02-25 11:08:04 -05:00
parent 4a207bc0d0
commit ae954d08b6
5 changed files with 18 additions and 121 deletions
+2 -2
View File
@@ -6,13 +6,13 @@
},
"metadata": {
"description": "The missing DevOps layer for coding agents. Flow, feedback, and memory that compounds between sessions.",
"version": "2.17.0"
"version": "2.18.0"
},
"plugins": [
{
"name": "agentops",
"description": "The missing DevOps layer for coding agents. Flow, feedback, and memory that compounds between sessions.",
"version": "2.17.0",
"version": "2.18.0",
"source": "./",
"author": {
"name": "Boden Fuller",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "agentops",
"version": "2.17.0",
"version": "2.18.0",
"description": "The missing DevOps layer for coding agents. Flow, feedback, and memory that compounds between sessions.",
"author": {
"name": "Boden Fuller",
+7
View File
@@ -34,6 +34,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- SessionEnd hook now gates notebook update and memory sync on successful forge
- Type 3 setup hook template: `hooks/examples/50-agentops-bootstrap.sh`
- Constraint compiler hook: `hooks/constraint-compiler.sh`
- Codex-native skill format (`skills-codex/`) with install and sync scripts for cross-runtime skill delivery
- Comprehensive cmd/ao test coverage push — 500+ tests across 5 waves reaching 79.2% statement coverage (13 untestable functions excluded)
### Changed
- SessionStart hook default mode changed from full inject to `manual` (pointer-only context, MEMORY.md auto-loaded by Claude Code)
@@ -57,6 +59,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- `ao rpi status` goroutine leak fix — signal channel properly cleaned up
- Inline rune truncation in `formatMemoryEntry` replaced with shared `truncateText`
- 6 new tests for dedup, ambiguity detection, iteration cap, duplicate markers
- Cobra pflag state pollution between test invocations — explicit flag reset in `executeCommand()` helper
- Goals validate.sh outdated checks and missing validate.sh for 7 skills
- 10 tech debt findings from ag-8km+ag-chm post-mortem (stale nudge, scanner, docs)
- ao binary codesigned with stable Mach-O identifier
- Hook integration tests updated — removed 8 stale standalone ao-* hook tests consolidated into session-end-maintenance.sh
## [2.17.0] - 2026-02-24
+2
View File
@@ -244,6 +244,7 @@ Read `references/cache-eviction.md` for the full eviction pipeline (passive trac
### artifact-consistency-allowlist.txt
```text
# Artifact consistency allowlist
#
# Format:
@@ -272,6 +273,7 @@ Read `references/cache-eviction.md` for the full eviction pipeline (passive trac
* -> .agents/*/...*
* -> .agents/*/foo.*
* -> .agents/handoff/auto-99999999T999999Z.md
```
### artifact-consistency.md
+6 -118
View File
@@ -963,35 +963,9 @@ else
fail "ao-agents-check.sh removed from hooks.json"
fi
# ============================================================
echo ""
echo "=== ao-extract.sh ==="
# ============================================================
# Test: kill switch suppresses ao-extract
EC=0
AGENTOPS_HOOKS_DISABLED=1 bash "$HOOKS_DIR/ao-extract.sh" >/dev/null 2>&1 || EC=$?
if [ "$EC" -eq 0 ]; then pass "ao-extract kill switch"; else fail "ao-extract kill switch"; fi
# Test: fail-open without ao
EC=0
PATH="/usr/bin:/bin" bash "$HOOKS_DIR/ao-extract.sh" >/dev/null 2>&1 || EC=$?
if [ "$EC" -eq 0 ]; then pass "ao-extract fail-open without ao"; else fail "ao-extract fail-open without ao"; fi
# ============================================================
echo ""
echo "=== ao-feedback-loop.sh ==="
# ============================================================
# Test: kill switch suppresses ao-feedback-loop
EC=0
AGENTOPS_HOOKS_DISABLED=1 bash "$HOOKS_DIR/ao-feedback-loop.sh" >/dev/null 2>&1 || EC=$?
if [ "$EC" -eq 0 ]; then pass "ao-feedback-loop kill switch"; else fail "ao-feedback-loop kill switch"; fi
# Test: fail-open without ao
EC=0
PATH="/usr/bin:/bin" bash "$HOOKS_DIR/ao-feedback-loop.sh" >/dev/null 2>&1 || EC=$?
if [ "$EC" -eq 0 ]; then pass "ao-feedback-loop fail-open without ao"; else fail "ao-feedback-loop fail-open without ao"; fi
# ao-extract, ao-feedback-loop, ao-forge, ao-inject, ao-maturity-scan,
# ao-ratchet-status, ao-session-outcome, ao-task-sync were consolidated
# into session-end-maintenance.sh inline commands. Standalone scripts removed.
# ============================================================
echo ""
@@ -1008,95 +982,9 @@ EC=0
PATH="/usr/bin:/bin" bash "$HOOKS_DIR/ao-flywheel-close.sh" >/dev/null 2>&1 || EC=$?
if [ "$EC" -eq 0 ]; then pass "ao-flywheel-close fail-open without ao"; else fail "ao-flywheel-close fail-open without ao"; fi
# ============================================================
echo ""
echo "=== ao-forge.sh ==="
# ============================================================
# Test: kill switch suppresses ao-forge
EC=0
AGENTOPS_HOOKS_DISABLED=1 bash "$HOOKS_DIR/ao-forge.sh" >/dev/null 2>&1 || EC=$?
if [ "$EC" -eq 0 ]; then pass "ao-forge kill switch"; else fail "ao-forge kill switch"; fi
# Test: fail-open without ao
EC=0
PATH="/usr/bin:/bin" bash "$HOOKS_DIR/ao-forge.sh" >/dev/null 2>&1 || EC=$?
if [ "$EC" -eq 0 ]; then pass "ao-forge fail-open without ao"; else fail "ao-forge fail-open without ao"; fi
# ============================================================
echo ""
echo "=== ao-inject.sh ==="
# ============================================================
# Test: kill switch suppresses ao-inject
EC=0
AGENTOPS_HOOKS_DISABLED=1 bash "$HOOKS_DIR/ao-inject.sh" >/dev/null 2>&1 || EC=$?
if [ "$EC" -eq 0 ]; then pass "ao-inject kill switch"; else fail "ao-inject kill switch"; fi
# Test: fail-open without ao
EC=0
PATH="/usr/bin:/bin" bash "$HOOKS_DIR/ao-inject.sh" >/dev/null 2>&1 || EC=$?
if [ "$EC" -eq 0 ]; then pass "ao-inject fail-open without ao"; else fail "ao-inject fail-open without ao"; fi
# ============================================================
echo ""
echo "=== ao-maturity-scan.sh ==="
# ============================================================
# Test: kill switch suppresses ao-maturity-scan
EC=0
AGENTOPS_HOOKS_DISABLED=1 bash "$HOOKS_DIR/ao-maturity-scan.sh" >/dev/null 2>&1 || EC=$?
if [ "$EC" -eq 0 ]; then pass "ao-maturity-scan kill switch"; else fail "ao-maturity-scan kill switch"; fi
# Test: fail-open without ao
EC=0
PATH="/usr/bin:/bin" bash "$HOOKS_DIR/ao-maturity-scan.sh" >/dev/null 2>&1 || EC=$?
if [ "$EC" -eq 0 ]; then pass "ao-maturity-scan fail-open without ao"; else fail "ao-maturity-scan fail-open without ao"; fi
# ============================================================
echo ""
echo "=== ao-ratchet-status.sh ==="
# ============================================================
# Test: kill switch suppresses ao-ratchet-status
EC=0
AGENTOPS_HOOKS_DISABLED=1 bash "$HOOKS_DIR/ao-ratchet-status.sh" >/dev/null 2>&1 || EC=$?
if [ "$EC" -eq 0 ]; then pass "ao-ratchet-status kill switch"; else fail "ao-ratchet-status kill switch"; fi
# Test: fail-open without ao
EC=0
PATH="/usr/bin:/bin" bash "$HOOKS_DIR/ao-ratchet-status.sh" >/dev/null 2>&1 || EC=$?
if [ "$EC" -eq 0 ]; then pass "ao-ratchet-status fail-open without ao"; else fail "ao-ratchet-status fail-open without ao"; fi
# ============================================================
echo ""
echo "=== ao-session-outcome.sh ==="
# ============================================================
# Test: kill switch suppresses ao-session-outcome
EC=0
AGENTOPS_HOOKS_DISABLED=1 bash "$HOOKS_DIR/ao-session-outcome.sh" >/dev/null 2>&1 || EC=$?
if [ "$EC" -eq 0 ]; then pass "ao-session-outcome kill switch"; else fail "ao-session-outcome kill switch"; fi
# Test: fail-open without ao
EC=0
PATH="/usr/bin:/bin" bash "$HOOKS_DIR/ao-session-outcome.sh" >/dev/null 2>&1 || EC=$?
if [ "$EC" -eq 0 ]; then pass "ao-session-outcome fail-open without ao"; else fail "ao-session-outcome fail-open without ao"; fi
# ============================================================
echo ""
echo "=== ao-task-sync.sh ==="
# ============================================================
# Test: kill switch suppresses ao-task-sync
EC=0
AGENTOPS_HOOKS_DISABLED=1 bash "$HOOKS_DIR/ao-task-sync.sh" >/dev/null 2>&1 || EC=$?
if [ "$EC" -eq 0 ]; then pass "ao-task-sync kill switch"; else fail "ao-task-sync kill switch"; fi
# Test: fail-open without ao
EC=0
PATH="/usr/bin:/bin" bash "$HOOKS_DIR/ao-task-sync.sh" >/dev/null 2>&1 || EC=$?
if [ "$EC" -eq 0 ]; then pass "ao-task-sync fail-open without ao"; else fail "ao-task-sync fail-open without ao"; fi
# ao-forge, ao-inject, ao-maturity-scan, ao-ratchet-status, ao-session-outcome,
# ao-task-sync standalone scripts were consolidated into session-end-maintenance.sh.
# Delegation tests below verify the embedded hooks still delegate correctly.
# ============================================================
echo ""