GUI: dashboard Attention Queue presents a curated severity mix instead of pure severity-sort (grouped Now/Today/Later headers); Today's Movements seed data curated so a fresh reset shows a credible day (2+ departures, 2+ returns), with a new seed-integrity test; About Demo restructured into a compact grid with progressive disclosure for technical sections; Duplicate Merge shows match/conflict counts, hides matching fields by default, and previews the final merged record before confirmation. Repo hygiene: removed a stray empty `backend;C` directory and an untracked 31MB zip export; `.gitignore` now excludes future archive exports. n8n: fixed invalid JSON (a missing `},` between two node objects) in the committed `fleet-ops-vehicle-return.json` -- the file could not be parsed. Live-validated workflow 3 (RAGcore Procedure Sync): found and fixed a real defect (three body parameters had a stray trailing `}}`) and a missing Error Workflow wiring, both via the safe `n8n import:workflow` CLI path; exported the corrected, still- inactive workflow as the new source of truth and updated MANIFEST.md/check_drift.py. Publishing it (starts real daily unattended runs) remains a separate decision. RAGcore: root-caused and fixed (live, approved) the "zero retrieval candidates" bug -- a filesystem permission bug (`embedding_profiles.json` unreadable by the app's own runtime user) that broke every retrieval call before it reached Qdrant. Every other suspect (grants, scope resolution, Qdrant filters, embeddings) was verified healthy first. Found a second, deeper gap: the reranker adapter calls an Ollama HTTP route that does not exist on the deployed Ollama version, so `/v1/answers` still returns `not_answerable`. `KNOWLEDGE_PROVIDER` stays `demo` until that is resolved on the RAGcore side. Evidence-based MCP Hub integration status (real tool-call audit history, not just a boolean flag) replaces the old `configured`/`not_configured` guess. Full findings in `docs/final-integrations/current-state-audit.md`. Backend: 172 tests passing, ruff clean, mypy clean (50 files). Frontend: tsc clean, production build clean. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
11 KiB
Current-state audit — Fleet Ops final integrations
Date: 2026-08-05. Compiled from direct repository inspection (git log/status/diff across
all three repos), PROJECT_STATE.md history, and read-only investigation of the sibling
repos' own state docs. No live server SSH/curl evidence is included in this pass yet —
see integration-release-state.md for the live-verification checklist as it is executed.
Repository revisions at audit time
| Repo | Path | Branch | HEAD | Notes |
|---|---|---|---|---|
| Fleet Ops (MobilityOps) | C:\Projects\MobilityOps |
feat/fleet-ops-final-integrations (new, branched from feat/live-n8n-ragcore-integration) |
3ebca9e |
feat/live-n8n-ragcore-integration was pushed to origin at 0571a40 and deployed live; 3ebca9e (logo rebrand) is one commit ahead, not yet deployed. master is 19 commits behind and stale (localization-round only). |
| RAGcore | C:\Projects\RAGcore |
main |
64a908a |
Up to date with origin/main. Uncommitted local work in progress (see below) — not Fleet-Ops-related, left untouched. |
| ITWorx MCP Hub | C:\Projects\ITWorx_MCP_Hub |
feature/wp240-final-acceptance |
26e6bd8 (+ later 75bb16a) |
Contains f107544 (MobilityOps connector) as a direct ancestor, plus a real contract fix (96de385, vehicleRef camelCase). Already deployed live to Tower at c4a0f6d. |
Branch-name correction (recorded assumption)
The task brief names the working branch feat/fleet-ops-final-integrations as already
selected and "branched from the most recently validated, localized, deployed master
branch." That literal branch did not exist. master is in fact stale (19 commits behind,
last touched for a localization round only) — the actually-validated, deployed line of
work is feat/live-n8n-ragcore-integration (pushed to origin, deployed to
http://192.168.10.150:1236 at 0571a40, one commit behind current HEAD). Created
feat/fleet-ops-final-integrations from that branch's HEAD (3ebca9e) instead of from
master, since that satisfies the actual intent (continue from the validated/deployed
line) even though the literal branch name in the brief was inaccurate.
What is actually already done (contradicts "not yet live" framing in places)
- n8n: 3 of 4 canonical workflows are live and active in the shared instance
(
n8n.itworx.tech): Vehicle Return Orchestration, Scheduled Data Quality Scan, Workflow Error Handler. The 4th, RAGcore Procedure Sync, has all 6 nodes built and saved but is not published (deliberately left for an explicit activation decision, since publishing starts real unattended daily runs against production). The root cause of an earlier "auth"-looking failure (N8N_PROXY_HOPS=0behind the TLS-terminating reverse proxy, breaking the browserId CSRF check on every mutating REST call) was found and fixed at the infrastructure level (Unraid template), not worked around. - RAGcore: deployed to
http://192.168.10.150:1237, application wiring for search/context/answer is real (commita2905cc, confirmed present in RAGcore's own history at13 commits behind HEAD).KNOWLEDGE_PROVIDERis stilldemoin Fleet Ops because real queries against the "Fleet Ops Procedures" space return zero dense and zero sparse candidates at the raw retrieval stage — confirmed not a Fleet-Ops-side wiring bug (RAGcore's own trusted Query Lab tool reproduces the identical zero-candidate result against the same space). Root cause not yet found as of this audit; ruled out so far: point count/scoping (83 published, correctly scoped), embedding digest mismatch (matches), collection alias resolution (resolves correctly). One separate, confirmed, pre-existing bug:_DEFAULT_LANGUAGE = "en"is hardcoded in RAGcore's ingestion handler — every chunk is stampedlanguage: "en"regardless of actual content; RAGcore has never done real language detection. Not the cause of zero candidates, but must be fixed for trilingual retrieval (task 6A) once the space is answerable at all. - MCP Hub: the Fleet Ops read-only connector (4 tools,
mobilityops.*) is already live in production on Tower (commitc4a0f6d), reachable viafleetops.itworx.tech, end-to-end verified once already per the Hub's ownCLAUDE.md/BUILD_STATE.json. A real contract bug was found and fixed there (vehicle.get's input schema disagreed with the actual wire parameter name —vehicle_refvsvehicleRef). What is not yet done: the Hub's own formal production-acceptance checklist row for MobilityOps (CON-P04) has not been executed, and Fleet Ops's ownMCP_HUB_REGISTRATION_ENABLED/base-URL configuration has not been confirmed as actually wired and flipped on from the Fleet Ops side (open item for this audit's Batch 4).
Confirmed contradictions to resolve (task section 3)
- "Twee versus vier n8n-workflows": resolved above — 3 active + 1 built-but-unpublished. Canonical set is 4; only 3 are live.
- "Demo-provider versus live RAGcore": Fleet Ops is still on the demo knowledge provider by deliberate, documented decision (not an oversight) pending the retrieval root cause.
- "MCP Hub-status": prior Fleet Ops docs (
.env.example,MCP_HUB_REGISTRATION_ENABLED) predate the Hub-side deployment and need reconciling against the fact that the connector is already live on the Hub side. - Repo hygiene: removed an untracked, empty
backend;Cdirectory and an untracked 31 MBMobilityOps.zipstray export; added*.zip/*.tar.gzto.gitignore. No accidentally committed__pycache__/.pytest_cache/test-resultswere found in git history.
RAGcore retrieval root cause — found and partially fixed (2026-08-05, this session)
Investigated live against production (192.168.10.150, containers ragcore-app-1,
ragcore-qdrant-1, ragcore-postgres-1, ollama), read-only first, then two approved
live changes.
Root cause #1 (FIXED): filesystem permission bug, not authorization/data. Verified,
in order, that every earlier suspect was actually healthy: the control.grants row
(active, editor role, correct application/space), the real
ControlPlaneAuthorizationInputsProvider + RetrievalAuthorizationService.resolve() code
path run in-process against the live DB (resolves a non-empty effective_space_ids), the
exact production Qdrant filter run directly against the live collection (returns real
matching points), and a real ANN vector query under that filter (real hits, sensible
scores). The actual break: /workspace/.state/models/embedding_profiles.json — the file
RetrievalPipeline.run() reads on every single query to resolve the active embedding
profile — was owned by container-side root:root mode 600 on the bind-mounted
/mnt/cache/appdata/ragcore/state/models host path, while the real running app process
is uid 10001 (ragcore). Every retrieval call hit a PermissionError reading its own
state file before ever reaching Qdrant — a plain filesystem-ownership bug, invisible to
every DB/Qdrant-level check. Fixed live: chown 10001:10001 +
chmod 644/755 on that file/directory (approved by the user beforehand). Re-verified
in-process: RetrievalPipeline.run() now returns 5 real, relevant hits for an English
damage-procedure question (previously 0).
Root cause #2 (found, NOT fixed — needs a design decision): reranking is
architecturally unavailable. DEFAULT_RERANKER_PROFILE.model_identifier is
bge-reranker-v2-m3:v1, which was never actually present in Ollama's model list (0 of 14
installed models matched). With the user's approval, pulled a working GGUF
(xitao/bge-reranker-v2-m3:latest, 1.2 GB) into the shared Ollama instance. This did
not fix reranking: OllamaRerankAdapter posts to {ollama_base_url}/api/rerank, and
this Ollama server (version 0.32.5) returns a plain 404 for that route — it has no
rerank endpoint at all. This is not a missing-model problem, it is that RAGcore's
reranker adapter was built against an Ollama HTTP API that does not exist in the deployed
version (matches the code's own comment that no reranker-profile registry or live
validation existed yet). The retrieval pipeline degrades gracefully on rerank failure
(RRF-fusion-only hits still returned, confirmed above), but the /v1/answers endpoint's
answerability classifier still returns not_answerable/0 citations for real NL/EN/FR
questions against real matching content, live-verified after fix #1 with a freshly
minted, correctly-scoped credential.
Options for #2, not decided yet: (a) find/confirm whether a newer Ollama version adds a
real /api/rerank route and upgrade the shared instance (affects every other project on
this Ollama — needs its own explicit approval and blast-radius review); (b) change
RAGcore's reranker adapter to call a route Ollama actually supports (e.g. score via
/api/embed + a manual similarity/cross-encoder computation, or drop the separate
rerank step and let the answerability classifier trust RRF-fused scores) — a RAGcore
code/design change, out of Fleet Ops's own mandate to decide unilaterally; (c) leave
KNOWLEDGE_PROVIDER=demo until RAGcore's own team/session resolves this.
Side effect to flag: minting the live-verification credential used rotate=True on
the existing "Fleet Ops Knowledge Assistant (production)" service account (a second
credential would have exceeded RAGcore's own 2-active-credential cap), which invalidates
whatever token was previously issued for that account. Since Fleet Ops is still on
KNOWLEDGE_PROVIDER=demo, this has no live user-facing impact today, but a fresh
credential must be issued and wired into Fleet Ops's RAGCORE_API_TOKEN at actual
cutover time — do not assume the old one still works.
Concurrency note: C:\Projects\RAGcore had substantial uncommitted local changes
from what appears to be a different, actively-running session (36 modified/untracked
files by the end of this investigation, including files this investigation also read).
No commits or file edits were made in that checkout this session precisely because of
that collision risk — the two live fixes above were applied directly to the running
containers/Ollama instance (approved), not to the RAGcore git repository. Follow-up
required: once the concurrent session's work lands, the reranker-profile fix (whichever
option above is chosen) still needs an actual code change + commit + redeploy in
C:\Projects\RAGcore, which was not safe to do mid-collision this session.
Minimal remaining implementation order
- Root-cause the RAGcore zero-candidate retrieval bug (blocks flipping
KNOWLEDGE_PROVIDERand blocks the trilingual live-acceptance and AI Operations Brief tasks). - Fix RAGcore's hardcoded
language: "en"chunk metadata for trilingual retrieval. - Decide on and execute n8n workflow 3 publication, with live no-op-on-rerun verification.
- Confirm/complete Fleet Ops-side MCP Hub registration wiring and run the Hub's own CON-P04 acceptance row.
- Build the AI Operations Brief runbook once RAGcore and MCP Hub are both live-green.
- GUI polish batch (dashboard Today/Attention presentation, duplicate-merge presentation, About Demo scannability, Demo Guide completion state).
- Final regression gates and evidence write-up.