| Decision | Choice | Why |
| Slope mechanism |
Option A — per-point threshold max_elev_diff_m + elev_scalar · |∇surface|, gradient bilinear-sampled at each point |
Literature-standard (Pingel 2013 / PDAL SMRF, PDAL default scalar 1.25); O(grid) memory; research-verified as the right fix |
| Default value |
elev_scalar = 0.0, bit-exact legacy path (the 0.0 branch short-circuits to the exact current expression) |
Safe rollout; default-on only after A/B on real segments |
| Where the gradient lives |
New grad grid field on frozen SmrfSurface, computed in _finalize_smrf_surface after the opening loop |
In-memory and streaming both flow through _finalize_smrf_surface + classify_against_surface → streaming parity holds by construction, no forked paths |
| CSF quick win |
New csf_slope_smooth: bool = true wired to params.bSloopSmooth (exact upstream typo), hasattr-guarded like interations |
Upstream C++ default is true, so default matches today's untouched behavior; CSF extra isn't installed locally, so upstream default is the best available reference |
| Option B (morphology loop changes) |
Deferred — only as a contingency if A cannot pass the steep fixtures |
Handoff explicitly says don't do it preemptively; slope_threshold=0.15 is tuned for curb-vs-wall on flat ground |
| Process |
Strict TDD: fixtures + failing tests first, watched to fail for missing-feature reasons, then implementation |
The steep-fixture failure mode needs empirical confirmation (see uphill-edge analysis below); tests are the spec |
| Execution model |
One Workflow run: Grok 4.5 (cursor) → GPT-5.6 Sol (codex) → Opus/Sonnet/Grok/Sol review panel → Grok fix; Claude fallbacks per stage; Fable orchestrates, verifies, commits, opens draft PR |
Requested multi-model split (incl. Sol as extra reviewer, per Miro); Grok tokens free today; nobody but the orchestrator commits |