Skip to content

Release: develop -> main - #246

Merged
TaprootFreak merged 2 commits into
mainfrom
develop
Sep 22, 2026
Merged

TaprootFreak merged 2 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 2 commits September 22, 2026 05:44
#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
TaprootFreak merged commit 981effa into main Sep 22, 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