Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
500 commits
Select commit Hold shift + click to select a range
be4b892
docs(listener): track final release blockers
nicoechaniz Aug 12, 2026
7cc3589
Merge pull request #326 from AlterMundi/docs/listener-launch-context-…
nicoechaniz Aug 12, 2026
c4c67ce
fix(build): self-host application fonts
nicoechaniz Aug 12, 2026
7006656
Merge pull request #329 from AlterMundi/fix/listener-hermetic-fonts
nicoechaniz Aug 12, 2026
4d411ad
fix(listener): recover stalled media clock
nicoechaniz Aug 12, 2026
4ac408f
Merge pull request #330 from AlterMundi/fix/listener-audio-silence-di…
nicoechaniz Aug 12, 2026
a71e02b
docs(listener): reconcile commercial launch checkpoint
nicoechaniz Aug 12, 2026
78ede81
Merge pull request #331 from AlterMundi/codex/listener-launch-closure
nicoechaniz Aug 12, 2026
9e0c57d
docs(listener): record launch-now checkpoint
nicoechaniz Aug 12, 2026
3bb2b81
Merge pull request #332 from AlterMundi/docs/listener-launch-final-co…
nicoechaniz Aug 12, 2026
aac6c5c
docs(listener): reconcile payment processor truth
nicoechaniz Aug 12, 2026
c2748fa
Merge pull request #333 from AlterMundi/docs/listener-processing-truth
nicoechaniz Aug 12, 2026
9acfb1a
docs(listener): record Live preflight checkpoint
nicoechaniz Aug 12, 2026
6e571d8
Merge pull request #334 from AlterMundi/docs/listener-launch-memory-2…
nicoechaniz Aug 12, 2026
465b5e6
docs(listener): record hardened Live authority deploy
nicoechaniz Aug 12, 2026
394e9ad
Merge pull request #336 from AlterMundi/docs/listener-live-deploy-b10…
nicoechaniz Aug 12, 2026
f434124
docs(listener): close Google OAuth rotation gate
nicoechaniz Aug 12, 2026
cd6674b
Merge pull request #337 from AlterMundi/docs/listener-google-rotation…
nicoechaniz Aug 12, 2026
5d9af3d
docs(listener): enforce post-live rollback floor
nicoechaniz Aug 13, 2026
628689e
Merge pull request #338 from AlterMundi/docs/listener-live-rollback-p1
nicoechaniz Aug 13, 2026
127563c
feat(listener): add private live checkout workbench
nicoechaniz Aug 13, 2026
c3bdeef
fix(listener): pin private workbench runtime
nicoechaniz Aug 13, 2026
ba675aa
fix(listener): fail closed on workbench launch
nicoechaniz Aug 13, 2026
27756c3
Merge pull request #339 from AlterMundi/codex/listener-private-live-w…
nicoechaniz Aug 13, 2026
3913e62
feat(listener): add public consumer withdrawal flow
nicoechaniz Aug 13, 2026
4d31f3b
fix(listener): harden consumer request operations
nicoechaniz Aug 13, 2026
f015759
fix(listener): preserve withdrawal ops across rollback
nicoechaniz Aug 13, 2026
259653c
fix(listener): require independent operator provenance
nicoechaniz Aug 13, 2026
d6b6043
fix(listener): await withdrawal operator health
nicoechaniz Aug 13, 2026
0a47571
Merge pull request #340 from AlterMundi/feat/listener-withdrawal-request
nicoechaniz Aug 13, 2026
c8c75da
docs(listener): record consumer request runtime
nicoechaniz Aug 13, 2026
a7ff7cc
Merge pull request #341 from AlterMundi/docs/listener-consumer-runtim…
nicoechaniz Aug 13, 2026
0a0512e
feat(listener): identify initial merchant in terms
nicoechaniz Aug 13, 2026
acc90ba
Merge pull request #342 from AlterMundi/feat/listener-merchant-identity
nicoechaniz Aug 13, 2026
371c175
docs(listener): record merchant-copy runtime
nicoechaniz Aug 13, 2026
f056639
Merge pull request #343 from AlterMundi/docs/listener-merchant-runtim…
nicoechaniz Aug 13, 2026
3f0ba8a
fix(listener): alert only on enabled test sales
nicoechaniz Aug 15, 2026
c542080
Merge pull request #344 from AlterMundi/fix/listener-provider-alert-e…
nicoechaniz Aug 15, 2026
660de29
fix(deps): update nanoid advisory floor
nicoechaniz Aug 15, 2026
2e71ebe
Merge pull request #345 from AlterMundi/fix/listener-nanoid-3-3-18
nicoechaniz Aug 15, 2026
0118ddf
docs(listener): reconcile Live launch checkpoint
nicoechaniz Aug 15, 2026
59a0e1f
Merge pull request #346 from AlterMundi/docs/listener-launch-reconcil…
nicoechaniz Aug 15, 2026
6bc862b
docs(listener): record dormant Live workbench
nicoechaniz Aug 15, 2026
69177e6
Merge pull request #347 from AlterMundi/docs/listener-workbench-dormant
nicoechaniz Aug 15, 2026
c6d3478
fix(listener): keep legal actions clear on mobile
nicoechaniz Aug 15, 2026
5d1073f
Merge pull request #348 from AlterMundi/fix/listener-mobile-legal-act…
nicoechaniz Aug 15, 2026
481656c
fix(listener): accept pinned withdrawal operator in release lane
nicoechaniz Aug 15, 2026
35b8cd8
Merge pull request #349 from AlterMundi/fix/listener-release-operator…
nicoechaniz Aug 15, 2026
d88d508
feat(listener): observe container continuity for external smoke
nicoechaniz Aug 15, 2026
de192b6
Merge pull request #350 from AlterMundi/feat/listener-container-observer
nicoechaniz Aug 15, 2026
222051d
fix(listener): align observer freshness with scraping
nicoechaniz Aug 15, 2026
59c4814
ci(listener): gate external smoke harness changes
nicoechaniz Aug 15, 2026
d3c7869
Merge pull request #351 from AlterMundi/fix/listener-observer-freshness
nicoechaniz Aug 15, 2026
b8b67f4
docs(listener): record first external media smoke
nicoechaniz Aug 15, 2026
658e039
Merge PR #352: record first external Listener smoke
nicoechaniz Aug 15, 2026
eacd490
docs(listener): clarify productive rehearsal boundary
nicoechaniz Aug 15, 2026
9d4f6df
Merge PR #353: clarify productive rehearsal boundary
nicoechaniz Aug 15, 2026
4d39b2d
feat(listener): verify dormant Live commerce boundary
nicoechaniz Aug 15, 2026
e337f93
Merge PR #354: verify dormant Live commerce boundary
nicoechaniz Aug 15, 2026
7ad0385
fix(listener): prioritize playback continuity
nicoechaniz Aug 15, 2026
229ea5f
Merge pull request #356 from AlterMundi/fix/listener-background-stabi…
nicoechaniz Aug 15, 2026
3526f25
docs(listener): distinguish latency from startup
nicoechaniz Aug 15, 2026
9f515b9
Merge pull request #357 from AlterMundi/docs/listener-stability-buffe…
nicoechaniz Aug 15, 2026
03ba82f
feat(listener): decouple authorized audio delivery
nicoechaniz Aug 15, 2026
830dfad
Merge pull request #358 from AlterMundi/feat/listener-autonomous-medi…
nicoechaniz Aug 15, 2026
7804c02
test(listener): enforce direct media grants
nicoechaniz Aug 15, 2026
ec59c4b
test(listener): stabilize direct media release gates
nicoechaniz Aug 15, 2026
a757cdb
Merge pull request #359 from AlterMundi/test/listener-direct-media-smoke
nicoechaniz Aug 15, 2026
9f7e97a
feat(listener): add inner-anchor kelp field
nicoechaniz Aug 15, 2026
53e10b2
fix(listener): connect staging lab to media grants
nicoechaniz Aug 15, 2026
40c1e1d
feat(listener): tune accepted kelp field controls
nicoechaniz Aug 15, 2026
1eb63de
fix(listener): preserve precise camera rotation
nicoechaniz Aug 15, 2026
83f3dcd
feat(listener): accept aurora kelp preset
nicoechaniz Aug 16, 2026
1e1e43e
Merge PR #360: inner-anchor kelp visualization
nicoechaniz Aug 16, 2026
99d2164
ops(listener): publish revised English intro
nicoechaniz Aug 16, 2026
5c29328
Merge pull request #362 from AlterMundi/feat/listener-en-intro-r1
nicoechaniz Aug 16, 2026
3ec2904
feat(listener): compact public access and disable reactive field
nicoechaniz Aug 16, 2026
efdf86a
Merge pull request #363 from AlterMundi/feat/listener-landing-compact
nicoechaniz Aug 16, 2026
9430f92
fix(listener): keep BeaconField loops spatially continuous
nicoechaniz Aug 16, 2026
cd90f39
Merge pull request #364 from AlterMundi/fix/listener-field-continuous
nicoechaniz Aug 16, 2026
8fd24f6
feat(brand): add canonical shared primitives
nicoechaniz Aug 16, 2026
3cafb71
feat(listener): align public experience with canonical brand
nicoechaniz Aug 16, 2026
3a2ae06
fix(listener): scope document theme to public host
nicoechaniz Aug 16, 2026
7398103
fix(listener): stabilize remote UI preview compilation
nicoechaniz Aug 16, 2026
73c9d35
Merge pull request #369 from AlterMundi/feat/listener-brand-alignment
nicoechaniz Aug 16, 2026
38c294f
ops(listener): publish revised Spanish intro
nicoechaniz Aug 16, 2026
8eeae64
Merge pull request #373 from AlterMundi/feat/listener-es-intro-r2
nicoechaniz Aug 16, 2026
873a959
fix(listener): reveal BeaconField through interaction panels
nicoechaniz Aug 16, 2026
160da26
Merge Listener transparent BeaconField panels (#379)
nicoechaniz Aug 16, 2026
76777b7
fix(listener): stabilize membership hydration
nicoechaniz Aug 17, 2026
55b8dd7
fix(listener): follow membership action convergence
nicoechaniz Aug 17, 2026
768f16e
fix(listener): tolerate restored profile disclosure
nicoechaniz Aug 17, 2026
622ecac
fix(listener): reconcile membership actions silently
nicoechaniz Aug 17, 2026
b5a49ce
docs(listener): make cancellation prospective
nicoechaniz Aug 17, 2026
d301e62
Merge pull request #382 from AlterMundi/docs/listener-cancellation-po…
nicoechaniz Aug 17, 2026
9482e9b
Merge pull request #381 from AlterMundi/fix/listener-membership-bound…
nicoechaniz Aug 17, 2026
8d7bcf8
fix(listener): remove persistent withdrawal buttons
nicoechaniz Aug 17, 2026
ee9837a
Merge pull request #383 from AlterMundi/fix/listener-hide-withdrawal-…
nicoechaniz Aug 17, 2026
ff68ab1
fix(listener): decouple Mercado Pago payer identity
nicoechaniz Aug 17, 2026
2b4acd4
Merge pull request #384 from AlterMundi/fix/listener-mp-billing-email
nicoechaniz Aug 17, 2026
cd2396a
fix(listener): keep staging auth on staging
nicoechaniz Aug 17, 2026
277166e
Merge pull request #386 from AlterMundi/fix/listener-staging-auth-origin
nicoechaniz Aug 17, 2026
482b5a0
fix(listener): deduplicate private workbench environment
nicoechaniz Aug 17, 2026
d14d080
Merge pull request #387 from AlterMundi/fix/listener-workbench-env-dedup
nicoechaniz Aug 17, 2026
4659c64
fix(listener): prefer configured membership checkout
nicoechaniz Aug 17, 2026
4788d3e
Merge pull request #388 from AlterMundi/fix/listener-cta-checkout
nicoechaniz Aug 17, 2026
f10e7fc
fix(listener): always show Google account selector
nicoechaniz Aug 17, 2026
9b73b67
Merge pull request #389 from AlterMundi/fix/listener-google-account-s…
nicoechaniz Aug 17, 2026
5f3b681
feat: share global navigation across Live and Listener
nicoechaniz Aug 17, 2026
6b01ba5
Merge pull request #390 from AlterMundi/feat/global-navigation
nicoechaniz Aug 17, 2026
972fb75
fix(listener): restore calm BeaconField center
nicoechaniz Aug 17, 2026
e3ad29f
docs(brand): pin current global navigation review
nicoechaniz Aug 17, 2026
73e2a49
docs: prototype three Listener UX directions
nicoechaniz Aug 17, 2026
15c3449
docs: align Listener prototypes with shared navigation
nicoechaniz Aug 17, 2026
2b66f4a
docs: match canonical Listener mobile navigation order
nicoechaniz Aug 17, 2026
640ecb2
feat(listener): harden provider-neutral identity recovery
nicoechaniz Aug 17, 2026
bf82974
fix(listener): expose bounded identity recovery
nicoechaniz Aug 17, 2026
da1641d
fix(listener): make identity recovery authoritative
nicoechaniz Aug 17, 2026
55aa5d2
docs(listener): describe durable session recovery
nicoechaniz Aug 17, 2026
5cc0f80
fix(listener): trust the reviewed proxy origin
nicoechaniz Aug 17, 2026
df4a17f
feat(listener): compose listening altar layout
nicoechaniz Aug 17, 2026
ee81479
fix(listener): expand altar touch targets
nicoechaniz Aug 17, 2026
b222d2b
fix(listener): extend the field beyond the altar
nicoechaniz Aug 17, 2026
844887c
fix(listener): reveal the field through altar glass
nicoechaniz Aug 17, 2026
56ea907
feat(listener): recover identity and prepare Apple sign-in (#395)
nicoechaniz Aug 17, 2026
6457a32
Merge pull request #398 from AlterMundi/feat/listener-listening-altar
nicoechaniz Aug 17, 2026
bbe70e1
feat(account): centralize Beacon identity authority
nicoechaniz Aug 18, 2026
e00961b
ci: harden production dependency audit gate (#400)
nicoechaniz Aug 18, 2026
13d5e83
feat(account): add isolated authority deployment
nicoechaniz Aug 18, 2026
9202969
fix(account): verify private mail network boundary
nicoechaniz Aug 18, 2026
c847218
test(account): guard deployment recovery contracts
nicoechaniz Aug 18, 2026
cbcb43c
feat(account): run durable mail workers per issuer
nicoechaniz Aug 18, 2026
1e9b4f2
chore(account): normalize infrastructure files
nicoechaniz Aug 18, 2026
8ab7321
fix(account): persist maintenance degradation
nicoechaniz Aug 18, 2026
6b02289
fix(account): require private mail readiness
nicoechaniz Aug 18, 2026
0ef1558
fix(account): validate deployment inside exact image
nicoechaniz Aug 18, 2026
2d68435
fix(account): read protected deploy inputs as validator root
nicoechaniz Aug 18, 2026
e0c8c06
fix(account): package deployment validation fixtures
nicoechaniz Aug 18, 2026
0af2aef
fix(account): honor canonical host behind loopback proxy
nicoechaniz Aug 18, 2026
514bac2
fix(account): preserve app target across health waits
nicoechaniz Aug 18, 2026
3a51630
ops(account): add staging certificate bootstrap
nicoechaniz Aug 18, 2026
445db1a
ops(listener): isolate identity staging runtime
nicoechaniz Aug 18, 2026
76cf818
fix(listener): harden isolated staging cutover
nicoechaniz Aug 18, 2026
f86e01c
fix(listener): keep staging smoke host portable
nicoechaniz Aug 18, 2026
800c138
fix(ops): recognize randomized preview stream secret
nicoechaniz Aug 18, 2026
d9c7b0d
fix(ops): wait for staging database readiness
nicoechaniz Aug 18, 2026
aee76d8
fix(ops): render staging tmpfs mounts atomically
nicoechaniz Aug 18, 2026
67cf197
feat(listener): gate Account staging activation
nicoechaniz Aug 18, 2026
f069516
fix(listener): restore Account mode on staging rollback
nicoechaniz Aug 18, 2026
6539bab
fix(account): publish canonical JWKS discovery
nicoechaniz Aug 18, 2026
cbfa7e4
fix(account): scope metadata and canonicalize logout tokens
nicoechaniz Aug 18, 2026
0072c72
fix(account): make external health smoke deploy-safe
nicoechaniz Aug 18, 2026
cddf040
fix(account): harden lifecycle smoke rollback
nicoechaniz Aug 18, 2026
978dfb2
Merge pull request #403 from AlterMundi/feat/account-identity-final
nicoechaniz Aug 18, 2026
658722d
docs(account): inventory sibling-origin takeover risk
nicoechaniz Aug 18, 2026
d279cbe
docs(account): leave Ticket Tailor claim gate open
nicoechaniz Aug 18, 2026
57b68ab
Merge pull request #404 from AlterMundi/docs/account-subdomain-inventory
nicoechaniz Aug 18, 2026
792af38
fix(account): make credential signup usable
nicoechaniz Aug 18, 2026
160662c
Merge pull request #406 from AlterMundi/fix/account-password-min8
nicoechaniz Aug 18, 2026
49aef08
fix(account): move Account into user menu
nicoechaniz Aug 18, 2026
658a5f7
Merge pull request #407 from AlterMundi/fix/global-nav-account-control
nicoechaniz Aug 18, 2026
798b4fe
fix(account): expose pinned navigation asset
nicoechaniz Aug 18, 2026
f27d0e5
Merge pull request #408 from AlterMundi/fix/account-nav-asset-ingress
nicoechaniz Aug 18, 2026
eee2a95
fix(account): expose navigation asset at edge
nicoechaniz Aug 18, 2026
4dff809
Merge pull request #409 from AlterMundi/fix/account-nav-nginx-ingress
nicoechaniz Aug 18, 2026
7c792a4
fix(nav): remove iframe and remote icon dependencies
nicoechaniz Aug 18, 2026
18b7cf8
fix(nav): preserve canonical Lissajous geometry
nicoechaniz Aug 18, 2026
8ccb078
Merge pull request #410 from nicoechaniz/fix/account-nav-local-icons
nicoechaniz Aug 18, 2026
227bd4e
fix(listener): serve pinned global navigation asset
nicoechaniz Aug 18, 2026
7c2d037
Merge pull request #411 from nicoechaniz/fix/listener-nav-asset-ingress
nicoechaniz Aug 18, 2026
8c5f4c3
fix(nav): keep mobile menu inside narrow viewports
nicoechaniz Aug 18, 2026
0bf4db2
Merge pull request #413 from nicoechaniz/fix/account-listener-nav-nar…
nicoechaniz Aug 18, 2026
16b37a9
feat(account): show local signed-in navigation state
nicoechaniz Aug 18, 2026
6d0f611
Merge pull request #414 from nicoechaniz/fix/account-listener-hide-un…
nicoechaniz Aug 18, 2026
624a907
fix(account): make signup confirmation durable
nicoechaniz Aug 18, 2026
3c7b324
fix(account): keep signup recovery accessible
nicoechaniz Aug 18, 2026
7e70a90
Merge pull request #420 from nicoechaniz/fix/account-signup-feedback
nicoechaniz Aug 18, 2026
6463e4b
fix(listener): remove membership mail fallback
nicoechaniz Aug 18, 2026
c6fa4b7
feat(listener): pin staging intro artifacts
nicoechaniz Aug 18, 2026
965284d
test(listener): check intro configuration entrypoint
nicoechaniz Aug 18, 2026
0f407b8
Merge pull request #422 from nicoechaniz/fix/listener-membership-no-m…
nicoechaniz Aug 18, 2026
841d6e6
fix(account): isolate production database runtime role
nicoechaniz Aug 19, 2026
9d54b53
Merge pull request #423 from nicoechaniz/fix/account-production-datab…
nicoechaniz Aug 19, 2026
dd93cd9
ops(listener): prepare production Account RP boundary
nicoechaniz Aug 19, 2026
70e8a7e
fix(listener): require root for Account RP preparation
nicoechaniz Aug 19, 2026
8fb92bb
Merge pull request #424 from nicoechaniz/ops/account-production-rp-cu…
nicoechaniz Aug 19, 2026
ea0efa1
fix(listener): trust canonical origin for recovery
nicoechaniz Aug 19, 2026
5d7f832
Merge pull request #425 from nicoechaniz/fix/listener-recovery-canoni…
nicoechaniz Aug 19, 2026
9629fd5
fix(listener): unify account controls in global navigation
nicoechaniz Aug 19, 2026
5bb19fe
Merge pull request #426 from nicoechaniz/fix/listener-unified-account…
nicoechaniz Aug 19, 2026
1f15eaa
docs(account): define central social provider rollout
nicoechaniz Aug 19, 2026
6faaf65
Merge pull request #427 from nicoechaniz/docs/account-provider-activa…
nicoechaniz Aug 19, 2026
5397b1f
fix(listener): move membership management out of player
nicoechaniz Aug 19, 2026
cc08a31
Merge pull request #428 from nicoechaniz/fix/listener-membership-mana…
nicoechaniz Aug 19, 2026
1848081
test(listener): lock account switching cache boundary
nicoechaniz Aug 19, 2026
4d7d405
ci(listener): run account switch browser gate
nicoechaniz Aug 19, 2026
e876aa4
Merge pull request #429 from nicoechaniz/test/listener-account-switch…
nicoechaniz Aug 19, 2026
adccd22
ops: add production Account cutover lifecycle
nicoechaniz Aug 19, 2026
ebd2613
Merge pull request #430 from nicoechaniz/ops/account-production-cutover
nicoechaniz Aug 19, 2026
60e81a5
Add safe Account social provider lifecycle
nicoechaniz Aug 19, 2026
c1ea39e
Merge PR #431: safe Account social-provider lifecycle
nicoechaniz Aug 19, 2026
ecc1d69
fix(account): resume RP authorization after credential login
nicoechaniz Aug 19, 2026
50ae2e0
Merge pull request #432 from nicoechaniz/fix/account-oauth-login-return
nicoechaniz Aug 19, 2026
0af8bc5
feat(nav): gate production Account by runtime availability
nicoechaniz Aug 19, 2026
49f4199
Merge pull request #437 from AlterMundi/feat/account-listener-product…
nicoechaniz Aug 19, 2026
c63a6ef
fix(account): sanitize Prisma URL for production backup
nicoechaniz Aug 20, 2026
e123273
Merge pull request #442 from AlterMundi/fix/account-production-pgdump…
nicoechaniz Aug 20, 2026
02ad6f6
fix(listener): resume central Account sessions automatically
nicoechaniz Aug 20, 2026
16e2073
Merge pull request #448 from nicoechaniz/fix/listener-auto-account-ha…
nicoechaniz Aug 20, 2026
367800e
fix(listener): support Account-on production redeploys
nicoechaniz Aug 20, 2026
8ac0bd2
Merge pull request #449 from nicoechaniz/fix/listener-account-redeplo…
nicoechaniz Aug 20, 2026
0f2c6c7
fix(listener): preserve audio through network loss
nicoechaniz Aug 20, 2026
4cc5142
Merge pull request #450 from nicoechaniz/fix/listener-audio-network-r…
nicoechaniz Aug 20, 2026
191cf89
test(listener): measure true buffer exhaustion
nicoechaniz Aug 20, 2026
e283575
ci(listener): run network resilience gate
nicoechaniz Aug 20, 2026
6d6ea1b
ci(listener): install HLS fixture encoder
nicoechaniz Aug 20, 2026
e52a755
test(listener): keep network fixture timestamps monotonic
nicoechaniz Aug 20, 2026
6da03ae
fix(listener): preserve media clock on HLS refill
nicoechaniz Aug 20, 2026
bc8e55a
ci(listener): isolate browser media clocks
nicoechaniz Aug 20, 2026
dfe6740
test(listener): pin both Live checkout providers
nicoechaniz Aug 20, 2026
e89c81e
test(listener): mirror production live timeline
nicoechaniz Aug 21, 2026
8c9715d
test(listener): await account history traversal
nicoechaniz Aug 21, 2026
1a9dfe9
fix(listener): resume HLS loading at the media clock
nicoechaniz Aug 21, 2026
77ad434
fix(listener): refill from the forward buffer edge
nicoechaniz Aug 21, 2026
71faa46
fix(listener): isolate buffered playback from origin loss
nicoechaniz Aug 21, 2026
e39c33d
fix(listener): drain the rolling buffer while offline
nicoechaniz Aug 21, 2026
3328f40
fix(listener): keep offline range requests isolated
nicoechaniz Aug 21, 2026
f70ed48
fix(listener): preserve the media clock through exhaustion
nicoechaniz Aug 21, 2026
d74393e
test(listener): repin exhaustion recovery boundary
nicoechaniz Aug 21, 2026
72c5d06
test(listener): keep network polling inside the browser
nicoechaniz Aug 21, 2026
0966e91
fix(listener): verify origin before online recovery
nicoechaniz Aug 21, 2026
9d78241
test(listener): reject advisory online recovery
nicoechaniz Aug 21, 2026
1e4df3b
fix(listener): retain loader state through outages
nicoechaniz Aug 21, 2026
75f9a79
fix(listener): bound the decoder buffer window
nicoechaniz Aug 21, 2026
03a9244
ci(listener): isolate network browser decoders
nicoechaniz Aug 21, 2026
e7cac72
ci(listener): test AAC Firefox on supported host
nicoechaniz Aug 21, 2026
a61f152
fix(listener): retain fragments until MSE acceptance
nicoechaniz Aug 21, 2026
9cb754e
Merge PR #451: harden Listener audio network resilience
nicoechaniz Aug 21, 2026
bbf04a3
feat(analytics): add canonical identity and listening facts
nicoechaniz Aug 29, 2026
a58df4a
fix(analytics): bind Account and Listener to exact hosts
nicoechaniz Aug 29, 2026
c4109c1
fix(analytics): preserve staging provenance in server facts
nicoechaniz Aug 29, 2026
ff4c5be
test(listener): measure accelerated decoder rate
nicoechaniz Aug 29, 2026
46ecb49
test(listener): decouple buffer gate from throttled playback rate
nicoechaniz Aug 29, 2026
ec16cf2
fix(listener): count only playable reservoir headroom
nicoechaniz Aug 29, 2026
6b10c9a
Merge pull request #485 from AlterMundi/feat/analytics-account-listen…
nicoechaniz Aug 29, 2026
8a0159c
fix(account): require mounted data disk for backups
nicoechaniz Aug 29, 2026
38b6665
ci(account): run release gates for deploy scripts
nicoechaniz Aug 29, 2026
3fcf6b8
Merge pull request #486 from nicoechaniz/fix/account-backup-data-mount
nicoechaniz Aug 29, 2026
178e0d5
feat(listener): surface membership throughout Listen
SairaAsua Sep 2, 2026
7d54c05
Merge pull request #494 from AlterMundi/feat/listener-membership-disc…
SairaAsua Sep 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
76 changes: 76 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,82 @@ BEACON_COMMERCE_SERVICE_KEY_CURRENT=replace-with-at-least-43-random-characters
# Fixed at seven days for the 2026-08-08 event plus support window.
SESSION_COOKIE_TTL_SECONDS=604800

# ===================
# Listener identity, membership and private stream
# ===================
# Identity/access settings below keep their EARLY_BIRDS_ deployment names for
# the existing namespace migration. The application also accepts the stable
# BEACON_LISTENER_ alias for ENABLED, FREE_FOR_ALL, AUTH_BASE_URL,
# TRUSTED_ORIGINS, AUTH_SECRET, Google credentials, the magic-link trio,
# test access and staging team entry. Never mix generations within a credential
# bundle; if both aliases are present they must have the same trimmed value.
# Public entry defaults OFF. Set to exactly 1 only after the isolated stack is
# healthy; switching it back to 0 presents a truthful unavailable page while
# private membership projection and reconciliation continue.
EARLY_BIRDS_ENABLED=0
# Reversible operator override for public listening moments. Exactly 1 bypasses
# identity/membership only for Listener audio routes; 0 restores normal access.
EARLY_BIRDS_FREE_FOR_ALL=0

# Public app origin. Register these exact OAuth callbacks:
# https://<app-host>/api/early-birds/auth/callback/google
# https://<app-host>/api/early-birds/auth/callback/apple
EARLY_BIRDS_AUTH_BASE_URL=https://app.example.invalid
EARLY_BIRDS_TRUSTED_ORIGINS=https://app.example.invalid
EARLY_BIRDS_AUTH_SECRET=replace-with-at-least-32-random-characters
EARLY_BIRDS_GOOGLE_CLIENT_ID=
EARLY_BIRDS_GOOGLE_CLIENT_SECRET=
# Apple remains absent from the UI until the complete server-side bundle is
# installed and this explicit gate is exactly 1.
BEACON_LISTENER_APPLE_ENABLED=0
BEACON_LISTENER_APPLE_CLIENT_ID=
# Generated ES256 Apple client-secret JWT. Never place the private .p8 here.
BEACON_LISTENER_APPLE_CLIENT_SECRET=

# Optional passwordless fallback. The UI and Better Auth plugin remain absent
# unless all three values are complete. Delivery is a narrow private API owned
# by the existing mail service; never mount its Gmail grant into this app.
EARLY_BIRDS_MAGIC_LINK_DELIVERY_URL=
EARLY_BIRDS_MAGIC_LINK_DELIVERY_TOKEN=
EARLY_BIRDS_MAGIC_LINK_RATE_SECRET=

# Outbound server-to-server access to PMP Myth Bot, the sole membership authority.
EARLY_BIRDS_AUTHORITY_BASE_URL=http://pmp-myth-bot:3000
EARLY_BIRDS_AUTHORITY_SERVICE_KEY_ID=local-v1
EARLY_BIRDS_AUTHORITY_SERVICE_TOKEN=replace-with-at-least-43-random-characters

# Inbound monotonic membership projection authentication; keep current and
# previous simultaneously during a rotation.
EARLY_BIRDS_BEACON_SERVICE_KEY_CURRENT_ID=local-v1
EARLY_BIRDS_BEACON_SERVICE_KEY_CURRENT=replace-with-at-least-43-random-characters
# EARLY_BIRDS_BEACON_SERVICE_KEY_PREVIOUS_ID=
# EARLY_BIRDS_BEACON_SERVICE_KEY_PREVIOUS=

# The browser receives only a stable same-origin manifest URL. These credentials
# remain server-side and sign the approved origin artifact for <=10 minutes.
EARLY_BIRDS_STREAM_ORIGIN=https://stream.example.invalid
EARLY_BIRDS_STREAM_ARTIFACT_ID=approved-v1
EARLY_BIRDS_STREAM_SIGNING_SECRET=replace-with-at-least-32-random-characters
EARLY_BIRDS_DEVICE_PEPPER=replace-with-at-least-32-random-characters
# Private drop-ins are local files served through the authenticated same-origin route.
# Leave either absolute path empty to fail closed for that language.
EARLY_BIRDS_DROPIN_ES_PATH=
EARLY_BIRDS_DROPIN_EN_PATH=

# Synthetic auth/access is absent unless BOTH values are explicitly present.
# The harness must call POST /api/early-birds/test-login with
# Authorization: Bearer <this secret>. Never expose it to browser code or production.
EARLY_BIRDS_TEST_ACCESS_ENABLED=0
# EARLY_BIRDS_TEST_LOGIN_SECRET=replace-with-at-least-32-random-characters

# Optional human-operated synthetic entry for HTTPS staging only. It remains
# hidden unless all EarlyBird/test gates above and this dedicated gate are 1,
# NODE_ENV is production, X-Forwarded-Proto is exactly https, and Host exactly
# matches one comma-separated entry below. Values are host[:port], never URLs
# or wildcards. Do not include production/customer hosts.
EARLY_BIRDS_STAGING_TEAM_ENTRY_ENABLED=0
# EARLY_BIRDS_STAGING_TEAM_ENTRY_HOSTS=earlybirds-staging.example.invalid

# Trusted reverse-proxy hops in front of the app, used to find the real client
# address for the failed-login limiter. 1 = Nginx only; 2 = Cloudflare + Nginx.
# Too high a value keys the limiter on a forgeable header; too low keys every
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:
- run: npm ci
- name: Reject high-severity production dependency regressions
run: |
npm audit --omit=dev --audit-level=high
npm run audit:production
npm audit --omit=dev --prefix services/tapestry --audit-level=high
npm audit --omit=dev --prefix services/playlist-bot --audit-level=high
- run: npm run lint
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ jobs:
npm run contract:commerce:verify
npm test
npm test --prefix services/tapestry
npm audit --omit=dev --audit-level=high
npm run audit:production
npm audit --omit=dev --prefix services/tapestry --audit-level=high
npm audit --omit=dev --prefix services/playlist-bot --audit-level=high
npx tsc --noEmit
Expand Down
19 changes: 19 additions & 0 deletions .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -146,12 +146,31 @@ jobs:
- name: Run Firefox functional and accessibility gates
run: npx playwright test --project=firefox

- name: Verify Listener Founder and Free account-switch cache boundary
run: >-
npx playwright test e2e/tests/listener-account-switch.spec.ts
--project=chromium
--project=firefox
env:
E2E_LISTENER_ACCOUNT_SWITCH_GATE: '1'

- name: Install WebKit after Chromium screenshot gates
run: npx playwright install --with-deps webkit

- name: Run iPhone/WebKit media gate
run: npx playwright test e2e/tests/media-continuity.spec.ts --project=iphone-webkit

- name: Verify Listener buffer and recovery under deterministic network loss
run: >-
npx playwright test e2e/tests/listener-network-resilience.spec.ts
--project=chromium
--project=firefox
--project=android-chrome
--project=iphone-webkit
--workers=4
env:
E2E_LISTENER_NETWORK_GATE: '1'

- name: Verify commerce transaction and durable outbox contract
run: npx vitest run --no-file-parallelism src/lib/__tests__/commerce-entitlement.integration.test.ts src/lib/__tests__/promo-invitation.integration.test.ts
env:
Expand Down
242 changes: 242 additions & 0 deletions .github/workflows/early-birds-fast-forward.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,242 @@
name: EarlyBirds fast-forward checks

on:
pull_request:
paths:
- Dockerfile
- package.json
- package-lock.json
- prisma/**
- src/app/api/health/**
- src/app/api/early-birds/**
- src/app/api/listener/**
- src/app/early-birds/**
- src/app/listener/**
- src/components/early-birds/**
- src/lib/early-birds/**
- src/lib/listener/**
- e2e/fixtures/listener-account-switch.ts
- e2e/tests/listener-account-switch.spec.ts
- e2e/tests/listener-network-resilience.spec.ts
- playwright.config.ts
- src/app/layout.tsx
- src/app/globals.css
- src/components/brand/ListenerIdentityCacheBoundary.tsx
- src/components/brand/__tests__/ListenerIdentityCacheBoundary.test.tsx
- services/beacon-stream/**
- ops/early-birds/**
- ops/early-birds-preview/**
- ops/beacon-account/**
- ops/listener-identity-staging/**
- ops/listener-account-production/**
- scripts/beacon-account/**
- scripts/early-birds-preview/**
- scripts/listener-identity-staging/**
- scripts/listener-account-production/**
- scripts/listener_container_observer.py
- tools/early-birds-hls-load/**
- docs/ops/LISTENER_FIRST_EXTERNAL_HLS_SMOKE.md
- docs/operations/EARLY_BIRDS_STAGING_PREVIEW.md
- docs/operations/FOUNDING_LISTENER_COMMERCIAL_LAUNCH.md
- docs/operations/LISTENER_LAUNCH_NOW.md
- docs/operations/LISTENER_PRIVATE_LIVE_WORKBENCH.md
- .github/workflows/early-birds-fast-forward.yml
push:
branches: [early-birds, "feat/early-birds-*"]
paths:
- Dockerfile
- package.json
- package-lock.json
- prisma/**
- src/app/api/health/**
- src/app/api/early-birds/**
- src/app/api/listener/**
- src/app/early-birds/**
- src/app/listener/**
- src/components/early-birds/**
- src/lib/early-birds/**
- src/lib/listener/**
- e2e/fixtures/listener-account-switch.ts
- e2e/tests/listener-account-switch.spec.ts
- e2e/tests/listener-network-resilience.spec.ts
- playwright.config.ts
- src/app/layout.tsx
- src/app/globals.css
- src/components/brand/ListenerIdentityCacheBoundary.tsx
- src/components/brand/__tests__/ListenerIdentityCacheBoundary.test.tsx
- services/beacon-stream/**
- ops/early-birds/**
- ops/early-birds-preview/**
- ops/beacon-account/**
- ops/listener-identity-staging/**
- ops/listener-account-production/**
- scripts/beacon-account/**
- scripts/early-birds-preview/**
- scripts/listener-identity-staging/**
- scripts/listener-account-production/**
- scripts/listener_container_observer.py
- tools/early-birds-hls-load/**
- docs/ops/LISTENER_FIRST_EXTERNAL_HLS_SMOKE.md
- docs/operations/EARLY_BIRDS_STAGING_PREVIEW.md
- docs/operations/FOUNDING_LISTENER_COMMERCIAL_LAUNCH.md
- docs/operations/LISTENER_LAUNCH_NOW.md
- docs/operations/LISTENER_PRIVATE_LIVE_WORKBENCH.md
- .github/workflows/early-birds-fast-forward.yml

permissions:
contents: read

jobs:
quota-postgres:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:16-alpine
env:
POSTGRES_PASSWORD: listener_test
POSTGRES_DB: listener_test
ports:
- 55433:5432
options: >-
--health-cmd "pg_isready -U postgres -d listener_test"
--health-interval 5s
--health-timeout 5s
--health-retries 12
env:
DATABASE_URL: postgresql://postgres:listener_test@localhost:55433/listener_test
LISTENER_TEST_DATABASE_URL: postgresql://postgres:listener_test@localhost:55433/listener_test
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22.22'
cache: 'npm'
- run: npm ci
- run: npx prisma migrate deploy
- run: npm test -- --run src/lib/early-birds/__tests__/founder-eligibility.postgres.test.ts src/lib/early-birds/__tests__/quota.postgres.test.ts

stream-origin:
runs-on: ubuntu-latest
defaults:
run:
working-directory: services/beacon-stream
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: 22 }
- run: npm test
- run: npm run check

observability-config:
runs-on: ubuntu-latest
defaults:
run:
working-directory: ops/early-birds
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: 22 }
- uses: actions/setup-python@v5
with: { python-version: '3.13' }
- run: npm test
- run: npm run check
- run: npm run validate
- run: npm --prefix ../../tools/early-birds-hls-load test
- run: npm --prefix ../../tools/early-birds-hls-load run check

staging-preview:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: 22 }
- run: npm --prefix ops/early-birds-preview run check
- run: npm --prefix ops/early-birds-preview test
- run: npm --prefix ops/early-birds-preview run validate:build
- run: npm --prefix ops/listener-identity-staging run check
- run: npm --prefix ops/listener-identity-staging test
- run: npm --prefix ops/listener-identity-staging run validate:example
- run: npm --prefix ops/listener-account-production run check
- run: npm --prefix ops/listener-account-production test

identity-cache:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:16-alpine
env:
POSTGRES_PASSWORD: e2e
POSTGRES_DB: beacon_test
ports:
- 55432:5432
options: >-
--health-cmd "pg_isready -U postgres -d beacon_test"
--health-interval 5s
--health-timeout 5s
--health-retries 12
env:
E2E_DATABASE_URL: postgresql://postgres:e2e@localhost:55432/beacon_test
E2E_LISTENER_ACCOUNT_SWITCH_GATE: '1'
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22.22'
cache: 'npm'
- run: npm ci
- run: DATABASE_URL="$E2E_DATABASE_URL" npx prisma migrate deploy
- run: npx playwright install --with-deps chromium firefox
- run: >-
npx playwright test e2e/tests/listener-account-switch.spec.ts
--project=chromium
--project=firefox

network-resilience:
name: network-resilience (${{ matrix.project }})
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include:
- project: chromium
browser: chromium
runner: ubuntu-latest
- project: firefox
browser: firefox
# Playwright documents that media codec availability varies by
# host OS. Its patched Linux Firefox does not expose the approved
# AAC/fMP4 MSE pipeline, so exercise Firefox on macOS rather than
# silently substituting a different stream codec.
runner: macos-15
- project: android-chrome
browser: chromium
runner: ubuntu-latest
- project: iphone-webkit
browser: webkit
runner: ubuntu-latest
env:
E2E_LISTENER_NETWORK_GATE: '1'
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22.22'
cache: 'npm'
- run: npm ci
- run: npx playwright install --with-deps ${{ matrix.browser }}
- name: Install deterministic HLS fixture encoder
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends ffmpeg
ffmpeg -version | head -n 1
- name: Install deterministic HLS fixture encoder on macOS
if: runner.os == 'macOS'
run: |
command -v ffmpeg >/dev/null || brew install ffmpeg
ffmpeg -version | head -n 1
- name: Run network resilience in an isolated browser process
run: >-
npx playwright test e2e/tests/listener-network-resilience.spec.ts
--project=${{ matrix.project }}
--workers=1
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@
/playwright-report/
/e2e/.auth/
/artifacts/load-test/
/artifacts/early-birds-hls-load/
__pycache__/
*.py[cod]

# next.js
/.next/
Expand Down
Loading
Loading