• v0.13.0 Stable

    dave released this 2026-05-19 23:17:14 +00:00 | -101 commits to master since this release

    What's Changed

    Focus: Bot commands, infrastructure, Docker hardening

    Features

    • Chat-bot proxy reads stale gateway_project_urls BTreeMap instead of live store (1122 missed this seam) (1132)
    • Mkdir -p ~/.huskies/<name>/ before ssh-keygen in adopt (1134)
    • Bootstrap Claude credentials into newly-launched project sleds (1135)
    • Sled → gateway WebSocket back-channel so project pipeline events reach Timmy (1136)
    • First-run project init flow — walk through config instead of leaving defaults silently (1137)
    • In-container huskies self-update — huskies upgrade pulls a fresh binary without docker rebuild (1138)
    • Per-project Dockerfile fragment so agents can extend their own sled image (1139)
    • One-shot project-rebuild chat command: rebuild image, swap container, reconnect, preserve state (1140)
    • Convert work-item type between spike/story/bug/refactor (or at least spike→story) (1141)
    • Force coder agents through MCP-validated Edit/Write/Bash to prevent writes to master worktree (1142)
    • Decouple LLM environmental awareness from chat transport — persona-keyed sessions and a real-time event subscription (1143)
    • Gateway trampoline-restart: detached helper survives the gateway's own death (1144)
    • Codesign self-heal at exec time so a missed re-sign doesn't silently SIGKILL the binary (1145)
    • Matrix bot auto-recovers from M_UNKNOWN_TOKEN by re-logging in from bot.toml password (1146)
    • One-active-gateway invariant via pidfile+flock — prevent double-gateway during restarts (1147)
    • Per-sled upgrade chat command using huskies upgrade (1138), serial-locked (1148)
    • huskies health chat command — surface gateway, sled, matrix, creds, and build-hash status (1149)
    • Set HUSKIES_GATEWAY_URL on every sled container so 1136's relay actually spawns (1152)

    Bug Fixes

    • Install_pre_commit_hook blocks the tokio executor — sync std::process::Command::output() in an async path stalls worktree-create-sub (1151)

    Other Changes

    • script/local-release: restore build + hot-restart workflow
    • fix: project sleds need claude CLI + extensions.worktreeConfig
    • Revert "fix: bind project container host ports to 0.0.0.0"
    • fix: bind project container host ports to 0.0.0.0

    Full diff: https://code.crashlabs.io/crashlabs/huskies/compare/v0.12.1...v0.13.0

    Downloads
  • v0.12.1 Stable

    dave released this 2026-05-17 22:52:28 +00:00 | -65 commits to master since this release

    What's Changed

    Focus: Developer experience, Docker hardening, bot commands

    Features

    • Remove static website from huskies OSS repo (moved to huskies-server) (1112)
    • [huskies-server repo] Convert static website to Next.js with static rendering (1113)
    • New project: --path flag to override default host directory (1114)
    • New project: --adopt flow to wrap a container around an existing checkout (1115)
    • Rebuild_and_restart loses pending CRDT ops by calling exec() before persistence channel drains (1116)
    • MCP tool for adopt: expose new project --adopt as an MCP call (1117)
    • Automate per-project docker image builds (huskies-project-base + per-stack overlays) (1118)
    • Address npm audit moderate+ vulnerabilities in frontend/ (1119)
    • Silence intentional-error stderr in frontend tests so failures stand out (1120)
    • Remove the marketing website from the huskies OSS repo (now lives in huskies-server) (1121)
    • Chat-bot switch command reads stale gateway_projects Vec instead of live gateway_projects_store (1122)
    • Persist TransitionFired into a per-sled CRDT event log (1124)
    • LLM session entity + assemble_prompt_context helper, wired into Matrix bot (1125)
    • Gateway event aggregator with per-session scope filters (Timmy=All, Sally=single sled) (1126)
    • Migrate all LLM-invoking transports onto assemble_prompt_context; delete legacy Vec (1127)
    • Bounded event queues + EventStreamGap sentinel + observability for context assembly (1128)
    • Find_free_port fallback returns unbindable port silently when range is exhausted (1129)
    • Adopted/launched project containers bind huskies to 127.0.0.1, unreachable from host MCP (1130)

    Other Changes

    • fix: drop package-lock.json + node_modules before npm install in Dockerfile
    • fix: work around npm optional-deps bug in frontend npm install
    • chore: gitignore /pipeline.db at repo root (phantom stale file)
    • fix: build frontend before cargo in script/test (merge gate self-heal)
    • fix(1101): strip passing-test lines before classify() lint check; remove diagnostic

    Full diff: https://code.crashlabs.io/crashlabs/huskies/compare/v0.12.0...v0.12.1

    Downloads
  • v0.12.0 Stable

    dave released this 2026-05-17 01:16:27 +00:00 | -33 commits to master since this release

    What's Changed

    Focus: Bot commands, Docker hardening

    Features

    • Chat bootstrap Phase 1: new project chat command spawns a bare project container and registers it with the gateway (1106)
    • Chat bootstrap Phase 2a: stack-overlay framework + Rust and Node stack overlays (1107)
    • Chat bootstrap Phase 3: SSH-remote editor access into the project container (any editor) (1108)
    • Chat bootstrap Phase 4: --git clones an existing repo and configures push credentials (1109)
    • Chat bootstrap Phase 2b: additional stack overlays (Go, Python, Ruby, JVM) (1110)

    Bug Fixes

    • Test isolation: init_for_test() and ensure_content_store() are once-per-thread, not once-per-test, polluting CRDT state across tests (1111)

    Other Changes

    • docs: chat-driven project bootstrap design overview

    Full diff: https://code.crashlabs.io/crashlabs/huskies/compare/v0.11.1...v0.12.0

    Downloads
  • v0.11.1 Stable

    dave released this 2026-05-15 22:43:43 +00:00 | -23 commits to master since this release

    What's Changed

    Focus: Infrastructure, multi-model agents, bot commands

    Features

    • Fly.io Machines API integration for multi-tenant huskies SaaS (811)
    • Tee pipeline events into gateway Timmy's context (1063)
    • Move source-map regen into the merge pipeline; drop spawn-time regen and the orphan tracked-file drift (1065)
    • Decouple startup CRDT replay from live TransitionFired channel; add periodic reconciler for side-effect subscribers (1066)
    • Include story name in huskies: merge NNNN commit subject so release notes regenerate cleanly (1069)
    • Chat notification when a new work item is created (1073)
    • Compact Working tree: N (uncommitted) inline with the coder line in chat status output (1076)
    • Truncate merge-failure chat notification to the tail of gate output (1077)
    • Pipeline+Status split — Step B: migrate UI/display layer to read Pipeline + Status (1085)
    • Pipeline+Status split — Step C: migrate auto-assign, subscribers, and lifecycle transitions to read Pipeline + Status (1086)
    • Pipeline+Status split — Step D: migrate CRDT storage to (Pipeline, Status) and remove the Stage enum (1087)
    • Record and surface the origin of every work item (1088)

    Bug Fixes

    • done → archived sweep stops firing after rebuild_and_restart cycles (1070)
    • Coder agents run sqlx migrations against the production pipeline.db, bricking the next server restart when binary's migration set is behind (1072)
    • get_version returns stale build_hash after rebuild_and_restart (1074)
    • get_pipeline_status returns ~9 KB per item — overflows MCP token limit at ~30 active items (1075)
    • Gateway event tee from 1063 not injecting into Timmy's context — buffer wired but reminders never appear (1078)
    • Stuck-agent detector blocks stories on legitimate exploration / debugging — uses too narrow a "progress" signal (1089)
    • Chat dispatcher spawns one Timmy per inbound message — needs coalesce window + per-session serial lock (1093)
    • delete_story leaks zombie rows in pipeline_items shadow table — 176 tombstoned items still report non-terminal stages (1094)
    • Shadow drift: set_name writes CRDT name register without updating pipeline_items.name (1095)
    • Shadow drift: set_agent writes CRDT agent register without updating pipeline_items.agent (1096)
    • Shadow drift: set_depends_on writes CRDT depends_on register without updating pipeline_items.depends_on (1097)
    • Shadow drift: set_retry_count / bump_retry_count write CRDT register without updating pipeline_items.retry_count (1098)
    • Multiple LLM agents can run concurrently on the same story (coder + mergemaster + others) — enforce one-agent-per-story invariant (1100)
    • Rate-limit warning at session start sticks the rate_limit_exit flag, causing 1053's fast-path bypass to skip completion on clean session exits (1103)
    • Freeze from Backlog stores wrong resume_to — Unfreeze restores to Coding instead of Backlog (1105)

    Refactors

    • Migrate AgentPool::kill_all_children and kill_child_for_key to process_kill so server shutdown and stop_agent actually kill claude (1090)
    • Migrate the merge-gate's stale-cargo kill path to process_kill (1091)

    Other Changes

    • fix(1102): require non-empty origin.id on create_* MCP tools
    • diag(1101): log classify verdict + matched trigger on merge gate failures
    • test(tick_loop): de-flake reconcile_never_floods_broadcast_channel
    • fix(agents): kill-then-status reorder in stop_agent
    • feat: add process_kill module + use it to fix watchdog double-spawn
    • chore: gitignore .huskies/double_timmy_log.md
    • fix: skip setup commands on worktree reuse so reconciler doesn't fire npm ci every 30s
    • fix: drop source-map.json from agent orientation bundle

    Full diff: https://code.crashlabs.io/crashlabs/huskies/compare/v0.11.0...v0.11.1

    Downloads
  • v0.11.0 Stable

    dave released this 2026-05-14 22:54:40 +00:00 | 29 commits to master since this release

    What's Changed

    Focus: event-driven pipeline architecture, story storage migration to CRDT, cryptographic peer handshake foundation, MCP input validation, gateway UI polish, and a substantial file-decomposition pass across the server and frontend.

    Highlights

    • Event-driven side effects. Worktree lifecycle, structured audit logging, agent-pool reconstruction on restart, cost rollup, auto-block, and tick-loop reactivity now all subscribe to TransitionFired (stories 1006, 1014, 1016, 1017, 1018, 1019).
    • Story storage migration to CRDT (story 929 + follow-ups). The CRDT is now the single source of truth for pipeline state; the on-disk markdown model is being retired in staged WIPs across the codebase.
    • Cryptographic peer handshake. Node-identity ed25519 keypairs and a trusted-keys gating handshake landed (stories 727, 728), with fastcrypto removed from the dependency tree. Foundation for the distributed-LAN-huskies work.
    • MCP input validation layer. A typed, validated input layer now wraps every write-side MCP tool: create_story, create_bug, create_refactor, create_spike, update_story, add/edit_criterion, move_story, move_story_to_merge, unblock_story, freeze_story (stories 1026, 1030, 1031, 1032).
    • Event triggers — properly. SQLite-backed, drop-resistant subscriber, audit logging, with timer-based and event-based predicates (stories 1038, 1039, 1061, 1062).
    • Service module conventions. A growing services-bundle pattern replaces the previous AppContext-as-grab-bag for transport handlers (stories 604-606, 626-639).
    • File-decomposition pass. 49 files over 800 lines decomposed into focused submodules, server-side and frontend, to meet the project's size budget.

    Features

    • (598) Expose huskies init as a gateway mcp tool
    • (599) Cross project status notifications in chat
    • (600) Gateway aggregated pipeline status mcp and chat
    • (601) Project local agent prompt layer for huskies
    • (604) Service module conventions and first extraction
    • (605) Extract events and health services
    • (606) Extract project service
    • (607) Extract bot command service
    • (608) Extract io and anthropic services
    • (609) Extract oauth service
    • (610) Extract wizard service
    • (611) Extract settings service
    • (612) Extract ws service
    • (615) Extract timer service
    • (616) Extract notifications service
    • (617) Split gateway into service and transport
    • (618) Extract mcp only domain services
    • (619) Service common consolidation sweep
    • (622) Wrap react state updates in act to silence frontend test warnings
    • (628) Websocket connect time mutual auth using node identity primitives
    • (630) Crdt sync websocket keepalive ping pong
    • (631) Crdt delta sync via vector clocks replace full bulk dumps
    • (632) Crdt sync handshake with explicit ready ack
    • (633) Crdt sync bearer token connection auth
    • (634) Deterministic claim priority via hash based tie break
    • (636) Full crdt snapshot compaction with cross node coordination
    • (637) Peer mesh discovery via crdt node presence list
    • (641) Unified status update delivery across chat web ui and top level agent context
    • (643) Web ui consumer for the unified status broadcaster
    • (644) Chat transport consumers slack discord whatsapp matrix for the unified status broadcaster
    • (648) Migrate discord transport to status broadcaster
    • (649) Migrate whatsapp transport to status broadcaster
    • (652) Pass resume session id on agent respawn so new sessions inherit prior reasoning
    • (664) Crdt lamport clock inner seq must resume from max own author seq 1 instead of resetting to 1 on restart phase c
    • (667) Agent prompt target maximum file size of 800 lines as a soft guide decompose larger files by concern
    • (669) Migrate slack transport to status broadcaster
    • (716) Statuseventbuffer bounded per instance buffer over services status broadcaster
    • (724) Per account oauth credential storage with login pool
    • (725) Auto swap oauth account on rate limit
    • (726) Notify chat transports when oauth account swaps or all accounts are exhausted
    • (727) Ed25519 node identity keypair generation persistence and identity endpoint
    • (728) Cryptographic peer handshake with trusted keys gating
    • (729) Store story name as a crdt field separate from the story id
    • (730) Use numeric only story ids across mcp worktrees git branches and log paths
    • (735) Attach statuseventbuffer to each agent session scoped per project reset on restart
    • (736) Drain and prepend buffered status events on the user s next agent message
    • (741) status MCP tool omits blocked, retry_count, claimed_by, claimed_at, depends_on from front_matter
    • (743) Extend nodes CRDT collection with agent metadata fields
    • (757) Replace mergemaster LLM agent with deterministic server-side merge for the happy path
    • (758) Re-apply 738's FS-shadow deletion to watcher/mod.rs and watcher/tests.rs (revived by 686 merge)
    • (759) Pipeline status / list_agents shows no signal that a deterministic merge is running
    • (760) Gateway-side status broadcaster and project event-push WebSocket endpoint
    • (761) Project-side relay task pushing status events to the gateway via WebSocket
    • (762) Gateway Matrix bot subscribes to gateway broadcaster and forwards events
    • (763) Stop creating .huskies/work/ shadow tree and migrate remaining tests off FS shadows
    • (764) Add tokens / merge_jobs / active_agents / test_jobs / agent_throttle LWW-map CRDT collections
    • (765) Migrate POST /gateway/agents/:id/heartbeat to CRDT LWW write on nodes[id].last_seen_ms
    • (766) Migrate gateway agent registration (register / deregister / assign) to CRDT operations on nodes
    • (768) Migrate GET /health to read-RPC health.check
    • (769) Migrate GET /gateway/agents to read-RPC agents.list
    • (770) Migrate GET /api/agents to read-RPC active_agents.list
    • (771) Migrate GET /api/gateway/pipeline to read-RPC pipeline.get
    • (773) Migrate merge_jobs HashMap to CRDT merge_jobs LWW-map
    • (774) Migrate test_job_registry HashMap to CRDT test_jobs LWW-map
    • (775) Migrate POST /api/gateway/switch to CRDT gateway_config.active_project LWW write
    • (776) Migrate POST /api/gateway/projects add and DELETE remove to CRDT gateway_config.projects LWW-map
    • (778) 766's agent registration functions are orphaned — no caller path after HTTP routes removed
    • (779) Migrate remaining tests off .huskies/work/{stage}/ FS-shadow seeds (763 follow-up)
    • (780) Reset retry_count on pipeline stage promotion
    • (807) Add Meta WhatsApp webhook HMAC-SHA256 verification
    • (808) Add Twilio WhatsApp webhook HMAC-SHA1 verification
    • (809) Migrate Slack signature verification to audited hmac/sha2 crates
    • (811) Fly.io Machines API integration for multi-tenant huskies SaaS
    • (813) Mergemaster ignores blocked flag and keeps respawning on blocked stories
    • (816) check_criterion MCP tool trusts agents without validating that ACs have backing code or tests
    • (817) LOC reporting includes merge workspace and worktree copies, producing duplicate file counts
    • (818) Remove stale source map from .huskies/specs/tech/STACK.md
    • (819) New crates/source-map-gen for LLM-friendly source maps; wire into agent spawn
    • (820) Pipeline UI shows in-flight deterministic merge as an icon next to the story
    • (821) Coder agents self-check docs and gates enforce them
    • (822) Warm-resume the coder on gate failure with the failure context injected
    • (824) Cleanup worktrees: chat command + MCP tool to remove orphaned worktrees
    • (825) Resolve npm audit moderate-severity vulnerabilities
    • (826) Update dependencies in crates/bft-json-crdt
    • (828) Inject ISO-8601 timestamps into chat messages forwarded to Timmy
    • (841) Periodic worktree-orphan sweep: remove worktrees whose stories are gone or done
    • (849) Doc-coverage gate ratchets to items added/modified by the current commit only
    • (850) Mergemaster prompt: fix gate failures on the feature branch, not merge_workspace
    • (851) Coder prompt + gate: when decomposing X.rs into X/mod.rs, git rm the original X.rs in the same commit
    • (852) Periodic background reaper for stale running merge_jobs
    • (853) Coder prompt: progressive commits per AC for cross-stack stories
    • (854) One-time pass: add doc comments to every undocumented item in the codebase
    • (855) Remove HTTP MCP server-side endpoint, make rendezvous-pull the only inbound agent path
    • (856) Gateway emits chat messages when it observes story state-machine transitions
    • (857) Story lifecycle becomes a real state machine with explicit transitions in the CRDT
    • (858) Comprehensive doc-comment sweep: cover the ~268 public items the changed-only gate skips
    • (859) Coder prompt: explicit //! reminder for new module files in decomposes
    • (860) Add source-map-check as a third coder-exit gate so doc gaps fail at coder exit, not at merge
    • (861) Revert 860's hardcoded Rust doc-coverage call from runtime; trust script/test
    • (862) Add script/check + run_check MCP tool: fast compile-only feedback for in-session iteration
    • (864) Drop YAML front-matter parsing from write paths; write_item_with_content takes typed fields
    • (865) One-shot migration: strip YAML headers from stored content and delete parse_front_matter
    • (866) Migrate blocked off front-matter; route through state machine as Block / Unblock transitions
    • (867) Migrate frozen off front-matter; route through state machine as Freeze / Unfreeze transitions
    • (868) Migrate merge_failure off front-matter; route through state machine as MergeFailed transition with reason payload
    • (869) Migrate qa mode off front-matter; typed CRDT-register setter (pure metadata, no transition)
    • (870) Migrate retry_count off front-matter; typed counter setter (pure metadata, no transition)
    • (871) Migrate agent off front-matter; typed setter (pure metadata, no transition)
    • (872) Migrate depends_on off front-matter; typed list setter (pure metadata, no transition)
    • (873) Migrate mergemaster_attempted off front-matter; typed flag setter (pure metadata, guards retry loop)
    • (874) Chat delete command does not write a CRDT tombstone — story survives in CRDT and reappears in lists
    • (875) delete: extract shared services::work_item::delete so chat and MCP thin-wrap it
    • (876) rmtree / remove_worktree: chat and MCP call different worktree-removal functions
    • (878) freeze / unfreeze: chat handler exists but no MCP tool — extract service and add MCP wrapper
    • (879) depends: chat double-writes (YAML + typed setter); MCP single-writes (typed only)
    • (880) Add epic work-item type: shared context container for chains of related stories
    • (882) claude-code stdio abort on retry consumes a real retry slot
    • (888) Clearing depends_on via update_story or chat depends command does not persist
    • (889) delete_story / purge_story do not stick — story keeps reappearing in pipeline view
    • (890) Delete legacy front-matter fallbacks from auto_assign/story_checks.rs; trust the state machine
    • (891) Introduce canonical WorkItem struct; deprecate raw JsonValue accesses on CRDT registers
    • (892) Add MergeFailure → Done legal transition (manual recovery via accept_story)
    • (893) Add MergeFailure → Coding legal transition (retry via unblock_story)
    • (894) Remove the one-shot YAML-strip migration after it has run in production
    • (895) Mark blocked work items in-place with a red indicator across chat and web UI status views
    • (897) Gateway mode breaks permission prompts; non-MCP tools auto-deny in Matrix bot
    • (898) Persistent sled→gateway WebSocket uplink with permission-request callbacks (Fix B Phase 1)
    • (899) Migrate gateway↔sled MCP proxy traffic onto the sled uplink WebSocket (Fix B Phase 2)
    • (900) Coder system_prompts: skip baseline tests on fresh worktree
    • (905) Gateway MCP proxy: stream SSE responses through to clients so progress notifications reach gateway-resident agents
    • (906) Pipeline stage transitions fire no Matrix notification (post-CRDT migration)
    • (910) Coder that exits with zero commits on the feature branch vacuously passes gates and is promoted to Merge
    • (913) MergeFailure + MergeFailed is rejected as an invalid transition (should be a no-op self-loop)
    • (915) check_criterion marks a criterion done even when it warns "no corroborating evidence" (refile of tombstoned 911)
    • (918) Sled emits a rebuild-status notification over the status-event websocket
    • (919) unblock_story on a MergeFailure story regresses it all the way to backlog instead of back to merge
    • (920) Re-spawn mergemaster after a transient termination during conflict resolution (don't leave story stranded in MergeFailure)
    • (921) Gateway web UI shows "no active stories" despite the aggregation API returning active stories
    • (925) Update out-of-date dependencies in the workspace Cargo.toml
    • (927) Structurally prevent byte-boundary string-slice panics (clippy::string_slice + char-safe truncate helper)
    • (935) Post-929/934 backlog triage: reclassify stories against the new content/stage representations
    • (936) WhatsApp webhook HMAC signature verification
    • (940) Include the work-item title in stage-change (and merge-failure) notifications
    • (942) Single validated work-item creation path: MCP create_* tools are the only entrypoint and enforce required fields
    • (944) Stage consumer sweep: migrate remaining stage-string sites to typed Stage
    • (945) Delete the WorkItem flag soup (blocked/review_hold/frozen/mergemaster_attempted) — fold each state into Stage/ArchiveReason/ExecutionState
    • (946) Tighten the remaining loose WorkItem fields: qa_mode/item_type enums, epic typed id, depends_on Vec, typed timestamps, u32 retry_count, grouped companions
    • (948) Frontend WS-RPC reads: complete the backend RPC registry, harden the rpc.ts client, migrate frontend data reads off HTTP REST onto WS-RPC
    • (949) Frontend WS-RPC writes + typed contract: migrate frontend actions onto WS-RPC, generate TS types from the RPC registry, add the seam test
    • (950) Delete poem-openapi and the dead REST data handlers; keep plain poem only for webhooks / health / static assets
    • (951) Ship typed pipeline_state::Stage as WorkItem.stage (foundation)
    • (952) Coder agents persist a per-worktree PLAN.md so watchdog respawns skip re-discovery
    • (953) Bug: bug-645 advances story to Merge with zero commits ahead of master
    • (954) Bug: Coder exits code 0 with uncommitted work — force a commit-only respawn instead of advancing
    • (957) Bug: Migrate Matrix bot gateway-mode command proxy to WebSocket transport (not HTTP)
    • (958) Refactor: drive scheduling and stage-categorization from explicit Stage matches; delete Stage::is_active() and similar boolean projections
    • (959) Refactor: replace direct string-state comparisons with typed Stage matches
    • (960) Refactor: eliminate Stage <-> string round-tripping at non-presentation seams
    • (961) Refactor: typed content_store key namespace
    • (962) Refactor: WorkItem.agent becomes typed AgentName
    • (963) Refactor: DTO audit — no String where typed WorkItem field exists
    • (964) Refactor: story name is required everywhere — no Option, always populated, always displayed
    • (966) Eliminate coder cold-start tax: bake project orientation docs into the spawn prompt
    • (969) Dependency upgrade sweep: matrix-sdk + workspace pin tidy
    • (970) bft-json-crdt: adopt workspace dependency pins
    • (971) Refactor: add state machine transition MergeFailure to Coding for coder fixup
    • (972) Refactor: add state machine transition MergeFailure to Qa for re-review
    • (973) Refactor: add state machine transition Merge to Coding to abort an in-flight merge
    • (974) Refactor: add state machine transition Done to Coding for post-merge hotfix recovery
    • (975) Gateway status web UI: show story id alongside each item in the list
    • (976) Refactor: bump criterion in bft-json-crdt dev-dependencies to latest
    • (977) Refactor: bump fastcrypto so rand 0.8 leaves the lockfile
    • (978) Bug: source-map.json keys are stale absolute worktree paths not project-root-relative
    • (979) Refactor: wire source-map.json into coder spawn prompt as attached context
    • (980) Refactor: install pre-commit hook in agent worktrees that runs script/check before git commit succeeds
    • (981) Refactor: auto-spawn fixup coder when merge gate fails on a self-evident-fix class
    • (982) Refactor: typed Stage::MergeFailure kind enum replaces freeform reason string and cross-store duplication
    • (984) Refactor: supersede, reject, abandon as typed Stage transitions
    • (985) Refactor: typed QaMode enum replaces string CRDT register
    • (986) Refactor: typed GateOutcome ends gate-output substring sniffing
    • (987) Refactor: typed MergeResult enum replaces 4-bool soup
    • (988) Refactor: delete Stage::is_blocked and sibling bool projections, pattern-match on Stage everywhere
    • (994) Typed AgentExecution::Throttled variant replaces throttled bool
    • (995) Stage-change notification fanout as TransitionFired subscriber
    • (996) ContentKey GC as TransitionFired subscriber on terminal stages
    • (997) Typed retries payload inside Stage::Coding and Stage::Merge
    • (998) Auto-assign and mergemaster spawn as TransitionFired subscribers (kill scan-poll loop)
    • (1006) Worktree and feature-branch lifecycle as TransitionFired subscribers
    • (1009) Typed AgentClaim payload inside Stage::Coding and Stage::Merge
    • (1010) Typed PlanState inside Stage::Coding (replace PLAN.md presence sniffing)
    • (1011) mcp run_check diverges from script/check (skips doc-coverage gate)
    • (1013) source-map-check misses untracked/unstaged new files, allows doc gaps through to merge gate
    • (1014) Structured audit log emission via TransitionFired subscriber
    • (1015) Typed AgentModel enum replaces model string field
    • (1016) Server-restart agent-pool reconstruction via TransitionFired event replay
    • (1017) Cost tracking aggregation as TransitionFired subscriber on terminal stages
    • (1018) Auto-block after N consecutive MergeFailures via TransitionFired subscriber
    • (1019) Tick-loop reactive instead of periodic via TransitionFired subscriber
    • (1023) Expose on-disk server log to MCP and add log rotation
    • (1026) Brutally-typed validated input layer for MCP write tools (start with create_story)
    • (1027) Drop unused workspace deps flagged by cargo machete (eventsource-stream, indexmap, serde_yaml, strip-ansi-escapes)
    • (1029) status command shows "no changes" while coder has substantial uncommitted work in worktree
    • (1030) Validation layer: create_bug, create_refactor, create_spike
    • (1031) Validation layer: update_story, add_criterion, edit_criterion
    • (1032) Validation layer: move_story, move_story_to_merge, unblock_story, freeze_story
    • (1033) Tee pipeline events into Timmy's conversation context as passive system-reminders
    • (1034) Route malformed deterministic-command attempts to Timmy as natural language instead of erroring
    • (1036) Dissolve MergeJob CRDT register into Stage payloads (single source of truth for merge state)
    • (1037) Track .huskies/source-map.json in git and regenerate from scratch via pre-commit hook
    • (1038) Schedule event-based pipeline triggers (when X happens, do Y)
    • (1039) Schedule timer-based pipeline triggers (in N time, do Y)
    • (1042) Move uncommitted file list from status overview into status N triage
    • (1044) Mergemaster exit handler re-scans for other queued ConflictDetected stories
    • (1045) Gateway merge tab shows mergemaster target and queued state for other items
    • (1046) Gateway web UI tabs: Backlog / In Progress / Done / Archived
    • (1047) Animated spinner replaces 'mergemaster is doing work' in Matrix and web UI
    • (1050) Inline source-map regeneration into huskies binary; drop from pre-commit gate
    • (1051) Deterministic-merge re-acquire transitions stage out of MergeFailure
    • (1054) Dedupe incoming Matrix events in bot so sync replays don't double-execute
    • (1056) Web UI renders MergeJob gate_output unbounded — minutes-long scroll for a single story
    • (1058) Replace stacked 'WebSocket error' messages with a connectivity indicator
    • (1061) Event trigger reliability — SQLite storage, drop-resistant subscriber, audit logging
    • (1063) Tee pipeline events into gateway Timmy's context (mirror of 1033 for the gateway bot)
    • (1065) Move source-map regen into the merge pipeline; drop spawn-time regen and the orphan tracked-file drift

    Bug Fixes

    • (596) Restore missing htop command in bot and web ui
    • (597) Rmtree command missing from web ui slash dispatch
    • (614) Gateway web ui has no vertical scrollbars
    • (624) Agent turn and budget limits not enforced coder 1 ran 5 6x over max turns
    • (625) Cannot add acceptance criteria to a spike that s been converted to a story
    • (640) Create story create refactor create bug silently drop the depends on parameter
    • (645) Agent runtime panics with output write bytes is ok assertion marking stories falsely blocked
    • (646) Watchdog from bug 624 is not actually enforcing max turns max budget usd in production
    • (650) Watchdog turns used and budget used usd accumulate across all sessions restart counts against limits from prior runs
    • (651) Remove git reset clean behaviour from bug 645 s recovery path uncommitted work in worktrees is never junk
    • (655) Matrix bot spawns its own timerstore instead of using shared appcontext timer store
    • (668) Pipeline advances coder work to merge when gates passed false
    • (675) Mergemaster silently exits when feature branch has zero commits ahead of master
    • (676) Apply and persist silently drops ops when persist channel send fails
    • (777) Deterministic merge cherry-picks to master but doesn't archive story to 5_done
    • (827) Auto-spawn mergemaster on content-conflict; mergemaster traces conflict provenance before resolving
    • (830) Matrix status command shows merge-stage breakdown (running / stuck / queued)
    • (877) assign / start_agent: chat does extra orchestration (YAML + set_agent) before start_agent; MCP doesn't
    • (881) Inject prior gate failure output into retry agent s system prompt
    • (917) delete_story tombstones the wrong item under concurrent CRDT ops (and the targeted item survives)
    • (930) Successful merge_agent_work doesn't auto-transition the story to Done or clear the mergemaster agent record
    • (967) Bug watchdog-kill respawn races session_store record write
    • (983) Status UI: differentiate stuck-story icon by whether a recovery agent is running
    • (1007) create_refactor returns success but half-writes — CRDT entry missing while file exists on disk
    • (1008) Successful mergemaster exit misclassified as transient — story stuck in 'blocked' after merge already landed
    • (1035) Gateway notifications drop story name — [project] #N — From → To is missing the title
    • (1048) Gateway web UI fails to open /ws — read-RPC and live updates fall back to polling
    • (1052) Gateway UI mislabels done stories as FAILED
    • (1053) API rate-limit exits counted as stuck-agent respawns → false auto-block
    • (1059) Sled web UI crashes to white screen on story click; 'startsWith on undefined' JS exception in passive view
    • (1060) Story deletion races with in-flight deterministic-merge, emits spurious 'merge failed' notification
    • (1062) Once-mode event triggers leak when their action restarts the server (e.g. rebuild_and_restart)

    Refactors

    • (620) Enforce test fixture discipline in service modules
    • (626) Introduce services bundle and migrate appcontext matrix transport
    • (627) Migrate slack discord and whatsapp transports to services bundle
    • (629) Migrate commanddispatch and commandcontext to services bundle
    • (638) Migrate discord transport to services bundle
    • (639) Migrate whatsapp transport to services bundle
    • (670) Hoist chat history persistence into a shared module replaces 658
    • (671) Migrate pipeline state consumers from string comparisons to typed pipelinestage enum
    • (677) Reject promotion to current coder of work items with junk only acceptance criteria
    • (718) Stale agent claims time out claim ttl with displacement
    • (719) Stale merge job lock recovery on new merge attempts
    • (720) Add mesh status mcp tool read only peer mesh diagnostics
    • (731) Migrate existing stories from slug based ids to numeric only
    • (738) Delete fs shadow code from lifecycle rs and the work directory watcher
    • (742) Read rpc frame multiplexer on crdt sync websocket
    • (1022) Upgrade matrix-sdk to current upstream release
    • (1043) Upgrade rand from 0.9 to 0.10

    File-decomposition refactors

    49 files exceeding the 800-line budget were split into focused submodules across server and frontend. Examples:

    • (681) Decompose server src agents pool pipeline advance mod rs 1509 lines
    • (682) Decompose server src agents merge squash rs 1346 lines
    • (683) Decompose server src agents pool start mod rs 1329 lines
    • (684) Decompose server src http agents rs 1249 lines
    • (685) Decompose server src config rs 1223 lines
    • (686) Decompose server src io watcher rs 1202 lines
    • (687) Decompose server src crdt sync server rs 1186 lines
    • (688) Decompose server src crdt snapshot rs 1182 lines
    • (689) Decompose server/src/http/mcp/tools_list.rs (1180 lines)
    • (715) Decompose frontend src components workitemdetailpanel tsx 827 lines
    • (781) Decompose server/src/llm/chat.rs (1077 lines)
    • (782) Decompose server/src/http/gateway.rs (1224 lines)
    • (783) Decompose server/src/agents/pool/auto_assign/watchdog.rs (1069 lines)
    • (784) Decompose server/src/worktree.rs (1170 lines)
    • (785) Decompose server/src/chat/transport/matrix/config/mod.rs (1047 lines)

    …and 34 more file splits, see the full diff.

    Spikes

    • (602) Node identity keypair foundation for distributed huskies

    Other Changes

    • Story 929 storage migration completed in 10 staged WIPs (chat/commands → matrix → http/mcp → agents/pool → io/story_metadata → projection layer → freeze/unfreeze → reconcile → story creation → final sweep).
    • Design docs: HTTP-to-CRDT-bus migration plan (679), architecture roadmap for transports / services / state machine / CRDT (613), gateway update command (814).
    • Pipeline state machine reference documented.
    • Dependency refresh across the tree; source-map regeneration tooling pulled into the binary.

    Categorisation is best-effort — bare-number merge commits (post-storage-migration) lost their slug-encoded type, so story / bug / refactor splits are inferred from name text. See story 1069 for the durable fix.

    Full diff: https://code.crashlabs.io/crashlabs/huskies/compare/v0.10.4...v0.11.0

    Downloads
  • v0.10.4 Stable

    dave released this 2026-04-21 12:01:43 +00:00 | 490 commits to master since this release

    What's Changed

    Focus: Developer experience

    Features

    • Scaffold project toml includes all configurable settings with comments
    • Web ui settings page with form based project toml editor

    Bug Fixes

    • Web ui work item detail panel returns 404 for crdt only stories

    Other Changes

    • Gitignore script/local-release (local-only build script)
    • Fix gateway bot Claude Code cwd so MCP tools are discovered
    • Fix gateway bot proxying freeform messages as commands
    • Gateway bot: proxy commands to active project instead of reading local state
    • Deleting ancient handoff file

    Full diff: https://code.crashlabs.io/crashlabs/huskies/compare/v0.10.3...v0.10.4

    Downloads
  • v0.10.2 Stable

    dave released this 2026-04-15 19:21:46 +00:00 | 512 commits to master since this release

    What's Changed

    Focus: Bot commands, developer experience, multi-model agents

    Features

    • Gateway ui bot configuration page
    • Gateway ui project management add and remove projects
    • Gateway ui connected agents dashboard
    • Gateway ui cross project pipeline status view
    • Expose agent remaining turns and budget via mcp tool
    • Edit criterion mcp tool to update acceptance criteria text
    • Remove criterion mcp tool to delete an acceptance criterion
    • Diff bot command shows git diff from main branch to worktree branch
    • Freeze command to hold a story at its current stage without advancing
    • Bot configuration page

    Bug Fixes

    • Merge agent work should check if story is already done before attempting merge
    • Depends bot command broken after removing filesystem story files
    • Unblock command reads story files from filesystem instead of crdt
    • Overview command reads story files from filesystem instead of crdt
    • Show command reads story files from filesystem instead of crdt

    Other Changes

    • fix: remove duplicate / route in gateway that causes panic on startup
    • chore: feed CONTEXT and STACK specs to all agents, update STACK with source map
    • fix: rewrite coder agent prompts — run tests before commit, remove stale instructions
    • docs: add project architecture section to README for agent context

    Full diff: https://code.crashlabs.io/crashlabs/huskies/compare/v0.10.1...v0.10.2

    Downloads
  • v0.10.1 Stable

    dave released this 2026-04-14 16:03:59 +00:00 | 534 commits to master since this release

    What's Changed

    Focus: Multi-model agents, bot commands, MCP tools

    Features

    • Accept spike state machine transition skips merge and goes directly to done
    • Multi project gateway that proxies mcp calls to per project docker containers
    • Matrix bot can run on the gateway to manage multiple projects from one chat
    • Make merge agent work return results like run tests instead of polling
    • Build agent join mechanism agents register with the gateway via token
    • Gateway web ui shell with project switcher

    Bug Fixes

    • Agent permission prompts flood matrix chat instead of being auto denied
    • Stale filesystem shadows in 1 backlog cause auto assign to promote archived stories
    • Mcp tools matching mcp huskies allowlist still trigger permission prompts

    Refactors

    • Remove all filesystem fallback paths crdt is the only source of truth

    Other Changes

    • Removing example code
    • chore: switch mergemaster to opus and add cargo fmt guidance
    • chore: switch mergemaster to opus and add cargo fmt guidance
    • fix: simplify boolean in validate_working_dir to satisfy clippy nonminimal_bool
    • fix: cargo fmt the merge_workspace validation code
    • fix: allow MCP tools to access merge_workspace so mergemaster can fix conflicts
    • fix: remove filesystem fallback from scan_stage_items to unblock 557 merge
    • Noting the existence of chat transports in README
    • fix: suppress Vite chunk size warning that clutters test output
    • fix: set git default branch to master in Dockerfile to suppress hint spam
    • fix: capture test output with background pipe draining instead of Stdio::inherit
    • fix: add --all to cargo fmt in script/test and autoformat codebase
    • feat: add get_version MCP tool returning version and build hash
    • chore: log version on startup and gitignore build_hash
    • docs: add deployment modes to README — standard, headless, and gateway
    • fix: isolate frontend node_modules in Docker volume to prevent cross-platform conflicts
    • fix: add Read, Glob, Grep to agent settings.json allowlist
    • fix: dropdown hover gap and z-index so menu is clickable on desktop and mobile
    • fix: simplify nav with Start dropdown and move Get in touch to footer
    • fix: wrap nav links on mobile to prevent horizontal overflow

    Full diff: https://code.crashlabs.io/crashlabs/huskies/compare/v0.10.0...v0.10.1

    Downloads
  • v0.10.0 Stable

    dave released this 2026-04-12 23:31:35 +00:00 | 565 commits to master since this release

    What's Changed

    Focus: Bot commands, developer experience, multi-model agents

    Features

    • Exclude git worktrees from loc command output
    • Reduce timer tick interval to 1 second and suppress idle tick logging
    • Bot command to show overall test coverage
    • Discord chat transport
    • Per file test coverage report with improvement targets
    • Build agent mode with crdt based work claiming
    • Cryptographic node auth for distributed mesh
    • Story dependencies in pipeline auto assign
    • Documentation site for huskies dev
    • Display story dependencies in web ui and chat commands
    • Web ui shows project name in browser tab with huskies favicon
    • Sqlite shadow write for pipeline state via sqlx
    • Crdt state layer backed by sqlite
    • Watcher fires on crdt state transitions instead of filesystem events
    • Remove filesystem pipeline state and store story content in database
    • Mcp tool to run project test suite
    • Web ui shows project name in browser tab with huskies favicon
    • Remove duplicate pty debug log lines
    • Update story front matter mcp schema should accept non string values lists bools numbers
    • Signedop wire codec for crdt sync between nodes
    • Websocket sync endpoint that broadcasts local signedops to connected peers
    • Apply inbound signedops with causal order queue for partition recovery
    • Configurable rendezvous peer in project toml with outbound crdt sync connect
    • Migrate chat commands from filesystem lookup to crdt db
    • Startup reconcile pass that detects drift between crdt pipeline items and filesystem shadows
    • Delete story should do a full cleanup crdt op db row filesystem shadow worktree pending timers
    • Add a debug mcp tool to dump the in memory crdt state for inspection
    • Update story description should create the description section if it doesn t exist instead of erroring
    • Remove filesystem shadow fallback paths from lifecycle rs finish the migration to crdt only
    • Apply and persist should log when persist tx send fails instead of silently dropping the op
    • Mergemaster should detect no commits ahead of master and fail loudly instead of exiting silently
    • Typed pipeline state machine in rust foundation replaces stringly typed crdt views with strict enums subsumes 436
    • Migrate status command pipeline view from filesystem to pipeline state read all typed
    • Remove rate limit hard block bot notifications from matrix chat
    • Crdt based peer discovery via node presence entries
    • Eliminate filesystem markdown shadows entirely crdt db is the only story store
    • Mcp tool to read agent session logs from disk not just live stream
    • Remove startup reconcile pass and drift notification no filesystem to reconcile against
    • Crdt based done archived sweep to replace filesystem based watcher sweep
    • Backlog command for chat and web ui shows only backlog items
    • Resume failed coder agents with resume instead of starting fresh sessions
    • Add run build and run lint mcp tools backed by script build and script lint
    • Run tests bot command accepts optional story number to run tests in a worktree
    • Split status command into status pipeline info and logs agent output subcommands

    Bug Fixes

    • Scaffold missing rate limit notifications and timezone in default project toml
    • Scaffold does not copy agent definitions from project toml to new projects
    • Timer slash command not wired up in web ui
    • Story dependency chain not firing due to front matter format issues
    • Status traffic light dots use unsupported html colouring switch to emoji
    • Hard rate limit without reset at never auto schedules retry
    • Dependency promotion loop missing stories with met deps never move from backlog to current
    • Stale merge job lock prevents new merges after agent dies
    • Depends on pointing at an archived story is silently treated as deps met surprising users
    • Create story silently drops description and any other unknown parameters with no error
    • Stale mergemaster advance moves done stories back to merge zombie merge loop
    • Chat status number and mcp tool status still read from filesystem broken after 530
    • Delete item sets stage to deleted string instead of writing a crdt tombstone
    • Done archived sweep never fires because stage done projection uses utc now instead of real merged at timestamp
    • Crdt event bridge still writes filesystem shadow files after 530 eliminated filesystem state
    • Get agent output mcp tool returns no agent for exited agents instead of reading session logs from disk
    • Stale stage transition notifications for stories that skipped stages
    • Get agent output mcp tool returns fetch failed for running agents

    Refactors

    • Split chat tsx into smaller components
    • Deduplicate lifecycle rs move functions into a shared parameterised helper
    • Split agents pool lifecycle rs into submodules
    • Split agent definitions from project toml into agents toml
    • Introduce script test script lint script build and migrate agent prompts off tech specific commands
    • Unify timer tick watchdog and watcher sweep into a single 1 second tick loop
    • Add doc comments to all undocumented source files and generate source map in readme
    • Rename bot test command to run tests to avoid eating chat messages
    • Rename living spec standalone to huskies in package json and cargo lock

    Other Changes

    • fix: shrink hero husky logo from 320px to 160px for mobile
    • fix: switch tokio-tungstenite from native-tls to rustls to remove OpenSSL dependency
    • chore: add doc comment guidance to coder agent system prompts
    • fix: add log rotation to docker-compose to prevent disk fill
    • fix: add ETXTBSY retry to run_coverage_gate
    • fix: update run_tests tests for Stdio::inherit and bump tool count to 60
    • fix: add rustfmt to Docker image for formatting checks
    • fix: remove stale tests that hang or assert dead behaviour
    • fix: collapse nested if-let blocks to satisfy clippy collapsible_if lint
    • fix: use Stdio::inherit for run_tests to prevent pipe deadlock
    • fix: kill stale cargo processes before running acceptance gates
    • fix: make run_tests block server-side instead of requiring agent polling
    • fix: increase run_tests MCP timeout to 20 minutes to match acceptance gates
    • fix: server-side 20s blocking in get_test_result to prevent agent poll spam
    • fix: rewrite .huskies/README.md for CRDT-only world
    • fix: update scaffold settings template to match locked-down agent permissions
    • fix: async run_tests to prevent zombie cargo processes blocking gates
    • fix: log git hash on build success and startup to verify which commit is running
    • fix: switch agent permission mode from bypassPermissions to allowFullAutoEdit
    • fix: remove cargo test/clippy/npm from agent Bash permissions
    • fix: mergemaster prompt says merge_agent_work blocks — no polling needed
    • fix: merge_agent_work blocks until complete instead of requiring polling
    • fix: agent prompts say trust the story description instead of always investigating
    • fix: remove startup CRDT stage sync — it fights the done→archived sweep
    • fix: restore CRDT-based triage command (535 fix was reverted by merge conflict)
    • fix: collapse consecutive str::replace calls to satisfy clippy
    • fix: thread-local CRDT and content store for test isolation
    • fix: agent prompts use run_tests MCP tool instead of running script/test via Bash
    • debug: add PTY spawn diagnostics for Session: None investigation
    • fix: skip rate limit timer for short blocks (≤10 min) — CLI handles internally
    • fix: CrdtNode derive macro defaults missing fields instead of panicking
    • debug: add logging to sync_crdt_stages_from_db to diagnose stale backlog
    • fix: startup migration syncs stale CRDT stages from pipeline_items DB
    • fix: read_all_items must use deduplicated index, not raw CRDT entries
    • fix: validate_story_dirs reads filesystem shadows instead of global CRDT singleton (bug 525)
    • fix: move_item must not overwrite advanced CRDT stage when missing_ok=true (bug 524)
    • Trying out sonnet for merges
    • fmt
    • fix: commit uncommitted native JSON type changes on master
    • feat(521): evict_item primitive + purge_story MCP tool
    • wip(501): timer cancellation infrastructure (parallel session WIP + main.rs wiring)
    • sketch(520): add ExecutionMachine to the statig sketch for parity with bare
    • docs: file 12 stories from 2026-04-09 architecture session + handoff doc
    • sketch(520): typed pipeline state machine — bare and statig versions
    • fix(511): replay CRDT ops by rowid ASC instead of seq ASC
    • merge(478): WebSocket CRDT sync layer (manual squash from feature/story-478)
    • fix(502): don't demote merge-stage stories on mergemaster attach
    • chore: ignore pipeline.db backup files in .huskies/.gitignore
    • Noting script/ commands for Docker rebuild and restart.
    • Archiving the last of the pipeline story files
    • Ignoring the huskies pipeline datastore
    • Formatting
    • fix: comment out premature db::crdt references that broke build
    • scope script/test to huskies crate only
    • ignore kleppmann_trace test — 10+ min, 12GB RAM
    • bump gate timeout from 600s to 1200s
    • Adding the bft-json-crdt crate source
    • Styling it up
    • Adding source and release links
    • Ignoring some thinking
    • Fixing missing configs
    • Fixed up README a bit
    • Coding agents text change.
    • More husky
    • Husky metaphor in action.
    • Updated styles
    • Fixed repo location in release script
    • Fixed website title

    Full diff: https://code.crashlabs.io/crashlabs/huskies/compare/v0.9.0...v0.10.0

    Downloads
  • v0.9.0 eb2b9f435a

    v0.9.0 Stable

    dave released this 2026-04-03 16:19:01 +00:00 | 827 commits to master since this release

    What's Changed

    • Renamed "Storkit" to "Huskies"

    Other Changes

    • Fixed website title

    Full diff: https://code.crashlabs.io/crashlabs/huskies/compare/v0.9.0...v0.9.0

    Downloads