Eleven commits reached the fork after the second pull had landed, and this note is their inventory, verdicts and record: the profile-preview line pulled whole, the extended-FAB sweep pulled with its seven removed screens resolved as still deleted, and d2a4298d -- one commit half in the curated-entries line Mantra took out and half in the broadcast line it kept -- pulled in part, by a PARTIAL rule that applies the kept paths and writes the rest into the note. Three things differed from the pulls before it and are set out: a brand token the normaliser could not see, NotYetOnCurare, fixed by a rule and a second rewrite that left the earlier forty-nine commits hash for hash the same; a merge whose join files carried only the dropped half, so that for the first time a join was not taken from the merge; and two conflicts the compiler found where git saw none, an import Mantra's projects section still needs and a jvmTest fixture recreated reduced to the room so that an upstream test lands byte for byte. The record is two phases: jvmTest 871 -> 909 -> 914, testDebugUnitTest 420 -> 424, every audit budget met at both cuts, the schema unchanged at version 20, and an exactness check whose every movement is named. The README gains the row and a sentence; the second plan points forward. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
7.7 KiB
The third pull: the profile preview, the extended FAB, and half of a commit
Eleven commits reached curated/curated on 2026-09-13, after the
second pull had landed — ten ordinary and one merge,
29027f2b..272b6316 — and they sat unpushed in a local clone long enough to be asked
about. This is what they are, which of them Mantra took, and the three places this pull
differed from the two before it. It assumes the first plan's
method and the second's exactness check, and says only what changed.
Built 2026-09-13, the day they were pushed: eight commits landed whole, one in part,
one merge as nothing, in two phases, at jvmTest 871 → 914 and testDebugUnitTest
420 → 424 with every audit budget met.
The inventory
| line | commits | what | verdict |
|---|---|---|---|
| A profile preview before a chat — npub-profile-preview.md | db268a53 plan · 37c6f7ea 8973c005 923b59ec d6490985 · b3bcc060 record · 80735df8 · 272b6316 |
ProfilePreviewScreen and its view model, with DirectMessagePeerSync behind the button's readiness; the new-chat dialog opens the person instead of starting the chat; the button knows whether a room with them already exists; the preview's action is the app's extended FAB; a member row on the group's screen opens the preview |
pulled, all eight |
| One extended FAB for every primary action | ca6c16be |
ExtendedFab, and twenty screens moved onto it — thirteen of them Mantra's, including AddArtifact, AddChapter, AddDialect, AddTranslationArtifactVersion, TranslateChunk, DkgRitual |
pulled; the seven screens Mantra does not have resolve as still deleted |
| Broadcast every accepted entry | d2a4298d |
a Broadcast all on the curated-entries screen, and — to make it — sendToRelays lifted into BroadcastGroupSignedEventViewModel's companion, a RelayOutcomeLabel widget, and the broadcast screen reading it |
pulled in part: the broadcast half; the entries half is line D |
| the merge | f4b0347e |
the preview branch joining curated |
lands as nothing; its two join files carried only line D's side, see below |
Three things that differed
1. A brand token the normaliser did not know
The preview's view model names a readiness state NotYetOnCurare. \bCurare\b cannot
see a brand with no word boundary in front of it, and the first rewrite left seventeen
of them across the code, the tests and the note. The fix is a rule, not an edit —
(?<=[a-z0-9])Curare(?=[A-Z]|\b) → Mantra, for the Curare generation only, since a
CamelCase-embedded Curated is product vocabulary at the tip — and a second rewrite:
zero tokens left, and the earlier forty-nine rewritten commits came out hash for hash
the same, so nothing already landed was disturbed. 0728f3f9.
2. Half of a commit, taken as a partial pick
d2a4298d is one commit in two lines. Its button, view model, state, tests, five strings
and nav-host wiring belong to the curated-entries screen, which Mantra took out; but the
send it lifted out of the broadcast screen into sendToRelays, the widget that turns a
relay's answer into words, and the screen reading it are the broadcast line Mantra kept,
and they touch only files both trees hold. Dropping the commit whole would have left four
shared files differing from the fork's and put the FAB commit, which edits the same
screen, on a base the fork's never had. The driver gained a PARTIAL rule: the diff
restricted to the kept paths, applied and committed under the original message and
trailer, with what was left out written into the note. b3379f81, and the FAB commit
then applied to the screen cleanly.
What this does to the merge: f4b0347e's two join files, strings.xml and the nav
host, carried the preview side's additions — which the preview commits had already
brought — plus d2a4298d's entries strings and wiring. So the merge was not a source of
anything Mantra wanted, and for the first time a join's files were not taken from the
merge. The residual records the difference exactly: five strings and their comment, and
two nav-host hunks, one of which is a comment that says "as the entries screen is for
its Broadcast all" where Mantra's still says "the one screen", which on Mantra is true.
3. Two conflicts the compiler found, not git
Both in 272b6316, which applied without a textual conflict.
- Upstream's
ChatRoomDetailScreenhad no use left forImplementationPendingRouteonce808a3459dropped the library, dialects and projects sections, so the commit removes the import. Mantra kept the sections, and its projects section still routes Add new project through that import. Kept, with the reason in the commit. - The test it adds,
ChatRoomMemberRowJvmTest, composes the screen againstGroupSignedWorkFixtures, a jvmTest fixture that went with lines B, D and H. The test uses three of its members — the room id, the active key,localChatRoom()— and none of the signed work. The fixture is recreated on Mantra reduced to the room alone, under the same names, so the test lands byte for byte and the next upstream test written against the room compiles here too. It is the one file this pull turned from upstream only into both have, differently.
The seven modify/delete conflicts at ca6c16be were the expected kind and resolved by
rule: AcceptCuratedSuggestion, AddGroupPost, EditGroupCuratedSchema,
EditGroupNostrProfile, EditGroupRelays, GroupCuratedEntries,
ProposeGroupEvent — all still deleted.
The record
| Phase A — the preview line to its record | Phase B — the broadcast half, the FAB, the two on top | |
|---|---|---|
| commits | 69aa43a1 f84ae133 39c056a2 5ba888d9 2adc5036 a8ba589e |
b3379f81 (partial) 883bf1c8 (seven deletes) e66c174b 4899dcbc (two hand fixes) |
| picks | 6 clean | 1 partial, 1 by rule, 2 clean |
| exactness | 139 residual files before and after; nothing moved | 140; moved: strings.xml (the five strings), MantraNavHost.kt (the two hunks), ChatRoomDetailScreen.kt (one import), GroupSignedWorkFixtures.kt (recreated); twelve upstream-only files changed upstream, all of them line D's or the removed screens' |
| compile | both targets clean | both targets clean |
jvmTest |
871 → 909 | 909 → 914 |
testDebugUnitTest |
420 → 424 (DirectMessagePeerSyncTest) |
424 |
| audit | all budgets met; composable literals 30 | all budgets met; 30 |
strings.xml |
455 → 460 | 460 |
| schema | unchanged, v20 | unchanged, v20 |
The rewrite: 60 commits in 128 s, twice. The library pin: 84cc44c throughout.
What the user gets
A member's row on a group's screen, and the person a new chat is started with, open a profile preview: the cached profile at once while the relays refresh it, and one button that says whether a chat with them exists, can be started, or cannot yet because they have not set up messaging on Mantra. And one extended FAB, the same shape and the same disabled state, on every screen whose primary action used to spell it its own way — including the translation screens Curare kept and fixed.
What is left
- The other half of
d2a4298dis line D and stays out; the residual names its lines. - The reverse direction.
ExtendedFaband the preview are now identical on both trees; the only Mantra-side edits in this pull are the kept import and the reduced fixture, neither of which the fork wants. Nothing new to offer upstream from here. - The fork decision stands as the first plan left it. Three pulls in one day with the tooling in place cost minutes each of machine time; each also found one thing — a pin, a CamelCase brand, a commit in two lines — that a rebrand-free fork would not have had to find.