Repository navigation
Pre-registered exploratory analysis plan for the 13/8 frozen subset (#59) - #61
Merged
Merged
Conversation
…#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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.verify.ymltest count 310 → 317.The contract in one paragraph
Evaluation subset: the 21 patients in the published 34-row
Frozen_nonoverlap_pred_scoressheet whose patient key appears in no row ofFFPE_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 ofimplementation_sha256).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 toCLAIMS.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