Skip to content

Experiment: Prompt optimization - #801

Closed
mrfootoyou wants to merge 9 commits into
ttlequals0:mainfrom
mrfootoyou:feature/prompt-optimization
Closed

mrfootoyou wants to merge 9 commits into
ttlequals0:mainfrom
mrfootoyou:feature/prompt-optimization

Conversation

@mrfootoyou

@mrfootoyou mrfootoyou commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Summary

This is a POC to validate the outcome of using a different LLM prompt philosophy: Short and simple is better (in this case, at least). This PR should not be merged -- the unit tests are destroyed, and the other prompts should be investigated.

Note: The following description is from a previous iteration of the PR and may be inaccurate.

I ran a subset of the benchmarks using 7 low-cost models over 8 podcasts in the corpus (the shorter ones). All models improved significantly, but I'll let @ttlequals0 judge the attached results.

I only modified the ad detection and verification prompts. Both prompts are very similar. Verification has a couple extra sentences describing 2nd pass and ad fragments, but otherwise identical.

I also focused on using index-based addressing since 1) an index requires approximately 1/12 the number of tokens, and 2) they have a smaller cognitive load than timestamps (at least for me) and are almost certainly easier for LLMs to identify and reference.

Prompt Philosophy

  • Simplify LLM's job by asking it to segment and categorize the entire transcript, including main content. MP simply discards the segments it doesn't need.

    • Both Gemini and Copilot claim that this tactic will produce better results since it requires the model to categorize every cue. Could be BS but results are good.
  • Trust that the model understands podcasting concepts and terminology.

  • Avoid multiple choice instructions when one precise instruction will do.

  • Use json_schema recommended by all providers: strict, all properties required, no additional properties.

    Note: The json_schema is not a pass/fail validation schema applied by the provider (we could do that on our own). Instead, it is used by the provider to coerce the LLM's response into the specified format. The schema is used to limit the set of valid output tokens.

  • Describe the full schema in the prompt, including exact field names and enum values. This works for all models and all providers.

  • Omit examples. Turns out they are not needed when the job and schema are simple enough.

  • Use enum for confidence with a small number of descriptive options. I am attempting to solicit less than absolute certainty in the model's confidence. It is not working so far.

  • Tell the LLM it is a "JSON API" to encourage valid JSON.

  • Tell the LMM to return a JSON object, not an array. I got very bad results when asking for an array (even when the json_schema specified an array), but asking for an object works much more reliably.

  • Use a single prompt for both transcript addressing modes. The difference isn't that significant and is easy to describe.

  • Use start and end for both addressing modes. Having two sets of fields needlessly complicates things, and the LLM has no problem putting the cue index in the 'start' field.

  • Use sponsor_name field instead of the 7 or so variants. MP still supports the variants, but the json_schema only supports sponsor_name.

  • Use positive examples and avoid negative ones (e.g. "...that is not an ad", "NOT AD EXAMPLE").

  • Avoid terminology which only make sense to a listener ("voiced by", "tonally distinct", etc.)

  • Avoid unimportant details. For example, the statement "any product promotion for compensation is an ad." The LLM does not know if the host was compensated for the ad, nor does it matter, so just omit that detail.

    Reading the thinking logs is a great way to discover areas of confusion or ambiguity.

  • Don't include instructions which don't apply:

    • Audio signals are only mentioned if they are included.
    • Omit window instructions when only 1 window.
    • Omit window "continues from previous/to next" instructions on the first/last window.
    • Omit audio signals and learned ad positions when using index addressing since that data (currently) depend on timestamps.
  • Omit the common sponsors/brands.

    • I understand why you added these (I think), but it is a waste of tokens, IMO (over 500 token, a full 1/3 of the system prompt).
    • Perhaps we should use the common sponsors list when the Recent/Dynamic Sponsors list is unknown/small, but once that list starts to get populated, the full list of common sponsors is going to be unnecessary most of the time. (I know, citation required.)

System prompt size: (without dynamic sponsors)

Comment thread benchmarks/llm/prompts/2c3e47d5.txt Resolved
Comment thread src/ad_detector/prompts.py Resolved
Comment thread src/ad_detector/prompts.py Resolved
Comment thread src/ad_detector/prompts.py Resolved
Comment thread src/main_app/processing.py Resolved
Comment thread src/utils/text.py Resolved
Comment thread src/utils/prompt.py Resolved
@mrfootoyou
mrfootoyou marked this pull request as ready for review October 1, 2026 12:32
@upmcplanetracker

Copy link
Copy Markdown
Contributor

Are there static suggested prompts or is it dynamic based on # of windows etc?

@mrfootoyou

mrfootoyou commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor Author

Are there static suggested prompts or is it dynamic based on # of windows etc?

@upmcplanetracker Unlike the current system prompt which varies depending on addressing mode, segment detection settings, and start_text instructions (latest prerelease), the system prompt in this PR is 100% static (ignoring comment removal).

The user prompt, on the other hand, is still quite variable, just like the current user prompt. Depending on which features are enabled, the user prompt will have different instructions inserted, including window instructions.

@ttlequals0

Copy link
Copy Markdown
Owner

@mrfootoyou give me some time to review this and test with some additional models. After experimenting with Jev, I ended up with a simpler prompt for ad detection, so there is some evidence this could be simplified. Also, this prompt structure is from about a year ago, and LLMs have gotten significantly better.

On a somewhat related note, have you experimented with which "keep content only" mode vs. the standard of detect ads?

Removes everything the model does not mark as show content. For feeds with unrecognizable inserted ads. Safety checks revert to normal removal when the labeling looks off, but they can miss a single mislabeled stretch and cut real audio. Check each episode.

@mrfootoyou

Copy link
Copy Markdown
Contributor Author

@ttlequals0 Sure, take your time.

I tried "content only" mode briefly but quickly changed back because it did not give good results. I don't remember the details, but I do remember thinking that I must not understand what that mode does.

If you have a paypal/venmo/etc account, I will contribute to the benchmark fund.

@upmcplanetracker

upmcplanetracker commented Oct 5, 2026 via email

Copy link
Copy Markdown
Contributor

@ttlequals0

ttlequals0 commented Oct 7, 2026 •

Copy link
Copy Markdown
Owner

Starting some tests I plan to test these models, the ones I use on my setup, current best and and current worst models.

  • claude-opus-5-5 (my reviewr model)
  • claude-fable-5-1
  • claude-sonnet-5
  • claude-haiku-4-5-20251001 (best, 1 current prompt, F0.5 0.908)
  • claude-opus-5 (older data to compare)
  • claude-opus-4-8 (older data to compare)
  • qwen/qwen3.8-flash (my alternate reviewer model)
  • qwen/qwen3.5-plus-02-15 (best, 2, F0.5 0.865)
  • google/gemini-3.5-flash (best, 5, F0.5 0.851)
  • x-ai/grok-4.3 (best, 6, F0.5 0.847)
  • bytedance-seed/seed-2-1-turbo (worst, 83, F0.5 0.052)
  • mistralai/mistral-small-2603 (worst, 84, F0.5 0.049)
  • qwen/qwen3-8b (worst, 85, F0.5 0.000)

@upmcplanetracker

upmcplanetracker commented Oct 7, 2026 via email

Copy link
Copy Markdown
Contributor

@johnfewell

Copy link
Copy Markdown
Contributor

I ran this prompt (417a039, verbatim) through a separate harness that scores seconds of programme cut rather than matched ad events, in case it's useful next to the F0.5 numbers.

Setup: 26 episodes (This American Life, The Moth, Joe Rogan; 30.7 h) with second-level human labels. Gemini 3.8 Flash, Parakeet transcripts, index addressing, whole episode in one call (no windows, no description, no audio context, none of the sentence re-splitting from text.py), 3 runs. For comparison: my own longer single-call prompt, and MinusPod 2.98.7's full pipeline (1 run, local feeds, so no cross-fetch differential).

This PR Longer single-call prompt MinusPod 2.98.7 pipeline
Programme cut, sponsor only 0 s in all 3 runs 0 s 57 s
Recall of ad seconds 0.967 0.973 0.937
Cost per audio hour ($1.50 / $7.50 per M) 6.9¢ 11.1¢ 26.2¢ recorded

What I took from it:

  1. On ads it holds up. No programme was cut in any run, and recall is within half a point of the longer prompt at about 60% of the cost. Index addressing accounts for most of the saving: less than half the input tokens.
  2. Labelling every line has one risk. The model folds the opening minutes of a story into intro: 0–229 s of one This American Life episode, 0–212 s of another. With MinusPod's default (intro kept) that's harmless, but anyone who sets intro/outro to remove would lose story. Tightening the intro definition (theme and welcome only; the story's opening is main_content) might be worth a try.
  3. The confidence enum carries no signal here either. 497 of 499 non-content segments came back high.
  4. Scoring by seconds could complement F0.5. An event metric at IoU ≥ 0.5 scores a 3-minute false cut the same as a 5-second one. Counting seconds of programme cut makes the big failures stand out.

Caveats: my labels and taxonomy aren't MinusPod's, and it's 26 episodes from three shows. Happy to share the longer prompt I compared against, and to run other variants of this one through the same harness if that's helpful.

@johnfewell

Copy link
Copy Markdown
Contributor

Just saw #824. Our numbers line up once the categories match: my "sponsor only" row hid it. With self_promo included, the #801 prompt cut 374–434 s of the shows' own promos and credits across 30.7 h (3 s for the longer prompt), the same kind of false cut as your ad-free episodes. The intro folding is a separate issue on top of that.

ttlequals0 added a commit that referenced this pull request Oct 13, 2026
Append the 1880 call records and response-shard lines PR #801 ran
under the segmentation prompt variant.

Co-authored-by: John Belcher <[email protected]>
@ttlequals0

Copy link
Copy Markdown
Owner

@mrfootoyou thanks for the work on this. Results are in #824, which adds a --prompt-variant dimension to the harness so both prompts run on the same corpus and scoring. 17 models, 15 episodes (13 with ads, 2 verified ad-free), 5 trials each. Full table: comparison.md.

Short version:

  • Haiku 4.5, the production default, drops from 0.882 to 0.787 F0.5 (p 0.008). Precision fell 0.873 to 0.763; recall held at 0.93. Sonnet 5 and Opus 5.5 show the same shape within noise.
  • On the two ad-free episodes, 13 of 17 models cut nothing under the current prompt. Under segmentation, 12 of 17 cut something, including every Claude model.
  • Bottom-tier models improve: mistral-small +0.688, seed +0.473, phi-4 +0.367, all p < 0.005. None reach the current top tier.
  • Cost per episode falls about a third on Claude models, but the prompt needs a 16384 output budget. At the production 4096 default, three models truncated on nearly every window.

@johnfewell's seconds-cut harness points at the same cause. With self_promo included, this prompt cut 374 to 434 s of the shows' own promos and credits over 30.7 h, versus 3 s for his longer prompt, while sponsor-only recall was fine. The gain is recall on weak models. The loss is precision on non-sponsor categories and ad-free content, and F0.5 weights precision.

Worth keeping from this PR, separate from the classify-everything approach: index addressing, the smaller system prompt structure (strict schema, single start/end, sponsor_name only, no negative examples), and a seconds-cut metric next to F0.5. The confidence enum carried no signal in either harness.

Not merging this as-is. If you want to try a sponsor-only or tightened-intro variant, the harness in #824 can run it, and John offered to put variants through his as well.

@johnfewell

Copy link
Copy Markdown
Contributor

Thanks for the thorough comparison in #824, and for the mention. Following up on index addressing: I reran my longer prompt with one change, numbered transcript lines ([N] text, model returns start_line / end_line) instead of timestamps. Same 26 episodes, Gemini 3.8 Flash, 3 runs:

Timestamps Numbered lines This PR
Programme cut (sponsor + self_promo) 0 s 0 s 0 s
Show's own promos/credits cut 3 s 3 s 374–434 s
Recall, sponsor only 0.973 0.966–0.968 0.966–0.967
Recall, sponsor + self_promo 0.871 0.846–0.866 0.837
Cost per audio hour ($1.50 / $7.50 per M) 11.1¢ 7.1¢ 6.9¢

So index addressing carries most of this PR's saving on its own (input tokens dropped from 3.76M to 1.74M over 3 runs), with recall within about a point and none of the precision loss. One side effect: when credits are skipped, the closing-credits block now sometimes runs over the closing song or music next to it (6–23 s in three or four episodes). That doesn't matter for sponsor / self_promo, but is worth watching if outro is set to remove.

Happy to run more variants through the same harness.

@ttlequals0

ttlequals0 commented Oct 13, 2026 •

Copy link
Copy Markdown
Owner

@johnfewell, that matches the live A/B. MinusPod already supports both modes, and the random setting draws one per detection pass and logs contract compliance and yield per mode. From an instance running random:

Timestamps Segment ids
Passes 1844 1894
Ads kept per pass 6.82 6.90
Kept of proposed 99.0% 94.5%
Dropped, invalid segment id 0 2.3%
Dropped, too long 0.95% 3.0%

The same volume reaches the pipeline either way. Segment-id mode proposes a few more, and the first-line filters remove them. Some are invented IDs, which a timestamp cannot reveal. The rest are spans too long for the window, which fits a wrong end ID that lands in bounds. Your credits block running over the closing music has the same effect at the line level.

That log cannot show what happens next. Boundary snapping to audio cues, the reviewer pass and manual corrections all run after this point, and none of them records the mode. I am adding that stamp in a logging change so hold rate, reviewer adjustment size, and correction rate can be split by mode from the same random draw.

The most useful run from your harness is the numbered-lines variant with outro set to remove, since that is where the coarser edges turn from an overrun into a program cut.

@johnfewell

Copy link
Copy Markdown
Contributor

No new model calls needed for that, so I rescored the same 3 runs. My taxonomy has no separate outro (closing credits share a category with other housekeeping), so "outro" here means credits/housekeeping that starts in the last 10 minutes; earlier housekeeping counts as neutral. For this PR's prompt I used its own outro category directly. Skipped: sponsor + self_promo + outro.

Timestamps Numbered lines This PR (outro)
Programme cut 0 s 27 / 27 / 49 s 258 / 239 / 215 s
Episodes with no programme cut 26 of 26 22–23 of 26 14–16 of 26
Recall 0.861–0.868 0.856–0.865 0.801–0.805

Your reading holds. Every numbered-lines cut is the credits block overrunning into the music beside it: a closing song between the sign-off and the credits on The Moth, and closing music after the credits on This American Life (1–23 s per episode). The same spans recur in every run; run 3 adds one more episode. The PR's outro goes further: Rogan's closing conversation (51 s), a storyteller's bio on The Moth (40 s), and a closing song on TAL.

One caveat: my labels count closing songs and music as programme. If yours treat a closing song as part of the outro, the numbered-lines figure mostly disappears; the PR's doesn't.

@ttlequals0

ttlequals0 commented Oct 13, 2026 •

Copy link
Copy Markdown
Owner

Thanks for rescoring. MinusPod defines outro as closing credits, sign-off, or theme music, so under our labels, most of the numbered lines are intended for removal. The PR's cuts do not collapse the same way. A closing conversation and a storyteller bio are program under any definition, and that is the precision loss #824 measured. Show-segment detection is also opt-in here and off by default, so only feeds that asked for outro removal see any of this. The credits-to-music overrun lands on a silence edge, which is what boundary snapping cleans up after detection. Index addressing stays in.

ttlequals0 added a commit that referenced this pull request Oct 13, 2026
…eparately

The detection runs added for the prompt-variant comparison had regenerated
results/report.md and its charts. That file is the last full campaign and
the next one is weeks out, so it returns to the main version. The
regenerated detection-cell report is kept as results/report-prompt-testing.md
with its own chart directory, labeled as the PR #801 / #824 prompt test.
@mrfootoyou

Copy link
Copy Markdown
Contributor Author

Hey @ttlequals0 @johnfewell. I'm still here, just processing your fantastic feedback (I should have paid more attention in stats class) and trying to figure out what can be salvaged.

  • The clearest win is output compliance. Almost 100% schema compliance w/o examples or json_schema support is huge.
  • Cost reduction via smaller system prompt and segment ids is also huge. Still trying to understand why precision dropped in some cases when using segment ids. I'm guessing the cue gap is useful in some cases (or maybe cue duration, although the LLM can estimate that). Maybe I can include gap info in a clear and compact form.
  • I'm tweaking the category definitions to address the intro/outro oversights (lacking support for "Audio Doc" and "Audio Drama" formats).
  • Attempting to reduce output tokens by merging consecutive segments and omitting unnecessary fields. Less powerful models really struggle with this.
  • I'll also experiment with "sponsor-only" mode to see how that works out.

I'll convert this PR to a draft and rebase with main to pull in the start_text changes.

@mrfootoyou
mrfootoyou marked this pull request as draft October 14, 2026 09:27
mrfootoyou added a commit to mrfootoyou/MinusPod that referenced this pull request Oct 14, 2026
@mrfootoyou
mrfootoyou force-pushed the feature/prompt-optimization branch from 417a039 to 1c18234 Compare October 14, 2026 09:53
mrfootoyou added a commit to mrfootoyou/MinusPod that referenced this pull request Oct 16, 2026
mrfootoyou added a commit to mrfootoyou/MinusPod that referenced this pull request Oct 16, 2026
mrfootoyou added a commit to mrfootoyou/MinusPod that referenced this pull request Oct 18, 2026
- Omit `main_content` segments to reduce output tokens.
- Simplify category descriptions
- Normalizes all segments immediately after transcription:
  - Converts start & end to floats
  - Ensures end >= start
  - Sorts all segments and words
  - Merges word-pairs
  - Ensures words are space-prefixed
  - Ensures segment text matches words.
- Uses a more nuanced algorithm to split transcribed segments into sentences:
  - Supports additional end-of-sentence (EOS) punctuation
  - Supports EOS quotes
  - Improved (but still not perfect) false positive detection
- [parakeet] Use `split_segments_into_sentences` to generate the final transcript segments.
Inserts lines into the transcript prompt describing gaps above a certain duration (1.5s by default), enabling the LLM to reason about long pauses between cues. The first "gap" line includes a description.
@mrfootoyou

mrfootoyou commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor Author

@ttlequals0 @johnfewell I was so confused as to why my real-world results seem to be so much better than the benchmarks suggest. I think I figured out why.

My system prompt is based on the actual transcript data included in the user prompt. In the actual transcript, each cue is a single "utterance", i.e., a single sentence split into 25-word parts. While this transcript format consumes a lot of tokens, especially in timestamp mode, the benefit is that the LLM will almost never encounter a cue which spans multiple topics. Because of this reality, my prompt contains two paragraphs describing how to handle these cues:

MULTI-SEGMENT CUES:
Cues are atomic but they may occasionally contain content from two distinct segments. When this occurs and the segments have the same category (e.g. sponsor), then simply merge them into a single segment (include both sponsor names if applicable). Otherwise, assign the cue to the segment that best represents its primary content.
For example, ad bumpers and in/out cues often appear in main content cues. While we prefer to put these in the segment they bound (usually an ad), in this case you should just treat the cue as main content (always favor main content).

Notice that last instruction: "always favor main content". Now let's look at some of the "utterances" used in the benchmarks:

From ep-andy-and-ari-e774e8022fab. Main content is displayed with strikethrough:

[2073.9s - 2099.3s] if their team can hold up physically against other people, which is a major concern for a fan base. Are you a digital marketer or the owner of a small business? Are you looking for more ways to reach new customers? Well, why not create your own audio app? Like this one you're listening to right now with AudioGo. With access to a professional studio and tons of audience targeting options to choose from.
...
[2865.0s - 2890.3s] Well, that is a good name to hold on to for everybody. But also, let's watch some Oregon State. Because if you didn't see them play against Houston and Texas Tech, you haven't seen it yet. But watch them the rest of the way. And they're actually in the pack. There is a Pac-12 now. They will have games against the other Pac-12, like Boise State, Texas State. It'll be fun. Are you a digital marketer or the owner of a small business?
...
[3014.6s - 3041.6s] Try our experience calculator to see if you could be eligible for course credit and start your comeback today at purdueglobal.edu. Speaking of watching games, George, you had mentioned this earlier, and you're talking about the SEC kind of stealing momentum from everybody because they've had kind of better games on TV. And you got my conspiracy brain thinking because I was like, why in the world?
...
[4344.1s - 4384.7s] Everybody's got to play until they're doing Indy in the TV time house. We'll see you, George. Thank you. All right. Appreciate it. Thanks, George. I chose the bachelor's program at Walden University because I wanted a college that was going to work just as hard as I do. They helped me explore career options and develop the skills I needed to go after what I wanted. They even partnered me with a personalized career coach who drove my job application process so I could become who I always wanted to be.

Just about every sponsor cue includes some main_content in it. So, it is of little surprise that my system prompt's recall score suffers in the benchmarks, yet in real world experience, works great!


I will push my latest iteration. It applies your suggested prompt improvements (intro/outro definitions), discourages output of main_content segments, and better supports multi-segment cues. It also has a couple other "tweaks" I've been working on -- paragraph-like cues (#887), segment-id gap info (#884), and minimal timestamps (#886).

Results
My results in the past two weeks have been amazing -- almost perfect precisions and recall! It held a single false positive the other day, and I've seen no false negatives (knock on wood). I would be very interested to know about other peoples' real-world experience with different podcast genres.

Settings
I'm using parakeet, gemini-3.8-flash (via openrouter), segment ids, segment actions, large windows (often enough for the entire transcript), and ad-detection. I have disabled verification and review, cross-fetch diff, seed sponsors, sponsor database injection, audio cues, and learned ad positions.

Performance
I'm seeing ~10x speed (~1 minute / 10 minutes of audio), or 3-5 minutes per episode. I'm using a GeForce 5070 (16GB) for transcription and Gemini (via OpenRouter) for detection.

Costs
While MinusPod seems to have stopped reporting LLM costs as of 2.100.x (or is it just me?), the most I recorded for a single episode is $0.05 and I think I still had verification enabled at that point, so it is closer to half that with the current settings.

@mrfootoyou
mrfootoyou force-pushed the feature/prompt-optimization branch from 1c18234 to 516fa99 Compare October 22, 2026 08:09
@johnfewell

Copy link
Copy Markdown
Contributor

Thanks for digging into this. I tested it.

Our eval (corpus 1.0 dev) was already on sentence-level cues. The transcripts are Parakeet, split into sentences, median cue 2.4 s. Only 5 of 180 ad boundaries fall inside a cue (26 of 2,518 ad seconds), so mixed cues don't explain our numbers. Your examples come from the #824 benchmark, where the Whisper cues are about 24 s, so I tested it there.

I ran the segmentation-v1 prompt with segment ids and gemini-3.8-flash on all 15 episodes, 3 trials each. One set used the original cues. The other used the same words re-split with your PR's normalize_segments and split_segments_into_sentences (1.0 s gap, 25 s max, the Parakeet settings), with windows regenerated. Everything else was the same.

Original cues Sentence cues
F0.5 0.815 0.780
Precision 0.805 0.757
Recall 0.898 0.931
Ad seconds found 90.3% 92.2%
Non-ad seconds cut per trial 299 464

So you're right that sentence cues raise recall. Every sentence-cue trial found more ad time than every original-cue trial, and Andy & Ari improved. Precision drops more, though, so F0.5 goes down. Most of the extra cuts are self_promo, such as Patreon and merch segments, which the #824 truth files don't count as ads. Whether that's a real loss depends on whether you want those cut. Sentence cues also cost about 20% more in tokens. One thing in your favor: on the original cues, one drink-champs window came back empty in all 3 trials, and it was fine once split.

Worth noting too: in the #824 table, your prompt's recall was already higher than the current prompt's (median 0.904 vs 0.842 across 17 models). The gap there is mostly precision.

In production, I've moved to 90-minute windows after trying your settings on This American Life. Cost per episode went from 31¢ to 10¢, the ads it found were unchanged, and processing time dropped from 26 minutes to under 5.

On costs: 2.100.18 still records them per call for me, in llm_call_usage. The per-episode latestRunSpend field did lag behind reruns, though.

@ttlequals0

Copy link
Copy Markdown
Owner

@mrfootoyou thanks for tracing it to the cue shape, and @johnfewell for testing it the same day.

Where the pieces stand: #884 (gap cues) and #886 (minimal timestamps) are merged and in 2.100.19 and later. #887 is waiting on the rebase down to normalize_segments plus the sentence splitter; the paragraph half stays out because 2.100.21 groups paragraphs in the viewer at read time. Once #887 is merged, what remains unique to this branch is the segmentation prompt and re-splitting Whisper cues into sentences before detection.

On the mixed-cue explanation, John's run answers it for the benchmark corpus. Sentence cues lift recall (0.898 to 0.931) and cost precision (0.805 to 0.757), so F0.5 drops and tokens go up about 20%. The Parakeet side of the eval was already sentence-level, so this is a Whisper-transcript effect. It does not close the precision gap on self_promo and ad-free episodes that #824 measured. Your production results and the benchmark can both be right. You run detection only, with verification, review and the sponsor inputs off, and you judge by what you hear. The harness counts every non-ad second cut, and most of the extra cuts are promos and credits.

The per-mode stamp I mentioned on Oct 13 shipped in 2.100.13, so here is the live random draw since then, same instance as the earlier table:

Timestamps Segment ids
Detection runs 1957 2017
Kept of proposed 99.1% 94.6%
Dropped, invalid segment id 0 2.3%
Dropped, too long 0.9% 2.9%
Reviewer verdicts 105 82
Reviewer adjusted 63% 45%
Mean boundary shift when adjusted 14.2 s 17.1 s

Same volume of ads reaches the pipeline either way. Segment ids lose about 5% at the contract check, the reviewer adjusts them less often on a small sample, and the shift size is similar. No quality gain on this instance in either direction. The saving John measured is input tokens, and the spend ledger does not record the addressing mode, so there is no production number for that side.

On prompt size: a detection window here runs about 11k input tokens, and the system prompt is about 2.6k of that. The transcript is the bulk, which is why #886 went after timestamps first. On native Anthropic the system prompt is also cached for 5 minutes, so with 4 parallel windows it is written once per pass and read three times at the cache rate. Trimming it buys less than the token count suggests. Nothing shows cache hits yet, so I opened #897 to surface them in the LLM and System One stats.

On costs: 2.100.22 still records cost per call. A row that shows as incomplete rather than a dollar figure means the price lookup for that model id failed, and the Incomplete chip on the episode lists the unpriced calls.

mrfootoyou added a commit to mrfootoyou/MinusPod that referenced this pull request Oct 25, 2026
@mrfootoyou

Copy link
Copy Markdown
Contributor Author

Closing PR. I'll the keep the branch around for a while.

@mrfootoyou mrfootoyou closed this Oct 25, 2026
mrfootoyou added a commit to mrfootoyou/MinusPod that referenced this pull request Oct 26, 2026
mrfootoyou added a commit to mrfootoyou/MinusPod that referenced this pull request Oct 27, 2026
mrfootoyou added a commit to mrfootoyou/MinusPod that referenced this pull request Oct 28, 2026
mrfootoyou added a commit to mrfootoyou/MinusPod that referenced this pull request Oct 30, 2026
mrfootoyou added a commit to mrfootoyou/MinusPod that referenced this pull request Oct 31, 2026
mrfootoyou added a commit to mrfootoyou/MinusPod that referenced this pull request Oct 31, 2026
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.

4 participants