# ALT Direction-Split Potentials — Research Handoff **Status:** OPEN EXPERIMENT — deliberately deferred from Phase 8 (2026-10-25) **Purpose:** a self-contained document so the direction-split experiment can be picked up — by us, a fork, or a different LLM/harness — and solved *straight away* without re-deriving any of this. **Author context:** distilled from Phase 8's campaign, debug session `.planning/debug/alt-potential-4x-slowdown.md`, and the verification record. All numbers below are MEASURED on this repo's gates/benches, not estimated. --- ## 1. Problem statement The routing engine (`routing/src/`) runs **bidirectional A\* (BH, Ikeda shared-average construction)** over a CSR road graph. ALT landmark potentials were integrated (Phase 8) and made *sound* via the F1 clean-columns law, but on the real KL binary **0/24 landmark columns are sentinel-clean** (a 6,285-node disconnected island makes every to-column carry a `0xffff` cell), so sound ALT degrades to haversine in production. The **direction-split question**: can the potential use BOTH table families soundly — `h_f` from to-tables (forward search), `h_b` from from-tables (backward search) — with a re-proven meet rule, and does that reach the free-plan CPU budget? ## 2. What is already proven / shipped (do not re-derive) | Fact | Evidence | |---|---| | toTable triangle bounds are one-directional Lipschitz: the u-side term needs the reverse edge; a oneway doesn't provide one. Two-sided mixing inside the shared Ikeda average `p = (h_f − h_b)/2` is INCONSISTENT on graphs with oneways. | D-03 gate's Rule-1 catch: suboptimal routes x038 (1234.6 s vs 1214.8 s oracle), x045 (1475.5 vs 1460.6) | | F1 containment (SHIPPED, commit `2a5a0b5`): per-graph WeakMap `cleanColumnsFor`; per-search `activeL` = clean columns only; `bound()` has NO per-node sentinel branch (inline `=== 0xffff` compares are BANNED — A11 pins this). Consistency violations went 334 fwd / 11,369 bwd → 0. | routing 82/82; oracle sweep 0/200 | | Tables are triangle-exact (0 violations in an all-edges unit-correct sweep) — the bug was always the per-node family switching, never the data. | debug session bench5 | | The tables PRUNE WELL: unidirectional control with these tables = **0.59× expansions** of haversine-only. The data is good; the BH configuration eats it. | debug bench (uni control) | | The BH shared-Ikeda average FLATTENS the composite bound: expansions INCREASED +15.7% with ALT (66,286 → 76,671/route; +51% on mid-valley→bukit-bintang) despite the bound being pointwise-tighter on 99.7% of nodes. | debug bench7-class runs | | Costlier nodes, not fewer nodes, dominated the regression: each `bound()` = 2 passes × 24 scattered u16 reads, row-major `[ℓ·n+v]` (622 KB stride) into a 14.9 MB table > 12 MB L3 → ~2.5 µs/node (vs 0.31 µs transposed, 0.26 µs 2× haversine). ~85% of the delta. L=32 worse than L=24 because reads scale with L. | debug microbenches | | F2 (transposed toTable `[v·L+l]` + merged single-pass): mean 332.7 → **197.3 ms (−41%)**, bit-identical potentials, NOT shipped (out of scope — only useful for future clean-column binaries). | debug bench (F2) | | Pre-ALT band: bidirectional A\* + haversine, p95 ≈ 38 ms on the campaign host (~107–152 ms on slower hosts — host-relative; gate = p95 8 ms budget, free-plan Worker ceiling 10 ms). | `routing/scripts/measure-route-cpu.mjs`, D-04 extended verdict | **Shipped posture today:** toTable-only steering (sound), clean-columns containment, haversine max-fallback, ALT live in the suite (A12/A13) and inert in production. Optimality: D-03 gate + 200-pair oracle sweep, both green. ## 3. The theory gap — what must be proven ALT's correctness inside BH requires the potential pair to satisfy the Ikeda condition (the average `(h_f − h_b)/2` is consistent iff both families are *two-sided* consistent). With sentinel fringes, to-tables and from-tables each carry holes in DIFFERENT places, so any two-sided combination needs either: - **P-1 (per-direction consistency):** `h_f` built ONLY from to-tables, `h_b` ONLY from from-tables, each individually consistent across every relaxable edge. Sentinels inside ONE direction must degrade that direction's bound at that node (to haversine max-fallback) WITHOUT changing the active family set mid-search (the F1 lesson — per-node ℓ-masking is banned; the skip must be search-scoped per direction). - **P-2 (the meet rule, THE hard part):** BH's stop rule (`μ + top_f + top_b ≥ bound`) is proven for symmetric-consistent potentials. Direction-split potentials break the symmetry — re-prove (or re-derive) a sound stopping criterion for the asymmetric case, OR prove the standard condition still holds under the split. Get this wrong and routes are silently suboptimal (the exact bug class D-03 was built to catch). - **P-3 (optimality, empirical):** the 200-pair seeded Dijkstra-oracle sweep (`routing/scripts/measure-astar-oracle-sweep.mjs`, seed `0x08f1`, |Δ| both directions) must show 0 violations; A1's 625-pair fixture equivalence stays green. - **P-4 (steering, empirical):** expansions with direction-split ALT < expansions haversine-only, on the extended 100-pair seeded verdict — this is where the 0.59× uni prize must survive the bidirectional setting. ## 4. Constraints (non-negotiable) - Optimality non-negotiable: admissibility/consistency proofs precede any speed claim - $0 runtime (free-plan Worker); JS typed arrays; pure modules (no I/O in routing/src) - The ARG2 layout may gain fields (ARG3) if needed — but one decode path, fail-honest, exact-size law (D-01 family) - Named constants; print-the-measurement gates; honest FAIL records (no retirement theater) - The phase-8 "untouchable lines" (stop rule/reductions/alternation) are untouchable WITHIN phase 8 — a direction-split experiment's whole point is re-proving them; that work belongs in its own phase with its own gates ## 5. Candidate approaches to experiment with - **A. Direction-split + meet-rule re-proof** — the mainline (Section 3). Highest prize, highest proof burden. - **B. Unidirectional ALT** — drop BH for the ALT path: uni control already measured 0.59× expansions; simpler correctness (no meet rule); cost: lose BH's radius-halving. Measure both bands. - **C. BH with per-direction haversine + ALT only as a unidirectional pruning filter** — hybrid: prune the unidirectional side's frontier with table bounds while BH runs haversine. Correctness via dominance, not potentials. - **D. Min-combination variants** — the Ikeda average is one of several consistent combinations; `min(h_f-bound, h_b-bound)` asymmetric forms have literature precedent (need the consistency proof for the chosen form). - **E. Different L / quantum / column-hygiene binary** — rebuild with anchors chosen so more columns are sentinel-clean (e.g., anchors constrained to the giant SCC's "well-connected side") — changes the DATA to fit the algorithm instead of the reverse. ## 6. Verification assets (all exist, all re-runnable) - `routing/scripts/measure-astar-oracle-sweep.mjs` — 200-pair fresh oracle (the gate that catches suboptimality fixtures can't) - `routing/scripts/measure-optimality-gate.mjs` + frozen `routing/test/fixtures/alt-baseline.json` — D-03 - `routing/scripts/measure-route-cpu.mjs` (+ `--extended`) — the CPU verdicts - `routing/test/astar.test.mjs` — A1 (625-pair equivalence), A9–A13 (containment/island/structural) - The debug session's bench harnesses were throwaway (/tmp) — re-derive per Section 2's calibration method (within-session ratios only; hosts differ ~7×) ## 7. Success criteria for the experiment 1. A written proof (or literature citation + adaptation argument) for P-1 and P-2 BEFORE implementation 2. Oracle sweep 0/200 + A1 green + full battery 3. Expanded-measurement: expansions ratio AND p95 vs haversine-only, same seeded pairs 4. Honest verdict: p95 under the 8 ms budget on the free-plan host class → a real phase proposal; documented shortfall → the wall is proven, CH remains the lever, this document gets its closure record --- *Research handoff written: 2026-10-25 (Phase 8 close; lever decision: CH as Phase 08.1)*