# 2026-06-14 — world-view zoom level Continues 2026-06-13. Floor enrichment was shipped + verified live (library 0.1.10, broker 0.1.37, worlds 0.17.19, agent 0.12.43). Fritz picked the next phase: **world-view zoom level** (the deferred zoom level 2). Demo links in world-a/index.md kept (legitimate related-links footer; floor edges stay live). ## World-view zoom BUILT (branch feature/world-view-zoom) The floor one zoom in: a world's catalog as top-level directory clusters, each a labeled hub with its top-importance docs orbiting + a "+N more" aggregate that opens the dir's listing pane. SSR SVG (canvas island still unspent). Decision recorded in plans/reading-room.md §"World-view zoom level". Gate green (./pre-commit.sh). NOT committed (Fritz commits). **Load-bearing decision: world map = the floor kind `u` WITH a World set.** No new pane kind — bare `u` = universe floor (unchanged); `/u/` = that world's map (the same component, one zoom in; ADR 0005 decision 4). Parallels `/d/` and `/g/` (trailing slash, empty value). `paneAddrFromParts` gains a `u` case; `paneChunk` emits `u` for World=="" and `/u/` otherwise. Single source of truth holds — both decoders share it. **Reached by:** the floor's world cluster node now zooms to `/u/` (was `/d/` stacks). Stacks stay one click away via the world map's dir aggregates. Plus a margin "map" affordance (next to "graph") so the world view is reachable from any doc, not only the floor. **Architecture (hexagonal):** - `domain.WorldMap{World, Clusters, Edges}` + `WorldCluster{Dir, Docs, More, ListPath}`. - `service/worldmap.go`: `WorldMap`/`WorldMapCached` (per-world cache mirroring floorCache; focused-live policy), `worldClusters` (group by top-level dir, root first then alpha; per-cluster top-N labeled, rest → More), `topDir`, `intraWorldEdges` (observed map ∪ hub graph, host→name joined, filtered to labeled nodes only — an edge can't point at an undrawn node). Catalog read is the page; world identity + edges are best-effort enrichment. - Inbound port grows `WorldMap`/`WorldMapCached`. - `web/worldmap.go`: `WorldMapPage` (permalink `/w/:world/u`), `worldMapPaneView` (trail-aware), `worldMapSVG` (grid of dir clusters, two-pass: positions → edges → nodes). Node hrefs continue the trail (doc → `/d/`, hub/aggregate → `/d//` listing). - Edges: the floor drops intra-world edges (worldEdges skips same-world); the world map is where they belong. Drawn only between two labeled nodes. **Tests:** service (cluster grouping + aggregate, topDir, intraWorldEdges join/ filter, assemble+cache, best-effort enrichment); web (SVG nodes/edges/aggregate/ escape/empty, focused-live, permalink uses /w/ routes, error tombstone, trail round-trip for bare `u` + `/u/`). Floor test updated (world node → `/u/`). **Docs (decision 14):** docs/trail-format.md updated with the `/u/` chunk. The in-universe trails.md twin updates at DEPLOY time (it describes live behavior) — same as last phase. ### Files - new: internal/core/service/worldmap.go (+_test), internal/adapter/inbound/ web/worldmap.go (+_test) - edited: domain/document.go, core/port/port.go, core/service/reading.go; web/trail.go, trail_handlers.go, floor.go, reading_handlers.go, reading_routes.go, templates/content.html, templates/page.html; floor_test.go, trail_test.go, reading_handlers_test.go; docs/trail-format.md ### Next (after Fritz + CodeRabbit) 1. Commit + PR; address review; merge → library auto-cut (will be 0.1.11). 2. Deploy: bump apps/demarkus-library applicationset.yaml targetRevision + image.tag to the new version. No broker/worlds/agent change (reader-only, reuses mark_worlds + lookup). DEMARKUS_HUB already = root. 3. Update in-universe mark://soul.demarkus.io/.well-known/library/trails.md with the `/u/` chunk (kept in sync with docs/trail-format.md). 4. Browser smoke at library.knowledge.demarkus.io: floor → click a world → world map renders (dir clusters + aggregates); a doc margin "map" link opens it; aggregate → listing pane.