-
v0.13.0 Stable
released this
2026-05-19 23:17:14 +00:00 | -101 commits to master since this releaseWhat's Changed
Focus: Bot commands, infrastructure, Docker hardening
Features
- Chat-bot proxy reads stale
gateway_project_urlsBTreeMap 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 upgradepulls a fresh binary without docker rebuild (1138) - Per-project Dockerfile fragment so agents can extend their own sled image (1139)
- One-shot
project-rebuildchat 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
upgradechat command using huskies upgrade (1138), serial-locked (1148) huskies healthchat 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
- Chat-bot proxy reads stale
-
v0.12.1 Stable
released this
2026-05-17 22:52:28 +00:00 | -65 commits to master since this releaseWhat'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 --adoptas 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_projectsVec instead of livegateway_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
released this
2026-05-17 01:16:27 +00:00 | -33 commits to master since this releaseWhat's Changed
Focus: Bot commands, Docker hardening
Features
- Chat bootstrap Phase 1:
new projectchat 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:
--gitclones 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()andensure_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
- Chat bootstrap Phase 1:
-
v0.11.1 Stable
released this
2026-05-15 22:43:43 +00:00 | -23 commits to master since this releaseWhat'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 NNNNcommit 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 chatstatusoutput (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_versionreturns stalebuild_hashafterrebuild_and_restart(1074)get_pipeline_statusreturns ~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_exitflag, 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_childrenandkill_child_for_keytoprocess_killso server shutdown andstop_agentactually 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
released this
2026-05-14 22:54:40 +00:00 | 29 commits to master since this releaseWhat'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
fastcryptoremoved 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
blockedoff front-matter; route through state machine as Block / Unblock transitions - (867) Migrate
frozenoff front-matter; route through state machine as Freeze / Unfreeze transitions - (868) Migrate
merge_failureoff front-matter; route through state machine as MergeFailed transition with reason payload - (869) Migrate
qamode off front-matter; typed CRDT-register setter (pure metadata, no transition) - (870) Migrate
retry_countoff front-matter; typed counter setter (pure metadata, no transition) - (871) Migrate
agentoff front-matter; typed setter (pure metadata, no transition) - (872) Migrate
depends_onoff front-matter; typed list setter (pure metadata, no transition) - (873) Migrate
mergemaster_attemptedoff front-matter; typed flag setter (pure metadata, guards retry loop) - (874) Chat
deletecommand does not write a CRDT tombstone — story survives in CRDT and reappears in lists - (875) delete: extract shared
services::work_item::deleteso 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
epicwork-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 → Tois 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
- 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
-
v0.10.4 Stable
released this
2026-04-21 12:01:43 +00:00 | 490 commits to master since this releaseWhat'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
released this
2026-04-15 19:21:46 +00:00 | 512 commits to master since this releaseWhat'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
released this
2026-04-14 16:03:59 +00:00 | 534 commits to master since this releaseWhat'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
released this
2026-04-12 23:31:35 +00:00 | 565 commits to master since this releaseWhat'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 Stable
released this
2026-04-03 16:19:01 +00:00 | 827 commits to master since this releaseWhat'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