Repository navigation
Keep differential ad tails, hold interior cues, operator notes block, UI consistency pass (2.100.22) - #889
Merged
Conversation
ttlequals0
force-pushed
the
fix/patch-2.100.19
branch
from
October 23, 2026 23:05
893ae78 to
ca55112
Compare
3 of 7 tasks
ttlequals0
force-pushed
the
fix/patch-2.100.19
branch
from
October 23, 2026 23:39
71a22b6 to
8ed4172
Compare
… phone UI fixes Same-sponsor folds only extend an end, so a nested LLM span no longer shrinks a cross-fetch differential marker. The reviewer stops an inward trim at a removable template cue inside the span. Per-feed detection notes reach the detector, verification pass and reviewer as their own prompt block outside the description budget. Web UI: Calls by phase table, pattern dialog button recipes and phone wrapping, Feeds header compact actions below 768 px, centered copy icons, 32 px play visuals inside 44 px targets, Cue Matches on the shared play button, System Status without the Stats duplicates, and a "Keep" reject label on non-sponsor markers.
…e play button size
…ogs inside one viewport segment
…tream end An ad that runs into the credits snaps its end a frame or two short of the decoded end (encoder padding puts the last boundary before it). The tail left over is below the two-frame warm-up, and copy_mp3 refused with 'Insufficient final retained audio', so the whole episode fell back to a libmp3lame re-encode: 9+ minutes on an e2-micro versus seconds for the copy. When that tail belongs to the last cut and its end is not locked, fold it into the cut (interval extended to the stream end, applied end = decoded end) and continue; a locked end still refuses. Tests cover both, using a cut on the boundary two frames before the end so the guard is always reached.
A dynamically stitched podcast MP3 can start with a frame that disagrees with the rest (plain stereo in front of joint stereo, no Xing header). ffmpeg's mp3 demuxer logs 'Skipping N bytes of junk' and decodes the file one frame short. The copy keeps that frame too, so both decodes come out short by the same 1152 samples, and the PCM validation refused with 'MP3 decoded duration mismatch', sending a 72-minute episode into a 10-minute libmp3lame re-encode on an e2-micro. When source and copy are short by the same whole frames (at most LEAD_JUNK_MAX_FRAMES) and the copy begins with those same source frames, treat them as part of the decoder skip for the span comparison and continue; every retained span still verifies sample-exact. A cut that starts at the stream start replaces the junk frame with silence and no longer shares the deficit, so that case still refuses. Fixture: one plain-stereo frame spliced in front of joint-stereo frames, skipped if the local ffmpeg does not discard it.
The PCM validation decoded source and copy to 32-bit PCM files first: ~1.5 GB each for a 70-minute stereo episode. On a small cloud disk that is minutes of I/O wait (55% iowait, load 11 on a 2-vCPU e2-micro) and it stalled SQLite for the rest of the app. Every comparison walks both decodes in ascending order, so a forward-only reader over an ffmpeg pipe does the same job with no disk: _PcmPipe advances by reading and discarding, spans are compared chunk by chunk, and the decoded lengths are checked by draining to EOF at the end. The junk-lead-frame detection no longer needs file sizes: the first packet's byte position from ffprobe names the frame the demuxer really started on, for source and copy alike. Same 72-minute episode, same five cuts, byte-identical output: 52 s -> 23 s on an 8-core WSL box, and no temporary files.
…outlines and icon targets
…ples, foldable viewports
…r tags (#888) ffmpeg writes CHAP frame sizes as plain big-endian integers even in a v2.4 tag. Pick whichever reading lands on the next frame header, padding or the end of the tag, mutagen-style. The tag written back stays synchsafe. Co-authored-by: ChaosHat <[email protected]>
…edicate for recut, indexed ad blocks, shared dialog footer scale
…stderr drain; ad block gap matches the merge; recut keeps the transcript guard
…, intro and outro only in the opening window, strict overlap, cue-only eligibility at every call site
…#886 changelog line into 2.100.19
…hipped defaults already covers #886
…nd buttons, one field chrome and label recipe, lucide icons, formatDateTime, percent readouts, stacked feed modes on narrow phones
…; subscriber key actions on btnBase
…d Modal owns header and footer chrome; one duration formatter and a shared sentenceCase; formatPercent everywhere; Stats section links are anchors on the tab strip classes; redundant recipe tokens removed; changelog for 2.100.21
…of being cut; pattern detail stat tiles fit three across on a phone
…itionPlayButton take disabled; score deltas keep one decimal; threshold edits accept whole percents only; Search tabs wrap on phones; contract tests follow the new tab roles and labels
… hours, up to 720, for instances that run only occasionally (#895)
…r, the three API checks and the frontend; resolver takes the podcast row and clamps; integer-only commits on both fields
…hones; only the five-control Ad review card wraps
…tail and at a differential-measured edge; a labelled boundary cue still governs its own edge
… lookup and a measured-edge helper
… of a new connection and DNS lookup per call
This was referenced Oct 24, 2026
…n row, tab wrap, and examples for the new recipes
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.
Why
Three detection reports, seven open issues, a batch of phone layout problems and the foldable-phone viewports, shipped as 2.100.19. A second round on the same branch, 2.100.20, fixes what a UI audit found after the first deploy. A third, 2.100.21, applies the full audit. A fourth, 2.100.22, fixes two things 2.100.21 got wrong. #886 and #894 are already on main.
Closes #874, #875, #876, #879, #888, #891, #895.
What changed
Verification
PYTHONPATH=src pytest tests/(12246 passed, 2 skipped) andruff check src/ tests/pass.npx tsc --noEmit,npm run lint,npm run test(158 files, 1883 tests),npm run design:checkandnpm audit --audit-level=highpass. The browser contract suite passes on the four Chromium projects (34 tests).