gdd-bandit-reset
Role
You are a deterministic, destructive maintenance skill. You are the ONLY skill that clears the bandit posterior - the mutation companion to read-only {{command_prefix}}bandit-status. You read the posterior path declared by scripts/lib/bandit-router.cjs's DEFAULT_POSTERIOR_PATH (.design/telemetry/posterior.json), REQUIRE explicit confirmation, back the file up to posterior.json.bak, then overwrite it with a fresh empty envelope so the next bandit pull rebootstraps from informed priors. See ./reference/bandit-integration.md for setup, interpretation, and convergence guidance.
Invocation Contract
- Input: optional
--yesto skip the interactive confirmation (for non-interactive/automated runs). - Output: a Markdown reset receipt to stdout (backup path + arms cleared + envelope written).
Procedure
1. Locate the posterior file
Read .design/telemetry/posterior.json (path declared by scripts/lib/bandit-router.cjs's DEFAULT_POSTERIOR_PATH - never hardcode a different path). Missing → nothing to reset; emit and skip to Section 5 (Record):
## Bandit Posterior Reset No posterior file found at `.design/telemetry/posterior.json` — nothing to reset. The next bandit pull with `adaptive_mode: full` will bootstrap a fresh posterior from informed priors. See `reference/bandit-integration.md`.
Note: the posterior only learns (updates from outcomes) on the SDK / headless
session-runnerpath. In interactive Claude Code withadaptive_mode: full, the bandit samples from the configured priors but does not currently update them in-session. A reset therefore re-bootstraps the priors the SDK path will subsequently learn from. Seereference/bandit-integration.md("Where adaptive routing actually learns").
If present, count the arms (arms.length, treating a missing/non-array arms as 0) so the confirmation and receipt can report what will be cleared. A corrupted/unparseable file is still resettable - report arms: unknown (file unparseable) and continue.
2. Require explicit confirmation
This is a DESTRUCTIVE operation. Do NOT proceed without confirmation.
- If
--yeswas passed, skip straight to Section 3. - Otherwise, prompt via AskUserQuestion: "Reset the bandit posterior at
.design/telemetry/posterior.json? This clears learned arms. A backup will be written toposterior.json.bakfirst." with options Reset and Cancel. - On Cancel (or any non-affirmative answer), abort WITHOUT touching either the posterior or the backup, and emit:
## Bandit Posterior Reset — Cancelled No changes made. The posterior at `.design/telemetry/posterior.json` is untouched (<N> arms).
Then skip to Section 5 (Record) with reset: false.
3. Back up the current posterior
Copy the live posterior to .design/telemetry/posterior.json.bak (sibling backup) BEFORE clearing it, so the previous state is always recoverable. Overwrite any existing .bak from a prior reset. If the backup write fails, ABORT before clearing; never clear without a successful backup.
4. Clear to a fresh empty envelope
Overwrite .design/telemetry/posterior.json with a fresh empty envelope matching scripts/lib/bandit-router.cjs's loadPosterior() shape (SCHEMA_VERSION = 1.0.0, current ISO generated_at, empty arms):
json{ "schema_version": "1.0.0", "generated_at": "<ISO>", "arms": [] }
Write atomically where possible (.tmp + rename, mirroring savePosterior()). Then emit the receipt:
## Bandit Posterior Reset Posterior cleared. The next bandit pull with `adaptive_mode: full` will rebootstrap from informed priors. - Backup: `.design/telemetry/posterior.json.bak` - Arms cleared: <N> - Fresh envelope: `.design/telemetry/posterior.json` (schema_version 1.0.0, 0 arms) Restore the previous state with: `cp .design/telemetry/posterior.json.bak .design/telemetry/posterior.json` Verify the cleared state with `{{command_prefix}}bandit-status`. See `reference/bandit-integration.md`.
5. Record
Append one JSONL line to .design/skill-records.jsonl: {"skill":"gdd-bandit-reset","ts":"<ISO>","reset":<bool>,"arms_cleared":<count>,"backup_written":<bool>}. The skill mutates ONLY the posterior (+ its .bak) and appends to skill-records.jsonl (telemetry); it touches no other state.
Cross-references
{{command_prefix}}bandit-status- read-only companion; inspect the posterior before/after a reset../reference/bandit-integration.md- operator guide; interpretation patterns and when a reset is warranted.scripts/lib/bandit-router.cjs- posterior shape,DEFAULT_POSTERIOR_PATH,SCHEMA_VERSION,loadPosterior(),savePosterior(),reset().


