Tracking issue for a full code-audit of DataPilot covering the Electron/Node layer, React renderer, backend multi-agent orchestration, LLM provider + FastAPI layer, the data/parser/Neo4j/MCP-worker layer, and build/CI/test/packaging infra.
Meta-finding: the project is well-architected and unusually well-documented (AGENT.md), but there is a consistent gap between the guarantees that document makes and what the code actually enforces — security ("zero-trust IPC", safeStorage-only secrets), grounding (every finding must cite a resolvable log_id), budgets (25k/turn, 200k/session), the <2s plan SLA, and quality gates (lint/test are exit 0 stubs) are specified but not wired up.
68 issues were filed (#27 –#94 ). Each is self-contained with file:line references, impact, and a suggested fix so it can be picked up independently. Security findings are written impact-focused (no exploit recipes).
Labels
Severity: severity:critical · severity:high · severity:medium · severity:low
Area: area:electron · area:frontend · area:agent · area:api · area:data · area:infra
Type: security · bug · tech-debt · enhancement
Suggested order of attack
Security pass — the renderer→host and open-API holes: [electron] shell:openPath passes unvalidated renderer path to OS — enables host file/app launch #27 , [electron] No runtime IPC payload validation on any ipcMain.handle handler #28 , [api] Localhost backend is unauthenticated with wide-open CORS (allow_origins=["*"]) #64 , [api] Provider API keys can be reflected to client/logs via str(e) on key-bearing settings endpoints #60 , [api] Full prompts/responses logged unredacted to persistent file and served over an endpoint #61 , [electron] API keys & Neo4j password injected as container env are exposed via docker inspect #32 , [electron] Entire $HOME bind-mounted into backend and worker containers (over-broad scope) #33 , [frontend] API keys copied out of safeStorage to backend over plain HTTP and to clipboard #39 , [data] Bag file path opened without validation or containment checks #80 .
Data integrity — before more bags get ingested into a shared graph: [data] Cross-session Log.id collision corrupts causal edges and citations #68 , [data] Log timestamps stored as str(timedelta) break ordering and long-bag causal timing #70 .
Stand up quality gates — so the rest is protected against regression: [infra] CI runs no typecheck/lint/tests/eval gate — broken PRs merge green #71 , [infra] No ESLint config — pnpm lint always passes, AGENT.md rules unenforced #87 , [infra] No frontend/TypeScript test setup — pnpm test is a no-op that exits 0 #85 .
Enforce documented invariants — budgets, grounding, timeouts, async Neo4j: [agent] Token budget (25k/turn, 200k/session) is never enforced #42 , [agent] Citation grounding bypassed: uncited critical/warning findings pass the composer #50 , [agent] No timeouts on LLM calls in the orchestration path #48 , [agent] Synchronous Neo4j driver called from async nodes blocks the event loop #46 , [api] Cloud provider clients construct SDKs with no request timeout — hung upstream stalls SSE + DB session #65 .
area:electron (11)
Critical
High
Medium
[electron] keychain falls back to plaintext base64 with no marker when safeStorage is unavailable #40 — keychain falls back to plaintext base64 with no marker when safeStorage is unavailable
[electron] Docker lifecycle & orchestration robustness (boot races, naming, compose drift, teardown) #41 — Docker lifecycle & orchestration robustness (boot races, naming, compose drift, teardown)
[electron] IPC robustness: silent keychain/settings failures, unvalidated log-stream args, ignored second-instance argv #51 — IPC robustness: silent keychain/settings failures, unvalidated log-stream args, ignored second-instance argv
Low
area:frontend (10)
Critical
High
Medium
[frontend] Dead code & slow startup: unused mockData, serial settings IPC, no-op shortcut hook, fake build date #43 — Dead code & slow startup: unused mockData, serial settings IPC, no-op shortcut hook, fake build date
[frontend] Type safety at the chat-history API boundary: any[] flows unvalidated into the store #45 — Type safety at the chat-history API boundary: any[] flows unvalidated into the store
[frontend] Robustness & error UX: native dialogs, retry timeout hack, swallowed errors, defaultModel overload #47 — Robustness & error UX: native dialogs, retry timeout hack, swallowed errors, defaultModel overload
Low
area:agent (12)
Critical
High
Medium
[agent] Harden query_graph Cypher: weak write-blocklist + unbounded read DoS at the injection surface #56 — Harden query_graph Cypher: weak write-blocklist + unbounded read DoS at the injection surface
[agent] Orchestration correctness: re-grounding, replan keying, and plan-drop auditing #57 — Orchestration correctness: re-grounding, replan keying, plan-drop auditing
[agent] Tool hardening: per-tool timeout, worker_subset dispatch enforcement, error handling, recursion guard #58 — Tool hardening: per-tool timeout, worker_subset dispatch enforcement, error handling, recursion guard
Low
area:api (11)
Critical
High
Medium
[api] Input validation & query-param hardening: bound message size, limit/offset, escape Lucene query #67 — Input validation & query-param hardening: bound message size, limit/offset, escape Lucene query
[api] API hygiene & Pydantic response models: add response_model, validate SSE envelope, fix provider Literal #69 — API hygiene & Pydantic response models: add response_model, validate SSE envelope, fix provider Literal
[api] Provider client robustness: streaming retry gap, Ollama reachability probe, token-usage accounting #74 — Provider client robustness: streaming retry gap, Ollama reachability probe, token-usage accounting
Low
area:data (11)
Critical
High
Medium
[data] Ingestion correctness & performance: embedding-dim default, O(n^2) edges, no write transaction, dup parser #84 — Ingestion correctness & performance: embedding-dim default, O(n²) edges, no write transaction, dup parser
[data] Service & worker contract compliance: corrupt bag reported as ready, untyped parse errors, wrong tool count #86 — Service & worker contract compliance: corrupt bag reported as ready, untyped parse errors, wrong tool count
[data] Worker /health server binds 0.0.0.0, exposing unauthenticated health on all interfaces #91 — Worker /health server binds 0.0.0.0, exposing unauthenticated health on all interfaces
Low
area:infra (13)
Critical
High
Medium
Low
Tracking issue for a full code-audit of DataPilot covering the Electron/Node layer, React renderer, backend multi-agent orchestration, LLM provider + FastAPI layer, the data/parser/Neo4j/MCP-worker layer, and build/CI/test/packaging infra.
Meta-finding: the project is well-architected and unusually well-documented (
AGENT.md), but there is a consistent gap between the guarantees that document makes and what the code actually enforces — security ("zero-trust IPC",safeStorage-only secrets), grounding (every finding must cite a resolvablelog_id), budgets (25k/turn, 200k/session), the<2splan SLA, and quality gates (lint/testareexit 0stubs) are specified but not wired up.68 issues were filed (#27–#94). Each is self-contained with
file:linereferences, impact, and a suggested fix so it can be picked up independently. Security findings are written impact-focused (no exploit recipes).Labels
severity:critical·severity:high·severity:medium·severity:lowarea:electron·area:frontend·area:agent·area:api·area:data·area:infrasecurity·bug·tech-debt·enhancementSuggested order of attack
area:electron (11)
Critical
High
Medium
Low
anyin orchestrator/preload, unify settings-store typearea:frontend (10)
Critical
High
Medium
Low
area:agent (12)
Critical
High
Medium
Low
area:api (11)
Critical
High
Medium
Low
area:data (11)
Critical
High
Medium
Low
area:infra (13)
Critical
High
Medium
Low