Release: develop -> main - #237
Merged
Merged
Conversation
* Gate daily gifts on a moderator funding grant Daily spend pings and invoice issue now require an admitted or same-UTC-day trial grant. Members apply; staff review posts and trial, admit, or reject. * Use roleAtLeast for funding apply and document the grant fields Caller permission on apply is the verified minimum, not a role equality test. Passkey finish and conversation ping handbook now mention funding. * Name only the minimum role in funding staff docs Staff ACL is roleAtLeast moderator. Handbook and SPEC now match GET /trust/proposals instead of listing founder and moderator as equals. * Document funding_grant and GET /invoices/eligible in the env table DATABASE_URL now lists funding_grant / PostgresFundingStore /funding alongside trust. SPEND_API_TOKEN names the eligible lookup with passkey and posted. * Name funding routes in the HTTP inventory and E2E exception list The Implemented HTTP surface table now lists the grant endpoints and GET /invoices/eligible. The E2E exception list names PostgresFundingStore. * Keep spend invoice lookup from overwriting a concurrent admit GET /invoices/eligible, POST /invoices, and spend pings read the grant without persisting. Lazy trial expiry uses a compare-and-set update. * Separate eligible lookup 200 from the invoice 403 grant gate GET /invoices/eligible returns 200 with eligible false. Only POST /invoices returns 403 Funding grant required. Proof does not re-check the grant. * Format boot-stores after keeping api_log and funding_grant * Wire stipend invoice tests to the funding eligibility helpers GET /invoices/eligible and expired-trial persist checks need the same createApp helper and InMemoryFundingStore as the rest of the file. * Default invoice tests to an admitted verified grant Stipend issue paths run after the funding gate, so the shared passkey seed is verified and createApp injects an admitted grant unless a test passes its own fundingStore. * Reach the forum-post and groupMessageId invoice gates past the grant check * Format invoice test helpers after Prettier wrap * Name fundingStore on invoice, createApp, boot, and env docs * Document the funding-grant 403 on POST /invoices * Restore handbook bullets after the goalSats rebase * Name the grant on POST /invoices and openBootStores * CAS funding apply and staff decisions so concurrent writes cannot clobber * Stub transition on funding route store doubles * Cover CAS-miss 409s on apply, trial, and reject * CAS in-memory trial expiry the same way as Postgres * Cover in-memory expire when the grant row is gone * Name fundingStore on createApp and unglue messagesRoutes bullets --------- Co-authored-by: TaprootFreakAI <315477232+TaprootFreakAI@users.noreply.github.com>
* Page GET /conversations/:id from the newest messages The first page is the newest limit rows (default 200), oldest-first inside the page. Older history uses an exclusive keyset cursor. listMessages stays oldest-first for workers. * Format the conversation thread-page tests Prettier --check failed on the new listThreadPage fixtures. --------- Co-authored-by: TaprootFreakAI <315477232+TaprootFreakAI@users.noreply.github.com>
* Filter GET /messages by an optional hashtag token Optional ?hashtag= keeps keyset pages on notes whose text contains that token, so a shops page is shops rather than mixed living-room notes. Invalid names return 400. * Keep the hashtag listFeed query after the funding-grant handbook rebase The messagesRoutes Purpose keeps develop's eligibleToday spend ping and documents optional GET /messages?hashtag=. --------- Co-authored-by: TaprootFreakAI <315477232+TaprootFreakAI@users.noreply.github.com>
* Allow JPEG/PNG/WebP photos on moderator-group messages Staff can attach up to 10 stills on the closed Moderators thread, including photo-only posts. Direct, Contact, and Damus stay text-only. Bytes are private (Bearer plus canAccess) and are never published to Nostr. * Keep conversation photos private and document the photo API Override forum photo cache headers to private, no-store so stills are not CDN-cached. Cover Direct/Contact/Damus photo rejection, skipped Nostr on photo posts, and video-only bodies. Handbook, SPEC, and CONTRIBUTING now list the photo columns, routes, and photos-wins-over-photo precedence. * Document private conversation photo GETs in SPEC and FLOWS Add Bearer photo-0 and extra-still contracts, the POST 400 catalog, the conversations.ts tree comment, and the extra-still GET in FLOWS. * Reject a video field on conversation message POST A video key next to text or photo was stripped and stored as 200. Treat video as never so mixed bodies stay 400 without persist. * Document appendMessage throws for extra-photo preconditions * Name hasPhoto and photoCount on conversation public JSON * Bind conversation photos after actor columns in Postgres append * Format SPEC.md after placing conversation photo GET rows * Bind conversation photos after giftFor in Postgres append * Count conversation schema statements after giftFor and extra photos * Keep the SPEC Auth-column note outside the HTTP table * Include hasPhoto and photoCount on the stipend JSON example * Spell out that a photo-only group post still needs a still * Format SPEC.md after the funding-grant rebase * Require an admitted funding grant on the photo-only spend ping * Name conversation photo callers on decodeForumPhoto and forumPhotoResponse * Cover omitted photoCount on in-memory conversation seed rows --------- Co-authored-by: TaprootFreakAI <315477232+TaprootFreakAI@users.noreply.github.com>
TaprootFreak
approved these changes
Sep 21, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Automatic Release PR
Commits: 1 new commit(s)