Control Tower was scaffolded on 2026-06-07 as a public, standalone factory-output tool: coordinate concurrent human and AI work sessions, local-first, no cloud, no web UI. The scaffold session produced a README, a brief, a backlog, an architecture doc, a decisions log, a flight build plan, workflow docs, and example placeholders. Everything a project needs to look serious. Twenty-five days later, a requested critical review found zero .py files, no pyproject.toml, no tests, both commits docs-only, and no session-log entry anywhere in the gap.

The review that almost said nothing was wrong

The first pass of the review checked the things a taxonomy review checks: was the classification (factory-output) correct, was the repo in the right path, did the naming convention hold, was this actually a factory deliverable and not factory machinery. All yes. That was the trap. A project can pass every structural check in the book while having built nothing, because none of those checks ask “how long since real code changed.” The review had to explicitly widen its own scope, reading every doc against the actual repo contents, not just checking the docs existed, before the gap became visible as a finding rather than an absence of one.

The second project that had also shipped nothing

The same day, an unrelated fact surfaced: a sibling lab, agent-mission-control-lab, had its own internal control_tower.py, 465 lines, 21 tests, fully built. It had never logged a single real session. It was retired that day, quietly, in favor of consuming machinery the estate already had. Two separate control-tower-shaped things, built by two separate efforts, both complete enough to look finished on paper, neither one ever used for the thing it was built to do. Twenty-five days of documentation and 465 lines of untouched code are the same failure wearing different clothes: work that satisfies the feeling of progress without producing the fact of it.

What actually changed

The human’s response wasn’t a bigger plan. It was three moves, in this order. First: reclassify factory-output to lab. Not a punishment, an honest label. “Factory-output” claims a deliverable exists; “lab” admits the storage, interface, and language model are still unsettled, which was true and had been true for 25 days regardless of what the classification said. Second: reopen the ADRs that were supposedly already decided. ADR-002 (Python stdlib) and ADR-003 (JSON session files) had been treated as settled since day one; the review question was asked with no constraint on language or stack at all, which is a different question than “is Python still fine”; it’s “would we choose this again, cold.” Third: go look at what a sibling lab had already proven worked (local-agentic-coding-lab’s event-sourced RunLogger pattern) instead of designing from a blank page a second time.

What next

The reclassification and the reopened ADRs didn’t produce code by themselves; they produced permission to ask harder questions, which is what the rest of this arc is: an event-sourced architecture written from scratch (next post), then a working CLI, then a task-DAG orchestrator built in a single day once the storage question was actually settled. The 25-day gap closed for a specific, checkable reason, not because someone decided to try harder.

What Next

Status Is Derived, Never Stored

The re-architecture's first real answer: an event-sourced session model that makes concurrent writes safe by construction, borrowed from a sibling lab that had already proven it.