From 213535278aa1e3d7f742a0ff5143a2779056a7f5 Mon Sep 17 00:00:00 2001 From: Kgothatso Ngako Date: Sun, 13 Sep 2026 16:09:22 +0200 Subject: [PATCH] docs: record what the profiles pull built, and the reverse direction measured The plan's top now says it was built, the same day it was written: the ten commits in four phases at the dry run's numbers exactly, Phase 6's two native items done, and its other three -- pushing the removal, the two reverse-pulls, the fork decision -- named as the user's. Phase 6 gains its own Built paragraph: what the refusal changed and did not change in the DAO's welcome branch, the four re-pointed anchors, and a measurement the plan had only asserted -- that a Mantra commit offers itself to the fork cheaply. git format-patch on the refusal commit, four inverse rules over the patch text, and git apply --check on a scratch worktree of curated/curated at 29027f2b: it applies cleanly, five files. That is the shape a normaliser running the other way would take, and it is recorded so the fork can take the commit in seconds rather than by hand. The README's reading-order sentence and the first plan's pointer say "built" where they said "planned". Co-Authored-By: Claude Opus 5 --- docs/README.md | 8 +++--- docs/curated-to-mantra-profiles.md | 42 ++++++++++++++++++++++++++++++ docs/curated-to-mantra.md | 4 +-- 3 files changed, 48 insertions(+), 6 deletions(-) diff --git a/docs/README.md b/docs/README.md index 036e24fb..fd5cf254 100644 --- a/docs/README.md +++ b/docs/README.md @@ -46,10 +46,10 @@ alone, except that its first decision leans on the derivation note's one rule. T the lines it pulled -- the group's nostr identity and the curated lists -- were taken out again the same day, and its record says what went and what stayed. The nsec and npub sign-in notes arrived with it and record what they built. The profiles pull note -is the same exercise a second time, planned with its dry run already done; read it -after the first, because it assumes the method and the three decisions and only says -what changed — chiefly that the tree is no longer a superset, and what the check for an -exact pull becomes when it is not. +is the same exercise a second time, planned with its dry run already done and built +the same day; read it after the first, because it assumes the method and the three +decisions and only says what changed — chiefly that the tree is no longer a superset, +and what the check for an exact pull becomes when it is not. The nsec sign-in note is a phased plan that has been built; it inherits the key-storage decision from the jvm-target note and drives the navigation state machine `NavigationViewModel.processLocalAccount` implements, so read it with the diff --git a/docs/curated-to-mantra-profiles.md b/docs/curated-to-mantra-profiles.md index c57504db..6ff8936d 100644 --- a/docs/curated-to-mantra-profiles.md +++ b/docs/curated-to-mantra-profiles.md @@ -16,6 +16,16 @@ lessons; this document assumes both and adds what changed. The one rule everythi still rests on is the derivation note's: two strings in this tree are hash inputs and are never renamed, and the normaliser cannot touch them by construction. +**Built 2026-09-13**, the same day, on the branch that carries this plan: the ten +commits landed by cherry-pick in four phases, each with a `Pulled-From` trailer, at +the dry run's numbers exactly; the phases below carry a *Built* paragraph each with +what was measured at the cut. Phase 6's two native items are done — the refusal of a +Welcome for a group another profile holds (`679d5249`), and the note's four line +anchors (`2620e43d`) — and its other three are the user's: pushing the removal, the +two reverse-pulls into the fork, and the fork decision. The reverse direction was +measured rather than assumed: the refusal commit, rewritten into the fork's names by +four inverse rules, applies cleanly to `curated/curated` at `29027f2b`. + Written against `mantra` at `776455ec` — `origin/mantra` at `0fa807a6` plus the removal commit, which is where this plan starts and which `origin` does not yet carry — and `curated/curated` at `29027f2b`. Dry run executed 2026-09-13. @@ -535,6 +545,38 @@ Five things, none of them a merge. which is best; it only shows that the third is affordable for as long as the fork's work stays clear of what Mantra took out. +**Built 2026-09-13**, items 1 and 2; items 3 to 5 are not this repository's to land. + +*Item 1*, `679d5249`. The DAO's welcome branch already declined to overwrite an +existing room — "Chat Room already exists", at warning level — so the joiner's MLS state +never replaced the holder's; what it could not do was tell a redelivered Welcome for our +own room from a Welcome for a room another profile holds, and it told nobody about +either. The branch now reads the room's `userPublicKey`: the same profile's redelivery +stays a quiet no-op, and another profile's Welcome is refused with a warning naming +both keys and a membership line written into the room that exists — the holder's, +since it is the only room on the device the group has and the holder is the one who +can act. `TYPE_WELCOME_REFUSED_OTHER_PROFILE`, in `MEMBERSHIP_TYPES`, error tint, +`PersonOff`; the content names inviter, invitee and holder. The key package bundle is +left unconsumed as the branch always left it. The test is two databases with a real +MLS group, a key package whose private keys the invitee's side holds — the fixture +now returns the bundle beside the public package — and a Welcome sealed as the app +seals one; three cases, refused, redelivered, joined. `jvmTest` 868 → 871. + +*Item 2*, `2620e43d`: the four anchors re-pointed at Mantra's lines — `:404`, `:741`, +`:537`, `:118` — each still landing on the thing its sentence describes. + +*Item 4, measured.* `git format-patch -1 679d5249`, four inverse rules over the +patch text (`press.mantra.` → `to.curare.`, `press/mantra/` → `to/curare/`, +`mantra.composeapp.generated.resources` → `curare.…`, `MantraDatabase` → +`CurareDatabase`), and `git apply --check` on a scratch worktree of `curated/curated` +at `29027f2b`: applies cleanly, 5 files, +360 −6. That is the whole cost of offering +a Mantra commit to the fork while both trees hold the touched files identically — +and it is also the shape a `curated-rebrand.py`, the normaliser's inverse, would +take if the fork wanted to pull regularly rather than by hand. + +*Items 3 and 5* are unchanged from the plan: two small commits in the other +repository, and a decision. + ## Risks, and the silent ones in particular **The write on first launch.** Phase 2's repair is the first time a pull has changed a diff --git a/docs/curated-to-mantra.md b/docs/curated-to-mantra.md index 5b4d2a32..7f168840 100644 --- a/docs/curated-to-mantra.md +++ b/docs/curated-to-mantra.md @@ -61,8 +61,8 @@ The upstream moved before this landed: `curated/curated` went from `86cb876b` to `29027f2b`, ten commits for several profiles on one device, one of them the fork's first schema migration (version 20). They are the next pull, and the schema change is why they get their own decision rather than a ride on this one — which is -[curated-to-mantra-profiles.md](./curated-to-mantra-profiles.md), planned and dry-run the -same day. +[curated-to-mantra-profiles.md](./curated-to-mantra-profiles.md), planned, dry-run and +landed the same day. Written against `origin/mantra` at `ba26c0b1` and `curated/curated` at `86cb876b`; executed on 2026-09-13.