Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
c18df7e
docs(org): TDD — roles, chains, and ownership-as-data for an agent or…
itsHabib Aug 22, 2026
e31beba
docs(org): TDD v2 — fold review round 1, adopt four bakeoff kernels
itsHabib Aug 22, 2026
5c514c6
docs(org): cattle not pets — narrow the claim, add the derive-don't-r…
itsHabib Aug 22, 2026
e29ffa8
docs(org): role kinds, not rival architectures; work is tickets and d…
itsHabib Aug 22, 2026
60a91f0
docs(org): drop the stock metaphor from 4.11
itsHabib Aug 22, 2026
1cf6ca5
docs(org): 4.12 - can anyone actually operate this
itsHabib Aug 22, 2026
a40255e
docs(org): adoption is a design property, and it must retire more tha…
itsHabib Aug 22, 2026
14b66b5
docs(org): the architecture vision — Baton
itsHabib Aug 22, 2026
42398a2
docs(org): P0 findings — the gate's blocks are 72% timing, not risk
itsHabib Aug 22, 2026
ac6a743
docs(org): 3.9 — the organizing idea is one state machine, planes are…
itsHabib Aug 22, 2026
befaed6
docs(org): answer P0 items 3 and 4, and correct item 1's headline
itsHabib Aug 23, 2026
1faa53f
docs(org): where this stands — what is proven, what is still a claim
itsHabib Aug 23, 2026
cdafa50
docs(org): name one canonical doc, and state how discharge relates
itsHabib Aug 24, 2026
c1a4a99
docs(org): state the actual target — a few role leads, not a fleet
itsHabib Aug 24, 2026
e193c7d
docs(org): decide the substrate — one model, on a real database
itsHabib Aug 24, 2026
bbf7377
fix(org): the MCP does read notes — narrow finding 2 to the CLI
itsHabib Aug 24, 2026
83d18b9
docs(org): a handoff brief to reconcile ten ownership streams into on…
itsHabib Aug 24, 2026
b9e6079
docs(org): correct the refuted read-path claim; stamp what is now built
itsHabib Aug 24, 2026
a990e37
docs(org): the metaphor is not the mechanism
itsHabib Aug 25, 2026
35ad0a4
fix(org): withdraw finding 2 — notes were readable all along
itsHabib Aug 25, 2026
f366fa5
docs(org): follow finding 2 through — cortex does not unpause on this
itsHabib Aug 25, 2026
87d45e6
docs(org): handoff — the org runtime shipped, and two Stop hooks now …
itsHabib Aug 25, 2026
41a4ceb
docs(org): lineage review — design vs shipped vs measured, and the de…
itsHabib Aug 26, 2026
8367b2c
docs(org): state the intent law exactly, and record D3 landing
itsHabib Aug 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
211 changes: 211 additions & 0 deletions docs/features/org/handoff-2026-08-25.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,211 @@
# Handoff — org reconciliation, 2026-08-25

> Paste this whole file to a fresh analyst session. It is written to be read
> cold. Modify nothing; this is a read-and-decide pass.

## Where this stands in one paragraph

The org runtime **shipped** — `cmd/org` and `cmd/org-mcp` are on workbench
`main` (#262, #263). Charter, attach, assign, claim, yield, checkpoint, boot,
status, blob, log, plus two hook scripts. The re-entry surface a previous brief
called "the closest-to-buildable gap" is built. What it is *not* is **wired**:
`~/.claude/settings.json` still has only `PreToolUse` and `PostToolUse`, and
zero mentions of org. Meanwhile a second, independently-built Stop hook is
sitting in another repo waiting for the same slot.

## 1. The live collision — start here

**Two Stop hooks exist, neither is wired, and they do overlapping jobs.** They
were built days apart by different sessions and neither references the other.

| | `workbench/cmd/org/hooks/stop-mark.sh` | `hooks/scripts/stop-discharge.sh` (hooks PR #42) |
|---|---|---|
| writes | a **mark** to the role's chain | a **discharge note** to the dossier tasks the session touched |
| content | session id, turn count, transcript path | turns, files written, PRs touched |
| resolution | `cwd` → `roles.map` longest-prefix | the session called `task_update`, which named the task |
| model involved | no — explicitly refuses | no — same argument, independently reached |
| on a bare mark | fold renders tip **Degraded** | n/a |
| wired | no | no |

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
this corpus. It is also a duplication that will double-write if both are wired.

The matching read side, `cmd/org/hooks/sessionstart-boot.sh`, injects a
byte-capped `org boot` index (default 2048 bytes: charter, held work,
obligations, liveness, last incarnation's final word — pointers, not a dump).
That is the SessionStart read `drive:docs/features/discharge/spec.md` (PR #46)
designed and never built.

**The question to settle first:** are these one mechanism or two? If one, which
survives, and what happens to the other repo's PR? If two, state the property
each provides that the other cannot, in a sentence that would survive review.

## 2. What shipped or moved recently

Merged to workbench `main`:

- **#262** `feat(org): the Baton home — a runtime for role continuity chains`
- **#263** `feat(org): platform seams — JSON receipts, presented identity, org-mcp, operator context.d`
- Also merged: #247, #253, #257, #259.

Open, relevant: **wb#265 `feat/org-sweep`** — check what it is before proposing
anything adjacent.

## 3. What the previous session produced

Four PRs, all CI-green, none merged:

- **hooks#42** `feat/stop-discharge` — the Stop hook above. Has had one review round.
- **hooks#43** `feat/discharge-sweep` (stacked on #42) — finds sessions that owed a
discharge and never paid, and can backfill. **Measured on the real corpus:
21 sessions owed a discharge on 49 tasks, 0 recorded.** That 0% is because
#42 is not wired.
- **drive#47** `feat/watch` — a resident watcher tier. Findings in SQLite, one
writer, deliberately unable to act. One watcher over `gate next -json -live`
(parks, expiring grants, repos with no grant). Verified against live gate
state: six parks found on the first pass, zero re-notifications on the second.
- **wb#245** `docs/org-tdd` — carries `vision.md`, `store-decision.md`,
`p0-findings.md`, `reconciliation-brief.md`. **Do not merge until the
operator locks it.**

`reconciliation-brief.md` on that branch is the previous handoff. **Its §5 is
now stale** — it treats re-entry as unbuilt. Its §2 (the metaphor is not the
mechanism) still holds and is the governing constraint; see below.

## 4. The governing constraint

From the operator, and it survives everything above:

> Why does the distinction of an org even matter at all? Previously I was doing
> "driver" and "worker" agents, but it's all the same. Ownership / assignment,
> that's all that matters. Yes, org gives us hierarchy — but that is usually in
> effect to something like permissions or something else, and that can be
> represented any way.

An org chart is a **proxy** for mechanical properties. Build the properties.

| org term | the property it proxies for |
|---|---|
| role / lead / IC | a durable assignee identity that outlives a session |
| **hierarchy** | **authority scoping — who may do what, where** |
| reporting line | where a conclusion must land to be found by the next reader |
| org chart / tree | possibly nothing — at 2–5 assignees under one operator, depth is 1 |

**Standing instruction:** wherever a source document uses an org word,
substitute the property and re-ask the question. If the question dissolves,
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.

The operator's clarification, which matters: this is **not** a claim that any
existing implementation solved it. Crown nothing by default.

## 5. Ground truth — earlier passes got these wrong

- **`~/dev/gate` is ARCHIVED** (last commit: `docs: archive banner — gate
migrated into workbench as cmd/gate`, 2026-07-17). Live code is
`workbench/cmd/gate` + `contracts/gateauthorization`. Only `~/dev/gate/state/`
is live — the `GATE_STATE` journal, ~5000 records.
- **switchboard is `~/dev/agents-as-processes-gleam`.** Gate C2 measured that
residency does **not** buy crash recovery — it buys *serialized ownership*.
Measured; do not re-derive.
- **`hack-branchroom` is the ANCESTOR of `contracts/org`**, not a rival. See
the dossier note on task `p1-t3-reduce` in project `org`.
- **`braid` and `reprise` are dead** on their own kill conditions
(`~/dev/bakeoff/haskell-08-10/scorecard.md`, `haskell-dsl-08-10/`).

## 6. Two corrections worth learning from

Both were made by the previous session; both are instructive about how this
corpus lies to you.

**The notes error.** It claimed twice that `task_update`'s notes could not be
read back — first that no CLI or MCP path returned them, then, narrowed, that
only `task_get` did. Both wrong: `dossier task_list` returns a structured
`notes` array. The mechanism is the lesson — `Task.notes` is
`#[serde(default, skip_serializing_if = "Vec::is_empty")]`
(`~/dev/dossier/src/domain.rs:184`), so the key is **absent** from any task with
no notes. The check ran `jq '.[0] | keys'` and generalised from one row. Most
rows have none. A conditionally-serialised field and a nonexistent one are
identical from a single sample. `store-decision.md` finding 2 is now withdrawn;
hooks#43 was rewritten to read through the CLI (and got 5× faster: 15s → 3.1s).

**The portability error.** Every hooks#43 test passed locally and every one
failed on CI. Cause: `mktemp -t discharge-sweep`. BSD accepts a bare prefix
after `-t`; GNU reads it as a template and refuses it for having no `X`s. Same
family as the absent-`timeout` trap already documented in that repo — a
coreutils divergence that makes a script macOS-only while it looks portable and
passes every local run. **When reviewing anything bash here, check BSD/GNU
divergence explicitly.**

## 7. The corpus

Implementations touching ownership / authority / evidence:

| repo / package | primitive |
|---|---|
| `workbench/cmd/org` + `contracts/org` | role chain, CAS-on-tip, charter/attach/claim/yield/checkpoint/boot, two hook scripts |
| `workbench/cmd/gate` + `contracts/gateauthorization` | merge authorization; operator-minted grants, tier ceilings, TTLs |
| `~/dev/drive` | `Scope`/`attach`/`link`/`release`; scope-bound capability, successor re-mint, orphan adoption; liveness derived |
| `~/dev/bailiff` | `Warrant` — a capability an agent *holds*: scoped, use-capped, expiring, operator-revocable |
| `~/dev/hack-mandate` | signed delegation pinned to an exact revision; a child may only narrow |
| `~/dev/hack-obligation` · `~/dev/hack-proofline` · `~/dev/hack-branchroom` | evidence frontier · identity lineage · causal fork (ancestor of contracts/org) |
| `~/dev/warrant` | `Reduce` over a journal; refuses to advance without evidence bound to the subject |
| `~/dev/parley` | protocol kernel — Haskell compiles, Gleam enforces, Lean proves |
| `~/dev/agents-as-processes-gleam` | switchboard |
| `~/dev/hooks` | the bash hook layer; PRs #42/#43 |

## 8. Use the instruments before reasoning

**`~/dev/warrant/cmd/gate-observe`** replays a foreign evidence journal against
a definition written afterwards, with no adoption by the observed system:

```sh
go run ./cmd/gate-observe ~/dev/gate/state/log.jsonl
```

Against gate's live log (415 runs, 5010 records, see
`~/dev/warrant/docs/gate-history.md`): **`escalate` is 57% of all verdicts**
(1218 of 2145, vs 809 pass and 118 block) — the most common real outcome was
unrepresentable in the model, which grew a third verdict. One verifier's
refusal path has never executed in 415 runs.

Research already done, do not repeat: `agents-as-processes-gleam/docs/evidence/`
(8 pre-registered docs, Gate A→C2), `~/dev/workbench-laws-lean/` (Lean 4 model
of gate's verdict laws, explicitly not production authority),
`~/dev/bakeoff/agent-substrates-08-21/{scorecard.md,org-compute-synthesis.md}`.

## 9. Constraints

- **Cite `file:line`.** A claim without a citation is noise.
- **Mark every finding `measured` or `reasoned`.**
- **Code beats docs.** These docs overclaim; say so when they differ.
- **Crown nothing by default** — not org, not drive, not for being furthest along.
- **No new store, no new repo, no rewrite.** Five stores have already died here.
- Measured failure modes in this portfolio: scope errors 43%, stale claims 23%,
confabulation 8%. Re-verify anything that sounds settled, **including §5.**
- Read-only.

## 10. Output

At most 2000 words.

- **(a) The Stop-hook verdict (§1)** — one mechanism or two? Which survives,
and what happens to the loser's PR? This is the deliverable; everything else
is supporting.
- **(b) Wiring recommendation** — should `sessionstart-boot.sh` and a Stop hook
go into `~/.claude/settings.json` now? What breaks if they do? Note the
injection cost: bytes injected at SessionStart enlarge every cached turn
thereafter, not just the first.
- **(c) Property table** — for each property in §4, which implementations
provide it, and which should win.
- **(d) What dissolves** — design work that stops being necessary once the org
metaphor is substituted away. Name sections and files.
- **(e) Subtraction list** — what to archive or fold, with the argument.
- **(f) Next three build steps, in order**, each with what it makes true, why it
precedes the others, and its kill condition.
- **(g) The single riskiest assumption** in (f).
Loading
Loading