docHub

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

  1. Operator asked: "the doc hub probably needs 3 faces user dev and mavis only mavis is not for deployment its our own tools etc."
  2. docHub restructured from two faces (user, dev) to three faces (user, dev, mavis).
  3. The mavis face is deployable: false — never shipped, never embedded, never distributed.
  4. 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):

Stays in dev/ (FVS doctrine, internal but not Mavis-only):

Stays in user/ (public, embeddable):


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:

  1. Walks each face separately (user, dev, mavis)
  2. Emits per-face manifest.json and bootstrap.json
  3. Mavis artifacts go to mavis/_meta/, NOT to dev/_meta/ or user/_meta/
  4. Top-level _meta.json lists all three faces with file counts + the deployable flag

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


Open


Cross-references


← back to Mavis workshop