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.
Files changed (1048) hide show
  1. package/README.md +11 -5
  2. package/dist/apps/panel/index.html +2 -2
  3. package/dist/src/adapters/pi/extension.js +225 -92
  4. package/dist/src/adapters/pi/extension.js.map +1 -1
  5. package/dist/src/agents/import.js +44 -32
  6. package/dist/src/agents/import.js.map +1 -1
  7. package/dist/src/analysis/hooks.d.ts +1 -0
  8. package/dist/src/analysis/hooks.js +20 -1
  9. package/dist/src/analysis/hooks.js.map +1 -1
  10. package/dist/src/ars/bridge.d.ts +20 -0
  11. package/dist/src/ars/bridge.js +132 -0
  12. package/dist/src/ars/bridge.js.map +1 -0
  13. package/dist/src/ars/contracts.d.ts +55 -0
  14. package/dist/src/ars/contracts.js +2 -0
  15. package/dist/src/ars/contracts.js.map +1 -0
  16. package/dist/src/ars/panel-plan.d.ts +4 -0
  17. package/dist/src/ars/panel-plan.js +11 -0
  18. package/dist/src/ars/panel-plan.js.map +1 -0
  19. package/dist/src/ars/pi-panel-executor.d.ts +30 -0
  20. package/dist/src/ars/pi-panel-executor.js +140 -0
  21. package/dist/src/ars/pi-panel-executor.js.map +1 -0
  22. package/dist/src/ars/profile.d.ts +36 -0
  23. package/dist/src/ars/profile.js +119 -0
  24. package/dist/src/ars/profile.js.map +1 -0
  25. package/dist/src/ars/re-review.d.ts +22 -0
  26. package/dist/src/ars/re-review.js +172 -0
  27. package/dist/src/ars/re-review.js.map +1 -0
  28. package/dist/src/branding.d.ts +2 -4
  29. package/dist/src/branding.js +3 -5
  30. package/dist/src/branding.js.map +1 -1
  31. package/dist/src/bundled-tools.d.ts +3 -0
  32. package/dist/src/bundled-tools.js +21 -0
  33. package/dist/src/bundled-tools.js.map +1 -0
  34. package/dist/src/chat.js +6 -5
  35. package/dist/src/chat.js.map +1 -1
  36. package/dist/src/creation/contracts.d.ts +38 -0
  37. package/dist/src/creation/contracts.js +2 -0
  38. package/dist/src/creation/contracts.js.map +1 -0
  39. package/dist/src/creation/service.d.ts +7 -0
  40. package/dist/src/creation/service.js +196 -0
  41. package/dist/src/creation/service.js.map +1 -0
  42. package/dist/src/index.d.ts +10 -0
  43. package/dist/src/index.js +10 -0
  44. package/dist/src/index.js.map +1 -1
  45. package/dist/src/install/installer.js +32 -10
  46. package/dist/src/install/installer.js.map +1 -1
  47. package/dist/src/orchestration/personas.d.ts +15 -0
  48. package/dist/src/orchestration/personas.js +51 -0
  49. package/dist/src/orchestration/personas.js.map +1 -0
  50. package/dist/src/orchestration/pi-executor.d.ts +1 -0
  51. package/dist/src/orchestration/pi-executor.js +1 -1
  52. package/dist/src/orchestration/pi-executor.js.map +1 -1
  53. package/dist/src/panel/extension.js +29 -8
  54. package/dist/src/panel/extension.js.map +1 -1
  55. package/dist/src/panel/server.js +14 -5
  56. package/dist/src/panel/server.js.map +1 -1
  57. package/dist/src/project/paths.d.ts +3 -0
  58. package/dist/src/project/paths.js +7 -0
  59. package/dist/src/project/paths.js.map +1 -1
  60. package/dist/src/rules/user-rules.d.ts +8 -0
  61. package/dist/src/rules/user-rules.js +36 -0
  62. package/dist/src/rules/user-rules.js.map +1 -0
  63. package/dist/src/skills/contracts.d.ts +4 -4
  64. package/dist/src/skills/recommended.js +1 -1
  65. package/dist/src/skills/registry.js +49 -28
  66. package/dist/src/skills/registry.js.map +1 -1
  67. package/dist/src/style/cli-ui.js +0 -1
  68. package/dist/src/style/cli-ui.js.map +1 -1
  69. package/package.json +14 -3
  70. package/scripts/rebrand-pi.mjs +6 -0
  71. package/skills/recommended/catalog.json +2 -11
  72. package/vendor/ars/.claude/CLAUDE.md +371 -0
  73. package/vendor/ars/.command-invariants.toml +24 -0
  74. package/vendor/ars/CITATION.cff +35 -0
  75. package/vendor/ars/LICENSE +417 -0
  76. package/vendor/ars/MODE_REGISTRY.md +76 -0
  77. package/vendor/ars/NOTICE.md +26 -0
  78. package/vendor/ars/POSITIONING.md +99 -0
  79. package/vendor/ars/PSYCLAW_SOURCE.json +10 -0
  80. package/vendor/ars/README.md +751 -0
  81. package/vendor/ars/SECURITY.md +52 -0
  82. package/vendor/ars/THIRD_PARTY.md +70 -0
  83. package/vendor/ars/academic-paper/SKILL.md +542 -0
  84. package/vendor/ars/academic-paper/agents/abstract_bilingual_agent.md +171 -0
  85. package/vendor/ars/academic-paper/agents/argument_builder_agent.md +276 -0
  86. package/vendor/ars/academic-paper/agents/citation_compliance_agent.md +422 -0
  87. package/vendor/ars/academic-paper/agents/draft_writer_agent.md +656 -0
  88. package/vendor/ars/academic-paper/agents/formatter_agent.md +999 -0
  89. package/vendor/ars/academic-paper/agents/intake_agent.md +393 -0
  90. package/vendor/ars/academic-paper/agents/literature_strategist_agent.md +626 -0
  91. package/vendor/ars/academic-paper/agents/peer_reviewer_agent.md +516 -0
  92. package/vendor/ars/academic-paper/agents/revision_coach_agent.md +334 -0
  93. package/vendor/ars/academic-paper/agents/socratic_mentor_agent.md +527 -0
  94. package/vendor/ars/academic-paper/agents/structure_architect_agent.md +401 -0
  95. package/vendor/ars/academic-paper/agents/visualization_agent.md +441 -0
  96. package/vendor/ars/academic-paper/examples/chinese_paper_example.md +278 -0
  97. package/vendor/ars/academic-paper/examples/clinical_citation_verification_checklist.md +95 -0
  98. package/vendor/ars/academic-paper/examples/clinical_epistemic_status_example.md +100 -0
  99. package/vendor/ars/academic-paper/examples/commitment_ledger_example.md +147 -0
  100. package/vendor/ars/academic-paper/examples/imrad_hei_example.md +234 -0
  101. package/vendor/ars/academic-paper/examples/literature_review_example.md +260 -0
  102. package/vendor/ars/academic-paper/examples/plan_mode_guided_writing.md +600 -0
  103. package/vendor/ars/academic-paper/examples/revision_mode_example.md +344 -0
  104. package/vendor/ars/academic-paper/examples/revision_recovery_example.md +506 -0
  105. package/vendor/ars/academic-paper/examples/version_family_reconciliation_example.md +89 -0
  106. package/vendor/ars/academic-paper/references/abstract_writing_guide.md +169 -0
  107. package/vendor/ars/academic-paper/references/academic_writing_style.md +188 -0
  108. package/vendor/ars/academic-paper/references/anti_leakage_protocol.md +83 -0
  109. package/vendor/ars/academic-paper/references/apa7_chinese_citation_guide.md +364 -0
  110. package/vendor/ars/academic-paper/references/apa7_extended_guide.md +198 -0
  111. package/vendor/ars/academic-paper/references/changelog.md +11 -0
  112. package/vendor/ars/academic-paper/references/citation_format_switcher.md +228 -0
  113. package/vendor/ars/academic-paper/references/committee_correspondence_protocol.md +158 -0
  114. package/vendor/ars/academic-paper/references/credit_authorship_guide.md +308 -0
  115. package/vendor/ars/academic-paper/references/disclosure_mode_protocol.md +478 -0
  116. package/vendor/ars/academic-paper/references/domain_evidence_profiles.md +38 -0
  117. package/vendor/ars/academic-paper/references/failure_paths.md +349 -0
  118. package/vendor/ars/academic-paper/references/funding_statement_guide.md +319 -0
  119. package/vendor/ars/academic-paper/references/hei_domain_glossary.md +169 -0
  120. package/vendor/ars/academic-paper/references/intro_title_rhetoric_guide.md +114 -0
  121. package/vendor/ars/academic-paper/references/journal_submission_guide.md +249 -0
  122. package/vendor/ars/academic-paper/references/latex_template_reference.md +378 -0
  123. package/vendor/ars/academic-paper/references/mode_selection_guide.md +378 -0
  124. package/vendor/ars/academic-paper/references/paper_structure_patterns.md +330 -0
  125. package/vendor/ars/academic-paper/references/plan_mode_protocol.md +112 -0
  126. package/vendor/ars/academic-paper/references/policy_anchor_disclosure_protocol.md +200 -0
  127. package/vendor/ars/academic-paper/references/policy_anchor_table.md +157 -0
  128. package/vendor/ars/academic-paper/references/revision_patch_protocol.md +173 -0
  129. package/vendor/ars/academic-paper/references/statistical_visualization_standards.md +750 -0
  130. package/vendor/ars/academic-paper/references/venue_disclosure_policies.md +259 -0
  131. package/vendor/ars/academic-paper/references/vlm_figure_verification.md +126 -0
  132. package/vendor/ars/academic-paper/references/workflow_phase_details.md +135 -0
  133. package/vendor/ars/academic-paper/references/writing_judgment_framework.md +59 -0
  134. package/vendor/ars/academic-paper/references/writing_quality_check.md +173 -0
  135. package/vendor/ars/academic-paper/templates/bilingual_abstract_template.md +78 -0
  136. package/vendor/ars/academic-paper/templates/case_study_template.md +129 -0
  137. package/vendor/ars/academic-paper/templates/conference_paper_template.md +108 -0
  138. package/vendor/ars/academic-paper/templates/credit_statement_template.md +132 -0
  139. package/vendor/ars/academic-paper/templates/funding_statement_template.md +290 -0
  140. package/vendor/ars/academic-paper/templates/imrad_template.md +183 -0
  141. package/vendor/ars/academic-paper/templates/latex_article_template.tex +199 -0
  142. package/vendor/ars/academic-paper/templates/literature_review_template.md +135 -0
  143. package/vendor/ars/academic-paper/templates/policy_brief_template.md +139 -0
  144. package/vendor/ars/academic-paper/templates/revision_tracking_template.md +199 -0
  145. package/vendor/ars/academic-paper/templates/theoretical_paper_template.md +119 -0
  146. package/vendor/ars/academic-paper-reviewer/SKILL.md +491 -0
  147. package/vendor/ars/academic-paper-reviewer/agents/devils_advocate_reviewer_agent.md +443 -0
  148. package/vendor/ars/academic-paper-reviewer/agents/domain_reviewer_agent.md +412 -0
  149. package/vendor/ars/academic-paper-reviewer/agents/editorial_synthesizer_agent.md +478 -0
  150. package/vendor/ars/academic-paper-reviewer/agents/eic_agent.md +339 -0
  151. package/vendor/ars/academic-paper-reviewer/agents/field_analyst_agent.md +221 -0
  152. package/vendor/ars/academic-paper-reviewer/agents/methodology_reviewer_agent.md +449 -0
  153. package/vendor/ars/academic-paper-reviewer/agents/perspective_reviewer_agent.md +427 -0
  154. package/vendor/ars/academic-paper-reviewer/examples/hei_paper_review_example.md +391 -0
  155. package/vendor/ars/academic-paper-reviewer/examples/interdisciplinary_review_example.md +299 -0
  156. package/vendor/ars/academic-paper-reviewer/examples/subclaim_decomposition_example.md +80 -0
  157. package/vendor/ars/academic-paper-reviewer/references/calibration_mode_protocol.md +256 -0
  158. package/vendor/ars/academic-paper-reviewer/references/changelog.md +10 -0
  159. package/vendor/ars/academic-paper-reviewer/references/editorial_decision_standards.md +236 -0
  160. package/vendor/ars/academic-paper-reviewer/references/guided_mode_protocol.md +34 -0
  161. package/vendor/ars/academic-paper-reviewer/references/integration_guide.md +15 -0
  162. package/vendor/ars/academic-paper-reviewer/references/quality_rubrics.md +84 -0
  163. package/vendor/ars/academic-paper-reviewer/references/re_review_mode_protocol.md +340 -0
  164. package/vendor/ars/academic-paper-reviewer/references/review_criteria_framework.md +98 -0
  165. package/vendor/ars/academic-paper-reviewer/references/review_panel_provenance_protocol.md +197 -0
  166. package/vendor/ars/academic-paper-reviewer/references/review_quality_thinking.md +58 -0
  167. package/vendor/ars/academic-paper-reviewer/references/reviewer_sprint_prompt_source.md +324 -0
  168. package/vendor/ars/academic-paper-reviewer/references/sprint_contract_protocol.md +296 -0
  169. package/vendor/ars/academic-paper-reviewer/references/statistical_reporting_standards.md +505 -0
  170. package/vendor/ars/academic-paper-reviewer/references/top_journals_by_field.md +206 -0
  171. package/vendor/ars/academic-paper-reviewer/templates/editorial_decision_template.md +235 -0
  172. package/vendor/ars/academic-paper-reviewer/templates/peer_review_report_template.md +305 -0
  173. package/vendor/ars/academic-paper-reviewer/templates/revision_response_template.md +248 -0
  174. package/vendor/ars/academic-pipeline/SKILL.md +736 -0
  175. package/vendor/ars/academic-pipeline/agents/claim_ref_alignment_audit_agent.md +382 -0
  176. package/vendor/ars/academic-pipeline/agents/collaboration_depth_agent.md +164 -0
  177. package/vendor/ars/academic-pipeline/agents/integrity_verification_agent.md +870 -0
  178. package/vendor/ars/academic-pipeline/agents/pipeline_orchestrator_agent.md +1379 -0
  179. package/vendor/ars/academic-pipeline/agents/state_tracker_agent.md +622 -0
  180. package/vendor/ars/academic-pipeline/examples/full_pipeline_example.md +482 -0
  181. package/vendor/ars/academic-pipeline/examples/integrity_failure_recovery.md +389 -0
  182. package/vendor/ars/academic-pipeline/examples/mid_entry_example.md +414 -0
  183. package/vendor/ars/academic-pipeline/references/adapters/.gitkeep +0 -0
  184. package/vendor/ars/academic-pipeline/references/adapters/overview.md +153 -0
  185. package/vendor/ars/academic-pipeline/references/ai_research_failure_modes.md +185 -0
  186. package/vendor/ars/academic-pipeline/references/changelog.md +14 -0
  187. package/vendor/ars/academic-pipeline/references/claim_audit_calibration_protocol.md +175 -0
  188. package/vendor/ars/academic-pipeline/references/claim_verification_protocol.md +282 -0
  189. package/vendor/ars/academic-pipeline/references/external_review_protocol.md +131 -0
  190. package/vendor/ars/academic-pipeline/references/integrity_review_protocol.md +110 -0
  191. package/vendor/ars/academic-pipeline/references/literature_corpus_consumers.md +193 -0
  192. package/vendor/ars/academic-pipeline/references/mode_advisor.md +135 -0
  193. package/vendor/ars/academic-pipeline/references/passport_as_reset_boundary.md +132 -0
  194. package/vendor/ars/academic-pipeline/references/pipeline_state_machine.md +405 -0
  195. package/vendor/ars/academic-pipeline/references/plagiarism_detection_protocol.md +239 -0
  196. package/vendor/ars/academic-pipeline/references/process_summary_protocol.md +209 -0
  197. package/vendor/ars/academic-pipeline/references/progress_dashboard_template.md +38 -0
  198. package/vendor/ars/academic-pipeline/references/reinforcement_content.md +15 -0
  199. package/vendor/ars/academic-pipeline/references/reproducibility_audit.md +55 -0
  200. package/vendor/ars/academic-pipeline/references/score_trajectory_protocol.md +78 -0
  201. package/vendor/ars/academic-pipeline/references/team_collaboration_protocol.md +261 -0
  202. package/vendor/ars/academic-pipeline/references/two_stage_review_protocol.md +27 -0
  203. package/vendor/ars/academic-pipeline/templates/pipeline_status_template.md +146 -0
  204. package/vendor/ars/agents/report_compiler_agent.md +341 -0
  205. package/vendor/ars/agents/research_architect_agent.md +298 -0
  206. package/vendor/ars/agents/synthesis_agent.md +356 -0
  207. package/vendor/ars/commands/ars-3w.md +10 -0
  208. package/vendor/ars/commands/ars-abstract.md +10 -0
  209. package/vendor/ars/commands/ars-cache-invalidate.md +20 -0
  210. package/vendor/ars/commands/ars-citation-check.md +10 -0
  211. package/vendor/ars/commands/ars-disclosure.md +10 -0
  212. package/vendor/ars/commands/ars-format-convert.md +10 -0
  213. package/vendor/ars/commands/ars-full.md +9 -0
  214. package/vendor/ars/commands/ars-lit-review.md +12 -0
  215. package/vendor/ars/commands/ars-mark-read.md +18 -0
  216. package/vendor/ars/commands/ars-outline.md +10 -0
  217. package/vendor/ars/commands/ars-plan.md +10 -0
  218. package/vendor/ars/commands/ars-rebuttal-audit.md +12 -0
  219. package/vendor/ars/commands/ars-reviewer.md +9 -0
  220. package/vendor/ars/commands/ars-revision-coach.md +9 -0
  221. package/vendor/ars/commands/ars-revision.md +10 -0
  222. package/vendor/ars/commands/ars-unmark-read.md +16 -0
  223. package/vendor/ars/deep-research/SKILL.md +600 -0
  224. package/vendor/ars/deep-research/agents/bibliography_agent.md +473 -0
  225. package/vendor/ars/deep-research/agents/devils_advocate_agent.md +192 -0
  226. package/vendor/ars/deep-research/agents/editor_in_chief_agent.md +167 -0
  227. package/vendor/ars/deep-research/agents/ethics_review_agent.md +267 -0
  228. package/vendor/ars/deep-research/agents/meta_analysis_agent.md +325 -0
  229. package/vendor/ars/deep-research/agents/monitoring_agent.md +209 -0
  230. package/vendor/ars/deep-research/agents/report_compiler_agent.md +341 -0
  231. package/vendor/ars/deep-research/agents/research_architect_agent.md +298 -0
  232. package/vendor/ars/deep-research/agents/research_question_agent.md +216 -0
  233. package/vendor/ars/deep-research/agents/risk_of_bias_agent.md +231 -0
  234. package/vendor/ars/deep-research/agents/socratic_mentor_agent.md +764 -0
  235. package/vendor/ars/deep-research/agents/source_verification_agent.md +219 -0
  236. package/vendor/ars/deep-research/agents/synthesis_agent.md +356 -0
  237. package/vendor/ars/deep-research/agents/timeline_extraction_agent.md +99 -0
  238. package/vendor/ars/deep-research/examples/exploratory_research.md +157 -0
  239. package/vendor/ars/deep-research/examples/fact_check_mode.md +173 -0
  240. package/vendor/ars/deep-research/examples/handoff_to_paper.md +318 -0
  241. package/vendor/ars/deep-research/examples/idea_diversity_coverage_gap_advisory.md +64 -0
  242. package/vendor/ars/deep-research/examples/policy_analysis.md +161 -0
  243. package/vendor/ars/deep-research/examples/review_mode.md +253 -0
  244. package/vendor/ars/deep-research/examples/socratic_guided_research.md +331 -0
  245. package/vendor/ars/deep-research/examples/systematic_review.md +133 -0
  246. package/vendor/ars/deep-research/references/apa7_style_guide.md +162 -0
  247. package/vendor/ars/deep-research/references/argumentation_reasoning_framework.md +68 -0
  248. package/vendor/ars/deep-research/references/arxiv_api_protocol.md +76 -0
  249. package/vendor/ars/deep-research/references/changelog.md +22 -0
  250. package/vendor/ars/deep-research/references/chinese_literature_api_protocol.md +317 -0
  251. package/vendor/ars/deep-research/references/cross_agent_quality_definitions.md +14 -0
  252. package/vendor/ars/deep-research/references/crossref_api_protocol.md +84 -0
  253. package/vendor/ars/deep-research/references/equator_reporting_guidelines.md +482 -0
  254. package/vendor/ars/deep-research/references/ethics_checklist.md +282 -0
  255. package/vendor/ars/deep-research/references/failure_paths.md +355 -0
  256. package/vendor/ars/deep-research/references/interdisciplinary_bridges.md +292 -0
  257. package/vendor/ars/deep-research/references/irb_decision_tree.md +315 -0
  258. package/vendor/ars/deep-research/references/literature_monitoring_strategies.md +263 -0
  259. package/vendor/ars/deep-research/references/logical_fallacies.md +192 -0
  260. package/vendor/ars/deep-research/references/methodology_patterns.md +462 -0
  261. package/vendor/ars/deep-research/references/mode_selection_guide.md +331 -0
  262. package/vendor/ars/deep-research/references/openalex_api_protocol.md +82 -0
  263. package/vendor/ars/deep-research/references/preregistration_guide.md +324 -0
  264. package/vendor/ars/deep-research/references/semantic_scholar_api_protocol.md +107 -0
  265. package/vendor/ars/deep-research/references/socratic_mode_protocol.md +99 -0
  266. package/vendor/ars/deep-research/references/socratic_questioning_framework.md +232 -0
  267. package/vendor/ars/deep-research/references/source_quality_hierarchy.md +188 -0
  268. package/vendor/ars/deep-research/references/systematic_review_protocol.md +95 -0
  269. package/vendor/ars/deep-research/references/systematic_review_toolkit.md +353 -0
  270. package/vendor/ars/deep-research/templates/evidence_assessment_template.md +127 -0
  271. package/vendor/ars/deep-research/templates/literature_matrix_template.md +85 -0
  272. package/vendor/ars/deep-research/templates/preregistration_template.md +318 -0
  273. package/vendor/ars/deep-research/templates/prisma_protocol_template.md +248 -0
  274. package/vendor/ars/deep-research/templates/prisma_report_template.md +415 -0
  275. package/vendor/ars/deep-research/templates/research_brief_template.md +93 -0
  276. package/vendor/ars/package.json +24 -0
  277. package/vendor/ars/pi/README.md +161 -0
  278. package/vendor/ars/pi/package.json +26 -0
  279. package/vendor/ars/pi/wrapper.js +193 -0
  280. package/vendor/ars/pi/wrapper.test.mjs +201 -0
  281. package/vendor/ars/pyproject.toml +2 -0
  282. package/vendor/ars/requirements-pdf-content-classifier.txt +5 -0
  283. package/vendor/ars/scripts/_block_parser.py +396 -0
  284. package/vendor/ars/scripts/_ci_pytest_manifest.toml +661 -0
  285. package/vendor/ars/scripts/_claim_audit_constants.py +268 -0
  286. package/vendor/ars/scripts/_e4_evidence.py +110 -0
  287. package/vendor/ars/scripts/_eval_threshold_gate.py +73 -0
  288. package/vendor/ars/scripts/_markdown_lint_util.py +224 -0
  289. package/vendor/ars/scripts/_next_verified_at_ms.py +176 -0
  290. package/vendor/ars/scripts/_passport_yaml.py +53 -0
  291. package/vendor/ars/scripts/_skill_lint.py +254 -0
  292. package/vendor/ars/scripts/_text_similarity.py +141 -0
  293. package/vendor/ars/scripts/adapters/README.md +89 -0
  294. package/vendor/ars/scripts/adapters/_common.py +209 -0
  295. package/vendor/ars/scripts/adapters/examples/folder_scan/expected_passport.yaml +25 -0
  296. package/vendor/ars/scripts/adapters/examples/folder_scan/expected_rejection_log.yaml +18 -0
  297. package/vendor/ars/scripts/adapters/examples/folder_scan/input_fixture/Chen2024_AIAssessment.pdf +0 -0
  298. package/vendor/ars/scripts/adapters/examples/folder_scan/input_fixture/Wang_2023_formative_feedback.pdf +0 -0
  299. package/vendor/ars/scripts/adapters/examples/folder_scan/input_fixture/paper1.pdf +0 -0
  300. 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
  301. package/vendor/ars/scripts/adapters/examples/obsidian/expected_passport.yaml +40 -0
  302. package/vendor/ars/scripts/adapters/examples/obsidian/expected_rejection_log.yaml +13 -0
  303. package/vendor/ars/scripts/adapters/examples/obsidian/input_fixture/vault/.gitkeep +0 -0
  304. package/vendor/ars/scripts/adapters/examples/obsidian/input_fixture/vault/.obsidian/app.json +1 -0
  305. package/vendor/ars/scripts/adapters/examples/obsidian/input_fixture/vault/_templates/tmpl.md +7 -0
  306. package/vendor/ars/scripts/adapters/examples/obsidian/input_fixture/vault/chen2024ai.md +13 -0
  307. package/vendor/ars/scripts/adapters/examples/obsidian/input_fixture/vault/invalid.md +1 -0
  308. package/vendor/ars/scripts/adapters/examples/obsidian/input_fixture/vault/wang2023formative.md +10 -0
  309. package/vendor/ars/scripts/adapters/examples/zotero/expected_passport.yaml +34 -0
  310. package/vendor/ars/scripts/adapters/examples/zotero/expected_rejection_log.yaml +34 -0
  311. package/vendor/ars/scripts/adapters/examples/zotero/input_fixture/.gitkeep +0 -0
  312. package/vendor/ars/scripts/adapters/examples/zotero/input_fixture/export.json +43 -0
  313. package/vendor/ars/scripts/adapters/folder_scan.py +214 -0
  314. package/vendor/ars/scripts/adapters/obsidian.py +336 -0
  315. package/vendor/ars/scripts/adapters/tests/.gitkeep +0 -0
  316. package/vendor/ars/scripts/adapters/tests/conftest.py +77 -0
  317. package/vendor/ars/scripts/adapters/tests/test_check_corpus_consumer_protocol.py +632 -0
  318. package/vendor/ars/scripts/adapters/tests/test_check_literature_corpus_schema.py +631 -0
  319. package/vendor/ars/scripts/adapters/tests/test_common.py +365 -0
  320. package/vendor/ars/scripts/adapters/tests/test_conftest.py +96 -0
  321. package/vendor/ars/scripts/adapters/tests/test_folder_scan.py +260 -0
  322. package/vendor/ars/scripts/adapters/tests/test_literature_corpus_entry_schema.py +745 -0
  323. package/vendor/ars/scripts/adapters/tests/test_obsidian.py +357 -0
  324. package/vendor/ars/scripts/adapters/tests/test_rejection_log_schema.py +271 -0
  325. package/vendor/ars/scripts/adapters/tests/test_sync_adapter_docs.py +88 -0
  326. package/vendor/ars/scripts/adapters/tests/test_zotero.py +454 -0
  327. package/vendor/ars/scripts/adapters/zotero.py +318 -0
  328. package/vendor/ars/scripts/adjudication_activity.py +1592 -0
  329. package/vendor/ars/scripts/announce-ars-loaded.sh +144 -0
  330. package/vendor/ars/scripts/ars_anchorize_draft.py +170 -0
  331. package/vendor/ars/scripts/ars_apply_revision_patch.py +912 -0
  332. package/vendor/ars/scripts/ars_cache_invalidate.py +40 -0
  333. package/vendor/ars/scripts/ars_mark_read.py +521 -0
  334. package/vendor/ars/scripts/ars_phase_scope_manifest.json +33 -0
  335. package/vendor/ars/scripts/ars_update_check.sh +215 -0
  336. package/vendor/ars/scripts/ars_write_scope_guard.py +506 -0
  337. package/vendor/ars/scripts/arxiv_client.py +222 -0
  338. package/vendor/ars/scripts/audit_snapshot.py +572 -0
  339. package/vendor/ars/scripts/bibliographic_integrity_signals.py +800 -0
  340. package/vendor/ars/scripts/bootstrap_timeline_yaml.py +146 -0
  341. package/vendor/ars/scripts/build_claim_standing_candidate_ledger.py +1238 -0
  342. package/vendor/ars/scripts/build_claim_standing_query_plan.py +643 -0
  343. package/vendor/ars/scripts/build_content_coverage_advisory.py +1205 -0
  344. package/vendor/ars/scripts/build_cross_document_consistency_advisory.py +2332 -0
  345. package/vendor/ars/scripts/build_review_pathway_rule_trace.py +830 -0
  346. package/vendor/ars/scripts/build_submission_packet_manifest.py +2310 -0
  347. package/vendor/ars/scripts/check_215_field_norm.py +173 -0
  348. package/vendor/ars/scripts/check_216_surface_form.py +250 -0
  349. package/vendor/ars/scripts/check_268_nested_commitment_ledger.py +180 -0
  350. package/vendor/ars/scripts/check_390_revision_patch_discipline.py +296 -0
  351. package/vendor/ars/scripts/check_392_citation_verification_intake.py +126 -0
  352. package/vendor/ars/scripts/check_394_submission_policy.py +178 -0
  353. package/vendor/ars/scripts/check_439_format_profile.py +307 -0
  354. package/vendor/ars/scripts/check_619_disclosure_closeout.py +237 -0
  355. package/vendor/ars/scripts/check_630_codex_subscription_transport.py +456 -0
  356. package/vendor/ars/scripts/check_669_review_pathway_rule_trace.py +662 -0
  357. package/vendor/ars/scripts/check_670_revision_roadmap_integration.py +518 -0
  358. package/vendor/ars/scripts/check_673_adjudication_activity.py +684 -0
  359. package/vendor/ars/scripts/check_684_review_criteria_binding.py +557 -0
  360. package/vendor/ars/scripts/check_agents_mirror_sync.py +115 -0
  361. package/vendor/ars/scripts/check_audit_artifact_consistency.py +2313 -0
  362. package/vendor/ars/scripts/check_benchmark_report.py +79 -0
  363. package/vendor/ars/scripts/check_bibliographic_integrity_signals.py +831 -0
  364. package/vendor/ars/scripts/check_calibration_tiers.py +235 -0
  365. package/vendor/ars/scripts/check_changelog_covers_merges.py +289 -0
  366. package/vendor/ars/scripts/check_ci_pytest_manifest.py +204 -0
  367. package/vendor/ars/scripts/check_claim_audit_consistency.py +1664 -0
  368. package/vendor/ars/scripts/check_claim_standing_candidate_ledger_integration.py +500 -0
  369. package/vendor/ars/scripts/check_claim_standing_freshness.py +253 -0
  370. package/vendor/ars/scripts/check_claim_standing_transmissions.py +449 -0
  371. package/vendor/ars/scripts/check_collaboration_depth_rubric.py +180 -0
  372. package/vendor/ars/scripts/check_command_frontmatter_name.py +116 -0
  373. package/vendor/ars/scripts/check_committee_correspondence.py +333 -0
  374. package/vendor/ars/scripts/check_compliance_report.py +108 -0
  375. package/vendor/ars/scripts/check_content_coverage_advisory_integration.py +796 -0
  376. package/vendor/ars/scripts/check_control_availability.py +172 -0
  377. package/vendor/ars/scripts/check_corpus_consumer_protocol.py +404 -0
  378. package/vendor/ars/scripts/check_cross_document_consistency_advisory_integration.py +1191 -0
  379. package/vendor/ars/scripts/check_cross_model_handoff_contract.py +234 -0
  380. package/vendor/ars/scripts/check_cross_model_verification_sync.py +261 -0
  381. package/vendor/ars/scripts/check_data_access_level.py +131 -0
  382. package/vendor/ars/scripts/check_data_flows.py +252 -0
  383. package/vendor/ars/scripts/check_decision_contract.py +464 -0
  384. package/vendor/ars/scripts/check_degradation_registry.py +326 -0
  385. package/vendor/ars/scripts/check_distribution_surface_claims.py +226 -0
  386. package/vendor/ars/scripts/check_domain_evidence_profile.py +538 -0
  387. package/vendor/ars/scripts/check_e4_promotion.py +195 -0
  388. package/vendor/ars/scripts/check_evals_gold_set.py +279 -0
  389. package/vendor/ars/scripts/check_evidence_row_integration.py +396 -0
  390. package/vendor/ars/scripts/check_experiment_provenance.py +117 -0
  391. package/vendor/ars/scripts/check_field_norm_severity.py +144 -0
  392. package/vendor/ars/scripts/check_firm_rules_sync.py +375 -0
  393. package/vendor/ars/scripts/check_heldout_measurement_report.py +1179 -0
  394. package/vendor/ars/scripts/check_human_subjects_output_contract.py +139 -0
  395. package/vendor/ars/scripts/check_human_subjects_reference_migration.py +844 -0
  396. package/vendor/ars/scripts/check_indirect_prompt_injection_no_call.py +328 -0
  397. package/vendor/ars/scripts/check_instruction_data_boundary.py +236 -0
  398. package/vendor/ars/scripts/check_judge_prompt_version.py +125 -0
  399. package/vendor/ars/scripts/check_literature_corpus_schema.py +402 -0
  400. package/vendor/ars/scripts/check_model_tiering.py +223 -0
  401. package/vendor/ars/scripts/check_panel_synthesis.py +1331 -0
  402. package/vendor/ars/scripts/check_passport_reset_contract.py +214 -0
  403. package/vendor/ars/scripts/check_pattern_eval_manifest.py +422 -0
  404. package/vendor/ars/scripts/check_persuasion_invariance_fixtures.py +637 -0
  405. package/vendor/ars/scripts/check_phase_conformance.py +2180 -0
  406. package/vendor/ars/scripts/check_pipeline_boundary_semantics.py +600 -0
  407. package/vendor/ars/scripts/check_pipeline_integrity.py +340 -0
  408. package/vendor/ars/scripts/check_policy_anchor_protocol.py +159 -0
  409. package/vendor/ars/scripts/check_policy_anchor_table.py +286 -0
  410. package/vendor/ars/scripts/check_preprint_venues_consistency.py +123 -0
  411. package/vendor/ars/scripts/check_prisma_trAIce_freshness.py +84 -0
  412. package/vendor/ars/scripts/check_promotion_bakeoff_preregistration.py +1303 -0
  413. package/vendor/ars/scripts/check_ranking_lift.py +323 -0
  414. package/vendor/ars/scripts/check_re_review_synthesis.py +2719 -0
  415. package/vendor/ars/scripts/check_receipt_enum_sync.py +203 -0
  416. package/vendor/ars/scripts/check_repro_lock.py +85 -0
  417. package/vendor/ars/scripts/check_review_pathway_output.py +276 -0
  418. package/vendor/ars/scripts/check_reviewer_data_fences.py +224 -0
  419. package/vendor/ars/scripts/check_reviewer_finding_contract.py +783 -0
  420. package/vendor/ars/scripts/check_reviewer_role_label.py +447 -0
  421. package/vendor/ars/scripts/check_reviewer_scoring_honesty.py +292 -0
  422. package/vendor/ars/scripts/check_reviewer_sprint_prompt_sync.py +409 -0
  423. package/vendor/ars/scripts/check_revision_claim_drift_suite_v2.py +1622 -0
  424. package/vendor/ars/scripts/check_revision_token_conservation.py +263 -0
  425. package/vendor/ars/scripts/check_risk_register.py +280 -0
  426. package/vendor/ars/scripts/check_role_scoped_contract.py +702 -0
  427. package/vendor/ars/scripts/check_rq_framing_patterns.py +184 -0
  428. package/vendor/ars/scripts/check_rubric_weight_consistency.py +32 -0
  429. package/vendor/ars/scripts/check_seeded_defect_fixtures.py +425 -0
  430. package/vendor/ars/scripts/check_setup_cross_model_parity.py +139 -0
  431. package/vendor/ars/scripts/check_spec_consistency.py +1249 -0
  432. package/vendor/ars/scripts/check_sprint_contract.py +371 -0
  433. package/vendor/ars/scripts/check_stage_capability_matrix.py +784 -0
  434. package/vendor/ars/scripts/check_submission_packet_manifest_integration.py +358 -0
  435. package/vendor/ars/scripts/check_surface_form_parity.py +445 -0
  436. package/vendor/ars/scripts/check_task_type.py +22 -0
  437. package/vendor/ars/scripts/check_tools_allowlist.py +538 -0
  438. package/vendor/ars/scripts/check_tortured_phrase_screening_integration.py +1974 -0
  439. package/vendor/ars/scripts/check_v3_10_134_write_scope.py +286 -0
  440. package/vendor/ars/scripts/check_v3_10_policy.py +656 -0
  441. package/vendor/ars/scripts/check_v3_6_6_ab_manifest.py +364 -0
  442. package/vendor/ars/scripts/check_v3_6_7_pattern_protection.py +1366 -0
  443. package/vendor/ars/scripts/check_v3_6_8_audit_scope_block.py +464 -0
  444. package/vendor/ars/scripts/check_v3_6_8_cite_provenance_pipeline.py +231 -0
  445. package/vendor/ars/scripts/check_v3_6_8_frontmatter_trust_schema.py +248 -0
  446. package/vendor/ars/scripts/check_v3_6_8_mark_read_commands.py +79 -0
  447. package/vendor/ars/scripts/check_v3_6_8_pattern_protection.py +941 -0
  448. package/vendor/ars/scripts/check_v3_7_3_three_layer_citation.py +318 -0
  449. package/vendor/ars/scripts/check_v3_8_annotation_literal_sync.py +228 -0
  450. package/vendor/ars/scripts/check_v3_9_0_triangulation.py +366 -0
  451. package/vendor/ars/scripts/check_v3_9_2_phase_boundary.py +270 -0
  452. package/vendor/ars/scripts/check_v3_9_4_temporal_verification.py +139 -0
  453. package/vendor/ars/scripts/check_venue_disclosure_policies.py +63 -0
  454. package/vendor/ars/scripts/check_version_consistency.py +826 -0
  455. package/vendor/ars/scripts/check_workflow_classification.py +223 -0
  456. package/vendor/ars/scripts/chinese_literature_client.py +1938 -0
  457. package/vendor/ars/scripts/citation_verification_summary.py +85 -0
  458. package/vendor/ars/scripts/claim_audit_calibration.py +517 -0
  459. package/vendor/ars/scripts/claim_audit_finalizer.py +456 -0
  460. package/vendor/ars/scripts/claim_audit_pipeline.py +1594 -0
  461. package/vendor/ars/scripts/claim_registry_coverage.py +493 -0
  462. package/vendor/ars/scripts/claim_standing_discovery.py +784 -0
  463. package/vendor/ars/scripts/claim_standing_stance_runner.py +758 -0
  464. package/vendor/ars/scripts/claim_standing_stance_scorer.py +239 -0
  465. package/vendor/ars/scripts/claim_strength_drift_disposition.py +666 -0
  466. package/vendor/ars/scripts/contamination_signals.py +689 -0
  467. package/vendor/ars/scripts/corpus_consumer_manifest.json +19 -0
  468. package/vendor/ars/scripts/cross_model_codex_transport.py +1374 -0
  469. package/vendor/ars/scripts/cross_model_codex_verify.sh +6 -0
  470. package/vendor/ars/scripts/cross_model_handoff.py +359 -0
  471. package/vendor/ars/scripts/cross_model_smoke_test.sh +183 -0
  472. package/vendor/ars/scripts/cross_model_smoke_test_codex.sh +35 -0
  473. package/vendor/ars/scripts/cross_model_verification/gemini_is_grounded.jq +45 -0
  474. package/vendor/ars/scripts/cross_model_verification/gemini_sources.jq +45 -0
  475. package/vendor/ars/scripts/cross_model_verification/normalize_compat_verdict.py +57 -0
  476. package/vendor/ars/scripts/cross_model_verification/openai_has_completed_web_search.jq +15 -0
  477. package/vendor/ars/scripts/cross_model_verification/openai_sources.jq +17 -0
  478. package/vendor/ars/scripts/cross_model_verification/openai_text.jq +11 -0
  479. package/vendor/ars/scripts/crossref_client.py +225 -0
  480. package/vendor/ars/scripts/dispatch_e4_panel.py +2731 -0
  481. package/vendor/ars/scripts/evidence_rows.py +2043 -0
  482. package/vendor/ars/scripts/fixtures/adjudication_activity/author_stage3.json +32 -0
  483. package/vendor/ars/scripts/fixtures/adjudication_activity/author_stage3_input.json +27 -0
  484. package/vendor/ars/scripts/fixtures/adjudication_activity/author_stage3_prime.json +32 -0
  485. package/vendor/ars/scripts/fixtures/adjudication_activity/author_stage3_prime_input.json +27 -0
  486. package/vendor/ars/scripts/fixtures/adjudication_activity/compliance_override.json +50 -0
  487. package/vendor/ars/scripts/fixtures/adjudication_activity/compliance_override_action.json +14 -0
  488. package/vendor/ars/scripts/fixtures/adjudication_activity/compliance_pass.json +44 -0
  489. package/vendor/ars/scripts/fixtures/adjudication_activity/explicit_user_request_log.json +26 -0
  490. package/vendor/ars/scripts/fixtures/adjudication_activity/mandatory_checkpoint_log.json +116 -0
  491. package/vendor/ars/scripts/fixtures/audit_artifact_consistency/README.md +56 -0
  492. 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
  493. package/vendor/ars/scripts/fixtures/audit_artifact_consistency/negative/a1_pass_with_p1/2026-04-30T15-22-04Z-d8f3.jsonl +4 -0
  494. package/vendor/ars/scripts/fixtures/audit_artifact_consistency/negative/a1_pass_with_p1/2026-04-30T15-22-04Z-d8f3.meta.json +43 -0
  495. package/vendor/ars/scripts/fixtures/audit_artifact_consistency/negative/a1_pass_with_p1/2026-04-30T15-22-04Z-d8f3.verdict.yaml +19 -0
  496. package/vendor/ars/scripts/fixtures/audit_artifact_consistency/negative/a7_orphan_completion/2026-04-30T15-22-04Z-d8f3.jsonl +3 -0
  497. package/vendor/ars/scripts/fixtures/audit_artifact_consistency/positive/persisted_minor/2026-04-30T15-22-04Z-d8f3.audit_artifact_entry.json +26 -0
  498. package/vendor/ars/scripts/fixtures/audit_artifact_consistency/positive/persisted_minor/2026-04-30T15-22-04Z-d8f3.jsonl +4 -0
  499. package/vendor/ars/scripts/fixtures/audit_artifact_consistency/positive/persisted_minor/2026-04-30T15-22-04Z-d8f3.meta.json +43 -0
  500. package/vendor/ars/scripts/fixtures/audit_artifact_consistency/positive/persisted_minor/2026-04-30T15-22-04Z-d8f3.verdict.yaml +19 -0
  501. package/vendor/ars/scripts/fixtures/audit_artifact_consistency/positive/proposal_pass/2026-04-30T15-22-04Z-d8f3.audit_artifact_entry.json +24 -0
  502. package/vendor/ars/scripts/fixtures/audit_artifact_consistency/positive/proposal_pass/2026-04-30T15-22-04Z-d8f3.jsonl +4 -0
  503. package/vendor/ars/scripts/fixtures/audit_artifact_consistency/positive/proposal_pass/2026-04-30T15-22-04Z-d8f3.meta.json +43 -0
  504. package/vendor/ars/scripts/fixtures/audit_artifact_consistency/positive/proposal_pass/2026-04-30T15-22-04Z-d8f3.verdict.yaml +12 -0
  505. package/vendor/ars/scripts/fixtures/bibliographic_integrity_signals/retraction.json +46 -0
  506. package/vendor/ars/scripts/fixtures/bibliographic_integrity_signals/retraction_check_attestation.json +44 -0
  507. package/vendor/ars/scripts/fixtures/bibliographic_integrity_signals/tortured_phrase.json +44 -0
  508. package/vendor/ars/scripts/fixtures/bibliographic_integrity_signals/tortured_phrase_v1_2_abstract_missing.json +107 -0
  509. package/vendor/ars/scripts/fixtures/bibliographic_integrity_signals/tortured_phrase_v1_2_detected.json +124 -0
  510. package/vendor/ars/scripts/fixtures/check_evals_gold_set/clean/expected_outcomes.json +77 -0
  511. package/vendor/ars/scripts/fixtures/check_evals_gold_set/clean/manifest.yaml +37 -0
  512. package/vendor/ars/scripts/fixtures/check_evals_gold_set/clean/tuples/001-valid-doi-test.json +20 -0
  513. package/vendor/ars/scripts/fixtures/check_evals_gold_set/clean/tuples/002-valid-arxiv-test.json +19 -0
  514. package/vendor/ars/scripts/fixtures/check_evals_gold_set/clean/tuples/003-fabricated-test.json +20 -0
  515. package/vendor/ars/scripts/fixtures/claim_audit_calibration/gold_set.json +344 -0
  516. package/vendor/ars/scripts/fixtures/claim_standing_candidate_ledger/query_plan.json +108 -0
  517. package/vendor/ars/scripts/fixtures/claim_standing_candidate_ledger/retrieval_input.json +179 -0
  518. package/vendor/ars/scripts/fixtures/committee_correspondence/16fd83f6aec7/concern_tracker.json +129 -0
  519. package/vendor/ars/scripts/fixtures/committee_correspondence/16fd83f6aec7/response_skeleton.md +19 -0
  520. package/vendor/ars/scripts/fixtures/committee_correspondence/16fd83f6aec7/source_letter.txt +9 -0
  521. package/vendor/ars/scripts/fixtures/content_coverage_advisory/base_draft.json +48 -0
  522. package/vendor/ars/scripts/fixtures/content_coverage_advisory/base_inventory.json +38 -0
  523. package/vendor/ars/scripts/fixtures/content_coverage_advisory/packet/consent.txt +1 -0
  524. package/vendor/ars/scripts/fixtures/content_coverage_advisory/session_sources.json +3 -0
  525. package/vendor/ars/scripts/fixtures/cross_document_consistency/README.md +6 -0
  526. package/vendor/ars/scripts/fixtures/cross_document_consistency/accepted_draft.md +35 -0
  527. package/vendor/ars/scripts/fixtures/cross_document_consistency/cases.json +75 -0
  528. package/vendor/ars/scripts/fixtures/cross_document_consistency/preregistration.md +5 -0
  529. package/vendor/ars/scripts/fixtures/cross_model_codex_transport/forbidden_event.jsonl +4 -0
  530. package/vendor/ars/scripts/fixtures/cross_model_codex_transport/grounded_verified.jsonl +3 -0
  531. package/vendor/ars/scripts/fixtures/cross_model_codex_transport/malformed.jsonl +3 -0
  532. package/vendor/ars/scripts/fixtures/cross_model_codex_transport/missing_search.jsonl +2 -0
  533. package/vendor/ars/scripts/fixtures/cross_model_codex_transport/multiple_finals.jsonl +4 -0
  534. package/vendor/ars/scripts/fixtures/cross_model_codex_transport/not_found.jsonl +3 -0
  535. package/vendor/ars/scripts/fixtures/cross_model_codex_transport/unbound_source.jsonl +3 -0
  536. package/vendor/ars/scripts/fixtures/cross_model_codex_transport/wrong_search_shape.jsonl +3 -0
  537. package/vendor/ars/scripts/fixtures/evidence_rows/phase_e_inputs.json +114 -0
  538. package/vendor/ars/scripts/fixtures/evidence_rows/session_sources.json +5 -0
  539. package/vendor/ars/scripts/fixtures/human_subjects_authority/cross-border-us-tw-gdpr.json +71 -0
  540. package/vendor/ars/scripts/fixtures/human_subjects_authority/gdpr-member-state-unresolved.json +62 -0
  541. package/vendor/ars/scripts/fixtures/human_subjects_authority/missing-data-axis.json +45 -0
  542. package/vendor/ars/scripts/fixtures/human_subjects_authority/no-profile.json +33 -0
  543. package/vendor/ars/scripts/fixtures/human_subjects_authority/tw-gdpr-two-axis.json +74 -0
  544. package/vendor/ars/scripts/fixtures/human_subjects_authority/us-gdpr-two-axis.json +74 -0
  545. package/vendor/ars/scripts/fixtures/review_pathway_rule_trace/lint-near-misses.json +72 -0
  546. package/vendor/ars/scripts/fixtures/review_pathway_rule_trace/no-profile-request.json +18 -0
  547. package/vendor/ars/scripts/fixtures/review_pathway_rule_trace/tw-candidates-request.json +63 -0
  548. package/vendor/ars/scripts/fixtures/review_pathway_rule_trace/us-candidates-request.json +77 -0
  549. package/vendor/ars/scripts/fixtures/review_target_context/exact-declaration.json +24 -0
  550. package/vendor/ars/scripts/fixtures/review_target_context/field-general-declaration.json +24 -0
  551. package/vendor/ars/scripts/fixtures/review_target_context/msr-2027-technical-full-declaration.json +24 -0
  552. package/vendor/ars/scripts/fixtures/review_target_context/synthetic-registry.json +92 -0
  553. package/vendor/ars/scripts/fixtures/revision_claim_drift_v2/README.md +21 -0
  554. package/vendor/ars/scripts/fixtures/revision_claim_drift_v2/subject_context_attested_only.json +55 -0
  555. package/vendor/ars/scripts/fixtures/revision_claim_drift_v2/subject_context_machine_supported.json +49 -0
  556. package/vendor/ars/scripts/fixtures/revision_claim_drift_v2/subject_context_not_isolated.json +56 -0
  557. package/vendor/ars/scripts/fixtures/revision_claim_drift_v2/subject_context_unknown.json +49 -0
  558. package/vendor/ars/scripts/fixtures/submission_package/clean/paper.md +16 -0
  559. package/vendor/ars/scripts/fixtures/submission_package/clean/references.bib +13 -0
  560. package/vendor/ars/scripts/fixtures/submission_package/fallback_authoryear/paper.md +11 -0
  561. package/vendor/ars/scripts/fixtures/submission_package/fallback_authoryear/references.bib +13 -0
  562. package/vendor/ars/scripts/fixtures/submission_package/fallback_latex/paper.tex +9 -0
  563. package/vendor/ars/scripts/fixtures/submission_package/fallback_latex/references.bib +13 -0
  564. package/vendor/ars/scripts/fixtures/submission_package/marker_no_join/paper.md +7 -0
  565. package/vendor/ars/scripts/fixtures/submission_package/orphan_intext/paper.md +8 -0
  566. package/vendor/ars/scripts/fixtures/submission_package/orphan_intext/references.bib +6 -0
  567. package/vendor/ars/scripts/fixtures/submission_package/passports/corpus_only.yaml +9 -0
  568. package/vendor/ars/scripts/fixtures/submission_package/passports/summary_join.yaml +16 -0
  569. package/vendor/ars/scripts/fixtures/submission_package/profiles/full.yaml +15 -0
  570. package/vendor/ars/scripts/fixtures/submission_package/profiles/tight.yaml +15 -0
  571. package/vendor/ars/scripts/fixtures/submission_package/summary_join/paper.md +7 -0
  572. package/vendor/ars/scripts/fixtures/submission_package/uncited_reference/paper.md +9 -0
  573. package/vendor/ars/scripts/fixtures/submission_package/uncited_reference/references.bib +13 -0
  574. package/vendor/ars/scripts/fixtures/submission_package/venue_clean/paper.md +26 -0
  575. package/vendor/ars/scripts/fixtures/submission_package/venue_clean/references.bib +13 -0
  576. package/vendor/ars/scripts/fixtures/submission_package/venue_violations/paper.md +20 -0
  577. package/vendor/ars/scripts/fixtures/submission_package/venue_violations/references.bib +13 -0
  578. package/vendor/ars/scripts/fixtures/submission_packet_manifest/base_inventory.json +101 -0
  579. package/vendor/ars/scripts/fixtures/submission_packet_manifest/packet/consent-materials.txt +3 -0
  580. package/vendor/ars/scripts/fixtures/submission_packet_manifest/packet/training-certificate.txt +2 -0
  581. package/vendor/ars/scripts/fixtures/submission_packet_manifest/packet/tw-consent-materials.txt +3 -0
  582. package/vendor/ars/scripts/fixtures/tortured_phrase_screening/corpus_input.yaml +30 -0
  583. package/vendor/ars/scripts/fixtures/tortured_phrase_screening/own_draft.md +36 -0
  584. package/vendor/ars/scripts/fixtures/tortured_phrase_screening/own_draft.tex +21 -0
  585. package/vendor/ars/scripts/fixtures/tortured_phrase_screening/seed_expectations.json +218 -0
  586. package/vendor/ars/scripts/fixtures/tortured_phrase_screening/snapshot.json +164 -0
  587. package/vendor/ars/scripts/fixtures/tortured_phrase_screening/snapshot_manifest.json +29 -0
  588. package/vendor/ars/scripts/fixtures/transport_bodies/README.md +55 -0
  589. package/vendor/ars/scripts/fixtures/transport_bodies/arxiv/empty_feed.xml +10 -0
  590. package/vendor/ars/scripts/fixtures/transport_bodies/arxiv/error_5xx.html +7 -0
  591. package/vendor/ars/scripts/fixtures/transport_bodies/arxiv/id_hit.xml +26 -0
  592. package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/README.md +69 -0
  593. package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/cnki_landing_page.html +13 -0
  594. package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/error_5xx.html +2 -0
  595. package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esearch_coordinate_ambiguous.json +16 -0
  596. package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esearch_coordinate_hit.json +16 -0
  597. package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esearch_coordinate_zero.json +14 -0
  598. package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esearch_coverage_hit.json +15 -0
  599. package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esearch_coverage_zero.json +13 -0
  600. package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esummary_hit.json +43 -0
  601. package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esummary_issn_mismatch.json +31 -0
  602. package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esummary_no_doi.json +31 -0
  603. package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esummary_unknown_ra.json +34 -0
  604. package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esummary_year_mismatch.json +31 -0
  605. package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/handle_absent.json +4 -0
  606. package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/handle_exists.json +16 -0
  607. package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/handle_internal_error.json +4 -0
  608. package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/istic_csl_hit.json +25 -0
  609. package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/istic_csl_other_title.json +18 -0
  610. package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/ra_cnki.json +6 -0
  611. package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/ra_crossref.json +6 -0
  612. package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/ra_istic.json +6 -0
  613. package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/ra_unknown_prefix.json +6 -0
  614. package/vendor/ars/scripts/fixtures/transport_bodies/crossref/doi_hit.json +24 -0
  615. package/vendor/ars/scripts/fixtures/transport_bodies/crossref/error_5xx.html +7 -0
  616. package/vendor/ars/scripts/fixtures/transport_bodies/crossref/title_search_miss.json +15 -0
  617. package/vendor/ars/scripts/fixtures/transport_bodies/openalex/doi_hit.json +29 -0
  618. package/vendor/ars/scripts/fixtures/transport_bodies/openalex/error_5xx.json +4 -0
  619. package/vendor/ars/scripts/fixtures/transport_bodies/openalex/title_search_miss.json +11 -0
  620. package/vendor/ars/scripts/fixtures/transport_bodies/semantic_scholar/doi_hit.json +14 -0
  621. package/vendor/ars/scripts/fixtures/transport_bodies/semantic_scholar/error_5xx.json +3 -0
  622. package/vendor/ars/scripts/fixtures/transport_bodies/semantic_scholar/title_search_miss.json +5 -0
  623. package/vendor/ars/scripts/human_read_attestation_resolver.py +467 -0
  624. package/vendor/ars/scripts/ideation_diversity_assignment_gate.py +430 -0
  625. package/vendor/ars/scripts/inquiry_branch_ledger.py +2540 -0
  626. package/vendor/ars/scripts/legacy/ars_apply_revision_patch_v1_0.py +715 -0
  627. package/vendor/ars/scripts/legacy/check_re_review_synthesis_v1_0.py +2215 -0
  628. package/vendor/ars/scripts/migrate_literature_corpus_to_v3_10.py +223 -0
  629. package/vendor/ars/scripts/migrate_literature_corpus_to_v3_7_3.py +277 -0
  630. package/vendor/ars/scripts/migrate_literature_corpus_to_v3_9_0.py +304 -0
  631. package/vendor/ars/scripts/model_tiering_manifest.json +46 -0
  632. package/vendor/ars/scripts/openalex_client.py +232 -0
  633. package/vendor/ars/scripts/parse_audit_verdict.py +802 -0
  634. package/vendor/ars/scripts/pdf_content_classifier_worker.py +176 -0
  635. package/vendor/ars/scripts/pdf_read_preflight.py +1455 -0
  636. package/vendor/ars/scripts/policy_anchor_disclosure_referee.py +354 -0
  637. package/vendor/ars/scripts/recompute_receipts.py +1414 -0
  638. package/vendor/ars/scripts/render_claim_standing_view.py +374 -0
  639. package/vendor/ars/scripts/render_eval_comment.py +130 -0
  640. package/vendor/ars/scripts/render_harness_retirement_issue.py +167 -0
  641. package/vendor/ars/scripts/repro_lock_validation.py +90 -0
  642. package/vendor/ars/scripts/research_workflow_profile.py +1079 -0
  643. package/vendor/ars/scripts/resolve_human_subjects_authority.py +1158 -0
  644. package/vendor/ars/scripts/resolve_review_target_context.py +683 -0
  645. package/vendor/ars/scripts/resume_e4_record.py +509 -0
  646. package/vendor/ars/scripts/retraction_status.py +484 -0
  647. package/vendor/ars/scripts/review_criteria_binding.py +889 -0
  648. package/vendor/ars/scripts/review_panel_provenance.py +744 -0
  649. package/vendor/ars/scripts/revision_roadmap.py +1967 -0
  650. package/vendor/ars/scripts/run_ci_pytest_manifest.py +116 -0
  651. package/vendor/ars/scripts/run_codex_audit.sh +1191 -0
  652. package/vendor/ars/scripts/run_evals.py +513 -0
  653. package/vendor/ars/scripts/run_ideation_diversity_no_call.py +3505 -0
  654. package/vendor/ars/scripts/run_indirect_prompt_injection_no_call.py +3330 -0
  655. package/vendor/ars/scripts/run_indirect_prompt_injection_probe.py +399 -0
  656. package/vendor/ars/scripts/run_review_criteria_constructive_value.py +1895 -0
  657. package/vendor/ars/scripts/run_role_topology_utility_dry_run.py +606 -0
  658. package/vendor/ars/scripts/score_review_criteria_constructive_value.py +617 -0
  659. package/vendor/ars/scripts/semantic_scholar_client.py +291 -0
  660. package/vendor/ars/scripts/slr_lineage.py +59 -0
  661. package/vendor/ars/scripts/sync_adapter_docs.py +118 -0
  662. package/vendor/ars/scripts/temporal_integrity_audit.py +840 -0
  663. package/vendor/ars/scripts/test_431_exact_or_bust.py +253 -0
  664. package/vendor/ars/scripts/test__eval_threshold_gate.py +125 -0
  665. package/vendor/ars/scripts/test__markdown_lint_util.py +129 -0
  666. package/vendor/ars/scripts/test__next_verified_at_ms.py +256 -0
  667. package/vendor/ars/scripts/test_adjacent_framing_probe_lint.py +171 -0
  668. package/vendor/ars/scripts/test_adjudication_activity.py +1515 -0
  669. package/vendor/ars/scripts/test_ars_anchorize_draft.py +178 -0
  670. package/vendor/ars/scripts/test_ars_apply_revision_patch.py +1335 -0
  671. package/vendor/ars/scripts/test_ars_cache_invalidate.py +51 -0
  672. package/vendor/ars/scripts/test_ars_mark_read.py +910 -0
  673. package/vendor/ars/scripts/test_ars_update_check.py +816 -0
  674. package/vendor/ars/scripts/test_ars_write_scope_guard.py +790 -0
  675. package/vendor/ars/scripts/test_arxiv_client.py +374 -0
  676. package/vendor/ars/scripts/test_audit_schemas.py +560 -0
  677. package/vendor/ars/scripts/test_audit_snapshot_render_section_0.py +105 -0
  678. package/vendor/ars/scripts/test_block_parser.py +259 -0
  679. package/vendor/ars/scripts/test_bootstrap_timeline_yaml.py +148 -0
  680. package/vendor/ars/scripts/test_build_claim_standing_candidate_ledger.py +1203 -0
  681. package/vendor/ars/scripts/test_build_claim_standing_query_plan.py +791 -0
  682. package/vendor/ars/scripts/test_build_submission_packet_manifest.py +2644 -0
  683. package/vendor/ars/scripts/test_check_215_field_norm.py +238 -0
  684. package/vendor/ars/scripts/test_check_216_surface_form.py +341 -0
  685. package/vendor/ars/scripts/test_check_268_nested_commitment_ledger.py +194 -0
  686. package/vendor/ars/scripts/test_check_390_revision_patch_discipline.py +279 -0
  687. package/vendor/ars/scripts/test_check_392_citation_verification_intake.py +144 -0
  688. package/vendor/ars/scripts/test_check_394_submission_policy.py +200 -0
  689. package/vendor/ars/scripts/test_check_439_format_profile.py +252 -0
  690. package/vendor/ars/scripts/test_check_619_disclosure_closeout.py +158 -0
  691. package/vendor/ars/scripts/test_check_630_codex_subscription_transport.py +245 -0
  692. package/vendor/ars/scripts/test_check_669_review_pathway_rule_trace.py +304 -0
  693. package/vendor/ars/scripts/test_check_670_revision_roadmap_integration.py +260 -0
  694. package/vendor/ars/scripts/test_check_673_adjudication_activity.py +367 -0
  695. package/vendor/ars/scripts/test_check_684_review_criteria_binding.py +274 -0
  696. package/vendor/ars/scripts/test_check_agents_mirror_sync.py +137 -0
  697. package/vendor/ars/scripts/test_check_audit_artifact_consistency.py +2133 -0
  698. package/vendor/ars/scripts/test_check_benchmark_report.py +117 -0
  699. package/vendor/ars/scripts/test_check_bibliographic_integrity_signals.py +609 -0
  700. package/vendor/ars/scripts/test_check_calibration_tiers.py +376 -0
  701. package/vendor/ars/scripts/test_check_changelog_covers_merges.py +509 -0
  702. package/vendor/ars/scripts/test_check_ci_pytest_manifest.py +425 -0
  703. package/vendor/ars/scripts/test_check_claim_standing_candidate_ledger_integration.py +256 -0
  704. package/vendor/ars/scripts/test_check_claim_standing_freshness.py +277 -0
  705. package/vendor/ars/scripts/test_check_collaboration_depth_rubric.py +239 -0
  706. package/vendor/ars/scripts/test_check_command_frontmatter_name.py +178 -0
  707. package/vendor/ars/scripts/test_check_committee_correspondence.py +298 -0
  708. package/vendor/ars/scripts/test_check_compliance_report.py +381 -0
  709. package/vendor/ars/scripts/test_check_content_coverage_advisory_integration.py +308 -0
  710. package/vendor/ars/scripts/test_check_control_availability.py +361 -0
  711. package/vendor/ars/scripts/test_check_cross_document_consistency_advisory_integration.py +698 -0
  712. package/vendor/ars/scripts/test_check_cross_model_handoff_contract.py +301 -0
  713. package/vendor/ars/scripts/test_check_cross_model_verification_sync.py +203 -0
  714. package/vendor/ars/scripts/test_check_data_access_level.py +227 -0
  715. package/vendor/ars/scripts/test_check_data_flows.py +382 -0
  716. package/vendor/ars/scripts/test_check_decision_contract.py +387 -0
  717. package/vendor/ars/scripts/test_check_degradation_registry.py +270 -0
  718. package/vendor/ars/scripts/test_check_distribution_surface_claims.py +225 -0
  719. package/vendor/ars/scripts/test_check_domain_evidence_profile.py +439 -0
  720. package/vendor/ars/scripts/test_check_e4_promotion.py +163 -0
  721. package/vendor/ars/scripts/test_check_evals_gold_set.py +312 -0
  722. package/vendor/ars/scripts/test_check_evidence_row_integration.py +187 -0
  723. package/vendor/ars/scripts/test_check_field_norm_severity.py +173 -0
  724. package/vendor/ars/scripts/test_check_firm_rules_sync.py +342 -0
  725. package/vendor/ars/scripts/test_check_heldout_measurement_report.py +1508 -0
  726. package/vendor/ars/scripts/test_check_human_subjects_output_contract.py +129 -0
  727. package/vendor/ars/scripts/test_check_human_subjects_reference_migration.py +756 -0
  728. package/vendor/ars/scripts/test_check_instruction_data_boundary.py +204 -0
  729. package/vendor/ars/scripts/test_check_judge_prompt_version.py +90 -0
  730. package/vendor/ars/scripts/test_check_model_tiering.py +236 -0
  731. package/vendor/ars/scripts/test_check_panel_synthesis.py +1658 -0
  732. package/vendor/ars/scripts/test_check_passport_reset_contract.py +249 -0
  733. package/vendor/ars/scripts/test_check_pattern_eval_manifest.py +381 -0
  734. package/vendor/ars/scripts/test_check_persuasion_invariance_fixtures.py +591 -0
  735. package/vendor/ars/scripts/test_check_phase_conformance.py +4366 -0
  736. package/vendor/ars/scripts/test_check_pipeline_boundary_semantics.py +931 -0
  737. package/vendor/ars/scripts/test_check_pipeline_integrity.py +243 -0
  738. package/vendor/ars/scripts/test_check_policy_anchor_protocol.py +236 -0
  739. package/vendor/ars/scripts/test_check_policy_anchor_table.py +295 -0
  740. package/vendor/ars/scripts/test_check_prisma_trAIce_freshness.py +68 -0
  741. package/vendor/ars/scripts/test_check_promotion_bakeoff_preregistration.py +799 -0
  742. package/vendor/ars/scripts/test_check_ranking_lift.py +377 -0
  743. package/vendor/ars/scripts/test_check_re_review_synthesis.py +3398 -0
  744. package/vendor/ars/scripts/test_check_receipt_enum_sync.py +176 -0
  745. package/vendor/ars/scripts/test_check_repro_lock.py +107 -0
  746. package/vendor/ars/scripts/test_check_reviewer_data_fences.py +334 -0
  747. package/vendor/ars/scripts/test_check_reviewer_finding_contract.py +1107 -0
  748. package/vendor/ars/scripts/test_check_reviewer_role_label.py +491 -0
  749. package/vendor/ars/scripts/test_check_reviewer_scoring_honesty.py +222 -0
  750. package/vendor/ars/scripts/test_check_reviewer_sprint_prompt_sync.py +373 -0
  751. package/vendor/ars/scripts/test_check_revision_claim_drift_suite_v2.py +1925 -0
  752. package/vendor/ars/scripts/test_check_revision_token_conservation.py +398 -0
  753. package/vendor/ars/scripts/test_check_risk_register.py +336 -0
  754. package/vendor/ars/scripts/test_check_role_scoped_contract.py +1104 -0
  755. package/vendor/ars/scripts/test_check_rq_framing_patterns.py +110 -0
  756. package/vendor/ars/scripts/test_check_rubric_weight_consistency.py +32 -0
  757. package/vendor/ars/scripts/test_check_seeded_defect_fixtures.py +392 -0
  758. package/vendor/ars/scripts/test_check_setup_cross_model_parity.py +121 -0
  759. package/vendor/ars/scripts/test_check_spec_consistency.py +1081 -0
  760. package/vendor/ars/scripts/test_check_sprint_contract.py +458 -0
  761. package/vendor/ars/scripts/test_check_stage_capability_matrix.py +698 -0
  762. package/vendor/ars/scripts/test_check_submission_packet_manifest_integration.py +177 -0
  763. package/vendor/ars/scripts/test_check_surface_form_parity.py +417 -0
  764. package/vendor/ars/scripts/test_check_task_type.py +116 -0
  765. package/vendor/ars/scripts/test_check_tools_allowlist.py +835 -0
  766. package/vendor/ars/scripts/test_check_tortured_phrase_screening_integration.py +1306 -0
  767. package/vendor/ars/scripts/test_check_v3_10_134_write_scope.py +251 -0
  768. package/vendor/ars/scripts/test_check_v3_10_policy.py +547 -0
  769. package/vendor/ars/scripts/test_check_v3_6_7_pattern_protection.py +960 -0
  770. package/vendor/ars/scripts/test_check_v3_6_8_audit_scope_block.py +1000 -0
  771. package/vendor/ars/scripts/test_check_v3_6_8_cite_provenance_pipeline.py +454 -0
  772. package/vendor/ars/scripts/test_check_v3_6_8_frontmatter_trust_schema.py +581 -0
  773. package/vendor/ars/scripts/test_check_v3_6_8_mark_read_commands.py +120 -0
  774. package/vendor/ars/scripts/test_check_v3_6_8_pattern_protection.py +1138 -0
  775. package/vendor/ars/scripts/test_check_v3_7_3_three_layer_citation.py +566 -0
  776. package/vendor/ars/scripts/test_check_v3_8_annotation_literal_sync.py +262 -0
  777. package/vendor/ars/scripts/test_check_v3_9_0_triangulation.py +321 -0
  778. package/vendor/ars/scripts/test_check_v3_9_2_phase_boundary.py +190 -0
  779. package/vendor/ars/scripts/test_check_v3_9_4_temporal_verification.py +471 -0
  780. package/vendor/ars/scripts/test_check_version_consistency.py +1462 -0
  781. package/vendor/ars/scripts/test_check_workflow_classification.py +225 -0
  782. package/vendor/ars/scripts/test_chinese_literature_client.py +1889 -0
  783. package/vendor/ars/scripts/test_citation_existence_policy.py +480 -0
  784. package/vendor/ars/scripts/test_citation_verification_summary.py +342 -0
  785. package/vendor/ars/scripts/test_claim_audit_calibration.py +882 -0
  786. package/vendor/ars/scripts/test_claim_audit_finalizer.py +979 -0
  787. package/vendor/ars/scripts/test_claim_audit_pipeline.py +2398 -0
  788. package/vendor/ars/scripts/test_claim_audit_schema.py +1778 -0
  789. package/vendor/ars/scripts/test_claim_intent_manifest.py +666 -0
  790. package/vendor/ars/scripts/test_claim_registry_coverage.py +246 -0
  791. package/vendor/ars/scripts/test_claim_standing_discovery.py +579 -0
  792. package/vendor/ars/scripts/test_claim_standing_pipeline_wiring.py +290 -0
  793. package/vendor/ars/scripts/test_claim_standing_stance_assets.py +399 -0
  794. package/vendor/ars/scripts/test_claim_standing_stance_contracts.py +383 -0
  795. package/vendor/ars/scripts/test_claim_standing_stance_runner.py +349 -0
  796. package/vendor/ars/scripts/test_claim_standing_transmissions.py +605 -0
  797. package/vendor/ars/scripts/test_claim_strength_drift_disposition.py +517 -0
  798. package/vendor/ars/scripts/test_claim_verification_coverage_contract.py +104 -0
  799. package/vendor/ars/scripts/test_contamination_signals.py +1086 -0
  800. package/vendor/ars/scripts/test_content_coverage_advisory.py +1767 -0
  801. package/vendor/ars/scripts/test_cross_document_consistency_advisory.py +1270 -0
  802. package/vendor/ars/scripts/test_cross_model_codex_transport.py +1152 -0
  803. package/vendor/ars/scripts/test_cross_model_handoff.py +571 -0
  804. package/vendor/ars/scripts/test_cross_model_verification_guards.py +792 -0
  805. package/vendor/ars/scripts/test_crossref_client.py +393 -0
  806. package/vendor/ars/scripts/test_dispatch_e4_panel.py +4235 -0
  807. package/vendor/ars/scripts/test_e2e_claim_audit.py +540 -0
  808. package/vendor/ars/scripts/test_eval_harness_workflow.py +140 -0
  809. package/vendor/ars/scripts/test_evals_citation_extraction.py +150 -0
  810. package/vendor/ars/scripts/test_evals_lift_report_schema.py +108 -0
  811. package/vendor/ars/scripts/test_evidence_rows.py +2593 -0
  812. package/vendor/ars/scripts/test_experiment_provenance.py +915 -0
  813. package/vendor/ars/scripts/test_human_read_attestation_resolver.py +477 -0
  814. package/vendor/ars/scripts/test_ideation_diversity_assignment_gate.py +615 -0
  815. package/vendor/ars/scripts/test_indirect_prompt_injection_behavior_probe.py +250 -0
  816. package/vendor/ars/scripts/test_inquiry_branch_ledger.py +2296 -0
  817. package/vendor/ars/scripts/test_migrate_literature_corpus_to_v3_10.py +248 -0
  818. package/vendor/ars/scripts/test_migrate_literature_corpus_to_v3_7_3.py +545 -0
  819. package/vendor/ars/scripts/test_migrate_literature_corpus_to_v3_9_0.py +497 -0
  820. package/vendor/ars/scripts/test_normalize_compat_verdict.py +149 -0
  821. package/vendor/ars/scripts/test_openalex_client.py +490 -0
  822. package/vendor/ars/scripts/test_passport_yaml.py +104 -0
  823. package/vendor/ars/scripts/test_pattern_eval_runtime.py +1295 -0
  824. package/vendor/ars/scripts/test_pdf_read_preflight.py +1943 -0
  825. package/vendor/ars/scripts/test_policy_anchor_disclosure.py +666 -0
  826. package/vendor/ars/scripts/test_reading_probe_lint.py +218 -0
  827. package/vendor/ars/scripts/test_recompute_receipts.py +778 -0
  828. package/vendor/ars/scripts/test_render_claim_standing_view.py +192 -0
  829. package/vendor/ars/scripts/test_render_eval_comment.py +162 -0
  830. package/vendor/ars/scripts/test_render_harness_retirement_issue.py +110 -0
  831. package/vendor/ars/scripts/test_repro_lock_validation_drift.py +100 -0
  832. package/vendor/ars/scripts/test_research_workflow_profile.py +734 -0
  833. package/vendor/ars/scripts/test_resolve_human_subjects_authority.py +1219 -0
  834. package/vendor/ars/scripts/test_resolve_review_target_context.py +703 -0
  835. package/vendor/ars/scripts/test_resume_e4_record.py +315 -0
  836. package/vendor/ars/scripts/test_retraction_status.py +456 -0
  837. package/vendor/ars/scripts/test_review_criteria_binding.py +629 -0
  838. package/vendor/ars/scripts/test_review_panel_provenance.py +565 -0
  839. package/vendor/ars/scripts/test_review_pathway_rule_trace.py +821 -0
  840. package/vendor/ars/scripts/test_revision_roadmap.py +1255 -0
  841. package/vendor/ars/scripts/test_run_ci_pytest_manifest.py +186 -0
  842. package/vendor/ars/scripts/test_run_codex_audit_e2e.py +369 -0
  843. package/vendor/ars/scripts/test_run_evals.py +430 -0
  844. package/vendor/ars/scripts/test_run_guard_launcher.py +500 -0
  845. package/vendor/ars/scripts/test_run_ideation_diversity_no_call.py +1833 -0
  846. package/vendor/ars/scripts/test_run_indirect_prompt_injection_no_call.py +1889 -0
  847. package/vendor/ars/scripts/test_run_review_criteria_constructive_value.py +586 -0
  848. package/vendor/ars/scripts/test_run_role_topology_utility_dry_run.py +428 -0
  849. package/vendor/ars/scripts/test_score_review_criteria_constructive_value.py +340 -0
  850. package/vendor/ars/scripts/test_semantic_scholar_client.py +554 -0
  851. package/vendor/ars/scripts/test_slr_lineage_emission.py +230 -0
  852. package/vendor/ars/scripts/test_socratic_rq_non_generation_contract.py +173 -0
  853. package/vendor/ars/scripts/test_temporal_integrity_audit.py +438 -0
  854. package/vendor/ars/scripts/test_text_similarity.py +95 -0
  855. package/vendor/ars/scripts/test_title_fuzzy_false_positive.py +111 -0
  856. package/vendor/ars/scripts/test_tortured_phrase_screening.py +2959 -0
  857. package/vendor/ars/scripts/test_transport_fixture_citation_gate.py +338 -0
  858. package/vendor/ars/scripts/test_uncited_assertion.py +558 -0
  859. package/vendor/ars/scripts/test_v3_6_7_phase_6_6.py +1279 -0
  860. package/vendor/ars/scripts/test_validate_compliance_fixtures.py +36 -0
  861. package/vendor/ars/scripts/test_validate_ideation_diversity_assets.py +230 -0
  862. package/vendor/ars/scripts/test_venue_disclosure_contract.py +755 -0
  863. package/vendor/ars/scripts/test_verification_cache.py +280 -0
  864. package/vendor/ars/scripts/test_verification_gate.py +461 -0
  865. package/vendor/ars/scripts/test_verify_passport_cli.py +123 -0
  866. package/vendor/ars/scripts/test_verify_submission_package.py +1407 -0
  867. package/vendor/ars/scripts/test_version_records_schema.py +211 -0
  868. package/vendor/ars/scripts/tortured_phrase_screening.py +3502 -0
  869. package/vendor/ars/scripts/uncited_assertion_detector.py +254 -0
  870. package/vendor/ars/scripts/v3_6_7_inversion_manifest.json +9 -0
  871. package/vendor/ars/scripts/v3_6_8_inversion_manifest.json +10 -0
  872. package/vendor/ars/scripts/validate_claim_standing_stance_assets.py +249 -0
  873. package/vendor/ars/scripts/validate_compliance_fixtures.py +56 -0
  874. package/vendor/ars/scripts/validate_ideation_diversity_assets.py +303 -0
  875. package/vendor/ars/scripts/venue_disclosure_contract_harness.py +837 -0
  876. package/vendor/ars/scripts/verification_cache.py +276 -0
  877. package/vendor/ars/scripts/verification_gate/__init__.py +345 -0
  878. package/vendor/ars/scripts/verify_passport.py +133 -0
  879. package/vendor/ars/scripts/verify_submission_package.py +1657 -0
  880. package/vendor/ars/shared/agents/compliance_agent.md +136 -0
  881. package/vendor/ars/shared/artifact_reproducibility_pattern.md +173 -0
  882. package/vendor/ars/shared/benchmark_report.schema.json +81 -0
  883. package/vendor/ars/shared/benchmark_report_pattern.md +180 -0
  884. package/vendor/ars/shared/bibliographic_integrity_signals.md +142 -0
  885. package/vendor/ars/shared/collaboration_depth_rubric.md +154 -0
  886. package/vendor/ars/shared/compliance_checkpoint_protocol.md +162 -0
  887. package/vendor/ars/shared/compliance_report.schema.json +187 -0
  888. package/vendor/ars/shared/contracts/README.md +938 -0
  889. package/vendor/ars/shared/contracts/activity/adjudication_activity_input.schema.json +555 -0
  890. package/vendor/ars/shared/contracts/activity/adjudication_activity_store.schema.json +560 -0
  891. package/vendor/ars/shared/contracts/audit/audit_jsonl.schema.json +128 -0
  892. package/vendor/ars/shared/contracts/audit/audit_sidecar.schema.json +169 -0
  893. package/vendor/ars/shared/contracts/audit/audit_verdict.schema.json +133 -0
  894. package/vendor/ars/shared/contracts/audit/cross_document_consistency_advisory.schema.json +480 -0
  895. package/vendor/ars/shared/contracts/audit/cross_document_consistency_advisory_draft.schema.json +564 -0
  896. package/vendor/ars/shared/contracts/audit/cross_document_source_manifest.schema.json +202 -0
  897. package/vendor/ars/shared/contracts/audit/tortured_phrase_advisory.schema.json +1362 -0
  898. package/vendor/ars/shared/contracts/audit/tortured_phrase_snapshot.schema.json +208 -0
  899. package/vendor/ars/shared/contracts/audit/tortured_phrase_snapshot_manifest.schema.json +335 -0
  900. package/vendor/ars/shared/contracts/capability/stage_capability_matrix.json +434 -0
  901. package/vendor/ars/shared/contracts/claim_standing/candidate_ledger.schema.json +705 -0
  902. package/vendor/ars/shared/contracts/claim_standing/query_plan.schema.json +389 -0
  903. package/vendor/ars/shared/contracts/claim_standing/query_plan_v1_1.schema.json +782 -0
  904. package/vendor/ars/shared/contracts/claim_standing/retrieval_input.schema.json +440 -0
  905. package/vendor/ars/shared/contracts/claim_standing/stance_record.schema.json +460 -0
  906. package/vendor/ars/shared/contracts/claim_standing/transmission_ledger.schema.json +282 -0
  907. package/vendor/ars/shared/contracts/cross_model/codex_citation_receipt.schema.json +157 -0
  908. package/vendor/ars/shared/contracts/cross_model/codex_citation_request.schema.json +23 -0
  909. package/vendor/ars/shared/contracts/cross_model/promotion_bakeoff_sealed_commitment.schema.json +55 -0
  910. package/vendor/ars/shared/contracts/cross_model/promotion_bakeoff_sealed_reveal.schema.json +50 -0
  911. package/vendor/ars/shared/contracts/degradation_registry.json +428 -0
  912. package/vendor/ars/shared/contracts/evaluator/full.json +126 -0
  913. package/vendor/ars/shared/contracts/evidence/claim_registry.schema.json +50 -0
  914. package/vendor/ars/shared/contracts/evidence/claim_registry_coverage_report.schema.json +79 -0
  915. package/vendor/ars/shared/contracts/evidence/evidence_row.schema.json +504 -0
  916. package/vendor/ars/shared/contracts/evidence/evidence_row_v1_1.schema.json +364 -0
  917. package/vendor/ars/shared/contracts/evidence/evidence_row_v1_2.schema.json +714 -0
  918. package/vendor/ars/shared/contracts/evidence/evidence_row_v1_3.schema.json +524 -0
  919. package/vendor/ars/shared/contracts/human_subjects/authority_profile_registry.schema.json +497 -0
  920. package/vendor/ars/shared/contracts/human_subjects/committee_correspondence.schema.json +253 -0
  921. package/vendor/ars/shared/contracts/human_subjects/content_coverage_advisory.schema.json +620 -0
  922. package/vendor/ars/shared/contracts/human_subjects/irb_context_record.schema.json +329 -0
  923. package/vendor/ars/shared/contracts/human_subjects/resolved_authority_context.schema.json +347 -0
  924. package/vendor/ars/shared/contracts/human_subjects/review_pathway_rule_trace.schema.json +265 -0
  925. package/vendor/ars/shared/contracts/human_subjects/review_pathway_trace_request.schema.json +127 -0
  926. package/vendor/ars/shared/contracts/human_subjects/submission_packet_inventory.schema.json +240 -0
  927. package/vendor/ars/shared/contracts/human_subjects/submission_packet_manifest.schema.json +999 -0
  928. package/vendor/ars/shared/contracts/passport/audit_artifact_entry.schema.json +266 -0
  929. package/vendor/ars/shared/contracts/passport/bibliographic_integrity_signal.schema.json +1676 -0
  930. package/vendor/ars/shared/contracts/passport/citation_provenance.schema.json +107 -0
  931. package/vendor/ars/shared/contracts/passport/citation_verification_summary.schema.json +164 -0
  932. package/vendor/ars/shared/contracts/passport/claim_audit_result.schema.json +124 -0
  933. package/vendor/ars/shared/contracts/passport/claim_drift.schema.json +58 -0
  934. package/vendor/ars/shared/contracts/passport/claim_intent_manifest.schema.json +107 -0
  935. package/vendor/ars/shared/contracts/passport/constraint_violation.schema.json +65 -0
  936. package/vendor/ars/shared/contracts/passport/experiment_alignment_result.schema.json +69 -0
  937. package/vendor/ars/shared/contracts/passport/experiment_provenance_entry.schema.json +169 -0
  938. package/vendor/ars/shared/contracts/passport/human_read_log.schema.json +86 -0
  939. package/vendor/ars/shared/contracts/passport/inquiry_ledger_ref.schema.json +22 -0
  940. package/vendor/ars/shared/contracts/passport/literature_corpus_entry.schema.json +650 -0
  941. package/vendor/ars/shared/contracts/passport/preregistration_artifact.schema.json +132 -0
  942. package/vendor/ars/shared/contracts/passport/rejection_log.schema.json +89 -0
  943. package/vendor/ars/shared/contracts/passport/reset_ledger_entry.schema.json +158 -0
  944. package/vendor/ars/shared/contracts/passport/temporal_audit_results.schema.json +208 -0
  945. package/vendor/ars/shared/contracts/passport/terminal_policies.schema.json +50 -0
  946. package/vendor/ars/shared/contracts/passport/timeline.schema.json +102 -0
  947. package/vendor/ars/shared/contracts/passport/uncited_assertion.schema.json +56 -0
  948. package/vendor/ars/shared/contracts/passport/uncited_audit_failure.schema.json +72 -0
  949. package/vendor/ars/shared/contracts/passport/user_attested_read_resolution.schema.json +87 -0
  950. package/vendor/ars/shared/contracts/passport/version_records.schema.json +138 -0
  951. package/vendor/ars/shared/contracts/patch/block_manifest.schema.json +45 -0
  952. package/vendor/ars/shared/contracts/patch/legacy/v1_0/revision_patch.schema.json +110 -0
  953. package/vendor/ars/shared/contracts/patch/revision_patch.schema.json +250 -0
  954. package/vendor/ars/shared/contracts/pdf/pdf_content_classifier_diagnostic.schema.json +39 -0
  955. package/vendor/ars/shared/contracts/pdf/pdf_content_classifier_worker.schema.json +88 -0
  956. package/vendor/ars/shared/contracts/pdf/pdf_read_preflight.schema.json +227 -0
  957. package/vendor/ars/shared/contracts/re_review/input_manifest.schema.json +161 -0
  958. package/vendor/ars/shared/contracts/re_review/legacy/v1_0/input_manifest.schema.json +134 -0
  959. package/vendor/ars/shared/contracts/re_review/legacy/v1_0/precommitment.schema.json +193 -0
  960. package/vendor/ars/shared/contracts/re_review/legacy/v1_0/traceability.schema.json +841 -0
  961. package/vendor/ars/shared/contracts/re_review/legacy/v1_0/verdict_record.schema.json +244 -0
  962. package/vendor/ars/shared/contracts/re_review/precommitment.schema.json +193 -0
  963. package/vendor/ars/shared/contracts/re_review/traceability.schema.json +916 -0
  964. package/vendor/ars/shared/contracts/re_review/verdict_record.schema.json +245 -0
  965. package/vendor/ars/shared/contracts/research_workflow/inquiry_branch_ledger.schema.json +449 -0
  966. package/vendor/ars/shared/contracts/research_workflow/research_workflow_profile.schema.json +222 -0
  967. package/vendor/ars/shared/contracts/research_workflow/research_workflow_profile_selection_receipt.schema.json +111 -0
  968. package/vendor/ars/shared/contracts/review_target/constructive_review_findings.schema.json +172 -0
  969. package/vendor/ars/shared/contracts/review_target/criteria_registry.schema.json +97 -0
  970. package/vendor/ars/shared/contracts/review_target/review_criteria_binding_manifest.schema.json +235 -0
  971. package/vendor/ars/shared/contracts/review_target/review_criteria_source_receipt.schema.json +158 -0
  972. package/vendor/ars/shared/contracts/review_target/review_target_context.schema.json +106 -0
  973. package/vendor/ars/shared/contracts/review_target/review_target_declaration.schema.json +118 -0
  974. package/vendor/ars/shared/contracts/reviewer/full.json +114 -0
  975. package/vendor/ars/shared/contracts/reviewer/methodology_focus.json +75 -0
  976. package/vendor/ars/shared/contracts/reviewer/review_panel_provenance.schema.json +263 -0
  977. package/vendor/ars/shared/contracts/reviewer/review_panel_provenance_carrier.schema.json +122 -0
  978. package/vendor/ars/shared/contracts/reviewer/review_panel_provenance_input.schema.json +120 -0
  979. package/vendor/ars/shared/contracts/revision/author_adjudication.schema.json +251 -0
  980. package/vendor/ars/shared/contracts/revision/author_adjudication_input.schema.json +25 -0
  981. package/vendor/ars/shared/contracts/revision/claim_strength_drift_disposition.schema.json +97 -0
  982. package/vendor/ars/shared/contracts/revision/claim_strength_drift_disposition_input.schema.json +80 -0
  983. package/vendor/ars/shared/contracts/revision/claim_strength_drift_findings.schema.json +139 -0
  984. package/vendor/ars/shared/contracts/revision/claim_surface_manifest.schema.json +99 -0
  985. package/vendor/ars/shared/contracts/revision/integrity_correction_authorization.schema.json +140 -0
  986. package/vendor/ars/shared/contracts/revision/integrity_correction_authorization_input.schema.json +28 -0
  987. package/vendor/ars/shared/contracts/revision/integrity_correction_list.schema.json +48 -0
  988. package/vendor/ars/shared/contracts/revision/integrity_pass_receipt.schema.json +16 -0
  989. package/vendor/ars/shared/contracts/revision/revision_evidence_bundle.schema.json +134 -0
  990. package/vendor/ars/shared/contracts/revision/revision_roadmap.schema.json +334 -0
  991. package/vendor/ars/shared/contracts/submission/format_profile.example.yaml +33 -0
  992. package/vendor/ars/shared/contracts/submission/format_profile.schema.json +102 -0
  993. package/vendor/ars/shared/contracts/submission/submission_verification_report.schema.json +233 -0
  994. package/vendor/ars/shared/contracts/submission/venue_profile.schema.json +114 -0
  995. package/vendor/ars/shared/contracts/writer/full.json +87 -0
  996. package/vendor/ars/shared/cross_model_verification.md +714 -0
  997. package/vendor/ars/shared/evals_lift_report.schema.json +141 -0
  998. package/vendor/ars/shared/ground_truth_isolation_pattern.md +275 -0
  999. package/vendor/ars/shared/handoff_schemas.md +1209 -0
  1000. package/vendor/ars/shared/human_subjects_authority_registry.json +1278 -0
  1001. package/vendor/ars/shared/mode_spectrum.md +57 -0
  1002. package/vendor/ars/shared/model_tiering.md +83 -0
  1003. package/vendor/ars/shared/policy_data/nature_policy.md +56 -0
  1004. package/vendor/ars/shared/prisma_trAIce_protocol.md +157 -0
  1005. package/vendor/ars/shared/raise_framework.md +129 -0
  1006. package/vendor/ars/shared/references/authority_content_coverage_advisory_protocol.md +275 -0
  1007. package/vendor/ars/shared/references/claim_standing_candidate_ledger_protocol.md +66 -0
  1008. package/vendor/ars/shared/references/claim_strength_ladder.md +93 -0
  1009. package/vendor/ars/shared/references/cross_document_consistency_advisory_protocol.md +263 -0
  1010. package/vendor/ars/shared/references/evidence_row_protocol.md +260 -0
  1011. package/vendor/ars/shared/references/firm_rules.md +90 -0
  1012. package/vendor/ars/shared/references/human_subjects_authority_protocol.md +274 -0
  1013. package/vendor/ars/shared/references/intent_clarification_protocol.md +168 -0
  1014. package/vendor/ars/shared/references/irb_terminology_glossary.md +229 -0
  1015. package/vendor/ars/shared/references/protected_hedging_phrases.md +118 -0
  1016. package/vendor/ars/shared/references/psychometric_terminology_glossary.md +109 -0
  1017. package/vendor/ars/shared/references/review_criteria_consumer_protocol.md +238 -0
  1018. package/vendor/ars/shared/references/review_pathway_rule_trace_protocol.md +166 -0
  1019. package/vendor/ars/shared/references/submission_packet_manifest_protocol.md +292 -0
  1020. package/vendor/ars/shared/references/word_count_conventions.md +124 -0
  1021. package/vendor/ars/shared/research_workflow_profiles/field_general.json +1 -0
  1022. package/vendor/ars/shared/review_criteria_registry.json +207 -0
  1023. package/vendor/ars/shared/review_criteria_sources/msr-2027-technical-papers.2026-08-24.json +46 -0
  1024. package/vendor/ars/shared/review_criteria_sources/sigsoft-empirical-standards.2026-08-24.json +31 -0
  1025. package/vendor/ars/shared/sprint_contract.schema.json +482 -0
  1026. package/vendor/ars/shared/style_calibration_protocol.md +151 -0
  1027. package/vendor/ars/shared/templates/codex_audit_multifile_template.md +263 -0
  1028. package/vendor/ars/tools/release-discipline/.toolkit-version +1 -0
  1029. package/vendor/ars/tools/release-discipline/README.md +4 -0
  1030. package/vendor/ars/tools/release-discipline/scripts/_release_doc_alignment_schema.py +1011 -0
  1031. package/vendor/ars/tools/release-discipline/scripts/check_command_invariants.py +497 -0
  1032. package/vendor/ars/tools/release-discipline/scripts/check_release_doc_alignment.py +263 -0
  1033. package/vendor/ars/tools/release-discipline/scripts/sync-toolkit.sh +147 -0
  1034. package/vendor/windows/NOTICE.md +12 -0
  1035. package/vendor/windows/arm64/fd.exe +0 -0
  1036. package/vendor/windows/arm64/licenses/fd/LICENSE-APACHE +201 -0
  1037. package/vendor/windows/arm64/licenses/fd/LICENSE-MIT +21 -0
  1038. package/vendor/windows/arm64/licenses/ripgrep/COPYING +3 -0
  1039. package/vendor/windows/arm64/licenses/ripgrep/LICENSE-MIT +21 -0
  1040. package/vendor/windows/arm64/licenses/ripgrep/UNLICENSE +24 -0
  1041. package/vendor/windows/arm64/rg.exe +0 -0
  1042. package/vendor/windows/x64/fd.exe +0 -0
  1043. package/vendor/windows/x64/licenses/fd/LICENSE-APACHE +201 -0
  1044. package/vendor/windows/x64/licenses/fd/LICENSE-MIT +21 -0
  1045. package/vendor/windows/x64/licenses/ripgrep/COPYING +3 -0
  1046. package/vendor/windows/x64/licenses/ripgrep/LICENSE-MIT +21 -0
  1047. package/vendor/windows/x64/licenses/ripgrep/UNLICENSE +24 -0
  1048. 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()