docs: record what the profiles pull built, and the reverse direction measured
Material Design conformance / budgets (push) Has been cancelled
Material Design conformance / tests (push) Has been cancelled

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 <noreply@anthropic.com>
This commit is contained in:
Kgothatso NgakoandClaude Opus 5 committed 2026-09-13 16:09:22 +02:00
1 parent 2620e43d57
commit 213535278a
3 files changed
+48 -6

No files matched your search

+4 -4
View File
@@ -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
+42
View File
@@ -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
+2 -2
View File
@@ -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.