Contents
Suggested Secondary Todo List
Date: 2026-07-16
Source: 01–04 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 concurrentapply_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_logretention/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_messagecolumn; skip-and-mark after repeated failure; surface a count insync_health(). - [ ] Atomic artifact+sidecar commit.
.sync/.projection_modeare written after the.pggraphrename (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_frontiercaps return partial results indistinguishable from complete ones (bfs.rs:304-324); shortest-path truncation can yield a false “no path”. Add atruncatedcolumn / error contract. - [ ] Known-issues row for
mutable_overlayproduction status. Roadmap admits it needs verification + benchmark signoff; the limitations register says nothing and the quickstart offersmutablewith no caveat.
P2 — Performance follow-ups (benchmark-driven)
- [ ] Stop cloning tenant state per traversal — borrow
tenant_membership/tenanted_table_oidsinBfsConfig(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.mdto 0.1.8 (currently 0.1.5 badges/pulls, lines 18/95/100/162) and add version parity tocheck_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_buffervs durable segments) per the direction in02-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 formutable_overlaybuilds; weighted paths over overlays; benchmark signoff; consider relaxing themutable_enableddouble 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.