Tags give the ability to mark specific points in history as being important
-
v1.2.52
protectedRelease: EWBSX backend v1.2.5281621f3d · ·v1.2.52 — prod promotion (backend #1515,#1517,#1518,#1520,#1522): request-played ranking + request-play guard on pregenerated cadence slots, track-length rule anchor fixes, cadence slots may hardwire a specific track (kind TRACK)
-
v1.2.51
protectedRelease: EWBSX backend v1.2.51aecf6ccd · ·v1.2.51 — prod promotion (backend #1491,#1502,#1503,#1504,#1513): timed schedule in America/New_York with one-shot backed-up UTC->ET boot migration (rollback floor: restore timed_schedule_backups first), playlist ordering, ADMIN_REVIEW_PENDING notifications, hop horizon + CADENCE floor fixes
-
v1.2.50
protectedRelease: EWBSX backend v1.2.5020b19c4f · ·v1.2.50 — prod promotion (backend #1491,#1496,#1497): serve-path hop horizon + protected-slot soft-window exemption, forum search sort, DECADE seed name adoption
-
v1.2.49
protectedRelease: EWBSX backend v1.2.4921ce67f5 · ·v1.2.49 — prod promotion (backend #1462–#1494): HOTFIX backend#1494 grapheme-safe truncation + lone-surrogate defence (prod chat outage ai-jeet-standins#1296); playout seam/resync fixes #1462–#1490; music tag categories + MusicBrainz/embedded tag backfill #1481–#1483; timed entry run windows #1476; site event cosmetics #1485; DECADE prod names #1493; Brainrot checkpoint bonus roll (flag OFF) #1492
-
v1.2.48
protectedRelease: EWBSX backend v1.2.48ef153cab · ·v1.2.48 — prod promotion (backend #1226,#1320,#1370,#1437,#1442,#1447-#1450,#1452-#1457,#1460,#1461): playout cursor/hold fixes, short trailing-gap continuation, chat clientMessageId dedupe + per-user klan sockets, BTCPay rail, gift notice claims, DURATION_PROBE_UNAVAILABLE, sameTitle filter
-
v1.2.47
protectedRelease: EWBSX backend v1.2.47ace2a949 · ·v1.2.47 — prod promotion (backend #1217,#1298,#1355,#1358,#1361,#1421,#1423,#1425,#1427-#1431): trailing-gap midnight fix, per-tier flair discounts, async file log + PerfDisableSharedMem, stream/state timing, song-request availability, entitlement null revision
-
v1.2.46
protectedRelease: EWBSX backend v1.2.46245f2f93 · ·v1.2.46 — prod promotion (backend #1362-#1424, 16 commits) - Rankings and klan surfaces require sign-in: leaderboard / bully board / ranking endpoints answer 401 signed out (#1415), klan standings and dossier likewise, with a public GET /api/klans/recruitment that carries no morale or rank (#1416). Coordinated with frontend #1659 / #1660, which show a sign-in prompt and per-klan recruitment ads instead. - Media serving: forum media is served by what the name RESOLVES to, so a dot run inside a file name cannot change the served type (#1398 #1399); the same treatment for chat, DM, gallery, klaxon (incl. deleteClip), klan logo and radio background media (#1400) - Super Reactions (NOW LIVE ON PROD — enabled by an admin 2026-10-08, 1 purchase, 1 track moved, so these are no longer inert here): a card refund Stripe reports failed or canceled after creation is handled (#1406); a failing refund is counted and reported once (#1362); expiryReason is persisted and exposed (#1413); hourly/daily limits reserve the steps of the member's own open and settling checkouts (#1380); a payment to an EXPIRED or cancelled checkout counts against the limits (#1405); row shape pinned with updatedAt as a BSON date so the TTL applies (#1369) - Playout/play_logs: a song request's band end closes a play_logs row only when it is that request's own row (#1395); the row of an item shorter than the crossfade pre-buffer, reported back to back, is closed correctly (#1396) - Now-playing: the warm-path next-track forecast is bounded at 250 ms, single-flight (#1419) - Server-persisted closed tutorial prompts per member (#1412) - FLAIR_PURCHASED notification to admins on a confirmed flair purchase (#1424) No new env keys. KNOWN DEFECT SHIPPING IN THIS TAG: src/main/resources/openapi/documentation.yaml is not parseable YAML. Lines 2468 and 2508 carry unquoted summaries containing ' :: ' ((STATS :: RANKINGS), (STATS :: BULLY BOARD)), introduced by 9af25a7, so the swagger parser logs MarkedYAMLException at boot and Swagger UI cannot render the spec. The API itself is unaffected and prod does not expose /swagger at the edge. backend#979's coverage ratchet cannot see it: it regex-parses paths: by indentation rather than loading the YAML, which is why 9af25a7 passed CI green. Filed for an engineer; fix is to quote both scalars. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011uF22YswSxmxG38VGNqRH7
-
v1.2.45
protectedRelease: EWBSX backend v1.2.45de37fcf0 · ·v1.2.45 — prod promotion (backend #1362–#1397): licensing play-log export in the agency CSV format (#1397); song-request band reserve/end races (#1383 #1384 #1390 #1393); klan chat eviction and admin klan reassign (#1385–#1387); Pharmacy cure XP and multi-step Super Reaction purchase (#1378 #1379); Super Reaction settlement refund/dispute fencing (#1362); admin cadence dry run (#1372)
-
v1.2.44
protectedRelease: EWBSX backend v1.2.44998be246 · ·v1.2.44 — prod promotion (backend #1302-#1367, 19 commits) - Super Bangers / Super Stinkers (#1359 #1360): per-track priority position -3..+3, paid purchase flow, and the position-to-selection-weight path in CadencePlaylistService. Rotation is INERT until a purchase: weightFor() returns null at position 0, which keeps an all-position-0 pool on the unchanged uniform shuffle (verified on prod: 3552 tracks, 0 carrying priorityPosition). Config is seeded on first read by SuperReactionRepository.ensure() from the model defaults (enabled=true, 500c each, weights 0.25..3.0) — see the deploy note. - Song-request handover integrity: a queued request handed to the playout engine and never reported on air is counted per band after a 30-minute wait, stepped over (at most 3 per poll) and retried at 30/60/120/240 min instead of being re-served every 30 min; rate-limited ERROR line; admin queue gains unconfirmedHandoverCount / lastUnconfirmedHandoverAt / unconfirmedHandoversByStream. Not failed, refunded or notified (#1367) - Missing audio: /playout/next steps over a queued request whose file is absent (#1356); submit refuses a track whose audio is not on disk (409 TRACK_AUDIO_UNAVAILABLE, #1353); track delete accounts for its files per-file (REMOVED / ALREADY_ABSENT / FAILED / NOT_ATTEMPTED, #1340) - Paid song requests: admin reject and skip answer 409 PAID_REQUEST_HELD (#1304 #1312 #1319 #1321); a bullychat price of 1-49c answers 409 BULLYCHAT_PRICE_BELOW_MINIMUM before the upload is read (#1324) - Requests-disabled hold: a submission while requests are off is accepted and held (#1338 #1339); markAsFailed live push carries a fixed member sentence, reason stays in log/adminNotes (#1341) - Library requests: GET /api/song-add-requests/library-matches match advice, submit holds on a match (#1344) - Klan themes: seven KLAN_<REGION> theme ids on PATCH /api/profile/me and PUT /api/profile (#1346 #1347) - Profile stats: brainrotPharmacyCures (#1328 #1335) and brainrotSweetSpotHits (#1364) as unlock requirement fields - Flair: delete and the boot dangling-reference sweep cover users.earnedFlairLatchIds (#1336); badge seeders keep a stored icon (#1343) - Limits: admin pending/history and my-requests cap limit to 1..100 before use so the response reports the applied value (#1302) No new env keys. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011uF22YswSxmxG38VGNqRH7
-
v1.2.43
protectedRelease: EWBSX backend v1.2.43778dc372 · ·v1.2.43 — prod promotion (backend #1178-#1320, 61 commits) Dominant theme: paid-entitlement correctness under concurrency, redelivery and deleted accounts, across all three payment rails. - Entitlement writes: compare-and-set on users.entitlementRevision with bounded re-read (#1178); period + purchase record land in ONE write (#1220 #1227); user writes send only changed fields so a stale profile/avatar/badge write cannot revive cleared state (#1179) - Idempotent delivery: redelivered invoice.paid credits a renewal once, keyed on the Stripe invoice (#1206); checkout.session.completed keeps the stored completedAt (#1276 #1277); announcements claim chatAnnouncedAt atomically so a row announces once (#1260 #1261); donations credit once per session (#1234 #1258) - Unpaid / failed sessions grant NOTHING: unpaid one-time ewbsx_type (#1307), unpaid tier-or-subscription with no ewbsx_type (#1311), checkout.session.async_payment_failed closes the open row (#1310) - Concurrency outcomes: tier purchases take their label from the read the landed write was planned from (#1244 #1246 #1247 #1197 #1204 #1209); superseded subscriptions cancelled, failed cancels recorded and retried by a sweeper (#1194 #1205 #1242); real-mongod contention suite (#1218) - Deleted accounts: renewal/checkout for a deleted buyer records the payment and grants nothing (#1271 #1274), no chat announcement (#1268 #1270), gifts not sold or granted to a deleted recipient (#1216 #1219 #1222 #1225), region reassign and KlanMigrationService skip tombstones (#1213 #1214 #1215) - Credit-funded flows: song requests inserted settled, stranded zero-cost rows swept and re-credited (#1300 #1301); zero-price bullychat inserted settled (#1309); POST /api/bullychat/{id}/confirm settles a paid checkout (#1317) - BTCPay: InvoiceExpired/InvoiceInvalid close an open invoice without touching a settled one (#1240) - Monero: health reports the longest unpaid subaddress run (#1192); open-invoice listing absorbs only wallet-unavailable failures and skips a fresh read (#1196 #1198 #1200 #1202); tier invoice label written with the paid period in one update (#1248) - Themes: Tier 3+ profile themes on PATCH /api/profile/me with a server allowlist (#1203 #1259) and a separate site-wide theme preference (#1290) - Whitepill Pharmacy cure: POST /seen counts newly acknowledged prescriptions server-side; infectionCured only when this call removed an unexpired infection (#1280 #1283); infection-only receiver readouts and numbers station dispatches (#1297) - Track upload: refusals carry DURATION_UNREADABLE / FILE_TRUNCATED on the TRACK_TOO_LONG body shape, status and message unchanged (#1318) - Test hygiene: four suites no longer assert tight wall-clock bounds (#1285 #1289 #1293) No new env keys. Prod keeps PLAYOUT_CROSSFADE_START_BUFFER_MS=5000 (v1.2.41). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011uF22YswSxmxG38VGNqRH7 -
v1.2.42
protectedRelease: EWBSX backend v1.2.4263fa7397 · ·v1.2.42 — prod promotion (backend #1165–#1199): Monero launch — guarded dynamic pricing, 24 h price lock, exactly-once crediting, subaddress and invoice guards, lower-tier purchase refusal, wallet digest fix
-
v1.2.41
protectedRelease: EWBSX backend v1.2.41c6791955 · ·v1.2.41 — prod promotion (backend #577 #653 #780 #794 #802 #1022 #1046 #1098-#1164) Supersedes v1.2.40 (built but never deployed — dev advanced 12 commits during the deploy window; this tag is that batch plus those). Themes: - Playout timing: correct ingest->output lead for pre-buffer-collapsed short tracks and the catalog rounding quantum on gate 1 (#1138); fade the outgoing track across the whole mixpoint overlap, and a stored literal fadeOutMs=0 on a MIXPOINTED track is not admin intent (#1129); remove the #406 incoming-side lead cap (#1108) NOTE: introduces PLAYOUT_CROSSFADE_START_BUFFER_MS — the backend's read-only mirror of the script constant crossfade_start_buffer_sec. Default 15000 matches STAGING's .liq; prod runs the older pinned .liq whose crossfade() takes the stdlib 5.0s default, so prod is pinned to 5000 in /opt/ewbsx/envs/backend.env by operator decision. Raise it to 15000 in the same change that ever promotes the 15s .liq. - Post-restart now-playing: rebuild the playout anchor from duration, and /playout/next no longer blocks on the post-restart cadence (#1163 #1164); finish a bullychat whose playout anchor expired (#780) - Account deletion integrity: suppress XP writes to tombstones at recordEventDetailed (#1119); guard post-deletedAt writes at the notification, inventory, knome and profile_stats seams (#1121); song_add_request_free_slots UNWIND (#1162) - Klans: live klan membership resolved at the roster read seam (#1122) - Song library: 20 XP on fulfilment, once per request, no notification re-emit on re-fulfil (#1146); PlayLogRepository.updateDuration returns matchedCount (#1160) - White pill pharmacy: anonymous read of the free-rotation set (#1098); WHITEPILL_POASTS_CURATED gets its own once-ever marker (#653) - Live anchor: owner lookup arm for Private Relay / IPv6-privacy clients (#577) - Shield slots: boot sweep selects on the XP-derived level (#1046); manual/purchase flair grants kept out of the #233 path (#1149) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011uF22YswSxmxG38VGNqRH7
-
v1.2.40
protectedRelease: EWBSX backend v1.2.408abb27d3 · ·v1.2.40 — prod promotion (backend #577 #1022 #1046 #1098 #1105 #1108 #1119-#1146) Themes: - Playout timing: correct ingest->output lead for pre-buffer-collapsed short tracks, gate 1 carries the catalog rounding quantum, PreBufferCollapseDetector folded in (#1138); fade the outgoing track across the whole mixpoint overlap and treat a stored literal fadeOutMs=0 on a MIXPOINTED track as not-admin-intent (#1129); remove the backend#406 incoming-side lead cap, Option A (#1108); crossfadeLeadMs producer contract restated (#1134) NOTE: introduces PLAYOUT_CROSSFADE_START_BUFFER_MS (default 15000), the backend's read-only mirror of the script constant crossfade_start_buffer_sec - Account deletion integrity: suppress XP writes to tombstones at the recordEventDetailed seam (#1119); guard post-deletedAt writes at the notification, inventory, knome and profile_stats seams (#1121) - Klans: resolve live klan membership at the roster read seam (#1122) - Song library: award 20 XP (SONG_ADD_REQUEST_FULFILLED, once per request) on fulfilment, and do not re-emit the notification on a re-fulfil (#1146) - White pill pharmacy: anonymous read of the free-rotation set (#1098) - Live anchor: owner lookup arm for Private Relay / IPv6-privacy clients (#577) - Shield slots: boot sweep selects on the XP-derived level, not the stale stored level cache (#1046) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011uF22YswSxmxG38VGNqRH7
-
v1.2.39
protectedRelease: EWBSX backend v1.2.3967c53d87 · ·v1.2.39 — prod promotion (backend #612 #838 #1007 #1023 #1024 #1054-#1058) Themes: - Song requests: credit bundles on a shared credit ledger, bundle checkout, funding precedence and credit return (#1055); stranded-request sweeper, ships DISARMED (#1058) - Inventory escrow: unclaimed items expire to FORFEITED after 5 days, with a forward-only sweeper, 410 Gone on a claim of a forfeited item, and a knome notification (#1056). Ships ARMED; blast radius is zero by construction — the selector requires a non-null expiresAt, which only this build writes at creation and nothing backfills (verified on prod: 98 PENDING rows, 0 with expiresAt) - Leveling events: cursor pagination, payment-purpose facet (#1054 #1057) - Klan milestones: coalesce multi-rung notification fan-out into one summary per member (#612); classify a single-rung and a kommunity ESCROWED outcome as REWARD via one shared credited-or-held predicate (#1023 #1024) - Knomes: cascade species/outfit/skill/food art rows on delete, keeping art still referenced elsewhere (#1007) - Playout: shift reconcilingRecoversByMs by the 1s recovery evaluation granularity so the advertised bound is not overstated (#838) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011uF22YswSxmxG38VGNqRH7
-
v1.2.38
protectedRelease: EWBSX backend v1.2.38dda2ca9b · ·v1.2.38 — prod promotion (backend #991-#1017) Themes: - Resilience: boot survives a malformed users row (tolerant paged decode, log-and-skip), collision-safe required-field self-heal against the case-insensitive users.username_1 unique index (#993 #994) - Account deletion: tombstone made collision-safe and unstrandable (deleted_<last8> collisions), failures below the tombstone observable and mapped (#997 #999) - Klans: atomic klans.members mutations ($pull / filtered $push), klan_membership purge step now runs unconditionally (#1004) - Forum: reaction tallies + viewer reactions on the timeline list payload via one page-level gather (#996) - Credits/billing: library request credit bundles, labelled XP envelopes, licensing, tutorial prompts default OFF (#1008-#1011); re-consume credit on re-approval, Stripe refund/dispute credit clawback with webhook 500 on clawback failure so Stripe redelivers (#1012 #1013 #1014) - Leveling: race-safe level-up badge assign (duplicate key = already held), guarded post-credit side effects, level transitions claimed from the atomic write so concurrent grants count each boundary once (#1015 #1017) - Wire validation: reject inverted/malformed play-log date ranges, require a 1-80 char bullychat title (#991 #992) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011uF22YswSxmxG38VGNqRH7
-
v1.2.37
protectedRelease: EWBSX backend v1.2.375ff2e1ff · ·v1.2.37 — prod promotion (backend #563 #582 #658 #681 #705 #721 #805 #814 #862 #929 #936 #940 #950-#988) Themes: - OpenAPI surface: 101 operationIds backfilled (0 codegen warnings), coverage ratchet test + baseline, ErrorResponse/StatusPages shape corrections, auth + user + visualizer + upload-limits routes documented (#705 #967 #968 #971 #974 #978 #979 #982 #985 #987) - Auth: stable AuthErrorCode vocabulary, server-side reserved-username enforcement at registration (#972 #973) - Forum: quote-poasting (nullable quotedPostId, read-time preview, FORUM_QUOTE notification), CommentThreadPage.commentCount (#940 #982) - Media: SHA-256 contentHash duplicate detection on upload w/ backfill pass (#582); tier-readable GET /api/chat/media/limits (#658) - Billing: additive entitlement display fields on UserDto (#563); BullyChat unpaid PENDING_PAYMENT checkout expiry sweeper, ships ARMED, prod population 0 (#936) - Playout: publish the successor Liquidsoap was actually served as nextTrack* (#929) - CI: glibc verify job unblocks build-and-push-staging past the JNA/musl SIGSEGV (#952-#956) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011uF22YswSxmxG38VGNqRH7
-
v1.2.36
protectedRelease: EWBSX backend v1.2.365b9dceb7 · ·v1.2.36 — prod promotion (backend #821, #690, #920–#924, #928): forum orphan-media reaper (report-only by default, backend#922), forum media mkdir ordering fix (#928), tag error envelopes with stable codes (#923/#924), bullychat moderation error bodies (#690), case-insensitive album search + BSON-null-safe album decode (#920/#821), content-hash image reuse in CI (#921)
-
v1.2.35
protectedRelease: EWBSX backend v1.2.354f9fb9a7 · ·v1.2.35 — prod promotion (backend #686–#919): paid song-library requests (Stripe checkout/webhook/sweeper), strict AppJson wire contract + brainrot claim state, device/platform analytics, bullychat reaction rate limit, capability-gated track deletion, bullychat now-playing systemKind, Tauri desktop CORS origins, GitLab Release on v* tags
-
v1.2.34
protectedefe7a2aa · ·v1.2.34 — prod promotion (backend #745–#904) Duplicate-key/upsert correctness — the backend#867 family: #867 tryClaim discriminates 11000 across MongoServerException (the async findAndModify raises MongoCommandException, not MongoWriteException), with non-vacuous concurrent double-claim and fault-injection tests #870 bounded-retry 11000 guard on the three knome_player_state upserts (MAX_UPSERT_ATTEMPTS=3) #874 wire-level invariant that those upsert filters stay pure-equality on userId #875 tryClaimGather pure-equality ensure-doc upsert + upsert:false conditional claim — mongod derives an insert from an unsatisfiable $or, so EVERY cooldown denial was an 11000 round trip (200/200 measured) Tombstone/account-liveness gates (#858/#859/#860/#861/#876): daily badge/unlock sweep, brainrot infection sweep, bumper-heard attribution and media_usage release all gated on live accounts so a deleted account cannot receive badges/XP/notifications or regrow rows. Forum (#880–#888/#893/#886): comment reactor lists, per-poast thread subscriptions, iPhone/HEVC transcode-on-upload plus an admin backfill-transcode for pre-#883 attachments, comment visibility gate and subscription re-enable. Brainrot active-reload retune — NOTE this feature is LIVE on prod (enabled 2026-08-27): #900 scored active-reload offset returned on the claim response #903 gold-band strike 5 -> 7 shards #904 directional gold window, tolerance 250 -> 120 late-side-only BRAINROT_ACTIVE_RELOAD_TUNING_REVISION 2 -> 4, so prod receives revision groups 3 and 4 as a one-shot normalization. activeReloadEnabled is in NO revision group and is preserved. Also: bullychat stranded/band-held PLAYING sweeps (#896/#897) shipping ENABLED but ARMED=false, i.e. dry-run detection only; OpenAPI enum drift tests (#783/#893). -
v1.2.33
protected67ee39e0 · ·v1.2.33 — prod promotion (backend #811–#864) Account deletion completeness (#822/#824/#826/#828/#829/#830/#844/#846/#847/#854/#856/#857): DELETE /api/auth/me unwinds all 22 userId-keyed collections, owner-keyed universe derived from source (87 -> 92 fields) rather than hand-typed, $pull on embedded userId arrays, SYSTEM chat announcements naming a deleted account retracted, and active-account gates so a tombstoned account can no longer regrow listening/profile-stats, knome_player_state, or chat rows. Brainrot (#813/#815/#832/#834/#835/#836/#840/#841/#842/#843): flat 250-shard purge cost then the restored 100/160/250 ladder with shield 80 (BRAINROT_PRICING_REVISION=2), directional sweet-spot tolerance and a ~30% faster active-reload sweep (activeReloadTuningRevision=2), penalty-eligibility endpoint, bidirectional single-slot guard that DEFERS rather than clobbers an in-flight checkpoint, tri-state nowPlayingStatus so a reconciling band no longer reads OFFLINE. Fixes backend#818 (7ec8760): AvatarAssetOrphanSweep.findExistingIds crashed on every boot — the sweep now runs to completion (verified on staging: '4 referenced avatarAssetId(s), 0 orphaned'). Also: klan chat XP-neutral message editing (#864), idempotent $max high-water-mark reconciler (#831), StreamState WS frames with encodeDefaults-on codec (#837), Kommunity ladder re-based to 10,000,000 x1.75 over 20 rungs (#819). MIGRATIONS THAT FIRE ONCE ON PROD: prod's brainrot_config carries none of the new pricing fields (no pricingRevision, no cureShardCost*), so both revision-gated normalizations apply as a forward migration from the old cureBaseShardCost scheme. Nothing admin-tuned is overwritten. PRE-EXISTING, NOT FROM THIS BATCH: E11000 duplicate key on xp_cooldowns userId_eventType_unique (CHAT_MESSAGE) — 21 occurrences already present on the running v1.2.32 build.