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,882 @@
|
|
|
1
|
+
"""Calibration-mode test for v3.8 claim_ref_alignment_audit_agent (T-C1..T-C3).
|
|
2
|
+
|
|
3
|
+
Per spec §7.7 in
|
|
4
|
+
docs/design/2026-05-15-issue-103-claim-alignment-audit-spec.md.
|
|
5
|
+
|
|
6
|
+
Three-tier acceptance:
|
|
7
|
+
|
|
8
|
+
- T-C1: FNR < 0.15 AND FPR < 0.10 against the synthetic 25-tuple gold set.
|
|
9
|
+
Threshold failures are CI gates, not advisory.
|
|
10
|
+
- T-C2: per-class FNR/FPR (SUPPORTED / UNSUPPORTED / AMBIGUOUS /
|
|
11
|
+
violated-constraint) appear in the calibration report.
|
|
12
|
+
- T-C3: gold-set shape integrity — each tuple has tuple_kind ∈ {alignment,
|
|
13
|
+
constraint}, alignment tuples carry expected_judgment ∈ {SUPPORTED,
|
|
14
|
+
UNSUPPORTED, AMBIGUOUS, RETRIEVAL_FAILED} with no constraint fields,
|
|
15
|
+
constraint tuples carry expected_judgment ∈ {VIOLATED, NOT_VIOLATED} +
|
|
16
|
+
constraint_under_test_id + (constraint_under_test_rule_text OR
|
|
17
|
+
manifest_fixture_path), and the gold set has ≥3 NOT_VIOLATED constraint
|
|
18
|
+
tuples (else constraint FPR is unmeasurable).
|
|
19
|
+
|
|
20
|
+
Why three tiers:
|
|
21
|
+
- T-C2 catches calibration tooling regressions (script doesn't compute or
|
|
22
|
+
doesn't write report) distinct from gold-set degradation.
|
|
23
|
+
- T-C3 catches gold-set authoring bugs (missing required rule text /
|
|
24
|
+
insufficient NOT_VIOLATED count) before they silently bypass T-C1.
|
|
25
|
+
- T-C1 catches model/judge quality regression.
|
|
26
|
+
|
|
27
|
+
Spec § 7 writes `tests/test_claim_audit_calibration.py`; repo convention
|
|
28
|
+
is `scripts/test_*.py` per spec §13 step 9 path-mapping rule. CI uses
|
|
29
|
+
`python -m unittest scripts.test_*`.
|
|
30
|
+
|
|
31
|
+
Run:
|
|
32
|
+
python -m unittest scripts.test_claim_audit_calibration -v
|
|
33
|
+
"""
|
|
34
|
+
from __future__ import annotations
|
|
35
|
+
|
|
36
|
+
import json
|
|
37
|
+
import unittest
|
|
38
|
+
from pathlib import Path
|
|
39
|
+
from typing import Any, Callable
|
|
40
|
+
|
|
41
|
+
from scripts.claim_audit_calibration import (
|
|
42
|
+
GoldSetValidationError,
|
|
43
|
+
run_calibration,
|
|
44
|
+
validate_gold_set,
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
REPO_ROOT = Path(__file__).resolve().parent.parent
|
|
48
|
+
GOLD_SET_PATH = REPO_ROOT / "scripts" / "fixtures" / "claim_audit_calibration" / "gold_set.json"
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _load_gold_set() -> list[dict[str, Any]]:
|
|
52
|
+
with GOLD_SET_PATH.open(encoding="utf-8") as fh:
|
|
53
|
+
return json.load(fh)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _tuple_lookup_key(tup: dict[str, Any]) -> tuple[str, str, str | None]:
|
|
57
|
+
"""Composite lookup key so identical claim_text on different tuple_kind /
|
|
58
|
+
constraint_id pairs disambiguate (round-1 review closure).
|
|
59
|
+
|
|
60
|
+
The canonical gold set currently has unique claim_text per tuple, but
|
|
61
|
+
future gold sets may evaluate the same claim under different MNC ids
|
|
62
|
+
(e.g. one alignment tuple + one constraint tuple sharing prose). A
|
|
63
|
+
claim_text-only key would silently overwrite earlier entries and
|
|
64
|
+
cause _perfect_judge to return the wrong stub response, falsely
|
|
65
|
+
triggering T-C1 failures.
|
|
66
|
+
"""
|
|
67
|
+
return (
|
|
68
|
+
tup["tuple_kind"],
|
|
69
|
+
tup["claim_text"],
|
|
70
|
+
tup.get("constraint_under_test_id"),
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _perfect_judge() -> Callable[..., dict[str, Any]]:
|
|
75
|
+
"""Stub judge that returns the gold-set expected_judgment verbatim.
|
|
76
|
+
|
|
77
|
+
Used by T-C1 to verify the calibration script's FNR / FPR computation
|
|
78
|
+
on a path where the judge perfectly matches the gold set. The stub
|
|
79
|
+
looks up the tuple by composite key (tuple_kind, claim_text,
|
|
80
|
+
constraint_under_test_id) so duplicate claim_text under different
|
|
81
|
+
constraint scopes does not collapse. The dispatch infers tuple kind
|
|
82
|
+
from kwargs: a non-empty `active_constraints` list means the runner
|
|
83
|
+
is on the constraint code path. A real LLM judge wires here at
|
|
84
|
+
operational deployment per the protocol doc.
|
|
85
|
+
"""
|
|
86
|
+
tuples_by_key: dict[tuple[str, str, str | None], dict[str, Any]] = {
|
|
87
|
+
_tuple_lookup_key(t): t for t in _load_gold_set()
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
def fn(**kwargs: Any) -> dict[str, Any]:
|
|
91
|
+
claim_text = kwargs.get("claim_text", "")
|
|
92
|
+
active = kwargs.get("active_constraints") or []
|
|
93
|
+
constraint_id = active[0]["constraint_id"] if active else None
|
|
94
|
+
kind = "constraint" if active else "alignment"
|
|
95
|
+
tup = tuples_by_key.get((kind, claim_text, constraint_id))
|
|
96
|
+
if tup is None:
|
|
97
|
+
raise AssertionError(
|
|
98
|
+
f"perfect_judge: no gold tuple for kind={kind!r} "
|
|
99
|
+
f"claim_text={claim_text!r} constraint_id={constraint_id!r}"
|
|
100
|
+
)
|
|
101
|
+
expected = tup["expected_judgment"]
|
|
102
|
+
if kind == "alignment":
|
|
103
|
+
resp: dict[str, Any] = {"judgment": expected, "rationale": "perfect-judge stub"}
|
|
104
|
+
# A genuinely-perfect judge on a partial fixture (#213) emits the
|
|
105
|
+
# normalized UNSUPPORTED verdict AND a breakdown that actually
|
|
106
|
+
# decomposes THIS claim — it echoes the fixture's expected_sub_claims
|
|
107
|
+
# (key tokens + verdict) so it passes both the shape gate and the
|
|
108
|
+
# content-match (#213 P1-3). A dummy two-line breakdown would now miss.
|
|
109
|
+
if tup.get("expected_prompt_verdict") == "PARTIAL":
|
|
110
|
+
resp["sub_claim_breakdown"] = [
|
|
111
|
+
{
|
|
112
|
+
"sub_claim_text": " ".join(esc.get("key_tokens", [])) or "sub-claim",
|
|
113
|
+
"sub_verdict": esc.get("sub_verdict", "UNSUPPORTED"),
|
|
114
|
+
}
|
|
115
|
+
for esc in tup.get("expected_sub_claims", [])
|
|
116
|
+
]
|
|
117
|
+
return resp
|
|
118
|
+
# constraint tuple
|
|
119
|
+
if expected == "VIOLATED":
|
|
120
|
+
return {
|
|
121
|
+
"judgment": "VIOLATED",
|
|
122
|
+
"violated_constraint_id": tup["constraint_under_test_id"],
|
|
123
|
+
"rationale": "perfect-judge stub",
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
"judgment": "NOT_VIOLATED",
|
|
127
|
+
"rationale": "perfect-judge stub",
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return fn
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
_BAD_JUDGE_FLIP_ALIGNMENT: dict[str, str] = {
|
|
134
|
+
"SUPPORTED": "UNSUPPORTED",
|
|
135
|
+
"UNSUPPORTED": "SUPPORTED",
|
|
136
|
+
"AMBIGUOUS": "UNSUPPORTED",
|
|
137
|
+
"RETRIEVAL_FAILED": "SUPPORTED",
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def _bad_judge() -> Callable[..., dict[str, Any]]:
|
|
142
|
+
"""Stub judge that intentionally returns wrong labels to drive non-zero
|
|
143
|
+
FNR/FPR (round-1 review closure on tautological T-C1).
|
|
144
|
+
|
|
145
|
+
Used by `TC1ThresholdEnforcementBadJudge` to verify that
|
|
146
|
+
`run_calibration` accurately COMPUTES FNR/FPR and that the threshold
|
|
147
|
+
gate WOULD fire when the judge degrades. Without this companion test
|
|
148
|
+
T-C1 only proves tooling correctness on a perfect-mirror stub;
|
|
149
|
+
pairing both proves tooling correctness AND threshold-gate
|
|
150
|
+
enforceability.
|
|
151
|
+
|
|
152
|
+
Strategy: flip every alignment expected label to its opposite class
|
|
153
|
+
and flip every VIOLATED expected to NOT_VIOLATED. Drives every tuple
|
|
154
|
+
into FN/FP territory so aggregate FNR + FPR both massively exceed
|
|
155
|
+
the thresholds.
|
|
156
|
+
|
|
157
|
+
round-2 review closure: lookup tables are built ONCE at factory time
|
|
158
|
+
(not per fn() call) so the gold set isn't re-read from disk for every
|
|
159
|
+
judge invocation. Both alignment and constraint paths use the
|
|
160
|
+
composite key from `_tuple_lookup_key` so duplicate claim_text under
|
|
161
|
+
different (tuple_kind, constraint_id) never silently collapses
|
|
162
|
+
— same hardening _perfect_judge already carries.
|
|
163
|
+
"""
|
|
164
|
+
tuples_by_key: dict[tuple[str, str, str | None], dict[str, Any]] = {
|
|
165
|
+
_tuple_lookup_key(t): t for t in _load_gold_set()
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
def fn(**kwargs: Any) -> dict[str, Any]:
|
|
169
|
+
claim_text = kwargs.get("claim_text", "")
|
|
170
|
+
active = kwargs.get("active_constraints") or []
|
|
171
|
+
constraint_id = active[0]["constraint_id"] if active else None
|
|
172
|
+
kind = "constraint" if active else "alignment"
|
|
173
|
+
tup = tuples_by_key.get((kind, claim_text, constraint_id))
|
|
174
|
+
if tup is None:
|
|
175
|
+
raise AssertionError(
|
|
176
|
+
f"bad_judge: no gold tuple for kind={kind!r} "
|
|
177
|
+
f"claim_text={claim_text!r} constraint_id={constraint_id!r}"
|
|
178
|
+
)
|
|
179
|
+
if kind == "alignment":
|
|
180
|
+
return {
|
|
181
|
+
"judgment": _BAD_JUDGE_FLIP_ALIGNMENT[tup["expected_judgment"]],
|
|
182
|
+
"rationale": "bad-judge stub (flipped)",
|
|
183
|
+
}
|
|
184
|
+
# Constraint path — flip VIOLATED ↔ NOT_VIOLATED.
|
|
185
|
+
if tup["expected_judgment"] == "VIOLATED":
|
|
186
|
+
return {"judgment": "NOT_VIOLATED", "rationale": "bad-judge flip"}
|
|
187
|
+
return {
|
|
188
|
+
"judgment": "VIOLATED",
|
|
189
|
+
"violated_constraint_id": constraint_id,
|
|
190
|
+
"rationale": "bad-judge flip",
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return fn
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
# ---------------------------------------------------------------------------
|
|
197
|
+
# T-C3 — Gold-set shape integrity.
|
|
198
|
+
# ---------------------------------------------------------------------------
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
class TC3GoldSetShape(unittest.TestCase):
|
|
202
|
+
"""T-C3 catches gold-set authoring bugs before T-C1 can silently bypass them.
|
|
203
|
+
|
|
204
|
+
Spec §7.7 list (a)-(d):
|
|
205
|
+
(a) every tuple has tuple_kind ∈ {alignment, constraint}
|
|
206
|
+
(b) alignment tuples → expected_judgment in 4-alignment-judgment set,
|
|
207
|
+
NO constraint fields
|
|
208
|
+
(c) constraint tuples → expected_judgment ∈ {VIOLATED, NOT_VIOLATED}
|
|
209
|
+
AND constraint_under_test_id AND
|
|
210
|
+
(constraint_under_test_rule_text OR manifest_fixture_path)
|
|
211
|
+
(d) ≥3 NOT_VIOLATED constraint tuples (else FPR is unmeasurable)
|
|
212
|
+
|
|
213
|
+
Any violation is rejected at calibration ingestion with a diagnostic
|
|
214
|
+
naming the rule that failed.
|
|
215
|
+
"""
|
|
216
|
+
|
|
217
|
+
def setUp(self) -> None:
|
|
218
|
+
self.gold_set = _load_gold_set()
|
|
219
|
+
|
|
220
|
+
def test_a_every_tuple_has_valid_tuple_kind(self) -> None:
|
|
221
|
+
# All tuples must declare tuple_kind ∈ {alignment, constraint}.
|
|
222
|
+
# Spec §7.7 rule (a).
|
|
223
|
+
for idx, tup in enumerate(self.gold_set):
|
|
224
|
+
self.assertIn(
|
|
225
|
+
tup.get("tuple_kind"),
|
|
226
|
+
{"alignment", "constraint"},
|
|
227
|
+
f"tuple {idx} has invalid tuple_kind {tup.get('tuple_kind')!r}",
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
def test_b_alignment_tuples_shape_pinned(self) -> None:
|
|
231
|
+
# Alignment tuples carry expected_judgment in 4-judgment set AND
|
|
232
|
+
# MUST NOT carry constraint fields. Spec §7.7 rule (b).
|
|
233
|
+
alignment_set = {"SUPPORTED", "UNSUPPORTED", "AMBIGUOUS", "RETRIEVAL_FAILED"}
|
|
234
|
+
constraint_fields = (
|
|
235
|
+
"constraint_under_test_id",
|
|
236
|
+
"constraint_under_test_rule_text",
|
|
237
|
+
"manifest_fixture_path",
|
|
238
|
+
)
|
|
239
|
+
for idx, tup in enumerate(self.gold_set):
|
|
240
|
+
if tup.get("tuple_kind") != "alignment":
|
|
241
|
+
continue
|
|
242
|
+
self.assertIn(
|
|
243
|
+
tup.get("expected_judgment"),
|
|
244
|
+
alignment_set,
|
|
245
|
+
f"alignment tuple {idx} carries invalid expected_judgment "
|
|
246
|
+
f"{tup.get('expected_judgment')!r}",
|
|
247
|
+
)
|
|
248
|
+
for field in constraint_fields:
|
|
249
|
+
self.assertNotIn(
|
|
250
|
+
field,
|
|
251
|
+
tup,
|
|
252
|
+
f"alignment tuple {idx} must not carry constraint field {field!r}",
|
|
253
|
+
)
|
|
254
|
+
|
|
255
|
+
def test_c_constraint_tuples_have_required_fields(self) -> None:
|
|
256
|
+
# Constraint tuples carry expected_judgment ∈ {VIOLATED, NOT_VIOLATED}
|
|
257
|
+
# AND constraint_under_test_id AND
|
|
258
|
+
# (constraint_under_test_rule_text OR manifest_fixture_path). Spec §7.7 rule (c).
|
|
259
|
+
for idx, tup in enumerate(self.gold_set):
|
|
260
|
+
if tup.get("tuple_kind") != "constraint":
|
|
261
|
+
continue
|
|
262
|
+
self.assertIn(
|
|
263
|
+
tup.get("expected_judgment"),
|
|
264
|
+
{"VIOLATED", "NOT_VIOLATED"},
|
|
265
|
+
f"constraint tuple {idx} carries invalid expected_judgment "
|
|
266
|
+
f"{tup.get('expected_judgment')!r}",
|
|
267
|
+
)
|
|
268
|
+
self.assertIn(
|
|
269
|
+
"constraint_under_test_id",
|
|
270
|
+
tup,
|
|
271
|
+
f"constraint tuple {idx} missing constraint_under_test_id",
|
|
272
|
+
)
|
|
273
|
+
has_rule_text = bool(tup.get("constraint_under_test_rule_text"))
|
|
274
|
+
has_manifest_path = bool(tup.get("manifest_fixture_path"))
|
|
275
|
+
self.assertTrue(
|
|
276
|
+
has_rule_text or has_manifest_path,
|
|
277
|
+
f"constraint tuple {idx} missing both "
|
|
278
|
+
f"constraint_under_test_rule_text and manifest_fixture_path",
|
|
279
|
+
)
|
|
280
|
+
|
|
281
|
+
def test_d_at_least_three_not_violated_constraint_tuples(self) -> None:
|
|
282
|
+
# ≥3 NOT_VIOLATED constraint tuples — without them constraint FPR
|
|
283
|
+
# is unmeasurable and T-C1 cannot fail-on-threshold on the
|
|
284
|
+
# constraint line. Spec §7.7 rule (d).
|
|
285
|
+
not_violated = [
|
|
286
|
+
t for t in self.gold_set
|
|
287
|
+
if t.get("tuple_kind") == "constraint"
|
|
288
|
+
and t.get("expected_judgment") == "NOT_VIOLATED"
|
|
289
|
+
]
|
|
290
|
+
self.assertGreaterEqual(
|
|
291
|
+
len(not_violated),
|
|
292
|
+
3,
|
|
293
|
+
f"gold set must include ≥3 NOT_VIOLATED constraint tuples; "
|
|
294
|
+
f"got {len(not_violated)}",
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
def test_validate_gold_set_rejects_invalid_tuple_kind(self) -> None:
|
|
298
|
+
# Rule (a) negative ingestion test — round-1 review
|
|
299
|
+
# closure on T-C3 rule coverage. Diagnostic must name rule (a).
|
|
300
|
+
broken = [
|
|
301
|
+
{
|
|
302
|
+
"tuple_kind": "comparison", # not in {alignment, constraint}
|
|
303
|
+
"claim_text": "broken",
|
|
304
|
+
"expected_judgment": "SUPPORTED",
|
|
305
|
+
}
|
|
306
|
+
]
|
|
307
|
+
with self.assertRaises(GoldSetValidationError) as ctx:
|
|
308
|
+
validate_gold_set(broken)
|
|
309
|
+
msg = str(ctx.exception)
|
|
310
|
+
self.assertIn("rule (a)", msg, f"diagnostic must name rule (a); got {msg!r}")
|
|
311
|
+
self.assertIn("tuple 0", msg, f"diagnostic must name offending index; got {msg!r}")
|
|
312
|
+
|
|
313
|
+
def test_validate_gold_set_rejects_alignment_with_constraint_field(self) -> None:
|
|
314
|
+
# validate_gold_set is the production entrypoint that the
|
|
315
|
+
# calibration runner calls at ingestion time. It MUST raise the
|
|
316
|
+
# documented error on rule-(b) violation. round-1 review closure:
|
|
317
|
+
# also assert rule (b) name in diagnostic.
|
|
318
|
+
broken = [
|
|
319
|
+
{
|
|
320
|
+
"tuple_kind": "alignment",
|
|
321
|
+
"claim_text": "broken",
|
|
322
|
+
"expected_judgment": "SUPPORTED",
|
|
323
|
+
"constraint_under_test_id": "MNC-1", # forbidden on alignment
|
|
324
|
+
}
|
|
325
|
+
]
|
|
326
|
+
with self.assertRaises(GoldSetValidationError) as ctx:
|
|
327
|
+
validate_gold_set(broken)
|
|
328
|
+
msg = str(ctx.exception)
|
|
329
|
+
self.assertIn("rule (b)", msg, f"diagnostic must name rule (b); got {msg!r}")
|
|
330
|
+
self.assertIn("alignment", msg.lower())
|
|
331
|
+
|
|
332
|
+
def test_validate_gold_set_rejects_constraint_without_rule_text(self) -> None:
|
|
333
|
+
# Rule (c) — constraint tuple missing both rule_text AND
|
|
334
|
+
# manifest_fixture_path. Most common silent-skip authoring bug.
|
|
335
|
+
broken = [
|
|
336
|
+
{
|
|
337
|
+
"tuple_kind": "constraint",
|
|
338
|
+
"claim_text": "broken",
|
|
339
|
+
"expected_judgment": "VIOLATED",
|
|
340
|
+
"constraint_under_test_id": "MNC-1",
|
|
341
|
+
# neither rule_text nor manifest_fixture_path
|
|
342
|
+
}
|
|
343
|
+
]
|
|
344
|
+
with self.assertRaises(GoldSetValidationError) as ctx:
|
|
345
|
+
validate_gold_set(broken)
|
|
346
|
+
msg = str(ctx.exception)
|
|
347
|
+
self.assertIn("rule (c)", msg, f"diagnostic must name rule (c); got {msg!r}")
|
|
348
|
+
msg_lower = msg.lower()
|
|
349
|
+
self.assertTrue("rule_text" in msg_lower or "manifest_fixture_path" in msg_lower)
|
|
350
|
+
|
|
351
|
+
def test_validate_gold_set_rejects_under_three_not_violated(self) -> None:
|
|
352
|
+
# Rule (d) — fewer than 3 NOT_VIOLATED constraint tuples.
|
|
353
|
+
broken: list[dict[str, Any]] = [
|
|
354
|
+
{
|
|
355
|
+
"tuple_kind": "constraint",
|
|
356
|
+
"claim_text": f"v{i}",
|
|
357
|
+
"expected_judgment": "VIOLATED",
|
|
358
|
+
"constraint_under_test_id": "MNC-1",
|
|
359
|
+
"constraint_under_test_rule_text": "no causal language",
|
|
360
|
+
}
|
|
361
|
+
for i in range(5)
|
|
362
|
+
] + [
|
|
363
|
+
{
|
|
364
|
+
"tuple_kind": "constraint",
|
|
365
|
+
"claim_text": "nv1",
|
|
366
|
+
"expected_judgment": "NOT_VIOLATED",
|
|
367
|
+
"constraint_under_test_id": "MNC-1",
|
|
368
|
+
"constraint_under_test_rule_text": "no causal language",
|
|
369
|
+
}
|
|
370
|
+
] # only 1 NOT_VIOLATED, need ≥3
|
|
371
|
+
with self.assertRaises(GoldSetValidationError) as ctx:
|
|
372
|
+
validate_gold_set(broken)
|
|
373
|
+
msg = str(ctx.exception)
|
|
374
|
+
self.assertIn("rule (d)", msg, f"diagnostic must name rule (d); got {msg!r}")
|
|
375
|
+
self.assertIn("NOT_VIOLATED", msg)
|
|
376
|
+
|
|
377
|
+
def test_validate_gold_set_accepts_canonical_gold_set(self) -> None:
|
|
378
|
+
# Positive path — the shipped gold set MUST validate cleanly.
|
|
379
|
+
self.assertIsNone(validate_gold_set(self.gold_set))
|
|
380
|
+
|
|
381
|
+
def test_validate_gold_set_rejects_partial_without_expected_sub_claims(self) -> None:
|
|
382
|
+
# #355 P2#4 — rule (e): a PARTIAL fixture is the ONLY thing exercising
|
|
383
|
+
# the atomic-decomposition subset metric. If it omits expected_sub_claims,
|
|
384
|
+
# `_breakdown_covers_expected` early-returns True and the metric is
|
|
385
|
+
# silently skipped — any generic two-line true-partial breakdown reports
|
|
386
|
+
# miss_rate=0, defeating the whole point of the #213 calibration. Ingestion
|
|
387
|
+
# MUST reject a PARTIAL tuple with missing/empty expected_sub_claims.
|
|
388
|
+
for missing in ({}, {"expected_sub_claims": []}, {"expected_sub_claims": None}):
|
|
389
|
+
with self.subTest(missing=missing):
|
|
390
|
+
broken = [
|
|
391
|
+
{
|
|
392
|
+
"tuple_kind": "alignment",
|
|
393
|
+
"claim_text": "compound claim with two parts",
|
|
394
|
+
"ref_text_excerpt": "excerpt",
|
|
395
|
+
"anchor": {"kind": "page", "value": "1"},
|
|
396
|
+
"expected_judgment": "UNSUPPORTED",
|
|
397
|
+
"expected_prompt_verdict": "PARTIAL",
|
|
398
|
+
**missing,
|
|
399
|
+
}
|
|
400
|
+
]
|
|
401
|
+
with self.assertRaises(GoldSetValidationError) as ctx:
|
|
402
|
+
validate_gold_set(broken)
|
|
403
|
+
msg = str(ctx.exception)
|
|
404
|
+
self.assertIn("rule (e)", msg, f"diagnostic must name rule (e); got {msg!r}")
|
|
405
|
+
self.assertIn("expected_sub_claims", msg)
|
|
406
|
+
|
|
407
|
+
def test_validate_gold_set_accepts_partial_with_expected_sub_claims(self) -> None:
|
|
408
|
+
# Positive: a PARTIAL fixture that declares expected_sub_claims passes
|
|
409
|
+
# rule (e). Guards the rule from over-firing on well-formed fixtures.
|
|
410
|
+
# Padded with 3 NOT_VIOLATED constraint tuples to satisfy rule (d).
|
|
411
|
+
ok = [
|
|
412
|
+
{
|
|
413
|
+
"tuple_kind": "alignment",
|
|
414
|
+
"claim_text": "compound claim with two parts",
|
|
415
|
+
"ref_text_excerpt": "excerpt",
|
|
416
|
+
"anchor": {"kind": "page", "value": "1"},
|
|
417
|
+
"expected_judgment": "UNSUPPORTED",
|
|
418
|
+
"expected_prompt_verdict": "PARTIAL",
|
|
419
|
+
"expected_sub_claims": [
|
|
420
|
+
{"key_tokens": ["first"], "sub_verdict": "SUPPORTED"},
|
|
421
|
+
{"key_tokens": ["second"], "sub_verdict": "UNSUPPORTED"},
|
|
422
|
+
],
|
|
423
|
+
},
|
|
424
|
+
*[
|
|
425
|
+
{
|
|
426
|
+
"tuple_kind": "constraint",
|
|
427
|
+
"claim_text": f"nv-filler-{i}",
|
|
428
|
+
"expected_judgment": "NOT_VIOLATED",
|
|
429
|
+
"constraint_under_test_id": "MNC-1",
|
|
430
|
+
"constraint_under_test_rule_text": "filler rule",
|
|
431
|
+
}
|
|
432
|
+
for i in range(3)
|
|
433
|
+
],
|
|
434
|
+
]
|
|
435
|
+
self.assertIsNone(validate_gold_set(ok))
|
|
436
|
+
|
|
437
|
+
def test_run_calibration_rejects_manifest_only_constraint_tuple(self) -> None:
|
|
438
|
+
# round-2 review closure: validate_gold_set accepts EITHER inline
|
|
439
|
+
# rule_text OR manifest_fixture_path per spec §7.7 rule (c), but
|
|
440
|
+
# the v3.8.0 runner only supports the inline form. A manifest-only
|
|
441
|
+
# tuple validating clean but reaching the judge with rule="" is
|
|
442
|
+
# exactly the silent-skip authoring bug T-C3 is supposed to
|
|
443
|
+
# prevent. The runner MUST raise NotImplementedError at run time
|
|
444
|
+
# rather than pass the empty rule through to the judge. We pin
|
|
445
|
+
# this against a minimal synthetic set (no stub lookup needed
|
|
446
|
+
# because run_calibration raises before any judge invocation
|
|
447
|
+
# for the constraint tuples).
|
|
448
|
+
def _never_called_judge(**kwargs: Any) -> dict[str, Any]:
|
|
449
|
+
raise AssertionError("judge MUST NOT be called when manifest_only tuple raises")
|
|
450
|
+
|
|
451
|
+
manifest_only = [
|
|
452
|
+
# constraint tuple using manifest_fixture_path only (rule (c)
|
|
453
|
+
# second branch). Validates clean but runner must refuse.
|
|
454
|
+
{
|
|
455
|
+
"tuple_kind": "constraint",
|
|
456
|
+
"claim_text": "manifest-only constraint",
|
|
457
|
+
"ref_text_excerpt": None,
|
|
458
|
+
"anchor": {"kind": "page", "value": "1"},
|
|
459
|
+
"expected_judgment": "VIOLATED",
|
|
460
|
+
"constraint_under_test_id": "MNC-3",
|
|
461
|
+
"manifest_fixture_path": "scripts/fixtures/claim_audit_calibration/nonexistent.json",
|
|
462
|
+
},
|
|
463
|
+
# Three NOT_VIOLATED constraint tuples to satisfy rule (d).
|
|
464
|
+
# Use inline rule_text so validate_gold_set passes; the
|
|
465
|
+
# NotImplementedError fires on the FIRST manifest-only
|
|
466
|
+
# tuple it encounters, before any of these run.
|
|
467
|
+
*[
|
|
468
|
+
{
|
|
469
|
+
"tuple_kind": "constraint",
|
|
470
|
+
"claim_text": f"nv-filler-{i}",
|
|
471
|
+
"ref_text_excerpt": None,
|
|
472
|
+
"anchor": {"kind": "page", "value": "1"},
|
|
473
|
+
"expected_judgment": "NOT_VIOLATED",
|
|
474
|
+
"constraint_under_test_id": "MNC-3",
|
|
475
|
+
"constraint_under_test_rule_text": "filler rule",
|
|
476
|
+
}
|
|
477
|
+
for i in range(3)
|
|
478
|
+
],
|
|
479
|
+
]
|
|
480
|
+
# Step 1: validate_gold_set MUST accept the manifest-only tuple
|
|
481
|
+
# (spec §7.7 rule (c) second branch).
|
|
482
|
+
self.assertIsNone(validate_gold_set(manifest_only))
|
|
483
|
+
# Step 2: run_calibration MUST refuse it at run time.
|
|
484
|
+
with self.assertRaises(NotImplementedError) as ctx:
|
|
485
|
+
run_calibration(manifest_only, judge_fn=_never_called_judge)
|
|
486
|
+
msg = str(ctx.exception)
|
|
487
|
+
self.assertIn("manifest_fixture_path", msg)
|
|
488
|
+
self.assertIn("post-v3.8", msg.lower())
|
|
489
|
+
|
|
490
|
+
|
|
491
|
+
# ---------------------------------------------------------------------------
|
|
492
|
+
# T-C2 — Per-class FNR/FPR reporting.
|
|
493
|
+
# ---------------------------------------------------------------------------
|
|
494
|
+
|
|
495
|
+
|
|
496
|
+
class TC2PerClassReport(unittest.TestCase):
|
|
497
|
+
"""T-C2 catches calibration tooling regressions (script doesn't compute /
|
|
498
|
+
doesn't write report) distinct from gold-set or model degradation.
|
|
499
|
+
|
|
500
|
+
Spec §7.7: 'FNR/FPR are computed AND surfaced per judgment-class
|
|
501
|
+
(SUPPORTED vs UNSUPPORTED, AMBIGUOUS, violated-constraint) in the
|
|
502
|
+
calibration report output.'
|
|
503
|
+
"""
|
|
504
|
+
|
|
505
|
+
def setUp(self) -> None:
|
|
506
|
+
self.gold_set = _load_gold_set()
|
|
507
|
+
self.report = run_calibration(self.gold_set, judge_fn=_perfect_judge())
|
|
508
|
+
|
|
509
|
+
def test_report_has_per_class_block(self) -> None:
|
|
510
|
+
# Report must surface a per_class section keyed by judgment-class.
|
|
511
|
+
self.assertIn("per_class", self.report)
|
|
512
|
+
per_class = self.report["per_class"]
|
|
513
|
+
self.assertIsInstance(per_class, dict)
|
|
514
|
+
|
|
515
|
+
def test_per_class_includes_four_judgment_classes(self) -> None:
|
|
516
|
+
# Spec §7.7 enumerates SUPPORTED, UNSUPPORTED, AMBIGUOUS, and
|
|
517
|
+
# violated-constraint as the four classes that must appear.
|
|
518
|
+
per_class = self.report["per_class"]
|
|
519
|
+
for cls in ("SUPPORTED", "UNSUPPORTED", "AMBIGUOUS", "violated_constraint"):
|
|
520
|
+
self.assertIn(cls, per_class, f"per_class missing class {cls!r}")
|
|
521
|
+
|
|
522
|
+
def test_each_class_exposes_fnr_and_fpr(self) -> None:
|
|
523
|
+
# Per-class reporting must include both FNR and FPR (not just one).
|
|
524
|
+
# Reviewer asymmetry — missing FPR on UNSUPPORTED was the
|
|
525
|
+
# historical hole reviewer-calibration_mode_protocol referenced.
|
|
526
|
+
per_class = self.report["per_class"]
|
|
527
|
+
for cls, payload in per_class.items():
|
|
528
|
+
self.assertIn("FNR", payload, f"class {cls!r} missing FNR")
|
|
529
|
+
self.assertIn("FPR", payload, f"class {cls!r} missing FPR")
|
|
530
|
+
|
|
531
|
+
def test_each_class_exposes_denominators(self) -> None:
|
|
532
|
+
# Protocol doc Phase 4 contract: each class entry carries
|
|
533
|
+
# n_positive + n_negative so 0.0 FNR on 0 positives is
|
|
534
|
+
# distinguishable from 0.0 FNR on N positives. round-1 review
|
|
535
|
+
# closure — earlier test only asserted FNR/FPR keys.
|
|
536
|
+
per_class = self.report["per_class"]
|
|
537
|
+
for cls, payload in per_class.items():
|
|
538
|
+
self.assertIn("n_positive", payload, f"class {cls!r} missing n_positive")
|
|
539
|
+
self.assertIn("n_negative", payload, f"class {cls!r} missing n_negative")
|
|
540
|
+
|
|
541
|
+
def test_canonical_denominators_match_gold_set(self) -> None:
|
|
542
|
+
# Pin the expected one-vs-rest denominators against the canonical
|
|
543
|
+
# 17-alignment + 8-constraint gold set (12 base alignment + 5 #213
|
|
544
|
+
# partial fixtures). Contract pinning (round-1 review) — without this a
|
|
545
|
+
# future gold-set rebalance could silently shift class distributions
|
|
546
|
+
# away from the documented Phase 4 example.
|
|
547
|
+
per_class = self.report["per_class"]
|
|
548
|
+
# Alignment gold set: 5 SUPPORTED + 8 UNSUPPORTED (3 base + 5 partial)
|
|
549
|
+
# + 3 AMBIGUOUS + 1 RETRIEVAL_FAILED = 17; one-vs-rest counts the
|
|
550
|
+
# positive class against the other 16 alignment tuples.
|
|
551
|
+
self.assertEqual(per_class["SUPPORTED"]["n_positive"], 5)
|
|
552
|
+
self.assertEqual(per_class["SUPPORTED"]["n_negative"], 12)
|
|
553
|
+
self.assertEqual(per_class["UNSUPPORTED"]["n_positive"], 8)
|
|
554
|
+
self.assertEqual(per_class["UNSUPPORTED"]["n_negative"], 9)
|
|
555
|
+
self.assertEqual(per_class["AMBIGUOUS"]["n_positive"], 3)
|
|
556
|
+
self.assertEqual(per_class["AMBIGUOUS"]["n_negative"], 14)
|
|
557
|
+
# Constraint gold set: 5 VIOLATED + 3 NOT_VIOLATED (unchanged by #213).
|
|
558
|
+
self.assertEqual(per_class["violated_constraint"]["n_positive"], 5)
|
|
559
|
+
self.assertEqual(per_class["violated_constraint"]["n_negative"], 3)
|
|
560
|
+
|
|
561
|
+
|
|
562
|
+
# ---------------------------------------------------------------------------
|
|
563
|
+
# T-C1 — Threshold enforcement.
|
|
564
|
+
# ---------------------------------------------------------------------------
|
|
565
|
+
|
|
566
|
+
|
|
567
|
+
class TC1ThresholdEnforcement(unittest.TestCase):
|
|
568
|
+
"""T-C1 catches model/judge quality regression.
|
|
569
|
+
|
|
570
|
+
Spec §7.7: 'FNR < 0.15 AND FPR < 0.10 against the synthetic gold set.
|
|
571
|
+
Test FAILS when either threshold is exceeded. CI fails — author must
|
|
572
|
+
either curate a better gold set, tighten judge prompts, or update
|
|
573
|
+
judge_model.'
|
|
574
|
+
|
|
575
|
+
The synthetic gold set is paired with a perfect-judge stub so the
|
|
576
|
+
test exercises the threshold gate AND the calibration tooling
|
|
577
|
+
end-to-end without requiring a live LLM call. Production deployment
|
|
578
|
+
plugs a real judge_fn in place of the stub.
|
|
579
|
+
"""
|
|
580
|
+
|
|
581
|
+
def setUp(self) -> None:
|
|
582
|
+
self.gold_set = _load_gold_set()
|
|
583
|
+
self.report = run_calibration(self.gold_set, judge_fn=_perfect_judge())
|
|
584
|
+
|
|
585
|
+
def test_fnr_below_threshold(self) -> None:
|
|
586
|
+
# Spec §7.7 gate: FNR < 0.15. Perfect-judge stub yields FNR = 0.
|
|
587
|
+
self.assertLess(
|
|
588
|
+
self.report["FNR"],
|
|
589
|
+
0.15,
|
|
590
|
+
f"FNR threshold violation: {self.report['FNR']!r} ≥ 0.15",
|
|
591
|
+
)
|
|
592
|
+
|
|
593
|
+
def test_fpr_below_threshold(self) -> None:
|
|
594
|
+
# Spec §7.7 gate: FPR < 0.10. Perfect-judge stub yields FPR = 0.
|
|
595
|
+
self.assertLess(
|
|
596
|
+
self.report["FPR"],
|
|
597
|
+
0.10,
|
|
598
|
+
f"FPR threshold violation: {self.report['FPR']!r} ≥ 0.10",
|
|
599
|
+
)
|
|
600
|
+
|
|
601
|
+
def test_report_records_thresholds_used(self) -> None:
|
|
602
|
+
# Operational concern: when CI fails on T-C1, the report MUST
|
|
603
|
+
# surface the threshold values it was checked against so the
|
|
604
|
+
# operator can distinguish a regression (judge degraded) from a
|
|
605
|
+
# threshold tightening (spec bump). Spec §7.7 + §9 acceptance.
|
|
606
|
+
self.assertEqual(self.report["thresholds"]["FNR"], 0.15)
|
|
607
|
+
self.assertEqual(self.report["thresholds"]["FPR"], 0.10)
|
|
608
|
+
|
|
609
|
+
|
|
610
|
+
class TC1ThresholdEnforcementBadJudge(unittest.TestCase):
|
|
611
|
+
"""T-C1 companion — proves the threshold gate accurately fires on a
|
|
612
|
+
degraded judge.
|
|
613
|
+
|
|
614
|
+
round-1 dual-track review closure: the canonical T-C1
|
|
615
|
+
perfect-judge path only proves tooling CORRECTNESS (FNR/FPR
|
|
616
|
+
computation works), not the threshold's ENFORCEABILITY (the gate
|
|
617
|
+
fires when the judge degrades). Without this companion, T-C1 could
|
|
618
|
+
silently pass on a future regression where the perfect-judge stub
|
|
619
|
+
decoupled from the real judge_fn signature and the gate became
|
|
620
|
+
structurally unreachable.
|
|
621
|
+
|
|
622
|
+
The bad-judge stub flips every gold-set expected_label to its
|
|
623
|
+
wrong-class counterpart so FNR + FPR both vastly exceed the spec
|
|
624
|
+
§7.7 thresholds (0.15 / 0.10). The test asserts run_calibration's
|
|
625
|
+
output is what an operator running CI on a degraded judge would
|
|
626
|
+
see: FNR ≥ 0.15 AND FPR ≥ 0.10. Operational deployment swaps
|
|
627
|
+
_bad_judge for a real judge_fn; the gate semantics are identical.
|
|
628
|
+
"""
|
|
629
|
+
|
|
630
|
+
def setUp(self) -> None:
|
|
631
|
+
self.gold_set = _load_gold_set()
|
|
632
|
+
self.report = run_calibration(self.gold_set, judge_fn=_bad_judge())
|
|
633
|
+
|
|
634
|
+
def test_bad_judge_drives_fnr_over_threshold(self) -> None:
|
|
635
|
+
# Bad judge flips every alignment expected → opposite class +
|
|
636
|
+
# every VIOLATED → NOT_VIOLATED. Aggregate FNR must be >= 0.15.
|
|
637
|
+
self.assertGreaterEqual(
|
|
638
|
+
self.report["FNR"],
|
|
639
|
+
0.15,
|
|
640
|
+
f"bad_judge should drive FNR over threshold; got {self.report['FNR']!r}",
|
|
641
|
+
)
|
|
642
|
+
|
|
643
|
+
def test_bad_judge_drives_fpr_over_threshold(self) -> None:
|
|
644
|
+
# Same logic for FPR. The mirror-flip on alignment + the
|
|
645
|
+
# NOT_VIOLATED → VIOLATED flip on constraints both contribute.
|
|
646
|
+
self.assertGreaterEqual(
|
|
647
|
+
self.report["FPR"],
|
|
648
|
+
0.10,
|
|
649
|
+
f"bad_judge should drive FPR over threshold; got {self.report['FPR']!r}",
|
|
650
|
+
)
|
|
651
|
+
|
|
652
|
+
def test_bad_judge_per_class_fnr_non_zero(self) -> None:
|
|
653
|
+
# Per-class reporting must surface non-zero FNR on the flipped
|
|
654
|
+
# classes — confirms the per_class accumulator is wired to the
|
|
655
|
+
# judge output (not hardcoded zero) and would expose which
|
|
656
|
+
# class drove a real-judge regression.
|
|
657
|
+
per_class = self.report["per_class"]
|
|
658
|
+
for cls in ("SUPPORTED", "UNSUPPORTED", "violated_constraint"):
|
|
659
|
+
self.assertGreater(
|
|
660
|
+
per_class[cls]["FNR"],
|
|
661
|
+
0.0,
|
|
662
|
+
f"bad-judge flip should drive non-zero FNR on {cls!r}; "
|
|
663
|
+
f"got {per_class[cls]!r}",
|
|
664
|
+
)
|
|
665
|
+
|
|
666
|
+
|
|
667
|
+
# ---------------------------------------------------------------------------
|
|
668
|
+
# Partial-support subset metric (#213).
|
|
669
|
+
# ---------------------------------------------------------------------------
|
|
670
|
+
|
|
671
|
+
|
|
672
|
+
def _bare_unsupported_judge() -> Callable[..., dict[str, Any]]:
|
|
673
|
+
"""Regressed judge: on a partial fixture it stops decomposing and returns a
|
|
674
|
+
bare UNSUPPORTED with no sub_claim_breakdown.
|
|
675
|
+
|
|
676
|
+
For NON-partial alignment tuples it mirrors the gold label (so it does not
|
|
677
|
+
blow the aggregate FNR/FPR gate) — the whole point of the subset metric is
|
|
678
|
+
that this judge can pass the aggregate while still missing the partial subset.
|
|
679
|
+
"""
|
|
680
|
+
tuples_by_key: dict[tuple[str, str, str | None], dict[str, Any]] = {
|
|
681
|
+
_tuple_lookup_key(t): t for t in _load_gold_set()
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
def fn(**kwargs: Any) -> dict[str, Any]:
|
|
685
|
+
claim_text = kwargs.get("claim_text", "")
|
|
686
|
+
active = kwargs.get("active_constraints") or []
|
|
687
|
+
constraint_id = active[0]["constraint_id"] if active else None
|
|
688
|
+
kind = "constraint" if active else "alignment"
|
|
689
|
+
tup = tuples_by_key.get((kind, claim_text, constraint_id))
|
|
690
|
+
if tup is None:
|
|
691
|
+
raise AssertionError(
|
|
692
|
+
f"bare_unsupported_judge: no gold tuple for kind={kind!r} "
|
|
693
|
+
f"claim_text={claim_text!r} constraint_id={constraint_id!r}"
|
|
694
|
+
)
|
|
695
|
+
if kind == "constraint":
|
|
696
|
+
if tup["expected_judgment"] == "VIOLATED":
|
|
697
|
+
return {"judgment": "VIOLATED", "violated_constraint_id": constraint_id}
|
|
698
|
+
return {"judgment": "NOT_VIOLATED"}
|
|
699
|
+
# alignment: mirror the gold label, but NEVER emit a breakdown — even on
|
|
700
|
+
# partial fixtures (whose gold expected_judgment is UNSUPPORTED). This is
|
|
701
|
+
# the regression #213 closes: correct aggregate label, no decomposition.
|
|
702
|
+
return {"judgment": tup["expected_judgment"], "rationale": "bare-unsupported stub"}
|
|
703
|
+
|
|
704
|
+
return fn
|
|
705
|
+
|
|
706
|
+
|
|
707
|
+
def _dummy_breakdown_judge() -> Callable[..., dict[str, Any]]:
|
|
708
|
+
"""Cheating judge (#213 P1-3): emits a well-formed-SHAPED but generic
|
|
709
|
+
two-line breakdown on EVERY partial fixture without decomposing the actual
|
|
710
|
+
claim. It passes the shape gate (is_true_partial_breakdown) but must fail the
|
|
711
|
+
content-match against each fixture's expected_sub_claims.
|
|
712
|
+
|
|
713
|
+
Mirrors the gold label on every alignment tuple so the aggregate stays green.
|
|
714
|
+
"""
|
|
715
|
+
tuples_by_key: dict[tuple[str, str, str | None], dict[str, Any]] = {
|
|
716
|
+
_tuple_lookup_key(t): t for t in _load_gold_set()
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
def fn(**kwargs: Any) -> dict[str, Any]:
|
|
720
|
+
claim_text = kwargs.get("claim_text", "")
|
|
721
|
+
active = kwargs.get("active_constraints") or []
|
|
722
|
+
constraint_id = active[0]["constraint_id"] if active else None
|
|
723
|
+
kind = "constraint" if active else "alignment"
|
|
724
|
+
tup = tuples_by_key.get((kind, claim_text, constraint_id))
|
|
725
|
+
if tup is None:
|
|
726
|
+
raise AssertionError(f"dummy_breakdown_judge: no gold tuple for {claim_text!r}")
|
|
727
|
+
if kind == "constraint":
|
|
728
|
+
if tup["expected_judgment"] == "VIOLATED":
|
|
729
|
+
return {"judgment": "VIOLATED", "violated_constraint_id": constraint_id}
|
|
730
|
+
return {"judgment": "NOT_VIOLATED"}
|
|
731
|
+
resp: dict[str, Any] = {"judgment": tup["expected_judgment"], "rationale": "dummy"}
|
|
732
|
+
if tup.get("expected_prompt_verdict") == "PARTIAL":
|
|
733
|
+
# Generic, claim-agnostic — same two lines for every partial fixture.
|
|
734
|
+
resp["sub_claim_breakdown"] = [
|
|
735
|
+
{"sub_claim_text": "first sub-claim", "sub_verdict": "SUPPORTED"},
|
|
736
|
+
{"sub_claim_text": "second sub-claim", "sub_verdict": "UNSUPPORTED"},
|
|
737
|
+
]
|
|
738
|
+
return resp
|
|
739
|
+
|
|
740
|
+
return fn
|
|
741
|
+
|
|
742
|
+
|
|
743
|
+
def _full_claim_text_judge() -> Callable[..., dict[str, Any]]:
|
|
744
|
+
"""Cheating judge (ship-gate round-2): on a partial fixture it returns two
|
|
745
|
+
items whose sub_claim_text is the FULL claim text (one SUPPORTED, one
|
|
746
|
+
UNSUPPORTED). Each item contains every expected key token, so a naive
|
|
747
|
+
coverage check would pass — but this is NOT an atomic decomposition. The
|
|
748
|
+
atomicity + distinct-item rules in _breakdown_covers_expected must reject it.
|
|
749
|
+
"""
|
|
750
|
+
tuples_by_key: dict[tuple[str, str, str | None], dict[str, Any]] = {
|
|
751
|
+
_tuple_lookup_key(t): t for t in _load_gold_set()
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
def fn(**kwargs: Any) -> dict[str, Any]:
|
|
755
|
+
claim_text = kwargs.get("claim_text", "")
|
|
756
|
+
active = kwargs.get("active_constraints") or []
|
|
757
|
+
constraint_id = active[0]["constraint_id"] if active else None
|
|
758
|
+
kind = "constraint" if active else "alignment"
|
|
759
|
+
tup = tuples_by_key.get((kind, claim_text, constraint_id))
|
|
760
|
+
if tup is None:
|
|
761
|
+
raise AssertionError(f"full_claim_text_judge: no gold tuple for {claim_text!r}")
|
|
762
|
+
if kind == "constraint":
|
|
763
|
+
if tup["expected_judgment"] == "VIOLATED":
|
|
764
|
+
return {"judgment": "VIOLATED", "violated_constraint_id": constraint_id}
|
|
765
|
+
return {"judgment": "NOT_VIOLATED"}
|
|
766
|
+
resp: dict[str, Any] = {"judgment": tup["expected_judgment"], "rationale": "full-text"}
|
|
767
|
+
if tup.get("expected_prompt_verdict") == "PARTIAL":
|
|
768
|
+
resp["sub_claim_breakdown"] = [
|
|
769
|
+
{"sub_claim_text": claim_text, "sub_verdict": "SUPPORTED"},
|
|
770
|
+
{"sub_claim_text": claim_text, "sub_verdict": "UNSUPPORTED"},
|
|
771
|
+
]
|
|
772
|
+
return resp
|
|
773
|
+
|
|
774
|
+
return fn
|
|
775
|
+
|
|
776
|
+
|
|
777
|
+
class PartialSupportSubsetMetric(unittest.TestCase):
|
|
778
|
+
"""#213: the partial-support subset metric catches a judge that regresses to
|
|
779
|
+
bare UNSUPPORTED on compound claims even though its aggregate FNR stays green.
|
|
780
|
+
|
|
781
|
+
A partial fixture carries expected_judgment=UNSUPPORTED (B1) + the
|
|
782
|
+
expected_prompt_verdict=PARTIAL discriminator. The aggregate gate matches on
|
|
783
|
+
expected_judgment, so a bare-UNSUPPORTED judge passes it. Only the subset
|
|
784
|
+
metric — which requires UNSUPPORTED AND a well-formed true-partial breakdown
|
|
785
|
+
— exposes the regression.
|
|
786
|
+
"""
|
|
787
|
+
|
|
788
|
+
def setUp(self) -> None:
|
|
789
|
+
self.gold_set = _load_gold_set()
|
|
790
|
+
self.partial_tuples = [
|
|
791
|
+
t for t in self.gold_set if t.get("expected_prompt_verdict") == "PARTIAL"
|
|
792
|
+
]
|
|
793
|
+
|
|
794
|
+
def test_gold_set_has_at_least_five_partial_fixtures(self) -> None:
|
|
795
|
+
self.assertGreaterEqual(
|
|
796
|
+
len(self.partial_tuples),
|
|
797
|
+
5,
|
|
798
|
+
f"gold set must carry >=5 partial fixtures; got {len(self.partial_tuples)}",
|
|
799
|
+
)
|
|
800
|
+
|
|
801
|
+
def test_report_has_partial_support_block(self) -> None:
|
|
802
|
+
report = run_calibration(self.gold_set, judge_fn=_perfect_judge())
|
|
803
|
+
self.assertIn("partial_support", report)
|
|
804
|
+
self.assertIn("miss_rate", report["partial_support"])
|
|
805
|
+
self.assertEqual(report["partial_support"]["n_partial"], len(self.partial_tuples))
|
|
806
|
+
|
|
807
|
+
def test_perfect_judge_passes_partial_subset(self) -> None:
|
|
808
|
+
# A judge that emits UNSUPPORTED + a well-formed breakdown misses nothing.
|
|
809
|
+
# Proves the metric is not trivially always-failing.
|
|
810
|
+
report = run_calibration(self.gold_set, judge_fn=_perfect_judge())
|
|
811
|
+
self.assertEqual(
|
|
812
|
+
report["partial_support"]["miss_rate"],
|
|
813
|
+
0.0,
|
|
814
|
+
f"perfect judge should miss no partial fixtures; got {report['partial_support']!r}",
|
|
815
|
+
)
|
|
816
|
+
|
|
817
|
+
def test_bare_unsupported_judge_misses_partial_subset(self) -> None:
|
|
818
|
+
# The regression case: aggregate FNR stays under threshold (label matches),
|
|
819
|
+
# but the subset miss_rate is non-zero because no breakdown was emitted.
|
|
820
|
+
report = run_calibration(self.gold_set, judge_fn=_bare_unsupported_judge())
|
|
821
|
+
self.assertLess(
|
|
822
|
+
report["FNR"],
|
|
823
|
+
0.15,
|
|
824
|
+
f"bare-unsupported judge should still pass the aggregate FNR gate; "
|
|
825
|
+
f"got {report['FNR']!r} (if this fails the subset metric is redundant "
|
|
826
|
+
f"with the aggregate and proves nothing)",
|
|
827
|
+
)
|
|
828
|
+
self.assertEqual(
|
|
829
|
+
report["partial_support"]["miss_rate"],
|
|
830
|
+
1.0,
|
|
831
|
+
f"bare-unsupported judge must miss EVERY partial fixture; "
|
|
832
|
+
f"got {report['partial_support']!r}",
|
|
833
|
+
)
|
|
834
|
+
|
|
835
|
+
def test_partial_fixtures_declare_expected_sub_claims(self) -> None:
|
|
836
|
+
# #213 P1-3: each partial fixture must declare expected_sub_claims so the
|
|
837
|
+
# subset metric can verify the judge decomposed THIS claim, not just
|
|
838
|
+
# emitted any two-line breakdown.
|
|
839
|
+
for tup in self.partial_tuples:
|
|
840
|
+
esc = tup.get("expected_sub_claims")
|
|
841
|
+
self.assertIsInstance(
|
|
842
|
+
esc, list, f"partial fixture {tup['claim_text']!r} missing expected_sub_claims"
|
|
843
|
+
)
|
|
844
|
+
self.assertGreaterEqual(len(esc), 2, "expected_sub_claims must have >=2 entries")
|
|
845
|
+
for entry in esc:
|
|
846
|
+
self.assertIn("key_tokens", entry)
|
|
847
|
+
self.assertIn("sub_verdict", entry)
|
|
848
|
+
|
|
849
|
+
def test_full_claim_text_judge_misses_partial_subset(self) -> None:
|
|
850
|
+
# Ship-gate round-2: a judge returning two items each = the FULL claim text
|
|
851
|
+
# (one SUPPORTED, one UNSUPPORTED) passes the verdict-mix gate and contains
|
|
852
|
+
# every expected token, but is not an atomic decomposition. The atomicity +
|
|
853
|
+
# distinct-item rules must catch it -> miss_rate = 1.0.
|
|
854
|
+
report = run_calibration(self.gold_set, judge_fn=_full_claim_text_judge())
|
|
855
|
+
self.assertLess(report["FNR"], 0.15)
|
|
856
|
+
self.assertEqual(
|
|
857
|
+
report["partial_support"]["miss_rate"],
|
|
858
|
+
1.0,
|
|
859
|
+
f"full-claim-text (non-atomic) judge must miss every partial fixture; "
|
|
860
|
+
f"got {report['partial_support']!r}",
|
|
861
|
+
)
|
|
862
|
+
|
|
863
|
+
def test_dummy_breakdown_judge_misses_partial_subset(self) -> None:
|
|
864
|
+
# #213 P1-3: a judge that emits a well-formed-SHAPED but generic two-line
|
|
865
|
+
# breakdown on every partial fixture passes the aggregate AND the shape
|
|
866
|
+
# gate, but must FAIL the subset content-match (it never decomposed the
|
|
867
|
+
# actual claim). This is the gap a later review round flagged: shape-only
|
|
868
|
+
# verification was gameable.
|
|
869
|
+
report = run_calibration(self.gold_set, judge_fn=_dummy_breakdown_judge())
|
|
870
|
+
self.assertLess(
|
|
871
|
+
report["FNR"], 0.15, f"dummy-breakdown judge should pass aggregate; got {report['FNR']!r}"
|
|
872
|
+
)
|
|
873
|
+
self.assertEqual(
|
|
874
|
+
report["partial_support"]["miss_rate"],
|
|
875
|
+
1.0,
|
|
876
|
+
f"dummy-breakdown judge must miss every partial fixture on content-match; "
|
|
877
|
+
f"got {report['partial_support']!r}",
|
|
878
|
+
)
|
|
879
|
+
|
|
880
|
+
|
|
881
|
+
if __name__ == "__main__": # pragma: no cover
|
|
882
|
+
unittest.main()
|