{"id": "C-01", "type": "measured", "claim": "<Val id=\"C-01\" /> of the tone 1 nuclei whose level shape could be measured carry it.", "value": 0.8814, "unit": "share of graded nuclei", "n": 118, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "axis1_by_tone.1.share_majority", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "PREREGISTRATION.md section 3 expectation 2, which places this tone below tone 4"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Two of three pitch trackers must agree on the shape; a nucleus where fewer than two returned a contour, or where the gate flags it, is outside the denominator rather than counted as a miss. Measured only on the files where the nucleus count equals the claimed syllable count, because that index is what maps a nucleus to a tone.", "post_hoc": false}
{"id": "C-02", "type": "measured", "claim": "<Val id=\"C-02\" /> of the tone 2 nuclei whose rising shape could be measured carry it.", "value": 0.5755, "unit": "share of graded nuclei", "n": 106, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "axis1_by_tone.2.share_majority", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "PREREGISTRATION.md section 3 expectation 2, which places this tone below tone 4"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Two of three pitch trackers must agree on the shape; a nucleus where fewer than two returned a contour, or where the gate flags it, is outside the denominator rather than counted as a miss. Measured only on the files where the nucleus count equals the claimed syllable count, because that index is what maps a nucleus to a tone.", "post_hoc": false}
{"id": "C-03", "type": "measured", "claim": "<Val id=\"C-03\" /> of the tone 3 nuclei whose falling then rising shape could be measured carry it.", "value": 0.2069, "unit": "share of graded nuclei", "n": 58, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "axis1_by_tone.3.share_majority", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "confirmed", "field": "PREREGISTRATION.md section 3 expectation 1"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Two of three pitch trackers must agree on the shape; a nucleus where fewer than two returned a contour, or where the gate flags it, is outside the denominator rather than counted as a miss. Measured only on the files where the nucleus count equals the claimed syllable count, because that index is what maps a nucleus to a tone. The re-execution read this row differently: the re-execution graded this share on the tone 3 nuclei as the segmenter left them, 0.1020 on the files both call agreeing, against 0.2069 here; A-09 shows one switch, the segment.artefact_nuclei merge, produces 0.0988 and accounts for the whole difference. Amendment A-09 resolves the difference to one switch in the written method, the segment.artefact_nuclei merge, and both readings are published.", "post_hoc": false}
{"id": "C-04", "type": "measured", "claim": "<Val id=\"C-04\" /> of the tone 4 nuclei whose falling shape could be measured carry it.", "value": 0.7596, "unit": "share of graded nuclei", "n": 104, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "axis1_by_tone.4.share_majority", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "refuted", "field": "PREREGISTRATION.md section 3 expectation 2, which names tone 4 the most reliably shaped"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Two of three pitch trackers must agree on the shape; a nucleus where fewer than two returned a contour, or where the gate flags it, is outside the denominator rather than counted as a miss. Measured only on the files where the nucleus count equals the claimed syllable count, because that index is what maps a nucleus to a tone.", "post_hoc": true}
{"id": "C-01-CIS", "type": "measured", "claim": "The tone 1 share resampled by speaker lies between <Val id=\"C-01-CIS\" />.", "value": [0.7866, 0.9825], "unit": "share of graded nuclei", "n": 118, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "axis1_by_tone.1.ci_by_speaker", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; added on adversary objection 3.3, that the units are not independent"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Ten thousand resamples over the speakers present in the agreeing files, which for Lingua Libre is a handful of people and for AISHELL-3 eight more; a speaker who supplied two recordings weighs as much as one who supplied a hundred and fifty, so this interval is wide by construction.", "post_hoc": false}
{"id": "C-01-CII", "type": "measured", "claim": "The tone 1 share resampled by item lies between <Val id=\"C-01-CII\" />.", "value": [0.8165, 0.9364], "unit": "share of graded nuclei", "n": 118, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "axis1_by_tone.1.ci_by_item", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; added on adversary objection 3.3"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Ten thousand resamples over items, which groups the nuclei of one recording together and so answers a narrower question than the speaker interval: it does not cover the choice of recording sessions.", "post_hoc": false}
{"id": "C-02-CIS", "type": "measured", "claim": "The tone 2 share resampled by speaker lies between <Val id=\"C-02-CIS\" />.", "value": [0.3793, 0.6824], "unit": "share of graded nuclei", "n": 106, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "axis1_by_tone.2.ci_by_speaker", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; added on adversary objection 3.3, that the units are not independent"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Ten thousand resamples over the speakers present in the agreeing files, which for Lingua Libre is a handful of people and for AISHELL-3 eight more; a speaker who supplied two recordings weighs as much as one who supplied a hundred and fifty, so this interval is wide by construction.", "post_hoc": false}
{"id": "C-02-CII", "type": "measured", "claim": "The tone 2 share resampled by item lies between <Val id=\"C-02-CII\" />.", "value": [0.4711, 0.69], "unit": "share of graded nuclei", "n": 106, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "axis1_by_tone.2.ci_by_item", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; added on adversary objection 3.3"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Ten thousand resamples over items, which groups the nuclei of one recording together and so answers a narrower question than the speaker interval: it does not cover the choice of recording sessions.", "post_hoc": false}
{"id": "C-03-CIS", "type": "measured", "claim": "The tone 3 share resampled by speaker lies between <Val id=\"C-03-CIS\" />.", "value": [0.0, 0.3019], "unit": "share of graded nuclei", "n": 58, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "axis1_by_tone.3.ci_by_speaker", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; added on adversary objection 3.3, that the units are not independent"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Ten thousand resamples over the speakers present in the agreeing files, which for Lingua Libre is a handful of people and for AISHELL-3 eight more; a speaker who supplied two recordings weighs as much as one who supplied a hundred and fifty, so this interval is wide by construction. The re-execution read this row differently: same switch; the re-execution's resample by speaker points at its own tone 3 share. Amendment A-09 resolves the difference to one switch in the written method, the segment.artefact_nuclei merge, and both readings are published.", "post_hoc": false}
{"id": "C-03-CII", "type": "measured", "claim": "The tone 3 share resampled by item lies between <Val id=\"C-03-CII\" />.", "value": [0.1045, 0.3273], "unit": "share of graded nuclei", "n": 58, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "axis1_by_tone.3.ci_by_item", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; added on adversary objection 3.3"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Ten thousand resamples over items, which groups the nuclei of one recording together and so answers a narrower question than the speaker interval: it does not cover the choice of recording sessions. The re-execution read this row differently: same switch; the re-execution's resample by item points at its own tone 3 share. Amendment A-09 resolves the difference to one switch in the written method, the segment.artefact_nuclei merge, and both readings are published.", "post_hoc": false}
{"id": "C-04-CIS", "type": "measured", "claim": "The tone 4 share resampled by speaker lies between <Val id=\"C-04-CIS\" />.", "value": [0.625, 0.8372], "unit": "share of graded nuclei", "n": 104, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "axis1_by_tone.4.ci_by_speaker", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; added on adversary objection 3.3, that the units are not independent"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Ten thousand resamples over the speakers present in the agreeing files, which for Lingua Libre is a handful of people and for AISHELL-3 eight more; a speaker who supplied two recordings weighs as much as one who supplied a hundred and fifty, so this interval is wide by construction.", "post_hoc": false}
{"id": "C-04-CII", "type": "measured", "claim": "The tone 4 share resampled by item lies between <Val id=\"C-04-CII\" />.", "value": [0.67, 0.8417], "unit": "share of graded nuclei", "n": 104, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "axis1_by_tone.4.ci_by_item", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; added on adversary objection 3.3"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Ten thousand resamples over items, which groups the nuclei of one recording together and so answers a narrower question than the speaker interval: it does not cover the choice of recording sessions.", "post_hoc": false}
{"id": "C-09", "type": "measured", "claim": "Segmentation agrees with the claimed syllable count on <Val id=\"C-09\" /> of the files.", "value": 0.4952, "unit": "share of files", "n": 624, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "segmentation_agreement_rate", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; A-01 item 2 asked for the direction of the loss, not its size"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "The comparison is between the merged nucleus count and the claimed syllable count, and it treats one claim per file as one observation; a file with four syllables and three nuclei counts the same as one with two syllables and one nucleus. The re-execution read this row differently: the re-execution counts agreement on the unmerged nuclei, so its agreeing set is 295 files against 399 here. Amendment A-09 resolves the difference to one switch in the written method, the segment.artefact_nuclei merge, and both readings are published.", "post_hoc": false}
{"id": "C-11", "type": "measured", "claim": "Across every usable file, <Val id=\"C-11\" /> more nuclei were found carrying tone 1 than the 324 syllables it is claimed on.", "value": 16, "unit": "nuclei", "n": 324, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "coverage_by_tone.1.over", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; A-02 item 5 requires the coverage to be signed rather than a ratio"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Counted per file and then attributed to every tone that file contains, so a file with two tones contributes its surplus to both, and the sum over tones exceeds the number of extra nuclei in the corpus.", "post_hoc": false}
{"id": "C-11b", "type": "measured", "claim": "Across every usable file, <Val id=\"C-11b\" /> fewer nuclei were found carrying tone 1 than the 324 syllables it is claimed on.", "value": 83, "unit": "nuclei", "n": 324, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "coverage_by_tone.1.under", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; A-02 item 5"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Counted per file and attributed to every tone that file contains, so a file that lost one nucleus is counted as a loss for each of its tones; this is a direction of error, not a per-tone error rate.", "post_hoc": false}
{"id": "C-12", "type": "measured", "claim": "Across every usable file, <Val id=\"C-12\" /> more nuclei were found carrying tone 2 than the 319 syllables it is claimed on.", "value": 28, "unit": "nuclei", "n": 319, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "coverage_by_tone.2.over", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; A-02 item 5 requires the coverage to be signed rather than a ratio"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Counted per file and then attributed to every tone that file contains, so a file with two tones contributes its surplus to both, and the sum over tones exceeds the number of extra nuclei in the corpus.", "post_hoc": false}
{"id": "C-12b", "type": "measured", "claim": "Across every usable file, <Val id=\"C-12b\" /> fewer nuclei were found carrying tone 2 than the 319 syllables it is claimed on.", "value": 98, "unit": "nuclei", "n": 319, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "coverage_by_tone.2.under", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; A-02 item 5"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Counted per file and attributed to every tone that file contains, so a file that lost one nucleus is counted as a loss for each of its tones; this is a direction of error, not a per-tone error rate.", "post_hoc": false}
{"id": "C-13", "type": "measured", "claim": "Across every usable file, <Val id=\"C-13\" /> more nuclei were found carrying tone 3 than the 234 syllables it is claimed on.", "value": 37, "unit": "nuclei", "n": 234, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "coverage_by_tone.3.over", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; A-02 item 5 requires the coverage to be signed rather than a ratio"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Counted per file and then attributed to every tone that file contains, so a file with two tones contributes its surplus to both, and the sum over tones exceeds the number of extra nuclei in the corpus.", "post_hoc": false}
{"id": "C-13b", "type": "measured", "claim": "Across every usable file, <Val id=\"C-13b\" /> fewer nuclei were found carrying tone 3 than the 234 syllables it is claimed on.", "value": 81, "unit": "nuclei", "n": 234, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "coverage_by_tone.3.under", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; A-02 item 5"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Counted per file and attributed to every tone that file contains, so a file that lost one nucleus is counted as a loss for each of its tones; this is a direction of error, not a per-tone error rate.", "post_hoc": false}
{"id": "C-14", "type": "measured", "claim": "Across every usable file, <Val id=\"C-14\" /> more nuclei were found carrying tone 4 than the 369 syllables it is claimed on.", "value": 13, "unit": "nuclei", "n": 369, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "coverage_by_tone.4.over", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; A-02 item 5 requires the coverage to be signed rather than a ratio"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Counted per file and then attributed to every tone that file contains, so a file with two tones contributes its surplus to both, and the sum over tones exceeds the number of extra nuclei in the corpus.", "post_hoc": false}
{"id": "C-14b", "type": "measured", "claim": "Across every usable file, <Val id=\"C-14b\" /> fewer nuclei were found carrying tone 4 than the 369 syllables it is claimed on.", "value": 115, "unit": "nuclei", "n": 369, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "coverage_by_tone.4.under", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; A-02 item 5"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Counted per file and attributed to every tone that file contains, so a file that lost one nucleus is counted as a loss for each of its tones; this is a direction of error, not a per-tone error rate.", "post_hoc": false}
{"id": "C-15", "type": "measured", "claim": "Across every usable file, <Val id=\"C-15\" /> more nuclei were found carrying tone 5 than the 57 syllables it is claimed on.", "value": 0, "unit": "nuclei", "n": 57, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "coverage_by_tone.5.over", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; A-02 item 5 requires the coverage to be signed rather than a ratio"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Counted per file and then attributed to every tone that file contains, so a file with two tones contributes its surplus to both, and the sum over tones exceeds the number of extra nuclei in the corpus.", "post_hoc": false}
{"id": "C-15b", "type": "measured", "claim": "Across every usable file, <Val id=\"C-15b\" /> fewer nuclei were found carrying tone 5 than the 57 syllables it is claimed on.", "value": 25, "unit": "nuclei", "n": 57, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "coverage_by_tone.5.under", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; A-02 item 5"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Counted per file and attributed to every tone that file contains, so a file that lost one nucleus is counted as a loss for each of its tones; this is a direction of error, not a per-tone error rate.", "post_hoc": false}
{"id": "C-20", "type": "measured", "claim": "Among the tone 3 items whose segmentation agrees, <Val id=\"C-20\" /> contain a fall followed by a rise.", "value": 0.2346, "unit": "share of tone 3 items", "n": 81, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis2.json", "selector": "a01_dip_share_agrees", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "added by amendment A-01 item 2 before the run, which asked the direction of the loss rather than a value"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "The indicator is at the item level: whether any nucleus in the recording shows the dip by two of three trackers. A recording whose dip was split into two nuclei can read as no dip, which is the failure this test is looking for and cannot rule out. The re-execution read this row differently: computed on the re-execution's agreeing set rather than this one's. Amendment A-09 resolves the difference to one switch in the written method, the segment.artefact_nuclei merge, and both readings are published.", "post_hoc": false}
{"id": "C-21", "type": "measured", "claim": "Among the tone 3 items whose segmentation disagrees, <Val id=\"C-21\" /> contain one.", "value": 0.1071, "unit": "share of tone 3 items", "n": 140, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis2.json", "selector": "a01_dip_share_disagrees", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "added by amendment A-01 item 2"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "The disagreeing files carry more nuclei than syllables, so each of them has more chances to show a dip than an agreeing file does, and this share is still the lower of the two. The re-execution read this row differently: computed on the re-execution's agreeing set rather than this one's. Amendment A-09 resolves the difference to one switch in the written method, the segment.artefact_nuclei merge, and both readings are published.", "post_hoc": false}
{"id": "C-22", "type": "measured", "claim": "Among the tone 3 items, <Val id=\"C-22\" /> were over-split, meaning the segmenter found more nuclei than the syllable count claims.", "value": 35, "unit": "items", "n": 221, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis2.json", "selector": "a01_tone3_direction.over", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Over-split and under-count are counted per item, not per nucleus, so a file that lost two nuclei counts once, and the same file can be over-split in one place and short in another without either count showing it. The re-execution read this row differently: the over-split count is where the re-execution applied artefact_nuclei; the two agree on the artefacts found and differ on where they are applied to grading. Amendment A-09 resolves the difference to one switch in the written method, the segment.artefact_nuclei merge, and both readings are published.", "post_hoc": false}
{"id": "C-23", "type": "measured", "claim": "On the tone 3 items the segmenter split, the rising shape is <Val id=\"C-23\" /> of the shapes the three trackers report.", "value": 0.3515, "unit": "share of tracker verdicts", "n": 165, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis2.json", "selector": "a01_shape_mix_split_items.RISE[1]", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Counted over tracker verdicts rather than nuclei, so one nucleus contributes up to three observations, and the comparison set is the items the segmenter left whole rather than a random sample of Mandarin. The re-execution read this row differently: graded on the unmerged nuclei, where two of three trackers read FALL rather than DIP-RISE. Amendment A-09 resolves the difference to one switch in the written method, the segment.artefact_nuclei merge, and both readings are published.", "post_hoc": false}
{"id": "C-31", "type": "measured", "claim": "With trackers below half voiced frames removed, the tone 1 share becomes <Val id=\"C-31\" /> against 0.8814.", "value": 0.8783, "unit": "share of graded nuclei", "n": 115, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis2.json", "selector": "a02_coverage_floor.1.floor_0p5[2]", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; A-02 item 7 asks whether the shares move under a coverage floor"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "The floor is a declared half of the frames a nucleus is long, applied to all three trackers at once, so it removes nuclei where the trackers were least certain rather than nuclei at random.", "post_hoc": false}
{"id": "C-32", "type": "measured", "claim": "With trackers below half voiced frames removed, the tone 2 share becomes <Val id=\"C-32\" /> against 0.5755.", "value": 0.5833, "unit": "share of graded nuclei", "n": 96, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis2.json", "selector": "a02_coverage_floor.2.floor_0p5[2]", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; A-02 item 7 asks whether the shares move under a coverage floor"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "The floor is a declared half of the frames a nucleus is long, applied to all three trackers at once, so it removes nuclei where the trackers were least certain rather than nuclei at random.", "post_hoc": false}
{"id": "C-33", "type": "measured", "claim": "With trackers below half voiced frames removed, the tone 3 share becomes <Val id=\"C-33\" /> against 0.2069.", "value": 0.1944, "unit": "share of graded nuclei", "n": 36, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis2.json", "selector": "a02_coverage_floor.3.floor_0p5[2]", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; A-02 item 7 asks whether the shares move under a coverage floor"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "The floor is a declared half of the frames a nucleus is long, applied to all three trackers at once, so it removes nuclei where the trackers were least certain rather than nuclei at random. The re-execution read this row differently: same switch; the floor removes different files once the nuclei differ. Amendment A-09 resolves the difference to one switch in the written method, the segment.artefact_nuclei merge, and both readings are published.", "post_hoc": false}
{"id": "C-34", "type": "measured", "claim": "With trackers below half voiced frames removed, the tone 4 share becomes <Val id=\"C-34\" /> against 0.7596.", "value": 0.8354, "unit": "share of graded nuclei", "n": 79, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis2.json", "selector": "a02_coverage_floor.4.floor_0p5[2]", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; A-02 item 7 asks whether the shares move under a coverage floor"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "The floor is a declared half of the frames a nucleus is long, applied to all three trackers at once, so it removes nuclei where the trackers were least certain rather than nuclei at random.", "post_hoc": false}
{"id": "C-40", "type": "measured", "claim": "In <Val id=\"C-40\" /> of the measured syllables the tone that is spoken differs from the tone written in a dictionary.", "value": 33, "unit": "syllables", "n": 1303, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis2.json", "selector": "a02_sandhi_count", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; A-02 item 9"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "The comparison is against the citation tone recorded beside the recording, which for the Lingua Libre items came from the contributor and for AISHELL-3 from a reference file built to count nuclei rather than to label tones.", "post_hoc": false}
{"id": "C-41", "type": "measured", "claim": "Of the tone 1 syllables on the files where segmentation agrees, <Val id=\"C-41\" /> were never given a shape verdict.", "value": 0.0635, "unit": "share of claimed syllables", "n": 126, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis2.json", "selector": "a01_discard_rate_by_tone.1.discard_rate", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "A-01 item 1 requires the discard rate beside every per-tone figure but predicted no value"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "The denominator here is claimed syllables on agreeing files only, which is not the same denominator as the share itself; a syllable can reach a verdict as a no-verdict and a nucleus can be graded for a syllable whose index is not its own.", "post_hoc": false}
{"id": "C-42", "type": "measured", "claim": "Of the tone 2 syllables on the files where segmentation agrees, <Val id=\"C-42\" /> were never given a shape verdict.", "value": 0.0702, "unit": "share of claimed syllables", "n": 114, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis2.json", "selector": "a01_discard_rate_by_tone.2.discard_rate", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "A-01 item 1 requires the discard rate beside every per-tone figure but predicted no value"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "The denominator here is claimed syllables on agreeing files only, which is not the same denominator as the share itself; a syllable can reach a verdict as a no-verdict and a nucleus can be graded for a syllable whose index is not its own.", "post_hoc": false}
{"id": "C-43", "type": "measured", "claim": "Of the tone 3 syllables on the files where segmentation agrees, <Val id=\"C-43\" /> were never given a shape verdict.", "value": 0.284, "unit": "share of claimed syllables", "n": 81, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis2.json", "selector": "a01_discard_rate_by_tone.3.discard_rate", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "A-01 item 1 requires the discard rate beside every per-tone figure but predicted no value"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "The denominator here is claimed syllables on agreeing files only, which is not the same denominator as the share itself; a syllable can reach a verdict as a no-verdict and a nucleus can be graded for a syllable whose index is not its own. The re-execution read this row differently: computed on the re-execution's agreeing set rather than this one's. Amendment A-09 resolves the difference to one switch in the written method, the segment.artefact_nuclei merge, and both readings are published.", "post_hoc": false}
{"id": "C-44", "type": "measured", "claim": "Of the tone 4 syllables on the files where segmentation agrees, <Val id=\"C-44\" /> were never given a shape verdict.", "value": 0.1938, "unit": "share of claimed syllables", "n": 129, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis2.json", "selector": "a01_discard_rate_by_tone.4.discard_rate", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "A-01 item 1 requires the discard rate beside every per-tone figure but predicted no value"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "The denominator here is claimed syllables on agreeing files only, which is not the same denominator as the share itself; a syllable can reach a verdict as a no-verdict and a nucleus can be graded for a syllable whose index is not its own.", "post_hoc": false}
{"id": "C-50", "type": "measured", "claim": "The five speakers who clear the recording threshold have registers spanning <Val id=\"C-50\" /> end to end.", "value": 14.66, "unit": "semitones", "n": 5, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "register_span_st", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "expectation 3 was withdrawn before the run on adversary objection 3.1; the axis is measured and carries no registered direction"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Five speakers, not twelve: the other seven fall below the ten-recording threshold declared in A-02 item 12, and the span is between the highest and the lowest of five numbers, so it is an extreme-value statistic over a very small set.", "post_hoc": false}
{"id": "C-51", "type": "measured", "claim": "Between the quartiles those registers span <Val id=\"C-51\" />.", "value": 3.09, "unit": "semitones", "n": 5, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "register_iqr_st", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "expectation 3 withdrawn"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Five values make a quartile span nearly meaningless as a spread; it is published because the registered expectation named it, and it rests on three of five speakers.", "post_hoc": false}
{"id": "C-52", "type": "measured", "claim": "Within one recording, two different tones spoken by one person differ by a median of <Val id=\"C-52\" />.", "value": 3.13, "unit": "semitones", "n": 50, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "paired_tone_term.median_st", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "expectation 3 withdrawn"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Disyllables with two distinct non-neutral tones in one recording, which is a subset of the corpus and not a random sample of tone pairs; the median hides that some pairs are far apart and others nearly identical.", "post_hoc": false}
{"id": "C-53", "type": "measured", "claim": "Across recordings of the same item by two speakers, the median difference is <Val id=\"C-53\" />.", "value": 7.63, "unit": "semitones", "n": 192, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/analysis.json", "selector": "between_speaker_term.median_st", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "expectation 3 withdrawn"}, "replicated": {"status": "re-executed", "ref": "replication/REPLICATION_A.md, amendment A-06 and amendment A-09"}, "limits": "Pairs, not speakers: one prolific speaker pair supplies most of them, so this is closer to one comparison measured many times than to a sample of speakers, and it is not comparable with C-52 because the two are different statistics over different units.", "post_hoc": false}
{"id": "C-60", "type": "measured", "claim": "Moving every nucleus boundary by the distance the energy and phonation cues disagree by changes the verdict on <Val id=\"C-60\" /> of the nuclei.", "value": 0.3256, "unit": "share of nuclei", "n": 1253, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/replication-summary.json", "selector": "verdict_kind_moved_share", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; adversary objection 3.7 asked the repetition to vary something that could change the answer"}, "replicated": {"status": "not-attempted", "ref": "this row is one of the two readings the re-execution produced; nothing has reproduced it"}, "limits": "One perturbation size is used, the distance the repository computes for each nucleus, and it is applied symmetrically to both boundaries; a larger perturbation would very likely move more.", "post_hoc": false}
{"id": "C-61", "type": "measured", "claim": "The shape the three trackers agree on changes for <Val id=\"C-61\" /> of the nuclei under that same move.", "value": 0.3232, "unit": "share of nuclei", "n": 1253, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/replication-summary.json", "selector": "majority_shape_moved_share", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line"}, "replicated": {"status": "not-attempted", "ref": "see C-60"}, "limits": "The three trackers are not independent of the boundary, so this counts agreement between trackers that all moved rather than independent confirmation.", "post_hoc": false}
{"id": "C-71", "type": "measured", "claim": "The re-execution, read by this run's rules on the files both call agreeing, puts the tone 1 share at <Val id=\"C-71\" />.", "value": 0.9091, "unit": "share of graded nuclei", "n": 110, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/replication-summary.json", "selector": "r0_on_shared_files.1.share", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "the replication compares implementations, not a registered expectation"}, "replicated": {"status": "not-attempted", "ref": "REPLICATION_A.md"}, "limits": "A second implementation of the same written method by a session that never saw this run; the difference from this run's own figure is the residual disagreement A-06 records, and it is larger for the second tone than for the first and fourth.", "post_hoc": false}
{"id": "C-72", "type": "measured", "claim": "The re-execution, read by this run's rules on the files both call agreeing, puts the tone 2 share at <Val id=\"C-72\" />.", "value": 0.4845, "unit": "share of graded nuclei", "n": 97, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/replication-summary.json", "selector": "r0_on_shared_files.2.share", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "the replication compares implementations, not a registered expectation"}, "replicated": {"status": "not-attempted", "ref": "REPLICATION_A.md"}, "limits": "A second implementation of the same written method by a session that never saw this run; the difference from this run's own figure is the residual disagreement A-06 records, and it is larger for the second tone than for the first and fourth.", "post_hoc": false}
{"id": "C-74", "type": "measured", "claim": "The re-execution, read by this run's rules on the files both call agreeing, puts the tone 4 share at <Val id=\"C-74\" />.", "value": 0.7526, "unit": "share of graded nuclei", "n": 97, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/replication-summary.json", "selector": "r0_on_shared_files.4.share", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "the replication compares implementations, not a registered expectation"}, "replicated": {"status": "not-attempted", "ref": "REPLICATION_A.md"}, "limits": "A second implementation of the same written method by a session that never saw this run; the difference from this run's own figure is the residual disagreement A-06 records, and it is larger for the second tone than for the first and fourth.", "post_hoc": false}
{"id": "C-73", "type": "measured", "claim": "The same reading puts the tone 3 share at <Val id=\"C-73\" />.", "value": 0.102, "unit": "share of graded nuclei", "n": 49, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/replication-summary.json", "selector": "r0_on_shared_files.3.share", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "the replication compares implementations"}, "replicated": {"status": "re-executed", "ref": "REPLICATION_A.md, A-06 section 2 and A-09"}, "limits": "Eleven points below this run's own tone 3 figure, on six nuclei out of about fifty, which is inside the interval this run publishes for that tone. That is true and it is why A-06 called the residual noise; A-09 corrected that. The residual had one cause, the segment.artefact_nuclei merge, and naming it matters because the switch is worth more than the interval: the same pipeline with the merge off puts the tone 3 share at 0.0988. The re-execution read this row differently: the row the disagreement is about, now reconciled: no_merge gives 0.0988 on 399 agreeing files against the re-execution's 0.1020. Amendment A-09 resolves the difference to one switch in the written method, the segment.artefact_nuclei merge, and both readings are published.", "post_hoc": false}
{"id": "RUN-DATE", "type": "measured", "claim": "The measurement was taken on <Val id=\"RUN-DATE\" />.", "value": "2026-09-10T19:05:37Z", "unit": "date", "n": null, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "tools/measure.py, data/files.jsonl measured_at", "evidence": {"dataset": "data/analysis2.json", "selector": "run_date.last", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; a typed date is the one value that goes stale without anything failing"}, "replicated": {"status": "re-executed", "ref": "the replication ran the same day over the same 624 files"}, "limits": "One draw on one day, on two corpora that are fixed in time. A different harvest of Lingua Libre would be a different set of recordings and not a later version of this one.", "post_hoc": true}
{"id": "PRED-01", "type": "measured", "claim": "The pre-registration predicted the third tone would carry its full dip in <Val id=\"PRED-01\" /> of its syllables.", "value": [0.1, 0.4], "unit": "percent range", "n": null, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "PREREGISTRATION.md section 3, frozen before the first fetch", "evidence": {"dataset": "data/registered-ranges.json", "selector": "tone3_dip_share", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "confirmed", "field": "this row IS the prediction from section 3 expectation 1; C-03 is the measurement"}, "replicated": {"status": "not-attempted", "ref": "a prediction is not replicated"}, "limits": "The range was registered before any audio was read and is quoted here unchanged. It was written with the hypothesis that tone 3 realises its citation dip rarely, which is what Tingyin already publishes without a number.", "post_hoc": false}
{"id": "PRED-02", "type": "measured", "claim": "The pre-registration predicted no tone would match its notation shape more reliably than the fourth, and put the floor at <Val id=\"PRED-02\" /> of its nuclei.", "value": 0.7, "unit": "percent", "n": null, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "PREREGISTRATION.md section 3, frozen before the first fetch", "evidence": {"dataset": "data/registered-ranges.json", "selector": "tone4_minimum_share", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "refuted", "field": "this row IS the prediction from section 3 expectation 2; C-01, C-03 and C-04 are the measurements that refute it, and A-03.1 records that the block Jakub approved said the first tone instead"}, "replicated": {"status": "not-attempted", "ref": "a prediction is not replicated"}, "limits": "The prediction is quoted as registered. The rendered Gate B block stated a different one, and A-03.1 publishes both readings rather than choosing.", "post_hoc": false}
{"id": "C-81", "type": "measured", "claim": "With every nucleus boundary moved by its own disagreement distance, the re-execution reads the tone 1 share as <Val id=\"C-81\" />.", "value": 0.7477, "unit": "share of graded nuclei", "n": 107, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/replication-summary.json", "selector": "r1_on_shared_files.1.share", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line"}, "replicated": {"status": "not-attempted", "ref": "REPLICATION_A.md"}, "limits": "The same 282 files, the same rules, one change: each nucleus start moved earlier and its end later by the distance the energy and phonation cues disagree by. This is a spread of the method over its own uncertainty, not a second sample.", "post_hoc": false}
{"id": "C-82", "type": "measured", "claim": "With every nucleus boundary moved by its own disagreement distance, the re-execution reads the tone 2 share as <Val id=\"C-82\" />.", "value": 0.4659, "unit": "share of graded nuclei", "n": 88, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/replication-summary.json", "selector": "r1_on_shared_files.2.share", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line"}, "replicated": {"status": "not-attempted", "ref": "REPLICATION_A.md"}, "limits": "The same 282 files, the same rules, one change: each nucleus start moved earlier and its end later by the distance the energy and phonation cues disagree by. This is a spread of the method over its own uncertainty, not a second sample.", "post_hoc": false}
{"id": "C-83", "type": "measured", "claim": "With every nucleus boundary moved by its own disagreement distance, the re-execution reads the tone 3 share as <Val id=\"C-83\" />.", "value": 0.1765, "unit": "share of graded nuclei", "n": 51, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/replication-summary.json", "selector": "r1_on_shared_files.3.share", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line"}, "replicated": {"status": "not-attempted", "ref": "REPLICATION_A.md"}, "limits": "The same 282 files, the same rules, one change: each nucleus start moved earlier and its end later by the distance the energy and phonation cues disagree by. This is a spread of the method over its own uncertainty, not a second sample.", "post_hoc": false}
{"id": "C-84", "type": "measured", "claim": "With every nucleus boundary moved by its own disagreement distance, the re-execution reads the tone 4 share as <Val id=\"C-84\" />.", "value": 0.75, "unit": "share of graded nuclei", "n": 100, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/replication-summary.json", "selector": "r1_on_shared_files.4.share", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line"}, "replicated": {"status": "not-attempted", "ref": "REPLICATION_A.md"}, "limits": "The same 282 files, the same rules, one change: each nucleus start moved earlier and its end later by the distance the energy and phonation cues disagree by. This is a spread of the method over its own uncertainty, not a second sample.", "post_hoc": false}
{"id": "C-98", "type": "measured", "claim": "With the over-split nuclei graded where the segmenter put them instead of merged back into their syllable, the tone 1 share is <Val id=\"C-98\" />.", "value": 0.8462, "unit": "share of graded nuclei", "n": 195, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/sens-gatefloor/analysis.json", "selector": "no_merge.1.share", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; post-hoc, written in A-09 after the re-execution disagreed on tone 3"}, "replicated": {"status": "not-attempted", "ref": "a switch, not a measurement; REPLICATION_A.md read it the other way and A-09 resolves the two"}, "limits": "The same pipeline, the same 399 files whose segmentation agrees, one switch: segment.artefact_nuclei merges the second nucleus of an over-split syllable back into the first. This is the switch the re-execution read the other way, and A-09 locates the whole disagreement in it. On tone 3 it moves the share further than any interval this run publishes, which is why the article carries it beside the boundary move.", "post_hoc": true}
{"id": "C-99", "type": "measured", "claim": "With the over-split nuclei graded where the segmenter put them instead of merged back into their syllable, the tone 2 share is <Val id=\"C-99\" />.", "value": 0.4379, "unit": "share of graded nuclei", "n": 169, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/sens-gatefloor/analysis.json", "selector": "no_merge.2.share", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; post-hoc, written in A-09 after the re-execution disagreed on tone 3"}, "replicated": {"status": "not-attempted", "ref": "a switch, not a measurement; REPLICATION_A.md read it the other way and A-09 resolves the two"}, "limits": "The same pipeline, the same 399 files whose segmentation agrees, one switch: segment.artefact_nuclei merges the second nucleus of an over-split syllable back into the first. This is the switch the re-execution read the other way, and A-09 locates the whole disagreement in it. On tone 3 it moves the share further than any interval this run publishes, which is why the article carries it beside the boundary move.", "post_hoc": true}
{"id": "C-100", "type": "measured", "claim": "With the over-split nuclei graded where the segmenter put them instead of merged back into their syllable, the tone 3 share is <Val id=\"C-100\" />.", "value": 0.0988, "unit": "share of graded nuclei", "n": 81, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/sens-gatefloor/analysis.json", "selector": "no_merge.3.share", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; post-hoc, written in A-09 after the re-execution disagreed on tone 3"}, "replicated": {"status": "not-attempted", "ref": "a switch, not a measurement; REPLICATION_A.md read it the other way and A-09 resolves the two"}, "limits": "The same pipeline, the same 399 files whose segmentation agrees, one switch: segment.artefact_nuclei merges the second nucleus of an over-split syllable back into the first. This is the switch the re-execution read the other way, and A-09 locates the whole disagreement in it. On tone 3 it moves the share further than any interval this run publishes, which is why the article carries it beside the boundary move.", "post_hoc": true}
{"id": "C-101", "type": "measured", "claim": "With the over-split nuclei graded where the segmenter put them instead of merged back into their syllable, the tone 4 share is <Val id=\"C-101\" />.", "value": 0.7665, "unit": "share of graded nuclei", "n": 167, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/sens-gatefloor/analysis.json", "selector": "no_merge.4.share", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; post-hoc, written in A-09 after the re-execution disagreed on tone 3"}, "replicated": {"status": "not-attempted", "ref": "a switch, not a measurement; REPLICATION_A.md read it the other way and A-09 resolves the two"}, "limits": "The same pipeline, the same 399 files whose segmentation agrees, one switch: segment.artefact_nuclei merges the second nucleus of an over-split syllable back into the first. This is the switch the re-execution read the other way, and A-09 locates the whole disagreement in it. On tone 3 it moves the share further than any interval this run publishes, which is why the article carries it beside the boundary move.", "post_hoc": true}
{"id": "C-102", "type": "measured", "claim": "Before the over-split syllables are joined back, <Val id=\"C-102\" /> of the 624 recordings have a measured syllable count equal to the claimed one.", "value": 399, "unit": "recordings", "n": 624, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/merge-cost.json", "selector": "all.before_merge", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; post-hoc, A-12"}, "replicated": {"status": "not-attempted", "ref": "a count of this run's own pipeline"}, "limits": "The count the segmenter returns on its own, before this run joins anything.", "post_hoc": true}
{"id": "C-103", "type": "measured", "claim": "After the join, <Val id=\"C-103\" /> of them do, so the rule costs <Val id=\"C-104\" /> recordings the segmenter had already cut correctly.", "value": 309, "unit": "recordings", "n": 624, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/merge-cost.json", "selector": "all.after_merge", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; post-hoc, A-12"}, "replicated": {"status": "not-attempted", "ref": "the re-execution observed the effect; A-12 counts it here"}, "limits": "This is the widest thing the measurement does on its own authority. The re-execution observed it and this row counts it: the function the merge comes from tests whether an over-count CAN be explained, and this run applies it wherever it names a syllable.", "post_hoc": true}
{"id": "C-104", "type": "measured", "claim": "The join costs <Val id=\"C-104\" /> recordings in total.", "value": 110, "unit": "recordings", "n": 624, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/merge-cost.json", "selector": "all.lost_to_merge", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; post-hoc, A-12"}, "replicated": {"status": "not-attempted", "ref": "A-12"}, "limits": "Of 624, all of them on files whose raw nucleus count already matched the claim.", "post_hoc": true}
{"id": "C-105", "type": "measured", "claim": "On the second corpus the count falls from <Val id=\"C-105\" /> files to <Val id=\"C-106\" />, which is where the rule does most of its damage.", "value": 108, "unit": "recordings", "n": 224, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/merge-cost.json", "selector": "aishell3.before_merge", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; post-hoc, A-12"}, "replicated": {"status": "not-attempted", "ref": "A-12"}, "limits": "AISHELL-3 carries mostly two-syllable words, so it is the corpus where adjacent nuclei are close enough for the join to fire on a file the segmenter had already cut correctly.", "post_hoc": true}
{"id": "C-106", "type": "measured", "claim": "After the join the second corpus has <Val id=\"C-106\" /> agreeing files, against <Val id=\"C-105\" /> before.", "value": 34, "unit": "recordings", "n": 224, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/merge-cost.json", "selector": "aishell3.after_merge", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; post-hoc, A-12"}, "replicated": {"status": "not-attempted", "ref": "A-12"}, "limits": "Seventy-five of the 108 files the segmenter had cut correctly are joined anyway.", "post_hoc": true}
{"id": "C-90", "type": "measured", "claim": "A session that was given the question and nothing else measured the whole corpus its own way and found <Val id=\"C-90\" /> of the syllables matching their notation shape.", "value": 0.545, "unit": "percent", "n": 1085, "obtained_at": "2026-09-10T22:41:00Z", "obtained_by": "the derivation session, tools/analyse3.py", "evidence": {"dataset": "data/derivation-shares.json", "selector": "headline.share", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "the derivation answers the question, not the registered expectation; its criterion for a match is its own"}, "replicated": {"status": "not-attempted", "ref": "this row IS the independent derivation; REPLICATION_B.md"}, "limits": "Its criterion is not this run's: it smooths the contour, reads it at ten points and calls a contour level when it moves less than half a Chao level, so its numbers are comparable in order and not in level.", "post_hoc": false}
{"id": "C-91", "type": "measured", "claim": "The derivation puts the tone 1 share at <Val id=\"C-91\" />.", "value": 0.579, "unit": "percent", "n": 292, "obtained_at": "2026-09-10T22:41:00Z", "obtained_by": "the derivation session, tools/analyse3.py", "evidence": {"dataset": "data/derivation-shares.json", "selector": "by_tone.1.share", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "the derivation answers the question"}, "replicated": {"status": "not-attempted", "ref": "REPLICATION_B.md"}, "limits": "A different corpus of syllables reaches a verdict: the derivation measures 1147 syllables against this run's 386 graded nuclei, because it places boundaries by dynamic programming against the known syllable count instead of detecting them, so it loses far fewer.", "post_hoc": false}
{"id": "C-92", "type": "measured", "claim": "The derivation puts the tone 2 share at <Val id=\"C-92\" />.", "value": 0.521, "unit": "percent", "n": 282, "obtained_at": "2026-09-10T22:41:00Z", "obtained_by": "the derivation session, tools/analyse3.py", "evidence": {"dataset": "data/derivation-shares.json", "selector": "by_tone.2.share", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "the derivation answers the question"}, "replicated": {"status": "not-attempted", "ref": "REPLICATION_B.md"}, "limits": "A different corpus of syllables reaches a verdict: the derivation measures 1147 syllables against this run's 386 graded nuclei, because it places boundaries by dynamic programming against the known syllable count instead of detecting them, so it loses far fewer.", "post_hoc": false}
{"id": "C-93", "type": "measured", "claim": "The derivation puts the tone 3 share at <Val id=\"C-93\" />.", "value": 0.135, "unit": "percent", "n": 192, "obtained_at": "2026-09-10T22:41:00Z", "obtained_by": "the derivation session, tools/analyse3.py", "evidence": {"dataset": "data/derivation-shares.json", "selector": "by_tone.3.share", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "the derivation answers the question"}, "replicated": {"status": "not-attempted", "ref": "REPLICATION_B.md"}, "limits": "A different corpus of syllables reaches a verdict: the derivation measures 1147 syllables against this run's 386 graded nuclei, because it places boundaries by dynamic programming against the known syllable count instead of detecting them, so it loses far fewer.", "post_hoc": false}
{"id": "C-94", "type": "measured", "claim": "The derivation puts the tone 4 share at <Val id=\"C-94\" />.", "value": 0.781, "unit": "percent", "n": 319, "obtained_at": "2026-09-10T22:41:00Z", "obtained_by": "the derivation session, tools/analyse3.py", "evidence": {"dataset": "data/derivation-shares.json", "selector": "by_tone.4.share", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "the derivation answers the question"}, "replicated": {"status": "not-attempted", "ref": "REPLICATION_B.md"}, "limits": "A different corpus of syllables reaches a verdict: the derivation measures 1147 syllables against this run's 386 graded nuclei, because it places boundaries by dynamic programming against the known syllable count instead of detecting them, so it loses far fewer.", "post_hoc": false}
{"id": "C-95", "type": "measured", "claim": "The derivation found the third tone measuring as a plain fall in <Val id=\"C-95\" /> of its syllables, a shape the notation does not write.", "value": 0.74, "unit": "percent", "n": 192, "obtained_at": "2026-09-10T22:41:00Z", "obtained_by": "the derivation session, tools/analyse3.py", "evidence": {"dataset": "data/derivation-shares.json", "selector": "t3_low_falling.share", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "the derivation answers the question"}, "replicated": {"status": "not-attempted", "ref": "REPLICATION_B.md"}, "limits": "That shape is the half-third allotone, and counting it as the third tone would raise the derivation's headline. It is quoted here because it is the competing explanation for this run's own low third-tone figure, and nothing in either design separates the two.", "post_hoc": false}
{"id": "C-96", "type": "measured", "claim": "Reading the third tone off the quarter of its nuclei with the least voiced pitch returns <Val id=\"C-96\" /> of them dipping, against 0.3571 for the best-covered quarter.", "value": [0.2667, 0.1333, 0.0714, 0.3571], "unit": "share of graded nuclei", "n": 58, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/coverage-gradient.json", "selector": "3.quartile_shares", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; written after the independent derivation reported the same check"}, "replicated": {"status": "not-attempted", "ref": "REPLICATION_B.md reports the same check on its own data"}, "limits": "This run cannot carry the check. Fourteen nuclei per quarter put an interval of about a quarter of a share on each figure, which swamps any gradient; the derivation reached the same conclusion on 192 third-tone syllables and this run reaches nothing on 58, which is why the article reports its finding and not this one as evidence.", "post_hoc": true}
{"id": "C-97", "type": "measured", "claim": "The fourth tone, on the same quartering, runs <Val id=\"C-97\" /> across its four quarters.", "value": [0.6538, 0.7308, 0.8077, 0.8462], "unit": "share of graded nuclei", "n": 104, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/coverage-gradient.json", "selector": "4.quartile_shares", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; post-hoc, see C-96"}, "replicated": {"status": "not-attempted", "ref": "a control, not a replicated result"}, "limits": "The fourth tone is the control the derivation used too: a longer window on a falling tone includes the flat bottom of the fall, so a rising gradient here is what the measurement artefact predicts and is not evidence about the notation.", "post_hoc": true}
{"id": "C-54", "type": "measured", "claim": "The corpus is <Val id=\"C-54\" /> recordings.", "value": 624, "unit": "recordings", "n": null, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/corpus-shape.json", "selector": "totals.recordings", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; the counts were fixed before the run but no share over them was predicted"}, "replicated": {"status": "re-executed", "ref": "the replication ran over the same 624 files and found the same 1212 nuclei"}, "limits": "Recordings, not speakers and not words: one recording can be claimed by more than one corpus item, and 30 Lingua Libre files are.", "post_hoc": false}
{"id": "C-55", "type": "measured", "claim": "They were spoken by <Val id=\"C-55\" /> people.", "value": 20, "unit": "speakers", "n": null, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/corpus-shape.json", "selector": "totals.speakers", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; the counts were fixed before the run but no share over them was predicted"}, "replicated": {"status": "re-executed", "ref": "the replication ran over the same 624 files and found the same 1212 nuclei"}, "limits": "Twenty volunteers and readers, of whom four supply most of one corpus and eight all of the other; this is not a sample of Mandarin speakers and nothing here describes a population.", "post_hoc": false}
{"id": "C-56", "type": "measured", "claim": "They claim <Val id=\"C-56\" /> syllables in total.", "value": 1303, "unit": "syllables", "n": null, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/corpus-shape.json", "selector": "totals.claimed_syllables", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; the counts were fixed before the run but no share over them was predicted"}, "replicated": {"status": "re-executed", "ref": "the replication ran over the same 624 files and found the same 1212 nuclei"}, "limits": "Claimed by the corpus, not heard: a syllable is counted here because a manifest says the word has it, before anything is measured.", "post_hoc": false}
{"id": "C-57", "type": "measured", "claim": "The volunteer recordings contribute <Val id=\"C-57\" /> files.", "value": 400, "unit": "recordings", "n": null, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/corpus-shape.json", "selector": "per_corpus.ll.recordings", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; the counts were fixed before the run but no share over them was predicted"}, "replicated": {"status": "re-executed", "ref": "the replication ran over the same 624 files and found the same 1212 nuclei"}, "limits": "One corpus is not the other: these are single words read aloud by volunteers on a public pronunciation project, two thirds of them one syllable long, and the other corpus is read word utterances of two to four syllables. Their shares are never pooled.", "post_hoc": false}
{"id": "C-58", "type": "measured", "claim": "The read utterances contribute <Val id=\"C-58\" /> files.", "value": 224, "unit": "recordings", "n": null, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/corpus-shape.json", "selector": "per_corpus.a3.recordings", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; the counts were fixed before the run but no share over them was predicted"}, "replicated": {"status": "re-executed", "ref": "the replication ran over the same 624 files and found the same 1212 nuclei"}, "limits": "Content that is mostly music-application search phrases and singer names, so the vocabulary is not representative of ordinary speech either.", "post_hoc": false}
{"id": "C-59", "type": "measured", "claim": "On the volunteer recordings the boundary the perturbation moves sits a median of <Val id=\"C-59\" /> from where the other cue puts it.", "value": 75.0, "unit": "milliseconds", "n": 659, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/corpus-shape.json", "selector": "boundary_move.ll.median_ms", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; the counts were fixed before the run but no share over them was predicted"}, "replicated": {"status": "re-executed", "ref": "the replication ran over the same 624 files and found the same 1212 nuclei"}, "limits": "A median over nuclei, not a bound: a quarter of them disagree by more than 160 milliseconds and the largest disagreements are far outside that.", "post_hoc": false}
{"id": "C-62", "type": "measured", "claim": "On the read utterances the same disagreement has a median of <Val id=\"C-62\" />.", "value": 160.0, "unit": "milliseconds", "n": 553, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/corpus-shape.json", "selector": "boundary_move.a3.median_ms", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; the counts were fixed before the run but no share over them was predicted"}, "replicated": {"status": "re-executed", "ref": "the replication ran over the same 624 files and found the same 1212 nuclei"}, "limits": "Twice the volunteer corpus, because these words are two to four syllables long and the energy cue merges neighbouring syllables in them.", "post_hoc": false}
{"id": "C-63", "type": "measured", "claim": "The segmentation agrees with the claimed syllable count on <Val id=\"C-63\" /> files.", "value": 309, "unit": "files", "n": 624, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/corpus-shape.json", "selector": "totals.files_segmentation_agrees", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; the counts were fixed before the run but no share over them was predicted"}, "replicated": {"status": "re-executed", "ref": "the replication ran over the same 624 files and found the same 1212 nuclei"}, "limits": "And on the rest it does not, so this is the numerator of the share in C-09 and the reason every per-tone figure is computed on less than half the corpus.", "post_hoc": false}
{"id": "C-64", "type": "measured", "claim": "The corpus claims <Val id=\"C-64\" /> neutral syllables.", "value": 57, "unit": "syllables", "n": 1303, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/corpus-shape.json", "selector": "claimed_by_tone.5", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; the counts were fixed before the run but no share over them was predicted"}, "replicated": {"status": "re-executed", "ref": "the replication ran over the same 624 files and found the same 1212 nuclei"}, "limits": "They are counted and published and in no per-tone share, because the notation gives the neutral tone no shape for a contour to match.", "post_hoc": false}
{"id": "C-75", "type": "measured", "claim": "The second method measured <Val id=\"C-75\" /> syllables against this run's three hundred and eighty-six graded nuclei.", "value": 1085, "unit": "syllables", "n": null, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/derivation-shares.json", "selector": "headline.n", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "the derivation answers the question"}, "replicated": {"status": "not-attempted", "ref": "REPLICATION_B.md"}, "limits": "It places boundaries by dynamic programming against the known syllable count instead of detecting them, which is why it keeps this many; the two designs therefore disagree about their own denominators as much as about their answers.", "post_hoc": false}
{"id": "C-76", "type": "measured", "claim": "A classifier trained on every speaker but one and tested on the one it has not heard recovers the tone from the measured contours <Val id=\"C-76\" /> of the time.", "value": 0.639, "unit": "percent", "n": 1085, "obtained_at": "2026-09-10T22:37:00Z", "obtained_by": "the derivation session, tools/discriminability.py", "evidence": {"dataset": "data/derivation-classifier.json", "selector": "own_grid.accuracy_share", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "the derivation answers the question"}, "replicated": {"status": "not-attempted", "ref": "REPLICATION_B.md"}, "limits": "This is the check that the low shape-match rate is a statement about the notation rather than about the pitch tracking, and it belongs to the other method: this run never ran it.", "post_hoc": false}
{"id": "C-77", "type": "measured", "claim": "The largest single tone in the same sample accounts for <Val id=\"C-77\" /> of it.", "value": 0.294, "unit": "percent", "n": 1085, "obtained_at": "2026-09-10T22:37:00Z", "obtained_by": "the derivation session", "evidence": {"dataset": "data/derivation-classifier.json", "selector": "own_grid.baseline_share", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "the derivation answers the question"}, "replicated": {"status": "not-attempted", "ref": "REPLICATION_B.md"}, "limits": "The baseline the accuracy has to beat. It is quoted because an accuracy without its baseline is not a result.", "post_hoc": false}
{"id": "C-78", "type": "measured", "claim": "The same classifier on the same contours without each speaker's own pitch removed scores <Val id=\"C-78\" />.", "value": 0.295, "unit": "percent", "n": 1085, "obtained_at": "2026-09-10T22:37:00Z", "obtained_by": "the derivation session", "evidence": {"dataset": "data/derivation-classifier.json", "selector": "absolute_semitones.accuracy_share", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "the derivation answers the question, and bears on the withdrawn expectation 3"}, "replicated": {"status": "not-attempted", "ref": "REPLICATION_B.md"}, "limits": "Which is the baseline: in absolute pitch the tone is not recoverable at all, so this answers the speaker axis by a route that never compares two distances. It agrees with this run's own medians rather than opposing them, and it is not a second estimate of the same quantity: the two are different statistics over different units.", "post_hoc": false}
{"id": "C-79", "type": "measured", "claim": "Replacing the classifier's learned centroids with the notation's own four shapes drops it to <Val id=\"C-79\" />.", "value": 0.537, "unit": "percent", "n": 1085, "obtained_at": "2026-09-10T22:37:00Z", "obtained_by": "the derivation session", "evidence": {"dataset": "data/derivation-classifier.json", "selector": "notation_centroids.accuracy_share", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "the derivation answers the question"}, "replicated": {"status": "not-attempted", "ref": "REPLICATION_B.md"}, "limits": "The notation read literally onto the measured contours is a real but lossy summary of what the speakers do, worth about ten points of accuracy against centroids drawn from the speech.", "post_hoc": false}
{"id": "C-80", "type": "measured", "claim": "The third tone is recognised <Val id=\"C-80\" /> of the time when only its height is kept and all its movement is discarded.", "value": 0.76, "unit": "percent", "n": null, "obtained_at": "2026-09-10T22:37:00Z", "obtained_by": "the derivation session, tools/discriminability.py", "evidence": {"dataset": "data/derivation-classifier.json", "selector": "level_only_by_tone.T3", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "the derivation answers the question"}, "replicated": {"status": "not-attempted", "ref": "REPLICATION_B.md"}, "limits": "Movement alone keeps it 0.365. So in this corpus the third tone is identified by being low rather than by dipping, which is exactly what both a genuine low-falling variant and a truncated rise would produce, and is why neither method can settle which it is.", "post_hoc": false}
{"id": "C-65", "type": "measured", "claim": "This run graded <Val id=\"C-65\" /> nuclei in total, across the four tones.", "value": 386, "unit": "nuclei", "n": null, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/corpus-shape.json", "selector": "graded.graded_total", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; the counts were fixed before the run but no share over them was predicted"}, "replicated": {"status": "re-executed", "ref": "the replication ran over the same 624 files and found the same 1212 nuclei"}, "limits": "Against the second method's 1085, which is the whole difference between the two designs: this one detects syllable boundaries and keeps only the files where the count comes out right, the other places the boundaries by dynamic programming against the count it already knows.", "post_hoc": false}
{"id": "C-66", "type": "measured", "claim": "Of the neutral syllables, <Val id=\"C-66\" /> carried enough voiced pitch to measure at all.", "value": 24, "unit": "syllables", "n": 57, "obtained_at": "2026-09-10T19:05:37Z", "obtained_by": "uv run --project <tingyin>/packages/audio-gate python /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/measure-registered.py, then the analysis scripts in /Users/jakubzavada/Repositories/.claude/skills/general-article-research/runs/2026-09-10-tingyin-tone-measurement/tools/ (analyse.py, analyse2.py and the rest)", "evidence": {"dataset": "data/corpus-shape.json", "selector": "graded.neutral_measurable", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; the counts were fixed before the run but no share over them was predicted"}, "replicated": {"status": "re-executed", "ref": "the replication ran over the same 624 files and found the same 1212 nuclei"}, "limits": "They are described and not graded: the notation gives the neutral tone no shape, so a contour on one of them cannot match anything and cannot fail to.", "post_hoc": false}
{"id": "C-85", "type": "measured", "claim": "In the second method, the third tone dips <Val id=\"C-85\" /> across the four quarters of how much of the syllable could be measured.", "value": [0.021, 0.125, 0.208, 0.188], "unit": "share of graded syllables", "n": 48, "obtained_at": "2026-09-10T22:35:00Z", "obtained_by": "the derivation session, tools/t3check.py", "evidence": {"dataset": "data/derivation-t3check.json", "selector": "tone3_dipping_by_quartile", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "the derivation answers the question"}, "replicated": {"status": "not-attempted", "ref": "REPLICATION_B.md"}, "limits": "This is the check that decides how much of the low third-tone figure is the measurement rather than the language, and it belongs to the other method. The rate climbs across the first three quarters and does not reach a plateau, because even the best-covered quarter measures only 0.74 of the syllable, so the true figure is a floor and not an estimate.", "post_hoc": false}
{"id": "C-86", "type": "measured", "claim": "The first tone, the control, matches <Val id=\"C-86\" /> across the same quartering.", "value": [0.545, 0.53], "unit": "share of graded syllables", "n": 100, "obtained_at": "2026-09-10T22:35:00Z", "obtained_by": "the derivation session, tools/t3check.py", "evidence": {"dataset": "data/derivation-t3check.json", "selector": "tone1_control_match", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "the derivation answers the question"}, "replicated": {"status": "not-attempted", "ref": "REPLICATION_B.md"}, "limits": "A control with almost no syllables at the low end, eleven of them, so it shows no gradient and could not have shown one.", "post_hoc": false}
{"id": "C-87", "type": "measured", "claim": "The fourth tone, the other control, matches <Val id=\"C-87\" /> across it.", "value": [0.9, 0.695], "unit": "share of graded syllables", "n": 50, "obtained_at": "2026-09-10T22:35:00Z", "obtained_by": "the derivation session, tools/t3check.py", "evidence": {"dataset": "data/derivation-t3check.json", "selector": "tone4_control_match", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "the derivation answers the question"}, "replicated": {"status": "not-attempted", "ref": "REPLICATION_B.md"}, "limits": "The gradient runs the other way here, which is what a longer window does to a falling tone as it starts to include the flat bottom of the fall. It is why a gradient alone cannot be read as the instrument losing a dip.", "post_hoc": false}
{"id": "C-88", "type": "measured", "claim": "In the <Denom id=\"C-88\" /> recordings that carry a dictionary reading, <Val id=\"C-88\" /> syllable pairs read as a third tone followed by another, and in every one of them the spoken label records a rise on the first syllable.", "value": 17, "unit": "syllable pairs", "n": 400, "obtained_at": "2026-09-11T09:10:00Z", "obtained_by": "tools/t3-sandhi.py, run 2026-09-11", "evidence": {"dataset": "data/derivation-sandhi.json", "selector": "dictionary_third_then_third_pairs", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "no pre-registration line; a confound this run never checked and the derivation did"}, "replicated": {"status": "not-attempted", "ref": "REPLICATION_B.md"}, "limits": "Third-tone sandhi is the one systematic way a dictionary label could be wrong for what the speaker said. The context does occur, in these pairs, and the spoken labels already carry the resulting rise, so no sandhi-affected syllable is graded as a third tone. The read-speech half of the corpus carries no dictionary reading at all, so the question was not examined there, which is a gap and not a clean result. An earlier reading of this row counted surface third tones standing before another and published the zero as evidence the context never occurs; that count is zero by construction and the row was corrected on 11 Sep 2026.", "post_hoc": false}
{"id": "C-89", "type": "measured", "claim": "The third tone dips least in the middle of a word and most on its own: <Val id=\"C-89\" /> non-finally, 0.117 phrase-finally and 0.208 in isolation.", "value": [0.157, 0.117, 0.208], "unit": "share of graded syllables", "n": 103, "obtained_at": "2026-09-10T22:35:00Z", "obtained_by": "the derivation session, tools/t3check.py", "evidence": {"dataset": "data/derivation-t3check.json", "selector": "tone3_dipping_by_position", "run": "logs/measure-01.log and logs/analyse-01.log"}, "expectation": {"verdict": "not-predicted", "field": "the derivation answers the question"}, "replicated": {"status": "not-attempted", "ref": "REPLICATION_B.md"}, "limits": "Position is where the rival explanation lives: a low falling third tone in the middle of a word is the half-third allotone, and an isolated citation reading is where the full dip is supposed to appear. The order here is the one that explanation predicts, and it is equally what a truncated rise produces, so it separates neither.", "post_hoc": false}
