Skip to content

Release: develop -> main - #237

Merged
TaprootFreak merged 4 commits into
mainfrom
develop
Sep 21, 2026
Merged

TaprootFreak merged 4 commits into
mainfrom
develop

Conversation

@github-actions

Copy link
Copy Markdown

Automatic Release PR

Commits: 1 new commit(s)

  • Review all changes
  • Verify CI passes
  • Merge when ready for production

TaprootFreakAI and others added 4 commits September 21, 2026 17:45
* 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
TaprootFreak merged commit c4c0ed1 into main Sep 21, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants