Commit Graph

782 Commits

Author SHA1 Message Date
Dave
6d87355577 Merge branch 'feature/story-97_bug_agent_pool_allows_multiple_instances_of_the_same_agent_to_run_concurrently' 2026-02-23 20:53:54 +00:00
Dave
a0f317292c story-kit: merge 93_story_expose_server_logs_to_agents_via_mcp
Adds log_buffer ring buffer and slog! macro for in-memory server log
capture, plus get_server_logs MCP tool for agents to read recent logs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 20:53:37 +00:00
Dave
bed46fea1b story-kit: accept 96_story_reset_agent_lozenge_to_idle_state_when_returning_to_roster 2026-02-23 20:52:06 +00:00
Dave
b09b6ce4f1 fix(agents): enforce single-instance concurrency per agent name
The agent pool allowed the same agent (e.g. "qa") to run concurrently
on multiple stories because start_agent() only checked whether that
story+agent combo was already active. It did not check whether the
agent was busy on a different story.

Two concurrent QA runs each spawn cargo clippy + cargo test + vitest,
causing extreme CPU load (load average >33 on M1 Mac).

Fix: before registering a new agent as Pending, scan all active entries
for any Running or Pending entry with the same agent_name. If one is
found, return an error explaining that the story will be picked up when
the agent becomes available.

The existing auto_assign_available_work() mechanism already scans
pipeline directories (3_qa/, 4_merge/, etc.) for unassigned stories
and uses find_free_agent_for_stage() — which respects single-instance
limits — to assign work when an agent slot opens up. So the queuing
behaviour is naturally provided: the story stays in its directory,
and auto-assign picks it up when the previous run completes.

Adds two regression tests:
- start_agent_rejects_when_same_agent_already_running_on_another_story
- start_agent_allows_new_story_when_previous_run_is_completed

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-23 20:46:51 +00:00
Dave
7f18542c09 story-kit: queue 93_story_expose_server_logs_to_agents_via_mcp for merge 2026-02-23 20:42:26 +00:00
Dave
0de1a3f113 story-kit: queue 89_story_persistent_per_session_agent_logs for merge 2026-02-23 20:42:23 +00:00
Dave
1366f64c3d story-kit: queue 89_story_persistent_per_session_agent_logs for QA 2026-02-23 20:40:24 +00:00
Dave
b46a72730c story-kit: queue 93_story_expose_server_logs_to_agents_via_mcp for QA 2026-02-23 20:40:13 +00:00
Dave
c1ff530e50 fix: allow e2e tests to reuse existing vite server on port conflict
Set reuseExistingServer:true in playwright config so acceptance gates
don't fail when port 41700 is already occupied by a prior test run.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-23 20:39:57 +00:00
Dave
ec0f48656b story-kit: start 97_bug_agent_pool_allows_multiple_instances_of_the_same_agent_to_run_concurrently 2026-02-23 20:39:47 +00:00
Dave
64e76f4bb9 story-kit: accept 94_bug_stale_agent_state_persists_after_server_restart 2026-02-23 20:38:37 +00:00
Dave
8c6bd4cf74 feat(story-93): expose server logs to agents via get_server_logs MCP tool
- Add log_buffer module: bounded 1000-line ring buffer with push/get_recent API
- Add slog! macro: drop-in for eprintln! that also captures to ring buffer
- Replace all eprintln! calls across agents, watcher, search, chat, worktree, claude_code with slog!
- Add get_server_logs MCP tool: accepts count (1-500) and optional filter params
- 5 unit tests for log_buffer covering push/retrieve, eviction, filtering, count limits, empty buffer
- 262 tests passing, clippy clean

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-23 20:38:19 +00:00
Dave
cd902ff219 story-kit: merge 94_bug_stale_agent_state_persists_after_server_restart 2026-02-23 20:38:17 +00:00
Dave
39dbace8bf story-kit: create 97_bug_agent_pool_allows_multiple_instances_of_the_same_agent_to_run_concurrently 2026-02-23 20:38:16 +00:00
Dave
dc1e441a86 story-kit: queue 94_bug_stale_agent_state_persists_after_server_restart for merge 2026-02-23 20:38:04 +00:00
Dave
1a70d4303d story-kit: queue 94_bug_stale_agent_state_persists_after_server_restart for QA 2026-02-23 20:36:52 +00:00
Dave
c291613887 story-kit: start 96_story_reset_agent_lozenge_to_idle_state_when_returning_to_roster 2026-02-23 20:34:54 +00:00
Dave
7925fd8fbc story-kit: queue 95_bug_pipeline_auto_restart_has_no_retry_limit_causing_infinite_loop for QA 2026-02-23 20:33:36 +00:00
Dave
d371960d05 story-kit: create 96_story_reset_agent_lozenge_to_idle_state_when_returning_to_roster 2026-02-23 20:33:02 +00:00
Dave
f0ec507cc4 story-kit: start 93_story_expose_server_logs_to_agents_via_mcp 2026-02-23 20:31:01 +00:00
Dave
3d480e7c22 story-kit: accept 78_story_create_spike_mcp_tool 2026-02-23 20:27:28 +00:00
Dave
a25553f1bc story-kit: merge 78_story_create_spike_mcp_tool 2026-02-23 20:27:09 +00:00
Dave
2b3063ace2 story-kit: queue 78_story_create_spike_mcp_tool for merge 2026-02-23 20:26:55 +00:00
Dave
0c9883fe10 story-kit: start 89_story_persistent_per_session_agent_logs 2026-02-23 20:26:24 +00:00
Dave
421c702aad story-kit: queue 78_story_create_spike_mcp_tool for QA 2026-02-23 20:25:47 +00:00
Dave
c4f92ee7db story-kit: start 94_bug_stale_agent_state_persists_after_server_restart 2026-02-23 20:24:15 +00:00
Dave
64e76b21c3 story-kit: start 95_bug_pipeline_auto_restart_has_no_retry_limit_causing_infinite_loop 2026-02-23 20:23:45 +00:00
Dave
22b862023b story-kit: start 78_story_create_spike_mcp_tool 2026-02-23 20:21:35 +00:00
Dave
a18d4350ae chore: add .vite/ Vitest cache to .gitignore 2026-02-23 20:19:11 +00:00
Dave
aa2149e506 story-kit: create 95_bug_pipeline_auto_restart_has_no_retry_limit_causing_infinite_loop 2026-02-23 20:15:28 +00:00
Dave
8d58e3999d story-kit: create 94_bug_stale_agent_state_persists_after_server_restart 2026-02-23 20:04:46 +00:00
Dave
06586a5b70 story-kit: queue 85_story_agent_lozenges_move_between_roster_and_work_items_instead_of_duplicating for QA 2026-02-23 20:02:47 +00:00
Dave
9da25a149d story-kit: create 93_story_expose_server_logs_to_agents_via_mcp 2026-02-23 19:59:07 +00:00
Dave
1a7948b15a story-kit: queue 91_bug_permissions_dialog_never_triggers_in_web_ui for QA 2026-02-23 19:54:05 +00:00
Dave
41fce3322c story-kit: start 91_bug_permissions_dialog_never_triggers_in_web_ui 2026-02-23 19:52:53 +00:00
Dave
7f139917b4 story-kit: create 91_bug_permissions_dialog_never_triggers_in_web_ui 2026-02-23 19:52:26 +00:00
Dave
6c1f8555e8 feat(story-85): agent lozenges move between roster and work items
- Add `hiddenRosterAgents: ReadonlySet<string>` to LozengeFlyContext:
  - Derived from pipeline: any agent currently assigned to a work item
  - `flyingOutAgents` state keeps badge hidden for 500 ms during the
    fly-out animation so the returning clone lands before the badge reappears
  - Union of both sets exposed as `hiddenRosterAgents` in context
- Update AgentPanel: wrap each RosterBadge in a collapsing div
  controlled by `hiddenRosterAgents`. The div transitions max-width
  0→300px / opacity 0→1 so the roster gap closes/opens smoothly.
- Add tests covering:
  - `hiddenRosterAgents` is empty when no agents are assigned
  - Badge hidden immediately when agent appears in pipeline
  - Badge hidden during fly-out (0–499 ms) and visible after (≥500 ms)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-23 19:52:23 +00:00
Dave
d1d7ce47ac Switch all Sonnet agents from 4.6 to 4.5 for speed
Sonnet 4.6 is too slow for small stories — agents burn through turns
without completing. Reverting coders, QA, and mergemaster to Sonnet 4.5.
Supervisor and coder-opus remain on Opus.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 19:50:10 +00:00
Dave
02a617eee3 story-kit: queue 93_bug_agent_session_id_is_null_while_running for QA 2026-02-23 19:49:04 +00:00
Dave
306514e6d2 story-kit: start 93_bug_agent_session_id_is_null_while_running 2026-02-23 19:43:18 +00:00
Dave
0aaefc34c2 story-kit: create 93_bug_agent_session_id_is_null_while_running 2026-02-23 19:39:37 +00:00
Dave
03f243b670 story-kit: create 92_spike_stop_auto_committing_intermediate_pipeline_moves 2026-02-23 19:37:28 +00:00
Dave
63cfd5818c story-kit: start 85_story_agent_lozenges_move_between_roster_and_work_items_instead_of_duplicating 2026-02-23 19:27:08 +00:00
Dave
a91d663894 story-kit: create 85_story_agent_lozenges_move_between_roster_and_work_items_instead_of_duplicating 2026-02-23 19:26:54 +00:00
Dave
04e7a1e854 Remove invalid --directory flag that broke agent spawning
The --directory flag does not exist in Claude Code CLI. It was added in
c169cfc but caused every agent spawn to exit immediately with "unknown
option", resulting in Session: None errors. The process cwd (set via
cmd.cwd()) already correctly pins agents to the worktree directory.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 19:26:37 +00:00
Dave
42ad712a74 story-kit: queue 85_story_agent_lozenges_move_between_roster_and_work_items_instead_of_duplicating for QA 2026-02-23 19:19:44 +00:00
Dave
c70399a39b story-kit: start 85_story_agent_lozenges_move_between_roster_and_work_items_instead_of_duplicating 2026-02-23 19:13:35 +00:00
Dave
8b9d77e2f2 story-kit: remove 92_story_test_story_creation_without_test_plan 2026-02-23 19:13:11 +00:00
Dave
23043dbd29 story-kit: create 92_story_test_story_creation_without_test_plan 2026-02-23 19:12:52 +00:00
Dave
31037f5bf5 Remove test_plan gate from the codebase
The test_plan field was a gate from the old interactive web UI workflow
where a human would approve a test plan before the LLM could write code.
With autonomous coder agents, this gate is dead weight — coders sometimes
obey the README's "wait for approval" instruction and produce no code.

Removes: TestPlanStatus enum, ensure_test_plan_approved checks in fs/shell,
set_test_plan MCP tool + handler, test_plan from story/bug front matter
creation, test_plan validation in validate_story_dirs, and all related tests.
Updates README to remove Step 2 (Test Planning) and renumber steps.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 19:12:05 +00:00