Handoff · Zettel: why tablecloth defaults to SMRF over CSF

2026-09-04 · for the next agent session (note-writing task) · generated by Claude Fable 5.1

Continuation target

Write one atomic Zettelkasten note in Miro's vault capturing why the tablecloth point-cloud ground filter ships mechanism=smrf_numpy as the production default and keeps csf_cloth as an opt-in A/B path. One idea per note: the choice was made on controllability and lip safety, not on compute cost, and the empirical gate that would promote CSF was never run. Link it to the neighbouring notes (tablecloth, SMRF, CSF, AI3D-337 slope gate, pavement-lip constraint) and cite the primary sources listed below.

Current state

The decision, distilled (source material for the note)

Write this in your own words; the bullets are facts, not prose to copy.

What was decided (v1 plan, locked 2026-07-17)

Why (in the plan's own priority order)

  1. Lip-first acceptance. The hard requirement is preserving a 1 to 2 cm curb lip or flush shoulder that the downstream asphalt-edge detector needs. SMRF's parameters map directly onto that scale: cell_m=0.20, max_elev_diff_m=0.05, slope_threshold=0.15, smrf_max_window_m=3.0. CSF's class_threshold is a distance to a simulated cloth whose shape depends on cloth_resolution, rigidness, time_step and iteration count, which is harder to reason about at centimetre scale. Plan wording: "production must be lip-safe".
  2. Concave terrain. A cloth is a stiff lower envelope; it tends to bridge ditches, trenches and the foot of a curb, and on steep grades needs the upstream bSloopSmooth post-process. SMRF's progressive opening with a slope-scaled tolerance follows those features. This is a design argument in the plan, not a measured result.
  3. Extensibility. SMRF exposes an explicit surface and, since AI3D-337, its gradient. That enabled the slope-scaled gate (elev_scalar), seed-grid edge padding (smrf_edge_pad_enabled) and pit filling. CSF is a black box with six parameters.
  4. Reproducibility and dependencies. Plan wording: "reproducible without native wheels". SMRF is pure NumPy/SciPy and bit-deterministic. CSF is a compiled wheel and was observed (2026-09-04, Opus review probe) to produce slightly different masks on repeated runs over identical input.
  5. No PDAL. Both paths were chosen to avoid PDAL, which could not be installed locally or in CI. This ruled out PDAL's SMRF implementation and motivated the NumPy re-implementation.

What the decision was not based on

Trivia worth one line

Evidence table (for the note's "sources" footer)

ClaimSourceStatus
SMRF default, CSF optional, promotion gatedocs/plans/v1-implementation-plan.md "Key decisions (locked)", "Why CSF is optional / off by default"verified
Lip-first priority and thresholdsREADME "Pavement-lip constraint"; config.py defaultsverified
No PDAL locallyv1 plan "Why not PDAL"verified
Slope gate, edge pad built on SMRF surfaceAI3D-337 plan page (URL below); ground.pyverified
Timing 0.41 s vs 0.20 s, 99.7% agreementFresh measurement 2026-09-04, script reproduced belowmeasured once
CSF nondeterministic run to runOpus review probe 2026-09-04 (main-vs-main masks differed)observed, not characterised
Cloth bridges ditches / curb footDesign argument in v1 plan; general CSF literaturenot measured on this data
Segment 65 gate never run; no CSF results anywhereAll out/*/run_summary.json and /home/ai/ai3d-ab/*/run_summary.json show smrf_numpyverified

Timing script used (run from the tablecloth repo, needs the CSF extra):

uv run --extra csf python - <<'EOF'
import time, numpy as np
from iolabs_point_cloud_tablecloth.config import load_config
from iolabs_point_cloud_tablecloth.ground import classify_ground
src = "/home/ai/dev/3dai.lanefinder/data/00_external/260416_Abschnitt_4_5/lane_points/segment_071/25-9166-A4-5Record002_run3_points.npz"
pts = np.load(src)["points"].astype(np.float64)
for mech in ["smrf_numpy", "csf_cloth"]:
    cfg = load_config({"mechanism": mech, "elev_scalar": 1.25, "smrf_edge_pad_enabled": True})
    t = time.perf_counter(); kept = classify_ground(pts, cfg)
    print(mech, f"{time.perf_counter()-t:.2f}s kept={kept.mean():.3f}")
EOF

Key artifacts

Next steps

  1. Locate the vault and its conventions: ID scheme (timestamp vs Luhmann), frontmatter fields, tag style, link syntax. Find the existing note "Tablecloth slope-handling deep research" and mirror its format. No .obsidian directory was found under /home/ai, /mnt/c/Users or /mnt/d at depth 4 on 2026-09-04, so ask Miro for the path if it is not obvious.
  2. Draft the note. Suggested skeleton: title as a full-sentence claim ("Tablecloth defaults to SMRF over CSF for controllability and lip safety, not compute"); one paragraph stating the claim; the five reasons as short bullets; a "what would change this" line (run the segment 65 lip gate, or an SMRF-vs-CSF A/B on segments 066/071); links to neighbour notes; sources footer from the evidence table; date and origin.
  3. Keep it atomic. Anything about the AI3D-337 slope gate itself, the PLY export, or CSF's cwd side effect belongs in separate notes; link, do not inline.
  4. Mark inferred vs verified claims exactly as the evidence table does. The "cloth bridges ditches" argument and CSF nondeterminism are not measured on this data.
  5. Optionally verify the two literature citations with the research skill before filing.
  6. File the note, update any index or map-of-content note, and report the note's ID and path.

Risks and open questions

Suggested skills