port: the runtime now says what the voice export is missing, at the moment it plays it

The manifest has carried the gap for weeks and the runtime printed '+ voice ADV'
and nothing else. A reader of manifest.json gets a paragraph; a person LISTENING
gets clean dialogue and no way to learn a stream is absent. NEW GAME already
announces the screens it jumps over; audio had no equivalent.

ManifestAudio gains  -- one line naming what is KNOWN missing, absent
meaning nothing is known rather than nothing is wrong -- and MenuAudio carries it
so _play_video can print it. Verified on the boot's ADV and P7's S00A.

The first version of the message was FALSE for one of the two assets: it said
'one is a start-truncated stream', which is ADV's story, where S00A's dropped
chunks are digitally silent. Caught by reading the output for both, which I
nearly skipped because the ADV line was obviously right. Now states the counts
and points at the entry's why.

A message generated once from a template but true only for the case it was
written against is harder to see than a wrong number -- the sentence is
well-formed and confident in both places.

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 08:49:25 +00:00
parent 507155422b
commit 64b76b0892
4 changed files with 90 additions and 1 deletions

View File

@@ -543,6 +543,17 @@ func _play_video(name: String, skippable: bool) -> void:
# would be authoring a sync constant nobody measured.
if audio.play_voice(name):
print(" + voice %s" % name)
# 🔴 SAY WHAT IS MISSING, at the moment it is played.
#
# The manifest has known the voice export is incomplete for weeks and the
# runtime did not repeat it. That asymmetry is the dangerous one for
# audio: a reader of `manifest.json` gets a paragraph, and a person
# LISTENING gets clean dialogue with no way to learn a stream is absent.
# The same principle already governs NEW GAME, which announces the two
# measured screens it jumps over rather than skipping them silently.
var gap := audio.incomplete_for(name)
if gap != "":
print(" 🔴 KNOWN INCOMPLETE: %s" % gap)
else:
# Said out loud: silence is the audio failure that looks like success,
# and "this cutscene is unvoiced" is a real answer for most of the disc.