All notable changes to this project will be documented in this file.
.claude-plugin/plugin.jsonandmarketplace.json— Claude Code plugin manifests for distribution..mcp.json— MCP server entry point manifest.PRIVACY.md— privacy policy for the dashboard and data handling.
scripts/hooks/task-cleanup-stop.js— significant rewrite; simplified cleanup logic (net -81 lines).- Docs polish —
docs/ARCHITECTURE.md,docs/SETUP.md,docs/hooks.mdminor edits and clarifications.
- KnowledgeBridge — new
src/domain/knowledge-bridge.tspusheslearninganddecisionartifacts to agent-knowledge on task completion. Same pattern as AgentBridge: HTTP-only, fail-open, no npm dependency. Configurable viaAGENT_KNOWLEDGE_URLenv var (defaulthttp://localhost:3423). Wired intocontext.tswith start/stop lifecycle. - 5 new tests covering event subscription, unsubscribe, fail-open behavior, artifact push on completion, and skip when no learnings exist. 432/432 tests green.
- Docs: full parity between AgentBridge and KnowledgeBridge — ARCHITECTURE.md now documents both bridges at the same depth: events handled, cleanup integration, hooks, env vars, downstream pipeline, failure modes. README updated with knowledge bridge feature + dependency section.
task_getdefault response now includesclaim_status—{ status, claimable, blocked_by: [{id, title, status, stage}] }. Lets a caller answer "is this task claimable right now?" and "what's blocking it?" without trying claim and catching the exception. Backed by a newTaskService.getClaimStatus(taskId)method.- 6 unit tests covering isolated, single-blocker, completed-blocker, multiple-blockers, cancelled-as-resolved, and in-progress-status cases.
bench/README.md— removed the "Critical pitfalls" section. Reframed the "Limitations" section: now documents what we've actually addressed (the new transitive_deps + claim_status capabilities) and notes the dep-aware-mgmt naive-baseline variance issue (questions leak task names, letting the LLM occasionally guess the project structure).
task_get include=["transitive_deps"]— new include option that returns the full upstream + downstream dependency closure for a task in one call. Backed by a newTaskService.getDependencyClosure(taskId)method (BFS over theblocksedge table, dedupes on diamond DAGs, ignoresrelated/duplicateedges). Returns{ blockers_transitive, blocking_transitive, depth_blockers, depth_blocking }.- 5 unit tests covering isolated, chain, diamond, edge-type filtering, and not-found cases.
bench/README.md— neutral framing, no external references. Refresheddep-aware-mgmtheadline numbers (now 8.5/10 thanks to the new transitive_deps capability).
- bench: focused on the five product features. The bench now ships with one scenario per product feature (Visibility, Stages, Dependencies, Approvals, Artifacts) plus the throughput pilot. Three v1.10.0 throughput pilots that produced no signal (
task-claim-race,dependency-graph,cross-session-pipeline) were removed; their workload fixtures and runner functions are gone. The bench keeps onlyrealistic-funcsfor throughput. - bench/visibility: two new scenarios that directly test the features the v1.10.0 bench did not cover:
dep-aware-mgmt— 8-task DAG (user profile API). Tests Dependencies. Manager questions about who's blocked, what becomes claimable when worker-B finishes, the critical path, transitive impact. N=2 result: naive 0.0/10 (literal zero across both runs), agent-tasks 7.5/10. The dependency graph data physically does not exist in the file system — only agent-tasks can answer these questions at all.gates-and-approvals— 6-task pricing rules build with two tasks at the review stage (one approved by alice with a "LGTM ship it" comment, one pending bob). Tests Approvals. Manager questions about reviewer verdicts, pending approval state, latency, what to do to unblock the project. N=2 result: naive 0.5/10, agent-tasks 9.75/10.
- bench/README.md completely rewritten. Leads with a single bottom-line table mapping each of the five product features (Visibility, Stages, Dependencies, Approvals, Artifacts, plus parallel coordination) to its corresponding bench scenario and N=2 result. Aggregate across all 4 visibility scenarios: naive 1.83/10 (18%), agent-tasks 9.31/10 (93%) — 5.1× advantage on management correctness.
- bench/runner.ts — slimmed to a single throughput pilot (
runRealisticFuncs). RemovedrunTaskClaimRace,runDependencyGraph,runCrossSessionPipelineand the--pilotflag (only one pilot exists now). Mock driver simplified. - bench/drivers/cli.ts — removed unused
dependencyEdgesoption (onlytaskDescriptionsremains, used by realistic-funcs and the seeded visibility scenarios). - bench/metrics.ts — narrowed
MultiAgentRun.conditionunion to'control' | 'agent-tasks-claim'. Other condition labels were dead. - bench/workloads/ — deleted
task-claim-race/anddependency-graph/. Onlyrealistic-funcs/remains.
scoreTaskConfidence(src/domain/confidence.ts): pure heuristic 0-100 score over title + description (length, lists, headers, file refs, acceptance language). No LLM calls.GateConfig.min_confidence_for_claim: optional per-project threshold;TaskService.claimthrowsValidationErrorwith reasons when a vague task is claimed. Backward compat — disabled by default.GateConfig.stage_instructions: optional per-stage prompt strings;TaskService.getStageInstructionsexposes them, MCPtask_stagehandler augments claim/advance responses with astage_instructionsfield when configured.- 6 unit tests (confidence), 9 integration tests (gate + instructions), 2 e2e tests (full pipeline run with both features).
docs/API.mddocuments both new GateConfig fields with examples.
bench/— quantitative bench harness for the pipeline coordination layer, mirroring the agent-comm bench. Pure metric calculators (metrics.ts) with 20 unit tests, mock + real Claude CLI driver (drivers/cli.ts) that pre-seeds tasks viaTaskServiceinto a shared SQLite DB injected per-agent throughAGENT_TASKS_DB, runner with--real/--pilot/--n-runs=Nselection, and persisted results inbench/_results/.- Throughput pilots — 4 fixtures testing
task_stage claimagainst naive parallel agents at varying work-unit sizes:task-claim-race(6 tiny TODO functions, $0.50/agent) — N=3 result: MARGINAL (4.3/6 vs 3.7/6, identical units/$ ~2.84). The atomic claim primitive prevents some collisions but the fixture is too small for the gain to justify the cost.dependency-graph(6 files in a real DAG, 3 conditions: naive / flat-claim / dep-aware) — N=3 result: INCONCLUSIVE. At $0.50 every condition hits the 5/6 ceiling; at $0.25 the MCP-based conditions floor at 0/6 because protocol overhead consumes the entire budget. Fixture cannot measure what it claims to measure.cross-session-pipeline(2 sequential agents handing off via SQLite, $0.30/agent) — N=3 result: INCONCLUSIVE. Naive 6.0/6 vs claim 1.0/6 — protocol overhead exceeds the per-agent budget. Fixture too small.realistic-funcs(3 parallel agents, 4 non-trivial 50-150 LOC functions: parseCsv, stringifyCsv, diffObjects, renderTemplate, $1.50/agent) — N=3 result: WIN ⭐. agent-tasks-claim hit 4/4 deterministically every run vs naive 3.3/4. +20% units/$, 6% faster wall, identical cost, 100% individual pass rate vs naive 67%. First fixture where agent-tasks's structured pipeline measurably wins on throughput.
- Cross-cutting throughput finding: MCP protocol overhead (~$0.15 per task = ~3 roundtrips × $0.05) dominates on small work units. agent-tasks's pipeline only pays off when work-per-task ≥ ~$0.30; below that, naive wins. Documented in
bench/README.mdwith a break-even table and explicit production guidance: use agent-tasks for multi-stage durable work, not for tiny throwaway TODOs.
bench/visibility/— a structurally different bench that measures manager visibility, not throughput. Builds a frozen mid-feature project state and asks a single "manager" agent (with no prior context) 10 standardized questions about it. Two conditions: (a) naive — the manager has only the file system; (b) agent-tasks — the manager hastask_list/task_getwith artifacts and comments. Auto-graded against a known answer key.- Two scenarios in a registry (
bench/visibility/scenarios/):csv-export— 6 tasks, mid-build snapshot (3 workers adding CSV export to a TODO app, minute 8 of an estimated 15-minute build). Tests live state visibility: who's working on what, what's blocked, what's idle, what's left, why was X chosen.audit-recall— 8 tasks, all done. A "30-day-old" completed feature build (rate-limit added to auth endpoint), with full spec/decision/test-results/review-notes artifacts. Tests historical provenance: who wrote the spec, why was sliding window chosen over token bucket, how many tests passed, what concern did the reviewer raise.
- N=2 result, both scenarios:
- csv-export: naive 3.0/10, agent-tasks 10.0/10 ⭐ (perfect across both runs)
- audit-recall: naive 2.0/10, agent-tasks 10.0/10 ⭐ (perfect across both runs)
- Cross-scenario aggregate: naive 2.5/10 (25%) vs agent-tasks 10.0/10 (100%) — +7.5 score delta, 4× advantage at ~$0.37 per query.
- Total visibility-bench spend: ~$2.40 for 8 manager invocations — produced the strongest evidence in the entire v1.10 cycle for one tenth the cost of the throughput sweep.
- What this proves: agent-tasks's value is management visibility for humans running fleets of agents, not raw agent throughput. The naive manager cannot answer questions whose answers live in artifacts (specs, decisions, test results, review notes) or in task metadata (blocked, idle, count, backlog). agent-tasks captures all of these.
bench/README.md— full methodology with the throughput break-even table, both visibility-scenario results, the production-feedback section, an explicit negative-results policy, and a section on why naive wins on tiny workloads but agent-tasks wins on management questions.- Production guidance added: DO use agent-tasks for multi-stage durable work, multi-session features, work needing audit trails or human review at gates. DON'T use it for tiny throwaway TODOs in a single session — naive parallelism is cheaper.
tsxadded as a devDep for runningbench:runandbench:visibility.
- v1.10.0 ships as the consolidated bench-evaluation release. CHANGELOG covers the original c237c69 feature work + the entire bench harness + the throughput pilots + the visibility bench v2 in a single entry. Total bench spend during evaluation: ~$33.
- Self-documenting release: documents this version + retroactively records the 1.9.28 release whose payload was the 1.9.19 – 1.9.27 backfill.
- Tidied
.gitignorewith section headers and addedtest-results/+playwright-report/.
- Playwright E2E dashboard test suite at
tests/e2e-ui/dashboard.pw.ts. Boots the standalone HTTP+WS server against a temp SQLite DB on a free port, seeds one task per stage, drives the kanban with chromium, and verifies: page loads with no errors, websocket upgrade, every stage column renders with its seeded card, REST/api/tasks/:id/stageadvance moves a card to the next column. Runnable vianpm run test:e2e:ui. Devdep@playwright/test. Vitest count unchanged at 355.
- Adopted
createRateLimiterfrom agent-common 1.1.0 in place of the local rate-limiter implementation.
CleanupServicenow extendsagent-common'sCleanupServicebase, with thinstart()/stop()wrappers over the inheritedstartTimer/stopTimer.
index.tsMCP dispatcher delegated toagent-common'sstartMcpServerwith aformatResultfooter hook.
transport/ws.tsdelegated toagent-common'ssetupWebSocketwithonMessage+broadcasthooks.
transport/rest.tshelpers delegated toagent-common'sjson.extraHeaders+serveStatic.spaFallback.
storage/database.tsdelegated toagent-common'screateDb+Migration[]runner.
- Added
agent-commonas a runtime dependency for events, package metadata, and the dashboard server primitives.
- Major rewrite of
docs/USER-MANUAL.md,docs/API.md, anddocs/SETUP.mdto reflect the post-consolidation MCP tool surface (8 action-based tools, not 14+). The README and CLAUDE.md were already correct; this brings the deeper docs into alignment. - Removed standalone sections for tools that no longer exist as separate MCP entries:
task_query,task_claim,task_advance,task_complete,task_fail,task_dependency,task_collaborator,task_approval,task_get_subtasks,task_get_artifacts,task_get_comments,task_add_dependency,task_remove_dependency,task_request_approval,task_approve,task_reject,task_pending_approvals,task_review_cycle,task_next,task_search,task_expand,task_comment,task_learn. Their behavior is now documented as actions on the surviving tools (task_getwithinclude,task_stageactions,task_artifacttypes,task_update.dependency). - Added migration notes ("Replaces the former …") under each consolidated tool so readers landing from old docs / cached search results can find the new form.
- FAQ entry on multi-agent collaboration rewritten —
task_collaboratorwas removed, the workflow now uses sequential handoff or parent+subtasks. - Setup
task_complete/task_fail/task_advance/task_claimreferences rewritten to the action-based forms.
- All three version files re-aligned to 1.9.18 (
package.jsonwas 1.9.17,server.jsonwas 1.9.16,agent-desk-plugin.jsonwas 1.9.16, plus the inner npm package version insideserver.jsonhad drifted to 1.9.15).
1.9.0 - 2026-03-30
task_search— merged intotask_list(query: "...")for full-text searchtask_next— merged intotask_list(next: true)with optionalagentfor affinity scoringtask_expand— removed (usetask_createwithparent_idto create subtasks)- Dead code cleanup — deleted 4 orphaned pre-refactor files (
src/db.ts,src/event-bus.ts,src/session.ts,src/tasks.ts) totaling ~700 lines - Backward-compat aliases — removed 15 old tool name aliases from handler dispatch
- MCP tool count: 16 → 13
- Improved tool descriptions — all 13 tools now have detailed descriptions with examples, parameter explanations, and getting-started guidance for better LLM adoption
- Gate config caching —
getPipelineStages(),getGateConfig(),getAllGateConfigs()now use in-memory cache with 30s TTL, invalidated on writes - Type-safe agent bridge — replaced unsafe
ascasts inagent-bridge.tswith runtime type guard functions - Updated all docs (README, CLAUDE.md, ARCHITECTURE.md)
- Tool consolidation round 2 — reduced MCP tool count from 27 to 16 by merging related tools:
task_advance,task_regress,task_complete,task_fail,task_cancelmerged intotask_stage(action: "advance"|"regress"|"complete"|"fail"|"cancel")task_get_subtasks,task_get_artifacts,task_get_commentsmerged intotask_query(type: "subtasks"|"artifacts"|"comments")task_add_artifact,task_decision,task_learnmerged intotask_artifact(type: "general"|"decision"|"learning")task_pipeline_config,task_set_session,task_cleanup,task_generate_rulesmerged intotask_config(action: "pipeline"|"session"|"cleanup"|"rules")
- Old tool names kept as backward-compatible aliases in the handler dispatch map
- Domain layer unchanged — only MCP transport layer refactored
- Tool consolidation — reduced MCP tool count from 33 to 27 by merging related tools:
task_request_approval,task_approve,task_reject,task_pending_approvals,task_review_cyclemerged intotask_approval(action: "request"|"approve"|"reject"|"list"|"review")task_add_collaborator,task_remove_collaboratormerged intotask_collaborator(action: "add"|"remove")task_add_dependency,task_remove_dependencymerged intotask_dependency(action: "add"|"remove")
- Domain layer unchanged — only MCP transport layer refactored
- Learnings Propagation — new
task_learnMCP tool for capturing insights on tasks (categories: technique, pitfall, decision, pattern). Ontask_complete, learnings auto-propagate to the parent task and in-progress sibling subtasks with attribution. - Agent Affinity —
task_nextnow accepts anagentparameter for affinity-based routing. Among same-priority tasks, prefers tasks where the agent worked on the parent, a dependency, or the same project. Returnsaffinity_scoreandaffinity_reasonsin the response. - Dashboard: dedicated "Learnings" section in the side panel with lightbulb icon, category badges (technique/pitfall/decision/pattern), and source attribution for propagated learnings.
- Dashboard: CSS styles for learning cards with amber accent color.
- MCP tool count: 32 → 33
task_nextresponse now includesaffinity_score(number) andaffinity_reasons(string array)
- Stage Gate Guards —
GateConfignow supports per-stage rules viagatesfield. Each stage can require named artifacts (require_artifacts), minimum artifact count (require_min_artifacts), comments (require_comment), or approvals (require_approval) before a task can advance. Configure viatask_pipeline_config. - Decisions Log — new
task_decisionMCP tool for recording structured decisions (chose X over Y because Z) as artifacts. Creates a formatted markdown artifact at the current stage.
- MCP tool count: 31 → 32
- GitHub Actions CI with npm auto-publish on tag
- Clean CHANGELOG
- Prepared for open-source release on GitHub
- Removed all internal references
- Comprehensive documentation (README, setup guide, API reference, dashboard guide, hooks guide)
- 7 dashboard screenshots
- Cleanup dialog with 3 options: purge completed, purge all done, purge everything
- Syntax highlighting for code artifacts (highlight.js)
- Markdown rendering (marked + DOMPurify)
- Expandable/collapsible artifacts
- Side-by-side diff viewer
- Status badges on task cards
- Resizable side panel with fullscreen artifact viewer
- Loading skeleton placeholders
- Card flicker on state updates (morphdom keying)
- CSP headers for CDN libraries
- isDiff detection accuracy
- Side panel detail view
- Rich task cards with avatars, description preview, relative time
- Inline task creation and editing
- Stage-colored columns with Material Symbol icons
- Collapsible columns, WIP indicators
- MD3 design token alignment
- Health endpoint optimization (COUNT(*))
- REST input validation, PUT /api/tasks/:id
- Rate limit cleanup, event bus logging
- 338 tests across 12 test files
- Rate limiter memory leak
- getDependencies validation
- fail() transaction wrapper
- CORS on 429 responses
- Real-time kanban dashboard with WebSocket
- TodoWrite bridge hook
- Approval workflows
- Auto-assignment, review cycles
- Multi-agent collaboration, subtasks, search
- Drag-and-drop, filters, keyboard shortcuts
- Full-text search (FTS5)
- Artifact versioning, threaded comments
- Dark/light theme