docs(corpus): add deployment corpus template - #1536
Conversation
Closes #1336. Defines the corpus template for a system's deployment view: which container instances run on what infrastructure, in which named environment, and how that mapping changes across environments. Grounded in arc42 section 7 and the C4 model's Deployment diagram, fetched directly from their primary sources, plus a worked, evidence- checked illustration from this repository's own docker-compose.yml and Helm charts. Signed-off-by: Serina Mcfall <serina.mcfall@gmail.com>
tucktuck101
left a comment
There was a problem hiding this comment.
Review — deployment corpus template
Every external citation I sampled holds (arc42 overview and §7, C4 home/deployment/container,
Mermaid syntax reference) and the Helm-profile facts are accurate. But this template instructs
every future deployment node to record exactly the class of detail this repository forbids in
tracked files, and nothing in its 588 lines says not to.
Blocking — nothing forbids recording private hostnames, endpoints, registry paths or credentials
Required section 5 (:356-360) makes it a MUST to record "One row per deployment node (a host,
VM, Kubernetes cluster or namespace, PaaS instance) and per infrastructure node (load balancer,
ingress, DNS, firewall) shown in the diagram(s): its name, its kind, and a one-line statement
of what runs on it or what it fronts." Section 4 requires a per-environment column for "how secrets
are provisioned". The evidence rules at :437-441 push authors off README prose and onto "a
Terraform/Pulumi resource" and "a CI/CD pipeline step that provisions it", and :447-458 tells them
to state what a private repository's documentation says, naming squareup/block-coder-tf-stacks.
I searched all 588 lines for must not (record|include|name|paste|quote), do not (record|include|paste|quote) and redact: zero matches. There is no rule anywhere against
recording a private hostname, cluster endpoint, internal registry path, IP or credential, and no
safe-reference convention offered in their place.
That contradicts three merged cohort documents:
launchpad/AGENTS.md:332-334— "This repository is public. Every file you commit is
world-readable. Config is fine; credentials never are." and "Never add a secret, key, token, or
private hostname to a tracked file."launchpad/ENVIRONMENTS.md:29-30— "No hostnames.AGENTS.md§8 forbids private hostnames in
tracked files, and the VPS hostname is not decided anyway."launchpad/SECURITY-POSTURE.md:185-198— "being concrete is how operational detail reaches a
world-readable file" and "Nothing detects a violation of section 8 ... Compliance therefore rests
on the attention of whoever is writing."
That last line is why this is blocking rather than medium: there is no automated backstop, so the
template is the control. Every future deployment node inherits this instruction.
Fix: add a "What must never be recorded" rule before section 4, and a safe-reference convention the
inventory columns point at — record the role and the configuration key, never the value (e.g. "the
managed Postgres addressed by externalPostgresql.url, credentials held in the cluster Secret named
by secrets.existingSecret"). Extend the same rule to the Terraform/CI evidence citations at
:437-441 and :447-458, citing launchpad/AGENTS.md §8 the way ENVIRONMENTS.md:29 does.
Medium — upstream chart profiles are presented as this fork's environments
:404-411 says the worked table maps "three environments this repository actually defines" — Local
development, Quickstart / eval, Production. The merged cohort document that owns where Buzz runs is
launchpad/ENVIRONMENTS.md:20-27, and its four rows are Local development (IMPLEMENTED),
Local VM harness (OPEN, #17/#19), Cohort VPS (OPEN, #21/#22) and Contributors' machines
(OPEN, #43). Neither ENVIRONMENTS.md nor the cohort VPS appears anywhere in this node.
"Quickstart / eval" and "Production" are deploy/charts/buzz's two values profiles — upstream
Block's chart, as your own ghcr.io/block/buzz finding shows — and the ArgoCD/staging-cluster path
is upstream's pipeline in private repos, not the cohort's. Every individual fact in the table is
true; the framing would lead a first instance author to document a "Production" Kubernetes
deployment the cohort does not operate. Relabel rows two and three as chart profiles, and add
launchpad/ENVIRONMENTS.md to the Scope-and-authority pointer table as owner of the environment
list.
Not findings, ruled out on evidence
- Index registration: the corpus
AGENTS.mdandREADME.mdboth state that indexes are
generated derived views, never hand-authored, and the ten-step "Creating a node" procedure has
no registration step. All 26 template PRs leavingAGENTS.mduntouched is correct. - CI green at head (latest run per check); node validates clean.
Reviewed by tucktuck101's review lane. Every failing claim reported above was reproduced by me against this PR head before posting.
Address tucktuck101's Blocking finding on PR #1536: the deployment corpus template required an environment inventory, a deployment/infrastructure node inventory, and evidence citations (including to another repository's own docs), but nowhere forbade recording a live secret, hostname, endpoint or credential value while doing so -- contradicting launchpad/AGENTS.md §8 ("Never add a secret, key, token, or private hostname to a tracked file"), launchpad/ENVIRONMENTS.md's "No hostnames" rule, and launchpad/SECURITY-POSTURE.md's point that nothing automatically catches a §8 violation. Add required section 4, "Secrets and sensitive values", modeled on configuration.md's (PR #1543) Secrets discipline section: point at the role and the configuration reference (a Helm value, a Secret name, a Terraform resource), never the literal value. Renumber the remaining required sections 5-8 accordingly, add pointer notes to the environment and node inventory items (5, 6), and extend the same rule into Evidence expectations so citing real configuration or another repository's documentation still never means quoting a secret-shaped value out of it. Does not touch the Medium finding (upstream Helm profiles presented as this fork's own environments) -- that is tracked separately as issue #1713. corpus validate.py: PASS, no new errors (same 15 pre-existing UNVERIFIED notices for commit-reference and external-URL citations). Unit test suite (launchpad/project-intelligence/corpus/tests/test_validate.py): 79 passed. Signed-off-by: Serina Mcfall <serina.mcfall@gmail.com>
Blocking finding resolved: secrets/hostnames rule added to the deployment templateRe-verified tucktuck101's CHANGES_REQUESTED review (commit Blocking (fixed in
Remaining required sections renumbered 5-8 accordingly. Medium (upstream Helm profiles presented as this fork's environments): left untouched, per the task's instruction — already tracked as #1713.
|
What
Adds
launchpad/docs/corpus/templates/deployment.md(
id: corpus-template-deployment) — the corpus template for a system'sdeployment view: which container instances run on what infrastructure, in
which named environment, and how that mapping changes across environments,
per PRD #605.
Closes #1336
Issue type
Task
Note on this issue's definition of done
Issue #1336's Definition of Done carries a MUST/SHOULD/enforcement/exception
checklist copied verbatim from the standards-track issues (the ones that
produced
standards/confidence.mdandstandards/decision-references.md).That checklist describes a policy/standard node, not a template. This node is
built against #605's actual template acceptance criterion instead: every
template states its purpose, required sections, evidence expectations and the
industry model/standard it adapts. The rest of #1336's checklist (one
hand-authored document, schema-valid front matter, one independently
maintainable idea, traceable FACT/INFERENCE/TEAM_KNOWLEDGE claims, links
instead of duplication, checked against the recorded revision, clean validator
run) is generic to any corpus node and is honoured as written. The document's
own "Scope and authority" section states this same note in place — the
identical situation batch 1's architecture-container template (#1327, PR
#1529) records for itself.
typechoiceUsed
type: governance.node.schema.json's enum has notemplateorpolicyvalue (PRD #602's corpus-surface list only). Checkedschema/README.mdandschema/COMPATIBILITY.mddirectly, not just thebrief — neither names a template- or policy-specific enum value.
governancematches every existing corpus meta-document exceptAGENTS.md(
type: agent):README.md,standards/confidence.md,standards/decision-references.md.The node's own evidence ledger separately reasons about what a real
instance written from this template would use: most plausibly
type: architecture, reasoned against two considered-and-set-asidealternatives —
type: platforms(this repository's own sense of "platforms"is client platforms — desktop/web/mobile — not infrastructure) and
type: operations(independently claimed for the sibling runbook template,#1347, by its own PR #1527, which states operations is "the natural fit for
an operational document" — a different kind of subject than a structural
view). This template document itself is not such an instance.
Relationships
Declared none, and checked before deciding that rather than assuming it.
git ls-tree -r --name-only origin/launchpad -- launchpad/docs/corpusatcommit
a44cf52fc740ebebbdd671427480d14f0bce0115shows exactly fourvalidated content nodes:
corpus-agents,corpus-readme,corpus-standard-confidence,corpus-standard-decision-references(
schema/excluded from validation). None has deployment, infrastructure,environments, arc42 or C4 as its subject, so an edge to any of them would be a
citation duplicate of what the evidence ledger already cites directly, not a
substantive typed relationship. The document's own "Scope and omissions"
section names the most likely future edges (
depends-ontargeting a mergedarchitecture-container instance;
implementstargeting a future per-typediagram standard, #1312, once it merges) and explains why no sibling
architecture/template node can be targeted today — all are being authored in
parallel with none merged when review starts on the others.
One relationship question is deliberately left open rather than forced: the
document's "Relationships an instance node should consider" section explains
why a
part-ofedge from a deployment view to an architecture-context view isnot obviously the right shape (the C4 source places Deployment outside the
context→container→component hierarchy
part-ofwas modeled on for thecontainer template), and leaves that for a future author with two real
instances in hand rather than resolving it in the abstract here.
Research-note grounding
launchpad/Research/project-documentation-templates.md(unmerged PR #1466)lists arc42's twelve sections including "7. Deployment View" and states the
C4 model's diagrams are "diagrams, not prose" that "slots into arc42 §3/§5/§7
rather than competing with it" — naming §7 as one of the sections C4's
diagrams slot into, though the note never itself elaborates on the Deployment
diagram or the container/deployment boundary. Cited as
TEAM_KNOWLEDGEattributed to
launchpad-26/buzz#1466 (unmerged research note), neverFACT, per the batch brief.Everything else this document asserts about arc42 and C4 was independently
fetched and read from the primary sources
(
arc42.org/overview,docs.arc42.org/section-7/,c4model.com/,c4model.com/diagrams/deployment,c4model.com/abstractions/container) andcited as
FACTagainst those URLs — including the container/deploymentboundary itself, which rests on
c4model.com's own worked example (three webapplications sharing one Tomcat server in development, each on a dedicated
server in production, remaining "the same C4 container" throughout, "with the
deployment being a separate concern").
The already-open architecture-container PR (#1529, issue #1327) was read in
full (
gh pr view/gh pr diff) per the batch brief's specific instruction,so this document does not restate its container-vs-deployment reasoning. One
self-review correction is worth flagging here: an earlier draft of this
document's evidence ledger attributed an elaborate boundary framing to #1529
as if it were a direct quote; on re-checking #1529's actual diff text, that
elaborate framing was this document's own synthesis of the C4 primary source
(already cited separately as FACT), not something #1529 itself states in
those words. The ledger entry was corrected to quote #1529's actual, terser
language and attribute the synthesis to this document instead.
Worked illustration
The document's "What counts as a deployment node..." section includes a
worked, evidence-checked illustration mapping the same container
(
buzz-relay, whose C4-container identity issue #1327's templateestablished) across three environments this repository actually defines:
local development (
docker-compose.yml, relay run outside the compose fileper
CLAUDE.md'sjust relay), quickstart/eval (deploy/charts/buzz,quickstart=true, bundled in-cluster dependencies), and production(
deploy/charts/buzz, default profile, external managed dependencies,GitOps via ArgoCD/Flux). It also surfaces and deliberately leaves unresolved
a real discrepancy: the chart's default
image.repositoryisghcr.io/block/buzzwhile this fork's ownDockerfile/docker.ymlpublishto
ghcr.io/launchpad-26/buzz— named as a gap in the node's own"Expected but not verified" section rather than silently resolved either way.
Verify-gate and validator evidence
Run as a lone command from this worktree immediately before commit, nothing
piped or redirected; the pre-commit hook's
.claude/.verifiedgate acceptedthe commit.
All 15
UNVERIFIEDnotices are the expected shapes (commit-referenceprovenance citations, and external URLs to arc42.org/docs.arc42.org/c4model.com
that the validator can't pin or open) — none are errors.
Process notes
actual repository files and the actual text of PR docs(corpus): add architecture-container template #1529/docs(corpus): define the runbook corpus template #1527/issues
feature: documentation corpus contract is executable #605/task: define the deployment corpus template #1336/task: the mandatory cross-model review gate has a single provider, and it is unavailable #1467, not just this document's own claims) found and this PR
fixes four real defects before opening: (1) the docs(corpus): add architecture-container template #1529 boundary-attribution
issue described above; (2) a
buzz-relay-is-a-container claim classifiedentirely as
TEAM_KNOWLEDGEeven though the underlying files(
crates/buzz-relay/Cargo.toml,src/main.rs) were independentlyre-opened for this node — split into a proper
FACTciting those twofiles directly, plus a separate
TEAM_KNOWLEDGEentry for theattribution to docs(corpus): add architecture-container template #1529's own established identification; (3) the
Dockerfile/
docker.ymltriggerFACTomittedworkflow_dispatchand thepull_requestpath filter, understating what the workflow's ownon:block says — corrected to name all three trigger kinds; (4) two
INFERENCEentries and oneTEAM_KNOWLEDGEentry about a futureinstance's likely
typevalue had no corresponding body-prose section —added a short paragraph to "Scope and authority" connecting them, rather
than leaving the claim only in the ledger.
provider (Codex) as currently unavailable (out of credits, confirmed
twice, no other external-model CLI installed); a same-model
(self-adversarial) review pass was substituted, per the batch brief.
Escalations
None filed. No finding from self-review fell outside this node's own scope —
all four were defects in this document's own evidence ledger, fixed directly
per the "Blocker → fix now" branch of the batch brief's findings policy.