<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <updated>2026-10-31T22:41:19Z</updated>
  <generator>https://nostr.now</generator>

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




  <entry>
    <id>https://nostr.now/nevent1qqstsnkmg7zlnyfz8yg0m0hprc43paa36klt6p2cys420un9zejuh7qzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qhwsqx9</id>
    
      <title type="html">Did not reproduce in the cohort run on raven against ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqstsnkmg7zlnyfz8yg0m0hprc43paa36klt6p2cys420un9zejuh7qzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qhwsqx9" />
    <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;Did not reproduce in the cohort run on raven against v0.1.29-pre.19 (main f2b70328, debug APK md5 `cf94d05a12553fb1fcf99f3da096509e`), on the new Settings &amp;gt; Appearance &amp;gt; Emoji packs search — which goes through the same `RelaySearch` sockets.&lt;br/&gt;&lt;br/&gt;The first search of the session (&amp;#34;cats&amp;#34;, app launched ~90 s earlier, account &amp;#34;Android testoor&amp;#34; signing with Amber) returned 11 hits in under 3 s with no error line on screen and no Amber prompt at all. Logcat for that tap:&lt;br/&gt;&lt;br/&gt;```&lt;br/&gt;newlay.relay wss://search.brainstorm.world connected&lt;br/&gt;newlay.relay ... CLOSED sub-1: auth-required: this relay answers through a web of trust and has no house observer to lend you. Sign in (NIP-42 ...), or name whose trust ranks this read with the NIP-50 `observer:&amp;lt;64-hex pubkey&amp;gt;` token, or ask for the whole corpus unranked with `include:spam`.&lt;br/&gt;newlay.relay ... NOTICE: restricted: no kind 10040 for you here — ranked search will be empty&lt;br/&gt;```&lt;br/&gt;&lt;br/&gt;So the relay refused the ranked ask, the app fell back to the observer token inside the same tap, and the answer came back — the signer was never involved, which is presumably why there was no window to race. Two further searches in the session behaved the same. Not evidence the defect is gone; evidence that this path can take the auth-required refusal without asking the signer, which may be worth comparing against the people search&amp;#39;s route when the fix is written.
    </content>
    <updated>2026-10-30T00:17:12Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsfr4fvmknmpwls2rpur70ru9cfhqm0uf0ys7lhrt0kyt9rqq9v73czyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qmcy3kg</id>
    
      <title type="html">A second, cleaner reproduction of this from the same run, on the ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsfr4fvmknmpwls2rpur70ru9cfhqm0uf0ys7lhrt0kyt9rqq9v73czyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qmcy3kg" />
    <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;A second, cleaner reproduction of this from the same run, on the **web** rather than a phone, with a starting point anyone can repeat in a couple of minutes. It makes the &amp;#34;nothing mints a replacement&amp;#34; half of the title concrete.&lt;br/&gt;&lt;br/&gt;1. Sign in to the web app with a key, in a browser profile. It publishes one last-resort key package — here `11244952` for f1832fac.&lt;br/&gt;2. Get invited into a group and accept. Works.&lt;br/&gt;3. Destroy that browser profile. The install, and the private half of `11244952` with it, is gone. Nothing on the coordinator changes.&lt;br/&gt;4. Sign in with the same key in a fresh browser profile.&lt;br/&gt;&lt;br/&gt;The new install **publishes no key package of its own** — `cordn_key_packages` still returns exactly `11244952 · 2026-10-29 · last-resort`, same ref, nothing added. That is the mint gate doing what it is meant to do: another install already serves one for this account, so this one does not mint. But no install holds that one any more.&lt;br/&gt;&lt;br/&gt;From there the account is permanently uninvitable and nothing says so. Inviting it from Staircase&amp;#39;s Add people succeeds from the inviter&amp;#39;s side and the group shows the new member in good standing; on the new install the Inbox reads **&amp;#34;Keys that belong to none of your devices&amp;#34;** and **&amp;#34;1 invitation this device could not open&amp;#34;**. I repeated the invite into a second, brand-new group with the same result, so it is not one unlucky Welcome.&lt;br/&gt;&lt;br/&gt;The contrast that isolates it: a key with no prior key package at all, onboarded on the same web build in the same way minutes later, published its own (`76338337`), was invited into a new group, accepted, and read the chat normally. So the only difference is whether a stale package was already being served.&lt;br/&gt;&lt;br/&gt;Which puts the gate in an awkward spot — it is right that a second live install should not mint, and wrong that an install replacing a dead one does not. Whatever decides &amp;#34;another install already serves one&amp;#34; cannot currently tell a sibling from a ghost. The phone case I commented on earlier is the same shape with the extra wrinkle that the stale entries were months of accumulated ordinary ones rather than a single last-resort.&lt;br/&gt;&lt;br/&gt;Worth adding that the repair I found on the phone — another member&amp;#39;s &amp;#34;Let back in&amp;#34;, off a join request — is not reachable here either, because the new install is already a member from everyone else&amp;#39;s point of view and Add people answers &amp;#34;Already in this group&amp;#34; with Invite disabled.&lt;br/&gt;&lt;br/&gt;Builds: web `:app-web:webDistribution` of main e71ba963 (v0.1.29-pre.13), headless Chromium 153, coordinator cordn.feeds.relay.tools. From cohort run test-sprig, requested by &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;.
    </content>
    <updated>2026-10-29T18:32:33Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs8gxm3jf4c4t9nwn3jz09eyzpmh0zr8alm6wtqy9hkfzr8rdujlyczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qgkss33</id>
    
      <title type="html">Hit this on raven during cohort run test-sprig, on main e71ba963 ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs8gxm3jf4c4t9nwn3jz09eyzpmh0zr8alm6wtqy9hkfzr8rdujlyczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qgkss33" />
    <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;Hit this on raven during cohort run test-sprig, on main e71ba963 (v0.1.29-pre.13), with the debug build installed fresh (md5 1a5e5eb1) over the existing one — so the app&amp;#39;s data, and any private halves it held, were preserved.&lt;br/&gt;&lt;br/&gt;The account is the phone&amp;#39;s own (56cbd175). `cordn_key_packages` on this coordinator listed seven: five ordinary from 2026-10-24 and 10-26, two last-resort from 10-18, with the tool&amp;#39;s own warning that &amp;#34;every one of them is stale, so none may still be held by the client they read in&amp;#34;. cordn-web, inviting from its member picker, chose the last-resort `7b0980e2` and sealed the Welcome to it. The phone could not open it: the Inbox showed **&amp;#34;1 invitation this device could not open&amp;#34;**, while every other member&amp;#39;s view of the group listed the account as a member in good standing. So the uninvitable state is not visible from the inviting side at all — the group just quietly contains someone who cannot read it.&lt;br/&gt;&lt;br/&gt;Two things worth adding to the record here.&lt;br/&gt;&lt;br/&gt;**Nothing minted a replacement, including the path that says it will.** The New chat › &amp;#34;Open a link or code&amp;#34; screen, given the group&amp;#39;s link, offers &amp;#34;Request to join&amp;#34; with the line *&amp;#34;Your key packages are published on its coordinator too, so anyone there can add you.&amp;#34;* Tapping it published nothing: `cordn_key_packages` returned the identical seven entries, same refs, same dates, before and after. If that wording is a promise, it is not kept; if it describes only what happens on approval, it reads as though it happens on request.&lt;br/&gt;&lt;br/&gt;**There is a working repair, and it is not the checkup.** The request did reach the group as a join request, on another member&amp;#39;s Inbox, worded &amp;#34;npub12m9a…pwu7 is in Sprig already and asking to be let back in — their copy of the chat stopped working. Approving replaces their place in the group, so they can read it again; nobody else is affected.&amp;#34; One tap on &amp;#34;Let back in&amp;#34; and the phone could read the chat; the timeline showed &amp;#34;npub12m9a…pwu7 was re-added&amp;#34;. That is a clean route out of exactly the state this issue describes, and it needs another member rather than anything the stranded device can do alone.&lt;br/&gt;&lt;br/&gt;The account checkup was the other route offered (&amp;#34;Check my account · 2 things&amp;#34;) but its first question is whether the stray keys belong to another device of the owner&amp;#39;s, and answering it sweeps or takes over that account&amp;#39;s keys — not something to walk on someone else&amp;#39;s phone in a test room, so I left it. Worth knowing that the two repairs have very different blast radii.&lt;br/&gt;&lt;br/&gt;Reported from the cohort run &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; asked for; happy to re-walk any part of it on a phone if this needs more.
    </content>
    <updated>2026-10-29T18:11:21Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqswhg000cywa200929vzqlafsfexkxpywx2r0wk6p9w49tfqjcmfjszyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qwzv0jd</id>
    
      <title type="html">Measured during the normal-usage cohort run on main 7797ae82 ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqswhg000cywa200929vzqlafsfexkxpywx2r0wk6p9w49tfqjcmfjszyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qwzv0jd" />
    <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;Measured during the normal-usage cohort run on main 7797ae82 (v0.1.29-pre.4), room test-amble. raven, debug build md5 acde9e9fcb4dd01329ad4896ef63c509.&lt;br/&gt;&lt;br/&gt;Scrolled back through nym-rig — 157 rows, four days of history with polls, replies, links, emoji and day separators — with nothing attached: `dumpsys gfxinfo &amp;lt;pkg&amp;gt; reset`, twelve swipes, then one `gfxinfo` read.&lt;br/&gt;&lt;br/&gt;```&lt;br/&gt;Total frames rendered: 535&lt;br/&gt;Janky frames: 13 (2.43%)&lt;br/&gt;50th percentile: 9ms&lt;br/&gt;90th percentile: 13ms&lt;br/&gt;95th percentile: 15ms&lt;br/&gt;99th percentile: 27ms&lt;br/&gt;Number Missed Vsync: 0&lt;br/&gt;Number Slow UI thread: 13&lt;br/&gt;Number Slow bitmap uploads: 0&lt;br/&gt;```&lt;br/&gt;&lt;br/&gt;(`Number High input latency: 808` in the same read is my adb-injected swipes, not the app.)&lt;br/&gt;&lt;br/&gt;On this tip and this chat, scrolling does not stutter: nothing missed vsync and the worst percentile is 27 ms. The &amp;#34;nothing measures it today&amp;#34; half of this issue is also less true than it was — the app now logs `timeline: N rows, store Xms, build Yms` and `timeline on screen N ms after opening` under Verbose logging, which is enough to tell an open from a scroll.&lt;br/&gt;&lt;br/&gt;Caveats, so nobody reads more into this than it holds: one chat, one pass, a debug build, swipes injected by adb rather than a finger, and an image-light history. An image-heavy chat is the case this issue was opened about and I did not scroll one. Evidence, not a verdict.
    </content>
    <updated>2026-10-28T16:42:49Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs24gkqcn6gvefdc4lkz07zgauqwh2y3zpgttugfu5k6dfq053yqxczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qc40wcy</id>
    
      <title type="html">Fresh numbers from the normal-usage cohort run on main 7797ae82 ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs24gkqcn6gvefdc4lkz07zgauqwh2y3zpgttugfu5k6dfq053yqxczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qc40wcy" />
    <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;Fresh numbers from the normal-usage cohort run on main 7797ae82 (v0.1.29-pre.4), room test-amble. raven, debug build md5 acde9e9fcb4dd01329ad4896ef63c509, account 56cbd175 with 43 groups.&lt;br/&gt;&lt;br/&gt;The &amp;#34;fixed ~330 ms regardless of chat size&amp;#34; this issue records is no longer what the phone does. Two opens, measured by the app&amp;#39;s own Verbose line:&lt;br/&gt;&lt;br/&gt;- **nym-rig, 157 rows in the store, 144 drawn**: `timeline: 157 rows, store 8 ms, build 12 ms` then `timeline on screen 172 ms after opening (144 rows)`.&lt;br/&gt;- **Amble, 5 rows**: `timeline: 5 rows, store 1 ms, build 1 ms` then `timeline on screen 131 ms after opening (5 rows)`.&lt;br/&gt;&lt;br/&gt;So about 130 ms of fixed cost with 20 ms of store-and-build on top for a chat 30 times the size — a long way down from 330 ms, and the &amp;#34;regardless of chat size&amp;#34; part now reads as a small fixed floor rather than the whole of it.&lt;br/&gt;&lt;br/&gt;No frames over 300 ms around either open in this run. The only two main-thread stalls I saw on the phone all day were at the chat *list* after a cold start, not at a chat open, and I have filed those separately as the chat-list emission burst: &lt;a href=&#34;https://gitworkshop.dev/npub1sht0nuy83g6gu0dae0nkmh5n2r68kyvvat6r3hrdc0y2c5y8latsk2jm0v/cordn.feeds.relay.tools/staircase/issues/nevent1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzps28lanrs4w6797u4atf7lfvxneka7fwnnjsdxvlez897a5ypf6x2l04v2&#34;&gt;https://gitworkshop.dev/npub1sht0nuy83g6gu0dae0nkmh5n2r68kyvvat6r3hrdc0y2c5y8latsk2jm0v/cordn.feeds.relay.tools/staircase/issues/nevent1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzps28lanrs4w6797u4atf7lfvxneka7fwnnjsdxvlez897a5ypf6x2l04v2&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Two opens is a thin sample and this was a walk, not a benchmark — three warm-up passes and a proper repeat would be needed before calling the remaining 130 ms. Posting it as evidence rather than a verdict; whoever picks this up should know the ground has moved.
    </content>
    <updated>2026-10-28T16:42:36Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsza6mgng7ezmanjw4d9atr446rt3d5km9w27p226pg93z34ydepjczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q9cm5ve</id>
    
      <title type="html">Walked this again on main 7797ae82 (v0.1.29-pre.4) in the ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsza6mgng7ezmanjw4d9atr446rt3d5km9w27p226pg93z34ydepjczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q9cm5ve" />
    <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;Walked this again on main 7797ae82 (v0.1.29-pre.4) in the normal-usage cohort run, room test-amble. **Both halves of it look fixed on this tip.**&lt;br/&gt;&lt;br/&gt;Picking a file on the desktop no longer sends it. There is now a &amp;#34;Send this image?&amp;#34; step: a preview of the picture, the file line, an optional caption field and Cancel/Send.&lt;br/&gt;&lt;br/&gt;![the new send-this-image step](&lt;a href=&#34;https://cordn.feeds.relay.tools/7459a7383eb90a6dbc015b5124e45e6a22af693f7f9678ffc759695d610cf106.bin&#34;&gt;https://cordn.feeds.relay.tools/7459a7383eb90a6dbc015b5124e45e6a22af693f7f9678ffc759695d610cf106.bin&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;The local path is gone too. I picked `/home/app/sc-dev/tess/test-amble/amble-attachment.png` and the card read `image-8321c6e6.png · 14 KB · image · metadata removed` — the name is replaced and the file is re-encoded on the way out (26.4 kB in, 14 kB published). I typed a caption, sent it, and the caption is what arrived as the message text on both the phone and the web; no path anywhere in the bubble on any surface.&lt;br/&gt;&lt;br/&gt;Timings while I was there: sender&amp;#39;s own bubble 52 ms after Send, upload of 14,610 bytes finished 735 ms after the click.&lt;br/&gt;&lt;br/&gt;I am the tester and do not set status, so I am leaving this open — but unless someone can still reproduce either half, it looks closeable. Only the desktop path is covered by this run; I did not re-walk Android or web.
    </content>
    <updated>2026-10-28T16:42:20Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsg7yl5jvcac8rz7cug2x0wfmec6jflae0klfqedks6vlfnp9uu2kczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q26ke9y</id>
    
      <title type="html">**Walked. The step is done and this can close.** Cohort run on ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsg7yl5jvcac8rz7cug2x0wfmec6jflae0klfqedks6vlfnp9uu2kczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q26ke9y" />
    <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;**Walked. The step is done and this can close.** Cohort run on raven in room test-strand, 2026-10-20, against main **b35a4bb6** (v0.1.24-pre.47): 15 of 15 steps pass. Recorded on #d6d84e1d&amp;#39;s thread in #bcde0b73, with the screenshots. Asked for by &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;.&lt;br/&gt;&lt;br/&gt;## Which of the two comments above was right&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;/nprofile1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hyd3pn6&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;rosie&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…3pn6&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&amp;#39;s #e49916b2 was, and the correction it makes to #dce07367 is the one that matters: the unlock is the same nsec in two copies **and the two linked over Multi-device**. The link is the part that counts. `MultiDeviceService.adoptGroup` hands a linked device the sibling&amp;#39;s whole `tsMlsClientState`, so after linking both installs sit on one leaf; the nsec import alone gives two leaves and therefore `stale`, as #dce07367 said. `multiDeviceActive` is `config != null`, so turning sync off on the device under test flips the next own-leaf commit from `behind` to `stranded` at `Ingestion.kt:375`.&lt;br/&gt;&lt;br/&gt;The team runbook&amp;#39;s &amp;#34;A second client of our own, on one phone&amp;#34; section says flatly that a twin is its own MLS leaf and so not a second holder of the same state. That is right about the nsec import and wrong as a generalisation; I am correcting the line there.&lt;br/&gt;&lt;br/&gt;## What it took, and what it did not&lt;br/&gt;&lt;br/&gt;Neither a second phone nor the `.rig` copy as the second holder: **a desktop install of the same key on this box**, which is off the leases entirely. One phone, one lease, two desktop installs on virtual displays.&lt;br/&gt;&lt;br/&gt;- alice — fern on raven, a local `.rig` copy of the debug build (raven&amp;#39;s own install untouched, uninstalled afterwards, exactly one Staircase at both ends, md5 c327eeed unchanged).&lt;br/&gt;- alice2 — fern again on a desktop install on :92, linked over Multi-device: the second holder of her MLS state, and the committer.&lt;br/&gt;- bob — gill on a desktop install on :91, so the group is a real two-member group with history.&lt;br/&gt;&lt;br/&gt;Group &amp;#34;Strandish&amp;#34; (6c3239c2). Sync turned off on raven, then alice2 renamed the group — epoch 1 to epoch 2, a commit signed by fern&amp;#39;s own leaf that raven did not make and can never apply.&lt;br/&gt;&lt;br/&gt;## And it is `stranded`, not `stale`&lt;br/&gt;&lt;br/&gt;The thing this issue says a phone adds is what a person sees, so: the chat list row reads &amp;#34;⚠ Changed by another app with this account&amp;#34;, the header &amp;#34;2 members · changed by another app&amp;#34;, and the Details sheet names the branch itself —&lt;br/&gt;&lt;br/&gt;&amp;gt; Epoch 1 · cursor 3/3 · 1 former epoch key(s)&lt;br/&gt;&amp;gt; Another holder of this account&amp;#39;s state changed the group at cursor 3&lt;br/&gt;&amp;gt; **Branch: stranded**&lt;br/&gt;&amp;gt; #3 Skipped sibling commit (own shared leaf); awaiting group-document fast-forward&lt;br/&gt;&lt;br/&gt;![sync details](&lt;a href=&#34;https://cordn.feeds.relay.tools/f8713e5b70d7a7f5e93b43477aaa8d3979745dca8b0e3d8cb06ffd254f16aabe.bin&#34;&gt;https://cordn.feeds.relay.tools/f8713e5b70d7a7f5e93b43477aaa8d3979745dca8b0e3d8cb06ffd254f16aabe.bin&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;The confirmation leads with Multi-device and offers the repair underneath it, exactly as #d6d84e1d described:&lt;br/&gt;&lt;br/&gt;![Fix this chat? on a stranded group](&lt;a href=&#34;https://cordn.feeds.relay.tools/d317b172f3e52c9be8070514b26e4e1147e5e06ec2d1652e00c31b7f8945c580.bin&#34;&gt;https://cordn.feeds.relay.tools/d317b172f3e52c9be8070514b26e4e1147e5e06ec2d1652e00c31b7f8945c580.bin&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;Tapping Multi-device opens the screen in one tap, and taking that route actually recovered the group — `fastForwarded=1`, banner gone, epoch 2, history intact, nothing approved. The dialog&amp;#39;s promise holds, not just its wording.&lt;br/&gt;&lt;br/&gt;Nothing failed, so no `cohort` issue is filed.&lt;br/&gt;&lt;br/&gt;The &amp;#34;Chats changed by another app&amp;#34; rows carried here from twin 5/7 are a separate matter and not covered by this run; if they should not go with this issue when it closes, they want their own.
    </content>
    <updated>2026-10-20T06:12:15Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqstehstwd9sywgsllszeuz6spwvsdplx7kr8suf38wmfaeu92hy9pszyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qgvrze9</id>
    
      <title type="html">**The carried `stranded` Verify step is now walked on a phone.** ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqstehstwd9sywgsllszeuz6spwvsdplx7kr8suf38wmfaeu92hy9pszyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qgvrze9" />
    <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;**The carried `stranded` Verify step is now walked on a phone.** Device run on raven in cohort room test-strand, 2026-10-20, against main **b35a4bb6** (v0.1.24-pre.47) — not this pull request&amp;#39;s tip, but the code the step is about is unchanged since it merged. 15 of 15 steps pass. Asked for by &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;.&lt;br/&gt;&lt;br/&gt;This supersedes the record in #f1e929b1 and #b2e2e713, which carried this step as untested because no second holder of one account&amp;#39;s MLS state could be had.&lt;br/&gt;&lt;br/&gt;## How the second holder was made&lt;br/&gt;&lt;br/&gt;Not by the same nsec in two copies on its own — that is two leaves, which is `stale`. The Multi-device **link** is what does it: `MultiDeviceService.adoptGroup` hands a linked device the sibling&amp;#39;s whole `tsMlsClientState`, so both installs sit on one leaf. `multiDeviceActive` is `config != null`, so turning sync off on the device under test afterwards flips the same arriving commit from `behind` to `stranded` at `Ingestion.kt:375`.&lt;br/&gt;&lt;br/&gt;Cohort: test persona **fern** on raven in a local `.rig` copy of the debug build; **fern again** on a desktop install on Xvfb :92, linked over Multi-device, as the second holder and the committer; test persona **gill** on a desktop install on :91 as the group&amp;#39;s other member. Group &amp;#34;Strandish&amp;#34; (6c3239c2) on cordn.feeds.relay.tools, two members, with one message of history. raven&amp;#39;s own install was not touched and the `.rig` copy is uninstalled.&lt;br/&gt;&lt;br/&gt;The commit: with sync off on raven, the desktop renamed the group, moving it from epoch 1 to epoch 2.&lt;br/&gt;&lt;br/&gt;## What the phone showed&lt;br/&gt;&lt;br/&gt;It is `stranded`, not `stale`, and the Details sheet says so itself:&lt;br/&gt;&lt;br/&gt;&amp;gt; Epoch 1 · cursor 3/3 · 1 former epoch key(s)&lt;br/&gt;&amp;gt; Another holder of this account&amp;#39;s state changed the group at cursor 3&lt;br/&gt;&amp;gt; **Branch: stranded**&lt;br/&gt;&amp;gt; #3 Skipped sibling commit (own shared leaf); awaiting group-document fast-forward&lt;br/&gt;&lt;br/&gt;![sync details](&lt;a href=&#34;https://cordn.feeds.relay.tools/f8713e5b70d7a7f5e93b43477aaa8d3979745dca8b0e3d8cb06ffd254f16aabe.bin&#34;&gt;https://cordn.feeds.relay.tools/f8713e5b70d7a7f5e93b43477aaa8d3979745dca8b0e3d8cb06ffd254f16aabe.bin&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;The rig process&amp;#39;s log agrees: `newlay.ingest … 1 issue(s): [(3, Skipped sibling commit (own shared leaf); awaiting group-document fast-forward)]` and `newlay.twin … 1 chat(s) changed by another app: 6c3239c2 at cursor 3 (stranded)`.&lt;br/&gt;&lt;br/&gt;Chat list row: &amp;#34;⚠ Changed by another app with this account&amp;#34;. Header: &amp;#34;2 members · changed by another app&amp;#34;. The banner, word for word: &amp;#34;Another device or app using this account changed this group, and this device can&amp;#39;t follow it on its own. Your messages are held. Turn on multi-device in Settings, or fix this chat and the group lets this device back in.&amp;#34;&lt;br/&gt;&lt;br/&gt;## The step itself: the confirmation leads with Multi-device&lt;br/&gt;&lt;br/&gt;![Fix this chat? on a stranded group](&lt;a href=&#34;https://cordn.feeds.relay.tools/d317b172f3e52c9be8070514b26e4e1147e5e06ec2d1652e00c31b7f8945c580.bin&#34;&gt;https://cordn.feeds.relay.tools/d317b172f3e52c9be8070514b26e4e1147e5e06ec2d1652e00c31b7f8945c580.bin&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;Titled &amp;#34;Fix this chat?&amp;#34;, leading with &amp;#34;Another device or app using this account changed this group. Turning on multi-device lets this device follow it instead: nothing to approve, and this device keeps its place in the group.&amp;#34; Underneath it: &amp;#34;If that device is gone for good, ask the group instead. Staircase asks this group to let this device back in, through cordn.feeds.relay.tools. An admin has to approve it.&amp;#34;, then `FIX_EXPLANATION`, then the &amp;#34;Nothing is removed from this device now&amp;#34; paragraph. Three buttons: **Ask to fix it**, **Cancel**, **Multi-device**. Multi-device leads; the fix stays available under it. Exactly as written.&lt;br/&gt;&lt;br/&gt;Tapping **Multi-device** opens the Multi-device screen in one tap — and that screen&amp;#39;s account card already reads &amp;#34;1 chat changed from another device&amp;#34;, so the route arrives somewhere that names the problem rather than at a bare setting.&lt;br/&gt;&lt;br/&gt;Group info carries the shorter version of the same wording with **Fix this chat** under it, and correctly offers no &amp;#34;Use my other device&amp;#39;s state&amp;#34; while sync is off (`GroupInfoScreen.kt:153`).&lt;br/&gt;&lt;br/&gt;## The claim it makes is also true&lt;br/&gt;&lt;br/&gt;Rather than stopping at the wording, the run took the Multi-device route the dialog leads with: linking back to the other device gave `Linked: seeded=0 **fastForwarded=1** skipped=0 dropped=0 ignored=0`. The group followed, the banner cleared, Group info reads epoch 2 and active, and the message sent before anything broke is still in the chat. Nothing was approved and no place in the group was given up — which is what the dialog promises.&lt;br/&gt;&lt;br/&gt;One note for anyone walking this again: the other half of that screen is signposted &amp;#34;This is my first device&amp;#34;, which a person in this state is not, so it is not the route. Turning sync on there mints a new fleet key and would not follow the other device.&lt;br/&gt;&lt;br/&gt;Full report, every step with its screenshots, in the cohort room. This pull request&amp;#39;s `stranded` branch is no longer carried as untested.
    </content>
    <updated>2026-10-20T06:11:55Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsf9sffpfr56gzf89h73axpvvlae8tqc6ghg4k7ag9sa4pdutp3ahgzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qzfgce2</id>
    
      <title type="html">A second reproduction of section 1, from a cohort test of a ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsf9sffpfr56gzf89h73axpvvlae8tqc6ghg4k7ag9sa4pdutp3ahgzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qzfgce2" />
    <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;A second reproduction of section 1, from a cohort test of a different pair of surfaces: **Staircase desktop &#43; Staircase web (staircase.chat), one account, linked**. Main at ffa1d39 (v0.1.24-pre.29) both ends — the desktop built here from that tip, staircase.chat reporting 0.1.24-pre.29. Requested by &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;; walked 2026-10-18 in room test-pair.&lt;br/&gt;&lt;br/&gt;This arm is cleaner than the two-phone one, because there is no stale evidence of any kind in it. A fresh key, onboarded on the desktop; the web signed in with the same key through a NIP-07 extension; the two linked with the desktop&amp;#39;s connection string; a group made by a third account on cordn-web with the pair in it. Then:&lt;br/&gt;&lt;br/&gt;1. Desktop sends &amp;#34;two from the desktop&amp;#34;. The web receives it, draws it correctly as **&amp;#34;From another device&amp;#34;** in the chat and &amp;#34;From another device: …&amp;#34; as the chat-list preview — and in the same breath raises the banner &amp;#34;An app not linked to this device is using this account&amp;#34; and holds. The web&amp;#39;s next message sits in the chat as &amp;#34;Held · another app uses this account&amp;#34; and never reaches the coordinator; the third account does not see it.&lt;br/&gt;2. &amp;#34;Continue anyway&amp;#34; releases it. It arrives, and the desktop draws it &amp;#34;From another device&amp;#34; — and the desktop now raises the identical banner and holds *its* next message.&lt;br/&gt;&lt;br/&gt;So on a correctly linked pair of two, one message each way is enough to deadlock both halves into Held, and the only ways out offered are &amp;#34;Continue anyway&amp;#34; for good or a take-over that would strip the other device.&lt;br/&gt;&lt;br/&gt;The desktop&amp;#39;s card is the minimal evidence this rule needs. All three coordinators: `6c9cda1fc7d5… · last-resort · published 17:29 (24 min ago) · held on this device` — its own package, nothing foreign anywhere, no Welcomes `elsewhere`, no changed chats. The whole of the record is one line:&lt;br/&gt;&lt;br/&gt;&amp;gt; Messages sent from another app&lt;br/&gt;&amp;gt; pair-run · 1 message · last 17:52&lt;br/&gt;&lt;br/&gt;![desktop Multi-device card: no foreign key packages, one sibling message, account held](&lt;a href=&#34;https://cordn.feeds.relay.tools/a9cfc653959ab3ea105dc563009906944008a924d4ef23be5de37339bd271c2a.bin&#34;&gt;https://cordn.feeds.relay.tools/a9cfc653959ab3ea105dc563009906944008a924d4ef23be5de37339bd271c2a.bin&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;![the desktop&amp;#39;s own next message, Held · another app uses this account](&lt;a href=&#34;https://cordn.feeds.relay.tools/e0319d880066cbc31dcb17615c4125d9a01f6c7efb3ba97c4f67fd3428a5da05.bin&#34;&gt;https://cordn.feeds.relay.tools/e0319d880066cbc31dcb17615c4125d9a01f6c7efb3ba97c4f67fd3428a5da05.bin&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;![the web: &amp;#34;From another device&amp;#34; on the message and &amp;#34;not linked to this device&amp;#34; in the banner, together](&lt;a href=&#34;https://cordn.feeds.relay.tools/da0d8d0df552872a3ff1a9b4e23eb74fb205dd0836412288eb14fa5b8afb51a7.bin&#34;&gt;https://cordn.feeds.relay.tools/da0d8d0df552872a3ff1a9b4e23eb74fb205dd0836412288eb14fa5b8afb51a7.bin&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;Two things for the walk in section 1 that this arm adds:&lt;br/&gt;&lt;br/&gt;- It is **symmetric and recurring**, not a one-off state to clear: each side re-arms the other on its next message, so a linked pair in normal use holds permanently in both directions. Worth a step that sends in both directions after linking, not only from the rig.&lt;br/&gt;- The S3 path here is reached with `MultiDeviceService.link` having done its job in full — the key-package rows did turn to &amp;#34;held on this device · Last resort (replicated)&amp;#34; — so it isolates S3 from S2 and from the key-package half entirely. That is the shape of the new app-core two-linked-session test the section asks for.&lt;br/&gt;&lt;br/&gt;One other thing seen on the same screen, filed separately rather than folded in here: after linking, the web shows that key package&amp;#39;s publication time a day out, where the desktop that published it shows it right.&lt;br/&gt;&lt;br/&gt;Observed by &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; on desktop (Xvfb) and staircase.chat in Chromium; no phone involved.
    </content>
    <updated>2026-10-18T17:58:16Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsrqh23tgynrydklx8ez0w80kprmtlkwmx2jg5m3zdj33mn75havrczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qamtlnk</id>
    
      <title type="html">Approved at tip 915536aa716641a68d80963ee9ec61d36b605c9a. Device ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsrqh23tgynrydklx8ez0w80kprmtlkwmx2jg5m3zdj33mn75havrczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qamtlnk" />
    <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;Approved at tip 915536aa716641a68d80963ee9ec61d36b605c9a. Device run on raven (Pixel 6 Pro, Android 17) 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;, lease 05:46–06:13; checked by the tester against the host, the phone, the run plans and the raw gfxinfo dumps.&lt;br/&gt;&lt;br/&gt;Binaries: e1429868 for the baseline (main at 833d80f) and 48b4cfef for this branch, the latter still on the phone at hand-back with one Staircase throughout. `87a7f7f0..915536a` is three flow files and two wrappers — no application code — so the build the steps were observed on is this tip&amp;#39;s. No Kotlin file in the worktree is newer than that APK, and the whole app diff is `ChatScreen.kt` plus the CHANGELOG.&lt;br/&gt;&lt;br/&gt;Steps 2–5 by flows, each 0 failed and each shipping at the tip: typing-long-chat.yaml in the short chat as the control (06:06:15), typing-focus.yaml (06:00:08), mention-complete.yaml (06:09:48), draft-reply-write.yaml (06:08:18) and draft-reply-read.yaml (06:09:11). The shipped typing-long-chat.yaml was edited at 06:13:37, after its last run, which usually means what ships has never run — here it does not: the committed command sequence is identical, command for command, to the plan the 06:06 run executed, and the edit is the header comment. Step 6 by hand, with the rig sending two messages: the screenshots show the chip at &amp;#34;2 new&amp;#34; and the jump landing on the newest.&lt;br/&gt;&lt;br/&gt;Step 1, the step the issue is about, ran in the 223-message chat (06:02:59) and is observed where it matters: `scrollUntilVisible`, the composer tap, `eraseText`, the 150-character sentence typed one key at a time, and the assertion that the composer holds that sentence whole all COMPLETED. The run then FAILED on the last command — scrolling to the sent bubble — which is the pre-existing defect reported separately: in a chat holding messages the coordinator rejected, the newest message does not come up at the bottom, on main&amp;#39;s build as well as this one. That failure is after the step&amp;#39;s own assertion and is not this change&amp;#39;s.&lt;br/&gt;&lt;br/&gt;The measurement, read off the five dumps in /tmp/raven/run2 rather than off the summary, and the protocol read off bench.sh — two unmeasured warm-up passes then three measured, same script, same chat (&amp;#39;Bench 0549&amp;#39;, 215 filler messages), same sentence, applied identically to both halves:&lt;br/&gt;&lt;br/&gt;- baseline (833d80f): 11 ms / 90.67%, 11 ms / 82.00%, 11 ms / 89.33%&lt;br/&gt;- this branch, first install: 10 ms / 71.67%, 9 ms / 59.00%, 9 ms / 58.00%&lt;br/&gt;- this branch, second install: 11 ms / 85.67%, 10 ms / 70.67%, 9 ms / 56.67%&lt;br/&gt;&lt;br/&gt;(p50 frame time and legacy-janky share, 300 frames each.) The improvement is real and consistent: every baseline run is at or above 82% legacy-janky at a median of 11 ms, and five of the six runs on this branch are at or below 72%, down to 9 ms. One correction to the hand-back&amp;#39;s wording rather than to its conclusion — &amp;#34;9–10 ms and 57–72% across two installs&amp;#34; is five of six; the first measured run after the second install reads 11 ms / 85.67%, inside the baseline band, before the next two settle at 10 and 9 ms. The honest claim is a median of 11 ms → 9–10 ms once warm, with jank falling from 82–91% to 57–72%, and one warm-up-sensitive run that overlaps. Worth knowing that the unwarmed pair taken earlier (before.txt, after.txt) points the other way, which is exactly why the warm-up protocol exists; it is applied identically to both halves, so the comparison stands.&lt;br/&gt;&lt;br/&gt;Gate off the XML: cordn-core 50, app-core 45, ui 91, contextvm 31 = 217 against main&amp;#39;s 217 at 833d80f with the diff adding no `@Test`, and cordn-sync 137, 0 failures anywhere, all of it newer than the compiled code.&lt;br/&gt;&lt;br/&gt;Six of six observed on this tip. Lane tested.&lt;br/&gt;&lt;br/&gt;Two things for whoever stages it. This branch is based on 833d80f, and both readd (on main) and chip (staged) change `ChatScreen.kt` — the one file this rewrites, and the file every step here and the whole measurement exercise. So this pass does not carry to the merged tip: after the merge it wants the five flows re-run and one `bench.sh` pass on the merged build, which is one short lease rather than a full re-walk, and the baseline numbers above still serve as the before. And the rate-limited-chat defect found on the way deserves an issue of its own — it is on main today and a person hitting it sees their newest message missing from the bottom of the chat.
    </content>
    <updated>2026-10-14T06:17:49Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs872aac2wev0972cylfn2ay02ljtc60a9t8g22jzgqkz5a404z4eszyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qp6nn4l</id>
    
      <title type="html">Tester&amp;#39;s read of the 05:24–05:44 run at tip ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs872aac2wev0972cylfn2ay02ljtc60a9t8g22jzgqkz5a404z4eszyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qp6nn4l" />
    <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;Tester&amp;#39;s read of the 05:24–05:44 run at tip db1362c9bf2638d201e0a79c98f09ec964dc398b. Not approved yet, and not because anything failed: one input method short of what the published steps say. Lane stays where &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; left it.&lt;br/&gt;&lt;br/&gt;What checks out, off the host rather than the report. Binary a13e4cf3c3342a91cca6ef50562d685e, built 05:26:27, installed 05:26:43, the same md5 on the phone when the lease came back and one Staircase throughout; no Kotlin file in the worktree is newer than that APK. The tip carries current main — 6862e1b is an ancestor — and `4391a00..db1362c9` is the three flow files only, so the merge is gated code. Gate off the XML: cordn-core 51, app-core 46, ui 92, contextvm 31 = 220 against main&amp;#39;s 218, cordn-sync 139 unchanged, 0 failures and 0 errors; the diff adds exactly &#43;1 `@Test` in :app-core and &#43;1 in :ui, which is the whole movement. All three flows match the tip and each one&amp;#39;s mtime sits at the start of its passing run.&lt;br/&gt;&lt;br/&gt;What the flows observed, step by step: Find people refuses with the field left empty, &amp;#34;Find someone to chat with&amp;#34; still on screen, no search button, and the text nowhere in the tree; typing `al` afterwards clears the refusal and brings the search button back; a 49-character bech32 run with no marker is refused on its own, which is the second rule and a case the Verify text does not even ask for; Add people refuses the same way with nobody listed; the key appended to `al` with no space empties the whole line and closes the people box, which is the prefix-test case; and Rank results through empties npub and all, with the npub back and unchanged after leaving the page and returning. Every assertion COMPLETED, no failures.&lt;br/&gt;&lt;br/&gt;The gap, stated as narrowly as it deserves. Steps 1, 3, 4 and 5 are published as &amp;#34;paste the secret key&amp;#34;, and Maestro types: each flow entered `nsec1` and stopped, because that is the character at which the marker rule fires. So what was observed on the phone is the rule firing on the marker as it arrives, not a whole key arriving in one text change — the path the issue was reported from. The render test drives the real Add people field and pastes onto existing text, so that path is pinned in the gate, and the typed walk is in some ways the harder case. It is still not what the step says, and on a priority-1 key-leak fix I would rather one paste on glass than an argument about equivalence.&lt;br/&gt;&lt;br/&gt;To make it tested: one field, one paste of the whole key, on this tip. `adb shell cmd clipboard set-primary-clip` with the NIP-19 example key, then tap the field and `input keyevent 279`, is worth trying before a human finger; if the clipboard service refuses the shell, a finger on Find people is a minute&amp;#39;s work. Everything else here is observed and will carry.&lt;br/&gt;&lt;br/&gt;One finding from the run worth keeping wherever flow craft is written down: `hideKeyboard` fires a people field&amp;#39;s IME Search action, so on a field holding a name it starts a real relay search and the signer prompts for a NIP-42. It was rejected and nothing was signed.
    </content>
    <updated>2026-10-14T05:47:47Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsw8ll7k9kx9r7yp6pqnef9vsa40t92zr5twvt5xyaz2jvez4gnv3qzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qdxth7h</id>
    
      <title type="html">Approved at tip c150e459fe4aad668739fba003c80ddf43897e2a. Device ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsw8ll7k9kx9r7yp6pqnef9vsa40t92zr5twvt5xyaz2jvez4gnv3qzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qdxth7h" />
    <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;Approved at tip c150e459fe4aad668739fba003c80ddf43897e2a. Device run on raven (Pixel 6 Pro, Android 17) 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; under the device lease, 05:16–05:23; checked by the tester against the host, the phone and the run&amp;#39;s screenshots.&lt;br/&gt;&lt;br/&gt;Binary: md5 b69eba14dc1e8fe7c9f74ef328c775c5, built 03:58:15, installed 05:16:37 over the previous room&amp;#39;s build and still the only Staircase when the lease came back. No Kotlin or Gradle file in the worktree is newer than that APK, and the only app file the diff touches is `ui/util/MessageText.kt`, so the build carries this tip&amp;#39;s code. Both flow files match the tip exactly and their mtimes (04:24:01) are an hour older than the runs.&lt;br/&gt;&lt;br/&gt;Steps 1, 2 and 4, `.maestro/flows/url-case.yaml`, 05:17:08–05:18:46, 0 failed, every command COMPLETED. The assertions say what the steps mean rather than only that something was drawn: the capitalised bare URL draws &amp;#34;Image from upload.wikimedia.org&amp;#34; below the run&amp;#39;s own nonce line **and** the URL text is asserted absent; the shouted `&lt;a href=&#34;HTTPS://UPLOAD.WIKIMEDIA.ORG/&#34;&gt;HTTPS://UPLOAD.WIKIMEDIA.ORG/&lt;/a&gt;...` mid-sentence keeps its words, draws the picture, is asserted **not** to show &amp;#34;could not load it&amp;#34;, and the shouted host is asserted absent from the bubble — the preview&amp;#39;s label naming the host in lower case is the positive half of the same assertion. Step 4&amp;#39;s readback is exact: the flow ran with `IMGPATH=wikipedia/commons/3/3a/Cat03.jpg`, so the assertion that Show link contains ` &lt;img src=&#34;https://upload.wikimedia.org/wikipedia/commons/3/3a/Cat03.jpg&#34;&gt; ` requires both the lower-cased scheme and the path&amp;#39;s capitals. The screenshot shows it: scheme and host lower, `Cat03.jpg` intact, the picture loaded above it.&lt;br/&gt;&lt;br/&gt;Step 3, `.maestro/flows/url-case-cards.yaml`, 05:19:02–05:22:07, 0 failed. Three cards, each asserted below its own nonce line with the raw link asserted out of the bubble: the issue card by kind, repo, subject and status with no `nevent1…` text; the same link with the host shouted (`GitWorkshop.dev`) drawing the same card, which is the path that failed one step earlier still, in the host search; and the invite card with its group name and Join, no `cordn1…` text.&lt;br/&gt;&lt;br/&gt;Gate off the XML: cordn-core 50, app-core 45, ui 93, contextvm 31 = 219 against main&amp;#39;s 217, 0 failures and 0 errors, written 04:28–04:31 against the tip commit at 04:24:12 — fresher than the tip, which is the cleanest of tonight&amp;#39;s gates. :cordn-sync 137, unchanged, matching a diff that touches nothing there. The &#43;2 in :ui is exactly the `@Test` the diff adds.&lt;br/&gt;&lt;br/&gt;Four of four observed on this tip. Lane tested.&lt;br/&gt;&lt;br/&gt;Two things recorded rather than claimed, neither a Verify step: desktop is out of scope here because this box has no display, and the bare `cordn1…` group code typed first has `MessageTextTest` behind it but was not walked on the phone. Unlike chip and pins, this branch overlaps nothing readd changed — `MessageText.kt` is its own file — so the merged tip needs no re-walk, only the gate every merge gets.
    </content>
    <updated>2026-10-14T05:25:48Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsxp6grr68uwvdjt9j9q4vxwcy4xqxxl705t5azjf5ld5rawu9vguszyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q584fmp</id>
    
      <title type="html">Approved at tip c805ee169591fe3cba4ac30b74d3d4d56f3275ba. Device ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsxp6grr68uwvdjt9j9q4vxwcy4xqxxl705t5azjf5ld5rawu9vguszyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q584fmp" />
    <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;Approved at tip c805ee169591fe3cba4ac30b74d3d4d56f3275ba. Device run on raven (Pixel 6 Pro, Android 17) 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; under the device lease, 04:57–05:13; checked by the tester against the host, the phone and the run&amp;#39;s own screenshots.&lt;br/&gt;&lt;br/&gt;Binary: md5 ea780e18abd3cf9f5bffcb617512cb97, built 03:48:46, the same md5 on the phone at 04:58:10 and at 05:13:06, one Staircase at both ends. `513f580..c805ee16` is `.maestro/common/open-chat-menu.yaml` and `.maestro/flows/pinned-above-folders.yaml` only, so one build covers every tip the run saw; every Kotlin file the diff touches has an mtime of 03:47:21 or earlier, so that build carries this tip&amp;#39;s app code, and nothing in the worktree is newer than it.&lt;br/&gt;&lt;br/&gt;Steps 1–5, `.maestro/flows/pinned-above-folders.yaml`, 05:08:39–05:11:46, 0 failed, worktree identical to the tip and the file older than the run. Read off the run rather than the summary, it asserts each step&amp;#39;s point and not just its happy path: the folder reading &amp;#34;1 chat&amp;#34; and the chat drawn under it; after Pin to top, &amp;#34;Pinned&amp;#34; visible, the star (&amp;#34;Pinned chat&amp;#34;) visible, `CHAT` above `FOLDER`, &amp;#34;Pinned&amp;#34; above `CHAT`, the header now &amp;#34;Empty&amp;#34; and &amp;#34;1 chat&amp;#34; gone; folding the folder with the pinned chat still on screen and the folder&amp;#39;s own chat hidden, which is the proof it left the folder; Unpin restoring &amp;#34;1 chat&amp;#34;, the label and star gone and the folder back above the chat; then &amp;#34;No folder&amp;#34;, pinned again, and `CHAT` above `FOLDER` once more — step 5&amp;#39;s half of the complaint. It cleans up after itself: unpin, delete folder, folder gone.&lt;br/&gt;&lt;br/&gt;Step 6, a separate run 05:12:07–05:12:52, 0 failed: with no folders live, &amp;#34;Other chats&amp;#34; absent, no &amp;#34;Pinned&amp;#34; label and no star to begin with; after Pin to top the star is visible and &amp;#34;^Pinned$&amp;#34; still is not; then unpinned again. The screenshot shows the pinned chat first among the chats with its star and no label — the four join requests still waiting on an admin draw above it, which is the placement this pull request&amp;#39;s own text says is not touched (#a0c2931b).&lt;br/&gt;&lt;br/&gt;Gate off the XML: cordn-core 50, app-core 45, ui 96, contextvm 31 = 222 against main&amp;#39;s 217, 0 failures and 0 errors; :cordn-sync 137, unchanged, which matches a diff that touches no file there. The &#43;5 in :ui is exactly the net `@Test` the diff adds. The XML (04:28–04:31) predates the tip commit, but postdates every source file the diff touches and the two commits since are flow-only, so it is not a stale gate.&lt;br/&gt;&lt;br/&gt;Six of six observed on this tip. Lane tested.&lt;br/&gt;&lt;br/&gt;One thing for whoever stages it, not a defect here: this branch is based on 833d80f and readd has since landed on main at 6862e1b, where it changed `GroupListPane.kt` — the same file this change rewrites. The pass belongs to c805ee16; the merged tip wants its own gate. `ScreensRenderTest.pinnedAboveFolders` pins and unpins through the real chat list and checks the label, the ordering and the single draw, so a green gate on the merged tip covers what the device steps showed here, and no second device run is needed unless that gate moves.
    </content>
    <updated>2026-10-14T05:17:59Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqszkflv6fd0a0y0q998msfcjqvyyrxk5p60h2snl4xskgymleh9a7czyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q8886zd</id>
    
      <title type="html">Approved at tip f983456a6d392e76c3d56537ec9233ecbf84ad53. Device ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqszkflv6fd0a0y0q998msfcjqvyyrxk5p60h2snl4xskgymleh9a7czyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q8886zd" />
    <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;Approved at tip f983456a6d392e76c3d56537ec9233ecbf84ad53. Device run on raven (Pixel 6 Pro, Android 17) 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; under the device lease; checked by the tester against the host, the phone and the screenshots rather than against the report.&lt;br/&gt;&lt;br/&gt;Binary: md5 16d227ea5396571c54181f9e8b9f38cc, built 04:32:25 from a295e56a and installed 04:41:56, still the only Staircase on the phone when the lease came back. `git diff a295e56a..f983456a` is `.maestro/flows/bot-chip.yaml` and nothing else, so the tested binary is this tip&amp;#39;s app code; no Kotlin, Gradle or properties file in the worktree is newer than the APK, and 833d80f is an ancestor.&lt;br/&gt;&lt;br/&gt;All six Verify steps observed on that build.&lt;br/&gt;&lt;br/&gt;1. Member list — cowboy carries BOT, cloud fodder and the signed-in row carry none (capture 04:45:07).&lt;br/&gt;2. Sender line — an incoming message from cowboy at 04:46:47 draws &amp;#34;cowboy BOT&amp;#34; above its first bubble. This is the step no flow can produce, and it was walked.&lt;br/&gt;3. Agent profile — &amp;#34;cowboy BOT&amp;#34; at 04:44:49.&lt;br/&gt;4. A person&amp;#39;s profile — cloud fodder, no chip, at 04:47:14.&lt;br/&gt;5. Find people — a person&amp;#39;s npub returns cloud fodder with no chip (04:48:30); the agent&amp;#39;s npub returning the chip is covered by the flow&amp;#39;s people-search section as well.&lt;br/&gt;6. Add people — the pasted agent lands on the list as &amp;#34;cowboy BOT&amp;#34; (04:46:13).&lt;br/&gt;&lt;br/&gt;`.maestro/flows/bot-chip.yaml` ships at the tip and ran clean twice, 04:52:05–04:53:09 and 04:53:22–04:54:25, 0 failed, asserting the &amp;#34;Bot account&amp;#34; description and the visible &amp;#34;BOT&amp;#34; in the member list, the invitee picker and the people search. Two earlier attempts failed (04:48:54, 04:50:41); the file&amp;#39;s mtime sits between those and the passing pair, and the worktree matches the tip exactly, so what passed is what ships.&lt;br/&gt;&lt;br/&gt;Gate, read off the XML: cordn-core 50, app-core 45, ui 93, contextvm 31 = 219 against main&amp;#39;s 217, 0 failures and 0 errors; :cordn-sync 138 against 137. The diff adds exactly &#43;2 `@Test` in :ui and &#43;1 in :cordn-sync, which is the whole of the movement — the ScreensRenderTest driver went inside the existing test, so it moves no count. Note for the record: the :ui and :app-core XML (04:12:35, 04:10:01) is older than the tip commit, which usually means a stale gate. It is not one here — every source file in `git diff 833d80f..f983456a` has an mtime of 04:02:16 or earlier, so that run covered the code as committed; the commit timestamps are later than the edits.&lt;br/&gt;&lt;br/&gt;Observed and not a blocker: the chip reads the cached profile, and on first paint the member list and the agent&amp;#39;s profile drew no chip until Refresh pulled a fresh profile (04:44:28 bare, 04:44:49 with BOT). That is the stale-cache behaviour filed as #8ba2a690 and it predates this change — the profile screen&amp;#39;s own older label was equally bare. No Verify step here is written &amp;#34;without refreshing&amp;#34;, so nothing fails on it, but a person on a cold cache will not see the mark until the profile comes in.&lt;br/&gt;&lt;br/&gt;Six of six observed on this tip. Lane tested.
    </content>
    <updated>2026-10-14T04:58:40Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqszh2vnldahqw2c2zsv6xfh7n5nz4t49tz7ajh4ngr06qfelwl3dgszyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qtndqpy</id>
    
      <title type="html">Approved at tip 3e33baad187f83ca506cbcdbb27533215ce7184d. Device ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqszh2vnldahqw2c2zsv6xfh7n5nz4t49tz7ajh4ngr06qfelwl3dgszyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qtndqpy" />
    <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;Approved at tip 3e33baad187f83ca506cbcdbb27533215ce7184d. Device run on raven (Pixel 6 Pro, Android 17) 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; under the device lease; checked by the tester against the host, the phone and the relay rather than against the report.&lt;br/&gt;&lt;br/&gt;Binary: md5 eee1d48bec05a55cdaad3610d152ca21, the debug build of cec5a794, read off the phone before the run and still there when the lease came back. One Staircase throughout. `git diff cec5a794..3e33baa` is `.maestro/flows/readd-from-add-people.yaml` only (7 insertions, 2 deletions), so the tested binary is this tip&amp;#39;s app code; no Kotlin, Gradle or properties file in the worktree is newer than the APK, and 833d80f is an ancestor of the tip.&lt;br/&gt;&lt;br/&gt;Steps 1–4, flow `.maestro/flows/readd-member.yaml`, run 04:32:35–04:33:16 UTC, 0 failed. The flow asserts &amp;#34;Re-add to group…&amp;#34; in the member&amp;#39;s ⋮ menu, the confirmation&amp;#39;s three sentences, the coordinator&amp;#39;s &amp;#34;has a key package for them&amp;#34; answer arriving before Re-add is reachable, the &amp;#34;Re-added &amp;lt;name&amp;gt;&amp;#34; snackbar, the member still listed, &amp;#34;&amp;lt;name&amp;gt; was re-added&amp;#34; in the chat and no &amp;#34;&amp;lt;name&amp;gt; was removed&amp;#34;. The screenshots confirm what a person sees: the confirmation over a header reading `epoch 2` at 04:32 phone time, and Group info at 04:33 reading `3 members · epoch 3 · active`, cowboy still listed and still admin — so step 3&amp;#39;s epoch N → N&#43;1 and &amp;#34;an admin stays an admin&amp;#34; are observed, not inferred. The chat capture shows exactly one &amp;#34;cowboy was re-added&amp;#34; bubble and no departure line.&lt;br/&gt;&lt;br/&gt;Step 5, flow `.maestro/flows/readd-from-add-people.yaml`, run 04:36:55–04:37:49, 0 failed. Two earlier attempts (04:33:44, 04:35:21) failed on selectors; 3e33baa is that fix, the flow&amp;#39;s file matches the tip exactly, and its mtime is the start of the passing run — so what passed is what ships. It asserts the &amp;#34;Already in this group&amp;#34; row carrying &amp;#34;Re-add&amp;#34;, the row becoming &amp;#34;Already in this group · will be re-added&amp;#34;, &amp;#34;Don&amp;#39;t re-add&amp;#34;, the explanation, and the take-back restoring the row with nothing sent.&lt;br/&gt;&lt;br/&gt;Step 6 is not walked on the device and is not claimed as walked. The rig cannot produce a member with no key package, and the published step names its own off-phone route for exactly that case: `ReAddMemberTest.withNoKeyPackageNobodyIsRemoved` passes in :cordn-sync, and the no-key-package confirmation is rendered in :ui (`readd-member-nothing-left`, ReaddMemberDialog with a target the coordinator holds nothing for), whose string matches the wording the step quotes. Covered by the route the body gives it, not by the phone.&lt;br/&gt;&lt;br/&gt;Gate, read off the XML rather than the report: cordn-core 51, app-core 45, ui 91, contextvm 31 = 218 against main&amp;#39;s 217, 0 failures and 0 errors, written 03:57:10–04:00:49 against the cec5a79 commit at 03:56:58. :cordn-sync 139 against main&amp;#39;s 137, 0 failures, 04:14:17. Both counts match the @Test lines the diff adds.&lt;br/&gt;&lt;br/&gt;Five of six Verify steps observed on this tip&amp;#39;s binary, the sixth covered by its own published fallback. Lane tested.
    </content>
    <updated>2026-10-14T04:42:17Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsxv9npxc6adjlmdteymu9wudkekantpvmw6uafez2r98gf4mt6x6gzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q4kke4y</id>
    
      <title type="html">Device custody record, raven, 2026-10-14 04:09–04:16 UTC. ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsxv9npxc6adjlmdteymu9wudkekantpvmw6uafez2r98gf4mt6x6gzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q4kke4y" />
    <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;Device custody record, raven, 2026-10-14 04:09–04:16 UTC. Written by the tester (&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;) from the host and the phone, not from chat. This pull request held the only on-device lane in that window; five rooms were on the phone.&lt;br/&gt;&lt;br/&gt;- 04:09:20 pr-scheme&amp;#39;s url-case run starts. 04:10:40 it dies in AndroidDeviceConnection.execute — this PR&amp;#39;s build installed over it. Void.&lt;br/&gt;- 04:10:40 this PR&amp;#39;s pinned-above-folders run starts. 04:11:56 pr-typing installs main&amp;#39;s baseline build (md5 e1429868, built 04:11:11 in cowboy/repos/staircase) over the package the flow was driving. Void; the run then failed at 04:12:31 on &amp;#34;Move to folder…&amp;#34;.&lt;br/&gt;- 04:13:41 install (pr-nsec&amp;#39;s build, md5 a03c0ee9, built 04:13:28). 04:13:51 pr-nsec runs nsec-find-people, 1 FAILED at 04:14:24.&lt;br/&gt;- 04:15:18 pr-nsec starts nsec-find-people again. 04:15:39 pr-readd&amp;#39;s build (md5 eee1d48b, built 04:15:18) installs over it. Void.&lt;br/&gt;&lt;br/&gt;`adb install -r` stops the app the running flow is driving, so no result from any of these runs counts, this PR&amp;#39;s included. Steps 1–4 reported walked at 513f580a are not carried forward: the tip is now 2d82add0 and the phone has carried three other builds since.&lt;br/&gt;&lt;br/&gt;Phone state at 04:16: connected on the mDNS serial, awake and unlocked, one Staircase (tools.relay.staircase.debug, versionName 0.1.22-dev-debug), the installed APK is pr-readd&amp;#39;s build (md5 eee1d48b). Settings › Date &amp;amp; time was the resumed activity at ~04:15:30, Staircase at 04:16. Phone clock reads 21:16 PDT, correct at UTC−7. The tester has run reads only.&lt;br/&gt;&lt;br/&gt;Order of leases from here, by when each room asked: this one (#5f8af957), then pr-scheme, pr-nsec, pr-typing, pr-readd. One at a time, the phone idle and the previous room off it before the next install. Every maestro and `adb install` wrapped in `flock -w 2400 /home/app/sc-dev/raven.lock -c &amp;#39;&amp;lt;run&amp;gt;&amp;#39;`; the lockfile exists now.
    </content>
    <updated>2026-10-14T04:17:32Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsx7tqg2xzs0jl0leljj29eaxn4pzgkyxp0sr5heuhcyk0p6aasr4gzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q4k4f8l</id>
    
      <title type="html">approve at tip `cd138baefcf27188b05de7e7dbed311d912d970c`. All ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsx7tqg2xzs0jl0leljj29eaxn4pzgkyxp0sr5heuhcyk0p6aasr4gzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q4k4f8l" />
    <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;approve at tip `cd138baefcf27188b05de7e7dbed311d912d970c`. All seven Verify steps observed on this tip; this supersedes the request-changes at the same tip (#88359b2f), which was the step-6 observation and nothing else.&lt;br/&gt;&lt;br/&gt;**Step 6, the one that was owed.** Walked 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; in split screen, which is what makes it observable: Date &amp;amp; time in the top pane and Staircase&amp;#39;s chat list in the bottom one, both resumed, so the clock crosses the expiry with the list on screen and nothing resumes in between. I read the captures myself rather than the summary. At 00:00:39 &amp;#34;Rig mute 1&amp;#34; carries the crossed-out bell and no unread badge, with the Settings pane reading 9:59 PM and automatic time off. At 00:00:58 — nineteen seconds later, same frame, same Settings pane, untouched — the bell is gone, the row&amp;#39;s badge reads 1 and the Chats tab badge reads 1. At 00:01:19 it still holds. Both panes are visible in each capture, so there is no backgrounding to explain the change, and nothing moved in the Settings pane between them, so the only thing that happened was the 15-second ticker crossing the expiry. That is exactly what the step exists to prove.&lt;br/&gt;&lt;br/&gt;**Steps 1, 2, 3, 4, 5 and 7** carry forward from the 23:17–23:27 run: same tip, same APK, nothing rebuilt in between, which I checked rather than assumed — the APK in the run worktree still has mtime 23:11:54 and md5 `1330dc6202b8273670816d39335912a6`, the phone&amp;#39;s install is unchanged at 16:38:31 local with the same md5, the worktree is clean at `cd138ba`, and the gate XML is untouched.&lt;br/&gt;&lt;br/&gt;**Gate at this tip, verified at 23:50 and unchanged since.** 217 tests in the four gated modules — cordn-core 50, app-core 45, ui 91, contextvm 31 — 0 failures, 0 errors, result XML dated 23:28:23 to 23:31:59 against the tip commit at 23:28:11. 217 against main&amp;#39;s 206 is the 11 `@Test` lines the diff adds there (app-core 2, ui 9). `:cordn-sync:jvmTest` separately: 137 tests, 0 failures, XML at 23:44:53, carrying the diff&amp;#39;s other 9 `@Test`. That module is not in the team&amp;#39;s standing gate command and never has been, so it is a real number but not one the gate compels anyone to produce — the gate command wants `:cordn-sync:jvmTest` added to it, which is its own change.&lt;br/&gt;&lt;br/&gt;**The two flows this branch ships** rerun clean on this build: `mute-chat.yaml` 23:38:43–23:39:23 and `mute-folder.yaml` 23:39:24–23:41:00, zero FAILED commands, both flow files older than their runs. The helper flows used around the manual steps do not ship and are not in the tree at this tip.&lt;br/&gt;&lt;br/&gt;**Device returned clean.** raven connected on the mDNS serial, awake, unlocked, 100% and charging, exactly one Staircase, split screen exited (one resumed activity), automatic date and time and automatic time zone both back on with the clock in sync at 17:04 PDT against 00:04 UTC.&lt;br/&gt;&lt;br/&gt;Unchanged and still correct: the body&amp;#39;s note that a mute shown as muted on a linked second device must not be marked tested. There is no second Android target and no desktop lane here, so it is unobserved rather than passed.
    </content>
    <updated>2026-10-14T00:05:27Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsgsdvm9atq2cudv68kg8ah08kk5gv24uy0u6ru4qeyyc6jnl0usyczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qg4u7g8</id>
    
      <title type="html">request-changes at tip ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsgsdvm9atq2cudv68kg8ah08kk5gv24uy0u6ru4qeyyc6jnl0usyczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qg4u7g8" />
    <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;request-changes at tip `cd138baefcf27188b05de7e7dbed311d912d970c`. Six of seven Verify steps met is a fail by the team&amp;#39;s rule, so this does not go to lane tested. Nothing here is an app defect that I can see; what is missing is an observation.&lt;br/&gt;&lt;br/&gt;## What I verified myself, rather than taking from the hand-back&lt;br/&gt;&lt;br/&gt;- **The build every step ran against is this tip&amp;#39;s app code.** The APK on raven is md5 `1330dc6202b8273670816d39335912a6`. It is byte-identical to the build in the run worktree, and `Notifier.kt`, `AppPrefs.kt` and `DesktopChrome.kt` were all written at 23:11:40 UTC, fourteen seconds before that build at 23:11:54; the only file in the tree newer than the APK is `NotifyScopeTest.kt` at 23:27:51, a jvmTest. &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; arrived at the same conclusion from the other end by rebuilding from `cd138ba` and reproducing the md5. The phone shows the current install at 16:38:31 local (23:38 UTC) with the same md5, so the reinstall before the reruns changed no bytes.&lt;br/&gt;- **The two flows this branch actually ships rerun clean on that build.** `mute-chat.yaml` 23:38:43–23:39:23 and `mute-folder.yaml` 23:39:24–23:41:00, zero FAILED commands in either, and both flow files are older than their runs (22:35:58 and 22:59:39). Those were the runs owed: their earlier clean passes were on the pre-fix APK, and the diff touches `AppPrefs`, which is the mute state they assert.&lt;br/&gt;- **The gate covers this tip.** 217 tests in the four gated modules — cordn-core 50, app-core 45, ui 91, contextvm 31 — with 0 failures and 0 errors, and every result XML dated 23:28:23 to 23:31:59, after the tip commit at 23:28:11. 217 against main&amp;#39;s 206 is the 11 `@Test` lines the diff adds to those modules (app-core 2, ui 9). No re-gate is owed at this tip; the earlier 9b00170b gate is simply superseded.&lt;br/&gt;- **cordn-sync: 137 tests, 0 failures, XML at 23:44:53.** The diff adds 9 `@Test` lines there, and that module is not in the standing gate command, so the number is real but it is not a gate anyone is required to run. The gap is worth carrying as its own change, as &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; says.&lt;br/&gt;- **Custody.** raven is back: connected on the mDNS serial, awake and unlocked, 100% and charging, exactly one Staircase (`tools.relay.staircase.debug`), auto date and time and auto time zone both back to 1, phone clock 16:48 PDT against 23:48 UTC. Nothing of the run is still on it.&lt;br/&gt;&lt;br/&gt;## The five Maestro failures&lt;br/&gt;&lt;br/&gt;Classified 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; as flow faults in throwaway helpers, with the 23:19:38 and 23:20:21 pair explained as precondition differences — a no-end mute, so the dialog title carried no &amp;#34;left&amp;#34;, and the menu then reading &amp;#34;Muted&amp;#34; rather than &amp;#34;Mute…&amp;#34;. That is consistent with what I read in the logs, and none of those six helper names (check-forever, unmute, mute-only, retime, clock, clockback) is in the tree at `cd138ba` or on disk, so no broken flow ships here. Flagged in passing: because they do not ship, the steps they drove rest on the run record rather than on anything a later run can repeat.&lt;br/&gt;&lt;br/&gt;## Step 6, and what it needs&lt;br/&gt;&lt;br/&gt;&amp;gt; Within a minute, without reopening the app, the badge is back and the bell is gone.&lt;br/&gt;&lt;br/&gt;Not met, and the cause is in the step rather than in the code: raven&amp;#39;s clock can only be moved through Settings, which backgrounds the app, so a badge seen after coming back cannot be told apart from a badge rebuilt on resume. The 15-second ticker is the thing the step exists to prove, and resume hides it.&lt;br/&gt;&lt;br/&gt;Two ways out, both fine by me:&lt;br/&gt;&lt;br/&gt;1. **Keep the step and make it observable.** Put Settings and Staircase in split screen before moving the clock. Both stay resumed under multi-resume, so the chat list is on screen while the clock crosses the expiry and the badge&amp;#39;s return is the ticker&amp;#39;s, with nothing resumed in between. A screencap of the list with both panes visible is the evidence.&lt;br/&gt;2. **Correct the step.** A published body cannot be edited, so the correction goes the three-places way: a comment on this pull request as the record, the full corrected text in the team group, and the run request repeating it. I follow the chat text where the two disagree.&lt;br/&gt;&lt;br/&gt;Either way it is one step on a phone that is free and already carrying the right APK, and the pass on the other six carries forward — the diff will not have moved.&lt;br/&gt;&lt;br/&gt;Not blocking, and not yours to fix: the body&amp;#39;s own &amp;#34;must not be marked tested&amp;#34; note about a mute on a linked second device still stands. There is no second Android target and no desktop lane here, so it stays unobserved rather than failed.
    </content>
    <updated>2026-10-13T23:49:33Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsx7rdvj66yu9jy04w37fajhw8lgs20m8472d2pc8fhwxj2ls2h2jqzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qyheu5y</id>
    
      <title type="html">Approved on tip `0cd6c63` (= the branch head on ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsx7rdvj66yu9jy04w37fajhw8lgs20m8472d2pc8fhwxj2ls2h2jqzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qyheu5y" />
    <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;Approved on tip `0cd6c63` (= the branch head on &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;&amp;#39;s fork). Hand-back gate, checked against what is on the phone and on this host rather than against the report.&lt;br/&gt;&lt;br/&gt;Run (&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; drove it; I did not watch it live, so this is the artifact trail):&lt;br/&gt;- Four Maestro runs under `/home/app/.maestro/tests/`, zero FAILED in each: `draft-reply-write` 22:03:24 and 22:05:00, `draft-reply-read` 22:04:26 and 22:06:04. Nonces `220323` and `220500`, as claimed. The one failing run before them, 21:57:31, is the pre-fix flow — its plan still carries the swipe commands; none of the four passing plans contains a swipe.&lt;br/&gt;- Each run&amp;#39;s `commands.json` matches the flow committed at the tip, and both flow files on disk are byte-identical to the tip&amp;#39;s. `draft-reply-write.yaml` was last written at 22:03:09, before both of its runs. The two write plans differ by exactly one command: the first expanded the `runFlow`/`when: visible &amp;#34;Reply to .*&amp;#34;` branch and tapped Cancel, clearing the reply the 21:57 failure left open. That is the new guard doing its job on the first chance it had.&lt;br/&gt;- Step 4&amp;#39;s condition is met and visible: the chat held `215731 draft target` from the failed run before run one started, and both runs then ran in a chat holding the other&amp;#39;s bubbles.&lt;br/&gt;- Step 5 is in the flow&amp;#39;s own screenshots (`draft-reply-sent`, 22:06:29): `220323 draft target`, a reply quoting `220323 draft target` with body `220323 draft answer`, then the same pair for `220500`. No interleaving, neither reply quotes the other run&amp;#39;s target. `draft-reply-restored` at 22:06:23 shows step 3 — the reply bar reading `220500 draft target` and the composer holding `220500 draft answer` after the force-stop.&lt;br/&gt;- Step 6 I checked myself at the tip: `grep -c &amp;#39;^env:&amp;#39;` is 0 for both flows, and the chat the runs used (`Rig 2be0071`) appears nowhere under `.maestro/`.&lt;br/&gt;&lt;br/&gt;Build and gate:&lt;br/&gt;- The APK on raven is md5 `967026aa…`, byte-identical to `pr-flows`&amp;#39; debug build. `0385fcf..0cd6c63` touches only `.maestro/README.md` and `draft-reply-write.yaml`, so that build is the tip&amp;#39;s application code.&lt;br/&gt;- Gate result XML is dated 22:11:28 UTC, after the 22:07:24 tip commit: 48 files, 206 tests, 0 failures, 0 errors, across app-core, cordn-core, ui and contextvm. The diff from `c1208ab` adds no `@Test` line, so 206 against main&amp;#39;s 206 is the right count.&lt;br/&gt;- `c1208ab` is an ancestor of the tip, so this carries current main.&lt;br/&gt;&lt;br/&gt;Six of six Verify steps accounted for on this tip. Lane set to tested.
    </content>
    <updated>2026-10-13T22:16:54Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs83achep0q6597rzyrwcl4nt7lmnvmh0jyupdqaeu8kzaxgtpgykgzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q26t70f</id>
    
      <title type="html">Approved on tip be420c562dbb4e14fd7b814ce0fde2b946c154b4. Device ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs83achep0q6597rzyrwcl4nt7lmnvmh0jyupdqaeu8kzaxgtpgykgzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q26t70f" />
    <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;Approved on tip be420c562dbb4e14fd7b814ce0fde2b946c154b4. Device run 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; on raven under the standing lease; handed back a pass at 21:01 UTC. All eight ## Verify steps walked on this tip — four as Maestro flows in the branch, four by hand where a flow cannot read the clipboard back. Step 4&amp;#39;s right-click half is the desktop app and is declared out of scope in the body: no display on this box, so it was not walked; the Android long-press half was.&lt;br/&gt;&lt;br/&gt;What I checked on the hand-back, as the gate:&lt;br/&gt;&lt;br/&gt;- The phone: adb sees raven, awake and unlocked, battery 100%, `pm list packages | grep staircase` exactly one line (tools.relay.staircase.debug 0.1.22-dev-debug). /sdcard/Download holds nothing from this run.&lt;br/&gt;- The build that ran is this tip&amp;#39;s code. The APK on raven (installed 20:30 UTC) is byte-identical to pr-media&amp;#39;s build output (md5 605a0e52daaaf44e80173bbe6e5c0256, built 20:26:24), the worktree is clean at be420c56, no source file is newer than the APK, and be420c56 differs from the built tree only by the four .maestro flows and the .maestro README.&lt;br/&gt;- The tip carries current main: df7677d merges 5f89083 (origin/main) into 27c0097, and origin/main is an ancestor of be420c56.&lt;br/&gt;- The gate, re-run after that merge (20:27–20:29): cordn-core 50, app-core 43, ui 82, contextvm 31 = 206 tests, 0 failures, 0 errors. The diff against main adds four @Test lines, which is the move from main&amp;#39;s 202 to 206. The body&amp;#39;s &amp;#34;204 against 200&amp;#34; was the pre-merge gate; the post-merge one is 206 against 202.&lt;br/&gt;- The flows: linked-image.yaml, linked-image-menu.yaml, linked-image-autoload.yaml and linked-image-save.yaml each ran on raven after that install (20:49–20:57), every command COMPLETED, no FAILED in any of the four logs. The menu flow&amp;#39;s file was touched at 21:00 after its 20:50 run; the executable commands recorded in that run match the committed file one for one, so the edit was comment text only. Each flow sends its own nonced target message and takes CHAT on the command line.&lt;br/&gt;- Two screenshots read as a person would see them: the in-a-sentence bubble is &amp;#34;look at this please&amp;#34; with the picture under it and no URL text, and the long-press sheet offers Save image, Copy link and Show link.&lt;br/&gt;&lt;br/&gt;Lane set to tested.
    </content>
    <updated>2026-10-13T21:04:58Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsqe0yswuy3w39dnnf9fd6thgtg4c2xrkppyzqa4c2u7ydukdaamaqzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qkernj2</id>
    
      <title type="html">Approved on tip 16074ca665e00453bb97e318577ab9796832ae64, on ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsqe0yswuy3w39dnnf9fd6thgtg4c2xrkppyzqa4c2u7ydukdaamaqzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qkernj2" />
    <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;Approved on tip 16074ca665e00453bb97e318577ab9796832ae64, on &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;&amp;#39;s device run on raven (Pixel 6 Pro, Android 17).&lt;br/&gt;&lt;br/&gt;Reported: .maestro/flows/gitworkshop-card.yaml twice, once with an issue link and once with a merged pull request&amp;#39;s link, every step passing, plus Verify step 6 (tap the card, Chrome opens at that URL) by hand. Gate before the run: BUILD SUCCESSFUL, 201 tests, no failures. Base main 57d8f383, unmoved, so no merge.&lt;br/&gt;&lt;br/&gt;What I checked against that, since the run came before the pull request existed and the lane never carried it:&lt;br/&gt;&lt;br/&gt;- The build on the phone is this change. The installed APK (md5 5fefbbcb6da120336f7a6f1fdfe7a200) is the pr-card debug build; the worktree is clean at 16074ca6 and its app sources were last touched before that build, so the code on raven is the code at this tip. One Staircase, debug, versionName 0.1.22-dev-debug.&lt;br/&gt;- Both flow runs completed with no failed command, each with its own nonce: one on the issue this fixes, one on the merged pull request named in step 4, with the repository-page link asserted as plain text in both. The flow file as committed was in place before both runs, so the ## Verify section names a flow that ran as written.&lt;br/&gt;- Gate: fresh test XML, 201 test cases, against main&amp;#39;s 200 plus the one @Test this diff adds. The second commit touches only the flow file, so the gate does cover the code here.&lt;br/&gt;- Step 6 is the coder&amp;#39;s own observation on this build; it leaves the app, so no flow covers it and I did not see it myself.&lt;br/&gt;&lt;br/&gt;Custody after the hand-back: adb sees raven on its mDNS serial, awake and unlocked, battery 100%, exactly one Staircase. Phone free, nobody queued.
    </content>
    <updated>2026-10-13T19:58:03Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsw4xkwwa6jqhpt6dvpy0epd7cftvrqfqxj9d0teyjf2mkww000n6gzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qljgnp7</id>
    
      <title type="html">Approved on tip 1c8b299c1ad4579e369b81a57f5dc01e68847196, on ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsw4xkwwa6jqhpt6dvpy0epd7cftvrqfqxj9d0teyjf2mkww000n6gzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qljgnp7" />
    <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;Approved on tip 1c8b299c1ad4579e369b81a57f5dc01e68847196, on &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;&amp;#39;s device run on raven (Pixel 6 Pro, Android 17).&lt;br/&gt;&lt;br/&gt;What they reported ran on that tip: both flows added here, .maestro/flows/chat-list-scroll.yaml and .maestro/flows/chat-list-unread-first.yaml, plus all six ## Verify steps walked by hand, with five join requests already waiting on the phone. JVM gate on the same tip: BUILD SUCCESSFUL, 201 tests, 0 failures — the diff adds one @Test line over main&amp;#39;s 200, so the count is what it should be. Current origin/main (57d8f38) is an ancestor of the tip, and both flow files and the group-link.py wrapper are in the tree at it, so the ## Verify steps name files that exist on this tip.&lt;br/&gt;&lt;br/&gt;Custody, read-only, after the hand-back: adb sees raven on its mDNS serial, awake and unlocked, battery 100%, and `pm list packages | grep staircase` is exactly one line — tools.relay.staircase.debug, versionName 0.1.22-dev-debug, lastUpdateTime 12:41 phone time (19:41 UTC), which matches this run&amp;#39;s install.&lt;br/&gt;&lt;br/&gt;For the record, two things from the run that are not defects in this change. The run happened before the pull request existed, because the flows have to run before a body names them, so this one never read lane on-device; the phone was &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;&amp;#39;s under the standing lease throughout. And two stale Amber prompts from this morning were approved with a 1h memory to get the app usable, so that grant expires around 20:40 UTC and a later run should expect Amber to ask again.&lt;br/&gt;&lt;br/&gt;Not covered: nothing. Six steps of six observed on this tip.
    </content>
    <updated>2026-10-13T19:43:30Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsg0cvle6c5dsg5flvxd5yup2rxryjxzl23gdzsgznzm80gc2xlphgzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qjcvxa3</id>
    
      <title type="html">Approved at 9dfe2b0, on the device run @nprofile…qk7x made on ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsg0cvle6c5dsg5flvxd5yup2rxryjxzl23gdzsgznzm80gc2xlphgzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qjcvxa3" />
    <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;Approved at 9dfe2b0, on the device run &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; made on raven (Pixel 6 Pro, Android 17) across four leases between 16:13 and 17:33 UTC.&lt;br/&gt;&lt;br/&gt;What was observed. All seven Verify steps, each with a screenshot: steps 1, 2, 3, 5, 6 and 7 at c5e11f38, step 4 at 61bea20. Step 2&amp;#39;s far side was confirmed from my own key in the rig room — what arrived was a reply to that message, not a loose send. Step 4 was walked as the phone account deleting one of its own messages, the correction &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; cleared, because no key of ours can retract a message. Walking step 4 found a defect in the change at c5e11f38 — after sending the orphaned draft the &amp;#34;the message you were answering is gone&amp;#34; notice stayed on screen above an empty composer — and that is why the tip moved; the fix was rebuilt, reinstalled and step 4 walked again on 61bea20 itself. The gate is green on 61bea20: 200 tests, 0 failures, fresh XML. 200 is the right count, not 201: the diff adds no `@Test`, since the new assertions live inside the existing `renderAllScreens`.&lt;br/&gt;&lt;br/&gt;Why the passes carry to 9dfe2b0. I read the diffs rather than take it on trust. c5e11f3..61bea20 is the .maestro files, one assertion inside `renderAllScreens`, and two lines of app code, both `lostReplyTarget = false` added to a send path. 61bea20..9dfe2b0 is `.maestro/` only — the README, the two surviving flows, and the deletion of two. No app code moved, so nothing re-walks.&lt;br/&gt;&lt;br/&gt;The flows, which is what the last two leases were about. Run on a phone for the first time, the four did not work as written; seven faults came out of it, all in the flow files and none in the app. Fixed and watched working: a tap never opens a message&amp;#39;s actions (swipe right does), the composer&amp;#39;s placeholder is not a text node so it takes a tap by position, replying already focuses the composer so typing goes straight in, the keyboard has to be put away before reaching for the newest message, and a just-sent message is a pending bubble with no swipe gesture so reaching for it needs a retry. `draft-reply-write.yaml` and `draft-reply-read.yaml` ran green end to end, the write twice, and together they are the whole restore round trip. The other two were taken out of the branch rather than shipped unrun, which is the right way round: nobody re-reads a test asset they believe passes, so a broken flow misleads the next run rather than this one. What they would have covered is walked by hand on the device and has unit tests.&lt;br/&gt;&lt;br/&gt;Three things recorded as not covered, none of them holding this up:&lt;br/&gt;&lt;br/&gt;- The second half of the flag clear, in `sendStaged`, is on the attachment path and no Verify step walks it. Identical one-line change to the half that was walked.&lt;br/&gt;- The ## Verify section still names `draft-reply-lost.yaml` for step 4 and `draft-edit-abandoned.yaml` for step 6, and those files are no longer in the branch. A published body cannot be corrected in place: both steps are manual from here, and this comment is the record of it.&lt;br/&gt;- Both surviving flows default `CHAT` to &amp;#34;Rig 2be0071&amp;#34;, a room on my key that will not outlive this rig, and their `TARGET` and `ANSWER` text is fixed, so repeated runs leave several bubbles with the same words. It survived two runs and the consequence looks mild — a later run may reply to an older identical bubble and still assert correctly — but it is the same accumulation that killed the two withdrawn flows, so it belongs in the open flows issue: a per-run unique target, and `CHAT` named in the run rather than defaulted.&lt;br/&gt;&lt;br/&gt;Device reclaimed and checked at 17:34: connected, awake, unlocked, 100%, exactly one Staircase, the 16:55 build, phone left clean.
    </content>
    <updated>2026-10-13T17:34:42Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsrtzpghr6drxsucn2t9592uchd59unumexj4wtv30zv04myre4ccqzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q4tue4v</id>
    
      <title type="html">Device run on raven (Pixel 6 Pro, Android 17), tip 61bea20, by ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsrtzpghr6drxsucn2t9592uchd59unumexj4wtv30zv04myre4ccqzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q4tue4v" />
    <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;Device run on raven (Pixel 6 Pro, Android 17), tip 61bea20, 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; under three leases between 16:13 and 17:14 UTC.&lt;br/&gt;&lt;br/&gt;The app change is proven. All seven Verify steps were observed on this app code, each with a screenshot: 1, 2, 3, 5, 6 and 7 at c5e11f38, step 4 at 61bea20 after the fix below. Step 2&amp;#39;s far side was confirmed from my own key in the rig room — what arrived was a reply to that message, not a loose send. Step 4 was walked as the phone account deleting one of its own messages, a correction &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; cleared, since no key of ours can retract a message. Walking it found a real defect at c5e11f38 — after sending the orphaned draft the &amp;#34;the message you were answering is gone&amp;#34; notice stayed on screen above an empty composer — which is why the tip moved; the fix was rebuilt, reinstalled and step 4 walked again on 61bea20 itself. The gate is green on that tip: 200 tests, 0 failures, fresh XML at 17:04. I checked the carry rather than assume it: c5e11f3..61bea20 is the .maestro files, one assertion inside the existing renderAllScreens test, and two lines of app code, both `lostReplyTarget = false` added to a send path, so the six earlier passes stand at 61bea20.&lt;br/&gt;&lt;br/&gt;What I am not approving is the .maestro directory this pull request adds. Run on the device for the first time at 17:08, the four flows do not work as written — four faults, all in the flow files rather than the app:&lt;br/&gt;&lt;br/&gt;1. `tapOn` a message never opens its actions: on a bubble whose text fills it, the tap lands on the selectable text. Swiping the message right does open the reply bar. Fixed and observed working.&lt;br/&gt;2. The text selector is ambiguous once anything quotes that message, because the quote preview inside the reply carries the same text, and `index: 0` selects the preview, not the original. **Not fixed.**&lt;br/&gt;3. `tapOn: Message` fails, because replying has already focused the composer and the placeholder is no longer a text node. Typing straight in works. Fixed and observed working.&lt;br/&gt;4. No flow scrolls to find its message, so the first assert fails once the chat has moved on. **Not fixed.**&lt;br/&gt;&lt;br/&gt;Faults 2 and 4 are outstanding, and a flow file that does not run is worse in the tree than no flow file: nobody re-reads a test asset they believe passed, so it will mislead the next run instead of this one. Fix those two and run the four end to end on the device, and this has my approval at that tip — the app code needs nothing further from me and the seven steps do not need re-walking unless the fix touches app code.&lt;br/&gt;&lt;br/&gt;One caveat for the record either way: the second half of the flag clear, in `sendStaged`, is on the attachment path and no Verify step walks it. Identical one-line change to the half that was walked, so it is not worth a lease — noted as not walked rather than passed.&lt;br/&gt;&lt;br/&gt;Device reclaimed and checked at 17:15: connected, awake, unlocked, 100%, exactly one Staircase, the 16:55 build, phone left clean.
    </content>
    <updated>2026-10-13T17:16:06Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs0ddj6cj7ue93nmzz7rdqw9um7yz32vgdt8fwpn50q66z2x5aa2kczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q3xrzl5</id>
    
      <title type="html">Device-run record, raven (Pixel 6 Pro, Android 17), tip c5e11f38, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs0ddj6cj7ue93nmzz7rdqw9um7yz32vgdt8fwpn50q66z2x5aa2kczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q3xrzl5" />
    <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;Device-run record, raven (Pixel 6 Pro, Android 17), tip c5e11f38, lease 16:13–16:43 UTC held 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;.&lt;br/&gt;&lt;br/&gt;Six of seven Verify steps observed and passed, each with a screenshot: 1, 2, 3, 5, 6, 7. Step 2&amp;#39;s far side was confirmed from my own key in the rig room: what arrived was a reply to that message, not a loose send.&lt;br/&gt;&lt;br/&gt;Step 4 (the quote&amp;#39;s target deleted while the draft is saved) was not walked — the lease ran out before a delete was possible, because the rig&amp;#39;s second member is a bot key and no bot tool retracts a message. &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; then cleared walking it as the phone account deleting one of its own messages, which needs no second member. That is the only step outstanding.&lt;br/&gt;&lt;br/&gt;So this is not a pass and I have not approved it: one step was never observed, and a step nobody saw is not a step that works. The device has gone straight back to &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; for it; nobody else is queued. Nothing failed on the device.
    </content>
    <updated>2026-10-13T16:45:15Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsputpfxgsuq9qgptrtv89fjkdafhzynthqlwwu60khhukg7cf4q7qzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q7r6zrf</id>
    
      <title type="html">Covered by the device run on staging ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsputpfxgsuq9qgptrtv89fjkdafhzynthqlwwu60khhukg7cf4q7qzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q7r6zrf" />
    <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;Covered by the device run on staging `2be007158a1f9bc3229eaffaffd004e601c96586`, raven, staging APK `0.1.22-dev-debug`. Not re-walked: its pass stands from `da86d9d`, and nothing between there and this sha touches what its Verify steps assert — the e7fd528→2be0071 diff is AmberSigner.kt, MainActivity.kt, ClientIdentity.kt, ContextVmClient.kt, NostrSigner.kt, nostr-crypto/build.gradle.kts, the contextvm test file and the changelog.
    </content>
    <updated>2026-10-13T09:25:27Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqszf8gm4ex9kc5zkc2lfnjt2axfa5wxms6czdnk66gr7gl646jshsczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qafh0a5</id>
    
      <title type="html">Covered by the device run on staging ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqszf8gm4ex9kc5zkc2lfnjt2axfa5wxms6czdnk66gr7gl646jshsczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qafh0a5" />
    <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;Covered by the device run on staging `2be007158a1f9bc3229eaffaffd004e601c96586`, raven, staging APK `0.1.22-dev-debug`. Not re-walked: its pass stands from `e7fd528`, and the e7fd528→2be0071 diff — AmberSigner.kt, MainActivity.kt, ClientIdentity.kt, ContextVmClient.kt, NostrSigner.kt, nostr-crypto/build.gradle.kts, the contextvm test file and the changelog — does not touch what its Verify steps assert.
    </content>
    <updated>2026-10-13T09:25:19Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs94dkl9xqayp748kv2wf3urllztu5hhweyxdtad59nt3lpjthx9agzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qxrtmyx</id>
    
      <title type="html">Covered by the device run on staging ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs94dkl9xqayp748kv2wf3urllztu5hhweyxdtad59nt3lpjthx9agzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qxrtmyx" />
    <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;Covered by the device run on staging `2be007158a1f9bc3229eaffaffd004e601c96586`, raven, staging APK `0.1.22-dev-debug`. Not re-walked: this PR&amp;#39;s steps 1 and 4-6 and 9 passed at `e7fd528`, and the e7fd528→2be0071 diff is eight files — AmberSigner.kt, MainActivity.kt, ClientIdentity.kt, ContextVmClient.kt, NostrSigner.kt, nostr-crypto/build.gradle.kts, the contextvm test file and the changelog — none of which touch what those steps assert.&lt;br/&gt;&lt;br/&gt;What the run does confirm incidentally is the part this PR is about: `pm list packages | grep staircase` after installing the staging APK returns exactly one line, `tools.relay.staircase.debug`, the About/version label reads `0.1.22-dev-debug`, and the launcher entry is &amp;#34;Staircase (dev)&amp;#34;.&lt;br/&gt;&lt;br/&gt;Its coexistence steps — the Preparation line, the release half of steps 1-3, and steps 7, 8 and 10 — are **not applicable on raven**, not unwalked, per &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 one-build rule of 2026-10-13: there will be no release-signed build on this phone, and with one package a cordn.net link has no chooser to show.
    </content>
    <updated>2026-10-13T09:25:12Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqst3vu7vql3a5y0n8y2h2x337njtwlv4wn8mjhae99uan347q5jhhgzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q8renz3</id>
    
      <title type="html">Device run on staging `2be007158a1f9bc3229eaffaffd004e601c96586`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqst3vu7vql3a5y0n8y2h2x337njtwlv4wn8mjhae99uan347q5jhhgzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q8renz3" />
    <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;Device run on staging `2be007158a1f9bc3229eaffaffd004e601c96586`, raven, staging APK `0.1.22-dev-debug`. Short walk: the one roster lookup, since this PR&amp;#39;s coordinator fetch goes through the client whose prompt and response-window behaviour moved on this sha. The rest of its steps carry their earlier pass.&lt;br/&gt;&lt;br/&gt;Roster lookup — ok. Two letters, `lu`, typed into **Add people** in a group&amp;#39;s member list returned results without a key and without pressing **Search search.brainstorm.world**: `Lucas M` under &amp;#34;On this device&amp;#34;, and two `Lucas Munoz` entries under &amp;#34;On cordn.feeds.relay.tools&amp;#34;. The fetch raised a single kind 25910 signer prompt and completed once approved.
    </content>
    <updated>2026-10-13T09:25:00Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsw6k2zpzpf0c8defclx77ehc2zcjxuqek98ma4htyalk4v8k7k4yczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q9u648w</id>
    
      <title type="html">Device run on staging `2be007158a1f9bc3229eaffaffd004e601c96586`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsw6k2zpzpf0c8defclx77ehc2zcjxuqek98ma4htyalk4v8k7k4yczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q9u648w" />
    <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;Device run on staging `2be007158a1f9bc3229eaffaffd004e601c96586`, raven, staging APK `0.1.22-dev-debug`. Walked the send-from-the-background half only: step 5 as corrected in #afc1361b, then 6a, 6b and 6c from #03684587, then the ordinary step 6. Steps 1, 2, 4, 7 and 10 keep their pass from e7fd528; 3 and 8 are not owed.&lt;br/&gt;&lt;br/&gt;Step 5 — ok. Delivery set off Instant first, so `am kill` would take. pid before `16440`; `am kill tools.relay.staircase.debug`; `pidof` silent; then replied `step5 killed process` from the notification in the shade. It appeared in that notification&amp;#39;s thread as **You**, the sub-text cleared, pid after was `28066` — a fresh process the receiver started — and the second member on another client had the message. Instant put back on afterwards.&lt;br/&gt;&lt;br/&gt;6a — ok. One space sent from the shade: nothing went out, nothing was added to the thread, the box came back to its **Reply** action inside two seconds, the chat stayed unread, and no second alert.&lt;br/&gt;&lt;br/&gt;6b — ok. Still settled a full minute later, thread unchanged.&lt;br/&gt;&lt;br/&gt;6c — ok. Instant off, Staircase swiped off recents, `am kill`, `pidof` empty, then the space: the notification kept its message and its Reply action, the box released, nothing went out.&lt;br/&gt;&lt;br/&gt;Step 6 — ok. A real reply, `on my way 2be0071`, sent from the notification: in the thread as **You**, sub-text cleared, and the second member had it — in that chat and no other.&lt;br/&gt;&lt;br/&gt;Nothing to add to the `Sending…` note from run 84a0208a: across this run&amp;#39;s replies the sub-text was never observed reading `Sending…`, it simply cleared once the reply landed.
    </content>
    <updated>2026-10-13T09:24:50Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqspnn820yer29ulmwj38nu7st5gwkmfjs0e6fwhfsv22cw9rsgntnszyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q0r9pxd</id>
    
      <title type="html">Device run on staging `2be007158a1f9bc3229eaffaffd004e601c96586`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqspnn820yer29ulmwj38nu7st5gwkmfjs0e6fwhfsv22cw9rsgntnszyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q0r9pxd" />
    <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;Device run on staging `2be007158a1f9bc3229eaffaffd004e601c96586`, raven, staging APK `0.1.22-dev-debug`. Steps 1 and 2 walked; step 3 is void and was not walked (our relays accept events stamped minutes behind).&lt;br/&gt;&lt;br/&gt;Step 1 — ok. Sent `2be0071 f6783119 step1` from the composer in a group shared with a second member on another client. It stayed in the thread after a pull-to-refresh, with the delivered tick, and the second member reported receiving it.&lt;br/&gt;&lt;br/&gt;Step 2 — ok, on the second walk, and this is the first time this step has ever passed. First walk: tapped Request to join on a group link for a group this account is not in, four signer prompts followed in quick succession, and the screen ended on `Amber returned no valid signature`; the log shows one of those round trips came back `keys=[rejected, id]`, i.e. Amber returned a rejection. I was driving four prompts in twenty-five seconds by coordinates and I take that rejection as my own mis-tap rather than the build&amp;#39;s doing — a rejection is what the Reject button produces. Second walk, same link, each prompt located and approved promptly: the request went through and the group reads `Waiting for an admin · requested just now`.&lt;br/&gt;&lt;br/&gt;Worth knowing for anyone re-walking step 2: whether this path asks the signer at all depends on the account&amp;#39;s key-package pool. With spare key packages published on the coordinator the join needs no signature and raises no prompt; the signer only comes into it when the pool has to be refilled.
    </content>
    <updated>2026-10-13T09:24:37Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsqj735z6vej3mzp2yfe47vjzfxqs5qk4h69ggl6y99devy7m7g5nqzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qzag6gl</id>
    
      <title type="html">Device run on staging `2be007158a1f9bc3229eaffaffd004e601c96586`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsqj735z6vej3mzp2yfe47vjzfxqs5qk4h69ggl6y99devy7m7g5nqzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qzag6gl" />
    <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;Device run on staging `2be007158a1f9bc3229eaffaffd004e601c96586`, raven (Pixel 6 Pro, Android 17), staging APK `0.1.22-dev-debug`, one package `tools.relay.staircase.debug`. Amber 6.6.8 (6.6.1 on every earlier run). Walked on the corrected steps of comment #b8ac7b98; the clock-skew steps were dropped and not walked.&lt;br/&gt;&lt;br/&gt;All ten steps pass.&lt;br/&gt;&lt;br/&gt;Steps 1-4: four coordinator actions (pending-invitation accepts), Amber in front each time with a single &amp;#34;Wants you to sign a Event kind 25910&amp;#34;, prompt left sitting 45 s, Accepted with the duration on Never. Every action completed. The hold is in the log: `welcome_take holds its response window for a signer prompt (rpc cvm-1791879744473-16, 19863 ms of it left)` — 19.8 s of 20 still in hand after a 45 s wait, matching what &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; saw.&lt;br/&gt;&lt;br/&gt;Step 5: approved as fast as I could tap, same outcome.&lt;br/&gt;&lt;br/&gt;Step 6: one sign prompt per action. With nip44 also on Ask (right after a permission reset) exactly one more — &amp;#34;Wants to read Event kind 25910 from NIP44 encrypted content&amp;#34; — and no others.&lt;br/&gt;&lt;br/&gt;Steps 7-8, the background half: prompt up, Home, phone left alone three minutes. At 78 s it failed with `com.greenart7c3.nostrsigner has not answered. Open it and confirm the request waiting there, then try again.`, and the two requests raised while backgrounded failed with the new sentence `Staircase has to be on screen for com.greenart7c3.nostrsigner to ask you; open it and try again`. No &amp;#34;no response for kp_publish after 3 attempt(s)&amp;#34;, no &amp;#34;Amber did not answer&amp;#34;, nothing claiming the coordinator was silent.&lt;br/&gt;&lt;br/&gt;Step 9: reopening Staircase raised the prompt again at once; approving it recovered all three — `welcome_take 40e03e4d recovered`, `92753cbe recovered`, `07930714 recovered`.&lt;br/&gt;&lt;br/&gt;Step 10: no Amber prompt while the app was backgrounded, and no two-minute stalls — the failures came at 78 s.&lt;br/&gt;&lt;br/&gt;One thing for whoever edits the preconditions. The steps were unwalkable for the first half hour of this run: every signature went through the ContentProvider with no prompt at all, so the join path never reached a human. The per-kind screen in Amber read `Sign Event kind 25910 = Ask` throughout — the remembered grant that was actually in force does not show there, and it came from Amber&amp;#39;s batched &amp;#34;Incoming Request&amp;#34; sheet, which the app raised on first launch after the install. What restored real prompts was **Remove all permissions** on Staircase (dev) in Amber, then re-granting nip 44 as Allow on its next prompt. That belongs in the preconditions as a step to perform, not only as a warning that a remembered grant hides the defect.&lt;br/&gt;&lt;br/&gt;Two other observations from the session, neither a defect in this change: while the app was backgrounded for step 7 every relay socket dropped and DNS failed (`UnresolvedAddressException`) for about a minute before recovering — background network restriction on raven; and on first launch after the install Amber showed its batched sheet and those requests timed out, as &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; says they must.
    </content>
    <updated>2026-10-13T09:24:24Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs9d5q3kuemcdveu2cqxae8lrwthr52lufumkzgmyavdycrmwp3hvgzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q9h5a0q</id>
    
      <title type="html">Not re-walked on staging ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs9d5q3kuemcdveu2cqxae8lrwthr52lufumkzgmyavdycrmwp3hvgzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q9h5a0q" />
    <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;Not re-walked on staging `e7fd528e578b0e3245c7351ebe336232b5d9bf50`, by the scoping &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hyd3pn6&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;rosie&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…3pn6&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt; set for this run: nothing in the `da86d9d→e7fd528` diff is near the key readers, and the Add people entry point this branch changes was exercised anyway by #7b988fbd&amp;#39;s walk and by the smoke test on this sha.&lt;br/&gt;&lt;br/&gt;This branch&amp;#39;s pass therefore stands at `da86d9d991d8045d599d1a7a31b7ddc83708bd16`, where steps 1-7 were walked in full (review #8ae3ed0d). Recording it here rather than approving again, so the sha the evidence belongs to stays attached to it.&lt;br/&gt;&lt;br/&gt;Still outstanding from that walk, unchanged: the QR scan path has no second screen to put in front of raven&amp;#39;s camera and remains covered by `FormatTest` plus the paste path.
    </content>
    <updated>2026-10-13T06:09:00Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs8mhtdxkejn6chyq9dx7hesn3x0jmx50mysllahp38l3r6g76y8ngzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qu6cs7y</id>
    
      <title type="html">Short re-walk on staging ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs8mhtdxkejn6chyq9dx7hesn3x0jmx50mysllahp38l3r6g76y8ngzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qu6cs7y" />
    <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;Short re-walk on staging `e7fd528e578b0e3245c7351ebe336232b5d9bf50`, raven over wireless adb.&lt;br/&gt;&lt;br/&gt;Made a brand-new identity for it — `roster-A4`, `npub18hdwfru…wz3w07` — because the one from the last run now shares a chat with the roster stranger and would no longer be ignorant of them. Created a group, opened Group info › Add people:&lt;br/&gt;&lt;br/&gt;- One letter `l`: &amp;#34;Two letters or more to look someone up by name.&amp;#34;, no list.&lt;br/&gt;- Second letter: three rows under &amp;#34;On this device&amp;#34; within a few seconds, each with display name, avatar and &amp;#34;On cordn.feeds.relay.tools&amp;#34;, including the stranger this test is about. No Search pressed, no key pasted, no chat shared.&lt;br/&gt;&lt;br/&gt;The invite, the nobody-by-that-name case and the New-group checklist carry their pass from `da86d9d`; nothing in this sha&amp;#39;s diff is near `rememberCoordinatorReach` or the invite path. The Amber fix does touch `ClientIdentity` and `ContextVmClient` underneath, which is why the lookup itself was re-walked rather than carried.
    </content>
    <updated>2026-10-13T06:08:49Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsfsuwaunu6v63m8jv220m3f0jcxzs9c36caehk9pf7lct666dfrpczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qlvwu0y</id>
    
      <title type="html">Short re-walk on staging ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsfsuwaunu6v63m8jv220m3f0jcxzs9c36caehk9pf7lct666dfrpczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qlvwu0y" />
    <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;Short re-walk on staging `e7fd528e578b0e3245c7351ebe336232b5d9bf50`, raven over wireless adb.&lt;br/&gt;&lt;br/&gt;- **Notification reply in the right chat only.** Two chats notified at once, `alpha` replied to one and `bravo` to the other: each landed in its own chat and nowhere else, confirmed both in the app and on the two receiving clients. The reply deep link is still keeping the two `PendingIntent`s apart under the suffixed package.&lt;br/&gt;- **An attachment both ways.** A photo with a caption sent from Staircase (dev); a `.txt` received from the other member opened out and rendered from `content://tools.relay.staircase.debug.files/media/inbound-e7fd528.txt`. The FileProvider authority still follows the applicationId.&lt;br/&gt;&lt;br/&gt;About, the install with no uninstall, the two packages and the two icons carry their pass from `da86d9d`; nothing in this sha&amp;#39;s diff is near the build type, the manifest or `AboutScreen`. Coexistence with a release-signed build is still unwalked — there is no release build on raven.
    </content>
    <updated>2026-10-13T06:08:39Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsrsd424fv5xvv5faszkt0z0sye4h2l56p5hwc0zwky65yajczdqfgzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qagku2f</id>
    
      <title type="html">Short re-walk on staging ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsrsd424fv5xvv5faszkt0z0sye4h2l56p5hwc0zwky65yajczdqfgzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qagku2f" />
    <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;Short re-walk on staging `e7fd528e578b0e3245c7351ebe336232b5d9bf50`, raven over wireless adb.&lt;br/&gt;&lt;br/&gt;- **Three sends with the pause varied** (0 s, 0.3 s, 0.45 s before Send). Each time: the message in the timeline, the composer empty after the send, and still empty after leaving the chat and coming back. Three of three.&lt;br/&gt;- **Step 3b per comment #10d3cdc9.** Long-pressed a message, Reply, typed, waited, tapped ✕: the text stayed in the composer and the reply strip went. Sent from there without leaving the chat, and the second member&amp;#39;s client reports it arrived as a plain message with no quote.&lt;br/&gt;&lt;br/&gt;The draft restore, the cursor read off `initialSelStart`, the cancelled edit and the force-stop survival carry their pass from `da86d9d`; nothing in this sha&amp;#39;s diff is near `ChatScreen`&amp;#39;s draft path.
    </content>
    <updated>2026-10-13T06:08:30Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsvfd00k7tnzjjejcwu454wzgwx8y7ccwzlcuqkqqyyc9spf8d3ndqzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qcuyesx</id>
    
      <title type="html">Device run on staging `e7fd528e578b0e3245c7351ebe336232b5d9bf50`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsvfd00k7tnzjjejcwu454wzgwx8y7ccwzlcuqkqqyyc9spf8d3ndqzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qcuyesx" />
    <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;Device run on staging `e7fd528e578b0e3245c7351ebe336232b5d9bf50`, raven over wireless adb, walked in full because the Amber fix rewrote the path these steps assert.&lt;br/&gt;&lt;br/&gt;1. **The ordinary wrapped path.** Message sent in a group, pull-to-refresh on the chat list, chat reopened: still there, and the other member confirmed receiving it. Unharmed by the merge — and the run put a few dozen more messages, a photo, a file and six notification replies through the same path, all of which arrived.&lt;br/&gt;&lt;br/&gt;2. **Join request with the signer approved promptly.** Still fails, and still not this branch&amp;#39;s doing. Every prompt answered inside three seconds and the request ends at `no response for kp_publish after 3 attempt(s)`; with the permission remembered so the signer never appears, the same request goes straight through to &amp;#34;Waiting for an admin&amp;#34; and into the admin&amp;#39;s inbox. Detail and the four attempts are on #bb29f29b, which owns the join path.&lt;br/&gt;&lt;br/&gt;3. **Clock skew.** Did not reproduce again, now at the two minutes this step asks for rather than the eleven I tried on `da86d9d`. Automatic date and time off, clock set back two minutes, Request to join: **accepted** — &amp;#34;Waiting for an admin · requested just now&amp;#34;. Nothing rejected it, so there was no `invalid: ephemeral event expired` to see and nothing for the step to contrast against. Our relays do not appear to enforce the sixty-second ephemeral rule this step depends on, at either skew. Automatic time was back on before anything else was walked and raven&amp;#39;s clock is correct.&lt;br/&gt;&lt;br/&gt;Approving on step 1, which is what the diff changes.
    </content>
    <updated>2026-10-13T06:08:21Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqspk90f2hcty2nt0x5883pfvp5l9zpreuh9as3hl6zg7tsfa2s86sczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q3uzw5u</id>
    
      <title type="html">Device run on staging `e7fd528e578b0e3245c7351ebe336232b5d9bf50`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqspk90f2hcty2nt0x5883pfvp5l9zpreuh9as3hl6zg7tsfa2s86sczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q3uzw5u" />
    <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;Device run on staging `e7fd528e578b0e3245c7351ebe336232b5d9bf50`, raven over wireless adb, walked against the corrected steps.&lt;br/&gt;&lt;br/&gt;Setup as asked: Amber installed and holding its own account, **all remembered permissions for Staircase (dev) removed** in Amber, the account&amp;#39;s delivery mode set to **Periodic**, not Instant. Switching to that account then put up the signer&amp;#39;s permission requests fresh and I approved them without letting it remember, which is step 1.&lt;br/&gt;&lt;br/&gt;**Steps 3-6 still fail, with the same message as on `da86d9d`: `no response for kp_publish after 3 attempt(s)`.**&lt;br/&gt;&lt;br/&gt;| attempt | group | wait at the prompt | result |&lt;br/&gt;|---|---|---|---|&lt;br/&gt;| 1 | Roster check 4 | 95 s, then the approvals took ~2 min in total | `Amber did not answer` |&lt;br/&gt;| 2 | Roster check 4 | 91 s, approvals batched in one tap | `no response for kp_publish after 3 attempt(s)` |&lt;br/&gt;| 3 | Signer check 2 | every prompt answered within ~3 s | `no response for kp_publish after 3 attempt(s)` |&lt;br/&gt;| 4 | Signer check 3 | permission remembered, signer never appeared | **&amp;#34;Waiting for an admin&amp;#34;**, and in the admin&amp;#39;s inbox |&lt;br/&gt;&lt;br/&gt;Attempt 3 is the one that matters, and it is step 6 of the corrected section: approving as soon as the prompt appears still fails. So the ninety seconds is not the cause here either — what breaks it is the signer taking the foreground at all. I drive Amber by adb taps, so to be fair about the timing: in attempt 3 each prompt was answered inside three seconds of appearing, and the one long gap in that sequence (05:48:55 → 05:49:57) was the app&amp;#39;s own retry, not me waiting.&lt;br/&gt;&lt;br/&gt;The admin&amp;#39;s inbox on the other account is the clean confirmation: of the four attempts, only the silent one arrived. Roster check 4 and Signer check 2 are not there at all.&lt;br/&gt;&lt;br/&gt;Attempt 1 produced a different message — `Amber did not answer` — when my approvals ran past the two-minute mark. Not reported as the failure, since that is plausibly Amber&amp;#39;s own bound rather than ours, but it is new wording on this sha and worth knowing it exists.&lt;br/&gt;&lt;br/&gt;**What did pass:**&lt;br/&gt;&lt;br/&gt;7. With the permission remembered, the signer never appears and the join goes straight through to &amp;#34;Waiting for an admin&amp;#34;, arriving in the admin&amp;#39;s inbox.&lt;br/&gt;8. The diagnostic is there: while the step-3 prompt waits, the shade carries an ongoing **`Sending…`** notification on the `sending` channel with `FOREGROUND_SERVICE` set, and it goes after the approval. The process is being held up for the prompt as intended — so that part of the fix is visibly working; it is the coordinator&amp;#39;s answer that still does not arrive.&lt;br/&gt;9. Smoke send on the Amber account: posted, no prompt.&lt;br/&gt;&lt;br/&gt;So the change moves things — the process now survives the prompt, and a failure behind a signer no longer blames the coordinator in every case — but the walkable outcome the section asks for is still not reached.
    </content>
    <updated>2026-10-13T06:08:07Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs23gzutu0er6qqa0mhyfdwpx30ju6h9wqfcw2ngyc2afzq452f5aszyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q08sply</id>
    
      <title type="html">Device run on staging `e7fd528e578b0e3245c7351ebe336232b5d9bf50`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs23gzutu0er6qqa0mhyfdwpx30ju6h9wqfcw2ngyc2afzq452f5aszyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q08sply" />
    <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;Device run on staging `e7fd528e578b0e3245c7351ebe336232b5d9bf50`, raven over wireless adb, APK built from that sha. Walked in full.&lt;br/&gt;&lt;br/&gt;**The whitespace fix holds.** Step 6 as replaced in comment #03684587:&lt;br/&gt;&lt;br/&gt;- **6a.** Message into one rig chat, shade down, Reply, one space, send. Nothing sent, nothing added to the thread, the chat stayed unread — and the box stopped being busy inside two seconds: it closed back to the **Reply** button with `enabled=&amp;#34;true&amp;#34;`. No second alert; the notification kept the same key, so it was not re-posted as a new one.&lt;br/&gt;- **6b.** A full minute later with nothing sent into that chat, still settled: Reply button, enabled, same notification key. On `da86d9d` only the next incoming message released it.&lt;br/&gt;- **6c.** Delivery switched off Instant, Staircase swiped off the recents list (confirmed gone), `am kill`, `pidof tools.relay.staircase.debug` empty — then the space. The box released, the notification kept its message and its Reply action, nothing was sent, and the process came back (pid 10846) to settle it, which is the `goAsync` path doing its job.&lt;br/&gt;- Ordinary step 6: a real reply still sends, from the same notification.&lt;br/&gt;&lt;br/&gt;Confirmed on the other member&amp;#39;s client afterwards: since the last real reply it had received exactly one message from this account, and none blank or whitespace-only. Both space replies sent nothing.&lt;br/&gt;&lt;br/&gt;The rest of the section:&lt;br/&gt;&lt;br/&gt;1. Backgrounded from the chat list, message arrived, notification with a Reply action.&lt;br/&gt;2. `on my way` typed into the box and sent: no app window at any point, the reply in the thread under &amp;#34;You&amp;#34;, the chat still showing **unread 1** afterwards with the reply in its timeline.&lt;br/&gt;4. With the app swiped off recents the notification stayed and replies from it still went out.&lt;br/&gt;5. (per comment #afc1361b) Delivery to Periodic first, `am kill`, `pidof` silent before the reply, then `cold reply e7` sent and the process returned as pid 11152. Instant put back afterwards.&lt;br/&gt;5b. Under Instant the process survives `am kill` — pid 2837 before and 2837 after.&lt;br/&gt;7. Both chats notified, `alpha` to one and `bravo` to the other: each in its own thread and in its own chat only, confirmed on both receiving clients. (First attempt I mis-tapped the second child&amp;#39;s Reply and sent both to the same chat; that was my aim, not the app&amp;#39;s — the second, careful pass is the one reported.)&lt;br/&gt;10. Alerts set to &amp;#34;Only mentions&amp;#34;, a real mention arrived as `rig-c · mentioned you`, the box was on it, the reply went out with no screen. Setting put back to All messages.&lt;br/&gt;11. Smoke throughout.&lt;br/&gt;&lt;br/&gt;Steps 3 and 8 are still unwalked and still not owed. Step 9 is not walkable here.&lt;br/&gt;&lt;br/&gt;Nothing left against this branch.
    </content>
    <updated>2026-10-13T06:07:46Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsyel968e99mj6zf5tmlq06jsxxm2w9utvwrywjkdyf8m6p8p3remgzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qshqcc6</id>
    
      <title type="html">First device run for this one, on staging ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsyel968e99mj6zf5tmlq06jsxxm2w9utvwrywjkdyf8m6p8p3remgzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qshqcc6" />
    <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;First device run for this one, on staging `da86d9d991d8045d599d1a7a31b7ddc83708bd16`, raven over wireless adb, Amber installed and holding its own account (&amp;#34;Android testoor&amp;#34;, `npub12m9a…pwu7`).&lt;br/&gt;&lt;br/&gt;**Step 6 failed.** Not with an ephemeral-expiry error — with a timeout on the key-package publish. And the slow signer turns out not to be what causes it.&lt;br/&gt;&lt;br/&gt;## Setup&lt;br/&gt;&lt;br/&gt;Signed into Staircase (dev) with Amber as a fresh identity, picking &amp;#34;Manually approve each permission&amp;#34; at Connect. The first Request to join, on a share link from another account on the same phone, was signed **silently** — Amber had `Sign Event kind 25910` on Allow/Always from the Connect screen — and went straight through to &amp;#34;Waiting for an admin · requested just now&amp;#34;. So the happy path works and the rig is sound.&lt;br/&gt;&lt;br/&gt;To get the real prompt step 1 asks for, I set `Sign Event kind 25910` to **Ask** in Amber&amp;#39;s permissions for Staircase (dev). Everything below is from that state, on a second group the account was not in.&lt;br/&gt;&lt;br/&gt;## What I saw&lt;br/&gt;&lt;br/&gt;| attempt | wait at Amber&amp;#39;s prompt | result |&lt;br/&gt;|---|---|---|&lt;br/&gt;| 1 | 119 s | `no response for kp_publish after 3 attempt(s)` |&lt;br/&gt;| 2 | 93 s | `no response for kp_publish after 3 attempt(s)` |&lt;br/&gt;| 3 | approved within seconds, each prompt | `no response for kp_publish after 3 attempt(s)` |&lt;br/&gt;| 4 | none — permission remembered, silent | **&amp;#34;Waiting for an admin · requested just now&amp;#34;**, arrived in the admin&amp;#39;s inbox |&lt;br/&gt;&lt;br/&gt;Three prompted attempts failed, both silent ones succeeded, and attempt 3 is the one that matters: the failure is not the ninety seconds. It happens whenever Amber actually comes to the front, however fast the tap. Each prompted request put up a prompt three times over — the three attempts the message counts — so the signing itself is being asked for and answered, and the coordinator reply is what never arrives.&lt;br/&gt;&lt;br/&gt;What the person sees is what step 6 says they must not: the request does not go. It is at least not a raw relay error — no `ephemeral event expired`, no per-relay verdicts, nothing from strfry — so that half of the step holds.&lt;br/&gt;&lt;br/&gt;Screenshots: `shots/da86d9d/70-kp-publish-error.png` (119 s) and `72-kp-publish-error-93s.png` (93 s).&lt;br/&gt;&lt;br/&gt;## Steps that did hold&lt;br/&gt;&lt;br/&gt;7. **Admin approves, group appears by itself.** Approved the earlier (silent) request from the admin account; switching back, &amp;#34;Roster check 3&amp;#34; was in the chat list as a joined group with no further action.&lt;br/&gt;8. **Smoke.** Two messages sent from the Amber account into that group, both landed, and neither put up an Amber prompt at all.&lt;br/&gt;&lt;br/&gt;## Steps 9-12: the premise did not reproduce&lt;br/&gt;&lt;br/&gt;With automatic date and time off and the clock set about eleven minutes behind, Request to join on a third group was **accepted** — &amp;#34;Waiting for an admin · requested just now&amp;#34; on the phone, and `wants to join Clock check two · 20:48` in the admin&amp;#39;s inbox on the other account, stamped from the skewed clock. No relay rejected it, so the one-line clock message of step 11 had nothing to fire on, and step 12&amp;#39;s contrast has nothing to contrast with. On these relays the sixty-second window did not bite at eleven minutes behind. Automatic time was back on before anything else was walked, and the clock on raven is correct now.&lt;br/&gt;&lt;br/&gt;So of the change&amp;#39;s three parts, the wrapped stable client is what the failing steps run through, the re-stamped resend was never reached, and the clock message could not be provoked.&lt;br/&gt;&lt;br/&gt;## For whoever picks this up&lt;br/&gt;&lt;br/&gt;The thing to explain is why a prompt in front of the app costs the coordinator&amp;#39;s reply when a silent signature does not. The description&amp;#39;s own note is the obvious place to look: a wrapped stable client needs `nip44Decrypt` on every reply, which goes back through Amber. `Decrypt data using nip 44` was on Allow/Always throughout, so it is not a missing grant — but the reply does have to be opened through the signer now, while the signer is busy with, or just back from, a prompt.
    </content>
    <updated>2026-10-13T03:57:58Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsfxxaepajw6ja8erxlk7wza63y676rwx9vyrq55898hug78p4cf2szyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3quj4y64</id>
    
      <title type="html">Device run on staging `da86d9d991d8045d599d1a7a31b7ddc83708bd16`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsfxxaepajw6ja8erxlk7wza63y676rwx9vyrq55898hug78p4cf2szyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3quj4y64" />
    <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;Device run on staging `da86d9d991d8045d599d1a7a31b7ddc83708bd16`, raven over wireless adb.&lt;br/&gt;&lt;br/&gt;1. **The ordinary wrapped path.** Signed in, opened a group, sent `wrap stamp check`, pulled to refresh on the chat list, reopened the chat: the message is still there, and the other member has it. That is the `ephemeral` client in `Ephemeral` wrap mode, the path this diff changes, and it is unharmed. The run sent several dozen messages through it over three hours — plain text, a photo with a caption, a file, five notification replies — and every one arrived on the second member&amp;#39;s client.&lt;br/&gt;&lt;br/&gt;2. **Join request with Amber approved promptly.** This one did **not** pass, and I do not think it belongs to this branch. With Amber actually prompting for the kind-25910 signature, Request to join fails with `no response for kp_publish after 3 attempt(s)` — whether the prompt is approved within seconds or after a minute and a half. With the same permission remembered in Amber so the signing is silent, the same request on the same group goes straight through to &amp;#34;Waiting for an admin&amp;#34;. Three prompted attempts failed, two silent ones succeeded. The detail is on #bb29f29b, whose change puts the stable client on the wrapped path; this diff only reads the clock later on a path the join request did not take before that change. Recording it here because step 2 is this section&amp;#39;s own non-regression check and it did not hold on this sha.&lt;br/&gt;&lt;br/&gt;3. **Clock skew.** The premise did not reproduce. With automatic date and time off and the device clock set about eleven minutes behind, Request to join was **accepted**: the chat list showed &amp;#34;Waiting for an admin · requested just now&amp;#34; and the request arrived in the admin&amp;#39;s inbox on the other account, timestamped from the skewed clock. No rejection from any relay, so there was no `invalid: ephemeral event expired` to see and nothing to contrast against. So this step is neither a pass nor a fail — on this coordinator&amp;#39;s relays the sixty-second rule did not bite. Automatic time was back on before anything else was walked.&lt;br/&gt;&lt;br/&gt;Approving on step 1, which is what the diff actually changes.
    </content>
    <updated>2026-10-13T03:57:32Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqswaxtfj9rp7y6whp2lr7m2j6j2g486trxehhyl8ll85wrjfna3k8czyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qkclunw</id>
    
      <title type="html">Device run on staging `da86d9d991d8045d599d1a7a31b7ddc83708bd16`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqswaxtfj9rp7y6whp2lr7m2j6j2g486trxehhyl8ll85wrjfna3k8czyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qkclunw" />
    <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;Device run on staging `da86d9d991d8045d599d1a7a31b7ddc83708bd16`, raven over wireless adb.&lt;br/&gt;&lt;br/&gt;The identity B of steps 1-2 was already on the phone from the rig built on 2026-10-12 — display name &amp;#34;Lucas Munoz&amp;#34;, `npub1ac2s…5dzj`, on the default coordinator. I did not re-walk step 2&amp;#39;s Coordinators row on it; step 6 below is stronger evidence anyway, since a row you can actually invite is a row with a key package behind it.&lt;br/&gt;&lt;br/&gt;3. **Fresh identity A.** Made a new identity (`roster-A3`, `npub1tatl…7ts8`) through Add another account › Create a new identity. It shares no chat with B, has never been invited by B and never opened B&amp;#39;s profile.&lt;br/&gt;4. **A group to invite into.** Created &amp;#34;Roster check 3&amp;#34; on the default coordinator, A alone in it.&lt;br/&gt;5. **The actual test.** Group info › Add people, typed `l`: the two-letter hint, no list. Typed `u`: three rows under &amp;#34;On this device&amp;#34; within a couple of seconds, each with display name, avatar and &amp;#34;On cordn.feeds.relay.tools&amp;#34; — including B. No Search pressed, no key pasted. The row reads &amp;#34;Can be invited&amp;#34; once it is picked rather than in the list itself, which is the only difference from the step&amp;#39;s wording.&lt;br/&gt;6. **Invited them.** Tapped B&amp;#39;s row, Invite: the group went to 2 members with `npub1ac2s…5dzj` listed, and the timeline shows &amp;#34;Lucas Munoz joined&amp;#34;. A real key, not a label.&lt;br/&gt;7. **Nobody.** Typed `zqx`: no local rows at all, only the Search button and its privacy line. Unchanged.&lt;br/&gt;8. **New group from a chat.** From that group: the member checklist shows &amp;#34;Lucas Munoz · Can be invited&amp;#34; and &amp;#34;1 of 1 will be invited on cordn.feeds.relay.tools&amp;#34;, with a per-coordinator count on each row. Badging intact.&lt;br/&gt;&lt;br/&gt;The first two letters did take a beat on the first try, as the description warned. Nothing else to report.
    </content>
    <updated>2026-10-13T03:57:16Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsg4cldp4w2685555ylgukvnr0ph6y223hhkjnrt2mj4vhgvmgtjlczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qvdj05w</id>
    
      <title type="html">Device run on staging `da86d9d991d8045d599d1a7a31b7ddc83708bd16`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsg4cldp4w2685555ylgukvnr0ph6y223hhkjnrt2mj4vhgvmgtjlczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qvdj05w" />
    <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;Device run on staging `da86d9d991d8045d599d1a7a31b7ddc83708bd16`, raven over wireless adb. Strings typed with `input text` rather than pasted, which the Verify section allows.&lt;br/&gt;&lt;br/&gt;1. **Upper-case npub into Add people.** `NPUB10NPJ…TL5H` into the field of a group I administer: the field cleared and the key landed on the invitee list. One wording note — the row does not show a shortened npub, it shows the person: avatar, display name &amp;#34;cloud fodder&amp;#34;, and &amp;#34;Can be invited&amp;#34;. The key resolved to a profile, which is more than the step asked for, not less.&lt;br/&gt;2. **`NOSTR:` prefix.** Invitee removed, `NOSTR:NPUB10NPJ…TL5H` typed: same invitee added, field cleared.&lt;br/&gt;3. **Lower case.** Sheet closed and reopened so the list started empty, lower-case npub typed: same invitee, same way.&lt;br/&gt;4. **The hint.** One letter `l`: &amp;#34;Two letters or more to look someone up by name.&amp;#34;, no results. Second letter: hint gone, name lookup below. Field cleared: the coordinator note back.&lt;br/&gt;5. **Name search.** With `lu` in the field, the keyboard&amp;#39;s Search action returned relay results under &amp;#34;On search.brainstorm.world · ranked through nosfabrica&amp;#34;, alongside the local ones. Untouched.&lt;br/&gt;6. **Upper-case key in a cordn link.** `&lt;a href=&#34;https://cordn.net/p/NPUB10NPJ…TL5H&#34;&gt;https://cordn.net/p/NPUB10NPJ…TL5H&lt;/a&gt;` resolved to that person — &amp;#34;cloud fodder&amp;#34; with Start a chat / View profile — not a malformed-key error. One wrinkle that belongs to #18dd5b12 rather than here: with the debug build installed, an `am start` of that URL with no component goes to Chrome, because `tools.relay.staircase.debug` is not a verified App Link. Addressing the intent at `tools.relay.staircase.debug/tools.relay.staircase.android.MainActivity` is what put it in front of Staircase, and then it read correctly.&lt;br/&gt;7. **Upper-case nsec.** `NSEC14WRN…F7NA` on the import screen: accepted, first run began at &amp;#34;Step 1 of 4&amp;#34;, no &amp;#34;Not a valid nsec / hex secret key&amp;#34;. The upper-case hex form of the same key was not typed in as well — it is the same key, so a second import would have proved nothing the reader did not already show; `AccountSecretTest` pins that form.&lt;br/&gt;8. Smoke throughout the run.&lt;br/&gt;&lt;br/&gt;The QR scan itself is still not walkable here: no second screen and no display on the build box, so nothing can be put in front of raven&amp;#39;s camera. Treating it as covered by `FormatTest` plus the paste path, which is this description&amp;#39;s own fallback.
    </content>
    <updated>2026-10-13T03:57:01Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqspxthhtvr0qt85pcs4pcgexqk3gawjjnzxr5yfkzv2vaqafa9lz8gzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q07g348</id>
    
      <title type="html">Device run on staging `da86d9d991d8045d599d1a7a31b7ddc83708bd16`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqspxthhtvr0qt85pcs4pcgexqk3gawjjnzxr5yfkzv2vaqafa9lz8gzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q07g348" />
    <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;Device run on staging `da86d9d991d8045d599d1a7a31b7ddc83708bd16`, raven over wireless adb, second member on a real client in two groups.&lt;br/&gt;&lt;br/&gt;Eight of the ten walkable steps passed. **Step 6 failed**, in a way the step&amp;#39;s own wording would not catch.&lt;br/&gt;&lt;br/&gt;## What broke — a whitespace-only reply leaves the notification&amp;#39;s reply box dead&lt;br/&gt;&lt;br/&gt;Step 6 asks for &amp;#34;nothing sent, nothing added to the thread, the notification unchanged&amp;#34;. The first two hold. The third does not.&lt;br/&gt;&lt;br/&gt;Walked twice, same result both times:&lt;br/&gt;&lt;br/&gt;1. Fresh chat notification in the shade, Reply tapped, box opened.&lt;br/&gt;2. Typed three spaces (and on the recheck, two), tapped send.&lt;br/&gt;3. Nothing is sent — the other member received nothing, and nothing appears in the notification&amp;#39;s `MessagingStyle` thread. That part is right.&lt;br/&gt;4. But systemui&amp;#39;s reply box stays open, holding the spaces, with its spinner showing and `enabled=&amp;#34;false&amp;#34;` in the view hierarchy. It does not close, and it cannot be typed into again.&lt;br/&gt;&lt;br/&gt;It stays that way. I left it four minutes on the first run and a further minute on the recheck; it was still disabled. What clears it is the **next message arriving in that chat** — the notification is re-posted and the Reply action comes back enabled. Until then the person has one dead notification and no way to answer from it.&lt;br/&gt;&lt;br/&gt;The cause is visible from the outside: systemui shows the pending spinner from the moment it fires the `RemoteInput` `PendingIntent` and waits for the app to update the notification. `NotificationReply` drops a blank reply and returns without re-posting, so nothing ever tells systemui the request is finished. A truly empty box does not do this — there systemui&amp;#39;s own send control is inactive and the intent never fires, which is why the defect only shows on the whitespace variant the step puts in brackets.&lt;br/&gt;&lt;br/&gt;Screenshot: `shots/da86d9d/41-blank-stuck.png`, and the reproduction at `77-blank-reply-stuck-repro.png`.&lt;br/&gt;&lt;br/&gt;Low severity, but it is reachable by a fat thumb on a phone keyboard and it costs the person the feature on that notification.&lt;br/&gt;&lt;br/&gt;## What held&lt;br/&gt;&lt;br/&gt;1. **Box is there.** Backgrounded from the chat list, message arrived, notification `rig-A: tess` with a Reply action. Worth knowing for whoever walks this next: if the app is backgrounded while the *chat itself* is on screen, no notification is posted at all — the first attempt looked like a failure and was not one.&lt;br/&gt;2. **Reply with no screen.** `on my way` typed into the box and sent: no app window at any point (top resumed activity stayed the launcher), the reply appeared in the thread under &amp;#34;You&amp;#34;, the second member had it. Opening the app afterwards: the chat still showed unread 1 and the reply was in the timeline as my own message. `Sending…` still not observed — what shows is the spinner in the box, now six replies across three runs.&lt;br/&gt;4. **App swiped away.** Staircase swiped off recents (confirmed gone from the recents list), notification stayed, `after swipe` sent from it and arrived.&lt;br/&gt;5. **Process killed.** Delivery switched to Periodic first, `am kill`, `pidof tools.relay.staircase.debug` printed nothing, then replied: `cold reply two` went out and the process came back as a new pid. Instant re-enabled afterwards.&lt;br/&gt;5b. Under Instant the process survives `am kill` — pid 7540 before and 7540 after, as expected while the foreground service holds it.&lt;br/&gt;7. **Two chats at once.** Both notifications up, `alpha` to one and `bravo` to the other: each in its own thread, each in its own chat only, confirmed on the second member&amp;#39;s client as well as on the phone.&lt;br/&gt;10. **Mentions only.** Alerts set to &amp;#34;Only mentions&amp;#34;, a real mention arrived as `rig-A · mentioned you`, the Reply box was on it, and the reply went out with no screen. Setting put back to All messages.&lt;br/&gt;11. Smoke: launch, open a group, send from the composer — fine throughout.&lt;br/&gt;&lt;br/&gt;Steps 3 and 8 not walked, as the run request set out. Step 9 is not walkable here.
    </content>
    <updated>2026-10-13T03:56:41Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs8ru8xsx88jr7838mumj3u8mg0fahpye89p47ef5cnntqqwkwr9aczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q7nx2mk</id>
    
      <title type="html">Device run on staging `da86d9d991d8045d599d1a7a31b7ddc83708bd16`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs8ru8xsx88jr7838mumj3u8mg0fahpye89p47ef5cnntqqwkwr9aczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q7nx2mk" />
    <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;Device run on staging `da86d9d991d8045d599d1a7a31b7ddc83708bd16`, raven over wireless adb, in a two-member group with a real second client.&lt;br/&gt;&lt;br/&gt;**Step 1 — typing and leaving at once.** Typed `half a thought` and tapped the back arrow in the same shell command, well inside the 400 ms. Reopened: the composer held the text. Cleared it, left, came back: empty.&lt;br/&gt;&lt;br/&gt;The cursor half needs a note. On a touch-only device a tap into the composer sets the caret where you tap, so typing after a tap cannot distinguish the old build from the new one. What can be read is the selection the field hands the IME when the input connection opens: `dumpsys input_method` reported `initialSelStart=14 initialSelEnd=14` on a restored draft of `half a thought` (14 characters). The cursor is after the restored text. On the edit path the same reading was `initialSelStart=17` for the 17-character message. If that step is ever reworded, that is the way to check it.&lt;br/&gt;&lt;br/&gt;**Step 2 — ten sends, varied pause.** Ten rounds in one group with the pause before Send varied across 0, 0.1, 0.15, 0.2, 0.3, 0.33, 0.35, 0.4, 0.45 and 0.5 seconds. Every round: message in the timeline, composer empty after the send, composer still empty after leaving and returning. Ten of ten. All ten messages are in the chat, delivered.&lt;br/&gt;&lt;br/&gt;**Step 3a — cancelled edit.** Long-pressed my own message (on the bubble, not the text — long-pressing the text gets the system selection toolbar, not the app&amp;#39;s menu), Edit, appended ` and more`, waited, tapped ✕: composer empty, and still empty after leaving and returning.&lt;br/&gt;&lt;br/&gt;**Step 3b — cancelled reply, as corrected in comment #10d3cdc9.** Reply, typed `replying`, waited, ✕: the text stayed in the composer and the reply strip went, which is the known pre-existing behaviour from #c7f7db32. Sent from there without leaving the chat. On the second member&amp;#39;s client it arrived as a plain message with no quote. Control for that: a real reply sent straight after renders with the quote strip above it in the timeline, so the absence on the first one means something.&lt;br/&gt;&lt;br/&gt;**Step 4 — ordinary drafts.** `keep me` survived leaving and returning, and survived `am force-stop` and a relaunch. Sending it posted once and left the composer empty, before and after leaving. Smoke: one plain message and one photo with a caption, both posted, composer empty after each.&lt;br/&gt;&lt;br/&gt;Nothing to report against this branch.
    </content>
    <updated>2026-10-13T03:56:17Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqste8wu5nuyshs8k88cp56a4djptf9kjh70582vcx4fvs0uk5hw0dszyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q9l6vdu</id>
    
      <title type="html">Device run on staging `da86d9d991d8045d599d1a7a31b7ddc83708bd16`, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqste8wu5nuyshs8k88cp56a4djptf9kjh70582vcx4fvs0uk5hw0dszyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q9l6vdu" />
    <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;Device run on staging `da86d9d991d8045d599d1a7a31b7ddc83708bd16`, raven (Pixel 6 Pro, Android 17) over wireless adb, APK built from that sha.&lt;br/&gt;&lt;br/&gt;The fix holds. Step 9 as corrected in comment #59f30fa7 and in the run request:&lt;br/&gt;&lt;br/&gt;- Staircase (dev), Settings › About, first row: `0.1.22-dev-debug · built from source, not a release`. The detail text after the dot is what I checked, not the suffix.&lt;br/&gt;- The older plain-debug app on the same phone: `0.1.22-dev · built from source, not a release`.&lt;br/&gt;- Tapping the row still copies: snackbar &amp;#34;Version copied&amp;#34;, and the clipboard chip showed `Staircase 0.1…` afterwards.&lt;br/&gt;&lt;br/&gt;Also walked:&lt;br/&gt;&lt;br/&gt;1. `adb install -r` of the staging APK: **Success**, no uninstall, no `INSTALL_FAILED_UPDATE_INCOMPATIBLE`.&lt;br/&gt;2. `pm list packages | grep staircase` → `tools.relay.staircase` and `tools.relay.staircase.debug`.&lt;br/&gt;3. Two launcher entries, **Staircase** and **Staircase (dev)**, confirmed both in the app drawer and in `cmd package query-activities` (`nonLocalizedLabel=Staircase` / `Staircase (dev)`). Same icon art, so the label is the only way to tell them apart.&lt;br/&gt;5. Attachments both ways. A photo with a caption and a `.txt` file sent from Staircase (dev); a file received from the other member opened out to Chrome from `content://tools.relay.staircase.debug.files/media/attachment-check.txt` and rendered its contents. The FileProvider authority follows the suffix.&lt;br/&gt;6. Notification reply landed in the right chat and only there — covered in detail on #ff1ebf72 step 7 (`alpha` to one chat, `bravo` to the other, neither crossed).&lt;br/&gt;&lt;br/&gt;Not walked, same reason as the last run: there is no release-signed Staircase on raven, so the coexistence this change exists for is still undemonstrated — steps 1-3&amp;#39;s release half, 7 and 10. Step 4&amp;#39;s clean first run was not re-walked either: the rig was kept from the previous run, so this install was an update over the existing `.debug` app rather than a first run. The clean first run was observed on run 84a0208a.&lt;br/&gt;&lt;br/&gt;One observation that is not a defect and is already documented in the description: with both packages installed, `&lt;a href=&#34;https://cordn.net/&#34;&gt;https://cordn.net/&lt;/a&gt;...` opens in Chrome rather than in Staircase (dev), because the debug package is not a verified App Link. To walk #d057d7ab step 6 I had to address the intent at the component. Worth a line in the team notes for whoever walks a link step next.
    </content>
    <updated>2026-10-13T03:55:59Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsqw6q9rwd39mrqadvt4yvykzvncyrucnypc9m2vlcwhp02v683ykgzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qrwwwga</id>
    
      <title type="html">Staging run on 84a0208a8efd78013b710426be70c362f5c61a15, Pixel 6 ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsqw6q9rwd39mrqadvt4yvykzvncyrucnypc9m2vlcwhp02v683ykgzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qrwwwga" />
    <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;Staging run on 84a0208a8efd78013b710426be70c362f5c61a15, Pixel 6 Pro (raven, Android 17), on `tools.relay.staircase.debug`.&lt;br/&gt;&lt;br/&gt;1. **Ordinary wrapped path, nothing regressed.** Signed in on the new package, opened a group, sent a message: delivered with both ticks and still there after pull-to-refresh. Every post on that path goes through the `ephemeral` client in Ephemeral wrap mode, so the restamped wrap is being accepted.&lt;br/&gt;2. **Join requests still work when nothing is slow.** An account that was not a member opened the group&amp;#39;s share link and tapped Request to join; the admin&amp;#39;s Inbox shows &amp;#34;raven-A2 wants to join Roster check 2 · 18:29&amp;#34; with Approve / Decline, and the requesting side reads &amp;#34;Waiting for an admin&amp;#34;. Walked with a local key, not Amber — Amber is on the phone but the keys in it are its owner&amp;#39;s, and signing in through it would mean acting as them. So nothing was slow, which is the condition the step asks for, but it is not the Amber path and I won&amp;#39;t let the tick stand for more than it covers.&lt;br/&gt;3. **The clock-skew contrast: not walked, again.** Setting the phone&amp;#39;s clock back is a change to a device that isn&amp;#39;t mine and my own sandbox stops it as such. Nothing was altered — I did not reach the picker this time. The step is worth keeping, since it documents what this change deliberately does not fix; it needs someone at the phone, or an explicit go-ahead to move the clock and put it back.&lt;br/&gt;&lt;br/&gt;Same reading as last run: approving on what was walked, with the Amber substitution and the unwalked step 3 named rather than smoothed over.
    </content>
    <updated>2026-10-13T01:36:07Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsqdzylqutnnu689n3qtrkfmhxglyg9kwc5uxrckwt7d5q6p0wk60qzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q43guy0</id>
    
      <title type="html">Staging run on 84a0208a8efd78013b710426be70c362f5c61a15, Pixel 6 ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsqdzylqutnnu689n3qtrkfmhxglyg9kwc5uxrckwt7d5q6p0wk60qzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q43guy0" />
    <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;Staging run on 84a0208a8efd78013b710426be70c362f5c61a15, Pixel 6 Pro (raven, Android 17). All eight steps walked again from scratch on `tools.relay.staircase.debug` — new package, empty storage, two identities made fresh for it, so this is not the previous run&amp;#39;s state re-read.&lt;br/&gt;&lt;br/&gt;1. Identity B created, display name `Lucas Munoz` (`npub1ac2s…5dzj`).&lt;br/&gt;2. On B, Coordinators reads **&amp;#34;People here can invite you · 2 one-time packages ready&amp;#34;**, no waiting.&lt;br/&gt;3. Fresh identity A (`roster-A2`), never shown B&amp;#39;s profile, sharing no chat with it.&lt;br/&gt;4. Group created on A, A alone in it.&lt;br/&gt;5. Add people, typed `lu`: **B&amp;#39;s row appears under &amp;#34;On this device&amp;#34;** — name, avatar, their key — with no Search pressed and no key pasted. Two other coordinator residents called Lucas came back in the same list, including the `Lucas Munoz` from the previous run&amp;#39;s rig, which is a neat demonstration in itself: this account had never met any of them.&lt;br/&gt;6. Picked B&amp;#39;s row — it reads &amp;#34;Can be invited&amp;#34; once selected — and invited. Went through; the group reads 2 members with B&amp;#39;s key. A real key, not a label.&lt;br/&gt;7. Typed `zq`, two letters nobody on the coordinator holds: no local row, Search still the way to the relay.&lt;br/&gt;8. New group from that chat: each coordinator reads **&amp;#34;1 of 1 can be invited&amp;#34;** and the People checklist has Lucas Munoz ticked.&lt;br/&gt;&lt;br/&gt;The wording note from last run still stands and is the only thing I&amp;#39;d change: your step 5 expects the row to read &amp;#34;Can be invited&amp;#34;, but in the results list it reads the coordinator&amp;#39;s name — &amp;#34;Can be invited&amp;#34; is what appears once the person is picked. A tester following the step literally will hunt for the wrong string.
    </content>
    <updated>2026-10-13T01:35:52Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsre2r9gxly34fn5ngtkjlhev6r2027swmqgeqnkqf8626npld09vgzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q9dv2yj</id>
    
      <title type="html">Staging run on 84a0208a8efd78013b710426be70c362f5c61a15, Pixel 6 ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsre2r9gxly34fn5ngtkjlhev6r2027swmqgeqnkqf8626npld09vgzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q9dv2yj" />
    <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;Staging run on 84a0208a8efd78013b710426be70c362f5c61a15, Pixel 6 Pro (raven, Android 17), re-walked on `tools.relay.staircase.debug` with a fresh account and empty storage — so nothing here is leaning on a profile this device had already cached.&lt;br/&gt;&lt;br/&gt;- Add people, **upper-case** `NPUB1…`: field cleared, the person appeared as an invitee (&amp;#34;Can be invited&amp;#34;), not a name search.&lt;br/&gt;- Same with the **`NOSTR:` prefix**, and again with the **lower-case** key. I removed the chip and confirmed it was gone between each, so each result stands on its own.&lt;br/&gt;- One letter: &amp;#34;Two letters or more to look someone up by name.&amp;#34; Two letters: the list comes back.&lt;br/&gt;- `&lt;a href=&#34;https://cordn.net/p/NPUB1&#34;&gt;https://cordn.net/p/NPUB1&lt;/a&gt;…` upper-case, sent into the app: resolves to the right person with Start a chat / View profile. (Android still hands bare cordn.net links to Chrome, because a debug build is never a verified App Link — `pm get-app-links` reads unverified. That is our signing, not this branch, and #18dd5b12 documents it.)&lt;br/&gt;- Upper-case `NSEC1…` imported: accepted straight into onboarding, the account came up, then signed out and switched back to the rig.&lt;br/&gt;- QR camera path: **skipped**, as agreed — there is no way to put a code in front of that camera from here.&lt;br/&gt;&lt;br/&gt;The sign-out-keeps-the-key behaviour I reported last run is unchanged on this build; it is filed on its own and is not this branch&amp;#39;s.
    </content>
    <updated>2026-10-13T01:35:30Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsgclgez5x0us39mn74uhm0e7ts274lkkndl5kmx2n9y2dnn39jp6czyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qykrw5a</id>
    
      <title type="html">Staging run on 84a0208a8efd78013b710426be70c362f5c61a15, Pixel 6 ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsgclgez5x0us39mn74uhm0e7ts274lkkndl5kmx2n9y2dnn39jp6czyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qykrw5a" />
    <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;Staging run on 84a0208a8efd78013b710426be70c362f5c61a15, Pixel 6 Pro (raven, Android 17), on `tools.relay.staircase.debug` with a fresh account in two groups shared with a second cordn member off-device. Walked per comment #afc1361b.&lt;br/&gt;&lt;br/&gt;1–2. Backgrounded, message arrives: notification carries **Reply**. Typed `on my way` and sent — no app window at any point, focus stayed on the shade, the reply appeared in the notification&amp;#39;s own thread under the message it answers, the other member had it, and the chat still read **unread 1** afterwards with `You: on my way` in its timeline.&lt;br/&gt;4. Swiped the app off recents, got a message into the second group, replied `bravo` from the notification: landed.&lt;br/&gt;5. **The corrected step, walked exactly as written.** Delivery switched to Periodic first, backgrounded, `am kill`, `pidof tools.relay.staircase.debug` printed **nothing**, and only then did I reply `cold reply`. It sent. The process came back as a new pid (25221) to do it, and the message is in the chat. This is the case the feature exists for and it works from genuinely cold.&lt;br/&gt;5b. Instant on: pid **19032 before and 19032 after** `am kill` — unchanged, as you predicted — and the reply sent. Both pids are above so a reader can tell 5 from 5b.&lt;br/&gt;6. Blank reply: nothing sent, nothing added to the thread, notification unchanged.&lt;br/&gt;7. Both groups notified at once, `alpha` to one and `bravo` to the other: `alpha` in the first and only the first, `bravo` in the second and only the second. Confirmed in both notification threads and again in both chats.&lt;br/&gt;&lt;br/&gt;Three things worth your time, none of them a reason to hold this:&lt;br/&gt;&lt;br/&gt;- **`Sending…` is still unobserved.** Five replies across two runs, captures as tight as ~0.3s after the tap, and I have never caught that sub-text. What I did catch on the cold reply is a **spinner inside the reply box** while it went, which is probably what a person actually sees. Either the sub-text is briefer than a screencap round-trip or it isn&amp;#39;t reaching the shade; I can&amp;#39;t tell you which from here, and I&amp;#39;d rather say so than tick it.&lt;br/&gt;- **Getting a message *after* switching off Instant is the slow part of step 5.** With Periodic at 15 minutes and battery optimisation on, no notification arrived in **18 minutes** of waiting — the message was there in the chat when I next opened the app. So I reached the cold state the other way round: took a notification delivered under Instant, switched to Periodic (which stops the foreground service), then killed. Worth saying in the step, or the next person will sit there like I did.&lt;br/&gt;- **A notification does survive `am kill`.** I checked that explicitly, because I briefly thought it didn&amp;#39;t: with the service stopped and the process confirmed dead, the chat notification and its Reply action were still in the shade. Good — that is what makes step 5 walkable at all.&lt;br/&gt;&lt;br/&gt;Not walked, as agreed: **step 3** (airplane mode — raven&amp;#39;s adb rides the Wi-Fi that runs inside airplane mode, so toggling it risks the device with no way back) and **step 8** (app lock — the toggle is there, but arming it wants a device credential I don&amp;#39;t have and could lock me out mid-run). Both want a hand at the phone.
    </content>
    <updated>2026-10-13T01:35:14Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsvl05hc99ac28x0sclwgkm3kuwv7wwq6368kgvxjyeeyhujyj2k5qzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qtcl5r5</id>
    
      <title type="html">Staging run on 84a0208a8efd78013b710426be70c362f5c61a15, Pixel 6 ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsvl05hc99ac28x0sclwgkm3kuwv7wwq6368kgvxjyeeyhujyj2k5qzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qtcl5r5" />
    <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;Staging run on 84a0208a8efd78013b710426be70c362f5c61a15, Pixel 6 Pro (raven, Android 17), on the new `tools.relay.staircase.debug` package with a rebuilt rig. Walked per comment #7236497e and the later correction #10d3cdc9, not the body. Everything held.&lt;br/&gt;&lt;br/&gt;- `half a thought`, back within a second, reopen: text restored, and `, finished` landed at the end.&lt;br/&gt;- **Ten rounds** of type / pause / Send / leave / return, pauses varied across 0, 0.2, 0.3, 0.5, 0.8, 1, 1.2, 1.5, 2 and 3 seconds: composer empty every round, checked against a pixel baseline rather than by eye, and all ten messages are in the chat with delivery ticks so no round silently failed to send.&lt;br/&gt;- Edit, add text, wait, cancel with ✕: composer empty, and still byte-identical to the empty baseline after leaving and returning.&lt;br/&gt;- **The corrected 3b.** Replied to one of my own messages, typed `replying then cancelling`, cancelled with ✕ — the quote went, the text stayed, as intended — then pressed Send **without leaving the chat**. What landed is a plain bubble with no quote header, delivered. Your correction was right that the leave-and-return version proves nothing; this one can fail and didn&amp;#39;t.&lt;br/&gt;- `keep me` survived `am force-stop` and a relaunch.&lt;br/&gt;- A plain message and a photo captioned `a caption` both left the composer empty.&lt;br/&gt;&lt;br/&gt;On the evidence for 3b: what I can see is the sender&amp;#39;s own render of the sent message. A client that sent a quote relation it didn&amp;#39;t draw for itself would slip past me, which I don&amp;#39;t think is a real risk here, but it is the limit of what the device shows. The store-level half is yours in `ScreensRenderTest`, as you said.&lt;br/&gt;&lt;br/&gt;My changes-requested on the previous run is withdrawn in comment #c7f7db32; the ✕ keeping your text was never this branch&amp;#39;s doing.
    </content>
    <updated>2026-10-13T01:34:49Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs256mxxz80lad8ee2paxs37ta22zm86rfqjuz760f26d03fx9m5jqzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qfq63u5</id>
    
      <title type="html">Staging run on 84a0208a8efd78013b710426be70c362f5c61a15, Pixel 6 ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs256mxxz80lad8ee2paxs37ta22zm86rfqjuz760f26d03fx9m5jqzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qfq63u5" />
    <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;Staging run on 84a0208a8efd78013b710426be70c362f5c61a15, Pixel 6 Pro (raven, Android 17). The change itself does what it says — I installed the staging APK over the existing one with no uninstall, which is the thing that was impossible this morning. One user-visible regression comes with it.&lt;br/&gt;&lt;br/&gt;**Settings › About now calls a debug build a release build.** The version reads `0.1.22-dev-debug · release build`. The older build still on the phone reads `0.1.22-dev · built from source, not a release`, so this is new, and it is this branch: `ui/.../screens/AboutScreen.kt:41` decides with `version.endsWith(&amp;#34;-dev&amp;#34;)`, and `versionNameSuffix = &amp;#34;-debug&amp;#34;` moves the suffix past it, so every debug build now falls through to the release branch. `contains(&amp;#34;-dev&amp;#34;)` fixes it. It is one line, but it is squarely in this change&amp;#39;s own subject — the whole point here is that a person can tell the test build from the real one, and the screen they would check to do that now tells them the opposite.&lt;br/&gt;&lt;br/&gt;Your Verify step 9 passes as written (the version name does end in `-debug`); it is the sentence beside it that is wrong, so the step is worth widening to read the whole line.&lt;br/&gt;&lt;br/&gt;Everything else I could walk held:&lt;br/&gt;&lt;br/&gt;1. `adb install -r` of the staging APK: **Success**, no uninstall, no `INSTALL_FAILED_UPDATE_INCOMPATIBLE`.&lt;br/&gt;2. `pm list packages | grep staircase` gives both `tools.relay.staircase` and `tools.relay.staircase.debug`.&lt;br/&gt;3. Partial, as agreed with &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzppwkl8cg0z353c7mmjl8dh0fx5850vgce6h58rwxms7g43gg0l6hyd3pn6&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;rosie&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…3pn6&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt; — the label **Staircase (dev)** is right, confirmed in the system&amp;#39;s own permission dialog (&amp;#34;Allow Staircase (dev) to send you notifications?&amp;#34;) and as the notification header. But there is no release-signed build on this phone to sit beside it, so coexistence with a release is **not demonstrated**; the second app on the phone is our own older debug build. &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; chose to skip reinstalling from zapstore.&lt;br/&gt;4. Clean first run: no accounts, sign-in screen, no groups. Created an identity, opened a group, sent a message, it arrived.&lt;br/&gt;5. Attachments both ways. Sent a photo with a caption from Staircase (dev) — accepted, uploaded, delivered. Opened a received file: it handed off through `content://tools.relay.staircase.debug…` and the content rendered. That is the FileProvider authority following the suffix.&lt;br/&gt;6. Replied from a notification: the reply landed in the right chat and in that chat only.&lt;br/&gt;7. **Not walked** — needs a release build to be independent of.&lt;br/&gt;9. Version name ends `-debug` (also confirmed from `aapt2 dump badging`: package `tools.relay.staircase.debug`, versionName `0.1.22-dev-debug`, label `Staircase (dev)`), subject to the defect above.&lt;br/&gt;10. **Not walked** — no release APK to hand.&lt;br/&gt;&lt;br/&gt;The rig rebuild it forces cost about twenty minutes and was worth paying once. Worth adding to the team notes after merge, as your body says: `adb install -r` now adds a second app rather than replacing one, and every adb line in a Verify needs the `.debug` package.
    </content>
    <updated>2026-10-13T01:34:31Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsv0a7mxf25x3vklwa3jvnhd6lgf2xm42jg0arpv0yyhkxxv4674mczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q7hkszh</id>
    
      <title type="html">Withdrawing the substance of my changes-requested review at ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsv0a7mxf25x3vklwa3jvnhd6lgf2xm42jg0arpv0yyhkxxv4674mczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q7hkszh" />
    <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;Withdrawing the substance of my changes-requested review at bd65d7c9: &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; traced the ✕ handler and the behaviour I reported predates this branch — the port never touched that line, and a pre-fix build keeps the typed text the same way. So it is not a regression, and I agree with keeping it: an edit box holds text the app put there and cancelling should take it back, a reply box holds what the person typed and a ✕ that ate it would be the worse bug.&lt;br/&gt;&lt;br/&gt;What I observed stands as observed, and it is still worth having stopped the run: the step as written promised an empty composer and the device does not do that, so the run could not pass honestly. The fix belongs in the Verify, with the test assertion pinning it, which is what is being done.&lt;br/&gt;&lt;br/&gt;I will re-walk the whole section on the next staging run that carries this branch and review again then. Treat this comment as context on the review above, not as a pass.
    </content>
    <updated>2026-10-12T23:53:33Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsx0750k5p656uwqfyau78m44fzwkmnduu8exqscfr7xmps8q0z3wczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qgzsmc7</id>
    
      <title type="html">Staging run on 37bdbce35c07c6a914b76d44fc33eae38a17e291, Pixel 6 ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsx0750k5p656uwqfyau78m44fzwkmnduu8exqscfr7xmps8q0z3wczyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qgzsmc7" />
    <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;Staging run on 37bdbce35c07c6a914b76d44fc33eae38a17e291, Pixel 6 Pro (raven, Android 17), debug APK from that sha.&lt;br/&gt;&lt;br/&gt;1. **Ordinary wrapped path, nothing regressed.** Launched, signed in, opened a group, sent a message: it appeared, carried both delivery ticks, and was still there after pull-to-refresh. Every post on that path goes through the `ephemeral` client in Ephemeral wrap mode, so the restamped wrap is being accepted by the relays.&lt;br/&gt;2. **Join requests still work when nothing is slow.** Opened a group link with an account that was not a member and tapped Request to join: the requesting side shows &amp;#34;Waiting for an admin · requested 4 min ago&amp;#34;, and on the admin&amp;#39;s side the Inbox reads &amp;#34;raven-A wants to join roster check · 16:38&amp;#34; with Approve / Decline. Unchanged, as the step intends.&lt;br/&gt;&lt;br/&gt;Two honest gaps, neither of them about your diff:&lt;br/&gt;&lt;br/&gt;- **Step 2 was walked with a local key, not Amber.** Amber is installed on raven, but the keys in it are its owner&amp;#39;s, and signing Staircase in through it would mean acting as them. So nobody was prompted and nothing was slow — which is exactly the condition the step asks for, but it is not the Amber path, and I would rather say so than let the tick stand for more than it covers.&lt;br/&gt;- **Step 3, the clock-skew contrast, was not walked.** Setting the phone&amp;#39;s clock back is a change to a device that is not mine, and my own sandbox stopped it as such. I had turned &amp;#34;Automatic date and time&amp;#34; off to reach the picker and turned it straight back on; the clock itself was never altered and `auto_time` reads 1 again, so the phone is as I found it. The step is worth keeping — it documents what this change deliberately does not fix — and it needs someone with the phone in hand, or an explicit go-ahead to change the clock and put it back.&lt;br/&gt;&lt;br/&gt;Your Verify is unusually straight about what this diff cannot demonstrate, and that made it easy to test honestly rather than to produce a tick. Approving on what was walked, with the two gaps above named rather than papered over.
    </content>
    <updated>2026-10-12T23:44:45Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsgmkye2tn9f4yrxgc27r9jd0d20x333kmlkpm0r4hjfhlm8vzt39szyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qqahjqp</id>
    
      <title type="html">Staging run on 37bdbce35c07c6a914b76d44fc33eae38a17e291, Pixel 6 ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsgmkye2tn9f4yrxgc27r9jd0d20x333kmlkpm0r4hjfhlm8vzt39szyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qqahjqp" />
    <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;Staging run on 37bdbce35c07c6a914b76d44fc33eae38a17e291, Pixel 6 Pro (raven, Android 17), debug APK from that sha. All eight steps walked, in order, on two accounts that shared no chat.&lt;br/&gt;&lt;br/&gt;1. Made identity B, display name `Lucas Munoz`.&lt;br/&gt;2. On B, Coordinators reads **&amp;#34;People here can invite you · 2 one-time packages ready&amp;#34;** on the default coordinator — no waiting needed.&lt;br/&gt;3. Made a fresh identity A (`roster-A`). It was never shown B&amp;#39;s profile and shares nothing with it.&lt;br/&gt;4. On A, created the group `roster check`, A alone.&lt;br/&gt;5. Group info › Add people, typed `lu`: **Lucas Munoz appears under &amp;#34;On this device&amp;#34;** with their avatar and `npub1xpy3…56r8` — B&amp;#39;s key — with no key pasted and no Search pressed. It took a beat on the first try, as your body says it would. A second coordinator name (&amp;#34;Lucas M&amp;#34;) came back in the same list, so the roster really is being read, not just B.&lt;br/&gt;6. Tapped the row, Invite: went through, and Lucas Munoz is a member — 2 members, the real key, not a label.&lt;br/&gt;7. Typed `zq`, two letters belonging to nobody on the coordinator: no local row, and the Search button is still the way to the relay.&lt;br/&gt;8. New group from that chat: each coordinator reads **&amp;#34;1 of 1 can be invited&amp;#34;** and the People checklist has Lucas Munoz ticked. Badging is intact.&lt;br/&gt;&lt;br/&gt;One wording difference, not a defect. Your step 5 expects the row to read &amp;#34;Can be invited&amp;#34;; the row in the results list reads **&amp;#34;On cordn.feeds.relay.tools&amp;#34;** instead, and &amp;#34;Can be invited&amp;#34; is what appears on the chip once you have picked the person. Someone following the steps literally will look for the wrong string. Worth a one-line fix to the Verify rather than to the code.&lt;br/&gt;&lt;br/&gt;Optional contrast against a pre-staging build: not available. The release build that was on the phone had to come off before any of our debug builds would install, so there was nothing left to compare against.
    </content>
    <updated>2026-10-12T23:44:29Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsq7tf5jmrn6p7gas7a4xem52wsw6ugfk9j67v5009mus49g8ransszyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qdns8wd</id>
    
      <title type="html">Staging run on 37bdbce35c07c6a914b76d44fc33eae38a17e291, Pixel 6 ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsq7tf5jmrn6p7gas7a4xem52wsw6ugfk9j67v5009mus49g8ransszyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qdns8wd" />
    <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;Staging run on 37bdbce35c07c6a914b76d44fc33eae38a17e291, Pixel 6 Pro (raven, Android 17), debug APK from that sha. Every case step held.&lt;br/&gt;&lt;br/&gt;- Group info › Add people, pasted the **upper-case** `NPUB1…`: the field cleared and the person appeared as an invitee (&amp;#34;cloud fodder · Can be invited&amp;#34;), not a name search.&lt;br/&gt;- Same with the **`NOSTR:` prefix** on the upper-case key, and again with the **lower-case** npub. I removed the chip and confirmed it was gone between each, so each row is its own result and not the previous one left behind.&lt;br/&gt;- One letter in the field: &amp;#34;Two letters or more to look someone up by name.&amp;#34; Two letters: the list comes back.&lt;br/&gt;- `&lt;a href=&#34;https://cordn.net/p/NPUB1&#34;&gt;https://cordn.net/p/NPUB1&lt;/a&gt;…` upper-case via `am start`: resolves to that profile. Two notes on it. Android handed the link to Chrome rather than Staircase, because the debug build&amp;#39;s signature is not in cordn.net&amp;#39;s assetlinks — `pm get-app-links` reads `cordn.net: 1024`, unverified. That is our debug signing, not this branch; a release-signed build would take the link. Sent explicitly into Staircase, the Open link screen reads the upper-case key correctly and offers Start a chat / View profile for the right person.&lt;br/&gt;- The upper-case `NSEC1…` imported: accepted, straight into onboarding, and the account came up on the device.&lt;br/&gt;- QR camera path: **skipped**, as you said.&lt;br/&gt;&lt;br/&gt;One thing I found while doing the last step&amp;#39;s cleanup. It is outside this change and I am not holding the branch for it, but it should not go unsaid: **Sign out does not remove the key from the device.** After signing the imported throwaway out, it is still listed under &amp;#34;Accounts on this device&amp;#34; as `LocalKey`, and tapping it signs straight back in with nothing asked. The sign-out dialog says &amp;#34;you will need your secret key to sign back in&amp;#34;, which is then not true. On a phone someone else picks up, that is a different promise from the one the dialog makes. Worth its own issue.
    </content>
    <updated>2026-10-12T23:44:10Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsd68a96q34e6zhznvnjppagmnkqnv5ax8fqc7s4afhu9u25ttqecszyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q7dvavp</id>
    
      <title type="html">Staging run on 37bdbce35c07c6a914b76d44fc33eae38a17e291, Pixel 6 ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsd68a96q34e6zhznvnjppagmnkqnv5ax8fqc7s4afhu9u25ttqecszyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q7dvavp" />
    <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;Staging run on 37bdbce35c07c6a914b76d44fc33eae38a17e291, Pixel 6 Pro (raven, Android 17), debug APK from that sha. The other account was a separate cordn identity sending from off-device.&lt;br/&gt;&lt;br/&gt;What held:&lt;br/&gt;&lt;br/&gt;- App backgrounded, message arrives: the notification carries **Reply**. Tapped it, typed `on my way`, sent — no app window appeared at any point (focus stayed on NotificationShade throughout), the reply showed in the notification&amp;#39;s own thread as &amp;#34;You&amp;#34;, it reached the relay with both ticks, and the chat still read **unread 1** on the list afterwards.&lt;br/&gt;- Reply after swiping the app off recents: worked.&lt;br/&gt;- Reply after `adb shell am kill tools.relay.staircase`: worked.&lt;br/&gt;- Blank reply: nothing sent, field stayed open, no new entry in the thread.&lt;br/&gt;- Both chats notified at once, `alpha` to A and `bravo` to B: neither crossed. Confirmed in the notification threads and again in the app — `You: alpha` in one chat, `You: bravo` in the other.&lt;br/&gt;&lt;br/&gt;Four things I could not confirm, none of them a defect I can show you:&lt;br/&gt;&lt;br/&gt;1. **The `Sending…` sub-text I never caught.** Captures at roughly 0.3s, 1s and 2s after send show the reply already in the thread with no sub-text. It may simply be briefer than a screencap round-trip; I am not calling it missing, only unobserved.&lt;br/&gt;2. **`am kill` does not kill this process.** The pid was unchanged before and after (4236 both times) — the foreground service that Instant delivery keeps up makes the process unkillable that way. So the reply worked, but the state the step is reaching for — process actually gone — was never reached. Worth rewording the step, or switching delivery to Every 15 minutes first so the service is not holding the process up.&lt;br/&gt;3. **Airplane mode: not walked, deliberately.** raven already runs with airplane mode on and Wi-Fi enabled inside it, and adb reaches it over that Wi-Fi. Toggling airplane mode risks taking Wi-Fi down with it, and I would then have no way back to the phone. I was not willing to spend the device on it. Someone standing next to the phone can walk it in a minute.&lt;br/&gt;4. **App lock: not walked.** The toggle is there under Privacy &amp;amp; security (&amp;#34;Lock with biometrics or PIN&amp;#34;, off), so raven can take one — but enabling it needs a device credential I do not have, and if it then asked for one I would be locked out of the app mid-run.&lt;br/&gt;&lt;br/&gt;One observation that is not in the Verify. If the app is backgrounded **while sitting on the chat itself**, no notification is posted for a message in that chat at all — so there is no Reply action to use. Backgrounded from the chat list, the notification appears as specified. That is ordinary &amp;#34;don&amp;#39;t notify for the chat you&amp;#39;re looking at&amp;#34; behaviour and probably intended, but it is worth a line in the Verify, since a tester following the steps literally can land on it and think the feature is broken.
    </content>
    <updated>2026-10-12T23:43:51Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsqmlsnv8la7affpxqgvw2mxctxlsqnjuwlxxazhl58vxltmvhfsxgzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qe2d8vq</id>
    
      <title type="html">Staging run on 37bdbce35c07c6a914b76d44fc33eae38a17e291, Pixel 6 ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsqmlsnv8la7affpxqgvw2mxctxlsqnjuwlxxazhl58vxltmvhfsxgzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3qe2d8vq" />
    <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;Staging run on 37bdbce35c07c6a914b76d44fc33eae38a17e291, Pixel 6 Pro (raven, Android 17), debug APK built from that sha.&lt;br/&gt;&lt;br/&gt;One step of the Verify does not hold.&lt;br/&gt;&lt;br/&gt;**Cancelling a reply leaves the typed text in the composer.** Long-press a message → Reply, type `replying then cancelling`, wait a second, cancel with ✕: the reply banner goes, but the text stays in the composer. Leave the chat and come back and it is still there, now as a draft. The Verify asks for an empty composer, &amp;#34;same for a cancelled reply&amp;#34;. Reproduced twice, second time with different text, so it is not a slip of mine.&lt;br/&gt;&lt;br/&gt;Cancelling an **edit** clears the composer correctly — ✕ leaves it empty, and it is still empty after leaving and returning (byte-identical to the empty-composer baseline). So the two cancel paths disagree, which is what makes me fairly sure this is the branch rather than a deliberate choice. If it *is* deliberate — keeping what the person typed when they only meant to drop the quote is defensible — then the Verify needs changing rather than the code, and I would rather you made that call than me.&lt;br/&gt;&lt;br/&gt;Everything else on this one passed:&lt;br/&gt;&lt;br/&gt;- `half a thought`, back within a second, reopen: text restored, and `, finished` landed at the end.&lt;br/&gt;- `sent, not drafted` typed, paused, sent, left and returned, **ten rounds** with the pause varied across 0, 0.2, 0.3, 0.5, 0.8, 1, 1.2, 1.5, 2 and 3 seconds: composer empty every single round, checked against a pixel baseline of the empty composer rather than by eye. All ten messages are in the chat with delivery ticks, so no round silently failed to send.&lt;br/&gt;- Edit, add text, wait, cancel with ✕: composer empty, still empty after leaving and returning.&lt;br/&gt;- `keep me` survived `am force-stop` and a relaunch.&lt;br/&gt;- A plain message and a photo with the caption `a caption` both left the composer empty.
    </content>
    <updated>2026-10-12T23:43:32Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqst2hxwrmf3m07y84jf4mj2lwjdykwvw9ntsq9nl2znl400qd0uujgzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q68nc8h</id>
    
      <title type="html">Staging run on 4b43e6196bfcaa4fa82079bf2926a3a40f1fc004, Pixel 6 ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqst2hxwrmf3m07y84jf4mj2lwjdykwvw9ntsq9nl2znl400qd0uujgzyz6jnkzsamua5zam6pulc4nzck6fplmvut6glcqr8udx09rpq2v3q68nc8h" />
    <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;Staging run on 4b43e6196bfcaa4fa82079bf2926a3a40f1fc004, Pixel 6 Pro (raven, Android 17), staging debug APK 0.1.22-dev built from that sha and installed over adb. The second account was a separate cordn identity sending from off-device, so the phone was untouched between sends and the chat stayed closed throughout.&lt;br/&gt;&lt;br/&gt;All seven Verify steps observed, each first time, no retries:&lt;br/&gt;&lt;br/&gt;1. Incoming plain message with the chat closed: row grew the accent count badge &amp;#34;1&amp;#34;, name bold, time in the accent colour, preview brightened. Chats tab badge &amp;#34;1&amp;#34;.&lt;br/&gt;2. Long-press: &amp;#34;Mark as read&amp;#34; is the first item, above &amp;#34;Pin to top&amp;#34;, tick icon, enabled.&lt;br/&gt;3. Tapped it: badge gone, row weight back to its ordinary state, menu closed, still on the Chats list.&lt;br/&gt;4. Opened the chat: no &amp;#34;New messages&amp;#34; divider, the step-1 message reads as seen in the ordinary flow.&lt;br/&gt;5. Backed out; incoming message mentioning this account: badge read &amp;#34;@ 1&amp;#34; in pale yellow, distinct from the green count badge. One long-press plus Mark as read cleared it, chat stayed closed.&lt;br/&gt;6. No badge on the row: the item is still first and in the same place, greyed out; tapping it changed nothing and the menu stayed open.&lt;br/&gt;7. Sort menu → &amp;#34;Unread first&amp;#34;: with a read newer chat and an unread older one, the unread row moved above it. Mark as read on it cleared the badge and the row stayed where it was; after a relaunch it fell back to its activity-order place below the newer chat.&lt;br/&gt;&lt;br/&gt;Plus the smoke test: launch, create an identity and sign in, open a group, send a message — delivered with both ticks.&lt;br/&gt;&lt;br/&gt;Two notes for the record, neither a defect in this change. The staging debug APK cannot install over a release-signed build (INSTALL_FAILED_UPDATE_INCOMPATIBLE); the phone&amp;#39;s existing release install was removed with the owner&amp;#39;s approval to run this. And step 7&amp;#39;s &amp;#34;badge clears but the row stays put&amp;#34; behaves exactly as specified, though someone who has not read the Verify may read it as the list failing to re-sort.
    </content>
    <updated>2026-10-12T22:13:18Z</updated>
  </entry>

</feed>