Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
217 commits
Select commit Hold shift + click to select a range
11d181f
test(mir): lock structure noninferiority evidence contract
seonghobae Sep 17, 2026
bbfa248
feat(mir): validate preregistered structure noninferiority evidence
seonghobae Sep 17, 2026
ff268eb
test(mir): require per-track structure evidence and deviations
seonghobae Sep 17, 2026
7c2d0ad
feat(mir): bind per-track structure evidence to preregistration
seonghobae Sep 17, 2026
0d32e17
docs(mir): doctor structure feature noninferiority gate
seonghobae Sep 17, 2026
f25ba43
docs(mir): place noninferiority record under traceability
seonghobae Sep 17, 2026
6a51021
docs(mir): remove duplicate doctoring record
seonghobae Sep 17, 2026
677b309
test(mir): freeze uncertainty plan and metric triplets
seonghobae Sep 17, 2026
c164179
test(mir): bound machine-readable evidence admission
seonghobae Sep 17, 2026
edfdcef
feat(mir): bind uncertainty plan and recognized metric receipts
seonghobae Sep 17, 2026
ddb88a0
docs(mir): bind uncertainty and evidence admission
seonghobae Sep 17, 2026
4db2191
test(mir): reject relative local provenance paths
seonghobae Sep 17, 2026
028ee71
fix(mir): require explicit non-file provenance URIs
seonghobae Sep 17, 2026
e7490da
docs(mir): record provenance URI admission boundary
seonghobae Sep 17, 2026
4878960
test(mir): reject silent failed-track acceptance
seonghobae Sep 17, 2026
102b572
fix(mir): fail closed on unregistered track failures
seonghobae Sep 17, 2026
47d0932
docs(mir): make failed-track acceptance fail closed
seonghobae Sep 17, 2026
65f012d
test(mir): reject post-hoc measurement receipt fields
seonghobae Sep 17, 2026
8b5b8df
fix(mir): close measurement receipt schema
seonghobae Sep 17, 2026
d7c65fd
docs(mir): bind result measurement field set
seonghobae Sep 17, 2026
8c8b60d
test(mir): reject duplicate corpus audio identity
seonghobae Sep 17, 2026
71546ad
fix(mir): reject duplicate corpus audio identity
seonghobae Sep 17, 2026
7a6327b
docs(mir): record corpus content-identity guard
seonghobae Sep 17, 2026
f9e2edb
docs(mir): connect corpus identity guard to MIR de-duplication evidence
seonghobae Sep 17, 2026
23698b2
test(mir): reject aggregate receipts detached from track evidence
seonghobae Sep 17, 2026
5953037
revert(mir): keep aggregation procedure scientifically undecided
seonghobae Sep 17, 2026
c9cb23b
test(mir): reject unregistered evidence envelope fields
seonghobae Sep 17, 2026
515d189
test(mir): cover nested result envelope drift
seonghobae Sep 17, 2026
4b2f1f3
fix(mir): close scientific evidence envelope schema
seonghobae Sep 17, 2026
8a60241
docs(mir): close evidence envelope and preserve aggregation boundary
seonghobae Sep 17, 2026
dad6e22
test(mir): close nested registration evidence objects
seonghobae Sep 17, 2026
a43e2f3
fix(mir): close nested preregistration schema objects
seonghobae Sep 17, 2026
e69ee29
docs(mir): document nested closed-world preregistration
seonghobae Sep 17, 2026
ac81bf9
test(mir): reject post-result claim-boundary expansion
seonghobae Sep 17, 2026
0c52e51
test(mir): bind result claim fixture to preregistration
seonghobae Sep 17, 2026
5bca92a
fix(mir): freeze claim boundary before structure experiment
seonghobae Sep 17, 2026
9416304
docs(mir): bind scientific claim scope to preregistration
seonghobae Sep 17, 2026
efbadeb
test(mir): preserve failed-track receipts without fake metrics
seonghobae Sep 17, 2026
2308e13
test(mir): bind missing measurements to explicit track failure
seonghobae Sep 17, 2026
7c8dc8a
fix(mir): admit failed tracks without fabricated measurements
seonghobae Sep 17, 2026
4e58ae7
docs(mir): preserve real measurement failures without fake scores
seonghobae Sep 17, 2026
c4ed428
test(mir): keep failed-track regression formatter-safe
seonghobae Sep 17, 2026
39eb3da
test(mir): reject measurements on failed-track receipts
seonghobae Sep 17, 2026
5c6de3a
test(mir): reject summaries after track measurement failure
seonghobae Sep 17, 2026
643b09b
fix(mir): suppress invalid summaries after track failure
seonghobae Sep 17, 2026
cc5261f
docs(mir): define failed-run null summary contract
seonghobae Sep 17, 2026
240feb8
test(mir): expose normalized experiment identity mismatch
seonghobae Sep 17, 2026
e0b897b
fix(mir): compare normalized preregistered experiment identity
seonghobae Sep 17, 2026
76053a9
docs(mir): record normalized experiment identity binding
seonghobae Sep 17, 2026
83e59f2
research(mir): admit local real-audio corpus bytes
seonghobae Sep 17, 2026
6a0c80f
test(mir): guard real-audio corpus admission
seonghobae Sep 17, 2026
e1de498
docs(mir): trace local corpus admission evidence
seonghobae Sep 17, 2026
f3abb64
test(mir): normalize runtime digest identity
seonghobae Sep 17, 2026
174c6d3
fix(mir): normalize registered runtime digests
seonghobae Sep 17, 2026
3effa5a
docs(mir): record canonical runtime hex identity
seonghobae Sep 17, 2026
1f65343
test(mir): require immutable admitted audio snapshot
seonghobae Sep 17, 2026
47184b8
fix(mir): decode immutable admitted audio snapshot
seonghobae Sep 17, 2026
f28764f
test(mir): make snapshot mutation check portable
seonghobae Sep 17, 2026
647481b
docs(mir): bind decode to immutable admitted snapshot
seonghobae Sep 17, 2026
af927bb
test(mir): require admitted PCM handoff to runner
seonghobae Sep 17, 2026
813dd92
fix(mir): hand admitted PCM directly to experiment consumer
seonghobae Sep 17, 2026
359b95d
docs(mir): bind runner handoff to admitted PCM
seonghobae Sep 17, 2026
12fa14b
test(mir): document corpus-admission contracts
seonghobae Sep 17, 2026
692011d
docs(mir): satisfy admission docstring gate
seonghobae Sep 17, 2026
1e5aa12
test(mir): reject mutation of admitted annotation snapshot
seonghobae Sep 17, 2026
61a74d6
fix(mir): detect consumer mutation of admitted annotations
seonghobae Sep 17, 2026
383cd57
docs(mir): trace consumer mutation fail-closed boundary
seonghobae Sep 17, 2026
106d4e3
test(mir): bind manifest size and bytes to one descriptor
seonghobae Sep 17, 2026
ad5daf3
fix(mir): load admission manifest from one descriptor
seonghobae Sep 17, 2026
0c4e1b4
docs(mir): trace single-descriptor manifest admission
seonghobae Sep 17, 2026
9861707
test(mir): reject dirty source identity for real-audio runs
seonghobae Sep 17, 2026
4e8f3fa
fix(mir): require clean registered source worktree
seonghobae Sep 17, 2026
0e5ed41
docs(mir): bind experiments to clean registered source
seonghobae Sep 17, 2026
5654096
test(mir): consolidate runtime source-identity policy
seonghobae Sep 17, 2026
bc0eb40
test(mir): consolidate source identity into runtime policy
seonghobae Sep 17, 2026
59cb9dc
test(mir): require immutable admitted annotations
seonghobae Sep 17, 2026
62d7d0b
fix(mir): make admitted annotations intrinsically immutable
seonghobae Sep 17, 2026
4da0bd9
test(mir): consume immutable annotation views
seonghobae Sep 17, 2026
8731ffb
docs(mir): record immutable annotation handoff
seonghobae Sep 17, 2026
e6a62f3
test(mir): bind immutable PCM handoff to receipt digest
seonghobae Sep 17, 2026
5b0660e
fix(mir): bind immutable PCM handoff to receipt identity
seonghobae Sep 17, 2026
e6f3ba0
docs(mir): bind PCM receipt identity to immutable handoff
seonghobae Sep 17, 2026
cd4818f
test(mir): reject unverifiable decoder receipts
seonghobae Sep 17, 2026
f608508
test(mir): expose PCM in admission fixture decoder
seonghobae Sep 17, 2026
4bd685a
fix(mir): require verifiable PCM for admission receipts
seonghobae Sep 17, 2026
205ae80
docs(mir): close digest-only decoder evidence gap
seonghobae Sep 17, 2026
f453e9b
test(mir): reject non-finite admitted PCM
seonghobae Sep 17, 2026
c87d980
fix(mir): reject non-finite decoded PCM
seonghobae Sep 17, 2026
acf7adf
style(mir): format non-finite PCM regression
seonghobae Sep 17, 2026
ae2cb08
docs(mir): trace non-finite PCM admission boundary
seonghobae Sep 17, 2026
ea20efd
test(mir): reject coerced decoded frame counts
seonghobae Sep 17, 2026
527fda5
fix(mir): reject coerced decoded frame counts
seonghobae Sep 17, 2026
7fac0fe
docs(mir): trace strict decoder frame evidence
seonghobae Sep 17, 2026
394e161
test(mir): require atomic receipt publication
seonghobae Sep 17, 2026
7941fd6
fix(mir): publish admission receipts atomically
seonghobae Sep 17, 2026
1e86c3b
docs(mir): trace atomic receipt publication
seonghobae Sep 17, 2026
b48340b
style(mir): preserve source newline at EOF
seonghobae Sep 17, 2026
2e046ba
docs(mir): record receipt publication follow-up
seonghobae Sep 17, 2026
4275f92
test(mir): reject linked scientific evidence paths
seonghobae Sep 17, 2026
8f68c11
fix(mir): refuse linked evidence inputs
seonghobae Sep 17, 2026
b62bc82
docs(mir): trace evidence no-follow admission
seonghobae Sep 17, 2026
6f19315
test(mir): freeze functional-label evaluation semantics
seonghobae Sep 18, 2026
03b26bf
fix(mir): preregister functional-label evaluation contract
seonghobae Sep 18, 2026
4936cef
test(mir): align registrations with functional-label contract
seonghobae Sep 18, 2026
1839586
test(mir): align corpus fixtures with label contract
seonghobae Sep 18, 2026
df33359
docs(mir): freeze functional-label ACC interpretation contract
seonghobae Sep 18, 2026
c083c37
docs(mir): bind ACC frame and annotation semantics
seonghobae Sep 18, 2026
ff8aa8d
docs(mir): explain best-effort cleanup boundaries
seonghobae Sep 18, 2026
cc4a166
test(mir): define normalized functional annotation parser contract
seonghobae Sep 18, 2026
0ee4a6a
feat(mir): parse preregistered functional annotation contract
seonghobae Sep 18, 2026
87e0cde
docs(mir): bind normalized annotation parser implementation
seonghobae Sep 18, 2026
52b6c73
docs(mir): distinguish local TSV from MIREX output format
seonghobae Sep 18, 2026
c84d3ff
docs(mir): align local annotation format with MIREX authority
seonghobae Sep 18, 2026
73ddb08
test(mir): freeze functional ACC frame-grid semantics
seonghobae Sep 18, 2026
cd06926
test(mir): defer ACC frame-grid rule pending evaluator contract
seonghobae Sep 18, 2026
27304ac
docs(mir): record unresolved ACC frame-grid evaluator choice
seonghobae Sep 18, 2026
6c20500
test(mir): pin functional ACC to official evaluator grid
seonghobae Sep 18, 2026
0f1e3e7
fix(mir): align functional ACC registration with official grid
seonghobae Sep 18, 2026
86e6be0
test(mir): align shared registration with official ACC
seonghobae Sep 18, 2026
02c73b1
test(mir): align corpus registration with official ACC
seonghobae Sep 18, 2026
7f221ea
docs(mir): bind ACC to official evaluator semantics
seonghobae Sep 18, 2026
5cffef1
test(mir): define official ACC runner parity
seonghobae Sep 18, 2026
e72b295
feat(mir): add pinned functional ACC evaluator adapter
seonghobae Sep 18, 2026
c84c0ac
test(mir): consume canonical functional segment value object
seonghobae Sep 18, 2026
fe3ed61
refactor(mir): reuse parser-owned functional segment contract
seonghobae Sep 18, 2026
f03a6ce
docs(mir): make structure gate evaluator-current
seonghobae Sep 18, 2026
2b1aa6c
docs(mir): record ACC evaluator adapter parity
seonghobae Sep 18, 2026
b42297e
test(mir): require admitted-track paired functional accuracy
seonghobae Sep 18, 2026
a3bfbe2
feat(mir): score paired ACC on admitted PCM handoff
seonghobae Sep 18, 2026
532b827
docs(mir): bind ACC to admitted-track paired consumer
seonghobae Sep 18, 2026
4a0a09d
test(mir): require repository-owned paired feature lanes
seonghobae Sep 18, 2026
d9f7604
feat(mir): parameterize structure chroma representation
seonghobae Sep 18, 2026
3b5f82d
feat(mir): bind admitted PCM to CQT and STFT lanes
seonghobae Sep 18, 2026
21eeb46
feat(mir): bind paired ACC to registered CQT-STFT lanes
seonghobae Sep 18, 2026
0b0f05f
test(mir): freeze CQT-STFT hypothesis factory
seonghobae Sep 18, 2026
bd08323
docs(mir): trace registered CQT-STFT measurement lanes
seonghobae Sep 18, 2026
8147c2b
fix(mir): make feature literal validation type-safe
seonghobae Sep 18, 2026
eaadd47
fix(mir): make registered feature literal type-safe
seonghobae Sep 18, 2026
5d50999
test(mir): lock public lane feature propagation
seonghobae Sep 18, 2026
3cdf045
test(mir): preregister boundary and repetition metric adapter
seonghobae Sep 18, 2026
e570c41
feat(mir): add pinned boundary and repetition metric adapter
seonghobae Sep 18, 2026
93df1d4
test(mir): isolate metric backend version identity
seonghobae Sep 18, 2026
e4729c3
docs(mir): trace boundary and repetition metric authority
seonghobae Sep 18, 2026
37f3549
test(mir): require exact structure metric runtime lock
seonghobae Sep 18, 2026
8b49591
feat(mir): verify exact research metric runtime artifact
seonghobae Sep 18, 2026
2338832
feat(mir): lock reviewed mir_eval research wheel
seonghobae Sep 18, 2026
fbb7c1d
test(mir): require admitted-track segmentation metric evidence
seonghobae Sep 18, 2026
59c271f
refactor(mir): separate lock identity from installed runtime check
seonghobae Sep 18, 2026
773ffd2
feat(mir): emit recognized metrics on admitted track evidence
seonghobae Sep 18, 2026
616a26e
docs(mir): bind segmentation metric runtime and admitted-track evidence
seonghobae Sep 18, 2026
7f75895
style(mir): format admitted-track metric regression
seonghobae Sep 18, 2026
5798efb
style(mir): format metric runtime lock regression
seonghobae Sep 18, 2026
90f3fa5
style(mir): format structure metric runtime verifier
seonghobae Sep 18, 2026
1ce7317
test(mir): preregister exact segmentation metric contract
seonghobae Sep 18, 2026
580f2af
feat(mir): validate exact segmentation metric preregistration
seonghobae Sep 18, 2026
fd43da9
test(mir): exercise metric-aware registration digest
seonghobae Sep 18, 2026
880e0db
refactor(mir): make metric contract a digest envelope
seonghobae Sep 18, 2026
cadba9b
refactor(mir): make metric-aware validator canonical
seonghobae Sep 18, 2026
f961390
test(mir): bind canonical digest to exact metric contract
seonghobae Sep 18, 2026
3df3694
test(mir): cross-check preregistration against metric owners
seonghobae Sep 18, 2026
830fbfe
docs(mir): trace metric-aware registration digest
seonghobae Sep 18, 2026
9fdba32
docs(mir): make preregistration digest semantics code-current
seonghobae Sep 18, 2026
4416e65
test(mir): preregister paired track aggregation semantics
seonghobae Sep 18, 2026
3b51825
feat(mir): implement paired track bootstrap aggregation
seonghobae Sep 18, 2026
b40ad56
feat(mir): bind aggregation and bootstrap semantics
seonghobae Sep 18, 2026
62ae2cd
test(mir): bind aggregation owner to preregistration digest
seonghobae Sep 18, 2026
d297a66
test(mir): allow asymmetric percentile bootstrap intervals
seonghobae Sep 18, 2026
aad0492
fix(mir): preserve percentile bootstrap interval semantics
seonghobae Sep 18, 2026
69d97f6
docs(mir): align bootstrap decision traceability
seonghobae Sep 18, 2026
f866662
test(mir): preserve percentile CI decision thresholds
seonghobae Sep 18, 2026
c3f38db
fix(test): satisfy percentile regression docstring gate
seonghobae Sep 18, 2026
aacb026
test(mir): require canonical aggregation receipt binding
seonghobae Sep 18, 2026
5f47924
fix(mir): bind aggregate receipt to registered tracks
seonghobae Sep 18, 2026
4cdcf19
test(mir): make result fixtures canonical bootstrap receipts
seonghobae Sep 18, 2026
da51a8a
fix(mir): bind percentile evidence to canonical bootstrap
seonghobae Sep 18, 2026
5f698c4
test(mir): separate percentile compatibility from receipt admission
seonghobae Sep 18, 2026
59d9c30
test(mir): derive threshold failures from canonical track evidence
seonghobae Sep 18, 2026
40922f8
docs(mir): trace canonical result receipt binding
seonghobae Sep 18, 2026
eb7736f
docs(mir): bind result admission and remaining timing gap
seonghobae Sep 18, 2026
6fcc9e9
test(mir): preregister lane latency and RSS contract
seonghobae Sep 18, 2026
0b80bc2
feat(mir): implement isolated latency and peak RSS measurement
seonghobae Sep 18, 2026
3877adc
feat(mir): bind performance measurement semantics to registration
seonghobae Sep 18, 2026
bf905c7
test(mir): require performance evidence on admitted track
seonghobae Sep 18, 2026
f06f1dc
feat(mir): bind isolated performance evidence to admitted tracks
seonghobae Sep 18, 2026
a05c345
test(mir): align metric contract fixture with performance owner
seonghobae Sep 18, 2026
6d49d7a
fix(mir): remove unused resource-measurement import
seonghobae Sep 18, 2026
11c59ad
test(mir): isolate focused metric test from platform performance worker
seonghobae Sep 18, 2026
c1fc867
docs(mir): trace performance measurement contract
seonghobae Sep 18, 2026
7445f22
docs(mir): make noninferiority gate performance-code-current
seonghobae Sep 18, 2026
00d4efa
test(mir): require canonical track-result receipt producer
seonghobae Sep 18, 2026
334a78c
feat(mir): build result tracks from canonical admitted evidence
seonghobae Sep 18, 2026
5b380a8
test(mir): bind result fixture to exact metric runtime
seonghobae Sep 18, 2026
7d3529b
docs(mir): bind canonical track receipt provenance
seonghobae Sep 18, 2026
7a90b92
test(mir): require bound execution host identity
seonghobae Sep 18, 2026
70b8602
feat(mir): bind experiment execution to exact host profile
seonghobae Sep 18, 2026
f1a6971
test(mir): reject free-form execution host labels
seonghobae Sep 18, 2026
a31bebd
fix(mir): validate execution host contract before admission
seonghobae Sep 18, 2026
7b07c00
test(mir): bind host label rejection to execution gate
seonghobae Sep 18, 2026
7d3c28d
docs(mir): trace exact experiment host and execution contract
seonghobae Sep 18, 2026
e99ccec
style(mir): format canonical execution runner
seonghobae Sep 18, 2026
8bf2fe6
test(mir): document functional annotation regressions
seonghobae Sep 21, 2026
22da683
test(mir): document aggregation regressions
seonghobae Sep 21, 2026
2265cc6
test(mir): fail on performance contract drift
seonghobae Sep 21, 2026
f08a353
fix(mir): bind performance contract to runtime semantics
seonghobae Sep 21, 2026
53866fe
docs(mir): trace performance-contract drift repair
seonghobae Sep 21, 2026
d016491
fix(mir): apply Ruff import order to structure evidence tests
seonghobae Sep 21, 2026
2b92ce8
fix(mir): apply Ruff import order to structure evidence tests
seonghobae Sep 21, 2026
e37ff61
fix(mir): apply Ruff import order to structure evidence tests
seonghobae Sep 21, 2026
dd32c8a
fix(mir): apply Ruff import order to structure evidence tests
seonghobae Sep 21, 2026
7d9ee2b
fix(mir): apply Ruff import order to structure evidence tests
seonghobae Sep 21, 2026
212c195
fix(mir): apply Ruff import order to structure evidence tests
seonghobae Sep 21, 2026
eae63a9
fix(mir): apply Ruff import order to structure evidence tests
seonghobae Sep 21, 2026
275cada
fix(mir): apply Ruff import order to structure evidence tests
seonghobae Sep 21, 2026
6cdea53
fix(mir): remove residual Ruff import ambiguity
seonghobae Sep 22, 2026
823cd35
fix(research): sort functional-label policy imports
seonghobae Sep 22, 2026
715dc1a
chore(research): adopt canonical Ruff prerequisite
seonghobae Sep 22, 2026
7eb2b9d
repair(mir): apply hosted Ruff import grouping
seonghobae Sep 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 130 additions & 0 deletions docs/traceability/mir/functional-label-accuracy-contract.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
# Functional-label accuracy preregistration contract

Status: Proposed
Owner: Signal-MIR Analysis
Tracking: #1225, #1228
Parent: `docs/traceability/mir/structure-feature-noninferiority.md`

## Problem

The structure noninferiority registration originally named functional-label accuracy as `mirex2025.frame_level_accuracy` and later froze a BandScope-selected 100 ms frame size. That was still not a reproducible implementation identity. The MIREX task page describes frame-level ACC conceptually and gives 10 ms or 100 ms as examples, but the current official `ismir-mirex/mirex-evaluation` repository contains the executable MIREX 2025 reproduction used as the stronger authority for evaluator behavior.

At `ismir-mirex/mirex-evaluation@b9fa0b0b32e2145af31f35830f78fc9d09a4301b`, `music_structure_analysis/eval_script.py::calculate_accuracy` uses a default `frame_hop` of 0.2 seconds. It creates frame times with `np.arange(0, gt_duration, frame_hop)`, advances a segment while `t >= segment_end`, and counts all reference-grid frames in the denominator. Therefore the former 100 ms registration did not reproduce the current official evaluator and left the exact time-grid authority implicit.

Even after the evaluator and annotation parser were pinned, a second reproducibility gap remained: the ACC adapter was not connected to the corpus-admission callback. A later experiment runner could therefore have reopened local audio or annotation paths, decoded again, or supplied different PCM to the baseline and candidate lanes while still producing syntactically valid metric receipts.

## Decision

Schema v1 requires the `functional_label_accuracy` registration to contain, in addition to its noninferiority margin:

- `implementation = ismir-mirex/mirex-evaluation@b9fa0b0b32e2145af31f35830f78fc9d09a4301b:music_structure_analysis.eval_script.calculate_accuracy`;
- `frame_size_seconds = 0.2`;
- `frame_grid_contract_version = 1.0`;
- `annotation_contract_version = 1.0`;
- `label_mapping_contract_version = 1.0`.

`frame_grid_contract_version = 1.0` means the MIREX 2025 reproduction semantics at that pinned upstream commit:

- the grid origin is 0 seconds;
- frame points are `0.0, 0.2, 0.4, ...` while the point is strictly less than the ground-truth duration;
- an exact segment-end boundary belongs to the following segment because the evaluator advances while `t >= segment_end`;
- a final partial 200 ms span contributes a frame when its starting grid point is still below the ground-truth duration;
- every reference-grid frame contributes to the denominator;
- a frame contributes to the numerator only when the reference and prediction labels match and the reference label is not `other`.

This closes the frame-grid decision. The 200 ms value is not inferred from prose examples on the MIREX wiki; it is bound to the executable standardized-evaluation source and its exact commit.

## Annotation and label-mapping boundary

`annotation_contract_version = 1.0` is implemented by `scripts/research/parse_structure_functional_annotations.py`. It consumes the already-admitted read-only annotation snapshot and parses BandScope-local UTF-8 `start<TAB>end<TAB>label` rows into exact rational boundaries. This local TSV is not the MIREX submission transport syntax.

The normalized segmentation must start at 0.0, preserve source order, contain strictly positive segments with no gaps or overlaps, and end exactly at `decoded_frames / sample_rate_hz`. The parser never reopens a corpus path or repairs malformed evidence.

`label_mapping_contract_version = 1.0` is a fail-closed identity mapping at the acceptance boundary. The admitted normalized annotation bytes must already contain one of:

`intro`, `verse`, `chorus`, `bridge`, `inst`, `outro`, `silence`.

The official evaluator's raw-label preprocessing is broader: it case-folds labels, applies substring mappings such as `solo` → `inst`, and maps otherwise unknown labels to `other`; `other` reference frames remain in the ACC denominator but cannot contribute to the numerator. BandScope does not run that mutable normalization after preregistration. If a source corpus needs the official mapping, that transformation must be reviewed and applied before preregistration, and the resulting normalized annotation bytes receive their own `annotation_sha256`.

This separation is deliberate. The pinned upstream evaluator is authoritative for ACC time-grid and scoring semantics, while BandScope's content-addressed corpus boundary prevents label-mapping decisions from changing after candidate results are visible.

The MIREX task page also continues to expose a vocabulary inconsistency: descriptive prose includes `other`, while the operational seven-label output list includes `silence`. The local v1 annotation contract therefore does not guess between them at run time. A different mapping policy requires a new mapping-contract version and preregistration digest.

## Executable evaluator adapter

`scripts/research/evaluate_structure_functional_accuracy.py` owns the repository-side adapter for the preregistered normalized seven-label subset. It does not read files, map source labels, or duplicate the parser's `FunctionalSegment` value object. It accepts the parser-owned structural contract, validates continuous full-duration normalized segmentations, uses NumPy's 200 ms `arange` grid and the pinned evaluator's `t >= segment_end` pointer semantics, and returns track-level ACC plus frame counts and frame times.

The adapter deliberately rejects `other` at its input boundary because `other` is not part of the preregistered normalized corpus vocabulary. This is not a claim that the official evaluator lacks `other`; it means upstream raw-label mapping must be completed before preregistration so the acceptance run cannot change labels after results are visible.

## Exact admitted-track paired consumer

`scripts/research/evaluate_admitted_structure_track.py` now implements the functional-ACC consumer for `verify_structure_corpus.py`'s in-process `track_consumer` boundary. It receives only the already-verified track ID, immutable canonical PCM memoryview, immutable annotation snapshot, and registered sample rate. It does not receive or reopen workstation paths.

For each admitted track it:

- requires the PCM and annotation handoffs to be read-only contiguous memoryviews;
- derives `decoded_frames` from the canonical mono-float32 byte length and the exact duration as `decoded_frames / sample_rate_hz`;
- parses the reference segmentation from the admitted annotation bytes with the v1 parser;
- invokes the preregistered baseline and candidate segmentation lanes on the **same PCM memoryview object**, sample rate, and exact duration;
- evaluates both outputs with the pinned 200 ms functional-ACC adapter;
- records path-free evidence containing the track ID, PCM SHA-256, annotation SHA-256, frame/sample-rate identity, and baseline/candidate ACC frame counts;
- rejects duplicate measurement of the same track ID rather than letting one registered item inflate paired evidence.

The segmentation callbacks intentionally do not receive `track_id`. The measurement boundary therefore does not offer a built-in track-specific dispatch key that could select a different algorithm after corpus identity is known. This does not prove that arbitrary caller code is scientifically valid; the eventual baseline and candidate segmenter implementations still have to be pinned by the preregistration and reviewed before real-audio execution.

This consumer is research measurement infrastructure, not a production feature switch. It does not select the corpus, choose noninferiority margins, implement aggregation or uncertainty, alter `sections/segmenter.py`, or count synthetic fixtures as scientific acceptance.

## RED → GREEN lineage

The predecessor branch froze 100 ms but left the official implementation identity and frame-grid behavior unresolved. Fresh inspection of the current standardized evaluator at `b9fa0b0b32e2145af31f35830f78fc9d09a4301b` showed that its MIREX 2025 reproduction uses a 200 ms hop with explicit `np.arange` and segment-boundary behavior.

RED `6c20500bf31be88cd145f30fe7355a915066bdfc` changed the focused policy test to require the exact upstream commit/function identity, `frame_size_seconds = 0.2`, and `frame_grid_contract_version = 1.0`; the predecessor validator rejected that registration and still accepted the stale generic 100 ms contract.

GREEN `0f1e3e732154ff0ea94beb5a60e5702ed46c2453` changed the closed-world validator contract to the pinned official evaluator and 200 ms grid. Fixture alignment `86e6be0b41547ecd14b4f837ff6c88cf8f770b0b` and `02c73b1fff55def189bed8fe2d34d4b5ee83cb0a` moved the shared evidence and corpus-admission registrations onto the same contract instead of leaving successful tests on the stale 100 ms shape.

Evaluator RED `5cffef1a5db37b700ee7a27012c0f8324855665f` added executable parity cases for the pinned upstream identity, exact-boundary advancement, exclusion of a frame at exact track duration, inclusion of a trailing partial span when its grid point is below duration, and fail-closed normalized labels. GREEN `e72b29565a6d906a9955907656cbae97cffa471a` implemented the adapter. Consolidation `c84c0acdf25159f9aa066e21f9420d9fdf72c50a` / `fe3ed61a3b1926af6b39b6302d6f857979f9bccc` removed a duplicate segment value object so the evaluator consumes the parser-owned segment contract instead.

The immutable parser lineage remains parser RED `cc4a166cc9e1496cd562f7d79b9ffa30f6ca19c2` → GREEN `0ee4a6aed49c8f001da451ca63c5f20e52832f5c`, with authority correction `52b6c7362baa00151f908a24cadbb1efeddd2101` separating the BandScope TSV representation from the MIREX submission format.

Admitted-track integration RED `b42297e2300d3f9b085206ccfc796fd8bb7713b6` requires both measurement lanes to receive the exact same read-only PCM handoff, binds evidence to PCM/annotation hashes, rejects malformed or mutable PCM before either segmenter executes, and rejects duplicate track measurement. GREEN `a3bfbe2b4e76b62ba3446241bdfb467841bdaa93` implements that paired consumer without changing production segmentation.

## Constraints and rejected alternatives

Keeping 100 ms merely because the MIREX wiki lists it as an example was rejected. The executable standardized evaluator is more specific and currently uses 200 ms for the MIREX 2025 reproduction.

Keeping only a symbolic `mirex2025.frame_level_accuracy` implementation name was rejected because it cannot identify the code revision or distinguish future evaluator changes.

Using `mir_eval.util.intervals_to_samples` for ACC was rejected for this contract. It is a useful MIR utility, but the current official MIREX evaluator implements ACC with its own `np.arange` grid and pointer traversal; substituting another grid would no longer be exact evaluator parity.

Automatically normalizing labels during the acceptance run was rejected. Mapping `verse1`, `solo`, mixed case, or unknown labels after corpus bytes are frozen would reintroduce post-result freedom over the dependent variable. Source-vocabulary normalization belongs before preregistration and is content-addressed through `annotation_sha256`.

Parsing annotations inside resource admission was rejected. Resource admission owns byte identity and immutable handoff; Signal-MIR owns scientific interpretation and measurement.

Reopening or re-decoding the corpus separately for CQT and STFT was rejected. Paired measurement must consume the same immutable admitted PCM identity; otherwise a feature comparison can be confounded by decode or local-file drift.

Copying the PCM into independent baseline/candidate input buffers at this boundary was rejected. Both lanes now receive the same read-only memoryview object, making input identity explicit while preventing mutation through the consumer API.

Computing an aggregate or confidence interval in the admitted-track consumer was rejected. Aggregation and paired uncertainty remain unapproved scientific decisions and must be preregistered before candidate results are visible.

## Security Notes

- The consumer adds no filesystem, subprocess, network, model-download, or generic execution capability.
- PCM and annotation material are accepted only as immutable in-process views from resource admission; malformed shape or mutability fails before either measurement lane executes.
- Durable functional evidence contains content digests and measurement values, not workstation paths or raw licensed audio.
- The injected segmentation callables remain a code-review boundary. Real-audio execution must use preregistered repository-owned implementations; arbitrary runtime plugin loading is not introduced here.

## Claim boundary and next work

This contract now freezes the ACC evaluator identity, 200 ms grid, boundary-point behavior, final-partial-frame behavior, annotation interpretation, label-mapping boundary, repository-owned adapter, and the exact admitted-track paired functional-ACC handoff. It still does not implement the actual paired CQT/STFT segmentation lanes, the remaining recognized boundary/repetition metrics, approved aggregation/paired uncertainty, corpus/margin approval, or a production CQT → STFT switch.

The next causal scientific slice is to implement repository-owned baseline/candidate structure-measurement lanes over this same admitted PCM boundary and add the recognized boundary/deviation/repetition metrics without changing production behavior. Aggregation and paired uncertainty must then be reviewed and preregistered before any rights-cleared real-corpus candidate result is inspected.

Production acceptance still requires rights-cleared real decoded audio, independently reviewed normalized annotations, paired CQT/STFT execution on the same admitted signal/runtime identity, recognized track-level metrics, approved aggregate/CI evidence, current-head protected checks, and independent review.

Synthetic fixtures exercise only the measurement contract and are not production scientific acceptance.

## References

MIREX. (2026). *Music Structure Analysis*. International Music Information Retrieval Systems Evaluation Laboratory. https://music-ir.org/mirex/wiki/2026:Music_Structure_Analysis

MIREX Evaluation contributors. (2026). *music_structure_analysis/eval_script.py* (commit `b9fa0b0b32e2145af31f35830f78fc9d09a4301b`). GitHub. https://github.com/ismir-mirex/mirex-evaluation/blob/b9fa0b0b32e2145af31f35830f78fc9d09a4301b/music_structure_analysis/eval_script.py
Loading