Gas City Doctrine Enforcement (v2.0) - Sessions perform work. (Sessions are disposable). - Beads remember work. (Durable universal substrate). - Convoys group work. - Mail coordinates work. - Formulas remember how. (Reusable methods). - Agents execute. - Packs configure. - Rigs scope. - Orders trigger. - Events prove what happened. - Work is not complete until verified and promoted (Capability, Skill, Formula, Pack, Order, Policy). (No parallel "learning lifecycles" or "agent memory" outside this machinery).
Infra Convergence Roadmap¶
Scope: Bluefly worktrees/ infrastructure lane — reduce custom runtime ownership.
Lawbooks: BluCity-Docs/library/governance/upstream-lawbooks.md
Investigation law: Engineering Authority Exhaustion (NOT_FOUND) · Zero-Assumption Convergence Audit (NOT_FOUND)
Packets: convergence-audit/packets/ (NOT_FOUND — packet never committed to this repository) · EXECUTION-PLAN (NOT_FOUND — packet never committed to this repository)
Wiring: gas-city-deployment-wiring.md
This document records layer ownership, candidates, and dependency gates. Canonical disposition lifecycle: zero-assumption-convergence-audit.md (NOT_FOUND).
Disposition tracking (roadmap view)¶
| Status | Meaning | May delete? |
|---|---|---|
| Candidate | Hypothesis; preconditions listed | No |
| Approved | Receipt + replacement path verified | No |
| Scheduled | Bound to one implementation MR | No |
| Removed | Merged with receipt | Done |
| Retained | Audit terminal — ownership justified | N/A |
Promotion rule (delete path): Candidate → Approved → Scheduled → Removed. See ZACA for full promotion requirements.
Evaluation phases (P2–P3 here): produce packets — do not delete.
Execution authority (one owner per layer)¶
When every layer has one owner, duplicate implementations become obvious.
| Layer | Owner | Responsibility |
|---|---|---|
IaC (worktrees/iac) |
Bluefly | Provisions infrastructure — cloud-init, Terraform, systemd, binary install paths, /opt/bluefly/city |
| agent-docker | Bluefly | Deploys containerized supporting services — compose profiles, tunnel config snapshots, DDEV sidecars |
| gitlab_components | Bluefly | Orchestrates deployment — CI components, gt/bd receipt jobs, oracle-compose-deploy |
| agent-tailscale | Bluefly | Tailnet attachment — Serve, Funnel, ACL, routing between Oracle and NAS |
| OpenClaw | Upstream | Runtime actuator — single gateway process per host; unaware of multi-site topology |
| Gas City / Gas City / Beads | Upstream | Execution primitives — gt, gc, bd; packs and city lifecycle |
| Drupal | Upstream core + contrib | Application system of record — adapters only, no parallel execution SoR |
INFERRED: Duplicate sprawl appears when a layer above reimplements behavior owned below (for example HTTP gateway wrapping gt shell). OBSERVED: iac cloud-init installs gascity, gascity, and beads binaries and runs gc init (worktrees/iac/terraform/oci/cloud-init.tftpl). OBSERVED: Workspace doctrine places Oracle execution SoR on ~/gt + gt/bd (library/governance/upstream-lawbooks.md). INFERRED: Until migration completes, both models may coexist — convergence removes duplicates, not upstream tools.
Mandatory custom-component review¶
Every custom component under review must complete this table before merge or before approval for removal.
| Field | Question |
|---|---|
| Purpose | What operator or deploy problem does it solve? |
| Current owner | Repository + path |
| Upstream owner | Official project that should own the behavior |
| Why custom still exists | Gap citation — upstream doc section or NOT_FOUND after authority exhaustion |
| Removal path | Config / compose / CI / upstream adopt — not “rewrite later” |
| Estimated LOC removed | Net-negative target if approved |
| Status | Candidate or Approved (with receipt id) |
No row with empty Removal path may ship new custom code.
Candidate registry (not active work)¶
All items below are Candidate for removal only. Do not schedule deletion in implementation plans until promoted per promotion rule above.
C1 — agent-docker — src/gastown-gateway/¶
Packet: C1-gastown-gateway.md (NOT_FOUND — packet never committed to this repository) — Retained (thin adapter; terminal).
| Purpose | HTTP API wrapping gt for Drupal /api/v1/gascity/status |
| Current owner | worktrees/agent-docker (~1,446 LOC TypeScript — OBSERVED line count) |
| Upstream owner | Gas City (gt status, mail, convoy contracts) |
| Why custom exists | Drupal needed HTTP from DDEV; historical adapter |
| Preconditions (for approval) | Upstream gt contract available to adapter; Drupal path migrated; no remaining consumers; integration tests green |
| Removal target | src/gastown-gateway/, related systemd/DDEV wiring if superseded |
| Potential LOC | ~1,500 |
C2 — agent-docker — services/gascity/ (compose fragment + placeholder runtime)¶
Packet: C2-services-gascity.md (NOT_FOUND — packet never committed to this repository)
| Purpose | Compose scaffold for containerized Gas City (gascity-runtime, BLUEFLY_GASTOWN_IMAGE:declared-not-built) |
| Current owner | worktrees/agent-docker/services/gascity/ |
| Upstream owner | Host gt on Oracle /home/ubuntu/gt (OBSERVED healthcheck gt doctor in same fragment) |
| Why custom exists | Placeholder until image published; overlaps host execution |
| Preconditions (for approval) | No compose consumer requires containerized gt; Oracle health uses host gt doctor; profiles documented without this service |
| Removal target | gascity-runtime service and undeclared image reference |
| Potential LOC | ~25 YAML + env |
C3 — agent-docker — vendored openclaw/ tree¶
Packet: C3-vendored-openclaw-tree.md (NOT_FOUND — packet never committed to this repository) — Retained (Bluefly authority; terminal).
| Purpose | Capability fabric / OpenAPI duplicates |
| Current owner | worktrees/agent-docker/openclaw/ (~144 KB — OBSERVED) |
| Upstream owner | OpenClaw + owning OpenClaw repos |
| Why custom exists | Historical bundling |
| Preconditions (for approval) | Compose references upstream image/config only; no import from vendored tree |
| Removal target | openclaw/ directory inside agent-docker |
| Potential LOC | ~144 KB + duplicate OpenAPI |
C4 — agent-docker — install shell scripts¶
Packet: C4-agent-docker-shell-scripts.md (NOT_FOUND — packet never committed to this repository)
| Purpose | One-off gateway / health / NAS mount |
| Current owner | deployments/oracle/systemd/install-gastown-gateway.sh + 7 others (OBSERVED) |
| Upstream owner | iac cloud-init + gitlab_components deploy components |
| Why custom exists | Pre-CI deploy paths |
| Preconditions (for approval) | Equivalent steps in IaC or CI; no operator runbook depends on script |
| Removal target | All *.sh under agent-docker except upstream-vendored assets |
| Potential LOC | 8 files |
C5 — iac — dual gc install declaration¶
Packet: C5-dual-gc-install.md (NOT_FOUND — packet never committed to this repository) — first likely Approved win post-P0.
| Purpose | Runtime contract provider entry |
| Current owner | runtime/bluefly-runtime.oracle.yml (npm install -g @gascity/gc — OBSERVED) |
| Upstream owner | gascityhall/gascity GitHub release tarball (OBSERVED in cloud-init) |
| Why custom exists | Contract drift from provision path |
| Preconditions (for approval) | Single install path in contract matches cloud-init; acceptance stage still passes |
| Removal target | npm provider stanza; keep tarball path only |
| Potential LOC | ~5 YAML lines |
Approved · Scheduled · Retained (tracking)¶
Approved (delete path — not yet implemented)¶
| Id | Artifact | Receipt | Approved date |
|---|---|---|---|
| — | (none) | — | — |
Scheduled (bound to MR)¶
| Id | Artifact | MR | Scheduled date |
|---|---|---|---|
| — | (none) | — | — |
Retained (terminal — audit complete)¶
| Id | Artifact | Packet | Retained date |
|---|---|---|---|
| C1 | agent-docker/src/gastown-gateway/ |
C1-gastown-gateway.md (NOT_FOUND — packet never committed to this repository) |
2026-07-07 |
| C3 | agent-docker/openclaw/ vendored tree |
C3-vendored-openclaw-tree.md (NOT_FOUND — packet never committed to this repository) |
2026-07-07 |
Implementation MRs may reference Scheduled rows only. Retained is terminal unless architecture change opens a new Candidate.
OpenClaw — single gateway (Oracle authoritative)¶
RETRIEVED: OpenClaw is designed around a single gateway process per deployment.
OBSERVED (operator decision, 2026-07-07): Oracle only for OpenClaw gateway in this cleanup pass. NAS remains storage/archive/operator fabric — not a second OpenClaw gateway.
IaC → Oracle → OpenClaw Gateway (authoritative)
NAS → storage, backup, observability — no OpenClaw gateway (this pass)
Bluefly owns: Oracle gateway provisioning (iac, agent-docker compose). Upstream owns: gateway runtime semantics.
Dependency-gated phases (active vs evaluation)¶
Phases P0–P1 and P4 are active infrastructure work. Phases P2–P3 are evaluation gates for the candidate registry — not deletion schedules.
P0 — Reproducible Oracle (active)¶
| Action | Merge iac fix/cloud-init-deploy-hardening → release/v0.1.x (MR !74) |
| Gate | Fresh provision: gc binary, city.toml, gc-worker + gc-city-init enabled — OBSERVED acceptance ids in bluefly-runtime.oracle.yml |
| Unblocks | Evidence for C5 and honest single-path gc claims |
P1 — CI deploy authority (active)¶
| Action | Merge gitlab_components feat/component-triage-and-slop-removal → release/v0.1.x; treat release/v0.1.x as shipping line |
| Gate | CI deploys from one component model (oracle-compose-deploy, four-tool-preflight, gascity-receipt) |
| Unblocks | Evidence for C4 approval |
P2 — Evaluate duplicate runtime candidates (evaluation only)¶
| Action | Run authority exhaustion on C2, C5; produce receipt; promote to Approved only if preconditions pass |
| Gate | OBSERVED gt doctor on Oracle host; contract matches cloud-init; no undeclared compose dependency on placeholder image |
| Does not | Schedule deletion of services/gascity/ or npm gc stanza without approval row |
P3 — Evaluate gateway and bundle candidates (evaluation only)¶
| Action | Run authority exhaustion on C1, C3, C4; produce receipt; promote to Approved only if preconditions pass |
| Gate | Drupal adapter proof; zero consumers for vendored openclaw/; CI replaces shell paths |
| Does not | Schedule deletion of src/gastown-gateway/ or vendored openclaw/ without approval row |
P4 — Pack configuration only (active)¶
| Action | Merge blucity-packs feature/amcs-pack-foundation → main; city imports via gc init append only |
| Gate | No hand-authored city root in blucity-packs monorepo; pack.toml imports use durable source or provisioned paths |
Status snapshot (evidence-tagged)¶
Re-verify before merge decisions.
| Repo | OBSERVED state |
|---|---|
BluCity-Docs |
main @ 598695de = origin/main; worktree blucity-docs-gas-town removed |
iac |
Branch fix/cloud-init-deploy-hardening; 18 commits not in release/v0.1.x |
gitlab_components |
Branch feat/component-triage-and-slop-removal; 3 commits not in release |
agent-docker |
Branch fix/oracle-volume-ownership-init; 52 ahead / 4 behind origin/main |
blucity-packs |
Branch feature/amcs-pack-foundation; 12 ahead of main |
agent-tailscale |
Branch chore/evac-backup-2026-06-28; 3 commits not in release/v0.1.x |
Potential LOC delta (if candidates are approved)¶
Not a schedule. Totals apply only after Approved for removal rows exist.
| Candidates | Potential reduction |
|---|---|
| C1 + C2 + C3 + C4 | −~1,500 TS, −8 scripts, −~144 KB vendored OpenClaw, −~25 YAML |
| C5 | −~5 YAML lines |
| P4 | +0 code — configuration only |
Audits update the Status snapshot or attach a dated receipt — not fork parallel roadmaps.