psyclaw 0.27.22 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -5
- package/dist/apps/panel/index.html +2 -2
- package/dist/src/adapters/pi/extension.js +225 -92
- package/dist/src/adapters/pi/extension.js.map +1 -1
- package/dist/src/agents/import.js +44 -32
- package/dist/src/agents/import.js.map +1 -1
- package/dist/src/analysis/hooks.d.ts +1 -0
- package/dist/src/analysis/hooks.js +20 -1
- package/dist/src/analysis/hooks.js.map +1 -1
- package/dist/src/ars/bridge.d.ts +20 -0
- package/dist/src/ars/bridge.js +132 -0
- package/dist/src/ars/bridge.js.map +1 -0
- package/dist/src/ars/contracts.d.ts +55 -0
- package/dist/src/ars/contracts.js +2 -0
- package/dist/src/ars/contracts.js.map +1 -0
- package/dist/src/ars/panel-plan.d.ts +4 -0
- package/dist/src/ars/panel-plan.js +11 -0
- package/dist/src/ars/panel-plan.js.map +1 -0
- package/dist/src/ars/pi-panel-executor.d.ts +30 -0
- package/dist/src/ars/pi-panel-executor.js +140 -0
- package/dist/src/ars/pi-panel-executor.js.map +1 -0
- package/dist/src/ars/profile.d.ts +36 -0
- package/dist/src/ars/profile.js +119 -0
- package/dist/src/ars/profile.js.map +1 -0
- package/dist/src/ars/re-review.d.ts +22 -0
- package/dist/src/ars/re-review.js +172 -0
- package/dist/src/ars/re-review.js.map +1 -0
- package/dist/src/branding.d.ts +2 -4
- package/dist/src/branding.js +3 -5
- package/dist/src/branding.js.map +1 -1
- package/dist/src/bundled-tools.d.ts +3 -0
- package/dist/src/bundled-tools.js +21 -0
- package/dist/src/bundled-tools.js.map +1 -0
- package/dist/src/chat.js +6 -5
- package/dist/src/chat.js.map +1 -1
- package/dist/src/creation/contracts.d.ts +38 -0
- package/dist/src/creation/contracts.js +2 -0
- package/dist/src/creation/contracts.js.map +1 -0
- package/dist/src/creation/service.d.ts +7 -0
- package/dist/src/creation/service.js +196 -0
- package/dist/src/creation/service.js.map +1 -0
- package/dist/src/index.d.ts +10 -0
- package/dist/src/index.js +10 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/install/installer.js +32 -10
- package/dist/src/install/installer.js.map +1 -1
- package/dist/src/orchestration/personas.d.ts +15 -0
- package/dist/src/orchestration/personas.js +51 -0
- package/dist/src/orchestration/personas.js.map +1 -0
- package/dist/src/orchestration/pi-executor.d.ts +1 -0
- package/dist/src/orchestration/pi-executor.js +1 -1
- package/dist/src/orchestration/pi-executor.js.map +1 -1
- package/dist/src/panel/extension.js +29 -8
- package/dist/src/panel/extension.js.map +1 -1
- package/dist/src/panel/server.js +14 -5
- package/dist/src/panel/server.js.map +1 -1
- package/dist/src/project/paths.d.ts +3 -0
- package/dist/src/project/paths.js +7 -0
- package/dist/src/project/paths.js.map +1 -1
- package/dist/src/rules/user-rules.d.ts +8 -0
- package/dist/src/rules/user-rules.js +36 -0
- package/dist/src/rules/user-rules.js.map +1 -0
- package/dist/src/skills/contracts.d.ts +4 -4
- package/dist/src/skills/recommended.js +1 -1
- package/dist/src/skills/registry.js +49 -28
- package/dist/src/skills/registry.js.map +1 -1
- package/dist/src/style/cli-ui.js +0 -1
- package/dist/src/style/cli-ui.js.map +1 -1
- package/package.json +14 -3
- package/scripts/rebrand-pi.mjs +6 -0
- package/skills/recommended/catalog.json +2 -11
- package/vendor/ars/.claude/CLAUDE.md +371 -0
- package/vendor/ars/.command-invariants.toml +24 -0
- package/vendor/ars/CITATION.cff +35 -0
- package/vendor/ars/LICENSE +417 -0
- package/vendor/ars/MODE_REGISTRY.md +76 -0
- package/vendor/ars/NOTICE.md +26 -0
- package/vendor/ars/POSITIONING.md +99 -0
- package/vendor/ars/PSYCLAW_SOURCE.json +10 -0
- package/vendor/ars/README.md +751 -0
- package/vendor/ars/SECURITY.md +52 -0
- package/vendor/ars/THIRD_PARTY.md +70 -0
- package/vendor/ars/academic-paper/SKILL.md +542 -0
- package/vendor/ars/academic-paper/agents/abstract_bilingual_agent.md +171 -0
- package/vendor/ars/academic-paper/agents/argument_builder_agent.md +276 -0
- package/vendor/ars/academic-paper/agents/citation_compliance_agent.md +422 -0
- package/vendor/ars/academic-paper/agents/draft_writer_agent.md +656 -0
- package/vendor/ars/academic-paper/agents/formatter_agent.md +999 -0
- package/vendor/ars/academic-paper/agents/intake_agent.md +393 -0
- package/vendor/ars/academic-paper/agents/literature_strategist_agent.md +626 -0
- package/vendor/ars/academic-paper/agents/peer_reviewer_agent.md +516 -0
- package/vendor/ars/academic-paper/agents/revision_coach_agent.md +334 -0
- package/vendor/ars/academic-paper/agents/socratic_mentor_agent.md +527 -0
- package/vendor/ars/academic-paper/agents/structure_architect_agent.md +401 -0
- package/vendor/ars/academic-paper/agents/visualization_agent.md +441 -0
- package/vendor/ars/academic-paper/examples/chinese_paper_example.md +278 -0
- package/vendor/ars/academic-paper/examples/clinical_citation_verification_checklist.md +95 -0
- package/vendor/ars/academic-paper/examples/clinical_epistemic_status_example.md +100 -0
- package/vendor/ars/academic-paper/examples/commitment_ledger_example.md +147 -0
- package/vendor/ars/academic-paper/examples/imrad_hei_example.md +234 -0
- package/vendor/ars/academic-paper/examples/literature_review_example.md +260 -0
- package/vendor/ars/academic-paper/examples/plan_mode_guided_writing.md +600 -0
- package/vendor/ars/academic-paper/examples/revision_mode_example.md +344 -0
- package/vendor/ars/academic-paper/examples/revision_recovery_example.md +506 -0
- package/vendor/ars/academic-paper/examples/version_family_reconciliation_example.md +89 -0
- package/vendor/ars/academic-paper/references/abstract_writing_guide.md +169 -0
- package/vendor/ars/academic-paper/references/academic_writing_style.md +188 -0
- package/vendor/ars/academic-paper/references/anti_leakage_protocol.md +83 -0
- package/vendor/ars/academic-paper/references/apa7_chinese_citation_guide.md +364 -0
- package/vendor/ars/academic-paper/references/apa7_extended_guide.md +198 -0
- package/vendor/ars/academic-paper/references/changelog.md +11 -0
- package/vendor/ars/academic-paper/references/citation_format_switcher.md +228 -0
- package/vendor/ars/academic-paper/references/committee_correspondence_protocol.md +158 -0
- package/vendor/ars/academic-paper/references/credit_authorship_guide.md +308 -0
- package/vendor/ars/academic-paper/references/disclosure_mode_protocol.md +478 -0
- package/vendor/ars/academic-paper/references/domain_evidence_profiles.md +38 -0
- package/vendor/ars/academic-paper/references/failure_paths.md +349 -0
- package/vendor/ars/academic-paper/references/funding_statement_guide.md +319 -0
- package/vendor/ars/academic-paper/references/hei_domain_glossary.md +169 -0
- package/vendor/ars/academic-paper/references/intro_title_rhetoric_guide.md +114 -0
- package/vendor/ars/academic-paper/references/journal_submission_guide.md +249 -0
- package/vendor/ars/academic-paper/references/latex_template_reference.md +378 -0
- package/vendor/ars/academic-paper/references/mode_selection_guide.md +378 -0
- package/vendor/ars/academic-paper/references/paper_structure_patterns.md +330 -0
- package/vendor/ars/academic-paper/references/plan_mode_protocol.md +112 -0
- package/vendor/ars/academic-paper/references/policy_anchor_disclosure_protocol.md +200 -0
- package/vendor/ars/academic-paper/references/policy_anchor_table.md +157 -0
- package/vendor/ars/academic-paper/references/revision_patch_protocol.md +173 -0
- package/vendor/ars/academic-paper/references/statistical_visualization_standards.md +750 -0
- package/vendor/ars/academic-paper/references/venue_disclosure_policies.md +259 -0
- package/vendor/ars/academic-paper/references/vlm_figure_verification.md +126 -0
- package/vendor/ars/academic-paper/references/workflow_phase_details.md +135 -0
- package/vendor/ars/academic-paper/references/writing_judgment_framework.md +59 -0
- package/vendor/ars/academic-paper/references/writing_quality_check.md +173 -0
- package/vendor/ars/academic-paper/templates/bilingual_abstract_template.md +78 -0
- package/vendor/ars/academic-paper/templates/case_study_template.md +129 -0
- package/vendor/ars/academic-paper/templates/conference_paper_template.md +108 -0
- package/vendor/ars/academic-paper/templates/credit_statement_template.md +132 -0
- package/vendor/ars/academic-paper/templates/funding_statement_template.md +290 -0
- package/vendor/ars/academic-paper/templates/imrad_template.md +183 -0
- package/vendor/ars/academic-paper/templates/latex_article_template.tex +199 -0
- package/vendor/ars/academic-paper/templates/literature_review_template.md +135 -0
- package/vendor/ars/academic-paper/templates/policy_brief_template.md +139 -0
- package/vendor/ars/academic-paper/templates/revision_tracking_template.md +199 -0
- package/vendor/ars/academic-paper/templates/theoretical_paper_template.md +119 -0
- package/vendor/ars/academic-paper-reviewer/SKILL.md +491 -0
- package/vendor/ars/academic-paper-reviewer/agents/devils_advocate_reviewer_agent.md +443 -0
- package/vendor/ars/academic-paper-reviewer/agents/domain_reviewer_agent.md +412 -0
- package/vendor/ars/academic-paper-reviewer/agents/editorial_synthesizer_agent.md +478 -0
- package/vendor/ars/academic-paper-reviewer/agents/eic_agent.md +339 -0
- package/vendor/ars/academic-paper-reviewer/agents/field_analyst_agent.md +221 -0
- package/vendor/ars/academic-paper-reviewer/agents/methodology_reviewer_agent.md +449 -0
- package/vendor/ars/academic-paper-reviewer/agents/perspective_reviewer_agent.md +427 -0
- package/vendor/ars/academic-paper-reviewer/examples/hei_paper_review_example.md +391 -0
- package/vendor/ars/academic-paper-reviewer/examples/interdisciplinary_review_example.md +299 -0
- package/vendor/ars/academic-paper-reviewer/examples/subclaim_decomposition_example.md +80 -0
- package/vendor/ars/academic-paper-reviewer/references/calibration_mode_protocol.md +256 -0
- package/vendor/ars/academic-paper-reviewer/references/changelog.md +10 -0
- package/vendor/ars/academic-paper-reviewer/references/editorial_decision_standards.md +236 -0
- package/vendor/ars/academic-paper-reviewer/references/guided_mode_protocol.md +34 -0
- package/vendor/ars/academic-paper-reviewer/references/integration_guide.md +15 -0
- package/vendor/ars/academic-paper-reviewer/references/quality_rubrics.md +84 -0
- package/vendor/ars/academic-paper-reviewer/references/re_review_mode_protocol.md +340 -0
- package/vendor/ars/academic-paper-reviewer/references/review_criteria_framework.md +98 -0
- package/vendor/ars/academic-paper-reviewer/references/review_panel_provenance_protocol.md +197 -0
- package/vendor/ars/academic-paper-reviewer/references/review_quality_thinking.md +58 -0
- package/vendor/ars/academic-paper-reviewer/references/reviewer_sprint_prompt_source.md +324 -0
- package/vendor/ars/academic-paper-reviewer/references/sprint_contract_protocol.md +296 -0
- package/vendor/ars/academic-paper-reviewer/references/statistical_reporting_standards.md +505 -0
- package/vendor/ars/academic-paper-reviewer/references/top_journals_by_field.md +206 -0
- package/vendor/ars/academic-paper-reviewer/templates/editorial_decision_template.md +235 -0
- package/vendor/ars/academic-paper-reviewer/templates/peer_review_report_template.md +305 -0
- package/vendor/ars/academic-paper-reviewer/templates/revision_response_template.md +248 -0
- package/vendor/ars/academic-pipeline/SKILL.md +736 -0
- package/vendor/ars/academic-pipeline/agents/claim_ref_alignment_audit_agent.md +382 -0
- package/vendor/ars/academic-pipeline/agents/collaboration_depth_agent.md +164 -0
- package/vendor/ars/academic-pipeline/agents/integrity_verification_agent.md +870 -0
- package/vendor/ars/academic-pipeline/agents/pipeline_orchestrator_agent.md +1379 -0
- package/vendor/ars/academic-pipeline/agents/state_tracker_agent.md +622 -0
- package/vendor/ars/academic-pipeline/examples/full_pipeline_example.md +482 -0
- package/vendor/ars/academic-pipeline/examples/integrity_failure_recovery.md +389 -0
- package/vendor/ars/academic-pipeline/examples/mid_entry_example.md +414 -0
- package/vendor/ars/academic-pipeline/references/adapters/.gitkeep +0 -0
- package/vendor/ars/academic-pipeline/references/adapters/overview.md +153 -0
- package/vendor/ars/academic-pipeline/references/ai_research_failure_modes.md +185 -0
- package/vendor/ars/academic-pipeline/references/changelog.md +14 -0
- package/vendor/ars/academic-pipeline/references/claim_audit_calibration_protocol.md +175 -0
- package/vendor/ars/academic-pipeline/references/claim_verification_protocol.md +282 -0
- package/vendor/ars/academic-pipeline/references/external_review_protocol.md +131 -0
- package/vendor/ars/academic-pipeline/references/integrity_review_protocol.md +110 -0
- package/vendor/ars/academic-pipeline/references/literature_corpus_consumers.md +193 -0
- package/vendor/ars/academic-pipeline/references/mode_advisor.md +135 -0
- package/vendor/ars/academic-pipeline/references/passport_as_reset_boundary.md +132 -0
- package/vendor/ars/academic-pipeline/references/pipeline_state_machine.md +405 -0
- package/vendor/ars/academic-pipeline/references/plagiarism_detection_protocol.md +239 -0
- package/vendor/ars/academic-pipeline/references/process_summary_protocol.md +209 -0
- package/vendor/ars/academic-pipeline/references/progress_dashboard_template.md +38 -0
- package/vendor/ars/academic-pipeline/references/reinforcement_content.md +15 -0
- package/vendor/ars/academic-pipeline/references/reproducibility_audit.md +55 -0
- package/vendor/ars/academic-pipeline/references/score_trajectory_protocol.md +78 -0
- package/vendor/ars/academic-pipeline/references/team_collaboration_protocol.md +261 -0
- package/vendor/ars/academic-pipeline/references/two_stage_review_protocol.md +27 -0
- package/vendor/ars/academic-pipeline/templates/pipeline_status_template.md +146 -0
- package/vendor/ars/agents/report_compiler_agent.md +341 -0
- package/vendor/ars/agents/research_architect_agent.md +298 -0
- package/vendor/ars/agents/synthesis_agent.md +356 -0
- package/vendor/ars/commands/ars-3w.md +10 -0
- package/vendor/ars/commands/ars-abstract.md +10 -0
- package/vendor/ars/commands/ars-cache-invalidate.md +20 -0
- package/vendor/ars/commands/ars-citation-check.md +10 -0
- package/vendor/ars/commands/ars-disclosure.md +10 -0
- package/vendor/ars/commands/ars-format-convert.md +10 -0
- package/vendor/ars/commands/ars-full.md +9 -0
- package/vendor/ars/commands/ars-lit-review.md +12 -0
- package/vendor/ars/commands/ars-mark-read.md +18 -0
- package/vendor/ars/commands/ars-outline.md +10 -0
- package/vendor/ars/commands/ars-plan.md +10 -0
- package/vendor/ars/commands/ars-rebuttal-audit.md +12 -0
- package/vendor/ars/commands/ars-reviewer.md +9 -0
- package/vendor/ars/commands/ars-revision-coach.md +9 -0
- package/vendor/ars/commands/ars-revision.md +10 -0
- package/vendor/ars/commands/ars-unmark-read.md +16 -0
- package/vendor/ars/deep-research/SKILL.md +600 -0
- package/vendor/ars/deep-research/agents/bibliography_agent.md +473 -0
- package/vendor/ars/deep-research/agents/devils_advocate_agent.md +192 -0
- package/vendor/ars/deep-research/agents/editor_in_chief_agent.md +167 -0
- package/vendor/ars/deep-research/agents/ethics_review_agent.md +267 -0
- package/vendor/ars/deep-research/agents/meta_analysis_agent.md +325 -0
- package/vendor/ars/deep-research/agents/monitoring_agent.md +209 -0
- package/vendor/ars/deep-research/agents/report_compiler_agent.md +341 -0
- package/vendor/ars/deep-research/agents/research_architect_agent.md +298 -0
- package/vendor/ars/deep-research/agents/research_question_agent.md +216 -0
- package/vendor/ars/deep-research/agents/risk_of_bias_agent.md +231 -0
- package/vendor/ars/deep-research/agents/socratic_mentor_agent.md +764 -0
- package/vendor/ars/deep-research/agents/source_verification_agent.md +219 -0
- package/vendor/ars/deep-research/agents/synthesis_agent.md +356 -0
- package/vendor/ars/deep-research/agents/timeline_extraction_agent.md +99 -0
- package/vendor/ars/deep-research/examples/exploratory_research.md +157 -0
- package/vendor/ars/deep-research/examples/fact_check_mode.md +173 -0
- package/vendor/ars/deep-research/examples/handoff_to_paper.md +318 -0
- package/vendor/ars/deep-research/examples/idea_diversity_coverage_gap_advisory.md +64 -0
- package/vendor/ars/deep-research/examples/policy_analysis.md +161 -0
- package/vendor/ars/deep-research/examples/review_mode.md +253 -0
- package/vendor/ars/deep-research/examples/socratic_guided_research.md +331 -0
- package/vendor/ars/deep-research/examples/systematic_review.md +133 -0
- package/vendor/ars/deep-research/references/apa7_style_guide.md +162 -0
- package/vendor/ars/deep-research/references/argumentation_reasoning_framework.md +68 -0
- package/vendor/ars/deep-research/references/arxiv_api_protocol.md +76 -0
- package/vendor/ars/deep-research/references/changelog.md +22 -0
- package/vendor/ars/deep-research/references/chinese_literature_api_protocol.md +317 -0
- package/vendor/ars/deep-research/references/cross_agent_quality_definitions.md +14 -0
- package/vendor/ars/deep-research/references/crossref_api_protocol.md +84 -0
- package/vendor/ars/deep-research/references/equator_reporting_guidelines.md +482 -0
- package/vendor/ars/deep-research/references/ethics_checklist.md +282 -0
- package/vendor/ars/deep-research/references/failure_paths.md +355 -0
- package/vendor/ars/deep-research/references/interdisciplinary_bridges.md +292 -0
- package/vendor/ars/deep-research/references/irb_decision_tree.md +315 -0
- package/vendor/ars/deep-research/references/literature_monitoring_strategies.md +263 -0
- package/vendor/ars/deep-research/references/logical_fallacies.md +192 -0
- package/vendor/ars/deep-research/references/methodology_patterns.md +462 -0
- package/vendor/ars/deep-research/references/mode_selection_guide.md +331 -0
- package/vendor/ars/deep-research/references/openalex_api_protocol.md +82 -0
- package/vendor/ars/deep-research/references/preregistration_guide.md +324 -0
- package/vendor/ars/deep-research/references/semantic_scholar_api_protocol.md +107 -0
- package/vendor/ars/deep-research/references/socratic_mode_protocol.md +99 -0
- package/vendor/ars/deep-research/references/socratic_questioning_framework.md +232 -0
- package/vendor/ars/deep-research/references/source_quality_hierarchy.md +188 -0
- package/vendor/ars/deep-research/references/systematic_review_protocol.md +95 -0
- package/vendor/ars/deep-research/references/systematic_review_toolkit.md +353 -0
- package/vendor/ars/deep-research/templates/evidence_assessment_template.md +127 -0
- package/vendor/ars/deep-research/templates/literature_matrix_template.md +85 -0
- package/vendor/ars/deep-research/templates/preregistration_template.md +318 -0
- package/vendor/ars/deep-research/templates/prisma_protocol_template.md +248 -0
- package/vendor/ars/deep-research/templates/prisma_report_template.md +415 -0
- package/vendor/ars/deep-research/templates/research_brief_template.md +93 -0
- package/vendor/ars/package.json +24 -0
- package/vendor/ars/pi/README.md +161 -0
- package/vendor/ars/pi/package.json +26 -0
- package/vendor/ars/pi/wrapper.js +193 -0
- package/vendor/ars/pi/wrapper.test.mjs +201 -0
- package/vendor/ars/pyproject.toml +2 -0
- package/vendor/ars/requirements-pdf-content-classifier.txt +5 -0
- package/vendor/ars/scripts/_block_parser.py +396 -0
- package/vendor/ars/scripts/_ci_pytest_manifest.toml +661 -0
- package/vendor/ars/scripts/_claim_audit_constants.py +268 -0
- package/vendor/ars/scripts/_e4_evidence.py +110 -0
- package/vendor/ars/scripts/_eval_threshold_gate.py +73 -0
- package/vendor/ars/scripts/_markdown_lint_util.py +224 -0
- package/vendor/ars/scripts/_next_verified_at_ms.py +176 -0
- package/vendor/ars/scripts/_passport_yaml.py +53 -0
- package/vendor/ars/scripts/_skill_lint.py +254 -0
- package/vendor/ars/scripts/_text_similarity.py +141 -0
- package/vendor/ars/scripts/adapters/README.md +89 -0
- package/vendor/ars/scripts/adapters/_common.py +209 -0
- package/vendor/ars/scripts/adapters/examples/folder_scan/expected_passport.yaml +25 -0
- package/vendor/ars/scripts/adapters/examples/folder_scan/expected_rejection_log.yaml +18 -0
- package/vendor/ars/scripts/adapters/examples/folder_scan/input_fixture/Chen2024_AIAssessment.pdf +0 -0
- package/vendor/ars/scripts/adapters/examples/folder_scan/input_fixture/Wang_2023_formative_feedback.pdf +0 -0
- package/vendor/ars/scripts/adapters/examples/folder_scan/input_fixture/paper1.pdf +0 -0
- package/vendor/ars/scripts/adapters/examples/folder_scan/input_fixture//344/270/255/346/226/207/346/252/224/345/220/215_2024.pdf +0 -0
- package/vendor/ars/scripts/adapters/examples/obsidian/expected_passport.yaml +40 -0
- package/vendor/ars/scripts/adapters/examples/obsidian/expected_rejection_log.yaml +13 -0
- package/vendor/ars/scripts/adapters/examples/obsidian/input_fixture/vault/.gitkeep +0 -0
- package/vendor/ars/scripts/adapters/examples/obsidian/input_fixture/vault/.obsidian/app.json +1 -0
- package/vendor/ars/scripts/adapters/examples/obsidian/input_fixture/vault/_templates/tmpl.md +7 -0
- package/vendor/ars/scripts/adapters/examples/obsidian/input_fixture/vault/chen2024ai.md +13 -0
- package/vendor/ars/scripts/adapters/examples/obsidian/input_fixture/vault/invalid.md +1 -0
- package/vendor/ars/scripts/adapters/examples/obsidian/input_fixture/vault/wang2023formative.md +10 -0
- package/vendor/ars/scripts/adapters/examples/zotero/expected_passport.yaml +34 -0
- package/vendor/ars/scripts/adapters/examples/zotero/expected_rejection_log.yaml +34 -0
- package/vendor/ars/scripts/adapters/examples/zotero/input_fixture/.gitkeep +0 -0
- package/vendor/ars/scripts/adapters/examples/zotero/input_fixture/export.json +43 -0
- package/vendor/ars/scripts/adapters/folder_scan.py +214 -0
- package/vendor/ars/scripts/adapters/obsidian.py +336 -0
- package/vendor/ars/scripts/adapters/tests/.gitkeep +0 -0
- package/vendor/ars/scripts/adapters/tests/conftest.py +77 -0
- package/vendor/ars/scripts/adapters/tests/test_check_corpus_consumer_protocol.py +632 -0
- package/vendor/ars/scripts/adapters/tests/test_check_literature_corpus_schema.py +631 -0
- package/vendor/ars/scripts/adapters/tests/test_common.py +365 -0
- package/vendor/ars/scripts/adapters/tests/test_conftest.py +96 -0
- package/vendor/ars/scripts/adapters/tests/test_folder_scan.py +260 -0
- package/vendor/ars/scripts/adapters/tests/test_literature_corpus_entry_schema.py +745 -0
- package/vendor/ars/scripts/adapters/tests/test_obsidian.py +357 -0
- package/vendor/ars/scripts/adapters/tests/test_rejection_log_schema.py +271 -0
- package/vendor/ars/scripts/adapters/tests/test_sync_adapter_docs.py +88 -0
- package/vendor/ars/scripts/adapters/tests/test_zotero.py +454 -0
- package/vendor/ars/scripts/adapters/zotero.py +318 -0
- package/vendor/ars/scripts/adjudication_activity.py +1592 -0
- package/vendor/ars/scripts/announce-ars-loaded.sh +144 -0
- package/vendor/ars/scripts/ars_anchorize_draft.py +170 -0
- package/vendor/ars/scripts/ars_apply_revision_patch.py +912 -0
- package/vendor/ars/scripts/ars_cache_invalidate.py +40 -0
- package/vendor/ars/scripts/ars_mark_read.py +521 -0
- package/vendor/ars/scripts/ars_phase_scope_manifest.json +33 -0
- package/vendor/ars/scripts/ars_update_check.sh +215 -0
- package/vendor/ars/scripts/ars_write_scope_guard.py +506 -0
- package/vendor/ars/scripts/arxiv_client.py +222 -0
- package/vendor/ars/scripts/audit_snapshot.py +572 -0
- package/vendor/ars/scripts/bibliographic_integrity_signals.py +800 -0
- package/vendor/ars/scripts/bootstrap_timeline_yaml.py +146 -0
- package/vendor/ars/scripts/build_claim_standing_candidate_ledger.py +1238 -0
- package/vendor/ars/scripts/build_claim_standing_query_plan.py +643 -0
- package/vendor/ars/scripts/build_content_coverage_advisory.py +1205 -0
- package/vendor/ars/scripts/build_cross_document_consistency_advisory.py +2332 -0
- package/vendor/ars/scripts/build_review_pathway_rule_trace.py +830 -0
- package/vendor/ars/scripts/build_submission_packet_manifest.py +2310 -0
- package/vendor/ars/scripts/check_215_field_norm.py +173 -0
- package/vendor/ars/scripts/check_216_surface_form.py +250 -0
- package/vendor/ars/scripts/check_268_nested_commitment_ledger.py +180 -0
- package/vendor/ars/scripts/check_390_revision_patch_discipline.py +296 -0
- package/vendor/ars/scripts/check_392_citation_verification_intake.py +126 -0
- package/vendor/ars/scripts/check_394_submission_policy.py +178 -0
- package/vendor/ars/scripts/check_439_format_profile.py +307 -0
- package/vendor/ars/scripts/check_619_disclosure_closeout.py +237 -0
- package/vendor/ars/scripts/check_630_codex_subscription_transport.py +456 -0
- package/vendor/ars/scripts/check_669_review_pathway_rule_trace.py +662 -0
- package/vendor/ars/scripts/check_670_revision_roadmap_integration.py +518 -0
- package/vendor/ars/scripts/check_673_adjudication_activity.py +684 -0
- package/vendor/ars/scripts/check_684_review_criteria_binding.py +557 -0
- package/vendor/ars/scripts/check_agents_mirror_sync.py +115 -0
- package/vendor/ars/scripts/check_audit_artifact_consistency.py +2313 -0
- package/vendor/ars/scripts/check_benchmark_report.py +79 -0
- package/vendor/ars/scripts/check_bibliographic_integrity_signals.py +831 -0
- package/vendor/ars/scripts/check_calibration_tiers.py +235 -0
- package/vendor/ars/scripts/check_changelog_covers_merges.py +289 -0
- package/vendor/ars/scripts/check_ci_pytest_manifest.py +204 -0
- package/vendor/ars/scripts/check_claim_audit_consistency.py +1664 -0
- package/vendor/ars/scripts/check_claim_standing_candidate_ledger_integration.py +500 -0
- package/vendor/ars/scripts/check_claim_standing_freshness.py +253 -0
- package/vendor/ars/scripts/check_claim_standing_transmissions.py +449 -0
- package/vendor/ars/scripts/check_collaboration_depth_rubric.py +180 -0
- package/vendor/ars/scripts/check_command_frontmatter_name.py +116 -0
- package/vendor/ars/scripts/check_committee_correspondence.py +333 -0
- package/vendor/ars/scripts/check_compliance_report.py +108 -0
- package/vendor/ars/scripts/check_content_coverage_advisory_integration.py +796 -0
- package/vendor/ars/scripts/check_control_availability.py +172 -0
- package/vendor/ars/scripts/check_corpus_consumer_protocol.py +404 -0
- package/vendor/ars/scripts/check_cross_document_consistency_advisory_integration.py +1191 -0
- package/vendor/ars/scripts/check_cross_model_handoff_contract.py +234 -0
- package/vendor/ars/scripts/check_cross_model_verification_sync.py +261 -0
- package/vendor/ars/scripts/check_data_access_level.py +131 -0
- package/vendor/ars/scripts/check_data_flows.py +252 -0
- package/vendor/ars/scripts/check_decision_contract.py +464 -0
- package/vendor/ars/scripts/check_degradation_registry.py +326 -0
- package/vendor/ars/scripts/check_distribution_surface_claims.py +226 -0
- package/vendor/ars/scripts/check_domain_evidence_profile.py +538 -0
- package/vendor/ars/scripts/check_e4_promotion.py +195 -0
- package/vendor/ars/scripts/check_evals_gold_set.py +279 -0
- package/vendor/ars/scripts/check_evidence_row_integration.py +396 -0
- package/vendor/ars/scripts/check_experiment_provenance.py +117 -0
- package/vendor/ars/scripts/check_field_norm_severity.py +144 -0
- package/vendor/ars/scripts/check_firm_rules_sync.py +375 -0
- package/vendor/ars/scripts/check_heldout_measurement_report.py +1179 -0
- package/vendor/ars/scripts/check_human_subjects_output_contract.py +139 -0
- package/vendor/ars/scripts/check_human_subjects_reference_migration.py +844 -0
- package/vendor/ars/scripts/check_indirect_prompt_injection_no_call.py +328 -0
- package/vendor/ars/scripts/check_instruction_data_boundary.py +236 -0
- package/vendor/ars/scripts/check_judge_prompt_version.py +125 -0
- package/vendor/ars/scripts/check_literature_corpus_schema.py +402 -0
- package/vendor/ars/scripts/check_model_tiering.py +223 -0
- package/vendor/ars/scripts/check_panel_synthesis.py +1331 -0
- package/vendor/ars/scripts/check_passport_reset_contract.py +214 -0
- package/vendor/ars/scripts/check_pattern_eval_manifest.py +422 -0
- package/vendor/ars/scripts/check_persuasion_invariance_fixtures.py +637 -0
- package/vendor/ars/scripts/check_phase_conformance.py +2180 -0
- package/vendor/ars/scripts/check_pipeline_boundary_semantics.py +600 -0
- package/vendor/ars/scripts/check_pipeline_integrity.py +340 -0
- package/vendor/ars/scripts/check_policy_anchor_protocol.py +159 -0
- package/vendor/ars/scripts/check_policy_anchor_table.py +286 -0
- package/vendor/ars/scripts/check_preprint_venues_consistency.py +123 -0
- package/vendor/ars/scripts/check_prisma_trAIce_freshness.py +84 -0
- package/vendor/ars/scripts/check_promotion_bakeoff_preregistration.py +1303 -0
- package/vendor/ars/scripts/check_ranking_lift.py +323 -0
- package/vendor/ars/scripts/check_re_review_synthesis.py +2719 -0
- package/vendor/ars/scripts/check_receipt_enum_sync.py +203 -0
- package/vendor/ars/scripts/check_repro_lock.py +85 -0
- package/vendor/ars/scripts/check_review_pathway_output.py +276 -0
- package/vendor/ars/scripts/check_reviewer_data_fences.py +224 -0
- package/vendor/ars/scripts/check_reviewer_finding_contract.py +783 -0
- package/vendor/ars/scripts/check_reviewer_role_label.py +447 -0
- package/vendor/ars/scripts/check_reviewer_scoring_honesty.py +292 -0
- package/vendor/ars/scripts/check_reviewer_sprint_prompt_sync.py +409 -0
- package/vendor/ars/scripts/check_revision_claim_drift_suite_v2.py +1622 -0
- package/vendor/ars/scripts/check_revision_token_conservation.py +263 -0
- package/vendor/ars/scripts/check_risk_register.py +280 -0
- package/vendor/ars/scripts/check_role_scoped_contract.py +702 -0
- package/vendor/ars/scripts/check_rq_framing_patterns.py +184 -0
- package/vendor/ars/scripts/check_rubric_weight_consistency.py +32 -0
- package/vendor/ars/scripts/check_seeded_defect_fixtures.py +425 -0
- package/vendor/ars/scripts/check_setup_cross_model_parity.py +139 -0
- package/vendor/ars/scripts/check_spec_consistency.py +1249 -0
- package/vendor/ars/scripts/check_sprint_contract.py +371 -0
- package/vendor/ars/scripts/check_stage_capability_matrix.py +784 -0
- package/vendor/ars/scripts/check_submission_packet_manifest_integration.py +358 -0
- package/vendor/ars/scripts/check_surface_form_parity.py +445 -0
- package/vendor/ars/scripts/check_task_type.py +22 -0
- package/vendor/ars/scripts/check_tools_allowlist.py +538 -0
- package/vendor/ars/scripts/check_tortured_phrase_screening_integration.py +1974 -0
- package/vendor/ars/scripts/check_v3_10_134_write_scope.py +286 -0
- package/vendor/ars/scripts/check_v3_10_policy.py +656 -0
- package/vendor/ars/scripts/check_v3_6_6_ab_manifest.py +364 -0
- package/vendor/ars/scripts/check_v3_6_7_pattern_protection.py +1366 -0
- package/vendor/ars/scripts/check_v3_6_8_audit_scope_block.py +464 -0
- package/vendor/ars/scripts/check_v3_6_8_cite_provenance_pipeline.py +231 -0
- package/vendor/ars/scripts/check_v3_6_8_frontmatter_trust_schema.py +248 -0
- package/vendor/ars/scripts/check_v3_6_8_mark_read_commands.py +79 -0
- package/vendor/ars/scripts/check_v3_6_8_pattern_protection.py +941 -0
- package/vendor/ars/scripts/check_v3_7_3_three_layer_citation.py +318 -0
- package/vendor/ars/scripts/check_v3_8_annotation_literal_sync.py +228 -0
- package/vendor/ars/scripts/check_v3_9_0_triangulation.py +366 -0
- package/vendor/ars/scripts/check_v3_9_2_phase_boundary.py +270 -0
- package/vendor/ars/scripts/check_v3_9_4_temporal_verification.py +139 -0
- package/vendor/ars/scripts/check_venue_disclosure_policies.py +63 -0
- package/vendor/ars/scripts/check_version_consistency.py +826 -0
- package/vendor/ars/scripts/check_workflow_classification.py +223 -0
- package/vendor/ars/scripts/chinese_literature_client.py +1938 -0
- package/vendor/ars/scripts/citation_verification_summary.py +85 -0
- package/vendor/ars/scripts/claim_audit_calibration.py +517 -0
- package/vendor/ars/scripts/claim_audit_finalizer.py +456 -0
- package/vendor/ars/scripts/claim_audit_pipeline.py +1594 -0
- package/vendor/ars/scripts/claim_registry_coverage.py +493 -0
- package/vendor/ars/scripts/claim_standing_discovery.py +784 -0
- package/vendor/ars/scripts/claim_standing_stance_runner.py +758 -0
- package/vendor/ars/scripts/claim_standing_stance_scorer.py +239 -0
- package/vendor/ars/scripts/claim_strength_drift_disposition.py +666 -0
- package/vendor/ars/scripts/contamination_signals.py +689 -0
- package/vendor/ars/scripts/corpus_consumer_manifest.json +19 -0
- package/vendor/ars/scripts/cross_model_codex_transport.py +1374 -0
- package/vendor/ars/scripts/cross_model_codex_verify.sh +6 -0
- package/vendor/ars/scripts/cross_model_handoff.py +359 -0
- package/vendor/ars/scripts/cross_model_smoke_test.sh +183 -0
- package/vendor/ars/scripts/cross_model_smoke_test_codex.sh +35 -0
- package/vendor/ars/scripts/cross_model_verification/gemini_is_grounded.jq +45 -0
- package/vendor/ars/scripts/cross_model_verification/gemini_sources.jq +45 -0
- package/vendor/ars/scripts/cross_model_verification/normalize_compat_verdict.py +57 -0
- package/vendor/ars/scripts/cross_model_verification/openai_has_completed_web_search.jq +15 -0
- package/vendor/ars/scripts/cross_model_verification/openai_sources.jq +17 -0
- package/vendor/ars/scripts/cross_model_verification/openai_text.jq +11 -0
- package/vendor/ars/scripts/crossref_client.py +225 -0
- package/vendor/ars/scripts/dispatch_e4_panel.py +2731 -0
- package/vendor/ars/scripts/evidence_rows.py +2043 -0
- package/vendor/ars/scripts/fixtures/adjudication_activity/author_stage3.json +32 -0
- package/vendor/ars/scripts/fixtures/adjudication_activity/author_stage3_input.json +27 -0
- package/vendor/ars/scripts/fixtures/adjudication_activity/author_stage3_prime.json +32 -0
- package/vendor/ars/scripts/fixtures/adjudication_activity/author_stage3_prime_input.json +27 -0
- package/vendor/ars/scripts/fixtures/adjudication_activity/compliance_override.json +50 -0
- package/vendor/ars/scripts/fixtures/adjudication_activity/compliance_override_action.json +14 -0
- package/vendor/ars/scripts/fixtures/adjudication_activity/compliance_pass.json +44 -0
- package/vendor/ars/scripts/fixtures/adjudication_activity/explicit_user_request_log.json +26 -0
- package/vendor/ars/scripts/fixtures/adjudication_activity/mandatory_checkpoint_log.json +116 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/README.md +56 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/negative/a1_pass_with_p1/2026-04-30T15-22-04Z-d8f3.audit_artifact_entry.json +24 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/negative/a1_pass_with_p1/2026-04-30T15-22-04Z-d8f3.jsonl +4 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/negative/a1_pass_with_p1/2026-04-30T15-22-04Z-d8f3.meta.json +43 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/negative/a1_pass_with_p1/2026-04-30T15-22-04Z-d8f3.verdict.yaml +19 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/negative/a7_orphan_completion/2026-04-30T15-22-04Z-d8f3.jsonl +3 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/positive/persisted_minor/2026-04-30T15-22-04Z-d8f3.audit_artifact_entry.json +26 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/positive/persisted_minor/2026-04-30T15-22-04Z-d8f3.jsonl +4 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/positive/persisted_minor/2026-04-30T15-22-04Z-d8f3.meta.json +43 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/positive/persisted_minor/2026-04-30T15-22-04Z-d8f3.verdict.yaml +19 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/positive/proposal_pass/2026-04-30T15-22-04Z-d8f3.audit_artifact_entry.json +24 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/positive/proposal_pass/2026-04-30T15-22-04Z-d8f3.jsonl +4 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/positive/proposal_pass/2026-04-30T15-22-04Z-d8f3.meta.json +43 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/positive/proposal_pass/2026-04-30T15-22-04Z-d8f3.verdict.yaml +12 -0
- package/vendor/ars/scripts/fixtures/bibliographic_integrity_signals/retraction.json +46 -0
- package/vendor/ars/scripts/fixtures/bibliographic_integrity_signals/retraction_check_attestation.json +44 -0
- package/vendor/ars/scripts/fixtures/bibliographic_integrity_signals/tortured_phrase.json +44 -0
- package/vendor/ars/scripts/fixtures/bibliographic_integrity_signals/tortured_phrase_v1_2_abstract_missing.json +107 -0
- package/vendor/ars/scripts/fixtures/bibliographic_integrity_signals/tortured_phrase_v1_2_detected.json +124 -0
- package/vendor/ars/scripts/fixtures/check_evals_gold_set/clean/expected_outcomes.json +77 -0
- package/vendor/ars/scripts/fixtures/check_evals_gold_set/clean/manifest.yaml +37 -0
- package/vendor/ars/scripts/fixtures/check_evals_gold_set/clean/tuples/001-valid-doi-test.json +20 -0
- package/vendor/ars/scripts/fixtures/check_evals_gold_set/clean/tuples/002-valid-arxiv-test.json +19 -0
- package/vendor/ars/scripts/fixtures/check_evals_gold_set/clean/tuples/003-fabricated-test.json +20 -0
- package/vendor/ars/scripts/fixtures/claim_audit_calibration/gold_set.json +344 -0
- package/vendor/ars/scripts/fixtures/claim_standing_candidate_ledger/query_plan.json +108 -0
- package/vendor/ars/scripts/fixtures/claim_standing_candidate_ledger/retrieval_input.json +179 -0
- package/vendor/ars/scripts/fixtures/committee_correspondence/16fd83f6aec7/concern_tracker.json +129 -0
- package/vendor/ars/scripts/fixtures/committee_correspondence/16fd83f6aec7/response_skeleton.md +19 -0
- package/vendor/ars/scripts/fixtures/committee_correspondence/16fd83f6aec7/source_letter.txt +9 -0
- package/vendor/ars/scripts/fixtures/content_coverage_advisory/base_draft.json +48 -0
- package/vendor/ars/scripts/fixtures/content_coverage_advisory/base_inventory.json +38 -0
- package/vendor/ars/scripts/fixtures/content_coverage_advisory/packet/consent.txt +1 -0
- package/vendor/ars/scripts/fixtures/content_coverage_advisory/session_sources.json +3 -0
- package/vendor/ars/scripts/fixtures/cross_document_consistency/README.md +6 -0
- package/vendor/ars/scripts/fixtures/cross_document_consistency/accepted_draft.md +35 -0
- package/vendor/ars/scripts/fixtures/cross_document_consistency/cases.json +75 -0
- package/vendor/ars/scripts/fixtures/cross_document_consistency/preregistration.md +5 -0
- package/vendor/ars/scripts/fixtures/cross_model_codex_transport/forbidden_event.jsonl +4 -0
- package/vendor/ars/scripts/fixtures/cross_model_codex_transport/grounded_verified.jsonl +3 -0
- package/vendor/ars/scripts/fixtures/cross_model_codex_transport/malformed.jsonl +3 -0
- package/vendor/ars/scripts/fixtures/cross_model_codex_transport/missing_search.jsonl +2 -0
- package/vendor/ars/scripts/fixtures/cross_model_codex_transport/multiple_finals.jsonl +4 -0
- package/vendor/ars/scripts/fixtures/cross_model_codex_transport/not_found.jsonl +3 -0
- package/vendor/ars/scripts/fixtures/cross_model_codex_transport/unbound_source.jsonl +3 -0
- package/vendor/ars/scripts/fixtures/cross_model_codex_transport/wrong_search_shape.jsonl +3 -0
- package/vendor/ars/scripts/fixtures/evidence_rows/phase_e_inputs.json +114 -0
- package/vendor/ars/scripts/fixtures/evidence_rows/session_sources.json +5 -0
- package/vendor/ars/scripts/fixtures/human_subjects_authority/cross-border-us-tw-gdpr.json +71 -0
- package/vendor/ars/scripts/fixtures/human_subjects_authority/gdpr-member-state-unresolved.json +62 -0
- package/vendor/ars/scripts/fixtures/human_subjects_authority/missing-data-axis.json +45 -0
- package/vendor/ars/scripts/fixtures/human_subjects_authority/no-profile.json +33 -0
- package/vendor/ars/scripts/fixtures/human_subjects_authority/tw-gdpr-two-axis.json +74 -0
- package/vendor/ars/scripts/fixtures/human_subjects_authority/us-gdpr-two-axis.json +74 -0
- package/vendor/ars/scripts/fixtures/review_pathway_rule_trace/lint-near-misses.json +72 -0
- package/vendor/ars/scripts/fixtures/review_pathway_rule_trace/no-profile-request.json +18 -0
- package/vendor/ars/scripts/fixtures/review_pathway_rule_trace/tw-candidates-request.json +63 -0
- package/vendor/ars/scripts/fixtures/review_pathway_rule_trace/us-candidates-request.json +77 -0
- package/vendor/ars/scripts/fixtures/review_target_context/exact-declaration.json +24 -0
- package/vendor/ars/scripts/fixtures/review_target_context/field-general-declaration.json +24 -0
- package/vendor/ars/scripts/fixtures/review_target_context/msr-2027-technical-full-declaration.json +24 -0
- package/vendor/ars/scripts/fixtures/review_target_context/synthetic-registry.json +92 -0
- package/vendor/ars/scripts/fixtures/revision_claim_drift_v2/README.md +21 -0
- package/vendor/ars/scripts/fixtures/revision_claim_drift_v2/subject_context_attested_only.json +55 -0
- package/vendor/ars/scripts/fixtures/revision_claim_drift_v2/subject_context_machine_supported.json +49 -0
- package/vendor/ars/scripts/fixtures/revision_claim_drift_v2/subject_context_not_isolated.json +56 -0
- package/vendor/ars/scripts/fixtures/revision_claim_drift_v2/subject_context_unknown.json +49 -0
- package/vendor/ars/scripts/fixtures/submission_package/clean/paper.md +16 -0
- package/vendor/ars/scripts/fixtures/submission_package/clean/references.bib +13 -0
- package/vendor/ars/scripts/fixtures/submission_package/fallback_authoryear/paper.md +11 -0
- package/vendor/ars/scripts/fixtures/submission_package/fallback_authoryear/references.bib +13 -0
- package/vendor/ars/scripts/fixtures/submission_package/fallback_latex/paper.tex +9 -0
- package/vendor/ars/scripts/fixtures/submission_package/fallback_latex/references.bib +13 -0
- package/vendor/ars/scripts/fixtures/submission_package/marker_no_join/paper.md +7 -0
- package/vendor/ars/scripts/fixtures/submission_package/orphan_intext/paper.md +8 -0
- package/vendor/ars/scripts/fixtures/submission_package/orphan_intext/references.bib +6 -0
- package/vendor/ars/scripts/fixtures/submission_package/passports/corpus_only.yaml +9 -0
- package/vendor/ars/scripts/fixtures/submission_package/passports/summary_join.yaml +16 -0
- package/vendor/ars/scripts/fixtures/submission_package/profiles/full.yaml +15 -0
- package/vendor/ars/scripts/fixtures/submission_package/profiles/tight.yaml +15 -0
- package/vendor/ars/scripts/fixtures/submission_package/summary_join/paper.md +7 -0
- package/vendor/ars/scripts/fixtures/submission_package/uncited_reference/paper.md +9 -0
- package/vendor/ars/scripts/fixtures/submission_package/uncited_reference/references.bib +13 -0
- package/vendor/ars/scripts/fixtures/submission_package/venue_clean/paper.md +26 -0
- package/vendor/ars/scripts/fixtures/submission_package/venue_clean/references.bib +13 -0
- package/vendor/ars/scripts/fixtures/submission_package/venue_violations/paper.md +20 -0
- package/vendor/ars/scripts/fixtures/submission_package/venue_violations/references.bib +13 -0
- package/vendor/ars/scripts/fixtures/submission_packet_manifest/base_inventory.json +101 -0
- package/vendor/ars/scripts/fixtures/submission_packet_manifest/packet/consent-materials.txt +3 -0
- package/vendor/ars/scripts/fixtures/submission_packet_manifest/packet/training-certificate.txt +2 -0
- package/vendor/ars/scripts/fixtures/submission_packet_manifest/packet/tw-consent-materials.txt +3 -0
- package/vendor/ars/scripts/fixtures/tortured_phrase_screening/corpus_input.yaml +30 -0
- package/vendor/ars/scripts/fixtures/tortured_phrase_screening/own_draft.md +36 -0
- package/vendor/ars/scripts/fixtures/tortured_phrase_screening/own_draft.tex +21 -0
- package/vendor/ars/scripts/fixtures/tortured_phrase_screening/seed_expectations.json +218 -0
- package/vendor/ars/scripts/fixtures/tortured_phrase_screening/snapshot.json +164 -0
- package/vendor/ars/scripts/fixtures/tortured_phrase_screening/snapshot_manifest.json +29 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/README.md +55 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/arxiv/empty_feed.xml +10 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/arxiv/error_5xx.html +7 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/arxiv/id_hit.xml +26 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/README.md +69 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/cnki_landing_page.html +13 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/error_5xx.html +2 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esearch_coordinate_ambiguous.json +16 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esearch_coordinate_hit.json +16 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esearch_coordinate_zero.json +14 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esearch_coverage_hit.json +15 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esearch_coverage_zero.json +13 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esummary_hit.json +43 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esummary_issn_mismatch.json +31 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esummary_no_doi.json +31 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esummary_unknown_ra.json +34 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esummary_year_mismatch.json +31 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/handle_absent.json +4 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/handle_exists.json +16 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/handle_internal_error.json +4 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/istic_csl_hit.json +25 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/istic_csl_other_title.json +18 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/ra_cnki.json +6 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/ra_crossref.json +6 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/ra_istic.json +6 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/ra_unknown_prefix.json +6 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/crossref/doi_hit.json +24 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/crossref/error_5xx.html +7 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/crossref/title_search_miss.json +15 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/openalex/doi_hit.json +29 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/openalex/error_5xx.json +4 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/openalex/title_search_miss.json +11 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/semantic_scholar/doi_hit.json +14 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/semantic_scholar/error_5xx.json +3 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/semantic_scholar/title_search_miss.json +5 -0
- package/vendor/ars/scripts/human_read_attestation_resolver.py +467 -0
- package/vendor/ars/scripts/ideation_diversity_assignment_gate.py +430 -0
- package/vendor/ars/scripts/inquiry_branch_ledger.py +2540 -0
- package/vendor/ars/scripts/legacy/ars_apply_revision_patch_v1_0.py +715 -0
- package/vendor/ars/scripts/legacy/check_re_review_synthesis_v1_0.py +2215 -0
- package/vendor/ars/scripts/migrate_literature_corpus_to_v3_10.py +223 -0
- package/vendor/ars/scripts/migrate_literature_corpus_to_v3_7_3.py +277 -0
- package/vendor/ars/scripts/migrate_literature_corpus_to_v3_9_0.py +304 -0
- package/vendor/ars/scripts/model_tiering_manifest.json +46 -0
- package/vendor/ars/scripts/openalex_client.py +232 -0
- package/vendor/ars/scripts/parse_audit_verdict.py +802 -0
- package/vendor/ars/scripts/pdf_content_classifier_worker.py +176 -0
- package/vendor/ars/scripts/pdf_read_preflight.py +1455 -0
- package/vendor/ars/scripts/policy_anchor_disclosure_referee.py +354 -0
- package/vendor/ars/scripts/recompute_receipts.py +1414 -0
- package/vendor/ars/scripts/render_claim_standing_view.py +374 -0
- package/vendor/ars/scripts/render_eval_comment.py +130 -0
- package/vendor/ars/scripts/render_harness_retirement_issue.py +167 -0
- package/vendor/ars/scripts/repro_lock_validation.py +90 -0
- package/vendor/ars/scripts/research_workflow_profile.py +1079 -0
- package/vendor/ars/scripts/resolve_human_subjects_authority.py +1158 -0
- package/vendor/ars/scripts/resolve_review_target_context.py +683 -0
- package/vendor/ars/scripts/resume_e4_record.py +509 -0
- package/vendor/ars/scripts/retraction_status.py +484 -0
- package/vendor/ars/scripts/review_criteria_binding.py +889 -0
- package/vendor/ars/scripts/review_panel_provenance.py +744 -0
- package/vendor/ars/scripts/revision_roadmap.py +1967 -0
- package/vendor/ars/scripts/run_ci_pytest_manifest.py +116 -0
- package/vendor/ars/scripts/run_codex_audit.sh +1191 -0
- package/vendor/ars/scripts/run_evals.py +513 -0
- package/vendor/ars/scripts/run_ideation_diversity_no_call.py +3505 -0
- package/vendor/ars/scripts/run_indirect_prompt_injection_no_call.py +3330 -0
- package/vendor/ars/scripts/run_indirect_prompt_injection_probe.py +399 -0
- package/vendor/ars/scripts/run_review_criteria_constructive_value.py +1895 -0
- package/vendor/ars/scripts/run_role_topology_utility_dry_run.py +606 -0
- package/vendor/ars/scripts/score_review_criteria_constructive_value.py +617 -0
- package/vendor/ars/scripts/semantic_scholar_client.py +291 -0
- package/vendor/ars/scripts/slr_lineage.py +59 -0
- package/vendor/ars/scripts/sync_adapter_docs.py +118 -0
- package/vendor/ars/scripts/temporal_integrity_audit.py +840 -0
- package/vendor/ars/scripts/test_431_exact_or_bust.py +253 -0
- package/vendor/ars/scripts/test__eval_threshold_gate.py +125 -0
- package/vendor/ars/scripts/test__markdown_lint_util.py +129 -0
- package/vendor/ars/scripts/test__next_verified_at_ms.py +256 -0
- package/vendor/ars/scripts/test_adjacent_framing_probe_lint.py +171 -0
- package/vendor/ars/scripts/test_adjudication_activity.py +1515 -0
- package/vendor/ars/scripts/test_ars_anchorize_draft.py +178 -0
- package/vendor/ars/scripts/test_ars_apply_revision_patch.py +1335 -0
- package/vendor/ars/scripts/test_ars_cache_invalidate.py +51 -0
- package/vendor/ars/scripts/test_ars_mark_read.py +910 -0
- package/vendor/ars/scripts/test_ars_update_check.py +816 -0
- package/vendor/ars/scripts/test_ars_write_scope_guard.py +790 -0
- package/vendor/ars/scripts/test_arxiv_client.py +374 -0
- package/vendor/ars/scripts/test_audit_schemas.py +560 -0
- package/vendor/ars/scripts/test_audit_snapshot_render_section_0.py +105 -0
- package/vendor/ars/scripts/test_block_parser.py +259 -0
- package/vendor/ars/scripts/test_bootstrap_timeline_yaml.py +148 -0
- package/vendor/ars/scripts/test_build_claim_standing_candidate_ledger.py +1203 -0
- package/vendor/ars/scripts/test_build_claim_standing_query_plan.py +791 -0
- package/vendor/ars/scripts/test_build_submission_packet_manifest.py +2644 -0
- package/vendor/ars/scripts/test_check_215_field_norm.py +238 -0
- package/vendor/ars/scripts/test_check_216_surface_form.py +341 -0
- package/vendor/ars/scripts/test_check_268_nested_commitment_ledger.py +194 -0
- package/vendor/ars/scripts/test_check_390_revision_patch_discipline.py +279 -0
- package/vendor/ars/scripts/test_check_392_citation_verification_intake.py +144 -0
- package/vendor/ars/scripts/test_check_394_submission_policy.py +200 -0
- package/vendor/ars/scripts/test_check_439_format_profile.py +252 -0
- package/vendor/ars/scripts/test_check_619_disclosure_closeout.py +158 -0
- package/vendor/ars/scripts/test_check_630_codex_subscription_transport.py +245 -0
- package/vendor/ars/scripts/test_check_669_review_pathway_rule_trace.py +304 -0
- package/vendor/ars/scripts/test_check_670_revision_roadmap_integration.py +260 -0
- package/vendor/ars/scripts/test_check_673_adjudication_activity.py +367 -0
- package/vendor/ars/scripts/test_check_684_review_criteria_binding.py +274 -0
- package/vendor/ars/scripts/test_check_agents_mirror_sync.py +137 -0
- package/vendor/ars/scripts/test_check_audit_artifact_consistency.py +2133 -0
- package/vendor/ars/scripts/test_check_benchmark_report.py +117 -0
- package/vendor/ars/scripts/test_check_bibliographic_integrity_signals.py +609 -0
- package/vendor/ars/scripts/test_check_calibration_tiers.py +376 -0
- package/vendor/ars/scripts/test_check_changelog_covers_merges.py +509 -0
- package/vendor/ars/scripts/test_check_ci_pytest_manifest.py +425 -0
- package/vendor/ars/scripts/test_check_claim_standing_candidate_ledger_integration.py +256 -0
- package/vendor/ars/scripts/test_check_claim_standing_freshness.py +277 -0
- package/vendor/ars/scripts/test_check_collaboration_depth_rubric.py +239 -0
- package/vendor/ars/scripts/test_check_command_frontmatter_name.py +178 -0
- package/vendor/ars/scripts/test_check_committee_correspondence.py +298 -0
- package/vendor/ars/scripts/test_check_compliance_report.py +381 -0
- package/vendor/ars/scripts/test_check_content_coverage_advisory_integration.py +308 -0
- package/vendor/ars/scripts/test_check_control_availability.py +361 -0
- package/vendor/ars/scripts/test_check_cross_document_consistency_advisory_integration.py +698 -0
- package/vendor/ars/scripts/test_check_cross_model_handoff_contract.py +301 -0
- package/vendor/ars/scripts/test_check_cross_model_verification_sync.py +203 -0
- package/vendor/ars/scripts/test_check_data_access_level.py +227 -0
- package/vendor/ars/scripts/test_check_data_flows.py +382 -0
- package/vendor/ars/scripts/test_check_decision_contract.py +387 -0
- package/vendor/ars/scripts/test_check_degradation_registry.py +270 -0
- package/vendor/ars/scripts/test_check_distribution_surface_claims.py +225 -0
- package/vendor/ars/scripts/test_check_domain_evidence_profile.py +439 -0
- package/vendor/ars/scripts/test_check_e4_promotion.py +163 -0
- package/vendor/ars/scripts/test_check_evals_gold_set.py +312 -0
- package/vendor/ars/scripts/test_check_evidence_row_integration.py +187 -0
- package/vendor/ars/scripts/test_check_field_norm_severity.py +173 -0
- package/vendor/ars/scripts/test_check_firm_rules_sync.py +342 -0
- package/vendor/ars/scripts/test_check_heldout_measurement_report.py +1508 -0
- package/vendor/ars/scripts/test_check_human_subjects_output_contract.py +129 -0
- package/vendor/ars/scripts/test_check_human_subjects_reference_migration.py +756 -0
- package/vendor/ars/scripts/test_check_instruction_data_boundary.py +204 -0
- package/vendor/ars/scripts/test_check_judge_prompt_version.py +90 -0
- package/vendor/ars/scripts/test_check_model_tiering.py +236 -0
- package/vendor/ars/scripts/test_check_panel_synthesis.py +1658 -0
- package/vendor/ars/scripts/test_check_passport_reset_contract.py +249 -0
- package/vendor/ars/scripts/test_check_pattern_eval_manifest.py +381 -0
- package/vendor/ars/scripts/test_check_persuasion_invariance_fixtures.py +591 -0
- package/vendor/ars/scripts/test_check_phase_conformance.py +4366 -0
- package/vendor/ars/scripts/test_check_pipeline_boundary_semantics.py +931 -0
- package/vendor/ars/scripts/test_check_pipeline_integrity.py +243 -0
- package/vendor/ars/scripts/test_check_policy_anchor_protocol.py +236 -0
- package/vendor/ars/scripts/test_check_policy_anchor_table.py +295 -0
- package/vendor/ars/scripts/test_check_prisma_trAIce_freshness.py +68 -0
- package/vendor/ars/scripts/test_check_promotion_bakeoff_preregistration.py +799 -0
- package/vendor/ars/scripts/test_check_ranking_lift.py +377 -0
- package/vendor/ars/scripts/test_check_re_review_synthesis.py +3398 -0
- package/vendor/ars/scripts/test_check_receipt_enum_sync.py +176 -0
- package/vendor/ars/scripts/test_check_repro_lock.py +107 -0
- package/vendor/ars/scripts/test_check_reviewer_data_fences.py +334 -0
- package/vendor/ars/scripts/test_check_reviewer_finding_contract.py +1107 -0
- package/vendor/ars/scripts/test_check_reviewer_role_label.py +491 -0
- package/vendor/ars/scripts/test_check_reviewer_scoring_honesty.py +222 -0
- package/vendor/ars/scripts/test_check_reviewer_sprint_prompt_sync.py +373 -0
- package/vendor/ars/scripts/test_check_revision_claim_drift_suite_v2.py +1925 -0
- package/vendor/ars/scripts/test_check_revision_token_conservation.py +398 -0
- package/vendor/ars/scripts/test_check_risk_register.py +336 -0
- package/vendor/ars/scripts/test_check_role_scoped_contract.py +1104 -0
- package/vendor/ars/scripts/test_check_rq_framing_patterns.py +110 -0
- package/vendor/ars/scripts/test_check_rubric_weight_consistency.py +32 -0
- package/vendor/ars/scripts/test_check_seeded_defect_fixtures.py +392 -0
- package/vendor/ars/scripts/test_check_setup_cross_model_parity.py +121 -0
- package/vendor/ars/scripts/test_check_spec_consistency.py +1081 -0
- package/vendor/ars/scripts/test_check_sprint_contract.py +458 -0
- package/vendor/ars/scripts/test_check_stage_capability_matrix.py +698 -0
- package/vendor/ars/scripts/test_check_submission_packet_manifest_integration.py +177 -0
- package/vendor/ars/scripts/test_check_surface_form_parity.py +417 -0
- package/vendor/ars/scripts/test_check_task_type.py +116 -0
- package/vendor/ars/scripts/test_check_tools_allowlist.py +835 -0
- package/vendor/ars/scripts/test_check_tortured_phrase_screening_integration.py +1306 -0
- package/vendor/ars/scripts/test_check_v3_10_134_write_scope.py +251 -0
- package/vendor/ars/scripts/test_check_v3_10_policy.py +547 -0
- package/vendor/ars/scripts/test_check_v3_6_7_pattern_protection.py +960 -0
- package/vendor/ars/scripts/test_check_v3_6_8_audit_scope_block.py +1000 -0
- package/vendor/ars/scripts/test_check_v3_6_8_cite_provenance_pipeline.py +454 -0
- package/vendor/ars/scripts/test_check_v3_6_8_frontmatter_trust_schema.py +581 -0
- package/vendor/ars/scripts/test_check_v3_6_8_mark_read_commands.py +120 -0
- package/vendor/ars/scripts/test_check_v3_6_8_pattern_protection.py +1138 -0
- package/vendor/ars/scripts/test_check_v3_7_3_three_layer_citation.py +566 -0
- package/vendor/ars/scripts/test_check_v3_8_annotation_literal_sync.py +262 -0
- package/vendor/ars/scripts/test_check_v3_9_0_triangulation.py +321 -0
- package/vendor/ars/scripts/test_check_v3_9_2_phase_boundary.py +190 -0
- package/vendor/ars/scripts/test_check_v3_9_4_temporal_verification.py +471 -0
- package/vendor/ars/scripts/test_check_version_consistency.py +1462 -0
- package/vendor/ars/scripts/test_check_workflow_classification.py +225 -0
- package/vendor/ars/scripts/test_chinese_literature_client.py +1889 -0
- package/vendor/ars/scripts/test_citation_existence_policy.py +480 -0
- package/vendor/ars/scripts/test_citation_verification_summary.py +342 -0
- package/vendor/ars/scripts/test_claim_audit_calibration.py +882 -0
- package/vendor/ars/scripts/test_claim_audit_finalizer.py +979 -0
- package/vendor/ars/scripts/test_claim_audit_pipeline.py +2398 -0
- package/vendor/ars/scripts/test_claim_audit_schema.py +1778 -0
- package/vendor/ars/scripts/test_claim_intent_manifest.py +666 -0
- package/vendor/ars/scripts/test_claim_registry_coverage.py +246 -0
- package/vendor/ars/scripts/test_claim_standing_discovery.py +579 -0
- package/vendor/ars/scripts/test_claim_standing_pipeline_wiring.py +290 -0
- package/vendor/ars/scripts/test_claim_standing_stance_assets.py +399 -0
- package/vendor/ars/scripts/test_claim_standing_stance_contracts.py +383 -0
- package/vendor/ars/scripts/test_claim_standing_stance_runner.py +349 -0
- package/vendor/ars/scripts/test_claim_standing_transmissions.py +605 -0
- package/vendor/ars/scripts/test_claim_strength_drift_disposition.py +517 -0
- package/vendor/ars/scripts/test_claim_verification_coverage_contract.py +104 -0
- package/vendor/ars/scripts/test_contamination_signals.py +1086 -0
- package/vendor/ars/scripts/test_content_coverage_advisory.py +1767 -0
- package/vendor/ars/scripts/test_cross_document_consistency_advisory.py +1270 -0
- package/vendor/ars/scripts/test_cross_model_codex_transport.py +1152 -0
- package/vendor/ars/scripts/test_cross_model_handoff.py +571 -0
- package/vendor/ars/scripts/test_cross_model_verification_guards.py +792 -0
- package/vendor/ars/scripts/test_crossref_client.py +393 -0
- package/vendor/ars/scripts/test_dispatch_e4_panel.py +4235 -0
- package/vendor/ars/scripts/test_e2e_claim_audit.py +540 -0
- package/vendor/ars/scripts/test_eval_harness_workflow.py +140 -0
- package/vendor/ars/scripts/test_evals_citation_extraction.py +150 -0
- package/vendor/ars/scripts/test_evals_lift_report_schema.py +108 -0
- package/vendor/ars/scripts/test_evidence_rows.py +2593 -0
- package/vendor/ars/scripts/test_experiment_provenance.py +915 -0
- package/vendor/ars/scripts/test_human_read_attestation_resolver.py +477 -0
- package/vendor/ars/scripts/test_ideation_diversity_assignment_gate.py +615 -0
- package/vendor/ars/scripts/test_indirect_prompt_injection_behavior_probe.py +250 -0
- package/vendor/ars/scripts/test_inquiry_branch_ledger.py +2296 -0
- package/vendor/ars/scripts/test_migrate_literature_corpus_to_v3_10.py +248 -0
- package/vendor/ars/scripts/test_migrate_literature_corpus_to_v3_7_3.py +545 -0
- package/vendor/ars/scripts/test_migrate_literature_corpus_to_v3_9_0.py +497 -0
- package/vendor/ars/scripts/test_normalize_compat_verdict.py +149 -0
- package/vendor/ars/scripts/test_openalex_client.py +490 -0
- package/vendor/ars/scripts/test_passport_yaml.py +104 -0
- package/vendor/ars/scripts/test_pattern_eval_runtime.py +1295 -0
- package/vendor/ars/scripts/test_pdf_read_preflight.py +1943 -0
- package/vendor/ars/scripts/test_policy_anchor_disclosure.py +666 -0
- package/vendor/ars/scripts/test_reading_probe_lint.py +218 -0
- package/vendor/ars/scripts/test_recompute_receipts.py +778 -0
- package/vendor/ars/scripts/test_render_claim_standing_view.py +192 -0
- package/vendor/ars/scripts/test_render_eval_comment.py +162 -0
- package/vendor/ars/scripts/test_render_harness_retirement_issue.py +110 -0
- package/vendor/ars/scripts/test_repro_lock_validation_drift.py +100 -0
- package/vendor/ars/scripts/test_research_workflow_profile.py +734 -0
- package/vendor/ars/scripts/test_resolve_human_subjects_authority.py +1219 -0
- package/vendor/ars/scripts/test_resolve_review_target_context.py +703 -0
- package/vendor/ars/scripts/test_resume_e4_record.py +315 -0
- package/vendor/ars/scripts/test_retraction_status.py +456 -0
- package/vendor/ars/scripts/test_review_criteria_binding.py +629 -0
- package/vendor/ars/scripts/test_review_panel_provenance.py +565 -0
- package/vendor/ars/scripts/test_review_pathway_rule_trace.py +821 -0
- package/vendor/ars/scripts/test_revision_roadmap.py +1255 -0
- package/vendor/ars/scripts/test_run_ci_pytest_manifest.py +186 -0
- package/vendor/ars/scripts/test_run_codex_audit_e2e.py +369 -0
- package/vendor/ars/scripts/test_run_evals.py +430 -0
- package/vendor/ars/scripts/test_run_guard_launcher.py +500 -0
- package/vendor/ars/scripts/test_run_ideation_diversity_no_call.py +1833 -0
- package/vendor/ars/scripts/test_run_indirect_prompt_injection_no_call.py +1889 -0
- package/vendor/ars/scripts/test_run_review_criteria_constructive_value.py +586 -0
- package/vendor/ars/scripts/test_run_role_topology_utility_dry_run.py +428 -0
- package/vendor/ars/scripts/test_score_review_criteria_constructive_value.py +340 -0
- package/vendor/ars/scripts/test_semantic_scholar_client.py +554 -0
- package/vendor/ars/scripts/test_slr_lineage_emission.py +230 -0
- package/vendor/ars/scripts/test_socratic_rq_non_generation_contract.py +173 -0
- package/vendor/ars/scripts/test_temporal_integrity_audit.py +438 -0
- package/vendor/ars/scripts/test_text_similarity.py +95 -0
- package/vendor/ars/scripts/test_title_fuzzy_false_positive.py +111 -0
- package/vendor/ars/scripts/test_tortured_phrase_screening.py +2959 -0
- package/vendor/ars/scripts/test_transport_fixture_citation_gate.py +338 -0
- package/vendor/ars/scripts/test_uncited_assertion.py +558 -0
- package/vendor/ars/scripts/test_v3_6_7_phase_6_6.py +1279 -0
- package/vendor/ars/scripts/test_validate_compliance_fixtures.py +36 -0
- package/vendor/ars/scripts/test_validate_ideation_diversity_assets.py +230 -0
- package/vendor/ars/scripts/test_venue_disclosure_contract.py +755 -0
- package/vendor/ars/scripts/test_verification_cache.py +280 -0
- package/vendor/ars/scripts/test_verification_gate.py +461 -0
- package/vendor/ars/scripts/test_verify_passport_cli.py +123 -0
- package/vendor/ars/scripts/test_verify_submission_package.py +1407 -0
- package/vendor/ars/scripts/test_version_records_schema.py +211 -0
- package/vendor/ars/scripts/tortured_phrase_screening.py +3502 -0
- package/vendor/ars/scripts/uncited_assertion_detector.py +254 -0
- package/vendor/ars/scripts/v3_6_7_inversion_manifest.json +9 -0
- package/vendor/ars/scripts/v3_6_8_inversion_manifest.json +10 -0
- package/vendor/ars/scripts/validate_claim_standing_stance_assets.py +249 -0
- package/vendor/ars/scripts/validate_compliance_fixtures.py +56 -0
- package/vendor/ars/scripts/validate_ideation_diversity_assets.py +303 -0
- package/vendor/ars/scripts/venue_disclosure_contract_harness.py +837 -0
- package/vendor/ars/scripts/verification_cache.py +276 -0
- package/vendor/ars/scripts/verification_gate/__init__.py +345 -0
- package/vendor/ars/scripts/verify_passport.py +133 -0
- package/vendor/ars/scripts/verify_submission_package.py +1657 -0
- package/vendor/ars/shared/agents/compliance_agent.md +136 -0
- package/vendor/ars/shared/artifact_reproducibility_pattern.md +173 -0
- package/vendor/ars/shared/benchmark_report.schema.json +81 -0
- package/vendor/ars/shared/benchmark_report_pattern.md +180 -0
- package/vendor/ars/shared/bibliographic_integrity_signals.md +142 -0
- package/vendor/ars/shared/collaboration_depth_rubric.md +154 -0
- package/vendor/ars/shared/compliance_checkpoint_protocol.md +162 -0
- package/vendor/ars/shared/compliance_report.schema.json +187 -0
- package/vendor/ars/shared/contracts/README.md +938 -0
- package/vendor/ars/shared/contracts/activity/adjudication_activity_input.schema.json +555 -0
- package/vendor/ars/shared/contracts/activity/adjudication_activity_store.schema.json +560 -0
- package/vendor/ars/shared/contracts/audit/audit_jsonl.schema.json +128 -0
- package/vendor/ars/shared/contracts/audit/audit_sidecar.schema.json +169 -0
- package/vendor/ars/shared/contracts/audit/audit_verdict.schema.json +133 -0
- package/vendor/ars/shared/contracts/audit/cross_document_consistency_advisory.schema.json +480 -0
- package/vendor/ars/shared/contracts/audit/cross_document_consistency_advisory_draft.schema.json +564 -0
- package/vendor/ars/shared/contracts/audit/cross_document_source_manifest.schema.json +202 -0
- package/vendor/ars/shared/contracts/audit/tortured_phrase_advisory.schema.json +1362 -0
- package/vendor/ars/shared/contracts/audit/tortured_phrase_snapshot.schema.json +208 -0
- package/vendor/ars/shared/contracts/audit/tortured_phrase_snapshot_manifest.schema.json +335 -0
- package/vendor/ars/shared/contracts/capability/stage_capability_matrix.json +434 -0
- package/vendor/ars/shared/contracts/claim_standing/candidate_ledger.schema.json +705 -0
- package/vendor/ars/shared/contracts/claim_standing/query_plan.schema.json +389 -0
- package/vendor/ars/shared/contracts/claim_standing/query_plan_v1_1.schema.json +782 -0
- package/vendor/ars/shared/contracts/claim_standing/retrieval_input.schema.json +440 -0
- package/vendor/ars/shared/contracts/claim_standing/stance_record.schema.json +460 -0
- package/vendor/ars/shared/contracts/claim_standing/transmission_ledger.schema.json +282 -0
- package/vendor/ars/shared/contracts/cross_model/codex_citation_receipt.schema.json +157 -0
- package/vendor/ars/shared/contracts/cross_model/codex_citation_request.schema.json +23 -0
- package/vendor/ars/shared/contracts/cross_model/promotion_bakeoff_sealed_commitment.schema.json +55 -0
- package/vendor/ars/shared/contracts/cross_model/promotion_bakeoff_sealed_reveal.schema.json +50 -0
- package/vendor/ars/shared/contracts/degradation_registry.json +428 -0
- package/vendor/ars/shared/contracts/evaluator/full.json +126 -0
- package/vendor/ars/shared/contracts/evidence/claim_registry.schema.json +50 -0
- package/vendor/ars/shared/contracts/evidence/claim_registry_coverage_report.schema.json +79 -0
- package/vendor/ars/shared/contracts/evidence/evidence_row.schema.json +504 -0
- package/vendor/ars/shared/contracts/evidence/evidence_row_v1_1.schema.json +364 -0
- package/vendor/ars/shared/contracts/evidence/evidence_row_v1_2.schema.json +714 -0
- package/vendor/ars/shared/contracts/evidence/evidence_row_v1_3.schema.json +524 -0
- package/vendor/ars/shared/contracts/human_subjects/authority_profile_registry.schema.json +497 -0
- package/vendor/ars/shared/contracts/human_subjects/committee_correspondence.schema.json +253 -0
- package/vendor/ars/shared/contracts/human_subjects/content_coverage_advisory.schema.json +620 -0
- package/vendor/ars/shared/contracts/human_subjects/irb_context_record.schema.json +329 -0
- package/vendor/ars/shared/contracts/human_subjects/resolved_authority_context.schema.json +347 -0
- package/vendor/ars/shared/contracts/human_subjects/review_pathway_rule_trace.schema.json +265 -0
- package/vendor/ars/shared/contracts/human_subjects/review_pathway_trace_request.schema.json +127 -0
- package/vendor/ars/shared/contracts/human_subjects/submission_packet_inventory.schema.json +240 -0
- package/vendor/ars/shared/contracts/human_subjects/submission_packet_manifest.schema.json +999 -0
- package/vendor/ars/shared/contracts/passport/audit_artifact_entry.schema.json +266 -0
- package/vendor/ars/shared/contracts/passport/bibliographic_integrity_signal.schema.json +1676 -0
- package/vendor/ars/shared/contracts/passport/citation_provenance.schema.json +107 -0
- package/vendor/ars/shared/contracts/passport/citation_verification_summary.schema.json +164 -0
- package/vendor/ars/shared/contracts/passport/claim_audit_result.schema.json +124 -0
- package/vendor/ars/shared/contracts/passport/claim_drift.schema.json +58 -0
- package/vendor/ars/shared/contracts/passport/claim_intent_manifest.schema.json +107 -0
- package/vendor/ars/shared/contracts/passport/constraint_violation.schema.json +65 -0
- package/vendor/ars/shared/contracts/passport/experiment_alignment_result.schema.json +69 -0
- package/vendor/ars/shared/contracts/passport/experiment_provenance_entry.schema.json +169 -0
- package/vendor/ars/shared/contracts/passport/human_read_log.schema.json +86 -0
- package/vendor/ars/shared/contracts/passport/inquiry_ledger_ref.schema.json +22 -0
- package/vendor/ars/shared/contracts/passport/literature_corpus_entry.schema.json +650 -0
- package/vendor/ars/shared/contracts/passport/preregistration_artifact.schema.json +132 -0
- package/vendor/ars/shared/contracts/passport/rejection_log.schema.json +89 -0
- package/vendor/ars/shared/contracts/passport/reset_ledger_entry.schema.json +158 -0
- package/vendor/ars/shared/contracts/passport/temporal_audit_results.schema.json +208 -0
- package/vendor/ars/shared/contracts/passport/terminal_policies.schema.json +50 -0
- package/vendor/ars/shared/contracts/passport/timeline.schema.json +102 -0
- package/vendor/ars/shared/contracts/passport/uncited_assertion.schema.json +56 -0
- package/vendor/ars/shared/contracts/passport/uncited_audit_failure.schema.json +72 -0
- package/vendor/ars/shared/contracts/passport/user_attested_read_resolution.schema.json +87 -0
- package/vendor/ars/shared/contracts/passport/version_records.schema.json +138 -0
- package/vendor/ars/shared/contracts/patch/block_manifest.schema.json +45 -0
- package/vendor/ars/shared/contracts/patch/legacy/v1_0/revision_patch.schema.json +110 -0
- package/vendor/ars/shared/contracts/patch/revision_patch.schema.json +250 -0
- package/vendor/ars/shared/contracts/pdf/pdf_content_classifier_diagnostic.schema.json +39 -0
- package/vendor/ars/shared/contracts/pdf/pdf_content_classifier_worker.schema.json +88 -0
- package/vendor/ars/shared/contracts/pdf/pdf_read_preflight.schema.json +227 -0
- package/vendor/ars/shared/contracts/re_review/input_manifest.schema.json +161 -0
- package/vendor/ars/shared/contracts/re_review/legacy/v1_0/input_manifest.schema.json +134 -0
- package/vendor/ars/shared/contracts/re_review/legacy/v1_0/precommitment.schema.json +193 -0
- package/vendor/ars/shared/contracts/re_review/legacy/v1_0/traceability.schema.json +841 -0
- package/vendor/ars/shared/contracts/re_review/legacy/v1_0/verdict_record.schema.json +244 -0
- package/vendor/ars/shared/contracts/re_review/precommitment.schema.json +193 -0
- package/vendor/ars/shared/contracts/re_review/traceability.schema.json +916 -0
- package/vendor/ars/shared/contracts/re_review/verdict_record.schema.json +245 -0
- package/vendor/ars/shared/contracts/research_workflow/inquiry_branch_ledger.schema.json +449 -0
- package/vendor/ars/shared/contracts/research_workflow/research_workflow_profile.schema.json +222 -0
- package/vendor/ars/shared/contracts/research_workflow/research_workflow_profile_selection_receipt.schema.json +111 -0
- package/vendor/ars/shared/contracts/review_target/constructive_review_findings.schema.json +172 -0
- package/vendor/ars/shared/contracts/review_target/criteria_registry.schema.json +97 -0
- package/vendor/ars/shared/contracts/review_target/review_criteria_binding_manifest.schema.json +235 -0
- package/vendor/ars/shared/contracts/review_target/review_criteria_source_receipt.schema.json +158 -0
- package/vendor/ars/shared/contracts/review_target/review_target_context.schema.json +106 -0
- package/vendor/ars/shared/contracts/review_target/review_target_declaration.schema.json +118 -0
- package/vendor/ars/shared/contracts/reviewer/full.json +114 -0
- package/vendor/ars/shared/contracts/reviewer/methodology_focus.json +75 -0
- package/vendor/ars/shared/contracts/reviewer/review_panel_provenance.schema.json +263 -0
- package/vendor/ars/shared/contracts/reviewer/review_panel_provenance_carrier.schema.json +122 -0
- package/vendor/ars/shared/contracts/reviewer/review_panel_provenance_input.schema.json +120 -0
- package/vendor/ars/shared/contracts/revision/author_adjudication.schema.json +251 -0
- package/vendor/ars/shared/contracts/revision/author_adjudication_input.schema.json +25 -0
- package/vendor/ars/shared/contracts/revision/claim_strength_drift_disposition.schema.json +97 -0
- package/vendor/ars/shared/contracts/revision/claim_strength_drift_disposition_input.schema.json +80 -0
- package/vendor/ars/shared/contracts/revision/claim_strength_drift_findings.schema.json +139 -0
- package/vendor/ars/shared/contracts/revision/claim_surface_manifest.schema.json +99 -0
- package/vendor/ars/shared/contracts/revision/integrity_correction_authorization.schema.json +140 -0
- package/vendor/ars/shared/contracts/revision/integrity_correction_authorization_input.schema.json +28 -0
- package/vendor/ars/shared/contracts/revision/integrity_correction_list.schema.json +48 -0
- package/vendor/ars/shared/contracts/revision/integrity_pass_receipt.schema.json +16 -0
- package/vendor/ars/shared/contracts/revision/revision_evidence_bundle.schema.json +134 -0
- package/vendor/ars/shared/contracts/revision/revision_roadmap.schema.json +334 -0
- package/vendor/ars/shared/contracts/submission/format_profile.example.yaml +33 -0
- package/vendor/ars/shared/contracts/submission/format_profile.schema.json +102 -0
- package/vendor/ars/shared/contracts/submission/submission_verification_report.schema.json +233 -0
- package/vendor/ars/shared/contracts/submission/venue_profile.schema.json +114 -0
- package/vendor/ars/shared/contracts/writer/full.json +87 -0
- package/vendor/ars/shared/cross_model_verification.md +714 -0
- package/vendor/ars/shared/evals_lift_report.schema.json +141 -0
- package/vendor/ars/shared/ground_truth_isolation_pattern.md +275 -0
- package/vendor/ars/shared/handoff_schemas.md +1209 -0
- package/vendor/ars/shared/human_subjects_authority_registry.json +1278 -0
- package/vendor/ars/shared/mode_spectrum.md +57 -0
- package/vendor/ars/shared/model_tiering.md +83 -0
- package/vendor/ars/shared/policy_data/nature_policy.md +56 -0
- package/vendor/ars/shared/prisma_trAIce_protocol.md +157 -0
- package/vendor/ars/shared/raise_framework.md +129 -0
- package/vendor/ars/shared/references/authority_content_coverage_advisory_protocol.md +275 -0
- package/vendor/ars/shared/references/claim_standing_candidate_ledger_protocol.md +66 -0
- package/vendor/ars/shared/references/claim_strength_ladder.md +93 -0
- package/vendor/ars/shared/references/cross_document_consistency_advisory_protocol.md +263 -0
- package/vendor/ars/shared/references/evidence_row_protocol.md +260 -0
- package/vendor/ars/shared/references/firm_rules.md +90 -0
- package/vendor/ars/shared/references/human_subjects_authority_protocol.md +274 -0
- package/vendor/ars/shared/references/intent_clarification_protocol.md +168 -0
- package/vendor/ars/shared/references/irb_terminology_glossary.md +229 -0
- package/vendor/ars/shared/references/protected_hedging_phrases.md +118 -0
- package/vendor/ars/shared/references/psychometric_terminology_glossary.md +109 -0
- package/vendor/ars/shared/references/review_criteria_consumer_protocol.md +238 -0
- package/vendor/ars/shared/references/review_pathway_rule_trace_protocol.md +166 -0
- package/vendor/ars/shared/references/submission_packet_manifest_protocol.md +292 -0
- package/vendor/ars/shared/references/word_count_conventions.md +124 -0
- package/vendor/ars/shared/research_workflow_profiles/field_general.json +1 -0
- package/vendor/ars/shared/review_criteria_registry.json +207 -0
- package/vendor/ars/shared/review_criteria_sources/msr-2027-technical-papers.2026-08-24.json +46 -0
- package/vendor/ars/shared/review_criteria_sources/sigsoft-empirical-standards.2026-08-24.json +31 -0
- package/vendor/ars/shared/sprint_contract.schema.json +482 -0
- package/vendor/ars/shared/style_calibration_protocol.md +151 -0
- package/vendor/ars/shared/templates/codex_audit_multifile_template.md +263 -0
- package/vendor/ars/tools/release-discipline/.toolkit-version +1 -0
- package/vendor/ars/tools/release-discipline/README.md +4 -0
- package/vendor/ars/tools/release-discipline/scripts/_release_doc_alignment_schema.py +1011 -0
- package/vendor/ars/tools/release-discipline/scripts/check_command_invariants.py +497 -0
- package/vendor/ars/tools/release-discipline/scripts/check_release_doc_alignment.py +263 -0
- package/vendor/ars/tools/release-discipline/scripts/sync-toolkit.sh +147 -0
- package/vendor/windows/NOTICE.md +12 -0
- package/vendor/windows/arm64/fd.exe +0 -0
- package/vendor/windows/arm64/licenses/fd/LICENSE-APACHE +201 -0
- package/vendor/windows/arm64/licenses/fd/LICENSE-MIT +21 -0
- package/vendor/windows/arm64/licenses/ripgrep/COPYING +3 -0
- package/vendor/windows/arm64/licenses/ripgrep/LICENSE-MIT +21 -0
- package/vendor/windows/arm64/licenses/ripgrep/UNLICENSE +24 -0
- package/vendor/windows/arm64/rg.exe +0 -0
- package/vendor/windows/x64/fd.exe +0 -0
- package/vendor/windows/x64/licenses/fd/LICENSE-APACHE +201 -0
- package/vendor/windows/x64/licenses/fd/LICENSE-MIT +21 -0
- package/vendor/windows/x64/licenses/ripgrep/COPYING +3 -0
- package/vendor/windows/x64/licenses/ripgrep/LICENSE-MIT +21 -0
- package/vendor/windows/x64/licenses/ripgrep/UNLICENSE +24 -0
- package/vendor/windows/x64/rg.exe +0 -0
|
@@ -0,0 +1,1179 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Validate ARS held-out measurement reports against the #654/#664 contract.
|
|
3
|
+
|
|
4
|
+
Layers:
|
|
5
|
+
1. JSON Schema (evals/heldout/measurement_report.schema.json) — shape,
|
|
6
|
+
enums, const attestations (rubric_precommitted / raw_published /
|
|
7
|
+
raw_outputs.retained), and the version/suite branches B1-B8.
|
|
8
|
+
2. Cross-field invariants I1-I15 — rules a schema cannot express.
|
|
9
|
+
Invariants run only on schema-valid reports (schema errors short-circuit).
|
|
10
|
+
3. Reference resolution R1-R6 (CLI/CI only; validate_report(...,
|
|
11
|
+
resolve_refs=True)) — attested references must resolve: the rubric file
|
|
12
|
+
exists and matches its hash, raw-output paths exist, the suite commit is
|
|
13
|
+
a real object in this repository.
|
|
14
|
+
4. Location binding L1 (path-aware entry points) — a report filed under
|
|
15
|
+
evals/heldout/<dir>/ must declare suite == <dir>.
|
|
16
|
+
|
|
17
|
+
Invariants:
|
|
18
|
+
I1 aggregate.agreement.rate equals 1 - |divergent| / |items judged by >=2
|
|
19
|
+
distinct judges| (tolerance 0.005); null iff no such item exists.
|
|
20
|
+
I2 derived model-judge minimum: a decision-relevant, non-mechanical run with
|
|
21
|
+
judge_plan.exception == "none" requires >= 2 judges drawn from >= 2
|
|
22
|
+
distinct model families (families compared case-/NFKC-folded). The
|
|
23
|
+
paired-controls-only human_expert_panel exception is schema-closed and
|
|
24
|
+
its suite-owned evidence is resolved by R6.
|
|
25
|
+
I3 declared divergent items that are not actually divergent are rejected
|
|
26
|
+
(declared set must not exceed the recomputed set).
|
|
27
|
+
I4 every adjudication override targets a judge that exists AND an item
|
|
28
|
+
that judge actually scored.
|
|
29
|
+
I5 suite is a key of evals/heldout/suite_registry.json and suite_class
|
|
30
|
+
matches the registry; the registry itself must be well-formed.
|
|
31
|
+
I6 decision_relevant runs require replicates.per_item >= 2 unless a
|
|
32
|
+
written replicates.exception is present.
|
|
33
|
+
I7 raw_outputs.paths is non-empty.
|
|
34
|
+
I8 every recomputed divergent item must be listed in
|
|
35
|
+
aggregate.agreement.divergent_items (divergence is never averaged
|
|
36
|
+
away). With I3 this is set equality.
|
|
37
|
+
I9 identity hygiene: no duplicate judge_id; no model_id under two
|
|
38
|
+
families; no two judges sharing (model_id, prompt_ref); no duplicate
|
|
39
|
+
item_id within one judge's per_item; no two distinct raw item ids that
|
|
40
|
+
fold (NFKC + format-character strip) to the same id; per-item verdict
|
|
41
|
+
key-sets must match across judges on comparable items.
|
|
42
|
+
I10 in adjudication-required classes, every divergent item needs >= 1
|
|
43
|
+
override recording its resolution; in judge-bearing classes without
|
|
44
|
+
adjudication, divergence requires a non-empty agreement.note.
|
|
45
|
+
I11 decision-relevant runs: an item judged by some judges but not others
|
|
46
|
+
must be named in attempts.blocked_runs and partial_published must be
|
|
47
|
+
true. (Non-decision runs get warning W1 instead.)
|
|
48
|
+
I12 measurement_date must be a real calendar date.
|
|
49
|
+
I13 v1.1 flags-only adjudication labels the headline and caveats as a lower
|
|
50
|
+
bound; rubric direction is frozen by reference.
|
|
51
|
+
I14 v1.1 pre-registration, amendment ordering, design/arm vocabulary, and
|
|
52
|
+
declared timing/ordering/concurrency claims remain internally coherent.
|
|
53
|
+
I15 v1.0 is accepted only for the exact path+hash frozen before v1.1; new
|
|
54
|
+
or modified rows cannot select the weaker version.
|
|
55
|
+
|
|
56
|
+
Warnings (never gate):
|
|
57
|
+
W1 judges cover different item sets on a non-decision-relevant run.
|
|
58
|
+
|
|
59
|
+
Usage:
|
|
60
|
+
python scripts/check_heldout_measurement_report.py report.json [...]
|
|
61
|
+
python scripts/check_heldout_measurement_report.py --all
|
|
62
|
+
# walks evals/heldout/ (following directory symlinks, cycle-guarded)
|
|
63
|
+
# and validates every JSON file carrying the opt-in
|
|
64
|
+
# "measurement_contract" key. Files without the key are never parsed;
|
|
65
|
+
# a file WITH the key that fails strict parsing (duplicate keys,
|
|
66
|
+
# non-finite numbers, undecodable bytes) fails loudly; a near-miss
|
|
67
|
+
# marker value (homoglyph / stray whitespace) fails loudly.
|
|
68
|
+
# Legacy rows are out of scope by design.
|
|
69
|
+
|
|
70
|
+
Exit 0 on pass (warnings may print to stderr), 1 on any error.
|
|
71
|
+
"""
|
|
72
|
+
from __future__ import annotations
|
|
73
|
+
|
|
74
|
+
import argparse
|
|
75
|
+
import datetime as _dt
|
|
76
|
+
import functools
|
|
77
|
+
import hashlib
|
|
78
|
+
import json
|
|
79
|
+
import os
|
|
80
|
+
import re
|
|
81
|
+
import subprocess
|
|
82
|
+
import sys
|
|
83
|
+
import unicodedata
|
|
84
|
+
from pathlib import Path
|
|
85
|
+
|
|
86
|
+
import jsonschema
|
|
87
|
+
|
|
88
|
+
REPO_ROOT = Path(__file__).resolve().parent.parent
|
|
89
|
+
HELDOUT_ROOT = REPO_ROOT / "evals" / "heldout"
|
|
90
|
+
SCHEMA_PATH = HELDOUT_ROOT / "measurement_report.schema.json"
|
|
91
|
+
EXECUTION_SCHEMA_PATH = HELDOUT_ROOT / "execution_manifest.schema.json"
|
|
92
|
+
TEMPLATE_PATH = HELDOUT_ROOT / "measurement_report.template.json"
|
|
93
|
+
REGISTRY_PATH = HELDOUT_ROOT / "suite_registry.json"
|
|
94
|
+
CONTRACT_PREFIX = "heldout-measurement/"
|
|
95
|
+
MARKER_KEY = "measurement_contract"
|
|
96
|
+
RATE_TOLERANCE = 0.005
|
|
97
|
+
FROZEN_V1_0_ROWS = {
|
|
98
|
+
HELDOUT_ROOT / "revision_claim_drift/measurement-2026-08-07.json":
|
|
99
|
+
"1af137c798e6cf3a5d0a742e379a8af78fe802cb924b4ece22cdf57cb881f573",
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def _reject_duplicate_keys(pairs: list[tuple[str, object]]) -> dict:
|
|
104
|
+
seen: dict[str, object] = {}
|
|
105
|
+
for key, value in pairs:
|
|
106
|
+
if key in seen:
|
|
107
|
+
raise ValueError(f"duplicate key {key!r}")
|
|
108
|
+
seen[key] = value
|
|
109
|
+
return seen
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def _loads_strict(text: str) -> dict:
|
|
113
|
+
"""JSON load rejecting duplicate keys and NaN/Infinity.
|
|
114
|
+
|
|
115
|
+
Duplicate keys are last-value-wins in plain json.loads, which would let a
|
|
116
|
+
file carry `"raw_published": false, ... "raw_published": true` — passing
|
|
117
|
+
the const attestation while reading as false to a human. Same fail-closed
|
|
118
|
+
stance as cross_model_handoff / check_degradation_registry /
|
|
119
|
+
check_evals_gold_set.
|
|
120
|
+
"""
|
|
121
|
+
return json.loads(
|
|
122
|
+
text,
|
|
123
|
+
object_pairs_hook=_reject_duplicate_keys,
|
|
124
|
+
parse_constant=lambda name: (_ for _ in ()).throw(
|
|
125
|
+
ValueError(f"non-finite JSON constant {name!r}")
|
|
126
|
+
),
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
@functools.cache
|
|
131
|
+
def _validator() -> jsonschema.Draft202012Validator:
|
|
132
|
+
schema = _loads_strict(SCHEMA_PATH.read_text(encoding="utf-8"))
|
|
133
|
+
jsonschema.Draft202012Validator.check_schema(schema)
|
|
134
|
+
return jsonschema.Draft202012Validator(
|
|
135
|
+
schema, format_checker=jsonschema.Draft202012Validator.FORMAT_CHECKER
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
@functools.cache
|
|
140
|
+
def _execution_validator() -> jsonschema.Draft202012Validator:
|
|
141
|
+
schema = _loads_strict(EXECUTION_SCHEMA_PATH.read_text(encoding="utf-8"))
|
|
142
|
+
jsonschema.Draft202012Validator.check_schema(schema)
|
|
143
|
+
return jsonschema.Draft202012Validator(
|
|
144
|
+
schema, format_checker=jsonschema.Draft202012Validator.FORMAT_CHECKER
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def supported_contract_versions() -> tuple[str, ...]:
|
|
149
|
+
"""Supported markers, single-sourced from the schema enum."""
|
|
150
|
+
values = _validator().schema["properties"][MARKER_KEY]["enum"]
|
|
151
|
+
return tuple(values)
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def contract_version() -> str:
|
|
155
|
+
"""Current template marker — the final schema-enum entry."""
|
|
156
|
+
return supported_contract_versions()[-1]
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def _suite_class_enum() -> list[str]:
|
|
160
|
+
return _validator().schema["properties"]["suite_class"]["enum"]
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
@functools.cache
|
|
164
|
+
def _suite_registry() -> tuple[dict, tuple[str, ...]]:
|
|
165
|
+
"""(registry mapping, registry-level errors). Fail-closed on bad registry."""
|
|
166
|
+
errors: list[str] = []
|
|
167
|
+
try:
|
|
168
|
+
raw = _loads_strict(REGISTRY_PATH.read_text(encoding="utf-8"))
|
|
169
|
+
except (OSError, ValueError) as exc:
|
|
170
|
+
return {}, (f"I5: suite_registry.json unreadable: {exc}",)
|
|
171
|
+
registry = {k: v for k, v in raw.items() if not k.startswith("_")}
|
|
172
|
+
valid_classes = set(_suite_class_enum())
|
|
173
|
+
for suite, klass in registry.items():
|
|
174
|
+
if klass not in valid_classes:
|
|
175
|
+
errors.append(
|
|
176
|
+
f"I5: suite_registry.json maps {suite!r} to unknown class {klass!r}"
|
|
177
|
+
)
|
|
178
|
+
return registry, tuple(errors)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def is_contract_report(obj: dict) -> bool:
|
|
182
|
+
"""True when the file opts into the #654 contract (any version)."""
|
|
183
|
+
marker = obj.get(MARKER_KEY)
|
|
184
|
+
return isinstance(marker, str) and marker.startswith(CONTRACT_PREFIX)
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def _fold(value: str) -> str:
|
|
188
|
+
"""NFKC-fold, strip Unicode format characters (Cf), casefold.
|
|
189
|
+
|
|
190
|
+
The #524 lesson: fold BEFORE comparison in a gate, or a homoglyph /
|
|
191
|
+
zero-width re-spelling slips through.
|
|
192
|
+
"""
|
|
193
|
+
normalized = unicodedata.normalize("NFKC", value)
|
|
194
|
+
stripped = "".join(c for c in normalized if unicodedata.category(c) != "Cf")
|
|
195
|
+
return stripped.casefold().strip()
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def marker_status(obj: dict) -> str:
|
|
199
|
+
"""'contract' | 'near_miss' | 'absent' for a parsed JSON object.
|
|
200
|
+
|
|
201
|
+
Any presence of the marker KEY with a non-conforming value (null, number,
|
|
202
|
+
empty or unrelated string, homoglyph spelling) is a near-miss — a file
|
|
203
|
+
that mentions the contract never silently skips validation.
|
|
204
|
+
"""
|
|
205
|
+
if MARKER_KEY not in obj:
|
|
206
|
+
return "absent"
|
|
207
|
+
marker = obj[MARKER_KEY]
|
|
208
|
+
if isinstance(marker, str) and marker.startswith(CONTRACT_PREFIX):
|
|
209
|
+
return "contract"
|
|
210
|
+
return "near_miss"
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def _names_item(folded_entry: str, folded_item: str) -> bool:
|
|
214
|
+
"""True when folded_entry names folded_item as a delimited token — an id
|
|
215
|
+
embedded in a longer id (rp-02 in rp-020) or a concatenated blob does not
|
|
216
|
+
count as naming the gap."""
|
|
217
|
+
pattern = rf"(?<![0-9a-z_-]){re.escape(folded_item)}(?![0-9a-z_-])"
|
|
218
|
+
return re.search(pattern, folded_entry) is not None
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
def _typed(value: object) -> object:
|
|
222
|
+
"""Type-tagged canonical form so 1 != True != 1.0 in payload comparison."""
|
|
223
|
+
if isinstance(value, bool):
|
|
224
|
+
return ("bool", value)
|
|
225
|
+
if isinstance(value, int):
|
|
226
|
+
return ("int", value)
|
|
227
|
+
if isinstance(value, float):
|
|
228
|
+
return ("float", value)
|
|
229
|
+
if isinstance(value, str):
|
|
230
|
+
return ("str", value)
|
|
231
|
+
if value is None:
|
|
232
|
+
return ("null",)
|
|
233
|
+
if isinstance(value, list):
|
|
234
|
+
return ("list", tuple(_typed(v) for v in value))
|
|
235
|
+
if isinstance(value, dict):
|
|
236
|
+
return ("dict", tuple(sorted((k, _typed(v)) for k, v in value.items())))
|
|
237
|
+
return ("other", repr(value))
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
def _has_affirmed_claim(text: str, pattern: str) -> bool:
|
|
241
|
+
"""Match a claim only when it is not locally negated.
|
|
242
|
+
|
|
243
|
+
This is intentionally conservative lexical binding, not semantic parsing:
|
|
244
|
+
nearby ``no/not/never/without/neither`` in the same clause suppresses the
|
|
245
|
+
match, so "not run concurrently" cannot create a concurrency attestation.
|
|
246
|
+
"""
|
|
247
|
+
for match in re.finditer(pattern, text):
|
|
248
|
+
prefix = text[max(0, match.start() - 100):match.start()]
|
|
249
|
+
clause = re.split(r'''[.;:!?",\[\]{}]|\b(?:but|however)\b''', prefix)[-1]
|
|
250
|
+
words = re.findall(r"[a-z]+", clause)
|
|
251
|
+
if not set(words[-6:]) & {"no", "not", "never", "without", "neither"}:
|
|
252
|
+
return True
|
|
253
|
+
return False
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
def _parse_timestamp(value: str) -> _dt.datetime:
|
|
257
|
+
"""Parse a schema-validated RFC 3339 timestamp as an aware datetime."""
|
|
258
|
+
parsed = _dt.datetime.fromisoformat(value.replace("Z", "+00:00"))
|
|
259
|
+
if parsed.tzinfo is None:
|
|
260
|
+
raise ValueError("timestamp lacks an offset")
|
|
261
|
+
return parsed
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
def _execution_claim_errors(manifest: dict, claims: set[str]) -> list[str]:
|
|
265
|
+
"""Prove declared execution claims from per-call manifest evidence."""
|
|
266
|
+
errors: list[str] = []
|
|
267
|
+
calls = manifest["calls"]
|
|
268
|
+
parsed_calls: list[tuple[dict, _dt.datetime, _dt.datetime]] = []
|
|
269
|
+
for call in calls:
|
|
270
|
+
try:
|
|
271
|
+
started = _parse_timestamp(call["started_at"])
|
|
272
|
+
completed = _parse_timestamp(call["completed_at"])
|
|
273
|
+
except (TypeError, ValueError):
|
|
274
|
+
# Normally caught by the schema format checker; keep this helper
|
|
275
|
+
# fail-closed when unit-called or when parser behavior changes.
|
|
276
|
+
errors.append(
|
|
277
|
+
f"R5: call {call.get('call_id')!r} has an invalid timestamp"
|
|
278
|
+
)
|
|
279
|
+
continue
|
|
280
|
+
if completed < started:
|
|
281
|
+
errors.append(
|
|
282
|
+
f"R5: call {call['call_id']!r} completed before it started"
|
|
283
|
+
)
|
|
284
|
+
parsed_calls.append((call, started, completed))
|
|
285
|
+
|
|
286
|
+
if not claims or errors:
|
|
287
|
+
return errors
|
|
288
|
+
if len(parsed_calls) < 2:
|
|
289
|
+
for claim in sorted(claims):
|
|
290
|
+
errors.append(
|
|
291
|
+
f"R5: {claim!r} requires evidence from at least two calls"
|
|
292
|
+
)
|
|
293
|
+
return errors
|
|
294
|
+
|
|
295
|
+
if "ordering" in claims:
|
|
296
|
+
ordered = sorted(parsed_calls, key=lambda item: item[0]["sequence_index"])
|
|
297
|
+
indexes = [item[0]["sequence_index"] for item in ordered]
|
|
298
|
+
starts = [item[1] for item in ordered]
|
|
299
|
+
if indexes != list(range(1, len(ordered) + 1)) or any(
|
|
300
|
+
later < earlier for earlier, later in zip(starts, starts[1:])
|
|
301
|
+
):
|
|
302
|
+
errors.append(
|
|
303
|
+
"R5: 'ordering' is not supported by contiguous sequence indexes "
|
|
304
|
+
"and nondecreasing call start times"
|
|
305
|
+
)
|
|
306
|
+
|
|
307
|
+
if "concurrency" in claims:
|
|
308
|
+
groups: dict[str, list[tuple[_dt.datetime, _dt.datetime]]] = {}
|
|
309
|
+
for call, started, completed in parsed_calls:
|
|
310
|
+
group = call.get("concurrency_group")
|
|
311
|
+
if isinstance(group, str) and group.strip():
|
|
312
|
+
groups.setdefault(_fold(group), []).append((started, completed))
|
|
313
|
+
supported = any(
|
|
314
|
+
max(a_start, b_start) < min(a_end, b_end)
|
|
315
|
+
for intervals in groups.values()
|
|
316
|
+
for index, (a_start, a_end) in enumerate(intervals)
|
|
317
|
+
for b_start, b_end in intervals[index + 1:]
|
|
318
|
+
)
|
|
319
|
+
if not supported:
|
|
320
|
+
errors.append(
|
|
321
|
+
"R5: 'concurrency' requires two overlapping calls in the same "
|
|
322
|
+
"non-empty concurrency_group"
|
|
323
|
+
)
|
|
324
|
+
|
|
325
|
+
if "same_window" in claims:
|
|
326
|
+
window = manifest.get("execution_window")
|
|
327
|
+
if not isinstance(window, dict):
|
|
328
|
+
errors.append(
|
|
329
|
+
"R5: 'same_window' requires a declared execution_window"
|
|
330
|
+
)
|
|
331
|
+
else:
|
|
332
|
+
try:
|
|
333
|
+
window_start = _parse_timestamp(window["started_at"])
|
|
334
|
+
window_end = _parse_timestamp(window["completed_at"])
|
|
335
|
+
except (KeyError, TypeError, ValueError):
|
|
336
|
+
errors.append("R5: execution_window has invalid timestamps")
|
|
337
|
+
else:
|
|
338
|
+
if window_end < window_start or any(
|
|
339
|
+
started < window_start or completed > window_end
|
|
340
|
+
for _call, started, completed in parsed_calls
|
|
341
|
+
):
|
|
342
|
+
errors.append(
|
|
343
|
+
"R5: 'same_window' calls are not contained in the declared "
|
|
344
|
+
"execution_window"
|
|
345
|
+
)
|
|
346
|
+
return errors
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
def _invariant_findings(report: dict) -> tuple[list[str], list[str]]:
|
|
350
|
+
"""Cross-field invariants I1-I15. Assumes the report is schema-valid."""
|
|
351
|
+
errors: list[str] = []
|
|
352
|
+
warnings: list[str] = []
|
|
353
|
+
|
|
354
|
+
suite = report["suite"]
|
|
355
|
+
suite_class = report["suite_class"]
|
|
356
|
+
judges = report["judges"]
|
|
357
|
+
exception = report["judge_plan"]["exception"]
|
|
358
|
+
agreement = report["aggregate"]["agreement"]
|
|
359
|
+
adjudication = report["adjudication"]
|
|
360
|
+
|
|
361
|
+
# ---- I9: identity hygiene (judges) -------------------------------------
|
|
362
|
+
judge_ids = [_fold(j["judge_id"]) for j in judges]
|
|
363
|
+
if len(judge_ids) != len(set(judge_ids)):
|
|
364
|
+
errors.append(f"I9: duplicate judge_id among {sorted(judge_ids)!r} (fold-compared)")
|
|
365
|
+
model_to_families: dict[str, set[str]] = {}
|
|
366
|
+
config_pairs: dict[tuple[str, str], list[str]] = {}
|
|
367
|
+
for j in judges:
|
|
368
|
+
model_to_families.setdefault(_fold(j["model_id"]), set()).add(_fold(j["model_family"]))
|
|
369
|
+
config_pairs.setdefault(
|
|
370
|
+
(_fold(j["model_id"]), _fold(j["prompt_ref"])), []
|
|
371
|
+
).append(j["judge_id"])
|
|
372
|
+
for model_id, families in model_to_families.items():
|
|
373
|
+
if len(families) > 1:
|
|
374
|
+
errors.append(
|
|
375
|
+
f"I9: model_id {model_id!r} listed under {len(families)} different "
|
|
376
|
+
"model_family values — one physical judge cannot span families"
|
|
377
|
+
)
|
|
378
|
+
for (model_id, _prompt), ids in config_pairs.items():
|
|
379
|
+
if len(ids) > 1:
|
|
380
|
+
errors.append(
|
|
381
|
+
f"I9: judges {sorted(ids)!r} share the same (model_id, prompt_ref) "
|
|
382
|
+
f"({model_id!r}) — the same judge configuration listed twice does "
|
|
383
|
+
"not add independence"
|
|
384
|
+
)
|
|
385
|
+
|
|
386
|
+
# ---- I9: identity hygiene (item ids) + per-judge indexing ---------------
|
|
387
|
+
fold_to_raw: dict[str, str] = {}
|
|
388
|
+
by_item: dict[str, dict[int, dict]] = {}
|
|
389
|
+
for idx, judge in enumerate(judges):
|
|
390
|
+
seen_in_judge: set[str] = set()
|
|
391
|
+
for row in judge["per_item"]:
|
|
392
|
+
raw_id = row["item_id"]
|
|
393
|
+
fid = _fold(raw_id)
|
|
394
|
+
prior_raw = fold_to_raw.setdefault(fid, raw_id)
|
|
395
|
+
if prior_raw != raw_id:
|
|
396
|
+
errors.append(
|
|
397
|
+
f"I9: item ids {prior_raw!r} and {raw_id!r} fold to the same "
|
|
398
|
+
f"identifier {fid!r} — homoglyph/format-character re-spellings "
|
|
399
|
+
"are rejected"
|
|
400
|
+
)
|
|
401
|
+
if fid in seen_in_judge:
|
|
402
|
+
errors.append(
|
|
403
|
+
f"I9: judge {judge['judge_id']!r} lists item {raw_id!r} more "
|
|
404
|
+
"than once"
|
|
405
|
+
)
|
|
406
|
+
continue
|
|
407
|
+
seen_in_judge.add(fid)
|
|
408
|
+
payload = {k: v for k, v in row.items() if k != "item_id"}
|
|
409
|
+
by_item.setdefault(fid, {})[idx] = payload
|
|
410
|
+
|
|
411
|
+
comparable = {i for i, per_judge in by_item.items() if len(per_judge) >= 2}
|
|
412
|
+
divergent: set[str] = set()
|
|
413
|
+
for fid in comparable:
|
|
414
|
+
payloads = list(by_item[fid].values())
|
|
415
|
+
keysets = {tuple(sorted(p)) for p in payloads}
|
|
416
|
+
if len(keysets) > 1:
|
|
417
|
+
errors.append(
|
|
418
|
+
f"I9: judges score different field sets on item {fid!r} "
|
|
419
|
+
f"({sorted(sorted(k) for k in keysets)!r}) — verdict fields must "
|
|
420
|
+
"be comparable across judges"
|
|
421
|
+
)
|
|
422
|
+
if any(_typed(p) != _typed(payloads[0]) for p in payloads[1:]):
|
|
423
|
+
divergent.add(fid)
|
|
424
|
+
|
|
425
|
+
# ---- I1: agreement rate recomputed -------------------------------------
|
|
426
|
+
rate = agreement["rate"]
|
|
427
|
+
if comparable:
|
|
428
|
+
expected = 1 - len(divergent) / len(comparable)
|
|
429
|
+
if rate is None:
|
|
430
|
+
errors.append(
|
|
431
|
+
f"I1: agreement.rate is null but {len(comparable)} item(s) are "
|
|
432
|
+
f"judged by >=2 judges (expected ~{expected:.3f})"
|
|
433
|
+
)
|
|
434
|
+
elif abs(rate - expected) > RATE_TOLERANCE:
|
|
435
|
+
errors.append(
|
|
436
|
+
f"I1: agreement.rate={rate} but recomputation gives "
|
|
437
|
+
f"{expected:.3f} (1 - {len(divergent)}/{len(comparable)})"
|
|
438
|
+
)
|
|
439
|
+
elif rate is not None:
|
|
440
|
+
errors.append(
|
|
441
|
+
"I1: agreement.rate must be null when no item is judged by >=2 judges"
|
|
442
|
+
)
|
|
443
|
+
|
|
444
|
+
# ---- I2: derived judge minimum + family diversity ----------------------
|
|
445
|
+
if (
|
|
446
|
+
report["decision_relevant"]
|
|
447
|
+
and suite_class != "mechanical_match"
|
|
448
|
+
and exception == "none"
|
|
449
|
+
):
|
|
450
|
+
families = {_fold(j["model_family"]) for j in judges}
|
|
451
|
+
if len(judges) < 2:
|
|
452
|
+
errors.append(
|
|
453
|
+
f"I2: decision-relevant {suite_class} run with {len(judges)} judge(s) "
|
|
454
|
+
"and exception='none' — the derived minimum is 2 judges; label the "
|
|
455
|
+
"exception or add judges"
|
|
456
|
+
)
|
|
457
|
+
elif len(families) < 2:
|
|
458
|
+
errors.append(
|
|
459
|
+
f"I2: judges span a single model family {sorted(families)!r} — "
|
|
460
|
+
"decision-relevant runs require >=2 distinct families "
|
|
461
|
+
"(or a labeled exception)"
|
|
462
|
+
)
|
|
463
|
+
|
|
464
|
+
# ---- I3 + I8: declared divergence == recomputed divergence -------------
|
|
465
|
+
declared = [_fold(i) for i in agreement["divergent_items"]]
|
|
466
|
+
declared_set = set(declared)
|
|
467
|
+
over_declared = declared_set - divergent
|
|
468
|
+
if over_declared:
|
|
469
|
+
errors.append(
|
|
470
|
+
f"I3: declared divergent items {sorted(over_declared)!r} are not "
|
|
471
|
+
"actually divergent (agreeing, single-judge, or unknown items)"
|
|
472
|
+
)
|
|
473
|
+
unlisted = divergent - declared_set
|
|
474
|
+
if unlisted:
|
|
475
|
+
errors.append(
|
|
476
|
+
"I8: cross-judge divergence on "
|
|
477
|
+
f"{sorted(unlisted)} not listed in aggregate.agreement.divergent_items"
|
|
478
|
+
)
|
|
479
|
+
|
|
480
|
+
# ---- I4: overrides bind to a judge AND an item that judge scored -------
|
|
481
|
+
judge_index = {j["judge_id"]: idx for idx, j in enumerate(judges)}
|
|
482
|
+
for override in adjudication.get("overrides", []):
|
|
483
|
+
o_item, o_judge = _fold(override["item_id"]), override["judge_id"]
|
|
484
|
+
if o_judge not in judge_index:
|
|
485
|
+
errors.append(
|
|
486
|
+
f"I4: override references unknown judge {o_judge!r}"
|
|
487
|
+
)
|
|
488
|
+
elif o_item not in by_item or judge_index[o_judge] not in by_item[o_item]:
|
|
489
|
+
errors.append(
|
|
490
|
+
f"I4: override targets item {override['item_id']!r} which judge "
|
|
491
|
+
f"{o_judge!r} never scored"
|
|
492
|
+
)
|
|
493
|
+
|
|
494
|
+
# ---- I5: suite registry binding ----------------------------------------
|
|
495
|
+
registry, registry_errors = _suite_registry()
|
|
496
|
+
errors.extend(registry_errors)
|
|
497
|
+
if suite not in registry:
|
|
498
|
+
errors.append(
|
|
499
|
+
f"I5: suite {suite!r} is not in evals/heldout/suite_registry.json — "
|
|
500
|
+
"register it (with its class) before publishing contract rows"
|
|
501
|
+
)
|
|
502
|
+
elif registry[suite] != suite_class:
|
|
503
|
+
errors.append(
|
|
504
|
+
f"I5: suite {suite!r} is registered as {registry[suite]!r} "
|
|
505
|
+
f"but the report declares suite_class={suite_class!r}"
|
|
506
|
+
)
|
|
507
|
+
|
|
508
|
+
# ---- I6: decision-relevant runs replicate ------------------------------
|
|
509
|
+
replicates = report["replicates"]
|
|
510
|
+
if (
|
|
511
|
+
report["decision_relevant"]
|
|
512
|
+
and replicates["per_item"] < 2
|
|
513
|
+
and not replicates.get("exception")
|
|
514
|
+
):
|
|
515
|
+
errors.append(
|
|
516
|
+
f"I6: decision_relevant run with replicates.per_item={replicates['per_item']} — "
|
|
517
|
+
"require >=2 or a written replicates.exception"
|
|
518
|
+
)
|
|
519
|
+
|
|
520
|
+
# ---- I7: retained raw outputs need paths -------------------------------
|
|
521
|
+
if not report["raw_outputs"]["paths"]:
|
|
522
|
+
errors.append("I7: raw_outputs.paths is empty")
|
|
523
|
+
|
|
524
|
+
# ---- I10: every divergent item has a recorded resolution ---------------
|
|
525
|
+
if divergent:
|
|
526
|
+
if adjudication.get("applies") is True:
|
|
527
|
+
overridden = {_fold(o["item_id"]) for o in adjudication.get("overrides", [])}
|
|
528
|
+
unresolved = divergent - overridden
|
|
529
|
+
if unresolved:
|
|
530
|
+
errors.append(
|
|
531
|
+
f"I10: divergent items {sorted(unresolved)!r} have no "
|
|
532
|
+
"adjudication override recording their resolution"
|
|
533
|
+
)
|
|
534
|
+
elif not agreement["note"].strip():
|
|
535
|
+
errors.append(
|
|
536
|
+
"I10: divergence present without adjudication — "
|
|
537
|
+
"aggregate.agreement.note must record the resolution"
|
|
538
|
+
)
|
|
539
|
+
|
|
540
|
+
# ---- I11 / W1: partial judge coverage ----------------------------------
|
|
541
|
+
per_judge_sets = [
|
|
542
|
+
{_fold(row["item_id"]) for row in j["per_item"]} for j in judges
|
|
543
|
+
]
|
|
544
|
+
if per_judge_sets:
|
|
545
|
+
union = set().union(*per_judge_sets)
|
|
546
|
+
gaps = {i for s in per_judge_sets for i in union - s}
|
|
547
|
+
if gaps:
|
|
548
|
+
if report["decision_relevant"]:
|
|
549
|
+
blocked = report["attempts"]["blocked_runs"]
|
|
550
|
+
uncovered = {
|
|
551
|
+
g
|
|
552
|
+
for g in gaps
|
|
553
|
+
if not any(_names_item(_fold(b), g) for b in blocked)
|
|
554
|
+
}
|
|
555
|
+
if uncovered:
|
|
556
|
+
errors.append(
|
|
557
|
+
f"I11: items {sorted(uncovered)!r} are missing from some "
|
|
558
|
+
"judge's rows and not named in attempts.blocked_runs"
|
|
559
|
+
)
|
|
560
|
+
if report["attempts"]["partial_published"] is not True:
|
|
561
|
+
errors.append(
|
|
562
|
+
"I11: partial judge coverage requires "
|
|
563
|
+
"attempts.partial_published=true"
|
|
564
|
+
)
|
|
565
|
+
else:
|
|
566
|
+
warnings.append(
|
|
567
|
+
"W1: judges cover different item sets (partial judge failure?) — "
|
|
568
|
+
"reflect it in attempts.blocked_runs / run notes"
|
|
569
|
+
)
|
|
570
|
+
|
|
571
|
+
# ---- I12: real calendar date -------------------------------------------
|
|
572
|
+
try:
|
|
573
|
+
_dt.date.fromisoformat(report["measurement_date"])
|
|
574
|
+
except ValueError:
|
|
575
|
+
errors.append(
|
|
576
|
+
f"I12: measurement_date {report['measurement_date']!r} is not a real "
|
|
577
|
+
"calendar date"
|
|
578
|
+
)
|
|
579
|
+
|
|
580
|
+
# ---- I13: adjudication direction and lower-bound honesty (v1.1) -------
|
|
581
|
+
if report[MARKER_KEY] == "heldout-measurement/1.1":
|
|
582
|
+
direction = adjudication.get("resolution_direction")
|
|
583
|
+
if direction in {"flags_only", "other_frozen"}:
|
|
584
|
+
headline = report["aggregate"]["headline"]
|
|
585
|
+
if headline["estimand_status"] != "lower_bound":
|
|
586
|
+
errors.append(
|
|
587
|
+
f"I13: {direction} adjudication requires "
|
|
588
|
+
"aggregate.headline.estimand_status='lower_bound'"
|
|
589
|
+
)
|
|
590
|
+
if "lower bound" not in _fold(headline["construction_rule"]):
|
|
591
|
+
errors.append(
|
|
592
|
+
f"I13: {direction} headline construction_rule must explicitly "
|
|
593
|
+
"state that the result is a lower bound"
|
|
594
|
+
)
|
|
595
|
+
if not any("lower bound" in _fold(c) for c in report["caveats"]):
|
|
596
|
+
errors.append(
|
|
597
|
+
f"I13: {direction} adjudication requires a caveat explicitly "
|
|
598
|
+
"calling the headline a lower bound"
|
|
599
|
+
)
|
|
600
|
+
|
|
601
|
+
# ---- I14: preregistration + design vocabulary + claim binding ------
|
|
602
|
+
prereg = report["preregistration"]
|
|
603
|
+
if adjudication.get("applies") is True:
|
|
604
|
+
if prereg.get("rubric_ref") != adjudication.get("rubric_ref"):
|
|
605
|
+
errors.append(
|
|
606
|
+
"I14: preregistration.rubric_ref must equal "
|
|
607
|
+
"adjudication.rubric_ref"
|
|
608
|
+
)
|
|
609
|
+
if prereg.get("rubric_sha256") != adjudication.get("rubric_sha256"):
|
|
610
|
+
errors.append(
|
|
611
|
+
"I14: preregistration.rubric_sha256 must equal "
|
|
612
|
+
"adjudication.rubric_sha256"
|
|
613
|
+
)
|
|
614
|
+
|
|
615
|
+
amendment_ids: set[str] = set()
|
|
616
|
+
prior_time: _dt.datetime | None = None
|
|
617
|
+
for amendment in prereg["amendments"]:
|
|
618
|
+
aid = _fold(amendment["amendment_id"])
|
|
619
|
+
if aid in amendment_ids:
|
|
620
|
+
errors.append(f"I14: duplicate amendment_id {aid!r}")
|
|
621
|
+
amendment_ids.add(aid)
|
|
622
|
+
try:
|
|
623
|
+
recorded = _parse_timestamp(amendment["recorded_at"])
|
|
624
|
+
except (TypeError, ValueError):
|
|
625
|
+
errors.append(
|
|
626
|
+
f"I14: amendment {aid!r} has an invalid recorded_at timestamp"
|
|
627
|
+
)
|
|
628
|
+
continue
|
|
629
|
+
if prior_time is not None and recorded < prior_time:
|
|
630
|
+
errors.append(
|
|
631
|
+
"I14: preregistration amendments must be append-ordered by "
|
|
632
|
+
"recorded_at"
|
|
633
|
+
)
|
|
634
|
+
prior_time = recorded
|
|
635
|
+
|
|
636
|
+
arm_roles = report["results"]["arm_roles"]
|
|
637
|
+
cohort_arms = {_fold(v) for v in arm_roles["treatment_or_cohort_arms"]}
|
|
638
|
+
packet_arms = {_fold(v) for v in arm_roles["variant_packet_arms"]}
|
|
639
|
+
overlap = cohort_arms & packet_arms
|
|
640
|
+
if overlap:
|
|
641
|
+
errors.append(
|
|
642
|
+
f"I14: arm labels {sorted(overlap)!r} appear as both "
|
|
643
|
+
"treatment/cohort and variant-packet arms"
|
|
644
|
+
)
|
|
645
|
+
if _fold(report["results"]["design"]) in cohort_arms | packet_arms:
|
|
646
|
+
errors.append(
|
|
647
|
+
"I14: results.design is an experimental-design label and cannot "
|
|
648
|
+
"reuse an arm label"
|
|
649
|
+
)
|
|
650
|
+
|
|
651
|
+
claim_sources = {
|
|
652
|
+
"attempts": report["attempts"],
|
|
653
|
+
"aggregate": report["aggregate"],
|
|
654
|
+
"results": report["results"],
|
|
655
|
+
"verdict": report["verdict"],
|
|
656
|
+
"caveats": report["caveats"],
|
|
657
|
+
}
|
|
658
|
+
claim_text = _fold(json.dumps(claim_sources, ensure_ascii=False))
|
|
659
|
+
declared_claims = set(report["execution_manifest"]["claims"])
|
|
660
|
+
claim_patterns = {
|
|
661
|
+
"same_window": r"\bsame[- ]window\b",
|
|
662
|
+
"ordering": r"\b(?:ordered|ordering|interleav(?:ed|ing))\b",
|
|
663
|
+
"concurrency": r"\bconcurren(?:t|cy|tly)\b",
|
|
664
|
+
}
|
|
665
|
+
for claim, pattern in claim_patterns.items():
|
|
666
|
+
if _has_affirmed_claim(claim_text, pattern) and claim not in declared_claims:
|
|
667
|
+
errors.append(
|
|
668
|
+
f"I14: report text makes a {claim!r} claim but "
|
|
669
|
+
"execution_manifest.claims does not declare it"
|
|
670
|
+
)
|
|
671
|
+
|
|
672
|
+
return errors, warnings
|
|
673
|
+
|
|
674
|
+
|
|
675
|
+
def _resolution_findings(report: dict) -> list[str]:
|
|
676
|
+
"""R1-R6: attested references must resolve. Repo-relative, traversal-safe."""
|
|
677
|
+
errors: list[str] = []
|
|
678
|
+
|
|
679
|
+
def _repo_path(ref: str, label: str) -> Path | None:
|
|
680
|
+
candidate = (REPO_ROOT / ref).resolve()
|
|
681
|
+
if not candidate.is_relative_to(REPO_ROOT):
|
|
682
|
+
errors.append(f"{label}: reference {ref!r} escapes the repository root")
|
|
683
|
+
return None
|
|
684
|
+
return candidate
|
|
685
|
+
|
|
686
|
+
def _hashed_file(ref: str, expected: str, label: str, field: str) -> Path | None:
|
|
687
|
+
path = _repo_path(ref, label)
|
|
688
|
+
if path is None:
|
|
689
|
+
return None
|
|
690
|
+
if not path.is_file():
|
|
691
|
+
errors.append(f"{label}: {field} {ref!r} does not exist in the repository")
|
|
692
|
+
return None
|
|
693
|
+
digest = hashlib.sha256(path.read_bytes()).hexdigest()
|
|
694
|
+
if digest != expected:
|
|
695
|
+
errors.append(
|
|
696
|
+
f"{label}: {field} hash mismatch (declared {expected[:12]}…, "
|
|
697
|
+
f"actual {digest[:12]}…)"
|
|
698
|
+
)
|
|
699
|
+
return path
|
|
700
|
+
|
|
701
|
+
adjudication = report["adjudication"]
|
|
702
|
+
if adjudication.get("applies") is True:
|
|
703
|
+
_hashed_file(
|
|
704
|
+
adjudication["rubric_ref"],
|
|
705
|
+
adjudication["rubric_sha256"],
|
|
706
|
+
"R1",
|
|
707
|
+
"rubric_ref",
|
|
708
|
+
)
|
|
709
|
+
|
|
710
|
+
suite_dir = (HELDOUT_ROOT / report["suite"]).resolve()
|
|
711
|
+
for ref in report["raw_outputs"]["paths"]:
|
|
712
|
+
target = _repo_path(ref, "R2")
|
|
713
|
+
if target is None:
|
|
714
|
+
continue
|
|
715
|
+
if not target.is_relative_to(suite_dir):
|
|
716
|
+
errors.append(
|
|
717
|
+
f"R2: raw_outputs path {ref!r} is not under "
|
|
718
|
+
f"evals/heldout/{report['suite']}/ — raw outputs live in their "
|
|
719
|
+
"suite's directory"
|
|
720
|
+
)
|
|
721
|
+
elif not target.exists():
|
|
722
|
+
errors.append(f"R2: raw_outputs path {ref!r} does not exist")
|
|
723
|
+
|
|
724
|
+
baseline_ref = report["judge_plan"].get("legacy_baseline_ref")
|
|
725
|
+
if baseline_ref is not None:
|
|
726
|
+
baseline = _repo_path(baseline_ref, "R1")
|
|
727
|
+
if baseline is not None and not baseline.is_file():
|
|
728
|
+
errors.append(
|
|
729
|
+
f"R1: legacy_baseline_ref {baseline_ref!r} does not exist in the "
|
|
730
|
+
"repository — the comparability claim must name a real legacy row"
|
|
731
|
+
)
|
|
732
|
+
|
|
733
|
+
expert_ref = report["judge_plan"].get("expert_panel_ref")
|
|
734
|
+
if expert_ref is not None:
|
|
735
|
+
expert_path = _hashed_file(
|
|
736
|
+
expert_ref,
|
|
737
|
+
report["judge_plan"]["expert_panel_sha256"],
|
|
738
|
+
"R6",
|
|
739
|
+
"expert_panel_ref",
|
|
740
|
+
)
|
|
741
|
+
if expert_path is not None:
|
|
742
|
+
if not expert_path.is_relative_to(suite_dir):
|
|
743
|
+
errors.append(
|
|
744
|
+
f"R6: expert panel {expert_ref!r} is not under "
|
|
745
|
+
f"evals/heldout/{report['suite']}/"
|
|
746
|
+
)
|
|
747
|
+
try:
|
|
748
|
+
panel = _loads_strict(expert_path.read_text(encoding="utf-8"))
|
|
749
|
+
except (OSError, UnicodeError, json.JSONDecodeError, ValueError) as exc:
|
|
750
|
+
errors.append(f"R6: expert panel is not strict JSON ({exc})")
|
|
751
|
+
else:
|
|
752
|
+
if not isinstance(panel, dict):
|
|
753
|
+
errors.append("R6: expert panel root must be an object")
|
|
754
|
+
else:
|
|
755
|
+
if panel.get("suite") != report["suite"]:
|
|
756
|
+
errors.append(
|
|
757
|
+
"R6: expert panel suite does not match the measurement report"
|
|
758
|
+
)
|
|
759
|
+
experts = panel.get("experts")
|
|
760
|
+
if not isinstance(experts, list) or len(experts) < 2:
|
|
761
|
+
errors.append(
|
|
762
|
+
"R6: human_expert_panel requires at least two experts"
|
|
763
|
+
)
|
|
764
|
+
else:
|
|
765
|
+
expert_ids: list[str] = []
|
|
766
|
+
for index, expert in enumerate(experts):
|
|
767
|
+
if not isinstance(expert, dict):
|
|
768
|
+
errors.append(
|
|
769
|
+
f"R6: experts[{index}] must be an object"
|
|
770
|
+
)
|
|
771
|
+
continue
|
|
772
|
+
expert_id = expert.get("expert_id")
|
|
773
|
+
if not isinstance(expert_id, str) or not expert_id.strip():
|
|
774
|
+
errors.append(
|
|
775
|
+
f"R6: experts[{index}].expert_id must be non-empty"
|
|
776
|
+
)
|
|
777
|
+
else:
|
|
778
|
+
expert_ids.append(_fold(expert_id))
|
|
779
|
+
if expert.get("expert_type") != "human":
|
|
780
|
+
errors.append(
|
|
781
|
+
f"R6: experts[{index}] must declare expert_type='human'"
|
|
782
|
+
)
|
|
783
|
+
if expert.get("independent") is not True:
|
|
784
|
+
errors.append(
|
|
785
|
+
f"R6: experts[{index}] must attest independent=true"
|
|
786
|
+
)
|
|
787
|
+
blinded = expert.get("blinded_to")
|
|
788
|
+
required_blinding = {"arm_identity", "mechanism_state"}
|
|
789
|
+
if not isinstance(blinded, list) or not required_blinding.issubset(
|
|
790
|
+
set(value for value in blinded if isinstance(value, str))
|
|
791
|
+
):
|
|
792
|
+
errors.append(
|
|
793
|
+
f"R6: experts[{index}] must be blinded to arm_identity "
|
|
794
|
+
"and mechanism_state"
|
|
795
|
+
)
|
|
796
|
+
if len(expert_ids) != len(set(expert_ids)):
|
|
797
|
+
errors.append(
|
|
798
|
+
"R6: expert_id values must be unique after identity folding"
|
|
799
|
+
)
|
|
800
|
+
panel_adjudication = panel.get("adjudication")
|
|
801
|
+
if not isinstance(panel_adjudication, dict):
|
|
802
|
+
errors.append("R6: expert panel adjudication must be an object")
|
|
803
|
+
else:
|
|
804
|
+
if panel_adjudication.get("adjudicator_type") != "human":
|
|
805
|
+
errors.append(
|
|
806
|
+
"R6: expert panel adjudicator_type must be 'human'"
|
|
807
|
+
)
|
|
808
|
+
if panel_adjudication.get("arm_blind") is not True:
|
|
809
|
+
errors.append(
|
|
810
|
+
"R6: expert panel adjudication must attest arm_blind=true"
|
|
811
|
+
)
|
|
812
|
+
if panel_adjudication.get("disagreements_retained") is not True:
|
|
813
|
+
errors.append(
|
|
814
|
+
"R6: expert panel adjudication must retain disagreements"
|
|
815
|
+
)
|
|
816
|
+
|
|
817
|
+
commit = report["subject"]["config"]["suite_commit"]
|
|
818
|
+
try:
|
|
819
|
+
probe = subprocess.run(
|
|
820
|
+
["git", "cat-file", "-e", f"{commit}^{{commit}}"],
|
|
821
|
+
cwd=REPO_ROOT,
|
|
822
|
+
capture_output=True,
|
|
823
|
+
text=True,
|
|
824
|
+
)
|
|
825
|
+
missing = probe.returncode != 0
|
|
826
|
+
except (OSError, ValueError) as exc:
|
|
827
|
+
errors.append(f"R3: could not verify suite_commit ({exc})")
|
|
828
|
+
missing = False
|
|
829
|
+
if missing:
|
|
830
|
+
errors.append(
|
|
831
|
+
f"R3: subject.config.suite_commit {commit!r} is not a commit in this "
|
|
832
|
+
"repository"
|
|
833
|
+
)
|
|
834
|
+
|
|
835
|
+
if report[MARKER_KEY] == "heldout-measurement/1.1":
|
|
836
|
+
prereg = report["preregistration"]
|
|
837
|
+
_hashed_file(prereg["plan_ref"], prereg["plan_sha256"], "R4", "plan_ref")
|
|
838
|
+
if adjudication.get("applies") is not True and prereg.get("rubric_ref"):
|
|
839
|
+
_hashed_file(
|
|
840
|
+
prereg["rubric_ref"],
|
|
841
|
+
prereg["rubric_sha256"],
|
|
842
|
+
"R4",
|
|
843
|
+
"rubric_ref",
|
|
844
|
+
)
|
|
845
|
+
|
|
846
|
+
frozen_commit = prereg["frozen_commit"]
|
|
847
|
+
try:
|
|
848
|
+
frozen_probe = subprocess.run(
|
|
849
|
+
["git", "cat-file", "-e", f"{frozen_commit}^{{commit}}"],
|
|
850
|
+
cwd=REPO_ROOT,
|
|
851
|
+
capture_output=True,
|
|
852
|
+
text=True,
|
|
853
|
+
)
|
|
854
|
+
frozen_missing = frozen_probe.returncode != 0
|
|
855
|
+
except (OSError, ValueError) as exc:
|
|
856
|
+
errors.append(f"R4: could not verify preregistration.frozen_commit ({exc})")
|
|
857
|
+
frozen_missing = False
|
|
858
|
+
if frozen_missing:
|
|
859
|
+
errors.append(
|
|
860
|
+
f"R4: preregistration.frozen_commit {frozen_commit!r} is not a "
|
|
861
|
+
"commit in this repository"
|
|
862
|
+
)
|
|
863
|
+
|
|
864
|
+
execution = report["execution_manifest"]
|
|
865
|
+
manifest_path = _hashed_file(
|
|
866
|
+
execution["ref"], execution["sha256"], "R5", "execution_manifest.ref"
|
|
867
|
+
)
|
|
868
|
+
if manifest_path is not None:
|
|
869
|
+
if not manifest_path.is_relative_to(suite_dir):
|
|
870
|
+
errors.append(
|
|
871
|
+
f"R5: execution manifest {execution['ref']!r} is not under "
|
|
872
|
+
f"evals/heldout/{report['suite']}/"
|
|
873
|
+
)
|
|
874
|
+
try:
|
|
875
|
+
manifest = _loads_strict(manifest_path.read_text(encoding="utf-8"))
|
|
876
|
+
except (OSError, ValueError, RecursionError) as exc:
|
|
877
|
+
errors.append(f"R5: execution manifest is not strict JSON ({exc})")
|
|
878
|
+
else:
|
|
879
|
+
schema_errors = list(_execution_validator().iter_errors(manifest))
|
|
880
|
+
errors.extend(
|
|
881
|
+
f"R5: execution manifest schema {list(e.absolute_path)}: {e.message}"
|
|
882
|
+
for e in schema_errors
|
|
883
|
+
)
|
|
884
|
+
if not schema_errors:
|
|
885
|
+
if manifest["suite"] != report["suite"]:
|
|
886
|
+
errors.append(
|
|
887
|
+
"R5: execution manifest suite does not match the report"
|
|
888
|
+
)
|
|
889
|
+
call_ids: set[str] = set()
|
|
890
|
+
sequence_indexes: set[int] = set()
|
|
891
|
+
for call in manifest["calls"]:
|
|
892
|
+
cid = _fold(call["call_id"])
|
|
893
|
+
if cid in call_ids:
|
|
894
|
+
errors.append(f"R5: duplicate execution call_id {cid!r}")
|
|
895
|
+
call_ids.add(cid)
|
|
896
|
+
seq = call["sequence_index"]
|
|
897
|
+
if seq in sequence_indexes:
|
|
898
|
+
errors.append(f"R5: duplicate execution sequence_index {seq}")
|
|
899
|
+
sequence_indexes.add(seq)
|
|
900
|
+
errors.extend(
|
|
901
|
+
_execution_claim_errors(
|
|
902
|
+
manifest, set(report["execution_manifest"]["claims"])
|
|
903
|
+
)
|
|
904
|
+
)
|
|
905
|
+
|
|
906
|
+
return errors
|
|
907
|
+
|
|
908
|
+
|
|
909
|
+
def location_errors(path: Path, report: dict) -> list[str]:
|
|
910
|
+
"""L1: a report filed under evals/heldout/<dir>/ must declare suite == <dir>.
|
|
911
|
+
|
|
912
|
+
Uses the path AS FILED (absolute but unresolved), so a row reached through
|
|
913
|
+
a symlinked suite directory is judged by where it is filed, not where the
|
|
914
|
+
bytes physically live. Paths outside evals/heldout/ (drafts) are unchecked.
|
|
915
|
+
"""
|
|
916
|
+
try:
|
|
917
|
+
rel = path.absolute().relative_to(HELDOUT_ROOT.absolute())
|
|
918
|
+
except ValueError:
|
|
919
|
+
return []
|
|
920
|
+
parts = rel.parts
|
|
921
|
+
if len(parts) < 2:
|
|
922
|
+
return [
|
|
923
|
+
"L1: a contract row must live inside a suite directory "
|
|
924
|
+
"(evals/heldout/<suite>/...), not at the evals/heldout/ root"
|
|
925
|
+
]
|
|
926
|
+
if parts[0] != report.get("suite"):
|
|
927
|
+
return [
|
|
928
|
+
f"L1: report filed under evals/heldout/{parts[0]}/ declares "
|
|
929
|
+
f"suite={report.get('suite')!r} — the containing suite directory "
|
|
930
|
+
"and the declared suite must match"
|
|
931
|
+
]
|
|
932
|
+
return []
|
|
933
|
+
|
|
934
|
+
|
|
935
|
+
def _validate_report(
|
|
936
|
+
report: dict, *, resolve_refs: bool, allow_frozen_v1_0: bool
|
|
937
|
+
) -> tuple[list[str], list[str]]:
|
|
938
|
+
"""Full validation: (errors, warnings). Does not mutate the input.
|
|
939
|
+
|
|
940
|
+
Schema errors short-circuit: invariants only run on schema-valid reports,
|
|
941
|
+
so a schema-invalid file reports its schema errors alone. resolve_refs
|
|
942
|
+
additionally runs R1-R5 (CLI/CI mode; needs the repository checkout).
|
|
943
|
+
"""
|
|
944
|
+
validator = _validator()
|
|
945
|
+
schema_errors = [
|
|
946
|
+
f"schema {list(e.absolute_path)}: {e.message}"
|
|
947
|
+
for e in validator.iter_errors(report)
|
|
948
|
+
]
|
|
949
|
+
if schema_errors:
|
|
950
|
+
return schema_errors, []
|
|
951
|
+
if (
|
|
952
|
+
report[MARKER_KEY] == "heldout-measurement/1.0"
|
|
953
|
+
and not allow_frozen_v1_0
|
|
954
|
+
):
|
|
955
|
+
return [
|
|
956
|
+
"I15: heldout-measurement/1.0 is frozen; only the exact allowlisted "
|
|
957
|
+
"path and SHA-256 may use it"
|
|
958
|
+
], []
|
|
959
|
+
errors, warnings = _invariant_findings(report)
|
|
960
|
+
if resolve_refs and not errors:
|
|
961
|
+
errors.extend(_resolution_findings(report))
|
|
962
|
+
return errors, warnings
|
|
963
|
+
|
|
964
|
+
|
|
965
|
+
def validate_report(
|
|
966
|
+
report: dict, *, resolve_refs: bool = False
|
|
967
|
+
) -> tuple[list[str], list[str]]:
|
|
968
|
+
"""Validate a newly authored report; the weaker frozen v1.0 is rejected.
|
|
969
|
+
|
|
970
|
+
Only the path-aware CLI entry point can authorize the one frozen row after
|
|
971
|
+
matching both its repository path and SHA-256.
|
|
972
|
+
"""
|
|
973
|
+
return _validate_report(
|
|
974
|
+
report,
|
|
975
|
+
resolve_refs=resolve_refs,
|
|
976
|
+
allow_frozen_v1_0=False,
|
|
977
|
+
)
|
|
978
|
+
|
|
979
|
+
|
|
980
|
+
def _validate_obj(path: Path, report: dict) -> int:
|
|
981
|
+
allow_frozen_v1_0 = False
|
|
982
|
+
expected_hash = FROZEN_V1_0_ROWS.get(path.absolute())
|
|
983
|
+
if expected_hash is not None and report.get(MARKER_KEY) == "heldout-measurement/1.0":
|
|
984
|
+
try:
|
|
985
|
+
allow_frozen_v1_0 = hashlib.sha256(path.read_bytes()).hexdigest() == expected_hash
|
|
986
|
+
except OSError:
|
|
987
|
+
allow_frozen_v1_0 = False
|
|
988
|
+
errors, warnings = _validate_report(
|
|
989
|
+
report,
|
|
990
|
+
# The byte-pinned 1.0 row predates this resolver contract and may name
|
|
991
|
+
# commits omitted by a shallow CI checkout. Its exact path+SHA is the
|
|
992
|
+
# authorization; do not retrofit R1-R5 onto that frozen artifact.
|
|
993
|
+
resolve_refs=not allow_frozen_v1_0,
|
|
994
|
+
allow_frozen_v1_0=allow_frozen_v1_0,
|
|
995
|
+
)
|
|
996
|
+
errors.extend(location_errors(path, report))
|
|
997
|
+
for w in warnings:
|
|
998
|
+
print(f"{path}: {w}", file=sys.stderr)
|
|
999
|
+
if errors:
|
|
1000
|
+
for e in errors:
|
|
1001
|
+
print(f"ERROR: {path}: {e}")
|
|
1002
|
+
return 1
|
|
1003
|
+
print(f"OK: {path} validates against {report.get(MARKER_KEY)}")
|
|
1004
|
+
return 0
|
|
1005
|
+
|
|
1006
|
+
|
|
1007
|
+
def _walk_json_files(root: Path) -> tuple[list[Path], list[str]]:
|
|
1008
|
+
"""All *.json files under root (case-insensitive extension), following
|
|
1009
|
+
directory symlinks with a resolved-path cycle guard.
|
|
1010
|
+
|
|
1011
|
+
Symlinked directories are followed only when their resolved target stays
|
|
1012
|
+
inside the repository — an external target cannot hold repo-published
|
|
1013
|
+
rows (git stores the link, not the content) and following it would let
|
|
1014
|
+
the walk traverse arbitrary trees. Unreadable directories are surfaced
|
|
1015
|
+
as walk errors, never silently skipped."""
|
|
1016
|
+
found: list[Path] = []
|
|
1017
|
+
walk_errors: list[str] = []
|
|
1018
|
+
visited: set[Path] = set()
|
|
1019
|
+
repo_real = REPO_ROOT.resolve()
|
|
1020
|
+
root_real = root.resolve()
|
|
1021
|
+
|
|
1022
|
+
def _walk(directory: Path) -> None:
|
|
1023
|
+
real = directory.resolve()
|
|
1024
|
+
if real in visited:
|
|
1025
|
+
return
|
|
1026
|
+
if not (real.is_relative_to(root_real) or real.is_relative_to(repo_real)):
|
|
1027
|
+
walk_errors.append(
|
|
1028
|
+
f"{directory}: symlinked directory resolves outside the "
|
|
1029
|
+
"repository — not scanned (repo-published rows cannot live there)"
|
|
1030
|
+
)
|
|
1031
|
+
return
|
|
1032
|
+
visited.add(real)
|
|
1033
|
+
try:
|
|
1034
|
+
entries = sorted(os.scandir(directory), key=lambda e: e.name)
|
|
1035
|
+
except OSError as exc:
|
|
1036
|
+
walk_errors.append(f"{directory}: unreadable directory: {exc}")
|
|
1037
|
+
return
|
|
1038
|
+
for entry in entries:
|
|
1039
|
+
p = directory / entry.name
|
|
1040
|
+
try:
|
|
1041
|
+
is_dir = entry.is_dir(follow_symlinks=True)
|
|
1042
|
+
except OSError:
|
|
1043
|
+
is_dir = False
|
|
1044
|
+
if is_dir:
|
|
1045
|
+
_walk(p)
|
|
1046
|
+
elif p.suffix.lower() == ".json":
|
|
1047
|
+
try:
|
|
1048
|
+
file_real = p.resolve()
|
|
1049
|
+
except OSError:
|
|
1050
|
+
file_real = p
|
|
1051
|
+
if not (
|
|
1052
|
+
file_real.is_relative_to(root_real)
|
|
1053
|
+
or file_real.is_relative_to(repo_real)
|
|
1054
|
+
):
|
|
1055
|
+
walk_errors.append(
|
|
1056
|
+
f"{p}: file symlink resolves outside the repository — "
|
|
1057
|
+
"not scanned (repo-published rows cannot live there)"
|
|
1058
|
+
)
|
|
1059
|
+
continue
|
|
1060
|
+
found.append(p)
|
|
1061
|
+
|
|
1062
|
+
_walk(root)
|
|
1063
|
+
return found, walk_errors
|
|
1064
|
+
|
|
1065
|
+
|
|
1066
|
+
def _scan_all() -> int:
|
|
1067
|
+
rc = 0
|
|
1068
|
+
opted_in = 0
|
|
1069
|
+
scanned = 0
|
|
1070
|
+
files, walk_errors = _walk_json_files(HELDOUT_ROOT)
|
|
1071
|
+
for err in walk_errors:
|
|
1072
|
+
print(f"ERROR: {err}")
|
|
1073
|
+
rc = 1
|
|
1074
|
+
for path in files:
|
|
1075
|
+
if path.resolve() in (
|
|
1076
|
+
SCHEMA_PATH.resolve(),
|
|
1077
|
+
EXECUTION_SCHEMA_PATH.resolve(),
|
|
1078
|
+
TEMPLATE_PATH.resolve(),
|
|
1079
|
+
REGISTRY_PATH.resolve(),
|
|
1080
|
+
):
|
|
1081
|
+
continue
|
|
1082
|
+
scanned += 1
|
|
1083
|
+
try:
|
|
1084
|
+
raw = path.read_bytes()
|
|
1085
|
+
except OSError as exc:
|
|
1086
|
+
print(f"ERROR: {path}: unreadable JSON file under evals/heldout/: {exc}")
|
|
1087
|
+
rc = 1
|
|
1088
|
+
continue
|
|
1089
|
+
try:
|
|
1090
|
+
text = raw.decode("utf-8")
|
|
1091
|
+
except UnicodeDecodeError as exc:
|
|
1092
|
+
print(f"ERROR: {path}: not valid UTF-8 ({exc}) — JSON must be UTF-8")
|
|
1093
|
+
rc = 1
|
|
1094
|
+
continue
|
|
1095
|
+
# Detection is on the PARSED document, so a \u-escaped spelling of
|
|
1096
|
+
# the marker key cannot hide a report from the scan.
|
|
1097
|
+
try:
|
|
1098
|
+
lenient = json.loads(text)
|
|
1099
|
+
except (ValueError, RecursionError) as exc:
|
|
1100
|
+
if MARKER_KEY in text.replace("\\u005f", "_"):
|
|
1101
|
+
print(
|
|
1102
|
+
f"ERROR: {path}: mentions {MARKER_KEY!r} but does not parse "
|
|
1103
|
+
f"as JSON ({exc})"
|
|
1104
|
+
)
|
|
1105
|
+
rc = 1
|
|
1106
|
+
continue
|
|
1107
|
+
if not isinstance(lenient, dict):
|
|
1108
|
+
continue
|
|
1109
|
+
status = marker_status(lenient)
|
|
1110
|
+
if status == "absent":
|
|
1111
|
+
continue
|
|
1112
|
+
# Marked (or near-miss-marked) files must survive the strict parse.
|
|
1113
|
+
try:
|
|
1114
|
+
obj = _loads_strict(text)
|
|
1115
|
+
except (ValueError, RecursionError) as exc:
|
|
1116
|
+
print(
|
|
1117
|
+
f"ERROR: {path}: carries {MARKER_KEY!r} but fails strict JSON "
|
|
1118
|
+
f"parse ({exc}) — a contract-marked file may not carry duplicate "
|
|
1119
|
+
"keys or non-finite numbers"
|
|
1120
|
+
)
|
|
1121
|
+
rc = 1
|
|
1122
|
+
opted_in += 1
|
|
1123
|
+
continue
|
|
1124
|
+
if status == "near_miss":
|
|
1125
|
+
print(
|
|
1126
|
+
f"ERROR: {path}: {MARKER_KEY} value {lenient.get(MARKER_KEY)!r} is "
|
|
1127
|
+
f"not the exact contract marker (expected prefix {CONTRACT_PREFIX!r}) "
|
|
1128
|
+
"— near-miss markers fail loudly rather than skipping validation"
|
|
1129
|
+
)
|
|
1130
|
+
rc = 1
|
|
1131
|
+
opted_in += 1
|
|
1132
|
+
else:
|
|
1133
|
+
opted_in += 1
|
|
1134
|
+
rc = max(rc, _validate_obj(path, obj))
|
|
1135
|
+
if opted_in == 0 and rc == 0:
|
|
1136
|
+
print(
|
|
1137
|
+
f"OK: no contract-marked reports among {scanned} JSON file(s) "
|
|
1138
|
+
"under evals/heldout/; legacy rows are out of scope by design"
|
|
1139
|
+
)
|
|
1140
|
+
return rc
|
|
1141
|
+
|
|
1142
|
+
|
|
1143
|
+
def _load(path: Path) -> dict | None:
|
|
1144
|
+
try:
|
|
1145
|
+
obj = _loads_strict(path.read_text(encoding="utf-8"))
|
|
1146
|
+
except (OSError, ValueError, RecursionError) as exc:
|
|
1147
|
+
print(f"ERROR: {path}: failed to load: {exc}")
|
|
1148
|
+
return None
|
|
1149
|
+
if not isinstance(obj, dict):
|
|
1150
|
+
print(f"ERROR: {path}: top-level JSON value is not an object")
|
|
1151
|
+
return None
|
|
1152
|
+
return obj
|
|
1153
|
+
|
|
1154
|
+
|
|
1155
|
+
def main() -> int:
|
|
1156
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
1157
|
+
parser.add_argument("reports", nargs="*", type=Path)
|
|
1158
|
+
parser.add_argument(
|
|
1159
|
+
"--all",
|
|
1160
|
+
action="store_true",
|
|
1161
|
+
help="walk evals/heldout/ and validate every contract-marked JSON file",
|
|
1162
|
+
)
|
|
1163
|
+
args = parser.parse_args()
|
|
1164
|
+
|
|
1165
|
+
if args.all:
|
|
1166
|
+
return _scan_all()
|
|
1167
|
+
|
|
1168
|
+
if not args.reports:
|
|
1169
|
+
print("ERROR: pass report path(s) or --all", file=sys.stderr)
|
|
1170
|
+
return 2
|
|
1171
|
+
rc = 0
|
|
1172
|
+
for path in args.reports:
|
|
1173
|
+
obj = _load(path)
|
|
1174
|
+
rc = max(rc, 1 if obj is None else _validate_obj(path, obj))
|
|
1175
|
+
return rc
|
|
1176
|
+
|
|
1177
|
+
|
|
1178
|
+
if __name__ == "__main__":
|
|
1179
|
+
sys.exit(main())
|