Decouple the agentic board from DOCS_ENABLED — ship /board publicly in production while the /knowledge reading surface stays gated dark
0035-board-public-knowledge-gated
- Reversibility
- two-way door
DEC-0035 — Ship the board publicly while the KB reading surface stays gated
Reversibility: two-way door — re-coupling the board to DOCS_ENABLED is one guard restored; trivially reversible by flipping DOCS_ENABLED on in production, which lights both surfaces. The durable intent — the board is a self-contained, public-ready proof of the loop, the not-yet-ready KB reading surface stays dark — is what holds.
Context
Ship the landing publicly behind a docs-gate flag, capture demand through two honest doors, into a list we own put the marketing landing public while holding the OKF knowledge-base reading surface back behind a reversible DOCS_ENABLED env flag: default ON for local dev/build, false in production via packages/site/vercel.json build.env, so a production build emits only index.astro (+ the capture endpoint) and the Starlight /knowledge/* routes are not built. The KB reading surface "isn't a public artifact yet" was the explicit reason for the gate.
When the read-only agentic board surface (Agentic "sprint board" architecture — a git-resident OKF task board worked by bounded, hook-governed Agent SDK loops / Agentic board v1 — build the git-resident OKF task board (deterministic offline core, SDK reserved), resolving DEC-0024's four open questions and dogfooding Dossier's own repo first, redesigned as "The Ledger of Work" in The read-only /board redesigned as "The Ledger of Work" — reframe the surface from task-management to loop-health legibility, with motion that animates only real git state) was built, it was coupled to that same DOCS_ENABLED flag — in landing-only production the board rendered a "this is part of the docs surface" teaser instead of the real board. So the single flag darkened both the Starlight KB reading surface and the board, even though the two are very different in readiness: the board is a self-contained, compelling, read-only proof of Dossier's agentic learning loop, while the full KB reading surface is not yet ready for public exposure.
This decision decouples the board from DOCS_ENABLED so the board ships publicly now while the KB reading surface stays gated dark. It was made and the code change completed this session (2026-06-16); see Verification for the honest build status.
Provenance note — a DEC-number mislabel inherited here, not propagated. The triggering instruction and the in-file comments in
packages/site/src/pages/board.astro(lines ~57-64) attribute the landing-onlyDOCS_ENABLEDgate to "DEC-0021". The landing-only gate is actually DEC-0022 (Ship the landing publicly behind a docs-gate flag, capture demand through two honest doors, into a list we own); DEC-0021 is Web ingestion — a keyless HttpConnector by default, Firecrawl wired as the premium path, and a first-class CLI web-ingest mode (the keyless web connector), an unrelated record. This decision is therefore linked to the correct record (DEC-0022) and does not carry the wrong edge forward. The stale "DEC-0021" references in the board.astro source comments were corrected to DEC-0022 (and a DEC-0035 reference added) the same session — see Consequences; the mislabel was never a rationale.
Options considered
1. Keep the board coupled to DOCS_ENABLED (status quo) vs. decouple it.
- (a) Keep them coupled — one flag gates both the KB reading surface and the board; the board shows the "part of the docs surface" teaser in landing-only prod. Rejected: it withholds a surface that is ready to show publicly (the board) solely because a different surface (the KB reading pages) is not ready. The two surfaces have independent readiness; one flag should not conflate them.
- (b) Decouple the board from
DOCS_ENABLED; loadtaskatoms unconditionally; narrow the flag to gate only links into the reading surface (chosen). The board renders publicly in production; the Starlight/knowledge/*reading routes stay dark behindDOCS_ENABLED=false. The flag's residual job shrinks to gating the links into the reading surface (the Docs nav link, the "Browse the knowledge base" CTA), not the board's own data.
2. How the board gets its data in a landing-only build — does removing the guard actually work?
- The load now runs unconditionally because the
docscontent collection reads straight from the knowledge repo via Astro's glob loader, which is independent of the Starlight integration.DOCS_ENABLED=falseskips the Starlight integration (so/knowledge/*routes aren't built), but the content collection — and therefore the board'sgetCollection('docs', type==='task')— still resolves against the KB on disk. So the board has its data even when the reading routes don't exist. (This is reasoned from how Astro content collections relate to integrations; it was not confirmed by a production-style build this session — see Verification.)
3. The board's deep links into individual atoms in landing-only prod — fix now vs. accept the 404.
- (a) Make the deep links resolve (e.g. build a minimal atom route, or hide the links) before shipping. Not done.
- (b) Accept the 404 as a known, explicitly-accepted trade-off (chosen, accepted by the user). A card's
href, dependency links, and the modal's "Open the atom ↗" point at/knowledge/…routes that are not built in landing-only prod, so they 404. Accepted because the exposure is narrow: with JS on (the common path) a card click opens the read-only quick-look modal and never navigates, so the 404 only affects (i) the modal's "Open the atom" button and (ii) the no-JS click-through.
Decision
Decouple the read-only agentic board from DOCS_ENABLED: ship /board publicly in production while the OKF knowledge READING surface (/knowledge/*) stays gated dark. vercel.json is unchanged — DOCS_ENABLED stays false; the board is simply no longer coupled to it. Three edits to packages/site/src/pages/board.astro:
- Load
taskatoms unconditionally. Theif (docsEnabled)guard aroundgetCollection('docs', type === 'task')is removed. This works in a landing-only prod build because thedocscontent collection reads the knowledge repo via Astro's glob loader, independent of the Starlight integration — so the board has its data even though the integration (and the/knowledge/*routes) isn't built. A missing/empty KB still degrades to the honest empty state (thetry/catch→tasks = []path). - Remove the
!docsEnabledteaser branch. The "board is part of the docs surface" teaser is gone; the page now falls through to the real board (or the honest empty state if a KB has no tasks). - Narrow
docsEnabled's remaining role to gate links INTO the reading surface only — the "Docs" nav link and the "Browse the knowledge base" CTA. It no longer governs whether the board renders.
The accepted trade-off is recorded as part of the decision: deep links from the board into an individual atom (card href, dependency links, the modal's "Open the atom ↗") point at /knowledge/… routes that 404 in landing-only prod. Mitigated by the JS-on modal path that never navigates.
This refines Ship the landing publicly behind a docs-gate flag, capture demand through two honest doors, into a list we own — it splits that decision's single "hold the docs/KB surface back" gate into two independently-gated surfaces (board: public; KB reading: dark). It does not supersede DEC-0022: the KB reading surface stays gated exactly as DEC-0022 set it, vercel.json is untouched, and flipping DOCS_ENABLED on in production remains the reversible re-entry for the reading surface.
Rationale
- The board is ready to show publicly; the KB reading surface is not — and they should be gated independently. The board is a self-contained, compelling proof of Dossier's agentic learning loop (read-only, sovereign, git-is-the-source-of-truth — Adopt OKF as Dossier's canonical knowledge format / The read-only /board redesigned as "The Ledger of Work" — reframe the surface from task-management to loop-health legibility, with motion that animates only real git state). The full KB reading surface is not yet ready for public exposure (the original reason for Ship the landing publicly behind a docs-gate flag, capture demand through two honest doors, into a list we own's gate). One flag conflating two surfaces of different readiness withheld a ready surface for an unready one's sake.
- It advances the product narrative publicly without prematurely exposing the not-yet-ready KB. Showing the board lets the public see the loop working while the institutional-memory reading pages stay private until they're ready.
- It is low-risk. The board degrades safely to the empty state if a KB has no tasks, and the content-collection load is independent of the Starlight integration — so the board having data in a landing-only build follows from core Astro behavior, not a fragile workaround.
- The 404 trade-off is bounded and was explicitly accepted. With JS on (the common path) a card opens the quick-look modal and never navigates; only the modal's "Open the atom" button and the no-JS click-through hit a
/knowledge/…404 in landing-only prod. asserted, notverified. The code change is complete, but a production-style (DOCS_ENABLED=false) build was not run this session to empirically confirm it (the user opted to skip it; local dev servers held the output dir locked — the same Windowsdist-lock environment constraint seen in KB-agnostic @dossier/site (renders any tenant's OKF KB) + runtime-driven site rendering + the Node-26 Windows build fix / Agentic board v1 — build the git-resident OKF task board (deterministic offline core, SDK reserved), resolving DEC-0024's four open questions and dogfooding Dossier's own repo first / The read-only /board redesigned as "The Ledger of Work" — reframe the surface from task-management to loop-health legibility, with motion that animates only real git state). Confidence in correctness is high on reasoning grounds (content collections are core Astro, independent of the integration), but it is asserted, not build-verified.
Consequences
/boardships publicly in production;/knowledge/*stays dark. The board renders the OKFtaskatoms it derives even in the landing-only (DOCS_ENABLED=false) build; the Starlight KB reading routes remain unbuilt.packages/site/vercel.jsonis unchanged.docsEnabled's scope shrinks to link-gating. It now only governs the Docs nav link and the "Browse the knowledge base" CTA — not the board's data or render path.- Known, accepted 404 on board→atom deep links in landing-only prod. Card
href, dependency links, and the modal "Open the atom ↗" point at/knowledge/…routes that aren't built, so they 404. Resolved automatically the dayDOCS_ENABLEDflips on in production (the reading routes come back — the Ship the landing publicly behind a docs-gate flag, capture demand through two honest doors, into a list we own re-entry). Until then it is the accepted trade-off. - Sovereignty unchanged. The board stays read-only/zero-copy over the OKF git repo (Adopt OKF as Dossier's canonical knowledge format / Agentic "sprint board" architecture — a git-resident OKF task board worked by bounded, hook-governed Agent SDK loops); no sovereign
knowledge/file or shipped package source is changed by this surface decision; nothing is added to the client-facing plugin subset. - Source-comment cleanup — resolved (2026-06-16). The
board.astroandastro.config.mjscomments originally called theDOCS_ENABLEDlanding-only gate "DEC-0021"; the gate is DEC-0022 (Ship the landing publicly behind a docs-gate flag, capture demand through two honest doors, into a list we own) and DEC-0021 is Web ingestion — a keyless HttpConnector by default, Firecrawl wired as the premium path, and a first-class CLI web-ingest mode. The stale references were corrected to DEC-0022 and a DEC-0035 reference added the same session, so the code's provenance now matches the records (verified by grep — zeroDEC-0021matches underpackages/site). - Two-way door. Re-coupling the board to
DOCS_ENABLEDis restoring one guard; flippingDOCS_ENABLEDon in production lights both surfaces. The durable intent is only that the board is a public-ready proof gated independently from the not-yet-ready KB reading surface.
Review
Promote toward verified once a production-style DOCS_ENABLED=false build has been run and confirmed: /board builds and renders its task atoms with DOCS_ENABLED=false, and /knowledge/* is absent — empirically closing the "asserted, not build-verified" gap. Re-examine the accepted 404 trade-off when the KB reading surface is readied for public exposure (flipping DOCS_ENABLED on — the Ship the landing publicly behind a docs-gate flag, capture demand through two honest doors, into a list we own re-entry — makes the deep links resolve and retires the trade-off). The source-comment cleanup (correct "DEC-0021" → DEC-0022 and add DEC-0035 in board.astro) is done (2026-06-16).