Website SOP
Opplet Systems: The Official Website SOP
You're reading the public edition of Website SOP. The working source — drafts, change discussion, and member resources — lives in the community library.
Purpose and Scope
This SOP is the how for opplet.com. Its companion, the Official Website
Strategy (opplet-website), is the why — it explains what the site is and
why it is governed. This document explains how to operate it: how a page becomes
a governed document, how a content page declares what it is based on, how drift
is read and reconciled, and how the site is built and deployed.
It does not define the release procedure. Cutting a Charter Release —
re-pinning the set so it certifies coherent again — is the Custodian’s
responsibility under SOP §11, recorded in RELEASE.md. This SOP references
that procedure; it does not restate it.
1. Two Kinds of Page
Every page on the site is one of three things, and the difference is declared in front matter:
- a governed document — a charter document (Constitution, a Doctrine, an
SOP, a manifest, a course). It carries a
doc_id, adoc_version, and atier. It appears in the compatibility matrix and is pinned in releases. - a derived page — ordinary content whose description of Opplet’s approved
state is based on one or more governed documents. It carries
charter_refs(see §3). It does not appear in the matrix; instead it reports which documents it draws on, and whether they have moved since it was written. - an editorial page — everything else (history, the actors, rationale, comparisons). It carries neither. It is not governed and makes no coherence claim.
A page is never both a governed document and a derived page: one publishes the approved state, the other describes it.
2. Governed Documents
A page becomes a governed charter document by declaring, in front matter:
doc_id— a stable, unique identifier (e.g.software-stack). This is the key everything else references. It never changes casually; changing it silently breaks every reference that names it (see §6).doc_version— the document’s own version. Bump it whenever the document’s substance changes. This is the value the matrix compares against the release pin, and the value derived pages track.tier— an integer placing the document in the governance hierarchy. Tier labels live once inhugo.tomlunderparams.charterTiers(array position = tier number), shared by the matrix and the manifest so the two never disagree. A tier with no label falls into “Unfiled” rather than breaking the build — a signal to add the label, not a place to leave documents.
Optional meta fields — doc_name (full formal name), status,
effective_date — render in the document’s meta band if present.
A new governed document is not automatically part of a release. Until it is pinned, it shows in the matrix as Not yet released and appears in the drift report’s no pin yet list. That is correct: the review queue is telling you a decision is pending. It enters the certified set at the next reconciliation, per SOP §11.
3. Charter References (charter_refs)
A derived page declares its sources with a charter_refs list in front matter.
Each entry names one governed document and, optionally, the version the page was
written against:
| |
doc(required) — thedoc_idof a governed document.at(optional) — thedoc_versionthe page’s approved-state content was written against, as a string.
The optional at is the whole distinction between two modes:
- Baseline-tracked (
atpresent) — the page pins the version it was reconciled to. The system compares that baseline against the document’s currentdoc_versionand reports current (they match) or review (they differ). This is a live coherence check. - Cross-link only (
atabsent) — the page asserts a relationship but no baseline. It renders as a plain back-link, is never flagged as drifted (there is nothing to compare), and must be reviewed by hand when its source changes.
The expectation
Both modes are supported, but they are not equivalent, and the site should not drift into the cheaper one by default:
- A page whose approved-state content reflects a specific version of a
document SHOULD pin
at:. This is most derived pages. - A page that only relates to a document without tracking a particular
version MAY omit
at:.
Omitting at: because it is less work is how the coherence machinery quietly
stops doing anything. Pin the baseline unless there is a real reason not to.
Note that the comparison is symmetric: the system flags any mismatch between baseline and live version, not only a document that has moved ahead. If a baseline reads higher than the live document, that is also an incoherence worth surfacing.
4. Where Coherence Is Reported
The system computes coherence on two axes and never stores the result — every status is derived at build time from the live front matter.
- Axis 1 — document vs. release. Has a governed document moved ahead of the version pinned in the active release? Reported by the drift summary and the compatibility matrix.
- Axis 2 — derived page vs. source document. Has a page’s baseline fallen behind the document it was written against? Reported on each page’s sources band, on each document’s derived-pages list, and aggregated in the content-coherence rollup.
All of it converges on the Charter Status report (/charter-status/), which
carries both axes on one page: the drift summary, the full matrix, and the
content-coherence rollup. That page is the single pane for “is everything
coherent?” A derived page also shows its own status inline; a governed document
shows the pages that depend on it. The derived-pages list is computed, never
hand-maintained — adding charter_refs to a page makes it appear on its
sources’ pages automatically.
5. The Review Workflow
The point of the machinery is that a document changing tells you exactly what to
re-check. When a governed document’s doc_version is bumped:
- Open the document’s page (or the Charter Status report). Its derived-pages list — and the content-coherence rollup — now show every page whose baseline no longer matches, marked review.
- For each flagged page, do one of:
- Reconcile: update the page’s approved-state content to reflect the new
document version, then bump the page’s
at:to that version. - Confirm: if the page’s content was already correct for the new version,
bump
at:alone. The content did not need changing; the baseline did. In both cases the outcome is the same:at:again equals the document’s current version, and the page returns to current.
- Reconcile: update the page’s approved-state content to reflect the new
document version, then bump the page’s
- For cross-link-only pages (no
at:), the report cannot tell you whether they are stale — it lists them as linked without a baseline. Review them by hand when their source changes; that manual step is the price of omitting the baseline. - If a page shows Unknown source (a
charter_refsentry naming adoc_idwith no matching document), fix thedoc_idor remove the reference. The reference is pointing at nothing.
Reconciling pages is content maintenance and does not require a Charter Release. Releases pin the governed documents (Axis 1); page baselines (Axis 2) are tracked independently and reconciled as content changes.
6. Housekeeping That Preserves Coherence
Structural changes are where coherence silently breaks. The rules:
- Renaming a page’s URL — add an
aliases:entry in the page’s front matter for the old path. Governed-document URLs are linked from the footer, the breadcrumbs, and the meta band’s “part of {release}” link; renaming without an alias 404s all of them. - Removing a governed document — remove its pin from the release lockfile
under
data/releases/. A pin whose document no longer exists is surfaced in the matrix as Pinned, missing from content rather than silently vanishing — that flag is telling you to clear the stale pin (or restore the page). - Changing a
doc_id— update everycharter_refsentry that names the old id in the same change. A reference to a renamed id renders as Unknown source. - Adding a tier — add its label to
params.charterTiersinhugo.toml. Documents in an unlabelled tier fall into “Unfiled” until you do.
7. Build and Deploy
The site is a Hugo static build published by the Kitchen production GitLab pipeline. The deploy is designed so that no failed or interrupted build can take the live site down.
- The runner triggers; the server builds. The pipeline job carries
GIT_STRATEGY: noneand does not build on the runner. It opens an SSH session to the production server, which fetchesorigin/main, builds with Hugo, and publishes. A green pipeline therefore means “the trigger ran,” not “the site is verified” — always confirm the live URL after a deploy. - Build to staging, swap on success. Hugo builds into a staging directory
(
public_html.new); only a successful build is swapped into the livepublic_html, and the previous live copy is retained aspublic_html.bak. The live directory is untouched until a complete build is ready. An SSH drop, a hung build, or a killed runner leaves the live site serving the previous version. - One deploy at a time. The pipeline is
interruptiblewithauto_cancel.on_new_commit, so a new push cancels an in-flight deploy rather than letting two builds race over the same output. - A hung build fails fast. The job carries a short
timeoutso a stalled build errors quickly instead of occupying the runner until the global timeout. - Do not upgrade modules in the deploy. The deploy builds what is committed;
it does not run
hugo mod get -u. Chasing upstream module updates mid-deploy makes builds non-reproducible and can hang on a network call.
To deploy: push to main, or run a new pipeline on main. Watch the job to
completion, then load the site to confirm.
To roll back: the previous build is preserved as public_html.bak on the
server. Restoring it is the fast recovery if a build is green but wrong. A clean
rebuild from a known-good commit is the alternative.
8. The Site Reports on Itself
Because the site publishes the governance, its own governed documents must not
drift from the corpus they carry, and its derived pages must not fall behind the
documents they describe. Both are visible on the Charter Status report. This SOP,
opplet-website, and every other governed document are pinned in releases like
any other; this page’s own doc_version moves when these procedures change
materially, the matrix flags it, and it is reconciled into the next release.
Changelog
v1.0 (2026-07-03) — Initial
- First issue. Documents the mechanics of running opplet.com as a governed
system: the governed/derived/editorial page distinction, the
charter_refsschema and the baseline-vs-cross-link expectation, the two coherence axes and where they are reported, the review workflow, structural housekeeping, and the hardened build/deploy procedure. - Pairs with
opplet-website(the strategy/doctrine) as its operational companion. References the release procedure (SOP §11,RELEASE.md) rather than restating it. Reconciles to Constitution v12.8.
END OF DOCUMENT
All charter documents
- Tier 0 — Keystone: Opplet Constitution
- Tier 1 — Doctrine & Architecture: Enclave Doctrine, Commons Doctrine, WiseNxt Doctrine, Workplace Doctrine
- Tier 2 — Manifests & Reports: Software Stack, Hardware Manifest, URL Nomenclature, Opplet.Com Website
- Tier 3 — Operations & Learning: Commons SOP, Enclave SOP, Enclave Bootcamp, Commons Welcome, Space Organizer, WiseNxt SOP, WiseNxt Orientation, Workplace SOP, Website SOP (this document)
- Tier 4 — Zone Projects: Den Migration