Skip to content

ID-132 SPEC — /okf Concepts landing — full-bundle file explorer (amended {132.31}, S457 OQ-LAND)

ID-132 SPEC — /okf Concepts landing (full-bundle file explorer)

Section titled “ID-132 SPEC — /okf Concepts landing (full-bundle file explorer)”

Kind: Spec slice — a standalone, ratifiable PRODUCT-level slice that owns the path from the id-118 reserved “Concepts” nav slot to a real, rendered /okf landing. It does not implement; it defines numbered, testable landing invariants (LI-N) the Orchestrator can ratify and later dispatch implementation from ({132.32}). Authored: 09/07/2026 · Task Planner (fresh dispatch, subo-id132 wave 2, {132.26}). Amended {132.31} per S457 OQ-LAND ratifications: 11/07/2026 · Task Planner (fresh dispatch). The four owner-ratified OQ-LAND rulings (below) turned this from a single-bundle index.md render into a full-bundle file explorer over ALL bundles. Reshaped LI-1, LI-3, LI-4, LI-5, LI-6, LI-13 and added LI-14..18 to cover: enumerate-all bundle listing (OQ-LAND-1), full-bundle file-explorer tree navigation (OQ-LAND-2), complement-not-replace vs the graph viewer (OQ-LAND-3), and the Streamdown dependency coordination rule (OQ-LAND-4). The former “Open questions” section is now the Ratified decisions (S457) record with a traceability mapping. Existing invariant numbers are preserved (append-only) so external LI-N references do not shift. Ratification provenance to respect (not re-litigate): S456 owner ruling on id-118 BI-8 — the Concepts nav entry ships as a reserved slot for now; {132.26}/{132.31} own the replacement path (ledgers/tasks/ID-132.md:661; ledgers/tasks/ID-118.md:55). Governing rulings: DR-041 (three-zone IA), DR-040 (Streamdown for new markdown surfaces), DR-027 (effective ontology ships in the bundle), DR-016 (client-owned bundle repo — read-only render is coherent). This slice formalises, it does not re-open, any of those.

Empirical-verification note (external-library symbol). This slice cites one external-library renderer, Streamdown (DR-040). Import-and-call / dependency check, 11/07/2026 (re-verified at the {132.31} amendment), against the pinned dependency set (package.json): result = ABSENT. streamdown is not a declared dependency; the incumbent markdown renderer present is react-markdown ^10.1.0 (package.json:117), plus @tiptap/markdown 3.23.4 (package.json:87, editor-side). No components/** or lib/** module imports Streamdown today. This is not a spec blocker — this is a PRODUCT-level behaviour slice and DR-040 is a ratified directive, not a pinned API contract — but it is a load-bearing coordination finding, now ratified as OQ-LAND-4: the implementing subtask ({132.32}) introduces the Streamdown dependency unless a sibling id-135 subtask lands it first. Coordination rule (OQ-LAND-4, ratified): whichever of id-132/id-135 lands first brings the dep, neither spec may assume the other already has (the S457 verbatim ruling additionally flagged id-118 as a possible dep-introducer; the rule is invariant to which sibling lands first — {132.32} checks package.json at dispatch and only adds Streamdown if still absent). All other symbols cited here are internal Canonical Platform surfaces (import-and-call check N/A).

Code-intelligence orientation (verbatim; repo:'canonical'). Per the Planner code-intel binding rule; tool outputs quoted verbatim and cross-checked against direct file reads.

{132.31} amendment orientation (fresh dispatch, 11/07/2026):

  • gitnexus_query({query:'okf bundle viewer landing', repo:'canonical'})"processes": [], "process_symbols": []. definitions surfaced 20 File-level nodes and no app/okf/page.tsx index-route symbol — confirming no landing exists yet. The surfaced files are the OKF read/write surface: lib/okf/resolve-bundle-root.ts, app/api/okf/[bundleId]/graph/route.ts, app/okf/[bundleId]/page.tsx, hooks/okf/use-bundle.ts, lib/query/okf.ts, components/okf/bundle-viewer.tsx, lib/okf/bundle-graph.ts, lib/okf/okf-document.ts, lib/okf/resolve-internal-link.ts, lib/okf/parse-index.ts, app/api/okf/resource/route.ts, components/okf/bundle-nav.tsx, components/okf/concept-detail.tsx, scripts/cocoindex_pipeline/producer/bundle_writer.py, scripts/cocoindex_pipeline/producer/flow_def.py, .../producer/trigger.py, lib/okf/concept-type-tokens.ts, scripts/tests/test_producer_bundle_writer.py, components/okf/bundle-log.tsx, lib/okf/parse-canonical-uri.ts.
  • gitnexus_context({name:'okf-document.ts', repo:'canonical'})File:lib/okf/okf-document.ts. incoming.imports: sole importer File:lib/okf/bundle-graph.ts (the concept walker). outgoing: {}. "processes": []. Confirms okf-document.ts is the frontmatter/body parser (parseOkfDocument) consumed only by the bundle-tree walker — the render pipeline any file-explorer file view reuses.
  • Direct reads (cross-check) — the file-explorer seams the OQ-LAND-2 scope extends:
    • lib/okf/bundle-graph.ts:81–96 walkMarkdownFiles(root) — a recursive fs.readdirSync(dir, { withFileTypes: true }) tree walk of every .md under the bundle root (sorted), skipping index.md/log.md. This is the existing recursive-walk seam a full-tree explorer broadens (the explorer lists the whole tree, not .md-only — see LI-15/LI-16).
    • lib/okf/bundle-graph.ts:104–129 extractLinks + :117–119 — a path.resolve/path.relative containment guard that rejects ../absolute escapes (rel.startsWith('..') || path.isAbsolute(rel)). This is the traversal-safety seam LI-17 reuses for per-file reads.
    • lib/okf/resolve-bundle-root.ts:20–46 resolveOkfBundleRoot(bundleId) + SAFE_BUNDLE_ID_RE = /^[A-Za-z0-9_-]+$/ — resolves bundleId against the OKF_BUNDLE_ROOT parent dir (one subdir per client bundle), single-safe-segment guard, fail-loud when unset (throws → the [bundleId] graph route 500s).
    • lib/okf/resolve-internal-link.ts resolveInternalMdLink — the client-side internal .md link resolver used by <ConceptDetail> (renders via react-markdown today → the DR-040/OQ-LAND-4 Streamdown swap surface).
    • lib/query/okf.ts fetchOkfBundle/fetchOkfResource + queryKeys.okf (all / bundle(bundleId) / resource(uri), lib/query/query-keys.ts:483–488) — the existing OKF query conventions the enumeration-list + per-file-read keys extend (new members, never a rewrite).
    • ls app/okf/only [bundleId] (no page.tsx); ls app/api/okf/[bundleId], resource. Confirms {132.32} builds the net-new app/okf/page.tsx index route.
  • ccc search fallback: not required — gitnexus + direct read both returned the real surface. No greenfield disclaimer applies.

{132.26} authoring orientation (retained, 09/07/2026): gitnexus_query({query:'okf bundle concepts landing route'}) → no /okf index-route symbol; gitnexus_context({name:'BundleViewer'})components/okf/bundle-viewer.tsx:BundleViewer (40–142), sole caller app/okf/[bundleId]/page.tsx:OkfBundlePage, outgoing BundleNav / ConceptGraph / ConceptDetail / BundleLog / Tabs* / Skeleton. The primary bundle read is app/api/okf/[bundleId]/graph/route.ts (authed; parses index.mdnav, log.mdlog).

Problem. id-118 ratified a Knowledge-zone “Concepts” entry pointing at the “/okf landing” (id-118 PRODUCT BI-4, BI-8). No such landing exists — only /okf/[bundleId] (a rich three-region graph viewer for one named bundle). S456 ruled the Concepts slot reserved: defined in the IA and in id-118’s spec, but not rendered, rather than blocking id-118 on net-new route creation (id-132/id-138 territory). This slice specifies the landing whose existence flips that reserved slot into a real entry — and, per S457 (OQ-LAND-1/2), that landing is a full-bundle file explorer over ALL configured bundles, not a single-bundle index.md render. index.md is the entry into a bundle, not the boundary; the user browses the whole bundle tree.

Non-goals.

  • Replacing / re-speccing the /okf/[bundleId] graph viewer. Per OQ-LAND-3 (ratified: complement, not replace) the landing is additive — an enumerate-and-browse home above and alongside the viewer; the viewer and its API routes are unchanged (LI-13 / LI-18).
  • The bundle hosting mechanism. How bundles are physically synced and where OKF_BUNDLE_ROOT points is ID-134 / {132.12} G-GITSYNC territory (resolve-bundle-root.ts is fail-loud, unset in every environment today). This slice enumerates and reads whatever that mechanism produces under the root; it does not define hosting. (The former OQ-LAND-1 selection question is now ratified — enumerate all, see LI-14.)
  • The human accept/edit/reject review UI (DR-016 / DR-013 shape). Out of scope — id-135-adjacent follow-on. This landing is read-only (DR-016-coherent: read-only rendering over a client-owned bundle git repo).
  • Producer-side flow assembly ({132.23}). This slice specs the consumer of what the producer publishes; the producer contract for index.md/log.md/concept .md/ontology.json is already fixed by landed subtasks ({132.10}/{132.12}) + DR-027 (coordination note below).
  • Rendering ontology.json as human content. Per OQ-LAND-2 (ratified) it is render-excluded (machine-facing JSON) though it may be listed in the file tree (LI-16).

Each invariant carries an inline (per OQ-LAND-N) tag where an S457 ruling drives it; the full traceability mapping is in Ratified decisions (S457) below.

  1. LI-1 (new index route = bundle-explorer home). A net-new index route renders at path /okf (file app/okf/page.tsx; today only app/okf/[bundleId]/page.tsx exists). Navigating to /okf renders the Concepts landing — the bundle-enumeration + file-explorer home (LI-14/LI-15), not a single bundle’s index.md. It does not 404 and does not collide with /okf/[bundleId]. Test: GET /okf (authenticated) returns the landing; /okf/<id> still returns the graph viewer.

  2. LI-2 (authenticated, never public). /okf and its backing data path are authenticated: proxy.ts publicRoutes is not modified, so an unauthenticated visitor is redirected to /login; every server-side data read (bundle enumeration, tree listing, per-file read) re-checks auth.success and routes failure via authFailureResponse(auth) (defense in depth, matching app/api/okf/[bundleId]/graph/route.ts:47–48). Test: logged-out GET /okf → redirect to /login; every new backing route checks auth.success; publicRoutes diff is empty.

  1. LI-3 (data source = bundle working tree, authed server reads). The landing’s data is read from the client-owned bundle working tree on the server via the OKF_BUNDLE_ROOT bridge, never a direct unauthenticated filesystem or client read, and never from api.* records. Three authed server reads back the landing: (a) enumerate the immediate subdirs of OKF_BUNDLE_ROOT (the bundle list, LI-14); (b) list one bundle’s file tree (LI-15/LI-16); (c) read one file’s text for rendering (LI-15, traversal-guarded per LI-17). Reads (b)/(c) extend resolveOkfBundleRoot; read (a) is net-new (enumerates the parent root itself). Any client-side fetch uses TanStack Query exclusively (fetchers in lib/query/okf.ts, keys as new members of the queryKeys.okf namespacequery-keys.ts:483–488), matching the existing viewer. Test: every landing data path flows through an authed server read + a TanStack Query key; no raw fetch in a hook; no Supabase read for concept content.

  2. LI-4 (graceful empty / unconfigured states). The landing degrades gracefully at every level, rendering 200 + a friendly empty state (UK English) — never a 500, blank screen, or crash: (a) OKF_BUNDLE_ROOT unset/blank (the reality in every environment today, resolve-bundle-root.ts:31–41) → “No concepts have been published yet.” (contrast the [bundleId] graph route, which 500s when unset); (b) root configured but no bundle subdirs → an empty bundle list; (c) a bundle with no renderable files (no index.md) → a per-bundle empty state. This is load-bearing: the nav flip (LI-7) surfaces /okf to every authenticated user before any bundle is configured, so the empty state is the first thing most users will see. Test: with OKF_BUNDLE_ROOT unset, /okf renders 200 + empty state, not 500; with a root but 0 subdirs, an empty bundle list; with a bundle lacking index.md, a per-bundle empty state.

  1. LI-5 (Streamdown markdown render — DR-040 / per OQ-LAND-4). Every markdown file the explorer renders (index.md and any concept .md opened from the tree) is rendered as markdown via Streamdown — the DR-040-ratified renderer for new surfaces — not the incumbent react-markdown. Internal concept links ([title](path.md)) resolve within the bundle (reusing the resolveInternalMdLink / bundle-graph.ts:extractLinks containment logic) to another tree file or through to the /okf/[bundleId] graph viewer’s concept selection. Test: the landing’s markdown is rendered by Streamdown; react-markdown is not the renderer for this surface. (Depends on OQ-LAND-4 — {132.32} adds Streamdown unless a sibling id-135 subtask already did.)

  2. LI-6 (progressive disclosure preserved for the entry view). When index.md is the rendered file (the bundle entry view — see LI-15), the render preserves its themes → concepts progressive-disclosure structure (##/### headings as themes/subthemes; * [title](path.md) — description bullets as concept entries with one-line descriptions), so the entry view reads as the bundle’s table of contents — per id-132 PRODUCT BI-11 and the shipped lib/okf/parse-index.ts format. Test: a fixture index.md with two themes and nested concepts renders as a legible, navigable heading→concept outline.

Nav flip (reserved slot → real Concepts entry)

Section titled “Nav flip (reserved slot → real Concepts entry)”
  1. LI-7 (flip condition = route existence). Once the /okf landing route ships (LI-1), the id-118 Concepts slot flips from reserved (defined-but-not-rendered, id-118 BI-8) to a rendered Knowledge-zone entry labelled “Concepts” navigating to /okf. The flip condition is route existence, not bundle-data presence (id-118 BI-8) — the entry ships even when no bundle is configured (LI-4 handles the empty case). Test: after the landing lands, a “Concepts” → /okf entry is rendered in the nav.

  2. LI-8 (nav flip = one-line reserved flip in the shared registry — DR-041 / id-118 BI-18/BI-19). A single-source nav registry exists: components/shell/nav-config.ts (id-118.6..118.12, shipped 10/07/2026) exports NAV_ZONES, consumed by both site-header.tsx (desktop bar + mobile drawer) and command-palette.tsx — the legacy flat NAV_LINKS array is gone (zero repo-wide hits). The /okf Concepts entry is already declared in the Knowledge zone at nav-config.ts:114–122 ({ href: '/okf', label: 'Concepts', icon: Waypoints, visibility: 'all', reserved: true }) with the comment “enabling this later is a one-line reserved flip”. So the nav-flip work is a one-line edit in one file — remove reserved: true (or set it false) — after which the shared visibleZoneEntries filter (nav-config.ts:197–204, which drops any entry.reserved) admits the entry and it propagates to all three surfaces via the registry with no per-surface edit. Same label (“Concepts”), destination (/okf) and zone are single-sourced, so no surface can disagree. Test: after the flip, visibleZoneEntries(knowledgeZone, …) includes the Concepts entry, and “Concepts” → /okf renders identically on the desktop bar, mobile drawer, and Cmd+K palette (all sourced from NAV_ZONES).

  3. LI-9 (Knowledge-zone position — id-118 BI-4). The Concepts entry sits in the Knowledge zone as its final member, in the ratified order Search → Answers → External sources → Concepts (id-118 BI-4, Concepts last). This is already satisfied in the shipped registry — nav-config.ts:95–123 orders the Knowledge zone exactly so, with Concepts last (:114–122); the flip (LI-8) does not reorder it. Test: Concepts renders as the last Knowledge entry, after External sources.

Role, active-state, quality, non-regression

Section titled “Role, active-state, quality, non-regression”
  1. LI-10 (role-uniform, requiresEdit:false — id-118 BI-20). The Concepts nav entry and the /okf landing are read-only and role-uniform: requiresEdit: false, visible identically to every authenticated user (admin, editor, reviewer, viewer), never hidden by canEdit and never gated by role. Test: the entry renders for a viewer-role user; no requiresEdit/canEdit gate suppresses it.

  2. LI-11 (active-state — id-118 BI-23). Active-state highlights “Concepts” when pathname === '/okf' || pathname.startsWith('/okf/') (so /okf/[bundleId] also highlights Concepts), using the existing site-header machinery (site-header.tsx:114–115), with aria-current="page" on the active leaf. Test: on /okf and on /okf/<id>, the Concepts entry is marked active with aria-current="page".

  3. LI-12 (Warm Meridian, semantic tokens, UK English, WCAG AA — id-118 BI-27). All landing chrome — the bundle list, the file-explorer tree/pane, and the new nav entry — use Warm Meridian semantic tokens only (no raw Tailwind colours), UK English throughout (the label “Concepts”, empty-state copy, tree/file aria-labels), meet WCAG 2.1 AA, and never convey meaning by colour alone (active/focus/selection carry a non-colour signal + visible focus ring). Test: no raw Tailwind colour utilities in the new chrome; label and copy are UK English; contrast + focus pass the a11y checks.

    Acceptance note. The four sub-assertions — (a) semantic tokens only, (b) UK English, (c) WCAG 2.1 AA, (d) no-meaning-by-colour-alone — are four separate acceptance checks at implementation dispatch, each verified independently (not a single pass/fail).

  4. LI-13 (non-regression — viewer + routes unchanged; per OQ-LAND-3). The existing /okf/[bundleId] graph viewer, app/api/okf/[bundleId]/graph/route.ts, and app/api/okf/resource/route.ts are unchanged in behaviour — the landing is purely additive and complements the viewer (LI-18), it does not replace it. No proxy.ts change, no change to contextual routes. Test: the [bundleId] viewer and its API responses behave identically pre/post landing.

Bundle enumeration + file explorer (S457 scope expansion)

Section titled “Bundle enumeration + file explorer (S457 scope expansion)”
  1. LI-14 (enumerate ALL bundles — per OQ-LAND-1). /okf (no bundleId in the path) enumerates every immediate subdirectory of OKF_BUNDLE_ROOT — each subdir is one client bundle keyed by its directory name (= bundleId, validated by the SAFE_BUNDLE_ID_RE single-safe-segment guard) — and renders a bundle list, each entry linking into that bundle’s file explorer and/or its /okf/[bundleId] graph viewer. This overrides the launch-minimalism “single active bundle” recommendation (the former OQ-LAND-1 option (a)): the landing lists all bundles, not one default. No cross-bundle enumeration helper exists today (walkMarkdownFiles walks within one bundle) — a net-new authed root-enumeration server read is required (LI-3(a)), traversal-safe (LI-17). Test: with OKF_BUNDLE_ROOT pointing at a parent containing ≥2 bundle subdirs, /okf lists all of them, each navigable to its bundle; with 1 subdir, it lists 1; with 0, the LI-4 empty state.

  2. LI-15 (full-bundle file-explorer tree navigation — per OQ-LAND-2). Within a selected bundle the landing is a file explorer over the whole bundle working tree: the user can navigate into any file or nested subdirectory, not only index.md. index.md is the entry point, not the boundary — it is the default-selected / first-rendered file, but concept .md files in nested theme subdirectories, log.md, and other tree files are all listable and openable. The tree is read server-side from the resolved bundle root, extending the recursive-walk pattern in lib/okf/bundle-graph.ts:81–96 (walkMarkdownFiles) but broadened beyond .md-only to enumerate the full tree (see LI-16 for the JSON exclusion). Opening a markdown file renders it via Streamdown (LI-5). Test: a fixture bundle with index.md + nested theme/concept.md + log.md renders a navigable tree where index.md is the default view and the nested concept + log.md are reachable and openable.

  3. LI-16 (ontology.json render-excluded but listable — per OQ-LAND-2). ontology.json (the DR-027 machine-facing effective-ontology JSON, bundle_writer.py:426–461) is excluded from human rendering: the landing never renders its JSON as concept/markdown body. It may appear in the file-tree listing (it is a real bundle file) — the ratified rule is render-excluded, may-be-listed — but the render pane declines to render it as human content (e.g. a “machine-facing file” affordance, or it is non-openable in the render pane). No other machine-facing JSON is human-rendered either. Test: a fixture bundle containing ontology.json — it may appear in the tree, but the landing never renders it as markdown/concept content; the render surface treats it as non-human-facing.

  4. LI-17 (file-path traversal safety — security invariant). The file-explorer’s per-file read (LI-3(c)) takes a within-bundle file path (from URL/query or click state). That path MUST be validated to resolve strictly within the resolved bundle root before any read — reusing the containment discipline already in the codebase: lib/okf/bundle-graph.ts:117–119 (path.resolve + path.relative, rejecting .. / absolute escapes) and resolve-bundle-root.ts’s SAFE_BUNDLE_ID_RE bundleId guard. A path that escapes the bundle root (../, absolute, or a symlink out) is rejected (400/404), never read. Test: a request for ../../etc/passwd (or any path resolving outside the bundle root) is rejected; only files within the bundle tree are served.

  5. LI-18 (complement, not replace — per OQ-LAND-3). The /okf file-explorer landing and the /okf/[bundleId] graph viewer are complementary surfaces that coexist: the landing is the lightweight enumerate-and-browse home (bundle list → file explorer), the graph viewer remains the deep-dive concept-graph view for one bundle. The landing links into the graph viewer (a listed bundle / an opened concept offers a route to /okf/[bundleId]); the viewer is unchanged (LI-13). Neither replaces the other. Test: from the landing, a bundle/concept is navigable to its /okf/[bundleId] graph viewer; both surfaces render independently; the viewer’s behaviour is unchanged.

Coordination notes (implementation-time, not owner questions)

Section titled “Coordination notes (implementation-time, not owner questions)”
  • C-1 ({132.23} flow assembly). {132.23} composes the full producer flow that populates a real bundle (index.md/log.md/concept files/embeddings/ontology.json/git-sync). The first real bundle already exists — canonical-okf-showcase repo (renamed S487; first commit 3f66483, 18 concepts) — so once OKF_BUNDLE_ROOT points at its parent the landing renders real data. Until a hosting mechanism (ID-134/{132.12}) points the root, OKF_BUNDLE_ROOT stays unset and the landing shows the LI-4 empty state. The landing does not block on {132.23} — it degrades gracefully — but its populated-bundle acceptance (LI-5/LI-6/LI-14/LI-15 with real content) is best exercised against the canonical-okf-showcase (pre-rename canonical-okf-platform) bundle. Spec against the already-fixed artefact model (id-132 BI-11 + DR-027), not against {132.23}‘s shipping state.
  • C-2 (artefact model is fixed; ontology.json listable-not-rendered). index.md (themes→concepts), log.md (run history), concept .md files, and ontology.json (DR-027 effective ontology) are defined by landed {132.10}/{132.12} + producer filenames (git_sync.py:115–117). The explorer renders index.md as the entry view (LI-6/LI-15) and any other markdown file on demand (LI-15); ontology.json is machine-facing — listable in the tree but not human-rendered (LI-16, per OQ-LAND-2).
  • C-3 (nav structure — zone-grouping has shipped). id-118 three-zone grouping is present today: components/shell/nav-config.ts (id-118.6..118.12) is the single-source NAV_ZONES registry consumed by both site-header.tsx (desktop bar + mobile drawer) and command-palette.tsx; the legacy flat NAV_LINKS array no longer exists. The /okf Concepts entry is already declared in the Knowledge zone at nav-config.ts:114–122 in the ratified BI-4 order (Search → Answers → External sources → Concepts) as a reserved: true slot. So {132.32} does not add or place a nav entry — it flips the existing slot’s reserved flag (LI-8), and all three surfaces move in lockstep via the registry.
  • C-4 (net-new server reads; query-key + Streamdown coordination). The bundle enumeration (LI-14) and file-tree/file reads (LI-15/LI-17) are net-new authed server reads, distinct from the [bundleId]/graph route (which builds the concept graph, not a file tree). Enumeration is a fresh read over the parent root; the tree read broadens walkMarkdownFiles beyond .md. New TanStack Query keys are added as members of queryKeys.okf (e.g. a bundle-list key and a per-file key), never a rewrite of the existing bundle/resource members. Streamdown enters via {132.32} under the OQ-LAND-4 coordination rule (package.json-checked at dispatch).

Ratified decisions (S457) — traceability

Section titled “Ratified decisions (S457) — traceability”

The four OQ-LAND questions were owner-ratified at S457 (recorded in the {132.26} journal). They are no longer open; this section records each ruling and the invariant(s) that implement it.

RulingS457 decisionImplementing invariant(s)
OQ-LAND-1 (bundle selection / multiplicity)ENUMERATE ALL BUNDLES/okf lists every bundle subdir under OKF_BUNDLE_ROOT, each linked to its content (overrides the single-active recommendation).LI-14 (primary); LI-1, LI-3(a), LI-4(b)
OQ-LAND-2 (which artefacts / scope)SCOPE EXPANSION to a full-bundle file explorer — user navigates the whole bundle tree; index.md is the entry, not the boundary; ontology.json stays render-excluded (machine-facing) but may be listed. DR-016-coherent (read-only render over the client-owned bundle repo); the index.md-only framing was launch minimalism.LI-15 + LI-16 (primary); LI-3(b)/(c), LI-5, LI-6, LI-17
OQ-LAND-3 (landing vs graph viewer)COMPLEMENT the [bundleId] graph viewer (not replace) — LI-13 stands.LI-18 (primary); LI-13, LI-11
OQ-LAND-4 (Streamdown dependency — DR-040)id-132 introduces the Streamdown dependency. Coordination rule: whichever of id-132/id-135 lands first brings the dep, neither spec may assume the other already has (S457 also flagged id-118 as a possible dep-introducer; rule invariant to which sibling lands first).LI-5 + Empirical-verification note; C-4