From 4f3d9af19f2eb5be2564f5ef88272e1e82c17096 Mon Sep 17 00:00:00 2001 From: yaojingang Date: Tue, 16 Jun 2026 22:39:27 +0800 Subject: [PATCH] Require ledger reviewer identity for world-class evidence --- evidence/world_class/intake.schema.json | 10 ++- .../templates/human-adjudication.intake.json | 2 + .../native-client-telemetry.intake.json | 2 + .../native-permission-enforcement.intake.json | 2 + .../templates/provider-holdout.intake.json | 2 + reports/architecture_maintainability.json | 30 +++---- reports/architecture_maintainability.md | 6 +- reports/context_budget.json | 12 +-- reports/context_budget.md | 2 +- reports/context_budget_summary.json | 8 +- reports/security_trust_report.json | 2 +- reports/security_trust_report.md | 2 +- reports/world_class_evidence_ledger.json | 8 ++ reports/world_class_evidence_ledger.md | 8 +- reports/world_class_operator_runbook.json | 8 ++ scripts/prepare_world_class_submission_kit.py | 4 +- scripts/render_world_class_evidence_ledger.py | 14 ++-- scripts/world_class_evidence_contract.py | 13 ++++ .../world_class_submission_kit_rendering.py | 2 +- tests/verify_world_class_evidence_intake.py | 6 ++ tests/verify_world_class_evidence_ledger.py | 78 +++++++++++++++++++ tests/verify_world_class_operator_runbook.py | 2 + tests/verify_world_class_submission_kit.py | 5 ++ tests/verify_world_class_submission_review.py | 2 + 24 files changed, 186 insertions(+), 44 deletions(-) diff --git a/evidence/world_class/intake.schema.json b/evidence/world_class/intake.schema.json index 708684a..d277364 100644 --- a/evidence/world_class/intake.schema.json +++ b/evidence/world_class/intake.schema.json @@ -151,7 +151,9 @@ "reviewer_or_operator_identity_present", "artifact_refs_reviewed", "privacy_contract_satisfied", - "ledger_reviewer_approved" + "ledger_reviewer_approved", + "ledger_reviewer", + "ledger_reviewed_at" ], "properties": { "real_external_or_human_evidence": { @@ -169,6 +171,12 @@ "ledger_reviewer_approved": { "type": "boolean" }, + "ledger_reviewer": { + "type": "string" + }, + "ledger_reviewed_at": { + "type": "string" + }, "notes": { "type": "string" } diff --git a/evidence/world_class/templates/human-adjudication.intake.json b/evidence/world_class/templates/human-adjudication.intake.json index 21b4221..8641907 100644 --- a/evidence/world_class/templates/human-adjudication.intake.json +++ b/evidence/world_class/templates/human-adjudication.intake.json @@ -45,6 +45,8 @@ "artifact_refs_reviewed": false, "privacy_contract_satisfied": false, "ledger_reviewer_approved": false, + "ledger_reviewer": "", + "ledger_reviewed_at": "", "notes": "Copy this template into submissions/ after a real reviewer completes blind decisions." } } diff --git a/evidence/world_class/templates/native-client-telemetry.intake.json b/evidence/world_class/templates/native-client-telemetry.intake.json index 5e7d6cc..9dfdfa2 100644 --- a/evidence/world_class/templates/native-client-telemetry.intake.json +++ b/evidence/world_class/templates/native-client-telemetry.intake.json @@ -46,6 +46,8 @@ "artifact_refs_reviewed": false, "privacy_contract_satisfied": false, "ledger_reviewer_approved": false, + "ledger_reviewer": "", + "ledger_reviewed_at": "", "notes": "Copy this template into submissions/ after real client events have been imported." } } diff --git a/evidence/world_class/templates/native-permission-enforcement.intake.json b/evidence/world_class/templates/native-permission-enforcement.intake.json index 365b3bb..e16db35 100644 --- a/evidence/world_class/templates/native-permission-enforcement.intake.json +++ b/evidence/world_class/templates/native-permission-enforcement.intake.json @@ -54,6 +54,8 @@ "artifact_refs_reviewed": false, "privacy_contract_satisfied": false, "ledger_reviewer_approved": false, + "ledger_reviewer": "", + "ledger_reviewed_at": "", "notes": "Copy this template into submissions/ only after a real client or installer guard exists." } } diff --git a/evidence/world_class/templates/provider-holdout.intake.json b/evidence/world_class/templates/provider-holdout.intake.json index ebdf458..7582dd8 100644 --- a/evidence/world_class/templates/provider-holdout.intake.json +++ b/evidence/world_class/templates/provider-holdout.intake.json @@ -43,6 +43,8 @@ "artifact_refs_reviewed": false, "privacy_contract_satisfied": false, "ledger_reviewer_approved": false, + "ledger_reviewer": "", + "ledger_reviewed_at": "", "notes": "Copy this template into submissions/ and set all booleans truthfully after the real provider run." } } diff --git a/reports/architecture_maintainability.json b/reports/architecture_maintainability.json index e43559b..99ee9f3 100644 --- a/reports/architecture_maintainability.json +++ b/reports/architecture_maintainability.json @@ -15,13 +15,20 @@ "warn_line_threshold": 900, "watch_line_threshold": 720, "block_line_threshold": 1500, - "largest_file_lines": 696, + "largest_file_lines": 700, "watchlist_count": 0, "hotspot_count": 0, "blocker_count": 0, "decision": "pass" }, "largest_files": [ + { + "path": "scripts/world_class_evidence_contract.py", + "lines": 700, + "kind": "internal-module", + "severity": "pass", + "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." + }, { "path": "tests/verify_yao_cli.py", "lines": 696, @@ -29,13 +36,6 @@ "severity": "pass", "recommendation": "Break broad integration assertions into focused verifier helpers when the next behavior change lands." }, - { - "path": "scripts/world_class_evidence_contract.py", - "lines": 687, - "kind": "internal-module", - "severity": "pass", - "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." - }, { "path": "scripts/render_review_viewer.py", "lines": 685, @@ -43,6 +43,13 @@ "severity": "pass", "recommendation": "Split viewer data assembly from HTML section rendering." }, + { + "path": "tests/verify_world_class_evidence_intake.py", + "lines": 669, + "kind": "test", + "severity": "pass", + "recommendation": "Break broad integration assertions into focused verifier helpers when the next behavior change lands." + }, { "path": "scripts/skill_report_model.py", "lines": 665, @@ -50,13 +57,6 @@ "severity": "pass", "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." }, - { - "path": "tests/verify_world_class_evidence_intake.py", - "lines": 663, - "kind": "test", - "severity": "pass", - "recommendation": "Break broad integration assertions into focused verifier helpers when the next behavior change lands." - }, { "path": "scripts/render_skill_os2_coverage.py", "lines": 649, diff --git a/reports/architecture_maintainability.md b/reports/architecture_maintainability.md index 96f7efa..615aa6f 100644 --- a/reports/architecture_maintainability.md +++ b/reports/architecture_maintainability.md @@ -13,7 +13,7 @@ Generated at: `2026-06-16` - Yao CLI command handlers: `68` - entrypoint command handlers: `18` - command modules: `6` -- largest file lines: `696` +- largest file lines: `700` - watch threshold lines: `720` - watchlist: `0` - hotspots: `0` @@ -33,11 +33,11 @@ No near-threshold files found. | File | Lines | Kind | Severity | | --- | ---: | --- | --- | +| `scripts/world_class_evidence_contract.py` | `700` | `internal-module` | `pass` | | `tests/verify_yao_cli.py` | `696` | `test` | `pass` | -| `scripts/world_class_evidence_contract.py` | `687` | `internal-module` | `pass` | | `scripts/render_review_viewer.py` | `685` | `cli-script` | `pass` | +| `tests/verify_world_class_evidence_intake.py` | `669` | `test` | `pass` | | `scripts/skill_report_model.py` | `665` | `internal-module` | `pass` | -| `tests/verify_world_class_evidence_intake.py` | `663` | `test` | `pass` | | `scripts/render_skill_os2_coverage.py` | `649` | `cli-script` | `pass` | | `scripts/render_review_studio.py` | `647` | `cli-script` | `pass` | | `scripts/render_reference_synthesis.py` | `644` | `cli-script` | `pass` | diff --git a/reports/context_budget.json b/reports/context_budget.json index ebd1c37..85a94fd 100644 --- a/reports/context_budget.json +++ b/reports/context_budget.json @@ -6,15 +6,15 @@ "context_budget_tier": "production", "context_budget_limit": 1000, "skill_body_tokens": 797, - "other_text_tokens": 1056256, + "other_text_tokens": 1057945, "estimated_initial_load_tokens": 990, - "estimated_total_text_tokens": 1057053, - "deferred_resource_tokens": 489692, + "estimated_total_text_tokens": 1058742, + "deferred_resource_tokens": 489964, "deferred_resource_warn_threshold": 120000, "deferred_resource_dirs": [ { "path": "scripts", - "estimated_tokens": 429594, + "estimated_tokens": 429866, "file_count": 135 }, { @@ -36,7 +36,7 @@ "large_deferred_resource_dirs": [ { "path": "scripts", - "estimated_tokens": 429594, + "estimated_tokens": 429866, "file_count": 135 } ], @@ -59,7 +59,7 @@ ], "missing": [], "path": "scripts", - "estimated_tokens": 429594, + "estimated_tokens": 429866, "file_count": 135, "rationale": "Script resources are deterministic deferred tools, not initial-load prompt context." } diff --git a/reports/context_budget.md b/reports/context_budget.md index f937303..8258c37 100644 --- a/reports/context_budget.md +++ b/reports/context_budget.md @@ -2,7 +2,7 @@ | Target | Path | Tier | Limit | Initial | SKILL | Deferred | Resource Governance | Large Deferred Dirs | Quality Density | Unused Dirs | Status | | --- | --- | --- | ---: | ---: | ---: | ---: | --- | --- | ---: | --- | --- | -| root | `.` | `production` | 1000 | 990 | 797 | 489692 | `governed` | scripts:429594 | 131.3 | - | ok | +| root | `.` | `production` | 1000 | 990 | 797 | 489964 | `governed` | scripts:429866 | 131.3 | - | ok | | complex-release-orchestrator | `examples/complex-release-orchestrator/generated-skill` | `production` | 1000 | 790 | 718 | 1657 | `not-required` | - | 164.6 | - | ok | | governed-incident-command | `examples/governed-incident-command/generated-skill` | `production` | 1000 | 760 | 658 | 1030 | `not-required` | - | 171.1 | - | ok | diff --git a/reports/context_budget_summary.json b/reports/context_budget_summary.json index c89cf11..162ed46 100644 --- a/reports/context_budget_summary.json +++ b/reports/context_budget_summary.json @@ -1,5 +1,5 @@ { - "generated_at": "2026-06-16", + "generated_at": "2026-03-31", "targets": [ { "label": "root", @@ -8,11 +8,11 @@ "budget_limit": 1000, "initial_tokens": 990, "skill_body_tokens": 797, - "deferred_resource_tokens": 489692, + "deferred_resource_tokens": 489964, "large_deferred_resource_dirs": [ { "path": "scripts", - "estimated_tokens": 429594, + "estimated_tokens": 429866, "file_count": 135 } ], @@ -35,7 +35,7 @@ ], "missing": [], "path": "scripts", - "estimated_tokens": 429594, + "estimated_tokens": 429866, "file_count": 135, "rationale": "Script resources are deterministic deferred tools, not initial-load prompt context." } diff --git a/reports/security_trust_report.json b/reports/security_trust_report.json index 8f103d9..c86bd5d 100644 --- a/reports/security_trust_report.json +++ b/reports/security_trust_report.json @@ -23,7 +23,7 @@ "interactive_script_count": 0, "package_hash_scope": "source-contract-without-generated-reports", "package_hash_file_count": 226, - "package_sha256": "95b883a7258f8b201a7f94b47a35fa3f665ac65160def6d41764f20e2cdb5e4d" + "package_sha256": "a19c34849f99fe3f9166f7ba13c54d9ca709e1cec205ad3a1e82e8f1eb30d895" }, "failures": [], "warnings": [], diff --git a/reports/security_trust_report.md b/reports/security_trust_report.md index 36a5bdb..9cd24f6 100644 --- a/reports/security_trust_report.md +++ b/reports/security_trust_report.md @@ -16,7 +16,7 @@ - Interactive scripts: `0` - Package hash scope: `source-contract-without-generated-reports` - Package hash files: `226` -- Package SHA256: `95b883a7258f8b201a7f94b47a35fa3f665ac65160def6d41764f20e2cdb5e4d` +- Package SHA256: `a19c34849f99fe3f9166f7ba13c54d9ca709e1cec205ad3a1e82e8f1eb30d895` ## Failures diff --git a/reports/world_class_evidence_ledger.json b/reports/world_class_evidence_ledger.json index 28c9890..a2d38cf 100644 --- a/reports/world_class_evidence_ledger.json +++ b/reports/world_class_evidence_ledger.json @@ -158,6 +158,8 @@ "attested_real_evidence": false, "privacy_contract_satisfied": false, "ledger_reviewer_approved": false, + "ledger_reviewer": "", + "ledger_reviewed_at": "", "ledger_counts_as_completion": false }, "anti_overclaim": { @@ -277,6 +279,8 @@ "attested_real_evidence": false, "privacy_contract_satisfied": false, "ledger_reviewer_approved": false, + "ledger_reviewer": "", + "ledger_reviewed_at": "", "ledger_counts_as_completion": false }, "anti_overclaim": { @@ -386,6 +390,8 @@ "attested_real_evidence": false, "privacy_contract_satisfied": false, "ledger_reviewer_approved": false, + "ledger_reviewer": "", + "ledger_reviewed_at": "", "ledger_counts_as_completion": false }, "anti_overclaim": { @@ -488,6 +494,8 @@ "attested_real_evidence": false, "privacy_contract_satisfied": false, "ledger_reviewer_approved": false, + "ledger_reviewer": "", + "ledger_reviewed_at": "", "ledger_counts_as_completion": false }, "anti_overclaim": { diff --git a/reports/world_class_evidence_ledger.md b/reports/world_class_evidence_ledger.md index 1012cec..dc39762 100644 --- a/reports/world_class_evidence_ledger.md +++ b/reports/world_class_evidence_ledger.md @@ -38,7 +38,7 @@ This ledger records the current evidence state. It requires both passing source - source status: `external_required` - observed state: `{"model_executed_count": 0, "timing_observed_count": 10, "token_observed_count": 0, "accepted": false}` - source checks: `1` pass / `3` total -- submission state: `{"status": "missing", "path": "evidence/world_class/submissions/provider-holdout.json", "artifact_ref_count": 0, "attested_real_evidence": false, "privacy_contract_satisfied": false, "ledger_reviewer_approved": false, "ledger_counts_as_completion": false}` +- submission state: `{"status": "missing", "path": "evidence/world_class/submissions/provider-holdout.json", "artifact_ref_count": 0, "attested_real_evidence": false, "privacy_contract_satisfied": false, "ledger_reviewer_approved": false, "ledger_reviewer": "", "ledger_reviewed_at": "", "ledger_counts_as_completion": false}` ### Provenance Requirements @@ -81,7 +81,7 @@ This ledger records the current evidence state. It requires both passing source - source status: `human_required` - observed state: `{"pair_count": 5, "judgment_count": 0, "pending_count": 5, "invalid_decision_count": 0, "answer_revealed_count": 0, "accepted": false}` - source checks: `2` pass / `4` total -- submission state: `{"status": "missing", "path": "evidence/world_class/submissions/human-adjudication.json", "artifact_ref_count": 0, "attested_real_evidence": false, "privacy_contract_satisfied": false, "ledger_reviewer_approved": false, "ledger_counts_as_completion": false}` +- submission state: `{"status": "missing", "path": "evidence/world_class/submissions/human-adjudication.json", "artifact_ref_count": 0, "attested_real_evidence": false, "privacy_contract_satisfied": false, "ledger_reviewer_approved": false, "ledger_reviewer": "", "ledger_reviewed_at": "", "ledger_counts_as_completion": false}` ### Provenance Requirements @@ -129,7 +129,7 @@ This ledger records the current evidence state. It requires both passing source - source status: `external_required` - observed state: `{"native_enforcement_count": 0, "metadata_fallback_count": 4, "installer_enforcement_pass_count": 4, "installer_permission_failure_count": 0, "installer_enforcement_ready": true, "residual_risk_count": 4, "failure_count": 0, "accepted": false}` - source checks: `2` pass / `3` total -- submission state: `{"status": "missing", "path": "evidence/world_class/submissions/native-permission-enforcement.json", "artifact_ref_count": 0, "attested_real_evidence": false, "privacy_contract_satisfied": false, "ledger_reviewer_approved": false, "ledger_counts_as_completion": false}` +- submission state: `{"status": "missing", "path": "evidence/world_class/submissions/native-permission-enforcement.json", "artifact_ref_count": 0, "attested_real_evidence": false, "privacy_contract_satisfied": false, "ledger_reviewer_approved": false, "ledger_reviewer": "", "ledger_reviewed_at": "", "ledger_counts_as_completion": false}` ### Provenance Requirements @@ -174,7 +174,7 @@ This ledger records the current evidence state. It requires both passing source - source status: `external_required` - observed state: `{"external_source_events": 0, "adoption_sample_count": 0, "raw_content_allowed": false, "risk_band": "low", "accepted": false}` - source checks: `1` pass / `3` total -- submission state: `{"status": "missing", "path": "evidence/world_class/submissions/native-client-telemetry.json", "artifact_ref_count": 0, "attested_real_evidence": false, "privacy_contract_satisfied": false, "ledger_reviewer_approved": false, "ledger_counts_as_completion": false}` +- submission state: `{"status": "missing", "path": "evidence/world_class/submissions/native-client-telemetry.json", "artifact_ref_count": 0, "attested_real_evidence": false, "privacy_contract_satisfied": false, "ledger_reviewer_approved": false, "ledger_reviewer": "", "ledger_reviewed_at": "", "ledger_counts_as_completion": false}` ### Provenance Requirements diff --git a/reports/world_class_operator_runbook.json b/reports/world_class_operator_runbook.json index c6ee249..05975f3 100644 --- a/reports/world_class_operator_runbook.json +++ b/reports/world_class_operator_runbook.json @@ -128,6 +128,8 @@ "attested_real_evidence": false, "privacy_contract_satisfied": false, "ledger_reviewer_approved": false, + "ledger_reviewer": "", + "ledger_reviewed_at": "", "ledger_counts_as_completion": false }, "anti_overclaim": { @@ -261,6 +263,8 @@ "attested_real_evidence": false, "privacy_contract_satisfied": false, "ledger_reviewer_approved": false, + "ledger_reviewer": "", + "ledger_reviewed_at": "", "ledger_counts_as_completion": false }, "anti_overclaim": { @@ -383,6 +387,8 @@ "attested_real_evidence": false, "privacy_contract_satisfied": false, "ledger_reviewer_approved": false, + "ledger_reviewer": "", + "ledger_reviewed_at": "", "ledger_counts_as_completion": false }, "anti_overclaim": { @@ -499,6 +505,8 @@ "attested_real_evidence": false, "privacy_contract_satisfied": false, "ledger_reviewer_approved": false, + "ledger_reviewer": "", + "ledger_reviewed_at": "", "ledger_counts_as_completion": false }, "anti_overclaim": { diff --git a/scripts/prepare_world_class_submission_kit.py b/scripts/prepare_world_class_submission_kit.py index 45139a8..bc462f1 100644 --- a/scripts/prepare_world_class_submission_kit.py +++ b/scripts/prepare_world_class_submission_kit.py @@ -335,7 +335,7 @@ def build_handoff_steps( "label": "Edit submission packet", "status": "manual", "command": "", - "completion_signal": "template_only is false only after real evidence exists; ledger_reviewer_approved remains false until reviewer approval.", + "completion_signal": "template_only is false only after real evidence exists; ledger_reviewer_approved, ledger_reviewer, and ledger_reviewed_at stay unset until reviewer approval.", "counts_as_completion": False, "blocking_condition": "Raw prompts, outputs, transcripts, credentials, or private content must not be included.", }, @@ -353,7 +353,7 @@ def build_handoff_steps( "label": "Review submission queue", "status": "pending", "command": commands["review_submission"], - "completion_signal": "world_class_submission_review shows ready-for-ledger-review before ledger_reviewer_approved is set.", + "completion_signal": "world_class_submission_review shows ready-for-ledger-review before reviewer identity, timestamp, and approval are set.", "counts_as_completion": False, "blocking_condition": "Reviewer queue output is advisory and cannot accept evidence.", }, diff --git a/scripts/render_world_class_evidence_ledger.py b/scripts/render_world_class_evidence_ledger.py index 04c887a..fcf0df5 100644 --- a/scripts/render_world_class_evidence_ledger.py +++ b/scripts/render_world_class_evidence_ledger.py @@ -126,11 +126,13 @@ def submission_state(skill_dir: Path, task: dict[str, Any], submissions_dir: Pat return { "status": load_status, "path": rel_path(path, skill_dir), - "artifact_ref_count": 0, - "attested_real_evidence": False, - "privacy_contract_satisfied": False, - "ledger_reviewer_approved": False, - "ledger_counts_as_completion": False, + "artifact_ref_count": 0, + "attested_real_evidence": False, + "privacy_contract_satisfied": False, + "ledger_reviewer_approved": False, + "ledger_reviewer": "", + "ledger_reviewed_at": "", + "ledger_counts_as_completion": False, } validation = validate_payload(payload, task, path=path, root=skill_dir, template_expected=False) refs = payload.get("artifact_refs", []) @@ -149,6 +151,8 @@ def submission_state(skill_dir: Path, task: dict[str, Any], submissions_dir: Pat "reviewer_or_operator_identity_present": attestation.get("reviewer_or_operator_identity_present") is True, "privacy_contract_satisfied": attestation.get("privacy_contract_satisfied") is True, "ledger_reviewer_approved": attestation.get("ledger_reviewer_approved") is True, + "ledger_reviewer": str(attestation.get("ledger_reviewer", "")).strip(), + "ledger_reviewed_at": str(attestation.get("ledger_reviewed_at", "")).strip(), "errors": validation.get("errors", []), "ledger_counts_as_completion": False, } diff --git a/scripts/world_class_evidence_contract.py b/scripts/world_class_evidence_contract.py index a0149b0..1f271d9 100644 --- a/scripts/world_class_evidence_contract.py +++ b/scripts/world_class_evidence_contract.py @@ -676,6 +676,19 @@ def validate_payload( if not template_expected: for key in REQUIRED_ATTESTATION_TRUE: add_error(errors, attestation.get(key) is True, f"attestation.{key} must be true for a real submission") + ledger_reviewer = str(attestation.get("ledger_reviewer", "")).strip() + submitted_by = str(payload.get("submitted_by", "")).strip() + require_real_text(errors, ledger_reviewer, "attestation.ledger_reviewer") + add_error( + errors, + bool(SUBMITTED_AT_RE.match(str(attestation.get("ledger_reviewed_at", "")).strip())), + "attestation.ledger_reviewed_at must use YYYY-MM-DD or YYYY-MM-DDTHH:MM:SSZ", + ) + add_error( + errors, + bool(ledger_reviewer and submitted_by and ledger_reviewer.casefold() != submitted_by.casefold()), + "attestation.ledger_reviewer must be different from submitted_by", + ) validate_real_artifact_payloads(payload, errors, root, template_expected) return { "path": rel_path(path, root), diff --git a/scripts/world_class_submission_kit_rendering.py b/scripts/world_class_submission_kit_rendering.py index 8491f07..1ad4ea3 100644 --- a/scripts/world_class_submission_kit_rendering.py +++ b/scripts/world_class_submission_kit_rendering.py @@ -25,7 +25,7 @@ def render_readme(report: dict[str, Any]) -> str: "2. Edit the matching JSON draft with only aggregate artifact references and provenance metadata.", "3. Set `template_only` to `false` only after real evidence exists.", "4. Set attestation booleans truthfully; do not include credentials, raw prompts, raw outputs, transcripts, notes, or private user content.", - "5. Validate the packet before asking the ledger reviewer to set `attestation.ledger_reviewer_approved` truthfully.", + "5. Validate the packet before asking the ledger reviewer to set `attestation.ledger_reviewer`, `attestation.ledger_reviewed_at`, and `attestation.ledger_reviewer_approved` truthfully.", "6. Optional artifact prefill only inserts SHA-256 digests for current local aggregate artifacts; it does not mark a draft as real evidence.", "", "## Commands", diff --git a/tests/verify_world_class_evidence_intake.py b/tests/verify_world_class_evidence_intake.py index eb62ea6..5e0af4e 100644 --- a/tests/verify_world_class_evidence_intake.py +++ b/tests/verify_world_class_evidence_intake.py @@ -87,6 +87,8 @@ def provider_submission(*, valid: bool, artifact_path: str = "reports/output_exe "artifact_refs_reviewed": valid, "privacy_contract_satisfied": valid, "ledger_reviewer_approved": valid, + "ledger_reviewer": "Yao ledger reviewer" if valid else "", + "ledger_reviewed_at": "2026-06-14" if valid else "", }, } @@ -138,6 +140,8 @@ def external_submission( "artifact_refs_reviewed": True, "privacy_contract_satisfied": True, "ledger_reviewer_approved": True, + "ledger_reviewer": "Yao ledger reviewer", + "ledger_reviewed_at": "2026-06-14", }, } @@ -372,6 +376,8 @@ def human_submission(skill_root: Path, *, reviewer: str = "Yao QA") -> dict: "artifact_refs_reviewed": True, "privacy_contract_satisfied": True, "ledger_reviewer_approved": True, + "ledger_reviewer": "Yao ledger reviewer", + "ledger_reviewed_at": "2026-06-14", }, } diff --git a/tests/verify_world_class_evidence_ledger.py b/tests/verify_world_class_evidence_ledger.py index 690d6e8..2392cd6 100644 --- a/tests/verify_world_class_evidence_ledger.py +++ b/tests/verify_world_class_evidence_ledger.py @@ -61,6 +61,8 @@ def provider_submission(artifact_root: Path = ROOT, artifact_path: str = "report "artifact_refs_reviewed": True, "privacy_contract_satisfied": True, "ledger_reviewer_approved": True, + "ledger_reviewer": "Yao ledger reviewer", + "ledger_reviewed_at": "2026-06-13", }, } @@ -386,6 +388,82 @@ def main() -> None: for error in unapproved_provider["submission_state"]["errors"] ), unapproved_provider + missing_reviewer_submissions = TMP / "missing_reviewer_submissions" + missing_reviewer_submissions.mkdir() + missing_reviewer_submission = provider_submission(accepted_source_skill) + missing_reviewer_submission["attestation"]["ledger_reviewer"] = "" + (missing_reviewer_submissions / "provider-holdout.json").write_text( + json.dumps(missing_reviewer_submission, ensure_ascii=False, indent=2) + "\n", + encoding="utf-8", + ) + missing_reviewer_proc = subprocess.run( + [ + sys.executable, + str(SCRIPT), + str(accepted_source_skill), + "--output-json", + str(TMP / "missing_reviewer_provider_ledger.json"), + "--output-md", + str(TMP / "missing_reviewer_provider_ledger.md"), + "--submissions-dir", + str(missing_reviewer_submissions), + "--generated-at", + "2026-06-13", + ], + cwd=ROOT, + capture_output=True, + text=True, + check=True, + ) + missing_reviewer_payload = json.loads(missing_reviewer_proc.stdout) + missing_reviewer_provider = { + entry["key"]: entry for entry in missing_reviewer_payload["entries"] + }["provider-holdout"] + assert missing_reviewer_provider["status"] == "pending", missing_reviewer_provider + assert missing_reviewer_provider["submission_state"]["status"] == "invalid-contract", missing_reviewer_provider + assert any( + "attestation.ledger_reviewer is required" in error + for error in missing_reviewer_provider["submission_state"]["errors"] + ), missing_reviewer_provider + + self_approved_submissions = TMP / "self_approved_submissions" + self_approved_submissions.mkdir() + self_approved_submission = provider_submission(accepted_source_skill) + self_approved_submission["attestation"]["ledger_reviewer"] = self_approved_submission["submitted_by"] + (self_approved_submissions / "provider-holdout.json").write_text( + json.dumps(self_approved_submission, ensure_ascii=False, indent=2) + "\n", + encoding="utf-8", + ) + self_approved_proc = subprocess.run( + [ + sys.executable, + str(SCRIPT), + str(accepted_source_skill), + "--output-json", + str(TMP / "self_approved_provider_ledger.json"), + "--output-md", + str(TMP / "self_approved_provider_ledger.md"), + "--submissions-dir", + str(self_approved_submissions), + "--generated-at", + "2026-06-13", + ], + cwd=ROOT, + capture_output=True, + text=True, + check=True, + ) + self_approved_payload = json.loads(self_approved_proc.stdout) + self_approved_provider = { + entry["key"]: entry for entry in self_approved_payload["entries"] + }["provider-holdout"] + assert self_approved_provider["status"] == "pending", self_approved_provider + assert self_approved_provider["submission_state"]["status"] == "invalid-contract", self_approved_provider + assert any( + "attestation.ledger_reviewer must be different from submitted_by" in error + for error in self_approved_provider["submission_state"]["errors"] + ), self_approved_provider + accepted_submissions = TMP / "accepted_submissions" accepted_submissions.mkdir() (accepted_submissions / "provider-holdout.json").write_text( diff --git a/tests/verify_world_class_operator_runbook.py b/tests/verify_world_class_operator_runbook.py index beec0e3..b122baa 100644 --- a/tests/verify_world_class_operator_runbook.py +++ b/tests/verify_world_class_operator_runbook.py @@ -59,6 +59,8 @@ def provider_submission() -> dict: "artifact_refs_reviewed": True, "privacy_contract_satisfied": True, "ledger_reviewer_approved": True, + "ledger_reviewer": "Yao ledger reviewer", + "ledger_reviewed_at": "2026-06-14", }, } diff --git a/tests/verify_world_class_submission_kit.py b/tests/verify_world_class_submission_kit.py index fd765fb..cda5ea4 100644 --- a/tests/verify_world_class_submission_kit.py +++ b/tests/verify_world_class_submission_kit.py @@ -163,6 +163,9 @@ def main() -> None: kit_draft = json.loads((kit_dir / "provider-holdout.json").read_text(encoding="utf-8")) assert kit_draft["template_only"] is True, kit_draft assert kit_draft["attestation"]["real_external_or_human_evidence"] is False, kit_draft + assert kit_draft["attestation"]["ledger_reviewer_approved"] is False, kit_draft + assert kit_draft["attestation"]["ledger_reviewer"] == "", kit_draft + assert kit_draft["attestation"]["ledger_reviewed_at"] == "", kit_draft assert "sha256" not in kit_draft["artifact_refs"][0], kit_draft assert kit_draft["provenance"]["run_command"] == ( "python3 scripts/yao.py output-exec --provider-runner openai --timeout-seconds 60" @@ -190,6 +193,7 @@ def main() -> None: assert "Evidence Matrix" in kit_readme, kit_readme assert "Operator Handoff" in kit_readme, kit_readme assert "Handoff rows are procedural" in kit_readme, kit_readme + assert "ledger_reviewed_at" in kit_readme, kit_readme assert "`review-submission`" in kit_readme, kit_readme assert "Submission refs" in kit_readme, kit_readme assert "Supporting assets" in kit_readme, kit_readme @@ -249,6 +253,7 @@ def main() -> None: prefilled_draft = json.loads((prefilled_kit_dir / "provider-holdout.json").read_text(encoding="utf-8")) assert prefilled_draft["template_only"] is True, prefilled_draft assert prefilled_draft["attestation"]["real_external_or_human_evidence"] is False, prefilled_draft + assert prefilled_draft["attestation"]["ledger_reviewer_approved"] is False, prefilled_draft assert len(prefilled_draft["artifact_refs"][0]["sha256"]) == 64, prefilled_draft assert prefilled_draft["artifact_refs"][0]["contains_raw_content"] is False, prefilled_draft prefilled_readme = (prefilled_kit_dir / "README.md").read_text(encoding="utf-8") diff --git a/tests/verify_world_class_submission_review.py b/tests/verify_world_class_submission_review.py index 0e2ecce..f8240f3 100644 --- a/tests/verify_world_class_submission_review.py +++ b/tests/verify_world_class_submission_review.py @@ -61,6 +61,8 @@ def provider_submission(*, valid: bool = True) -> dict: "artifact_refs_reviewed": valid, "privacy_contract_satisfied": valid, "ledger_reviewer_approved": valid, + "ledger_reviewer": "Yao ledger reviewer" if valid else "", + "ledger_reviewed_at": "2026-06-14" if valid else "", }, }