TDD: org — roles, chains, ownership-as-data (draft) - #245
Conversation
…ganization Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
@codex review Design review, not code review — this PR is a TDD only. Please focus on §4.2 (tip-of-chain is ownership, and how it relates to drive's scope caps), §4.6 (grants bind to incarnation id), §4.7 (agent-authored state vs mechanical mark), and §7.3 (crash → takeover → stale write). Do not merge. |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
Claude finished @itsHabib's task in 2m 35s —— View job Design Review — org TDD (PR #245)
|
Nine review findings folded, with four decisions replacing v1 hand-waves: the append critical section (read-verify-write under one lock); the cap ledger demoted to a derived cache so the two-plane write need not be atomic; liveness as an incarnation-declared next_due; and grant revocation via a fencing token that needs no replication and no gate->org dependency. Reading hack-branchroom / hack-mandate / hack-obligation / hack-proofline produced three corrections v1 got wrong: the stale writer that matters re-reads the tip (reversing the check order), incarnation ids must be digests not counters, and the cross-chain audit must reason about absence or it is a suppression attack. All four kernels canonicalize with json.Marshal; contracts/org ships a versioned canonical encoder instead. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
v2 pushed — review round 1 folded, plus four kernels adoptedThanks @claude — every finding is addressed below. Codex hit its usage limit, so this was the whole panel. The nine findings
Plus your incidental: the memory-fragmentation fix moved into §1 as the smallest version of the whole claim. Three corrections from reading the bakeoff kernelsBefore folding I had four agents read
Two portfolio-wide corrections (§4.10)
Open questionsv1's items 1 and 2 are decided. Three new ones from mandate, all real: subject drift on long-running work (its Still not merging — the design is yours to lock. |
|
Claude finished @itsHabib's task in 5m 4s —— View job Design Review — org TDD v2 (PR #245)Tasks
All nine round-1 findings are addressed. The bakeoff kernel corrections — incarnation check before chain position, digest-not-counter IDs, absence-based audit — are all well-argued and the spec is stronger for them. The fencing token (§4.6) is the cleanest resolution in the set: no replication, no runtime dependency, monotone by construction. The cold-reconstruction floor (§4.7) is honest in exactly the right way. Four structural issues below plus a few smaller ones. Three of the four need resolution before p1; the fourth before p4. §7.1 — The liveness refusal uses the wrong code§7.1 step 3: "if the fold shows a live incarnation... → refuse with This is the wrong code. The consequence is real: a second incarnation that passes the liveness check (maybe A new refusal code is needed — something like §8 contradicts §4.2 on lock scope§4.2 (v2): "the append verb takes an exclusive advisory lock on that one chain file across the whole critical section — acquire → read tail → §8 (unchanged from v1): "One writer per chain at a time, enforced by These say opposite things about what the lock covers. §8 says the lock wraps only the Suggested §8 text: "One writer per chain at a time, enforced by the combination of an exclusive advisory lock over the full append critical section (read tail → §4.6 — The fence-bump at
|
…ecord law Adds 4.11 after reading Malucelli's '12 days straight' (7 cron'd loops on a $40/mo VM, 229 PRs opened / 213 merged, GitHub as the only source of truth). The article's architecture is correct for stateless sweep work and this design should not compete with it: maintenance is now an explicit non-goal here rather than a later phase of this machine. What remains is owned work, where the thread across restarts exists nowhere but in the agent. Reframes the premise: agents are cattle, and the chain is what makes them so - an agent holding days of reasoning is inherently a pet. Yields the law governing every record (if it can be derived, don't record it), a wip_limit that bounds production the way grants bound authority, and two observed failure modes: 7-day session expiry, and usage-limited sessions that hold the tick without exiting - the case that justifies next_due over a process check. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
§4.11 — cattle not pets; the design's claim is now narrowerPushed after reading Malucelli, Claude Code, 12 days straight: seven cron'd loops on a $40/month VM against a Claude Max subscription, 229 PRs opened / 213 merged in twelve days, and one sentence for its entire state story — nothing on the box is worth backing up, GitHub is truth, every tick re-reads open PRs and tracking issues. That architecture is correct for the work it runs, and this design should not compete with it. Sweep work is stateless and idempotent and the work item is the PR, so there is no thread to preserve and a chain is pure overhead. Maintenance is therefore now an explicit non-goal of this document rather than a later phase of this machine — it is seven cron jobs, and it costs almost nothing to build. What survives is owned work: one role, one task, held for days, where the decisions made and rejected, the approaches tried, and what it is waiting on exist nowhere but inside the agent until the work lands. The reframeAgents are cattle — any incarnation may be shot at any moment. The chain is what makes that true. An agent holding three days of reasoning in its head is inherently a pet; you cannot kill it without losing something. Externalising what it knows is what makes every incarnation disposable. Residency is settled from the other side by switchboard: a live process buys serialized ownership and nothing else, and the tip rule supplies that without the process. What it adds
What his setup does not answerTwo secrets on the box, a signing key and a GitHub token, and a human SSHing in every couple of days to re-authenticate. One credential, full reach, no attenuation, no per-role scoping. Fine for one person's repositories; exactly what stops the shape at a security review. The plumbing this design adds on top of his — attenuated per-role grants, a fence surviving takeover, an append-only record of who decided what under which authority, and an audit that reasons about absence — is the whole difference between a personal automation and something an organisation runs. |
…ocs too Corrects the previous commit, which wrote maintenance out of the design. A monitor owner IS a role - somebody durably owns alert health, tuned this monitor and retired that one for stated reasons. The tick is stateless; the ownership is not. So the split is not chain-or-no-chain but how much a chain carries, which falls out of derive-don't-record: three role kinds (ic thick / maintainer thin / lead medium) with cadence and density set by charter.kind. Also: in an org the work item is usually a ticket, doc, runbook, or incident rather than a PR. GitHub-as-truth works precisely because the work item IS a PR; once work spans a tracker, a docs site, a thread and a repo, no single store knows its state - the chain's strongest case, not a weakening. work.kind gains doc/incident/area, and charter capabilities are custody action manifests rather than git verbs. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Correction to the comment above. Writing maintenance out as a non-goal was wrong. A monitor owner is a role — somebody durably owns alert health for an area, tuned this monitor and retired that one for stated reasons, and escalated what nobody could reproduce. The tick is stateless; the ownership is not. So the split is not chain-or-no-chain, it is how much a chain carries — which falls straight out of derive-don't-record. Three role kinds, set by
A maintainer's chain sitting unchanged for days is correct, not a failure to record. Second point, from the same conversation: in an organization the work item is usually not a pull request. It is a ticket, a design doc, a runbook, an incident, a thread. GitHub-as-truth works precisely because Malucelli's work item is a PR and GitHub therefore knows its entire state. Once work spans a tracker, a docs site, a chat thread and a repository, no single store knows what is going on — the chain's strongest case rather than a weakening of it. Consequences: |
Same argument, stated directly: every incarnation is disposable and the chain is what makes it so. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Operability was one line in the NFR table plus assertions that refusals
would 'name the remedy'. That is written intention where a mechanism
belongs - the exact failure this workbench exists to correct - so it now
gets requirements, a mechanism, and a gate that can fail.
The genuinely missing piece: an append-only chain with no correction record
means a wrongly-recorded decision poisons every future fold permanently,
with no path back short of abandoning the role. Adds an annul record -
append, never rewrite; own or supervised content records only; never
genesis/resume/takeover; annulled records still count for seq, prev, and
the anchor.
Also: refusals return {code, message, remedy, evidence} as a contract
rather than a habit; org explain and org doctor in the shape console and
rooms doctor already established, deciding nothing; and checkpoint quality
named as the biggest untested assumption, graded separately in 11.1c since
a vague checkpoint and a broken fold fail identically. 11.1d is the
operability gate: a second person repairs a three-ways-broken role using
only the tools.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…n it adds Measured the portfolio: 51 authored skills, 23 ever invoked, two thirds never fired once - including most of the delivery machinery (work-driver, pr-risk, review-coordinator, shipped, health, roster, recover, consult). Most-used by 2x is /continue at 16 invocations, which exists solely to hand-write a handoff when continuity fails. That is the org premise validated from logs rather than argument. The separator is not quality: a tool is used when there is an unmistakable moment of need and it is the obvious response, and unused when it must be remembered while thinking about something else. Two consequences now bind the design - nothing load-bearing may require remembering a verb, and the chain must retire /continue, /claim, /release, /roster, /recover and the state-reconstruction half of /status and /wip as p3 scope rather than a later tidy-up. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Synthesis of three independent architecture framings (bottom-up from the existing planes, top-down from the goal, outside-in from adoption) against three adversarial critiques (completeness, skepticism, coherence). Where they conflicted the synthesis decided and said why. Five things it gets right that the TDD did not: - Spine/body split. The spine is chained and permanent; bodies are content-addressed erasable blobs. Continuity ships without waiting on the audit story, and erasure stops being impossible. - The host writes the checkpoint, not the agent. Marks are mechanical facts the host observes; a separate cheap distiller folds transcript+marks into the body. A required end-of-turn tool call is a verb wearing a costume, and claims.jsonl (2 records, abandoned in a day) is what verbs get. - Fences are enforceable only by verifiers that keep state. A CI check on an ephemeral runner has a high-water mark of zero and enforces nothing. Scope the claim in gate's docs rather than discovering it in production. - Model calls are effects. Route the provider through the broker: spend metered against the grant, a fence-bound credential so a displaced incarnation cannot even think, prompt digests for classification, and a concurrency ceiling that degrades by queueing. - There is a cron at the bottom. Mutual restart cannot close both-leads-down; exactly one external stateless timer can, with a dead-man's switch outside the system. Also: work refs become URIs with a scheme (dossier is one backend, not the model); one ordered enforcement level per (scope, effect class) where promotion requires the data the level below produced — which is simultaneously the safety property and the adoption motion; gate demoted from flagship to one adapter; ship becomes a role rather than a second scheduler; Gleam on probation as a differential oracle with a cut date; mutants retained on the authority plane only. P0 is a no-code falsification week that can kill the project: if two sessions collided fewer than 3 times in 90 days, the honest product is a good /continue that fires from a hook and ownership is premature. Appendix A adds the primitive-design pass: the append API must be a transaction closure so the read-verify-write window is unreachable; canonical completeness must be reflection-checked; a missing fence high-water mark must fail closed; and the cross-chain assign invariant needs an owner or an honest downgrade to detected-not-prevented. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Item 1 run against gate's real log. All 87 blocked merges joined to their verdicts and classified: 63 (72%) evidence-not-ready, 22 (25%) genuine judgment, 2 findings/changes-requested. The 22 judgment blocks are good calls on real risk, so the authority plane clears its gate - false positives on risk judgment are low and it does not need a redesign. But 72% of every block gate has emitted says 'you invoked me before my evidence existed'. That is a scheduling bug, and it is the same post-force-push race already recorded once, at dominant scale rather than as an edge case. Design consequence: blocked conflates 'no' with 'not yet'. Different verdicts, different remedies, and gate already has a park outcome these are not using. Splitting them takes the apparent block rate from 35% to ~9%. This lands before any level is armed - arming enforce on a verifier whose blocks are 72% timing noise is how a plane gets switched back off. Item 2 could not be answered retrospectively and that is the finding. Transcripts span 20 days not 90. Tightest honest measure is 30 pairs across 25 PRs of two worker sessions active on one PR within 15 minutes, and hand inspection dissolves most: cross-repo sweeps under the reader threshold, three parallel subagents of one parent in one temp dir, and pairs indistinguishable from both having run gh pr list. Mentioned-the-same-PR is not held-the-same-work-item, because holding was never recorded. POC-A must run live; that specification is now evidence-backed rather than assumed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… guards The six-plane table is a decomposition, not a reason the pieces cohere. This is the reason: the platform is a state machine over work ownership in which illegal states are unrepresentable, and each plane exists to guard one transition. A plane with no transition to guard does not belong - which answers why six and not four or nine. Four laws, stated as things the system cannot represent rather than things an agent should remember. An incarnation cannot exist without owned work. It may hold many items and act on exactly one. Stopping must produce a terminal record; abnormal termination leaves a dangling claim the next incarnation must resolve before claiming anything. An action that propagates state must produce a receipt. The active-claim law has the largest practical payoff and was missing from every framing: with exactly one claim active, the work_ref on an effect stamp is derived from state rather than supplied by the caller, so an agent structurally cannot attribute an effect to the wrong work item. A misuse class deleted rather than documented. Sum types go where they are real: define the lifecycle in a language that has them, prove the transition relation total and illegal states unreachable, emit the table as a checked-in artifact, and interpret it in Go. Same mechanism parleyc already uses for protocols - second use, which is the evidence the mechanism was right. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Items 3 and 4 are answered, and item 1's 72% does not survive
re-derivation. Recording both here so the next session reads a number
instead of computing a fourth one.
Item 3 — the stalls. Two sessions answered this on the same day with
opposite verdicts ("0 defects, life" and "not life, abandoned") from
different denominators. Both are wrong. Measured straight off gate's log
rather than through parley: of 342 parked runs, 106 were never resolved
on that run — but 92 of those 106 had a SIBLING RUN on the same PR that
reached an action. Gate decided; it decided on a different run id. A
trace is keyed by run, a decision is keyed by subject, and the gap is 87%
of what "stalled" was counting. The observer is wrong, not the protocol.
The residue is 14 runs across 7 PRs, and only one part of it is real:
roll-call#8 and workbench#214 merged with NO recorded gate decision at
all. That is a hole in the authorization record and it is the honest
version of what item 3 was reaching for.
Item 4 — a role-day has no single value. It spans 21x across defensible
definitions of one unit ($9.10 observed session-day, $40.04 half-shift,
$62.82 long-shift). A true 8-hour agent shift does not exist in the data:
longest ever is 268 active minutes, median 14. Concurrency carries no
measured penalty — flat $0.26-0.35 per agent-minute from 1 to 15 — so the
axis the design worried about is the one that behaves. Affordable ceiling
is ~25 roles at the half-shift rate, not 75.
Item 1's correction is the one that changes a decision. Classifying the
same 87 blocked actions by which producer emitted the block: 56 (64%)
came from a JUDGE, 31 (36%) from deterministic readiness, and only 24-29
of 87 (28-33%) would have cleared by waiting. Getting to 72-75% requires
counting judge blocks whose prose mentions an evidence gap as "evidence
not ready" — defensible as description, but not the operational claim,
since by then a cycle is spent and a judgment recorded. Three sessions
produced three numbers because the classifier boundary was never stated.
So "split blocked into no and not-yet" is no longer the highest-value
change; it was ranked there on the 72%. Paired with a separate analysis
rejecting it because its backstops are structurally unreachable in CI,
the recommendation is now: fix the observer keying, settle evidence
before opening a run, and revisit the vocabulary only if a residue
remains.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Written at the point where the first real code landed and the first real numbers came in. Separate from vision.md, which argues what to build, and p0-findings.md, which records measurements: this says what is now TRUE, what is still a CLAIM, and what that combination argues for. Its conclusion is not the one the vision expects. Evaluating §7's own P0 gate: collisions unmeasured, false positives 27.6% against a <20% bar, and a role-day affordable to ~25 roles against a target of 75. Two of three fail and the third is unknown, so the gate says do not proceed to the full design — and its stated fallback, a /continue that fires from a hook, is a week of work. The reframing that makes this less bleak than it sounds: four separate observations turned out to be one defect. 87% of stalled traces were decided by a sibling run; the stalled metric measures the observer's keying; two PRs merged with no gate decision recorded; the inbox showed 149 already-merged obligations. Gate records RUNS, but the thing that matters is the SUBJECT's decision history — which is exactly the problem Baton exists to solve. Baton's first customer is gate, and an ownership substrate for one flagship tool needs no fleet, no 75 roles, no second machine, and no tenancy. It needs a chain per subject and a fold, and both are on main. Also names the project's characteristic failure plainly: every number that lived only in prose drifted, and every number re-derived from data came back different — 72% became 27.6%, 81 stalled became a keying bug, 75 roles became 25. The instrument that keeps working is exhaustive enumeration, independently rediscovered in parley, warrant, and this package. Stated once here so it stops being rediscovered. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Five documents across two repos now describe this problem, which is the same failure the newest of them is about. This does the cheap half of fixing that: it says which one is canonical and what each of the others is for, without restructuring anything under review. vision.md is canonical and now opens with the index, the one-sentence goal every document shares, and the current status — contracts/org is on main, the §7 P0 gate has been evaluated and does not pass, so P2 through P7 do not start. spec.md is marked superseded. It keeps its review history and the §5/§6 tables contracts/org was built from, with an explicit note that where the two disagree vision.md wins — the §3.9 state machine added claim, yield and complete as structural kinds, settled abandon as a claim terminal, and dropped handoff for release-then-attach. The addition worth the most is the relationship to drive PR #46. It reads as a competing design and is not one: Baton asks who owns work and may ACT on it, and answers with a CAS that refuses the second writer, because acting is exclusive. Discharge asks what was CONCLUDED and where we disagree, and records both, because concluding is not. They are the same goal at two altitudes, and discharge is the P1 slice that ships first — it is the only way to obtain the collision count the P0 gate turns on, and that number cannot be reconstructed because holding was never recorded. where-this-stands.md folds into a §0 here once #245 is locked; leaving it separate until then so this PR's review surface does not move again. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The doc argued for an architecture without ever saying plainly what the operator wants from it, so the scale story drifted to 75 roles and every gate got calibrated against that number. The real target: a small number of role leads, each owning an area of the operator's own work, each trusted with a set of dossier tasks, each reporting back. lead:agentic-development over the portfolio's tooling, lead:rooms over rooms. Two to five, not seventy-five. Stating it changes what is left to build, and the change is mostly subtraction. A lead is real when it outlives a session (contracts/org, on main), holds visible work (assign over dossier: URIs, contract done and binding not built), hands its judgment to the next incarnation (discharge, drive #46), and can be trusted unattended (charter-pinned effect classes, designed and not yet enforced). Three of the four already exist or are in flight. It also defuses the P0 gate rather than failing it. Collisions >= 10 and a role-day affordable at 75 are the right questions for a product sold to strangers and the wrong ones for tooling whose only user is its builder. At five leads the cost arithmetic is nowhere near binding, and the collision count is something to watch rather than a threshold to clear before starting. The rule that replaces the gate: ship the increment that helps you build the next one, and measure because the numbers keep turning out different — not to earn permission. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
"No new store; dossier holds it" and "back this with a real database" read as opposites and are not. The first is an argument about schema duplication — do not invent a fifth model of tasks and conclusions beside dossier's — and it never examined the substrate, which was inherited rather than chosen. The second is about the substrate. Both hold: one model, on a database, absorbing dossier rather than sitting beside it. Four findings decide it, and the fourth is the one that matters: contracts/org is on main with 86 states walked, and a compare-and-swap has nowhere to live on markdown files. Also recorded: `task_list` returns a task's `body` and omits `## Notes` entirely, so the channel the Stop hook writes into has no reader except grep — verified against the org corpus. SQLite now, schema in the Postgres-compatible subset, behind one store interface. Not Neon today: it needs an OAuth step to start, and a store that needs a procedural step before it works is the sixth dead store. cortex unpauses on its own stated revival condition rather than a reinterpretation of it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Said there was no CLI or MCP path reading back what task_update writes. Wrong: mcp__dossier__task_get returns a structured notes array. The true shape is narrower and still carries the argument — no CLI verb reads a note, and task_get takes one id per call and walks the whole corpus to find it. The read exists; it costs O(corpus) and only an LLM can make it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…e loop Six weeks produced ten-plus independent attempts at some part of agent ownership — contracts/org, gate, parley, warrant, mandate, obligation, proofline, branchroom, bailiff, switchboard — each built in its own repo, several measured, none sharing a vocabulary with the others. The result is three capability models, and a portfolio with three capability models has zero. The brief is a prompt, not a design. It hands a fresh analyst the corpus, the corrections that have already caused wrong conclusions, and the instruments that can settle parts of this by measurement rather than argument. Four corrections are load-bearing enough to state up front: ~/dev/gate is archived and only its state/ is live (the code is workbench/cmd/gate); switchboard is agents-as-processes-gleam and its residency result is measured, not open; hack-branchroom is the ANCESTOR of contracts/org rather than a rival; braid and reprise are dead on their own kill conditions and must not come back. New axis, and the one closest to buildable: staying alive and rebounding with targeted context. A lead reduced to mechanism is a context bundle plus a permission set plus a chain position. The harness already provides every injection point that needs — CLAUDE.md layering, SessionStart, layered permissions — and settings.json today wires only PreToolUse and PostToolUse. No SessionStart, no Stop, nothing bound to a role. That gap is mechanical, not conceptual. Unattended operation is framed as the horizon, not the next step, so the answer optimises for moves worth making either way. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The brief's §6 note said dossier task_list omits notes and no CLI verb reads one. Re-verified against the installed binary and source: refuted — task_list returns structured notes, so the write tier can read conclusions back. The correction names the two arguments that leaned on the false premise (hooks #43's substrate-coupling rationale, store-decision finding 2) rather than silently rewriting them. where-this-stands gains a build update: the re-entry slice is no longer a claim — cmd/org and cmd/org-mcp shipped CI-green in PRs #262/#263, with the deliberate deviations recorded where they were made. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Reframes the reconciliation brief. An org chart is a proxy for mechanical properties — a durable assignee identity, authority scoping, somewhere a conclusion has to land to be found. Build the properties; the proxy is optional and at this scale probably costs more than it returns. The brief now works property-by-property rather than repo-by-repo, and carries a standing instruction: wherever a source document uses an org word, substitute the property and re-ask the question. A question that dissolves under substitution is a finding, because the most valuable output here may be a list of design work that stops being necessary. Three sections of vision.md are named as candidates for exactly that. §4.5 (ownership is a tree), §4.6 (three things bubble) and §10.1 (fold per node kind — called the real design work behind d3) all exist to compress a hierarchy. At two to five assignees under one operator the depth is 1, and a depth-1 tree is a list. Also corrects an overreach from the previous revision, which found that drive already implements much of the durable-assignee property and concluded drive's vocabulary should therefore be canonical. The observations hold — Scope is an external durable identity, and authority.go's re-mint/revoke/orphan-adoption reads very close to contracts/org's thesis — but the conclusion was not earned. They are demoted to evidence, with an explicit instruction to crown nothing by default, and a crux to settle: whether ScopeKindFree carries an unbounded standing scope with the same guarantees a bounded dossier phase gets. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The finding claimed conclusions written by task_update could not be read back. Twice: first that no CLI or MCP path returned them, then narrowed to MCP-only. Both wrong. dossier task_list returns a structured notes array for every task in one call. It was a measurement error that survived two rounds of verification, so the withdrawal records the mechanism rather than just the correction: Task.notes is skip_serializing_if = "Vec::is_empty", so the key is absent from any task with none, and the original check sampled .[0] of a list whose rows mostly have none. A conditionally-serialised field and an absent field look identical from one sample. Nothing in the decision rests on it. Finding 4 alone is sufficient — a compare-and-swap has nowhere to live on markdown files — but the argument now stands on a narrower base than it was written with. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Two arguments still cited the withdrawn finding. The cortex revival condition asked for a consumer that dossier verbs plus an LLM doing its own retrieval cannot serve. The first term is now false, so only the latency term survives — and that has not been measured. The document no longer claims cortex unpauses; it says what would have to be measured for it to. The "How this could be wrong" section predicted this exact collapse and is kept visible rather than deleted, marked as fired. A falsification clause that goes off within a day is the most useful line in the doc. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…collide cmd/org and cmd/org-mcp are on main (#262, #263). The re-entry surface the reconciliation brief called the closest-to-buildable gap is built: charter/attach/assign/claim/yield/checkpoint/boot plus sessionstart-boot and stop-mark hook scripts. It is not wired — settings.json still has only PreToolUse and PostToolUse. That makes the brief's §5 stale and surfaces something sharper. There are now TWO Stop hooks, neither wired, built days apart by different sessions with no reference to each other: cmd/org/hooks/stop-mark.sh appends a mechanical mark to the role's chain, and hooks PR #42's stop-discharge.sh appends what a session did to the dossier tasks it touched. Both refuse to ask the model, and their headers reach that conclusion independently in different words — which is the strongest signal in this corpus and also a duplication that will double-write if both are installed. The handoff leads with that as the deliverable rather than the vocabulary question. It also carries the two corrections this session earned: the notes error (a skip_serializing_if field sampled at .[0] reads exactly like a field that does not exist) and the mktemp BSD/GNU divergence that passed every local run and failed every CI one. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
@codex review Adversarial design review at exact head 87d45e6. Review canonical docs/features/org/vision.md plus store-decision.md, p0-findings.md, where-this-stands.md, and reconciliation-brief.md against the shipped cmd/org and open #265/#266. The user's governing direction is thin provider-neutral durable ownership/assignment; hierarchy is only an authority proxy. Find contradictions, overclaims, stale gates, and a concrete dogfood break case. Cite exact file:line and distinguish measured from reasoned. Do not bless or merge. |
|
@claude perform an adversarial DESIGN review and publish a FORMAL GitHub review pinned to exact head 87d45e6, not only an issue comment. Run exactly: gh pr review 245 --repo itsHabib/workbench --comment --body "<your review, stating head 87d45e6>" Important: docs/features/org/vision.md is now canonical; spec.md is explicitly superseded except for historical schema/refusal material. The prior bot reviews covered old spec heads, not this canonical vision or the subsequent design corpus. Try to break, not bless:
Do not merge. If no issue exists, state exactly what you tried to falsify. |
|
Claude finished @itsHabib's task in 8m 7s —— View job Adversarial Design Review — org TDD (PR #245)
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 87d45e6dca
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| `SessionStart` → attach → append; `Stop` → release; count collisions for a | ||
| week. Two properties make it the correct next move regardless of what it finds: |
There was a problem hiding this comment.
Instrument attach and release before evaluating POC-A
Reasoned: This trial requires SessionStart to append an identity-bearing attach and Stop to append release, but the shipped hooks are documented as only reading org boot and appending a mechanical mark (docs/features/org/handoff-2026-08-25.md:21-28,37-39). If the shipped scripts are pasted into settings as suggested by where-this-stands.md:3-14, two concurrent fresh sessions create no holder intervals, so the collision count can be zero and trigger the ≤3 kill gate even when a collision occurred. Wire actual attach/release instrumentation, or redefine the measurement around events the hooks really emit, before using this result.
Useful? React with 👍 / 👎.
| files do not have one. `contracts/org` is on `main` — spine, contract law, | ||
| ownership fold, all 86 reachable states walked — and it has no store that can | ||
| hold it without reintroducing by convention the exact race the fold refuses. | ||
|
|
||
| **The thing already built has no substrate that can hold it correctly.** That | ||
| is the decision, and it was already true before the operator asked. |
There was a problem hiding this comment.
Withdraw the SQLite prerequisite for the chain home
Measured: This assertion is stale against shipped #262: where-this-stands.md:3-12 records a JSONL home whose fold/admit/append critical section is serialized with flock, and explicitly distinguishes that chain from the discharge store for which SQLite was selected. Continuing to say that no correct chain substrate exists directs the next reader to migrate dossier before wiring a working chain, adding a database dependency that the shipped ownership mechanism has already demonstrated it does not require. Narrow this decision to the discharge/query substrate and evaluate the JSONL home on observed contention instead.
Useful? React with 👍 / 👎.
| > something to *watch* rather than a threshold to clear before starting. **Ship | ||
| > the increment that helps you build the next one; measure because the numbers | ||
| > keep turning out different, not to earn permission.** |
There was a problem hiding this comment.
Resolve the canonical P0 gate before authorizing more phases
Reasoned: The canonical document first says the P0 gate does not pass and forbids P2-P7 (vision.md:18-23), while this paragraph declares those thresholds irrelevant for the current user and instructs readers to ship without earning permission; §7 then labels P0-P4 committed. With open follow-on work, these are incompatible stop signals: one reader must stop after P1, while another is authorized to start P2-P4. Either retire P0 for the thin 2-5-assignee dogfood scope and rewrite the phase gates, or keep it binding and remove the ship-without-permission direction.
Useful? React with 👍 / 👎.
|
|
||
| **The fold is bounded, and the goal is not writable.** A three-day IC chain has thousands of records; the fold's entire purpose is to fit in a fresh context window, and no framing bounded it. Worse, if each incarnation rewrites `goal`, a role's purpose is subject to a dozen rounds of lossy re-summarization with nothing to compare against. | ||
|
|
||
| - `goal`, `scope`, `tier`, permitted effect classes, budget, cadence, and retirement condition live in the **charter**, are **inherited** by the fold, and are changeable only by a `recharter` authored under the parent role's grant. Attempting to write them from a checkpoint is `charter_immutable`. |
There was a problem hiding this comment.
Decouple recharter authorization from a parent role
Reasoned: Requiring a parent role's grant hard-codes hierarchy into the continuity contract even though the governing constraint says hierarchy is only one possible authority representation (reconciliation-brief.md:43-54) and the stated deployment is a flat list of 2-5 assignees (vision.md:42-45). A root durable assignee such as either shipped lead consequently has no parent that can authorize a recharter unless an artificial org edge is invented. Define recharter in terms of a provider-neutral authorization predicate or operator-issued grant, and let hierarchy optionally produce that grant.
Useful? React with 👍 / 👎.
| 1. Split gate's `blocked` into *no* and *not yet*, and fix the trigger, before | ||
| arming any enforcement level. This is now the highest-value single change | ||
| to the existing system. |
There was a problem hiding this comment.
Remove the superseded blocked/not-yet action
Measured: The correction immediately above concludes that the 72% basis was irreproducible, the split was separately rejected on termination grounds, and observer keying/evidence timing should be fixed first (p0-findings.md:202-209); this summary then repeats the superseded split as the highest-value change. A reader relying on the concluding action list will implement precisely the work the corrected measurement says to defer. Replace this item with the subject-keyed observer and pre-run evidence-settling actions, or explicitly mark the old action withdrawn.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
🟡 Changes recommended
Critical and moderate design findings remain unresolved.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
Design-only PR defining Baton/org architecture for role continuity, ownership chains, authority fencing, storage, validation, and rollout.
Changes:
- Adds the canonical architecture and lifecycle roadmap.
- Documents the superseded TDD and SQLite storage decision.
- Adds P0 evidence, status, reconciliation, and handoff guidance.
File summaries
| File | Summary |
|---|---|
docs/features/org/where-this-stands.md |
Current status, measurements, and next steps. No final comments. |
docs/features/org/vision.md |
Canonical architecture and roadmap; unresolved critical, moderate, and nit findings remain. |
docs/features/org/store-decision.md |
Storage decision; critical CAS and conflict-semantics finding remains. |
docs/features/org/spec.md |
Superseded technical reference; unresolved critical consistency, authorization, and identity findings remain. |
docs/features/org/reconciliation-brief.md |
Cross-implementation reconciliation; one nit regarding the dossier read path remains. |
docs/features/org/p0-findings.md |
P0 evidence and corrections; one nit regarding the final summary remains. |
docs/features/org/handoff-2026-08-25.md |
Runtime rollout and hook handoff status. No final comments. |
Review details
Suppressed comments (18)
docs/features/org/handoff-2026-08-25.md:102
- The same stale cross-reference appears in this handoff:
vision.mdhas no §4.6 or §10.1, and its §4.5 is not the quoted “ownership is a tree” section. A fresh analyst following this mandatory starting point cannot find the design questions it names; point to current headings or quote the questions without obsolete section numbers.
that is a finding. `vision.md` §4.5 (ownership is a tree), §4.6 (three things
bubble) and §10.1 (fold per node kind — called *"the real design work behind
d3"*) all exist to compress a hierarchy. Check whether any survives at depth 1.
docs/features/org/handoff-2026-08-25.md:34
- The table above shows these hooks do not write the same fact:
stop-markrecords role continuity, whilestop-dischargerecords conclusions against dossier tasks. Their shared no-model/lifecycle trigger is not evidence that one replaces the other, and wiring both would not duplicate a record; it would emit two complementary artifacts. Reframe the decision as whether one host hook should invoke both and how to avoid conflicting task resolution.
Read both headers. They reach the *same* conclusion in different words —
`stop-mark.sh`: *"a record the working agent is required to write is a verb
wearing a costume"*; `stop-discharge.sh`: claiming at the END is a report,
claiming at the start is a prediction and agents skip predictions. Two
implementations converging on a design principle is the strongest signal in
docs/features/org/p0-findings.md:19
- This section is presented as the current conclusion, but the correction below says the 72% classification is not reproducible and reports 28–33% wait-cleared blocks;
vision.mdandwhere-this-stands.mdtreat that rate as over the P0 threshold. Mark this block as historical or update its verdict and downstream consequences so the evidence document has one active interpretation.
## Item 1 — Classify the 87 blocked merges. **Gate passes; the finding is elsewhere.**
The vision's threshold: *if false positives exceed 20%, the authority plane
needs a redesign, not a rollout.*
docs/features/org/reconciliation-brief.md:294
- The brief's hard constraint says “No new store”, but this same PR's
store-decision.mdchooses SQLite as the substrate andvision.md§4.4 explicitly lists a new blob store. If the intended constraint is no new model or no parallel store, say that here; applied literally, this handoff forbids the proposed architecture and makes its build-order advice inconsistent.
- **No new store, no new repo, no rewrite.** Five stores have already died here,
each surviving long enough to look like it might still work.
docs/features/org/reconciliation-brief.md:256
- This handoff tells the analyst to inspect
vision.md§§4.5, 4.6, and 10.1, but those headings/claims no longer exist there: §4.5 is “Surface retired versus added,” and there is no §4.6 or §10.1. The quoted hierarchy text is absent as well, so a fresh analyst is sent to unrelated or nonexistent sections; update the references to the actual source or restate the questions against the current vision.
2. **What dissolves.** Apply §2's standing instruction across
`docs/features/org/vision.md`. Sections §4.5 ("ownership is a tree;
dependencies are a graph"), §4.6 ("three things bubble"), and open question
§10.1 ("what is a fold per node kind" — called *"the real design work behind
d3"*) are all built on hierarchy. Does any of that survive substitution at a
docs/features/org/spec.md:668
- The superseding banner says
handoffwas dropped in favor of release-then-attach, but this retained record table still defineshandoffas a legal kind, and the API/hook sections repeat it. Because §5 is explicitly retained as an implementation source, readers can accidentally reintroduce the removed transition. Remove or clearly mark the stale rows and point them tovision.md's final record set.
| `handoff` | same as `checkpoint` + `reason: stop\|compaction\|release` | ends an incarnation cleanly; no `next_due` (nothing is coming) |
docs/features/org/spec.md:1013
- Open question 7 is used for both the live-actor question and subject drift, then 8–10 follow. This makes references such as
§10.7ambiguous and contradicts the statement that the items were renumbered. Renumber the subject-drift item and all subsequent references consistently.
7. **Subject drift on long-running work.** hack-mandate binds authority to a
docs/features/org/vision.md:144
- The canonical structural-kind list omits
claim,yield, andcomplete, even though §3.9 uses them as lifecycle transitions; it also retainshandoffdespite the superseded-file header saying that kind was dropped. Because unknown structural kinds are refused, the versioned schema, state machine, and record table can classify the same chain differently. Reconcile these lists before implementing the reader.
- `kind_class: structural` — `charter`, `attach`, `takeover`, `release`, `retire`, `recharter`, `split`, `merge`, `abandon`, `revoke`, `delegate`, `assign`, `unassign`, `intent-ref`, `escalation`, `resolution`, `seal`, `annul`. An unknown structural kind makes the fold **refuse** `scheme_unsupported` with an upgrade remedy.
docs/features/org/vision.md:480
- This says every P0 item is answerable from existing data and asks for a last-90-day collision count, but the status and §4 say holding was never recorded and collisions are unmeasurable retrospectively; only a live instrumented run can answer it. Rewrite item 2 as the live POC-A instrument and distinguish historical reconstruction as unavailable.
Every item is answerable from data already on the machine, and any one of them can invalidate a plane.
1. **Classify the 87 blocked merges.** True positive or false positive. 87 of 247 actions is a 35% refusal rate against zero repos that require the check — those are unclassified predictions, not evidence, and the word "observational" is too kind. If false positives exceed 20%, the authority plane needs a redesign, not a rollout.
2. **Count the actual collisions.** Session-claims, worktree history, and transcripts, last 90 days: how many times did two sessions hold the same work item at once?
3. **Read 20 of the 81 stalled traces.** Defect or life? Until someone does, "32% stalled" measures the protocol's optimism.
docs/features/org/vision.md:536
- POC-A is advertised as binary, but 4–9 collisions in seven days satisfy neither outcome, and a seven-day count is not directly the stated ≥10-in-90-days gate. Define the intermediate decision and how the seven-day observation maps to the 90-day criterion before using this as the go/no-go.
**POC-A — Does ownership matter?** (P0, item 2, plus a one-week instrumented run.) Turn on attach-and-mark from the hook across every session on the machine, with no refusals of any kind. After seven days, count the events where two incarnations held the same role or the same work URI simultaneously.
- **Pass:** ≥ 10 collisions in seven days. Ownership is a real problem and the chain earns its place.
- **Fail:** ≤ 3 collisions. Ownership is a rare event, continuity is the whole product, and it is a text file plus a hook — one week of work, not a year. Stop and build that.
docs/features/org/vision.md:431
- §3.8 makes both
deadlineanddefaultmandatory for every escalation, but this row saysno timeout, which appears to permit a never-expiring human escalation. Distinguish a required deadline used only for visibility from “no automatic resolution at the deadline,” or choose one behavior so the attest contract is unambiguous.
| **attest** | bind, and external systems require the evidence (branch protection, deploy gates) | anchors published off-box | sandboxed execution required | human required, no timeout, for class U and ceiling breaches |
docs/features/org/vision.md:13
- This document's index says the reconciliation brief puts
vision.md§§4.5, 4.6, and 10.1 in doubt, but the canonical file has no §4.6 or §10.1 and §4.5 is a different topic. The index therefore directs readers to a non-existent design location; update it when the reconciliation questions are relocated or renumbered.
> | [`reconciliation-brief.md`](reconciliation-brief.md) | handoff prompt: name the properties the org metaphor stood in for, and reconcile the ten implementations against them | **open question**; hand to a fresh analyst. Its §2 puts §4.5, §4.6 and §10.1 below in doubt |
docs/features/org/vision.md:14
- The index says this synthesis will fold into §0 once #245 is locked, but
vision.mdhas no §0 section—it goes from the status block to §1. Since this file is labeled canonical, the unresolved destination makes the document set's authority unclear; name the target section or remove the promise.
> | [`where-this-stands.md`](where-this-stands.md) | proven vs claimed, and the next step | synthesis; **folds into §0 here once #245 is locked** |
docs/features/org/vision.md:267
- The effect seam defines the mandatory broker stamp as
(role, fence, work_ref, effect_id), but the state-machine invariant below says every effect carries(role, incarnation, fence, w). These are not equivalent:incarnationis the presented identity bound to the grant/chain. Choose one canonical stamp (or explicitly derive incarnation from fence) and use it in custody, effect records, and validation; otherwise implementations can disagree about whateffect_unstampedmeans.
| Continuity → Effect | `(role, fence, work_ref, effect_id)` stamped on every brokered request | the incarnation | custody, `effect_unstamped` if absent |
docs/features/org/vision.md:166
- The canary is described as forking from the chain alone, but §2 makes distilled state a separately stored blob referenced only by
body_digest, and those blobs may be erased. A chain-only reader therefore cannot recover the goal/decision prose that the canary is meant to score. Define whether the canary includes retained body blobs/tombstone projections, or limit the fidelity claim to the spine.
**The resume canary is a first-class component, because distillation quality is the thesis's only untested load-bearing assumption.** Periodically, fork a fresh incarnation from the chain alone, ask it to state the goal and the next action, and score it against what the live incarnation is doing. That produces a per-role **resume-fidelity** number that degrades visibly before it fails catastrophically. It is the only instrument that tells you whether the chain is carrying thought or only commitment.
docs/features/org/vision.md:605
- Appendix A1 says the tip must never be caller-supplied from an earlier read, yet the public
batondAPI requiresIf-Match: <seq>.<tip>and calls that header the entire concurrency story. If the closure rule is local-only, state that the remote HTTP value is an optimistic-concurrency precondition verified atomically by the home; otherwise these two API contracts conflict.
the scale. **The tip is never a parameter the caller supplies from an earlier
read.**
docs/features/org/where-this-stands.md:136
- The summary reports exactly 24 wait-cleared blocks, while the correction in
p0-findings.mdreports a range of 24–29 of 87 because five blocks are mixed. These are different rates and produce different threshold conclusions. Use the corrected range or document the classification rule that justifies selecting 24.
| input | threshold | measured | verdict |
|---|---|---|---|
| collisions / 90 days | ≥ 10 | **unmeasured** | unknown |
| false positives | < 20% | **27.6%** | **over** |
| role-day at target scale | 75 roles | affordable to **~25** | **3× under** |
docs/features/org/where-this-stands.md:176
- Re-keying the observer can make the missing-decision cases visible, but it cannot create or enforce a gate decision for a merge that already happened out of band. Calling this a fix overstates the effect; distinguish detection/metrics from closing the authorization gap, which needs an enforcement or receipt path.
**Second, re-key gate's observer by subject.** Cheap, and it fixes the stalled
metric, the ghost inbox, and the "two merges with no decision" hole at once. It
is also the smallest possible demonstration of the ownership thesis against a
real tool.
- Files reviewed: 7/7 changed files
- Comments generated: 16
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| 1. Split gate's `blocked` into *no* and *not yet*, and fix the trigger, before | ||
| arming any enforcement level. This is now the highest-value single change | ||
| to the existing system. |
| `dossier` `task_list` returns a task's `body` and **omits its notes section**; | ||
| no CLI verb reads a note. The MCP's `task_get` does return a structured `notes` | ||
| array, but one id per call, walking the whole corpus. So the tier that *writes* | ||
| conclusions (bash hooks, the sweep) cannot read them back. Verified 2026-08-24. |
| - **One writer per chain at a time**, enforced by `prev` — not by a lock. | ||
| The file lock around the `write(2)` is a mechanism for atomic appends, not | ||
| the ownership model. |
| | `checkpoint` | `state{ goal, doing, decided[{what, why}], open[], next[], refs[] }`, `incarnation_id`, `next_due` | `next` non-empty; ≤ 4 KB; `incarnation_id` == current; `next_due` in the future | | ||
| | `handoff` | same as `checkpoint` + `reason: stop\|compaction\|release` | ends an incarnation cleanly; no `next_due` (nothing is coming) | | ||
| | `mark` | `mechanical{ session_ref, git{branch, head, dirty[]}, last_tools[], transcript_offset }`, `next_due` | host-authored; degraded; exempt from `empty_next` (§4.7) | | ||
| | `takeover` | `by: <supervisor role>, from_incarnation, reason, evidence[]` | only a role named `supervisor` in genesis; ends the current incarnation | |
| **Incarnation id must be unguessable.** It is the digest of the `resume` (or | ||
| `takeover`) record that created it — not a counter, not a sequence. This is a | ||
| correction taken from hack-branchroom, whose epochs are `parent + n` and are | ||
| therefore trivially guessable: its stale-writer refusal is only sound if the | ||
| displaced writer never stamps the fresh epoch, and a robust writer that | ||
| re-reads the tail before appending will copy the fresh id *by accident* and | ||
| sail through. A digest cannot be arrived at by a writer that has not read the | ||
| record that minted it, which is exactly the population we want to exclude. |
| 3. Liveness is derived from write recency against a deadline the writer itself declared — never from self-report. | ||
| 4. Authority is bound to that same token, so authority expires when ownership moves. | ||
|
|
||
| From these: an agent that dies loses nothing (state is external); two agents cannot both act as a role (CAS); a hung agent that never exits is correctly seen as dead (it stopped appending); and a displaced agent's credentials are dead the instant the token advances, including on hosts you cannot reach. |
| |---|---|---| | ||
| | **custody** | The broker: policy enforcement point, credential boundary, effect ledger, idempotency fence, audit source of truth. One component because the agent cannot exceed its grant when it possesses no credential to exceed it with — mechanism, not policy. | Large. Intent-before-wire fail-closed (a charter reversal), `(role, fence, work_ref, effect_id)` stamp with refusal, classes and probes in the manifest, model provider as an upstream. **The highest-leverage single piece of work in the portfolio.** | | ||
| | **contracts/org** | The continuity contract: spine types, embedded schema, validation, bounded pure fold, refusal codes. Leaf package, no decision logic. | Build new (§4.4). | | ||
| | **contracts/authority** | Grant type with incarnation, fence, ceilings, and the monotonicity predicate. Extracted from gate so it is not one tool's private notion. | Extract + extend. | |
| | Component | Role in the composed system | Change required | | ||
| |---|---|---| | ||
| | **custody** | The broker: policy enforcement point, credential boundary, effect ledger, idempotency fence, audit source of truth. One component because the agent cannot exceed its grant when it possesses no credential to exceed it with — mechanism, not policy. | Large. Intent-before-wire fail-closed (a charter reversal), `(role, fence, work_ref, effect_id)` stamp with refusal, classes and probes in the manifest, model provider as an upstream. **The highest-leverage single piece of work in the portfolio.** | | ||
| | **contracts/org** | The continuity contract: spine types, embedded schema, validation, bounded pure fold, refusal codes. Leaf package, no decision logic. | Build new (§4.4). | |
| | Seam | Typed artifact | Writer | Reader | | ||
| |---|---|---|---| | ||
| | Continuity → Authority | `{role, incarnation, fence}` embedded in every grant; verifier keeps a per-role high-water mark | attach / takeover | custody, local gate. **Not CI.** | | ||
| | Continuity → Work | `assign{work_uri, subject_digest}`; one open assign per URI across all chains | the holder | fold-time law; work adapters | |
| 1. **Classify the 87 blocked merges.** True positive or false positive. 87 of 247 actions is a 35% refusal rate against zero repos that require the check — those are unclassified predictions, not evidence, and the word "observational" is too kind. If false positives exceed 20%, the authority plane needs a redesign, not a rollout. | ||
| 2. **Count the actual collisions.** Session-claims, worktree history, and transcripts, last 90 days: how many times did two sessions hold the same work item at once? | ||
| 3. **Read 20 of the 81 stalled traces.** Defect or life? Until someone does, "32% stalled" measures the protocol's optimism. | ||
| 4. **Price a role-day.** Eight concurrent ICs, one real day, read `spend-audit`. Multiply by 60. The reference topology comes from an engineer with internal capacity; the $40-a-month comparison point would be rate-limited into the ground at 75. | ||
|
|
||
| **Gate.** If collisions ≥ 10 in 90 days *and* false positives < 20% *and* a role-day is affordable at target scale, proceed to the full design. If collisions come back at 3, the honest product is a good `/continue` that fires from a hook — one week of work — and everything about ownership is premature. Write the numbers down before deciding. |
|
@claude retry the exact-head FORMAL review that the prior run left incomplete. Review only current head 87d45e6 and publish with: gh pr review 245 --repo itsHabib/workbench --comment --body "<review explicitly naming head 87d45e6>". Keep it narrow and adversarial: (1) actual SessionStart/Stop and optional-incarnation behavior versus the session-exclusivity/POC-A claims; (2) thin provider-neutral ownership/assignment versus hierarchy/authority/effect scope; (3) contradictory P0 stop signals and stale factual claims. Cite exact file:line. Do not inspect other PRs, modify files, approve, or merge. |
…cisions to fold Independent reconciliation of the whole ownership-continuity lineage at 2026-08-26 heads: what #245 designed, what #246/#248/#262/#263 shipped through the governed path, what #265/#266 measure, what hooks#42/#43 and drive#47 add, what cc-skills#29 proves in fixture, and what remains hypothesis. Every major claim classified on the honest rung ladder; duplications and missing joins named; D1-D10 written to be accepted, amended, or struck in place. Indexed from vision.md's document table. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The kernel refuses new claims and retirement while an effect is open; release carries the obligation forward rather than being refused — the review overstated it. D3 (typed intent channel + review-thread fold) landed on cc-skills#29 at 7c80825 with the smoke green against main, so the today-path and the classification rows now say so. Annul refined: the kernel admits a tip-only annul; no verb exposes it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

Summary
Design document for org: infrastructure for an agent organization (leads → project leads → ICs) over the portfolio. The load-bearing claim: continuity and ownership are the same fact — each role has one hash-chained journal of distilled context, and holding the tip of that chain is being the role. Incarnating = appending
resumewithprev == tip; forks, races, and displaced incarnations are refused by the reducer, not a lock.Doc:
docs/features/org/spec.md. Design only — no code.Decisions that need a call (§4)
incarnation_id, not chain heads — and whether that lands in custody + gate separately or in a sharedcontracts/authoritymarkstands in when it didn't (degraded but legal)Rollout
p0 charter → p1
contracts/org(leaf, validate + fold) → p2 Lean laws (port fm-epoch-replay-laws) → p3 Claude Code host adapter → validation gate: one role resumes mid-thought after a kill, on ivy/ship/gate → p4 drive runtime → p5 parley protocols → p6 one-lead/three-ICs/one-day slice.This is a design review, not a code review. Do not merge — the operator locks the design.
🤖 Generated with Claude Code