Skip to content

Pre-registered exploratory analysis plan for the 13/8 frozen subset (#59) - #61

Merged
orda-aska merged 4 commits into
mainfrom
protocols/pilot-001-exploratory-analysis-plan
Nov 6, 2026
Merged

orda-aska merged 4 commits into
mainfrom
protocols/pilot-001-exploratory-analysis-plan

Conversation

@zero-aska

Copy link
Copy Markdown
Contributor

Closes #59.

What this is

One protocol pull request: a pre-registered exploratory analysis plan for the frozen-cohort candidate subset with no observed discovery record (13 sensitive / 8 refractory), written before any real-data Pilot 001 number exists. It freezes endpoints, permitted inputs, decision rules, uncertainty methods and stop rules, says which claims this n can and cannot support, and labels every claim.

  • protocols/pilot-001-exploratory-subset-plan.md — the plan, on the research-question template's fields, with a source-fixed analysis contract in the style of the score-verification specification.
  • tools/plan_exploratory_subset_design.py, registries/pilot-001-exploratory-subset-design.json, tests/test_exploratory_subset_design.py — the plan's design values, computed offline from the documented counts so that nobody invents a statistic after seeing numbers: the exact Mann–Whitney null for 8 vs 13 and 11 vs 17, its one-sided critical values, exact Clopper–Pearson intervals for every attainable sensitivity and specificity, and the frozen bootstrap/threshold parameters.
  • CLAIMS.md — V28 (design values), K30 (published frozen-independent facts), K31 (subset counts), C22 (the hypothesis); counts line updated.
  • Navigation and credit: README start-here row, roadmap paragraph, registries index entry, pointer in open-questions §4, CONTRIBUTORS note; verify.yml test count 310 → 317.

The contract in one paragraph

Evaluation subset: the 21 patients in the published 34-row Frozen_nonoverlap_pred_scores sheet whose patient key appears in no row of FFPE_Discovery_clinical. Primary estimand: empirical AUROC (half-credit ties, refractory positive). Primary decision rule: exact one-sided permutation test against 0.5 at α = 0.05 — with no ties, reject only when U ≥ 76 of 104 pairs (AUROC ≥ 19/26 = 0.7308; exact p = 0.04452, and 0.05210 one step below). Uncertainty: patient bootstrap (2,000 draws, seed 20261106, ≥1,000 valid draws) plus a DeLong interval. Threshold: fixed on the 40 other scored frozen patients at a 0.98 specificity target (0 allowed false positives on 29 negatives); achieved specificity and sensitivity on the 21 reported with the pre-tabulated exact intervals. The printed frozen values (AUC 0.79, 95% CI 0.63–0.96; sensitivity 0.25) are reported beside the result with no pass/fail. One sensitivity analysis on the 28 (17/11), no decision rule. Stop rules on hashes, row counts, joins, membership counts, score range, cross-check disagreement, enumeration totals and bootstrap validity.

Two tiers: Tier A evaluates the authors' released frozen scores (the pinned NLM workbooks of V08/V11, in memory, aggregates only). Tier B applies the same contract to the project's own reconstruction outputs — and the plan states plainly that nothing in the repository can produce those today (discovery-only reconstruction that keeps no fitted model; no frozen matrix pinned or mappable; no per-patient transfer route past the output allowlist), so Tier B needs a dated addendum and every open Gate 0 item.

What this cohort can and cannot support (from the plan)

Can: an exploratory above-chance test at the critical value above; descriptive estimates with honest width (every 95% sensitivity interval on 8 patients is ≥ 0.36 wide; a perfect 13/13 specificity gives a one-sided 95% lower bound of 79.42%). Cannot: specificity ≥ 98% by any bound (149/183 zero-error negatives needed, V09); confirmatory validation; reproduction of 0.83 or 0.79; population transportability; calibration; any clinical inference.

Claims cited, not replaced

V08 (released discovery AUROC 0.8088507878, rounds to 0.81, vs printed 0.83) and V23/C20 (discrepancy analysis) are cited as the governing records for the discovery question; no AUROC is invented for any subset.

Draft until the internal adversarial review of this change set completes; findings will be folded in before it is marked ready.

Checks actually run

  • python3 tools/validate.py — PASS (registries, local Markdown links, attestation file untracked).
  • python3 -m unittest discover -s tests -v — 317 tests OK (310 + 7 new).
  • python3 tools/plan_exploratory_subset_design.py --check — artifact matches.
  • python3 tools/check_implementation_hashes.py — OK (the new registry uses the dict form of implementation_sha256).
  • Independent internal agent review of the design values and of the plan's factual claims against main (reader maps and an adversarial pass): in progress while this is a draft; findings are folded in before it is marked ready. This is internal review, not external scientific review.

What the checks cannot establish

No study file was read, no frozen score was seen, no threshold was selected and no AUROC was computed on any subset: the tests establish the design arithmetic and the artifact's provenance, not any model performance, patient independence (the 21 are outside the alignment fit but not untouched: P177 marker filtering, pooled reference channel, one institution) or clinical validity. The 13/8 class split is inherited from the 2026-10-25 bounded inspection by phrase pin, as the capacity record already does; the total 21 is replayable from the supplement audit.

Hard constraints honoured

No execution on study files; no Foundation-0/asma-data; no medical advice; no Pilot 001 run; no acquisition of study matrices; no contact or recruitment. Execution of Tier A needs the owner's explicit, dated instruction naming the plan version; Gate 0 Q5 alone is not read as that instruction. The parallel biology track (#57) is untouched; the two PRs both append to CLAIMS.md (different IDs: V27/K29 there, V28/K30/K31/C22 here) and will need a trivial merge of the counts line whichever lands second.

AI disclosure

Written by Claude (Anthropic) via Claude Code under human direction, with independent internal agent review. Internal review is not external scientific peer review.


Generated by Claude Code

…#59)

Add protocols/pilot-001-exploratory-subset-plan.md: a statistical
contract, written before any real-data Pilot 001 number exists, for the
21 frozen-cohort patients (13 sensitive / 8 refractory) with no
discovery record. It freezes the evaluation, calibration and
sensitivity sets; the estimand (empirical AUROC, refractory positive,
half-credit ties); one decision rule (exact one-sided permutation test
at 5%: with no ties, U >= 76 of 104, AUROC >= 19/26); the uncertainty
methods (patient bootstrap, 2,000 draws, seed 20261106; DeLong); the
threshold rule on the other 40 scored frozen patients; stop rules;
permitted wording per outcome; and what this n can and cannot support.
Tier A evaluates the released published frozen scores; Tier B states
what is absent before reconstruction outputs could be evaluated.

tools/plan_exploratory_subset_design.py computes the design values
offline from the documented counts (exact Mann-Whitney null and critical
values for 8 vs 13 and 11 vs 17, exact Clopper-Pearson tables, frozen
parameters) into registries/pilot-001-exploratory-subset-design.json,
with tests. CLAIMS.md gains V28, K30, K31 and C22. README, roadmap,
registries index, open-questions section 4 and CONTRIBUTORS link or
credit the plan; verify.yml's pinned test count moves from 310 to 317.

No study file was read, no score was seen and no model performance was
measured. Execution needs the owner's dated instruction.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BuwmdHVixi4BxQmXNM3F6d
- Host: the data-use record lists the MMC workbooks as study data for
  Gate 0 Q1, so Tier A runs where that record allows study data unless
  the owner's instruction records otherwise; the earlier sentence that
  the host conditions were not triggered is withdrawn.
- Citations: registries/sources.json has unrelated entries numbered S95
  and S99, so the paper's sections are cited as "article section S95".
- Contract details: the bootstrap is the joint patient bootstrap of
  tools/evaluate_heldout.py (not the stratified one of the discrepancy
  tool), with its RNG, index and percentile conventions and the Python
  version recorded; DeLong inputs are adapted and the printed-0.83 flag
  discarded; the threshold's dependence on one calibration order
  statistic is stated; Clopper-Pearson endpoints are described as
  numerical roots of exact tails; the Tier A implementation reuses the
  audit helpers as the V08 tool did.
- Disclosure rule fixed: 2x2 and tie counts on the 21 are publishable
  without suppression because every label and score behind them is
  already public per patient; the review confirms aggregates only.
- Calibration set justified in section 4.
- Design record: expected class-empty bootstrap draws per cohort (0.085
  and 0.002 of 2,000), so the 1,000-valid-draw minimum is not binding.
- index.html's ledger count follows CLAIMS.md (85); paper/manuscript.md
  lists the plan among the pre-registered methods.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BuwmdHVixi4BxQmXNM3F6d
- The decision rule is stated in integers (reject iff U >= 76 of 104)
  with the p-value defined over the conditional enumeration; the
  rounded 0.7308 lies above 19/26 and is never the rule. The
  Mann-Whitney table applies only with no tied scores at all, within or
  across classes; all tie counts are reported.
- FFPE_Discovery_clinical is described by its 231 rows and 158 unique
  patient keys, not as a 158-row sheet.
- The calibration set's role notes that 7 of its 40 patients also sit
  in the descriptive 28-patient sensitivity set; the stop rule no
  longer demands an enumeration over the 28 that nothing computes.
- Threshold wording: computed from the 40 calibration rows only and
  frozen before any evaluation metric, since one sheet holds both.
- DeLong: copied fields named, bounds clipped, zero variance reported
  as degenerate. Grouped AP pinned to the evaluate_heldout definition.
  Two-sided intervals only in the result note. The alpha 0.025/0.01
  rows of the design record are informational, never a headline.
- evaluate_heldout fails closed on a False contract boolean, so the
  exploratory path of both tiers runs through the plan's own
  implementation. Tier B's harmonisation fit is narrowed to the 27
  overlap-sheet pairs with the 6 K09 keys excluded; the output
  validator's key schema, not its vector-length heuristic, is named as
  what blocks keyed predictions; the archive's frozen member is
  described as likely, not established.
- Absent an owner statement, the executor treats fair-dealing
  conditions (a)-(c) as applying and does not run.
- Runtime stated as under a minute; a test comment cites the registry.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BuwmdHVixi4BxQmXNM3F6d
…e choice

The plan let the owner's instruction decide whether a current dated
attestation was needed and let it move the host; the data-use record and
AGENTS.md make the attestation, the Gate 0 Q1 host with its macOS preflight
and aggregate-only handling unconditional before any live read of study
files. Section 5 now lists those conditions as a gate no instruction can
waive, the stop rules and section 15 record them, and the roadmap mirrors
the wording. The no-suppression disclosure rule is recorded as a project
choice for the owner to confirm rather than as settled, and the output row
no longer promises to hide a threshold position the published 2 x 2
determines. Also notes that main itself does not reconcile the
bounded-inspection rule with the host record for the MMC workbooks.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BuwmdHVixi4BxQmXNM3F6d
@ahrazzle
ahrazzle marked this pull request as ready for review November 6, 2026 09:43
@orda-aska
orda-aska merged commit af6cc9b into main Nov 6, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants