FactsPack combines schema-once tabular streams with dictionary interning. This roadmap that delivered v0.3 / agent-v5 was adversarially reviewed three ways — by Claude, Codex, and Antigravity. The review found the v0.2 foundation has contract bugs the roadmap was about to build on. The honest path: repair the contract, prove the core claim with a real benchmark, then add features one measured delta at a time.
This page is the dated review record that preceded the release. Since 2026-06-13: the Gate-0 contract repairs landed; byte-determinism is proven and shipped (canonical POSIX paths, content-addressed snapshot id); the agent-v5 wire (opt-in typed columns, corpus tag, ; caps/types/gschema) and the master/diff chain (~84% smaller diff in the measured case) are implemented and tested; and the P0.1 benchmark has been run — ~38% fewer tokens than records-JSON (up to 54% vs HTML) and 98.2% retrieval accuracy tied with JSON in a single-model pilot (Claude Sonnet 4.6, 8 repos), with the ≥3-model benchmark still pending. Read the "Unknown / pending" states below as the open questions at review time — now largely answered on the live page.
Every later stage depends on the one before it. Chain work — the unique economic moat — comes last, because it cannot be built on a contract that two conformant readers resolve differently.
Fix the contract bugs below. No new normative tables until the wire is self-consistent and byte-determinism is proven (not assumed).
Byte-exact fixtures + positive/negative vectors a strict decoder enforces. Independent lossless round-trip oracle.
Private, statistical benchmark: does interning + legend beat JSON / Markdown-KV on a real code map? Publication is owner-gated.
Admit Wave-1 items one at a time, each behind a measured delta that clears a pre-registered confidence interval.
Prove stable, deterministic symbol identity, then build the master/diff chain on top of it.
Only the three points below are measured: they come from a published third-party retrieval benchmark (GPT-4.1-nano, 1,000 synthetic records — not code maps). FactsPack's position is deliberately not plotted: where .pack lands is exactly the question P0.1 exists to answer, and inventing a coordinate would be the fabricated precision this review removed. The aim is the top-right quadrant; whether the legend gets it there is unproven.
Lack of local keys and positional relationships causes attention heads to misalign nodes/edges, degrading graph retrieval.
Repeating keys provide explicit context, but the excessive repetition results in massive, costly token bloat.
Highly structured markdown layout is easy for models to comprehend but uses an unsustainable token budget.
The published evidence puts CSV/pipe-delimited at the bottom of retrieval accuracy — columns with no repeating labels add an indirection layer. .pack shares that density (plus interning), which is the risk P0.1 must test, not a settled result. The cited graph-distance "6×" figure is from synthetic graph QA, not code maps.
The in-band legend, explicit types, and incident edge ordering are hypothesised to cancel the density penalty while keeping interning's token savings. Plausible, evidence-informed — but unproven on a code map until measured. The honest claim is a hypothesis, not a coordinate.
We split the transition into four distinct stages: Strategic Foundations (P0) to secure credibility, Wave 1 compatible extensions, Wave 2 breaking upgrades, and Wave 3 ecosystem scaling.
0x09 (verified) — regenerate them from byte-exact fixtures with a visible <TAB> view.
rowCount=0 contradicts the trailer's "rows == header count" rule. Define master / diff-sentinel / op-count as separate quantities; enforce equality for masters only.
.pack vs JSON / CSV / Markdown-KV / TOON across 3+ model families on a real code map, with pinned models, fixed temperature, and pre-registered confidence intervals — gate on the lower CI bound, not the mean. Publication is owner-approved only.
; comment lines (e.g. ; types symbols id=int) so legacy readers ignore them. Scope to storage-form specials the prose legend can't disambiguate; the borrowed "+20%" figure is dropped pending measurement.
; lines).
; end rows=... sha256=...) to prevent truncated payloads from misinforming agents.
F12~cli.ts) to prevent lookup errors.
\t \n \\ escaping is real defense. Wrapping a pack in XML tags is a prompt-structuring tip, not injection armor — a cell containing </tag> can close it. The real defenses are tool-side decode, instruction-taint tracking, and model alignment.
Three advanced coding agents—Claude Code, OpenAI Codex, and Antigravity—cooperatively define the FactsPack v0.3 / agent-v5 standard. We respect each agent's native constraints, reasoning styles, and execution frameworks to deliver a unified, high-performance transport standard.
paths tables to bypass multi-hop traversal reasoning decay.\t, \n, \\) — this is the load-bearing defense against column-splitting and grammar injection. XML wrapping is offered as an optional prompt-organization aid; it is explicitly not an injection boundary (a cell can contain a closing tag), and must never be labelled "shielded" or "bulletproof." Defense in depth is tool-side decode + instruction-taint tracking + treating every cell as data.
+/x delta operation, and a chain must not mix modes unless both provably emit byte-identical keys. A probabilistic match is not a primary key.
Three independent reviews converged on the same risks. Below are the mitigations for the design-level risks; the source-verified findings that follow are confirmed against the actual codec and spec bytes — those are bugs, not hypotheses.
& schema line (e.g. id:int) crashes or misleads legacy v0.2 readers.Mitigation: In Wave 1, datatypes MUST be declared in standard comment lines (e.g. ; types symbols id=int) which legacy readers ignore. Defer inline type tokens to Wave 2.
communities.Mitigation: Emitters must append new tables after core v0.2 tables. Test suites must validate that legacy parsers silently disregard unknown trailing tables without allocating heap memory.
Mitigation: Define a Dual-Mode Symbol Indexing Spec: use Strict SCIP in CI/CD, but provide a heuristic AST/Regex-based Lite Fallback for build-free local environments.
Mitigation: Enforce a Coalescing Threshold. If a diff chain exceeds 5 files or 20% of the master pack's size, rebuild a new unified master pack immediately.
</> can close tags prematurely.Mitigation: Escaping of delimiters (\n, \t, \\) in text cells. Offer XML tags for prompt organization, but enforce tool-side decoding, instruction taint tracking, and model-level alignment.
Mitigation: Pin master+chain once at session start (immutable prefix); deliver later updates as chronological messages appended after the conversation. A latest.manifest orders diff hashes — this improves cache stability but cannot guarantee hits (floor/TTL apply).
rowCount=0 conflict with the trailer's requirement to match decoded records.Mitigation: In v0.3, define separate quantities: header rows (materialized baseline count), header ops (patch operations count), and trailer records (physical transmission lines).
Mitigation: Output warnings for lossy conversions and explicitly warn developers that tabular flattening is lossy for complex nested JSON structures.
Mitigation: Enforce strict validation, rejecting v0.2 packs that omit the `; end` trailer unless compatibility is explicitly configured.
These were checked against the actual codec and spec bytes by two independent reviews — they are confirmed defects, not design opinions. The first four block Gate 0.
FACTSPACK.md:81 mandates tab 0x09, but the worked examples at :241 and :272 contain zero tabs (all spaces). The decoder splits strictly on \t — copy the spec's own "lossless" example and it is rejected.
Fix Generate docs from byte-exact fixtures; show a visible <TAB> companion; decode-and-reencode every normative example in CI.
A diff has header rowCount=0 ("patch only") but the spec demands trailer rows == header count when not -. 0 ≠ -, so the rule requires 2 == 0. The shipped decoder silently never enforces it — so the "cite or refuse" integrity contract is a no-op for the exact file the chain emits per commit.
Fix Separate named quantities: master header = baseline count; diff header = 0 sentinel bound to kind=diff; trailer = physical op count; equality required for masters only. Block the chain until fixed.
A trailer-less pack returns success; the decoder cannot tell a legitimate v0.1 pack from a truncated v0.2 one, and never validates header.rowCount. The spec says v0.2 consumers MUST verify the trailer is present — the decoder doesn't.
Fix Explicit strictV02 vs legacy profiles; strict requires trailer + header + kind-legality + duplicate rejection + resource limits.
The test oracle maps literal - → − (U+2212) and counts the lossyDash cases as pass under a lossless label. It normalizes away the exact loss it should catch. "15/15 pass" is smoke coverage, not a round-trip proof.
Fix Independent exact round-trip oracle; reject ambiguous input with a precise error rather than normalizing it green.
The cache moat rests on "same input → same bytes," but float formatting (imp=0.0242 — digits? rounding?), dict-key order, free-form legend wording, and Windows-vs-POSIX path separators (this repo is win32) are unpinned with zero conformance test. If any varies, the moat is already broken.
Fix Make canonicalization normative incl. number formatting and path normalization; add a cross-platform determinism conformance test before selling the cache story.
The current branch parses .pack from untrusted GitHub repos on Workers. A pathological pack (billions of forward @ refs) exhausts memory before the sha256 trailer is reached — whole-file dictionary resolution is post-parse. The adversarial corpus lists poisoning but not resource exhaustion.
Fix Configurable caps on bytes, lines, rows, columns, tables, dictionary entries; add resource-exhaustion cases to the corpus.
This replaces the old impact calculator, which rendered unmeasured feature weights as precise percentages — the exact fabricated precision this review removed. Every claim below carries an honest evidence state. No score is invented; an unknown stays unknown until P0.1 measures it.
\t \n \\
Measured
Keep
Shipped and real. This — not XML wrapping — is the load-bearing injection defense at the grammar level.
summary column must be cut from the hashed wire, and the heuristic label needs an exact tie-break.
; types to storage-form specials; gate the rest on a measured delta.