UNOFFICIAL/EXPERIMENTAL
This is the execution plan for the second pass over the public website's structure. It follows the phase 1 plan (site-information-architecture.md, #1709 to #1727) and the three decisions the maintainer made on 6 September
- A new session can execute it from this document alone; every step names
the page, the sources, and the gates.
The three decisions
- The website is what a user reads and runs. Proofs, receipts and other records stay in the repository and the Catalog backend. Landed as #1755: the generator renders only
docs/andexamples/, and every other link points at the file on GitHub. Nothing is deleted. Good material is moved, never hidden. - Five buttons: Catalog · Config · Stacks · Operate · Docs, plus the ConfigHub Server button. "Why trust it" folds into the Catalog page, which frees a button for Config. Config is the model and what you can do with a configuration; Catalog is the store and why you can trust it.
- What Config must explain, in the maintainer's words: "how we are standardising config into one lifecycle model, flattening & rendering, recipes & values → base, routing etc.; and around OCI+friends; and how new or varying stuff comes in (eg via cub installer). That's central to the Catalog, and adjacent to 'how we deal with each config format'. We need the subsequent role of CH, stacks, platforms, apps, etc to be very clear too; and we need a clear hooks/CRDs story."
How this plan was made
Nine readers mapped where each of those topics is explained today, across 325 docs and every site page; a synthesis proposed one home per topic; a critic checked every cited path and range (all 69 exist and say what was claimed) and found 22 placement defects, which this plan resolves. The raw maps sit outside the repository; the decisions are here.
The rules every step follows
- Every page is generated. A step edits
scripts/generate-public-site.mjs, thenscripts/verify-site-ux-contract.mjs(it pins h1s, headings, opening phrases, term lists and h2 caps), thendocs/README.mdwhen a doc moves or is added. Gates, in order:HELM_EXPT_SITE_GENERATED_AT="$(cat site/generated-at.txt)" npm run site:generate,npm run site:ux:verify,npm run site:verify,npm run docs:verify,npm run config-model:verify(it reads named pages for doctrine phrases; when the model moves fromdocs.htmltoconfig.html, its page list moves with it),npm run verify:no-personal-names. - A topic is explained on one page. Every other page that explains it today keeps one sentence and a link. The satellites are named per step so none is forgotten.
- Text moves rather than being rewritten, and a moved passage gets a house-style pass on arrival: plain sentences with verbs, no verbless colon headlines, no em-dash asides, cross-references re-pointed. The maintainer's verbatim passages (the home page's "What ConfigHub Workshop is", in a
data-verbatimcontainer) are not touched. - Facts from receipts are stated on the page; the receipt is linked on GitHub. Counts are read from
data/summaries by the generator, never typed into prose. Project checks (npm run …) go todocs/user/verification.md, not to a site page. - Headings say what the reader can do or learn. No "ladder", no "rung".
- Registering a page takes four edits in the generator: the page list, the builder object,
PAGE_DESCRIPTIONS, and an explicitwrite(). Retiring a URL takes aPAGE_REDIRECT_TARGETSentry and amovedPageHtmlstub. - One pull request per step. The maintainer reviews each and merges. Squash-merge, so never stack a branch on a branch.
The target map
| Button | Hub | Pages in the group |
|---|---|---|
| Catalog | charts/index.html | proof.html (the trust sub-page), known-gaps.html, matrix.html, did-this-chart-version-change.html, did-your-bitnami-chart-stop-pulling.html, why-did-helm-ignore-my-values.html |
| Config | config.html (new) | variants.html, oci.html (new), quirks.html (rebuilt), ask.html, ai.html, deploy-with-flux-or-argo.html, try.html, redis-walkthrough.html, testing.html |
| Stacks | stack.html | demo.html, kubara.html, try-aicr.html, apps.html |
| Operate | how-it-works.html | confighub.html, promote.html, operations.html, does-cluster-match-approved-config.html, why-do-dev-and-prod-differ.html |
| Docs | docs.html | d/docs/user/what-config-workshop-is.html, offering.html |
Every current page keeps its URL. security.html and verification.html already redirect to proof.html and keep working. The footer mirrors the groups. The "ConfigHub Server" button stays as the sixth element of the top bar.
Who defines what
One canonical definition each, quoted in one sentence everywhere else:
| Term | Defined on | Everywhere else |
|---|---|---|
| The lifecycle, the four questions, materialize, flatten | config.html | one sentence and a link |
| Recipe, values, declared inputs, base, derived variant, where a change belongs | variants.html | one sentence and a link |
| The OCI shapes, digests, what is signed | oci.html | one sentence and a link |
| Hooks, CRDs, required setup, dispositions | quirks.html | per-chart route tables stay on chart pages and link here |
| ConfigHub (the server), config = component = base variant = Space, the handoff order | config.html | confighub.html explains what it adds; the home page quotes the sentence |
| Stack, platform, place, fleet | stack.html | config.html and kubara.html quote the sentence |
| App, app on a stack, app on a platform | apps.html | stack.html quotes the sentence |
| Verified, certified, signed; check one claim yourself | charts/index.html | index.html keeps the three words as links; oci.html shows signing as a column and links here |
| Argo CD 3.x and 2.x specifics, the Flux and Argo manifests | deploy-with-flux-or-argo.html | how-it-works.html and oci.html link here |
| The delivery patterns people run (rendered-manifest repositories, OCI sources, the d2 stack layouts, app-of-apps, overlays, image automation, fleets) and how to run each with the catalog | deploy-with-flux-or-argo.html | oci.html links the shape each pattern consumes; stack.html and kubara.html carry the d2 stack layouts as stacks the catalog can build |
| What Kubara runs today (the platform matrix), and what each shipped stack has proved | kubara.html and stack.html, read from data/ | the home page and demo.html quote the counts |
What the backend stream adds, and where it shows
The Catalog backend is worked in parallel by a second agent under AGENTS.md, in three blocks: #1757 (the upstream chart refresh and the successor entries), #1758 (a survey of the Flux and Argo CD delivery patterns in the wild, each mapped onto the catalog's OCI shapes), and #1759 (the three red Kubara lanes, then every stack's receipts). The website has to make room for what those blocks produce, and it does so by reading data, never by typing what the backend found into prose.
| Backend block | What it produces | Where the site shows it | How |
|---|---|---|---|
| #1758 patterns | one knowledge/wiki/ page per pattern family with front matter (family, shapes, assumes, sources, run_with) and an index with a shortlist | deploy-with-flux-or-argo.html gains Run the catalog the way you already deliver: one row per family, what it assumes, which OCI shape fits, the command that produces that artifact, and a link to the knowledge page on GitHub. The d2 stack layouts also appear on stack.html under "What a stack is" and on kubara.html, as layouts the catalog can build | the generator reads the front matter (a new reader beside the one that reads data/kubara-platform-matrix/matrix.json); the rendered-manifest family gets the first row, because it is the pattern the certified bundle serves directly |
| #1759 Kubara and stacks | a refreshed data/kubara-platform-matrix/, complete data/certified-bundles/ receipts, the stack count settled in data | kubara.html reads the matrix (it already does); stack.html reads the certified-bundle receipts and the count; the "fourteen ship" sentence and its table agree because both come from the same summary | no prose change; regenerate |
| #1757 chart refresh | new versions, successor entries, retired pins | the chart index, entry pages and counts on the Catalog page | no prose change; regenerate |
Two rules follow. The knowledge pages are linked on GitHub, not rendered: knowledge/ stays backend under the rule in decision 1. And a shape the site reads (matrix.json, the certified-bundle summary, the pattern front matter) changes only with a note in the pull request, so the website stream updates the reader in the same week; the backend stream does not edit the generator.
Step 4 and step 9 below carry the site side of this; the two issues carry the data side.
The steps
Step 1. The nav fold and the Config page
New top bar and groups as in the target map; expectedNavLabels, the section sidebar (siteSections()), the footer (siteFooterNav) and the contract's shared-nav term list change together. config.html is registered and carries four sections:
- Follow one configuration from source to running. One telling of the lifecycle:
docs/user/confighub-data-model.md"From source to a reviewed base" (both sequences and the definition bullets) and "How the pieces fit", with the four questions fromdocs/user/model-and-vocabulary.md"Start with the question" stated once. The other sequences (skills/config-workshop/references/processing-model.md,docs/reference/config-catalog-doctrine.md) are cited, not moved; moving four numberings settles nothing. New: a short verb strip mappingcub config check --out,cub stack certify,cub variant upload,cub variant createandcub release publishonto the stages, and one paragraph saying the render-late lane rejoins at the base step. Also new: ConfigHub in one paragraph, the "config = component = base variant = Space" row, and the handoff order to stacks and apps, quotingstack.htmlandapps.html. - See what each format becomes. The "How each source uses the model" table and "The ways configuration enters" from
config-catalog-doctrine.md, and "The same objects in familiar terms" frommodel-and-vocabulary.md. New: a "what is checked" column and a link to an example entry per format, and one line each for Kubara and Sveltos as source types. The flattening column links the legend in section 3. - See whether a configuration can be flattened, and what that decides.
docs/reference/flattening-alignment.mdopening and "The four verdicts";docs/reference/certified-bundle-spec.md"The question this answers", "The pipeline" and "Boundaries";docs/reference/deciding-a-flattening-lane.md"The four lanes" and "What a decided lane does not mean". New: the lane legend with live counts fromdata/(today 104 of 246 audited bases refuse a flattened bundle), two plain examples of what a flattened render loses, and the chart-level verdict against the stack-level flattened release. - Choose a tool and start. One table:
cub workshop,cub installer,cub helm, the browser check, your own AI, with a "when" column, fromdocs/user/choosing-commands.md"Command Roles". The same table carries the door for a chart the catalog does not have: the "When your chart is not in the catalog" block from the Catalog page, with itscub installerdoor corrected (a chart without a package cannot be pulled), plus "Short Version" and "Graduation Path" fromchoosing-commands.mdand "The three public jobs" fromdocs/user/configuration-question-workflow.md. Only thecub server installrow comes fromdocs/planning/cub-noun-vocabulary.md;deployis marked planned wherever it appears.
Satellites folded to one sentence and a link: the Catalog page's "The model in five words", "What you can do with any entry", doors 1 to 3 and "When your chart is not in the catalog"; how-it-works.html section 1 (the four answers) and section 2 (materialization); ai.html section 2 (the four answers) and sections 4 and 5; docs.html "The processing model" block (the F1 to F4 labels stay in model-and-vocabulary.md, and the docs word table gains Materialize and Flatten); testing.html "Bring your own Helm chart and values"; ask.html "What happens to a public question"; offering.html section 5. The Catalog page's h2 cap and the config-model gate's page list move with the content. Fix in passing: the empty h3 above the Catalog search card, cub promote on the home page (not a shipped verb), and "from the public Catalog" where the article is missing.
Step 2. The Catalog page as store plus trust
Sections, in order: the hero (pick a tested configuration and check it yourself) with one sentence and a link to Config for the model; Search the catalog (the Helm table plus rows for the AICR, Timoni, plain-YAML and literal-OCI entries); What each catalog entry contains (kept: package, bases, bundle where the lane permits, routes, receipt, each item linking the Config section that explains it); Read each result correctly (the lane legend links Config section 3; quirk tags link quirks.html); See why the catalog offers several configurations (the values policy stays; the base definition links variants.html); Check why you can trust an entry (the essentials from proof.html: the counts, what each test covers, the three words verified, certified and signed defined here and only here, the one cosign command from docs/reference/installer-package-signing.md "Verify A Package", check one claim yourself, and "What stays available" with the two byte-drift cases); See what this catalog does not claim; Take an entry into a stack or into ConfigHub.
proof.html stays, demoted from the nav to the Catalog sub-page, with all seven of its sections: the harder charts, security before release, tests designed to expose failure, and the rest. Its "Project checks" paragraph moves to docs/user/verification.md. known-gaps.html and matrix.html join the Catalog group. index.html keeps the three words as links to the Catalog section.
Step 3. variants.html becomes the one page for bases and changes
Title: Turn a recipe and values into a base, and decide where a change belongs. It keeps its commands, flow and examples and gains the definitions: "Three variant layers" from model-and-vocabulary.md; "The whole chain, with the variants labeled" and "How To Tell What Set A Field" from docs/user/variants-after-upload.md; "The Claim", "What A Chart Preset Records" and "Where Each Setting Lives" from docs/user/helm-presets-and-values.md (the four-place table lives here once); "The Short Model" from docs/user/helm-render-intents.md; "What The Package Contains" from docs/user/installer-oci-packages.md; "Inside ConfigHub" from confighub-data-model.md for Unit, Space, base and derived; the three-line rule from "What Happens When You Bring Values?" and "Three Decisions", "Quick Routing Table" and "The OCI Boundary" from docs/user/change-routing-before-oci.md; the field lists from docs/user/custom-overlays.md; the replica and StorageClass nuance from docs/reference/customization-algorithm.md; docs/user/transform-oci-package.md as the bundle-level route. New: the four referents of "base" in one table, "recipe" and "declared inputs" defined for a newcomer, "a base Space has no target", and firm answers for image tag, namespace, replicas and StorageClass.
The rule is taught about twelve times today. Satellites folded to one sentence and a link: how-it-works.html section 3 in full; three ask.html FAQ rows ("What is a base variant?" among them); the operations.html "Where changes belong" link; one-liners on apps.html, stack.html and testing.html; the passages in helm-presets-and-values.md and docs/user/customization-decision-tree.md (the docs keep their other jobs).
Step 4. oci.html, the OCI shapes in one place
Title: Package and deliver it as OCI, and see what is signed. New: the nine-row shapes table (media type, layout, producer, consumer, registry, signed by whom), which consumer accepts which layout, the signing coverage matrix, a routing rule for the four verify commands, and a digest glossary. Moved: the transport paragraph and "The OCI packages are not all the same" from config-catalog-doctrine.md; "The artifact" and "The three forms and the digest rule" from docs/planning/oci-design-center.md; "Three OCI Roles" and "Public Pull Access" from installer-oci-packages.md; "Where OCI fits" and "Digest roles" from model-and-vocabulary.md; "The two OCI artifacts are different" from docs/user/cub-deployment-path.md; "What A Valid Signature Shows" from installer-package-signing.md; "The published form" and "Prior art and relatives" from docs/planning/stack-manifest-spec.md for Timoni, AICR and Kubara in one paragraph each. The five OCI-role tables that disagree (three roles, four roles, two artifacts) are reduced to links; the page records the open point that oci-design-center.md puts the receipt in a referrer and certified-bundle-spec.md puts it beside the bundle.
deploy-with-flux-or-argo.html owns the Argo CD 3.x and 2.x specifics and the Flux and Argo manifests; how-it-works.html section 4 and oci.html link there. The same page gains Run the catalog the way you already deliver, the table generated from the #1758 pattern pages: one row per family (rendered-manifest repositories first, then OCI sources, the d2 stack layouts, app-of-apps, overlays over rendered manifests, image automation, multi-cluster fleets, Helm without Helm in the cluster), each with what it assumes, the OCI shape that fits, the catalog or plugin command that produces that artifact, and a link to the knowledge page on GitHub. The generator gets a reader for the pattern front matter; until the first page lands the section renders its heading and one sentence saying the survey is under way, linked to the issue. The oci.html shapes table gains a "consumed by" column that points at the rows here. stack.html keeps its two stack OCI forms (the index from cub stack publish, the flattened image from cub stack sandbox --out oci://) and links the shapes table. Satellites: how-it-works.html section 1 OCI cards, three-job table and identity paragraph; the Catalog page's OCI sentences; docs.html three-digests line; deploy-with-flux-or-argo.html section 6 roles paragraph; operations.html package-versus-delivery paragraph.
Step 5. quirks.html rebuilt as the hooks and CRDs page
Title: See what happens to your chart's hooks, CRDs, and setup work. hooks.html already redirects here. New first: the contract paragraph (phases, the five disposition words, execution mode, the automatic: false rule, observe then execute then emit) and "who runs it today". Moved: docs/user/chart-hooks-what-happens.md whole (short answer, practical choices, what a route tells you, what you do, honest boundary); the worked examples keep their facts and link their receipts on GitHub. Cited, not moved: docs/reference/what-hook-support-means.md and docs/reference/hook-lifecycle-strategy.md, whose vocabularies differ from each other. Also moved: "The install order", "What happens to Helm hooks" and "What is still manual" from docs/demo/hooks-crds/kube-prometheus-stack.md; "What the catalog package does" from docs/demo/hooks-crds/argo-workflows.md; the opening and "How To Use This As A User" from docs/user/target-prerequisites.md; "Routes travel inside the bundle" from certified-bundle-spec.md; "Hooks under GitOps" from docs/user/gitops-adopter-guide.md; the ServiceMonitor-guard sentence from docs/demo/kubara/app-rollout.md. New: CRDs as one menu (subchart and umbrella cases, CRD-guarded objects), the hard-chart criteria, the required-setup terms, and which Argo and Flux mapping is generated versus advice.
Satellites: the Catalog page's "How the catalog handles required setup"; how-it-works.html sections 2 and 3 hook and CRD lines; four ask.html FAQ rows; testing.html hook lines; proof.html hook lines. The ask.html section and the promote.html h3 that share this page's title are renamed "What this chart still needs" with a link. Per-chart route tables stay on chart pages; stack.html keeps its CRD-before-CR certify rows.
Step 6. The roles, one sentence each
stack.html "What a stack is" owns stack, platform (the outcome of upload, place, govern) and fleet, drawing on docs/planning/stacks-platforms-apps-taxonomy.md "The nouns", "Platform: the outcome" and "The one model, in order", and keeps "Becoming a platform: upload, place, govern". apps.html owns app, app on a stack and app on a platform, and the standalone-app line from docs/planning/custom-stacks-and-apps.md. config.html section 1 owns ConfigHub (from what-config-workshop-is.md part 3 for the verbs and confighub-data-model.md "After ConfigHub"). confighub.html explains what ConfigHub adds and quotes the definition. The home page's "five words" paragraph, kubara.html's ten-second box, demo.html's Kubara headings and try-aicr.html quote the sentences; demo.html says "certify a whole stack" not "platform"; try-aicr.html says what "AICR platform" means; operations.html says "Build a ConfigHub App". The Kubara-tree-is-not-yet-a-platform line lands on kubara.html.
Step 7. The Operate hub around its four verbs
how-it-works.html gets four h2s in hero order: Release, Promote, Gate and approve, Roll back, each with its command rows, what changes, and its doc link. Its plugin table moves to stack.html; installer, local and OCI material to deploy-with-flux-or-argo.html and try.html; its account verbs stay in one table (the plugin verbs live on Config's tool table). The Operate docs are then placed across confighub.html, variants.html, operations.html and apps.html. Fleet operations (status, gates, rollouts) have no home yet; decide here whether they sit on stack.html or operations.html.
Step 8. The docs index by area, and the contributor group
Encode the doc-to-area map in docs/README.md (or a data file) and teach scripts/verify-doc-map.mjs the pattern first. Then regroup "Every doc, by area" on docs.html by the five buttons; a collapsed "For contributors" group holds the internal docs and the planning notes. Historical docs are labelled in docs/README.md, not moved: moving them would change their rendered URLs. Two descriptions in docs/README.md are wrong today and are corrected here. Add the missing How-do-I entries (choosing-commands, serverless-mode, helm-to-cub-migration, ci-render-check).
Step 9. The Stacks pages earn their titles
apps.html gets its promote half with real commands. kubara.html gets an explicit certify step between generate and package, with steps 1 to 6 contiguous, and keeps reading data/kubara-platform-matrix/matrix.json for what Kubara runs today, so the #1759 refresh shows at the next regeneration; the matrix view and the adapter snapshots are linked on GitHub. Sibling links in body prose (stack, kubara, apps, try-aicr). The stack count and its table come from data/certified-bundles/ (the data side is #1759). stack.html "What a stack is" and kubara.html each gain the d2 stack layouts from the #1758 pages whose family is d2-stacks, as layouts the catalog can build: what the layout is, which components it needs, and which are already catalog entries, read from the front matter and the chart index.
Step 10. Offering, names, and the one prose pass
offering.html gets one Free-local / Free-account / Commercial table, what triggers payment, and "free to start" said once; try-now folds into try.html; what-you-get, why-this-exists and offering become one intro under Config's tool table. Then one name per page: nav, sidebar, footer, title and h1 agree (confighub.html has four names today). Last, one house-style pass over whatever the moves left behind, so nothing is polished twice.
What has to be written new, ranked
Needed for step 1 to ship: the verb strip and the render-late rejoin paragraph; ConfigHub in one paragraph and the handoff order; the per-format "what is checked" column; the lane legend with live counts and two examples; the merged tool table with its "when" column and the corrected cub installer door. Needed by steps 3 to 5: the four referents of "base"; the firm answers for image tag, namespace, replicas and StorageClass; the nine-row OCI shapes table and the signing matrix; the hooks contract paragraph and the CRD menu. Everything else on the synthesis's list waits for the step that needs it.
Open questions for the maintainer
- The home page's verbatim text says every image is "verified, certified, and signed". The catalog bundles are not all signed today. Qualify the sentence, or sign the bundles first? The text is the maintainer's and is not changed without a decision.
- The public word: "base variant" everywhere, with "preset" named once as an alias? The two doc H1s that say "preset" would change too.
deployis used as a free verb on two pages and is not a shipped command. Mark it planned, or remove it until it ships?