From ca4b2b7947bbb62e2073ad4eac584d9ea6f3a6dd Mon Sep 17 00:00:00 2001 From: 732642856 <732642856@qq.com> Date: Wed, 8 Jul 2026 21:33:55 +0800 Subject: [PATCH] feat: audit VedAstro raw archive manifest --- docs/research/pre_work_error_ledger.md | 1 + scripts/unified_consultation_orchestrator.py | 19 +++++++++++++++++++ tests/test_api_server_security.py | 2 ++ tests/test_mcp_strict_workflow_career.py | 1 + .../test_unified_consultation_orchestrator.py | 10 ++++++++++ 5 files changed, 33 insertions(+) diff --git a/docs/research/pre_work_error_ledger.md b/docs/research/pre_work_error_ledger.md index b7b1731a..d29ee2e2 100644 --- a/docs/research/pre_work_error_ledger.md +++ b/docs/research/pre_work_error_ledger.md @@ -52,6 +52,7 @@ For large architecture or release work, also read: | ERR-019 | WorkBuddy/cloud/local acceptance summaries can invent pass counts, stale asset counts, non-existent error docs, or wrong dasha windows. | mitigated 2026-07-06 | Read `docs/research/user_invocation_acceptance_error_log_2026_07_06.md`; run `scripts/user_invocation_acceptance_check.py` and `tests/test_user_invocation_acceptance_contract.py` before accepting ordinary-user skill invocation validation claims. | | ERR-020 | VedAstro official raw responses can be archived but hard to audit if no manifest/API listing exposes them. | mitigated 2026-07-08 | Keep `list_official_raw_response_archives()` and `GET /api/vedastro_gateway/archives`; tests must prove archived official raw responses are enumerable. | | ERR-021 | VedAstro raw archive manifests can exist outside the high-rigor evidence packet, leaving final reports unable to prove whether official raw evidence was archived. | mitigated 2026-07-08 | Keep `vedastro_official_raw_archive_manifest` in `machine_evidence_packet.sections` for API and MCP strict workflows. | +| ERR-022 | Technique Audit Table can show VedAstro cloud state but omit whether archived official raw evidence is actually auditable. | mitigated 2026-07-08 | Keep `VedAstro Raw Archive Manifest` as a first-class Technique Audit Table row immediately after `VedAstro Cloud State`. | ## Fragment Sweep Command Set diff --git a/scripts/unified_consultation_orchestrator.py b/scripts/unified_consultation_orchestrator.py index d99c1efa..988817af 100644 --- a/scripts/unified_consultation_orchestrator.py +++ b/scripts/unified_consultation_orchestrator.py @@ -552,10 +552,19 @@ class UnifiedConsultationOrchestrator: blocked_items.append("external_engine_cross_validation_partial") packet = machine_evidence_packet if isinstance(machine_evidence_packet, dict) else {} packet_status = packet.get("status") or "required_not_satisfied" + packet_sections = packet.get("sections") if isinstance(packet.get("sections"), dict) else {} + archive_section = packet_sections.get("vedastro_official_raw_archive_manifest") + archive_status = ( + archive_section.get("status") + if isinstance(archive_section, dict) + else "required_not_satisfied" + ) if not packet: blocked_items.append("machine_evidence_packet_not_yet_materialized") elif packet_status != "complete": blocked_items.append("machine_evidence_packet_partial") + if archive_status != "used": + blocked_items.append("vedastro_official_raw_archive_manifest_missing") case_packet = real_case_calibration if isinstance(real_case_calibration, dict) else {} case_status = case_packet.get("status") or "required_not_satisfied" functional_packet = packet.get("functional_benefic_malefic") if isinstance(packet.get("functional_benefic_malefic"), dict) else {} @@ -577,6 +586,16 @@ class UnifiedConsultationOrchestrator: else "confidence_capped_without_verified_official_cloud" ), }, + { + "technique": "VedAstro Raw Archive Manifest", + "status": archive_status, + "used": archive_status == "used", + "effect_on_confidence": ( + "official_raw_archive_is_auditable" + if archive_status == "used" + else "official_raw_archive_not_auditable_for_this_run" + ), + }, { "technique": "External Engine Cross-Validation", "status": external_cross_validation["status"], diff --git a/tests/test_api_server_security.py b/tests/test_api_server_security.py index b945cabf..e0bc879e 100644 --- a/tests/test_api_server_security.py +++ b/tests/test_api_server_security.py @@ -2205,6 +2205,8 @@ def test_high_rigor_workflow_reuses_existing_rectification_backtest_and_vedastro assert result['unified_orchestrator']['surface'] == 'api_web' assert result['unified_orchestrator']['route']['question_type'] == 'career' assert result['machine_evidence_packet']['sections']['vedastro_official_raw_archive_manifest']['status'] == 'used' + assert result['runtime_evidence_log']['quality_gate']['technique_audit_table'][1]['technique'] == 'VedAstro Raw Archive Manifest' + assert result['runtime_evidence_log']['quality_gate']['technique_audit_table'][1]['status'] == 'used' def test_consultation_workflow_uses_unified_orchestrator_contract(monkeypatch) -> None: diff --git a/tests/test_mcp_strict_workflow_career.py b/tests/test_mcp_strict_workflow_career.py index c1d300e0..a620c296 100644 --- a/tests/test_mcp_strict_workflow_career.py +++ b/tests/test_mcp_strict_workflow_career.py @@ -183,6 +183,7 @@ def test_mcp_strict_workflow_returns_runtime_evidence_log(monkeypatch) -> None: assert result["runtime_evidence_log"]["real_case_calibration"]["status"] == "partial_scored" assert result["runtime_evidence_log"]["quality_gate"]["technique_audit_table_required"] is True assert result["runtime_evidence_log"]["quality_gate"]["technique_audit_table"][0]["technique"] == "VedAstro Cloud State" + assert result["runtime_evidence_log"]["quality_gate"]["technique_audit_table"][1]["technique"] == "VedAstro Raw Archive Manifest" def test_career_blocks_label_when_d10_is_missing_but_preserves_jaimini_context() -> None: diff --git a/tests/test_unified_consultation_orchestrator.py b/tests/test_unified_consultation_orchestrator.py index 7cebd189..707d3423 100644 --- a/tests/test_unified_consultation_orchestrator.py +++ b/tests/test_unified_consultation_orchestrator.py @@ -191,6 +191,7 @@ def test_runtime_evidence_log_exposes_blind_packet_case_and_quality_gate_contrac assert log["quality_gate"]["technique_audit_table_required"] is True assert [row["technique"] for row in log["quality_gate"]["technique_audit_table"]] == [ "VedAstro Cloud State", + "VedAstro Raw Archive Manifest", "External Engine Cross-Validation", "Evidence Packet", "Blind Technical Mode", @@ -216,6 +217,11 @@ def test_runtime_evidence_log_exposes_blind_packet_case_and_quality_gate_contrac packet = orchestrator.machine_evidence_packet( chart={"chart": {"planets": {"Sun": {}}, "ascendant": {"sign": "Leo"}}}, route_packet={"question_type": "career", "primary_theme": "career"}, + vedastro_archive_manifest={ + "scope": "vedastro_official_raw_response_archive_manifest", + "archive_count": 1, + "archives": [{"job_id": "job_1955", "official_raw_response_available": True}], + }, ) log_with_functional = orchestrator.runtime_evidence_log( surface="api_web", @@ -229,6 +235,10 @@ def test_runtime_evidence_log_exposes_blind_packet_case_and_quality_gate_contrac assert functional_row["technique"] == "Functional Benefic/Malefic" assert functional_row["status"] == "used" assert "Mars" in functional_row["yogakarakas"] + archive_row = log_with_functional["quality_gate"]["technique_audit_table"][1] + assert archive_row["technique"] == "VedAstro Raw Archive Manifest" + assert archive_row["status"] == "used" + assert archive_row["used"] is True def test_machine_evidence_packet_materializes_required_section_statuses() -> None: