research(d60): preregister gates G2-G5 before scoring (issue #149)

Registered rules, thresholds, seeds and the same-day answer policy for the
D60 boundary probes. No scoring has run with this file in place.
This commit is contained in:
jesse-ux
2026-10-29 15:46:58 +08:00
parent 129313e175
commit c163a74934
@@ -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"
}