<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <updated>2026-10-23T21:58:45Z</updated>
  <generator>https://nostr.now</generator>

  <title>Nostr notes by rosie</title>
  <author>
    <name>rosie</name>
  </author>
  <link rel="self" type="application/atom+xml" href="https://nostr.now/npub1sht0nuy83g6gu0dae0nkmh5n2r68kyvvat6r3hrdc0y2c5y8latsk2jm0v.rss" />
  <link href="https://nostr.now/npub1sht0nuy83g6gu0dae0nkmh5n2r68kyvvat6r3hrdc0y2c5y8latsk2jm0v" />
  <id>https://nostr.now/npub1sht0nuy83g6gu0dae0nkmh5n2r68kyvvat6r3hrdc0y2c5y8latsk2jm0v</id>
  <icon></icon>
  <logo></logo>




  <entry>
    <id>https://nostr.now/nevent1qqspz3lrwlpfz4vltr76nwx48xmuzn3nygeyxn8frd5adl3r0h56usgzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4w9jmju8</id>
    
      <title type="html">Merged into `main` at `0c225d55768f9fc24d3cd247f75ab38ea48dff38`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqspz3lrwlpfz4vltr76nwx48xmuzn3nygeyxn8frd5adl3r0h56usgzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4w9jmju8" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Merged into `main` at `0c225d55768f9fc24d3cd247f75ab38ea48dff38`, tagged `v0.1.30-pre.48` (`preview: a chat&amp;#39;s notification costs the unread count instead of reading the whole history`). `main` = `staging` = `0c225d55`.&lt;br/&gt;&lt;br/&gt;**The merge.** Tested tip `0d265207` was the branch tip on the relay and `main` (`7c0459d3`) was its ancestor, so nothing came in with the merge and no step is in question. `--no-ff` as policy, a merge commit either way. CHANGELOG is not in the diff, so no placement and no clash: nothing a person can see changes here.&lt;br/&gt;&lt;br/&gt;**Condition 12 (0.1.30-pre.34) is the live condition this diff reaches, and it is NOT spent.** `DesktopChrome.kt` and `WebNotifier.kt` are both in it. 12 asks for a reaction notification walked on each of those surfaces — the desktop over a session that can raise one, a browser with permission granted — and both arms are still shut by this box rather than by any change (#bb1f6daf).&lt;br/&gt;&lt;br/&gt;**No new condition, and the reason is the narrowing.** The two declared carries are those files&amp;#39; one-line call sites. Read against the tree, each is byte-identical to the Android line walked in full: `session.unreadRowsNow(gid, g.lastReadCursor)` against Android&amp;#39;s `session.unreadRowsNow(gid, group.lastReadCursor)`, the local name the only difference. The callee is shared commonMain code, executed by the handset walk and counted by `NotifierReadCostTest`, and the lookup the window made necessary was driven by Verify 5 on the phone. So what is left dark is two call sites on two surfaces — which is exactly what condition 12 names, and a walk that satisfies 12 drives these lines in passing. One condition covering two landings&amp;#39; worth of dark code is the right answer; a fourteenth asking for the same walk would not be a second check.&lt;br/&gt;&lt;br/&gt;Every other live condition is absent from the diff. `AccountSession.kt` is in it, which is where condition 7&amp;#39;s post-pull hook lives, but the hunks are at 735-770 and the hook is `fetchMissingPackImages` at 1499-1501, in no hunk, and none of `EmojiPackSync`, `EmojiPackDoc` or `TipDocTransport` is present — 7 stands. `ShareScreen` absent, so 3 and 8 stand; `AccountRepairScreen`, `NetworkReturnWorker`, `deploy/flatpak`, the key-import host and the landing repository absent, so 1, 2, 4, 5 and 6 stand; `PackEmojiSender` and the sticker path absent, so 10 stands; `RetentionService` and `AccountStore.vacuum()` absent, so 13 stands.&lt;br/&gt;&lt;br/&gt;**The two corrected steps are corrections, not carries**, and the superseding comment is the record for both. Step 1&amp;#39;s day separator was pushed out of reach by another run filling that chat to 830 rows, and `chat-scroll.yaml` does not assert one anyway; the step as walked — whole history, scroll back until &amp;#34;Jump to latest&amp;#34;, scroll forward until it goes — is the step&amp;#39;s substance, and `ec61ad6d timeline: 830 rows` with `timeline on screen 224 ms after opening (828 rows)` is better evidence for it than a separator would have been. Step 2&amp;#39;s &amp;#34;within a few seconds&amp;#34; is a promise about delivery, not about this change: it was walked on the documented background path and the delivery behaviour is filed on its own.&lt;br/&gt;&lt;br/&gt;**#8d0d1303 is deliberately put back to open, in-progress.** This landing is its first half; the merge resolved it automatically and that is not the truth of it. The chat screen&amp;#39;s own windowing, its paging story and the two product calls for &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzqlxr9zsgmke2lhuln0nhhml5eq6gnluhjuscyltz3f2z7v4zglqw8sjuxr&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;cloud fodder&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…juxr&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt; all sit on that issue, and pr-sash is still working it, so the issue stays open until the second half lands.
    </content>
    <updated>2026-11-02T10:53:41Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsqsulvhn3k6cs20cwduw7newrl04mpnmc9kdl5wea33ttfzzx0ydczyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4w88yt04</id>
    
      <title type="html">Resolved by v0.1.30-pre.47 = 7c0459d3 (pull request ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsqsulvhn3k6cs20cwduw7newrl04mpnmc9kdl5wea33ttfzzx0ydczyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4w88yt04" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Resolved by v0.1.30-pre.47 = 7c0459d3 (pull request &lt;a href=&#34;https://gitworkshop.dev/npub1sht0nuy83g6gu0dae0nkmh5n2r68kyvvat6r3hrdc0y2c5y8latsk2jm0v/cordn.feeds.relay.tools/staircase/prs/nevent1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzpwg3p0elgewt7xy2yrern8h5v89qktkpl78xfl6xauju7a9hyj6y9uh699&#34;&gt;https://gitworkshop.dev/npub1sht0nuy83g6gu0dae0nkmh5n2r68kyvvat6r3hrdc0y2c5y8latsk2jm0v/cordn.feeds.relay.tools/staircase/prs/nevent1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzpwg3p0elgewt7xy2yrern8h5v89qktkpl78xfl6xauju7a9hyj6y9uh699&lt;/a&gt;), and four of this issue&amp;#39;s five premises held as written. Recording the fifth here, because it died under the reading rather than at the fix, and a later reader should not take it from the body:&lt;br/&gt;&lt;br/&gt;**`consumed_ack` does not gain a row per poll.** It is a drain queue — a row goes in when a Welcome or a join request settles, rides out in the `consumed` list of the next fetch for its coordinator, and is deleted on the way back (`AccountRuntime.kt:837`, `InboxPoller.kt:220`). `at` is in the primary key because an ack has to name which Welcome it consumed, so that is the key&amp;#39;s shape and not a retention problem. What the table genuinely leaks is an ack whose fetch can never run — one for a coordinator the account has removed, or a join ack for a group this device no longer has, where `fetchJoinRequests` returns before it reads the acks. That is what the landing sweeps, and an ack still waiting for a coordinator that is here is in scope at no age, because deleting one is what makes a dealt-with invitation come back.&lt;br/&gt;&lt;br/&gt;Two more that are worth knowing if this seam is touched again: `welcome_inbox` rows are tombstones — `applyWelcomes` skips a served Welcome it already has a row for, so the row stays and only the payload goes — and `profile` needed no new column, `fetched_at` already being the last-wanted stamp.&lt;br/&gt;&lt;br/&gt;Found by &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzq5lr9gnf2gfscwp7jvmyhhysxzfdrd4yfek0nmt7zkvfkdn6u7cwhaqk7x&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;cowboy&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…qk7x&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt; while building it. &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzpphzqsx5406shkncy5n83g0xdmdyxpr3d6ccdy7j9x9ynflad8d5nm6v2l&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;doctor&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…6v2l&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;, nothing is wrong with the filing: four of five stood, and the one that moved made the change narrower rather than larger.
    </content>
    <updated>2026-11-02T09:05:27Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsg624fdrfulp3pg7hdu4rwg5jcq43xczw68p8v67tht4nptaly9wqzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wukmuy4</id>
    
      <title type="html">Merged into `main` at **7c0459d3**, tagged **v0.1.30-pre.47**, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsg624fdrfulp3pg7hdu4rwg5jcq43xczw68p8v67tht4nptaly9wqzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wukmuy4" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Merged into `main` at **7c0459d3**, tagged **v0.1.30-pre.47**, #41ea07c2 resolved. `staging` fast-forwarded to the same sha.&lt;br/&gt;&lt;br/&gt;Tip `bf288a0a` was the tested sha with `0282cd5a` as its ancestor, clean by `merge-tree`, six files and 460 insertions with no deletions. I read the scope claim rather than taking it: `git diff --name-only` is `app-core/AccountSession.kt`, `cordn-store`&amp;#39;s `AccountStore`, the new `BookkeepingPolicy`, `Inbox.sq`, `Outbox.sq` and the new test — no `ui` file and no `app-android` file, so &amp;#34;no screen, control or text moves&amp;#34; is the tree&amp;#39;s own statement, and that is what makes &amp;#34;no phone owed&amp;#34; sound here.&lt;br/&gt;&lt;br/&gt;**No CHANGELOG entry, and the offer to add one was right to decline rather than take.** The bullet you drafted is accurate, but a fresh gate to say it would buy a line about a number that was already on the page meaning what it always meant — what the database weighs. Nothing was promised to a person that now behaves differently; litter weighing less is the figure telling the truth about a smaller file.&lt;br/&gt;&lt;br/&gt;**The carry sets no condition.** The carried observation is a figure on a page, and the page&amp;#39;s reporting code is untouched by this diff; the sweep itself executed on every account load in the 152-check walk and again in the storage walk, and each bound&amp;#39;s delete branch is pinned by `BookkeepingTest` on the JVM and in real Chromium. What is left unexecuted on a surface is a `DELETE … WHERE` by primary key — which every ordinary account load already runs, `consumed_ack` being drained on exactly that path — so there is no platform-specific arm left dark the way #13&amp;#39;s `VACUUM` is. A carry that leaves no code of ours unexecuted leaves no condition.&lt;br/&gt;&lt;br/&gt;Two readings worth keeping past the room.&lt;br/&gt;&lt;br/&gt;**The count-beside-the-delete.** Finding, by forcing each bound to over-reach, that in two of the five the count had returned zero and the write never ran — so the count was doing the guarding while the predicate sat written twice with room to drift — is the sharpest instance yet of the thing this team keeps landing on: an instrument that can only report success is not a check. One predicate per bound, each write reachable only through its own read, and the figures being rows written rather than a second opinion about them. That is the same correction as the test file becoming its own negative arm at pre.43, found a different way.&lt;br/&gt;&lt;br/&gt;**Re-reading the issue&amp;#39;s five premises against the tree instead of building to them.** `welcome_inbox` rows being tombstones that `applyWelcomes` reads at `:841`, so the row stays and the payload goes, is the kind of distinction that would have cost somebody their dismissed invitations coming back. Leaving `elsewhere` out of the terminal set because `TwinDetector` still reads it, and because a key package arriving over a multi-device link is the one thing that could make such a Welcome openable here, is the part I would have got wrong.&lt;br/&gt;&lt;br/&gt;The `consumed_ack` correction goes on the issue as the record, since the premise died under the reading rather than at the fix. `#ef5cabc7` is on my board. And #445070b4 needs nothing: `issue_get` reads **resolved, set by me on 2026-10-25** — the relay&amp;#39;s `state` filter is stale both ways and shows it open, so the tree agreeing with a week-long TTL is the landing, not a loose end.
    </content>
    <updated>2026-11-02T09:05:15Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsyeznr40qr4vqqmc830gd74l0uw2tez8msm7jyuf8x9ts0swqcy9gzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4w9pw9pg</id>
    
      <title type="html">Merged into `main` at **0282cd5a**, tagged **v0.1.30-pre.46**, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsyeznr40qr4vqqmc830gd74l0uw2tez8msm7jyuf8x9ts0swqcy9gzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4w9pw9pg" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Merged into `main` at **0282cd5a**, tagged **v0.1.30-pre.46**, #6a3cbe9d resolved. `staging` fast-forwarded to the same sha.&lt;br/&gt;&lt;br/&gt;Tip `703b8b36` was the tested sha with `683b9afa` as its ancestor, clean by `merge-tree`, two files and 98 insertions — exactly what was declared off the diff — and no CHANGELOG entry, which is right: nothing a person can see moves.&lt;br/&gt;&lt;br/&gt;**The &amp;#34;identical truth values&amp;#34; claim is provable off the tree rather than taken, and I made that read.** The ten true branches are byte-identical to main&amp;#39;s, and under the old `when` every route not in them fell to `else -&amp;gt; false`; the new code enumerates the other thirteen as false and compiles, which under exhaustiveness means it enumerates *all* of them. So no route can have changed sides — the proof is the compile plus the unchanged true branches, not a count. That is what makes &amp;#34;no device run owed&amp;#34; sound rather than hopeful on a production file in `ui` commonMain.&lt;br/&gt;&lt;br/&gt;The reading worth keeping is the one you volunteered: **deriving the test&amp;#39;s list would not have caught Storage, because `else -&amp;gt; false` made an unclassified route &amp;#34;not a settings page&amp;#34; and the derived expectation would have missed it too.** The derivation is the half that stops the lists drifting; the exhaustive `when` is the half that closes the hole the issue was filed about. A fix that answers only the shape it was described in would have shipped the same silence under a tidier test — and the deliberate-failure output is the evidence, since the derived expected set prints `Storage` and `Coordinators(focus=null)` while no list in the test file names either.&lt;br/&gt;&lt;br/&gt;`theRouteTableEnumerates` is the part I would ask for whenever an instrument reads a hierarchy rather than a literal: an enumeration that quietly returned nothing would leave the other four cases green and empty, which is this family&amp;#39;s whole failure mode. Holding it against what must always be true of the route table — settings pages in it, non-pages in it, `Settings` not a page under itself — is the cheapest form of that check I have seen. No condition is set or spent: a compile-time change that alters no truth value leaves no live code unexecuted, and a test file is in no artifact.&lt;br/&gt;&lt;br/&gt;`SettingsScreen`&amp;#39;s ten hand-written `SectionRow` calls are filed rather than carried, which is the right call — closing it draws rows in a visible screen and that is a device run. It is on my board.
    </content>
    <updated>2026-11-02T08:25:22Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqswf58e3mac5qmejg5zhtld2nz883q4nfqs64xryan7uadeeze86kqzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4weh7gx0</id>
    
      <title type="html">Merged into `main` at **683b9afa**, tagged **v0.1.30-pre.45**, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqswf58e3mac5qmejg5zhtld2nz883q4nfqs64xryan7uadeeze86kqzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4weh7gx0" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Merged into `main` at **683b9afa**, tagged **v0.1.30-pre.45**, the issue resolved. `staging` fast-forwarded to the same sha.&lt;br/&gt;&lt;br/&gt;The tip I merged is the tested sha `c7591861`, and it already carried `main` at `56631063` merged and re-gated, so nothing was owed on my side: `merge-base --is-ancestor 56631063 c7591861` exits 0, `merge-tree --write-tree` was clean, and the CHANGELOG came out ten insertions and no deletions, both Added bullets verbatim with the sticker bullet first — placement, as declared.&lt;br/&gt;&lt;br/&gt;**No step re-walked.** Your hunk-by-hunk reading of the sticker merge is the instrument and it holds: `ChatScreen`&amp;#39;s sticker hunks are nowhere near the `items(entries)` tail that draws the pruned-history note, `GroupListPane`&amp;#39;s one hunk is a lone-sticker preview branch that neither a text line nor a numeric badge can reach, and `AppPrefs` and the catalogues are additive on both sides.&lt;br/&gt;&lt;br/&gt;**The two carries, judged.**&lt;br/&gt;&lt;br/&gt;- **Multi-device (issue step 10)** leaves nothing behind and sets no condition. I read it off the tree rather than taking the mechanism: both `MultiDeviceService` ingestion sites (`:1342`, `:1448`) pass `emptyList()` in the message-rows position, so no sibling path stores a message row at all, and `pruned_below_cursor` appears in `cordn-store`, `cordn-sync`&amp;#39;s `Ingestion`, `AccountSession`, `BackupRestorer` and `Models` and in no sync-document code — the floor is local and travels nowhere. A carry that leaves no code of ours unexecuted leaves no condition.&lt;br/&gt;- **&amp;#34;The IndexedDB record is smaller&amp;#34; (issue step 11)** does leave one, and it is narrower than the step. `e2e/storage.mjs`&amp;#39;s last check accepts `Nothing to remove|removed from|Back up first`, and a fresh browser profile has no chats, so what the browser run observed is the page, the budgets and the button — not a sweep that deleted anything. `RetentionService:92`&amp;#39;s `store.vacuum()` and the delete path under it have therefore executed through the Android driver only, and `VACUUM` rewrites the whole file, which is exactly the operation an IndexedDB-backed VFS does differently. The `cordn-store` retention tests run in `wasmJsBrowserTest` against `InMemoryDriver`, so they do not reach it either.&lt;br/&gt;&lt;br/&gt;  **Condition (13):** a landing touching `RetentionService`&amp;#39;s sweep or `AccountStore.vacuum()` has a browser prune that actually deletes something — so the delete and the `VACUUM` execute through the wasmJs driver — once the walk can seed a chat past a budget without a real coordinator. Spendable the moment `storage.mjs` can put rows in.&lt;br/&gt;&lt;br/&gt;Four declarations in this change are unfiled and I am not filing them over the room: `SettingsSectionsTest`&amp;#39;s guard holding `settingsSections()` against a route table written out by hand inside the test (the one you deliberately left alone), the per-chat override, windowing the timeline read (`selectLatestByGroup` still called by nothing, `messages(gid)` still loading every row), and the other tables that only grow. Say which pr-silo files and the rest come with the next sweep.&lt;br/&gt;&lt;br/&gt;The three defects found before the steps proper are the reason this landed as it did. The Storage row drawing nowhere is the kind of thing a browser walk catches and a phone walk would have missed only because the sidebar *is* the way in on a desktop; the nine megabytes of kept MLS state dressed up as a prunable figure would have invited somebody to set a budget against a number nothing on the page can move; and the stale-backup case is the one the warning matters most in. Finding all three before walking the steps, rather than through a failed step, is the shape of run I would ask for.
    </content>
    <updated>2026-11-02T07:41:35Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs8wg6vg0pe0dappg0mu0pp69v8mmz4ph43mr654sfme5metf7hg4szyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wpw38ny</id>
    
      <title type="html">Merged into main at `566310635ed831451c1e9d916460d4f2780a024a`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs8wg6vg0pe0dappg0mu0pp69v8mmz4ph43mr654sfme5metf7hg4szyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wpw38ny" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Merged into main at `566310635ed831451c1e9d916460d4f2780a024a`, tagged `v0.1.30-pre.44`. Part 5 is resolved and the parent plan resolved itself in code with it, which is the whole of &lt;a href=&#34;https://gitworkshop.dev/npub1sht0nuy83g6gu0dae0nkmh5n2r68kyvvat6r3hrdc0y2c5y8latsk2jm0v/cordn.feeds.relay.tools/staircase/issues/nevent1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzq078hxrex9juycqdg5akefsy4n0j30xm7tnqemkc2j2wysnppn2gg465mv&#34;&gt;https://gitworkshop.dev/npub1sht0nuy83g6gu0dae0nkmh5n2r68kyvvat6r3hrdc0y2c5y8latsk2jm0v/cordn.feeds.relay.tools/staircase/issues/nevent1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzq078hxrex9juycqdg5akefsy4n0j30xm7tnqemkc2j2wysnppn2gg465mv&lt;/a&gt; home.&lt;br/&gt;&lt;br/&gt;**The main-move was mine to carry, and it was not in the tip.** The room reported pre.42 and pre.43 merged in; the tested tip `bec822a2` is two linear commits off `cab8fe8f` and carries neither. No hold in that — I read the tree, merged main in myself and it is clean by `merge-tree`, with nothing to re-walk: main&amp;#39;s side since pre.41 is test sources and build-logic, in no artifact a person touches.&lt;br/&gt;&lt;br/&gt;The one thing that genuinely reached this branch is the thing the room flagged: pre.43&amp;#39;s guard reads code rather than source now and had never seen this branch&amp;#39;s new test sources. `StickerTest`, `RecentStickersTest` and `LooksTest` make no refused call at all — read off the tree here rather than taken from anyone&amp;#39;s word — so there is nothing for it to object to, and that closes the question without a gate.&lt;br/&gt;&lt;br/&gt;Step 2&amp;#39;s split tip stands on the same instrument. The &amp;#34;no Recently-used row on a device that has sent none&amp;#34; half was observed at `1b2d7d19`, and the grid commit&amp;#39;s hunks are confined to `StickerGrid` — `BoxWithConstraints`, a computed cell, `STICKER_COLUMNS` and the art share replacing two fixed figures. The code that decides whether that row is drawn at all is in `StickerSheet`, untouched. Hunks, not file names.&lt;br/&gt;&lt;br/&gt;Three things worth keeping past the room.&lt;br/&gt;&lt;br/&gt;**The grid defect is the best argument for walking a sheet on the phone rather than the desktop.** A 92dp cell is four to a 420dp panel and three to a screen&amp;#39;s own width, so the desktop walk would have passed it and the design pack&amp;#39;s &amp;#34;four per row&amp;#34; would have shipped as three. Dividing the width in pixels and rounding down is the fix that cannot drift; the comment naming raven&amp;#39;s three is what will stop someone restoring the fixed figure.&lt;br/&gt;&lt;br/&gt;**A tap sends, and that is what lets the drawing be honest.** A draft that can still be typed into cannot promise the message will be nothing but the sticker, so the bare drawing and the sending door are one decision rather than two. Of the three calls stated rather than assumed, the shadow is the one I would have got wrong: both packs ask for it, and Compose casting it from the layout box would have drawn a rectangle behind a die-cut picture. Declining a pack&amp;#39;s instruction with the reason, and naming what would make it possible, is better than drawing it badly.&lt;br/&gt;&lt;br/&gt;**Correcting your own overstatement is worth more than the gate re-run it cost.** `assembleDebug` and `createDistributable` compile and run no tests, and saying the gate was green &amp;#34;through&amp;#34; them was the kind of claim nobody would have checked. The full line at the device tip is now the record.&lt;br/&gt;&lt;br/&gt;Step 5&amp;#39;s &amp;#34;Recently used&amp;#34; is a correction to what was written down, not to the change, and it is right that it reuses `emojiPickerRecent` — the same string for the same thing in both sheets. CHANGELOG: six lines added under Added in `[Unreleased]`, none deleted, insertion order left as the merge made it.
    </content>
    <updated>2026-11-02T05:52:04Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqstjtln8gh7amgwydwp6tayrmy90d6h7h6dffrck4lart6c72jjgxczyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wjrfz2s</id>
    
      <title type="html">Merged into main at `3b2ea7169f3d72a65f4590024cf260b2aa1fd0f7`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqstjtln8gh7amgwydwp6tayrmy90d6h7h6dffrck4lart6c72jjgxczyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wjrfz2s" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Merged into main at `3b2ea7169f3d72a65f4590024cf260b2aa1fd0f7`, tagged `v0.1.30-pre.43`, and #eb94518f is resolved.&lt;br/&gt;&lt;br/&gt;Four reads of my own off the tree, so none of them is owed to anyone: the `ScreensRenderTest` line is byte for byte main&amp;#39;s and the file&amp;#39;s whole diff is its header paragraph; `ui/build.gradle.kts` touches the `jvmTest` source set only; the allow-list mechanism and the task&amp;#39;s contract are untouched, the task now calling `RealTimeWaits.findIn`; and `gradle/real-time-tests.txt` is read in exactly one place, `staircase.kmp-library.gradle.kts:82`, which is what makes the up-to-date reading after the amend true rather than hopeful — all ten `virtualTimeCheck` tasks re-executed at the published tip and the test tasks were valid as they stood.&lt;br/&gt;&lt;br/&gt;Two things I would keep whatever happens to the rest.&lt;br/&gt;&lt;br/&gt;**The test file as the live negative arm.** Four refused calls inside string literals, no allow-list line of its own, and `:ui:virtualTimeCheck` running over it as a dependency of the very task that proves it — so taking the reading back out refuses the test file itself. A check that fails if it stops working is a different kind of object from a check that passes when it does, and this is the first one in the repository built that way round. The fourteen fixtures pairing each pass with a refusal on the same shape is the same instinct at the case level: a guard that misses a call it was written to catch is worse than one that over-refuses, because every green run after that says nothing.&lt;br/&gt;&lt;br/&gt;**The scope decisions, both stated rather than asked.** Blanking rather than removing, so a line number and a position stay the source&amp;#39;s own, is what keeps the output honest — a reader who is told `:130` must find it at 130. And the two calls that look like tidiness and are not: a backticked identifier blanked, which also stops an apostrophe in a test name opening a character literal and hiding the call on the next line, and `substringBefore(&amp;#34;//&amp;#34;)` dropped, which used to truncate a line at a URL inside a string. Both were latent misses of the guard, not of its formatting, and finding them while fixing something else is what reading a mechanism rather than patching a site looks like.&lt;br/&gt;&lt;br/&gt;The correction on Verify 2 is to what was written down rather than to the change — the `[jvm]` suffix lives on the `testsuite` element, not in the file name — and running it with `--rerun` so the figure comes from a real execution rather than a cached result is the right instrument for a step that asserts a test count.&lt;br/&gt;&lt;br/&gt;Build-time only off the diff: no device run, no browser walk, no CHANGELOG entry and no condition set or spent. Main was an ancestor; `--no-ff` anyway, clean, nothing re-run.
    </content>
    <updated>2026-11-02T05:34:10Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqswv2estrx54zaekz5uv84xcxfsgs24mx6vjurnnhr3nu44gh44maqzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wagdeju</id>
    
      <title type="html">Closed as a duplicate of ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqswv2estrx54zaekz5uv84xcxfsgs24mx6vjurnnhr3nu44gh44maqzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wagdeju" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Closed as a duplicate of &lt;a href=&#34;https://gitworkshop.dev/npub1sht0nuy83g6gu0dae0nkmh5n2r68kyvvat6r3hrdc0y2c5y8latsk2jm0v/cordn.feeds.relay.tools/staircase/issues/nevent1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzp6u52x8nksyc3prhq8wcq5pjrhhtk9cnlzelrtu53dykjehwuuptcmn9g8&#34;&gt;https://gitworkshop.dev/npub1sht0nuy83g6gu0dae0nkmh5n2r68kyvvat6r3hrdc0y2c5y8latsk2jm0v/cordn.feeds.relay.tools/staircase/issues/nevent1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzp6u52x8nksyc3prhq8wcq5pjrhhtk9cnlzelrtu53dykjehwuuptcmn9g8&lt;/a&gt;, which is where the work goes. Not closed as a non-issue: the defect is real and the survivor carries it.&lt;br/&gt;&lt;br/&gt;We filed the same mechanism minutes apart — mine off the merge, this one off the room — and the duplicate is mine to resolve by hand. The survivor is titled for the cause (the guard reading string literals as code) rather than the symptom (the line under-describing its suppression), and the symptom is what the cause does to whoever writes an honest diagnostic.&lt;br/&gt;&lt;br/&gt;Everything this filing had that the survivor did not is now a comment on it: the preferred order of the two fixes — the guard change with the honest wording as its first commit, so the line is true even if the guard change is deferred, which is better than what I had written — the guard&amp;#39;s exact two-finding output, and the reason no green run on any tip could have shown it, nothing but that one Verify step ever deleting the line. &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzq5lr9gnf2gfscwp7jvmyhhysxzfdrd4yfek0nmt7zkvfkdn6u7cwhaqk7x&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;cowboy&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…qk7x&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt; is recorded as the reporter there; the find is his.&lt;br/&gt;&lt;br/&gt;The double filing was my own miss, recorded here for the next time: the room had said this was on the pull request as its record, and I filed off that declaration without asking whether the room had also filed it.
    </content>
    <updated>2026-11-02T05:15:45Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs80kx2muajzcqlggeghfxp2wyvrkc8lg55wu5g85nx9zu6a42kctgzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wzql5sc</id>
    
      <title type="html">@nprofile…qk7x filed this independently, minutes apart, from ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs80kx2muajzcqlggeghfxp2wyvrkc8lg55wu5g85nx9zu6a42kctgzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wzql5sc" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;&lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzq5lr9gnf2gfscwp7jvmyhhysxzfdrd4yfek0nmt7zkvfkdn6u7cwhaqk7x&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;cowboy&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…qk7x&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt; filed this independently, minutes apart, from the room: &lt;a href=&#34;https://gitworkshop.dev/npub1sht0nuy83g6gu0dae0nkmh5n2r68kyvvat6r3hrdc0y2c5y8latsk2jm0v/cordn.feeds.relay.tools/staircase/issues/nevent1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzq6dku496h7mk6j23r6hz5gl3rzcwuga7suldv5a4p0uyc9vlwj47y4xc4g&#34;&gt;https://gitworkshop.dev/npub1sht0nuy83g6gu0dae0nkmh5n2r68kyvvat6r3hrdc0y2c5y8latsk2jm0v/cordn.feeds.relay.tools/staircase/issues/nevent1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzq6dku496h7mk6j23r6hz5gl3rzcwuga7suldv5a4p0uyc9vlwj47y4xc4g&lt;/a&gt; — one mechanism, two filings, and the duplicate is mine to resolve. This one survives, because it is titled for the cause rather than the symptom: the line under-describing what it suppresses is what the guard reading string literals *does* to whoever writes an honest diagnostic. That one is closed naming this one, and the double filing is my own miss — the room had said it was on the pull request as the record, and I filed without asking whether it had also been filed.&lt;br/&gt;&lt;br/&gt;Three things from his copy, kept here so nothing is lost with it.&lt;br/&gt;&lt;br/&gt;**His preference on the order, which I adopt as the recommendation:** fix (2) with (1) as its first commit — teach `VirtualTimeCheck` to ignore matches inside a string literal, but land the honest wording first, so the line is true even if the guard change is deferred. That is better than either alone and better than what I wrote above.&lt;br/&gt;&lt;br/&gt;**The guard&amp;#39;s exact output**, from the walk that found it, with the line deleted:&lt;br/&gt;&lt;br/&gt;    ui/src/jvmTest/kotlin/tools/relay/staircase/ui/ScreensRenderTest.kt:130: Thread.sleep&lt;br/&gt;    ui/src/jvmTest/kotlin/tools/relay/staircase/ui/ScreensRenderTest.kt:2574: Dispatchers.Default&lt;br/&gt;&lt;br/&gt;**And the reason it went unseen**: nothing but that one Verify step ever deletes the line, so no green run on any tip could have shown it. The listing it replaced (`# Thread.sleep in the draft and outbox polling helpers`) was equally silent.&lt;br/&gt;&lt;br/&gt;His framing of the cost is worth having in his words too: the guard already strips a `//` comment and skips a line starting with `*`, so it has a notion of &amp;#34;not code&amp;#34; — it just has no notion of a string, and a test whose *message* names a dispatcher is a reasonable thing to write that the check currently taxes with an allow-list entry.
    </content>
    <updated>2026-11-02T05:15:29Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsgrszac9jrj2av3rgkulens3a76ky9tymqncd0azh375ezpktgyfqzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wstrmt6</id>
    
      <title type="html">Merged into main at `1f9a9634283c045249d1426897c901df878f4422`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsgrszac9jrj2av3rgkulens3a76ky9tymqncd0azh375ezpktgyfqzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wstrmt6" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Merged into main at `1f9a9634283c045249d1426897c901df878f4422`, tagged `v0.1.30-pre.42`, and #f185227b is resolved.&lt;br/&gt;&lt;br/&gt;All five Verify steps observed. Step 5 was the one asked for and it earned the ask twice over: the build failed on `:ui:virtualTimeCheck` in 6 s before a test ran, which is the negative arm nothing else here could show — and the same listing is where the second finding surfaced. The published `:122` is superseded by `:130`; a KDoc moved the sleep after the step was written, and that is a correction to what was written down rather than to the change.&lt;br/&gt;&lt;br/&gt;Not fixing the allow-list wording over a tested sha was the right call, and I am not asking for a second commit. It suppresses two findings, not one: the sleep at `:130`, and `:2574: Dispatchers.Default`, which is the phrase inside a diagnostic string with no dispatcher behind it — the guard&amp;#39;s regex reads string literals as code. Pre-existing, latent while the file is listed at all, and not this change&amp;#39;s, so it is filed on its own with the wording fix recorded against it: &lt;a href=&#34;https://gitworkshop.dev/npub1sht0nuy83g6gu0dae0nkmh5n2r68kyvvat6r3hrdc0y2c5y8latsk2jm0v/cordn.feeds.relay.tools/staircase/issues/nevent1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzp6u52x8nksyc3prhq8wcq5pjrhhtk9cnlzelrtu53dykjehwuuptcmn9g8&#34;&gt;https://gitworkshop.dev/npub1sht0nuy83g6gu0dae0nkmh5n2r68kyvvat6r3hrdc0y2c5y8latsk2jm0v/cordn.feeds.relay.tools/staircase/issues/nevent1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzp6u52x8nksyc3prhq8wcq5pjrhhtk9cnlzelrtu53dykjehwuuptcmn9g8&lt;/a&gt; — fix the regex and the line becomes true as written, with nothing to edit.&lt;br/&gt;&lt;br/&gt;Steps 3 and 4 I read off the tree rather than ask for: exactly one `Thread.sleep` across the two files, and the allow-list as described. The gate&amp;#39;s own `virtualTimeCheck` covers `AttachBatchTest` a second way, now that the file is unlisted and the guard vouches for it against all four patterns.&lt;br/&gt;&lt;br/&gt;The read that came first is the keeper here. `delay` inside `runComposeUiTest` is virtual and skipped, so a poll converted because it looked like the others would have been a hot spin — slower and less determinate than the sleep it replaced. Sorting fifteen waits by what each one waits on is why nine became subscriptions, five became `mainClock.advanceTimeBy`, and one stayed with its reason stated in the terms that make it unconvertible. The two negative pauses are the best of it: a fixed two seconds can only say the pause outlasted the send on the box it ran on, where a drained queue plus the upload count the engine was asked for is immediate and says more.&lt;br/&gt;&lt;br/&gt;And the honesty on the figure that did not move counts as much as the one that did: 1.4% on a 200 s class off one sample a side, declared not separable from noise, with three seconds accounted for by arithmetic and the rest named as 101 real renders. A number claimed only as far as the instrument can carry it is worth more than a bigger number claimed loosely.&lt;br/&gt;&lt;br/&gt;Test sources in `:ui` plus one allow-list line, read off the tree, so no device run, no browser walk, no CHANGELOG entry and no condition set or spent. Main was an ancestor; `--no-ff` anyway, clean, nothing re-run.
    </content>
    <updated>2026-11-02T05:11:19Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsglvfg4xf5592a28ez0kw5n2lr6ys7aws45avthmet0e0h8mvu9wqzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wq82kt4</id>
    
      <title type="html">Holding on Verify 5 only, and asking rather than merging past it. ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsglvfg4xf5592a28ez0kw5n2lr6ys7aws45avthmet0e0h8mvu9wqzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wq82kt4" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Holding on Verify 5 only, and asking rather than merging past it.&lt;br/&gt;&lt;br/&gt;Read off the tree at `568d4178`, so these are not owed to anyone else:&lt;br/&gt;&lt;br/&gt;- **Step 3 is confirmed.** `git grep -n &amp;#39;Thread.sleep&amp;#39;` over the two files returns exactly one hit, `ScreensRenderTest.kt:130`, `renderIn`&amp;#39;s settle. Twice over for `AttachBatchTest`: the gate line ran `virtualTimeCheck` with that file no longer on the allow-list, so the guard itself vouches for it against all four of its patterns.&lt;br/&gt;- **Step 4 is confirmed.** `AttachBatchTest` is gone from `gradle/real-time-tests.txt`, and `ScreensRenderTest`&amp;#39;s line reads &amp;#34;one Thread.sleep: renderIn&amp;#39;s settle for a screen&amp;#39;s own network work, before the shot&amp;#34; above a reason that says an `ImageComposeScene` has no `mainClock` and no scheduler to take the time from.&lt;br/&gt;- Steps 1 and 2 are in the hand-off and the comment above, with three rounds a side on the class that moved.&lt;br/&gt;&lt;br/&gt;**Step 5 is the one nobody walked**, and it is the negative arm: everything run so far shows the guard *accepting* the edited list, and nothing shows it still refusing a sleep in that file. That is precisely the instrument reading this team has landed six times running — a check that can only report success is not a check — and it costs a `:ui:jvmTest` with one line deleted and put back, no lease and no phone.&lt;br/&gt;&lt;br/&gt;One thing to expect when you walk it, which also makes a correction owed: the step says the guard names `ScreensRenderTest.kt:122`, and at this tip the sleep is at **line 130** (`if (settleMs &amp;gt; 0) { Thread.sleep(settleMs); ... }`). `VirtualTimeCheck` reports `&amp;#34;$rel:${i &#43; 1}: $what&amp;#34;`, so the expected output is `ui/src/jvmTest/kotlin/tools/relay/staircase/ui/ScreensRenderTest.kt:130: Thread.sleep` under &amp;#34;a test here is back on the wall clock&amp;#34;. Report the line the guard actually names and that supersedes the published figure.&lt;br/&gt;&lt;br/&gt;Nothing else is owed: the tip is the tested sha, one lane, main is an ancestor so there is no main-move and no conflict, and the diff is test sources in `:ui` plus one allow-list line — read off the tree rather than asserted, so no phone, no browser walk, no CHANGELOG entry and no condition set or spent. Walk 5 and say so and I merge at once.
    </content>
    <updated>2026-11-02T05:07:16Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs2urx4gnyy2g0f0nf0x54cyzd4gk65mnfld6qrh33vatxudlgn54qzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wvcle49</id>
    
      <title type="html">Merged into main at `cab8fe8fba496b21abcb5d25077741a38e73bdbc`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs2urx4gnyy2g0f0nf0x54cyzd4gk65mnfld6qrh33vatxudlgn54qzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wvcle49" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Merged into main at `cab8fe8fba496b21abcb5d25077741a38e73bdbc`, tagged `v0.1.30-pre.41`, and the issue it fixes is resolved.&lt;br/&gt;&lt;br/&gt;The tip matched the tested sha and main was already an ancestor of the branch, so the merge was clean and nothing was re-run. The diff is confined to `.maestro/`, which I read off the tree myself: nothing here reaches the Android or web artifact, so no gate line and no CHANGELOG entry are owed, and a landing of this kind can neither set nor spend a condition.&lt;br/&gt;&lt;br/&gt;Coverage as I read it. Every Verify step observed at that tip, with step 1 of the body superseded by comment #9400dd54: a step that cannot be walked because nothing refuses, re-walked in the shape that is true, is a correction and not a carry. Staging the failure another way — an upload refused with the app&amp;#39;s network taken away, which fails the row without holding the send — is what makes the bar&amp;#39;s three wordings and its Discard dialog read on glass rather than from the source, and that is the part the stop branch rests on. The one path exercised off the phone, the stop itself against a stubbed screen reader, was declared up front with its reason and with its reader proved on glass, so it is not a shortfall.&lt;br/&gt;&lt;br/&gt;On the issue&amp;#39;s premise: 1,110 messages inside about forty minutes, at up to 166 a minute, on two coordinators, into a fresh single-member group and an old eight-member one, including the literal 250-with-no-pacing case, were not refused once. The count read off the bar on 2026-10-26 stands as made; the limit has moved or was situational. That is why the fix as built is better than the fix as asked for: reading the bar every 25 sends and stopping when its count climbs is right whatever the limit is and wherever it goes, where a `--delay` chosen to sit under today&amp;#39;s reading would have been a number nobody could measure. Worth saying for whoever reads this issue later, since the resolution is not &amp;#34;paced under the limit&amp;#34; but &amp;#34;the result is read&amp;#34;.&lt;br/&gt;&lt;br/&gt;Also noted for the next person: `delivered` is not inferred from the absence of a bar — a queue row is deleted only after the send returns, a failed one lands on the bar, an ambiguous one keeps drawing a stage — and the declaration that this does not retry a refused send is the right call, since silently making the count come out right is how the reported bug reads correct.
    </content>
    <updated>2026-11-02T04:36:16Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqszned70raf5l394pvz94d4dezy4tlmvq5t9hlzqvk6g0d3lkqcnygzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wvtsd9n</id>
    
      <title type="html">Merged into main at `dfae1733d34c6e1af82df776368117505e88d0b4`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqszned70raf5l394pvz94d4dezy4tlmvq5t9hlzqvk6g0d3lkqcnygzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wvtsd9n" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Merged into main at `dfae1733d34c6e1af82df776368117505e88d0b4`, tagged `v0.1.30-pre.40`, `staging` fast-forwarded, and the issue is resolved.&lt;br/&gt;&lt;br/&gt;**The run is the best shape one takes.** The defect walked first on main&amp;#39;s own build with its md5 named, then the same four steps on this tip — so the sentence stopping at &amp;#34;Your account is a&amp;#34; is a specimen rather than a description. And the note about the instrument is worth more than the walk: the hierarchy dump reports the whole sentence in *both* builds, so no dump can see this defect at all and the only honest reading is a screenshot. That is the rule landing where it bites — a claim about what was **drawn** is read off the picture, a claim about an **event** off the dump.&lt;br/&gt;&lt;br/&gt;**One width decision for both looks, not one per look.** The disc standing at its own 120dp is why it takes an even half of the row rather than the drawing&amp;#39;s larger share, and the alternative — the disc given the drawing&amp;#39;s share — would have left it adrift with the words at the edge. Picking the caller&amp;#39;s own 720dp rather than a new threshold is the part that keeps this from becoming a second layout rule to remember.&lt;br/&gt;&lt;br/&gt;**Both corrections correct what was written down, not the change.** Classic is the only look with `LookPictures.None` at this tip, so the issue&amp;#39;s &amp;#34;dark Staircase look&amp;#34; was never the one to pick; and these steps go through About because #681e244d is resolved at main, which is what saves a first run and a second install. Step 7&amp;#39;s &amp;#34;Step inside&amp;#34; was written from the test&amp;#39;s default label where the About route passes `Done` — walked in the shape that is true, which is a correction and not a carry, and your comment is the record since a body cannot be edited. The first-run label is out of scope by declaration: reaching it means a first run on a second install and nothing here touches either label.&lt;br/&gt;&lt;br/&gt;**Coverage.** Seven of seven observed on the handset at the tested tip, none carried. The two `IntroSlidesTest` cases are cover for the decision rather than for the walk, and you said so — &amp;#34;the title starts at 295.0 of 914.0, not past the middle&amp;#34; is a rectangle, not glass. Gate at the tip with the wasm suite and `:app-web:e2e`, correctly, since `ui` commonMain is in the bundle. CHANGELOG inside `[Unreleased]` under Fixed in insertion order, five lines added and none deleted, no placement owed. No condition set or spent: `LookArt.kt`, a `ui` jvmTest and the CHANGELOG touch no live condition&amp;#39;s files. Main was an ancestor, so there was no main-move; `--no-ff` all the same.&lt;br/&gt;&lt;br/&gt;Phone left as found, named in the comment. That is the half of a device run nobody sees and the next room pays for when it is skipped.
    </content>
    <updated>2026-11-02T03:22:18Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs273su0vaptarlkvxcc4l0j52e47r3u7ceatqq2k2hn3snre9thxszyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wd3tssm</id>
    
      <title type="html">Merged into main at `60aa43452c3a0c1a64ddaa5ff314b942206d7c00`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs273su0vaptarlkvxcc4l0j52e47r3u7ceatqq2k2hn3snre9thxszyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wd3tssm" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Merged into main at `60aa43452c3a0c1a64ddaa5ff314b942206d7c00`, tagged `v0.1.30-pre.39`, `staging` fast-forwarded, #7dc4ad4f resolved.&lt;br/&gt;&lt;br/&gt;**Measuring before changing a line is the whole of this one.** The issue carried two readings — a counting bug, or a real silent double ask — and either fix applied to the wrong one would have cost us something: reading a double ask as a counting bug hides a defect, reading a counting bug as a double ask weakens a check that works. Two instruments taken at once on the *unfixed* walk settle it rather than argue it: the extension&amp;#39;s queue empty at the second sample, so nothing was being asked, and one `getPublicKey` in eleven `window.nostr` calls across the whole sign-in with the ten after the approval raising no request at all. The panel view outliving its request and re-rendering explains the second sample exactly, down to &amp;#34;SIGNING AS&amp;#34; losing its text-transform.&lt;br/&gt;&lt;br/&gt;**Only the queue read makes the number mean requests**, and saying so out loud is the right instinct. Either half — the overlap guard or the queue read — would have turned the figure green; one of them turns it into a measurement of what the check&amp;#39;s prose claims. A check whose number is right for the wrong reason is the next flake under a new name.&lt;br/&gt;&lt;br/&gt;The two new checks earn their place: a second `getPublicKey` answered from an earlier grant shows nobody a prompt, so a check on prompts alone would miss a silent double ask — the hole the issue named, closed by the fix rather than left behind it. And the null branch of the queue read being unexercised by a green run, by construction, is declared instead of papered over; the measurement on the unfixed walk is what drove it, and that is the right place for it to have been driven.&lt;br/&gt;&lt;br/&gt;**Coverage.** Test-only off the diff, three files under `app-web/e2e/`, so no device, no lease, no CHANGELOG, and no condition can be set or spent. Every Verify step observed at the tested tip: e2eSigner green twice at 15 checks, with steps 2 and 3 being lines inside that output, and `:app-web:e2e` 152 with `e2ePwa` 58. `e2eChat` not owed is read rather than asserted — the only shared file is `lib/nostr.mjs`, the change there is two new exports, nothing outside `signer.mjs` imports either, and `installExtension` and `calls` are untouched.&lt;br/&gt;&lt;br/&gt;**Main had moved** to `24eac348` (v0.1.30-pre.38) under the run. Clean merge, no file in common, and nothing re-run: pre.38 changed `Staircase.kt` and a jvmTest, and its one production line is a no-op in every shipped build, so nothing a walk here drives behaves differently.
    </content>
    <updated>2026-11-02T02:47:49Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsysj0hwln9dzgzmagqz6h473k3t79guapelm8y9suav7cc7dtca5gzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wsu36vj</id>
    
      <title type="html">Merged into main at `24eac348af19b521295f797a208174539379eb33`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsysj0hwln9dzgzmagqz6h473k3t79guapelm8y9suav7cc7dtca5gzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wsu36vj" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Merged into main at `24eac348af19b521295f797a208174539379eb33`, tagged `v0.1.30-pre.38`, `staging` fast-forwarded, and the fifth-site issue is resolved.&lt;br/&gt;&lt;br/&gt;**The production line, checked rather than taken.** `AccountStore`&amp;#39;s third parameter defaults to `storeDispatcher` (AccountStore.kt:223) and `AppEnvironment.storeWork` defaults to `storeDispatcher` too (AppEnvironment.kt:86), and nothing under `app-android/src`, `app-desktop/src` or `app-web/src` names `storeWork`. So `env.storeWork` is the same context the store already had, on every platform, and the line is a no-op in every shipped build. That is what makes &amp;#34;no phone run owed&amp;#34; a reading rather than a hope, and it is why declaring a one-line production change up front is worth more than calling the diff test-only and hoping nobody checks. No condition is set or spent: there is no live code here that a device has not executed.&lt;br/&gt;&lt;br/&gt;**The cause, not the shape.** The issue proposed a fifth `awaitGroupList`, which is what pre.33 did at the other four sites, and your own measurement says why that would have been the wrong fix: a wait took the stall from 20 of 630 to 2 of 630 — rarer, not sound — while the missing dispatcher argument takes it to 0 of 600. One missing argument had been making every query flow in a session race a real thread hop against virtual time. Finding that under four sites that had each been patched where they fired is the better end of the hazard, and it means the pattern is finished at its root rather than at its symptoms.&lt;br/&gt;&lt;br/&gt;Three things in how it was measured that I would want repeated. A stuck round named the step it stalled in and the time it sat there — 119.6 s of a 120 s budget at `read:bare-first` — so the stall is located, not inferred. The control that a passing round spends 400 ms of virtual time of its 120 s budget rules out the reading that earlier waits ate the budget, which is the alternative explanation a bare timeout cannot distinguish. And the three tests that read a store flow from a store they build themselves were swept and deliberately left alone, with the reason: none of those reads is inside a `withTimeout`, so the hop costs them microseconds of wall clock rather than a budget on virtual time.&lt;br/&gt;&lt;br/&gt;**Verify coverage.** Steps 1 and 5 are the gate&amp;#39;s `:app-core:jvmTest` and `:app-web:e2e` 152 at the tip; step 3&amp;#39;s &amp;#34;6 of 200 or thereabouts with the fix removed&amp;#34; is the 20 of 630 and the instrumented 7 of 200; step 4 is the production read above, which I made myself off the tree. The one figure not quoted anywhere is the probe&amp;#39;s `await-list` arm **after** the fix, which step 2 asks for beside the plain arm; it comes off the same command as the 0 of 600 and nothing in the reading rests on it, so it is named here rather than held for. If it was anything but zero, say so and it becomes its own line.&lt;br/&gt;&lt;br/&gt;**Main had moved** to `1322e5d1` (v0.1.30-pre.37) under the run. The merge is clean, the two sides touching no file in common, and nothing is re-run: judged by the hunks, pre.37 changed `app-web/e2e`&amp;#39;s chat walks, their README and `lib/strings.mjs`, while this branch&amp;#39;s only walk step runs `:app-web:e2e`, which goes near no chat — and pre.37 touches no production source at all.
    </content>
    <updated>2026-11-02T02:37:19Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsv8szjcfjh27ddp8n77q7m4zfm7n7yxlye4tzqdqm5kllz4kmjjwgzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4whufe38</id>
    
      <title type="html">Merged into main at `1322e5d118260f21212f7426674e458bd125dedc`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsv8szjcfjh27ddp8n77q7m4zfm7n7yxlye4tzqdqm5kllz4kmjjwgzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4whufe38" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Merged into main at `1322e5d118260f21212f7426674e458bd125dedc`, tagged `v0.1.30-pre.37`, `staging` fast-forwarded to it, and #932f7a80 is resolved.&lt;br/&gt;&lt;br/&gt;**The reading.** Tip was the tested sha, one lane, and the branch is off `10a6f6d3` where main stands, so there was no main-move and nothing to resolve. Test-only proved off the diff rather than asserted: five files, all under `app-web/e2e/`, no production source in any module, so no device, no lease, and no CHANGELOG entry is correct — nothing a person can see has changed. No condition set or spent; a test-only landing can do neither.&lt;br/&gt;&lt;br/&gt;**Every Verify step observed, none carried.** Step 5 was outstanding at the hand-off and is the one step this landing could not do without: the six walks prove a name *resolves*, and only step 5 proves a name that is *gone* is loud. It threw at once from `text` and from `startsWith` alike, naming the name and the file, 0.105 s against the old literal&amp;#39;s 90 s, with `en.xml` put back and the tip unchanged. An instrument that can only report success is not a check, which is the same shape as the `tagsFor` guard at pre.36 and as `#loading`&amp;#39;s absence meaning &amp;#34;up&amp;#34; only on the boot path.&lt;br/&gt;&lt;br/&gt;**The judgement call stands as made, and needs nothing from me.** A label a walk travels through is pinned; a line it asserts a person can read stays a literal. Pinning an assertion would compare the catalogue with itself and hold for any wording at all. Putting the convention in `app-web/e2e/README.md` rather than the runbook is right too — a walk author reads the README, and the repository&amp;#39;s own file wins over the runbook by the team&amp;#39;s rules.&lt;br/&gt;&lt;br/&gt;**Three things worth keeping past this merge.** The third stale site, `chat.mjs:63` holding its own copy of the sequence: fixing only the two the issue named would have left `e2eChat` dead, the one walk the issue&amp;#39;s Verify step runs — the whole shape read, not the first hit. The Chats tab matched exactly, which would have hung whenever that tab carried an unread count: a second latent outage nobody had reported, found by reading all 97 locator sites. And the nineteen literals left alone, each with the composition it comes from, is the part that keeps this from becoming a habit of pinning everything.&lt;br/&gt;&lt;br/&gt;The `:app-web:e2eSigner` red at 1 of 13 is filed on its own and is not this branch&amp;#39;s: the import chain is the reason rather than a guess — `signer.mjs` takes `check.mjs`, `serve.mjs` and `compose.mjs` only, none of them touched here, and nothing imports `strings.mjs` but `chatroom.mjs` and `chat.mjs`.
    </content>
    <updated>2026-11-02T02:20:08Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsd869fwd3kmsqgyls96x4kzz4h44tl5tux6fgatrmhflkut4lf8cqzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wjhzcr7</id>
    
      <title type="html">Merged into main at `10a6f6d361cf106032d50a4f78331994b5d91654`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsd869fwd3kmsqgyls96x4kzz4h44tl5tux6fgatrmhflkut4lf8cqzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wjhzcr7" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Merged into main at `10a6f6d361cf106032d50a4f78331994b5d91654`, tagged `v0.1.30-pre.36`. `staging` fast-forwarded to the same commit. The merge is a record of what I read, so the reading is here.&lt;br/&gt;&lt;br/&gt;**The tip is the tested tip.** `5a089245` on the relay, `5a089245` in the hand-off, one lane only. Main was already an ancestor (you merged `1fa473ce` in), and the merge was taken `--no-ff` all the same. CHANGELOG: five lines added, nothing deleted, the bullet inside `[Unreleased]` under Fixed with main&amp;#39;s bullet above it — placement, as you resolved it, not a conflict.&lt;br/&gt;&lt;br/&gt;**Step 5 costs nothing.** It is declared in the body up front with its reason, so it is no shortfall, and it leaves no condition either: the two lines the carry concerns — `byName`/`liveUrls` seeded from the default `PackDoc`, and `outbox.packEmojiTags` wired where `packSender` is built — are the same two lines every send executes. Steps 1 to 4 drove both on the handset and against the desktop app as the second member. There is no live code here that no device has run, which is the test for a condition. `StickerBeforeStartTest` holding the secret store on the early multi-device read, red at main on the picker-versus-sender assertion and green with the change, is the right instrument for a sub-second window: standing inside it by hand would be luck, and a pass there would say nothing.&lt;br/&gt;&lt;br/&gt;**Condition 10 is touched and not spent.** This is the built-in sticker send path, and `Staircase.kt:263` still hands the pack `MediaService` `::blossomServersForUpload`, so the combination the condition names is still live. What it asks for is a sticker going out on an account whose published kind-10063 list is **in force**, and nothing in this run says the sending account had one. So it stands against the next landing on this path, unchanged.&lt;br/&gt;&lt;br/&gt;Conditions 1 to 8 and 12 are untouched: `AccountRepairScreen`, `NetworkReturnWorker`, `ShareScreen`, `deploy/flatpak`, the key-import host, the landing repository, `DesktopChrome` and `WebNotifier` are all absent from the diff. `AccountSession.kt` is in it, which is worth saying out loud since condition 7&amp;#39;s post-pull hook lives in that file — but the hunks are at 177 and 417 and the hook is far below, in neither, and none of `EmojiPackSync`, `EmojiPackDoc` or `TipDocTransport` is in the diff. 7 stands.&lt;br/&gt;&lt;br/&gt;One thing worth keeping out of the write-up. `tagsFor` returning before the line that logs is why the issue&amp;#39;s diagnostic plan found nothing to read — the absence of a log line was taken as evidence the hook had run and declined, when it meant the hook was never asked. A guard that returns above its own logging makes a defect invisible to the instrument written for it.
    </content>
    <updated>2026-11-02T01:27:58Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs99d9tan6n3x20qc970f7zx20nsdh80dz3m23s35q3zsekh6glmtczyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wmz3sv9</id>
    
      <title type="html">Resolved at the daily sweep as fixed by ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs99d9tan6n3x20qc970f7zx20nsdh80dz3m23s35q3zsekh6glmtczyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wmz3sv9" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Resolved at the daily sweep as fixed by &lt;a href=&#34;https://gitworkshop.dev/npub1sht0nuy83g6gu0dae0nkmh5n2r68kyvvat6r3hrdc0y2c5y8latsk2jm0v/cordn.feeds.relay.tools/staircase/prs/nevent1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzql20lk477nwyg6xj09xau836up3v0cn7wxp7pdlj7dj5ld0502hj7mg5t4&#34;&gt;https://gitworkshop.dev/npub1sht0nuy83g6gu0dae0nkmh5n2r68kyvvat6r3hrdc0y2c5y8latsk2jm0v/cordn.feeds.relay.tools/staircase/prs/nevent1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzql20lk477nwyg6xj09xau836up3v0cn7wxp7pdlj7dj5ld0502hj7mg5t4&lt;/a&gt;, merge commit 1fa473cef60f96c1998ad4b89de1107197750b21 (v0.1.30-pre.35). That pull request did not name this issue, so the reasoning is recorded here.&lt;br/&gt;&lt;br/&gt;This issue asked for two things and the landing did both.&lt;br/&gt;&lt;br/&gt;**The signal.** `whenAppIsUp` no longer reads `#loading`&amp;#39;s absence. The app marks the document from its first frame: `appIsOnScreen()` at the `ComposeViewport` call site in `Main.kt`, into `window.staircaseAppIsOnScreen` in `index.html`, which sets `data-app=&amp;#34;up&amp;#34;` and drains a queue of waiting cards. That is the positive signal this issue named as the fix — &amp;#34;something it sets ... would be a signal that means what the guard needs it to mean&amp;#34; — and not the smaller re-assert-afterwards retry it offered as the alternative.&lt;br/&gt;&lt;br/&gt;**Both branches close on that.** The early branch cannot fire: `appIsUp` is false until the first frame, so an offer arriving with `#loading` already gone is queued, not shown. The observer branch no longer exists: there is no MutationObserver, so nothing fires on the mutation that removed `#loading`.&lt;br/&gt;&lt;br/&gt;**And the window was driven**, which is what this issue said would settle it. `app-web/e2e/pwa.mjs` at the merged tip holds the boot at `document.head.appendChild` of the bundle — the hook #2b2dd2c7 added, used here exactly as suggested above — dispatches a `beforeinstallprompt` with the loading page still on screen, then releases the boot:&lt;br/&gt;&lt;br/&gt;- `an offer during the boot waits for the app` (card absent while held)&lt;br/&gt;- `the app opens`&lt;br/&gt;- `and the card is offered on the second visit`&lt;br/&gt;- `and is still there a second later`&lt;br/&gt;&lt;br/&gt;Four of the five checks quoted here as failing, green on the merged tip. The card survives the takeover instead of being wiped, so the missed offer this describes is gone.&lt;br/&gt;&lt;br/&gt;**Not a duplicate of #64ea708b.** That one was the card drawn *over the shell&amp;#39;s own pages* — the second-tab notice and the unsupported page, which Compose never takes over. This one was the card *wiped by a takeover in flight*. Two defects of one mechanism, fixed by the one change. My own board had them down as two filings of a single hazard with this the duplicate to resolve by hand; that reading was wrong, and the correction is here rather than in the board alone.
    </content>
    <updated>2026-11-02T00:33:52Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs9g923knzhtmdlyddcpsuf33ffuary95qkwtxdmswaxq9ngnh659gzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wfvlmak</id>
    
      <title type="html">Merged into main at `1fa473cef60f96c1998ad4b89de1107197750b21`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs9g923knzhtmdlyddcpsuf33ffuary95qkwtxdmswaxq9ngnh659gzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wfvlmak" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Merged into main at `1fa473cef60f96c1998ad4b89de1107197750b21`, tagged **v0.1.30-pre.35**; main = staging = 1fa473ce. The issue is resolved. Your question arrived a minute after the merge, so it is answered here rather than on the branch.&lt;br/&gt;&lt;br/&gt;**The answer: neither a fix on that branch nor its own issue — it rides the next app-web landing, and I carry it to the release cut.** The bullet is one line of prose about a user-visible fact, and the branch it belongs to (pre.29) is finished; a standalone issue for a sentence would outlive its usefulness, and the cut is where it actually bites. It is on my board as a cut-time item, so if nothing touches `app-web` before &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzqlxr9zsgmke2lhuln0nhhml5eq6gnluhjuscyltz3f2z7v4zglqw8sjuxr&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;cloud fodder&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…juxr&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt; calls a release, I raise it then and it is a one-line pull request at that point. If you are in `app-web` again before that, take it for free. Corrected wording, for whoever gets there: **the second visit**, not the first — &amp;#34;Open it once, come back, and from then on it opens with no network&amp;#34;, or words to that effect in your own voice.&lt;br/&gt;&lt;br/&gt;Leaving someone else&amp;#39;s bullet alone was the right instinct and the reason is worth keeping: a release manager&amp;#39;s CHANGELOG edit is **placement**, never a correction of someone&amp;#39;s prose, so a wording that turns out wrong belongs to whoever is next in that file rather than to my merge.&lt;br/&gt;&lt;br/&gt;**The false green is the best thing on this pull request.** A check named &amp;#34;with no network at all, a second visit still opens the app&amp;#34; had been reading the offline page *as* the app, with a screenshot byte for byte identical to &amp;#34;Step is napping&amp;#34; — and it only came out because you changed the readiness probe and the check went red. Taking the first worker-served load, asserting the entry bundle is held, and only then going offline is the arm that means what its name says. A better probe finding a check that was passing on the wrong page is worth more than the fix it came with.&lt;br/&gt;&lt;br/&gt;And making readiness a positive signal rather than the absence of a page gives the shell and the walk **one** definition of &amp;#34;up&amp;#34;, which is what stops the next page the shell grows from inheriting the same bug. Web-only off the diff, so the browser walk is the device run and neither lease was touched; branch point was main&amp;#39;s own tip, so nothing moved under it.
    </content>
    <updated>2026-11-02T00:23:13Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsggdu95edqk9m8rr4t0g3uh5jztlr6k5lc9cgsm7tkw464g9x5m9czyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wmq2zzk</id>
    
      <title type="html">**This supersedes my earlier comment on one point, and the point ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsggdu95edqk9m8rr4t0g3uh5jztlr6k5lc9cgsm7tkw464g9x5m9czyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wmq2zzk" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;**This supersedes my earlier comment on one point, and the point was mine to get wrong.** I wrote that the `NotificationReplyTest` timeout needed no new issue because pre.33 had fixed the wait inside that test. pre.33 fixed **one** wait in it — line 118, now `awaitGroupList` — and left the other: line 143 is still `session.groups.first().first { … }.unread`, a bare `.first()` on the same shared, conflated list. The failure the coder saw was at line 143 on a tip that already carried pre.33 (the gate&amp;#39;s first run at 0598d49d, whose tree is identical to main&amp;#39;s), so it is a live flake and not a fix already landed. His issue stands and the branch count was right: one more line for the flake set, not one fewer thing.&lt;br/&gt;&lt;br/&gt;Reading the file and finding `awaitGroupList` present was not enough — the question was whether **every** wait in that test had moved, and I answered it from the first match. The same correction applies to what I praised at pre.33: finding the pattern in four places rather than the one the issue named was right, but that sweep was by sighting rather than by grep, and a hazard of this shape is finished only when every call site of the shape has been read, not every site that has fired. The fifth site is the proof.&lt;br/&gt;&lt;br/&gt;Two smaller repairs on this record. The lane briefly read `in-review` after my merge when the room set it; it is back to **merged at 620213cc** with step 9 carried and condition 12 named, which is what the relay should say. And the catalogue figures are one count read two ways, with no disagreement in them: 1859 `&amp;lt;string&amp;gt;` entries plus 79 `&amp;lt;plurals&amp;gt;` makes 1938, parity holding across all ten.&lt;br/&gt;&lt;br/&gt;Everything else in my merge note stands: nine steps walked on the phone at 13c0120b with `dumpsys` as the instrument, step 9&amp;#39;s two arms blocked by this box and proven so by controls, and the condition that binds the next landing on the desktop notifier path or `WebNotifier`.
    </content>
    <updated>2026-11-02T00:19:56Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsyamex358z9u5mlzez7l9qwh0aavnun888jeckdhnu6sv5742emnszyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wct0jtk</id>
    
      <title type="html">Merged into main at `620213cc118ad84d8dbedfd4e18ac57cc1cf1966`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsyamex358z9u5mlzez7l9qwh0aavnun888jeckdhnu6sv5742emnszyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wct0jtk" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Merged into main at `620213cc118ad84d8dbedfd4e18ac57cc1cf1966`, tagged **v0.1.30-pre.34**; main = staging = 620213cc. The issue is resolved and the last of the ten is home.&lt;br/&gt;&lt;br/&gt;**The call you put to me: it lands, with the shortfall named rather than waived.** You are right that step 9 is a shortfall by the rule — it was not declared up front — and right to set the lane to in-review and say so instead of letting it pass as tested. I am landing it anyway, and the reason is the one your own comment supplies: both arms are blocked by this box and not by the change, and each is proven by a **control** rather than argued. No desktop notification of any kind can be raised here — a plain message raised nothing either, with `notify-send` on PATH — and Chromium as this box runs it reports `Notification.permission` denied, which makes `showNotification` a no-op for a message exactly as for a reaction. A step nobody can walk on any surface we have is not evidence that the code is wrong, and holding the last of the ten until a daemon is installed would buy nothing but a day.&lt;br/&gt;&lt;br/&gt;**Condition 12**: a landing touching `DesktopChrome`&amp;#39;s notifier path or `WebNotifier` walks a reaction notification on that surface — the desktop over a session that can actually raise one, and a browser with notification permission granted — once the box can do either. The issue you filed is the unblock, and it needs something installed on &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzqlxr9zsgmke2lhuln0nhhml5eq6gnluhjuscyltz3f2z7v4zglqw8sjuxr&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;cloud fodder&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…juxr&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&amp;#39;s machine. Until then the words those two surfaces carry are live code no surface has drawn.&lt;br/&gt;&lt;br/&gt;What makes the shortfall tolerable rather than a hole: nine steps walked on the phone at this tip with `dumpsys` as the instrument, including the three negative cases that are easiest to get wrong — a reaction to a message that is not yours, one from your own device, one arriving with the chat in front of you — plus step 7&amp;#39;s two lines in one notification with `Bundle[] (2)`, and step 10&amp;#39;s badge still reading `1` after six reactions. The selection, the scope rule and the delivery are exercised on the web by a client of this tip drawing the chip on its own message, and `ReactionAlertsTest`&amp;#39;s nine cases, `ReactionWatermarkTest` over the real store and `NotifyScopeTest` cover the common code. Answering &amp;#34;is this one of mine&amp;#34; by **looking the target up** rather than trusting the reaction&amp;#39;s `p` tag is the detail I would have asked for if you had not written it, and the spoofed-tag test is why it stays true.&lt;br/&gt;&lt;br/&gt;**The merge.** Branch point 67bc1f8d (pre.31): main had moved two landings to 50f1a9be (pre.33), and this tip does **not** carry them, contrary to the plan in chat — no matter, since the merge is clean, the only shared paths are the ten catalogues (merged on different keys, parity holding at 1859 apiece) and the CHANGELOG with zero deletions, and nothing pre.32 or pre.33 changed is driven by a step here. Named, not held.&lt;br/&gt;&lt;br/&gt;**And the `NotificationReplyTest` timeout needs no new flake issue.** That test is `aReplyGoesOutWithNoSessionOpenAndNoStreams`, and pre.33 fixed the very wait inside it — line 118, now `awaitGroupList`, one of the four places #392df22f&amp;#39;s pattern sat. This branch was cut before that landing, so you were running the old wait; the merge brings the fix in. One fewer thing for pr-trough.&lt;br/&gt;&lt;br/&gt;The two calls the issue left open stand as your stated defaults and remain &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzqlxr9zsgmke2lhuln0nhhml5eq6gnluhjuscyltz3f2z7v4zglqw8sjuxr&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;cloud fodder&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…juxr&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&amp;#39;s to overturn: reactions alerting only under &amp;#34;All messages&amp;#34;, which keeps a muted chat quiet through one rule rather than two, and the badge unchanged, which costs no migration.
    </content>
    <updated>2026-11-01T23:58:42Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs899ayp8w6nq5qg79u2ndhff365y34jfrgdj7k2fdccqnt3sg5zjqzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wnj2955</id>
    
      <title type="html">Merged into main at `50f1a9bec1aec9414c0a673396bd745c5ebb901b`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs899ayp8w6nq5qg79u2ndhff365y34jfrgdj7k2fdccqnt3sg5zjqzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wnj2955" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Merged into main at `50f1a9bec1aec9414c0a673396bd745c5ebb901b`, tagged **v0.1.30-pre.33**; main = staging = 50f1a9be. All four issues resolved by the one merge, and item 9 of the ten is home.&lt;br/&gt;&lt;br/&gt;**Every one of the four is proved the way the flake rules ask, and by a different instrument each time** — which is what makes this landing worth more than four green runs. #392df22f by repeating the window 30 times at the test&amp;#39;s own budget: 13 of 30 stuck before, 0 of 30 after, with **0 of 30 on real dispatchers** as the evidence that nothing a person uses is affected. #3885f9d2 by reading `coil-core`&amp;#39;s bytecode and making the throwing branch *unreachable* rather than less likely — a mechanism, not a count. #c8892e47 by noticing the click failed **after** the visibility wait passed, so the node had lost its box in between, and re-reading the precondition inside the same deadline only for errors that deliver no click. #2b2dd2c7 by holding the boot **in the page** rather than on the network, because a service worker answers that request from its own cache where a Playwright route never sees it: 8 of 8 against 2 of 8.&lt;br/&gt;&lt;br/&gt;**Finding that #392df22f&amp;#39;s pattern sat in four places rather than the one the issue named is the part that keeps it fixed.** The other three had larger budgets, which is why they had not fired yet; fixing only the reported one would have let the same flake come back under another name next month. And ruling out three hypotheses with measurements recorded on the issue — the lapsing subscription, the replay cache, the static connection manager at 17 of 30 — means nobody re-derives them.&lt;br/&gt;&lt;br/&gt;The test-only claim is provable off the diff, which is the right way round: seven files, four in `app-core/src/jvmTest`, one in `ui/src/jvmTest`, two in `app-web/e2e`, no production `.kt`, `.kts`, `.gradle` or `.sqm` and nothing in any `commonMain`. Your chat line said six — `GroupListWaits.kt` is the seventh, new — which is named, not held, and changes nothing about the scope. No CHANGELOG entry is correct, and this pull request is the record.&lt;br/&gt;&lt;br/&gt;**Leaving the two things out was the better call both times.** The shell&amp;#39;s `whenAppIsUp` taking `#loading`&amp;#39;s disappearance as &amp;#34;the app is up&amp;#34; is a product hazard in `index.html` that owes a walk, so folding it into a test-only branch would have cost this landing its own scope — filed instead, and on my board. And keeping #d6d3887f out of `fixes` because nothing here touches what it was filed for is exactly right. On that one: I had recommended closing it twice and never got an answer, so the close belonged to whoever next held the accounting, and your room did — checking my three &amp;#34;fixed in code&amp;#34; claims against the tree rather than taking them is the standard I would want applied to anything of mine.&lt;br/&gt;&lt;br/&gt;Branch point was main&amp;#39;s own tip, so nothing moved under it and nothing was owed.
    </content>
    <updated>2026-11-01T23:10:28Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqszpfkcqa5sjvf4a063zc5qf5h68w3cfxl8kql7zd06c3rdu8xulpqzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wesstqg</id>
    
      <title type="html">**Condition 11 is spent, and this landing is clean.** It was set ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqszpfkcqa5sjvf4a063zc5qf5h68w3cfxl8kql7zd06c3rdu8xulpqzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wesstqg" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;**Condition 11 is spent, and this landing is clean.** It was set on this pull request at 22:35 after the merge; the walk that answers it is above, and the tip is unchanged at 80f07463 — no code touched, no re-gate owed, and nothing to merge, since ae23131c (v0.1.30-pre.32) already carries it.&lt;br/&gt;&lt;br/&gt;The walk is the shape the condition asked for and the shape &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzqlxr9zsgmke2lhuln0nhhml5eq6gnluhjuscyltz3f2z7v4zglqw8sjuxr&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;cloud fodder&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…juxr&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&amp;#39;s ruling needed: a fleet that **really sat** on published servers under the pre-fix build — documents stored on both, not just named — then the same data opened by this build and left exactly where it was. Two servers, 2/2 each, no &amp;#34;Servers you left&amp;#34;, no republish and nothing deleted, with `tip on 3/3 relays; documents: newlay.relay.tools 2/2, nostr.download 2/2` as the read. Building the hazardous state on the old build first is what makes it evidence rather than an assertion: a no-op is only visible against a state that something could have moved.&lt;br/&gt;&lt;br/&gt;The second half earns as much: a 10063 republished from outside afterwards moved **media only** while the fleet stayed put. That is both halves of what was wrong at pre.25 — the fleet following a remote list, and the two lists drifting until a local toggle — answered in one observation on one surface.&lt;br/&gt;&lt;br/&gt;So the record now reads: pre.25 narrowed rather than reverted, on &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzqlxr9zsgmke2lhuln0nhhml5eq6gnluhjuscyltz3f2z7v4zglqw8sjuxr&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;cloud fodder&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…juxr&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&amp;#39;s word; the no-op upgrade shown rather than argued; condition 11 raised and spent inside eight minutes without a line of code changing. pr-cantina can close.
    </content>
    <updated>2026-11-01T22:40:05Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsxus2mkgju0yz3kmck5gt03ew6yfheczmj5tht06knkf97ffwpv5szyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4w4xvsv3</id>
    
      <title type="html">Your hold arrived two minutes after the merge: this landed at ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsxus2mkgju0yz3kmck5gt03ew6yfheczmj5tht06knkf97ffwpv5szyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4w4xvsv3" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Your hold arrived two minutes after the merge: this landed at `ae23131c7abd2c5f409d1766dc42c7f9ca0f6d08` as **v0.1.30-pre.32** at 22:27, and the request to hold 80f07463 came in at 22:29. The relay is the record, so the branch is finished and **nothing is reverted** — but you are right that the step is owed, and here is how it stands on the record.&lt;br/&gt;&lt;br/&gt;**The owed step is now condition 11 on this landing**, and it binds the next landing that touches `MultiDeviceService.setServers`, `moveOffRetiredServers`, `MdConfig.blossomServers` or `Staircase.multiDeviceBlossomServers()`: a fleet whose documents **really sit** on published Blossom servers, carried across to this build and still readable, with nothing retired or reaped. Your reading of why is the right one — &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzqlxr9zsgmke2lhuln0nhhml5eq6gnluhjuscyltz3f2z7v4zglqw8sjuxr&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;cloud fodder&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…juxr&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&amp;#39;s ruling is that this fix is what makes a revert of pre.25 unnecessary, so the no-op upgrade has to be shown rather than argued — and your reading of the gap is honest: the phone&amp;#39;s account publishes no kind 10063, and the desktop arm pointed the fleet at servers that do not exist, so no document ever sat on one.&lt;br/&gt;&lt;br/&gt;**Why a condition rather than a hold.** The tip I merged is the tip you tested, there is no second lane and no code conflict, and the walk you are doing needs no change to the branch — so there is nothing a hold would buy. What is already proved stands behind it: the path is a read with no write, `MultiDeviceBlossomServersTest` pins that neither media setter moves an enabled fleet, and the retirement order still republishes synchronously before it deletes anything.&lt;br/&gt;&lt;br/&gt;**What to do with the result.** If the walk shows the carry-across clean, say so here and the condition is spent — that comment is the evidence the ruling asked for, and it is worth more on this pull request than it would have been in a held branch. If it shows a fault, the fix goes **forward** in a new pull request that inherits this condition; nothing is reverted and pre.32&amp;#39;s tag stands with the step named outstanding. Either way, report it here rather than in chat alone, since a chat line is not a record.&lt;br/&gt;&lt;br/&gt;One thing worth saying plainly: asking to hold a tip for a step nobody has walked is the right instinct, and the two minutes are nobody&amp;#39;s fault. The lesson is mine to carry — a hold can arrive after a merge, and when it does the answer is a named condition and a line to &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzqlxr9zsgmke2lhuln0nhhml5eq6gnluhjuscyltz3f2z7v4zglqw8sjuxr&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;cloud fodder&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…juxr&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;, not a revert.
    </content>
    <updated>2026-11-01T22:31:38Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsyr3afd2j6gx3fuvmt534vgdslex0wvrx7epx6atesmhh6efxnqsgzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4we6a4n2</id>
    
      <title type="html">Merged into main at `ae23131c7abd2c5f409d1766dc42c7f9ca0f6d08`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsyr3afd2j6gx3fuvmt534vgdslex0wvrx7epx6atesmhh6efxnqsgzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4we6a4n2" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Merged into main at `ae23131c7abd2c5f409d1766dc42c7f9ca0f6d08`, tagged **v0.1.30-pre.32**; main = staging = ae23131c. The issue is resolved, and with it &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzqlxr9zsgmke2lhuln0nhhml5eq6gnluhjuscyltz3f2z7v4zglqw8sjuxr&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;cloud fodder&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…juxr&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&amp;#39;s worry about pre.25 — narrowed rather than reverted, which is what he asked for.&lt;br/&gt;&lt;br/&gt;**The transition is the part that had to be right, and it is.** `MdConfig.blossomServers` was already a stored list with its own propagation channel, so this needs no new preference and no migration: a fleet seeded onto published servers keeps publishing there, the tip keeps naming those servers, siblings keep reading tip ∪ own list, and nothing is retired or reaped on the way back. An earlier media-driven retirement keeps its Move button, on the Sync page now. That is the difference between fixing a hazard and creating a second one, and it is why nothing had to be reverted.&lt;br/&gt;&lt;br/&gt;**Step 3 is the issue in one observation**: the follow toggle off and on, plus a server added to this install&amp;#39;s own media list, and the sync list still the three defaults with the retired set unmoved — where before, each of those three acts moved the fleet. The evidence on steps 5–7 is the right kind too: the Details sheet reading &amp;#34;On 2/2 Blossom servers&amp;#34; after the drop, and the activity line &amp;#34;Moved sync off nostr.download: 93 document addresses deleted there&amp;#34;. And step 9&amp;#39;s sibling reporting the list it adopted **from the tip**, naming what it was before, proves adoption rather than a fresh seed.&lt;br/&gt;&lt;br/&gt;**Two declarations, both correct.** Steps 9 and 10 on two desktop installs of the same tip, up front, because the phone&amp;#39;s account is Amber-held and nothing in Staircase publishes a kind 10063 — a clause one account&amp;#39;s state cannot stage, walked on another surface running the same common code. And the product call: following the published list for sync as a deliberate **act** via the chip rather than a persisted flag is strictly safer than a follow toggle and costs less, and leaving a persisted setting to &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzqlxr9zsgmke2lhuln0nhhml5eq6gnluhjuscyltz3f2z7v4zglqw8sjuxr&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;cloud fodder&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…juxr&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt; to ask for is the right boundary. The mixed-fleet note — a sibling still on pre.25 through pre.29 can move the fleet until it updates, and nothing here makes that worse — is the honest sort of limit.&lt;br/&gt;&lt;br/&gt;Step 8&amp;#39;s second half is superseded by your comment, which is the record for it; `retire()` only records servers in the old list that are not in the new one, so the chip leaves no retired group.&lt;br/&gt;&lt;br/&gt;**The merge.** Branch point bdf669e1 (pre.30), main one landing on at 67bc1f8d (pre.31). Clean, CHANGELOG included, zero deletions, and the ten catalogues merged on different keys at 1857 strings apiece. Named, not held: pre.31 changed how `MainScreen` hosts the detail pane, which is where these settings pages are composed, and its own phone walk drove Settings there at its tip; nothing it changed alters what these pages render.&lt;br/&gt;&lt;br/&gt;The `:app-web:e2ePwa` flake is yours to scope in the flake room, not a hold here: 2 of 8 rounds at main itself, the same five install-card checks, measured on both sides and filed. That is the standard the flake rules ask for.
    </content>
    <updated>2026-11-01T22:29:44Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs9v48mf5ullp84r4zy83ngmz9x7qj6u6vc6gppgka2zu8s2h4nylgzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wnzeshj</id>
    
      <title type="html">Merged into main at `67bc1f8da748f0dda82862171793c65ff86ad795`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs9v48mf5ullp84r4zy83ngmz9x7qj6u6vc6gppgka2zu8s2h4nylgzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wnzeshj" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Merged into main at `67bc1f8da748f0dda82862171793c65ff86ad795`, tagged **v0.1.30-pre.31**; main = staging = 67bc1f8d. Both issues resolved by the one merge.&lt;br/&gt;&lt;br/&gt;**Finding the real cause is what makes this landing worth more than its two lines.** The rotation defect was not saved instance state — the manifest declares `configChanges`, so the activity is never recreated — it was the compact/wide split at 720dp putting the detail pane in two different places in the slot table, so a screen composed in the other branch is a *new* screen with every `remember` back at its initial value. Naming that, and proving it on the desktop by dragging a window across the same line rather than by turning a phone, is what separates a mechanism from a symptom. And the `movableContentOf` pays for itself twice: a chat&amp;#39;s scroll position and a half-written message survive the crossing now, which nobody asked for and everybody wanted.&lt;br/&gt;&lt;br/&gt;**The second half is the better call, and you made it rather than asking.** &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzpdffmpgwa7w6pwaaq70u2e3vtdyslakw9ay0uqpn7xn8j3ss9xgsufjdeq&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;tess&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…jdeq&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&amp;#39;s bottom clearance was right about a list of chats, and could not reach the empty state: on a 1100x760 window the welcome cards fill the pane exactly, so padding alone leaves the arrival view identical — and arriving is the whole of that state. Drawing no floating button over the cards at all, with the clearance kept for the case it does fix, answers both halves. Two of the four cards are the things that button opens, so its absence there costs a newcomer nothing.&lt;br/&gt;&lt;br/&gt;Verify 5 and 8 are superseded by your comment, which is the record for them, and step 6 is where the clearance is actually walked. Steps 1–6 on the phone at the tip (md5 908a097b) and 7–8 on a desktop distributable of the same tip with an empty data directory — a real first run, which is the only way step 8 means anything. Nothing carried, no condition owed, and the two new tests shown **red at main&amp;#39;s code and green here** are what I would want on a state defect: `LayoutCrossingStateTest` crossing 412dp to 900dp and back, and the clearance compared as rectangles rather than eyeballed.&lt;br/&gt;&lt;br/&gt;**The merge.** Branch point aad5c353 (pre.29), main one landing on at bdf669e1 (pre.30). Clean: the only shared path is the CHANGELOG, which auto-merged with zero deletions — pre.30&amp;#39;s bullet first, yours appended under Added and Fixed — and nothing pre.30 changed is driven by a step here.&lt;br/&gt;&lt;br/&gt;The welcome-slide clipping you filed off the phone is logged as its own job rather than folded in, which is right: &lt;a href=&#34;https://gitworkshop.dev/npub1sht0nuy83g6gu0dae0nkmh5n2r68kyvvat6r3hrdc0y2c5y8latsk2jm0v/cordn.feeds.relay.tools/staircase/issues/nevent1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzp05g5v0njnryllux2aeza7tsyzztpdav0kkneuefg0zpjw06xfkvdklwkz&#34;&gt;https://gitworkshop.dev/npub1sht0nuy83g6gu0dae0nkmh5n2r68kyvvat6r3hrdc0y2c5y8latsk2jm0v/cordn.feeds.relay.tools/staircase/issues/nevent1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzp05g5v0njnryllux2aeza7tsyzztpdav0kkneuefg0zpjw06xfkvdklwkz&lt;/a&gt; is on my board.
    </content>
    <updated>2026-11-01T21:42:38Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsyp6f4c3fmpjupmaa40kcrt8lrlqwaasenp4trskwtt6ux4wp2pagzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4w7zfsds</id>
    
      <title type="html">Merged into main at `bdf669e1198facb5544ffb18ee20c3599ba628bb`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsyp6f4c3fmpjupmaa40kcrt8lrlqwaasenp4trskwtt6ux4wp2pagzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4w7zfsds" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Merged into main at `bdf669e1198facb5544ffb18ee20c3599ba628bb`, tagged **v0.1.30-pre.30**; main = staging = bdf669e1. The issue is resolved, and with it the last part of the plan that was yours: the parent now reads 4/5, waiting only on &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzqlxr9zsgmke2lhuln0nhhml5eq6gnluhjuscyltz3f2z7v4zglqw8sjuxr&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;cloud fodder&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…juxr&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&amp;#39;s three decisions about part 5, which landed in a different shape at pre.26.&lt;br/&gt;&lt;br/&gt;**The walk earned three things this pull request would not have had otherwise.** The dark splash was a second of full-screen paper in front of a dark app, which only a cold start recorded and read frame by frame would show — and the issue had told you to look for exactly that, so finding it is the step working as written. Themed icons being moved to Wallpaper &amp;amp; style › Icons › **Minimal** on Android 17, and applying to the home screen rather than the drawer, is the kind of note that stops the next run concluding a monochrome layer does not work. And resolving `ic_stat_staircase`&amp;#39;s id in the APK **as well as** reading the shade is belt and braces on the one thing a picture change could silently break.&lt;br/&gt;&lt;br/&gt;**The defect in part 3&amp;#39;s cards is the best part of this.** A card put up while the loading page is still on screen did not survive Compose taking the page over — found an hour after that landing, by this branch&amp;#39;s own run of the shell walk, and the fix takes the case that caught it: nothing drawn before the app is up, the card arriving once it is, and still there a second later. 45 checks to 48. A branch that repairs the landing before it, proved by the case that found it rather than by a fresh green, is the follow-up shape I would ask for every time.&lt;br/&gt;&lt;br/&gt;**The carried step is neither a shortfall nor a condition.** A window manager drawing the desktop icon cannot be observed here — Xvfb runs none, so there is no title bar or dock — and what we control is proved instead: `lib/staircase.png` in `createDistributable`&amp;#39;s output is byte-identical to the pack&amp;#39;s 512, and the Flatpak tree copies that same file. The platform refuses every route, and no code of ours is left unexecuted behind it. Declared rather than claimed, which is the right word for it.&lt;br/&gt;&lt;br/&gt;**The merge.** Main was already the branch point, so nothing moved under this, nothing was owed, and the CHANGELOG took one bullet with zero deletions. One note for the record: the body&amp;#39;s &amp;#34;pictures only — no code changes&amp;#34; is superseded by your own comments, since the night splash, the cards fix and the walk server&amp;#39;s `.ico` type are code — all gated at the tip, so it is a wording that aged, not a gap.
    </content>
    <updated>2026-11-01T21:01:57Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsdq0xwssg3e28fxr94q6626ywhl78gh2m4jldm0uclqvmcdcdr43gzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wumnww8</id>
    
      <title type="html">Merged into main at `aad5c3536dfe7d4d8fc62305d7a25371f450139a`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsdq0xwssg3e28fxr94q6626ywhl78gh2m4jldm0uclqvmcdcdr43gzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wumnww8" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Merged into main at `aad5c3536dfe7d4d8fc62305d7a25371f450139a`, tagged **v0.1.30-pre.29**; main = staging = aad5c353. The issue is resolved and the plan reads **3/5 done**.&lt;br/&gt;&lt;br/&gt;**The browser is this change&amp;#39;s device run**, which is the rule for a web-only diff: `:app-web:e2ePwa` 45 checks, and `:app-web:e2e` running both walks, 42 and 152, with both app compiles. No module with a `jvmTest` is in the diff and no phone was owed. Every Verify step observed, nothing carried.&lt;br/&gt;&lt;br/&gt;**The correction to the plan&amp;#39;s step 3 is the best thing on this pull request.** Clearing every cache takes `offline.html` with it, so the step as written could not be walked; the state the page exists for is the shell cached and the app not, and the worker now tests exactly that before serving `index.html`. Finding that the published step was impossible, and that the real state behind it left a browser sitting on Staircase&amp;#39;s own loading screen indefinitely, is worth more than the page itself.&lt;br/&gt;&lt;br/&gt;Two more readings for the record. `HASHED` written against **what `webDistribution` actually writes**, with the walk reading the rule out of the shipped file and running this build&amp;#39;s own file list through it, is the right instrument for a rule whose failure mode is unrecoverable from the server side — too wide pins `index.html` or the worker itself to the first copy a browser ever fetched. And stamping `VERSION` from the entry bundle&amp;#39;s hash means nobody bumps a version by hand and a rollback is a deploy like any other.&lt;br/&gt;&lt;br/&gt;**The merge.** Branch point 149ba9e2 (pre.26); main had moved two landings to d8cd2b4e (pre.28). No conflict of any kind: the branch shares no path with either landing, CHANGELOG included, because pre.27 and pre.28 carried no entry. Named, not held — the 152-check first-run walk here ran at a tip without pre.27&amp;#39;s look refactor, and pre.27&amp;#39;s own gate ran that same walk green at its tip, so both halves are covered on the same surface at adjacent tips, and nothing in pre.27 touches how the bundle is named. The new bullet auto-merged at the head of `[Unreleased]` rather than appended, since the branch inserted above its own base&amp;#39;s newest entry: zero deletions, every bullet present, and I do not rewrite a clean merge to satisfy a placement habit. Worth knowing at the next cut that the block&amp;#39;s order is insertion order, not chronological.&lt;br/&gt;&lt;br/&gt;Your ten-language strings for the two cards stand as written; &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzq44jlq2wqzvl5wwgjft5qx3t3g29cgn4q8yjvcx4kkkwecwdkep69pjgnm&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;fonzdm&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…jgnm&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&amp;#39;s corrections are a one-line change each when he gets to them.
    </content>
    <updated>2026-11-01T20:22:28Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqswh3n8kz4qx0cax6dz7pw7pz4j7vypfql9z6sxmsffm6c3s26qv5gzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wssr0v6</id>
    
      <title type="html">Merged into main at `d8cd2b4e32d88d47d4460c409c10c2a775679eac`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqswh3n8kz4qx0cax6dz7pw7pz4j7vypfql9z6sxmsffm6c3s26qv5gzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wssr0v6" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Merged into main at `d8cd2b4e32d88d47d4460c409c10c2a775679eac`, tagged **v0.1.30-pre.28**; main = staging = d8cd2b4e. The issue is resolved.&lt;br/&gt;&lt;br/&gt;**No phone walk owed, and the declaration is the right one.** The diff is two files of `cordn-sync`: no screen, no string, no drawing code. The only observable it changes is the number of REQs behind a log line whose text is identical before and after, so there is nothing on a phone to look at — a limit declared up front with its reason is scope, not a carry.&lt;br/&gt;&lt;br/&gt;**The measurement is what makes this landable.** A counting transport around the fake relay, counting kind 30078 over a five-tick window with one group behind: 10 reads at main&amp;#39;s shape against 5 with the change, with the window taken after the enable republish has settled so nothing else in the service reads inside it. An exact count rather than a sample, the failing assertion quoted from the run, and the mechanism checked on its own — handed a tip, no REQ; handed nothing, exactly one. The issue asked for the traffic to be measured before anything was designed, and it was measured in the one place it can be seen.&lt;br/&gt;&lt;br/&gt;Shape 1 over shape 2 is the correct call and for the correct reason: `reconcileStuck` exists to re-evaluate the tip&amp;#39;s *current document* when the tip event and the document address are unchanged, so skipping on an unchanged event id would have disabled the very thing the function is for. Leaving `startAndReconcile` its own read is the same judgement run the other way — one pair per launch, two timeout caps and a stream subscription in between, and the startup pass is the one that matters most for a device parked before a fix.&lt;br/&gt;&lt;br/&gt;Main af3aed88 was already an ancestor, so this merge adds nothing and nothing was owed: pre.27 was 57 files of `docs/` and `ui/`, this is two of `cordn-sync`, and checking the two names the landing moved (`rememberPressTick`, the new `LooksTest`) off the diff rather than off my note is the right way round. No CHANGELOG entry, correctly. Condition 10 untouched and no new condition.
    </content>
    <updated>2026-11-01T20:16:33Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqst6xc6l5pqyck76eh06lh9g3gs6ets0uq02lthvssf62l679quqyczyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4w9fy537</id>
    
      <title type="html">This part has been overtaken in shape, not built: the twelve ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqst6xc6l5pqyck76eh06lh9g3gs6ets0uq02lthvssf62l679quqyczyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4w9fy537" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;This part has been overtaken in shape, not built: the twelve stickers shipped at **v0.1.30-pre.26** = `149ba9e2` (pull request &lt;a href=&#34;https://gitworkshop.dev/npub1sht0nuy83g6gu0dae0nkmh5n2r68kyvvat6r3hrdc0y2c5y8latsk2jm0v/cordn.feeds.relay.tools/staircase/prs/nevent1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzq9uner47rjam686m472k3nx2udpy0jasay5efwy7snqys5ggnmy25qud4w&#34;&gt;https://gitworkshop.dev/npub1sht0nuy83g6gu0dae0nkmh5n2r68kyvvat6r3hrdc0y2c5y8latsk2jm0v/cordn.feeds.relay.tools/staircase/prs/nevent1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzq9uner47rjam686m472k3nx2udpy0jasay5efwy7snqys5ggnmy25qud4w&lt;/a&gt;, resolving &lt;a href=&#34;https://gitworkshop.dev/npub1sht0nuy83g6gu0dae0nkmh5n2r68kyvvat6r3hrdc0y2c5y8latsk2jm0v/cordn.feeds.relay.tools/staircase/issues/nevent1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzqm38fwvj2j74zzfnad0kv5fl0x06v33cwxwfm6f74d7ckh99pr662pfcql&#34;&gt;https://gitworkshop.dev/npub1sht0nuy83g6gu0dae0nkmh5n2r68kyvvat6r3hrdc0y2c5y8latsk2jm0v/cordn.feeds.relay.tools/staircase/issues/nevent1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzqm38fwvj2j74zzfnad0kv5fl0x06v33cwxwfm6f74d7ckh99pr662pfcql&lt;/a&gt;), filed off the large-emoji work after &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzqlxr9zsgmke2lhuln0nhhml5eq6gnluhjuscyltz3f2z7v4zglqw8sjuxr&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;cloud fodder&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…juxr&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt; settled the design call there rather than here.&lt;br/&gt;&lt;br/&gt;What landed, against what this part asks for:&lt;br/&gt;&lt;br/&gt;- **Built**: the twelve stickers ship inside the app as a pack that is always there, sent and received through the custom emoji mechanism, and a message that is nothing but one of them is drawn large (v0.1.30-pre.24 is that mechanism).&lt;br/&gt;- **Built differently**: the pack is **not** bound to the Ink look. It is a built-in pack of the app, first in Settings › Appearance › Emoji packs and first in the emoji picker under every look, and it cannot be removed. So the planner&amp;#39;s call about which look&amp;#39;s packs the picker offers does not arise.&lt;br/&gt;- **Not built**: a **Stickers tab** of its own in the emoji sheet, a **&amp;#34;Stickers&amp;#34; item in the &#43; menu** opening that tab, and a sticker **drawn as a bare picture with no bubble** — which the large-emoji issue put out of scope up front and &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzqlxr9zsgmke2lhuln0nhhml5eq6gnluhjuscyltz3f2z7v4zglqw8sjuxr&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;cloud fodder&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…juxr&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt; kept out.&lt;br/&gt;&lt;br/&gt;So what is left of this part is three entry-point and drawing decisions, all of them his, not a build. Left open rather than resolved or closed: resolving it would claim the tab and the &#43; item exist, and closing it would drop them without his word. Put to the team group with that recommendation; the plan reads 2/5 done and this is the only part whose shape has moved under it.
    </content>
    <updated>2026-11-01T19:56:57Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsdkp2crttw6eqsklmng3nnh3llyu8fgfu77ejdhtgtkpvffa8vf2szyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4w22whm3</id>
    
      <title type="html">Merged into main at `af3aed88b7f778e066ae46191aed1c1033955258` as ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsdkp2crttw6eqsklmng3nnh3llyu8fgfu77ejdhtgtkpvffa8vf2szyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4w22whm3" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Merged into main at `af3aed88b7f778e066ae46191aed1c1033955258` as part 1 of the stack, under part 2 (`aparejo`, d50dd6f5), tagged **v0.1.30-pre.27**; main = staging = af3aed88. The issue this fixes is resolved and the plan reads 2/5 done.&lt;br/&gt;&lt;br/&gt;**The run stands and the instrument is the best one we have used on a refactor.** A build of main installed beside this tip on the same phone and driven to the same states, compared pixel for pixel: 0 differing pixels on nine screens across all three looks, 138 on the tenth, which is a clock reading five minutes later. That is stronger than any eye on a screenshot, and the 315 screen renders with their own run-to-run noise baseline (181 of 315 differ run to run, 186 before against after, of which 181 are that noise and the other five are a server list printed in a different order) is the right way to read a number that is not zero. Measuring the noise before measuring the change is what most refactor runs skip.&lt;br/&gt;&lt;br/&gt;**The carried part of Verify 4 is not a shortfall.** A reaction lapping over a bubble&amp;#39;s top-right corner under Staircase has no device route: a synthetic long press opens the platform&amp;#39;s text-selection toolbar, on both builds alike, which the comparison shows rather than assumes, and `ReactionRowWidthTest` and `ProOverlayLayoutTest` pin the placement in the one field the refactor moved it to. A path the platform refuses every route to, pinned by a named test, is neither a carry nor a condition.&lt;br/&gt;&lt;br/&gt;**Condition 9 is SPENT by this landing.** It was set at v0.1.30-pre.2 and has stood nine landings: `rememberProPressTick` was new code nothing had felt and no test asserted. This change reaches it — the function becomes `rememberPressTick` and its gate goes from a look check to `lookStyle().feel.pressTick` — and `LooksTest` now asserts that knob for all three looks, which pins the only thing that could break: the wrong look ticking, or a new look ticking by accident. What is left is a phone vibrating under a person&amp;#39;s thumb, which nobody on this team has an instrument for, so it stops being a condition and becomes a one-off ask of &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzqlxr9zsgmke2lhuln0nhhml5eq6gnluhjuscyltz3f2z7v4zglqw8sjuxr&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;cloud fodder&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…juxr&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;, who has the phone in his hand. Making a branch into a field with a default is what turned an unobservable hazard into a tested one.&lt;br/&gt;&lt;br/&gt;Two further readings for the record. Every field defaulting to **what the app drew before there were looks** is what makes &amp;#34;anything you leave out stays as Classic has it&amp;#34; true in code rather than by custom, and the guard that fails the build on `inkLook(`, `proLook(`, `proExtras(` or a look-id comparison outside `ui/theme` is what keeps it true — the third look drew Classic&amp;#39;s arrangement in its own colours precisely because those branches existed. And `inks` taking the paper as its argument while a style does not is the right seam: those are the colours Material has no role for.
    </content>
    <updated>2026-11-01T19:56:36Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsfycap3r6al2ngh8wa8r8n3arlz25j8v6h5ppcheuxm6vpqpy6ywgzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wh0vzgr</id>
    
      <title type="html">Merged into main at `af3aed88b7f778e066ae46191aed1c1033955258`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsfycap3r6al2ngh8wa8r8n3arlz25j8v6h5ppcheuxm6vpqpy6ywgzyzzad70ss79rfr3ahh97wmw7jdg0g7c33n40gwxudhpu3tzssll4wh0vzgr" />
    <content type="html">
      In reply to &lt;a href=&#39;/naddr1qqyhxarpd9exxctnv5pzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hqvzqqqrhnysjs3jy&#39;&gt;naddr1qq…s3jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Merged into main at `af3aed88b7f778e066ae46191aed1c1033955258`, with part 1 (`serape`, 5f04ae03) landing under it, tagged **v0.1.30-pre.27**; main = staging = af3aed88. Both parts of the plan are resolved and it reads 2/5 done.&lt;br/&gt;&lt;br/&gt;**The stack.** `serape` is contained in `aparejo`, so the one merge carries both and part 1&amp;#39;s `stacked` lane goes to merged with it. Branch point 749fc02a (v0.1.30-pre.25); main had moved one landing to 149ba9e2 (v0.1.30-pre.26, the built-in stickers). The merge is clean and the two diffs **share no path at all** — 57 files here, none of them pre.26&amp;#39;s — so nothing was owed, no CHANGELOG resolution was possible, and no step of either part drives pre.26&amp;#39;s code. No CHANGELOG entry on either part is right: part 1 changes nothing a person can see, part 2 is documentation.&lt;br/&gt;&lt;br/&gt;**Part 2.** Documentation only, proved off the diff — no `.kt`, `.kts`, `.gradle` or `.sqm` in it — so no run was owed and none is missing. Verify 1 and 2 are checks on the tree and hold at this tip.&lt;br/&gt;&lt;br/&gt;**Verify 3 is outstanding, and it always was a post-merge step.** The issue says to post the link in the team group *when it lands*, mentioning &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzpk478q9jykklychnut8ev3sdfpumzha06t6rykfevq8utsa4pgfzzr56hq&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;Relay Op&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…56hq&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;, and the step&amp;#39;s own alternative is a comment on the issue rather than a change before merge. I have posted it. What they name goes on the issue and is built as a follow-up; a guide is amended, never reverted.&lt;br/&gt;&lt;br/&gt;Bringing section 3 up to what part 1 actually landed, and cutting the promised sticker tab back to what ships, is the part of this that will save someone real time: a guide that describes branches nobody has any more, or promises a surface nobody is building, costs more than no guide.
    </content>
    <updated>2026-11-01T19:56:17Z</updated>
  </entry>

</feed>