Skip to content

Solver: real harbor-to-harbor routes return 'unreachable' despite connected mask (blocks Flensburg→Marstal acceptance) #20

Description

@DocGerd

Found by E4's first real-data end-to-end browser smoke (real Open-Meteo wind, real mask.bin, real polars):

  • Flensburg → Marstal: unreachable
  • Flensburg → Glücksburg (~6 nm, deep well-connected fjord): unreachable
  • Trivial open-water hop with no coastline nearby: succeeds

The mask itself is NOT disconnected: verify_mask.py's flood-fill gate (PR #8) proves both harbor snaps reach the open-water body at 3.0 m. So the failure is in how the isochrone solver expands against real coastline geometry — never exercised before, because all Phase B tests use synthetic masks (open water, blob islands, wide channels) and the property suite generates blob scenarios.

Working hypotheses (to be verified, not assumed)

  1. Step length vs channel width: isochrone time-steps at sailing speed produce ~0.5–1 nm candidate segments; inside a ~200–400 m-wide fjord head every candidate heading's segment crosses land within one step → all candidates die at the first expansion (segmentNavigable correctly rejects) → blockedDeathsunreachable.
  2. Heading quantization: the candidate TWA set may be too coarse to thread a narrow channel even where a segment could fit.
  3. MAX_FRONTIER truncation (documented-silent, see PR Phase B: routing domain core #5 notes) discarding the few candidates that do survive in constrained water.
  4. Snap-to-cell-center placing the start deep inside the harbor pocket where hypothesis 1 bites hardest.

Impact

Blocks the core product promise and the spec's Flensburg→Marstal manual acceptance test. Phase E UI work continues (rendering verified with open-water plans), but this must be fixed before Phase F acceptance.

Investigation in flight: Node-side repro against real assets, death-counter/frontier instrumentation, root-cause report with fix options before any solver change.

🤖 Generated with Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions