Rebase fork onto upstream v1.6.8 (waves / on-chain / approval reconciliation) #33
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Tracking issue for the eventual rebase of this fork (based on upstream v1.6.1) onto upstream v1.6.8 — 7 releases ahead. Assessment done 2026-06-20.
Verdict
Well-positioned, not a fast-forward. The migration layer is clean by design; the work is a bounded manual merge of the purchase flow plus a one-time "adopt ticket waves" adaptation. Budget ~1 focused session.
Clean — carries over with zero/near-zero conflict
migrations.pyis byte-identical to both v1.6.1 and v1.6.8 → migration rebase is a no-op. (Keep this invariant.)extraJSON — no new DB columns. Ourmigrations_fork.pyreal columns (status,location,categories,nostr_event_id,nostr_event_created_at,payment_hash,user_id) are a separate namespace.nostr_*.py,transport_rpcs.py,nostr_sync.py,migrations_fork.py, tests.set_ticket_paidsurvives in v1.6.8 (same name/signature) and is already wave-aware — our per-event lock +publish_or_delete_nostr_event()graft re-applies cleanly;tasks.pyand the free-ticket path keep working.Overlap — manual reconciliation (8 files; effort in 2)
views_api.pyapi_ticket_createmodels.pyservices.pycrud.py__init__.pystatic/js/{index,display}.*Semantic adaptations to plan
selected_wave.price_per_ticket / .allow_fiat / .currency; our fork readsevent.price_per_ticket(top-level fields still exist). Mechanical remap, but every pricing read in our additions (fiat, multi-ticket, free tickets) must thread through wave selection. Free tickets resolve to a wave or use the event-level fallbackset_ticket_paidalready supports.status/proposed/approve. Re-insert ourevents.status+api_event_approve+ theapi_ticket_creategate by hand into upstream's rewritten file.Recommendations
views_api.pygap only widens with each upstream release; rebase sooner if we want waves/on-chain, else cherry-pick specific upstream fixes.Upstream re-check on 2026-09-06 while planning guest checkout (#36), for whoever runs this rebase:
mainis still v1.6.8; the big mover is the open PR #64 "v2.0.0" (+4204/−2203, last push 2026-08-30): basket checkout (/events/basket/{id}, one buyer email + optional name per basket, batched email per buyer, admin sale email, bulk resend), ticket types, per-eventextra.payment_methodswith per-method wallet selection, ticket deactivation, newmigrations.pycolumns (payment_method,fiat_provideron tickets), andtasks.pyremoved (listener moved). Not merged; reassess after it lands rather than rebasing onto v1.6.8 then again onto v2.make_qr_png+GET /api/v1/qr/{ticket_id}(without ticket-image compositing), the multipart text+HTML mailer (_deliver_ticket_notifications,NotificationDeliveryResult,TicketResendResult), andextra.payment_methodsusing v2's field name (effective_payment_methodshelper; empty list = legacy rule).settings.lnbits_baseurl, notticket_base_url(ours may point at the webapp); the nsec-DM Nostr path stays (upstream went NIP-05-only);_issue_free_tickets,frontend_url+ origin allow-list, pre-generated ticket ids andextra["checkout"]are fork-only and listed indocs/upstream-candidates.md.onchain_enabled/onchain_wallet_id/zeroconf/fasttrack); we will use native lnbits on-chain instead (separate issue), so drop those fields during the merge.Two notes for when this runs
1. Don't adopt upstream's SatsPay on-chain path. The assessment lists "On-chain/SatsPay is new upstream surface — decide whether to adopt" as an open question. Decided: we don't want SatsPay. On-chain goes through native lnbits on-chain instead — that's #41. So at rebase time, take upstream's on-chain surface as skipped, not merged, and keep the divergence noted in
docs/upstream-candidates.md.2. #34 should land after this, not before. #34 (the
amount_ticketsconflation) lives inapi_ticket_createand the publisher — the same hunk this rebase rewrites, and the one the assessment calls "the hard one". Fixing it first means writing it twice and taking the conflict in code we'd just touched. The upstream review on #34 also shows waves change the shape of the fix:amount_ticketsbecomes a per-wave value rolled up bysum(wave.amount_tickets for wave in ticket_waves), so thecapacitycolumn proposed there should be re-decided against the wave model rather than designed against v1.6.1.What does not need to wait: #51 and #35, both of which live in
nostr_*.pyandmigrations_fork.py— the files this assessment lists as net-new fork surface with zero conflict. Worth doing #51 before the rebase specifically, since a rebase is exactly the kind of change that could break signer or publisher wiring silently, and right now that failure mode leaves no log line at all.Re-measured 2026-09-27 — supersedes the June assessment
The June numbers are three months stale (promo codes, guest checkout, free tickets, the whole nostr publish chain and #59 have landed since). Re-ran the analysis against current
mainandupstream/main.Merge base is still
4bf867e= v1.6.1. Divergence: 8 commits upstream, 68 on the fork. Upstream squashes PRs, so "7 releases ahead" is a much smaller delta than it sounds.The invariant holds
Worth re-checking at merge time, but as of now the fork-migrations discipline has paid off exactly as intended.
Upstream's 8 commits are three separable features
777c1078c1538f35c20ede0ea0e3da16b2099b43fff745370891eaf1f745370belongs to B, which June couldn't have known — it's titled "fix: issue when calling internal webhook from extern" but touches nothing except the satspay-webhook URL. It's also whatv1.6.8points at.Skipping SatsPay nearly halves the hard file
Current conflict surface — 10 files
Plus 9 upstream-only files to take wholesale (i18n, register/ticket JS, routes.json, ticket.jpg) and 30 fork-only files with zero conflict — every
nostr_*,transport_rpcs.py,promo.py,qr.py,migrations_fork.py, all tests, fonts, docs.Correcting one line of the June plan
Not minimal. The fork put +381/+345 into
index.js/index.vue, and it's a nameable feature set that has to survive: the approval workflow (status/proposed/approved/approveEvent/rejectEvent), promo-code management, fiat provider config, and location/categories. Budget this as the second hard file, not a footnote.Recommended strategy: merge, then remove — not cherry-pick
Take all of
v1.6.8as a single merge, then delete the SatsPay surface in its own follow-up commit. Rather than cherry-picking A and C while skipping B, because:display.js/display.vue/index.jsin regions B already modified. Cherry-picking around B means hand-resolving textual gaps that git would otherwise handle.Target the
v1.6.8tag, notupstream/main. Main is one commit further (translations) withconfig.jsonalready declaring1.6.9— an unreleased state. Taking the tag keeps our scheme honest: we becomev1.6.8-aio.1. Translations can ride the next rebase, or be cherry-picked separately afterwards if wanted sooner.Note the irony to document:
v1.6.8isf745370, a SatsPay commit. So "merge v1.6.8, then remove SatsPay" is precisely the shape of the work, and the no-SatsPay deviation wants a row indocs/upstream-candidates.md.Suggested commit sequence
merge upstream v1.6.8— resolve the 10 files, nothing elseremove SatsPay on-chain surface— explicit, with #41 referencedadapt pricing to ticket waves— thread wave selection through the fork's additions (fiat, multi-ticket, free tickets, promo pricing)re-apply approval workflow to the rewritten admin UIchore(release): v1.6.8-aio.1— separately, after testingSteps 3 and 4 are where the real thinking is. 1 and 2 are mechanical.
Prerequisite worth settling first
#34's remaining half (capacity always required, dropping
0 = unlimited, the organizer-form trap) was parked for this rebase because waves change the shape of it. It should be decided as part of step 3, not deferred again — under waves,amount_ticketsbecomessum(wave.amount_tickets), so "capacity" stops being a single event-level number at all.