Documentation Governance Standard¶
Standard ID: STD-DOC-001 Purpose: Establish the immutable rules for documentation location, naming, lifecycle, and change impact across the Bluefly platform.
Scope: §1–§7 govern the blucity-docs repository. §8 governs the estate — the boundary
between this repository, a project's docs/, a project's .agents/, and a project's GitLab
wiki, and the publication path from Git to ContextControl and Gemini Notebook. Naming and
front-matter detail for documents inside Engineering-Standard/ is delegated to
naming-convention-and-taxonomy.md (STD-034); repository
layout outside this one is delegated to
repository-structure-standard.md (STD-REPO-001). Those
standards are referenced, not restated.
1. Documentation Location Standard¶
Documentation is code. Its canonical location is the blueflyio/blu/blucity-docs
GitLab repository, on release/v0.1.x merging to main — not any workstation
or NAS mount. Paths below are repository-relative; do not hardcode a local
mount (/Volumes/...) or workstation (~) path as canonical anywhere
in this repository's own documentation.
Reference resolution (binding): cite documentation by repository-relative
path (Engineering-Standard/..., products/..., Playbooks/...), optionally
with an explicit Git ref or commit SHA when the exact version matters. A
host-absolute path is never a documentation-authority reference — absolute
paths may still be valid when they intentionally describe an implementation
worktree, runtime location, mount, or execution path. When auditing a stale
reference, classify it before editing: (1) documentation-authority claim —
correct it to the repository-relative canonical path; (2) implementation or
runtime path — preserve it unless the runtime topology itself is stale, and
route that correction to the owning architecture/runtime document; (3)
historical record under _ARCHIVE/ — do not rewrite history merely to match
current topology.
Top-level directories, OBSERVED 2026-09-20 against release/v0.1.x after trunk
reconciliation. This list is the permitted set: a directory not named here does not
exist in this repository, and one that exists but is not named here is a defect in one of
the two.
Engineering-Standard/(CANONICAL_ALLOWED): cross-platform authoritative engineering guidance (constitutions, architecture boundaries, standards, catalogs, authority sources). Its internal layout is governed byES-STRUCTURE-001and routed by §7.3 below.Playbooks/(CANONICAL_ALLOWED): executable operational procedures (recovery, deployment, incident response). Capitalised. The lowercasePlaybooks/spelling used elsewhere in older text is the same directory on a case-insensitive filesystem and the wrong spelling in Git; cite it asPlaybooks/.ledger/(CANONICAL_ALLOWED): the evidence home — audit receipts, command output, verification records, dated operator directives, handoffs. Evidence does not become architecture. Append-only: a ledger entry records what was observed at a point in time and is superseded by a later entry, never edited to agree with the present.products/(CANONICAL_ALLOWED): product descriptions, architecture, offerings — documentation about products, never their implementation source (seegovernance/documentation-implementation-boundary-contract.md).strategy/(CANONICAL_ALLOWED): durable cross-product strategy and go-to-market position. Not a plan tracker — active work is Beads.projections/(CANONICAL_ALLOWED): derived read-models (currently Dolt SQL exports). Read-only; MUST declareSOURCE_AUTHORITY=,GENERATED_AT=,DERIVED_FROM=. Never hand-edited.scripts/(CANONICAL_ALLOWED): validation and generation tooling for this repository's own CI. Not a general script dump; anything an operator runs by hand belongs inPlaybooks/or a CLI.docs-upstreams/(CANONICAL_ALLOWED): Git submodules of upstream documentation (e.g. Gas City). Read-only mirrors — never edited here; corrections go upstream..agents/(CANONICAL_ALLOWED): this repository's own agent contract and skills. Governed bySTD-REPO-001§2, not by this section.- Repository-Local (other repositories): owns ONLY repository purpose, dev setup, build instructions, tests, and API usage. Repository docs MUST reference central standards rather than duplicate them. See §8.
Retired names. Evidence/, Research/, reference/, assets/ and _ARCHIVE/ were
named as top-level homes by earlier revisions of this standard and do not exist in this
repository. ledger/ is the evidence home; static reference material lives in
Engineering-Standard/reference/; superseded material is marked status: superseded in
place rather than moved to an archive directory. Do not recreate the retired names, and
treat any link pointing into them as a broken link to be retargeted (§4).
No other top-level directory is permitted without updating this list first.
2. Documentation Naming Standard¶
- Use stable, descriptive, lowercase kebab-case filenames (e.g.,
documentation-governance-standard.md). - Allowed conventional names:
README.md,AGENTS.md,llms.txt,OWNERSHIP.md,CLAUDE.md,GEMINI.md,CHANGELOG.md,CONTRIBUTING.md,SECURITY.md,LICENSE. Published-site AI companions (ai.txt,developer-ai.txt,faq-ai.txt) are allowed only as LLM-facing indexes (see Drupal profile below), never as a second constitution. - Prohibited terms:
final,latest,new,newer,updated,fixed,real,copy,v2,v3,draft-final,old,temp,misc. - Do not rename files only to satisfy style if it breaks established tooling.
- Exceptions to kebab-case — allowed only when justified by one of:
- a formal identifier scheme with its own numbering convention (e.g.
ADR-0008-*.md,APPLE-001-*.md) - an externally-defined protocol/spec name that must match upstream exactly
- a generated filename whose casing is produced by the generator, not hand-chosen Do not extend this list to justify an otherwise-ordinary document keeping PascalCase or SCREAMING-CASE out of habit.
3. Documentation Lifecycle¶
Every discovered document must possess ONE state:
CANONICALREFERENCEREPOSITORY-LOCALPLAYBOOKEVIDENCERESEARCHGENERATEDHISTORICALARCHIVEDSUPERSEDEDCANDIDATE-DELETE
Canonical status requires: correct owner, correct location, current content, active references, and no stronger competing document.
3.1 Knowledge Promotion Tiers¶
Knowledge is not born canonical. Every written finding moves upward through three tiers, in one direction, and each transition is gated (§3.2). The tiers map onto the top-level directories in §1 and onto the Drupal-specific promotion classes in the Bluefly.io content-architecture specification §28 (products/Bluefly.io/bluefly-io-content-architecture-and-central-drupal-knowledge.md), which is the worked example of this section for Drupal findings.
| Tier | Home | Authority | What belongs here |
|---|---|---|---|
| 1 — Working knowledge ("work it out") | the owning project repository or its Bead; Research/ when it must live in this repository (exit condition required, §1) |
none — never cited as policy | hypotheses, proposals, investigations, exact entity IDs, temporary scripts, one-off migration exceptions, current branch/MR state, local bug reproduction, site-specific copy |
| 2 — Verified evidence ("prove it") | ledger/ |
evidentiary — records what was observed, measured, or executed, by whom, when | dated audits, measurements, implementation receipts, migration results, failures and corrections, proof that supports a later standard |
| 3 — Canonical knowledge ("govern by it") | Engineering-Standard/reference/ (reference knowledge), Engineering-Standard/standards/ and rules/ (normative), Playbooks/ (repeatable execution method) |
canonical — binding on agents, CI, and contributors | current ecosystem maps and ownership matrices (reference); rules Bluefly has accepted as how work is performed (standard); lessons that have become a repeatable procedure (playbook) |
Ledger entries are append-only: a correction is a new sibling entry, never a rewrite. Evidence supports a standard; it never becomes one without passing Gate 2.
3.2 Promotion Gates¶
Gate 1 — working knowledge → ledger/. Every condition must be YES:
| Condition | Meaning |
|---|---|
EVIDENCE_EXISTS |
Primary artifacts exist: tool output, runtime logs, receipts, measurements. |
CLAIMS_VERIFIED |
Every mechanism or capability claim was tested against real runtime or source code. |
CONTRADICTIONS_RESOLVED |
No unresolved conflicting claim remains in the artifact. |
SOURCE_PROVENANCE_RECORDED |
Sources, upstream commit SHAs, pipeline IDs, and tools are cited. |
STATUS_CONFIRMED |
The observed state is certified by the executing agent or a witness. |
Any NO → the material stays in Tier 1.
Gate 2 — ledger/ → Engineering-Standard/ or Playbooks/. Every condition must be YES:
| Condition | Meaning |
|---|---|
VERIFIED |
Backed by durable ledger receipts or verified upstream documentation. |
DURABLE |
Describes permanent architecture or accepted practice, not transient runtime state. |
ADOPTED |
Bluefly has accepted it as policy, architecture, or repeatable method (BLU or operator approval). |
EXISTING_OWNER_CHECKED |
qmd query or grep located the existing canonical owner (§7.6) and the change extends it in place. |
NO_DUPLICATE_CREATED |
No parallel, -v2, or second-authority file was created. |
Any NO → the material stays in ledger/ as reference proof.
3.3 Index and Naming Consequences¶
Engineering-Standard/indexes/BLU-BIBLE.mdindexes Tier 3 documents only. Tier 1 material and individual ledger entries are never listed alongside canonical documents as equal authority; BLU-BIBLE may link to a ledger index, not to receipts. A Tier 1 or Tier 2 document found in BLU-BIBLE is removed from the index; if it also sits underEngineering-Standard/, it is demoted — moved to its tier, links purged, and a receipt filed inledger/.- Tier markers (
provisional,draft,wip,temp,v2,new,fixed) are prohibited inEngineering-Standard/filenames and titles. Status is carried by the lifecycle state above and by front matter, not by the filename (§2).
4. Change-Impact Alignment Workflow¶
Platform changes often invalidate multiple documents. Any agent making a platform-affecting change MUST execute the following documentation-impact workflow:
- Identify: Identify the exact capability changed.
- Search QMD: Search QMD for all documents mentioning the capability.
- Identify Canonical: Identify the canonical standard affected.
- Update Local: Update repository-local docs.
- Update Playbooks: Update affected playbooks.
- Update Visuals: Update diagrams and examples.
- Mark Superseded: Mark old or competing documents as SUPERSEDED and archive them.
- Verify Links: Verify all cross-references and links.
- Reindex: Reindex the search system (
qmd). - Receipt: Include the documentation impact in the MR (Merge Request) receipt.
This sequence is part of the core engineering workflow. Work is not complete until documentation is aligned.
5. Repository Documentation Ownership¶
- Drupal CMS Projects: Any repository containing an underscore
_(e.g.,agent_api,ai_agents_claude) is a Drupal CMS project. Its canonical documentation is owned by the Product (Drupal). - Platform/Infrastructure: Any repository using hyphens (e.g.,
blu-cli,agent-docker) is owned by the Engineering Standard, unless repository evidence proves otherwise.
For a full index of Canonical Documents and Archives, consult:
* Engineering-Standard/governance/canonical-index.md
* Engineering-Standard/governance/repository-classification.md
6. Project Root Interface Contract¶
Repository root is an interface, not a dumping ground. Applies to active Bluefly-owned software projects — not upstream mirrors, vendored source, archived repos, generated-only artifacts, or repos whose ecosystem requires a different top-level contract.
See also: repository-structure-standard.md owns everything below the
root-file layer — the .agents/ internal taxonomy (skills/, context/,
roles/), tool-state directory boundaries (.beads/, .qmd/, .codegraph/,
.claude/), .well-known/, .gitlab/duo/, openapi/, packages/,
scripts/, src/, container placement, and tests conventions. This section
owns only the root-file contract below; do not duplicate the above there.
Mandatory Root Files¶
| File | Contract |
|---|---|
README.md |
What the project is, does, how to use it; dev setup, build, test |
AGENTS.md |
Scoped operational instructions (always-on; keep small) |
llms.txt |
Retrieval/discovery index (llmstxt.org v2) |
OWNERSHIP.md |
What this project owns, what it doesn't, upstream/downstream, authority |
.agents/ |
Agent capabilities, skills, and scoped context — preserve; never delete, flatten, replace, or bypass |
Short starting templates for all four, plus the conditional ARCHITECTURE.md
and the thin CLAUDE.md adapter, live at
Engineering-Standard/templates/repository-root/. Instantiate one, delete
sections that don't apply. Do not leave placeholder sections in production
repositories.
These root surfaces have distinct purposes — do not collapse them into one document. They implement three external contracts:
| File | Audience | External contract | Size rule |
|---|---|---|---|
README.md |
Humans | agents.md — keep READMEs for humans | Short; no agent operating law |
AGENTS.md |
Coding agents | agents.md — how to work in this repo | Operational only. Nested files: closest AGENTS.md to the edited file wins; an explicit user prompt overrides both. Do not paste catalogs, ADRs, or Engineering-Standard prose. |
llms.txt |
Any LLM fetching this path | llmstxt.org v2 | Tiny index. Detail lives behind links. |
CLAUDE.md / GEMINI.md |
One vendor | Tool requires that filename | Thin pointer to AGENTS.md (< 10 lines). Claude Code auto-loads CLAUDE.md every session (context window); keep it under 200 lines, prefer the pointer. |
llms.txt v2 format¶
One llms.txt per path it covers. Agents use the most specific file when more
than one applies. The file must follow llmstxt.org v2, in this order:
- Optional BOM
- An H1 with the project or site name (required; the only required section)
- A blockquote with a short summary
- Zero or more markdown blocks without headings — interpretation notes
- Zero or more H2 sections whose bodies are file lists:
- [name](url): optional notes - By convention, an H2 named
Optionalfor links an agent may skip when context is tight
Links must point at LLM-friendly markdown (repo files, or HTML pages that also
publish .md / rel="alternate" type="text/markdown"). Do not paste the
linked content into llms.txt. The index must stay small enough to load in
one context window; the encyclopedia belongs behind the links.
Where a site is published, also expose rel="describedby" to that path's
llms.txt. Path-local files (/docs/llms.txt) cover that path, not the whole
origin. Do not put llms.txt only in /.well-known/ — authors who control
a subpath cannot publish there.
Agent context budget¶
Auto-loaded instruction files compete with real work for the same window.
- Put always-on operating law in root
AGENTS.md. - Put directory-specific conventions in nested
AGENTS.mdor path-scoped rules (.claude/rules/withpaths:), not in the root file. - Put catalogs, org lists, and "further reading" in
llms.txtOptional, not inAGENTS.mdorCLAUDE.md. - Do not auto-load encyclopedias. File reads dominate context; be path-specific. Use a subagent for research-heavy reads so those tokens stay out of the parent window.
- Claude Code:
/compactbefore a long new task. Do not use a reasoning session as a timer, poller, or message bus. Auto memory is the first 200 lines or 25KB ofMEMORY.md— keep it small. After compaction, skill descriptions do not reload; keep important skill instructions at the top ofSKILL.md. - Nested
llms.txtonly at path boundaries that need a different index (a published subpath, a monorepo component root). Identical copies insrc/,tests/,ci/,web/modules/**, or every subdirectory areCONTEXT_POISONING: most-specific path wins, so a cloned dump replaces the curated root index and burns context. Delete those clones; do not "sync" them.
Conditional Root Files¶
Include only if applicable:
| File | When |
|---|---|
ARCHITECTURE.md |
System design is non-obvious; durable structure only |
DEPLOY.md |
Application/service deploys independently (see repository-structure-standard.md §11); never for libraries that don't deploy on their own |
CONTRIBUTING.md |
External contributions accepted or complex contributor workflow |
SECURITY.md |
Security contact, vulnerability reporting policy (prefer a pointer to org-wide policy) |
CHANGELOG.md |
Releases/packages published; user-facing changes only, not a work journal |
LICENSE |
Legal requirement matching package.json/composer.json license |
CODEOWNERS |
Actual human/team ownership is known; don't invent owners to populate it |
llms.txt Variants Rule¶
Do not create llms-full.txt, llms-detailed.txt, or other parallel indexes.
v2 already has an Optional section for skippable links. Extra files are a
context-window defect unless an engineering requirement is documented in
AGENTS.md.
If a single llms.txt is insufficient:
- Verify: Confirm that standard
llms.txtgenuinely cannot express the routing. (Usually it can.) - Document in AGENTS.md: Explain why multiple index files exist and how agents should choose between them.
- Name clearly: Use explicit, stable names; never use suffixes like
-new,-old,-v2,-temp. - Deprecate unused variants: Mark stale llms.txt files for deletion or archive them.
Default: One llms.txt per repository. That is sufficient.
Prohibited Root Files¶
DO NOT create these to track live engineering state — a project may use one only when a proven product or ecosystem contract owns it:
TODO.md,STATUS.md,PLAN.md,NOTES.md,ROADMAP.md— work lives in Beads (bd)ISSUES.md— issues live in GitLab, not repository markdownCONTEXT.md,MEMORY.md,PROMPT.md— usellms.txt, not competing filesSOUL.md,MISSION.md,VISION.md,AUTHORITY.md— mission belongs in README/OWNERSHIP, authority belongs in OWNERSHIPVISION.md,QUICKSTART.md,INSTALL.md,INTEGRATION_GUIDE.md,PROJECT_SUMMARY.md— fold into README.md and AGENTS.md; do not sprawl root
Why: Beads own durable work state. GitLab MRs own source delivery. CI/runtime own verification. Repository markdown cannot be authoritative for live state. Root file sprawl obscures the canonical interface.
Vendor-Specific Agent Files¶
AGENTS.md is the canonical repository agent instruction surface. Do not
maintain divergent full copies (CLAUDE.md, GEMINI.md, other
tool-specific files) that merely repeat it.
If a tool genuinely requires another filename (verified by actual tool documentation, not assumption):
- Use only a thin pointer file (target < 10 lines, hard cap 200) that
references
AGENTS.md. Claude Code auto-loadsCLAUDE.mdevery session; a second copy of the contract wastes the context window.# <Tool Name> Instructions See [AGENTS.md](AGENTS.md) for the authoritative repository operating contract. See [llms.txt](llms.txt) for the on-demand index. -
Claude Code auto-loads project
CLAUDE.mdand~/.claude/CLAUDE.mdbefore the first prompt. A resource dump in either file is paid on every session. Keep Claude-only setup here; keep operating law inAGENTS.md. -
Do not maintain multiple independently edited agent constitutions.
- Do not create per-developer variants (e.g.,
CLAUDE.local.md,GEMINI.local.md). - Verify tool requirement before creating the file.
- Delete outdated vendor files when a tool ceases to be active.
Keep AGENTS.md authoritative — it is the single operating contract.
Root Hygiene¶
Every root item must be justified as one of:
STANDARD_PROJECT_INTERFACEECOSYSTEM_REQUIRED(upstream mandate)BUILD_REQUIRED(CI files, build scripts)GOVERNANCE_REQUIRED(license, CODEOWNERS)SOURCE_ENTRYPOINT(main entry file)
Generic Bluefly-owned directories (scripts/, stuff/, misc/, helpers/,
utils/, temp/, old/, backup/, scratch/) are suspect until
justified — they are not automatically illegal, and upstream/ecosystem
convention always wins. Do not rename a framework-required or
ecosystem-standard directory merely because its name appears above.
Ecosystem-Native Profiles¶
Preserve framework conventions; do not force uniform internal structure across project types.
npm/TypeScript: src/, tests/, package.json, one lockfile (matching
the selected package manager: package-lock.json for npm, pnpm-lock.yaml
for pnpm, yarn.lock for Yarn), bin/ for actual CLI entrypoints only.
Published packages must not depend on workstation-relative authority (no
hidden local path dependency, no ../../SomeRepo production authority, no
symlink-based package authority).
Drupal module: <machine>.info.yml, composer.json, src/,
tests/src/, config/install/, config/schema/, templates/,
Drupal-native *.routing.yml/*.services.yml/*.permissions.yml/
*.libraries.yml at extension root where Drupal requires it.
Drupal theme: <machine>.info.yml, <machine>.libraries.yml,
templates/, css/, js/, components/ only when the theme's component
model requires it.
Drupal recipe: recipe.yml as canonical entrypoint, config/,
README.md. No custom PHP; do not turn a recipe into a module to satisfy a
generic source layout.
Published Drupal site: drupal/llms_txt owns the live /llms.txt
endpoint. Prefer contrib drupal/llm_support (llms.txt + Markdownify + Token
Filter) for markdown page variants rather than custom PHP. Repo-root llms.txt
is the coding-agent index. Optional public companions ai.txt,
developer-ai.txt, and faq-ai.txt are LLM-facing indexes that link out; they
must follow llmstxt.org v2 list form and must not
restate AGENTS.md. Serve them via the module/recipe, not a hand-rolled
controller. HTML pages agents need should expose
rel="alternate" type="text/markdown" and rel="describedby" to the covering
llms.txt.
IaC/Terraform: main.tf, variables.tf, outputs.tf, modules/,
environments/, .tfvars.example (no secrets).
Monorepo (meta-repository containing multiple sub-projects): Root
README.md describes the monorepo purpose and component map. Root AGENTS.md
defines cross-component rules. Root llms.txt indexes component locations.
Each sub-project has its own local interface contract (README, AGENTS, llms.txt
scoped to that component). Do not force a single README/AGENTS/llms across all
components; reference the component-local docs from the root index.
Do not create a project profile until a real project type requires one.
Artifact Staleness and Cleanup¶
Agent, version, and configuration artifacts in the repository root can drift out of sync with current working versions:
- Stale agent files (e.g.,
agent-v0.1.0.yml,agent.old.yml) — Do not leave versioned agent artifacts at the root. Useagents/directory or.agents/contract directory. Delete or move superseded versions. - Outdated configuration (e.g.,
.env.example, olddocker-compose.yml) — Update to match current reality or delete. Do not commit as historical record. - Temporary build artifacts (e.g.,
build.log,.tmp/,__pycache__) —.gitignorestrictly. Never commit.
When an agent artifact is superseded: create a cleanup commit that removes the
stale version and updates AGENTS.md to reflect current location. Do not
leave versioned artifacts as historical record.
Context-Poisoning Classification¶
| Class | Action |
|---|---|
CANONICAL |
Keep; version-control |
DURABLE |
Keep; track lifecycle |
GENERATED |
.gitignore if build output; never commit |
DUPLICATE |
Delete or archive |
STALE |
Supersede and archive |
CONTEXT_POISONING |
Delete (copied prompts, AI-generated plans, session notes) |
UNKNOWN_OWNER |
Preserve; investigate separately; never destroy |
Do not modify immutable historical evidence merely to make current naming
look clean. Annotate legacy literals instead: LEGACY_NAME=<literal>,
CANONICAL_OWNER=<current-name>.
Beads Rule (Hard Requirement)¶
Beads (bd) own durable work state. GitLab Issues are NOT the Bluefly work
ledger. Canonical flow: BEAD → branch → commit → MR → CI → merge → receipt →
BEAD CLOSED. Do not maintain issue lists, sprint metrics, or live task
tracking outside Beads in repository files.
7. System Directive — Agent Knowledge & Documentation Routing Contract¶
System Directive — BluCity-Docs is the Knowledge Authority¶
The canonical documentation repository is:
blueflyio/blu/blucity-docs (BluCity-Docs)
The workstation is ephemeral. Do not create random Markdown files at the repository root, do not create new top-level directories because a document does not immediately fit, do not dump reports into Engineering-Standard, and do not store meaningful project documentation in ~/.cursor, ~/.claude, ~/.gemini, agent private memory, chat threads, /tmp, or random repository roots. If deleting this workstation loses knowledge required to understand or continue Bluefly work, the session exit contract has failed.
7.1 Authority Model¶
| Surface | Canonical Role |
|---|---|
| GitLab | Source code & release authority |
| Beads / Dolt | Work, execution state, blockers, dependencies, task evidence |
| BluCity-Docs | Curated durable knowledge authority |
Implementation repo /docs |
Implementation-specific documentation |
| Oracle | Live runtime operational truth |
ledger/ |
Immutable verification artifacts, receipts, audits, and captured directives |
projections/ |
Derived views of authoritative state (never mutated directly) |
| ContextControl | Governed delivery of the above to agents — selection and scope, never authorship (§8.4) |
| Scratch | Temporary analysis only, and outside this repository — there is no Scratch/ directory here |
Do not turn documentation into a duplicate work ledger. Do not turn Beads into architecture documentation. Do not turn projections into authority.
7.2 Classify Before Writing¶
Before creating, editing, moving, or deleting any document, classify the information into one of:
POLICY | ARCHITECTURE | AUTHORITY | STANDARD | RULE | DECISION | OPERATING_MODEL | INFRASTRUCTURE | INTEGRATION | PLATFORM | RUNTIME_REFERENCE | CAPABILITY_CATALOG | TOOL_REFERENCE | PRODUCT | PLAYBOOK | EVIDENCE | FACT | PROJECTION | IMPLEMENTATION_DOC | TEMPORARY | WORK
Then route it to its existing owner. Do not create a new home until you have proven no appropriate home exists.
7.3 Engineering-Standard Directory Routing Contract¶
Use Engineering-Standard/ subdirectories deliberately:
- architecture/: System boundaries, control plane, data plane, digital factory, Drupal ↔ Gas City architecture. Explains what the system is, its major parts, and how they relate. (No point-in-time state).
- authority/: Source-of-truth and ownership boundaries (e.g., GitLab owns source, Oracle owns runtime, Beads owns work, 1Password owns secrets). Answers: Who has authority over this concern?
- catalog/: Inventories of canonical reusable capabilities (formulas, components, agents, skills, providers, packages). Answers: What capabilities exist, where is the owner, how to consume? (No implementation task tracking).
- context-plane/: Durable rules & architecture for AI context, context injection, agent context, memory boundaries, and promoted knowledge.
- decision-records/: Durable Architecture Decision Records (ADRs). Requires Context, Decision, Alternatives, Consequences, Status, Date, Owner.
- glossary/: Canonical definitions of Bluefly terms (Bead, Polecat, Rig, City, Town, Order, Formula, Convoy, Proof, Capability Owner). One term, one canonical definition.
- governance/: Governance models, approval authority, policy enforcement, compliance, review requirements, human vs machine authority.
- indexes/: Generated or curated navigation into the knowledge base (agent-team.md, llms.txt, index maps). Points to authoritative docs; does not restate them.
- infrastructure/: Durable infrastructure architecture & standards (Oracle estate, NAS role, Tailscale, networking, deployment architecture, IaC).
- integration/: Durable contracts between systems (Drupal ↔ Gas City, GitLab ↔ Gas City, 1Password ↔ runtime). Explains boundary contracts, not temporary troubleshooting.
- operating-model/: How Bluefly operates (continuous dispatch, autonomous factory, Mayor behavior, Witness model, worktree lifecycle, repository completion contract).
- platform/: Durable platform-level design (agent platform, CMS platform, Digital Factory, Cloud platform). Sits above individual project repos.
- reference/: Stable operational & reference data (known ports, command references, supported endpoints). Maintain and keep current; no raw audit dumps.
- rules/: Hard prohibitions and invariants (e.g., no plaintext secrets, no feature → main, no local Beads, workstation owns nothing). Short and enforceable.
- runtime/: Durable model of runtime behavior. (Live runtime truth comes from Oracle; docs describe the model).
- standards/: Normative technical standards containing MUST, SHOULD, MAY, MUST NOT requirements.
- templates/: Reusable document or execution templates only (ADR template, audit template). No completed instances.
- tools/: Durable documentation about canonical Bluefly tools (blu, gc CLI, operator tooling).
7.4 Other BluCity-Docs Homes¶
ledger/: Immutable or point-in-time proof worth retaining. Answers: What did we observe, when, where, using what method, with what result? (If evidence creates work → create a Bead.) Use the sub-home that matches the artifact:ledger/audits/— a completed audit with a method and a resultledger/evidence/— raw observation captured during a sessionledger/receipts/— proof that a named execution happenedledger/directives/— a dated operator directive, captured verbatim as input. A directive is evidence, not a standard. The curated standard that implements it lives underEngineering-Standard/standards/; the directive is never itself the normative text. Committing directive prose intostandards/creates a second authority competing with the standard written to satisfy it.ledger/decision-records/— not a home. ADRs live only inEngineering-Standard/decision-records/.Playbooks/: Reusable operational procedures (How do I safely perform this recurring operation?). Only promote mature, stable procedures.products/: Durable product-specific knowledge (products/Bluefly.io/,products/ContextControl/,products/AMCS/). Documentation about products only — application source belongs in the product's own repository.projections/: Derived/read-model views (Mayor fact board, computed estate status). Projections are read-only and MUST declareSOURCE_AUTHORITY=,GENERATED_AT=,DERIVED_FROM=.
7.5 Facts & Audits Lifecycle¶
- Live Operational Fact: Runtime authority (Oracle/Gas City). If historically relevant →
Evidence/. - Durable Architectural Fact:
Engineering-Standard/architecture/orauthority/. - Audits Lifecycle: Audits start in
Scratch/or generated evidence. At completion: - Durable architectural conclusion → merge into canonical
Engineering-Standard/owner. - Point-in-time evidence → save under
Evidence/. - Discovered work → create Beads.
- No remaining value → delete draft.
7.6 Knowledge Promotion & No-Duplication Rule¶
- Promotion Flow:
Scratch / Live Investigation→Classify→Canonical Owner→Delete temporary draft. The tiers each step moves between, and the gate each step must pass, are defined in §3.1–§3.2. - No Duplication: Always
qmd queryor grepBluCity-Docsbefore writing. Extend existing canonical files in place. Never createfoo-v2.md,foo-fixed.md,foo-new.md. - README Files are Maps: Directory
README.mdfiles explain directory purpose and point to canonical docs; do not stuff full standards inside READMEs. - Tool Directories (
.agents/,.claude/,.cursor/): Integration surfaces only, not documentation authorities. Extract substantive knowledge intoBluCity-Docs. - Beads vs Documentation Test:
- Describes work to happen? → Beads
- Describes why system is designed this way? → Durable Docs (
Engineering-Standard) - Proves what happened? → Evidence
- Describes current derived state? → Projections
- Explains repeatable procedure? → Playbooks
- Explains one project repo? → Owning repo
/docs
7.7 Documentation Exit Gate¶
Before completing any session, verify:
[ ] No meaningful project docs left in ~/.cursor, ~/.claude, or ~/.gemini
[ ] No orphan markdown files in repository root
[ ] No duplicate canonical docs created
[ ] Every new durable fact has a canonical owner in BluCity-Docs
[ ] Every audit and verification artifact is dispositioned to Evidence/ or deleted
[ ] Every discovered execution task is recorded in Beads
[ ] BluCity-Docs working tree is committed & clean
8. Surface Boundaries — Central, Project, Agent Context, Wiki¶
§1–§7 govern this repository. §8 governs the boundary between this repository and the other surfaces a fact can land on, so that every file in the estate has one home and every agent knows which surface owns which claim.
The two layers, stated once:
The project repository answers "what is true about this project?" BluCity-Docs answers "what is true across Bluefly?" Do not mix them.
8.1 The four surfaces¶
| Surface | Owns | Never |
|---|---|---|
| BluCity-Docs | Cross-project doctrine: standards, rules, architecture, authority model, decision records, catalogs, playbooks, glossary. If a statement applies to many projects, this is the owner. | Execution code; workspace-local state; runtime configuration a running system reads; a second copy of a project's own build instructions. |
Project repo docs/ |
What is unique to that project: purpose, scope, current architecture, API reference, developer setup, build/test commands, dependencies, integration notes, deployment behaviour, project-only ADRs. | authority: canonical. A copy of any Bluefly standard. |
Project repo .agents/ |
Concise machine-operational context an agent needs to act correctly in that repository. Layout, including context/, skills/ and roles/, is governed by STD-REPO-001 §2 — not restated here. |
Doctrine copied from BluCity-Docs. Agent transcripts. Scratch notes. Duplicate spellings (.agent/, ai-context/, .claude/context/). |
| Project GitLab wiki | Volatile operational notes with no review cycle: meeting notes, onboarding scratch, runbook drafts, "how to run this today". | Being cited as authority by any standard, rule, ADR or playbook. |
Estate-root exception. [ESTATE-ROOT]/.agents/ is not a project agent-context directory —
it holds independent governed GitLab repositories (the Agent Capability Estate) and is treated
as source, not context. The rules above apply to .agents/ inside a project repository.
8.2 The routing test¶
Ask, in order, and stop at the first yes:
- Does this statement apply to more than one project? → BluCity-Docs
- Does it describe work to be done? → Beads, not documentation
- Does it prove what happened at a point in time? →
ledger/ - Is it a repeatable operator procedure? →
Playbooks/ - Does it explain one repository to a human? → that repo's
docs/ - Does an agent need it to act correctly in one repository? → that repo's
.agents/context/ - Is it volatile, unreviewed, and true only today? → the project wiki
If none apply, the content has no home — which means it should not be written.
8.3 Reference doctrine, never copy it¶
Do not copy sections of BluCity-Docs into a project's README.md, AGENTS.md,
CLAUDE.md, .agents/context/* or docs/. A project's AGENTS.md names the standards it
follows and then states only that project's exceptions.
A copied rule is a second authority. When the original changes, the copy becomes a contradiction that no one is reviewing — and copied doctrine routinely drags workstation- absolute paths into repositories that then fail their own CI path checks.
Every .agents/context/ file must answer four questions in its own header: what is this
context, who owns it, how fresh is it, and where does its source truth live? The fourth is
a link to the canonical path here, not a paraphrase of it.
Promotion. A wiki page cited twice, or referenced by any standard, must be promoted into BluCity-Docs under §3.2 or deleted. The wiki is where knowledge starts or dies, never where it settles.
8.4 Publication — Git authors, other surfaces serve¶
Git is the authoring authority and the evergreen source of record. Other surfaces are derived: they publish, index and deliver what is authored here. Authority never moves downstream, and nothing downstream is a place to write doctrine.
BluCity-Docs (Git) canonical · versioned · reviewable · diffable
│
publish / index / curate
┌────────┴─────────┐
│ │
ContextControl Gemini Notebook
governed research and
operational synthesis surface
context
└────────┬─────────┘
│
AGENTS ← narrow task context, disposable session
- ContextControl owns selection, scope, provenance, approval and lifecycle of context delivered to agents. It does not own the text.
- Gemini Notebook is a source-grounded research mirror for cross-document interrogation.
Its output is not authority. A durable conclusion travels: notebook research → evidence
in
ledger/→ review → the owning document here → republication.
8.5 The ingestion contract¶
Ingestion needs no new metadata. The front matter §2 and STD-033 already require is the
contract: bluefly_document, type, status, authority, owner, canonical_path,
supersedes / superseded_by, created_at, updated_at, last_reviewed.
Precedence when serving: canonical > evergreen > everything else. A document with
status: snapshot or superseded is never served as current — it is retrievable as
history only. The wiki and .agents/context/ may be ingested as context; neither is ever
ingested as authority.
A retrieval request is scoped by agent, project and Bead, and the answer names what is
required, what is optional, and what is out of scope — with provenance and
last_reviewed on every item. Returning the corpus is a defect, not a safe default: an agent
that loads the whole estate has made the conversation its database, which §6 "Agent context
budget" already prohibits.
NOT_ESTABLISHED: ContextControl has no running instance at the time of writing
(bc-7e3 is still provisioning its Cloudflare tunnel). §8.4–§8.5 are written to be satisfiable
on arrival and depend on nothing that does not already exist in this repository.