fix(gateway): repair routing health and MCP command wiring
ci/woodpecker/pr/ci Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
# P3-R1 — Routing Health Enum + `/mcp` Wiring Scratchpad
|
||||
|
||||
**Task:** P3 hands-on acceptance blockers #1 and #5
|
||||
**Mission:** `mvp-20260312` (active)
|
||||
**Branch:** `feat/webui-p3r1-routing-mcp` from `origin/next`
|
||||
**Required base:** `20718b5a273d243363a4f5cbef5bbf692a805bdb`
|
||||
**Tracking ref:** Direct P3-R1 author brief; no provider issue supplied; no PR or merge authorized
|
||||
**Started:** 2026-08-11T14:52:52-05:00
|
||||
|
||||
## Objective
|
||||
|
||||
Fix exactly two P3 acceptance blockers:
|
||||
|
||||
1. Make routing consume the canonical `ProviderHealthStatus` enum, with `healthy` and `degraded` routable and `down` non-routable, at both routing decision sites.
|
||||
2. Wire `McpClientModule` into `CommandsModule`, make `McpClientService` required, remove the unreachable unavailable-service branch, and prove `/mcp status` reaches the client.
|
||||
|
||||
Explicitly excluded: provider registry/adapters, `provider.service.ts`, `agent.service.ts`, `chat.gateway.ts`, fallback membership, task classification, selector UI, conversation resume, reload UX, WS/origin/handshake behavior, dependencies/lockfile, and `apps/web/**` changes.
|
||||
|
||||
## Plan
|
||||
|
||||
1. Confirm exact base/branch and inspect every cited source/test anchor plus all direct `CommandExecutorService` construction sites.
|
||||
2. Record baseline gateway and focused routing/commands/MCP test totals.
|
||||
3. Add regression tests first and run focused tests to capture expected RED failures.
|
||||
4. Apply only the typed routing helper/signature changes and required MCP module/constructor/guard changes; update impossible `up` fixtures.
|
||||
5. Run focused tests, all user-required verification gates, lockfile/scope/diff checks, and record counts.
|
||||
6. Obtain independent spec and code/security review; remediate any findings and repeat affected gates.
|
||||
7. Commit conventionally, run the pre-push queue guard, and push only the feature branch (no PR or merge).
|
||||
|
||||
## Budget
|
||||
|
||||
No explicit token cap supplied. Working soft cap: **30K tokens**, based on two bounded gateway bug fixes, focused TDD, full gateway/root verification, independent review, and branch delivery. One coding worker will execute serially; reviews will be independent and serial to avoid worktree collisions.
|
||||
|
||||
## Startup Evidence
|
||||
|
||||
- `git fetch origin` rc=0.
|
||||
- `origin/next` confirmed exactly `20718b5a273d243363a4f5cbef5bbf692a805bdb`.
|
||||
- Local and remote `feat/webui-p3r1-routing-mcp` were absent before creation.
|
||||
- Branch creation rc=0; HEAD equals the required base.
|
||||
- Harness-owned `.mosaic/orchestrator/session.lock` was already dirty and remains excluded from staging/commit.
|
||||
|
||||
## Baseline Evidence
|
||||
|
||||
- Gateway full suite: rc=0; **64 files / 693 tests passed**, 7 files / 17 tests skipped (71 files / 710 tests total).
|
||||
- Routing sub-suite (`src/agent/routing`): rc=0; **3 files / 105 tests passed**.
|
||||
- Commands/MCP sub-suite (`src/commands`, `src/mcp-client`): rc=0; **6 files / 76 tests passed**.
|
||||
|
||||
## TDD and Implementation Evidence
|
||||
|
||||
- Routing RED: after canonical fixture/test changes but before the service fix, focused routing run returned rc=1 with **15 failed / 91 passed (106)** because the old `up`/`ok` gates rejected `healthy` and `degraded`.
|
||||
- Routing GREEN: canonical `ProviderHealthStatus` map types, one `isRoutable` helper, and both comparison sites corrected; focused routing suite passed.
|
||||
- MCP behavior test now drives `/mcp status` through a required mock client and asserts the client is called, success is returned for zero servers, and the former unavailable message is absent.
|
||||
- MCP wiring mutation RED used the final `Reflect.getMetadata('imports', CommandsModule)` assertion with only the production `McpClientModule` import/registration temporarily removed: rc=1, exact failure `expected [GCModule, …] to include McpClientModule`.
|
||||
- MCP wiring GREEN after byte-for-byte production restoration: rc=0. Temporary mutation did not remain.
|
||||
- Every direct `new CommandExecutorService(...)` test construction now supplies a non-null MCP client mock.
|
||||
- Initial Codex worker launch failed rc=1 from missing OpenAI bearer authentication. First Mosaic Claude launch failed rc=1 because Distrobox-local runtime contracts were absent; retry with the supported host `MOSAIC_HOME=/home/jwoltje/.config/mosaic` succeeded.
|
||||
|
||||
## Review Evidence
|
||||
|
||||
- Independent spec review: **approve**, 0 blockers, scope OK.
|
||||
- Independent code/security review: **approve**, 0 blockers, 0 critical/high security findings. It suggested an actual module-wiring assertion, which was added with valid mutation RED/GREEN evidence.
|
||||
- Independent final re-review after remediation: **approve**, 0 blockers, 0 critical/high security findings, no remaining findings.
|
||||
- Optional missing-provider/`undefined` test suggestion was not adopted: the brief explicitly requires the three canonical statuses (`healthy`, `degraded`, `down`) and forbids scope expansion; runtime behavior for absent keys remains `undefined` → non-routable through the required helper signature.
|
||||
|
||||
## Documentation Assessment
|
||||
|
||||
- `docs/PRD.md` already requires provider fallback/routing and MCP capability; this increment restores implementation to those existing contracts.
|
||||
- No public API endpoint, payload schema, auth/permission rule, navigation, deployment procedure, or new user workflow changes. OpenAPI, endpoint index, user/admin/developer guides, and sitemap are therefore N/A for this bounded repair.
|
||||
- This append-only scratchpad is the implementation, TDD, review, and verification record. Canonical docs remain in-repo; no publishing action is in scope.
|
||||
|
||||
## Final Verification Evidence
|
||||
|
||||
All required and repository-situational gates completed with rc=0:
|
||||
|
||||
| Gate | Result |
|
||||
| --- | --- |
|
||||
| `pnpm install --frozen-lockfile` | rc=0 |
|
||||
| Gateway typecheck | rc=0 |
|
||||
| Gateway lint | rc=0 |
|
||||
| Routing focused suite | rc=0; 3 files / 106 tests |
|
||||
| Commands/MCP focused suite | rc=0; 6 files / 78 tests |
|
||||
| Gateway full suite | rc=0; 64 files / 696 tests passed; 7 files / 17 tests skipped |
|
||||
| Gateway build | rc=0 |
|
||||
| Root typecheck | rc=0; 45/45 tasks |
|
||||
| Web test | rc=0; 19 files / 154 tests |
|
||||
| Root lint | rc=0; 25/25 tasks |
|
||||
| Root format check | rc=0 |
|
||||
| `git diff --check` | rc=0 |
|
||||
|
||||
- Gateway suite before→after: **693→696 passing tests**; skipped remained 17 (total 710→713).
|
||||
- Routing focused before→after: **105→106 passing tests**.
|
||||
- Commands/MCP focused before→after: **76→78 passing tests**.
|
||||
- `pnpm-lock.yaml` SHA-256 before/after frozen install: `9acaa89d213b3281e757b6edf6fdb8727176570d725b78a0de234c61a7f3c332`; diff versus `origin/next` rc=0.
|
||||
- Verified no changed path under `apps/web/**`, provider service/adapters, `agent.service.ts`, `chat.gateway.ts`, or lockfile.
|
||||
- Verified both `McpClientModule` production wiring lines remain and no impossible `up`/`ok` routing status checks/fixtures remain.
|
||||
- Verified code/test diff SHA-256: `27b41a855084b9dd85a7bc2a79fa3251d114ee226a4f1b835e65134c25a4f5a8`.
|
||||
|
||||
## Delivery State
|
||||
|
||||
Implementation, testing, documentation assessment, and independent review are complete. Remaining authorized actions: format this final scratchpad append, create one conventional commit, run the required push queue guard, and push only `feat/webui-p3r1-routing-mcp`; no PR or merge.
|
||||
Reference in New Issue
Block a user