From 91e9da4c1c43d7bf1ca8af9348f09dca8f97a2cc Mon Sep 17 00:00:00 2001 From: 732642856 <732642856@qq.com> Date: Thu, 23 Jul 2026 20:21:27 +0800 Subject: [PATCH] sync: add timing rectification freeze packet --- .../evidence_packet_index_2026_07_19.json | 12 +- ...n_candidate_holdout_labels_2026_07_23.json | 127 ++++++++++++++++++ ...ion_reviewer_freeze_status_2026_07_23.json | 51 +++++++ ...ation_reviewer_freeze_status_2026_07_23.py | 66 +++++++++ ...ation_reviewer_freeze_status_2026_07_23.py | 36 +++++ 5 files changed, 290 insertions(+), 2 deletions(-) create mode 100644 references/real_case_calibration/timing_rectification_candidate_holdout_labels_2026_07_23.json create mode 100644 references/real_case_calibration/timing_rectification_reviewer_freeze_status_2026_07_23.json create mode 100644 scripts/timing_rectification_reviewer_freeze_status_2026_07_23.py create mode 100644 tests/test_timing_rectification_reviewer_freeze_status_2026_07_23.py diff --git a/references/oracle/evidence_packet_index_2026_07_19.json b/references/oracle/evidence_packet_index_2026_07_19.json index 532de5da..0c3ea706 100644 --- a/references/oracle/evidence_packet_index_2026_07_19.json +++ b/references/oracle/evidence_packet_index_2026_07_19.json @@ -5,8 +5,8 @@ "production_tuning_allowed": false, "boundary": "Index of current governance packets only. Raw oracle artifacts remain in references/oracle/artifacts and are not all duplicated here.", "summary": { - "packet_count": 182, - "blocked_or_partial_count": 166, + "packet_count": 183, + "blocked_or_partial_count": 167, "human_review_required_count": 4 }, "packets": [ @@ -1465,6 +1465,14 @@ "claim_status": "keyed_observation_partial", "consumer_policy": "research_observation_only_no_secret_material", "claim_boundary": "Keyed VedAstro raw and method catalog capture are available without persisting the secret; hosted build identity, KP 12-cusp oracle, Prashna/Saham/Sphuta endpoints, selected Gulika/Tajika payload contracts and timing labels remain blocked." + }, + { + "packet_id": "timing_rectification_reviewer_freeze_status_2026_07_23", + "path": "references/real_case_calibration/timing_rectification_reviewer_freeze_status_2026_07_23.json", + "domain": "timing_rectification_governance", + "claim_status": "one_reviewer_confirmed_second_required", + "consumer_policy": "human_review_required", + "claim_boundary": "One reviewer confirmation advances candidate governance but reviewer 2 is still missing, so the two-reviewer freeze requirement and timing claim upgrade remain unsatisfied." } ] } diff --git a/references/real_case_calibration/timing_rectification_candidate_holdout_labels_2026_07_23.json b/references/real_case_calibration/timing_rectification_candidate_holdout_labels_2026_07_23.json new file mode 100644 index 00000000..01ad8ec4 --- /dev/null +++ b/references/real_case_calibration/timing_rectification_candidate_holdout_labels_2026_07_23.json @@ -0,0 +1,127 @@ +{ + "boundary": "Machine-selected public cases are intake candidates only. They do not satisfy the independent human holdout requirement and cannot upgrade timing or rectification claims.", + "cases": [ + { + "birth_data": { + "date": "1955-02-24", + "place": "San Francisco, California, USA", + "source_quality": "public_astrodatabank_candidate", + "source_url": "https://www.astro.com/astro-databank/Jobs,_Steve", + "time": "19:15" + }, + "case_id": "candidate_steve_jobs_apple_ipo_1980", + "human_reviews": [], + "machine_prepared": true, + "negative_windows": [ + { + "end": "1980-10-14", + "review_note": "candidate negative window for no Apple IPO / same-class public listing event", + "source_url": "https://en.wikipedia.org/wiki/Apple_Inc.", + "start": "1980-10-01" + }, + { + "end": "1981-02-14", + "review_note": "candidate negative window for no Apple IPO / same-class public listing event", + "source_url": "https://en.wikipedia.org/wiki/Apple_Inc.", + "start": "1981-02-01" + } + ], + "positive_event": { + "end": "1980-12-12", + "event_type": "career_wealth", + "label": "Apple initial public offering", + "source_hash": "sha256:bfc04055876aeac7816e5fbba86b3fd622b4e240a441d314df0ab45a775d6420", + "source_url": "https://en.wikipedia.org/wiki/Apple_Inc.", + "start": "1980-12-12" + }, + "public_person": "Steve Jobs" + }, + { + "birth_data": { + "date": "1961-08-04", + "place": "Honolulu, Hawaii, USA", + "source_quality": "public_astrodatabank_candidate", + "source_url": "https://www.astro.com/astro-databank/Obama,_Barack", + "time": "19:24" + }, + "case_id": "candidate_barack_obama_2008_election", + "human_reviews": [], + "machine_prepared": true, + "negative_windows": [ + { + "end": "2008-09-14", + "review_note": "candidate negative window for no presidential election win / same-class election outcome", + "source_url": "https://en.wikipedia.org/wiki/2008_United_States_presidential_election", + "start": "2008-09-01" + }, + { + "end": "2009-02-14", + "review_note": "candidate negative window after inauguration for no same-class election outcome", + "source_url": "https://en.wikipedia.org/wiki/Presidency_of_Barack_Obama", + "start": "2009-02-01" + } + ], + "positive_event": { + "end": "2008-11-04", + "event_type": "career_status", + "label": "Elected President of the United States", + "source_hash": "sha256:16b363185a1dd64090615007f453bd1a91f204e3b65b428eececba6827c0dcc2", + "source_url": "https://en.wikipedia.org/wiki/2008_United_States_presidential_election", + "start": "2008-11-04" + }, + "public_person": "Barack Obama" + }, + { + "birth_data": { + "date": "1961-07-01", + "place": "Sandringham, Norfolk, England", + "source_quality": "public_astrodatabank_candidate", + "source_url": "https://www.astro.com/astro-databank/Diana,_Princess_of_Wales", + "time": "19:45" + }, + "case_id": "candidate_princess_diana_wedding_1981", + "human_reviews": [], + "machine_prepared": true, + "negative_windows": [ + { + "end": "1981-05-14", + "review_note": "candidate negative window for no same marriage ceremony event", + "source_url": "https://en.wikipedia.org/wiki/Wedding_of_Prince_Charles_and_Lady_Diana_Spencer", + "start": "1981-05-01" + }, + { + "end": "1981-09-14", + "review_note": "candidate negative window for no same marriage ceremony event", + "source_url": "https://en.wikipedia.org/wiki/Wedding_of_Prince_Charles_and_Lady_Diana_Spencer", + "start": "1981-09-01" + } + ], + "positive_event": { + "end": "1981-07-29", + "event_type": "marriage", + "label": "Wedding of Prince Charles and Lady Diana Spencer", + "source_hash": "sha256:ab8415e1bb1d26cb99c57b4503503e4688636568f22b80ddd4b1c9c64b59f22a", + "source_url": "https://en.wikipedia.org/wiki/Wedding_of_Prince_Charles_and_Lady_Diana_Spencer", + "start": "1981-07-29" + }, + "public_person": "Diana, Princess of Wales" + } + ], + "claim_status": "candidate_labels_need_human_freeze", + "created_at": "2026-07-23", + "next_action": "A human reviewer must verify birth data, event source, and negative windows, then add two distinct frozen reviews before blind replay.", + "production_tuning_allowed": false, + "review_policy": { + "machine_prepared_labels_are_not_independent_human_labels": true, + "minimum_distinct_reviewers_per_case": 2, + "minimum_public_people": 3 + }, + "scope": "timing_rectification_candidate_holdout_labels", + "summary": { + "candidate_case_count": 3, + "negative_window_count": 6, + "positive_event_count": 3, + "ready_for_blind_replay_count": 0 + }, + "truth_matrix_allowed": false +} diff --git a/references/real_case_calibration/timing_rectification_reviewer_freeze_status_2026_07_23.json b/references/real_case_calibration/timing_rectification_reviewer_freeze_status_2026_07_23.json new file mode 100644 index 00000000..c698d395 --- /dev/null +++ b/references/real_case_calibration/timing_rectification_reviewer_freeze_status_2026_07_23.json @@ -0,0 +1,51 @@ +{ + "boundary": "One reviewer confirmation advances candidate governance but does not satisfy the two-reviewer freeze requirement or upgrade timing claims.", + "claim_status": "one_reviewer_confirmed_second_required", + "created_at": "2026-07-23", + "next_action": "Collect a second independent reviewer confirmation before running blind timing/rectification replay.", + "production_tuning_allowed": false, + "reviewer_1": { + "allowed_for_tuning": false, + "confirmation_text": "我确认这 3 个候选案例可以作为第一轮 holdout。", + "confirmed_at": "2026-07-23", + "independent_of_model_run": false, + "reviewer_id": "user_confirmed_business_owner", + "scope": "first_reviewer_acceptance_of_machine_prepared_candidates" + }, + "reviewer_2_required": true, + "rows": [ + { + "case_id": "candidate_steve_jobs_apple_ipo_1980", + "freeze_status": "one_reviewer_confirmed_second_required", + "positive_event_label": "Apple initial public offering", + "public_person": "Steve Jobs", + "reviewer_1_status": "confirmed", + "reviewer_2_status": "missing" + }, + { + "case_id": "candidate_barack_obama_2008_election", + "freeze_status": "one_reviewer_confirmed_second_required", + "positive_event_label": "Elected President of the United States", + "public_person": "Barack Obama", + "reviewer_1_status": "confirmed", + "reviewer_2_status": "missing" + }, + { + "case_id": "candidate_princess_diana_wedding_1981", + "freeze_status": "one_reviewer_confirmed_second_required", + "positive_event_label": "Wedding of Prince Charles and Lady Diana Spencer", + "public_person": "Diana, Princess of Wales", + "reviewer_1_status": "confirmed", + "reviewer_2_status": "missing" + } + ], + "scope": "timing_rectification_reviewer_freeze_status", + "source_candidate_packet": "references/real_case_calibration/timing_rectification_candidate_holdout_labels_2026_07_23.json", + "summary": { + "case_count": 3, + "ready_for_blind_replay_count": 0, + "reviewer_1_confirmed_count": 3, + "reviewer_2_confirmed_count": 0 + }, + "truth_matrix_allowed": false +} diff --git a/scripts/timing_rectification_reviewer_freeze_status_2026_07_23.py b/scripts/timing_rectification_reviewer_freeze_status_2026_07_23.py new file mode 100644 index 00000000..4ac4caa6 --- /dev/null +++ b/scripts/timing_rectification_reviewer_freeze_status_2026_07_23.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 +"""Record reviewer confirmation status for timing/rectification holdout candidates.""" +from __future__ import annotations + +import json +from datetime import date +from pathlib import Path +from typing import Any + + +ROOT = Path(__file__).resolve().parents[1] +CANDIDATES = ROOT / "references/real_case_calibration/timing_rectification_candidate_holdout_labels_2026_07_23.json" +DEFAULT_OUTPUT = ROOT / "references/real_case_calibration/timing_rectification_reviewer_freeze_status_2026_07_23.json" + + +def build_report(candidate_path: Path = CANDIDATES) -> dict[str, Any]: + candidates = json.loads(candidate_path.read_text(encoding="utf-8")) + cases = candidates.get("cases") or [] + reviewer_1 = { + "reviewer_id": "user_confirmed_business_owner", + "confirmation_text": "我确认这 3 个候选案例可以作为第一轮 holdout。", + "confirmed_at": "2026-07-23", + "independent_of_model_run": False, + "allowed_for_tuning": False, + "scope": "first_reviewer_acceptance_of_machine_prepared_candidates", + } + rows = [ + { + "case_id": case["case_id"], + "public_person": case["public_person"], + "positive_event_label": case["positive_event"]["label"], + "reviewer_1_status": "confirmed", + "reviewer_2_status": "missing", + "freeze_status": "one_reviewer_confirmed_second_required", + } + for case in cases + ] + return { + "scope": "timing_rectification_reviewer_freeze_status", + "created_at": date.today().isoformat(), + "claim_status": "one_reviewer_confirmed_second_required", + "truth_matrix_allowed": False, + "production_tuning_allowed": False, + "source_candidate_packet": str(candidate_path.relative_to(ROOT)), + "reviewer_1": reviewer_1, + "reviewer_2_required": True, + "summary": { + "case_count": len(rows), + "reviewer_1_confirmed_count": len(rows), + "reviewer_2_confirmed_count": 0, + "ready_for_blind_replay_count": 0, + }, + "rows": rows, + "next_action": "Collect a second independent reviewer confirmation before running blind timing/rectification replay.", + "boundary": "One reviewer confirmation advances candidate governance but does not satisfy the two-reviewer freeze requirement or upgrade timing claims.", + } + + +def main() -> int: + DEFAULT_OUTPUT.write_text(json.dumps(build_report(), ensure_ascii=False, indent=2, sort_keys=True) + "\n", encoding="utf-8") + print(json.dumps(build_report(), ensure_ascii=False, indent=2, sort_keys=True)) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests/test_timing_rectification_reviewer_freeze_status_2026_07_23.py b/tests/test_timing_rectification_reviewer_freeze_status_2026_07_23.py new file mode 100644 index 00000000..ff3cfa0d --- /dev/null +++ b/tests/test_timing_rectification_reviewer_freeze_status_2026_07_23.py @@ -0,0 +1,36 @@ +import json +from pathlib import Path + +from scripts.timing_rectification_reviewer_freeze_status_2026_07_23 import build_report + + +ROOT = Path(__file__).resolve().parents[1] +STATUS = ROOT / "references/real_case_calibration/timing_rectification_reviewer_freeze_status_2026_07_23.json" +INDEX = ROOT / "references/oracle/evidence_packet_index_2026_07_19.json" + + +def test_reviewer_1_confirmation_is_recorded_without_blind_replay_upgrade() -> None: + data = json.loads(STATUS.read_text(encoding="utf-8")) + + assert data == build_report() + assert data["claim_status"] == "one_reviewer_confirmed_second_required" + assert data["truth_matrix_allowed"] is False + assert data["production_tuning_allowed"] is False + assert data["reviewer_1"]["confirmation_text"] == "我确认这 3 个候选案例可以作为第一轮 holdout。" + assert data["reviewer_2_required"] is True + assert data["summary"] == { + "case_count": 3, + "reviewer_1_confirmed_count": 3, + "reviewer_2_confirmed_count": 0, + "ready_for_blind_replay_count": 0, + } + assert "does not satisfy the two-reviewer freeze requirement" in data["boundary"] + + +def test_reviewer_freeze_status_is_indexed_as_human_review_required() -> None: + packets = {packet["packet_id"]: packet for packet in json.loads(INDEX.read_text(encoding="utf-8"))["packets"]} + packet = packets["timing_rectification_reviewer_freeze_status_2026_07_23"] + + assert packet["claim_status"] == "one_reviewer_confirmed_second_required" + assert packet["consumer_policy"] == "human_review_required" + assert "reviewer 2 is still missing" in packet["claim_boundary"]