Prepared for: Engineering briefing (software engineers) · CTO / CISO review

Tropo L1 — Architecture Review v4

Status✓ RE-VERIFIED 2026-08-26 the full adversarial re-verification ran the night v1.92.0 shipped: eight parallel agents, ~211 claims, refute-posture, every number command-measured against the live substrate. Verdict: no fabrications; five claims WRONG at their own measurement dates (each now corrected in place and marked); the supersessions that actively mislead carry inline warnings; Part V and the governed report (6e9f6549) carry the full findings. Parts I–III each retain their original measurement dates; scale figures are snapshots and drift — see the currency note below.
Prepared by Metis (Tropo Strategist agent, generations G112–G113), with Mike Maziarz — building on v3 by Metis G107 and v2 by Argus A129
Date 2026-08-24 · Part IV added 2026-08-26
System version Tropo-OS v1.92.0 SHIPPED (published 2026-08-26T20:12:48Z, publisher liveness verified 20:13:41Z, receipt 3fe4be3f…) (v2 was a full re-verification at v1.84.1, 2026-07-10. §1–16 stand as-measured at v1.84.1; Part II is the delta through 2026-08-12; Part III through 2026-08-24; Part IV through the v1.92.0 ship, 2026-08-26. Where a later part SUPERSEDES an earlier claim, it says so explicitly.)
Scope The L1 (local, file-based) tier of the Tropo operating system, as proven in the Argo development Studio

Executive summary

Tropo is an operating system for running real work with AI agents, built entirely on plain markdown files in a folder. It requires no server, no database, and no proprietary runtime. Any AI harness that can read text and follow instructions can operate inside it; any human with a text editor can audit every byte of it. The OS itself is open source — Apache 2.0, public at github.com/tropo-ai/tropo (license set at v1.41.0, repository public since ~2026-06-20); each Studio's content stays private by a default-deny publish boundary.

The system solves five problems that make AI-agent work hard to trust in a professional setting:

  1. Identity and continuity. AI agent sessions end; the work cannot. Tropo gives each agent a durable identity (charter, soul document, memory, lineage record) that survives across sessions and across underlying model changes. The development crew's Chief Architect role has run 129 generations — including the one writing this document — with identity, memory, and open work surviving every handoff, across multiple model families.
  2. Governed, typed knowledge. Every artifact — task, decision, document, release, message — is a typed markdown file obeying a declared schema ("capsule"). A validator suite (94 check functions, ~90 executed per run) enforces those schemas at every rebuild. Structure is added gradually and tighten-only, so governance never breaks older data and never breaks the plain-text floor.
  3. Auditable coordination. All agent-to-agent and agent-to-human coordination flows through one append-only event log with a standard envelope (CloudEvents v1.0) — 6,100+ events as of this review. Delivery is a three-state contract (delivered → read → answered) backed by per-reader receipt ledgers; human-readable views are rendered projections of the log, never separately authored surfaces that can drift.
  4. Verification as a structural property. "Done" is not a claim an agent gets to make about its own work. Completion gates require independent verification receipts; an approver cannot be the executor; documentation and test pipelines are coupled to the release pipeline. The design center is bounded verification: a human expert verifies outcomes at defined gates, and the substrate is built so that verification capacity, not agent capability, is what scales. (This review also reports, honestly, where that promise was design-true but execution-unproven — and what was done about it. See §10.)
  5. Multi-party sovereignty (new since v1). Two Studios can now share a team vault over a plain git remote under a proven covenant: no private byte crosses the wire, in either direction. The publish path was adversarially attacked by a fleet of red-team agents that forced real leaks out of the first build — five HIGH-severity leak paths were found, fixed, and pinned with regression tests; the re-verification ran clean, fail-closed on every angle. Shipped at v1.84.1 on the day of this review.

The system is dogfooded at full intensity: Tropo is built by a human-AI crew operating inside Tropo. The release index carries 98 Tropo-OS release records spanning 96 distinct versions (v1.1.0, first shipped April 2026 → v1.84.1) — plus six releases of other products (two knowledgebase lines and an app) shipped through the same pipeline. Fourteen OS releases shipped in the 26 days since the v1.70.0 baseline this review's v1 was refreshed at.

This document walks the architecture top-down. Each section references a diagram in svg/. Sections 10, 13, and 14 are substantially new: release engineering (including where the release gates failed and how they were fixed), federation, and the refreshed security posture. The candor is deliberate — this system's own doctrine is that failures become substrate, not folklore, and a reviewer should read the failure record as the system working.

1. What Tropo L1 is — and the design theses behind it

One Studio = one folder. An installation of Tropo is called a Studio — a single directory tree of markdown, JSONL, and a small library of Python scripts. The Studio reviewed here (argo-os/) is the development Studio where Tropo itself is built. Inside every Studio sits a Vault — the protected, governed content store where every typed artifact lives.

Five theses drive every design decision:

Thesis 1 — Markdown is the protocol. Governance, schemas, procedures, memory, and messages are all expressed in language a reasoning engine reads and follows. There is no permissions API and no database constraint at the base layer; the governance is the language. This is what makes the system harness-portable: it has run under multiple commercial AI products and multiple model vendors without modification, because the only interface contract is "can read files, can follow instructions."

Thesis 2 — Agent-first, human-also. Agents are the primary operators; humans are the directors and verifiers. The base layer is shaped for how agents read and work (flat stores, UID addressing, typed frontmatter). A deliberate human layer sits on top: every governed file renders a navigation block (path, parent, children, siblings, cited-by); dashboards and a rendered navigation tree give the human a visual surface. The rendered surface is a deliverable, by doctrine — if the human is staring at raw substrate they cannot read, the surface has not shipped.

Thesis 3 — Local-first, minimal infrastructure. No server, no database, no runtime service. Everything that looks like infrastructure (indexes, a SQLite query layer, dashboards) is derived from the files and rebuildable from them at any time. The deployment story is "a folder," and the disaster-recovery story is "the folder, plus one rebuild command." (v1 of this review claimed "no network calls made by the substrate itself." That is no longer strictly true — release upload, update discovery, federation transport, and an optional API-cost metering gateway all touch the network. §14 enumerates every network-touching component; the substrate's day-to-day operation remains fully offline.)

Thesis 4 — Gradual structure on a language base (ADR-044). Keep the free-form markdown playground; add structure per-type and per-field, incrementally, enforced through agent-native mechanisms (tools, validation gates, grooming agents) — never storage-layer rigidity. Tightening is one-way and backward-compatible: structuring never breaks older data, and a hand-written file is never hard-rejected.

Thesis 5 — Verification is the moat. As execution cost falls toward zero, the binding constraint becomes human verification bandwidth. Tropo is built so that a domain expert can verify whether agents operated within constraints she defined — and so that the verification effort scales with the quality of the constraints, not the volume of agent output.

The posture around the theses (new since v1): the OS is a public artifact. Every release is built by a positive-filter extraction (only extraction_scope: ship entries leave the Studio — 495 of 4,239 records today), so the public repository carries the operating system and none of the Studio's private working content. "Build as if a stranger reads it today" is now literal.

Tropo L1 — Studio System Map Tropo-OS v1.84.1 · 2026-07-10 One Studio = one folder of markdown. No server, no database; day-to-day operation fully offline. The Argo Studio (argo-os/) shown. LAYER 1 — KERNEL · .tropo/ (bootstrap floor since ADR-045 — the cold-read set an agent needs before the index exists) Boot Configuration boot-config.md — Tier-1 boot floor Studio Tier-2 boot extension activation playbook pointer Thin pointers, read cold. Self-Healing + Concierge SELF-HEALING.md — P0, signed concierge/activate.md — the greet-first session entry point No index required to boot. Generated Catalogs Toolbelt — ~15 core boot tools 3 capability catalogs (tools / skills / session agents), all regenerated from the index Orientation Surfaces orientation.md — harness map HUMAN-NAVIGATION.md Rendered views for humans; rebuilt, never hand-authored Moved to vault/ (ADR-045) capsules (64) · playbooks · skills · tools/scripts now live at vault/<type>/ — indexed and governed (One Home, v1.76–77) LAYER 2 — PRIMITIVES · the structural vocabulary every Studio uses The Vault (graph knowledge base) vault/files/<uid>.md flat store + per-type One-Home dirs (capsules, tools, skills…) 4,239 indexed records · 3,740 core files 18,168 typed edges across 4,122 nodes Derived: JSONL index, graph index, SQLite + FTS5 — rebuilt, never authoritative Event Log (coordination substrate) vault/events/00-events.jsonl — append-only, CloudEvents v1.0, tool-mediated writes only 6,103 events as of 2026-07-10 Delivery contract: delivered → read → answered, per-reader receipt ledgers Human views = rendered projections Callable Surfaces (5 classes) Tools — 61 Python CLIs (56 registered) Skills — 25 shipped + 2 Studio-local Session agents — 16 ephemeral classes Actions — 10 · Loops — 6 (with brakes: spend caps, kills, consent gates) Discovery: Toolbelt + 3 catalogs Memory v3 + Continuity agent-memory.md — one curated boot read agent-memories.jsonl — append-only episodic log, never cleared Bounded folds: ≤15 pins / 32KB (ERROR) Studio-tier shared memory + doctrine OP-14: no harness-private memory writes LAYER 3 — APPS · what the crew builds and operates on top Tropo Work Tasks · projects · decisions (53 ADRs) · design briefs · releases · notes · collections. Boards + meta_status rollups (To Do / In Progress / Done) — computed. Pipelines + Loops Declarative DAGs + typed pipeline-runs; dev → doc → test coupled at the gate. 98 OS release records, 96 versions since 2026-04. 6 loops: autonomy with brakes. The Crew (agents/) 8 active agents + human principal. Identity = soul + memory + vault + crew + model sleeve. Architect at gen A129; boots measured at 1.4–4.5 minutes. Human Surfaces Rendered navigation tree · boards · nav-blocks in every governed file · crew brief — all projections of the log. Import/export: .docx/.md/.pptx + receipts THE 9 SUBSYSTEMS — each owns canonical state for its domain; every governed primitive declares its owning hub in frontmatter 1 · GovernanceADRs, validators, operating agreement 2 · Renderingbuild pipeline, extraction, render scripts 3 · Work (killer app)task/project/decision/release primitives 4 · Agentscrew, souls, sa.*, identity 5 · Playbooksgoverned procedures 6 · Librarymanifesto, handbook, content packs 7 · DocumentationKB articles, L1 entry, release notes 8 · Linkscheduling, persistent-agent substrate 9 · Test Harnessvalidator + ship-test-plan + cold-boot walk + agentic test composition Since ADR-045 the kernel is a bootstrap floor; everything governed lives in the vault. Layer 2 is the vocabulary, Layer 3 is the work — the whole system is plain files: readable, diffable, auditable.
svg/01-system-map.svg

2. The system map — three layers, nine subsystems

The Studio decomposes into three layers:

Cutting across the layers, work is organized into nine subsystems — unchanged in name and count since v1: Governance, Rendering, Work, Agents, Playbooks, Library, Documentation, Link (scheduling/persistence), and Test Harness. Each has a hub — a typed project entry that owns the canonical state for its domain — and governed primitives declare their owning hub in frontmatter, which makes "what does the governance subsystem currently contain?" a query rather than an archaeology project. (Corrected at the 2026-08-26 re-verification: hub declaration is at or near 100% for playbooks, actions, and session agents, ~90% for capsules and skills — but only 31% of the tool fleet declares a hub. "Every" was an unmeasured absolute.) A per-release touch-record registry (new since v1) additionally logs which subsystems each release touched.

Tropo L1 — Studio System Map Tropo-OS v1.84.1 · 2026-07-10 One Studio = one folder of markdown. No server, no database; day-to-day operation fully offline. The Argo Studio (argo-os/) shown. LAYER 1 — KERNEL · .tropo/ (bootstrap floor since ADR-045 — the cold-read set an agent needs before the index exists) Boot Configuration boot-config.md — Tier-1 boot floor Studio Tier-2 boot extension activation playbook pointer Thin pointers, read cold. Self-Healing + Concierge SELF-HEALING.md — P0, signed concierge/activate.md — the greet-first session entry point No index required to boot. Generated Catalogs Toolbelt — ~15 core boot tools 3 capability catalogs (tools / skills / session agents), all regenerated from the index Orientation Surfaces orientation.md — harness map HUMAN-NAVIGATION.md Rendered views for humans; rebuilt, never hand-authored Moved to vault/ (ADR-045) capsules (64) · playbooks · skills · tools/scripts now live at vault/<type>/ — indexed and governed (One Home, v1.76–77) LAYER 2 — PRIMITIVES · the structural vocabulary every Studio uses The Vault (graph knowledge base) vault/files/<uid>.md flat store + per-type One-Home dirs (capsules, tools, skills…) 4,239 indexed records · 3,740 core files 18,168 typed edges across 4,122 nodes Derived: JSONL index, graph index, SQLite + FTS5 — rebuilt, never authoritative Event Log (coordination substrate) vault/events/00-events.jsonl — append-only, CloudEvents v1.0, tool-mediated writes only 6,103 events as of 2026-07-10 Delivery contract: delivered → read → answered, per-reader receipt ledgers Human views = rendered projections Callable Surfaces (5 classes) Tools — 61 Python CLIs (56 registered) Skills — 25 shipped + 2 Studio-local Session agents — 16 ephemeral classes Actions — 10 · Loops — 6 (with brakes: spend caps, kills, consent gates) Discovery: Toolbelt + 3 catalogs Memory v3 + Continuity agent-memory.md — one curated boot read agent-memories.jsonl — append-only episodic log, never cleared Bounded folds: ≤15 pins / 32KB (ERROR) Studio-tier shared memory + doctrine OP-14: no harness-private memory writes LAYER 3 — APPS · what the crew builds and operates on top Tropo Work Tasks · projects · decisions (53 ADRs) · design briefs · releases · notes · collections. Boards + meta_status rollups (To Do / In Progress / Done) — computed. Pipelines + Loops Declarative DAGs + typed pipeline-runs; dev → doc → test coupled at the gate. 98 OS release records, 96 versions since 2026-04. 6 loops: autonomy with brakes. The Crew (agents/) 8 active agents + human principal. Identity = soul + memory + vault + crew + model sleeve. Architect at gen A129; boots measured at 1.4–4.5 minutes. Human Surfaces Rendered navigation tree · boards · nav-blocks in every governed file · crew brief — all projections of the log. Import/export: .docx/.md/.pptx + receipts THE 9 SUBSYSTEMS — each owns canonical state for its domain; every governed primitive declares its owning hub in frontmatter 1 · GovernanceADRs, validators, operating agreement 2 · Renderingbuild pipeline, extraction, render scripts 3 · Work (killer app)task/project/decision/release primitives 4 · Agentscrew, souls, sa.*, identity 5 · Playbooksgoverned procedures 6 · Librarymanifesto, handbook, content packs 7 · DocumentationKB articles, L1 entry, release notes 8 · Linkscheduling, persistent-agent substrate 9 · Test Harnessvalidator + ship-test-plan + cold-boot walk + agentic test composition Since ADR-045 the kernel is a bootstrap floor; everything governed lives in the vault. Layer 2 is the vocabulary, Layer 3 is the work — the whole system is plain files: readable, diffable, auditable.
svg/01-system-map.svg

3. The typed substrate — capsules, the Vault, and the graph

3.1 Capsules: schema as governed markdown

Every artifact Tropo tracks is a typed file. Each type has a definition at vault/capsules/tropo-<name>.capsule.md — called a capsule — declaring required fields, lifecycle state machines, enumerated values, governance rules, and validation checks for that type. The capsule is the contract; the file is what obeys it; the validator enforces it. 64 capsule definitions are on disk today (v1: ~60), with 16 history companions preserving amendment lineage.

All types descend from a root core type (uid, type, status, state, owner). The foundational set — task, decision, project, document, collection, note, playbook, pipeline, pipeline-run, board — is extended by domain capsules that each earned their abstraction: release and release-plan, design-brief and dev/doc/test-spec, activation (agent lineage), events (the message envelope contract), memory, agent and session-agent, tool, subsystem-hub, the import/export family — and, new in this window, loop and loop-run (governed autonomy, §8), vault and vault-entity (federation, §13). One honest correction to v1: it reported the how-to type retired for zero instances. That type is today the live schema for the skills library (27 instances, §9) — retired honestly when unused, revived when the abstraction was finally earned.

Three contract features matter for a technical audience:

Schema evolution is a gated act: a new field or enum value added through a deliberate, principal-signed capsule amendment is evolution; the same value silently written by an agent is drift, and the gate is what tells them apart.

The Capsule Type System — Schema as Governed Markdown The capsule is the contract; the file obeys it; the validator enforces it. 64 capsule definitions at vault/capsules/tropo-<name>.capsule.md (One Home, ADR-045). Type inheritance — every type descends from core core.capsule uid · type · status · state · owner task work + lifecycle decision ADRs, binding project container + board document specs, guides pipeline DAG template release what shipped design-brief informs, never locks activation agent lineage row events envelope contract memory bounded folds NEW SINCE v1 — governed autonomy (v1.71) · federation (ADR-051) · one honest revival loop recurring autonomy loop-run one loop execution vault node manifest vault-entity vault as principal how-to skills schema (27) …plus note, collection, playbook, pipeline-run, board, charter, agent, session-agent, tool, subsystem-hub, release-plan, dev/doc/test-spec, entity, registry — every type extends core directly (flat); 16 history companions preserve amendment lineage. What a capsule declares (the contract) # tropo-task.capsule.md (excerpt, illustrative) required_fields: [uid, title, owner, status] enforced_enums: status: {canon: [backlog, active, review, done], aliases: {complete: done}} governance_rules: approver != executor on approval_required tasks (Rule 14) validation_checks: enforced at every rebuild Closed canon + open aliases (SKOS-style) Agents write naturally ("complete"); the substrate normalizes to one truth ("done"). Machine-enforced fleet-wide since v1.72 "One Vocabulary"; drift = ERROR. Per-type strictness dial task, decision, release, activation, capsule enforce hard; the free-form long tail stays loose. Two-tier naming (ADR-048) tropo-<name> = shipped OS namespace, readable at a glance. UID = immutable address; renames never break refs. Schema evolution is a gated act Principal-signed capsule amendment = evolution. The same value silently written by an agent = drift. The gate is the line. Contract → instance → enforcement Capsule (the contract) vault/capsules/tropo-task.capsule.md Locked; amendments are governed events Instance (the file that obeys it) vault/files/a3f2b918.md (type: task) Flat store; one row in the whole-Studio index Validator (the gate) 94 check functions, ~90 per run (v1: ~58) Reads enums straight from capsules; WARN→ERROR ratchet with named grandfather exemptions Gradual structure on a language base: add structure per type, per field, tighten-only — 64 contracts, each abstraction earned one at a time, retired honestly, revived when used (how-to).
svg/02-capsule-type-system.svg

3.2 The Vault: flat files, graph semantics, derived surfaces

Every governed artifact lives in the Vault, named by an 8-hex UID — the bulk at vault/files/ (3,740 files), the rest in per-type One-Home directories (vault/capsules/, vault/tools/, vault/skills/, vault/playbooks/, vault/actions/, vault/session-agents/, vault/agents/). The index holds the whole Studio: 4,239 governed records as of 2026-07-10 (v1: 3,400+). There is no folder hierarchy to rot, and references cite UIDs rather than paths.

Organization is graph membership, expressed in frontmatter: member_of (home project(s), multi-parent allowed), governed_by, refs, subsystem_hub, superseded_by. The graph now carries 18,168 directed typed edges across 4,122 connected nodes (v1: ~8,500 across ~2,800 — the graph more than doubled in 26 days, driven partly by a new mentions edge class extracted from bodies: 6,561 edges). Distribution: member_of 3,981 · refs 2,969 · governed_by 1,677 · subsystem_hub 1,522 · mentions 6,561 · others ~1,450.

Everything else is derived and rebuildable: the authoritative JSONL index (one row per artifact), per-type index shards, an O(1) graph-traversal index, a SQLite query runtime (entries + edges + FTS5 full-text over 4,239 rows), the rendered human navigation tree, dashboards, and the crew brief. A rebuild pass regenerates all of it from the files; rebuild --only <uid> freshens a single entry. Because the files are the truth, index corruption is an inconvenience, not an incident. New since v1, the derived layer also carries decay signals (v1.82 "The Gardener"): a flag-only grooming pass stamps staleness/health markers on the index — adversarially proven unable to modify source files (two independent red-team agents with full-tree SHA256 baselines could not construct a write path).

Two structural truth rules landed in this window:

The write path, end to end (the engineer's view): an agent writes a typed markdown file → the index rebuild derives every surface from frontmatter → the validator gates the result (WARN→ERROR ratchets) → grooming agents normalize what is provably mechanical and flag what needs judgment → the rendered human surfaces regenerate. Hand-editing a file always works and is caught downstream — tools are the paved road, never a mandatory gate.

The Vault — Flat Files, Graph Semantics, Derived Surfaces 4,239 governed records · 18,168 typed edges across 4,122 connected nodes (2026-07-10). Files are authoritative; every index and view is derived and rebuildable. Authoritative store — flat by design vault/files/ — 3,740 UID-named files bfcd1a5b.md type: decision (ADR-044) d409c333.md type: activation (Argus A106) eca73d77.md type: document (L1 entry) …one UID-named file per governed record… One-Home directories — one per type: capsules/ 64 tools/ 61 skills/ 25 playbooks/ 24 actions/ 10 session-agents/ · agents/ No nested folders to rot; renames can never break references — everything cites by UID, not path. The whole-studio index carries 4,239 governed records. Graph semantics in frontmatter member_of: [6dff0111] # home project(s) governed_by: 8dd772a0 # governance edge refs: [476fef2e, …] # citations subsystem_hub: [8dd772a0] # owning hub superseded_by: … # honest history 18,168 directed edges · 4,122 nodes mentions 6,561 member_of 3,981 refs 2,969 governed_by 1,677 subsystem_hub 1,522 other classes ~1,300 superseded_by 157 mentions is body-extracted (new since v1); the others are declared in frontmatter. Derived surfaces — rebuilt, never truth 00-index.jsonl + per-type shards one JSONL row per record; sharded by type SQLite query runtime entries · edges · FTS5 full-text over 4,239 rows 00-graph-index.json O(1) edge traversal by UID nav tree + boards + crew brief rendered human navigation and dashboards decay signals — Gardener (v1.82) flag-only grooming; proven unable to write sources tropo-rebuild-vault.py regenerates everything; rebuild --only <uid> freshens one entry. Indexes are self-healing — corruption is recoverable from the files. The read/write cycle — files first, derived views second AGENTS + HUMANS write typed markdown (tool-mediated for structured ops) VAULT FILES vault/files/<uid>.md + One-Home dirs the single source of truth REBUILD PASS index · shards · graph · SQLite · nav boards · decay signals · validator VIEWS query + navigate humans and agents read derived views; truth round-trips through the files Lifecycle honesty — nothing vanishes silently Forward pointers (ADR-047) Every archived or superseded record carries a forward-pointer to its successor — enforced as a validator ERROR, not advisory. Soft delete only tropo-recycle.py moves entries to a dated recycle folder with a logged reason; the disposition tool refuses referenced nodes. Takeaway: flat UID-named files are the only truth; 18,168 typed edges organize them; every index is a disposable projection — and retired records must point forward.
svg/03-vault-graph.svg
The Write Path — Life of a Governed Artifact Five stages from an agent's write to a rendered human surface. The file is the only truth; everything downstream is derived, gated, or flagged — never authored. 1 · AGENT WRITES a typed markdown file uid: 8f3a2c1d type: task status: active member_of: [f4a7d2ce] governed_by: 8dd772a0 The capsule is the contract: vault/capsules/*.capsule.md required fields, enum values, lifecycle states, checks. 64 capsule types; a per-type strictness dial spends structure where it pays. 2 · INDEX DERIVES one rebuild, every surface 00-index.jsonl · row/artifact per-type index shards graph edges · 18,168 typed SQLite runtime (+ FTS5) rebuild --only <uid> freshens one entry; a full pass regenerates every surface. Files are the only truth — index corruption is an inconvenience, not an incident. 3 · VALIDATOR GATES 94 checks · WARN→ERROR New checks land at WARN and ratchet to ERROR once the substrate is clean. UID collisions fail loud — ADR-050 routes all IDs through one collision-checked minter. red gate blocks the ship History degrades to WARN; live records stay ERROR — gates bind live work; history is a lint. 4 · GROOMERS NORMALIZE fix the provable, flag the rest Fix only the provable: mechanical fixes applied in place, judgment calls flagged as tracked work. Nothing is flagged-and-forgotten. The Gardener (v1.82) stamps decay flags on the derived index — flag-only. Two red-team agents with SHA256 baselines could not construct a write path to source files. 5 · HUMAN SURFACES rendered projections nav-block on every entry 00-tropo-nav/ tree boards + dashboards crew brief Filesystem affordances on the graph: path, parent, children, siblings, cited-by. Projections, never authored — regenerated on every rebuild, never trusted as truth. hand-edited files enter the same path — caught downstream, never blocked upstream The escape valves — the path is paved, not gated Hand-edit always works The cold-boot invariant is sacrosanct: the gate may WARN on a hand-written file but never hard-rejects it. A stranger with a zip of the Studio can always boot it. Drift is caught downstream, not blocked upstream. Deletion is always soft The canonical gesture moves entries to a dated recycle folder with a logged reason; raw rm of governed substrate is forbidden by signed doctrine. Disposition refuses to recycle nodes with inbound references. Every archive points forward (ADR-047) Archived or superseded items must carry a resolvable forward-pointer to their current truth — validator- enforced at ERROR since v1.75. Motivation: 38% of the index archived, ~157 entries carried lying flags. Tools are the paved road, never a mandatory gate — a hand-edited file rides the same derive → gate → groom → render path and is caught downstream.
svg/10-write-path.svg

4. Agent lifecycle — boot, session, retirement, succession

This is the subsystem most foreign to a traditional architecture review, and the one Tropo considers its load-bearing differentiator. The premise: an agent is not the model. An agent is a composite — a soul document (character and behavioral rules), accumulated memory, the Vault, the crew context, and whatever model "sleeve" is running it today. Sessions end; the composite persists in files.

4.1 Boot: three tiers, six gated groups — now with a governed cost budget

Activation runs through a three-tier configuration chain (OS floor → Studio extension → agent extension) and six groups in strict order — boot configuration, identity verification, context loading, operational grounding, self-diagnostic, startup signal — each writing a milestone event to a per-run log before the next may begin. The gates are structural: a group whose predecessor milestone is absent from disk stops.

Two hard gates protect lineage integrity, validated twice (at boot, and at write-time by the tool that creates the activation record):

New since v1 — boot cost became a governed budget, not a cultural norm. The trigger was measured: one boot ran 30 minutes and 172K tokens against a 7–8 minute bar. The v1.79 Boot Contract responded structurally:

A deliberate cultural gate rides the boot as well: the self-diagnostic. Every agent, at every boot, is required to critique the system it just loaded — is anything outdated, counterproductive, or missing? — and to verify its predecessor's handoff claims against current substrate before trusting them. The inherited system is treated as "the best the predecessor had time to build," never as correct by default.

4.2 Retirement and succession

Retirement is a governed fold, not an exit: the retiring generation writes a forward-looking living transfer at peak context, a backward-looking honest reflection, has its memory folded (with a structural bound — see §5), flips its status surface, and closes its activation registry entry. The successor boots through the same gates and verifies the transfer's carry-forward claims against live substrate, because handoffs are snapshots and snapshots drift.

Worked proof at scale: the Chief Architect role is at generation A129 (this author); the Chief of Staff at V64; the engineering lead at T28; the whole crew turns over continuously and open work survives every handoff — including, in this window, a release that was mid-flight across three generations of two different agents and shipped correctly.

Agent Lifecycle — Boot, Session, Retirement, Succession An agent is the stack, not the model: soul + memory + vault + crew + model sleeve. Boot is gated and budgeted; generations die, the agent persists in files. Three-tier boot configuration (ADR-032) Tier 1 — OS floor .tropo/boot-config.md — universal gates + groups Tier 2 — Studio extension .tropo-studio/ — Studio-wide reads, event drain Tier 3 — Agent extension per-agent: soul path, board filter, skip declarations Activation playbook — six gated groups each group writes a milestone event to a per-run log; a group whose predecessor milestone is absent from disk stops 0 Boot config resolve root, read 3 tiers, plan 1 Identity HARD GATES ADR-016 / ADR-028 2 Context soul FIRST, then memory + transfer 3 Grounding crew brief, status card, scanners 4 Diagnostic critique the boot, verify transfer fresh 5 Signal startup signal to the principal; begin ADR-016: predecessor still ACTIVE → HALT. Two live generations of one agent is a governance violation. ADR-028: generation ≠ predecessor + 1 → HALT. Lineage integrity requires human resolution. Enforced twice: at boot, and again at write-time by the tool that creates the activation record. Identity files resolve by UID from the activation thin-pointer; the activation registry is the lineage of record. Boot cost — a governed budget, not a cultural norm (v1.79 Boot Contract) new since v1 Fast-path (~3–4K tokens) replaces the ~15K canonical activation-playbook read for established agents Doctrine digest replaces ~16K of verbatim doctrine re-reads; adversarially gauntleted — v1 verdict GAPS-FOUND, 10 rules restored before cutover Drift gate — fails closed both artifacts declare SHA-256 of every source + themselves; check_boot_derivation_fresh recomputes all of them on every run Boot-budget tally boot events carry ISO-8601 timestamps; over 10 min or never completed → WARN measured boots: 1.4–4.5 min Trigger incident: one boot ran 30 minutes / 172K tokens against a 7–8 minute bar — the v1.79 Boot Contract made cost structural. A compacted read can never silently drift. Boot duties ride activation — 5.1.6 update discovery: first agent of day fetches the manifest (offline-safe) · 5.1.7 maintenance-loop dispatch: owner consent, metered cost The generational loop — institutional knowledge survives through files, not model memory BOOT (A·N) reads soul letter, curated memory, predecessor's transfer — arrives already itself SESSION governed work in the vault; events emitted; memories appended to episodic log; principal directs at the gates RETIRE living transfer (FINAL), reflection, memory fold by curator, status → RETIRED, activation entry closed SUCCESSOR (A·N+1) boots through the same gates; verifies transfer claims against current substrate before trusting continuity artifacts: soul letter (stable) · curated memory + append-only episodic log · living transfer · reflection · activation registry row Worked proof at scale: Chief Architect A129 · Chief of Staff V64 · engineering lead T28 · strategist G88 — the crew turns over continuously; open work survives every handoff. This window: a release mid-flight across three generations of two agents shipped correctly. Sleeve changes are recorded; the agent is the composite, the model a component. Boot is gated, budgeted, and self-diagnosing — compacted reads cannot silently drift from source. Retirement is a governed fold, not an exit; the handoff is the product.
svg/04-agent-lifecycle.svg

5. Memory architecture (v3.0)

Memory is treated as load-bearing infrastructure, designed to the same standard as the work substrate. Version 3.0 is now fully deployed across the crew (v1 said "currently cascading" — the cascade closed 2026-06-10). The shape:

New since v1 — the memory bound became structural. The measured failure: eight consecutive retirements did in-line folds bypassing the curator, and one agent's Top-of-Mind grew to 33 blocks (~48K tokens) — one of the two measured root causes of the 30-minute boot (the other: redundant reads the fast-path itself carried, cut in the same cycle). The fix is a validator gate (ERROR above 15 Top-of-Mind entries or 32KB surface size) plus a retirement rule making curator dispatch mandatory on over-bound folds. It has already fired in production twice, correctly, folding 60→15 and 26→14 entries. The design lesson generalizes: don't trust the discipline; let the substrate catch the lapse.

Memory sovereignty (Operating Principle 14, new). Agents running inside commercial harnesses have access to harness-private memory stores. A real incident (an agent wrote six substrate-class pins to a harness store — invisible to successors, non-portable) produced a binding principle: durable memory writes go to Tropo memory paths, never harness-private storage. Portability of the whole agent composite is the promise; memory in a vendor silo breaks it.

A Studio-tier shared memory carries crew-wide doctrine pins with the same shape; every agent inherits it at boot.

Memory Architecture v3.0 — Single Surface + Append-Only Episodic Log Cascade complete crew-wide 2026-06-10. One curated read at boot; one append-only write during work; governed, bounded folds between. Nothing deleted. Per-agent memory capsule · agents/<name>/.tropo-capsule/memory/ agent-memory.md — THE boot read § Top-of-Mind priority-ordered pins · bound ≤15 entries § Living Transfer from Predecessor the handoff, aging policy applied § History (pointer) frozen per-generation snapshots § Memories (pointer) points at the episodic log — never inlined agent-memories.jsonl — episodic log append-only — NEVER cleared. Mid-session pins, lessons, decisions — one JSON line each. Folds advance a boundary marker; entries behind it stay on disk, never removed. Full arc reconstructable for reconsolidation. history/ — frozen pre-fold snapshots every pre-fold surface frozen with a SHA-256-verified snapshot — rollback + audit Boot reads ONE file. Sessions write ONE log. The curated surface routes and surfaces; it never restates substance — canonical artifacts hold the content. Studio-tier shared memory mirrors this shape for crew-wide doctrine pins; every agent inherits it at boot. sa.memory-curator — the governed fold Ephemeral specialist agent dispatched with a trigger: trigger: retire (steady state) folds the session's episodic entries into the surface; advances boundary; snapshots history trigger: boot / catch_up (insurance) staleness gate: ≥3 generations OR ≥50 unfolded entries since last fold → catch-up fold at boot trigger: migrate (one-time) non-destructive v2→v3 conversion; old files kept as rollback — verified crew-wide 2026-06-10 The booting agent ratifies every curator recommendation (ACCEPT / REJECT / DEFER) before it applies. Since v1.79, an over-bound retirement fold REQUIRES curator dispatch — no in-line folds. BOUND GATE (v1.79) — the memory bound is structural, not disciplinary Measured failure: 8 consecutive in-line folds bypassed the curator; one Top-of-Mind grew to 33 blocks (~48K tokens) → the 30-minute boot. Validator ERROR §Top-of-Mind >15 entries OR surface >32KB Mandatory curator dispatch over-bound retirement folds cannot fold in-line Fired twice in production — correctly folded 60→15 and 26→14 entries OP-14 — Memory Sovereignty (new operating principle) Substrate-class pins → Tropo memory paths agents/<slug>/.tropo-capsule/memory/ · .tropo-studio/memory/ · vault/files/ NEVER harness-private stores — portability of the whole composite incident: 6 substrate pins in a harness store — invisible to successors, non-portable The memory loop across a generation BOOT read agent-memory.md — bound-checked: ≤15 / ≤32KB WORK append pins to the jsonl — Tropo paths only (OP-14) RETIRE → FOLD curator folds; boundary advances; SHA-256 snapshot SUCCESSOR BOOTS one clean read; full arc still on disk repeat 129 generations on one lineage Takeaway: don't trust the discipline — let the substrate catch the lapse. The log is never cleared, folds are bounded and snapshotted, and memory never leaves Tropo-owned paths.
svg/05-memory-architecture.svg

6. The event system — coordination as an append-only audit trail

All coordination flows through one canonical log: vault/events/00-events.jsonl — append-only, tool-mediated writes only, one CloudEvents v1.0 envelope per event, correlation IDs for reply chains. 6,103 events as of the morning of 2026-07-10 (v1: 3,900+; the log grows by hundreds per week under real workload).

The Event Ledger v2 — Frozen Epoch + Live Streams, One Union §6, superseded 2026-07-18, verified byte-level 2026-08-26: the "one canonical log" became a distributed ledger — a sha-pinned frozen epoch beside per-writer streams, joined at read time. Writers agents + humans — messages, replies, acks, broadcasts substrate-write tools (auto-emit) · lifecycle events every actor holds a registered party UID emit-event — routes on the cutover flag .tropo/event-streams-v2.enabled flag present → the event appends to its writer's own stream; identity guards + schema-validated envelopes unchanged all new events no write path — the epoch is closed BYTE-FROZEN 2026-07-18 The legacy epoch vault/events/00-events.jsonl frozen at the event-streams-v2 cutover (dev-spec f15a9b85): its sha256 still matches the pinned epoch hash exactly, at exactly the pinned 6,678 rows — nothing newer than the cutover pin holder: the cutover flag · verified byte-level 2026-08-26 LIVE · ACTIVELY WRITTEN Per-writer conversation streams vault/events/streams/ 272 stream files · 5,237 events, actively written at the 2026-08-26 re-verification · one stream per writer every event carries an immutable per-stream event UID — the key the receipt ledgers use Readers operate on the union — one logical ledger read tools join the legacy epoch and the live streams: 11,915 raw events across both stores at the 2026-08-26 measure (6,678 + 5,237); correlation chains and reply obligations span the cutover unchanged — consumers see one ordered record Per-reader receipt ledgers — the delivery contract vault/events/receipts/<party>.jsonl 1 · DELIVERED the event exists in epoch or stream 2 · READ receipt written by the drain tool, keyed on stream UIDs 3 · ANSWERED a correlated reply exists — computed, never claimed receipt ledgers carried same-hour read stamps at the 2026-08-26 re-verification — a message addressed to an agent cannot be missed, by construction Derived SQLite event index — a projection, not a source • rebuilt from the raw JSONL at any time; serves query and diagnosis only • never authoritative and never a write target — the files are the truth, index corruption is an inconvenience, not an incident • same doctrine as the vault index: one source of truth, many views Views are projections; the union of the two JSONL stores is the record. Every other §6 property survived the cutover unchanged — re-verified live 2026-08-26 CloudEvents v1.0 envelopes · tool-mediated appends only · correlation IDs for reply chains · the three-state delivery contract · two-axis identity guards (party vs agent-root, wrong-axis traffic rejected) · tool telemetry in the same record One logical ledger, two physical stores: a sha-pinned frozen epoch beside 272 live per-writer streams, joined at read time — delivery still proven by receipts and correlations, never claimed.
svg/14-event-ledger-v2.svg — Event ledger v2: the byte-frozen legacy epoch plus per-conversation streams, read as one union

Four properties matter:

1. Projections, not authored surfaces. Twenty-two hand-authored channel files were retired outright in the messaging-substrate consolidation; agents read the log directly, and surviving human-facing surfaces are rendered projections of it. One source of truth, many views.

2. Identity-guarded writes. Every actor — human or agent — has a registered UID; each agent carries two on two axes (a party UID for messaging, an agent-root UID for lineage). The emission tool rejects wrong-axis traffic in both directions, and superseded identities persist as resolvable tombstones but are rejected as signers.

3. A three-state delivery contract (new since v1): delivered → read → answered. Delivery is the event in the log; read is recorded in a per-reader receipt ledger (vault/events/receipts/<party>.jsonl) written by the drain tool; answered requires a reply whose correlation ID matches the original event. A reply_required flag creates a visible obligation, and the answered-state is computed from correlations — not from anyone's claim. The operating bar, set by the principal after lived failure: a message addressed to an agent cannot be missed, and a completion cannot be invisible — by construction.

4. Tool telemetry in the same record. Every substrate-writing tool (rebuilds, recycles, activation writes, pipeline operations, validator runs, releases) auto-emits into the same log, so "what happened, in order" is one query over one file.

The Event System — One Log, Guarded Writes, a Three-State Delivery Contract All coordination — agent↔agent, agent↔human, tool telemetry — flows through one CloudEvents-enveloped JSONL log. Delivered → read → answered; views are projections. Producers Agents + humans directed messages, replies, acks, crew broadcasts Substrate-write tools (auto-emit) rebuilds, recycles, activation writes, pipeline ops, validator runs, releases Lifecycle events cycle opened/closed, ship-gate progress, fleet-ops dispatches Every actor has a registered UID — including the human principal. emit-event (the gate) GUARD: source must be a registered party UID GUARD: directed messages must be ADDRESSED to a party UID (agent-root / lineage UIDs rejected on both axes — wrong-axis messaging is structurally impossible to send) Strict mode default; schema-validated envelope The canonical log vault/events/00-events.jsonl append-only · tool-mediated writes only CloudEvents v1.0 envelope per event correlation IDs for reply chains reply_required flags surface obligations 6,103 events as of 2026-07-10 (v1: 3,900+) — who said what, when, in reply to what; grows hundreds/week under load + derived SQLite view for query Consumers query-events per-party cursors; boot drains; drain writes read-receipts Rendered projections user-facing channels, crew brief, status surfaces Wakeup triggers reply_required drives the continuous-listen cadence Recovery primitive rebuilds the SQLite view from the log anytime. The three-state delivery contract (new since v1) — every state is derived from the log, none is claimed 1 · DELIVERED the event exists in the canonical log vault/events/00-events.jsonl appended = delivered — no separate flag 2 · READ receipt in the per-reader ledger vault/events/receipts/<party>.jsonl written by the drain tool on read 3 · ANSWERED a reply whose correlation ID matches the original event exists in the log computed from correlations — never claimed A reply_required flag creates a visible obligation that stays open until a correlated answer lands — the answered-state is derived by query, never asserted by an agent. The operating bar, set by the principal after lived failure: a message addressed to an agent cannot be missed, and a completion cannot be invisible — by construction. Identity-guarded writes (hardened iteratively, incident-driven) • Two UIDs per agent, two axes: party UID (messaging) vs agent-root (lineage). • Wrong-axis traffic rejected at emission — on both send and address axes. • Superseded identities persist as resolvable tombstones; rejected as signers. • Known limitation: no cryptographic log integrity yet — event signing / hash-chaining is the named next frontier (tracked on the roadmap). Projections, not authored surfaces • Sixteen hand-authored coordination channels retired over a six-release arc. • Agents read the log directly; surviving human surfaces are rendered views. • Tool telemetry lands in the same log — "what happened, in order" is one query over one file. • One source of truth, many views — the same doctrine as the vault index. One append-only CloudEvents log — 6,103 events — with identity-guarded emission and a delivery contract (delivered → read → answered) whose every state is derived from the log, never claimed.
svg/06-event-system.svg

7. Tropo Work — the work-management application

Work is the killer-app subsystem: agentic teams executing real work with audit trails, verification, and cross-generational continuity.

The primitives are the ones a Jira-literate team expects, expressed as typed files: tasks, projects, decisions (57 decision records; 53 numbered ADRs through ADR-052 — each a binding architectural commitment), design briefs, release plans and releases, notes, and collections. Boards and dashboards are derived views over (membership × status × target); surfaces never become containers.

Design points worth an engineer's attention:

The import → work → export loop for real-world documents matured into a hardened boundary (v1.81 "Work Crosses the Boundary"): a .docx (now also .md / .pptx) imports to a governed vault entry with a markdown working copy; agents edit in markdown while the source binary stays untouched; export rebuilds the deliverable with a locally-auditable round-trip receipt disclosing every content drop. The receipt itself was the hard part: the first build's receipt hashed the working copy against itself — a "receipt that cannot lie" failure caught by an 18-agent adversarial battery and fixed before ship. Export is verified to run with the network fully cut. On source deletion, the vault retains the node and re-links on resurface (ADR-046) — graph memory survives filesystem churn.

8. Pipelines, playbooks — and loops: orchestration with structural gates

Pipelines are declarative workflow templates — a DAG of nodes (pipeline → stage → step), authored once and versioned. Each execution is a typed pipeline-run that pins the template version, roots its own project, and keeps its own event log. Playbooks are governed procedures in natural language; gated playbooks write milestone events, and later groups structurally cannot begin until the prior milestone exists on disk.

Loops are the third orchestration class (new, v1.71): governed recurring autonomy. A type: loop entry declares goal, trigger, cadence, runner, verifier — and brakes: spend caps, wall-clock kills, iteration hard-stops, and a consent mode (ask by default; auto only by owner ruling). Six loops exist today (daily vault health, weekly integrity audit, update discovery, git backstop, gardener decay pass, one draft dispatcher). Loop cost is stamped null-honest from real metering: an optional gateway on live API traffic records actual per-run spend from provider usage data — never estimated, and never fabricated when unmeasured. This is the "self-maintaining Studio" (v1.79): maintenance as governed, costed, consent-gated substrate rather than cron folklore.

The proof-of-pattern is the dev-pipeline — the scaffold through which Tropo ships Tropo: design brief → locked dev-spec (adversarially reviewed before lock) → build → verification → ship gates → cut. A dev cycle triggers a doc-pipeline and a test-pipeline run and cannot close until both legs reach a terminal state (qualified 2026-08-26: the terminal-legs gate survives in the engine ceremony, but the operative close gesture since 2026-08-21 is tropo-close-dev.py — ungated by Mike's ruling, "never refuses a close": it records what happened rather than gating it; legs moved to release-opened under the §18 split) (the doc leg auto-passes only when no doc obligation was declared — and that branch-awareness itself was a bug fixed in this window). Each pipeline takes a typed commitment at activation — dev-spec, doc-spec, test-spec — with acceptance criteria paired to behaviors; the engine refuses to lock a spec where they mismatch.

The honest engineering story of this window: driving the v1.84.1 close-out was the first time the engine's close ceremony was exercised end-to-end — and it surfaced six real, pre-existing bugs in the pipeline runtime (a step-declaration path that silently dropped verification commands; a re-trigger gate that refused forever because it checked existence instead of status; a context-key bug that silently degenerated a test step to a no-op pass; a stale-spec resolution bug; a recompute crash; two step definitions pointing at nonexistent scripts). All six were found by checking raw run events against claims — not labels — and all six are fixed, with a regression-test hardening track open. The structural cure for the class is ADR-052: locking a dev-spec now atomically registers its pipeline activation, so the audit chain dev-spec ↔ activation ↔ build ↔ release is complete by construction rather than by discipline. §10 gives the full release-engineering picture this belongs to.

Pipelines, Playbooks + Loops — Three Orchestration Classes, One Gate Discipline Pipelines: DAG templates with typed runs · Playbooks: gated language procedures · Loops (v1.71): recurring autonomy with brakes. The dev-pipeline ships Tropo itself. 1 Pipelines — declarative DAGs pipeline (template) DAG of WorkflowNodes: pipeline → stage → step; authored once · versioned · governed pipeline-run (typed instance) pins the template version at start; roots its own project; own run folder + run.jsonl event log A run is a governed record, not a console log. 2 Playbooks — gated procedures Governed natural-language workflows an agent reads and executes: activation, retirement, cold-boot testing, apply- update, fleet-ops, onboarding. Milestone gating Gated playbooks write milestone events to the run's run.jsonl. A later group cannot begin until the prior milestone event exists on disk. The playbook is both the spec and the audit trail of its own execution. 3 Loops — recurring autonomy NEW v1.71 type: loop declares goal · trigger · cadence · runner · verifier BRAKES — every loop carries them spend caps · wall-clock kills · iteration hard-stops · consent_mode: ask (default) / auto by owner ruling only 6 live loops daily vault health · weekly integrity audit · update discovery · git backstop · gardener decay pass · draft dispatcher Cost stamped null-honest from real API metering — never estimated or fabricated. The dev-pipeline — how Tropo ships Tropo (98 OS release records · 96 distinct versions since April 2026) DESIGN BRIEF pair-design walk, captured + accepted DEV-SPEC · LOCKED adversarial review gauntlet before lock BUILD substrate authored; criteria explicit VERIFY raw run events checked vs. claims SHIP GATES docs · tests · sign-offs · cascade closed CUT version flips; cycle root archived ADR-052 — lock-time coupling Locking a dev-spec atomically registers its pipeline activation — the chain dev-spec ↔ activation ↔ build ↔ release is complete by construction, not discipline. one cycle activation triggers both cascade legs doc-pipeline run docs current with the release; auto-pass only when no doc obligation declared test-pipeline run verification evidence with every release; stub specs are a detected defect class release cannot close until both legs reach a terminal state Field report — the first end-to-end close-ceremony drive (v1.84.1) surfaced six real, pre-existing runtime bugs Dropped verification commands · a re-trigger gate that refused forever (checked existence, not status) · a test step silently degenerated to a no-op pass · stale-spec resolution · a recompute crash · step definitions pointing at nonexistent scripts. All six found by checking raw run events against claims, not labels — all six fixed; regression-test hardening track open. Three orchestration classes, one discipline: a step that did not run cannot be recorded as run — and when the bookkeeping machinery itself broke, the record names it.
svg/07-pipelines-and-loops.svg

9. Callable surfaces — five classes, one discovery layer

Five classes of callable capability, all first-class governed substrate (v1 listed three; two were missing):

The discovery layer (shipped in v1.70 itself but absent from v1 of this review): a Toolbelt — the ~15 core tools every agent loads at boot, mirroring the harness-native pattern — plus three capability catalogs (tools / skills / session agents) regenerated from the index. The doctrinal rule binding all five classes: if a capability exists, use it. Agents do not improvise operations the harness already knows how to do correctly.

A deliberate boundary unchanged from v1: tools are the paved road, never a mandatory gate. Hand-editing a file always works and is caught downstream by the validation gate and the groomers. This preserves the cold-boot floor (§11).

10. Release engineering — the authorization stack, and what broke (new section)

v1 described the pipelines; it did not describe how a release is authorized. That stack was built, stress-broken, and hardened in this window — and the honest arc is exactly what a room of engineers should inspect.

The stack as designed:

  1. Pipeline Activation Key (v1.71): the release builder and the public upload refuse to run without a runtime-minted fingerprint proving a real pipeline run occurred. Public ship additionally requires human signoff.
  2. Stranger-Walk Gate (v1.74): an always-asked cold-boot walk at cut — a fresh agent (conducted by Po, the release-test conductor role created for this) walks the release artifact as a stranger; a FAIL verdict blocks the upload. Its first live run blocked its own release until the PASS landed.
  3. Ship-gate refusals: the validator must be clean in strict mode before a build; the status flip to shipped requires the sign-off fields.

What broke, and what was done:

Cadence and scale: 14 OS releases in the 26 days since v1.70 (v1.71 → v1.84.1; v1.83 is deliberately reserved for a pending capstone). 98 Tropo-OS release records spanning 96 distinct versions since the first public release in April 2026, plus six non-OS product releases through the same pipeline. Not every release produces a standalone customer artifact — several landed as in-Studio substrate, each disclosing exactly that.

11. Governance and enforcement — the four loci

Governance is three-tier: OS-level invariants, Studio-level configuration, and per-folder contracts. On top sits the enforcement architecture made binding by ADR-044:

  1. Write-time — tools that enforce and normalize on write (messaging guards, the activation writer's hard gates, the mint chokepoint — ADR-050 routed all identifier generation through one collision-checked minter with typed kinds).
  2. Validate-time — the gate: 94 check functions (~90 executed per run) at every rebuild and as build pre-flight (v1: ~58; 115 at the 2026-08-26 re-verification). Newer checks read schemas from the capsules at runtime; a material minority hardcode schema literals in-code, policed by a Layer-3 declaration/implementation coherence meta-validator (v1.58+, ERROR-ratcheted v1.60) — the original "never hardcode" here was an unmeasured absolute, corrected 2026-08-26. Checks land at WARN and ratchet to ERROR once the substrate is clean. The ratchet pattern matured in this window: named grandfather exemptions with constant cutoffs (historical records exempt by name, going-forward violations fail) — honesty about the past without weakening the future. A red gate blocks the ship.
  3. Continuous — grooming agents: the first production groomer (the Gardener, v1.82) stamps decay signals flag-only, adversarially proven unable to write source files. (The fuller groomer fleet remains undeployed — §14.)
  4. Review — humans and agents under the signed Self-Healing primitive: every read carries a structural-defect pass; trivial defects are fixed in place, substantive ones filed as tracked work. Nothing is flagged-and-forgotten.

Judgment calls are part of the enforcement design. New rules meet old data; the system's pattern for that collision is now explicit: when the just-shipped federation grounding check fired on eight closed, archived tasks from April–May, the principal-approved resolution was a terminal-state carve-out — history degrades to WARN, live records stay ERROR, and an anti-rot regression test locks the boundary so the carve-out can never silently widen. Gates bind live work; history is a lint.

Two invariants a reviewer should test us against, unchanged:

Enforcement + Verification — Defense in Depth on a Language Base Four enforcement loci, a matured WARN→ERROR ratchet, and a verification model where "done" means independently proven. Verified at v1.84.1 (ADR-044). The four enforcement loci (each catches what the others miss) 1 · WRITE-TIME — TOOLS Structured mutations route through tools that enforce + normalize on write: emit- event guards, activation hard gates, and the mint chokepoint — ADR-050 routes ALL identifier generation through one collision-checked minter (typed kinds). The paved road — never a mandatory gate. 2 · VALIDATE-TIME — GATE 94 check functions (~90 executed per run) at every rebuild + as build pre-flight (v1: ~58). Schemas read from capsules, never hardcoded. New checks land WARN, ratchet to ERROR with named grandfathers: history exempt by name, go-forward fails. A red gate blocks the ship. 3 · CONTINUOUS — GROOMERS First production groomer: the Gardener (v1.82) stamps decay signals on the derived index — flag-only, adversarially proven write-less (two red-team agents with full-tree SHA256 baselines found no write path). Cardinal rule: never become a drift source. Fuller fleet not yet deployed. 4 · REVIEW — HUMANS + AGENTS Self-Healing primitive: every read carries a structural-defect pass — trivial defects fixed in place, substantive ones filed as tracked work; nothing flagged-and- forgotten. The principal verifies at gates — verification capacity, not agent capability, is what scales. The ratchet, matured — new rules meet old data without rewriting history Named grandfathers — the WARN→ERROR pattern New checks land WARN; the ratchet to ERROR carries named grandfather exemptions at constant cutoffs — historical records exempt by name, any going-forward violation fails. Three ratchet releases in this window. Honesty about the past without weakening the future. Dial settings inspectable at any time. Terminal-state carve-out — a worked example The just-shipped federation grounding check fired on eight closed, archived tasks from April. Ruling: history degrades to WARN, live records stay ERROR, and an anti-rot regression test locks the boundary against silent widening. Gates bind live work; history is a lint. The verification model — "done" is a verified state, not a declared one Three-instrument verification 1. Build — the author's own check 2. Independent review — adversarial skeptic in a separate context 3. Cold-boot stranger test — fresh context, artifact only Each instrument catches what the others structurally cannot. Two-sided convergence On the v1.84.1 cut, the release author independently re-ran all 69 tests (69/69) rather than transcribing the verifier's counts; the verifier had read raw run logs, not labels. Convergence of independent measurements — the strongest signal. Adversarial fleets, scaled to risk Covenant-class work gets a HEAVY fleet: a six-agent red team attacked the sovereignty publish path and found 5 real HIGH leak paths — fixed, pinned with regression plants; the re-verify fleet ran 6/6 fail-closed. Routine slices get a single independent check. Approver ≠ executor, fail-closed A verification-class step reaches "verified" only on a real verification receipt — executor attestation alone cannot promote it. Identity resolution on approval- required work fails CLOSED: a guard that can silently no-op is no guard. The cold-boot invariant (sacrosanct) The validate gate may WARN on a hand-written file but must never hard-reject it. Structure tightens without ever breaking the plain-markdown floor — a stranger with a zip of the Studio can always boot it. Locks are law Locked files are immutable without explicit principal approval; lock-breaks are logged governance events. Four loci each catch what the others miss; the ratchet advances with named grandfathers and terminal-state carve-outs; and "done" is an independently re-measured state, never a self-declared one.
svg/08-enforcement-verification.svg

12. Verification and quality — "done" means independently proven

The quality discipline, in one sentence: completion is a verified state, not a declared one.

13. Federation — the segmented vault and the sovereignty covenant (new section)

Shipped v1.84.0 (foundation) + v1.84.1 (complete, 2026-07-10). This is the largest architectural addition since the review's v1, and it went from first signed decision to shipped-and-adversarially-proven in five days (graph-model gate signed 2026-07-05 → covenant shipped 2026-07-10) — through two co-signed architect "joint gates" with the principal ruling escalated forks.

The model:

The sovereignty covenant — "no private byte crosses the wire, in either direction." The publish path is built on a git-plumbing truth: a push carries a ref and its whole history, not a file list — so naive filter-then-push leaks. The publisher instead builds a fresh commit tree of exactly the passing files (first publish is an orphan root; later publishes parent only on the prior public-only tip, so public history accumulates without ever anchoring to private history), pushes only that single ref, and re-validates the committed tree (walking every reachable commit, not just the tip) to close time-of-check/time-of-use. It enumerates the filesystem rather than git's tracked list, refuses symlinks/hardlinks/path escapes, submodules, LFS pointers, merge commits, and multi-worktree states. The pull side trusts nothing: it refuses shallow clones and re-runs every boundary check itself — the publisher's receipt is informational, not the guarantee. Enforcement is entirely client-side; a server hook is never trusted.

The proof record: red-teamed twice at spec stage (~10 HIGH leak paths folded before build; the red team also caught one over-restriction that would have destroyed shared team history). Post-build, a heavy six-attacker fleet — scanning the remote's bytes themselves — forced private bytes across on 4 of 6 angles of the first build: manifest fail-open, ancestry poisoning via a buried non-tip commit, a TOCTOU window, a tautological segment gate. All five HIGH leaks (plus six MEDIUM) were fixed; the fresh fleet re-ran 6/6 fail-closed. The proof suite is 23 tests including 8 regression plants pinning each closed leak; the full federation surface is 69 tests, independently re-run green by two agents on cut day.

Honest ceilings, disclosed in the locked spec itself: (1) revocation is forward-only — the covenant holds at push time; a file later reclassified private is already out; (2) on a platform-hosted remote (GitHub-class), that a publish occurred and ref metadata are platform-visible even though content and history hold; a self-hosted remote removes even that; (3) segment derivation is structural, not cryptographic — an attacker who can forge both content and a matching manifest defeats the second factor (tracked follow-up; the unconditional scope gate remains the load-bearing control). And the plainest one: zero live mounts exist today. The two-machine proof ran on a simulated two-machine harness (two clones + a bare remote); the first real two-box run is the named acceptance walk. The covenant is proven; production federation use has not begun.

Federation — Segmented Vaults + the Sovereignty Covenant (v1.84) Two Studios share a team vault over a plain git remote. Shipped v1.84.0 → v1.84.1 (2026-07-10). Enforcement is entirely client-side; a server hook is never trusted. TWO STUDIOS, ONE TEAM VAULT · segments derive per record; the team remote is a plain bare git repo STUDIO A — full private studio private segment unmarked → private os segment scope ∈ {ship, external} 4,239 records; 15% public-eligible segments recompute on every rebuild TEAM VAULT — plain git remote bare repo; no server logic; hooks never trusted; public-only accumulating history audience: team; kind immutable STUDIO B — teammate's studio private segment unmarked → private os segment scope ∈ {ship, external} same derivation, same gates — runs on the teammate's machine publish (covenant) pull — re-checks all publish (covenant) pull — re-checks all Segments DERIVE — never authored Computed from extraction_scope (home) or the vault manifest; hand-edits overridden on rebuild. Default-deny: the allowlist is a frozen code constant {ship, external}. D7 — grounding is per-vault Every work item traces membership to ITS OWN vault's anchor entity — the ownership chain resolves identically on every team member's machine, whoever computes it. member_of lattice (cross-vault refs) Up-lattice (equal-or-wider audience) legal ✓ Down-lattice / incomparable = illegal-but- present: excluded from adjacency + authority, surfaced as lint — never silently dropped. THE MOUNT GATE + SHARD INDEX · composition is validated, consented, commit-pinned — and fails closed MOUNT GATE — five checks before a foreign vault attaches 1 · Manifest validation — vault kind is immutable after activation 2 · compose.lock — every mount pinned to a resolved commit; same lockfile ⇒ same composition, reproducibly 3 · Executable-consent as a governed write 4 · Vault-qualified capability names — the dependency-confusion defense (Unicode homograph bypass caught + fixed pre-ship) 5 · Re-consent on contract narrowing SHARD INDEX — incremental, fails closed Each mounted vault's index rows cache as a shard keyed on the lockfile's commit pin — the mount pin IS the dirty-check key. Stale shard ⇒ a "cannot-compose" validator finding — never a silently-partial index. THE PUBLISH COVENANT · "no private byte crosses the wire, in either direction" Fresh tree, not a filter A git push carries a ref + its whole history — never a file list, so naive filter-then-push leaks. The publisher builds a fresh commit tree of exactly the passing files, then pushes that single ref only. Public-only history First publish = orphan-root commit (no parent). Later publishes parent only on the prior public-only tip — public history accumulates without ever anchoring to private history. Committed-tree re-validation Re-validates the committed tree, walking every reachable commit — not just the tip (closes TOCTOU). Walks the filesystem, not git's tracked list; refuses symlinks, submodules, LFS, merge commits, multi-worktree. Pull side trusts nothing Refuses shallow clones; re-runs every boundary check itself. The publisher's receipt is informational — never the guarantee. Enforcement is entirely client-side; a server hook is never trusted. PROOF RECORD — adversarial, not self-graded Red-teamed 2× at spec stage ~10 HIGH leak paths folded before build 1st build leaked — 4 of 6 angles heavy 6-attacker fleet forced private bytes 5 HIGH + 6 MEDIUM fixed re-verify fleet: 6/6 FAIL-CLOSED 23-test proof suite · 8 regression plants 69/69 federation tests, re-run green by 2 agents HONEST CEILINGS — disclosed in the locked spec itself Revocation is forward-only a file reclassified private is already out Platform remote sees metadata publish-occurred + refs visible on GitHub-class Segment gate structural, not crypto forged content + manifest defeats 2nd factor Zero live mounts today proof ran on a simulated 2-machine harness The covenant is enforced client-side, proven fail-closed by a red team tasked with making it leak, and honestly ceilinged — production federation use has not yet begun.
svg/09-federation-sovereignty.svg

14. Security and assurance posture — the CISO view (fully refreshed)

14.1 What the architecture gives you

14.2 Network-touching components (enumerated)

  1. Release upload — the build tool uploads release artifacts to a hosted bucket (credentialed via environment; ship-time only).
  2. Update discovery — first boot of the day fetches a static update manifest; offline-safe silent-skip; applying an update is human-gated with a dry-run diff and a sealed dual-hash receipt (the Update Covenant, ADR-049: user substrate is inviolable under OS update — proven by a seeded-studio walk that honestly failed round 1 and passed round 2 after same-day fixes).
  3. Federation transport — git push/pull to explicitly configured remotes, under the §13 covenant.
  4. Optional metering gateway — a local proxy on the operator's own API traffic for real cost accounting of autonomous loops. Optional, local, and off by default.
  5. The AI harness itself — as in v1, agents act with the privileges of the harness they run in; harness selection and configuration are part of the security boundary and should be reviewed jointly.
  6. Substrate-initiated model-API calls (added at the 2026-08-26 re-verification — this list was incomplete): lib/llm.py instantiates a first-party Anthropic client against ANTHROPIC_API_KEY, consumed by orient()'s paid read tier, the Distiller tools, the Gardener body-judge, and the event query tools. Plus a credential-gated GitHub REST surface for the D5 protected-repo proof (lib/d5_proof_repo.py, test-consumed only).

14.3 Honest limitations (current, tracked — each lives as a governed work item)

  1. No cryptographic integrity on logs or authorization yet. Logs are append-only by convention and tooling, not cryptography. Sharper than v1 stated it: the human-signoff check on public releases was adversarially proven forgeable by an executing agent even after its first fix, and the principal accepted that as a documented L1 ceiling — today's guarantee rests on the operational reality that a single registered human runs and signs every cut. The designed fix (a signing primitive for un-forgeable human authentication) exists as a design brief and is not built; a stated intention to build it before federation was not met — federation shipped first, with zero live mounts as the mitigating fact. This is the top of the security backlog. (Story moved twice since — corrected 2026-08-26: an Ed25519 agent-provenance signing primitive WAS built and Mike-accepted 2026-07-30, then deliberately retired by ADR-066 on 2026-08-03 ("the agent lifecycle mints no cryptographic key material"). Separately, Ed25519 group-authority signing with out-of-band human-fingerprint trust IS live at L1 on the mount/update surfaces. The substance of this ceiling stands: release human-signoff remains non-cryptographic by accepted ruling, with a hardened independent-registered-signer check as defense-in-depth.)
  2. Access control is conventions plus harness permissions, not OS-level ACLs. Anyone with filesystem access can edit any file. Tropo's layer is integrity detection and audit (validator, groomers, forward-pointers, event trail), not access prevention. Disk/repo permissions and the harness perimeter are the access-control story.
  3. The validator is not green today — and the review says so. Current full run: 87 passed, 3 failed (two lifecycle-rollup leaks; one schema violation on two of the new maintenance-loop entries — the self-maintenance registry itself carrying a schema defect is a finding the system caught about itself). v1's "holding green as a ship precondition" was true at strict-gate ship time but is not a standing steady-state guarantee; red findings are tracked work, and the strict gate still blocks builds.
  4. Release-gate history is disclosed, not hidden. Six releases shipped with byte-identical authorization fingerprints before the defect was caught (fixed v1.80); several releases shipped off-pipeline and were retroactively papered with explicit disclosure; three release masters closed by documented attestation when the close ceremony was found defective (§10). The pattern to evaluate is not "gates never failed" — it is that every failure is named in the record, was fixed or ceiling-documented, and produced a structural cure (ADR-052, salting, regression tracks).
  5. Enforcement coverage is intentionally gradual (ADR-044). High-value types enforce hard; the long tail is looser by design; WARN→ERROR ratchets advance with named grandfathers. The dial settings are inspectable at any time.
  6. Two v1-roadmap items remain undelivered: the groomer fleet (one flag-only groomer is live) and event-log cryptographic integrity (see item 1). Scored honestly in §15.

None of this is news to the system; all of it is tracked inside it — which is itself the point: the security backlog lives in the same governed, auditable substrate as everything else.

15. Maturity, scale, and trajectory

Operating evidence as of 2026-07-10:

Scoring v1's stated trajectory, honestly: memory v3.0 cascade — done. WARN→ERROR ratchets — major progress (three ratchet releases). Write-time work-management tool family — partial (disposition shipped; the fuller family pending). Groomer fleet — not deployed (one flag-only groomer live). Event-log cryptographic integrity — not landed (design-stage; §14.3 item 1).

Trajectory from here: the "v2 floor" program (One Home, clean self-update, warnings-to-zero, true stranger-walk) closed at v1.78. The "v3 program" is underway: self-maintenance (v1.79), customer-hands honesty and the security fixes (v1.80), the import/export boundary (v1.81), continuous knowledge health (v1.82), federation (v1.84.x — shipped). Reserved and pending: v1.83 "One Voice," the deliberately-last capstone that narrates the finished system, gated on a month-long stranger acceptance walk. Beyond L1: the L2 cockpit track now runs inside the federation program (parallel L1/L2 tracks; team vaults decided as git-native private repos with a merge-blocking governance validator), and the product structure is three rings — the open-source OS, a marketplace of published capabilities, and the ecosystem.

v1.0 → v1.84.1 — Four Months of Self-Hosted Releases 96 distinct OS versions · 98 release records, Apr–Jul 2026 — nearly all via the system's own dev-pipeline, plus 6 non-OS product releases through the same pipeline READING THIS DIAGRAM single-release milestone (dated) multi-release window (date span) reserved version — pending generation handoff notch v1.71 · Jun 17 Loop Primitive + release activation key v1.84.x · Jul 8–10 federation — foundation (Jul 8) → Federation Complete + sovereignty covenant, Mike-signed v1.70 · Jun 14 the v1 review baseline — 14 OS releases shipped in the 26 days since v1.73–v1.74 · Jun 19–20 public repo live — github.com/tropo-ai/tropo; Stranger-Walk gate; Po (concierge) joins the crew v1.79–v1.82 · Jul 4–5 four releases in 48 hours — v1.79 self-maintaining studio; v1.80 security: salted keys + signoff hardening; v1.81 import/ export receipts; v1.82 Gardener v1.41 · May 16 Apache 2.0 license set — the OS goes open source v1.76–1.78 · Jul 1–3 the v2 floor — One Home; path preservation; the Update Covenant v1.83 One Voice reserved · pending v1.1.0 · Apr 2026 Mar Apr May Jun 1 Jun 10 Jul 1 Jul 10 (scale expands ≈9× here) THE SAME FOUR MONTHS, SEEN FROM THE CREW — every founding seat turned over; identity, memory, and open work survived every handoff Argus — Chief Architect A107 → A129 · 22 handoffs since the v1 review — A129 wrote this v2 Vela — Chief of Staff V55 → V64 · 9 handoffs since late May Talos — Engineering Lead … → T28 · turnover continuous Metis — Strategist … → G88 · turnover continuous Po — Concierge P1 — commissioned Jun 20 (v1.74), first generation still active (role did not exist until Jun 20) today — Jul 10 · v1.84.1 ships One release in this window was mid-flight across three generations of two different agents — and shipped correctly. Handoff notches: Argus and Vela counts are from the activation registry, spacing schematic (not dated); Talos and Metis lanes show end-of-window generations only. Built by the thing it describes: 96 versions in under three months through the system's own pipeline, while crew seats kept turning over — and v1.83 stays reserved until a month-long stranger walk passes.
svg/11-evolution-timeline.svg

16. Summary for the reviewer

Tropo L1 is a small number of strong ideas, composed:

  1. Plain files as the universal substrate — auditable, portable, minimal-infrastructure, and now an open-source public artifact with a private-by-default Studio boundary.
  2. Typed contracts (capsules) with gradual, tighten-only enforcement — structure without breaking the language floor.
  3. Durable agent identity with hard lineage gates, governed succession, bounded memory, and budgeted boots — AI staffing without continuity loss.
  4. One append-only event log with a three-state delivery contract — views are projections, never independent truths.
  5. Verification as a structural property — independent receipts, verifier independence, adversarial fleets scaled to risk, and an honest escape hatch (documented attestation) for when the machinery itself is what's broken.
  6. Federation under a proven sovereignty covenant — segmented vaults, derived visibility, and a publish path that was made to fail closed by people paid to make it leak.

The system's strongest credential is reflexive: it is built, governed, versioned, and verified by itself, under real workload, with its failures recorded in its own substrate and converted into its own gates. Its second-strongest credential is this document's candor: the broken fingerprints, the forgeable signoff, the never-exercised close ceremony, the red validator — all of it is in the record, dated, owned, and either fixed or ceiling-documented. The diagrams in svg/ and every claim in this document trace to governed files a reviewer is welcome to read directly.

Part II — The v3 delta (v1.84.1 → v1.86.0+, measured 2026-08-12)

Five weeks and two shipped releases after v2. Part II is organized around the four architectural events of the window: the lifecycle rebuild, the pipeline constitution, the knowledge engine's first production cycle, and federation leaving the lab. Sections here are measured live at 2026-08-12; each names any §1–16 claim it supersedes.

17. Lifecycle v2 — born / continue / retire (supersedes part of §4.1)

§4.1 described two hard gates that HALT activation (ADR-016, ADR-028). That posture is superseded. After three agent generations were blocked at birth in one week by their own paperwork, the principal ruled: "I never want to see my agents telling me they are failing to boot." The lifecycle was rebuilt (2026-08-06) around a single principle — existence cannot be refused; findings are recorded, never blocking:

Lifecycle v2 — Born · Continue · Retire §17 (supersedes part of §4.1): three verbs over one append-only file. Existence cannot be refused — findings are recorded, never blocking. Rebuilt 2026-08-06; extended by §25's retirement driver. Why v2 exists — three agent generations were blocked at birth in one week by their own paperwork The principal ruled: "I never want to see my agents telling me they are failing to boot." §4.1's HALT posture is superseded — ADR-016/028 remain graph invariants, but a violation is a recorded finding, not a refused existence. born — one command The file issues the generation highest generation in lineage.jsonl + 1 — deliberately no flag to claim a generation: no claim to verify, no mismatch to halt on Findings recorded — never blocking ADR-016/028 checked at the mint → recorded as provisional: findings on the birth line, surfaced in the startup signal. The agent is born either way. One crew broadcast emitted on born (as on retire); a failed broadcast never blocks — lineage is unaffected continue — compaction ≠ retirement Re-anchor from substrate, one command a compacted agent is a stale reader of its own session: who (never born — the phantom-generation hazard) · fetch · drain both event axes · list unanswered reply_required debts · show its own recent commits Welded broadcast the tool emits the compaction broadcast itself — exactly one per continuation UID; never left to a compacted memory Per-harness trigger adapters Claude · Cursor · Codex · Gemini — one identical trigger line, copy-equality validated retire — one command Living-transfer letter — create-only agents/<slug>/transfers/<GEN>.md create-only by mechanism, not by care — it will not overwrite a predecessor's letter Closing lineage line + one crew broadcast the retired line is appended; the close's announce() is the single broadcast writer §25 — the retirement driver verifies the eight §Required Practice steps on the world — a file on disk, an event on the bus; absence of evidence is reported open, never as pass. It never gates the close: "retire is one command" stands unchanged. appends the birth line writes no lineage — nothing born, nothing retired appends the closing line The spine — append-only lineage agents/<slug>/lineage.jsonl — one line per transition; the file, not a flag, is generation truth {"t":"born","gen":112,"at":…,"by":…} {"t":"retired","gen":112,"at":…,"by":…} {"t":"born","gen":113,"at":…,"by":…} next line appends here append-only, never edited · born and retire each add exactly one line · continue adds nothing — it has no path to born and writes no lineage Single-Source S4 — lineage is the render source The boot procedure derives from two fingerprint-gated sources; the crew brief renders from lineage as generation/status truth. On 1M-token sleeves with survivable compaction, retirement becomes a chosen ceremony at natural stopping points — not a forced response to a full context window. Born and retire each append one line and announce once; continue re-anchors mid-life and writes no lineage — compaction is not retirement, and existence cannot be refused.
svg/13-lifecycle-born-continue-retire.svg — Lifecycle v2: born / continue / retire — existence un-refusable, findings recorded, never blocking

18. The pipeline constitution — dev and release split (extends §8 and §10)

The principal designed it in two sentences at a whiteboard; twelve hours later it was a locked spec; six days later stages 1–5 of 9 were built and independently accepted. The dev-pipeline runs Specify → Build → Test, one run per locked dev-spec, closing at one tested SHA with mutation evidence — and produces no release artifacts. Releases are a separate release-pipeline, ignited only by a locked release-plan and closed only by verified publication. There is no "park" state: "build complete" is an ordinary done dev-spec; the release-plan fans in done specs by explicit list.

What a reviewer should inspect is the review record: stage 4 (the release-plan lock — the ignition key) survived seven adversarial NO-GO rounds, every one legitimate, killing a forgeable-green class (snapshots now GOVERN runs as executable content, recovery recomputes the digest it checks, closure binds to receipt-level tested-SHA). Then the reviewer reopened his own stage-5 ACCEPT when the builder showed him the standalone package tool still bypassed the new gate — "That is my review error, not yours... thank you for checking the location I named instead of letting my ACCEPT overrule the world" — and re-skipped the acceptance selector rather than leave a false green. The machinery and the culture now enforce each other.

Alongside the split, the velocity build removed the release-day tax: the validator went 244.9s → 40.4s and the full vault rebuild 278.3s → 69.1s (one shared frontmatter parse replaced 108K redundant YAML parses); the debt ratchet became itemized by class (a ceiling that names what grew instead of counting it — currently 84 accepted class-errors, paid down from 110 at the Gardener cycle); and a stale-constant detector separates pinned values from copied ones. And a governing doctrine landed, principal-ruled after the studio once "ground to a halt under checks that added very little value": warn-safe is the default — a refusal earns its existence by naming its irreversible harm in one sentence, or it is a warning that proceeds and records. Fail-closed is earned at publication, deletion, spend, identity, and false-success prevention; everything else warns.

The Pipeline Constitution — Two Pipelines, Three Human Gestures §18: the dev-pipeline runs Specify → Build → Test — one run per locked spec, one tested SHA, no release artifacts. Releases are a separate pipeline, ignited only by a locked release-plan. IDEATION — inbox, ungoverned pace Note observation · idea · finding Design brief the problem + the intent Dev-spec the contract: ACs + locked verify commands adversarially reviewed before lock MIKE LOCKS gesture 1 · dev ignition the lock writes an immutable snapshot of the spec + registers activation + creates the run, all in one gesture (ADR-052) DEV-PIPELINE — one run per locked dev-spec SPECIFY the locked spec is the plan of record BUILD builder implements against the frozen contract · evidence recorded per AC TEST a non-author runs each locked verify command verbatim · mutation evidence DONE = one tested commit the run closes at one tested SHA — no release artifact closure journaled, not declared done specs accumulate as ordinary done dev-specs — there is no "park" state; the release-plan fans them in by explicit list RELEASE-PIPELINE — many done specs, one version done spec S1 done spec S2 done spec S3 … Release-plan names the version + which done work ships — by explicit list MIKE LOCKS gesture 2 · release ignition ASSEMBLE validate fan-in · build the box VERIFY freeze sha-bound · independent harness PUBLISH stage · preflight · await the fire MIKE FIRES gesture 3 · deploy vX.Y.Z public, with a receipt the release-plan lock — the ignition key — survived seven adversarial NO-GO rounds, every one legitimate, before its stage was accepted Worked record — v1.91 in numbers: 4 dev-runs fanned in → 1 frozen package sha (3cfb4fe4…) → 1 fire at 09:36Z → v1.91.0 public The principal designed the split in two sentences at a whiteboard; twelve hours later it was a locked spec; six days later stages 1–5 of 9 were built and independently accepted. "Build complete" is an ordinary done dev-spec sitting in the vault until a release-plan names it — the two machines meet only at the fan-in. Orange is the human — by design, exactly three gestures per shipped feature: lock the spec, lock the plan, fire. Everything between them is machine-verified agent work inside two separate pipelines.
svg/12-two-pipeline-dag.svg — The two-pipeline constitution: dev-pipeline (Specify → Build → Test) and the separate release-pipeline, ignited only by a locked release-plan

19. The Gardener — the vault's first production pruning cycle (extends §3.2 and §11's "flag-only groomer")

v2 reported one flag-only groomer, adversarially proven unable to write. Since then the full Gardener Pruning system shipped and ran its first complete human-reviewed cycle (2026-08-11):

The Gardener — the Vault's First Production Pruning Cycle §19 (extends §3.2 + §11): a caged proposal-only judge under governed identity · a human-reviewed sitting · evidence-bound stamps · archive with receipts. First complete cycle 2026-08-11. Governed policy = judge identity the pinned judge-prompt SHA-256 + the policy version IS the judge's identity — edit one character and stamping authority lapses until re-qualification authority earned blind: 18/18 against the principal's hand-marked fixture cases; the worse earlier prompt was rejected, its failing scorecard preserved as the reason the current wording exists CAGED · $0 CEILING The judge a Cursor cloud sub-agent runs one pass under a $0 enforceable spend ceiling — no provider API path exists in its envelope proposal-only: it writes no governed content judging runs on schedule — weekly, via fleet-ops; stamping is a separate gesture entirely 281 proposals (cycle 2) one verdict per entry: finished / superseded / abandoned — proposals only; nothing in the vault changes until a human stamps queued for the sitting — the judge cannot dispose of its own proposals HUMAN-REVIEWED SITTING — the human is the lever stamping is a separate human-reviewed gesture — unattended auto-stamp is prohibited by standing rule cycle 2: 14 proposals walked individually by the principal (every OS-segment item, every "abandoned" verdict); the rest executive-reviewed span by span under a ruled policy 279 stamped · 2 held honestly on prospective-tense evidence · zero wrong verdicts found in ~280 spans read Evidence-bound stamps a stamp binds: the exact quoted span · its byte offsets · the body's hash at judgment time · the judge's identity · the approving actor edit a stamped body → the stamp is visibly stale and re-queues a stamp can always prove — or lose — its own currency Archive with receipts 75 entries archived with receipts · live working set: 3,297 active records every failure in the cycle was a tooling seam, each now a filed, tracked finding: a render-state-dependent content hash; two tools blind outside the main store; a lock tool that corrupted its own record on an apostrophe while printing success content gate — steady-state cycles re-judge only what changed The honest gap — the loop was wired for launching, not landing the judge ran on schedule, and its 281 proposals sat unnoticed for three days behind a status field written mid-run Gardener v2 — design brief in the graph, superseding-in-design the v1 spec closes the consumption loop: a pending-disposition marker + one boot-signal line · the disposition steps named in the loop's own procedure · confidence triage to shrink the sitting Authority is a hash: the pinned prompt + policy version is the judge; the human sitting is the lever; every stamp carries the evidence to prove itself stale — and the gap between launching and landing is named, with its cure in design.
svg/15-gardener-loop.svg — The Gardener loop: caged judge → evidence-bound stamps → human-reviewed disposition → archive with receipts

20. orient() and the Distiller — the knowledge engine's other half (design stage; stated plainly)

The Gardener removes the dead. The Distiller — orient() — ranks and serves the living.

Stages A and B (deterministic retrieval + ranking substrate: task-circle expansion, decay-aware ranking, viewer projection) are shipped code. Stage C — task-shaped synthesis with extractive spans and verbatim provenance, brief-then-judge, two latency tiers — was contracted as a locked build contract with five principal-locked design rules (body-rot verdicts belong to the Gardener once per body version; synthesis is task-shaped only; extractive span-grain with provenance; brief-then-judge; two tiers) and an attested model-edge contract (models, pricing, consent, fences — all receipts). The principal ruled crown-first sequencing: orient() precedes the cockpit's later phases. The per-agent compact-continue "refresh" (§17) is deliberately specified as a hand-written prefiguration of orient()-for-self, so the two arcs converge rather than compete.

21. Federation left the lab (supersedes §13's "zero live mounts" and §14.3's framing)

v2's plainest ceiling — "zero live mounts exist today; production federation use has not begun" — is retired:

22. Metrics refresh and the honest state (2026-08-12, measured live)

Part III — The v4 delta (v1.86.0+ → v1.92 in flight, measured 2026-08-24)

Twelve days and three shipped releases after v3 (v1.87.0 → v1.91.0), measured live on the single day the v1.92 cycle scoped, locked, and mostly built four dev-specs through a two-pass adversarial gauntlet. Part III is organized around the window's architectural events: the release machinery's first real runs and what they broke, the one-day conform cycle, the lifecycle receiving its executor, the release-profile seam, and the knowledge engine's first production blindness test. Each section names any earlier claim it supersedes.

§23. Releases v1.87–v1.91 — the ship path under load (supersedes §18's "the velocity build removed the release-day tax")

The window shipped four public releases: v1.87 (published 2026-08-15T01:36Z, receipt ca4e6410), v1.88 (published 2026-08-16T12:18Z — corrected 2026-08-26: this section originally said 08-15, the CHANGELOG row's date; the publish event says 08-16, one reader/writer instance inside the document that documents the family), v1.90 (fired 2026-08-22T23:44Z), and v1.91 (2026-08-24 09:36Z). v1.89.0 never shipped publicly — its plan closed cancelled and its six locked specs were subsumed into v1.90 (cf0da4bc). §18 reported the release-day tax removed (validator 244.9s → 40.4s). That claim is superseded: the tax was never compute. It was adjudication, and two releases measured it.

v1.90 cost nine builds, four cold walks, two days, and roughly forty founder prompts (retro 62deeec1). Its thesis: nearly every refusal was one defect — the release event vocabulary was built read-first. Seven measured instances: constants declared, readers implemented, refusal messages naming an event as the cure, tests asserting it — and no writer anywhere (package_superseded, candidate_invalidated), or two readers of one journal disagreeing. The ship also came one paste from public with three of the maintainer's own release scripts inside the box, hardcoded to his machine, while the box's own test-report certified the absence of exactly that leak. The absolute-path validator that catches it existed, with zero call sites; it is now harness check 6b, fail-closed, mutation-proven.

v1.91 cured the named disease and exposed the real one (retro 25c70440). The cure is real: tropo.release.scope_locked fired on the bus in production for the first time; all 14 declared release events now have exactly one writer, enforced at validate; the receipt shapes unified; 23 of 23 non-deferred acceptance criteria verified green on their own locked commands, each by an agent that did not build it. And the release still cost the founder a full night: ~20 refusals, every one correct, not one knowable before the run started, plus three release-path tools repaired mid-flight — one broken by this same cycle's own format change at 09:35 that morning, unnoticed for fifteen hours. The retro's verdict stands as this section's: "we built a verification system and called it a build system." v1.91 fixed what the release says about itself, not what shipping costs; the refusal count is v1.92's scoped problem.

The artifact got measurably better while the path got no cheaper. Same shipped validator, bare stranger studio, one cycle apart: v1.90 = 319 failures, v1.91 = 30.

And v1.91 shipped the first honest image manifest in Tropo's history. An independent harness agent — dispatched because a gate refused to accept the driving agent's word — found F1 (33d5bca1): the shipped manifest described bytes the build then rewrote, in every release ever published — 33 of 1,054 entries stale, and 204 of the box's 1,259 files absent entirely, from the file that is the delete-set's only input at apply time. The founder chose the rebuild; it bought a manifest with 0 mismatched, 0 unlisted, independently confirmed. The fix then uncovered F7 (5f75c7f3): a complete manifest puts customer state — event log, memory surfaces, registries — into the apply-time replace set, because is_studio_state() classifies 4 of 1,258 entries. The broken manifest had been an accidental shield. F7 shipped knowingly: filed and accepted in writing at the step-9 signature rather than patched unilaterally at 05:00, with Vela's byte-verified path classification already in the record and the cure — in package_state_exclusions, requiring a rebuild — riding to v1.92.

§24. The v1.92 cycle — one defect family, scoped and mostly built in a day (qualifies §12's "done means independently proven"; extends §18's warn-safe doctrine)

On 2026-08-24 the principal locked v1.92's shape at three goals, verbatim on the cycle board: a first-principles rebuild of the release build process, one build objective — "a fully formed dev-pipeline ready to start work" in a stranger studio — and the deferred list dispositioned once. "We do that, then we rebuild and publish. Every step." The governed plan is vault/files/088e21aa.md; the board (boards/v1.92-cycle-board.md) had been opened a day earlier precisely because v1.92 "had five claimants in five places and no address."

What followed compressed a release's design phase into one day. Four dev-specs were authored, each run through a two-pass review with an independent skeptic before lock. The two heaviest gauntlets are on record verbatim: 8eeebdab (retirement driver — 10 findings, 3 blockers, including a spec that would have shipped a 71-spec red wall and a second writer of the retirement notice) and 1963123e (Stream 1 — 10 findings, 2 blockers plus a scope catch that added the missing runner AC). Both verdicts read FIX-THEN-LOCK; load-bearing blockers were re-verified first-hand by the release owner before relay. All four specs locked 2026-08-24, and by that evening two were built and non-author verified (the retirement driver, 25 tests verbatim plus a live known-negative; the deriver identity fix, proven by a live zero-churn double-run), Stream 2 stood at five of six criteria verified with only the First-Use Walk pending, and Stream 1 — split mid-day between two builders — had its hardest ACs green.

The cycle's thesis held under adversarial pressure: every defect found this window is one family — a fact declared in one place and written, or read, differently in another. The completion verifier is the family's deepest instance (814210f0): tropo-verify-release-live.py, the leg that exists so a release is not self-attested, bound five facts and every one read a key or path no producer writes. It has never returned complete for any release; v1.90 and v1.91 both shipped with their second opinion structurally unable to speak, behind a test suite that was green because its fixtures were hand-built in the reader's shape. This qualifies §12: "done means independently proven" was true of dev-specs and never yet of releases. The repair moved the live v1.91 run from three facts absent to one; the last, the scorecard, exposed that REAL_FIRE had no caller anywhere — the instrument built in v1.89 to measure what shipping costs the principal had never been switched on. It is now wired at the fire, with "nobody counted" (None) finally distinct from "none occurred" ([]); the ruling makes the scorecard fact forward-only, run 7ee91e0b exempt by name.

The rebuild's other two boundaries: preflight gates are now data with computed phases — six governance gates registered (lock-static went from 1 to 7), each placed by the registry from its declared inputs so a gate cannot choose its own boundary, and an empty boundary prints an explicit 0-gates line instead of the blank three boundaries hid behind for months. And §18's warn-safe doctrine gained the third class its binary always forced dishonesty into: every build-path refusal now carries exactly one disposition — priced refusal, warning-that-proceeds-and-records, or operational-misuse error, the last exempt from harm-pricing and forbidden from masquerading as a release verdict. The build path had cited the warn-safe ruling zero times; the lock, built after it, cited it three.

§25. The close learns to read the world — the retirement driver, the substrate check, and the debt baseline (qualifies §12; extends §17)

§12 stated the discipline as fact: "completion is a verified state, not a declared one." Two instruments landed 2026-08-24 (spec b1e78abb, v1.92) because at the spec lifecycle it was aspiration — a record could say a thing happened with no instrument reading the world to check.

The retirement driver (vault/tools/tropo-retire-driver.py, 492 lines, built by talos-t50) walks the eight bold-labeled steps of the retirement playbook's §Required Practice and verifies each on the world — a file on disk, an event on the bus; absence of evidence is reported open, never as pass. Two token-shaped steps get known-negative-aware observers: matching a generation number anywhere in a 1,700-line append-only Captain's Log is not an observer, so the driver demands a real entry heading. Step 8's broadcast is read back from the bus, never emitted — the close's announce() is the single writer, and a driver that also emitted would rebuild the two-writers defect inside the spec written to cure it. Its only refusal is playbook drift: if the section does not parse to exactly the eight labels its registry knows, in order, it refuses and names the delta — because the observer registry is a second copy of the list, made safe by breaking loudly. It never gates the close; §17's "retire is one command" stands unchanged. The motivating record: A153 missed two steps, A155 one, A154 missed §8 recovering A153's retirement from a summary — three competent agents following written procedure.

The committed-substrate check exists because nothing ever compared a done spec's committed_substrate to the filesystem (grep of vault/tools/ for the field paired with any existence check: zero hits). The known-positive: spec 29506520, status: done, target_release: 1.91.0 — with four of its twelve declared targets absent, all four v1.91 driver test files, exactly the AC1/AC2/AC5/AC7 carried to v1.92. Nobody lied; no instrument compared field to world. The new validator check errors only at done and only at capsule_version >= 1.5, because the corpus is not clean: measured 2026-08-24, 71 of 120 done specs carry at least one unresolvable target, and 19 carry lawful planned identifiers (named WARN, never ERROR).

Those 71 land in .tropo/committed-substrate-debt-baseline.json (captured 2026-08-24T21:44:39Z, Metis G112 ruling): 22 frozen signatures, shrink-only, each keyed on the full unresolved-target set — so even a partial cure changes the signature and re-ERRORs until consciously re-frozen. 29506520 is deliberately excluded so the known-positive keeps firing until its owner annotates it.

One finding qualifies §12 directly. Recommending the D5 close verifier, A156 found the D5 build commits (3fe37908e, ed74f990e, on lib/publish_service.py) authored "Cursor Agent" with no agent generation in the body: builder identity is not mechanically establishable, so verifier independence can be assumed but never proven from the commit record. §12's "verifier independence… enforced with fail-closed identity resolution" holds at the pipeline step and stops at the git log. D5 was worked around by assigning Vela (demonstrably uninvolved); whether an agent-generation commit trailer becomes a validator-checked convention is parked on the v1.92 board, deliberately not standalone.

§26. The release-profile seam — the machine no longer knows what it ships (extends §18; supersedes §1's and §10's "same pipeline" framing)

v3 reported six non-OS product releases "shipped through the same pipeline." True at the record level, and misleading at the machine level: the tools beneath that pipeline referenced it zero times, and the product-genericity lived entirely in the human operator running scripts by hand. Stream 1 of v1.92 (dev-spec 5b608d28, locked 2026-08-24) closes that gap with AC5/AC6, built by talos-t51 on worktree-v192-stream1-ac4 (head 002147832) after metis-g112 split the stream — argus-a156 keeps the shared-tool ACs — on one condition: the binding contract lands first, as one commit (42f9acd10), so two builders work against one contract rather than two guesses.

The design is Mike-shaped. The spec's stated measure is "his evening — prompts he types, real decisions among them," and the contract in vault/tools/lib/release_bindings.py encodes exactly that split: every pipeline leaf binds one EXECUTOR of a declared KIND. KIND_TOOL is deterministic — the machine does it; KIND_PLAYBOOK is judgment — a governed procedure with a named executor class does it. The one hard rule: a playbook binding with no named executor is refused at load — "a procedure with no executor is an event with no emitter." Draft v1 demanded exactly one tool per leaf; measurement proved it unsatisfiable: five of the twelve declared leaves are human- or agent-executed by design (the cold-boot walk, external-test, notify-owners, the two trigger legs), and two leaves legitimately share one tool.

Above the contract sits lib/release_profile.py (260 lines): a profile is a governed vault entry of new type release-profile (capsule 654f3a90, status draft — only Mike locks a type), with three closed generic slots — build-the-artifact, verify-the-artifact, publish-the-artifact — each naming a release_gates phase as its gate contract and its steps in the bindings' own vocabulary, so a profile and a tool cannot disagree about what "deterministic" means. Exactly one profile ships: vault/files/6bf18510.md — product tropo, pipeline 634913c2, twelve steps, 7 tool / 5 playbook, the split measured independently by both builders.

The proof is test_release_profile_seam_v192.py: 12 tests, green in the worktree (Ran 12, OK, 2.4s). Statically, no product literal survives in the machine modules — no tropo string, no version-shaped literal, no hardcoded path to the shipped profile — replacing draft v1's vacuous "zero diff between two runs of one tree" check. Dynamically, the shipped profile and a fixture profile declaring a different step set both load through the one loader and drive the runner to terminal verdicts that differ — shipped halts at its first judgment slot, fixture completes — proving the runner reads the profile, not a built-in list. A judgment slot with no executor is refused; the mutation control adds the executor back and it loads.

The runner itself, tropo-release-run.py (137 lines), is retro Action 2 finally shipped as a mechanism rather than a label — and the seam's first consumer, so it lands with a caller instead of zero. It walks the profile's slots cold; a judgment step halts the walk naming step UID and executor class, a terminal verdict, not a failure. Candidly: it deliberately does not yet resolve the exact runnable command or invoke tools — both wait on AC2's PIPELINE_BINDINGS, undeclared in the tools as of this measurement, and AC6's cold-runner test is not yet in the tree. The extension point is for_step() at the halt site, not a redesign.

§27. orient() in the field — Stages A/B at boot and scoping, and the measured blindness (extends §20; supersedes its status-only framing of the shipped half)

v3's §20 stated orient()'s Stages A and B — deterministic retrieval and ranking — as "shipped code" and left it there. The delta is that the shipped half became a working instrument with a boot-doctrine slot, an incident record, and a doctrine extracted from the incident.

In use, and widened. The Phase 1 build (4883fa94, landed 2026-08-12, the day v3 Part II was measured) changed what a free run returns: candidates are drawn wide before ranking (--draw-budget, default max(8·k, 256)), the one-hop neighbourhood is rendered as an exhaustive, never-truncated roster, and deterministic keyword recall (--terms) rides alongside the graph. The metered read layer (--read — "SPENDS MONEY — a few cents," off by default, no policy can switch it on) stays a person-chosen flag; everything wired into doctrine runs on the free path. And it is wired: ORIENT-BEFORE-YOU-SCOPE entered the strategist's Tier-3 boot surface on 2026-08-24 (Mike-surfaced) — before scoping a cycle or ruling on a governed domain, run orient() on the governing UID and read the whole neighbourhood, not just the ranked picture.

The blindness, measured. That rule exists because the crew scoped v1.92 blind to its own release-pipeline. At Mike's challenge, metis-g112 measured it (2026-08-24): tropo-orient.py --task 088e21aa — the v1.92 release-plan — returned zero hits for release-pipeline 634913c2 in the ranked 8 and in the complete 408-node one-hop neighbourhood. The cause sits verified in the edges table: both release-plans are member_of the dev-pipeline (cd1fcd25), and no edge anywhere bound a release-plan to the pipeline it ignites — the ignition relationship ("a locked release-plan is the only release ignition") lived in prose and runtime code only. The instrument worked; the map was missing the road — the same two-readers / map-territory defect class Stream 1 is prosecuting in the build system, here measured in the graph itself. The cure came in two grains the same day: one interim edge (088e21aa now refs: 634913c2, so orient can see it) and a capsule question filed on the v1.92 board — should the release-plan capsule mint the plan→pipeline edge by construction, backfilled to historical plans?

The doctrine. The Tier-3 text draws the general rule: orient() answers from the graph, so when a relationship lives only in prose, an honest empty answer is a feed-gap finding to file — never a reason to skip the tool. The precedent is a week older: the Librarian's first live exchange (2026-08-15) answered one question cited-and-verbatim, said "not in my context" to another, and that honest refusal exposed the task-own-body feed gap — fixed the same hour, with a causal test.

Stage C and the Librarian, unchanged in kind. Stage C's synthesis contract — the five principal-locked design rules of §20 — stands as contracted; no delta this window touches the paid engine. The Librarian arc shipped its deliberately deterministic L1 slice (d317f532, locked and done 2026-08-15): --for-librarian emits ranked evidence plus budgeted governed bodies as one feedable artifact, no model calls, write-never, citations-always. Whether L2 is ever built is gated on L1's measurement log — a decision deferred on purpose, not a gap.

§28. Metrics refresh and the honest state (2026-08-24, measured live) (supersedes §22's figures)

Part IV — The v4.1 delta (v1.92.0 shipped, measured 2026-08-26)

Two days after Part III. The cycle it watched in flight landed: v1.92.0 is public. Part IV was written the evening of the ship, from the run journals, the release saga journal, the publish receipt, the First-Use Walk record, and both release retrospectives — not from memory. It supersedes §28's three open items and corrects one Part III claim that the ship proved wrong.

§29. v1.92.0 shipped — and the endgame exercised the gates for real (supersedes §28's open items 1 and 2)

The ship facts: v1.92.0 published 2026-08-26T20:12:48Z; the publisher's liveness check passed at 20:13:41Z (receipt 3fe4be3f… — remote shas match, release object live, artifacts byte-identical on both public endpoints). Stated precisely because "verify live" names two different checks (A159's refinement on 4240df1d): the publisher's liveness observation is a clock written by the publisher and it genuinely passed; the completion verifier§24's repaired five-fact instrument — separately returned INCOMPLETE (scorecard-pending, §30), and the recorded state distinguishes the two nowhere. Public at github.com/tropo-ai/tropo/releases/tag/v1.92.0.

§28's open item 1 is closed the right way: the First-Use Walk RAN and PASSED (record 00ffa4af, pre-agreed rules 879e7ec0) — the first stranger in Studio history to complete the dev loop unaided from the shipped package. PASS with findings: a P1 mint-provenance defect at the flagship path's first command, filed forward with its in-package workaround named rather than cured, because the invariant held — the walked package is the fired package. The bar the principal set (74e9676b) was met on its own instrument.

§28's open item 2 closed under load, which is better than closing clean: the rebuilt machinery built the candidate — and the first candidate FAILED the independent harness gate and was invalidated pre-fire (a release-profile that needed a lock and a missing extraction_scope field). The recovery exercised the expensive path end-to-end: the run was abandoned and re-locked by principal ruling (42261546cd68bea8; plan 088e21aa cancelled → 46079e11, hand-authored ~280 lines), attestations re-issued, rebuilt, re-dispatched, refrozen. Nothing real was lost and the abandoned chain stayed on record. Twelve steps ran or carried recorded judgment — zero silent skips, the contract the cycle set for itself.

The cost side is measured, not narrated — the full accounting is the v1.92 retrospective (9cfdf8ae, Vela V74, first-hand) and the measurement verdict (f1fa74e8, Metis G113): five prompts genuinely requiring the principal's judgment (v1.91: ~40 across the arc), zero silent skips (from 3), ~10 refusals hand-tallied and sorted 4 real / 4 instrument-defect / 2 missing-writer (v1.91: ~20 / 0 / 0), 5 builds (from 6) — and, on the other side of the ledger, 4 release-path tools repaired mid-flight (up from 3), ~20 executor CLI invocations, and 6 hand-authored events standing in for declared writers that have no caller. The refusal population changed character: fewer, earlier, no longer uniformly true — and every false one lives in release machinery, not in the artifact.

§30. The scorecard that was not written (corrects §24's "it is now wired at the fire"; qualifies §12 a second time)

§24 reported the one-prompt scorecard "now wired at the fire." The ship proved that claim wrong in the way this document's whole §4-family predicts: the fire observed its scorecard checkpoint at 20:14:14Z and no scorecard exists — the saga fact carries no scorecard_sha, no one-prompt-real-fire-scorecard.json exists anywhere in the Studio, and the release saga is still incomplete at completion_verification (idempotency key literally completion:None) because the completion verifier correctly refuses to observe without a valid card.

The mechanism is the family's twentieth measured instance (canonical record 4240df1d, Argus A159, found from the boot nag the same evening): the pipeline binds the fire step to tropo-publish-release.py:cmd_fire, while the only scorecard-producer injection lives in tropo-release.py:cmd_fire — one injection site, one consumption site, and the declared binding connects neither. The layering itself is correct (the publisher genuinely lacks the measurement inputs); the binding points at the wrong door, so no release fired through the bound path can ever produce its own cost measurement or complete its saga. The cure (rebind to the orchestrator) is filed, deliberately not applied pre-walk, with the verification obligation written into the record: prove it by running both paths, plant the negative.

The qualification of §12, stated plainly: v1.92 made the release's correctness independently proven for the first time (verify-live receipt, harness gate, walk) — and the instrument built to measure what a release costs the principal has still never produced a card for a real fire. The hand tally in f1fa74e8 is the only scorecard v1.92 has. Related, same family: the Studio-side publish marker (.tropo/publish-pending.json) still reads not-staged for a release that is public, so every booting agent reads a boot line that is false in its plain meaning — two state files, one fact, one writer (also on 4240df1d, held for the same reason).

§31. What the window settles for v1.93 (extends §24; the trajectory line)

Both retrospectives converge from independent vantage points: v1.91's verdict was "we built a verification system and called it a build system"; v1.92's is that every gate that fired was correct and the cost lived in gaps between gates — declared primitives with no caller, two readers of one fact, checks that cannot tell "already succeeded" from "trying to succeed twice." The response direction is settled and principal-licensed: v1.93 is a subtraction cycle. The release becomes four separable jobs — build from a commit / verify the package / decide to publish / record — composed around the 369-line packaging core that already does job one correctly and reproducibly (it built the walk's package twice, first try); the 4,249-line builder that interleaves governance into all four jobs is replaced by composition, not refactored. Deliverables are net-negative line counts (precedent on record: −189, A158) and uncoached stranger verdicts — the two currencies the principal now accepts after cycles of assurances. The per-piece review gate: "what does the principal lose without this?" — default is cut. The retrospective's seven-item action list (9cfdf8ae §Actions) and the walk-scoped opening board are the queue; the full §1–22 re-verification of this document is the scoping baseline and remains open.

§32. How Tropo builds software — the process canon, summarized (companion document; moved to its canonical home 2026-08-26)

The full statement is "How We Build Software" — a rendered, diagrammed walk of the entire path from an idea in a note to a published versioned release, authored by Metis G112 at the principal's direction on 2026-08-24 and moved from its render home into docs/ alongside this review on 2026-08-26. It is the process companion to this document's structural story, and the summary belongs here because §8, §10, §18, and §23–26 are all elaborations of what it states in two sentences.

The constitution: the dev-pipeline runs Specify → Build → Test, one run per locked dev-spec, closing at one tested commit with mutation evidence — and produces no release artifacts. Releases are a separate release-pipeline, ignited only by a locked release-plan that fans in done specs by explicit list, and closed only by verified publication.

The Pipeline Constitution — Two Pipelines, Three Human Gestures §18: the dev-pipeline runs Specify → Build → Test — one run per locked spec, one tested SHA, no release artifacts. Releases are a separate pipeline, ignited only by a locked release-plan. IDEATION — inbox, ungoverned pace Note observation · idea · finding Design brief the problem + the intent Dev-spec the contract: ACs + locked verify commands adversarially reviewed before lock MIKE LOCKS gesture 1 · dev ignition the lock writes an immutable snapshot of the spec + registers activation + creates the run, all in one gesture (ADR-052) DEV-PIPELINE — one run per locked dev-spec SPECIFY the locked spec is the plan of record BUILD builder implements against the frozen contract · evidence recorded per AC TEST a non-author runs each locked verify command verbatim · mutation evidence DONE = one tested commit the run closes at one tested SHA — no release artifact closure journaled, not declared done specs accumulate as ordinary done dev-specs — there is no "park" state; the release-plan fans them in by explicit list RELEASE-PIPELINE — many done specs, one version done spec S1 done spec S2 done spec S3 … Release-plan names the version + which done work ships — by explicit list MIKE LOCKS gesture 2 · release ignition ASSEMBLE validate fan-in · build the box VERIFY freeze sha-bound · independent harness PUBLISH stage · preflight · await the fire MIKE FIRES gesture 3 · deploy vX.Y.Z public, with a receipt the release-plan lock — the ignition key — survived seven adversarial NO-GO rounds, every one legitimate, before its stage was accepted Worked record — v1.91 in numbers: 4 dev-runs fanned in → 1 frozen package sha (3cfb4fe4…) → 1 fire at 09:36Z → v1.91.0 public The principal designed the split in two sentences at a whiteboard; twelve hours later it was a locked spec; six days later stages 1–5 of 9 were built and independently accepted. "Build complete" is an ordinary done dev-spec sitting in the vault until a release-plan names it — the two machines meet only at the fan-in. Orange is the human — by design, exactly three gestures per shipped feature: lock the spec, lock the plan, fire. Everything between them is machine-verified agent work inside two separate pipelines.
svg/12-two-pipeline-dag.svg — The two-pipeline constitution: dev-pipeline (Specify → Build → Test) and the separate release-pipeline, ignited only by a locked release-plan

The human's share is three gestures per shipped feature — lock the spec, lock the plan, fire — and everything between them is agent work inside machine-verified process. This is the bounded-verification thesis (§1, Thesis 5) applied to the shop that builds Tropo: when a release costs the founder ~40 prompts (v1.91), that is a measured defect, not a mood — and v1.92's answer was five judgment gestures (§29).

The path, stage by stage: a note (cheap, ungoverned pace) → a design-brief (the problem and intent, where whiteboard thinking happens) → a dev-spec (the contract: acceptance criteria each carrying a locked verify command, committed-substrate list, mutation clauses; adversarially reviewed before lock; the principal's lock IS the ignition — ADR-052 writes the immutable snapshot and creates the run in one gesture) → build (evidence per criterion into the run journal) → verification by a non-author running each locked command verbatim, with closure journaled as a side effect of terminal verification, never declared. Vocabulary the canon fixes on the record: a dev-pipeline run is a delivery; the word build belongs to the release side (the box build). Many deliveries fan into one plan, one frozen package sha, one fire.

Why the canon can be trusted — and what moved since: its §6 names four places where the declared design and running reality diverged at authoring, each filed with a cure. By this re-verification, three of the four cures shipped in v1.92: the release tool layer conformed to the declared shape (Stream 1), the dev-pipeline definition body updated (Stream 2), and the plan→pipeline ignition edge verified present on both the cancelled and successor plans (§27). The step-machine reconciliation continues on the v1.93 board. The canon is a dated snapshot by its own rule — "regenerate when the process moves" — and the subtraction cycle will move it.

Part V — The full re-verification (2026-08-26)

Eight agents in parallel, one per section group, adversarial refute-posture, read-only, every number command-cited. Run at the principal's direction the night v1.92.0 shipped, as the capstone before v1.93 scoping. Full findings: the governed verification report 6e9f6549; this section carries the verdict and the corrected headline numbers.

The verdict. No fabrications anywhere in §1–28. Five claims were WRONG at their own measurement dates — all five the same family, unmeasured absolutes or status lines around a true core: §2's "every primitive declares its hub" (tools: 31%), §11's "never hardcode" (both patterns coexist, policed by a Layer-3 meta-validator), §20's "Stage C not built" (built two weeks before the sentence was written — the review undersold the system), §23's v1.88 ship date (CHANGELOG frame vs publish event), §24's "scorecard wired at the fire" (disproven by the ship; §30). Each is corrected in place. The document's mechanism claims verified against live code essentially without exception — the salted activation key, the recycle guard, null-honest metering, the Gardener's pinned-prompt judge (its qualification hash byte-identical today), the pipeline's self-attestation refusals, the sovereignty covenant's 69/69 suite — many exercised by the v1.92 endgame itself. Part III, never before fact-checked, was the most precise part at its own date: line counts, commit counts, and gauntlet tallies land exactly.

The corrected headline numbers (2026-08-26): governed records 5,647 (3,508 current + 2,139 archive) · vault/files 5,024 · edges 24,344 across 5,444 nodes · capsules 69 · tools 109 (81 cataloged) · skills 29 · loops 9 · toolbelt 19 · validator checks 115 · decisions 65, ADRs through ADR-066 · releases 119 records (110 OS across 105 versions + 9 non-OS, v1.92.0 newest) · events 11,915 (6,678 frozen legacy + 5,237 across 272 streams) · validator posture 85 pass / 152 fail vs a 154-item shrink-only ceiling with one gating class (the "3 failed" era's instrument is retired; the v1.92.0 shipped box measured 52) · crew at re-verification: three active generations (A159 · V74 · G113) + the principal, with Talos reborn in a cloud VM (T52) during the pass and the Orpheus seat vacant since 08-19.

New findings the review did not carry, handed to the v1.93 evidence set: a sixth network touchpoint missing from §14.2's enumeration (first-party model-API calls, now added); edge-rel vocabulary twins the One-Vocabulary ratchet does not cover (member-of/member_of, composes-with/composes_with); mint-chokepoint erosion (5 raw-mint WARN bypasses, one uuid4-shaped minter invisible to the static check, and the fail-loud floor catching two hand-authored evidence records the night they were written); an orphaned over-bound memory surface (Orpheus, 49.9KB, 52% over ERROR bound, no successor to fold it); and a third qualification of §12 (a sampled canonical dev close: independent, but empty acceptance_evidence, ungated mode, dirty tree).

Method note the studio should keep: the fleet was killed once mid-flight by the machine sleeping — the same failure class as the wake loops — and all eight agents resumed from their checkpoints without re-running completed work. And one finding was the verifier's own: the re-verification refuted its author's boot-time "fingerprint drift" finding (a nav-block hashing artifact), which is the refute-posture working on the people who commissioned it.

Appendix A — Diagram index

FileView
svg/01-system-map.svgStudio anatomy: three layers, nine subsystems, the bootstrap-floor kernel
svg/02-capsule-type-system.svgType inheritance, the capsule contract, contract→instance→enforcement
svg/03-vault-graph.svgFlat store, One-Home directories, graph semantics, derived surfaces
svg/04-agent-lifecycle.svgThree-tier boot, six gated groups, hard gates, budgeted boot, succession
svg/05-memory-architecture.svgMemory v3.0: single surface, append-only episodic log, bounded folds
svg/06-event-system.svgThe event log: guarded emission, three-state delivery, projections
svg/07-pipelines-and-loops.svgPipelines vs. runs, playbooks, loops with brakes, the coupled dev/doc/test DAG
svg/08-enforcement-verification.svgFour enforcement loci, ratchets with grandfathers, done-means-proven
svg/09-federation-sovereignty.svgSegmented vaults, the mount gate, the publish covenant, the proof record
svg/10-write-path.svgLife of a governed artifact: write → derive → validate → groom → render
svg/11-evolution-timeline.svgv1.0 → v1.84.1: releases, programs, and crew generations on one axis
svg/12-two-pipeline-dag.svgNEW — the constitutional split (§18, §32): dev-pipeline Specify → Build → Test vs. the release-pipeline, plan-ignited and publication-closed
svg/13-lifecycle-born-continue-retire.svgNEW — lifecycle v2 (§17): born / continue / retire; existence un-refusable, findings recorded, never blocking
svg/14-event-ledger-v2.svgNEW — event ledger v2 (§6): the byte-frozen legacy epoch + per-conversation streams, one read union
svg/15-gardener-loop.svgNEW — the Gardener loop (§19): caged judge, evidence-bound stamps, human-reviewed disposition, receipted archive

Views 01–11 are the v2 diagrams, unchanged — as-measured for §1–16 at v1.84.1. The four views the v3 edition named as candidates ship in this edition as 12–15, drawn from Parts II–IV: the two-pipeline split (§18, §32), lifecycle v2 (§17), the event-ledger v2 cutover (§6), and the Gardener loop (§19).

Appendix B — Glossary (minimal)


Prepared inside the system it describes. §1–16 researched by a multi-agent fleet, authored by Argus A129, adversarially fact-checked 2026-07-10. Part II (§17–22) authored by Metis G107, 2026-08-12. Part III (§23–28) drafted 2026-08-24 by a six-agent fleet, assembled by Metis G112. Part IV (§29–32) authored and verified 2026-08-26 by Metis G113. Part V: the full eight-agent adversarial re-verification of §1–28, 2026-08-26, Metis G113 — report at vault/files/6e9f6549.md. Every figure traceable to files, events, and receipts in the Studio. Argo Studio.