docs(WS-0): truth pass across six workstreams — the board was describing a codebase from weeks ago - #344
Merged
Merged
Conversation
…ing a codebase from weeks ago
Thirteen of thirteen board rows have now failed the seven-point contract, always
on the same point: no testable done-when. The six that had never been audited
were audited together, and all six came back NO-GO. The cause turned out not to
be missing work. It was that the specs describe a codebase from weeks ago, so
they ask for things that already exist -- and in one case would have caused an
implementer to break working code.
WS-3 is the worst of it. The spec asserts, as "grep-confirmed", that the
mutation container runs with zero --cap-drop/--memory/--cpus/--pids-limit
flags. Four of those six have been present since 2026-07-27. An implementer
dispatched on that row would most likely have re-added flags that already
exist. The same spec never recorded that Tier 0 shipped, that a containerized
Copilot CLI runtime shipped and is wired at two call sites behind a flag, or
that isolation_tier() has been computed and thrown away into a log field since
it landed.
The rest of the pattern, row by row:
WS-1 "Remaining: Zoho handlers" is fiction -- the Zoho client is read-only,
six list_* calls and two GETs, with no write path anywhere to broker.
Two real flip-blockers surfaced instead, neither previously written
down: the two IRREVERSIBLE ClickUp actions (delete, archive) are gated
but have no handler, so approving one marks the row failed; and a
broker-queued push is written as sync_state='synced' with an empty
provider_task_id. ACTION_BROKER_ENFORCE must not be flipped until both
land, and the kill-switch's own docstring now says so.
WS-8 manifest.py and declarative.py are built, tested and unwired -- roughly
60% of Phases A+B is already on disk. manifest.py's own docstring said
"nothing here is wired into the run path yet", which was the single
sentence most likely to cause a duplicate build. And "Phase A unblocks
D3" is false in the direction that matters: config.json instancing
already ships, so Centers C was never waiting on it.
WS-11 Full-graph copilot authoring shipped as F14; the same document said so
twice. Parallel fan-out shipped too. The real content is fan-IN and
loops -- and both new tickets must INVERT a currently-pinned test,
without which they close green having built nothing.
WS-12 About 90% delivered elsewhere. A high-severity risk had retired itself:
openai is already on 2.x, so Phase 4 drags one SDK major, not two. The
row shrinks to the framework bump rather than closing.
WS-21 Two of four deliverables already shipped, and two of the three
gtd_time_blocks acceptance clauses were satisfiable by doing nothing.
The "non-breaking TimeBlock[] swap" claim was false -- the real blast
radius is 17 TS files plus four backend modules.
All six specs now lead with what is actually built, carry per-item done-whens a
command or an assertion can settle, name their verification commands by file
(never tests/unit/ as a directory, which hangs against the live DB), and label
every item AGENT-SAFE or OWNER-GATE.
Two owner decisions recorded as D10. Command Center is an internal Fracktal
tool, so WS-3's full run sandboxing is parked under a trusted-colleague threat
model with an explicit un-parking condition rather than carried as debt. And
loops in the workflow engine are approved against the anti-n8n rule, which is
clarified to govern the node catalog rather than the control-flow vocabulary.
Also: four rows added to the single-owner registry, six to the owner-gate
registry, one wrong gate anchor fixed, two residuals closed and one opened. The
Horizons ownership dispute between WS-21 and WS-18 is assigned rather than left
to be rediscovered.
Docs plus four docstrings. Verified docstring-only by AST comparison -- the
first two attempts at that check were wrong because subprocess and open() were
decoding with different encodings, which made every em-dash compare unequal.
Verify:
uv run ruff check . --select F821,F601,F602,F502,F7,B006 -> All checks passed!
uv run pytest tests/unit/test_action_broker.py tests/unit/test_actions_routes.py \
tests/unit/test_provider_broker_gate.py tests/unit/test_task_broker_handlers.py \
tests/unit/test_agent_manifest.py tests/unit/test_declarative_builder.py -q
-> 94 passed
23 WS rows, no duplicates, pipe counts uniform
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Two audits asked whether the multi-tenant foundation is complete. It is not built, and the owner's answer is that it should not be. This writes that down so the next cycle stops re-deriving it. organization_id sits on 3 of 111 tables and is read by zero authorization decisions; UserContext.organization_id is populated by an extra round-trip and never consulted. A second organization would not fail — it would silently serve the first org's data to the second, and that org's users would be permanently locked out because role seeding and the owner-bootstrap guard are both hardcoded to the default slug. D11: the tenant boundary is the DEPLOYMENT. One deployment per tenant, its own database and its own credentials. Row-level org isolation is explicitly not being built, organization_id stays a label rather than a mechanism, and most of the leak classes are moot by definition rather than by fix. Per-deployment credentials stop being a gap and become correct. A second tenant's real cost is priced honestly so the choice stays reversible on evidence rather than on memory. Three leaks still matter under that decision: org_group is joined on slug alone in three places, including the session-authority intersection. Cheap now, expensive later, and wrong within one org too the moment two Centers share a slug namespace. Written as a lettered ticket whose test must be proven red against a two-org fixture first. D12: the visibility model is private, then Center, then org, plus ad-hoc cross-Center groups by invite for projects that span teams. Each surface must declare its tier rather than inherit one by accident — two doctrines in one codebase is exactly what produced the Notes hole being fixed in the companion PR. Email, Tasks and Notes are private by default. And it answers the semantic that has blocked WS-14 for weeks: a project belongs to a team by an explicit group: grant. Not derived from its assignees, not an owning column. Both alternatives are named with the reason each was rejected. One handed-up claim was wrong and is corrected rather than propagated. I had said the subject vocabulary already generalises — that rooms and app_grants share email | group:<slug> | org. They do not. app_grants is email | agent:<name> | agents:* and explicitly rejects the literal org; there is no group: case at all. The rooms docstring claiming the two are identical on purpose is false. Rooms is the only surface honouring group: today, which makes this a real if bounded job rather than a no-op, and the spec carries a per-surface gap table sized accordingly. FOUNDATION_BUILDOUT_CHECKLIST corrections, each re-measured rather than transcribed: BO-10's engine sprawl is 12 sites across 10 modules, not the "three+" documented — it grows by one per app and is the one cost that compounds. BO-13's extractions netted 84 lines against the original, and run_agent_stream is now larger than when its residual was written. BO-14 and BO-15 were reported as closed; both are half closed, and marking either done would have hidden a live gap — BO-14's real residual is that the confirmation path it defers to is called by no tool. BO-23 added: there is no application-level backup. The only dump script is schema-only, 140 migrations replay forward-only on every deploy under ON_ERROR_STOP=1, there are no down-migrations, and the one real safety net is a weekly whole-VPS image whose restore has never been exercised. Scripts and runbook are agent-safe; running them is not. Verdict recorded: yes, go app by app — with three exceptions, none of which is an app. Branch protection (verified absent twice over: protection 404 and rulesets empty), a tested restore path, and the DB engine seam. Also verified and recorded: Centers are currently unreachable by everyone including the owner. The feature tuple has no center.* entries while the frontend gates on exactly those slugs, so the whole nav section is dropped and the routes hit the access gate. Migration 140's own comment claims owners see all Centers via a wildcard baseline; they do not. Documentation only — no .py, .sql, .ts or deploy/ file is touched. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Truth pass across six workstreams
Thirteen of thirteen board rows have now failed the seven-point contract, always on the same point: no testable done-when. The six that had never been audited were audited together — all six NO-GO.
The cause turned out not to be missing work. The specs describe a codebase from weeks ago, so they ask for things that already exist — and in one case would have caused an implementer to break working code.
🔴 The one that would have done damage
permissions_sandbox_b6.mdasserts, as "grep-confirmed", that the mutation container runs with zero--cap-drop/--memory/--cpus/--pids-limitflags. Four of those six have been present since 2026-07-27. An implementer dispatched on WS-3 would most likely have re-added flags that already exist.The same spec never recorded that Tier 0 shipped, that a containerized Copilot CLI runtime shipped and is wired at two call sites behind a flag that ships
"", or thatisolation_tier()has been computed and thrown away into a log field since it landed.The pattern, row by row
list_*calls, two GETs), with no write path anywhere to broker. Two real flip-blockers surfaced instead, neither previously written downmanifest.pyanddeclarative.pyare built, tested and unwired — ~60% of Phases A+B is on disk.manifest.py's own docstring said "nothing here is wired into the run path yet": the single sentence most likely to cause a duplicate buildopenaiis already on 2.x, so Phase 4 drags one SDK major, not twogtd_time_blocksacceptance clauses were satisfiable by doing nothingTwo findings that are live defects, not documentation
WS-1, and both block the
ACTION_BROKER_ENFORCEflip:delete_task,archive_task) are gated but have no registered handler — six action names gated, four handlers. Approving a queued delete hits the no-handler branch and marks the rowfailed. The existing test pins the set to a four-element literal and is structurally blind to it.sync_state='synced'with an emptyprovider_task_id— items marked synced to nothing.The kill-switch's own docstring now says not to flip it until both land.
Corrections that change sequencing
config.json-based instancing already ships viaAgentManifest.instance_key(), so Centers C was never waiting on WS-8 Phase A — the board has claimed otherwise for weeks.test_fan_in_rejected_v1,test_cycle_rejected). Without that inversion they close green having built nothing — the same failure shape BO-20b was caught on.calendar_timeboxing.md's "non-breakingTimeBlock[]swap" claim was false. The real blast radius is 17 TS files + 3 gateway modules + a skill + an agent, sogtd_time_blocksis 4 PRs, not 1.🔵 Owner decisions recorded as D10
workflows_app.md§11's standing anti-n8n rule — which is clarified to govern the node catalog, not the control-flow vocabulary, so it can't be mis-cited as a blocker later. The engine-complexity cost is stated honestly.What all six specs now have
Each leads with what is actually built, carries per-item done-whens a command or an assertion can settle, names verification commands by file (never
tests/unit/as a directory, which hangs against the live DB), and labels every item AGENT-SAFE or OWNER-GATE — there were zero such labels across all six before.Board-side: four rows added to the single-owner registry, six to the owner-gate registry (including
copilot_sandbox_scope, which routes real Copilot sessions into containers and was registered nowhere), one wrong gate anchor fixed, two §5 residuals closed and one opened. The Horizons ownership dispute between WS-21 and WS-18 is assigned rather than left to be rediscovered.Verification
Per-spec fences measured by their own agents and now recorded in the specs: 32 (broker) · 102 (isolation) · 78 (agent architecture) · 73 green-in-CI (workflows) · 157 (calendar) · 21 + 81 (orchestration).
Docs plus four docstrings. Verified docstring-only by AST comparison — worth noting the first two attempts at that check reported false positives, because
subprocess.run(text=True)andopen(encoding="utf-8")were decoding with different encodings, which made every em-dash compare unequal. The third run, with both sides decoded identically, is the one that holds.Corrections the agents made to each other
Every one of the six caught something its own auditor got wrong: three extra stale anchors in WS-3, a fifth permission site in WS-8 that the auditor's replacement list had dropped, six wrong table names in WS-11 rather than four,
_pending_user_inputatexecutor.py:339rather than:257(the auditor's line was a comment mentioning the name), and — in WS-11 — that the "known Windows-only failure" is four tests, not one, three of them golden-eval trajectories. Anyone running that command with the audit's note in hand would have reported three regressions.The board sweep then corrected two of those:
calendar_ai_review.mdis cited by migrations 92/97/100, not 98, andfirst_partydoes appear in six files — all comments, docstrings and a test helper, no field anywhere.Deferred
ai-company-brain/AGENTS.md's spec index has no calendar row at all and is missingagent_architecture.md;AGENTS.md:190andapps/AGENTS.md:23still carry the struck "broker ships with zero handlers" line. Filed as §5 residual 6.calendar.pycite migrations 93/94 for what shipped as 97/98 — recorded in the spec, not fixed (code change, out of a truth pass).calendar_ai_review.mdandcalendar_ux_review.mdare unregistered sub-docs;ux_reviewis the sole home of the silently-dropped block-reminders deferral.🤖 Generated with Claude Code