fix(rectification): name education quality events by kind, no month for year precision (BUG-1088)
Wording only: _quality_user_meaning names start/change/interruption as 升学/学业变动/学业中断; _display_date_label drops the stored month for year-precision events. Split hash and month field unchanged; same-machine A/B (PYTHONHASHSEED=0) differs only in user_meaning/display_date_label. Re-frozen per ERR-110 under new quality_wording_2026_09_29 records; sealed rerun (20) and reported-offset sweep (900) identical to 09-21. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
9686dfb945
commit
56b51e2170
@@ -1,5 +1,12 @@
|
||||
# 印度占星 Skill 更新日志
|
||||
|
||||
## 2026-09-29 — 生时校正:学业经历的追问不再一律叫「那次上大学」,只记得年份的经历不再被说成「某年 1 月」(待验收)
|
||||
|
||||
- 校正里问「那次经历更接近如愿、将就调剂、发挥失常还是说不清」的学业题,按你说的经历类型称呼:入学叫「升学」,转学/换专业等叫「学业变动」,休学/中断叫「学业中断」。此前一律写「那次上大学」,艺考等经历会被问错(BUG-1088)。
|
||||
- 只说了年份的经历,题目里只写「某年」,不再补一个「1 月」。
|
||||
- 只改题目措辞:打分、候选、排除规则都不变(同机对照逐字节一致),按规定对校正计分做了重新封存。
|
||||
- Skill 版本不 bump(Skill 文本未改)。不改数据库结构。
|
||||
|
||||
## 2026-09-29 · 首次建盘过场后不再弹提示
|
||||
|
||||
- 群星汇聚过场结束后,首页不再轻提示「这片天空在星盘页可以保存。」(产品决定去掉;星盘页入口已是重放 + 分享)。
|
||||
|
||||
@@ -0,0 +1,116 @@
|
||||
{
|
||||
"record_version": "reported-offset-native-candidate-date-v3",
|
||||
"frozen_at_utc": "2026-09-29T00:45:23.590514+00:00",
|
||||
"ayanamsa": "raman",
|
||||
"node_mode": "mean",
|
||||
"radii_minutes": [
|
||||
15,
|
||||
30,
|
||||
60
|
||||
],
|
||||
"offsets_minutes": [
|
||||
-30,
|
||||
-20,
|
||||
-15,
|
||||
-10,
|
||||
-8,
|
||||
-5,
|
||||
-3,
|
||||
0,
|
||||
3,
|
||||
5,
|
||||
8,
|
||||
10,
|
||||
15,
|
||||
20,
|
||||
30
|
||||
],
|
||||
"minute_step": 1,
|
||||
"dataset": "references/real_case_calibration/minute_rectification_holdout_v3.json",
|
||||
"dataset_sha256": "45aa76ab79dfc6c6404b6252083e1aa5c7e2e2b7de811fc11042a8ad2da3f0ea",
|
||||
"dataset_benchmark_id": "minute_rectification_fact_ranker_v4_holdout_v3",
|
||||
"implementation_sha256": "c913c6f061458fb682f6d520ae08b2d64d6f6cee20ccd1abd7e6c43d5a41685d",
|
||||
"implementation_sha256_prefix": "c913c6f061458fb6",
|
||||
"historical_artifacts_manifest_sha256": "6102a26a840be207b5858b3a4c0509274468ae9071e86d308cbbac7371d6864e",
|
||||
"production_scoring_files": [
|
||||
"scripts/active_rectification_event_engine.py",
|
||||
"scripts/active_rectification_events.py",
|
||||
"scripts/ashtakavarga.py",
|
||||
"scripts/dasha_analyzer.py",
|
||||
"scripts/divisional_charts_extended.py",
|
||||
"scripts/domain_calculation_service.py",
|
||||
"scripts/jaimini.py",
|
||||
"scripts/minute_rectification_fact_ranker_v4.py",
|
||||
"scripts/minute_rectification_feature_facts_v4.py",
|
||||
"scripts/narayana_dasha.py",
|
||||
"scripts/rectification/api_service.py",
|
||||
"scripts/rectification/candidate_contrast.py",
|
||||
"scripts/rectification/candidate_window.py",
|
||||
"scripts/rectification/case_holdout.py",
|
||||
"scripts/rectification/contracts.py",
|
||||
"scripts/rectification/dasha_transition_proximity.py",
|
||||
"scripts/rectification/decision_policy.py",
|
||||
"scripts/rectification/event_probes.py",
|
||||
"scripts/rectification/refinement_packet.py",
|
||||
"scripts/rectification/scoring_service.py",
|
||||
"scripts/shadbala.py",
|
||||
"scripts/varga.py"
|
||||
],
|
||||
"production_scoring_sha256": "8320162e860e83a78834dbecc016d9d7d507981245e21a0336ec4342bb4a284b",
|
||||
"research_files": [
|
||||
"scripts/research/reported_offset_sweep.py",
|
||||
"scripts/research/cluster_width_lib.py",
|
||||
"scripts/research/probe_supply_after_six.py",
|
||||
"scripts/research/sealed_holdout_rerun.py",
|
||||
"scripts/minute_rectification_blind_eval.py",
|
||||
"scripts/minute_rectification_fact_blind_eval_v4.py",
|
||||
"scripts/minute_rectification_holdout_validator.py"
|
||||
],
|
||||
"research_implementation_sha256": "349564fc80be0f48e58a6fe4390d0d6cb564cca4f973870af44454a735d2c135",
|
||||
"file_sha256": {
|
||||
"scripts/active_rectification_event_engine.py": "cdc0e68edc770a2a1810fbdb68cbfd46dcd50b267c739c496fcc078c5e26b5b4",
|
||||
"scripts/active_rectification_events.py": "03e333ccf1103caf685dfe50fe890ab1793e945037085f50ce834a4a3b232222",
|
||||
"scripts/ashtakavarga.py": "cc32776674cf60713634a360a6f09774b3af0ec5d0f650687f52b79597b0dfbe",
|
||||
"scripts/dasha_analyzer.py": "5e53b1b4d4c7414c08dd0e7716f120a63c70ec3428ec93547f64d55c580da0e1",
|
||||
"scripts/divisional_charts_extended.py": "73bd50a83ac444830940184d0988cea621855f91db76a3f1a232014b992eacea",
|
||||
"scripts/domain_calculation_service.py": "9ee955874eea806c7b56f4246d90009c02ee8318b8f3dfe1d7132b1c0b4262e1",
|
||||
"scripts/jaimini.py": "b98bf965603dd2e3cc871fe40f3c8184731a701875ca50fef3ca68e9682eda81",
|
||||
"scripts/minute_rectification_blind_eval.py": "07aa30d8bad3278669495d5fea8be937aaf6367c8af980ff4f2fe9aa84ccc6ff",
|
||||
"scripts/minute_rectification_fact_blind_eval_v4.py": "bdf460e3467208e8b87345c5beb2128f3e22de7eeffd68f72b281b3ad9affc92",
|
||||
"scripts/minute_rectification_fact_ranker_v4.py": "f1a0d8d2482cd754d2e7f253a9606b0373519435a2bf58cfc3753e2b9ae0fb76",
|
||||
"scripts/minute_rectification_feature_facts_v4.py": "3d899a2cdd4825b8e32062443d487edcd2173a4ea55a36eb9f3abe587c0faf0f",
|
||||
"scripts/minute_rectification_holdout_validator.py": "b60b1c752e58672beaee8b36eb3b2348169726cda070ec969db0f13e7ed715af",
|
||||
"scripts/narayana_dasha.py": "7ff2c3238cd113b11b815e14b41967bd8e486ff62e36650e55613b9c79d1bfe3",
|
||||
"scripts/rectification/api_service.py": "e316ced0f3796d0378a0fe1aad950ee25922ae8afd53add578ed59ca8b2f0f79",
|
||||
"scripts/rectification/candidate_contrast.py": "eee7da71c0574a08876404b78ca111153fa95fb83ace82b9fdca141d1992e273",
|
||||
"scripts/rectification/candidate_window.py": "2fbc5058b12049b15fca375cdc125b8283e19f9f3e4bedcc291e344501891bef",
|
||||
"scripts/rectification/case_holdout.py": "fe0e699b617d9e216acdfeff87af4221c1d6f4c101bf33e1dbf14e2bcd75a8b5",
|
||||
"scripts/rectification/contracts.py": "c6dc6bd230e38f9f2126c224aae9ddbd6415304c15340f8c7cd3f06f6ef3160f",
|
||||
"scripts/rectification/dasha_transition_proximity.py": "0afba494aa12899621173c3cc941c6c1d0be9cec0bdf4c4a1c9bcd004ab22de8",
|
||||
"scripts/rectification/decision_policy.py": "d845896428e0f49f8b5ae946aff6203492e7383d387acf122cb0b7a523b0af28",
|
||||
"scripts/rectification/event_probes.py": "9bbadc246e6b8e94bb047522c3e5645613f508b3473ef40b38a207c77fdad58c",
|
||||
"scripts/rectification/refinement_packet.py": "dbeea5aa780889785ce850f3881e8b7f67bb44594e9bc382c65b2e730884a2f4",
|
||||
"scripts/rectification/scoring_service.py": "4940f47c5fcc0843b3f79692c1044cc871e738a866aa8cb96a4757998afa3921",
|
||||
"scripts/research/cluster_width_lib.py": "1d8f2ffa7795d62069deebb2de8e16749317037d4ed3f24a2c0092676e5cfcc6",
|
||||
"scripts/research/probe_supply_after_six.py": "098a5b4398d6f8d996917d809c2fc922ad64031d3b70660f8ef7c876aba92438",
|
||||
"scripts/research/reported_offset_sweep.py": "4d0f1f331046516c7f365eaa7bf70c8428d5e30b8841dc717dfa7df6a5a7d438",
|
||||
"scripts/research/sealed_holdout_rerun.py": "c3a5d0827d86e59a5cc82224e244ad109f35711a41c2ba30bc1edea7bdc4624f",
|
||||
"scripts/shadbala.py": "912e0e6d169c2172aab85f71e4347e3e39193020777b43825b775d906400956b",
|
||||
"scripts/varga.py": "4331de5a25ea08729af91aae863943c4223183937f419d52dc63fd6fe7f27be6"
|
||||
},
|
||||
"hash_scope": "explicit_identity_file_sets_not_a_transitive_dependency_lock",
|
||||
"scorer": "native_event_contribution_matrix_not_shadow_fact_ranker",
|
||||
"delivery": "initial_signature_clusters_peak_gap_lt_8_envelope_no_answers_no_elimination",
|
||||
"rank": "score_desc_then_sha256(benchmark_id:case_id:candidate_time)",
|
||||
"grid": "every_minute_inclusive_not_production_two_minute_sampling",
|
||||
"cross_midnight": "date_aware_candidates_distance_and_native_single_matrix",
|
||||
"evaluator_sha256": "4d0f1f331046516c7f365eaa7bf70c8428d5e30b8841dc717dfa7df6a5a7d438",
|
||||
"replay_revision": "native_candidate_date_v3",
|
||||
"supersedes": "candidate_date_grouped_v2_identity_and_path_not_assumed_numerically_wrong",
|
||||
"is_blind_evaluation": false,
|
||||
"truth_hidden_from_ranker": true,
|
||||
"official_valid_independent_blind": false,
|
||||
"official_blind_trial_count": 0,
|
||||
"results_previously_seen": true,
|
||||
"must_not_use_for_tuning": true
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,114 @@
|
||||
{
|
||||
"record_version": "exposed-v3-fixed-protocol-cross-midnight-rerun-v2",
|
||||
"extended_identity": {
|
||||
"historical_artifacts_manifest_sha256": "6102a26a840be207b5858b3a4c0509274468ae9071e86d308cbbac7371d6864e",
|
||||
"production_scoring_files": [
|
||||
"scripts/active_rectification_event_engine.py",
|
||||
"scripts/active_rectification_events.py",
|
||||
"scripts/ashtakavarga.py",
|
||||
"scripts/dasha_analyzer.py",
|
||||
"scripts/divisional_charts_extended.py",
|
||||
"scripts/domain_calculation_service.py",
|
||||
"scripts/jaimini.py",
|
||||
"scripts/minute_rectification_fact_ranker_v4.py",
|
||||
"scripts/minute_rectification_feature_facts_v4.py",
|
||||
"scripts/narayana_dasha.py",
|
||||
"scripts/rectification/api_service.py",
|
||||
"scripts/rectification/candidate_contrast.py",
|
||||
"scripts/rectification/candidate_window.py",
|
||||
"scripts/rectification/case_holdout.py",
|
||||
"scripts/rectification/contracts.py",
|
||||
"scripts/rectification/dasha_transition_proximity.py",
|
||||
"scripts/rectification/decision_policy.py",
|
||||
"scripts/rectification/event_probes.py",
|
||||
"scripts/rectification/refinement_packet.py",
|
||||
"scripts/rectification/scoring_service.py",
|
||||
"scripts/shadbala.py",
|
||||
"scripts/varga.py"
|
||||
],
|
||||
"production_scoring_sha256": "8320162e860e83a78834dbecc016d9d7d507981245e21a0336ec4342bb4a284b",
|
||||
"research_files": [
|
||||
"scripts/research/reported_offset_sweep.py",
|
||||
"scripts/research/cluster_width_lib.py",
|
||||
"scripts/research/probe_supply_after_six.py",
|
||||
"scripts/research/sealed_holdout_rerun.py",
|
||||
"scripts/minute_rectification_blind_eval.py",
|
||||
"scripts/minute_rectification_fact_blind_eval_v4.py",
|
||||
"scripts/minute_rectification_holdout_validator.py"
|
||||
],
|
||||
"research_implementation_sha256": "349564fc80be0f48e58a6fe4390d0d6cb564cca4f973870af44454a735d2c135",
|
||||
"file_sha256": {
|
||||
"scripts/active_rectification_event_engine.py": "cdc0e68edc770a2a1810fbdb68cbfd46dcd50b267c739c496fcc078c5e26b5b4",
|
||||
"scripts/active_rectification_events.py": "03e333ccf1103caf685dfe50fe890ab1793e945037085f50ce834a4a3b232222",
|
||||
"scripts/ashtakavarga.py": "cc32776674cf60713634a360a6f09774b3af0ec5d0f650687f52b79597b0dfbe",
|
||||
"scripts/dasha_analyzer.py": "5e53b1b4d4c7414c08dd0e7716f120a63c70ec3428ec93547f64d55c580da0e1",
|
||||
"scripts/divisional_charts_extended.py": "73bd50a83ac444830940184d0988cea621855f91db76a3f1a232014b992eacea",
|
||||
"scripts/domain_calculation_service.py": "9ee955874eea806c7b56f4246d90009c02ee8318b8f3dfe1d7132b1c0b4262e1",
|
||||
"scripts/jaimini.py": "b98bf965603dd2e3cc871fe40f3c8184731a701875ca50fef3ca68e9682eda81",
|
||||
"scripts/minute_rectification_blind_eval.py": "07aa30d8bad3278669495d5fea8be937aaf6367c8af980ff4f2fe9aa84ccc6ff",
|
||||
"scripts/minute_rectification_fact_blind_eval_v4.py": "bdf460e3467208e8b87345c5beb2128f3e22de7eeffd68f72b281b3ad9affc92",
|
||||
"scripts/minute_rectification_fact_ranker_v4.py": "f1a0d8d2482cd754d2e7f253a9606b0373519435a2bf58cfc3753e2b9ae0fb76",
|
||||
"scripts/minute_rectification_feature_facts_v4.py": "3d899a2cdd4825b8e32062443d487edcd2173a4ea55a36eb9f3abe587c0faf0f",
|
||||
"scripts/minute_rectification_holdout_validator.py": "b60b1c752e58672beaee8b36eb3b2348169726cda070ec969db0f13e7ed715af",
|
||||
"scripts/narayana_dasha.py": "7ff2c3238cd113b11b815e14b41967bd8e486ff62e36650e55613b9c79d1bfe3",
|
||||
"scripts/rectification/api_service.py": "e316ced0f3796d0378a0fe1aad950ee25922ae8afd53add578ed59ca8b2f0f79",
|
||||
"scripts/rectification/candidate_contrast.py": "eee7da71c0574a08876404b78ca111153fa95fb83ace82b9fdca141d1992e273",
|
||||
"scripts/rectification/candidate_window.py": "2fbc5058b12049b15fca375cdc125b8283e19f9f3e4bedcc291e344501891bef",
|
||||
"scripts/rectification/case_holdout.py": "fe0e699b617d9e216acdfeff87af4221c1d6f4c101bf33e1dbf14e2bcd75a8b5",
|
||||
"scripts/rectification/contracts.py": "c6dc6bd230e38f9f2126c224aae9ddbd6415304c15340f8c7cd3f06f6ef3160f",
|
||||
"scripts/rectification/dasha_transition_proximity.py": "0afba494aa12899621173c3cc941c6c1d0be9cec0bdf4c4a1c9bcd004ab22de8",
|
||||
"scripts/rectification/decision_policy.py": "d845896428e0f49f8b5ae946aff6203492e7383d387acf122cb0b7a523b0af28",
|
||||
"scripts/rectification/event_probes.py": "9bbadc246e6b8e94bb047522c3e5645613f508b3473ef40b38a207c77fdad58c",
|
||||
"scripts/rectification/refinement_packet.py": "dbeea5aa780889785ce850f3881e8b7f67bb44594e9bc382c65b2e730884a2f4",
|
||||
"scripts/rectification/scoring_service.py": "4940f47c5fcc0843b3f79692c1044cc871e738a866aa8cb96a4757998afa3921",
|
||||
"scripts/research/cluster_width_lib.py": "1d8f2ffa7795d62069deebb2de8e16749317037d4ed3f24a2c0092676e5cfcc6",
|
||||
"scripts/research/probe_supply_after_six.py": "098a5b4398d6f8d996917d809c2fc922ad64031d3b70660f8ef7c876aba92438",
|
||||
"scripts/research/reported_offset_sweep.py": "4d0f1f331046516c7f365eaa7bf70c8428d5e30b8841dc717dfa7df6a5a7d438",
|
||||
"scripts/research/sealed_holdout_rerun.py": "c3a5d0827d86e59a5cc82224e244ad109f35711a41c2ba30bc1edea7bdc4624f",
|
||||
"scripts/shadbala.py": "912e0e6d169c2172aab85f71e4347e3e39193020777b43825b775d906400956b",
|
||||
"scripts/varga.py": "4331de5a25ea08729af91aae863943c4223183937f419d52dc63fd6fe7f27be6"
|
||||
},
|
||||
"hash_scope": "explicit_identity_file_sets_not_a_transitive_dependency_lock"
|
||||
},
|
||||
"production_identity_scope": "context_only_shadow_scorer_does_not_call_transition_proximity",
|
||||
"frozen_at_utc": "2026-09-29T00:45:23.504555+00:00",
|
||||
"dataset_path": "references/real_case_calibration/minute_rectification_holdout_v3.json",
|
||||
"dataset_sha256": "45aa76ab79dfc6c6404b6252083e1aa5c7e2e2b7de811fc11042a8ad2da3f0ea",
|
||||
"algorithm_version": "birth-time-event-fact-ranker-v4-shadow",
|
||||
"implementation_sha256": "c913c6f061458fb682f6d520ae08b2d64d6f6cee20ccd1abd7e6c43d5a41685d",
|
||||
"files": [
|
||||
"scripts/active_rectification_event_engine.py",
|
||||
"scripts/active_rectification_events.py",
|
||||
"scripts/ashtakavarga.py",
|
||||
"scripts/dasha_analyzer.py",
|
||||
"scripts/divisional_charts_extended.py",
|
||||
"scripts/domain_calculation_service.py",
|
||||
"scripts/jaimini.py",
|
||||
"scripts/minute_rectification_fact_ranker_v4.py",
|
||||
"scripts/minute_rectification_feature_facts_v4.py",
|
||||
"scripts/narayana_dasha.py",
|
||||
"scripts/shadbala.py",
|
||||
"scripts/varga.py"
|
||||
],
|
||||
"historical_frozen_sha256": "f41c298dd6cdcebe7a93e632f7191954be7987f6012ca2a34cecb6e447fbf196",
|
||||
"evaluator_sha256": "c3a5d0827d86e59a5cc82224e244ad109f35711a41c2ba30bc1edea7bdc4624f",
|
||||
"ayanamsa": "raman",
|
||||
"node_mode": "mean",
|
||||
"candidate_radius_minutes": [
|
||||
10
|
||||
],
|
||||
"minute_step": 1,
|
||||
"release_metrics": {
|
||||
"top_1_rate_minimum": 0.6,
|
||||
"top_3_rate_minimum": 0.85,
|
||||
"mean_absolute_minute_error_maximum": 2.0,
|
||||
"false_confirmation_rate_maximum": 0.05,
|
||||
"correct_insufficient_evidence_rejection_rate_minimum": 0.9
|
||||
},
|
||||
"results_previously_seen": true,
|
||||
"official_valid_independent_blind": false,
|
||||
"must_not_use_for_tuning": true,
|
||||
"tie_breaker": "sha256(benchmark_id:case_id:candidate_time); published minute is never passed to the ranker",
|
||||
"metric_rank_definition": "competition_rank_1_plus_strictly_higher_scores_legacy_protocol",
|
||||
"extra_metric_rank_definition": "score_desc_then_existing_opaque_sha256_total_order"
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -9,7 +9,7 @@
|
||||
"dataset_path": "references/real_case_calibration/minute_rectification_holdout_v3.json",
|
||||
"report_path": "references/real_case_calibration/minute_rectification_holdout_v3_report.json",
|
||||
"source_audit_status": "corrected_known_date_errors",
|
||||
"evaluated_on": "2026-09-20",
|
||||
"evaluated_on": "2026-09-29",
|
||||
"evaluated_on_scope": "latest_fixed_protocol_rerun_not_historical_runtime_metrics",
|
||||
"historical_source_audit_status": "invalidated_after_replay",
|
||||
"report_status": "invalidated_after_source_audit",
|
||||
@@ -51,7 +51,7 @@
|
||||
"scripts/shadbala.py",
|
||||
"scripts/varga.py"
|
||||
],
|
||||
"production_scoring_sha256": "102f3bce580ebf917f36724722ebc841de88a119c4787b8ea5e9e21339261768",
|
||||
"production_scoring_sha256": "8320162e860e83a78834dbecc016d9d7d507981245e21a0336ec4342bb4a284b",
|
||||
"research_files": [
|
||||
"scripts/research/reported_offset_sweep.py",
|
||||
"scripts/research/cluster_width_lib.py",
|
||||
@@ -61,7 +61,7 @@
|
||||
"scripts/minute_rectification_fact_blind_eval_v4.py",
|
||||
"scripts/minute_rectification_holdout_validator.py"
|
||||
],
|
||||
"research_implementation_sha256": "f6c06b348a809f7316351914a92157485ff5e42dc5691873dbf58864b0f31d13",
|
||||
"research_implementation_sha256": "349564fc80be0f48e58a6fe4390d0d6cb564cca4f973870af44454a735d2c135",
|
||||
"file_sha256": {
|
||||
"scripts/active_rectification_event_engine.py": "cdc0e68edc770a2a1810fbdb68cbfd46dcd50b267c739c496fcc078c5e26b5b4",
|
||||
"scripts/active_rectification_events.py": "03e333ccf1103caf685dfe50fe890ab1793e945037085f50ce834a4a3b232222",
|
||||
@@ -83,13 +83,13 @@
|
||||
"scripts/rectification/contracts.py": "c6dc6bd230e38f9f2126c224aae9ddbd6415304c15340f8c7cd3f06f6ef3160f",
|
||||
"scripts/rectification/dasha_transition_proximity.py": "0afba494aa12899621173c3cc941c6c1d0be9cec0bdf4c4a1c9bcd004ab22de8",
|
||||
"scripts/rectification/decision_policy.py": "d845896428e0f49f8b5ae946aff6203492e7383d387acf122cb0b7a523b0af28",
|
||||
"scripts/rectification/event_probes.py": "45478ee3fdc36dc36e1a602bee5dd0627a5464275e370e64adb5826fe2aa58f5",
|
||||
"scripts/rectification/event_probes.py": "9bbadc246e6b8e94bb047522c3e5645613f508b3473ef40b38a207c77fdad58c",
|
||||
"scripts/rectification/refinement_packet.py": "dbeea5aa780889785ce850f3881e8b7f67bb44594e9bc382c65b2e730884a2f4",
|
||||
"scripts/rectification/scoring_service.py": "4940f47c5fcc0843b3f79692c1044cc871e738a866aa8cb96a4757998afa3921",
|
||||
"scripts/research/cluster_width_lib.py": "1d8f2ffa7795d62069deebb2de8e16749317037d4ed3f24a2c0092676e5cfcc6",
|
||||
"scripts/research/probe_supply_after_six.py": "098a5b4398d6f8d996917d809c2fc922ad64031d3b70660f8ef7c876aba92438",
|
||||
"scripts/research/reported_offset_sweep.py": "4898c605b745cba5c67311149fdfe0e2e1af7c620a41a172e746be55b19a84b3",
|
||||
"scripts/research/sealed_holdout_rerun.py": "5d26d782648bbef42b5dcfe603ef2cbe697b317df6000f7c9c3fa0272504b027",
|
||||
"scripts/research/reported_offset_sweep.py": "4d0f1f331046516c7f365eaa7bf70c8428d5e30b8841dc717dfa7df6a5a7d438",
|
||||
"scripts/research/sealed_holdout_rerun.py": "c3a5d0827d86e59a5cc82224e244ad109f35711a41c2ba30bc1edea7bdc4624f",
|
||||
"scripts/shadbala.py": "912e0e6d169c2172aab85f71e4347e3e39193020777b43825b775d906400956b",
|
||||
"scripts/varga.py": "4331de5a25ea08729af91aae863943c4223183937f419d52dc63fd6fe7f27be6"
|
||||
},
|
||||
@@ -98,7 +98,7 @@
|
||||
"matches_metrics_scorer": false,
|
||||
"official_eval_implementation_hash_matches": false,
|
||||
"official_eval_trial_count": 0,
|
||||
"source_report": "docs/research/sealed_holdout_rerun_midnight_anchor_2026_09_21.json",
|
||||
"source_report": "docs/research/sealed_holdout_rerun_quality_wording_2026_09_29.json",
|
||||
"fixed_protocol_rerun_trial_count": 20,
|
||||
"fixed_protocol_rerun_hash_matches": true,
|
||||
"metrics": {
|
||||
@@ -111,6 +111,99 @@
|
||||
}
|
||||
},
|
||||
"current_tree_fixed_protocol_rerun": {
|
||||
"evaluated_on": "2026-09-29",
|
||||
"report_path": "docs/research/sealed_holdout_rerun_quality_wording_2026_09_29.json",
|
||||
"freeze_record_path": "docs/research/sealed_holdout_rerun_quality_wording_2026_09_29.freeze.json",
|
||||
"implementation_sha256": "c913c6f061458fb682f6d520ae08b2d64d6f6cee20ccd1abd7e6c43d5a41685d",
|
||||
"extended_identity": {
|
||||
"historical_artifacts_manifest_sha256": "6102a26a840be207b5858b3a4c0509274468ae9071e86d308cbbac7371d6864e",
|
||||
"production_scoring_files": [
|
||||
"scripts/active_rectification_event_engine.py",
|
||||
"scripts/active_rectification_events.py",
|
||||
"scripts/ashtakavarga.py",
|
||||
"scripts/dasha_analyzer.py",
|
||||
"scripts/divisional_charts_extended.py",
|
||||
"scripts/domain_calculation_service.py",
|
||||
"scripts/jaimini.py",
|
||||
"scripts/minute_rectification_fact_ranker_v4.py",
|
||||
"scripts/minute_rectification_feature_facts_v4.py",
|
||||
"scripts/narayana_dasha.py",
|
||||
"scripts/rectification/api_service.py",
|
||||
"scripts/rectification/candidate_contrast.py",
|
||||
"scripts/rectification/candidate_window.py",
|
||||
"scripts/rectification/case_holdout.py",
|
||||
"scripts/rectification/contracts.py",
|
||||
"scripts/rectification/dasha_transition_proximity.py",
|
||||
"scripts/rectification/decision_policy.py",
|
||||
"scripts/rectification/event_probes.py",
|
||||
"scripts/rectification/refinement_packet.py",
|
||||
"scripts/rectification/scoring_service.py",
|
||||
"scripts/shadbala.py",
|
||||
"scripts/varga.py"
|
||||
],
|
||||
"production_scoring_sha256": "8320162e860e83a78834dbecc016d9d7d507981245e21a0336ec4342bb4a284b",
|
||||
"research_files": [
|
||||
"scripts/research/reported_offset_sweep.py",
|
||||
"scripts/research/cluster_width_lib.py",
|
||||
"scripts/research/probe_supply_after_six.py",
|
||||
"scripts/research/sealed_holdout_rerun.py",
|
||||
"scripts/minute_rectification_blind_eval.py",
|
||||
"scripts/minute_rectification_fact_blind_eval_v4.py",
|
||||
"scripts/minute_rectification_holdout_validator.py"
|
||||
],
|
||||
"research_implementation_sha256": "349564fc80be0f48e58a6fe4390d0d6cb564cca4f973870af44454a735d2c135",
|
||||
"file_sha256": {
|
||||
"scripts/active_rectification_event_engine.py": "cdc0e68edc770a2a1810fbdb68cbfd46dcd50b267c739c496fcc078c5e26b5b4",
|
||||
"scripts/active_rectification_events.py": "03e333ccf1103caf685dfe50fe890ab1793e945037085f50ce834a4a3b232222",
|
||||
"scripts/ashtakavarga.py": "cc32776674cf60713634a360a6f09774b3af0ec5d0f650687f52b79597b0dfbe",
|
||||
"scripts/dasha_analyzer.py": "5e53b1b4d4c7414c08dd0e7716f120a63c70ec3428ec93547f64d55c580da0e1",
|
||||
"scripts/divisional_charts_extended.py": "73bd50a83ac444830940184d0988cea621855f91db76a3f1a232014b992eacea",
|
||||
"scripts/domain_calculation_service.py": "9ee955874eea806c7b56f4246d90009c02ee8318b8f3dfe1d7132b1c0b4262e1",
|
||||
"scripts/jaimini.py": "b98bf965603dd2e3cc871fe40f3c8184731a701875ca50fef3ca68e9682eda81",
|
||||
"scripts/minute_rectification_blind_eval.py": "07aa30d8bad3278669495d5fea8be937aaf6367c8af980ff4f2fe9aa84ccc6ff",
|
||||
"scripts/minute_rectification_fact_blind_eval_v4.py": "bdf460e3467208e8b87345c5beb2128f3e22de7eeffd68f72b281b3ad9affc92",
|
||||
"scripts/minute_rectification_fact_ranker_v4.py": "f1a0d8d2482cd754d2e7f253a9606b0373519435a2bf58cfc3753e2b9ae0fb76",
|
||||
"scripts/minute_rectification_feature_facts_v4.py": "3d899a2cdd4825b8e32062443d487edcd2173a4ea55a36eb9f3abe587c0faf0f",
|
||||
"scripts/minute_rectification_holdout_validator.py": "b60b1c752e58672beaee8b36eb3b2348169726cda070ec969db0f13e7ed715af",
|
||||
"scripts/narayana_dasha.py": "7ff2c3238cd113b11b815e14b41967bd8e486ff62e36650e55613b9c79d1bfe3",
|
||||
"scripts/rectification/api_service.py": "e316ced0f3796d0378a0fe1aad950ee25922ae8afd53add578ed59ca8b2f0f79",
|
||||
"scripts/rectification/candidate_contrast.py": "eee7da71c0574a08876404b78ca111153fa95fb83ace82b9fdca141d1992e273",
|
||||
"scripts/rectification/candidate_window.py": "2fbc5058b12049b15fca375cdc125b8283e19f9f3e4bedcc291e344501891bef",
|
||||
"scripts/rectification/case_holdout.py": "fe0e699b617d9e216acdfeff87af4221c1d6f4c101bf33e1dbf14e2bcd75a8b5",
|
||||
"scripts/rectification/contracts.py": "c6dc6bd230e38f9f2126c224aae9ddbd6415304c15340f8c7cd3f06f6ef3160f",
|
||||
"scripts/rectification/dasha_transition_proximity.py": "0afba494aa12899621173c3cc941c6c1d0be9cec0bdf4c4a1c9bcd004ab22de8",
|
||||
"scripts/rectification/decision_policy.py": "d845896428e0f49f8b5ae946aff6203492e7383d387acf122cb0b7a523b0af28",
|
||||
"scripts/rectification/event_probes.py": "9bbadc246e6b8e94bb047522c3e5645613f508b3473ef40b38a207c77fdad58c",
|
||||
"scripts/rectification/refinement_packet.py": "dbeea5aa780889785ce850f3881e8b7f67bb44594e9bc382c65b2e730884a2f4",
|
||||
"scripts/rectification/scoring_service.py": "4940f47c5fcc0843b3f79692c1044cc871e738a866aa8cb96a4757998afa3921",
|
||||
"scripts/research/cluster_width_lib.py": "1d8f2ffa7795d62069deebb2de8e16749317037d4ed3f24a2c0092676e5cfcc6",
|
||||
"scripts/research/probe_supply_after_six.py": "098a5b4398d6f8d996917d809c2fc922ad64031d3b70660f8ef7c876aba92438",
|
||||
"scripts/research/reported_offset_sweep.py": "4d0f1f331046516c7f365eaa7bf70c8428d5e30b8841dc717dfa7df6a5a7d438",
|
||||
"scripts/research/sealed_holdout_rerun.py": "c3a5d0827d86e59a5cc82224e244ad109f35711a41c2ba30bc1edea7bdc4624f",
|
||||
"scripts/shadbala.py": "912e0e6d169c2172aab85f71e4347e3e39193020777b43825b775d906400956b",
|
||||
"scripts/varga.py": "4331de5a25ea08729af91aae863943c4223183937f419d52dc63fd6fe7f27be6"
|
||||
},
|
||||
"hash_scope": "explicit_identity_file_sets_not_a_transitive_dependency_lock"
|
||||
},
|
||||
"scorer_frozen_before_rerun": true,
|
||||
"source_audit_status": "corrected_known_date_errors",
|
||||
"trial_count": 20,
|
||||
"official_valid_independent_blind": false,
|
||||
"is_blind_evaluation": false,
|
||||
"truth_hidden_from_ranker": true,
|
||||
"results_previously_seen": true,
|
||||
"must_not_claim_as_release_metrics": true,
|
||||
"must_not_use_for_tuning": true,
|
||||
"verified_minute_claim_allowed": false,
|
||||
"metric_gates_passed": false,
|
||||
"events_per_case": 3,
|
||||
"boundary": "Three-event low-information protocol, not a mathematical accuracy lower bound and not representative of real sessions. Historical v3/v4 exposure cannot be undone by freezing today's scorer. No tuning or release claims.",
|
||||
"report_sha256": "a82e5cde947a7cc4eb6adb70c17cce02c4dd9348966b03decedf78b804f49dd0",
|
||||
"freeze_record_sha256": "d4ce155223e186efa6f0e60103e2ab6e0c9bfbb196fc0e016f1212e1730ac343",
|
||||
"replay_started_at_utc": "2026-09-29T00:45:30.638089+00:00",
|
||||
"replay_finished_at_utc": "2026-09-29T00:45:32.743041+00:00"
|
||||
},
|
||||
"previous_fixed_protocol_rerun": {
|
||||
"evaluated_on": "2026-09-20",
|
||||
"report_path": "docs/research/sealed_holdout_rerun_midnight_anchor_2026_09_21.json",
|
||||
"freeze_record_path": "docs/research/sealed_holdout_rerun_midnight_anchor_2026_09_21.freeze.json",
|
||||
@@ -197,96 +290,15 @@
|
||||
"verified_minute_claim_allowed": false,
|
||||
"metric_gates_passed": false,
|
||||
"events_per_case": 3,
|
||||
"boundary": "Three-event low-information protocol, not a mathematical accuracy lower bound and not representative of real sessions. Historical v3/v4 exposure cannot be undone by freezing today's scorer. No tuning or release claims.",
|
||||
"boundary": "Previously exposed v3 shadow fixed-protocol rerun after BUG-981 midnight date anchor. Superseded by the 2026-09-29 BUG-1088 wording re-freeze; report and freeze preserved byte-for-byte.",
|
||||
"report_sha256": "05458f29215d9784623f1b05f09ef590915caf46a87947f0af31dcae85808620",
|
||||
"freeze_record_sha256": "9b9bb4b9093a9987e84f04f50b3291ceca23691f89b1d5800c81652aec13824e",
|
||||
"replay_started_at_utc": "2026-09-20T17:01:53.362316+00:00",
|
||||
"replay_finished_at_utc": "2026-09-20T17:01:56.147759+00:00"
|
||||
},
|
||||
"previous_fixed_protocol_rerun": {
|
||||
"evaluated_on": "2026-09-20",
|
||||
"report_path": "docs/research/sealed_holdout_rerun_cross_midnight_2026_09_20.json",
|
||||
"freeze_record_path": "docs/research/sealed_holdout_rerun_cross_midnight_2026_09_20.final.freeze.json",
|
||||
"implementation_sha256": "b15d9ea15227cd58b3097555537fa7c37fb5a993905ada4f5aa04f52de1f8f18",
|
||||
"extended_identity": {
|
||||
"production_scoring_files": [
|
||||
"scripts/active_rectification_event_engine.py",
|
||||
"scripts/active_rectification_events.py",
|
||||
"scripts/ashtakavarga.py",
|
||||
"scripts/dasha_analyzer.py",
|
||||
"scripts/divisional_charts_extended.py",
|
||||
"scripts/domain_calculation_service.py",
|
||||
"scripts/jaimini.py",
|
||||
"scripts/minute_rectification_fact_ranker_v4.py",
|
||||
"scripts/minute_rectification_feature_facts_v4.py",
|
||||
"scripts/narayana_dasha.py",
|
||||
"scripts/rectification/candidate_contrast.py",
|
||||
"scripts/rectification/case_holdout.py",
|
||||
"scripts/rectification/contracts.py",
|
||||
"scripts/rectification/dasha_transition_proximity.py",
|
||||
"scripts/rectification/event_probes.py",
|
||||
"scripts/rectification/scoring_service.py",
|
||||
"scripts/shadbala.py",
|
||||
"scripts/varga.py"
|
||||
],
|
||||
"production_scoring_sha256": "7fffd1db612af1f244a8b5d5eac2f1a3f5a8e9e138c09ac6b3743b98f9a47a51",
|
||||
"research_files": [
|
||||
"scripts/research/reported_offset_sweep.py",
|
||||
"scripts/research/cluster_width_lib.py",
|
||||
"scripts/research/probe_supply_after_six.py",
|
||||
"scripts/research/sealed_holdout_rerun.py",
|
||||
"scripts/minute_rectification_blind_eval.py",
|
||||
"scripts/minute_rectification_fact_blind_eval_v4.py",
|
||||
"scripts/minute_rectification_holdout_validator.py"
|
||||
],
|
||||
"research_implementation_sha256": "2931d4661bf53dde5c57f6492de65be4c00877293b7277353279a05eda5af215",
|
||||
"historical_artifacts_manifest_sha256": "6102a26a840be207b5858b3a4c0509274468ae9071e86d308cbbac7371d6864e",
|
||||
"file_sha256": {
|
||||
"scripts/active_rectification_event_engine.py": "edbe93ef3c8bd65f986139dba6b95b96d9b0fa9920341fbe677cd6f53e4db84f",
|
||||
"scripts/active_rectification_events.py": "03e333ccf1103caf685dfe50fe890ab1793e945037085f50ce834a4a3b232222",
|
||||
"scripts/ashtakavarga.py": "cc32776674cf60713634a360a6f09774b3af0ec5d0f650687f52b79597b0dfbe",
|
||||
"scripts/dasha_analyzer.py": "5e53b1b4d4c7414c08dd0e7716f120a63c70ec3428ec93547f64d55c580da0e1",
|
||||
"scripts/divisional_charts_extended.py": "73bd50a83ac444830940184d0988cea621855f91db76a3f1a232014b992eacea",
|
||||
"scripts/domain_calculation_service.py": "9ee955874eea806c7b56f4246d90009c02ee8318b8f3dfe1d7132b1c0b4262e1",
|
||||
"scripts/jaimini.py": "b98bf965603dd2e3cc871fe40f3c8184731a701875ca50fef3ca68e9682eda81",
|
||||
"scripts/minute_rectification_blind_eval.py": "07aa30d8bad3278669495d5fea8be937aaf6367c8af980ff4f2fe9aa84ccc6ff",
|
||||
"scripts/minute_rectification_fact_blind_eval_v4.py": "bdf460e3467208e8b87345c5beb2128f3e22de7eeffd68f72b281b3ad9affc92",
|
||||
"scripts/minute_rectification_fact_ranker_v4.py": "f1a0d8d2482cd754d2e7f253a9606b0373519435a2bf58cfc3753e2b9ae0fb76",
|
||||
"scripts/minute_rectification_feature_facts_v4.py": "3d899a2cdd4825b8e32062443d487edcd2173a4ea55a36eb9f3abe587c0faf0f",
|
||||
"scripts/minute_rectification_holdout_validator.py": "b60b1c752e58672beaee8b36eb3b2348169726cda070ec969db0f13e7ed715af",
|
||||
"scripts/narayana_dasha.py": "7ff2c3238cd113b11b815e14b41967bd8e486ff62e36650e55613b9c79d1bfe3",
|
||||
"scripts/rectification/candidate_contrast.py": "10a360586359e72846593ef6d7c15a2cea79358245a34c288851406fe9e47ca8",
|
||||
"scripts/rectification/case_holdout.py": "fe0e699b617d9e216acdfeff87af4221c1d6f4c101bf33e1dbf14e2bcd75a8b5",
|
||||
"scripts/rectification/contracts.py": "fdd1a47b2e3dac8579e870a282ed74c68518b39f6c0576b27df766a4b8021143",
|
||||
"scripts/rectification/dasha_transition_proximity.py": "0afba494aa12899621173c3cc941c6c1d0be9cec0bdf4c4a1c9bcd004ab22de8",
|
||||
"scripts/rectification/event_probes.py": "45478ee3fdc36dc36e1a602bee5dd0627a5464275e370e64adb5826fe2aa58f5",
|
||||
"scripts/rectification/scoring_service.py": "0adf5700bb22dd8c4c3147027251210e21ec66a2c9f9a91217edba3ad9e5d1f5",
|
||||
"scripts/research/cluster_width_lib.py": "1d8f2ffa7795d62069deebb2de8e16749317037d4ed3f24a2c0092676e5cfcc6",
|
||||
"scripts/research/probe_supply_after_six.py": "098a5b4398d6f8d996917d809c2fc922ad64031d3b70660f8ef7c876aba92438",
|
||||
"scripts/research/reported_offset_sweep.py": "f81c681fd0fe257e90a761dfab370f623e5f8a881b62cc6b1c596cbd58800f8f",
|
||||
"scripts/research/sealed_holdout_rerun.py": "34a6724530fbecdecff9e5e07fa64980b8e8aff1fac2e000f4268debe1ee96e1",
|
||||
"scripts/shadbala.py": "912e0e6d169c2172aab85f71e4347e3e39193020777b43825b775d906400956b",
|
||||
"scripts/varga.py": "4331de5a25ea08729af91aae863943c4223183937f419d52dc63fd6fe7f27be6"
|
||||
},
|
||||
"hash_scope": "explicit_identity_file_sets_not_a_transitive_dependency_lock"
|
||||
},
|
||||
"scorer_frozen_before_rerun": true,
|
||||
"source_audit_status": "corrected_known_date_errors",
|
||||
"trial_count": 20,
|
||||
"official_valid_independent_blind": false,
|
||||
"is_blind_evaluation": false,
|
||||
"truth_hidden_from_ranker": true,
|
||||
"results_previously_seen": true,
|
||||
"must_not_claim_as_release_metrics": true,
|
||||
"must_not_use_for_tuning": true,
|
||||
"verified_minute_claim_allowed": false,
|
||||
"metric_gates_passed": false,
|
||||
"events_per_case": 3,
|
||||
"boundary": "Previously exposed v3 shadow fixed-protocol rerun after BUG-981. Production identity is contextual: shadow scorer does not call transition proximity. Prior shadow metrics are not presumed incorrect. Three-event low-information protocol is neither representative of real sessions nor a mathematical accuracy lower bound. No independent blind evidence or release claim.",
|
||||
"replay_finished_at_utc": "2026-09-20T17:01:56.147759+00:00",
|
||||
"previous_fixed_protocol_rerun": {
|
||||
"report_path": "docs/research/sealed_holdout_rerun_2026_09_20.json",
|
||||
"freeze_record_path": "docs/research/sealed_holdout_rerun_2026_09_20.freeze.json",
|
||||
"superseded_reason": "New production and evaluator identity; prior shadow report and freeze preserved byte-for-byte, not relabelled as new results."
|
||||
"report_path": "docs/research/sealed_holdout_rerun_cross_midnight_2026_09_20.json",
|
||||
"freeze_record_path": "docs/research/sealed_holdout_rerun_cross_midnight_2026_09_20.final.freeze.json",
|
||||
"superseded_reason": "New production identity (BUG-981 midnight date anchor); prior report and freeze preserved byte-for-byte."
|
||||
}
|
||||
},
|
||||
"current_tree_unfrozen_diagnostic": {
|
||||
@@ -307,15 +319,22 @@
|
||||
"verified_minute_claim_allowed": false
|
||||
},
|
||||
"current_tree_reported_offset_replay": {
|
||||
"report_path": "docs/research/reported_offset_midnight_anchor_2026_09_21.json",
|
||||
"report_sha256": "093d50953d7772f037401b99517b8dcaf2a1b20aa3e8ae2e692d83c6510dd02f",
|
||||
"freeze_record_path": "docs/research/reported_offset_midnight_anchor_2026_09_21.freeze.json",
|
||||
"freeze_record_sha256": "73848f421b133f53578dd0e0713f24fbb38a2bcf3b27609398b1ba98dbfc224c",
|
||||
"report_path": "docs/research/reported_offset_quality_wording_2026_09_29.json",
|
||||
"report_sha256": "45f3c2afdcd4d59b59d01a42e872318c125bafad162c578ed2808d43e5b58aca",
|
||||
"freeze_record_path": "docs/research/reported_offset_quality_wording_2026_09_29.freeze.json",
|
||||
"freeze_record_sha256": "7f6d015545b655d8e6b5e96d979c032cedbff904757fa3a89e996710e3fa21a2",
|
||||
"scope": "reported_offset_sensitivity_not_product_accuracy",
|
||||
"trial_count": 900,
|
||||
"official_valid_independent_blind": false,
|
||||
"official_blind_trial_count": 0,
|
||||
"must_not_use_for_tuning": true,
|
||||
"must_not_claim_as_release_metrics": true
|
||||
},
|
||||
"previous_reported_offset_replay": {
|
||||
"report_path": "docs/research/reported_offset_midnight_anchor_2026_09_21.json",
|
||||
"report_sha256": "093d50953d7772f037401b99517b8dcaf2a1b20aa3e8ae2e692d83c6510dd02f",
|
||||
"freeze_record_path": "docs/research/reported_offset_midnight_anchor_2026_09_21.freeze.json",
|
||||
"freeze_record_sha256": "73848f421b133f53578dd0e0713f24fbb38a2bcf3b27609398b1ba98dbfc224c",
|
||||
"superseded_reason": "BUG-1088 wording-only re-freeze of event_probes.py; 900 trials and summary identical; prior report and freeze preserved byte-for-byte."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -954,7 +954,8 @@ def _event_month(event: dict[str, Any]) -> int | None:
|
||||
|
||||
def _display_date_label(event: dict[str, Any]) -> str:
|
||||
year = _event_year(event)
|
||||
month = _event_month(event)
|
||||
# A year-precision event is stored as YYYY-01-01; its month is not known (BUG-1088).
|
||||
month = None if str(event.get("precision") or "") == "year" else _event_month(event)
|
||||
if year is None:
|
||||
return "那次"
|
||||
if month:
|
||||
@@ -1072,11 +1073,21 @@ def _select_quality_distinguish_rows(candidates: Sequence[dict[str, Any]]) -> li
|
||||
return selected[:MAX_QUALITY_DISTINGUISH_PROBES]
|
||||
|
||||
|
||||
#: What the education quality question calls the event, by kind (BUG-1088). Only the
|
||||
#: kinds in `QUALITY_DISTINGUISH_EVENT_KINDS` reach the quality probe.
|
||||
EDUCATION_QUALITY_EVENT_NAME = {
|
||||
"education_start": "升学",
|
||||
"education_change": "学业变动",
|
||||
"education_interruption": "学业中断",
|
||||
}
|
||||
|
||||
|
||||
def _quality_user_meaning(event: dict[str, Any], domain: str) -> str:
|
||||
label = _display_date_label(event)
|
||||
if domain == "education":
|
||||
name = EDUCATION_QUALITY_EVENT_NAME.get(_event_kind_name(event), "学业经历")
|
||||
return (
|
||||
f"{label}那次上大学,更接近如愿、将就调剂、发挥失常还是说不清。"
|
||||
f"{label}那次{name},结果更接近如愿、将就调剂、发挥失常还是说不清。"
|
||||
"只问那次经历的实际体验,不得改时间范围。"
|
||||
)
|
||||
family = str(DOMAIN_CATALOG[domain]["event_family"])
|
||||
|
||||
@@ -0,0 +1,114 @@
|
||||
#!/usr/bin/env python3
|
||||
"""A/B dump for BUG-1088 (quality-probe wording, year-precision label).
|
||||
|
||||
Dumps engine rows, public candidate decisions and every discriminating probe
|
||||
for a few v4 open-holdout cases plus fictional cases that carry education
|
||||
quality events. Run on the base and on the patched tree with the same
|
||||
PYTHONHASHSEED and diff: only `user_meaning` / `display_date_label` text may
|
||||
change.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import sys
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
from uuid import NAMESPACE_URL, uuid5
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[2]
|
||||
if str(ROOT) not in sys.path:
|
||||
sys.path.insert(0, str(ROOT))
|
||||
|
||||
from scripts.active_rectification_event_engine import compute_candidate_static_contexts # noqa: E402
|
||||
from scripts.rectification.decision_policy import build_candidate_decisions # noqa: E402
|
||||
from scripts.rectification.event_probes import _discriminating_event_probe_lists # noqa: E402
|
||||
from scripts.rectification.refinement_packet import window_scan # noqa: E402
|
||||
from scripts.rectification.scoring_service import ( # noqa: E402
|
||||
build_event_contribution_matrix,
|
||||
score_from_matrix,
|
||||
scoreable_request,
|
||||
)
|
||||
from scripts.research.guided_collect_holdout_replay import TODAY, load_cases # noqa: E402
|
||||
from scripts.research.minute_resolution_sweep import scoring_request_for # noqa: E402
|
||||
from scripts.rectification.contracts import normalize_rectification_request # noqa: E402
|
||||
|
||||
#: Fictional births only (no real person). Education events carry quality kinds.
|
||||
FICTIONAL = [
|
||||
("1994-06-21", "14:50", [
|
||||
("education", "education_start", "2011-01-01", "2011-12-31", "year"),
|
||||
("education", "education_change", "2012-09-01", "2012-09-30", "month"),
|
||||
("relocation", "relocation", "2000-01-01", "2000-12-31", "year"),
|
||||
("career", "career_entry", "2017-05-01", "2017-05-31", "month"),
|
||||
]),
|
||||
("1993-11-17", "09:20", [
|
||||
("education", "education_interruption", "2010-01-01", "2010-12-31", "year"),
|
||||
("education", "education_start", "2011-09-03", "2011-09-03", "day"),
|
||||
("career", "career_entry", "2016-07-01", "2016-07-31", "month"),
|
||||
("relocation", "relocation", "2018-01-01", "2018-12-31", "year"),
|
||||
]),
|
||||
]
|
||||
|
||||
|
||||
def fictional_request(birth_date: str, time: str, events: list[tuple[str, str, str, str, str]]) -> dict[str, Any]:
|
||||
hh, mm = int(time[:2]), int(time[3:])
|
||||
start = f"{(hh * 60 + mm - 15) // 60:02d}:{(hh * 60 + mm - 15) % 60:02d}"
|
||||
end = f"{(hh * 60 + mm + 15) // 60:02d}:{(hh * 60 + mm + 15) % 60:02d}"
|
||||
return scoreable_request(normalize_rectification_request({
|
||||
"birth_date": birth_date, "start_time": start, "end_time": end,
|
||||
"lat": 39.9042, "lon": 116.4074, "tz": 8.0,
|
||||
"events": [
|
||||
{"id": str(uuid5(NAMESPACE_URL, f"fictional-{birth_date}-{index}")), "domain": domain, "event_kind": kind, "date_start": lo,
|
||||
"date_end": hi, "precision": precision, "summary": f"fictional {kind}"}
|
||||
for index, (domain, kind, lo, hi, precision) in enumerate(events)
|
||||
],
|
||||
}, today=TODAY))
|
||||
|
||||
|
||||
def dump(request: dict[str, Any]) -> dict[str, Any]:
|
||||
import scripts.rectification.event_probes as event_probes
|
||||
|
||||
request = {**request, "minute_step": 1}
|
||||
captured: list[dict[str, Any]] = []
|
||||
original = event_probes._quality_distinguish_probes
|
||||
|
||||
def capture(*args: Any, **kwargs: Any) -> list[dict[str, Any]]:
|
||||
rows = original(*args, **kwargs)
|
||||
captured.extend(rows)
|
||||
return rows
|
||||
|
||||
# Quality probes are ranked after the boundary probes and often fall past MAX_PROBES;
|
||||
# capture the builder output so the A/B sees them. Restored below.
|
||||
event_probes._quality_distinguish_probes = capture
|
||||
contexts = compute_candidate_static_contexts(request)
|
||||
built = build_event_contribution_matrix(request, static_contexts=contexts)
|
||||
rows = score_from_matrix(request, built)
|
||||
times = [str(row["time"])[:5] for row in rows]
|
||||
probes, dropped = _discriminating_event_probe_lists(
|
||||
{**request, "refresh_probes": False, "asked_probe_keys": []}, built,
|
||||
scan=window_scan(built), candidate_times=times, representative_time=times[len(times) // 2],
|
||||
today=TODAY,
|
||||
)
|
||||
event_probes._quality_distinguish_probes = original
|
||||
assert event_probes._quality_distinguish_probes is original
|
||||
decisions = build_candidate_decisions(rows, result_id="ab", static_contexts=contexts)
|
||||
return {
|
||||
"rows": [{"time": str(row["time"])[:5], "score": str(row.get("score"))} for row in rows],
|
||||
"decisions": decisions,
|
||||
"probes": probes,
|
||||
"dropped": dropped,
|
||||
"quality_built": captured,
|
||||
}
|
||||
|
||||
|
||||
def main() -> int:
|
||||
out: dict[str, Any] = {}
|
||||
for case in load_cases()[:4]:
|
||||
out[str(case["case_id"])] = dump(scoring_request_for(case, 10))
|
||||
for birth_date, time, events in FICTIONAL:
|
||||
out[f"fictional-{birth_date}"] = dump(fictional_request(birth_date, time, events))
|
||||
json.dump(out, sys.stdout, ensure_ascii=False, indent=1, sort_keys=True, default=str)
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
@@ -30,8 +30,8 @@ from scripts.research.sealed_holdout_rerun import (
|
||||
OFFSETS = (-30, -20, -15, -10, -8, -5, -3, 0, 3, 5, 8, 10, 15, 20, 30)
|
||||
RADII = (15, 30, 60)
|
||||
MINUTE_STEP = 1
|
||||
FREEZE = ROOT / "docs/research/reported_offset_midnight_anchor_2026_09_21.freeze.json"
|
||||
REPORT = ROOT / "docs/research/reported_offset_midnight_anchor_2026_09_21.json"
|
||||
FREEZE = ROOT / "docs/research/reported_offset_quality_wording_2026_09_29.freeze.json"
|
||||
REPORT = ROOT / "docs/research/reported_offset_quality_wording_2026_09_29.json"
|
||||
LEGACY_REPORT = ROOT / "docs/research/reported_offset_2026_09_20.json"
|
||||
|
||||
|
||||
|
||||
@@ -27,8 +27,8 @@ from scripts.minute_rectification_feature_facts_v4 import build_feature_fact_row
|
||||
from scripts.minute_rectification_holdout_validator import validate
|
||||
|
||||
DATASET = ROOT / "references/real_case_calibration/minute_rectification_holdout_v3.json"
|
||||
FREEZE = ROOT / "docs/research/sealed_holdout_rerun_midnight_anchor_2026_09_21.freeze.json"
|
||||
REPORT = ROOT / "docs/research/sealed_holdout_rerun_midnight_anchor_2026_09_21.json"
|
||||
FREEZE = ROOT / "docs/research/sealed_holdout_rerun_quality_wording_2026_09_29.freeze.json"
|
||||
REPORT = ROOT / "docs/research/sealed_holdout_rerun_quality_wording_2026_09_29.json"
|
||||
LEGACY_REPORT = ROOT / "docs/research/sealed_holdout_rerun_2026_09_20.json"
|
||||
ARCHIVE = ROOT / "docs/research/history/rectification_pre_cross_midnight_2026_09_20"
|
||||
PRODUCTION_FILES = [
|
||||
|
||||
@@ -1185,3 +1185,48 @@ class DomainAliasTests(unittest.TestCase):
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
|
||||
class QualityWordingTests(unittest.TestCase):
|
||||
"""BUG-1088: the education quality question names the event by kind and
|
||||
never invents a month for a year-precision event."""
|
||||
|
||||
def _meaning(self, kind: str, date: str, precision: str) -> tuple[str, str]:
|
||||
event = {
|
||||
**_education_event("00000000-0000-4000-8000-000000001088", kind, date, "fictional"),
|
||||
"precision": precision,
|
||||
}
|
||||
rows = _quality_rows(event)
|
||||
self.assertEqual(len(rows), 1)
|
||||
return rows[0]["user_meaning"], rows[0]["display_date_label"]
|
||||
|
||||
def test_education_kinds_are_not_all_called_university(self) -> None:
|
||||
for kind, name in (
|
||||
("education_start", "那次升学"),
|
||||
("education_change", "那次学业变动"),
|
||||
("education_interruption", "那次学业中断"),
|
||||
):
|
||||
with self.subTest(kind=kind):
|
||||
meaning, _label = self._meaning(kind, "2011-03-01", "month")
|
||||
self.assertIn(name, meaning)
|
||||
self.assertNotIn("上大学", meaning)
|
||||
|
||||
def test_year_precision_event_has_no_month_in_label(self) -> None:
|
||||
meaning, label = self._meaning("education_start", "2011-01-01", "year")
|
||||
self.assertEqual(label, "2011 年")
|
||||
self.assertTrue(meaning.startswith("2011 年那次升学"))
|
||||
self.assertNotIn("1 月", meaning)
|
||||
|
||||
def test_month_precision_event_keeps_month(self) -> None:
|
||||
meaning, label = self._meaning("education_change", "2012-09-01", "month")
|
||||
self.assertEqual(label, "2012 年 9 月")
|
||||
self.assertTrue(meaning.startswith("2012 年 9 月那次学业变动"))
|
||||
|
||||
def test_year_precision_keeps_split_hash_month_for_scoring_identity(self) -> None:
|
||||
# Only the wording changes; the split hash still carries the stored month so
|
||||
# probe identity (and every frozen score) is unchanged.
|
||||
rows = _quality_rows({
|
||||
**_education_event("00000000-0000-4000-8000-000000001089", "education_start", "2011-01-01", "fictional"),
|
||||
"precision": "year",
|
||||
})
|
||||
self.assertEqual(rows[0]["month"], 1)
|
||||
|
||||
@@ -23,6 +23,8 @@ IDENTITY_FORBIDDEN_PREFIXES = (
|
||||
"references/rectification_sealed_holdout.v1.json",
|
||||
"docs/research/sealed_holdout_rerun_midnight_anchor_2026_09_21",
|
||||
"docs/research/reported_offset_midnight_anchor_2026_09_21",
|
||||
"docs/research/sealed_holdout_rerun_quality_wording_2026_09_29",
|
||||
"docs/research/reported_offset_quality_wording_2026_09_29",
|
||||
"docs/research/history/",
|
||||
"artifacts/",
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user