Suggested Secondary Todo List

Date: 2026-07-16 Source: 0104 review documents in this folder. Ranked by impact. These are suggestions to merge into docs/known-issues.mdx / docs/roadmap.mdx (the authoritative registers) — this file is a staging area, not a third register.

P0 — Correctness & security (do before promoting mutable mode)

  • [ ] Advisory-lock durable projection ingest. Take the per-graph PostgreSQL advisory lock (as build/vacuum do, sql_build.rs:315-330) around ingest + manifest publication (projection/ingest.rs:86-111, manifest.rs:225-230). Two concurrent apply_sync() backends can currently drop a segment generation (last-writer-wins rename).
  • [ ] Document (or gate) the RLS boundary on topology reads. Topology functions return PKs/adjacency from a builder-scoped artifact; RLS is never consulted (acl.rs:52-68, engine.rs:678-777). Minimum: loud section in administration-and-security docs + known-issues row. Better: refuse or warn on RLS-enabled tables without an explicit opt-in GUC.
  • [ ] Clarify tenant scoping is a filter, not isolation for bitmap-tenanted graphs (sql_sync.rs:1883-1927); align docs and consider an enforcement option.
  • [ ] Fix bidirectional BFS first-intersection break (path_finder.rs:165-172,201-208) — finish the level and pick the minimal combined-distance meeting node; add a two-meeting-point regression test. Shortest paths may currently be one hop too long.
  • [ ] Add _sync_log retention/pruning. Applied rows are never deleted anywhere; the log grows without bound and apply scans degrade. Prune below the durable watermark from maintenance / run_scheduled_maintenance().

P1 — Operational hardening

  • [ ] Wire fmt/clippy/test/doc-drift into an automated PR CI workflow. Docs describe a CI gate ladder; the repo has only a manual packaging workflow (.github/workflows/release.yml). All needed scripts already exist (graph/tests/heavy/run_release_gate.sh, scripts/check_docs_drift.sh).
  • [ ] Poison-row dead-lettering for sync apply. Wire the unused _sync_log.error_message column; skip-and-mark after repeated failure; surface a count in sync_health().
  • [ ] Atomic artifact+sidecar commit. .sync / .projection_mode are written after the .pggraph rename (persistence.rs:615-622) — crash window pairs a new artifact with a stale watermark. Also add parent-dir fsync after rename (manifest path already does this).
  • [ ] Truncation signal in traversal results. max_nodes/max_frontier caps return partial results indistinguishable from complete ones (bfs.rs:304-324); shortest-path truncation can yield a false “no path”. Add a truncated column / error contract.
  • [ ] Known-issues row for mutable_overlay production status. Roadmap admits it needs verification + benchmark signoff; the limitations register says nothing and the quickstart offers mutable with no caveat.

P2 — Performance follow-ups (benchmark-driven)

  • [ ] Stop cloning tenant state per traversal — borrow tenant_membership/tenanted_table_oids in BfsConfig (engine.rs:733-737).
  • [ ] Empty-overlay fast path: short-circuit traversal_edge_overlay/layered-provider assembly when edge buffer + tx delta are empty (engine.rs:725,816-871); prerequisite for “hybrid reads at CSR speed”.
  • [ ] Per-generation load validation cache. Full-file CRC + full content walk on every backend’s first query (persistence.rs:312-408,773) likely dominates the known ~4.4 s first-backend cost; validate once per artifact generation instead.
  • [ ] Clamp frontier pre-allocation to min(max_frontier, node_count) (bfs.rs:248,362,510).
  • [ ] Weighted shortest path over overlays — extend Dijkstra to the layered neighbor source so writes stop disabling weighted queries (engine.rs:966-980). (Also a mode-design prerequisite, see doc 02.)

P3 — Hygiene & docs

  • [ ] Bump README_zh.md to 0.1.8 (currently 0.1.5 badges/pulls, lines 18/95/100/162) and add version parity to check_docs_drift.sh.
  • [ ] Move resolved KI rows (KI-001/002/003/011) out of “Next Update Scope” into a resolved section; de-duplicate KI-005.
  • [ ] Builder table-name resolution parity: use the OID-stable regclass path hydration uses instead of raw format! names (builder.rs:341,478-482) — search_path stability at build time.
  • [ ] Document little-endian-only mmap format and add a cfg!(target_endian) guard (edge_store.rs:508-509, node_store.rs:321-445).
  • [ ] Unify the two overlay systems (legacy edge_buffer vs durable segments) per the direction in 02-dual-mode-design-proposal.md — larger refactor; roadmap-owned.

Mode-design work (see 02-dual-mode-design-proposal.md for detail)

  • [ ] Phase 1 prerequisites: ingest lock, sync-log retention, dead-lettering (items above).
  • [ ] Phase 2 “live” mode: auto-maintenance consuming the existing sync_health() recommendation booleans; require persistence for mutable_overlay builds; weighted paths over overlays; benchmark signoff; consider relaxing the mutable_enabled double gate.
  • [ ] Phase 3 hybrid: projection_mode = 'auto' policy layer (escalate apply/compaction cadence and optionally mode on write pressure), with the empty-overlay read fast path making clean generations read at CSR speed.
  • [ ] Phase 4: background pre-applier; WAL/logical-replication sync to remove trigger overhead for high-write tables.