port: move to formats-pin-2026-08-30 -- the voice export is complete

The late start was a second condition on the start filter, end - s < 1_500_000,
only within one bank. ADV's predecessor trailer sits 3618816 B before end, so it
was rejected and start fell back to anchor, a TOC offset rather than a stream
boundary -- which is why it hit regions over 1.5 MB and never single-stream ones.

ADV region 3114352 -> 3618816 B, streams 2 of 3 -> 3 of 3, complete, dropping
zero chunks. S00A 1 of 3 -> 2 of 3 with the third digitally silent. The runtime
no longer prints an incomplete line for either.

Also fixes the warning crying wolf: S00A still read KNOWN INCOMPLETE over a
93.694 s stream of exact zeroes. Exported gains content_waves and the warning,
console line and manifest field all key on kept < content rather than kept <
present. Second time in two iterations this warning was wrong in the cautious
direction -- over-warning is what makes the next real warning unreadable.

S00A is a second movie in the predicted direction: kept went 1 -> 2 because a
chunk that was a different duration now matches at 93.694 s. Not independent
ground truth, but a different asset and the outcome was predicted first.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
This commit is contained in:
Sylpheed port agent
2026-08-30 09:09:49 +00:00
parent 90ea61b472
commit 2712efe2f2
5 changed files with 69 additions and 7 deletions

View File

@@ -81,7 +81,7 @@ license.workspace = true
# geometry -- does NOT reach this port from here: `sylpheed-cli` builds from the
# WORKSPACE crate, so the reference renderer stays unrotated until the tag lands
# on `main`. This bump is for the parser, not for the renderer.
sylpheed-formats = { git = "https://git.mc02.dev/fabi/Sylpheed.git", tag = "formats-pin-2026-08-29d" }
sylpheed-formats = { git = "https://git.mc02.dev/fabi/Sylpheed.git", tag = "formats-pin-2026-08-30" }
serde = { version = "1", features = ["derive"] }
serde_json = "1"

View File

@@ -208,6 +208,12 @@ pub struct Exported {
/// Exists so a "known incomplete" warning fires on the gap and not on the
/// mere presence of more than one stream.
pub kept_waves: usize,
/// How many of `sub_waves` carry SIGNAL. A dropped stream that is digitally
/// silent is not missing content, and a warning that fires on it is crying
/// wolf: `S00A`'s third chunk is 93.694 s of exact zeroes, so dropping it
/// costs nothing and saying "KNOWN INCOMPLETE" over it would train a reader
/// to ignore the one case that means something.
pub content_waves: usize,
/// What the runtime should do at the end of the file, where that was
/// authored. `None` on a cue: a cue ends.
pub loop_mode: Option<String>,
@@ -353,6 +359,7 @@ pub fn export_cues<S: DiscSource + ?Sized>(
loop_mode: None,
sub_waves: 1,
kept_waves: 1,
content_waves: 1,
});
}
Ok(done)
@@ -523,6 +530,7 @@ pub fn export_bgm<S: DiscSource + ?Sized>(
loop_mode: spec.r#loop.clone(),
sub_waves: staged.len(),
kept_waves: 1,
content_waves: 1,
}))
}
@@ -915,6 +923,7 @@ pub fn export_voice<S: DiscSource + ?Sized>(
loop_mode: None,
sub_waves: riffs.len(),
kept_waves: staged.len(),
content_waves: riffs.len() - silent.len(),
}))
}

View File

@@ -457,7 +457,7 @@ fn run_export(disc: &Path, out: &Path, authored_dir: &Path) -> Result<()> {
// export is known to be missing audio the game plays, and
// the failure sounds like success: one stream decodes to
// clean dialogue, so nobody listening finds out.
if a.kept_waves < a.sub_waves {
if a.kept_waves < a.content_waves {
warnings.push(format!(
"{}: KNOWN INCOMPLETE. This region holds {} streams and the RUNNING \
GAME DECODES ALL OF THEM CONCURRENTLY (Canary --xma_param_probe: \
@@ -477,7 +477,7 @@ fn run_export(disc: &Path, out: &Path, authored_dir: &Path) -> Result<()> {
describe(&a),
a.kept_waves,
a.sub_waves,
if a.kept_waves < a.sub_waves { " -- KNOWN INCOMPLETE, see warnings" } else { "" }
if a.kept_waves < a.content_waves { " -- KNOWN INCOMPLETE, see warnings" } else { "" }
);
audio.push(ManifestAudio::from(a));
}
@@ -517,7 +517,7 @@ impl From<audio::Exported> for ManifestAudio {
why: a.why,
peak_dbfs: a.peak_dbfs,
duration_s: a.duration_s,
incomplete: (a.kept_waves < a.sub_waves).then(|| {
incomplete: (a.kept_waves < a.content_waves).then(|| {
format!(
"{} of {} streams. The running game decodes all {} concurrently. \
Nothing in the audio reveals the gap -- what plays is clean dialogue. \