docHub three-face restructure (2026-06-23 00:55 UTC)
Date: 2026-06-23 00:55 UTC Lane: helper Session: 412100071272671 Status: complete
TL;DR
- Operator asked: "the doc hub probably needs 3 faces user dev and mavis only mavis is not for deployment its our own tools etc."
- docHub restructured from two faces (user, dev) to three faces (user, dev, mavis).
- The mavis face is
deployable: false— never shipped, never embedded, never distributed. - Build script enforces the boundary by walking each face separately and emitting per-face manifests.
What was moved
From dev/ to mavis/ (Mavis coordination, not doctrine):
lanes/(cards, chrome, fvre, doctrine, helper) — 5 lane profilesprompts/(operator-relay, helper-to-cards) — 2 prompt log entriesbootstrap/mavis-protocols.md,bootstrap/lane-map.md,bootstrap/open-questions.mdreports/(state-check, pat-rotation, dup-cleanup, dochub-build) — 4 reportsdecisions/D-057..D-062— 6 internal decisionsplans/phase-1..5— 5 phase plansdangerous/case-variant-dups.md,destructive-ops-checklist.md,memory-drift.md— 3 Mavis-specific lessonscoordination/_legacy-projects.md— uncategorized coordination
Stays in dev/ (FVS doctrine, internal but not Mavis-only):
doctrine/— 5 files (pact-lookup, chip-system, anti-patterns, governance, fvw-v8)decisions/D-056— the canonical FreshCards substrate decision (mirrors the pact)projects/— 6 project pagesbootstrap/README.md— orientation for any AI waking updangerous/github-pat-leak.md— general security lesson
Stays in user/ (public, embeddable):
index.md(root, now references three faces)getting-started/projects/(4 user-facing project pages)concepts/(substrate primer + new three-faces doc)reference/(substrate contract schema)assets/embed.js(the web component)
What changed in the substrate contract
module.json v0.2.0:
{
"faces": {
"user": { "deployable": true, "auth": "public", "audience": ["end-users", "FVS-apps"] },
"dev": { "deployable": true, "auth": "cloudflare-access-email-allowlist", "audience": ["operator", "ai-agents", "fresh-doctrine-readers"] },
"mavis": { "deployable": false, "auth": "cloudflare-access-email-allowlist", "audience": ["operator", "helper-mavis", "lane-mavises"] }
}
}
The deployable: false flag on mavis is the key new field. The build script and any future deploy pipeline can refuse to ship mavis content.
What changed in the build script
build.mjs (v0.2.0) now:
- Walks each face separately (user, dev, mavis)
- Emits per-face
manifest.jsonandbootstrap.json - Mavis artifacts go to
mavis/_meta/, NOT todev/_meta/oruser/_meta/ - Top-level
_meta.jsonlists all three faces with file counts + thedeployableflag
The user face is what the <doc-hub> web component reads. The web component fetches /api/user/manifest.json — it never sees mavis content.
New docs
user/concepts/three-faces.md— explains the three-face architecture for end-users and any AI reading the user faceuser/index.md— updated to reference all three facesmodule.json— version bumped to 0.2.0 with three-face design
Open
- Deploy still pending operator trigger. Will deploy
user/+dev/todocshub.pages.dev(new Cloudflare Pages project). Mavis stays in our sandbox. - Cloudflare Access on
/dev/— operator task. Email allowlist with at leastavidtech6@gmail.com. - cards Mavis reply — still pending from the 2026-06-23 00:30 UTC ping (Region Schema confirmation).
Cross-references
- D-060 — docHub substrate shape (now v0.2.0 with three faces)
- Module contract:
docshub/module.json - Top-level index:
docshub/_meta.json - User face manifest:
docshub/user/_meta/manifest.json - Dev face manifest:
docshub/dev/_meta/manifest.json - Mavis face manifest:
docshub/mavis/_meta/manifest.json - Build script:
docshub/build.mjs