From 6b331a356e53dd8f62e717dddd94031b8da018c3 Mon Sep 17 00:00:00 2001 From: 732642856 <732642856@qq.com> Date: Thu, 2 Jul 2026 18:56:48 +0800 Subject: [PATCH] Add extraction review governance manifest --- ...racter_level_external_manifest_latest.json | 2 +- ...haracter_level_external_manifest_latest.md | 2 +- ...aracter_level_extraction_queue_latest.json | 2 +- ...character_level_extraction_queue_latest.md | 2 +- ...acter_level_extraction_results_latest.json | 2 +- ...aracter_level_extraction_results_latest.md | 2 +- ...racter_level_extraction_review_latest.json | 1019 +++++++++++++++++ ...haracter_level_extraction_review_latest.md | 21 + ...acter_level_inventory_manifest_latest.json | 68 +- ...aracter_level_inventory_manifest_latest.md | 10 +- progress.md | 7 + scripts/character_level_inventory_manifest.py | 107 +- ...test_character_level_inventory_manifest.py | 32 + 13 files changed, 1244 insertions(+), 32 deletions(-) create mode 100644 docs/research/character_level_extraction_review_latest.json create mode 100644 docs/research/character_level_extraction_review_latest.md diff --git a/docs/research/character_level_external_manifest_latest.json b/docs/research/character_level_external_manifest_latest.json index daf9ce74..966319a9 100644 --- a/docs/research/character_level_external_manifest_latest.json +++ b/docs/research/character_level_external_manifest_latest.json @@ -1,7 +1,7 @@ { "scope": "external", "status": "pass", - "generated_at": "2026-07-02T10:44:46.651144+00:00", + "generated_at": "2026-07-02T10:53:23.492131+00:00", "mode": { "heavy_ocr": false, "whole_machine_scan": false, diff --git a/docs/research/character_level_external_manifest_latest.md b/docs/research/character_level_external_manifest_latest.md index 58c1c12f..9756f276 100644 --- a/docs/research/character_level_external_manifest_latest.md +++ b/docs/research/character_level_external_manifest_latest.md @@ -2,7 +2,7 @@ - status: pass - scope: external -- generated_at: 2026-07-02T10:44:46.651144+00:00 +- generated_at: 2026-07-02T10:53:23.492131+00:00 - total_files: 883 - unhashed_files: 0 - unclassified_files: 0 diff --git a/docs/research/character_level_extraction_queue_latest.json b/docs/research/character_level_extraction_queue_latest.json index 095c16a8..5a9b31cd 100644 --- a/docs/research/character_level_extraction_queue_latest.json +++ b/docs/research/character_level_extraction_queue_latest.json @@ -1,7 +1,7 @@ { "scope": "extraction-queue", "status": "pass", - "generated_at": "2026-07-02T10:45:03.271522+00:00", + "generated_at": "2026-07-02T10:53:47.897123+00:00", "mode": { "heavy_ocr": false, "whole_machine_scan": false, diff --git a/docs/research/character_level_extraction_queue_latest.md b/docs/research/character_level_extraction_queue_latest.md index e21b0664..497ae330 100644 --- a/docs/research/character_level_extraction_queue_latest.md +++ b/docs/research/character_level_extraction_queue_latest.md @@ -2,7 +2,7 @@ - status: pass - scope: extraction-queue -- generated_at: 2026-07-02T10:45:03.271522+00:00 +- generated_at: 2026-07-02T10:53:47.897123+00:00 - queued_files: 66 - unhashed_files: 0 - Heavy OCR: disabled diff --git a/docs/research/character_level_extraction_results_latest.json b/docs/research/character_level_extraction_results_latest.json index 633aa127..5b7be31c 100644 --- a/docs/research/character_level_extraction_results_latest.json +++ b/docs/research/character_level_extraction_results_latest.json @@ -1,7 +1,7 @@ { "scope": "extraction-results", "status": "pass", - "generated_at": "2026-07-02T10:45:41.296864+00:00", + "generated_at": "2026-07-02T10:55:01.179960+00:00", "mode": { "heavy_ocr": false, "macos_vision_available": true, diff --git a/docs/research/character_level_extraction_results_latest.md b/docs/research/character_level_extraction_results_latest.md index 0e8a8c2a..3c0de20a 100644 --- a/docs/research/character_level_extraction_results_latest.md +++ b/docs/research/character_level_extraction_results_latest.md @@ -2,7 +2,7 @@ - status: pass - scope: extraction-results -- generated_at: 2026-07-02T10:45:41.296864+00:00 +- generated_at: 2026-07-02T10:55:01.179960+00:00 - total_files: 66 - unhashed_files: 0 - stored_text_payload_fields: 0 diff --git a/docs/research/character_level_extraction_review_latest.json b/docs/research/character_level_extraction_review_latest.json new file mode 100644 index 00000000..d1826929 --- /dev/null +++ b/docs/research/character_level_extraction_review_latest.json @@ -0,0 +1,1019 @@ +{ + "scope": "extraction-review", + "status": "pass", + "generated_at": "2026-07-02T10:56:07.354583+00:00", + "mode": { + "whole_machine_scan": false, + "semantic_promotion": false, + "runtime_truth_promotion": false, + "boundary": "Review decisions are governance labels only. No extracted source is promoted to runtime truth here." + }, + "summary": { + "reviewed_files": 66, + "runtime_promotions": 0, + "stored_text_payload_fields": 0 + }, + "decision_counts": { + "asset_or_empty_reference_only": 17, + "private_reference_only": 3, + "promote_review_candidate": 38, + "reference_only": 8 + }, + "reviews": [ + { + "path": "/Users/wuyongnaren/Desktop/一楠印度占星 Level 3 综合解盘.docx", + "source_scope": "external", + "suffix": ".docx", + "byte_count": 19165, + "sha256": "cee1d2837d7e1d396fe3b6ba06012e16e0dad3d2d68554e5116d25789170b64b", + "extraction_result": "text_extracted", + "extraction_method": "docx", + "extracted_character_count": 6369, + "text_sha256": "1f03273efddcafd345cdfe542a118d5eacee5da554bded430dbfe4cb3b6e8571", + "post_extraction_classification": "extracted_private_reference_only", + "decision": "private_reference_only", + "decision_reason": "Private or historical personal report; do not promote into runtime truth.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/Desktop/印度占星修正版研究结论v3-高压基建后的反转兑现模型.docx", + "source_scope": "external", + "suffix": ".docx", + "byte_count": 21966, + "sha256": "b8d1b8c9bae94d7b1102db321543ef34cf4d4b5d7b822c3365e059903be40fb4", + "extraction_result": "text_extracted", + "extraction_method": "docx", + "extracted_character_count": 7753, + "text_sha256": "dafb672b74f9aa3b05ecaa5118ae5a72f612f96750640d2396e1c654dcb29dfb", + "post_extraction_classification": "extracted_private_reference_only", + "decision": "private_reference_only", + "decision_reason": "Private or historical personal report; do not promote into runtime truth.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/Downloads/jyotish_training.agent.final.docx", + "source_scope": "external", + "suffix": ".docx", + "byte_count": 186879, + "sha256": "a0d83aa8a70f9966cbe79945c4416906e1382c9093998c23d73bd395b02f23fe", + "extraction_result": "text_extracted", + "extraction_method": "docx", + "extracted_character_count": 145078, + "text_sha256": "9607ceaafa8a38abd5943037b7a66113db4fee6abb6d77a246924c7770242049", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/WorkBuddy/2026-06-09-20-03-34/jyotish-fragments/training/jyotish_training.agent.final.docx", + "source_scope": "external", + "suffix": ".docx", + "byte_count": 186879, + "sha256": "a0d83aa8a70f9966cbe79945c4416906e1382c9093998c23d73bd395b02f23fe", + "extraction_result": "text_extracted", + "extraction_method": "docx", + "extracted_character_count": 145078, + "text_sha256": "9607ceaafa8a38abd5943037b7a66113db4fee6abb6d77a246924c7770242049", + "post_extraction_classification": "extracted_private_reference_only", + "decision": "private_reference_only", + "decision_reason": "Private or historical personal report; do not promote into runtime truth.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/1印度占星.docx", + "source_scope": "external", + "suffix": ".docx", + "byte_count": 6142110, + "sha256": "210a09d764f8fe17ded6c908d5073648908892a99ae853f983e6f516ccc0164d", + "extraction_result": "text_extracted", + "extraction_method": "docx", + "extracted_character_count": 30716, + "text_sha256": "9d02544ecab01e9dad012ec53336f0404ba316896e3ae5fd8efa7b2e7271330f", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/2印度占星.docx", + "source_scope": "external", + "suffix": ".docx", + "byte_count": 3031411, + "sha256": "16979422e7621475243e2739fda00767d1a9dc367f7f10153fe36d8af6e15c6d", + "extraction_result": "text_extracted", + "extraction_method": "docx", + "extracted_character_count": 17967, + "text_sha256": "91cfc9364387007753bce62360ee7d546aa6357935775a32dc867f2d3bf09dde", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/3印度占星.docx", + "source_scope": "external", + "suffix": ".docx", + "byte_count": 2149772, + "sha256": "59ee274246547f4afb581ec26f5a4aad03ba2095309d66c40a60a51d1244df92", + "extraction_result": "text_extracted", + "extraction_method": "docx", + "extracted_character_count": 29017, + "text_sha256": "47c4c9cfcfdc2bbd024d845c1c95eec9546d1d8c462fb25626e6b449d957d3cc", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/4印度占星.docx", + "source_scope": "external", + "suffix": ".docx", + "byte_count": 5572637, + "sha256": "e789430dc1df6ab7054a5b28f0665da325e7c5eb2e6daac39f1f17ac29ba7629", + "extraction_result": "text_extracted", + "extraction_method": "docx", + "extracted_character_count": 19643, + "text_sha256": "f496ed4e54897fed05b7a5e4905787c36baf3008214d90336b6a1d4f2406940d", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/Tajika占星术是印度占星术体系之一.docx", + "source_scope": "external", + "suffix": ".docx", + "byte_count": 1338151, + "sha256": "254624594c26fc80ad5bfa9e9a880ac0cd81c9388b19721d5767dfa5c55e953c", + "extraction_result": "text_extracted", + "extraction_method": "docx", + "extracted_character_count": 23606, + "text_sha256": "2f8b217e08b5c20afdfb328851bf5c719cd1ab98f2572d413ab359e6f16cef6f", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/印度占星Jaimini系统的Darakaraka的理解和说明如何解释.docx", + "source_scope": "external", + "suffix": ".docx", + "byte_count": 44926, + "sha256": "f2db03d1c0392e2cdad66da9a731117c0ddf290cad7712b9c3de0d8234a17a29", + "extraction_result": "text_extracted", + "extraction_method": "docx", + "extracted_character_count": 20085, + "text_sha256": "72bba68ca08007492181c01936290315500e052a21fc03562c03605eb0204048", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/高地位配偶与婚后命运积极转变的占星规则与组合.docx", + "source_scope": "external", + "suffix": ".docx", + "byte_count": 1120887, + "sha256": "9cdd6996670ad46063c9582957c6d98269e069f96801ff340ce0c84de325d412", + "extraction_result": "text_extracted", + "extraction_method": "docx", + "extracted_character_count": 4507, + "text_sha256": "1e620fb59e95ae4fe59b1181bc9fe34238115e1f138d1433f2e1b66c10051ed6", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/.workbuddy/skills/jyotish-vedic-astrology/assets/jyotish-logo.png", + "source_scope": "external", + "suffix": ".png", + "byte_count": 1496430, + "sha256": "4cb571aa402da3a730a73b6594ec88adf90f2d807018e23f96fd1bee426c23ed", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 6, + "text_sha256": "6268f153a2dbec6a0294a2164eed3f4b3f38deb549fd55c856531a742f154d37", + "post_extraction_classification": "extracted_reference_only", + "decision": "reference_only", + "decision_reason": "Useful as context or asset evidence, not direct runtime truth.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/.workbuddy/skills/jyotish-vedic-astrology/references/open_source_sources/VedicAstro/VedicAstroLogo.png", + "source_scope": "external", + "suffix": ".png", + "byte_count": 151345, + "sha256": "e64022e2dde10d7ce378a69f8b7f035b084d56517f37eb8f6ecc4bd47fe0fe2a", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 11, + "text_sha256": "15932d34d0d39cfb45324e59f76a8a7e6ed0751971570166f5402361885e83b8", + "post_extraction_classification": "extracted_reference_only", + "decision": "reference_only", + "decision_reason": "Useful as context or asset evidence, not direct runtime truth.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/.workbuddy/skills/jyotish-vedic-astrology/references/open_source_sources/vedic-astro-skills/assets/alipay.jpg", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 164821, + "sha256": "f7d4dcf08239c738d5cd45d531401bdef92e4c1b7ea93965b7a7f51ab76dc8fc", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 30, + "text_sha256": "418fec26dc90172b495527a16d9054bd75ea188a64d568ffab959fb6223d0864", + "post_extraction_classification": "extracted_reference_only", + "decision": "reference_only", + "decision_reason": "Useful as context or asset evidence, not direct runtime truth.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/.workbuddy/skills/jyotish-vedic-astrology/references/open_source_sources/vedic-astro-skills/assets/wechat.jpg", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 71804, + "sha256": "e94c027499059e7fb2170474fb03e3be875b4251dfbea5fc7f39b370d6242a62", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 24, + "text_sha256": "cabb393532f5e24293c5fd0a59f0b423a2da2d7d6a261651e69032d45fac3d6f", + "post_extraction_classification": "extracted_reference_only", + "decision": "reference_only", + "decision_reason": "Useful as context or asset evidence, not direct runtime truth.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/Desktop/电脑相册/重复图片移动前备份清单_2026-05-20/file_backups/WorkBuddy/yinduzhanxing/assets/jyotish-logo.png", + "source_scope": "external", + "suffix": ".png", + "byte_count": 1496430, + "sha256": "4cb571aa402da3a730a73b6594ec88adf90f2d807018e23f96fd1bee426c23ed", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 6, + "text_sha256": "6268f153a2dbec6a0294a2164eed3f4b3f38deb549fd55c856531a742f154d37", + "post_extraction_classification": "extracted_reference_only", + "decision": "reference_only", + "decision_reason": "Useful as context or asset evidence, not direct runtime truth.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/Downloads/印度占星11页/IMG_3004.jpg", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 335978, + "sha256": "3e87432635d0b7d6181a5d251191ab397352bfc0908bedef4d07b135aa351012", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 2396, + "text_sha256": "022d397c72b950fe3780952b52004c166cb731fc04edc7530ac6cb2d84951097", + "post_extraction_classification": "extracted_reference_only", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/Downloads/印度占星11页/IMG_3005.jpg", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 365592, + "sha256": "3743a89d6611dd8a3a344db2e9ca6877b6f1f610b48bd3cbb9486eb8a81f4195", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 2931, + "text_sha256": "468967a7cfdce5a6b0dc23e534ceae4776a6f9f415a9fcaa4a5bc34a4fb982cb", + "post_extraction_classification": "extracted_reference_only", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/Downloads/印度占星11页/IMG_3006.jpg", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 387356, + "sha256": "03689b8775950267002cbbf9b96bf5038217c692c311188429ee99903beea285", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 3635, + "text_sha256": "ae6ded6ec4433f6a75e29c91d551fa3033b381be765d22d97915b7bfc4e0cf0c", + "post_extraction_classification": "extracted_reference_only", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/Downloads/印度占星11页/IMG_3007.jpg", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 457489, + "sha256": "d959e3b1625ec6d7d0a3129f8fd856f18b06de2d4b874bbc3322e1c9818b5aa3", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 4205, + "text_sha256": "6e148836e7847c3a71e90536fbe52b3795fe2867a5d07dffc3a368d1aec0b92c", + "post_extraction_classification": "extracted_reference_only", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/Downloads/印度占星11页/IMG_3008.jpg", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 447919, + "sha256": "8999a66852d45b5e89b53823bff4aecb5b3fca935495572ee3422c1a067d2507", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 4203, + "text_sha256": "a76ecdaa8dd9b852186a157d7b7fd4c5fb7ddce598b7272a37df634762a32408", + "post_extraction_classification": "extracted_reference_only", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/Downloads/印度占星11页/IMG_3009.jpg", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 436786, + "sha256": "e4a1eaa1730a22d96e4032bf405e0ed556395a0d9a27a2c5ec7265b8a3c3fdf8", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 4155, + "text_sha256": "1a504051cf1d6573679d32968c51c84a767457e722cd42f60a942cde455e27c3", + "post_extraction_classification": "extracted_reference_only", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/Downloads/印度占星11页/IMG_3010.jpg", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 352127, + "sha256": "b6478c3db82ad67534fae2bcd52e29da9bb1ffa573271097e8449cfbf1be5537", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 3514, + "text_sha256": "3e9f59c189e98d9fb07bba1524b7eea209fbf7cb3a7f5f83f66d5b80f660919f", + "post_extraction_classification": "extracted_reference_only", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/Downloads/印度占星11页/IMG_3011.jpg", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 347111, + "sha256": "0d786f1284ff916f37055c77101559955e83eecba24b290eb80ab808e7a90ce4", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 3080, + "text_sha256": "848194fea9a0f4b8e05121f5b07261a12fa04351c76cb8cd6740b596050f60d0", + "post_extraction_classification": "extracted_reference_only", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/Downloads/印度占星11页/IMG_3012.jpg", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 282794, + "sha256": "319b2ab6948d82e04eaf957caf5310c85f9c42db66f2c39f8e27bcca7528487a", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 359, + "text_sha256": "b90601cd0134a26f07f4cde1773aa6c6ec06a2285ae4ba6f9eba2dcb43ef5c05", + "post_extraction_classification": "extracted_reference_only", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/Downloads/印度占星11页/IMG_3013.jpg", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 296069, + "sha256": "2253eebdc5a3f7b26400cffd3b0de32b33b29896783406b85a537957059c3115", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 369, + "text_sha256": "ec1f69ff40ea201baffcddb64a1c6ec6a8a4bd5179bf4cb74023b55710d69ee0", + "post_extraction_classification": "extracted_reference_only", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/Downloads/印度占星11页/IMG_3014.jpg", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 288473, + "sha256": "5d7e8abcd4cdb922d0da0fa987fd4264b57339230586b38570a360f2b1f6f1cd", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 340, + "text_sha256": "324e69607b771ee1d20509fdf33ed7f144593495e48f16ac62f9224b44e84eb0", + "post_extraction_classification": "extracted_reference_only", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/占星印度1/IMG_3223.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 6709612, + "sha256": "8a2f44bc4c57b8d352371101a662305b88d4f834d385c22a6f0b308c66119890", + "extraction_result": "text_empty", + "extraction_method": "macos_vision", + "extracted_character_count": 0, + "text_sha256": null, + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "asset_or_empty_reference_only", + "decision_reason": "OCR/extraction produced empty text; keep as indexed asset only.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/占星印度1/IMG_3224.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 4388817, + "sha256": "30b7f2ea6bcc962ccb3064f3656e7d298a5469e084d1fdf21322bc5ea3b21d90", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 30, + "text_sha256": "cc8b8423797e8914515dba9684ebfeba17a8fa329071b6ca4099276aac0a49b8", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/占星印度1/IMG_3225.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 3539980, + "sha256": "4edcfa12004b48047dbff7f5512914aedd40768b37dc75ad45c467c05802ab25", + "extraction_result": "text_empty", + "extraction_method": "macos_vision", + "extracted_character_count": 0, + "text_sha256": null, + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "asset_or_empty_reference_only", + "decision_reason": "OCR/extraction produced empty text; keep as indexed asset only.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/占星印度1/IMG_3226.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 3118339, + "sha256": "820f1c29b11e09ed51681be292adf15919ca3d5157b23fb29d098023f4423c52", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 398, + "text_sha256": "f91d33b01facb8e7a6adf9d924f5dfa216a04ff6e883526e4278ccc58b17ea11", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/占星印度1/IMG_3227.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 6945195, + "sha256": "c6643554be26edc62274f8b4e0acd1cf305aaeff8c1720cb5b731e0842fada46", + "extraction_result": "text_empty", + "extraction_method": "macos_vision", + "extracted_character_count": 0, + "text_sha256": null, + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "asset_or_empty_reference_only", + "decision_reason": "OCR/extraction produced empty text; keep as indexed asset only.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/占星印度1/IMG_3228.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 2188130, + "sha256": "d118ce2ed91a3a3b3551833f20cca6604011d22ff921976d50e5cd21d08db3e7", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 1197, + "text_sha256": "d64970b2ccc7be0c33de8e48e465193a62b32a0f231299c1c035f84fa22672df", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/占星印度1/IMG_3229.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 1390060, + "sha256": "630e6f8f91bfda5fcb3871c30758dec2db32108b89ec511d25aebea7313f0cfe", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 1080, + "text_sha256": "5519193313ca62697b8a23a0f1296b66550a0341aa70c4e18305995e23389d52", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/占星印度1/IMG_3230.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 2723452, + "sha256": "be3a1ddb38f42961273827537ce8a8c73dd2c5ad5e1effd90c49bcf623b196c2", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 536, + "text_sha256": "bb1d2bfb683260c25402d34a639025894a223fa5a33b80c30a1ef0f16df85067", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/占星印度1/IMG_3231.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 3460758, + "sha256": "279b99af4faa614eb21ef8d2a2bc67bf87a4cce112ba04627bca67f2f343297b", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 2, + "text_sha256": "b26e110e558e62dc69d16888f8c6914fb96fccc843ebf0d30000cd8784728fc0", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/占星印度1/IMG_3232.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 3256088, + "sha256": "a46fb026076a3314ef9f263a7234659c7d2b75068aba20271d07d0f7a3b674b1", + "extraction_result": "text_empty", + "extraction_method": "macos_vision", + "extracted_character_count": 0, + "text_sha256": null, + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "asset_or_empty_reference_only", + "decision_reason": "OCR/extraction produced empty text; keep as indexed asset only.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/印度占星查悦/IMG_3233.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 5620475, + "sha256": "c3ed9e4d29163d9baa0f8b95669cfcbb52f20727ce23f105c5fc8c688cbd5fb6", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 11, + "text_sha256": "44899d783bdaad21e5a47d01ec9e73e3410703cfb0f68a6171ef7a0bc1f8d732", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/印度占星查悦/IMG_3234.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 4739555, + "sha256": "1833b90c725ae183f3acf28bc7738858f7750e4dff67bd7157a70fb168c3301a", + "extraction_result": "text_empty", + "extraction_method": "macos_vision", + "extracted_character_count": 0, + "text_sha256": null, + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "asset_or_empty_reference_only", + "decision_reason": "OCR/extraction produced empty text; keep as indexed asset only.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/印度占星查悦/IMG_3235.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 5869585, + "sha256": "13a85b875309b89a47cfe13e52998cf85b1e5da09cc0905ac967877bb0f00091", + "extraction_result": "text_empty", + "extraction_method": "macos_vision", + "extracted_character_count": 0, + "text_sha256": null, + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "asset_or_empty_reference_only", + "decision_reason": "OCR/extraction produced empty text; keep as indexed asset only.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/印度占星查悦/IMG_3236.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 8733982, + "sha256": "6cd213236d66c235c8fe54722411375144e988029ef959a9e051f186399bbbc6", + "extraction_result": "text_empty", + "extraction_method": "macos_vision", + "extracted_character_count": 0, + "text_sha256": null, + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "asset_or_empty_reference_only", + "decision_reason": "OCR/extraction produced empty text; keep as indexed asset only.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/印度占星查悦/IMG_3237.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 5434137, + "sha256": "8a3eda7d1936530abb1ed5c93040b316bd013f02155d2b20eb9626bd84e7480e", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 14, + "text_sha256": "cc9443af4ef850050043353a95499938590b234a85125c0c2ad99103d2d7c06f", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/印度占星查悦/IMG_3238.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 5918325, + "sha256": "c29063134357d4c7cb081d14c35c5558a47685913eff21be4a229703edd7256b", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 7, + "text_sha256": "c6b24a111d9fb03d1bf0d55030b0d9edfb65708e4feb8dc80892eca0a6a54f1d", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/印度占星查悦/IMG_3239.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 5110208, + "sha256": "6633e0045710c1f6defda6624ec7c8ccf1c22dcb3bc34bf41bba7f48153a3255", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 14, + "text_sha256": "08c157171909ced95edefb310fe369f66f04a1db897affcaa6945e3df3a3bf7e", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/印度占星查悦/IMG_3240.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 4155054, + "sha256": "5003bc196b649a9ee6f2cf1583ca55f13cc695030571184c5bf6db429775a5a6", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 160, + "text_sha256": "193c01df41388ffd21c3c99c27c0f458af4537584fbb71253c8dcfd82c09cb2c", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/印度占星查悦/IMG_3241.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 1262218, + "sha256": "4ffe9f3aadd4485ba99382a84d54abb02ae2520d8b0f57147fa7438408ce39d4", + "extraction_result": "text_empty", + "extraction_method": "macos_vision", + "extracted_character_count": 0, + "text_sha256": null, + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "asset_or_empty_reference_only", + "decision_reason": "OCR/extraction produced empty text; keep as indexed asset only.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/印度占星查悦/IMG_3242.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 1867271, + "sha256": "a15fadbbd4a250a30bac8e27915210b67fa6dc2ceb482b6a3792a0acba87bd77", + "extraction_result": "text_empty", + "extraction_method": "macos_vision", + "extracted_character_count": 0, + "text_sha256": null, + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "asset_or_empty_reference_only", + "decision_reason": "OCR/extraction produced empty text; keep as indexed asset only.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/印度占星查悦/IMG_3243.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 6305912, + "sha256": "64bd2a3a548a2c94372c1e3312e9f87bd291a276e73a3918fcc903e41f0fea9f", + "extraction_result": "text_empty", + "extraction_method": "macos_vision", + "extracted_character_count": 0, + "text_sha256": null, + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "asset_or_empty_reference_only", + "decision_reason": "OCR/extraction produced empty text; keep as indexed asset only.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/印度占星查悦/IMG_3244.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 7177473, + "sha256": "e7a486925218295da284ca6ca167ae92f2a37285e26ea5161094f531cd12ebd4", + "extraction_result": "text_empty", + "extraction_method": "macos_vision", + "extracted_character_count": 0, + "text_sha256": null, + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "asset_or_empty_reference_only", + "decision_reason": "OCR/extraction produced empty text; keep as indexed asset only.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/印度占星查悦/IMG_3245.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 6429277, + "sha256": "c5fd2b815ca6d295b8de5402084a9a7cdd3f9d2f08e53c50abd45b1352eb8b06", + "extraction_result": "text_empty", + "extraction_method": "macos_vision", + "extracted_character_count": 0, + "text_sha256": null, + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "asset_or_empty_reference_only", + "decision_reason": "OCR/extraction produced empty text; keep as indexed asset only.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/印度占星查悦/IMG_3246.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 92516, + "sha256": "355ae43a243fcdea344500b1b3f53a47683050cd73b01428fa9490844d04e222", + "extraction_result": "text_empty", + "extraction_method": "macos_vision", + "extracted_character_count": 0, + "text_sha256": null, + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "asset_or_empty_reference_only", + "decision_reason": "OCR/extraction produced empty text; keep as indexed asset only.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/印度占星查悦/IMG_3247.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 7406196, + "sha256": "0bc4a95e8d9ad41e6df47cd80a7cf84b2df24cb5400b9de56d63d3be66818e7f", + "extraction_result": "text_empty", + "extraction_method": "macos_vision", + "extracted_character_count": 0, + "text_sha256": null, + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "asset_or_empty_reference_only", + "decision_reason": "OCR/extraction produced empty text; keep as indexed asset only.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/印度占星查悦/IMG_3248.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 3862462, + "sha256": "a3b3f89232cece9d3475cd48a3fff7878a62233743927fa2492b2bb646dfefa3", + "extraction_result": "text_empty", + "extraction_method": "macos_vision", + "extracted_character_count": 0, + "text_sha256": null, + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "asset_or_empty_reference_only", + "decision_reason": "OCR/extraction produced empty text; keep as indexed asset only.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/印度占星查悦/IMG_3249.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 7780975, + "sha256": "8ae9bd3960a150e88feb78813d245c73aa2e6473ff16182a61632241f9f50014", + "extraction_result": "text_empty", + "extraction_method": "macos_vision", + "extracted_character_count": 0, + "text_sha256": null, + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "asset_or_empty_reference_only", + "decision_reason": "OCR/extraction produced empty text; keep as indexed asset only.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/印度占星查悦/IMG_3250.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 7389728, + "sha256": "6c895f9ddd16c2a1edf785858203cbec1a86c1abb3c6b24e03d24e74d1ea175d", + "extraction_result": "text_empty", + "extraction_method": "macos_vision", + "extracted_character_count": 0, + "text_sha256": null, + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "asset_or_empty_reference_only", + "decision_reason": "OCR/extraction produced empty text; keep as indexed asset only.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/受孕/IMG_3216.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 1441554, + "sha256": "3cdbdd47967592f2581b820b9df49aecd7117b377c45c71571b440cce3f5dddd", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 766, + "text_sha256": "4ff4d9180c050ef0ee7befcf09851a4c86f77ed6a3ff562935e70dec20545d79", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/受孕/IMG_3218.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 1968582, + "sha256": "58d9de5cd5399e74e007d7d50f093dc50d7d0688df484a26646787a07a0c7e92", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 763, + "text_sha256": "433d35e43ad0d4e5c94144e4e5360e775d884b31a04a48567bd031d4af67c71a", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/受孕/IMG_3219.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 2710815, + "sha256": "47bedfc7e2fdc225305afc31cc4ab74bd0021bd65e61b9d85e1b0909aa5950b6", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 442, + "text_sha256": "2e79a0ceadfecd2a99f1c04ced05a9795dba285d789eb93cf30d682bcb887a91", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/受孕/IMG_3220.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 741635, + "sha256": "771256b16a47d9db785abbeab01b11388900e7e98d45220ff0defb52f24e7b1b", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 1297, + "text_sha256": "1ad3fce3afb8290f54caaa668462a9f6f2d197b98069cc0a03f7a63975dcacc5", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/受孕/IMG_3221.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 1275215, + "sha256": "b219ca2e664ddff55ef95681aeaf5362c3a1589b2bef562129e39e8960e0202e", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 482, + "text_sha256": "9e95083cfc45527ebf8f9e120d4b94f59951d71a224162e8f6772b65f7f21c6b", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/文件仓库/印度占星文章/受孕/IMG_3222.JPG", + "source_scope": "external", + "suffix": ".jpg", + "byte_count": 1340781, + "sha256": "a7601e255c4d398d2480dc71fb99916aa67c56f978a722943970806f805bde26", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 714, + "text_sha256": "f127c3f663c2ebaf5ca1dc069c3e0ceb0f10398be496407b1aa3b68d1e465268", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "references/open_source_sources/VedicAstro/VedicAstroLogo.png", + "source_scope": "project", + "suffix": ".png", + "byte_count": 151345, + "sha256": "e64022e2dde10d7ce378a69f8b7f035b084d56517f37eb8f6ecc4bd47fe0fe2a", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 11, + "text_sha256": "15932d34d0d39cfb45324e59f76a8a7e6ed0751971570166f5402361885e83b8", + "post_extraction_classification": "extracted_reference_only", + "decision": "reference_only", + "decision_reason": "Useful as context or asset evidence, not direct runtime truth.", + "runtime_truth_allowed": false + }, + { + "path": "references/open_source_sources/vedic-astro-skills/assets/alipay.jpg", + "source_scope": "project", + "suffix": ".jpg", + "byte_count": 164821, + "sha256": "f7d4dcf08239c738d5cd45d531401bdef92e4c1b7ea93965b7a7f51ab76dc8fc", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 30, + "text_sha256": "418fec26dc90172b495527a16d9054bd75ea188a64d568ffab959fb6223d0864", + "post_extraction_classification": "extracted_reference_only", + "decision": "reference_only", + "decision_reason": "Useful as context or asset evidence, not direct runtime truth.", + "runtime_truth_allowed": false + }, + { + "path": "references/open_source_sources/vedic-astro-skills/assets/wechat.jpg", + "source_scope": "project", + "suffix": ".jpg", + "byte_count": 71804, + "sha256": "e94c027499059e7fb2170474fb03e3be875b4251dfbea5fc7f39b370d6242a62", + "extraction_result": "text_extracted", + "extraction_method": "macos_vision", + "extracted_character_count": 24, + "text_sha256": "cabb393532f5e24293c5fd0a59f0b423a2da2d7d6a261651e69032d45fac3d6f", + "post_extraction_classification": "extracted_reference_only", + "decision": "reference_only", + "decision_reason": "Useful as context or asset evidence, not direct runtime truth.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/Downloads/印度占星.pdf", + "source_scope": "external", + "suffix": ".pdf", + "byte_count": 135905, + "sha256": "121507cf1d0d66711bc30c18f589f36f2d3cce797ecb13cdf4427625e6ec8894", + "extraction_result": "text_extracted", + "extraction_method": "pdfplumber", + "extracted_character_count": 31164, + "text_sha256": "e63b112988500a71704511d007c52cffdc71c300e518c438eb7f0cb71d732ede", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + }, + { + "path": "/Users/wuyongnaren/Downloads/印度占星1.pdf", + "source_scope": "external", + "suffix": ".pdf", + "byte_count": 132486, + "sha256": "92c9288c5d0011a869c545e3459f037ff09cd20f7508543bc0eb11b03079d930", + "extraction_result": "text_extracted", + "extraction_method": "pdfplumber", + "extracted_character_count": 31321, + "text_sha256": "d93283239c33fab588747a9354a162049b263d18bd06463bbb7b02634704a1be", + "post_extraction_classification": "extracted_candidate_for_review", + "decision": "promote_review_candidate", + "decision_reason": "Extracted source-like material; requires human source grading before promotion.", + "runtime_truth_allowed": false + } + ], + "artifacts": { + "json_report": "docs/research/character_level_extraction_review_latest.json", + "markdown_report": "docs/research/character_level_extraction_review_latest.md" + }, + "title": "Extraction Review Manifest" +} \ No newline at end of file diff --git a/docs/research/character_level_extraction_review_latest.md b/docs/research/character_level_extraction_review_latest.md new file mode 100644 index 00000000..d5c8fc32 --- /dev/null +++ b/docs/research/character_level_extraction_review_latest.md @@ -0,0 +1,21 @@ +# Extraction Review Manifest + +- status: pass +- scope: extraction-review +- generated_at: 2026-07-02T10:56:07.354583+00:00 +- reviewed_files: 66 +- runtime_promotions: 0 +- stored_text_payload_fields: 0 + +## Decision Counts + +- `asset_or_empty_reference_only`: 17 +- `private_reference_only`: 3 +- `promote_review_candidate`: 38 +- `reference_only`: 8 + +## Boundary + +Review decisions are governance labels only. No extracted source is promoted to runtime truth here. + +Promotion still requires human review, source grading, conflict arbitration, and explicit source-pack tests. diff --git a/docs/research/character_level_inventory_manifest_latest.json b/docs/research/character_level_inventory_manifest_latest.json index bb20372b..9fc6d2ac 100644 --- a/docs/research/character_level_inventory_manifest_latest.json +++ b/docs/research/character_level_inventory_manifest_latest.json @@ -1,7 +1,7 @@ { "scope": "project", "status": "pass", - "generated_at": "2026-07-02T10:44:17.758196+00:00", + "generated_at": "2026-07-02T10:52:27.980901+00:00", "mode": { "heavy_ocr": false, "whole_machine_scan": false, @@ -17,7 +17,7 @@ "AGENTS.md" ], "summary": { - "total_files": 1075, + "total_files": 1077, "unhashed_files": 0, "unclassified_files": 0, "unknown_extraction_status": 0, @@ -28,12 +28,12 @@ "quarantined_draft": 93, "real_case_calibration": 5, "reference_candidate": 180, - "research_governance": 445 + "research_governance": 447 }, "extraction_status_counts": { "binary_indexed": 34, "image_ocr_queued": 3, - "text_indexed": 1038 + "text_indexed": 1040 } }, "root_summary": { @@ -46,8 +46,8 @@ "bytes": 43187 }, "docs/research": { - "files": 538, - "bytes": 2969221 + "files": 540, + "bytes": 3019398 }, "references": { "files": 236, @@ -5173,7 +5173,7 @@ "path": "docs/research/character_level_external_manifest_latest.json", "suffix": ".json", "byte_count": 666472, - "sha256": "e7a98a44b5ad6c2582bddb9482bf7d980a93784d74a5a448b6aee51c358269fd", + "sha256": "e14c5b310be0a108b40857a463e2d7657bf911083d12a8639de845e60af9d415", "extraction_status": "text_indexed", "character_count": 661666, "line_count": 12446, @@ -5187,7 +5187,7 @@ "path": "docs/research/character_level_external_manifest_latest.md", "suffix": ".md", "byte_count": 1280, - "sha256": "dd2c84a86dc7e691d5bd9088829ba2088ff32ad305f8eb8e7d492f6eb40ab9f4", + "sha256": "416e1e27c89232f580e18eb75fdf89f90509a19f4ad02b3d0df351d4a693acbd", "extraction_status": "text_indexed", "character_count": 1272, "line_count": 47, @@ -5201,7 +5201,7 @@ "path": "docs/research/character_level_extraction_queue_latest.json", "suffix": ".json", "byte_count": 31649, - "sha256": "4946bd810c6b312bae1fc9bb7a78bc34f886a4a5c7532d74732399fe7f612cdb", + "sha256": "2564e16627c5326880827500e6c8cf4d7d671773bf942308b6e5e47d517a936f", "extraction_status": "text_indexed", "character_count": 30151, "line_count": 758, @@ -5215,7 +5215,7 @@ "path": "docs/research/character_level_extraction_queue_latest.md", "suffix": ".md", "byte_count": 633, - "sha256": "8baea40e157fca6adc9228988561253f0803eb719b7392bc74ef4e64145394b6", + "sha256": "0ee514b7288f7e54b076d2e791798053dba6d8c79b19fad80652f376d8edd40d", "extraction_status": "text_indexed", "character_count": 633, "line_count": 27, @@ -5228,11 +5228,11 @@ "docs/research/character_level_extraction_results_latest.json": { "path": "docs/research/character_level_extraction_results_latest.json", "suffix": ".json", - "byte_count": 65711, - "sha256": "a06874a9c54148891373069cd3933b3be51e3b045e51bd8b121c751f9dcf83ac", + "byte_count": 65824, + "sha256": "7460624396860dddc58e65c04487cbd5aa102d55c28c807fc2100399d2acd6e8", "extraction_status": "text_indexed", - "character_count": 64213, - "line_count": 1650, + "character_count": 64326, + "line_count": 1652, "decode_replacement_count": 0, "classification": "research_governance", "priority": "priority_3", @@ -5242,11 +5242,39 @@ "docs/research/character_level_extraction_results_latest.md": { "path": "docs/research/character_level_extraction_results_latest.md", "suffix": ".md", - "byte_count": 749, - "sha256": "6f7d1e04b3bbb0a977e44b2cd6ddc6a71fe7b97b016a76b6e7d3dc0da37b32af", + "byte_count": 850, + "sha256": "d185c4239f0d3d66ad61bfb3f2f928581358c471883d07259772f445057f2cd5", "extraction_status": "text_indexed", - "character_count": 749, - "line_count": 33, + "character_count": 850, + "line_count": 35, + "decode_replacement_count": 0, + "classification": "research_governance", + "priority": "priority_3", + "promotion_status": "governance_or_history", + "reason": "Research history or governance record; index separately from rule truth." + }, + "docs/research/character_level_extraction_review_latest.json": { + "path": "docs/research/character_level_extraction_review_latest.json", + "suffix": ".json", + "byte_count": 49397, + "sha256": "510ff3d55c71ad376cf2b89a09c81394b6d2de02e2367168733ce00940d77537", + "extraction_status": "text_indexed", + "character_count": 47899, + "line_count": 1019, + "decode_replacement_count": 0, + "classification": "research_governance", + "priority": "priority_3", + "promotion_status": "governance_or_history", + "reason": "Research history or governance record; index separately from rule truth." + }, + "docs/research/character_level_extraction_review_latest.md": { + "path": "docs/research/character_level_extraction_review_latest.md", + "suffix": ".md", + "byte_count": 566, + "sha256": "cabf37aea044f1ff82e5a98226d37e0f37ce2b4b293ab1b518ae8fec2fc9bb08", + "extraction_status": "text_indexed", + "character_count": 566, + "line_count": 22, "decode_replacement_count": 0, "classification": "research_governance", "priority": "priority_3", @@ -5257,7 +5285,7 @@ "path": "docs/research/character_level_inventory_manifest_latest.json", "suffix": ".json", "byte_count": 722955, - "sha256": "4fcf6ce8815022fbe308fca4d725c50a481ce2f1383397c3617f08bb138cc3fc", + "sha256": "414fc9d24a8d6662935442aedd37c0820da186227dbd9dc461d498c43044df48", "extraction_status": "text_indexed", "character_count": 722405, "line_count": 15118, @@ -5271,7 +5299,7 @@ "path": "docs/research/character_level_inventory_manifest_latest.md", "suffix": ".md", "byte_count": 1090, - "sha256": "547a1e4ec8187636e39dbb09551541a0d2296cb798ee1895804feaca2612e1c1", + "sha256": "1e1c58e9f1fa954fb179640f61f3de86f6ec3d3c9d9cf830ec9454444d9923b4", "extraction_status": "text_indexed", "character_count": 1090, "line_count": 44, diff --git a/docs/research/character_level_inventory_manifest_latest.md b/docs/research/character_level_inventory_manifest_latest.md index 2bedd0bf..731b8646 100644 --- a/docs/research/character_level_inventory_manifest_latest.md +++ b/docs/research/character_level_inventory_manifest_latest.md @@ -2,8 +2,8 @@ - status: pass - scope: project -- generated_at: 2026-07-02T10:44:17.758196+00:00 -- total_files: 1075 +- generated_at: 2026-07-02T10:52:27.980901+00:00 +- total_files: 1077 - unhashed_files: 0 - unclassified_files: 0 - unknown_extraction_status: 0 @@ -16,7 +16,7 @@ | --- | ---: | ---: | | `AGENTS.md` | 1 | 3932 | | `SKILL.md` | 1 | 43187 | -| `docs/research` | 538 | 2969221 | +| `docs/research` | 540 | 3019398 | | `references` | 236 | 4008411 | | `references/open_source_sources` | 299 | 9365015 | @@ -24,7 +24,7 @@ - `binary_indexed`: 34 - `image_ocr_queued`: 3 -- `text_indexed`: 1038 +- `text_indexed`: 1040 ## Classification Counts @@ -34,7 +34,7 @@ - `quarantined_draft`: 93 - `real_case_calibration`: 5 - `reference_candidate`: 180 -- `research_governance`: 445 +- `research_governance`: 447 ## Boundary diff --git a/progress.md b/progress.md index 7ad194b0..6eb65047 100644 --- a/progress.md +++ b/progress.md @@ -843,3 +843,10 @@ - 采用更适合本机的 macOS Vision OCR:脚本自动编译并缓存 `~/.cache/jyotish-ocr/vision_ocr`,不依赖 Homebrew tesseract。 - `scripts/character_level_inventory_manifest.py --scope extraction-results` 新增 OCR cache;缓存只保存 OCR 文本 hash、字符数、行数、后端、状态,不保存 OCR 正文。 - 53 张图片已用 `macos_vision` 复跑完成;当前结果:`text_extracted=49`、`text_empty=17`、`ocr_blocked_missing_engine=0`、`extraction_failed=0`、`stored_text_payload_fields=0`。 + +## 2026-07-02T18:52:00+08:00 - 提取后分级 review manifest + +- 新增 `scripts/character_level_inventory_manifest.py --scope extraction-review`,对 66 个提取结果做治理分级,不保存正文,不进入 runtime truth。 +- 新增 `docs/research/character_level_extraction_review_latest.json` 与 `.md`,当前 reviewed_files=`66`、runtime_promotions=`0`、stored_text_payload_fields=`0`。 +- 分级结果:`promote_review_candidate=38`、`private_reference_only=3`、`reference_only=8`、`asset_or_empty_reference_only=17`。 +- 后续若要升格,只能从 `promote_review_candidate` 里逐批人工 source grading + conflict arbitration + source-pack 测试,不能直接把 OCR/外部文档当主链真源。 diff --git a/scripts/character_level_inventory_manifest.py b/scripts/character_level_inventory_manifest.py index c545e315..29d69c1c 100644 --- a/scripts/character_level_inventory_manifest.py +++ b/scripts/character_level_inventory_manifest.py @@ -30,6 +30,8 @@ EXTRACTION_QUEUE_JSON = ROOT / "docs" / "research" / "character_level_extraction EXTRACTION_QUEUE_MD = ROOT / "docs" / "research" / "character_level_extraction_queue_latest.md" EXTRACTION_RESULTS_JSON = ROOT / "docs" / "research" / "character_level_extraction_results_latest.json" EXTRACTION_RESULTS_MD = ROOT / "docs" / "research" / "character_level_extraction_results_latest.md" +EXTRACTION_REVIEW_JSON = ROOT / "docs" / "research" / "character_level_extraction_review_latest.json" +EXTRACTION_REVIEW_MD = ROOT / "docs" / "research" / "character_level_extraction_review_latest.md" VISION_OCR_SOURCE = r''' import Foundation import Vision @@ -474,6 +476,8 @@ def build_manifest(*, scope: str = "project", write: bool = True) -> dict[str, A return build_extraction_queue(write=write) elif scope == "extraction-results": return build_extraction_results(write=write) + elif scope == "extraction-review": + return build_extraction_review(write=write) else: raise ValueError(f"Unsupported scope: {scope}") @@ -510,6 +514,75 @@ def build_manifest(*, scope: str = "project", write: bool = True) -> dict[str, A return report +def _review_decision(item: dict[str, Any]) -> tuple[str, str]: + path = str(item["path"]) + if item["extraction_result"] == "extraction_failed": + return "blocked_extraction_failure", "Extraction failed; keep blocked until repaired." + if item["post_extraction_classification"] == "extracted_private_reference_only": + return "private_reference_only", "Private or historical personal report; do not promote into runtime truth." + if item["extraction_result"] == "text_empty": + return "asset_or_empty_reference_only", "OCR/extraction produced empty text; keep as indexed asset only." + if "/文件仓库/印度占星文章/" in path or "/Downloads/" in path: + return "promote_review_candidate", "Extracted source-like material; requires human source grading before promotion." + if item["post_extraction_classification"] == "extracted_candidate_for_review": + return "promote_review_candidate", "Candidate text extracted; requires conflict arbitration and source grading." + return "reference_only", "Useful as context or asset evidence, not direct runtime truth." + + +def build_extraction_review(*, write: bool = True) -> dict[str, Any]: + results_report = build_extraction_results(write=False) + reviews: list[dict[str, Any]] = [] + for item in results_report["results"]: + decision, reason = _review_decision(item) + reviews.append( + { + "path": item["path"], + "source_scope": item["source_scope"], + "suffix": item["suffix"], + "byte_count": item["byte_count"], + "sha256": item["sha256"], + "extraction_result": item["extraction_result"], + "extraction_method": item["extraction_method"], + "extracted_character_count": item["extracted_character_count"], + "text_sha256": item.get("text_sha256"), + "post_extraction_classification": item["post_extraction_classification"], + "decision": decision, + "decision_reason": reason, + "runtime_truth_allowed": False, + } + ) + decision_counts: dict[str, int] = {} + for item in reviews: + decision_counts[item["decision"]] = decision_counts.get(item["decision"], 0) + 1 + stored_text_payload_fields = sum(1 for item in reviews if "text" in item or "text_preview" in item) + report = { + "scope": "extraction-review", + "status": "pass", + "generated_at": datetime.now(timezone.utc).isoformat(), + "mode": { + "whole_machine_scan": False, + "semantic_promotion": False, + "runtime_truth_promotion": False, + "boundary": "Review decisions are governance labels only. No extracted source is promoted to runtime truth here.", + }, + "summary": { + "reviewed_files": len(reviews), + "runtime_promotions": 0, + "stored_text_payload_fields": stored_text_payload_fields, + }, + "decision_counts": dict(sorted(decision_counts.items())), + "reviews": reviews, + "artifacts": { + "json_report": _relative(EXTRACTION_REVIEW_JSON), + "markdown_report": _relative(EXTRACTION_REVIEW_MD), + }, + "title": "Extraction Review Manifest", + } + if write: + _write_reports(report, json_report=EXTRACTION_REVIEW_JSON, markdown_report=EXTRACTION_REVIEW_MD) + return report + + def _hash_text(text: str) -> str: return hashlib.sha256(text.encode("utf-8", errors="replace")).hexdigest() @@ -889,6 +962,8 @@ def _render_markdown(report: dict[str, Any]) -> str: return _render_extraction_queue_markdown(report) if report["scope"] == "extraction-results": return _render_extraction_results_markdown(report) + if report["scope"] == "extraction-review": + return _render_extraction_review_markdown(report) lines = [ f"# {report.get('title', 'Character-Level Inventory Manifest')}", "", @@ -929,6 +1004,36 @@ def _render_markdown(report: dict[str, Any]) -> str: return "\n".join(lines) +def _render_extraction_review_markdown(report: dict[str, Any]) -> str: + lines = [ + f"# {report.get('title', 'Extraction Review Manifest')}", + "", + f"- status: {report['status']}", + f"- scope: {report['scope']}", + f"- generated_at: {report['generated_at']}", + f"- reviewed_files: {report['summary']['reviewed_files']}", + f"- runtime_promotions: {report['summary']['runtime_promotions']}", + f"- stored_text_payload_fields: {report['summary']['stored_text_payload_fields']}", + "", + "## Decision Counts", + "", + ] + for name, count in report["decision_counts"].items(): + lines.append(f"- `{name}`: {count}") + lines.extend( + [ + "", + "## Boundary", + "", + report["mode"]["boundary"], + "", + "Promotion still requires human review, source grading, conflict arbitration, and explicit source-pack tests.", + "", + ] + ) + return "\n".join(lines) + + def _render_extraction_results_markdown(report: dict[str, Any]) -> str: lines = [ f"# {report.get('title', 'Extraction Results Manifest')}", @@ -1015,7 +1120,7 @@ def main(argv: list[str] | None = None) -> int: parser.add_argument( "--scope", default="project", - choices=["project", "external", "extraction-queue", "extraction-results"], + choices=["project", "external", "extraction-queue", "extraction-results", "extraction-review"], ) parser.add_argument("--no-write", action="store_true", help="Print the manifest without writing report artifacts.") parser.add_argument("--summary-only", action="store_true", help="Print only summary fields; still writes full artifacts unless --no-write is set.") diff --git a/tests/test_character_level_inventory_manifest.py b/tests/test_character_level_inventory_manifest.py index 839cf707..c0f8751a 100644 --- a/tests/test_character_level_inventory_manifest.py +++ b/tests/test_character_level_inventory_manifest.py @@ -223,3 +223,35 @@ def test_extraction_results_extract_pdf_and_docx_without_storing_text() -> None: assert json_path.exists() assert md_path.exists() assert "Extraction Results Manifest" in md_path.read_text(encoding="utf-8") + + +def test_extraction_review_grades_extracted_sources_without_promoting_runtime_truth() -> None: + report = _run_manifest("--scope", "extraction-review") + + assert report["scope"] == "extraction-review" + assert report["status"] == "pass" + assert report["summary"]["reviewed_files"] >= 60 + assert report["summary"]["runtime_promotions"] == 0 + assert report["summary"]["stored_text_payload_fields"] == 0 + assert report["decision_counts"]["promote_review_candidate"] >= 5 + assert report["decision_counts"]["private_reference_only"] >= 1 + assert report["decision_counts"]["asset_or_empty_reference_only"] >= 1 + + for item in report["reviews"]: + assert item["sha256"] + assert item["decision"] in { + "promote_review_candidate", + "private_reference_only", + "reference_only", + "asset_or_empty_reference_only", + "blocked_extraction_failure", + } + assert item["runtime_truth_allowed"] is False + assert "text" not in item + assert "text_preview" not in item + + json_path = ROOT / report["artifacts"]["json_report"] + md_path = ROOT / report["artifacts"]["markdown_report"] + assert json_path.exists() + assert md_path.exists() + assert "Extraction Review Manifest" in md_path.read_text(encoding="utf-8")