claims:
- id: owen-matched-filter-loss
  statement: 'For normalized templates in Owen''s Gaussian-noise model, mismatch reduces the
    expected recovered SNR by the normalized template overlap.

    '
  evidence:
  - Owen, arXiv:gr-qc/9511032v1, Eqs. (1), (4)-(6), (10)
  - page/index.html::section 1, Scope and definitions
  numbers: []
- id: owen-local-metric
  statement: 'The Hessian of the match at coincident parameters defines a local metric with
    1-M = g_ij Delta-lambda^i Delta-lambda^j in Owen''s convention. The frozen finite-difference
    test passes the pre-registered relative-error criterion at mismatch 0.03, fails it at
    0.05, and does not establish an interval between those discrete radii.

    '
  evidence:
  - Owen, arXiv:gr-qc/9511032v1, Eqs. (11)-(13)
  - page/index.html::section 2, The metric we use
  numbers:
  - metric_validation_relative_error_limit
- id: owen-volume-count
  statement: 'Under Owen''s hypercubic covering model, the template count is proper parameter-space
    volume divided by the cell volume set by the minimal match.

    '
  evidence:
  - Owen, arXiv:gr-qc/9511032v1, Eqs. (14)-(16), (43)
  numbers:
  - owen_mm_fiducial
  - recomputed_initial_template_count
  - recomputed_advanced_template_count
  - owen_reported_initial_template_count
  - owen_reported_advanced_template_count
- id: owen-event-rate-scaling
  statement: 'With a homogeneous Euclidean source distribution and fixed threshold, the worst-case
    retained event rate scales as MM cubed.

    '
  evidence:
  - Owen, arXiv:gr-qc/9511032v1, Eq. (23) and surrounding discussion
  - scripts/reproduce_owen1995.py::compute
  numbers:
  - owen_mm_fiducial
  - owen_mm097_rate_fraction
  - owen_mm097_rate_loss
  - owen_event_loss_benchmark
- id: owen-historical-psd
  statement: 'The reproduction uses Owen''s analytic initial- and advanced-LIGO benchmark
    PSDs, which are historical inputs rather than current detector curves.

    '
  evidence:
  - Owen, arXiv:gr-qc/9511032v1, Eq. (17) and Sec. II B
  - scripts/reproduce_owen1995.py::reproduce_case
  numbers:
  - owen_initial_fs_hz
  - owen_initial_f0_hz
  - owen_advanced_fs_hz
  - owen_advanced_f0_hz
- id: owen-metric-reproduced
  statement: 'Direct quadrature of Owen''s noise moments followed by time projection reproduces
    the printed two-dimensional metric components to their shown precision.

    '
  evidence:
  - scripts/reproduce_owen1995.py::normalized_moments
  - scripts/reproduce_owen1995.py::dimensionless_premetric
  - scripts/reproduce_owen1995.py::projected_metric
  - Owen, arXiv:gr-qc/9511032v1, Eqs. (18), (33), (34), (38), (40), (42)
  numbers:
  - recomputed_initial_metric_11
  - recomputed_initial_metric_12
  - recomputed_initial_metric_22
  - recomputed_advanced_metric_11
  - recomputed_advanced_metric_12
  - recomputed_advanced_metric_22
  - recomputed_initial_sqrt_det
  - recomputed_advanced_sqrt_det
- id: owen-eigensystem-reproduced
  statement: 'Diagonalizing the full-precision recomputed metrics yields one stiff and one
    soft direction and the square-grid spacings reported in the note.

    '
  evidence:
  - scripts/reproduce_owen1995.py::symmetric_2x2_eigensystem
  - scripts/reproduce_owen1995.py::reproduce_case
  - Owen, arXiv:gr-qc/9511032v1, Eqs. (48)-(54)
  numbers:
  - recomputed_initial_eigenvalue_stiff
  - recomputed_initial_eigenvalue_soft
  - recomputed_advanced_eigenvalue_stiff
  - recomputed_advanced_eigenvalue_soft
  - recomputed_initial_spacing_stiff_ms
  - recomputed_initial_spacing_soft_ms
  - recomputed_advanced_spacing_stiff_ms
  - recomputed_advanced_spacing_soft_ms
- id: owen-domain-area-reproduced
  statement: 'Integrating the analytic mass-to-chirp-time Jacobian over Owen''s unbounded
    component-mass domain reproduces his Monte Carlo coordinate areas to the precision expected
    from the printed historical values.

    '
  evidence:
  - scripts/reproduce_owen1995.py::chirp_time_area
  - Owen, arXiv:gr-qc/9511032v1, Eqs. (35)-(36) and Sec. III B
  numbers:
  - owen_minimum_mass_solar
  - recomputed_initial_area_s2
  - recomputed_advanced_area_s2
  - owen_reported_initial_area_s2
  - owen_reported_advanced_area_s2
- id: owen-editorial-inconsistencies
  statement: 'Owen Eqs. (44)-(45) must scale with (1-MM)^-1 rather than MM^-1, Eq. (49) contains
    a self-referential basis-vector label, and recomputation exposes small numerical inconsistencies
    among the printed matrices, eigenvalues, and spacings.

    '
  evidence:
  - scripts/reproduce_owen1995.py::compute
  - Owen, arXiv:gr-qc/9511032v1, Eqs. (16), (43)-(45), (49)-(54)
  - page/owen.html::section 8.4
  numbers: []
- id: owen-historical-compute-cost
  statement: 'Owen''s online-search compute estimates are historical consequences of his PSD,
    waveform, filtering algorithm, and source-domain assumptions, not modern budgets.

    '
  evidence:
  - Owen, arXiv:gr-qc/9511032v1, Eqs. (55)-(61) and Sec. III D
  - page/owen.html::section 9.4
  numbers:
  - owen_reported_initial_gflops
  - owen_reported_advanced_gflops
  - owen_event_loss_benchmark
- id: q1bc-hook-loop-token-reconciliation
  statement: 'The first two q1bC Astra PI sessions consumed substantial quota while a broken
    relative Stop-hook path repeatedly returned errors; only planning reports survived, and
    the agent-team counter was reconciled before resumption.

    '
  evidence:
  - /home/juan/.codex/sessions/2026/09/14/rollout-2026-09-14T04-19-58-01a09e24-ad29-7a92-89cc-d7fc7e3e636b.jsonl::token_usage_record
    and hook error events
  - /home/juan/.codex/sessions/2026/09/14/rollout-2026-09-14T13-00-50-01a0a001-8a2d-7510-89d1-eb5f7a29cf57.jsonl::token_usage_record
    and hook error events
  - jobs/2026-09-14_041516_derive-q1bc/reports/r01-verifier.md::worker-output inventory
  - jobs/2026-09-14_041516_derive-q1bc/.claude/hooks/provenance_gate.py::job-local compatibility
    shim
  numbers:
  - q1bc_astra_loop_tokens_r01
  - q1bc_astra_loop_tokens_r02
  - q1bc_astra_loop_tokens_total
  - q1bc_reconciled_job_tokens_before_resume
- id: covering-at-mm097
  statement: 'Square and hexagonal banks are placed in (tau_0, tau_3) for the same nominal
    minimal match with a generation-wise local-metric method inspired by Cokelaer. The
    implementation replaces his explicit connector graph with distance-based collision
    suppression and adds its own greedy boundary repair, so its counts are not those of a
    faithful Cokelaer implementation. For both lattices we
    measure, by Monte Carlo over injected TaylorF2 signals and separately for interior and
    border injections, the fraction whose best match falls below MM, and determine whether
    any excess over the ideal geometric expectation comes from metric variation, the quadratic
    approximation, the boundaries or the implementation. The template counts are compared
    against the ideal constant-metric ratio 0.7698 and against all comparable Cokelaer banks:
    range 0.6605-0.7866 and mean 0.7191. The published range is descriptive, not an
    uncertainty interval.'
  status: 'MEASURED, and strict covering is REFUTED for both hexagonal banks: adaptive witnesses
    at mismatch 0.0322 and 0.0362 against a 0.03 target, reproduced independently. Both square
    banks survive the same search. The uniform-injection covering fractions have very little
    power and should not be read as support.'
  evidence:
  - data/part_d_mm097.json::counts, composition, covering fractions, border fractions
  - data/fig_covering.npz::per-injection best match and border flag, 3000 per region
  - data/fig_witnesses.json::the two adaptive-search witnesses that refute strict covering
  - data/region_geometry.json::proper areas, perimeters and effective widths
  - scripts/make_figures.py::figure_covering, figure_counts, figure_mismatch_map
  numbers:
  - adaptive_worst_mismatch_extended_hexagonal
  - adaptive_worst_mismatch_main_hexagonal
  - border_fraction_extended
  - border_fraction_main
  - covering_fraction_extended_hexagonal_mm097
  - covering_fraction_extended_square_mm097
  - covering_fraction_main_hexagonal_mm097
  - covering_fraction_main_square_mm097
  - cokelaer_hex_square_ratio_max
  - cokelaer_hex_square_ratio_mean
  - cokelaer_hex_square_ratio_min
  - cusp_secant_coefficient
  - effective_width_extended
  - effective_width_main
  - hex_square_ratio_extended_mm097
  - hex_square_ratio_main_mm097
  - ideal_hex_square_ratio
  - minimal_match_headline
  - n_templates_extended_hexagonal_mm097
  - n_templates_extended_square_mm097
  - n_templates_main_hexagonal_mm097
  - n_templates_main_square_mm097
  - proper_area_extended
  - proper_area_main
  - proper_perimeter_extended
  - proper_perimeter_main
- id: detection-threshold
  statement: At the pre-registered operating point, FAR = 1/(100 yr) over T_obs = 1 yr with
    FAP = 1 - exp(-FAR T_obs) under a Poisson false-alarm-process convention, the threshold
    rho* follows from the exact single-sample Gaussian tail of the phase-maximised statistic
    and an effective trial rate nu_eff calibrated from simulated maxima and extrapolated to
    T_obs. The independent-trials combination 1 - (1 - p)^N_eff is kept distinct from its
    rare-tail Poisson approximation, and the approximation error is measured. Closing the
    loop MM -> N_templates -> nu_eff -> rho* makes the threshold depend on the bank, with
    FAR = 1/yr and 5 sigma (global probability) as sensitivities.
  status: MEASURED. The naive trials bound is a proved upper bound for a finite grid in Gaussian
    noise; the calibrated rate is 6 to 58 times smaller and grows as N_templates^0.15-0.22
    within each family. The calibration is made near |z| = 5.3-5.8 and applied near 8.0-8.6,
    an extrapolation this work does not test.
  evidence:
  - data/part_e_mm097.json::thresholds at the operating point and its two sensitivities
  - data/part_e_nu_eff.json::the calibrated trials rate and its exponent, per family
  - scripts/make_figures.py::figure_trials
  numbers:
  - nu_eff_main_hexagonal_mm097
  - poisson_approximation_error
  - rho_star_naive_extended_hexagonal
  - rho_star_naive_extended_square
  - rho_star_naive_main_hexagonal
  - rho_star_naive_main_square
  - trials_exponent_extended_hexagonal
  - trials_exponent_extended_square
  - trials_exponent_main_hexagonal
  - trials_exponent_main_square
  - trials_exponent_pooled
- id: volume-loss-rule
  statement: 'The worst-case fractional detection-volume loss at fixed threshold is exactly
    1 - MM^3, of which 3(1 - MM) is the linear expansion; the population-average loss 1 -
    <M_bank^3> is estimated separately with the quadratic metric, for TaylorF2 injections
    (discretisation only) and IMRPhenomD
    injections (template-family error plus discretisation). With the bank-dependent threshold,
    the effective volume <M_bank^3>/rho*^3 is maximised over MM, and whether that maximum
    lies inside the range studied is reported with its uncertainty. This is a measurement
    of a known trade-off for this configuration, not a new effect: see prior_work. What is
    ours is the closed loop evaluated end to end with a modern PSD — nu_eff calibrated from
    simulated maxima rather than assumed, <M_bank^3> from metric-evaluated injections rather than from the
    geometric approximation, the three volume losses kept apart, and TaylorF2 and IMRPhenomD
    reported separately.'
  status: >-
    MEASURED WITH A MODEL LIMIT. The population-average loss is 4-9 times below the
    worst case. The pre-registered hypothesis of an interior V_eff optimum is not supported:
    the trend reverses between the naive and fitted trials models, while the fitted nu_eff
    is extrapolated beyond its calibration tail and that uncertainty is absent from the
    plotted bars. No robust optimum is resolved in the grid.
  evidence:
  - data/part_f_optimum.json::the three separated losses and V_eff under both trials models
  - scripts/make_figures.py::figure_volume_losses, figure_veff
  numbers:
  - imrphenomd_family_only_extended
  - imrphenomd_family_only_main
  - imrphenomd_volume_loss_extended
  - imrphenomd_volume_loss_main
  - population_volume_loss_extended_hexagonal_mm097
  - population_volume_loss_extended_square_mm097
  - population_volume_loss_main_hexagonal_mm097
  - population_volume_loss_main_square_mm097
  - veff_change_calibrated_extended_hexagonal
  - veff_change_calibrated_extended_square
  - veff_change_calibrated_main_hexagonal
  - veff_change_calibrated_main_square
  - veff_change_naive_extended_hexagonal
  - veff_change_naive_extended_square
  - veff_change_naive_main_hexagonal
  - veff_change_naive_main_square
  - worst_case_volume_loss_mm097
- id: same-content-two-formats
  statement: 'The HTML page and PDF state the same scientific conclusions, methodological
    scope and limitations, and cite exactly the same set of headline project-number keys.
    The HTML additionally carries two explicitly labelled supplementary covering diagnostics.'
  status: 'ENFORCED FOR NUMERIC KEYS: the HTML build fails if its num(...) keys differ from
    the paper''s dataref keys. Method wording and conclusions were reconciled by review;
    figures shared by both formats come from scripts/make_figures.py.'
  evidence:
  - scripts/make_page.py::check_shared_number_keys
  - tests/test_acceptance.py::Registry.test_html_and_paper_cite_the_same_project_numbers
  - scripts/make_page.py::num -- imports fmt from scripts/make_numbers_tex.py, which is the
    function the paper's \dataref macros are generated with
  - scripts/make_numbers_tex.py::fmt -- the single shared formatter
  - data/project_numbers.json -- the one registry both formats read
  - paper/main.tex and scripts/make_page.py::HTML -- shared method and conclusion wording
  numbers: []
- id: two-question-conclusion
  statement: >-
    In noise-free data the fractional SNR loss is exactly the mismatch. In the delivered
    MM = 0.97 banks, hexagonal placement uses fewer templates than square placement in both
    regions, but the saving differs by region and both hexagonal banks have adaptive
    counterexamples to strict covering; square placement has lower population-average
    discretisation loss and survives the same search. Densifying hexagonal placement reduces
    its loss, so neither lattice is universally better: the choice depends on template count,
    average loss, strict coverage, and effective detection volume. The much larger approximate
    loss in the extended region is driven mainly by TaylorF2 waveform-family error, while
    finite boundaries and the unresolved trials factor prevent a universal density or robust
    optimal minimal match from being inferred.
  evidence:
  - Owen, arXiv:gr-qc/9511032v1, Eqs. (1), (4)-(6), (10)-(16)
  - paper/main.tex::Scope and definitions; Limitations and conclusion
  - page/index.html::section 5, Conclusion
  - data/part_d_mm097.json::counts and boundary-repair composition
  - data/fig_witnesses.json::adaptive covering counterexamples
  - data/part_f_optimum.json::V_eff under naive and fitted trials models
  numbers:
  - adaptive_worst_mismatch_extended_hexagonal
  - adaptive_worst_mismatch_main_hexagonal
  - border_fraction_extended
  - border_fraction_main
  - hex_square_ratio_extended_mm097
  - hex_square_ratio_main_mm097
  - imrphenomd_family_only_extended
  - imrphenomd_family_only_main
  - imrphenomd_volume_loss_extended
  - imrphenomd_volume_loss_main
  - minimal_match_headline
  - n_templates_extended_hexagonal_mm097
  - n_templates_extended_square_mm097
  - n_templates_main_hexagonal_mm097
  - n_templates_main_square_mm097
  - population_volume_loss_extended_hexagonal_mm097
  - population_volume_loss_extended_square_mm097
  - population_volume_loss_main_hexagonal_mm097
  - population_volume_loss_main_square_mm097
- id: paper-length
  statement: The compiled manuscript uses five pages for the title, abstract, methods,
    results and conclusion; references begin on page six and occupy the final page.
  status: VERIFIED from the compiled PDF after the substantive revision.
  evidence:
  - paper/main.pdf::pagination and References heading
  - paper/main.tex::clearpage immediately before the bibliography
  - pdfinfo and pdftotext verification recorded during the revision
  numbers:
  - paper_body_pages
  - paper_total_pages
figures:
- file: figures/d_covering_cumulative.pdf
  produced_by: scripts/make_figures.py::figure_covering
  shows: 'Cumulative fraction of injections against the best match found in the bank, one
    panel per region, hexagonal and square overlaid, interior and border injections drawn
    apart. The reader should take that three of the four banks keep every injection right
    of MM = 0.97 and that the extended hexagonal interior curve crosses it.

    '
  from_scratch: 'the injection draw, the chirp-time map of each injection, the quadratic mismatch
    against every template of each bank, the border classification, and the empirical CDF

    '
  from_library: 'q1bC out/lib analytic_metric and tau (frozen 3.5PN projected-phase metric);
    numpy; matplotlib

    '
  choices:
  - PDF text is embedded with TrueType fonts (font type 42) rather than Type 3 so labels
    remain searchable and render cleanly
  - each interior/border curve is normalised within its own subset; the ordinate is therefore
    a conditional cumulative fraction, not a fraction of all injections
  - 3000 injections per region, uniform in component mass over the region -- a declared sampling
    choice, not an astrophysical population
  - seed 20260925, fixed before measuring
  - mismatch evaluated with the INJECTION's metric rather than the template's; the two differ
    and this is the convention the covering claim is stated in
  - log ordinate, without which a 1-in-1000 failure is invisible
  - border defined as within one covering radius of any region edge in the injection metric,
    on a boundary resampled at R/4 in proper length
  - colour follows the lattice and the region is the facet, so the reader learns one mapping
  how_this_could_fail: Any nonzero CDF ordinate left of MM = 0.97 refutes sampled covering.
  supports:
  - covering-at-mm097
- file: figures/d_covering_cumulative.png
  produced_by: scripts/make_figures.py::figure_covering
  shows: 'Cumulative fraction of injections against the best match found in the bank, one
    panel per region, hexagonal and square overlaid, interior and border injections drawn
    apart. The reader should take that three of the four banks keep every injection right
    of MM = 0.97 and that the extended hexagonal interior curve crosses it. Raster copy of
    the same call, for the HTML page.

    '
  from_scratch: 'the injection draw, the chirp-time map of each injection, the quadratic mismatch
    against every template of each bank, the border classification, and the empirical CDF

    '
  from_library: 'q1bC out/lib analytic_metric and tau (frozen 3.5PN projected-phase metric);
    numpy; matplotlib

    '
  choices:
  - each interior/border curve is normalised within its own subset; the ordinate is therefore
    a conditional cumulative fraction, not a fraction of all injections
  - 3000 injections per region, uniform in component mass over the region -- a declared sampling
    choice, not an astrophysical population
  - seed 20260925, fixed before measuring
  - mismatch evaluated with the INJECTION's metric rather than the template's; the two differ
    and this is the convention the covering claim is stated in
  - log ordinate, without which a 1-in-1000 failure is invisible
  - border defined as within one covering radius of any region edge in the injection metric,
    on a boundary resampled at R/4 in proper length
  - colour follows the lattice and the region is the facet, so the reader learns one mapping
  how_this_could_fail: Any nonzero CDF ordinate left of MM = 0.97 refutes sampled covering.
  supports:
  - covering-at-mm097
- file: figures/d_counts_and_ratio.pdf
  produced_by: scripts/make_figures.py::figure_counts
  shows: 'Top: bank size against nominal minimal match, both regions and both lattices, log
    ordinate. Bottom: the measured hexagonal/square count ratio against the ideal 0.7698 and
    the full 0.6605-0.7866 range recomputed from Cokelaer 2007, whose mean is 0.7191. The
    reader should take that the two regions do not share a universal ratio; the comparison
    does not validate this project as a faithful implementation of Cokelaer.

    '
  from_scratch: 'every bank in the MM grid was placed by work/d1/placement.py; the counts
    and the ratio are read from those banks

    '
  from_library: 'numpy; matplotlib. The reference values are quoted: 0.7698 is the constant-metric
    geometry (square cell 2R^2, hexagonal 3*sqrt(3)R^2/2); 0.6605-0.7866 and mean 0.7191 are
    recomputed from all comparable banks in Cokelaer 2007 Tables I-II

    '
  choices:
  - PDF text is embedded with TrueType fonts (font type 42) rather than Type 3 so labels
    remain searchable and render cleanly
  - ordinate spans 0.60-0.90 so the measured series and full published reference range remain
    legible
  - the counts are FULL banks, including the boundary repair, which is 50.7 % of the main
    hexagonal bank and 17.0 % of the extended square one; lattice-only ratios are 0.4882 and
    0.4225 and are reported in the text, not here
  - the Cokelaer range is a lightly shaded descriptive band and its mean is a separate line;
    the band is not presented as an uncertainty interval
  - MM grid 0.95-0.99 in steps of 0.01
  how_this_could_fail: If lattice efficiency alone set the ratio, both regions would follow
    one MM-independent line near the constant-metric ideal; they do not.
  supports:
  - covering-at-mm097
- file: figures/d_counts_and_ratio.png
  produced_by: scripts/make_figures.py::figure_counts
  shows: 'Top: bank size against nominal minimal match, both regions and both lattices, log
    ordinate. Bottom: the measured hexagonal/square count ratio against the ideal 0.7698 and
    the full 0.6605-0.7866 range recomputed from Cokelaer 2007, whose mean is 0.7191. The
    comparison is descriptive, not a validation of this project as a faithful implementation.
    Raster copy of the same call, for the HTML page.

    '
  from_scratch: 'every bank in the MM grid was placed by work/d1/placement.py; the counts
    and the ratio are read from those banks

    '
  from_library: 'numpy; matplotlib. The reference values are quoted: 0.7698 is the constant-metric
    geometry (square cell 2R^2, hexagonal 3*sqrt(3)R^2/2); 0.6605-0.7866 and mean 0.7191 are
    recomputed from all comparable banks in Cokelaer 2007 Tables I-II

    '
  choices:
  - ordinate spans 0.60-0.90 so the measured series and full published reference range remain
    legible
  - the counts are FULL banks, including the boundary repair, which is 50.7 % of the main
    hexagonal bank and 17.0 % of the extended square one; lattice-only ratios are 0.4882 and
    0.4225 and are reported in the text, not here
  - the Cokelaer range is a lightly shaded descriptive band and its mean is a separate line;
    the band is not presented as an uncertainty interval
  - MM grid 0.95-0.99 in steps of 0.01
  how_this_could_fail: If lattice efficiency alone set the ratio, both regions would follow
    one MM-independent line near the constant-metric ideal; they do not.
  supports:
  - covering-at-mm097
- file: figures/d_mismatch_map_main_hex.pdf
  produced_by: scripts/make_figures.py::figure_mismatch_map
  shows: 'Mismatch to the nearest template over the (m1, m2) plane for the main-region hexagonal
    bank, with the adaptive-search witness marked. The reader should take that the grid finds
    no hole and the adaptive search does.

    '
  from_scratch: 'the 90x90 grid, its restriction to the region, the metric at each grid point
    and the minimum over all 1772 templates

    '
  from_library: 'q1bC out/lib analytic_metric and tau; numpy; matplotlib

    '
  choices:
  - PDF text is embedded with TrueType fonts (font type 42) rather than Type 3 so labels
    remain searchable and render cleanly
  - shown against both component masses rather than total mass, because the metric depends
    on both (rule F3)
  - 90x90 grid over [5, 31] Msun, giving 1892 cells inside the region
  - a diverging residual scale centred on mu - 0.03 = 0, so the claimed threshold precision
    is visible rather than hidden by a full-range mismatch scale
  - the witness at (25.66516036451493, 5.816990546682748) comes from the dverify r03 audit
    and was reproduced by hand to 14 digits, not recomputed by this figure
  how_this_could_fail: A sampled covering failure would appear as a positive residual; the
    regular grid has none, while the independently found adaptive witness exceeds the target.
  supports:
  - covering-at-mm097
- file: figures/d_mismatch_map_main_hex.png
  produced_by: scripts/make_figures.py::figure_mismatch_map
  shows: 'Mismatch to the nearest template over the (m1, m2) plane for the main-region hexagonal
    bank, with the adaptive-search witness marked. The reader should take that the grid finds
    no hole and the adaptive search does. Raster copy of the same call, for the HTML page.

    '
  from_scratch: 'the 90x90 grid, its restriction to the region, the metric at each grid point
    and the minimum over all 1772 templates

    '
  from_library: 'q1bC out/lib analytic_metric and tau; numpy; matplotlib

    '
  choices:
  - shown against both component masses rather than total mass, because the metric depends
    on both (rule F3)
  - 90x90 grid over [5, 31] Msun, giving 1892 cells inside the region
  - a diverging residual scale centred on mu - 0.03 = 0, so the claimed threshold precision
    is visible rather than hidden by a full-range mismatch scale
  - the witness at (25.66516036451493, 5.816990546682748) comes from the dverify r03 audit
    and was reproduced by hand to 14 digits, not recomputed by this figure
  how_this_could_fail: A sampled covering failure would appear as a positive residual; the
    regular grid has none, while the independently found adaptive witness exceeds the target.
  supports:
  - covering-at-mm097
- file: figures/f_volume_losses.pdf
  produced_by: scripts/make_figures.py::figure_volume_losses
  shows: 'The three fractional detection-volume losses kept apart against nominal minimal
    match: the exact worst case 1 - MM^3, its linear expansion 3(1 - MM), and the metric-predicted
    population average 1 - <M^3>. The reader should take that the population loss is a factor
    4 to 9 below the worst case.

    '
  from_scratch: 'the population average from the injection matches of every bank in the MM
    grid

    '
  from_library: 'numpy; matplotlib. The two curves are closed forms, not fits

    '
  choices:
  - PDF text is embedded with TrueType fonts (font type 42) rather than Type 3 so labels
    remain searchable and render cleanly
  - TaylorF2 injections only, so this is discretisation loss alone; the template-family leg
    is a separate quantity and is not mixed in here
  - log ordinate, because the measured series and the worst case differ by nearly a decade
  - 2000 injections per bank, seed 20260927
  - the legend sits outside the axes because with six series every in-plot corner crosses
    one
  - bootstrap uncertainty is drawn on the population points; an inset resolves the relative
    difference between the exact and linear analytic curves
  how_this_could_fail: If the nominal worst case described the population cost, the
    bootstrap-resolved population points would lie on its curve; they do not.
  supports:
  - volume-loss-rule
- file: figures/f_volume_losses.png
  produced_by: scripts/make_figures.py::figure_volume_losses
  shows: 'The three fractional detection-volume losses kept apart against nominal minimal
    match: the exact worst case 1 - MM^3, its linear expansion 3(1 - MM), and the metric-predicted
    population average 1 - <M^3>. The reader should take that the population loss is a factor
    4 to 9 below the worst case. Raster copy of the same call, for the HTML page.

    '
  from_scratch: 'the population average from the injection matches of every bank in the MM
    grid

    '
  from_library: 'numpy; matplotlib. The two curves are closed forms, not fits

    '
  choices:
  - TaylorF2 injections only, so this is discretisation loss alone; the template-family leg
    is a separate quantity and is not mixed in here
  - log ordinate, because the measured series and the worst case differ by nearly a decade
  - 2000 injections per bank, seed 20260927
  - the legend sits outside the axes because with six series every in-plot corner crosses
    one
  - bootstrap uncertainty is drawn on the population points; an inset resolves the relative
    difference between the exact and linear analytic curves
  how_this_could_fail: If the nominal worst case described the population cost, the
    bootstrap-resolved population points would lie on its curve; they do not.
  supports:
  - volume-loss-rule
- file: figures/f_veff_vs_mm.pdf
  produced_by: scripts/make_figures.py::figure_veff
  shows: 'Change in effective detection volume from the coarse end of the MM grid, under two
    models of the trials factor -- the naive bound and a nu_eff calibrated on simulated Gaussian
    noise -- for both regions and both lattices. The trend reverses between the two models,
    demonstrating model sensitivity rather than establishing which trend is correct; nu_eff
    calibration and tail-extrapolation uncertainty is not quantified; the curves are model
    scenarios rather than a measurement of the operating-threshold trend.'
  from_scratch: the population <M^3> from injections and its bootstrap; the calibration of
    nu_eff from the maximum of |z| over templates and time in 100 simulated noise segments,
    by closed-form MLE on the distribution of the maximum; the power-law fit of N_eff against
    template count with a paired bootstrap; and both threshold solutions
  from_library: q1bC out/lib coloured_noise, kernel and psd_grid, whose single-sample statistic
    P(|z|>r)=exp(-r^2/2) was verified there and re-verified here as a control; q1bC part B's
    frozen ff_full for the IMRPhenomD leg; scipy griddata and brentq; numpy FFT; matplotlib
  choices:
  - PDF text is embedded with TrueType fonts (font type 42) rather than Type 3 so labels
    remain searchable and render cleanly
  - TWO trials models are drawn rather than one, because the difference between them is the
    result; plotting only the calibrated curve would hide that the conclusion is model-dependent
  - the ordinate is the relative change from MM = 0.95, not the absolute V_eff, because the
    claim is the sign and the ~2 % size of the trend (rule F2); absolute values are in data/part_f_optimum.json
  - nu_eff calibrated on 100 segments of 32 s, seed 20260926, with the SAME noise driving
    every bank so the comparison across MM is paired and the slope uncertainty is not inflated
  - N_eff estimated by closed-form MLE on the distribution of the per-segment maximum; threshold-wise
    estimates vary across the fitted tail, and calibration near the simulated maxima is
    extrapolated to a higher detection threshold. This uncertainty is not quantified and
    can be material relative to the small V_eff trend
  - 'alpha fitted WITHIN each region and lattice family, never pooled: the pooled fit gives
    1.29 purely because the two regions have different N_eff levels, which is a Simpson effect
    and not a scaling'
  - the IMRPhenomD leg is not drawn here; it is a declared approximation and appears in data/part_f_optimum.json
    only
  - no precision-style error bars are shown, because the available injection bootstrap does
    not include the potentially material nu_eff and tail-extrapolation uncertainty
  how_this_could_fail: If the trials models agreed, the dashed and solid scenario curves
    would coincide; if a robust optimum existed, the calibrated curves would show a stable
    interior peak. Neither pattern appears.
  supports:
  - volume-loss-rule
  - detection-threshold
- file: figures/f_veff_vs_mm.png
  produced_by: scripts/make_figures.py::figure_veff
  shows: 'Change in effective detection volume from the coarse end of the MM grid, under two
    models of the trials factor -- the naive bound and a nu_eff calibrated on simulated Gaussian
    noise -- for both regions and both lattices. The trend reverses between the two models,
    demonstrating model sensitivity rather than establishing which trend is correct; nu_eff
    calibration and tail-extrapolation uncertainty is not quantified. Raster copy of the
    same call, for the HTML page.'
  from_scratch: the population <M^3> from injections and its bootstrap; the calibration of
    nu_eff from the maximum of |z| over templates and time in 100 simulated noise segments,
    by closed-form MLE on the distribution of the maximum; the power-law fit of N_eff against
    template count with a paired bootstrap; and both threshold solutions
  from_library: q1bC out/lib coloured_noise, kernel and psd_grid, whose single-sample statistic
    P(|z|>r)=exp(-r^2/2) was verified there and re-verified here as a control; q1bC part B's
    frozen ff_full for the IMRPhenomD leg; scipy griddata and brentq; numpy FFT; matplotlib
  choices:
  - TWO trials models are drawn rather than one, because the difference between them is the
    result; plotting only the calibrated curve would hide that the conclusion is model-dependent
  - the ordinate is the relative change from MM = 0.95, not the absolute V_eff, because the
    claim is the sign and the ~2 % size of the trend (rule F2); absolute values are in data/part_f_optimum.json
  - nu_eff calibrated on 100 segments of 32 s, seed 20260926, with the SAME noise driving
    every bank so the comparison across MM is paired and the slope uncertainty is not inflated
  - N_eff estimated by closed-form MLE on the distribution of the per-segment maximum; threshold-wise
    estimates vary across the fitted tail, and calibration near the simulated maxima is
    extrapolated to a higher detection threshold. This uncertainty is not quantified and
    can be material relative to the small V_eff trend
  - 'alpha fitted WITHIN each region and lattice family, never pooled: the pooled fit gives
    1.29 purely because the two regions have different N_eff levels, which is a Simpson effect
    and not a scaling'
  - the IMRPhenomD leg is not drawn here; it is a declared approximation and appears in data/part_f_optimum.json
    only
  - no precision-style error bars are shown, because the available injection bootstrap does
    not include the potentially material nu_eff and tail-extrapolation uncertainty
  how_this_could_fail: If the trials models agreed, the dashed and solid scenario curves
    would coincide; if a robust optimum existed, the calibrated curves would show a stable
    interior peak. Neither pattern appears.
  supports:
  - volume-loss-rule
  - detection-threshold
- file: figures/e_trials_measured_vs_naive.pdf
  produced_by: scripts/make_figures.py::figure_trials
  shows: Effective independent trials per segment, measured from simulated noise, against
    the naive bound that counts every template and every sample; and their ratio. The reader
    should take that the measured trials are nearly flat in bank size while the bound climbs,
    and that the ratio runs from about 7 to 58.
  from_scratch: the noise filtering through every template of all twenty banks, the maximum
    of |z| over templates and time per segment, and the closed-form MLE for the effective
    trial count
  from_library: the frozen upstream package's coloured_noise, kernel and psd_grid, whose single-sample
    statistic was verified there and re-verified here as a control; numpy FFT; matplotlib
  choices:
  - PDF text is embedded with TrueType fonts (font type 42) rather than Type 3 so labels
    remain searchable and render cleanly
  - 'REPLACES an earlier figure of rho* against MM, which violated rule F1: rho* is a closed
    function of the template count, so its y-values were computed from its x-values by the
    formula under test. A blind reviewer reconstructed every plotted point from N alone to
    within 1e-13. That figure has been withdrawn, not merely re-captioned'
  - 100 segments of 32 s, seed 20260926, the same noise driving every bank so the comparison
    across banks is paired
  - log x and log y on the left panel, because the measured series and the bound differ by
    up to a factor 58; linear ratio on the right, where the claim lives
  - 'explicit x ticks: the default log minor labels collide at this aspect ratio'
  - the calibration is done where the maxima fall, near |z| = 5.3 to 5.8, and is applied at
    thresholds near 8.0 to 8.6; that extrapolation is not tested here and is stated in the
    caption
  - per-bank fit uncertainties and paired-bootstrap 95 percent intervals for each family
    exponent are drawn or printed so the claimed sublinear slopes expose their precision
  how_this_could_fail: Independent templates would put the inferred counts on the naive line;
    proportional growth would make each family parallel to it. Neither pattern appears.
  supports:
  - detection-threshold
  - volume-loss-rule
- file: figures/e_trials_measured_vs_naive.png
  produced_by: scripts/make_figures.py::figure_trials
  shows: Effective independent trials per segment, measured from simulated noise, against
    the naive bound that counts every template and every sample; and their ratio. The reader
    should take that the measured trials are nearly flat in bank size while the bound climbs,
    and that the ratio runs from about 7 to 58. Raster copy of the same call, for the HTML
    page.
  from_scratch: the noise filtering through every template of all twenty banks, the maximum
    of |z| over templates and time per segment, and the closed-form MLE for the effective
    trial count
  from_library: the frozen upstream package's coloured_noise, kernel and psd_grid, whose single-sample
    statistic was verified there and re-verified here as a control; numpy FFT; matplotlib
  choices:
  - 'REPLACES an earlier figure of rho* against MM, which violated rule F1: rho* is a closed
    function of the template count, so its y-values were computed from its x-values by the
    formula under test. A blind reviewer reconstructed every plotted point from N alone to
    within 1e-13. That figure has been withdrawn, not merely re-captioned'
  - 100 segments of 32 s, seed 20260926, the same noise driving every bank so the comparison
    across banks is paired
  - log x and log y on the left panel, because the measured series and the bound differ by
    up to a factor 58; linear ratio on the right, where the claim lives
  - 'explicit x ticks: the default log minor labels collide at this aspect ratio'
  - the calibration is done where the maxima fall, near |z| = 5.3 to 5.8, and is applied at
    thresholds near 8.0 to 8.6; that extrapolation is not tested here and is stated in the
    caption
  - per-bank fit uncertainties and paired-bootstrap 95 percent intervals for each family
    exponent are drawn or printed so the claimed sublinear slopes expose their precision
  how_this_could_fail: Independent templates would put the inferred counts on the naive line;
    proportional growth would make each family parallel to it. Neither pattern appears.
  supports:
  - detection-threshold
  - volume-loss-rule
