research(rectification): preregister D12 parent probes (BUG-1308)

This commit is contained in:
jesse-ux
2026-10-12 15:36:50 +08:00
committed by Jesse_Chen
parent 0f05c9e26a
commit 856ab99169
@@ -0,0 +1,207 @@
{
"id": "d12_parent_probes_preregistration_2026_10_12",
"bug": "BUG-1308",
"task": "docs/tasks/TASK-rectification-d12-parent-probes-research-20261012.md",
"locked_before_scoring": true,
"baseline_commit": "e6baff95",
"does_not_overturn": [
"docs/research/rectification_angle_timing_2026_10_01.md 与 docs/research/rectification_nadi_seconds_2026_10_05.md 里不带年份的题、以及分钟级时间技法信号弱的结论。本登记只检验静态父母是非题对 D12 上升换段两侧有没有区分力。",
"上游 bbb16115 / fe56dd84 绑的是带日期的父母事件。本登记不搬那些代码,只借用「父亲主宫默认 9、北印备选 10」这个口径。"
],
"birth_records": {
"file": "references/real_case_calibration/minute_rectification_holdout_v5.json",
"expected_case_count": 77,
"case_id_sha256": "e3acb0c9c8005c0c1f88ce7f37b5e274d3fcf5346b7c9f0f441089aa06687ee5",
"case_id_sha256_note": "sha256 of the sorted case_id values joined by newline, UTF-8, no trailing newline after the last id.",
"roster_file_on_this_commit": "references/real_case_calibration/holdout_v5_roster.json lists 57 of these 77. The other 20 are the inherited v4 cases stored in the holdout file. Both are the tracked public Rodden-AA set. No birth field is added from outside these files.",
"clock": "Recorded minute, second fixed at 0. Timezone is the file's timezone_offset, held fixed across the window. Do not re-infer an IANA zone.",
"privacy": "Public figures only. No real-user birth data and no private sample."
},
"facts": {
"file": "references/real_case_calibration/parent_facts_v1.json",
"answers": ["yes", "no", "unclear"],
"inclusion": "A case is scored only if all six probes are present and at least four answers are yes or no. Others are listed as excluded and are not imputed.",
"source_grades": ["biography", "interview", "encyclopedia"],
"source_rule": "Every scored fact needs a URL opened for this study and a verbatim excerpt. Silent sources stay unclear. Conflicting opened sources stay unclear. Do not code a fact from an unopened page.",
"coding": {
"mother_more_daily_care": {
"yes": "The source says the mother raised the child, was the main day-to-day caregiver, or the child lived with the mother and not the father during childhood.",
"no": "The source says the father raised the child, or the child lived with the father and not the mother.",
"unclear": "Otherwise. Naming both parents, or saying they lived together, is not a comparison and stays unclear. A parent's death is not enough unless the source says who then did the daily care."
},
"father_financial_lead": {
"yes": "The source says the father supported the family, was the breadwinner, or the household lived on his income or business.",
"no": "The source says the mother or another named person was the breadwinner, or the father did not support the family.",
"unclear": "Otherwise. A job title alone is not financial leadership."
},
"father_guided_study": {
"yes": "The source says the father taught the child, chose or insisted on the schooling, or supervised the studies.",
"no": "The source says the father opposed the schooling, refused to support it, or was uninvolved while another named person directed it.",
"unclear": "Otherwise. The father being educated, or a teacher of other people, is not enough. 'Parents sent the child to school' stays unclear."
},
"father_work_institutional": {
"yes": "The principal occupation is military, civil service, elected or appointed government office, teacher, professor, academic, physician, surgeon, lawyer, judge, clergy of an organized religion, police, engineer, scientist, or a salaried post in a state, church, school, hospital, or firm where the source does not call him the owner.",
"no": "A principal occupation is stated and it is trade, a self-owned business, farming the family's land, or a skill practiced on his own account, and the yes list is not the principal job.",
"unclear": "Occupation unstated, or several jobs with no principal one."
},
"father_work_commerce": {
"yes": "The principal occupation is merchant, trader, shopkeeper, owner-banker, industrialist, factory owner, company founder, or another self-owned business.",
"no": "A principal occupation is stated and it is not commerce.",
"unclear": "Occupation unstated. Both this probe and father_work_institutional may be yes when the source fits both clauses. Do not force one label."
},
"parents_long_apart": {
"yes": "Before the subject was 18, the source says the parents lived in different places for a prolonged period, separated, divorced, or one parent was away from the family home for years.",
"no": "The source says the parents lived together through childhood, or explicitly did not separate.",
"unclear": "Otherwise. Death of a parent is not geographic separation by itself."
}
}
},
"engine": {
"chart": "domain_calculation_service.compute_chart",
"varga": "varga.calc_varga(longitude, 12) in classical_local mode, field sign_idx",
"longitude_field": "lon",
"d1_sign": "int(longitude // 30) % 12 for the ascendant; planet sign_idx from compute_chart for D1 bodies",
"house_system": "whole sign",
"house_of_sign": "(body_sign_idx - lagna_sign_idx) % 12 + 1",
"lord_of_house": "SIGN_LORDS of SIGNS[(lagna_sign_idx + house - 1) % 12], from scripts/varga.py",
"do_not_use": [
"the D1 planet house field",
"bhava cusps",
"a newly written ephemeris",
"vedastro varga mode"
],
"settings": {
"baseline_ayanamsa": "raman",
"baseline_node_mode": "mean",
"ayanamsa_alt": "lahiri",
"node_alt": "true"
},
"ephemeris_version": "Record swisseph version in the results. Do not choose a version in order to pass."
},
"grid": {
"radii_minutes": [10, 30],
"step_minutes": 1,
"offsets": "Every integer from -radius through +radius, inclusive. Local clock plus the offset, date may roll.",
"boundary": "A cut sits between offset o and o+1 when both are on the grid and their D12 lagna sign indexes differ. The representative minutes are o and o+1.",
"nearest_cut": "Minimum of min(|o|, |o+1|); ties break by smaller |o|; then by smaller o.",
"true_side": "The representative minute whose D12 lagna sign index equals the sign index at offset 0. The other representative is the other side. If that assignment is not exactly one minute, abort the case as a runner error. Do not guess.",
"no_cut": "If the window has no cut, the case is no_boundary and is outside the selection denominator.",
"segment": "A maximal run of offsets with one D12 lagna sign. Its representative is the offset in the run with smallest absolute value, ties taking the smaller offset."
},
"profiles": {
"father_9": {
"chart": "D12",
"father_house": 9,
"mother_house": 4,
"note": "Parashari default, the upstream fe56dd84 main profile. Father indicators are the Sun and the lord of house 9. Mother indicators are the Moon and the lord of house 4."
},
"father_10": {
"chart": "D12",
"father_house": 10,
"mother_house": 4,
"note": "North-Indian alternate stored by fe56dd84. Father indicators are the Sun and the lord of house 10. Mother side stays house 4."
},
"d1_father_9": {
"chart": "D1",
"father_house": 9,
"mother_house": 4,
"note": "Control only. Same six formulas, read on the rasi chart. Not part of the gate. There is no D1 10th-father profile."
}
},
"probes": [
"mother_more_daily_care",
"father_financial_lead",
"father_guided_study",
"father_work_institutional",
"father_work_commerce",
"parents_long_apart"
],
"stems_zh": {
"mother_more_daily_care": "母亲是否比父亲更多负责日常照料",
"father_financial_lead": "父亲是否是家庭财务的主要来源",
"father_guided_study": "父亲是否指导过本人的学业",
"father_work_institutional": "父亲的主要职业是否属于体制内或受雇专业",
"father_work_commerce": "父亲的主要职业是否是自己经商",
"parents_long_apart": "父母在童年是否长期分隔两地"
},
"reading_rules": {
"shared": {
"unique_indicators": "If the karaka and the house lord are the same planet, the indicator set contains that planet once.",
"kendra": [1, 4, 7, 10],
"conjunct": "Same sign index in the chart being read.",
"career_house": "C = ((father_house - 1 + 9) % 12) + 1. This is the 10th from the father house. father_house 9 gives 6. father_house 10 gives 7.",
"separated_signs": "For sign indexes a and b, d = (b - a) % 12. The pair is separated when d is 1, 5, 7, or 11. The same sign is not separated. The same planet is not separated from itself.",
"labels": ["yes", "no", "abstain"]
},
"mother_more_daily_care": "Let Mk be how many distinct mother indicators sit in a kendra, and Fk the same count for father indicators. yes when Mk > Fk. no when Fk > Mk. If the counts are equal: yes when the Moon is in a kendra and the Sun is not; no when the Sun is in a kendra and the Moon is not; otherwise abstain. This is the only probe that may abstain.",
"father_financial_lead": "yes when any father indicator is in house 2 or house 11, or the lord of house 2 is in the father house, or the lord of house 2 is conjunct any father indicator. no otherwise.",
"father_guided_study": "yes when any father indicator is in house 5, or the lord of house 5 is in the father house, or Jupiter is in the father house, or Jupiter is conjunct any father indicator. no otherwise.",
"father_work_institutional": "yes when Saturn or the Sun occupies C, or the lord of C is Saturn or the Sun. no otherwise.",
"father_work_commerce": "yes when Mercury or Venus occupies C, or the lord of C is Mercury or Venus. no otherwise.",
"parents_long_apart": "yes when the Sun and Moon are a separated pair, or the lord of house 4 and the father-house lord are a separated pair, or Rahu occupies house 4 or the father house. no otherwise. Rahu is the planet named Rahu in compute_chart. If that key is missing, the Rahu clause is false. Do not substitute another body."
},
"scoring": {
"counted_probe": "The biographical answer is yes or no, and this side's prediction is yes or no. unclear and abstain are not counted.",
"side_score": "matches minus mismatches among counted probes. A side with no counted probe scores 0.",
"true_side_selected": "The true side's score is strictly greater than the other side's score.",
"tie": "Equal scores. A tie is not a selection.",
"selection_rate": "true_side_selected count divided by the number of included cases that have a cut in that window. The denominator does not drop ties.",
"head_segment_hit": "Among segments in the same window, the true segment's score is strictly greater than every other segment's score. Not a gate.",
"true_segment_retained": "The true segment's score is greater than or equal to every other segment's score. Not a gate.",
"segment_denominator": "Included cases that have a cut. A one-segment window is no_boundary and is outside both segment rates."
},
"permutation": {
"n": 999,
"seed": 20261012,
"algorithm": "Fisher-Yates driven by random.Random(seed).randrange. Do not call Random.shuffle. One stream builds 999 permutations of the included case_id list sorted alphabetically. The same 999 assignments are reused for every profile and both radii.",
"unit": "The whole six-answer vector moves with the case. Probes are not shuffled separately.",
"p": "(count of permutation rates greater than or equal to the observed rate, plus 1) divided by 1000. Compare this exact ratio. Do not compare a rounded display.",
"null_mean": "Arithmetic mean of the 999 permutation rates.",
"percentile": "Count of permutation rates strictly below the observed rate, divided by 999. Report it. The gate does not use the percentile."
},
"positive_control": {
"seed": 20261013,
"n": 999,
"construction": "Ignore the biographical answers. For each probe, if the true side predicts yes or no, plant that label; if it abstains, plant unclear. Then use the same selection statistic and the same Fisher-Yates procedure with the control seed.",
"pipeline_exact": "Among included cases that have a cut and whose two sides differ on at least one probe the true side does not abstain, every case must select the true side.",
"minimum_differing_cases": 20,
"permutation_p_max": 0.01,
"failure": "If pipeline_exact fails, or differing cases are under 20, or the planted rate's exact p is not below 0.01, the control failed. Do not call the study a pass, and do not call the astrology result 不上线. Write 欠力 for an under-powered control and 结论无效 for a pipeline that cannot see a planted signal."
},
"family": {
"cells": [
["father_9", 10],
["father_9", 30],
["father_10", 10],
["father_10", 30]
],
"bonferroni_alpha": 0.0125,
"cell_significant": "Exact permutation p is strictly below 0.0125, and the observed selection rate is strictly greater than that cell's null mean.",
"d1_not_in_family": true
},
"robustness": {
"measured_on": "The baseline cell's two representative minutes. Recompute that profile's six labels at those same clock offsets under lahiri/mean and under raman/true.",
"change": "A label in {yes, no, abstain} differs.",
"denominator": "Boundary cases times 2 sides times 6 probes.",
"gate_max_change_rate": 0.2,
"node_clause": "Parents_long_apart is the only probe that reads Rahu. Still count all six probes in the denominator.",
"concession": "If included cases are under 60 and true-node charts cannot be computed, report the blockage and apply the 0.20 line to the ayanamsa switch only. Do not waive the ayanamsa line. Do not waive either line when included cases are at least 60."
},
"gates": {
"sample": "Included cases at least 60. Below that the status is 欠力 even if every numeric line is met. 欠力 is not 不上线 and is not 过门.",
"discrimination": "At least one family cell is cell_significant.",
"control": "The positive control meets pipeline_exact, the differing-case minimum, and permutation_p_max.",
"robustness": "Every cell_significant cell has both change rates strictly below 0.20, subject to the small-sample node concession.",
"pass": "sample AND discrimination AND control AND robustness. Only a pass may recommend a question, a score, or a tie-break attached to the nearest-boundary opening.",
"fail_closed": "Included cases at least 60, the control passed, and either no cell is significant or a significant cell is not robust. Write 不上线. Do not recommend an implementation."
},
"not_a_gate": [
"d1_father_9",
"head_segment_hit",
"true_segment_retained",
"per-probe accuracy",
"the permutation percentile",
"any rule, threshold, or seed written down after the results were seen"
],
"after_the_fact": "A change to a reading rule, the coding manual, a seed, the family, or the alpha after results exist is a new round. Keep the old results. The new round cannot inherit this round's gate."
}