Private
Public Access
0
0
Commit Graph

3243 Commits

Author SHA1 Message Date
ed 4592618372 fix(orchestration_logic): migrate test_run_worker_lifecycle_blocked mock (Phase 2 follow-up)
Phase 2.13 missed the test_run_worker_lifecycle_blocked test in
test_orchestration_logic.py - it also mocked src.ai_client.send.
The test was failing with "Worker send_result failed for T1: ...
[Errno 2] No such file or directory: .beads_mock/beads.json" because
the unmocked send_result fell through to the real provider which
tried to read beads.json.

Changes:
- Replace patch(src.ai_client.send) with patch(src.ai_client.send_result)
- Wrap mock return_value with Result(data="BLOCKED because of missing info")

All 8 tests in test_orchestration_logic.py now pass.
2026-06-15 17:45:18 -04:00
ed 36962ef6b6 test(tier4_interceptor): migrate to send_result() (Phase 2.11)
The test_ai_client_passes_qa_callback test calls ai_client.send() with
qa_callback=lambda. The qa_callback is passed through to the provider
function (_send_gemini).

Per plan note: the test has complex callback setup; the Result handling
needs the mock to return Result(data="ok") so the qa_callback passes
through and the test succeeds.

Changes:
- Rename ai_client.send(...) to ai_client.send_result(...)
- Add assert result.ok
- Mock _send_gemini to return Result(data="ok") instead of relying on
  the default (which would call the real provider)
- Add "from src.result_types import Result" import

7 tests pass (the migrated test_ai_client_passes_qa_callback was
previously broken because the send() call hit the real provider and
either failed or returned empty; the mock now provides a clean response).
2026-06-15 17:27:31 -04:00
ed cfeb3cb3e0 test(gemini_cli_integration): migrate 2 sites to send_result() (Phase 2.10)
Changes:
- Rename ai_client.send(...) to ai_client.send_result(...) (2 sites)
- Add assert result.ok (1 site; the second test only checks result is not None)
- Add "from src.result_types import Result" import

2 tests pass.
2026-06-15 17:07:20 -04:00
ed 363fe91db0 test(deepseek): migrate 6 sites to send_result() (Phase 2.9)
All 6 sites in test_deepseek_provider.py call ai_client.send(...). Each
assertion pattern is slightly different (==, "in", call_args inspection);
migration follows the same pattern: rename to send_result(), add
assert result.ok, and use result.data for the response text.

Changes:
- Rename ai_client.send(...) to ai_client.send_result(...) (6 sites)
- Add assert result.ok (6 sites)
- Replace result == "x" with result.data == "x" (or "x" in result.data)
- Add "from src.result_types import Result" import

7 tests pass (1 unrelated test_deepseek_model_selection + 6 migrated).
2026-06-15 16:59:46 -04:00
ed d9a79efa25 test(api_events): migrate 2 sites to send_result() (Phase 2.8)
The test_send_emits_events_proper and test_send_emits_tool_events tests
both call ai_client.send(). Migrating to send_result() + assert result.ok.

Changes:
- Rename ai_client.send(...) to ai_client.send_result(...) (2 sites)
- Add assert result.ok (2 sites)
- Add "from src.result_types import Result" import

4 tests pass.
2026-06-15 16:57:53 -04:00
ed 0192978646 test(ai_client_result): migrate to send_result(); drop test_send_deprecated (Phase 2.7)
Per plan Task 2.7:
- DELETE test_send_deprecated_emits_warning (obsolete after Phase 6; send()
  is being removed)
- RENAME test_send_extracts_data_from_result -> test_send_result_does_not_emit_deprecation
  (this is the regression test the plan said to KEEP; it now asserts the new
  API does not emit a deprecation warning, instead of testing the old behavior)
- MIGRATE test_send_extracts_data_from_result (renamed to the above)
- MIGRATE test_send_returns_empty_string_on_error_result ->
  test_send_result_returns_empty_data_with_error_on_auth_failure (asserts
  the Result has data="" and not ok)

5 tests pass (down from 6; the deleted test removed 1; the renamed
test_send_extracts_data_from_result became test_send_result_does_not_emit_deprecation).
2026-06-15 16:55:30 -04:00
ed 1e2c34313c test(token_usage): migrate to send_result() (Phase 2.6)
The test_token_usage_tracking test calls ai_client.send() and verifies
the comms log entry. Migrating to send_result() + assert result.ok.

Changes:
- Rename ai_client.send(...) to ai_client.send_result(...)
- Add assert result.ok
- Add "from src.result_types import Result" import

1 test passes.
2026-06-15 16:51:24 -04:00
ed c59bac59f2 test(gui2_mcp): migrate to send_result() (Phase 2.5)
The test_mcp_tool_call_is_dispatched test calls ai_client.send() and
asserts the MCP dispatch function was called. Migrating to send_result()
+ assert result.ok.

Changes:
- Rename ai_client.send(...) to ai_client.send_result(...)
- Add assert result.ok
- Add "from src.result_types import Result" import

1 test passes.
2026-06-15 16:49:11 -04:00
ed fe52024311 test(gemini_cli_parity_regression): migrate to send_result() (Phase 2.4)
The test_send_invokes_adapter_send test calls ai_client.send() and
asserts the return value. Migrating to send_result() with
assert res.ok and res.data == "Hello from mock adapter".

Changes:
- Rename ai_client.send(...) to ai_client.send_result(...)
- Add assert res.ok before accessing res.data
- Add "from src.result_types import Result" import

1 test passes.
2026-06-15 16:39:31 -04:00
ed b4c9ebd963 test(gemini_cli_edge_cases): migrate to send_result() (Phase 2.3)
The test_gemini_cli_loop_termination test calls ai_client.send() and
asserts the return value. Migrating to send_result() with
assert result.ok and result.data == "Final answer".

Changes:
- Rename ai_client.send(...) to ai_client.send_result(...)
- Add assert result.ok before accessing result.data
- Add "from src.result_types import Result" import

3 tests pass.
2026-06-15 16:31:26 -04:00
ed fab9196bea test(ai_cache_tracking): migrate to send_result() (Phase 2.2)
The test calls ai_client.send() but does not check the return value -
it only verifies the side effect on gemini cache stats. Migrating to
send_result() and asserting result.ok is enough.

Changes:
- Rename ai_client.send(...) to ai_client.send_result(...)
- Add assert result.ok (the return value is unused)
- Add "from src.result_types import Result" import

2 tests pass.
2026-06-15 16:28:20 -04:00
ed ba0df1fa95 test(ai_client_cli): migrate to send_result() (Phase 2.1)
Replaces the deprecated ai_client.send() call with ai_client.send_result()
in the test. The mock for GeminiCliAdapter is unchanged (it is patched
to return a dict that send_result unwraps internally).

Changes:
- Rename response = ai_client.send(...) to result = ai_client.send_result(...)
- Add assert result.ok before accessing result.data
- Add "from src.result_types import Result" import

1 test passes.
2026-06-15 16:26:06 -04:00
ed 16c6705b80 test(spawn_interception_v2): mock send_result not send (Phase 2.18, pre-empts Phase 1.3 regression)
Phase 1.3 migrated run_worker_lifecycle to send_result(). The mock_ai_client
fixture in test_spawn_interception_v2.py mocked src.ai_client.send and
returned a string. The test_run_worker_lifecycle_approved test asserts
on the call_args (user_message + md_content), which still works with
the new mock name.

Changes:
- Replace patch(src.ai_client.send) with patch(src.ai_client.send_result)
- Rename mock_send to mock_send_result
- Wrap mock return_value with Result(data="Task completed")
- Add "from src.result_types import Result" import

All 3 tests in test_spawn_interception_v2.py pass.
2026-06-15 16:24:05 -04:00
ed 7a6ffd8954 test(run_worker_lifecycle_abort): mock send_result not send (Phase 2.17, pre-empts Phase 1.3 regression)
Phase 1.3 migrated run_worker_lifecycle to send_result(). This test
mocks src.ai_client.send and asserts it is NOT called (abort fires
before the AI dispatch). Migrating the mock to send_result is purely
for consistency and future-proofing; the test still passes either way.

Changes:
- Rename patch(src.ai_client.send) to patch(src.ai_client.send_result)
- Rename mock_send to mock_send_result
- Comment updated to reference send_result
2026-06-15 16:21:08 -04:00
ed bb2add1249 test(phase6_engine): mock send_result not send (Phase 2.16, pre-empts Phase 1.3 regression)
Phase 1.3 migrated src/multi_agent_conductor.py:591 (run_worker_lifecycle)
to send_result(). The test_worker_streaming_intermediate test mocked
src.ai_client.send, which would break once Phase 1.3 was applied.
(Confirmed: test failed after Phase 1.3 commit.)

Changes:
- Replace patch(src.ai_client.send) with patch(src.ai_client.send_result)
- Rename mock_send to mock_send_result
- Wrap mock side_effect return with Result(data="DONE")
- Add "from src.result_types import Result" import

All 3 tests in test_phase6_engine.py pass.
2026-06-15 16:16:53 -04:00
ed 499762d8f0 test(orchestrator_pm_history): mock send_result not send (Phase 2.15, pre-empts Phase 1.2 regression)
Phase 1.2 migrated src/orchestrator_pm.py:86 to send_result(). The
test_generate_tracks_with_history test mocked src.ai_client.send,
which would break once Phase 1.2 was applied. (Confirmed: test failed
after Phase 1.2 commit.)

Changes:
- Replace @patch(src.ai_client.send) with @patch(src.ai_client.send_result)
- Rename mock_send to mock_send_result
- Wrap mock return_value with Result(data="[]")
- Add "from src.result_types import Result" import

All 3 tests in test_orchestrator_pm_history.py pass.
2026-06-15 16:15:06 -04:00
ed e4a2a20469 test(orchestrator_pm): mock send_result not send (Phase 2.14, pre-empts Phase 1.2 regression)
Phase 1.2 migrated src/orchestrator_pm.py:86 to send_result(). The 3
tests in TestOrchestratorPM mocked src.ai_client.send, which would
break once Phase 1.2 was applied. (Confirmed: tests failed after
Phase 1.2 commit.)

Changes:
- Replace @patch(src.ai_client.send) with @patch(src.ai_client.send_result)
- Rename mock_send to mock_send_result throughout
- Wrap mock return_value with Result(data=json.dumps(...))
- Add "from src.result_types import Result" import

All 3 tests pass.
2026-06-15 16:10:47 -04:00
ed 953689c8b3 test(orchestration_logic): mock send_result not send (Phase 2.13, fixes Phase 1.1 regression)
Phase 1.1 + 1.2 migrated the production code to send_result(). The
test_generate_tracks and test_generate_tickets tests mocked
src.ai_client.send, causing "send was called 0 times" failures.

Changes:
- Replace patch(src.ai_client.send) with patch(src.ai_client.send_result)
- Wrap mock return_value with Result(data=mock_response)
- Add "from src.result_types import Result" import

All 8 tests in tests/test_orchestration_logic.py pass (2 migrated + 6
unaffected tests).
2026-06-15 16:08:04 -04:00
ed 488254527c test(conductor_tech_lead): mock send_result not send (Phase 2.12, fixes Phase 1.1 regression)
Phase 1.1 migrated src/conductor_tech_lead.py:68 from ai_client.send() to
ai_client.send_result(). The 3 tests in TestConductorTechLead mocked
src.ai_client.send which is no longer called by the production code,
causing "send was called 0 times" failures.

Changes:
- Replace patch("src.ai_client.send") with patch("src.ai_client.send_result")
- Wrap mock return_value with Result(data=...) and mock side_effect with
  Result(data=...) values
- Add "from src.result_types import Result" import

All 9 tests in tests/test_conductor_tech_lead.py pass (3 migrated + 6
unaffected topological sort tests).
2026-06-15 16:06:17 -04:00
ed b7fd4e4f6a conductor(checkpoint): Phase 1 complete - 3 production call sites migrated to send_result()
- src/conductor_tech_lead.py:68 (G1, commit bbb3d597): 2-arg call, no callbacks
- src/orchestrator_pm.py:86 (G2, commit 7ea802ab): 3-arg call with enable_tools
- src/multi_agent_conductor.py:591 (G3, commit bdd46299): 8-arg call with 5 callbacks
  (the hardest; per-ticket error handling routes the error to comms +
  pushes a 'response' event with status='error' + marks ticket.status='error')

Verified: uv run rg 'ai_client\.send\(' src/ returns 0 hits in production code
(line 8 of conductor_tech_lead.py is a docstring mention only).

Pending: 7 test files broken by these production migrations need
send_result() mocks instead of send() mocks. These are scheduled in
Phase 2.12-2.18 (added in the plan update bb3b3056).
2026-06-15 16:01:23 -04:00
ed bdd46299b1 refactor(multi_agent_conductor): migrate worker dispatch to send_result() (G3, public_api_migration_and_ui_polish_20260615 Phase 1.3)
Replaces deprecated ai_client.send(...) with ai_client.send_result(...) for
the 8-arg worker dispatch in run_worker_lifecycle. The new code branches on
result.ok:
  - On success: response = result.data (continue as before)
  - On error: log via comms + push a 'response' event with status='error' +
    push ticket_completed + mark ticket.status='error' + return None

This is the hardest of the 3 production migrations (5 callbacks:
pre_tool_callback, qa_callback, patch_callback, stream_callback + the
worker_comms_callback already wired up).

The 2 tests in test_phase6_engine.py + test_spawn_interception_v2.py now
fail because they mock src.ai_client.send. These will be fixed in
Phase 2.16/2.18 by mocking send_result instead. test_run_worker_lifecycle_abort
still passes because the abort check fires before the send call.
2026-06-15 16:00:05 -04:00
ed 7ea802ab80 refactor(orchestrator_pm): migrate to send_result() (G2, public_api_migration_and_ui_polish_20260615 Phase 1.2)
Replaces deprecated ai_client.send(md_content='', user_message=user_message,
enable_tools=False) with ai_client.send_result(...) and branches on
result.ok. On error, logs the ui_message() and returns [] (the function
returns a list of track definitions or [] on failure).

The 3 tests in test_orchestrator_pm.py + 1 in test_orchestrator_pm_history.py
now fail because they mock src.ai_client.send. These will be fixed in
Phase 2.14-2.15 by mocking send_result instead.
2026-06-15 15:57:00 -04:00
ed bbb3d59712 refactor(conductor_tech_lead): migrate to send_result() (G1, public_api_migration_and_ui_polish_20260615 Phase 1.1)
Replaces deprecated ai_client.send(md_content='', user_message=user_message)
with ai_client.send_result(...) and branches on result.ok. On error, logs
the ui_message() and returns None (the function returns a list of ticket
definitions or None on failure).

The previous code called the @deprecated send() shim which silently
returns '' on error. The empty string would then be passed to json.loads,
causing JSONDecodeError and 3 retry attempts. The new code short-circuits
on the first error and returns None immediately.

This is the easiest of the 3 production migrations (2-arg call with no
callbacks). See plan.md Phase 1.1. Test fixes for the production-affected
mocks in test_conductor_tech_lead.py and test_orchestration_logic.py are
in Phase 2.12 and Phase 2.13.

NOTE: 4 tests now fail (3 in test_conductor_tech_lead.py + 1 in
test_orchestration_logic.py) because they mock src.ai_client.send.
These will be fixed in Phase 2.12/2.13 by mocking send_result instead.
2026-06-15 15:53:08 -04:00
ed bb3b3056b4 conductor(plan): add 7 production-affected test mock files to Phase 2
The original Phase 2 covered 12 test files that *call* ai_client.send(...).
Phase 1.1 implementation revealed 7 additional test files that *mock*
ai_client.send (via patch()) for tests of the production code paths.
When production migrates to send_result(), these mocks receive 0 calls
and the tests fail with 'send was called 0 times'.

Adding Phase 2.12-2.18 to cover:
- test_conductor_tech_lead.py (3 mocks; breaks after Phase 1.1)
- test_orchestration_logic.py (1 mock; breaks after Phase 1.1)
- test_orchestrator_pm.py (3 mocks; pre-empt Phase 1.2)
- test_orchestrator_pm_history.py (1 mock; pre-empt Phase 1.2)
- test_phase6_engine.py (1 mock; pre-empt Phase 1.3)
- test_run_worker_lifecycle_abort.py (1 mock; pre-empt Phase 1.3)
- test_spawn_interception_v2.py (1 mock; pre-empt Phase 1.3)

test_rag_integration.py mock migration deferred to RAG track (OOS1).

Also adds state.toml for the track (7 phases, 28 tasks, audit fields).
2026-06-15 15:50:56 -04:00
ed 0c9086afda conductor: register public_api_migration_and_ui_polish_20260615 in tracks.md + update UI Polish row 2026-06-15 15:27:04 -04:00
ed 55ff733df5 conductor(track): metadata.json for public_api_migration_and_ui_polish_20260615 2026-06-15 15:24:46 -04:00
ed 8ab71035d5 conductor(track): plan for public_api_migration_and_ui_polish_20260615 (7 phases, 28 tasks) 2026-06-15 15:23:19 -04:00
ed 3febdab42c conductor(track): spec for public_api_migration_and_ui_polish_20260615 (3 prod + 12 test migrations + 2 UI Polish test fixes) 2026-06-15 15:20:44 -04:00
ed 431ebce2b9 completion report 2026-06-15 14:57:08 -04:00
ed a8c8125118 conductor(track): mark doeh_test_thinking_cleanup_20260615 as completed 2026-06-15 14:49:59 -04:00
ed cf5fdd3d62 docs(ai_client): add 2 follow-up notes for doeh_test_thinking_cleanup_20260615 2026-06-15 14:48:38 -04:00
ed 6edeb2b5a9 conductor(state): fix duplicate keys in ai_loop_regressions_20260614 state.toml 2026-06-15 14:29:07 -04:00
ed e4a8a0bca1 test(thinking_trace): add test for <think> half-width marker (doeh cleanup Phase 4.2) 2026-06-15 14:26:32 -04:00
ed 4e97156e77 fix(thinking_parser): add <think> (half-width) marker support (doeh cleanup Phase 4.1) 2026-06-15 14:25:54 -04:00
ed cb985f08ed test(gemini): add regression tests for thinking-format extraction (doeh cleanup Phase 3.1) 2026-06-15 14:15:52 -04:00
ed e9abadc867 fix(ai_client): extract Gemini thought=True parts and wrap in <thinking> tags for parse_thinking_trace 2026-06-15 14:10:43 -04:00
ed 81882c398e test(headless_service): adapt test_generate_endpoint to send_result (doeh cleanup Phase 2.5) 2026-06-15 13:57:47 -04:00
ed 9e89d52607 test(ai_client_tool_loop): adapt mock to return Result[NormalizedResponse] (doeh cleanup Phase 2.4) 2026-06-15 13:54:57 -04:00
ed dbdf9ba9e1 test(llama_native): adapt 4 tests to Result API (doeh cleanup Phase 2.3) 2026-06-15 13:52:38 -04:00
ed 439a0ac074 test(llama): adapt 3 tests to Result API (doeh cleanup Phase 2.2) 2026-06-15 13:25:31 -04:00
ed d7e42a4a3d test(grok): adapt 2 tests to Result API (doeh cleanup Phase 2.1) 2026-06-15 13:04:45 -04:00
ed 27d7a04fd3 conductor(plan): Mark Phase 1 (G1 critical regression fix) complete 2026-06-15 12:58:34 -04:00
ed 7b323e3e5f fix(app_controller): restore context_to_send definition in _api_generate (CRITICAL regression from ai_loop_regressions_20260614) 2026-06-15 12:54:11 -04:00
ed 6f4bd75ef9 conductor: register doeh_test_thinking_cleanup_20260615 in tracks.md + mark ai_loop_regressions_20260614 shipped 2026-06-15 12:22:56 -04:00
ed 88bf04eb3d conductor(track): metadata.json for doeh_test_thinking_cleanup_20260615 2026-06-15 12:21:16 -04:00
ed 304f469663 conductor(track): plan for doeh_test_thinking_cleanup_20260615 (TDD-style, 5 phases, 16 tasks) 2026-06-15 12:20:06 -04:00
ed 925e366cdd conductor(track): spec for doeh_test_thinking_cleanup_20260615 (1 critical regression + 11 test mocks + 2 deferred bugs) 2026-06-15 12:17:51 -04:00
ed 515ef933a1 docs(report): add track completion report for ai_loop_regressions_20260614
In-depth handoff for Tier 1 review covering:
- Executive summary with TL;DR
- Goal & scope (planned vs delivered)
- Per-phase delivery summary
- Test coverage analysis (7 new + 2 adapted + 2 smoke)
- Deferred items documentation (3 cross-references)
- Pre-existing failures (14, verified not caused by this track)
- Plan deviations (6 items, with rationale)
- Post-ship risk register
- Commit inventory with diff stat
- 7 recommendations for the Tier 1 reviewer
- Handoff checklist

Working tree was clean before adding the report (no other changes to commit).
2026-06-15 11:32:33 -04:00
ed e6afefdc66 conductor(plan): mark track complete (all 5 phases, 17 tasks done) 2026-06-15 11:25:32 -04:00
ed 010752229b conductor(track): mark ai_loop_regressions_20260614 as completed
Updates status: active -> completed, adds completed_at date,
updates verification_criteria with the actual verification results.

7 regression tests pass; 14 pre-existing failures (parent track's
state.toml [regressions_20260612]) are not caused by these changes.
2026-06-15 11:24:43 -04:00