docs(plans): refactor-to-next merge plan and lead decision 66 (sage)
Jason's 2026-10-08 rulings via Mos (thread 1eba59e5). R10: next stays the trunk; the plan pins refactorb8db39cfand next2101c9b4, finds a clean merge-tree, and names the CI gate, approval identity, frozen next-lane publishing, root .mosaic/repo.json, 13 stale v1 PRs and the hardcoded ledger branch as the work. Nothing merged. R8: Path A on the new estate Vikunja meets slice 1 and replaces decision 61's Path B. The runbook's Path A text names the estate instance and the share-only isolation rule. Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
@@ -510,3 +510,14 @@ are never rewritten or removed; corrections are new entries.
|
||||
- 2026-10-05 | rocko | row 37 review opening, lead decisions 62/63 | Opened review at rev 126; expected credential-free post failure recorded at rev 127; README documents cooperative proof escape and S6 isolation obligation; no commit.
|
||||
2026-10-05T21:49:40Z | Dewey (T3 Claude Code, thread 84fb346c) | row 40 S5 #1522, lead decision 63 | recorded LD63 routing of the gap list; verify against the S2 round 2 candidate files (manifest 61519059, broker aa5efbbf): 15 checks 0 failed, check 16 equal on 203 rows; check 16 pin waits for Sage's commit; nothing committed
|
||||
2026-10-05T22:16:03Z | Sage (T3 Claude Code, thread 1ef1e4f8) | S1 and S2 integration | S1 at 2d64c71e (row 36 done) and S2 at 38828a2c (row 37 done) after integration gates in git worktrees, all suites green with live cases; row 43 S2b brief and #1525
|
||||
|
||||
- 2026-10-05 | rocko | S2b row43 / #1525 candidate | 48/48 Node24+26; two mutants killed; eight script suites green, task 26/2 under Docker-disabled live-case boundary; review opened rev136, expected token-free post failure rev137; no commit.
|
||||
2026-10-05T22:23:19Z | Dewey (T3 Claude Code, thread 84fb346c) | row 40 S5 #1522, check 16 pin | check 16 reads packages/bus from commit 38828a2c via git archive (broker aa5efbbf, store e69cb395, schema 179ffe35); verify 15 checks 0 failed 2 N/V, 203 rows equal; 6 stand-in mutants killed; nothing committed
|
||||
|
||||
- 2026-10-05 | rocko | row43 S2b R2, lead decision64 | Shared consumption for all three paths; class-drift refusal; 55/55 Node24+26, six mutants; review opened rev142/request failed expected rev143; no commit.
|
||||
2026-10-05T22:56:12Z | Dewey (T3 Claude Code, thread 84fb346c) | row 40 S5 #1522, S2b repin | check 16 repinned to 4afab552 (broker 44c161c2), verify 15/0 failed/2 N/V, 203 rows equal; finding: S2b refuses an agent message citing its decision (decision-mismatch), reproduced on both commits; SLICE1-VIEWS section 10; reported to Sage; nothing committed
|
||||
2026-10-05T22:58:30Z | Dewey (T3 Claude Code, thread 84fb346c) | row 40 S5 #1522, lead decision 65 | recorded LD65 (decision citation on within-role message.send, S2c row 44); fixture 101/102 kept; waiting for S2c to repin check 16 and update section 10; nothing committed
|
||||
|
||||
- 2026-10-05 | rocko | row44 S2c / #1526 | Within-role citations preserved without consumption; README evidence wording fixed; 58/58 Node24+26, three mutants; eight suites pass, task26/2 Docker-disabled; review opened rev151, expected token-free post failure rev152; no commit.
|
||||
2026-10-05T23:18:04Z | Dewey (T3 Claude Code, thread 84fb346c) | row 40 S5 #1522, S2c repin | check 16 repinned to d27042fa (broker 51e03b33), verify 15/0 failed/2 N/V, 203 rows equal; probe confirms LD65 on d27042fa (citation stored, not consumed); fixture adds message.send action.allowed for 101/102; SLICE1-VIEWS.md section 10 says S2c restores them; no commit.
|
||||
2026-10-08T21:53:57Z | Sage (T3 Claude Code, thread 1ef1e4f8) | Mos 1eba59e5, Jason R1/R5/R8/R10/R17 | merge plan docs/plans/2026-10-08_refactor-to-next-merge-plan.md (pinned b8db39cf/2101c9b4, merge-tree clean); lead decision 66 (next trunk, estate Vikunja Path A replaces LD61 Path B, R1 defaults); runbook Path A text; nothing merged
|
||||
|
||||
@@ -106,11 +106,21 @@ that is yours.
|
||||
|
||||
### Path A, an existing instance
|
||||
|
||||
Mosaic Stack uses this path on the estate instance (lead decision 66).
|
||||
Set `VK` to its HTTPS base URL. Don't use tasks.setspark.io.
|
||||
|
||||
Check that `curl -s "$VK/api/v1/info"` reports `v2.7.0` or later. Use your
|
||||
existing account as the owner.
|
||||
|
||||
The estate instance also holds Launchpad, personal and system projects.
|
||||
A bot sees only the projects shared with it, so section 3 shares the
|
||||
`mosaic-stack` project and nothing else. Never share another project
|
||||
with a `bot-mosaic-stack-*` user.
|
||||
|
||||
### Path B, the bundled instance
|
||||
|
||||
Other installs can use this path. Mosaic Stack's own install doesn't.
|
||||
|
||||
Row S3 ships `packages/tasks/deploy/vikunja/` for this. Until it lands,
|
||||
these commands start the same pinned image the probes used, bound to
|
||||
127.0.0.1:
|
||||
|
||||
@@ -1140,3 +1140,40 @@ which stay with him. Each item names who decided it and what happened.
|
||||
the policy can express. Role authority has no per-target entries,
|
||||
so the broker classifies `message.send` by the sender's role
|
||||
alone. S2c does that, and that's the rule.
|
||||
66. **Jason's 2026-10-08 rulings for the stack: `next` stays the trunk,
|
||||
Mosaic Stack uses the estate Vikunja, and non-gated defaults apply
|
||||
at their deadline (2026-10-08).** Source: Mos, thread 1eba59e5,
|
||||
relaying Jason's rulings R1, R5, R8, R10 and R17. Mos's lane state
|
||||
file holds the full list.
|
||||
- R10: the trunk stays `next`, and `refactor` merges into it. The
|
||||
plan is `docs/plans/2026-10-08_refactor-to-next-merge-plan.md`.
|
||||
Nothing is merged. `next`'s `.mosaic/repo.json` already names
|
||||
`next` as the integration trunk, so no record contradicts the
|
||||
ruling. `refactor` has no root `.mosaic/`; the plan adds one.
|
||||
- R8: one new estate Vikunja 2.7.x instance serves Mosaic Stack,
|
||||
Launchpad, personal and system projects. SetSpark stays on
|
||||
tasks.setspark.io. Path A on that instance meets slice 1, so row
|
||||
35 uses Path A there, and this replaces decision 61's Path B
|
||||
bullet. Decision 61 chose Path B to keep slice 1 off SetSpark's
|
||||
instance, and R8 keeps that separation.
|
||||
- Isolation comes from shares. A bot sees only projects shared
|
||||
with it, and the runbook shares only `mosaic-stack`. The bot
|
||||
names, `bot-mosaic-stack-<role>`, already avoid collisions with
|
||||
a second business on the same instance.
|
||||
- S3's probes still run on a scratch container, never the estate
|
||||
instance. Its first probe, which labels `GET /labels` shows a
|
||||
bot, has to show nothing from an unshared project before the PM
|
||||
bot runs on the estate instance.
|
||||
- S3's one live run writes into the `mosaic-stack` project only.
|
||||
- The bundled path stays in S3 as the REQ-TASK-3 option for other
|
||||
installs.
|
||||
- R1 and R5: when a non-gated item's deadline passes, its
|
||||
recommended default applies and is logged. Gated items wait for
|
||||
Jason: money, credentials and legal; prod infra and prod data;
|
||||
anything sent to people outside the fleet. Product and UX
|
||||
direction isn't gated.
|
||||
- R17: Jason runs `docs/guides/slice-1-identities.md` on 2026-10-09
|
||||
at about 10:30 Central. If the estate instance isn't serving by
|
||||
then, he runs section 1 (Gitea) and leaves sections 2 to 4 for
|
||||
when it is. Don't start Path B as a stopgap, because that makes
|
||||
two Vikunjas and mints bot tokens twice.
|
||||
|
||||
@@ -0,0 +1,154 @@
|
||||
# Merge plan: `refactor` into `next`
|
||||
|
||||
Jason's ruling R10 (2026-10-08, relayed by Mos in thread 1eba59e5): the
|
||||
stack trunk stays `next`, and `refactor` merges into it. Sage writes the
|
||||
plan. Nothing in this file has been executed. No merge has happened.
|
||||
|
||||
## Pinned measurement (2026-10-08)
|
||||
|
||||
| Ref | SHA |
|
||||
|---|---|
|
||||
| `origin/refactor` | `b8db39cf1ec9ffc8958d7966b63f04710e70cb75` |
|
||||
| `origin/next` | `2101c9b4468b22f57b2f02bb2c9da12067225819` |
|
||||
| merge base | `5d2770002612a09ae0cadc129b4ea30619133e8a` |
|
||||
| `origin/main` (not part of this plan) | `7102ccb93e007d98faab3994ea552d03f522ad2c` |
|
||||
|
||||
The merge base is the old v1 head. The 2026-09-07 conversion merged it in
|
||||
as the second parent and moved its tree under `v1/`
|
||||
(`docs/plans/2026-09-07_repository-consolidation-completed.md`).
|
||||
|
||||
- `refactor` is 371 commits ahead of the base. `next` is 1 commit ahead:
|
||||
`2101c9b4`, fred, 2026-09-11, `fix(git-tools): issue-comment.sh resolves
|
||||
API base without monolith GITEA_URL (#1502)`. It changes two files under
|
||||
`packages/mosaic/framework/tools/git/`.
|
||||
- `git diff -M origin/next origin/refactor`: 5,520 paths. 3,491 are v1
|
||||
files renamed into `v1/`, 16 are added under `v1/`, 1,997 are added at
|
||||
the root, 7 root files are renamed and 9 are modified.
|
||||
- `git merge-tree --write-tree origin/next origin/refactor` exits 0 with no
|
||||
conflicts. Result tree `095ce6f8949149f664ab6915cf631fb294871a0c`
|
||||
differs from `refactor`'s tree in exactly the two #1502 files, now at
|
||||
`v1/packages/mosaic/framework/tools/git/`. Rename detection carries the
|
||||
fix into the archive where it belongs.
|
||||
|
||||
The text merge is trivial. The work is everything around it.
|
||||
|
||||
## Conflict areas
|
||||
|
||||
1. **The merge gate can't pass as things stand.** `next` is protected: no
|
||||
direct push, one approval, and the required status
|
||||
`ci/woodpecker/pr/ci`. Woodpecker reads `.woodpecker/` from the PR's
|
||||
head tree. `refactor` has no root `.woodpecker/`, so a PR from it never
|
||||
posts that status. The PR would sit unmergeable unless an admin
|
||||
overrides the check.
|
||||
2. **Approval identity.** Every seat writes to Gitea as `jarvis`. Gitea
|
||||
doesn't count an approval from the PR's author, so if `jarvis` opens
|
||||
the PR, a seat review can't satisfy the one-approval rule. Jason's
|
||||
approval can, and later the slice 1 Gitea reviewer bot can.
|
||||
3. **`next`'s pipelines go quiet.** After the merge `next`'s root has
|
||||
no `.woodpecker/`. Pushes to `next` stop publishing
|
||||
`@mosaicstack/mosaic@next` and the next-lane gateway, web and
|
||||
appservice sha images. Nothing fails. The dist-tag and images freeze
|
||||
at the last v1 build. Anything that auto-deploys next-lane images
|
||||
stops updating. That's prod infra, so Jason confirms nothing live
|
||||
depends on it before the merge.
|
||||
4. **`.mosaic/repo.json` moves.** On `next` it sits at the root and says
|
||||
`integration_trunk: next`, `release_branch: main`,
|
||||
`flow: trunk-release`. `refactor` has it only at `v1/.mosaic/`. Nothing
|
||||
in it contradicts R10, so there's nothing to correct. But R14's
|
||||
enforcers read `<repo>/.mosaic/repo.json`, and after the merge `next`
|
||||
has none at the root. The landing order adds one.
|
||||
5. **Thirteen open PRs go stale.** Twelve target `next` and one targets
|
||||
`main`. All are on the v1 tree, the newest from 2026-09-11. After the
|
||||
merge their paths no longer exist at the root.
|
||||
|
||||
| PR | Author | Title (short) |
|
||||
|---|---|---|
|
||||
| #1491 | orch-01 | PRD rev1 ratification |
|
||||
| #1469 | code-be-01 | config minimal-subset |
|
||||
| #1431 | fred | gateway bootstrap advisory lock |
|
||||
| #1370 | code-infra-01 | credentials Gitea seat slots |
|
||||
| #1367 | fred | mint-seat-credential.sh |
|
||||
| #1315 | fargo | RI-050 release evidence |
|
||||
| #1291 | fargo | identity-first principal resolution |
|
||||
| #1281 | Ghost | vetted user store (W-F4) |
|
||||
| #1268 | Ghost | unattended identity first start |
|
||||
| #1259 | Ghost | enumeration guard scope |
|
||||
| #1213 | Ghost | HARNESS-HOMES fleet MVP |
|
||||
| #1192 | Ghost | fail closed on invalid launch inputs |
|
||||
| #1054 | Ghost | installer state machine (base `main`) |
|
||||
|
||||
6. **Hardcoded `refactor`.** `packages/ledger/src/ledger.mjs:37` reads
|
||||
`git log refactor`. Prose in `AGENTS.md`, `docs/plans/CONDUCTOR.md`,
|
||||
`docs/plans/CURRENT.md` and the queue's genesis log names `refactor`
|
||||
as the working branch. The genesis log is append-only history and
|
||||
stays as written. The rest changes in the cutover commit.
|
||||
|
||||
## Landing order
|
||||
|
||||
Each step is a separate act. Steps 1 to 3 happen on `refactor` under my
|
||||
existing push authority. Steps 4 and 5 are Jason's.
|
||||
|
||||
1. **Add PR CI to `refactor`.** A `.woodpecker/ci.yml` triggered on
|
||||
`pull_request` and `manual`, so its status context is
|
||||
`ci/woodpecker/pr/ci`. It uses a digest-pinned `node:26` image, runs
|
||||
`npm ci`, every `node --test packages/*/tests/*.test.mjs` and the
|
||||
`scripts/test-*.sh` suites that need no Docker or provider login. The
|
||||
two live-provider assertions in `test-task.sh` skip under an explicit
|
||||
flag that CI sets and the suite reports as a skip. New queue row,
|
||||
Darkwing reviews.
|
||||
2. **Add root `.mosaic/repo.json`.** Same content as `next`'s, with the
|
||||
notes updated to cite R10. Hold this step until the T235 enforcer
|
||||
lands and its handling of a repo with this file is checked. An
|
||||
enforcer that reads `integration_trunk: next` while `refactor` is
|
||||
still the working branch must not block step 3.
|
||||
3. **Back-merge `origin/next` into `refactor`.** One merge commit,
|
||||
proven clean above. Re-run `merge-tree` against the then-current
|
||||
`origin/next` first, since `next` can still move. Full integration
|
||||
gate, then push. After this, `refactor` contains all of `next`.
|
||||
4. **PR `refactor` into `next`, fast-forward only.** `refactor` already
|
||||
contains `next`, so the fast-forward style applies. `next`'s head
|
||||
becomes a SHA that passed our gate, with no new commit. Every SHA
|
||||
cited in run records, review records and queue rounds keeps
|
||||
resolving. Squash and rebase are ruled out because they would break
|
||||
those citations. Jason approves and merges (R2).
|
||||
5. **Dispose of the thirteen v1 PRs.** Recommended default: close each
|
||||
with a comment pointing to `v1/` and this plan. Closing them changes
|
||||
nothing outside the fleet, so under R1 the default applies at its
|
||||
deadline unless Jason rules otherwise.
|
||||
6. **Cutover commit, first PR on the new trunk.** Point the ledger at
|
||||
the trunk named in `.mosaic/repo.json`, not a hardcoded branch.
|
||||
Update `AGENTS.md`, `CONDUCTOR.md` and `CURRENT.md`. Freeze
|
||||
`refactor`: keep the ref, push nothing more to it.
|
||||
|
||||
## How slice 1 rows retarget
|
||||
|
||||
- Open rows: 35 (SR, waiting on Jason), 38 (S3), 39 (S4), 40 (S5), 41
|
||||
(S6), 42 (S7). Also row 13 (ledger queue section, in review).
|
||||
- Before step 4: rows land on `refactor` exactly as they do today. A row
|
||||
in review when step 3 starts finishes on `refactor` first, so nothing
|
||||
straddles the cutover.
|
||||
- After step 4: each row's candidate lands on a branch `slice1/<row>-<slug>`
|
||||
cut from `next`, opened as a PR into `next`. The seat review stays on
|
||||
the row's issue as now. The PR adds CI and Jason's approval and merge.
|
||||
Briefs, issues and queue rows don't change. Packet base SHAs stay valid
|
||||
because `next` contains `refactor`'s history.
|
||||
- S7 needs this anyway. Its coder bot opens pull requests against the
|
||||
integration trunk, and `.mosaic/repo.json` names `next`. Step 4 has to
|
||||
land before S7 starts.
|
||||
- Cost: every row after the cutover needs a Jason merge. That's five
|
||||
merges for S3 to S7, plus fix rounds. Decision 62 already gates each
|
||||
S7 coder-bot merge, so S7 adds no new kind of ask.
|
||||
|
||||
## What Jason decides
|
||||
|
||||
- When to merge (step 4), and the approval and merge themselves.
|
||||
- Whether anything live consumes next-lane images or the `@next`
|
||||
dist-tag (conflict 3). Prod infra, gated under R5.
|
||||
- Push authority for `slice1/*` feature branches as `jarvis`. Today I
|
||||
may push only to `refactor`.
|
||||
- If he'd rather not wait for step 1, an admin override of the missing
|
||||
status check instead. I don't recommend it. It merges 371 commits with
|
||||
no CI run on the protected branch.
|
||||
|
||||
`main` is out of scope. It stays the v1 release branch until a separate
|
||||
release ruling.
|
||||
Reference in New Issue
Block a user