Release: develop -> main - #246
Merged
Merged
Conversation
#242) * Bind funding status filters as Postgres text-array literals Bun SQL does not encode a JavaScript array for text[]. The funding transition sent that array, so Postgres rejected the apply. Bind one array literal instead, and run that statement against Postgres in CI. * Name the Postgres driver test in the project tree and CI list The driver test lived outside the documented tree, and the CI row still omitted it. * List the Postgres driver test with the other local checks The README says those commands are the gates CI runs. CI now runs test:postgres, so the list was missing that step. --------- Co-authored-by: TaprootFreakAI <315477232+TaprootFreakAI@users.noreply.github.com>
…nes (#226) * Let staff reject a moderator proposal and keep the history. Open proposals fan out in-app and Web Push to other staff and stay unread until confirm or reject. After reject the subject stays verified and can be proposed again; every propose and reject is an append-only trust_edge row. * Access unreadCount via index signature in the proposal push test. tsc noPropertyAccessFromIndexSignature failed CI on the inbox-unread payload assertion. * Name reject on the public trust-chain contract and on appoint notify. GET /trust-chain never projects moderator_reject, matching confirm. Appoint 200 also drops open-proposal notifications before notifying the subject. * Align the trust_edge schema header with the public graph. GET /trust-chain never projects confirm or reject; propose is public only after the subject is a moderator. * Reconcile concurrent propose, confirm, and reject, and project one incoming edge. After insert, keep the oldest open propose, undo confirm if a reject landed, and undo reject if confirm or appoint already closed the grant. The public graph uses the winning edge id so two rows of the same kind cannot both show. * 409 a lost concurrent propose and pass chain actors into the hop filter. After insert, 409 unless this row is still the oldest open propose, and delete the insert rather than the newest extra. The trust-chain hop loads sibling actors so a non-chain oldest contact does not hide a later displayable edge. * Tick the clock between reject and re-propose so same-ms ids cannot 409. The pending rule is latest propose/reject by createdAt then id. A frozen test clock made a second propose at the reject timestamp flaky. Also document reject on the trust route inventory and cover a proposed-notify no-op plus repeated debug reject. * Name reject on isStaffRole and pendingModeratorProposals handbook callers. Staff reject uses the same role guard and pending helper as propose/confirm. Propose push unreadCount uses the same conversation store as appointed notify. * Delete concurrent propose, confirm, and reject extras by edge id. TrustStore gains deleteEdgeById so a lost insert cannot remove the winning propose or an older history row. Propose also 409s if confirm or appoint landed, confirm undoes when the pending propose is no longer latest, and a winning propose refreshes staff proposal notifications. * Say propose purges moderator_proposal rows before staff notify. SPEC and trustRoutes now match the endpoint: propose, confirm, reject, and appoint delete those rows; only confirm and appoint then notify the subject. * Keep reject history when a newer propose reopens, and roll back a 503 insert. After reject, drop staff proposal rows only when pending is empty. A same-ms id loss undoes the reject. A failed re-list deletes the insert so a retry can succeed. * Roll back a confirm insert on re-list failure and keep same-ms re-propose. A 503 after confirm no longer leaves a unique confirm edge that would block reject. Reject treats a different pending propose as a reopen even when createdAt ties. * Drop proposal notifications on reject only when pending is empty. SPEC now matches the route: a newer propose that reopened the queue keeps the reject in history and leaves moderator_proposal rows. * Identify pending proposals by edge id and refresh notify after races. Confirm and reject compare the pending propose by id so a same-actor same-ms re-propose is a different row. After propose notify, re-list and drop or refresh moderator_proposal rows when that insert is no longer pending. * Confirm pending by propose id without the confirm row. After confirm insert, pendingModeratorProposals ignores that confirm so the original propose id can still match. Refresh notify loads the actor name. Reject re-lists before dropping proposal rows so a concurrent re-propose keeps the bell. * Re-list pending before and after a proposal refresh notify. A concurrent reject can empty the queue between seeing a newer propose and writing moderator_proposal rows. Fan-out only when that same edge id is still pending, and drop the rows if it is not after notify. * Confirm only the unique open propose and restore notify after reject clear. Two concurrent proposes must not confirm the newer extra that propose cleanup is about to delete. After reject drops proposal rows, re-list and fan out if a newer propose already reopened. Name reject on createApp. * Share proposal fan-out and re-list after notify on reject too. Reject after-clear uses the same best-effort helper as propose refresh: lookup and notify cannot roll back the reject, and a second re-list drops stale moderator_proposal rows if the queue closed during fan-out. * Drop reject notifications only after the reject row is kept. Clear and fan-out run after the persist try so a list throw cannot undo the reject. If pending id changes during fan-out, one extra round notifies the new propose instead of leaving the bell empty. * Drop proposal rows after a second pending-id change during fan-out. A third propose during the refresh round is treated as a close for notification purposes. CONCEPT marks the reject pending rule and the winning-edge public graph as superseding the 2026-09-17 rows. * Include deleteEdgeById on the throwing debug trust-store mock. * Format the CONCEPT decisions table after the develop rebase. * Clear proposal rows before a pending-id fan-out refresh. * Name confirm 409 as an older open propose and drop proposal rows on appoint. * Say proposal notification rows drop on confirm, empty reject, or appoint. * List post-insert 409s on propose, confirm, and reject error bullets. * Fan out the current pending actor when fan-out opens on a new id. * Call the confirm unique-open check the oldest open propose. * Align unreadCount wording and name proposal notify as staff fan-out. * Keep a won propose or reject when a later extra delete or re-list throws. * Refresh proposal rows onto the oldest open propose after a lost insert. * Clear proposal rows before fan-out after a lost concurrent propose. * Document 409 remaining-pending fan-out and align unreadCount in the status line. * Name reject on the moderator role row. The last rebase onto inbox-photo develop dropped that word from the capabilities table. --------- Co-authored-by: TaprootFreakAI <315477232+TaprootFreakAI@users.noreply.github.com>
TaprootFreak
approved these changes
Sep 22, 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)