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.streamdownis not a declared dependency; the incumbent markdown renderer present isreact-markdown ^10.1.0(package.json:117), plus@tiptap/markdown 3.23.4(package.json:87, editor-side). Nocomponents/**orlib/**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} checkspackage.jsonat dispatch and only adds Streamdown if still absent). All other symbols cited here are internal Canonical Platform surfaces (import-and-call check N/A).
Context
Section titled “Context”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": [].definitionssurfaced 20 File-level nodes and noapp/okf/page.tsxindex-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 importerFile:lib/okf/bundle-graph.ts(the concept walker). outgoing:{}."processes": []. Confirmsokf-document.tsis 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–96walkMarkdownFiles(root)— a recursivefs.readdirSync(dir, { withFileTypes: true })tree walk of every.mdunder the bundle root (sorted), skippingindex.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–129extractLinks+:117–119— apath.resolve/path.relativecontainment 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–46resolveOkfBundleRoot(bundleId)+SAFE_BUNDLE_ID_RE = /^[A-Za-z0-9_-]+$/— resolvesbundleIdagainst theOKF_BUNDLE_ROOTparent 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.tsresolveInternalMdLink— the client-side internal.mdlink resolver used by<ConceptDetail>(renders viareact-markdowntoday → the DR-040/OQ-LAND-4 Streamdown swap surface).lib/query/okf.tsfetchOkfBundle/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](nopage.tsx);ls app/api/okf/→[bundleId],resource. Confirms {132.32} builds the net-newapp/okf/page.tsxindex route.
ccc searchfallback: 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.md→nav, log.md→log).
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_ROOTpoints is ID-134 / {132.12} G-GITSYNC territory (resolve-bundle-root.tsis 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.jsonis already fixed by landed subtasks ({132.10}/{132.12}) + DR-027 (coordination note below). - Rendering
ontology.jsonas 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).
Behaviour — Landing invariants (LI-N)
Section titled “Behaviour — Landing invariants (LI-N)”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.
Route + auth
Section titled “Route + auth”-
LI-1 (new index route = bundle-explorer home). A net-new index route renders at path
/okf(fileapp/okf/page.tsx; today onlyapp/okf/[bundleId]/page.tsxexists). Navigating to/okfrenders the Concepts landing — the bundle-enumeration + file-explorer home (LI-14/LI-15), not a single bundle’sindex.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. -
LI-2 (authenticated, never public).
/okfand its backing data path are authenticated:proxy.tspublicRoutesis not modified, so an unauthenticated visitor is redirected to/login; every server-side data read (bundle enumeration, tree listing, per-file read) re-checksauth.successand routes failure viaauthFailureResponse(auth)(defense in depth, matchingapp/api/okf/[bundleId]/graph/route.ts:47–48). Test: logged-outGET /okf→ redirect to/login; every new backing route checksauth.success;publicRoutesdiff is empty.
Data source
Section titled “Data source”-
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_ROOTbridge, never a direct unauthenticated filesystem or client read, and never fromapi.*records. Three authed server reads back the landing: (a) enumerate the immediate subdirs ofOKF_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) extendresolveOkfBundleRoot; read (a) is net-new (enumerates the parent root itself). Any client-side fetch uses TanStack Query exclusively (fetchers inlib/query/okf.ts, keys as new members of thequeryKeys.okfnamespace —query-keys.ts:483–488), matching the existing viewer. Test: every landing data path flows through an authed server read + a TanStack Query key; no rawfetchin a hook; no Supabase read for concept content. -
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_ROOTunset/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 (noindex.md) → a per-bundle empty state. This is load-bearing: the nav flip (LI-7) surfaces/okfto every authenticated user before any bundle is configured, so the empty state is the first thing most users will see. Test: withOKF_BUNDLE_ROOTunset,/okfrenders 200 + empty state, not 500; with a root but 0 subdirs, an empty bundle list; with a bundle lackingindex.md, a per-bundle empty state.
Rendering
Section titled “Rendering”-
LI-5 (Streamdown markdown render — DR-040 / per OQ-LAND-4). Every markdown file the explorer renders (
index.mdand any concept.mdopened from the tree) is rendered as markdown via Streamdown — the DR-040-ratified renderer for new surfaces — not the incumbentreact-markdown. Internal concept links ([title](path.md)) resolve within the bundle (reusing theresolveInternalMdLink/bundle-graph.ts:extractLinkscontainment 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-markdownis not the renderer for this surface. (Depends on OQ-LAND-4 — {132.32} adds Streamdown unless a sibling id-135 subtask already did.) -
LI-6 (progressive disclosure preserved for the entry view). When
index.mdis 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) — descriptionbullets 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 shippedlib/okf/parse-index.tsformat. Test: a fixtureindex.mdwith 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)”-
LI-7 (flip condition = route existence). Once the
/okflanding 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” →/okfentry is rendered in the nav. -
LI-8 (nav flip = one-line
reservedflip 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) exportsNAV_ZONES, consumed by bothsite-header.tsx(desktop bar + mobile drawer) andcommand-palette.tsx— the legacy flatNAV_LINKSarray is gone (zero repo-wide hits). The/okfConcepts entry is already declared in the Knowledge zone atnav-config.ts:114–122({ href: '/okf', label: 'Concepts', icon: Waypoints, visibility: 'all', reserved: true }) with the comment “enabling this later is a one-linereservedflip”. So the nav-flip work is a one-line edit in one file — removereserved: true(or set it false) — after which the sharedvisibleZoneEntriesfilter (nav-config.ts:197–204, which drops anyentry.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” →/okfrenders identically on the desktop bar, mobile drawer, and Cmd+K palette (all sourced fromNAV_ZONES). -
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–123orders 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”-
LI-10 (role-uniform,
requiresEdit:false— id-118 BI-20). The Concepts nav entry and the/okflanding are read-only and role-uniform:requiresEdit: false, visible identically to every authenticated user (admin, editor, reviewer, viewer), never hidden bycanEditand never gated by role. Test: the entry renders for a viewer-role user; norequiresEdit/canEditgate suppresses it. -
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), witharia-current="page"on the active leaf. Test: on/okfand on/okf/<id>, the Concepts entry is marked active witharia-current="page". -
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).
-
LI-13 (non-regression — viewer + routes unchanged; per OQ-LAND-3). The existing
/okf/[bundleId]graph viewer,app/api/okf/[bundleId]/graph/route.ts, andapp/api/okf/resource/route.tsare unchanged in behaviour — the landing is purely additive and complements the viewer (LI-18), it does not replace it. Noproxy.tschange, 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)”-
LI-14 (enumerate ALL bundles — per OQ-LAND-1).
/okf(nobundleIdin the path) enumerates every immediate subdirectory ofOKF_BUNDLE_ROOT— each subdir is one client bundle keyed by its directory name (=bundleId, validated by theSAFE_BUNDLE_ID_REsingle-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 (walkMarkdownFileswalks within one bundle) — a net-new authed root-enumeration server read is required (LI-3(a)), traversal-safe (LI-17). Test: withOKF_BUNDLE_ROOTpointing at a parent containing ≥2 bundle subdirs,/okflists all of them, each navigable to its bundle; with 1 subdir, it lists 1; with 0, the LI-4 empty state. -
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.mdis the entry point, not the boundary — it is the default-selected / first-rendered file, but concept.mdfiles 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 inlib/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 withindex.md+ nestedtheme/concept.md+log.mdrenders a navigable tree whereindex.mdis the default view and the nested concept +log.mdare reachable and openable. -
LI-16 (
ontology.jsonrender-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 containingontology.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. -
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) andresolve-bundle-root.ts’sSAFE_BUNDLE_ID_REbundleIdguard. 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. -
LI-18 (complement, not replace — per OQ-LAND-3). The
/okffile-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-showcaserepo (renamed S487; first commit3f66483, 18 concepts) — so onceOKF_BUNDLE_ROOTpoints at its parent the landing renders real data. Until a hosting mechanism (ID-134/{132.12}) points the root,OKF_BUNDLE_ROOTstays 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 thecanonical-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.mdfiles, andontology.json(DR-027 effective ontology) are defined by landed {132.10}/{132.12} + producer filenames (git_sync.py:115–117). The explorer rendersindex.mdas the entry view (LI-6/LI-15) and any other markdown file on demand (LI-15);ontology.jsonis 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-sourceNAV_ZONESregistry consumed by bothsite-header.tsx(desktop bar + mobile drawer) andcommand-palette.tsx; the legacy flatNAV_LINKSarray no longer exists. The/okfConcepts entry is already declared in the Knowledge zone atnav-config.ts:114–122in the ratified BI-4 order (Search → Answers → External sources → Concepts) as areserved: trueslot. So {132.32} does not add or place a nav entry — it flips the existing slot’sreservedflag (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]/graphroute (which builds the concept graph, not a file tree). Enumeration is a fresh read over the parent root; the tree read broadenswalkMarkdownFilesbeyond.md. New TanStack Query keys are added as members ofqueryKeys.okf(e.g. a bundle-list key and a per-file key), never a rewrite of the existingbundle/resourcemembers. 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.
| Ruling | S457 decision | Implementing 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 |