• 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