Commit Graph
100 Commits
Author SHA1 Message Date
dave 39bdbbd095 huskies: merge 809 2026-04-29 00:06:42 +00:00
dave a8d45dcdff huskies: merge 800 2026-04-28 23:36:40 +00:00
dave 3ac10b1e1c huskies: merge 825 2026-04-28 23:30:39 +00:00
dave ab01a62bd1 huskies: merge 808 2026-04-28 23:18:57 +00:00
dave 6092f7efbb huskies: merge 822 2026-04-28 23:12:25 +00:00
dave b698cee284 huskies: merge 821 2026-04-28 21:06:54 +00:00
dave dd35a8a530 huskies: merge 799 2026-04-28 21:01:55 +00:00
dave 97b9eaa39d huskies: merge 807 2026-04-28 20:56:17 +00:00
dave 2a77f73ba4 fix(merge): use server-start-time, not pid, for stale-merge detection
The merge_jobs cleanup encoded the server's pid in the CRDT and checked
`kill(pid, 0)` to decide whether a "running" entry was stale. Two problems:

  1. The cleanup runs *inside* the server, so checking whether the
     server's own pid is alive is tautological — kill(self_pid, 0)
     always succeeds.
  2. `rebuild_and_restart` does an `execve()` re-exec, which keeps the
     same pid. After re-exec, merge_jobs from the previous server
     instance still encode "the current pid" — so the cleanup never
     fires, and stories like 799/800 sit forever with status="running"
     while no actual merge runs.

Switch to a per-process server-start-time captured lazily in a
`OnceLock<f64>` (reset by execve, so the new instance sees a fresh
boot-time). A merge_job's recorded start-time < current boot-time means
it came from a previous instance: stale, delete it.

Legacy pid-encoded entries decode to None and are also treated as stale.

MergeJob.pid → MergeJob.server_start_time. Tests updated.
2026-04-28 20:41:32 +00:00
dave 8f392f4fc7 huskies: merge 789 2026-04-28 20:38:12 +00:00
dave f5ab75ecaa huskies: merge 819 2026-04-28 20:28:35 +00:00
dave b060d8fc88 fix(pty): always pass -p on resume so --include-partial-messages works
claude CLI 2.1.97 strictly enforces that --include-partial-messages
requires --print/-p to be set. The resume path skipped -p when the
prompt was empty (which is the common case on respawns when there's
no fresh failure context to inject), so the spawned claude process
saw `--resume <sid> ... --include-partial-messages` without -p and
exited with code 1: "include-partial-messages requires --print and
--output-format=stream-json".

Net effect: every coder respawn with prior_sessions > 0 and empty
prompt was failing immediately, looking exactly like a rate-limit
(empty agent log, zero tool calls). 819 hit retry-limit (4/3) and
got marked blocked because of this — not because of any actual code
or rate-limit issue.

Fix: always pass `-p <prompt>` on resume, even with empty prompt.
2026-04-28 20:14:32 +00:00
dave 20e1210818 huskies: merge 830 2026-04-28 19:30:08 +00:00
dave 46b1e84629 huskies: merge 791 2026-04-28 19:18:12 +00:00
dave e4af2d5c08 huskies: merge 803 2026-04-28 19:10:41 +00:00
dave fa54451ba6 huskies: merge 802 2026-04-28 19:05:06 +00:00
dave 5d1e75f7e0 huskies: merge 806 2026-04-28 17:39:29 +00:00
dave efc15c48da huskies: merge 804 2026-04-28 17:34:55 +00:00
dave 691f34348e huskies: merge 805 2026-04-28 17:28:47 +00:00
dave 2f6a221f09 fix(test): stub WebSocket in setupTests so rpcCall fails fast
770's HTTP→read-RPC migration replaced fetch-based agent calls with
rpcCall over WebSocket. setupTests.ts only mocks fetch though, so the
real jsdom WebSocket runs — and jsdom's WebSocket implementation
asynchronously fires its connection-failure error after ~9 seconds
(via internal Timeout._onTimeout). Tests that await component-mount
state (like App.test.tsx > calls getCurrentProject() on mount) hang
on that pending promise and time out at 10s.

This silently broke 1 test on master (App.test.tsx getCurrentProject
on mount) and cascaded into 16 failures in any worktree where the
test file count changed and timing shifted (804, 806).

Fix: replace the global WebSocket constructor with a stub that
immediately fires onerror + onclose on the next microtask. rpcCall
sees the error and rejects synchronously; components catch and continue
rendering with empty state. Tests pass without flake.

Verified locally: vitest run → 349/349 pass.
2026-04-28 17:05:53 +00:00
dave 619bdd9c82 huskies: merge 801 2026-04-28 16:43:04 +00:00
dave 3ff361bfe8 chore: silence git init defaultBranch hints in script/test
Tests that create temp repos call `git init` without specifying a branch.
Git then prints a 12-line "hint: Using 'master' as the name for the
initial branch..." block — every test, every run. The output drowns out
actual failures.

Set init.defaultBranch=master via GIT_CONFIG_COUNT/KEY/VALUE env vars in
script/test. This affects only subprocesses spawned by the test runner;
no change to the user's real git config.

Verified: cargo test --bin huskies emits 0 `hint:` lines after this
change, all 2732 tests still pass.
2026-04-28 16:38:43 +00:00
dave 30dd4b3a0a huskies: merge 796 2026-04-28 16:34:10 +00:00
dave a65cd86c8f huskies: merge 798 2026-04-28 16:25:33 +00:00
dave 1e40215c3e huskies: merge 797 2026-04-28 16:06:50 +00:00
dave d0b7db6765 huskies: merge 785 2026-04-28 15:59:50 +00:00
dave 32a3465fc4 fix: tell the truth about run_tests being blocking
`tool_run_tests` in `server/src/http/mcp/shell_tools/script.rs` is fully
blocking server-side: it spawns the test child, polls every 1s server-side
until exit (or `TEST_TIMEOUT_SECS = 1200s`), and returns the full
{passed, exit_code, output} directly. There is NO async/started-status
return path.

But two places told agents the wrong story:
1. `tools_list/system_tools.rs` description claimed "Returns immediately
   with status: started. Poll get_test_result..." — agents read tool
   descriptions for protocol semantics, so they followed this and burned
   turns polling get_test_result.
2. `agents.toml` had been correctly saying it blocks, but my last commit
   (776aad38) "fixed" it the wrong way based on a misread of the code.

Now both say: run_tests blocks server-side, returns the full result, do
not poll get_test_result. get_test_result remains for external observers
(UI checking on a job another caller started).

Reverts the prompt change in 776aad38 with the correct text.
2026-04-28 15:59:06 +00:00
dave 776aad3877 fix: agent prompts honest about run_tests being async
Pre-f958f57e, run_tests blocked until completion. After that fix it became
a background-job starter, with get_test_result polling. The agent prompts
were never updated, so they still said "run_tests blocks until complete"
— and agents then waste turns polling.

Updated coder-1/2/3, coder-opus, and qa prompts to describe the actual
flow: run_tests is async, get_test_result blocks for up to 20s per call,
test suites typically take 1-5 minutes so expect a few polls.

Companion bug filed for bumping TEST_POLL_BLOCK_SECS so one poll covers
most test runs (root-cause fix; this commit is the prompt half).
2026-04-28 15:55:15 +00:00
dave 309d330734 huskies: merge 794 2026-04-28 15:53:33 +00:00
dave bb779a0b0f chore: regenerate STACK.md source map from module doc-comments
Walked server/src/, frontend/src/, and crates/, extracting each module's
//! doc-comment to build a directory-level source map. One row per
directory + one row per top-level file.

Replaces the hand-written stopgap from 5d6757dd with content auto-derived
from the codebase, so it stays useful as decomposes happen — the
descriptions come from mod.rs, not from my recollection of where things
live.

Still a stopgap until 819 (auto-generated source-map-gen) lands and gets
wired into the agent spawn path, but the content is closer to what 819
will produce.
2026-04-28 15:50:29 +00:00
dave bf17fc14af huskies: merge 795 2026-04-28 15:45:10 +00:00
dave 5d6757dd65 chore: restore source map in STACK.md (stopgap for 818 regression)
818 stripped the source map because it had stale paths. Empirically that
made coder agents far slower — they spent most of each session re-discovering
the codebase via Read/Grep before reaching any Edit, and ran out of turn
budget without committing.

Restoring a fresh source map keyed off current master. Uses directories
where possible so it stays useful through future decomposes, plus a
"Canonical examples" section pointing at the patterns to copy when adding
new CRDT collections, RPC handlers, services, chat commands, etc.

This is a stopgap until 819 (auto-generated source-map-gen) lands.
2026-04-28 15:43:44 +00:00
dave f63464852b huskies: merge 770 2026-04-28 15:38:34 +00:00
dave 1946709681 huskies: merge 788 2026-04-28 15:28:31 +00:00
dave f62012ee9c huskies: merge 793 2026-04-28 15:21:51 +00:00
dave c1a50eab8e huskies: merge 790 2026-04-28 15:16:01 +00:00
dave 7cd9706c0f huskies: merge 813 2026-04-28 14:22:19 +00:00
dave 3772c0d03c huskies: merge 784 2026-04-28 14:07:42 +00:00
dave cf470f5048 huskies: merge 776 2026-04-28 14:01:18 +00:00
dave 8f23d13ac8 huskies: merge 779 2026-04-28 13:48:40 +00:00
dave aed29b952c huskies: merge 769 2026-04-28 13:42:47 +00:00
dave 36ca8d5e3b huskies: merge 827 2026-04-28 13:01:48 +00:00
dave b7db6d6aae huskies: merge 775 2026-04-28 12:25:59 +00:00
dave e9ed58502a huskies: merge 771 2026-04-28 12:08:44 +00:00
dave e879d6f602 huskies: merge 818 2026-04-28 12:03:01 +00:00
dave 6c2bdde695 huskies: merge 783 2026-04-28 11:17:40 +00:00
dave d70719e23c huskies: merge 781 2026-04-28 11:12:24 +00:00
dave 05d057a40a huskies: merge 782 2026-04-28 11:02:02 +00:00
dave 01169332b3 huskies: merge 774 2026-04-28 10:51:59 +00:00
dave 7faacb6664 huskies: merge 773 2026-04-28 10:24:04 +00:00
dave 83f7e41932 huskies: merge 780 2026-04-28 10:19:38 +00:00
dave 0c2789b2c1 huskies: merge 768 2026-04-28 10:12:27 +00:00
dave fb5a21cfbb huskies: merge 778 2026-04-28 10:01:10 +00:00
dave d2d5ef8afa huskies: merge 764 2026-04-28 09:54:47 +00:00
dave 3d986a733b huskies: merge 763 2026-04-28 09:42:59 +00:00
dave 8a51dbd2ed huskies: merge 765 2026-04-28 09:33:23 +00:00
dave 38e828979c huskies: merge 766 2026-04-28 08:59:13 +00:00
dave 0d14fffe1c huskies: merge 762 2026-04-28 01:31:16 +00:00
dave de5b585157 huskies: merge 761 2026-04-28 01:11:07 +00:00
dave 70aaffc2ab huskies: merge 777 2026-04-28 00:33:14 +00:00
dave d1a2393b32 huskies: merge 760 2026-04-28 00:22:29 +00:00
dave 63ce7b9ec3 huskies: merge 759 2026-04-28 00:07:04 +00:00
dave 9b24c2e281 huskies: merge 743 2026-04-27 23:48:53 +00:00
dave bf1393fa60 huskies: merge 741 2026-04-27 23:44:32 +00:00
dave 7ee542dd1e huskies: merge 757 2026-04-27 23:36:56 +00:00
dave dffa05d703 huskies: merge 689 2026-04-27 23:30:55 +00:00
dave 571a057f52 huskies: merge 688_refactor_decompose_server_src_crdt_snapshot_rs_1182_lines 2026-04-27 22:42:48 +00:00
dave 225c4f2b46 huskies: merge 758 2026-04-27 22:21:00 +00:00
dave 03738f35f5 huskies: merge 687_refactor_decompose_server_src_crdt_sync_server_rs_1186_lines 2026-04-27 22:16:08 +00:00
daveandClaude Opus 4.7 574df48ff3 huskies: merge 686_refactor_decompose_server_src_io_watcher_rs_1202_lines
Manual merge resolution: feature branch deleted watcher.rs and split
into watcher/{mod,events,sweep,tests}.rs, while master modified the
old watcher.rs (738's FS-shadow stripping). The auto-resolver kept
both, producing an ambiguous-module compile error.

Resolution: drop watcher.rs (feature's delete wins). The new
watcher/mod.rs absorbs the FS-shadow code semantically — gates pass
(cargo check, clippy --all-targets -D warnings, fmt --check, 29/29
io::watcher tests).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 21:55:04 +00:00
dave be7b7025d5 huskies: merge 742_refactor_read_rpc_frame_multiplexer_on_crdt_sync_websocket 2026-04-27 21:27:10 +00:00
daveandClaude Opus 4.7 c1bb5888a8 config: bump mergemaster max_turns 60->100, budget $15->$25
Mergemaster needs more headroom for heavy merges (e.g. the slug-to-numeric
ID migration touching many files, or the FS-shadow deletion stories that
require fixing test setup across the codebase). 60 turns wasn't enough
for the larger ones.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 21:20:22 +00:00
daveandClaude Opus 4.7 191883fe2a config: brutalist refactor guidance + bump mergemaster inactivity_timeout
- Append to all coder/opus system_prompts: for delete/signature-change
  refactors, delete first and let compiler errors guide the call-site
  walk; do not pre-read files predicting breakage. Reduces exploration
  overhead on mechanical refactors.

- Bump mergemaster inactivity_timeout_secs 300 -> 900 (15 min) so
  mergemaster survives the 5-minute API rate-limit backoff. Without
  this, mergemaster gets killed for inactivity while waiting on rate
  limit clear, blocking all merges.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 21:19:09 +00:00
dave 88f9e5dd54 huskies: merge 731_refactor_migrate_existing_stories_from_slug_based_ids_to_numeric_only 2026-04-27 20:42:21 +00:00
dave 1388658ae8 huskies: merge 730_story_use_numeric_only_story_ids_across_mcp_worktrees_git_branches_and_log_paths 2026-04-27 20:22:47 +00:00
dave 63d5a500de huskies: merge 670_refactor_hoist_chat_history_persistence_into_a_shared_module_replaces_658 2026-04-27 20:09:44 +00:00
dave 615e1c7f73 huskies: merge 738_refactor_delete_fs_shadow_code_from_lifecycle_rs_and_the_work_directory_watcher 2026-04-27 19:56:53 +00:00
dave 63a30a9319 huskies: merge 736_story_drain_and_prepend_buffered_status_events_on_the_user_s_next_agent_message 2026-04-27 19:37:39 +00:00
dave aa7b26a24a huskies: merge 728_story_cryptographic_peer_handshake_with_trusted_keys_gating 2026-04-27 19:22:55 +00:00
dave ded8c6fd66 huskies: merge 685_refactor_decompose_server_src_config_rs_1223_lines 2026-04-27 19:16:25 +00:00
dave 26f9f3f7fc huskies: merge 729_story_store_story_name_as_a_crdt_field_separate_from_the_story_id 2026-04-27 19:09:56 +00:00
dave 4aadf4aa47 huskies: merge 684_refactor_decompose_server_src_http_agents_rs_1249_lines 2026-04-27 18:49:53 +00:00
dave 4b64bc614f huskies: merge 726_story_notify_chat_transports_when_oauth_account_swaps_or_all_accounts_are_exhausted 2026-04-27 18:44:47 +00:00
dave 80661fa622 huskies: merge 727_story_ed25519_node_identity_keypair_generation_persistence_and_identity_endpoint 2026-04-27 18:37:58 +00:00
dave b008235d0d huskies: merge 683_refactor_decompose_server_src_agents_pool_start_mod_rs_1329_lines 2026-04-27 18:26:31 +00:00
dave 646dc490b8 huskies: merge 720_refactor_add_mesh_status_mcp_tool_read_only_peer_mesh_diagnostics 2026-04-27 18:18:51 +00:00
dave c6bc6f07f7 huskies: merge 725_story_auto_swap_oauth_account_on_rate_limit 2026-04-27 18:12:57 +00:00
dave 272a592a4d huskies: merge 735_story_attach_statuseventbuffer_to_each_agent_session_scoped_per_project_reset_on_restart 2026-04-27 18:06:11 +00:00
dave d654f55981 huskies: merge 682_refactor_decompose_server_src_agents_merge_squash_rs_1346_lines 2026-04-27 17:58:04 +00:00
dave 101f616346 huskies: merge 719_refactor_stale_merge_job_lock_recovery_on_new_merge_attempts 2026-04-27 17:46:49 +00:00
dave 1ecb4dad55 huskies: merge 724_story_per_account_oauth_credential_storage_with_login_pool 2026-04-27 17:40:53 +00:00
dave ed8646f0d9 huskies: merge 681_refactor_decompose_server_src_agents_pool_pipeline_advance_mod_rs_1509_lines 2026-04-27 17:35:17 +00:00
dave 875096b3ec huskies: merge 718_refactor_stale_agent_claims_time_out_claim_ttl_with_displacement 2026-04-27 17:26:51 +00:00
dave 77081926d1 huskies: merge 715_refactor_decompose_frontend_src_components_workitemdetailpanel_tsx_827_lines 2026-04-27 17:08:26 +00:00
dave fce7e16811 huskies: merge 716_story_statuseventbuffer_bounded_per_instance_buffer_over_services_status_broadcaster 2026-04-27 17:03:12 +00:00
dave 2b28ccbf2c Merge spike branch 'feature/story-679_spike_migrate_inter_component_http_to_signed_crdt_websocket_bus' into master 2026-04-27 17:01:48 +00:00
dave 4a0f57478c huskies: merge 671_refactor_migrate_pipeline_state_consumers_from_string_comparisons_to_typed_pipelinestage_enum 2026-04-27 16:39:39 +00:00
dave 39a9766d7d huskies: merge 677_refactor_reject_promotion_to_current_coder_of_work_items_with_junk_only_acceptance_criteria 2026-04-27 16:30:35 +00:00
daveandClaude Opus 4.7 5884dac825 chore: gitignore .huskies/session_store.json (runtime artifact)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 14:59:33 +00:00
daveandClaude Opus 4.7 0b7f7dfdf7 config: bump sonnet coder-1/2/3 max_turns 50→80
Stories like the broadcaster-consumer migrations legitimately need ~60
substantive turns (16 ProjectConfig initializer sites + main.rs subscriber
+ reading existing patterns to mirror). 50 was too tight.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 14:56:24 +00:00