diff --git a/docs/research/d60_two_way_preregistration_2026_10_28.json b/docs/research/d60_two_way_preregistration_2026_10_28.json new file mode 100644 index 00000000..10c0340d --- /dev/null +++ b/docs/research/d60_two_way_preregistration_2026_10_28.json @@ -0,0 +1,78 @@ +{ + "scope": "d60_two_way_preregistration", + "task": "docs/tasks/TASK-rectification-d60-two-way-20261028.md", + "fix_brief": "docs/tasks/TASK-rectification-d60-fix-20261029.md", + "issue": 149, + "bug": "BUG-1497", + "branch": "codex/rectification-d60-two-way-20261028", + "base_sha": "129313e1759026d6c0afdc27ea2905da2915992a", + "dataset": { + "path": "references/real_case_calibration/minute_rectification_holdout_v5.json", + "sha256": "ab365a3e3f4953d4b538f2c0889dc98ab89444a28340c3a7b29e2a864cdd687a", + "cases": 77, + "events": 964 + }, + "profile": { + "ayanamsa": "raman", + "node_mode": "mean", + "minute_step": 2, + "radii_minutes": [ + 10, + 30, + 60 + ], + "bootstrap_resamples": 5000, + "permutation_resamples": 9999, + "seed": 20261028, + "hash_seed": 0 + }, + "group_a": { + "definition": "production V9 six-question replay, protocol identical to the v5 baseline (cluster_width_probe replay_public).", + "source": "scripts/research/cluster_width_probe.py::replay_public" + }, + "group_b": { + "rule_id": "d60_same_day_boundary_probe_v1", + "boundaries": "every ascendant D60 sign change inside the +/-radius window on the 2-minute candidate grid (raman, mean node, production mapping).", + "probe": "one 'was the event before or after this boundary' question per boundary, answered and applied with the same apply_answer machinery as group A.", + "answer_policy": "answer only when an event date equals the boundary date; otherwise the probe is skipped and no candidate is eliminated.", + "reason": "a date-only event on another day would answer every boundary on the birth day the same way (always after), which eliminates one side of the window without evidence.", + "required_precheck": "count, per case, events whose date equals the birth date before scoring; if every case has zero, G2/G3/G4 are reported as not evaluable by construction, not as a measured zero." + }, + "gates": { + "G1": { + "status": "passed", + "evidence": "docs/research/d60_two_way_results_2026_10_29.json (77/77 after BUG-1500)", + "threshold": ">=0.95 agreement with one external engine" + }, + "G2": { + "metric": "share of cases where the six-question replay head is within 2 minutes of the recorded minute", + "statistic": "B minus A, case bootstrap 5000 resamples, one-sided lower bound", + "pass": "lower bound > 0", + "seed": 20261028 + }, + "G3": { + "metric": "cases whose recorded minute stays inside the delivered range", + "pass": "B >= A (A baseline 76/77 at +/-10)" + }, + "G4": { + "placebos": [ + "P1: day-precision events shifted by +/-30-180 days", + "P2: day-precision dates swapped across cases" + ], + "statistic": "one-sided permutation 9999 resamples of the B-minus-A lift", + "pass": "p < 0.05 against both placebos" + }, + "G5": { + "metric": "share of cases where the ascendant D60 sign at the recorded time changes when the ayanamsa is switched raman -> lahiri / kp / true_citra", + "pass": "any switch above 0.20 forbids 'to the second / minute-level precision' wording even if G2-G4 pass" + } + }, + "stop_rules": [ + "no scoring before this file is committed", + "G1 failing stops G2-G5", + "G2 or G3 failing ends the question as 'do not adopt'", + "no threshold or seed changes after seeing results; any post-hoc number is reported in a separate post-hoc section and cannot change a gate", + "production code, skill routing and external wording stay unchanged in this round" + ], + "post_hoc_policy": "any analysis not in this file is labelled post_hoc and cannot change a gate verdict" +}