dewey: row 137 live smoke plan packet (#1631)
SMOKE.md for the shared 139/137 re-pin window (sage-0613), from the code at
18aee8fa1. Doc only; nothing run.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
@@ -0,0 +1,182 @@
|
||||
# Row 137 live smoke plan (#1631): not run
|
||||
|
||||
Written by Dewey for Sage (sage-0613), from the code at 18aee8fa1 and the row 137 packets. Mos
|
||||
ruled that rows 139 and 137 share one re-pin window and run both smokes in it (row 139's plan:
|
||||
agents/dewey/work/queue-139/SMOKE.md). It runs only on Mos's go, and only from the tester path:
|
||||
`scripts/mosaic ... --tester`, with every `talk` text starting `[mos test]`. Dewey doesn't run it.
|
||||
Target: business "stack", project `stack`.
|
||||
|
||||
## What a live smoke can and can't exercise before row 149
|
||||
|
||||
No role can land today. `land_work` reaches a session only when the broker's `landHeld` finds,
|
||||
for that role and thread, a `cross-role` git.merge.protected decision, resolved with its
|
||||
approval option and unspent (broker.mjs:914-932). A decision's class is set at the raise from the
|
||||
raiser's role definition (`#classification`, broker.mjs:508-520). None of the role definitions in
|
||||
`roles/` lists git.merge.protected under `withinRole` or `crossRole`. So every live merge raise
|
||||
is `gated`, and no role and thread can ever hold a landable decision. Granting it is a role-file
|
||||
change, a reviewed commit (invariant 7), not a smoke step. The merge-gate role arrives in row
|
||||
149.
|
||||
|
||||
So before 149 a live smoke can show:
|
||||
- the launcher's new `landHeld` call on every launch, answering false;
|
||||
- the working repository's new seed: `refs/heads/root`, with `main` following only by
|
||||
fast-forward;
|
||||
- land-work.sh, which already runs from the canonical checkout at 18aee8fa1, still landing
|
||||
Sage's work on `refactor`;
|
||||
- optionally, REQ-LAND-1 at the binding: an approved gated merge decision doesn't give the
|
||||
raiser `land_work`.
|
||||
|
||||
It can't show any part of a landing:
|
||||
- `checkLand`'s refusals, including REQ-LAND-1's `not-authorized`. No session can send a
|
||||
`land` line without `land_work`, and the capability never reaches the model.
|
||||
- `prepareLand`, the gate under `bus-host/land/<id>/`, `finishLand` and `recordLand`.
|
||||
- The "as its arbiter, via the broker" Resolved line.
|
||||
- The RESULT messages, and the `land-busy`, `base-moved`, `gate-failed`, `host-closing` and
|
||||
`rollback-failed` paths.
|
||||
|
||||
The bus, seat, cli and harness suites cover those, and Sage's landing gate ran them on
|
||||
435d1c616 plus the candidate. The first live landing belongs in row 149's smoke plan.
|
||||
|
||||
## Preconditions (each checked by Mos, read-only)
|
||||
|
||||
1. **Row 137 is live.** Row 137 has landed and the live tree contains it: since row 85 the
|
||||
host, bus and role sessions run from copies/<sha>. Check with ps that the bus host, its bus
|
||||
child and every role session run from a copy that includes f1ee9a989.
|
||||
- The launcher calls the host op `landHeld` before every launch (launcher.mjs:262). The host
|
||||
starts the bus from its own tree (host.mjs:26), so the two can't disagree on it.
|
||||
- Row 137 adds no store migration, so the re-pin needs no schema step for it.
|
||||
2. **No role definition grants git.merge.protected.**
|
||||
`grep -l git.merge.protected <copy>/roles/*.json` finds nothing. The live business file's
|
||||
roles name only those definitions (`definition` keys).
|
||||
- If the grep finds a definition with git.merge.protected under `crossRole`, stop. A role of
|
||||
that definition could then hold a landable decision, and this plan doesn't cover a landing.
|
||||
3. **No decision a landing could use exists.** In the live store, opened read-only, no
|
||||
git.merge.protected decision has class `cross-role`:
|
||||
```
|
||||
SELECT id, class, raised_by_role FROM decisions WHERE action='git.merge.protected';
|
||||
```
|
||||
- Before row 139, git.merge.protected was a hard wait, so any existing row should be `gated`.
|
||||
- Expected: no `cross-role` row. This is the answer to "which live role can hold one today":
|
||||
none.
|
||||
4. **`bus.tester` is `true`** for the business.
|
||||
5. **A record of the working repository before the window.** Mos records:
|
||||
- the project root's checked-out commit: `git -C <root> rev-parse HEAD`, where `<root>` is
|
||||
project `stack`'s root in the business file;
|
||||
- the working repository's refs:
|
||||
`git --git-dir=<dataRoot>/working/stack/stack.git for-each-ref --format='%(refname) %(objectname)'`.
|
||||
- Expected: `refs/heads/main` and `refs/heads/work/...` refs, with no `refs/heads/root`. Before
|
||||
137 the seed fetched the root straight into `main`, forced.
|
||||
- Call the recorded `main` M0 and the root commit R0.
|
||||
6. **There is no landing directory:** `<dataRoot>/bus-host/land/` doesn't exist.
|
||||
|
||||
## Steps
|
||||
|
||||
**A. Every launch binds without land_work** (precondition 1, row 137's launcher). It needs no
|
||||
talk of its own: the relaunches the re-pin needs, and row 139's precondition 4, produce it.
|
||||
|
||||
For each role session launched after the re-pin, the launch log's `event:launch` names
|
||||
`bundle/manifest.json` by path. Read that file:
|
||||
- Pass: the launch succeeded (no host-op refusal in the launch log).
|
||||
- Pass: `jq '.typed' manifest.json` has no `land_work`, and the bundle's `prompt.md` has no
|
||||
"Landing:" line.
|
||||
- Pass: the session's `session.json` names `gitSocket` only for the roles that held it before
|
||||
137: those whose definition holds git.push.working or review.verdict (coder and reviewer in
|
||||
`roles/`). For every other role it's absent, the same as before.
|
||||
|
||||
**B. The seed keeps main, and fills refs/heads/root** (REQ-LAND-1's prerequisite: a landed
|
||||
`main` survives the next push).
|
||||
|
||||
This needs one push or review fetch through the git socket after the re-pin. Use the first one
|
||||
the work makes anyway. Don't induce a push for this step alone.
|
||||
|
||||
Before it runs, compare M0 with the root's commit at that moment (R1):
|
||||
- If M0 equals R1, the seed moves nothing in `main`.
|
||||
- If M0 is an ancestor of R1, the first push or fetch fast-forwards `main` to R1. That moves
|
||||
`main` in a live working repository, so it needs Jason's agreement beforehand. The code
|
||||
before 137 did the same, forced, on every push.
|
||||
- If M0 isn't an ancestor of R1, `main` stays at M0 (working.mjs:172) and only `root` moves.
|
||||
|
||||
After it, run the same `for-each-ref`:
|
||||
- Pass: `refs/heads/root` exists and equals the root's checked-out commit at the push. Check
|
||||
`git -C <root> rev-parse HEAD`, if the root hasn't moved since.
|
||||
- Pass: `git --git-dir=<repo> merge-base --is-ancestor M0 refs/heads/main` exits 0. `main` is M0,
|
||||
or the fast-forward to `root`, and was never forced.
|
||||
- Pass: the push or fetch succeeded. Its trail shows the `action.allowed` for git.push.working,
|
||||
or the reviewer got its bundle.
|
||||
- Pass: the project root's `git status` and HEAD are as they were. The root is only read.
|
||||
|
||||
**C. Optional: an approved gated merge decision gives no land_work** (REQ-LAND-1 at the binding).
|
||||
|
||||
```
|
||||
scripts/mosaic talk coder "[mos test] row 137 smoke, binding only; nothing lands. Call read_spec for project stack and tell me the file commit and whether it is confirmed. Then raise a non-blocking decision: action git.merge.protected, target <test task ref>, project stack, spec_path spec/north-star.md, spec_commit that file commit, options yes/no, recommendation no, question '[mos test] row 137 REQ-LAND-1 smoke; nothing can land; the delivery arbiter resolves yes only to test the binding'. Reply with the decision id." --tester --follow
|
||||
scripts/mosaic trail <decision-id> --tester --json
|
||||
```
|
||||
|
||||
- Pass: the trail shows `gated git.merge.protected → pm`, or the live delivery arbiter, with the
|
||||
citation. It is not in Jason's `mosaic inbox`. This is the same route as row 139's step A.
|
||||
- Then: `scripts/mosaic talk pm "[mos test] resolve decision <id> with yes, note 'row 137 binding smoke'" --tester --follow`.
|
||||
- Pass: the trail shows it resolved `yes` by pm, via broker.
|
||||
- Then the coder's next launch in the decision's thread. Tools are fixed at launch, so asking
|
||||
the running coder what tools it has proves nothing.
|
||||
- Pass: its `manifest.json` `typed` has no `land_work`, and `<dataRoot>/bus-host/land/` still
|
||||
doesn't exist.
|
||||
|
||||
Notes for Mos:
|
||||
- `<test task ref>` must be a task ref (`vikunja:<project>/<task>`), since `landHeld` reads only
|
||||
a decision whose raise targeted one. Use an existing `[mos test]` task. If there is none,
|
||||
skip C rather than create one.
|
||||
- The relaunch is Mos's call. The Q134 limit on coder relaunches may still apply.
|
||||
- The approved decision stays resolved and unspent. That is inert: `landHeld` skips any class
|
||||
but `cross-role`, `checkLand` refuses it `not-authorized`, and its class can't change, since
|
||||
`#authorityFor` requires the stored class to equal the current one. land-work refuses it
|
||||
`not-human`. If Mos would rather not leave an approved merge decision in the store, resolve it
|
||||
`no`. Then C shows only that a refused decision gives no tool, which is weaker.
|
||||
|
||||
**D. land-work.sh still lands Sage's work** (the human-only path, unchanged in intent).
|
||||
|
||||
This isn't tied to the re-pin: land-work.sh and scripts/land-work/read.mjs run from the canonical
|
||||
checkout, which has had 137 since f1ee9a989. Use Sage's next ordinary landing. It needs the
|
||||
decision Jason already resolves through the CLI for every landing, and adds no inbox item.
|
||||
- Pass: the landing completes, and the squash on `refactor` has
|
||||
`Resolved <choice> by <by> via the CLI at <time>.`
|
||||
- Pass: the land-work log shows read.mjs's output parsed. Its new `via cli` line is ignored,
|
||||
because land-work.sh's `value()` matches keys exactly (land-work.sh:113).
|
||||
- Not live: land-work refusing an arbiter-resolved decision (`not-human`). The land-work suite
|
||||
covers it (86 tests at the landing gate), and a live attempt would need a second decision.
|
||||
|
||||
I left out:
|
||||
- any step that lands, since none can before 149;
|
||||
- an uncited gated merge raise, which goes to Jason's inbox and shows nothing C doesn't;
|
||||
- any live `land` line.
|
||||
|
||||
## Evidence
|
||||
|
||||
Mos keeps:
|
||||
- A: `manifest.json` `typed`, and whether each launched role's `session.json` names `gitSocket`.
|
||||
- B: the `for-each-ref` output before and after, with R0, R1 and the merge-base exit status.
|
||||
- C, if run: the `talk --follow` output, `trail --json`, and the relaunched coder's `typed`.
|
||||
- D: the squash's Resolved line.
|
||||
|
||||
## Findings from writing this plan, for Sage
|
||||
|
||||
1. **The live smoke for 137 can't reach a landing.** No definition in `roles/` grants
|
||||
git.merge.protected, so every merge decision is `gated` and `landHeld` is false for every
|
||||
role. That holds until row 149 adds merge-gate.
|
||||
- Row 149's smoke plan should carry the first live landing. That landing moves `main` in the
|
||||
live working repository, so it needs Jason's agreement beforehand.
|
||||
- The plan should also check the squash's "as its arbiter, via the broker" line and the
|
||||
RESULT message.
|
||||
2. **The seed declines silently.** When `main` isn't an ancestor of the root's commit,
|
||||
working.mjs:172 returns with no log line, event or refusal, and `main` keeps an older base.
|
||||
- That is the intended effect after a landing, since `main` is ahead of `root`.
|
||||
- It also happens when the owner moves the root backward or checks out another branch there.
|
||||
Before 137 that case reset `main` to the root.
|
||||
- After 137, a coder's next push and a reviewer's next fetch are based on the old `main`, and
|
||||
nothing says so.
|
||||
- No safety problem: nothing is forced, and a landing still checks its base. It's a
|
||||
visibility gap; a host log line naming `main` and `root` would close it. Follow-up, not a
|
||||
137 blocker.
|
||||
3. **An approved gated merge decision is inert, but it stays approved.** Step C leaves one in
|
||||
the store. Nothing can use it (see C).
|
||||
- The trail will show an approved, unspent git.merge.protected decision indefinitely.
|
||||
- If that would confuse a later reader of the trail, resolve it `no`, or skip C.
|
||||
@@ -1086,3 +1086,4 @@ are never rewritten or removed; corrections are new entries.
|
||||
2026-10-16T20:49:49Z | Dewey (Opus 5.5, 84fb346c) | row 137 (#1631) round 4 review | approve on manifest 548ee477 (comment 28816, rev 1613, op dewey-r137-v4): B1 via flows readLanding to landMessage, N1 cls !== 'cross-role', N2 comment, all tested and killed; static read plus Darkwing's logs, nothing run; base drift on docs/TOOLS.md, broker.mjs, cli/README.md (row 150) needs rebase and whole gate before landing
|
||||
2026-10-16T20:51:55Z | Filbert (Opus 5.5, 048f3c63) | row 137 round 5 rebase-only check (#1631, Sage's patch d6cbaaa8 on 435d1c616) | confirmed, comment 28818; static, patch identical to r4 minus index/@@, only cli/README @@ offsets moved; no queue record, no tests
|
||||
2026-10-16T20:58:10Z | Sage (Opus 5.5, 1ef1e4f8) | rows 150 and 137 landed and pushed (63c82f1c4..18aee8fa1); 148 r2 back for quadratic regexes, Mos go withdrawn; #1650 filed | gates 25/25 rc 0 twice; live 3190ad762
|
||||
2026-10-16T21:01:59Z | Dewey (Opus 5.5, 84fb346c) | row 137 (#1631) live smoke plan (sage-0613) | agents/dewey/work/queue-137/SMOKE.md: preconditions (no role definition grants git.merge.protected, so no live role can hold a landable decision before row 149), steps A launch binds no land_work, B seed root ref and main never forced, C optional gated merge gives no land_work, D land-work for Sage; 3 findings; doc only, nothing run, nothing live read
|
||||
|
||||
Reference in New Issue
Block a user