conductor(track): refresh spec/plan/state for 2026-06-11 code state
This commit is contained in:
@@ -1179,12 +1179,12 @@ Run:
|
||||
rg -n "def _classify_.*_error|def classify_dashscope" src/ai_client.py src/qwen_adapter.py src/openai_compatible.py
|
||||
```
|
||||
|
||||
Expected (post-qwen-track baseline):
|
||||
- `src/ai_client.py`: 5 functions (`_classify_gemini_error`, `_classify_anthropic_error`, `_classify_deepseek_error`, `_classify_minimax_error`, `_classify_gemini_cli_error`)
|
||||
- `src/qwen_adapter.py`: 1 function (`classify_dashscope_error`, no underscore prefix)
|
||||
- `src/openai_compatible.py`: 1 function (`_classify_openai_compatible_error`, shared by qwen/llama/grok via `send_openai_compatible`)
|
||||
Expected (post-qwen-track baseline, verified 2026-06-11):
|
||||
- `src/ai_client.py`: **4 functions** (`_classify_gemini_error:380`, `_classify_anthropic_error:361`, `_classify_deepseek_error:396`, `_classify_minimax_error:420`). **`_classify_gemini_cli_error` does not exist** — Gemini CLI uses the `GeminiCliAdapter` subprocess path in `src/gemini_cli_adapter.py` with its own internal error handling. There is no SDK exception to classify for the gemini_cli vendor; the adapter's subprocess layer raises its own errors which propagate as the Result's `ErrorInfo` (via the `_send_gemini_cli_result` wrapper). This means the classifier count is **4 + 1 + 1 = 6**, not 5 + 1 + 1 = 7.
|
||||
- `src/qwen_adapter.py`: 1 function (`classify_dashscope_error:26`, no underscore prefix)
|
||||
- `src/openai_compatible.py`: 1 function (`_classify_openai_compatible_error:39`, shared by qwen/llama/grok via `send_openai_compatible`)
|
||||
|
||||
**Note on the 8 vendors / 6 classifiers split:** Qwen, Llama, and Grok all route through the shared `send_openai_compatible()` helper (qwen via DashScope-specific adapter, llama and grok via OpenAI-compatible). They share `_classify_openai_compatible_error`. There are 8 `_send_*_result()` functions (one per vendor) but only 6 classifier functions. The 8 → 6 mismatch is intentional, not an oversight.
|
||||
**Note on the 9 send functions / 6 classifiers split:** Qwen, Llama, and Grok all route through the shared `send_openai_compatible()` helper (qwen via DashScope-specific adapter, llama and grok via OpenAI-compatible). They share `_classify_openai_compatible_error`. There are 9 `_send_*_result()` functions (8 vendors + 1 Ollama-native adapter; see Task 3.4) but only 6 classifier functions. The 9 → 6 mismatch is intentional, not an oversight: gemini_cli has no classifier (subprocess path), and `_send_llama_native` shares `_send_llama`'s classifier via the dispatch in `_send_llama`.
|
||||
|
||||
- [ ] **Step 2: Refactor each classifier to return ErrorInfo (not raise ProviderError)**
|
||||
|
||||
@@ -1219,7 +1219,7 @@ Expected: 1 test PASS.
|
||||
|
||||
```bash
|
||||
git add src/ai_client.py
|
||||
git commit -m "refactor(ai_client): _classify_<vendor>_error() returns ErrorInfo (5 in ai_client + 1 shared + 1 qwen)"
|
||||
git commit -m "refactor(ai_client): _classify_<vendor>_error() returns ErrorInfo (4 in ai_client + 1 shared + 1 qwen)"
|
||||
```
|
||||
|
||||
---
|
||||
@@ -1227,7 +1227,7 @@ git commit -m "refactor(ai_client): _classify_<vendor>_error() returns ErrorInfo
|
||||
## Task 3.4: Rename _send_<vendor>() to _send_<vendor>_result() and return Result[str]
|
||||
|
||||
**Files:**
|
||||
- Modify: `src/ai_client.py` (8 send functions + their call sites)
|
||||
- Modify: `src/ai_client.py` (**9 send functions** — 8 vendors + 1 Ollama-native adapter — plus their call sites)
|
||||
|
||||
- [ ] **Step 1: Find all the _send_<vendor>() functions**
|
||||
|
||||
@@ -1255,11 +1255,11 @@ def _send_gemini_result(md_content, user_message, ...) -> Result[str]:
|
||||
return Result(data="", errors=[_classify_gemini_error(exc, source="ai_client.gemini")])
|
||||
```
|
||||
|
||||
(Apply to all 8 functions.)
|
||||
(Apply to all **9** functions — 8 vendors + `_send_llama_native` Ollama adapter. The adapter's body is small and the rename is mechanical.)
|
||||
|
||||
- [ ] **Step 3: Update internal callers in src/ai_client.py**
|
||||
|
||||
Run: `grep -n "_send_gemini\|_send_anthropic\|_send_deepseek\|_send_minimax\|_send_gemini_cli\|_send_qwen\|_send_llama\|_send_grok" src/ai_client.py | grep -v "^def _send_" | grep -v "_classify_" | head -20`
|
||||
Run: `grep -n "_send_gemini\|_send_anthropic\|_send_deepseek\|_send_minimax\|_send_gemini_cli\|_send_qwen\|_send_llama\|_send_grok\|_send_llama_native" src/ai_client.py | grep -v "^def _send_" | grep -v "_classify_" | head -20`
|
||||
|
||||
Update each call site from `result = _send_<vendor>(...)` to `result = _send_<vendor>_result(...); text = result.data`.
|
||||
|
||||
@@ -1272,7 +1272,7 @@ uv run pytest tests/test_ai_client.py tests/test_minimax_provider.py tests/test_
|
||||
|
||||
Expected: tests that directly call `_send_<vendor>()` FAIL (they now need the new name). Tests that go through `send()` still PASS (until Task 3.6 wires up `send_result`).
|
||||
|
||||
**Task 3.4 is split into 8 per-vendor sub-tasks (3.4.1 - 3.4.8) for atomic per-vendor commits. Each sub-task follows the same pattern but operates on one vendor. The implementer does NOT execute Task 3.4 monolithically.**
|
||||
**Task 3.4 is split into 9 per-vendor sub-tasks (3.4.1 - 3.4.9) for atomic per-vendor commits. Each sub-task follows the same pattern but operates on one vendor. The implementer does NOT execute Task 3.4 monolithically. Sub-task 3.4.9 handles `_send_llama_native` (the Ollama adapter added by the `qwen_llama_grok_followup_20260611` track).**
|
||||
|
||||
---
|
||||
|
||||
@@ -1298,7 +1298,7 @@ Expected: tests that directly call `_send_<vendor>()` FAIL (they now need the ne
|
||||
|
||||
### Task 3.4.5: Rename _send_gemini_cli to _send_gemini_cli_result
|
||||
|
||||
(Same pattern; uses `_classify_gemini_cli_error` with `source="ai_client.gemini_cli"`.)
|
||||
(Same pattern; **no `_classify_gemini_cli_error` exists** — wrap the `GeminiCliAdapter.send()` call in `try/except` and convert any `subprocess.CalledProcessError` / `OSError` / `json.JSONDecodeError` from the adapter into a single `ErrorInfo(kind=ErrorKind.INTERNAL, message=str(exc), source="ai_client.gemini_cli", original=exc)`. The `GeminiCliAdapter` is a subprocess adapter; the `Exception` it raises is whatever the subprocess or JSON parser emits.)
|
||||
|
||||
### Task 3.4.6: Rename _send_qwen to _send_qwen_result
|
||||
|
||||
@@ -1312,8 +1312,14 @@ Expected: tests that directly call `_send_<vendor>()` FAIL (they now need the ne
|
||||
|
||||
(Same pattern; uses `_classify_openai_compatible_error` from `src/openai_compatible.py` with `source="ai_client.grok"`.)
|
||||
|
||||
- [ ] **Post-sub-task verification** (after 3.4.8): Run the full vendor test set: `uv run pytest tests/test_ai_client.py tests/test_minimax_provider.py tests/test_qwen_provider.py tests/test_llama_provider.py tests/test_grok_provider.py tests/test_ai_client_cli.py tests/test_deepseek_provider.py tests/test_gemini_cli_adapter.py 2>&1 | tail -20`
|
||||
- [ ] **Post-sub-task commit** (if final cleanup): `git commit -m "refactor(ai_client): all 8 _send_<vendor>_result() functions return Result[str]" --allow-empty`
|
||||
### Task 3.4.9: Rename _send_llama_native to _send_llama_native_result
|
||||
|
||||
**Context:** `_send_llama_native` was added by the `qwen_llama_grok_followup_20260611` track (2026-06-11) as a thin Ollama adapter. It is dispatched from `_send_llama` when the base URL is `localhost` / `127.0.0.1`. **It is the 9th `_send_*()` function** and was missed in the original Task 3.4 enumeration.
|
||||
|
||||
(Same pattern as 3.4.1-3.4.8; rename to `_send_llama_native_result`, change return type to `Result[str]`, wrap body. The function delegates to the `ollama_chat` helper and POSTs to `/api/chat` — no `run_with_tool_loop` refactor needed; it inherits the loop from `_send_llama`. The error classification uses `_classify_openai_compatible_error` from `src/openai_compatible.py` with `source="ai_client.llama_native"` — Ollama raises OpenAI-compatible errors via its `/v1/chat/completions` compat endpoint when used in compat mode, and native errors otherwise; for now, treat all exceptions as `ErrorKind.INTERNAL`.)
|
||||
|
||||
- [ ] **Post-sub-task verification** (after 3.4.9): Run the full vendor test set: `uv run pytest tests/test_ai_client.py tests/test_minimax_provider.py tests/test_qwen_provider.py tests/test_llama_provider.py tests/test_grok_provider.py tests/test_ai_client_cli.py tests/test_deepseek_provider.py tests/test_gemini_cli_adapter.py 2>&1 | tail -20`
|
||||
- [ ] **Post-sub-task commit** (if final cleanup): `git commit -m "refactor(ai_client): all 9 _send_<vendor>_result() functions return Result[str]" --allow-empty`
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -489,7 +489,7 @@ All existing configs (`config.toml`, `credentials.toml`, per-project TOML) work
|
||||
|---|---|---|
|
||||
| `tests/test_result_types.py` | `Result`, `ErrorInfo`, nil-sentinel singletons. | 100% |
|
||||
| `tests/test_mcp_client_paths.py` | Verify `_resolve_and_check` returns `Result` (not tuple); verify `read_file` returns `Result[str]`. | 90% (covers the new code paths; existing tests still pass) |
|
||||
| `tests/test_ai_client_result.py` | Verify `_send_<vendor>_result()` returns `Result`; verify `send_result()` is the new public API; verify `send()` emits `DeprecationWarning`. **State-delegation regression tests (added 2026-06-08 per `docs/guide_state_lifecycle.md` and the 2026-06-08 docs refresh):** verify that `app.temperature = 0.5` round-trips through the `App.__getattr__`/`__setattr__` delegation (per `gui_2.py:666-675`) and is visible in the next `send_result()` call; verify that `controller.disc_entries[i].content = "..."` is reflected in the next `send_result()`'s `messages` parameter (this is the regression vector for nagent_review Pitfall #4, the provider-history divergence); verify that the 3 per-provider history locks (`_anthropic_history_lock`, `_deepseek_history_lock`, `_minimax_history_lock` per `ai_client.py:124,128,132`) serialize correctly under concurrent `send_result()` calls from different threads. These tests are *mandatory* for Phase 3 (the ai_client refactor) because the `App.__getattr__`/`__setattr__` delegation means a partial refactor would manifest as silent `AttributeError`s deep in the test, not at the refactor commit boundary. | 90% |
|
||||
| `tests/test_ai_client_result.py` | Verify `_send_<vendor>_result()` returns `Result`; verify `send_result()` is the new public API; verify `send()` emits `DeprecationWarning`. **State-delegation regression tests (added 2026-06-08 per `docs/guide_state_lifecycle.md` and the 2026-06-08 docs refresh):** verify that `app.temperature = 0.5` round-trips through the `App.__getattr__`/`__setattr__` delegation (per `gui_2.py:666-675`) and is visible in the next `send_result()` call; verify that `controller.disc_entries[i].content = "..."` is reflected in the next `send_result()`'s `messages` parameter (this is the regression vector for nagent_review Pitfall #4, the provider-history divergence); verify that the **6** per-provider history locks (`_anthropic_history_lock:128`, `_deepseek_history_lock:132`, `_minimax_history_lock:136`, `_qwen_history_lock:140`, `_grok_history_lock:145`, `_llama_history_lock:149` per `ai_client.py`) serialize correctly under concurrent `send_result()` calls from different threads. These tests are *mandatory* for Phase 3 (the ai_client refactor) because the `App.__getattr__`/`__setattr__` delegation means a partial refactor would manifest as silent `AttributeError`s deep in the test, not at the refactor commit boundary. | 90% |
|
||||
| `tests/test_rag_engine_result.py` | Verify RAG methods return `Result`; verify `NilRAGState` is used. | 80% |
|
||||
| `tests/test_deprecation_warnings.py` | Verify `ai_client.send()` emits exactly one `DeprecationWarning` per call site (cached after first). | 100% |
|
||||
| `tests/test_mcp_client.py` (existing) | Verify no regressions; existing tests pass unchanged. | 100% (regression) |
|
||||
@@ -533,7 +533,7 @@ Each phase has its own checkpoint commit and git note.
|
||||
|
||||
| Risk | Likelihood | Impact | Mitigation |
|
||||
|---|---|---|---|
|
||||
| `ProviderError` is currently raised from `_classify_*_error()`. The refactor changes these to return `ErrorInfo` instead. Any external caller that catches `ProviderError` will break. | Low | Medium | Search the codebase: `rg "except ProviderError"`. Per the grep above (line 1338 of `ai_client.py`), `ProviderError` is only caught in `ai_client.send()`. After the refactor, that catch becomes a `result.errors` check. No external code catches `ProviderError` directly. |
|
||||
| `ProviderError` is currently raised from `_classify_*_error()`. The refactor changes these to return `ErrorInfo` instead. Any external caller that catches `ProviderError` will break. | Low | Medium | Search the codebase: `rg "except ProviderError"`. Per the grep above (line 1451 of `ai_client.py`), `ProviderError` is only caught in `ai_client.send()` (defined at `ai_client.py:2690`). After the refactor, that catch becomes a `result.errors` check. No external code catches `ProviderError` directly. The 4 in-file classifier functions (`_classify_anthropic_error:361`, `_classify_gemini_error:380`, `_classify_deepseek_error:396`, `_classify_minimax_error:420`) plus 1 shared `_classify_openai_compatible_error` in `src/openai_compatible.py:39` plus `classify_dashscope_error` in `src/qwen_adapter.py:26` are the 6 conversion sites — `_classify_gemini_cli_error` does not exist (Gemini CLI uses `GeminiCliAdapter` subprocess path with internal error handling). |
|
||||
| The 30+ `assert p is not None` in `mcp_client.py` are existing invariants that catch real bugs. If the refactor turns them into nil-sentinel paths, a real bug could manifest as a silent empty result. | Medium | High | The refactored code keeps the assertions as `assert resolved.ok` or `assert not isinstance(resolved.data, NilPath)` where the invariants matter. The `Result.errors` list captures the failure for the caller. |
|
||||
| Adding `@deprecated` to `send()` produces a lot of `DeprecationWarning` log spam in the test suite. | High | Low | The deprecation message is cached per call site (using `warnings.warn(..., stacklevel=2)` with a `DeprecationWarning` filter that doesn't propagate to the test failure). Tests can opt in to the warning check via `pytest.warns(DeprecationWarning)`. |
|
||||
| `result_types.py` introduces a circular import risk (if `models.py` or other core modules want to use `ErrorKind` early). | Low | Low | `result_types.py` is a leaf module with no imports from other src files except stdlib. |
|
||||
@@ -592,13 +592,15 @@ This is the track that most affects the data-oriented error handling refactor. T
|
||||
|
||||
#### 10.3.2 Modified `src/ai_client.py`
|
||||
|
||||
- **All 5 providers** (`_send_gemini`, `_send_anthropic`, `_send_deepseek`, `_send_minimax`, `_send_gemini_cli`) plus 3 new vendors (`_send_qwen`, `_send_llama`, `_send_grok`) all exist. All return `str` (text content of the AI response).
|
||||
- **Per-vendor state**: state globals for all 5+3 providers; per-vendor history lists + locks; per-vendor client singletons.
|
||||
- **All 5 providers** (`_send_gemini`, `_send_anthropic`, `_send_deepseek`, `_send_minimax`, `_send_gemini_cli`) plus 3 new vendors (`_send_qwen`, `_send_llama`, `_send_grok`) plus the Ollama native adapter (`_send_llama_native`, added by the `qwen_llama_grok_followup_20260611` track for `localhost` / `127.0.0.1` base URLs) all exist. **9 `_send_*()` functions total.** All return `str` (text content of the AI response).
|
||||
- **Per-vendor state**: state globals for all 5+3+1 providers; per-vendor history lists + **6 per-vendor history locks** (`_anthropic_history_lock`, `_deepseek_history_lock`, `_minimax_history_lock`, `_qwen_history_lock`, `_grok_history_lock`, `_llama_history_lock`); per-vendor client singletons.
|
||||
- **Per-vendor `list_models()`** dispatch exists.
|
||||
- **MiniMax is already refactored** to use `send_openai_compatible()` (the data-oriented refactor in that track reduced `_send_minimax` from ~250 lines to ~50).
|
||||
- **Shared `run_with_tool_loop` helper** (added 2026-06-11 by `qwen_llama_grok_followup_20260611`, `ai_client.py:806`): 4 of 9 vendors already use it — `_send_minimax` (refactored to helper in Phase 4 of the parent track, 250 → 50 lines), `_send_grok`, `_send_llama`, and `_send_gemini_cli` (via the `send_func + on_pre_dispatch` extension). The remaining 5 vendors (`_send_anthropic`, `_send_gemini`, `_send_deepseek`, `_send_qwen`, `_send_llama_native`) still have bespoke inline tool-call loops. **Invariant preserved by the audit gate** `scripts/audit_no_inline_tool_loops.py` (`DEFERRED_VENDORS = {"anthropic", "gemini", "deepseek"}`): after this track, the 4 refactored vendors must still use `run_with_tool_loop` (and the 3 deferred vendors remain in the exclusion list). `_send_qwen` and `_send_llama_native` are NOT in the deferred list, so any inline loop in them is already a CI violation.
|
||||
- **MiniMax is already refactored** to use `send_openai_compatible()` and `run_with_tool_loop` (the data-oriented refactor in the parent track reduced `_send_minimax` from ~250 lines to ~50).
|
||||
- **Anthropic and DeepSeek** still have their bespoke `_send_*()` implementations.
|
||||
- **Gemini** still has its SDK-specific caching logic (4-breakpoint system, explicit `genai.CachedContent`).
|
||||
- **Gemini CLI** still has its subprocess adapter (`GeminiCliAdapter`).
|
||||
- **Gemini CLI** still has its subprocess adapter (`GeminiCliAdapter` in `src/gemini_cli_adapter.py`).
|
||||
- **`_send_llama_native`** is a thin Ollama wrapper at `ai_client.py:~2540` (post the `qwen_llama_grok_followup_20260611` track). It POSTs to `/api/chat` (not `/v1/chat/completions`) and supports `think` / `images` / `thinking` fields. It is dispatched from `_send_llama` when the base URL is `localhost` / `127.0.0.1`. No `run_with_tool_loop` refactor — it delegates up to `_send_llama`'s loop.
|
||||
|
||||
#### 10.3.3 Critical coordination questions for THIS track
|
||||
|
||||
@@ -666,6 +668,7 @@ If any of the expected new files are missing, the implementer reports a coordina
|
||||
- **Async / asyncio error propagation patterns.** Out of scope for this track.
|
||||
- **The `UserRequestEvent` and `Execution Clutch` HITL patterns** in `app_controller.py`. These are about user interaction, not error propagation. Deferred.
|
||||
- **The `EventEmitter` cross-thread event patterns** in `events.py`. Out of scope.
|
||||
- **Preserving the `scripts/audit_no_inline_tool_loops.py` CI gate** (added by `qwen_llama_grok_followup_20260611`): the 4 refactored vendors must keep using `run_with_tool_loop`. Any vendor that drops the helper after the refactor will fail CI. The 3 deferred vendors (`anthropic`, `gemini`, `deepseek`) remain in the exclusion list.
|
||||
|
||||
## 12. See Also
|
||||
|
||||
@@ -674,14 +677,15 @@ If any of the expected new files are missing, the implementer reports a coordina
|
||||
**"Public API Result Migration"** (`public_api_migration_20260606`) — Removes the deprecated `ai_client.send()`. Migrates all callers to `send_result()`. Adds any new public API surface needed (e.g., per-ticket `Result` returns in the MMA conductor). This is the **only** follow-up that this spec plans; the other future migrations are listed below for reference but not planned here.
|
||||
|
||||
**Baseline verification (run during the follow-up track's Phase 1):**
|
||||
The complete list of `ai_client.send()` direct callers in `src/` (verified 2026-06-08):
|
||||
The complete list of `ai_client.send()` direct callers in `src/` (verified 2026-06-11):
|
||||
- `src/app_controller.py:290` — `_api_generate` body
|
||||
- `src/app_controller.py:3559` — second call site
|
||||
- `src/app_controller.py:3692` — second call site (was `:3559` in the 2026-06-08 audit; the line drifted as additional code landed above the call)
|
||||
- `src/multi_agent_conductor.py:591` — MMA worker dispatch
|
||||
- `src/orchestrator_pm.py:86` — orchestrator project manager
|
||||
- `src/conductor_tech_lead.py:68` — Tech Lead sub-agent
|
||||
- `src/mcp_client.py:2274` — **NEW (added 2026-06-11, missed in the original §12.1 enumeration):** the MCP tool-result dispatch path. When the `mcp_client.async_dispatch` path returns an error string from a tool, the surrounding code may route through `ai_client.send()` for retry-classification. This is the 5th production caller in `src/`.
|
||||
|
||||
Plus ~50+ test files that call `send()` directly. The follow-up track's `rg "ai_client\.send\(" --type py | wc -l` baseline should match these numbers before migration begins. Tests that call `_send_<vendor>()` directly (rather than `send()`) are also affected by the `Task 3.4` rename and need migration to `_send_<vendor>_result()`.
|
||||
Plus **63** test files (verified 2026-06-11) that call `send()` directly. The follow-up track's `rg "ai_client\.send\(" --type py | wc -l` baseline should match these numbers before migration begins. Tests that call `_send_<vendor>()` directly (rather than `send()`) are also affected by the `Task 3.4` rename and need migration to `_send_<vendor>_result()`.
|
||||
|
||||
### 12.2 Future Migration Tracks (prioritized; NOT planned in this spec)
|
||||
|
||||
|
||||
@@ -97,12 +97,13 @@ import_src_result_types_fast = false
|
||||
# New verification flags (2026-06-08 revision)
|
||||
not_ready_kind_in_enum = false
|
||||
with_errors_batch_helper = false
|
||||
per_vendor_send_rename_commits = 0 # 8 expected (Tasks 3.4.1-3.4.8)
|
||||
per_vendor_send_rename_commits = 0 # 9 expected (Tasks 3.4.1-3.4.9)
|
||||
optional_in_3_files_baseline_recorded = false
|
||||
hard_rules_section_in_styleguide = false
|
||||
external_validation_cited = false # Lottes + Valigo references in spec §3.1.1
|
||||
audit_optional_script_added = false # scripts/audit_optional_in_3_files.py
|
||||
deprecation_filterwarnings_at_phase_3 = false # added in plan Task 3.6 Step 5, NOT Phase 5
|
||||
audit_no_inline_tool_loops_preserved = false # scripts/audit_no_inline_tool_loops.py still passes after the refactor (run_with_tool_loop usage preserved for the 4 refactored vendors)
|
||||
|
||||
[result_types_coverage]
|
||||
# Filled as tasks complete
|
||||
@@ -129,9 +130,9 @@ tests_pass_after = 0
|
||||
send_renamed_to_send_result = false
|
||||
provider_error_removed = false
|
||||
_send_renamed_to_result = 0
|
||||
of_total_send = 0 # was the second 'of_total' - renamed for clarity (8 expected)
|
||||
of_total_send = 0 # was the second 'of_total' - renamed for clarity (9 expected: 8 vendors + _send_llama_native Ollama adapter)
|
||||
classify_error_returns_error_info = 0
|
||||
of_total_classify = 0 # was the first 'of_total' - renamed for clarity (6 expected)
|
||||
of_total_classify = 0 # was the first 'of_total' - renamed for clarity (6 expected: 4 in ai_client + 1 shared + 1 qwen)
|
||||
deprecation_warning_emitted = false
|
||||
tests_pass_before = 0
|
||||
tests_pass_after = 0
|
||||
@@ -161,10 +162,12 @@ migrates = [
|
||||
|
||||
[baseline_post_qwen_track]
|
||||
# Recorded at Phase 1 Task 1.1; baseline for the follow-up public_api_migration track
|
||||
ai_client_send_callers_in_src = 5 # 4 production + see spec §12.1
|
||||
ai_client_send_callers_in_tests = 0 # fill from `rg "ai_client\.send\(" --type py | wc -l` at Phase 1
|
||||
optional_in_3_files = 0 # fill from `rg "Optional\[" src/mcp_client.py src/ai_client.py src/rag_engine.py | wc -l`
|
||||
# 2026-06-11 audit (post qwen_llama_grok_followup_20260611 archive):
|
||||
ai_client_send_callers_in_src = 6 # 5 production: app_controller.py:290 + :3692, multi_agent_conductor.py:591, orchestrator_pm.py:86, conductor_tech_lead.py:68, mcp_client.py:2274 (mcp tool-result dispatch path; added 2026-06-11)
|
||||
ai_client_send_callers_in_tests = 0 # fill from `rg "ai_client\.send\(" --type py | wc -l` at Phase 1; 2026-06-11 audit: 63
|
||||
optional_in_3_files = 0 # 2026-06-11 audit: 0 (already clean; audit script will be a forward guard)
|
||||
send_callsites_to_migrate = 0 # fill at end of Phase 3 = number of test files updated for the new API
|
||||
|
||||
# Per-vendor refactor commits (Task 3.4.1 - 3.4.8)
|
||||
# Per-vendor refactor commits (Task 3.4.1 - 3.4.9)
|
||||
# Order: gemini, anthropic, deepseek, minimax, gemini_cli, qwen, llama, grok, llama_native
|
||||
send_renamed_commits = [] # one commit SHA per vendor, in order
|
||||
|
||||
Reference in New Issue
Block a user