Releases: sprngr/rubber-duck
Release list
v3.1.0
[v3.1.0] - 2026-08-27
Added
- Session-start hook (opt-in
--session-hook/-SessionHook): deterministically
causes therubber-duckagent to load theduck-policyskill at session start.- OpenCode: plugin installed to
.opencode/plugins/session-start.jsregisters
rubber-duck sessions and injects the startup directive into the system prompt
on every model call (experimental.chat.system.transform). - Claude Code: scripts installed to
.claude/hooks/and aSessionStarthook
merged into.claude/settings.local.json(idempotent). Fires only when the
rubber-duck agent is active, detected via hook inputagent_type. - Build emits hook artifacts to
dist/opencode/hooks/anddist/claude/hooks/. - Installer (bash + PowerShell parity): install/uninstall of hook artifacts,
manifest pins, and per-targetsessionHooktracking replayed onsync. - The rubber-duck agent body keeps its Enforcement Bootstrap mandate as a
fallback when the hook is not installed. - Copilot support pending (deferred; see plan doc).
- OpenCode: plugin installed to
- Reviewable-unit decomposition: multi-PR plans must decompose into reviewable units (independent merge, working state after each, explicit ordering + acceptance criteria). Methodology in
src/shared/skill-snippets/reviewable-units.md; duck-design writes plans as PR sequences; duck-policy Checkpoint 1 gates on decomposition. - Validation fixture
validation/fixtures/context-loading/src/cache.tsanchors deferred-debt marker tests to real code. - Plan decomposition verification spec:
docs/architecture/08-plan-decomposition-verification.mddefines the trigger predicate (explicit multi-PR OR agent-detected size/breadth), gate requirements, and verification acceptance criteria (positive, detection, negative, per-unit content). duck-tidyextras skill (stub): audit-first cleanup for stale/outdated comments and non-CONTEXT docs. Installed with--extras/-Extras. Evidence rules: contradicts current code, describes removed behavior, worktree-only add/remove never merged. Carve-outs: TODO markers (duck-debt), ADR/design notes flag-only, CONTEXT.md/.duck-tape (duck-tape). Method bodies pending.duck-adventureeaster-egg skill (manual install): standalone rogue game — multi-turn dungeon crawls with maps, dice combat, random merchants, loot, and achievements tracked across sessions. Fun for its own sake; no handoff to productivity flows.
Changed
- Duckling silent-worker contract: duckling subagent redesigned as single-turn silent worker across all three harnesses (Claude Code, Copilot, OpenCode). Interactive mutating-action-gate include replaced by explicit Silent Worker Contract:
- one invocation is one turn; no mid-run user dialog
- never self-approve mutating work
executemode produces terminal approval package (preflight + per-file diffs +Approve this scope?) instead of mutating the workspace- mid-run ambiguity flattens to
## Unresolved questionsblock instead of interactive Q&A - one phase per invocation; parent orchestrates phase progression
- tool-unavailable degradation emits explicit
## Tool unavailablenote instead of silent skip
- Duckling non-delegation list: duckling refuses
skill_nameofquack(routing skill),duck-tape(session-memory mutation), andduck-policy(session-scoped policy loader). Emitsblocked_recursive_routingstatus; parent invokes target skill directly. DUCKLING_CTXfooter status vocabulary expanded: addedblocked_awaiting_approval,blocked_skill_unavailable,blocked_recursive_routing,blocked_missing_inputs,phase_complete_await_parent,degraded_tool_unavailable. Prior<ok|blocked>binary replaced.- Rubber-duck Subagent Return Handling: new agent-body section defining shape-based and status-token-based recognition of subagent returns. Approval packages relayed verbatim as parent's Checkpoint 3 presentation; parent-always-executes rule (subagents propose; parent executes) preserves single-approval-gate invariant. Explicit handlers for phase-progression, blocked-input, and degraded returns.
- Quack subagent-runbook: explicit disclaimer that
quackhas no return-side responsibility; parent (rubber-duck) owns return handling. Applies to any primary agent that dispatches to duckling. - Duckling general contract snippet (
skill-snippets/duckling-general-contract.md): behavior rules 4-6 aligned with silent-worker posture. Interactive-dialog contracts (Socratic loops, batched interviews, multi-turn design dialogs) flatten questions to## Unresolved questions. Skill-unavailable path emits terminal error instead of interactive question. - Duckling harness permission tightening: silent-worker contract now enforced at harness level in all three harnesses. Duckling tool maps drop mutation tools: Claude
Read, Glob, Grep, Skill; Copilotread,search; OpenCodeedit: deny,bash: deny. Duckling body gains explicit never-call-Edit/Write/Bash rule and parent-always-executes wording.duck-patchandduck-refactorgain "Subagent execution mode" sections documenting approval-package output under subagent invocation. Permission-tightening spike resolved inline. duck-policyskill unchanged: portable policy layer stays agent-shape-agnostic; no duckling/quack-specific knowledge added.- OpenCode plugin uses system-level directive injection (system prompt) instead of
user-message injection, so the model treats the directive as an instruction
rather than a suggestion. - Sync replay fixes a latent off-by-one where extras were matched against the
install-agents-md flag; extras and the new session-hook flag now map to the
correct positional arguments. - Validation suite: 58 tests (V01-V58). V54 covers the Checkpoint 1 plan-decomposition gate; V55 positive trigger, V56 negative non-trigger, V57 per-unit acceptance content, V58 implicit detection trigger extend decomposition coverage via the
rolloutfixture. V25/V26/V38/V54 signals calibrated to observed vocabulary. - Validation runner now overlays built
skills/onto.agents/skills/in test workspaces, so tests exercise current policy instead of the last installer-synced copy. Resolves false V58 failure caused by stale installed skills. - duck-policy Method adds gate-sequencing rule: approach-choice, clarify-first, Checkpoint 1 framing, and Checkpoint 2 fire as separate turns; clarify completes before framing. V51 prompt specifies the JWT failure mode so the Checkpoint 2 selection ask is deterministic.
docs/architecture/03-adaptive-socratic-policy.mdCheckpoint 1 documents plan decomposition requirement.- Legacy managed-block migration no longer writes a
.bak.<timestamp>recovery copy next toAGENTS.md/CLAUDE.md. The 3.x migration window is closed; the installer strips legacy blocks in place without backup (bash + PowerShell parity). - Rule wording convention applied across skills, agent bodies, and instruction docs: content-logic rules converted from absolute (always/never/must) to conditional if-then phrasing (~58 rules); structural/spec rules and safety carve-outs retain absolute or refusal form. Convention codified in duck-adapt (
philosophy-core.md+adaptation-checklist.md). - duck-policy Style: gate ask strings are contract exceptions to terse style —
Confirm or revise?,Select an option.,Approve this scope?,Accept, revise, or rollback?emitted verbatim at their checkpoints even when otherwise terse. Mitigates intermittent gate compression (V50/V51). Version bump v3.0.1 -> v3.0.2. - duck-tape Resume: a marker from a previous session is a resumable handoff checkpoint, not a stop condition; stale markers now continue to checkpoint reload and position report. Version bump v2.1.2 -> v2.1.3.
Fixed
- Validation runner: verdict matching evaluates the full multi-turn transcript instead of the final turn only; gate content from earlier turns (V50 Checkpoint 1 framing) no longer yields false negatives.
- Validation runner: fixture workspaces no longer copy the rubber-duck
AGENTS.md, removing workspace-identity confusion that intermittently made models ignore fixture code (V02/V07 class). - Validation tests calibrated to gate sequencing: V08/V25 gained
follow_upsto advance past approach-choice/clarify-first; V45 steps through approach-choice -> clarify -> evidence -> Checkpoint 1 frame, signals reduced to problem+assumption (options coverage stays with V51). - Bash installer fails fast with a clear
requires bash 4+message (and macOS
brew install bashguidance) instead of dying with an obscure
declare: -A: invalid optionon bash < 4 (macOS default/bin/bash3.2).
Known regression
- None active. Intermittent failures under flash-class models remain (LLM non-determinism, documented suite limitation): V51 (selection ask occasionally omitted), V02/V07 (workspace identity confusion — mitigated by the fixture-workspace AGENTS.md exclusion), V19 (bug-signal calibration on a bug-free diff), V33/V55 (judge variance), V45 (follow-up brittleness vs question phrasing). Mitigations: union matcher, gate-sequence test calibration, fixture-workspace AGENTS.md exclusion. Suite nominal 52/58 under opencode-go/deepseek-v4-flash; no Critical behavioral regression observed.
v3.0.0
v3.0.0 — Flattened Duck
Consolidates the rubber-duck agent architecture around a single self-contained rubber-duck agent and moves the enforcement policy out of a managed block in AGENTS.md into a portable duck-policy skill loaded at agent session start. Installers, sync wrappers, tests, and docs updated to match. Also folds in remediations from a full duck-review of the branch.
Highlights
- Policy is now a skill.
duck-policy(approval gates, safety carve-outs, Duck Ladder, style, deferred-debt markers) is portable and loadable by any agent. Rubber-duck agent body bootstraps it as its mandatory first action. AGENTS.mdmanaged block retired. Installers strip legacy blocks on upgrade with a prominent notice and a timestamped backup preserving any user content that lived inside the block. Fresh installs no longer write policy into yourAGENTS.md.- Sync wrapper hardening. Version checks, scope-locked wrappers, portable substitution, and consistent bash/PowerShell parity.
- Validation suite expanded with checkpoint-4 fixture, security-vuln fixture, and context-loading fixture.
Breaking changes
--claude-md/-ClaudeMdand--skip-agents-md/-SkipAgentsMdflags removed. CI or user aliases relying on these will fail hard. Deprecation stub deferred to a follow-up.--policy host|selfflag removed.- Legacy managed policy block in user
AGENTS.md/CLAUDE.mdis stripped on install. Backup written; migration is loud. - Sync wrapper scope is embedded at install time. User-supplied
--project/--globalon the wrapper now errors instead of being silently filtered (PS) or triggering installer parse errors (bash). Re-run the installer to change scope.
Migration guide
- Run the installer as usual.
- On first upgrade, watch for the
Legacy managed policy block detected (3.x migration)notice. YourAGENTS.mdwill be backed up next to itself asAGENTS.md.bak.<timestamp>before the block is removed. - If you had CI aliases using removed flags, drop them.
- Update any custom scripts that expected wrapper scope override to instead re-run the installer with the desired scope.
Architecture changes
- Single self-contained
rubber-duckagent (no more reliance on AGENTS.md for rules). - Agent body includes
duck-policysnippet at build time. - Installer templates reorganized under
src/install/scripts/andsrc/install/templates/. - Build flow:
src/agents/*→dist/*;src/skills/*→skills/*. Never edit generated outputs.
Installer + sync wrapper
- New
sync-latest.{sh,ps1}helper installed alongside agents. Checks for newer versions before syncing; prompts on upgrade with CHANGELOG link. - Bash + PowerShell installer parity tightened:
VERSIONfile format validated on both sides (^v\d+\.\d+\.\d+$)- Portable sync-wrapper token substitution (bash parameter expansion; no sed dependency; macOS-safe)
Get-SyncReplayArgsshape matches bashsync_replay_cmd(DRY dry-run + untrusted logic)Doctor/doctorfail-fast when called before target resolve- Loud scope-collision reject in both wrappers
- Version-check
VERSIONURL derives from installer URL (branch/custom raw-base aware)
- Sync wrappers embed
RUBBER_DUCK_VERSIONfor diagnostics. - Fallback wrapper templates removed; installer errors clearly if the template cannot be fetched.
Fixes bundled
- Legacy managed-block migration UX: loud notice, backup preserves user content, no spurious backups on fresh install
- Bash sync wrapper version comparison POSIX-compatible; incomparable pre-release strings no longer crash
- PS host detection uses
(Get-Process -Id $PID).Path(previous automatic-variable reference was inert) running_piped()definition ordering fix- CI line-ending drift resolved for
*.ps1
Full Changelog: v2.1.4...v3.0.0
v2.1.4
v2.1.3
Rubber Duck v2.1.3 - 2026-08-14 - Quack Fixes
Changed
- Quack routing language is now harness-agnostic for delegated execution:
- Replaced OpenCode-specific
taskwording with generic subagent dispatch wording in source and generated skill artifacts. - Preserved existing routing behavior while removing tool-name coupling from skill text.
- Replaced OpenCode-specific
- Quack skill metadata version bumped to
v2.1.3in source-of-truth and regenerated artifact. - Duck-grill close-out contract now aligns with duck-tape compaction expectations:
- Added deterministic interoperability fields (
Decision,Assumptions ledgerstatus lines, deferred debt markers, position seed,compact-ready). - Added explicit follow-up prompt when compaction is ready (
Run duck-tape merge now?).
- Added deterministic interoperability fields (
- Duck-grill CONTEXT template now uses duck-tape schema-aligned section shape:
Contents,Goals,Decisions,Conventions,Glossary,Deferred-Debt,Open-Questions,Notes- Glossary entries retain richer domain metadata (
Code,Scope,Aliases,Avoid). - Location guidance now sets canonical path to root
CONTEXT.md.
- Project context debt tracking updated with linked spike marker:
TODO(architecture,#22): 2026-08-13 Define localized CONTEXT.md merge model for duck-tape
v2.1.2
Rubber Duck v2.1.2 — Patch Rollup
Changed
- duck-tape skill metadata bumped to v2.1.2 in source and regenerated artifact.
- Claude hook install guidance now supports repo-local .claude/settings.local.json (recommended) or .claude/settings.json.
- Claude troubleshooting guidance now validates both settings targets.
- Quick start now includes manifest-based update command: ./scripts/rubber-duck.sh sync --project.
- Edited skills aligned to project version v2.1.2 (duck-tape, duck-adapt, quack).
Fixed
- Clarified Claude hook setup docs to match repo-local config workflow.
- Replaced distributed src/skills/... references with .agents/skills/... in duck-tape hooks/docs and duck-adapt guidance.
- Harness artifact renderer now expands {{include: skill-snippets/...}} in agent bodies, removing leaked include tokens in rendered duckling dist artifacts.
- Quack boundaries now render safety carve-out snippet correctly (no leaked include token in built skill output).
Security
- Opencode duck-tape transcript snapshots now redact recursively before writing .duck-tape/-transcript.json, preventing raw secret leakage.
- Expanded redaction coverage across shell, PowerShell, and opencode plugin extract paths:
- password/passwd/pwd/secret/token/client_secret/private_key key-value forms
- credentialed connection URIs (scheme://user:pass@host)
- secret-like environment assignments (...PASSWORD=..., ...TOKEN=..., etc.)
- baseline PII shapes (email, phone, SSN)
Full Changelog: v2.1.1...v2.1.2
v2.1.1
v2.1.0
Rubber Duck v2.1.0
Installer overhaul, policy refinements, and full PowerShell parity.
Installer
- Multi-harness install via
--harness opencode,claude,copilot/-Harness opencode,claude,copilot. One command, one banner, per-target[name]sections, single🦆 quackfooter. - New
syncaction: manifest-driven install/prune across enabled targets.--prune/-Pruneremoves targets not enabled in manifest. - Manifest schema v1 (
.rubber-duck/manifest.json) tracks source, targets, andpins(sha256 change log). Reinstall skips unchanged files (mtime preserved). - rawBase allowlist: installer only accepts sources under
https://raw.githubusercontent.com/sprngr/rubber-duckunless--allow-untrusted-source/-AllowUntrustedSourceis set. Prevents accidental fork/typo installs. - PowerShell parity:
-DryRun,-Prune,-Harness,-AllowUntrustedSource, script-scoped variables, hoisted security helpers. - Consolidated output: banner +
version:+source:+doctor: ok+ skills printed once; per-target sections show only target-specific actions. - Skills install consolidated: single
npxcall with one-a <agent>per selected target. - Bash installer runtime floor: bash 4+, awk, curl, coreutils.
python3no longer required (pure-bash manifest library). - Env var rename:
BASH_SOURCE_URL→RUBBER_DUCK_SOURCE_URL(shell-agnostic naming, honored by both installers for branch auto-detect). - Backup retention: only the most recent
<file>.bak.*per policy file is kept; prior backups pruned on install/uninstall. --skip-agents-md/-SkipAgentsMdand--extras/-Extrasflags exposed on both installers.
Policy & workflow
- Phase-gated approvals: preflight phase selection (stubs/skeleton/interfaces, wiring/integration, implementation), adaptive caps (6/4/2 files), objective review-fatigue thresholds using changed lines, mandatory re-approval between phases.
- New-file bootstrap rule: new feature files must land as stub/skeleton first, implementation in later phases.
- Docs-as-semantic default: documentation/planning edits treated as semantic changes (preflight + diff + approval); typo-only fixes in non-code text files remain lightweight.
- Approval intent:
approve,approved,ok,go ahead,confirmall accepted (examples explicitly non-exhaustive).
Skills
- Skill metadata versioning aligned to
RUBBER_DUCK_VERSIONformat (vX.Y.Z) across all skills. quackno longer stalls after routing.duck-tapesession-id handling hardened; rotation metadata no longer persisted toCONTEXT.md.- Cross-skill policy consistency pass: removed fixed file-count gating, aligned mutating workflows to phase-gated approvals.
Validation
- Suite expanded to V01–V35; V14 realigned to phase-cap boundary; V30 accepts clear approval intent; V32/V33 cover missing phase preflight and re-approval between phases.
- New V34/V35 cover documentation-as-semantic gate and typo-only cosmetic exception.
Tests & tooling
- Installer test suite with bash + PowerShell parity (8/8 each): fresh install, reinstall pin verify, sync round-trip, rawBase allowlist, claude two-file layout, dry-run no writes, dry-run multi-target layout, sync default source.
- Guardrails drift check now fails on duplicate headings in generated
dist/**/*.md(catches nested-include composition regressions). markdownlint-cli2wired into local pre-commit hook.- Assembly renderers support nested embedded
{{include: ...}}in both skill and harness pipelines.
Fixes
- Installer
--raw-baseno longer silently overwritten by branch default. - PowerShell
sync -Pruneno longer returns early with no enabled targets. - PowerShell security helpers (
Test-RawBaseAllowed,Get-Sha256) hoisted to script scope so sync path enforces allowlist. - Bash sync install loop under
set -uno longer errors on empty enabled-targets array (bash 3.2). - Managed block upsert no longer accumulates blank lines above fences.
- PowerShell script-file execution detection fixed for
-Source local. - PowerShell local-source file resolution uses script-scoped variables.
- Installer sync no longer fails with default source (RAW_BASE ordering fix).
write_pins/Write-Pinsnow honor dry-run.dist/*/agents/rubber-duck.mdno longer duplicates approval-workflow sections.
Full Changelog: v2.0.1...v2.1.0
v2.0.1
What's Changed
Patch release: duck-tape opencode plugin hook hardening.
Fixed
- Path traversal in
opencode.plugin.js— strictsessionIdcharset validation (alphanumeric + hyphen, max 128 chars) before filename construction. Prevents../-style traversal attacks on state file paths. - Windows filename safety — stamp format changed from
HH:MMtoHHMM(colon stripped), matching skill's<YYYY-MM-DD-HHMM>session ID format. Colons invalid in Windows filenames. - Rotation off-by-one — cap now enforces 10 total state files (was allowing 11). Eviction precedence: auto, then recovered, then manual.
- Rotation comment aligned with actual behavior.
- Tests added —
sessionIdtraversal guard, extraction edge cases (<-prefixed user text skip, multipleDECISION_PATTERNvariants,lastTextassignment, null-info guards).
Changed
[Unreleased]entries folded into v2.0.0 (changelog hygiene).
Full Changelog: v2.0.0...v2.0.1
v2.0.0
Quackening
Major release: validation framework, UX standardization, agent consolidation, new skills, installer features, and documentation refinement.
Highlights
Agent consolidation
6 specialized duckling subagents collapsed into a single duckling delegator with skill-based routing (-1,797 lines). Simpler mental model, fewer moving parts, same coverage.
New skills
- duck-refactor — Multi-file restructuring (extract/rename/move/inline/pattern-convert; max 5 files)
- duck-adapt — Meta-skill for adapting external skills to Rubber Duck philosophy
- duck-grill — Deep interrogation with batched questions (up to 3), adversarial plan stress-testing
- duck-tape — Two-tier session memory (CONTEXT.md + state files)
Skill count: 11 -> 13. duck-explain merged into duck-teach.
Validation framework
31-test behavior regression suite with automated runner. Hybrid LLM-judge matcher handles vocabulary variance across model invocations. Quick subset (7 Critical/High tests) gates merges.
UX standardization
- Prompt-order standard across skills
- Duck Ladder 6-rung minimal-change discipline
- Two-tier approval gates: semantic (full 6-step) vs cosmetic (lightweight)
- Terse language policy: no invented abbreviations, no hedging, fragments OK
Installer
--skip-agents-md— install skills only, preserve existing AGENTS.md--branch— install from non-main branches (testing)--extras— optional skills (duck-adapt, duck-grill, duck-tape)- Bash and PowerShell feature parity
- AGENTS.md managed-block fencing
Policy
- 4-checkpoint decision policy: problem framing, solution selection, execution approval, acceptance
- Auto-Clarity: terse-by-default, expands when safety requires it
- Safety carve-outs (non-negotiable): trust boundaries, security controls, data-loss prevention, accessibility
Breaking changes
- 6 duckling subagents removed; replaced by single
ducklingdelegator duck-explainmerged intoduck-teach- Alias set trimmed 76 -> 33 (-57%)
- Decision-debt marker format:
TODO(decision-debt)->TODO(<debt type>) - AGENTS.md managed-block fencing introduced
Migration
See migration guide for v1.x -> v2 upgrade steps.
Validation
Quick subset PASS (7/7, two consecutive runs). Full run log: validation/RUNLOG.md.
Full Changelog: v1.1.0...v2.0.0
v1.1.0
What's Changed
- v1.1 - optimizations & tweaks by @sprngr in #8
- Implemented build system to share reused strings between skills and agents.
- Fixed duck-debt to be deferred marker agnostic (TODO/FIXME/ETC)
- Added deferred marker inclusion rule to the core AGENTS.md
- Compacted prose for token usage, removed redundant rules.
- Reorganized skills and agents for rules loading order.
Full Changelog: v1.0.0...v1.1.0