Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 82 additions & 15 deletions .derived/codebase-index/by-spec/002-launch-content.json
Original file line number Diff line number Diff line change
@@ -1,33 +1,100 @@
{
"diagnostics": {
"errors": [],
"warnings": [
{
"code": "W-001",
"message": "spec '002-launch-content' directory unit 'src/content/' is not a directory",
"path": "src/content/"
}
]
},
"mapping": {
"dependsOn": [
"001-site-scaffold"
],
"implementingPaths": [],
"implementingPaths": [
{
"path": "app/lib/docs.ts",
"source": "spec-edge"
},
{
"path": "app/lib/milestones.ts",
"source": "spec-edge"
},
{
"path": "app/routes/_index.tsx",
"source": "spec-edge"
},
{
"path": "app/routes/docs.$slug.tsx",
"source": "spec-edge"
},
{
"path": "app/routes/docs.tsx",
"source": "spec-edge"
}
],
"resolvedUnits": [
{
"locations": [],
"locations": [
{
"file": "app/lib/docs.ts"
}
],
"ownership": true,
"sourceField": "establishes",
"unit": {
"kind": "file",
"path": "app/lib/docs.ts"
}
},
{
"locations": [
{
"file": "app/lib/milestones.ts"
}
],
"ownership": true,
"sourceField": "establishes",
"unit": {
"kind": "file",
"path": "app/lib/milestones.ts"
}
},
{
"locations": [
{
"file": "app/routes/_index.tsx"
}
],
"ownership": true,
"sourceField": "establishes",
"unit": {
"kind": "file",
"path": "app/routes/_index.tsx"
}
},
{
"locations": [
{
"file": "app/routes/docs.$slug.tsx"
}
],
"ownership": true,
"sourceField": "establishes",
"unit": {
"kind": "file",
"path": "app/routes/docs.$slug.tsx"
}
},
{
"locations": [
{
"file": "app/routes/docs.tsx"
}
],
"ownership": true,
"sourceField": "establishes",
"unit": {
"kind": "directory",
"path": "src/content/"
"kind": "file",
"path": "app/routes/docs.tsx"
}
}
],
"specId": "002-launch-content",
"specStatus": "approved"
},
"schemaVersion": "1.1.0",
"shardHash": "9f37ede0e6a8719a1c8e17b9f2840017f6e269de2624356307fcaf5b94153dd5"
"shardHash": "b89aa769c2379525b9536a49fe574bfcb8244e05beca67bf76c014551f112e07"
}
28 changes: 23 additions & 5 deletions .derived/spec-registry/by-spec/002-launch-content.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,43 @@
],
"establishes": [
{
"kind": "directory",
"path": "src/content/"
"kind": "file",
"path": "app/routes/_index.tsx"
},
{
"kind": "file",
"path": "app/routes/docs.tsx"
},
{
"kind": "file",
"path": "app/routes/docs.$slug.tsx"
},
{
"kind": "file",
"path": "app/lib/docs.ts"
},
{
"kind": "file",
"path": "app/lib/milestones.ts"
}
],
"id": "002-launch-content",
"implementation": "pending",
"implementation": "complete",
"sectionHeadings": [
"002: Launch content",
"0. Implementation amendment (2026-07-14)",
"1. Voice constraints",
"2. Content inventory (index page)",
"3. Docs seed",
"4. Acceptance",
"5. Out of scope"
"5. Out of scope",
"6. Status (2026-07-14): complete"
],
"specPath": "specs/002-launch-content/spec.md",
"status": "approved",
"summary": "The words on the site at launch. One index page that states what Stagecraft is in the builder's own register (creator-led, OSS-credible, no startup theater), a product-family section mapping the four repos and their licenses, and an honest status section tied to the public milestone ladder. The positioning facts are inlined here so the implementing session needs no external archive.\n",
"title": "Launch content: positioning, product family, honest status"
},
"shardHash": "0de10d1c4212ebaf86dc5f9a74818367313a81e203dccb2fdba400bf12a32bd4",
"shardHash": "7b9884fbd42e2bae5bd569294aeb0c596cbb29e0efa1290cd3777ece462cd6b3",
"specVersion": "1.1.0"
}
140 changes: 140 additions & 0 deletions app/lib/docs.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
// Docs seed (spec 002 §3). Three stubs sourced from the repos' own READMEs and
// specs: link and summarize, never fork prose. This module imports nothing so
// it is safe to pull into both the docs routes and the prerender config
// (react-router.config.ts). Repo metadata (license, url) is resolved from
// product-family.ts in the route, keyed by `repo`, so it is never duplicated
// here. Every claim is checkable against the linked spec or repo.

/** A link on a docs stub. An `href` beginning with "/" is an in-site route
* (rendered with the router Link); anything else opens in a new tab. */
export interface DocLink {
label: string;
href: string;
}

export interface DocSection {
heading: string;
/** Paragraphs, rendered in order. */
body: string[];
}

export interface DocStub {
slug: string;
title: string;
/** One-line summary shown on the docs index and under the title. */
summary: string;
/** Repo key into product-family.ts (for the license chip + repo link). */
repo: string;
/** Honest maturity marker: what you can run today vs. what is on the ladder. */
maturity: "shipping" | "in-progress" | "planned";
sections: DocSection[];
links: DocLink[];
}

export const DOC_STUBS: DocStub[] = [
{
slug: "what-is-enrahitu",
title: "What is EnRaHiTu",
summary:
"The single-container application chassis every stamped app is built from.",
repo: "enrahitu",
maturity: "shipping",
sections: [
{
heading: "One container, zero managed dependencies",
body: [
"EnRaHiTu is an Encore.ts application core that carries its own datastore, its own identity provider, and its own web tier in a single container image. The name is the stack: Encore.ts, rauthy, hiqlite, and Turso.",
"hiqlite runs in-process as a napi-rs native addon (a Raft-replicated SQLite), so there is no database process to operate alongside the app. CoreLedger is a decorator data layer over libSQL/Turso. Auth is rauthy behind a same-origin proxy with an OIDC driver, and the app serves its own SPA. The Encore toolchain is vendored (Rust core plus JS runtime via napi-rs), so there is no external CLI in the build.",
],
},
{
heading: "Why it exists",
body: [
"The chassis is the substrate the rest of the family stands on. Every app the control plane stamps is an EnRaHiTu app, which is what makes operating a fleet of them uniform: one container and one volume each, the same shape every time.",
],
},
],
links: [
{ label: "enrahitu on GitHub", href: "https://github.com/stagecraft-ing/enrahitu" },
{
label: "001: architecture spec",
href: "/registry/enrahitu/001-enrahitu-architecture",
},
{
label: "007: single-container packaging",
href: "/registry/enrahitu/007-single-container-packaging",
},
],
},
{
slug: "the-template-contract",
title: "The template contract",
summary:
"A versioned template.toml that binds what a stamped app is, and the agentic posture it is born with.",
repo: "enrahitu",
maturity: "in-progress",
sections: [
{
heading: "template.toml",
body: [
"A stamp is a function of a contract version. The template contract (template.toml) is the versioned declaration of what a stamped app is: its shape, its verbs, and what may change under a governed upgrade. Pinning the version is what lets a chassis upgrade later run as a governed verb instead of a manual migration.",
],
},
{
heading: "Born-with provenance",
body: [
"At stamp time the app receives a born-with certificate that binds an explicit agentic posture. An agent that later operates the app runs under a declared posture, recorded from the moment the app exists, rather than one inferred after the fact.",
"This rung is still being built: the contract itself is in progress and the born-with certificate is specced but not yet implemented. The specs below carry the current state; the status ladder on the home page reads it live from the registry.",
],
},
],
links: [
{
label: "009: the template contract",
href: "/registry/enrahitu/009-template-contract",
},
{
label: "012: born-with provenance",
href: "/registry/enrahitu/012-born-with-provenance",
},
],
},
{
slug: "self-hosting-the-control-plane",
title: "Self-hosting the control plane (AGPL)",
summary:
"What AGPL-3.0 means for the plane, what you can run today, and what is on the ladder.",
repo: "stagecraft",
maturity: "planned",
sections: [
{
heading: "AGPL-3.0, and what it covers",
body: [
"The control plane (stagecraft) is AGPL-3.0: you can run it and modify it, and network users are entitled to the source of your running version. The AGPL covers the plane, not what the plane stamps. Apps the factory stamps are the customer's own code, in the customer's own GitHub org, under whatever license the customer chooses.",
],
},
{
heading: "What runs today, and what is planned",
body: [
"You can self-host the EnRaHiTu chassis now: it is a single container, and its specs are shipped. The control plane itself, tenants, the factory, the fleet, and the governance spine, is spec-approved and on the milestone ladder, not yet a thing you deploy.",
"Until it ships, the specs are the artifact. The thesis and the app-shell spec below describe the plane the control plane is being built into; the registry tracks how far along each part is.",
],
},
],
links: [
{ label: "stagecraft on GitHub", href: "https://github.com/stagecraft-ing/stagecraft" },
{
label: "001: the control-plane thesis",
href: "/registry/stagecraft/001-stagecraft-thesis",
},
{
label: "002: the EnRaHiTu app shell",
href: "/registry/stagecraft/002-app-shell",
},
],
},
];

export function findDoc(slug: string): DocStub | undefined {
return DOC_STUBS.find((d) => d.slug === slug);
}
Loading
Loading