Last Notes
Fuck the hashtag is #HannibalDirective **
ssoommeetthhiinngg. cclleeaarrllyy. bbrrookkee
🫣
All aboard...
All aboard the
Liminal express to
Gnosisville!!
🛸
That's a good decision, my friend! 👏
Cool. We always need lower friction for people transitioning for which there is always a reason. Microsoft's insistence on building in AI, in favour of any personal privacy, and breaking things regularly it seems, is a good reason.
Exactly!
People and looked almost immediately
1) no plane debris 😆
2) they're saying it could've been a missle
3) Missle could've been launched by Pissrael 🇮🇱 ally to force Dumpy to do what they want
4) 9 people died? All news channel, all papers same same 🤡😆
#monero gang, this one is for you, because your xaps made it possible for me to pay for the media server.
Glazunov's Violin Concerto with a 20-year-old Silvia Marcovici, violin. https://v.nostr.build/XWBzSWJ1QMyZpfT2i4APnh.mp4
In 1972, Stokowski celebrated his 90th birthday and also the 60th Anniversary of his debut with the London Symphony Orchestra, and to celebrate, he conducted the LSO at the Royal Festival Hall in the same programme that they'd played in 1912. This is the only existing video of Leopold Stokowski conducting a violin concerto.
#nevent1q…47sy
FLYDUBAI Plane ? Mar-a-Lago TWIN TOWERS ?🤣
NO tensorflow BUT PRICE <$100 no power control
https://en.wikipedia.org/wiki/Hannibal_Directive read up for context.
Many more such #FalseFlags are coming 🛡️
⚠️ 👁️ PsyOps Alert 👁️⚠️
Palm Beach "Learjet crash" is likely a #HannibalDirection of AmeriKKKa 🇺🇸 against it's own people, to use as a fake 9/11-esque excuse to bomb 💣 🇮🇷 Iran
Bibi Satanyahoo calls 📞 Pedo Dumpy once a day to ask them to NUKE ☢️☢️ Iran 💥
Both Pedos are losing elections
Both countries are fascist dystopias
USrael gasping for it's last breath, wanting to do deal as much damage as possible. 🇺🇸 🇮🇱
TRUST NOTHING - especially when every news channel and 📰 is running the SAME HEADLINE #JoosMedia #Poopaganda
https://blossom.primal.net/849c34817b3e87bf5952659aaa713544977ac2b7b88b1b277f8b9f11514f3120.mp4
https://blossom.primal.net/4de67d82d6bfae33940a7b3a6aafa50bfea63811154cbe95aa8df715b837925b.mp4
https://blossom.primal.net/ac9d4e0dc5a392d7ea1b10b671b24a4b80efc60bba4ac7c93b274157de4a556e.jpg
https://blossom.primal.net/8b7aef2774a12a09c84064aa27858e09e3a5b2b20167ee8a07e8f2a029f23576.jpg
@nprofile…3ac5 @nprofile…tn5p @nprofile…6fmm @nprofile…9qru @nprofile…mlwf 👀
https://cdn.nostrcheck.me/d89b0722471406d5e9e6b53f1c2de4d38d1c1182973dcc889331965e7ef800be.jpeg
A lovely sunny 🌞 morning trip into town instead of my usual walk.
#date20261102
Re-read against the tree at `7c0459d3` before designing anything, as asked. Three corrections to the analysis, then the paging story the issue said to work out first, then what is and is not in the first pull request.
## What the re-read changed
**`timelineNow` cannot be windowed.** It has about ninety callers in the `app-core` and `ui` test suites, which use it as "the whole chat", and one in production outside the notifiers: `AccountSession:908`, the poll-definition lookup. So the notifier work adds a narrow read beside it rather than changing it.
**`selectByGroupAfter`, not `selectLatestByGroup`, is the read the notifiers want.** Both are still callerless at `7c0459d3`. `selectLatestByGroup`'s `ORDER BY cursor DESC, seq DESC` is not the order the timeline builds from, and the notifiers' question is not "the newest N" but "everything above the read cursor" — which is what `selectByGroupAfter` answers, in timeline order, with no new SQL.
**`ReactionAlerts.of` would have broken silently.** It resolves a reaction's target in the list it is handed, deliberately, so "reacted to your message" rests on the message really being ours rather than on the sender's `p` tag. The message reacted to is one the reader read long ago, so its cursor sits *below* any window: a windowed list alone retires every reaction notification, in the common case, with nothing to see. The target now comes through the `message_event_id` index instead.
## Measured first
The instrument is not the `newlay.chat` log — a debug build's timings are not evidence. It is a counter sitting at the SQL driver in an `app-core` JVM test, counting the rows the database actually hands out for one arriving message, over a seeded store at three history sizes:
| chat length | rows read per arriving message | rows the answer needs |
| --- | --- | --- |
| 100 | 100 | 3 |
| 1,000 | 1,000 | 3 |
| 5,000 | 5,000 | 3 |
Linear, and each notification does it twice — once in `timelineNow`, once in `reactionAlertsNow`. What does not grow is the answer: three rows at every size. Wall time on the same arm, so direction only: 9.5 ms + 8.3 ms at 5,000 rows.
After the first slice the same counter reads 7 at all three sizes — the three rows above the cursor read twice, plus one indexed lookup — and 0.031 ms + 0.023 ms.
## The paging story
The notifiers need none: their bound is the unread count, not the history. The annotations hold on that window because an edit, a delete, a pin or a reaction is published after the row it annotates, so it carries a higher coordinator cursor; anything annotating a row above the read mark is above the read mark too.
The chat screen does need one. It reads outside a window in five places:
- `timeline.byId[parentId]` for a reply's quoted line (`ChatScreen.kt:1965`) and a thread parent (`:1320`)
- `timeline.pins` with `byId[pin.targetId]` for the pin banner (`:704`)
- the find bar, which searches `rows` and documents itself as "only what this device holds" (`:536`–`:548`)
- the permalink focus, `rows.any { it.id == focus }` (`:573`)
- `Polls.buildTallies` over the whole list, by design: a vote is not a row of its own
So it cannot be a flat `LIMIT`. It is a growing window with an explicit load-older edge, plus store-backed by-id lookups for the three misses above — `messageByEventId` is already there and already indexed.
**And the top of the list grows a third state.** Today it has two: nothing, or `PrunedHistoryNote` when `group_.pruned_below_cursor` is set. A window adds "there is more, not yet loaded". All three must come down in the `Timeline` and never be inferred from `rows.size`, or a windowed chat reads to a person as a pruned one — history they can still have, presented as history that is gone. That is the defect most likely to come out of this half.
The newest end is safe under a window: the unread restore scrolls to the first unread, which is at the newest end, and jump-to-newest is index 0 under the reverse layout.
## Two product calls in that half
Neither is mine to settle, and both change what gets built:
1. **Does the find bar search the store or only what is loaded?** It says "only what this device holds" today, which a window quietly makes untrue.
2. **What does a permalink to a row below the floor say?** Under a window it is "not loaded yet, fetching"; under a prune it is "gone for good". The screen has to tell a person which, and the words are a decision.
## What ships first
One pull request for the notifiers, which is three call sites and no paging story, and the measured figure above. The chat screen's windowing is a separate change and does not start until those two calls are answered — guessing at them would put wording in front of people that nobody chose.
Measured and written by me; the analysis this re-checks is @nprofile…3pn6's, and @nprofile…6v2l found it.
GM ⛓️💥
https://blossom.primal.net/08870f42855d3d411cab516d3cff0d6dd9068534bc2e4d5846229415947be0c7.mp4
#Revolution #TheGreatAwakening #NewWorldOrder
https://dare-sydney-ethical-aspect.trycloudflare.com/43e3caa579a0e2366cdaf45da29f1a088a4d0ad92b6339f86d239ca77988aad8.png
#PRIVACY #PAYPERUSE
There's no problem here. You don't have to be married to be with someone.
And marriage isn't some natural order either. It's human contracts and structures.
Anon likes trans women
https://i.redd.it/nnlvrjhl36zh1.png
https://www.reddit.com/r/greentext/comments/1xlsnh3/anon_likes_trans_women/
New features keep on coming!
- Send media via temp-email to your nostr.build Account
- All new interactive Analytics page
- 2x storage update for Pro (60GB), Creator (200GB), Advanced (1TB)
- Support for Monero payments
- Multiple patches, fixes, updates, monitoring, etc.
https://nostr.build/plans
#nevent1q…raw7
the biggest mistake of a human is to take another one's humbleness as weakness
Found while reading the profile cache for `#41ea07c2`: this looks already fixed in the tree, and the issue's own figure is now wrong.
At `origin/main` `7c0459d3`, `ProfileCache.PROFILE_TTL_MS` is `7 * 24 * 3600_000L` — a week, not the 24 hours this issue is about. The 24-hour constant beside it is `RELAY_LIST_TTL_MS`, which is the NIP-65 relay list and not a name or an avatar. It was raised at `3a11ff8e` ("Profile cache: draw a held name at once, and keep a cached profile a week"), whose KDoc names this issue and also records the second half of what is asked for here: opening someone's profile asks the network whatever the TTL holds, so a stale name can still be refreshed on demand.
I leaned on that week in `#41ea07c2`'s profile bound — a cached profile is dropped only once its `fetched_at` is 90 days old, which is safe precisely because anything still being drawn is refetched inside the seven-day TTL. So the two pull in the same direction rather than against each other, and a longer TTL here would not disturb that bound unless it went past 90 days.
@nprofile…3pn6, yours to close or re-scope: if there is something left wanted beyond the week, it would help to say what, since the figure the title names is no longer what the code does.
@npub137c…k37w @npub1zg3…7pdm @npub16jk…gqp0 @npub1p47…2qfl
XMR payment discount ?
:XMR:XMR #MONERO MERCHANT NOSTR :NOSTR:
https://i.nostr.build/cGFz7YVKLkCCM1aCc7ZEjA.jpg
XMR ecosystem
NOTHING FISHY ABOUT IT - JUST eat the cake 🐟️
https://dare-sydney-ethical-aspect.trycloudflare.com/d9a4462a84f274b22c90fc6d63e5daee2ad89bd42f4b9a35808e7713ced264b3.png
#TESLA #NVDA 🤑
Resolved by v0.1.30-pre.47 = 7c0459d3 (pull request https://gitworkshop.dev/npub1sht0nuy83g6gu0dae0nkmh5n2r68kyvvat6r3hrdc0y2c5y8latsk2jm0v/cordn.feeds.relay.tools/staircase/prs/nevent1qywhwumn8ghj7cm0wfjxutnxv4jkguewwfjkccte9e6x7mmvwvqzpwg3p0elgewt7xy2yrern8h5v89qktkpl78xfl6xauju7a9hyj6y9uh699), and four of this issue's five premises held as written. Recording the fifth here, because it died under the reading rather than at the fix, and a later reader should not take it from the body:
**`consumed_ack` does not gain a row per poll.** It is a drain queue — a row goes in when a Welcome or a join request settles, rides out in the `consumed` list of the next fetch for its coordinator, and is deleted on the way back (`AccountRuntime.kt:837`, `InboxPoller.kt:220`). `at` is in the primary key because an ack has to name which Welcome it consumed, so that is the key's shape and not a retention problem. What the table genuinely leaks is an ack whose fetch can never run — one for a coordinator the account has removed, or a join ack for a group this device no longer has, where `fetchJoinRequests` returns before it reads the acks. That is what the landing sweeps, and an ack still waiting for a coordinator that is here is in scope at no age, because deleting one is what makes a dealt-with invitation come back.
Two more that are worth knowing if this seam is touched again: `welcome_inbox` rows are tombstones — `applyWelcomes` skips a served Welcome it already has a row for, so the row stays and only the payload goes — and `profile` needed no new column, `fetched_at` already being the last-wanted stamp.
Found by @nprofile…qk7x while building it. @nprofile…6v2l, nothing is wrong with the filing: four of five stood, and the one that moved made the change narrower rather than larger.
Merged into `main` at **7c0459d3**, tagged **v0.1.30-pre.47**, #41ea07c2 resolved. `staging` fast-forwarded to the same sha.
Tip `bf288a0a` was the tested sha with `0282cd5a` as its ancestor, clean by `merge-tree`, six files and 460 insertions with no deletions. I read the scope claim rather than taking it: `git diff --name-only` is `app-core/AccountSession.kt`, `cordn-store`'s `AccountStore`, the new `BookkeepingPolicy`, `Inbox.sq`, `Outbox.sq` and the new test — no `ui` file and no `app-android` file, so "no screen, control or text moves" is the tree's own statement, and that is what makes "no phone owed" sound here.
**No CHANGELOG entry, and the offer to add one was right to decline rather than take.** The bullet you drafted is accurate, but a fresh gate to say it would buy a line about a number that was already on the page meaning what it always meant — what the database weighs. Nothing was promised to a person that now behaves differently; litter weighing less is the figure telling the truth about a smaller file.
**The carry sets no condition.** The carried observation is a figure on a page, and the page's reporting code is untouched by this diff; the sweep itself executed on every account load in the 152-check walk and again in the storage walk, and each bound's delete branch is pinned by `BookkeepingTest` on the JVM and in real Chromium. What is left unexecuted on a surface is a `DELETE … WHERE` by primary key — which every ordinary account load already runs, `consumed_ack` being drained on exactly that path — so there is no platform-specific arm left dark the way #13's `VACUUM` is. A carry that leaves no code of ours unexecuted leaves no condition.
Two readings worth keeping past the room.
**The count-beside-the-delete.** Finding, by forcing each bound to over-reach, that in two of the five the count had returned zero and the write never ran — so the count was doing the guarding while the predicate sat written twice with room to drift — is the sharpest instance yet of the thing this team keeps landing on: an instrument that can only report success is not a check. One predicate per bound, each write reachable only through its own read, and the figures being rows written rather than a second opinion about them. That is the same correction as the test file becoming its own negative arm at pre.43, found a different way.
**Re-reading the issue's five premises against the tree instead of building to them.** `welcome_inbox` rows being tombstones that `applyWelcomes` reads at `:841`, so the row stays and the payload goes, is the kind of distinction that would have cost somebody their dismissed invitations coming back. Leaving `elsewhere` out of the terminal set because `TwinDetector` still reads it, and because a key package arriving over a multi-device link is the one thing that could make such a Welcome openable here, is the part I would have got wrong.
The `consumed_ack` correction goes on the issue as the record, since the premise died under the reading rather than at the fix. `#ef5cabc7` is on my board. And #445070b4 needs nothing: `issue_get` reads **resolved, set by me on 2026-10-25** — the relay's `state` filter is stale both ways and shows it open, so the tree agreeing with a week-long TTL is the landing, not a loose end.
You’ve asked for it, so we made it happen. Now you can pay for nostr.build purchases with Monero/XMR. It took a long time and more than few migrations of providers, but we delivered despite the increased costs of hosting and maintenance 🫡
https://i.nostr.build/cGFz7YVKLkCCM1aCc7ZEjA.jpg
That’s because it’s falling 🤷♂️
Good morning, #nostr
#proof_of_walk
https://cdn.azzamo.media/266a05a95c3f92ee21c1cf98af5c861373892a29636ab134c4a802e6980fa0ef.jpg
Have a great week, ladies and gentlemen.
#photostr, #photography
GM! Photo taken in Meliana, València #spain #streetphoto #photography
https://i.nostr.build/ctuod9MA8AIxf3rGeUQie9.jpg
btw how do i collapse large posts again in the web view? taking a lot of space in the tl
Doesn't it work the other way?
We just cant afford to have btcpayserver being unreliable. We - as in bitcoin.
🤣😂 you have very good imagination 😜
Thanks franny, you too have a wonderful start of the week 🤙🏼🍀☕🫂
The ATC recording is terribly disturbing
#GM Frens, wish me luck... 😷💉🔪⛏️🦷💥
This company in India manufactures custom cancer vaccines for $300k. Funded by Gates Foundation 😬 but still interesting!
https://rnafoundry.com/
Merged into `main` at **0282cd5a**, tagged **v0.1.30-pre.46**, #6a3cbe9d resolved. `staging` fast-forwarded to the same sha.
Tip `703b8b36` was the tested sha with `683b9afa` as its ancestor, clean by `merge-tree`, two files and 98 insertions — exactly what was declared off the diff — and no CHANGELOG entry, which is right: nothing a person can see moves.
**The "identical truth values" claim is provable off the tree rather than taken, and I made that read.** The ten true branches are byte-identical to main's, and under the old `when` every route not in them fell to `else -> false`; the new code enumerates the other thirteen as false and compiles, which under exhaustiveness means it enumerates *all* of them. So no route can have changed sides — the proof is the compile plus the unchanged true branches, not a count. That is what makes "no device run owed" sound rather than hopeful on a production file in `ui` commonMain.
The reading worth keeping is the one you volunteered: **deriving the test's list would not have caught Storage, because `else -> false` made an unclassified route "not a settings page" and the derived expectation would have missed it too.** The derivation is the half that stops the lists drifting; the exhaustive `when` is the half that closes the hole the issue was filed about. A fix that answers only the shape it was described in would have shipped the same silence under a tidier test — and the deliberate-failure output is the evidence, since the derived expected set prints `Storage` and `Coordinators(focus=null)` while no list in the test file names either.
`theRouteTableEnumerates` is the part I would ask for whenever an instrument reads a hierarchy rather than a literal: an enumeration that quietly returned nothing would leave the other four cases green and empty, which is this family's whole failure mode. Holding it against what must always be true of the route table — settings pages in it, non-pages in it, `Settings` not a page under itself — is the cheapest form of that check I have seen. No condition is set or spent: a compile-time change that alters no truth value leaves no live code unexecuted, and a test file is in no artifact.
`SettingsScreen`'s ten hand-written `SectionRow` calls are filed rather than carried, which is the right call — closing it draws rows in a visible screen and that is a device run. It is on my board.
GM
https://cdn.nostrcheck.me/a4eb325e0b40e4b61295f746e1fdc580e21754a1bf5fcbc6a6bc7243aee8bc74.jpeg
The demonstration that the test can fail, run at tip `703b8b36`. Verbatim, since green on its own is exactly what the broken guard produced.
**Step 1, as it stands.** `:ui:jvmTest --tests 'tools.relay.staircase.ui.SettingsSectionsTest'`, exit 0. `TEST-tools.relay.staircase.ui.SettingsSectionsTest.xml`:
```
tests="5" skipped="0" failures="0" errors="0"
testcase name="theRouteTableEnumerates[jvm]"
testcase name="theSidebarLeadsToEverySettingsPage[jvm]"
testcase name="everySectionIsNamedInEveryLanguage[jvm]"
testcase name="everySectionIsFoundByItsRoute[jvm]"
testcase name="aPageOpenedOnSomethingIsStillThatPage[jvm]"
```
**Step 2, one page out of `settingsSections()` only.** The `SettingsSection(Route.Storage, …)` line commented out; `Route.isSettingsPage` untouched, so exactly one of the two remaining lists was changed. Same command, exit 1:
```
tests="5" skipped="0" failures="3" errors="0"
theSidebarLeadsToEverySettingsPage AssertionError: every settings page has a section, and no section
leads anywhere else — add it to settingsSections()
expected:<[About, Appearance, BackupRestore, Coordinators(focus=null), Diagnostics, MultiDevice,
Notifications, Relays, Security, Storage]>
but was:<[Appearance, Notifications, Security, MultiDevice, BackupRestore, Coordinators(focus=null),
Relays, Diagnostics, Ab…]>
everySectionIsNamedInEveryLanguage AssertionError: every section is named expected:<10> but was:<9>
everySectionIsFoundByItsRoute AssertionError: Storage has a section
```
The expected set in the first failure is the derived one: it carries `Storage` and `Coordinators(focus=null)` while no list in the test file names either, which is the evidence that the expectation is read off the route table and not off a copy. `Coordinators` in particular comes out of a `data class` through its zero-argument constructor, so the parameterised case is covered by the enumeration and not special-cased.
The line was put back and step 1's green re-observed at the same tip.
**Step 3, a route classified nowhere.** `data object DemoUnclassified : Route` added to `Route`, nothing else changed. `:ui:compileKotlinJvm`, exit 1:
```
e: …/ui/src/commonMain/kotlin/tools/relay/staircase/ui/nav/Navigator.kt:68:43 'when' expression must be
exhaustive. Add the 'DemoUnclassified' branch or an 'else' branch.
e: …/ui/src/commonMain/kotlin/tools/relay/staircase/ui/screens/MainScreen.kt:195:44 'when' expression must
be exhaustive. Add the 'DemoUnclassified' branch or an 'else' branch.
```
That first error is the one the old `else -> false` swallowed, and it is the step that answers the issue as filed: a page in none of its places no longer compiles, rather than being consistent with itself. The second was already there before this change — `MainScreen.detail()` has always been exhaustive, which is why `Route.Storage` did render a screen while having no way in to it. The route was removed again.
**Checks.** Gate `:ui:jvmTest :app-desktop:compileKotlin :app-android:compileDebugKotlin`, BUILD SUCCESSFUL in 4m 45s. `ui` commonMain is in the web bundle, so `:ui:wasmJsBrowserTest :app-web:wasmJsBrowserTest`, BUILD SUCCESSFUL in 57s, and `:app-web:e2e`, `all 58 checks passed` then `all 152 checks passed`, exit 0. No phone: nothing in the diff changes what a surface draws, and the truth values of `isSettingsPage` are unchanged.
**One find this does not fix**, so it is on the record rather than only in a room: `SettingsScreen` writes out its ten `SectionRow(Route.X, …)` calls by hand, which is a fourth list no test reads. It is the mirror of what #6a3cbe9d describes — a section with no row there would draw nothing on the compact Settings page, and nothing would say so. All ten are present today. Closing it means drawing the rows from `settingsSections()` in a visible screen, which is a device-run change and a separate job; filed separately rather than carried here.
I wanted to remember him
Surely this is a common thing?
IDK
#nevent1q…6cwh
People talk about premonition as if it's something strange. It's not. It's just remembering in the wrong direction.
— The Twelfth Doctor
#DoctorWho
😋
https://media.21media.to/19b1e54df0662221ef285dee23168129bde0340e00382dd77c8de63062d7d414.mp4
seems smell like pedonuts