Ran a real AI Operations Brief via the live ITWorx MCP Hub connector's own MobilityOpsClient against production Fleet Ops: real operations summary, real most-pressing vehicle, real grounded knowledge answer with citations, real correlation IDs verified end-to-end in Fleet Ops's own audit log. No write actions performed. Runbook and full output in docs/final-integrations/ai-operations-brief-runbook.md. Ran the full Playwright e2e suite against the live deployed instance and fixed two pre-existing fragile locators unrelated to this session's feature work (both broke because Automation now legitimately has two tables sharing the same generic selectors, exposed by running the full suite rather than individual files) plus one pre-existing untranslated-loanword false positive. All specs pass. artifacts/final-integrations/final-summary.md has the complete evidence write-up: repository/deployment state, what was fixed vs. handed off, test results, and known limitations stated plainly. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
10 KiB
10 KiB
Fleet Ops final integrations — evidence summary
Session date: 2026-08-05. Branch feat/fleet-ops-final-integrations.
Repository state
| Repo | Start | End | Branch | Notes |
|---|---|---|---|---|
| Fleet Ops (MobilityOps) | 3ebca9e (from feat/live-n8n-ragcore-integration) |
727c19a (+ e2e test fixes, uncommitted at write time) |
feat/fleet-ops-final-integrations, pushed to origin |
3 commits: 34df66d, 2ae2044, 727c19a |
| RAGcore | 64a908a |
64a908a (+1 isolated commit ce0ad56) |
main |
Only a backlog handoff entry committed; no code changes (36-file concurrent-session collision — see below) |
| ITWorx MCP Hub | not modified this session | — | feature/wp240-final-acceptance |
Connector already live in production before this session started; not touched |
Deployed revisions
- Fleet Ops:
http://192.168.10.150:1236, redeployed twice this session (after Batches 1-3 and after Batch 4),docker compose -p mobilityops -f compose.yaml -f compose.unraid.yaml up --build -d db api web,.deploy/source-revision=727c19a.... - RAGcore:
http://192.168.10.150:1237,ragcore-app-1. No image redeploy — the two live fixes (filesystem permissions, reranker model pull) were applied directly to the running container/Ollama instance, not via a code deploy. - ITWorx MCP Hub:
http://192.168.10.150:1100(Tower), unchanged, already live before this session at commitc4a0f6dper the Hub's own state.
GUI polish (Batch 1)
- Dashboard Attention Queue: curated severity mix (grouped "Handle now / Follow up
today / Review later"), replacing pure severity-sort that let
highcrowd out everything else. - Today's Movements: seed data curated (
seed/bookings.csv) so a fresh reset shows ≥2 departures and ≥2 returns; newtest_seed_today_movements_are_a_credible_mixtest. Live-verified after a real demo reset: 2 returns + 2 departures shown. - About Demo: restructured into a compact grid with
<details>progressive disclosure for architecture/security/testing sections. - Duplicate Customer Merge: match/conflict counts shown, matching fields hidden by default (toggle to reveal), compact preview of the merged record before confirmation.
- Repo hygiene: removed a stray empty
backend;Cdir and an untracked 31MB zip export;.gitignorenow excludes future archive exports. - All four live-verified via browser against the deployed instance (see screenshots taken during the session — not separately saved to disk).
n8n (Batch 2)
- 4 canonical workflows confirmed live: Vehicle Return Orchestration, Scheduled Data Quality Scan, RAGcore Procedure Sync, Workflow Error Handler.
- Fixed genuinely invalid JSON in the committed
fleet-ops-vehicle-return.json(a missing},between two node objects — the file could not be parsed). - Workflow 3 (RAGcore Procedure Sync): confirmed 6 real nodes built and saved. Found and
fixed two real defects via the safe
n8n import:workflowCLI path (not the REST API, which caused a documented wipe incident in an earlier session): three body-parameter expressions had a stray trailing}}, andsettings.errorWorkflowwas unset. Exported the corrected definition ton8n/workflows/fleet-ops-ragcore-procedure-sync.json, added toMANIFEST.mdandcheck_drift.py. - Not published — the Schedule Trigger runs daily at midnight; activating it starts real unattended production runs, deliberately left as a separate go-live decision.
- No no-op/sync/error-handler live-execution smoke test was run this session beyond the structural CLI-export verification above (workflow remains unpublished).
RAGcore (Batch 3)
- Root cause found and fixed, live, user-approved: the "zero retrieval candidates"
bug was a filesystem permission bug (
/workspace/.state/models/embedding_profiles.jsonwasroot:rootmode600on the host bind mount, unreadable by the app's actual runtime uid 10001) — not authorization, not Qdrant, not embeddings, all independently verified healthy first. Fixed viachown/chmod; re-verified in-process (5 real hits, up from 0). - Second, deeper gap found, not fixed: the reranker adapter calls
{ollama}/api/rerank, a route this Ollama version (0.32.5) does not serve (404). Pulled a working model (xitao/bge-reranker-v2-m3:latest, 1.2GB, approved) — did not fix it, since the problem is the HTTP route, not the model./v1/answersstill returnsnot_answerable/0 citations for real questions against real matching content. - User decision: leave
KNOWLEDGE_PROVIDER=demo; hand the reranker fix off to RAGcore's own backlog (docs/ai/BACKLOG.yaml, taskM8-01, committed in that repo asce0ad56— the only commit made in RAGcore this session) rather than editing RAGcore code amid its own 36-file concurrent-session collision. - Side effect: minting the live-verification credential rotated the existing "Fleet Ops Knowledge Assistant (production)" service account's credential (2-active-credential cap reached). A fresh credential must be issued before actually flipping the provider live.
MCP Hub (Batch 4)
- Confirmed the Fleet Ops connector is already live in production on the Hub side
(Tower, commit
c4a0f6d), with a real contract fix already applied there (vehicle.get's wire parameter normalized to camelCasevehicleRef). - Fixed two concrete gaps in Fleet Ops's own
search-knowledgeendpoint: nolocalefield existed at all (nownl-BE/en-GB/fr-BE, wired to the knowledge provider's existinglanguageparam), and the correlation ID was always freshly minted, ignoring any inboundX-Correlation-Idheader. Addedget_correlation_id, applied to all four MCP endpoints. MCP_HUB_BASE_URLwas dead config (declared, never read); wired it for a real, bounded Hub-reachability health check instead of an unneeded self-registration push (the Hub's own registration is catalog-driven).- Renamed Fleet Ops's own internal audit tool labels
mobilityops_*→fleet_ops_*(mirrored incontracts/mcp-tools.json,mobilityops_*kept as deprecated aliases). The live Hub connector's own dotted tool namespace (mobilityops.operations.summaryetc.) is a separate, Hub-owned naming layer, deliberately not touched. - Automation page's MCP card now shows real evidence (last tool/client/count/timestamp) instead of only the registration-enabled boolean.
AI Operations Brief (Batch 5)
Real MCP-client-shaped run via the live ITWorx MCP Hub connector's own
MobilityOpsClient class against production Fleet Ops. Full runbook and live output in
docs/final-integrations/ai-operations-brief-runbook.md. Summary:
- Real operations summary (21 available / 11 rented / 6 cleaning / 5 maintenance / 7 blocked; 23 open quality issues).
- Real most-pressing vehicle identified (
MO-031, missing operational inspection). - Real vehicle detail lookup.
- Real grounded knowledge answer (English damage-handling question): 2 real citations,
evidence_state: grounded. - Dutch/French variants of the same question honestly returned
insufficient(no fabrication) — root cause: the live Hub connector doesn't yet send the newlocalefield, a Hub-side follow-up, not silently worked around. - Correlation IDs verified end-to-end in Fleet Ops's own audit log
(
GET /api/v1/audit?action=mcp_tool_request), matching the response payloads exactly. - No write actions performed at any point.
Testing per batch
- Backend: 176 passed,
ruff check .clean,mypy appclean (50 source files) — verified against a freshly rebuilt image after discovering mid-session thatdocker compose run --rm api(no bind mount on theapiservice) silently tests a stale image otherwise. One genuinely stale test assertion found and fixed as a result. - Frontend:
tsc -b && vite buildclean. - E2e (Playwright, against the live deployed instance,
MOBILITYOPS_PUBLIC_URL=http://192.168.10.150:1236): every spec file run this session passed —demo.spec.ts,interactive-elements.spec.ts(26),responsive-i18n.spec.ts+demo-accessibility.spec.ts+guided-demo-full.spec.ts(28),i18n-coverage.spec.ts+error-messages.spec.ts+clickable-rows.spec.ts+demo-guide.spec.ts+demo-entry.spec.ts+demo-legibility.spec.ts+fleet-ops-correction.spec.ts+ui-redesign.spec.ts+greeting.spec.ts+greeting-live.spec.ts(28, after fixing 2 pre-existing fragile locators unrelated to this session's feature work — a.data-tableambiguity now that Automation has two tables, and aTechnische detailstoggle ambiguity for the same reason; plus one pre-existing untranslated-loanword false positive ini18n-coverage.spec.ts).
Known limitations, stated plainly
KNOWLEDGE_PROVIDERis stilldemo, notragcore— blocked on RAGcore's own reranker gap (handed off, not fixed this session).- n8n workflow 3 is built and correct but not published (deliberate, separate decision).
- The live MCP Hub connector doesn't yet send the new
localefield, so locale-aware knowledge search only works when called directly against Fleet Ops (as proven by the backend tests), not yet through the live Hub connector as deployed. - No public-demo-readiness checklist, About Demo Guide "completed" end-state polish (section 4E), or dashboard MCP "activity showcase after Demo Complete" gating were built this session — the MCP evidence display exists on the Automation page unconditionally rather than gated behind guided-demo completion.
- No security-review pass was run separately this session (existing gates: ruff, mypy, the repo's own auth/audit test coverage).
Rollback
- Fleet Ops: prior working revision
0571a40remains in.deploy/assource-0571a40.tar.gzon the Unraid host; redeploy by re-extracting and re-running the samedocker compose up --build -dsequence with that archive. - RAGcore:
chown/chmodchange is trivially reversible (chown 0:0+chmod 600on the same path) if needed, though there is no reason to revert a permission fix. Ollama model pull (xitao/bge-reranker-v2-m3:latest) can be removed withollama rmif unwanted; it is inert until RAGcore's own code is changed to use it. - MCP Hub: not modified this session.