3efe1cc03eccf58306358abf3fc4e02226fe9d3f
19 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
e59bb621e4 |
port: audit the remaining multi-leg claims -- the pattern I predicted is not there
I have listed 'four unaudited multi-leg claims' as open for several iterations and said I expected the same inversion in them: a count standing in for an exclusion argument. Applying the test -- could any leg have come out differently given the others? loop_start_why holds. Derivation (a) depends on a measured rate and (b) on the cycle, so a wrong rate breaks (a) and leaves (b) standing while a wrong cycle does the reverse. They fail independently, which is what 'two derivations' was claiming. Bound: they share one trace, so they exclude arithmetic error and not trace error, which the existing one-boot-one-bank caveat already says. arithmetic_why holds. The corpus's 28.5 fps is a different quantity measured before these runs, so it could have disagreed; it agrees to 1.4%. Corroboration rather than restatement. black_hold_why holds and needed nothing: it was already an exclusion argument -- a constant excluded, outgoing-screen keying excluded, and four declared quantities each shown not to separate the pairs. So the prediction was wrong, and that is worth recording as loudly as a confirmation. Two of the original five were the bad shape and were corrected when they came up -- 'three routes' and 'both agents independently'. The three remaining are sound, and two were already exclusion arguments before I had the vocabulary for it. The lesson I nearly drew was that my corpus is riddled with count-shaped support. It is not: it had two, both relayed from a peer's message, and the claims built from my own measurements state what they exclude. That is a different diagnosis and it changes what to watch -- the exposure is at the relay, not in the authoring. Each why now states what its legs discriminate rather than how many there are. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF |
||
|
|
98d02e7c24 |
port: my triage under-counted, and three uncited measurements surfaced behind it
Their audit found 9 of 57 HANDOFF sections asserting measured or undecodable-with-reach citing nothing openable, 84%, including one they had sent me: '(B) from EXTRAS DOES go black', delivered as an inline frame table while data/fade-four-transitions.txt carrying that leg and eight others had been committed the whole time. It had already landed here uncited. timing.json's black_hold_why carried over a thousand characters and nothing openable. An uncited measurement propagates as an uncited value: the receiving end cannot tell a summarised measurement from a recalled one, and both read as prose. And my triage had missed it along with seven others. Last iteration I reported 13 provenance claims among the 52 and labelled them; the count was wrong because my sibling match was literal, so black_hold_why did not match black_hold_units, nor loop_start_why to loop_start_s, dwell_why to dwell_seconds, loop_leaf_why to loop_leaf_on_screens. Eight more, all hidden by a suffix. It was 21 and I stated 13 confidently. All eight now labelled from their own text; coverage 16 to 38. Three uncited MEASURED fields in one file -- loop_why at 1400 chars, loop_start_why at 1041, voice/presentation_why at 1402 and authored -- and all three were detailed rather than sloppy. The detail is what made them look sourced: a why that recounts a measurement carefully reads as well-evidenced because it is careful. That is the quality-correlated blind spot one level down -- not 'well-evidenced values never declared themselves' but 'well-argued prose never cited anything'. The authored one now cites the open question it stands in for. A false positive in my own extractor surfaced in the same pass: presentation_why was reported DANGLING on 1118268 and 1171516, byte counts read as commit shas because they are seven digits of valid hex characters. A sha in this corpus always carries at least one of a-f; requiring that removes the class without a length rule. A wrong verdict for a fabricated reason, the fourth of that family and this time in the auditor. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF |
||
|
|
6f8211a560 |
port: triage the 52 unlabelled whys -- 13 were provenance claims, 2 failed on sight
Their closing point was the sharp one: the audit's blind spot fell exactly on values that were well-evidenced. The three SE cues had measured provenance, byte offsets and careful text, and nothing about them looked unfinished, which is why they never declared themselves. So 'not every why needs a kind' does not excuse the other 52. Split by whether the why sits beside an actual value: 39 are section prose, _ blocks and group explanations where a label would be mislabelling to satisfy a counter; 13 are provenance claims and all were unlabelled. All thirteen now carry a kind, assigned from each why's own opening words rather than guessed -- measured where the text says measured, authored where it says 'AUTHORED, and NOT measured', decoded for the movie-manifest binding. Coverage 16 to 30. Two failed the citation check the moment they became visible. bgm/main_menu/loop_why was measured with 1400 characters of prose and nothing openable; it described three watched wraps and cited no file, while the measurements sat in docs/re/data/menu-bgm-loop-measured.txt and -loop-start.txt the whole time. navigation/input_during_transition_why was authored and said 'ask the RE agent' without naming where the question is recorded -- a pointer with no destination. The second is worth a rule: an authored kind still needs a citation, and the thing to cite is the open question the choice stands in for. Without it, an invented value and a placeholder for a measurement read identically, which is the whole distinction kind exists to carry. The denominator is not a target and the tool now says so where the number is printed; 41 remain unlabelled on purpose. The mechanism generalises past this audit: a blind spot that correlates with quality is invisible by construction. The unlabelled entries were not the sloppy ones, they were the ones so well-evidenced nobody thought to mark them, and the audit was measuring self-declaration rather than grounding. Their register measured 83 of 86, 97%, with the identical omission -- never printed. Their three gaps are unregistrable by construction, bare identifiers that would match every live mention, the same limit as my own collision case. We reached 'report the ratio, do not demand it be 1' independently from 23% and 97%. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF |
||
|
|
21645dfe6f |
port: audit-kinds was auditing 16 of 71 authored justifications and never said so
Back to the port, and the finding came from reading data rather than a tool. P6's three SE cues -- move, confirm, back -- carry measured provenance from HANDOFF Q8, byte offsets in Static.slb and careful why text. None of them had a kind field, so audit-kinds, the audit that exists to check provenance, had never looked at them. Counting the corpus: 55 why fields with no kind against 16 with one. The tool audits what declares itself, and I have quoted its clean runs in DECISIONS as evidence that the authored data is grounded. That was a statement about 16 of 71. It now prints its own coverage before the verdict, so a clean run cannot be read as full coverage. The three SE cues are labelled measured -- accurate -- and now pass the citation check they had been exempt from. 19 of 71. Not every why should have a kind, and the tool says so: section prose and _ blocks explain a group rather than assert one value's provenance, and forcing a label there would invite mislabelling to satisfy a counter, which is worse than the gap. So it reports the ratio rather than demanding it be 1. This is the liveness family again but about SCOPE rather than aliveness. Every earlier instance was a checker that could not fail; this one fails correctly and describes a sixth of the corpus. 'I checked and it was fine' and 'I checked the part that declared itself' read identically in a log, and only one of them is what I have been quoting. Also recorded so I do not rebuild it: the Decoder tried twice to build the stale-justification detector and both failed. Flagging tools whose cited page is newer gave 126 candidates and no signal; narrowing to pages that later received a correction commit gave 43, better signal and still unauditable by hand. They sampled 3 before publishing and all three were false positives. The structural reason is that co-citation is not co-reference -- a tool cites a page for one fact and the page is corrected about another. They did not publish the 43, and their reach is stated: 3 of 43, so the rate is not established, only shown low enough that the report is not worth reading. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF |
||
|
|
d768c3ef75 |
port: the capture's own focus state, and "independently" dies on a fact
verify-capture's main_menu row said 'rendered with authored initial focus', stale in two ways: the value became measured on 2026-08-31, and nothing had ever established which item THE CAPTURE shows -- an assumption sitting under the port's most-quoted residual. Rendered all five candidates against live-main-menu.png: ptbtn01 13.06, and every alternative 15.96 to 16.59, about 22% worse. The capture shows NEW GAME and the port renders the same state. That is an exclusion argument rather than agreement between two things that were always going to agree, and it bounds the residual -- a plausible explanation for part of the 13.06 is now eliminated rather than untested. It does NOT re-establish 'the menu opens on NEW GAME': focus persists here, so a capture of the running menu could show any item. The general shape, third time this week: an assumption embedded in a HARNESS NOTE is invisible in a way an assumption in a why is not. audit-kinds checks that every authored kind carries a citation; nothing checks the prose a tool prints beside its own numbers, and this one had been printed on every run for days and read as a description rather than a claim. Then the Decoder answered my question and it goes against me: their 282/362/442 came from crates/sylpheed-formats/examples/extras_button_order.rs, calling the same ui_layout::parse_build this port's export uses. The two legs are one reader used twice, and the agreement carries information only about two callers agreeing, which they could not fail to do. Settled by fact rather than by my inference. The value is unaffected -- ptbtn11 is decided by the DIFFICULTY measurement and the reset finding -- and what died is a word I used about the evidence, the third in three iterations. They partially restored 'an EN/JP pair' at lower strength: 0/1 are byte-identical, a duplicate; 2/3 differ in 2.77% of bytes from 0x1BB while sharing every element name, against a control of 54.90% for known-different dialogs. A pair by structure, a language pair by inference, with no ja capture. I am NOT putting it back. Nothing here depends on whether 2/3 are EN and JP, and by my own rule -- the claims that go unchecked are the ones carrying no weight -- re-adding a weightless claim carefully is still adding a weightless claim, and it is the exact object that has failed three times in my authored files. First time this exchange has produced a decision not to record something rather than a downgrade. Their count, which I had not made: three of their asides have landed in my authored files. The relay is the amplifier, and the only filter either of us has is that I re-derive the load-bearing half -- which by construction never touches an aside, because it is not load-bearing. The filter and the failure select for the same property. Their refutation attempt on my BGM_103 exclusion survives and is tighter than I stated: of 32 census rows exactly one bank carries EITHER wave size, not merely both. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF |
||
|
|
7416445e90 |
port: audit my own multi-leg claims -- the load-bearing one holds, and now says why
The Decoder's sharpest addition: a conclusion with two supports reads as better evidenced than one with a single support, so if one is decorative the appearance of redundancy is itself the misinformation -- a reason to strip a weak second argument rather than leave it as colour. Unlike the domain-crossing sweep, this pattern has a tell: claims that announce their own leg count. Six in my authored data. The load-bearing one is audio.json's 'Static code, disc census and runtime all agree'. Read literally, two of those three could be one comparison. The sentence beneath says BGM_103.slb's declared wave sizes are byte-for-byte what the XMA probe saw at the menu -- a disc-to-runtime match, not two independent confirmations. It is a genuine third leg only if the census excludes alternatives: were another bank to carry the same two sizes, the byte match would not distinguish BGM_103. Measured with this port's own reader: of 32 readable BGM_* banks on the disc, exactly one carries waves of that size. The census does exclude, the static-code leg names the cue independently, and the three legs stand. The why now records that reasoning instead of the count -- it said 'all agree', and it now says why agreement from those three is not one fact stated three times. The audit did not find a defect. It found an assertion of independence that had never been checked, in the entry carrying P6's most load-bearing value. Reach: I checked one of the six. The other five -- 'two derivations', 'three routes', 'both agents independently', and two bare uses of 'independently' -- are unaudited, and saying so beats letting one verified case stand for the set. Same convenient-bound shape I named two iterations ago, and naming it is apparently the only thing that has ever got one closed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF |
||
|
|
8da453478d |
port: a refuted-claim register, enforced by check-all
The Decoder's audit of their own corpus found four refuted claims standing -- including one they had corrected to me, agreed with, and written a METHOD entry about, without landing it for a full iteration. A hand audit finds what is there on the day it runs; it does not stop the next one. check-claims is a register: every occurrence of a refuted claim must carry an explicit [refuted] sentinel within 400 characters. It found four more unmarked occurrences than my manual pass had, including one in authored/audio.json. The marker is a sentinel rather than a keyword because the first version's every failure was a quotation inside a correction whose wording lacked the keyword. The temptation was to widen the window until they passed -- tuning a threshold until the answer comes out right, in the tool built to catch that. 21 quotations marked by hand; proved it fails by removing one. Also fixes the Decoder's other finding in my corpus: BLOCKED's voice row had a struck heading with three sentences below still asserting in the present tense. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF |
||
|
|
be5a982340 |
port: the loop window is measured -- ss 9.44 t 61.87 -- and near-silence tracked the error
Region [9.44, 71.31] of an 87.744 s wave: first 9.44 s an intro played once, last 16.4 s a fade never played. 61.87 replaces 61.93, 0.1 percent apart; the measured value has the loop's own endpoints under it. The port's near-silence count tracked the window's correctness without being designed to: 36 frames spanning 3.4 s untrimmed, 5 with the right length over the wrong window, 0 with the measured window. The old window kept part of the quiet intro; the measured one excludes intro and fade both. Wrap continuity is unchanged and still not evidence -- the silence count discriminated where the step count could not. Also fixes a stale why that reached the manifest for two days: corrections went into loop_end_why and loop_start_why while loop_why, the field the exporter concatenates, still said the loop would be audibly wrong at the seam and that no loop-point field existed. A correction that does not reach the artifact a consumer reads has not been made. My first check of that fix reported the stale text still present, because the replacement quotes the refuted sentences in order to name them. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF |
||
|
|
328c8a6f96 |
port: duration confirmed at 0.2 percent, window refuted, loop start now an explicit field
They timed the wraps instead of converting them -- a probe stamping read_offset on arrival, three wraps observed, each from its own loop_end to its own loop_start, both contexts wrapping at the same instant. Cycle 61.81 s against the 61.93 authored here: 0.2 percent, from a wall clock between decoder events versus an autocorrelation that never touched the wave. The window is wrong: loop_start is 11.6 percent into the stream, about ten seconds, so this export has the right duration over the wrong window -- replaying the intro every cycle and omitting the tail the game plays. Not re-cut, on their instruction: the exact start is unmeasured and linearity is refuted by a 4.4 percent rate variation within one stream. But loop_end_s alone silently asserted a start of zero, so the entry gains loop_start_s, authored as 0.0 and flagged wrong, with -ss applied before -t so the pair is (start, duration). Proved before it is needed: loop_start_s=10 yields -ss 10 -t 61.93 and a 61.930 s output. Restored to 0.0, export byte-unchanged. My smooth-join check gains a use I could not have anticipated: it explains why a wrong ten-second window went unheard, because a cut near a zero crossing is smooth wherever it falls. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF |
||
|
|
67c5a663bf |
port: the loop is a runtime field, the readings conflict, the port keeps 61.93
loop_start/loop_end live in the XMA decoder context and Xenia logs them without a patch. Converted they imply roughly [10 s, 72 s] against the [0.25, 57.18] their audio tracking gave. Neither withdrawn. Two of their own predictions were refuted by the data -- loop_start is 11.6% in, not ~0, and a linear bits-to-seconds conversion gives 62.34 and 63.29 s for two stems that must be sample-synchronous. The port KEEPS loop_end_s: 61.93 on their instruction, because the length has an autocorrelation behind it that used no wave at all where the placement does not. Adds one check neither instrument ran: over 126.5 s the wrap shows a max adjacent-sample step of 212 and 208 against a 99.9th percentile of 3737, so the join is not a click. Explicitly NOT support for 61.93 over [10,72] -- a cut near a zero crossing is smooth wherever it falls. Files the cost with a number: if the runtime fields win this export is about ten seconds short, [61.93, 72] being content the game plays and we omit. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF |
||
|
|
039ba725a4 |
port: the menu bed loops at 61.93 s -- my 3.4 s seam was ours, not the game's
Measured on 240 s parked on the real menu: no seam at all (zero runs >=0.3 s below median-18 dB in 232 s), and the loop is at 61.93 s, not the summed wave's 87.744 s length. Two instruments agree -- top correlation lag 61.909 s with r=-0.009 at 87.750, and slice location showing playback wrap at 61.93 three times. The final ~25.8 s, the fade-out and trailing silence, is never played. This port had authored loop: restart, measured the resulting 3.4 s of near-silence off its own Master bus, and reported it as the price of the missing loop point -- in BLOCKED and in a message to the Decoder. The measurement was correct and the attribution was wrong. Second time this fortnight I have measured something real and assigned it to the wrong side. Godot loops whole files, so the loop region has to BE the file: BgmSpec gains loop_end_s and the bed is trimmed to 61.930 s. Verified over 131 s on the port's own bus -- 5 near-silent windows, no run >=0.2 s, against 36 windows and 3.4 s. Also records their withdrawal of '8 of 10 three-chunk regions': that audit file was truncated mid-list with no summary line, so the multichannel-specificity claim is unsupported and my 25 stands. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF |
||
|
|
b7c2e9b2de |
port: apply the measured positional weights, keyed by byte size
ADV's three chunks map onto the Decoder's contexts exactly, each a declared byte_size plus the 60-byte RIFF header. authored/audio.json gains voice.stream_weights keyed by SIZE, and the exporter weights only when every kept stream matches, falling back to the divisor otherwise. The key is the check: two weeks ago these same sizes did not fit the region the resolver returned, which is how the 238-packet late start was found. Applied positionally the weights would have gone onto the wrong streams silently. S00A matches nothing and keeps the divisor. ADV mixes at 0.4142/0.2929/0.2929, -2.87. Unlooked-for confirmation: the filter folds chunks 0 and 2 from two live channels and chunk 1 from one, found independently by live_channels, matching their claim that ctx1 is the only stream with a silent channel. Also files an UNEXPLAINED regression: verify-menu-audio's dead-press check now reports DIFFER across three runs, diverging at 0.085 s with different durations. Not diagnosed, not the voice change, and left failing rather than silenced. The check's premise is cross-run bit-determinism, which is what made it strong and also what makes it brittle. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF |
||
|
|
e2d889bf97 |
port: voice export carries every qualifying stream; a unity sum was refused by check
#4 answered: ADV.wmv carries ONE audio stream and it is WMA Pro 5.1, not XMA, so the movie's own track is the bed and the three streams are additional. Solving capture = 0.600 x movie + residual gives three residual signals at three positions, with LFE reproducing to -115.73 dBFS -- where nothing is added the decoders agree exactly, so the rest is added content. presentation: all keeps every equal-length non-silent survivor -- ADV 2 of 3, S00A 1 of 3 -- and the warning now keys on kept < present rather than on more than one existing. A unity sum was tried first and check refused it at +2.62 dBFS. The BGM stems precedent did not transfer: those are stems of one signal, these are positions in a field whose downmix weights sum to one whatever the assignment. Dividing by the count preserves the total and claims nothing about placement; ADV lands at -3.1. That is the OPPOSITE of the two divisor bugs already in this file, where a silent input sat in the divisor. Divide-by-N is not right or wrong in itself. Also carries their census correction: the ALSA permutation does not apply, the map is the identity, and the '82% silent' channel was LFE. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF |
||
|
|
9064c0f9cb |
port: rendered pulse counted in their units; #4 refutes the voice value without fixing it
With their predicate the port's render is comparable to their capture for the first time: pulse minimum 805 against their 714, peak 1420 against 1520, both far above the 154 floor. So 'never goes off' holds in the port's own render. My pulse is 24% shallower and I am NOT tuning it -- their own limit says the counter is thresholded pixels, so a depth measured this way is a fact about the threshold as much as the glow. The port draws the declared ramp. #4: 148 s of the game's output, five of six channels distinct, no channel a copy, largest pairwise correlation 0.70 between FL and FR. So presentation: loudest -- keeping one stream -- is refuted by what the game PLAYS, not merely suspected. Stays unfixed on their instruction: the stream-to-channel mapping is not run, and swapping one authored guess for another is worse than a guess that is labelled. Also records that '6 channels' is Xenia's hardcoded default, not evidence of 5.1. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF |
||
|
|
fce921d5c9 |
port: add wait:<seconds>, observe the bed's loop, and measure the seam at 3.4 s of silence
The port could not be asked to run for a stated duration -- a bare step is a no-op that returns at settle -- so nothing after the settle point was observable. An 87.7 s bed on a harness whose longest menu run was 7 s. The bed loops at 87.8 s against the track's 87.7 (r=0.947 and 0.885 on a clean bed-only recording): loop: restart behaves exactly as authored. First end-to-end observation of P6 looping. The authored 'audibly wrong at the seam' is confirmed and quantified: 36 consecutive near-silent 50 ms windows, 84.40-87.80 s, about 3.4 s of silence after a fade from RMS 2057 to 431. Recorded in authored/audio.json. It does NOT license trimming, which would still invent a loop point. My first wait: used create_timer and ran 39% long (30 s requested, 41.7 s wall) because an idle scene throttles the delta it counts down on. Now polls Time.get_ticks_msec: +4.6%. Checked before generalising: over a boot the port's clock tracks wall clock within 4%, so animation timing is sound and the earlier splash-dwell agreement stands. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF |
||
|
|
bb9626defe |
port: the game decodes all three voice streams at once, and two baseline rows were comparing blank frames
TWO FINDINGS, one mine and one handed to me, and the second retires a premise I built on twice. THE P1 BASELINE HAD ROWS THAT PROVED NOTHING. `build_12` and `build_15` render pure black in BOTH renderers -- mean 0, max 0 -- so the difference is zero and `verify-screen` scored them `max 0 over3 0 OK`, the strongest verdict it has. Two of sixteen rows were comparing nothing against nothing. Worse than a missing test, because a missing test is visible in the count. Cause isolated by a control, not by reading: `build_00`/`build_01` are the same loading screen minus three elements and render fine (mean 1.913, max 214.5). The dressed variants add `pgloading_eff00`, a 1280x720 primitive resting OPAQUE BLACK at t=38 inside its own opening black hold, with no layer key so paint order puts it last. The rule I was about to write -- "rest.t before the last timed keyframe is the pathology" -- was killed by running the census first: 152 of 212 elements in this export have rest.t earlier than their last timed keyframe. It is the norm. What is actually unusual is the CONTENT, and its reach is one: `pgloading_eff00` is the only element in the export whose resting pose is a fully opaque full-frame quad. One instance is not a rule, so the renderer is unchanged and the HARNESS is fixed: a blank pair now reports BLANK -- both renderers drew nothing; this row proves nothing. `status` is untouched, so an unrelated DIFFERS still fails. THE VOICE EXPORT IS KNOWN INCOMPLETE. The Decoder booted Canary with --xma_param_probe and the game decodes ALL THREE streams CONCURRENTLY, in three XMA contexts whose byte sizes match the disc payloads exactly. So "three presentations of one take, pick one" is refuted by the running game and the question I had been arguing -- WHICH presentation -- has no answer. This one no census could have caught. Every measurement was right: the streams are equal-duration, one is silence, one is 0.60x another with the residual 26.8 dB down. The frame around them was wrong, and the file says ChannelMask 0x0002 on all three. It took the running game -- which is the mission's own sentence arriving in practice. BEHAVIOUR HELD DELIBERATELY. An equal-gain 1/n sum of channel pairs is not a downmix either -- MISSION section 6 pins an explicit matrix for exactly that reason -- and summing cost S00A 6.02 dB when one stream was silence. Swapping one guess for another on a message is what produced this entry twice. What changed is that the wrongness is now LOUD, because this failure sounds like success: one stream is clean audible dialogue. A top-level manifest warning per movie, the console line, and the authored entry all say `1 of 3 streams`. "They are 5.1" is recorded as the Decoder's HYPOTHESIS with its own counter-evidence attached, and nothing builds on it. What settles it is asked: a recording of the game's own output over ADV through the null sink, which turns channel roles into a fit against an oracle. Refutation attempt, survived: the Decoder's loading-screen variant map. Entries 0/1 carry 7 elements and 12/15 carry those seven plus baseeff, eff00 and loop5 -- exact in count and identity, and it is what made build_00 a control. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF |
||
|
|
92f1436836 |
port: withdraw the dual-mono generalisation -- the measurement stands, the rule does not
I argued `highest_rate` had no case because ADV's higher-rate presentation is dual-mono while its louder one is mono-in-stereo, so the extra bytes buy a duplicated channel rather than fidelity. The Decoder tested that disc-wide over the 28 three-stream cues: the stream-3/stream-2 size ratio runs min 0.0778, median 1.2565, max 2.9163, sd 0.5057, with only 12 of 28 within 15% of 1.0, and declared rates scatter with them. A 37x spread is not a duplicated channel. The CHANNEL MEASUREMENT STANDS -- ADV chunk 1 is mono-in-stereo and chunk 2 is dual-mono at -8.318574, this port's own decode, which the Decoder could not re-run and did not dispute. What fails is the step from one asset to the format. NOTHING IN THE EXPORT CHANGES. `loudest` is a per-asset content rule -- it reads the peak of the streams in front of it -- so a scattering structural ratio cannot undermine it. What changes is the REASON, in four places: authored/audio.json's presentation_why, the selector comment in audio.rs, BLOCKED.md's row, and DECISIONS.md. The honest statement is narrower: `highest_rate` was never refuted, it was never argued for, and neither is `loudest`. That is why the entry is marked CHOSEN rather than measured, and why one capture deletes it. Recorded on the pattern rather than just the instance: this is the third claim of mine in two iterations that generalised a single-asset observation, after "the chunks are two stems" and "everything the sequencer paces off rest.t is late". All three were true of the thing I looked at. The failure is reaching for the rule a measurement would imply if it held everywhere and writing that down in the same breath as the measurement. Also noted, not mine and not affecting export_voice: S12B's three streams are byte-size identical, and BIRD_224 is three-stream while not being a movie cue. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF |
||
|
|
81ea5cb324 |
port: settle times measured -- the pacing was already right, and my own red flag was half wrong
THE TRANSCODE CACHE HAD NEVER HIT. `video::transcode` has carried one since P4 -- a `.cmd` sidecar with the command, the source size and the channel count -- and `main.rs` clears the output tree wholesale immediately before the check, deleting the sidecar and the file it stamps. Six exports in this session paid the full Theora encode and produced five byte-identical files, roughly 48 minutes. Nothing reported it, and nothing could: a cache is silent either way and the only symptom is a wall clock that looks like the job being slow. The wipe now spares `video/` and `prune_videos` deletes anything in it this run did not claim, so the wholesale guarantee is kept rather than traded. A re-export is 20 s. SETTLE TIMES, MEASURED, and they refute more of my row than they confirm. The principle holds -- the title's rest.t is 251 units = 4.183 s where its art finishes at ~2 s -- but "everything the sequencer paces off that landmark is therefore late" does not. Measured the port the way the game was measured, by VISIBLE SPAN rather than arrival-to-arrival: publisher wordmark port 4.25 s game 4.297 / 4.604 / 4.370 developer logos port 3.50 s game 3.508 / 3.503 / 3.366 black hold port ~0.25 s game 0.2 - 0.3 title -> plate port 2.000 s (declared 120 units) game 2.247 s Dead on. My earlier reading compared the port's transition timestamps against the game's visible spans, which differ by the exit ramp plus the black hold -- the whole of the discrepancy I was about to chase, and the same definitional trap that cost this corpus 0.48 s on the plate delay. Nothing in the sequencer is changed. `dwell_seconds` stays null, now for a measured reason rather than an absent one: `timing.json` said "if a capture ever times the real boot, this is where that number goes", and the answer is that nothing goes there. Not authored, deliberately: an (A)->menu dwell, which measures 3.763 s and contains a 1.53 s guest load stall on a cold cache; and the menu build-in and (B)->title, which rest on one run where the port is already within ~0.1 s. THE VOICE PRESENTATION MOVED TO authored/, because the recommendation behind it was withdrawn as self-contradictory and the choice is now unambiguously mine. `voice.presentation` = `loudest`, and the reason to switch is a measurement, not a preference: ADV chunk 1 is MONO-IN-STEREO and chunk 2 is DUAL-MONO, so chunk 2's extra bytes encode a duplicate channel rather than fidelity. That explains the byte-rate difference and removes the only argument for `highest_rate`. ADV's dialogue now exports at +0.3 dBFS instead of -8.7, which is the SE bound's documented decode overshoot on a wave mastered at full scale. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF |
||
|
|
2ad839460c |
port: P6 -- the menu has sound, and the BGM I "chose" was decoded all along
The three Static.slb cues and the menu bed now export to Ogg Vorbis and play.
`sylpheed_formats::media` does the assembly; nothing in port/ has heard of XMA.
Three things this milestone got wrong before it got right, all recorded in
docs/port/DECISIONS.md because the corrections are the useful part:
1. The cue offsets were a Rust `const` in the exporter. They are MEASURED, not
decoded -- a measured value compiled into the exporter is a measurement
wearing the costume of a decoded field, and nobody deletes it because nobody
can see it. They are authored/audio.json now.
2. I picked BGM_001 and wrote a careful `why` calling the choice arbitrary. The
menu's music is BGM_103, and it is in HANDOFF at
|