4 Commits

Author SHA1 Message Date
Oleks e3b67e9716 Fix the two loose ends spec-review left for a human: stale cross-ref, dual memory destination
commands/offload-audit.md cited 'spec §7' for the one-agent-per-audit rule;
that constraint now has a real home at FR-8.3 (added alongside the recursion
fix, commit 06cb5b8) and the file was out of spec-review's scope to touch.

tasks.md 8.4 predates FR-9 and still pointed a manual memory checkpoint at
wing_claude_memory/working-practice, while FR-9.3's shipped wing/room split
routes the same kind of cross-target judgment to claude-plugins/
inference-arbitrage-lessons via bin/audit-snapshot memory-notes. Two
destinations for one category of content defeats the point of a single
accumulating room, so 8.4 now points at the one the automated path already
writes to.

Suite: unchanged, exit 0 on all tests.
2026-07-29 22:28:55 +03:00
Oleks 06cb5b86ff offload-analyst: stop recursively re-delegating the whole audit to itself
commands/offload-audit.md tells a heavy-target caller to hand the work to
Agent(offload-analyst). Nothing told the analyst it IS that delegation target,
so on a large plugin it re-judged the target heavy by the same criteria and
spawned another offload-analyst instance, which did the same again — observed
live against the cluster plugin (11 agents, ~27 skills), 3-4 levels deep, each
restarting the same early measurement steps with no forward progress.

Fixed by making the analyst explicit that its only Agent calls are the fixed
filing chain, and scoping the command's delegation guidance to the top level
only.
2026-07-29 21:50:18 +03:00
oleks dcec9cabfb FR-4.5: evidence-stability gate — refuse to file a candidate whose confidence moved with the window
Phase 7 filed anxious/agent-wip/release-policy-derivation as `measured` at
11.94% of audited spend on a 30-day window. The same candidate over 7 days came
back `thin` at 0.00%. Only the date range differed. A human reading either issue
body alone cannot know the other exists, which is rubric.md §4a's failure mode
reached through the plugin's own headline number.

That was caught by a human running a second skeptical review — luck, not a
control. It is now mechanical, in the same register as FR-4.2's overrule-case
gate:

- bin/stability-classify matches each `file` candidate against the most recent
  prior snapshot recording it (FR-5.2 identity) and downgrades it to a boundary
  question if `measurement_strength` changed or the share crossed the 2% filing
  threshold between windows. Movement within a label is a trend, not an
  instability; no prior window is `unchecked`, not unstable (FR-2.4).
- The downgrade is a finding against THIS repo, not the target's — the target
  did not change, the auditor described it two ways. Carries an `ia-stability`
  marker so a re-run comments rather than duplicating.
- bin/ia_store.py factors the store and identity resolution out of
  audit-snapshot so both scripts hash signatures identically. A divergence there
  would make the gate match nothing and fail open.

Documented as spec FR-4.5 and rubric §5b (shipped verbatim in references/).
Wired into skills/offload-audit as step 4b, before filing-plan; steps 5-6 now
consume its output rather than classified.json.

S4 is retired in its old form — a human triage catching a bad candidate is not a
repeatable test — and re-passed as: the gate catches the real
release-policy-derivation case with no human in the loop. Asserted in
tests/stability.test.sh case (f) against the verbatim two-window Phase 7 output.

Closes kotkan/claude-plugin-inference-arbitrage#11
Suite: 178 assertions, exit 0.
2026-07-29 20:25:04 +03:00
Oleks 5bdc984674 Fix markdown lint in the Phase 5 docs 2026-07-29 17:50:20 +03:00