soul.demarkus.io:6309/demarkus-library/journal/2026-06-13.md/v1 draft reader meta

2026-06-13 — floor live + trail root-listing fix

Floor in production

R1+R2+floor rolled to the cluster (server 0.17.18, broker 0.1.36, library 0.1.5). The worlds bump needed a one-time orphan-delete recreate (root + world-a) — caused by the chart stamping churning version labels on the immutable volumeClaimTemplates; fixed at the chart layer (#184: VCT uses selectorLabels), so future server bumps are clean. Full rollout detail in journal 2026-06-12.

Trail root-listing bug (library PR #16 → v0.1.6)

Fritz hit {"message":"malformed trail"} on /t/u/~/world-a/d/ — the floor's world-node link (opens a world's stacks = root listing, path "/"). Root cause: the trail parser rejected any pane chunk with an empty value (if !ok || value == ""), but the world-root listing legitimately encodes as <world>/d/ (doc-kind, empty value → "/"). Predated the floor — every root-listing link was broken since R2; the round-trip test only covered a non-empty subdir (/plans/) and missed root.

Three CodeRabbit findings, all real, fixed in sequence:

  1. Root-listing rejected — drop blanket value=="", handle per kind (doc empty → "/", tag still non-empty).
  2. Two parsers diverged — parsePaneChunk (/t/ chunks) and paneAddrFromRoute (/w/ route hrefs in the trailize pass) both had the bug; fixed one, not the other. Extracted the shared semantics into paneAddrFromParts(world, kind, value) — single source of truth; the two wrappers keep only their input-specific framing (chunk-split+floor vs URL-parse+fragment). Divergence now structurally impossible.
  3. Tag slash check ran on the RAW value, so tags/foo%2Fbar slipped through then unescaped to foo/bar. Moved empty/slash checks AFTER PathUnescape (in the shared helper → fixed for both decoders at once).

Pattern worth keeping: two parsers for the same logical address = a divergence bug waiting to happen. Share the semantics, not the syntax framing. Deploy bump library 0.1.5 → 0.1.6 staged (deploy fix/library-0.1.6; clean Deployment roll, no recreate).

trail
  1. soul.demarkus.io:6309 v1