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,1508 @@
1
+ """Mutation tests for scripts/check_heldout_measurement_report.py (#654).
2
+
3
+ Discipline mirrors the repo's other checker test suites: one valid fixture
4
+ must pass with zero errors, and every single-field mutation that violates a
5
+ contract invariant must fail. Checker-layer invariants assert their I/R/L
6
+ number; schema-layer violations assert non-empty errors. Warnings never gate
7
+ and are asserted separately.
8
+
9
+ Run: pytest scripts/test_check_heldout_measurement_report.py
10
+ """
11
+ from __future__ import annotations
12
+
13
+ import copy
14
+ import hashlib
15
+ import json
16
+ import subprocess
17
+ from pathlib import Path
18
+
19
+ import pytest
20
+
21
+ import check_heldout_measurement_report as measurement_mod
22
+ from check_heldout_measurement_report import (
23
+ HELDOUT_ROOT,
24
+ REPO_ROOT,
25
+ TEMPLATE_PATH,
26
+ _execution_claim_errors,
27
+ _execution_validator,
28
+ _resolution_findings,
29
+ _validate_obj,
30
+ contract_version,
31
+ is_contract_report,
32
+ location_errors,
33
+ marker_status,
34
+ supported_contract_versions,
35
+ validate_report,
36
+ )
37
+
38
+ CONTRACT_MARKER = contract_version()
39
+
40
+
41
+ def make_valid_report() -> dict:
42
+ """A minimal but complete llm_judged report satisfying every invariant."""
43
+ return {
44
+ "measurement_contract": CONTRACT_MARKER,
45
+ "suite": "revision_claim_drift",
46
+ "suite_class": "llm_judged",
47
+ "measurement_date": "2026-08-10",
48
+ "decision_relevant": True,
49
+ "subject": {
50
+ "model_id": "claude-fable-5",
51
+ "config": {
52
+ "suite_commit": "0123456789abcdef0123456789abcdef01234567",
53
+ "prompts_ref": "evals/heldout/revision_claim_drift/README.md#re-run-protocol",
54
+ "settings": "one revision per item, fresh subagent context",
55
+ "sampling": "provider default",
56
+ },
57
+ },
58
+ "judge_plan": {"exception": "none"},
59
+ "judges": [
60
+ {
61
+ "judge_id": "j1",
62
+ "model_id": "gpt-5.6-sol",
63
+ "model_family": "openai",
64
+ "prompt_ref": "evals/heldout/revision_claim_drift/judge_prompt_v2.md",
65
+ "evidence_provided": "original passage + revised passage + roadmap",
66
+ "judging_budget": "xhigh, single pass",
67
+ "blinded_to": ["condition", "control_status"],
68
+ "per_item": [
69
+ {"item_id": "rp-01", "claim_drift": False},
70
+ {"item_id": "rp-02", "claim_drift": True},
71
+ ],
72
+ },
73
+ {
74
+ "judge_id": "j2",
75
+ "model_id": "gemini-3.1-pro",
76
+ "model_family": "google",
77
+ "prompt_ref": "evals/heldout/revision_claim_drift/judge_prompt_v2.md",
78
+ "evidence_provided": "original passage + revised passage + roadmap",
79
+ "judging_budget": "provider default, single pass",
80
+ "blinded_to": ["condition", "control_status"],
81
+ "per_item": [
82
+ {"item_id": "rp-01", "claim_drift": False},
83
+ {"item_id": "rp-02", "claim_drift": False},
84
+ ],
85
+ },
86
+ ],
87
+ "aggregate": {
88
+ "headline": {
89
+ "metric_name": "claim_strength_hedge_drift_rate",
90
+ "value": "1/2",
91
+ "construction_rule": "post-adjudication confirmed drift over items; divergent items resolved by adjudication, never averaged",
92
+ "estimand_status": "point_estimate",
93
+ },
94
+ "agreement": {
95
+ "rate": 0.5,
96
+ "divergent_items": ["rp-02"],
97
+ "note": "j1 flagged rp-02, j2 did not; adjudicated below",
98
+ },
99
+ },
100
+ "replicates": {
101
+ "per_item": 2,
102
+ "rule_ref": "evals/heldout/revision_claim_drift/README.md#re-run-protocol",
103
+ "spread": None,
104
+ "exception": None,
105
+ },
106
+ "adjudication": {
107
+ "applies": True,
108
+ "rubric_ref": "evals/heldout/revision_claim_drift/adjudication_rubric_v1.md",
109
+ "rubric_sha256": "a" * 64,
110
+ "rubric_precommitted": True,
111
+ "blinded_to": ["expected_label", "raw_aggregate"],
112
+ "resolution_direction": "bidirectional",
113
+ "resolution_rule_ref": "rubric_v1 direction",
114
+ "overrides": [
115
+ {
116
+ "item_id": "rp-02",
117
+ "judge_id": "j1",
118
+ "raw": "claim_drift=true",
119
+ "adjudicated": "claim_drift=true (upheld)",
120
+ "criterion_ref": "rubric_v1 C-2",
121
+ "note": "hedge drop confirmed on logic read",
122
+ }
123
+ ],
124
+ "raw_published": True,
125
+ },
126
+ "preregistration": {
127
+ "plan_ref": "evals/heldout/revision_claim_drift/RUN_PLAN.md",
128
+ "plan_sha256": "b" * 64,
129
+ "rubric_ref": "evals/heldout/revision_claim_drift/adjudication_rubric_v1.md",
130
+ "rubric_sha256": "a" * 64,
131
+ "frozen_commit": "0123456789abcdef0123456789abcdef01234567",
132
+ "frozen_before_dispatch": True,
133
+ "rubric_and_plan_frozen_together": True,
134
+ "judge_template_version": "revision-claim-drift-judge/2.0",
135
+ "amendments_append_only": True,
136
+ "amendments": [],
137
+ },
138
+ "execution_manifest": {
139
+ "ref": "evals/heldout/revision_claim_drift/runs/2026-08-10/execution-manifest.json",
140
+ "sha256": "c" * 64,
141
+ "write_once": True,
142
+ "claims": [],
143
+ },
144
+ "attempts": {
145
+ "atomicity": "one judge call per item per judge; failed call retried once then item marked blocked",
146
+ "partial_published": True,
147
+ "blocked_runs": [],
148
+ },
149
+ "raw_outputs": {
150
+ "retained": True,
151
+ "paths": ["evals/heldout/revision_claim_drift/runs/raw/2026-08-10/"],
152
+ },
153
+ "results": {
154
+ "design": "matched two-condition evaluation",
155
+ "arm_roles": {
156
+ "treatment_or_cohort_arms": ["baseline", "treatment"],
157
+ "variant_packet_arms": [],
158
+ },
159
+ "suite_specific": "free-form payload",
160
+ },
161
+ "verdict": "example",
162
+ "caveats": ["n=2 excerpt fixture; not a real measurement"],
163
+ }
164
+
165
+
166
+ def make_valid_mechanical_report() -> dict:
167
+ report = make_valid_report()
168
+ report["suite"] = "pipeline_behavior_robustness"
169
+ report["suite_class"] = "mechanical_match"
170
+ report["judges"] = []
171
+ report["judge_plan"] = {"exception": "mechanical_suite"}
172
+ report["adjudication"] = {"applies": False}
173
+ report["aggregate"]["agreement"] = {
174
+ "rate": None,
175
+ "divergent_items": [],
176
+ "note": "mechanical match; no judges",
177
+ }
178
+ report["preregistration"].pop("judge_template_version")
179
+ return report
180
+
181
+
182
+ def make_valid_legacy_row() -> dict:
183
+ report = make_valid_report()
184
+ report["judges"] = [report["judges"][0]]
185
+ report["judge_plan"] = {
186
+ "exception": "legacy_comparability",
187
+ "legacy_baseline_ref": "evals/heldout/revision_claim_drift/measurement-2026-07-22.json",
188
+ }
189
+ report["aggregate"]["agreement"] = {
190
+ "rate": None,
191
+ "divergent_items": [],
192
+ "note": "legacy-comparability row keeps the original judge",
193
+ }
194
+ return report
195
+
196
+
197
+ def make_valid_human_expert_report() -> dict:
198
+ """A paired-controls row whose judgments come only from a human panel."""
199
+ report = make_valid_report()
200
+ report["suite"] = "review_criteria_constructive_value"
201
+ report["suite_class"] = "paired_controls"
202
+ report["judge_plan"] = {
203
+ "exception": "human_expert_panel",
204
+ "expert_panel_ref": (
205
+ "evals/heldout/review_criteria_constructive_value/runs/"
206
+ "2026-08-11/paired-adjudication.json"
207
+ ),
208
+ "expert_panel_sha256": "d" * 64,
209
+ }
210
+ report["judges"] = []
211
+ report["aggregate"]["agreement"] = {
212
+ "rate": None,
213
+ "divergent_items": [],
214
+ "note": "model-judge agreement does not apply; human labels are in the panel record",
215
+ }
216
+ report["adjudication"]["overrides"] = []
217
+ report["preregistration"]["judge_template_version"] = (
218
+ "review-criteria-human-expert-label/1.0"
219
+ )
220
+ return report
221
+
222
+
223
+ def make_valid_v1_0_report() -> dict:
224
+ """The pre-#664 shape remains valid without any v1.1 retrofit fields."""
225
+ report = make_valid_report()
226
+ report["measurement_contract"] = "heldout-measurement/1.0"
227
+ report.pop("preregistration")
228
+ report.pop("execution_manifest")
229
+ for judge in report["judges"]:
230
+ judge.pop("blinded_to")
231
+ report["aggregate"]["headline"].pop("estimand_status")
232
+ report["adjudication"].pop("resolution_direction")
233
+ report["adjudication"].pop("resolution_rule_ref")
234
+ report["results"] = {"suite_specific": "legacy free-form payload"}
235
+ return report
236
+
237
+
238
+ def errors_of(report: dict) -> list[str]:
239
+ errors, _warnings = validate_report(report)
240
+ return errors
241
+
242
+
243
+ def warnings_of(report: dict) -> list[str]:
244
+ _errors, warnings = validate_report(report)
245
+ return warnings
246
+
247
+
248
+ # ---------------------------------------------------------------- valid pass
249
+
250
+
251
+ def test_valid_report_passes():
252
+ assert errors_of(make_valid_report()) == []
253
+
254
+
255
+ def test_valid_mechanical_report_passes():
256
+ assert errors_of(make_valid_mechanical_report()) == []
257
+
258
+
259
+ def test_valid_legacy_row_passes():
260
+ assert errors_of(make_valid_legacy_row()) == []
261
+
262
+
263
+ def test_valid_human_expert_report_passes_without_model_judges():
264
+ assert errors_of(make_valid_human_expert_report()) == []
265
+
266
+
267
+ def test_new_v1_0_report_is_rejected_even_if_schema_valid():
268
+ assert any("I15" in error for error in errors_of(make_valid_v1_0_report()))
269
+
270
+
271
+ def test_frozen_2026_08_07_row_is_byte_unchanged_and_valid(monkeypatch):
272
+ path = HELDOUT_ROOT / "revision_claim_drift/measurement-2026-08-07.json"
273
+ assert hashlib.sha256(path.read_bytes()).hexdigest() == (
274
+ "1af137c798e6cf3a5d0a742e379a8af78fe802cb924b4ece22cdf57cb881f573"
275
+ )
276
+ import json
277
+
278
+ report = json.loads(path.read_text(encoding="utf-8"))
279
+ assert report["measurement_contract"] == "heldout-measurement/1.0"
280
+
281
+ def unexpected_git_probe(*_args, **_kwargs):
282
+ raise AssertionError("frozen v1.0 must not require full git history")
283
+
284
+ monkeypatch.setattr(subprocess, "run", unexpected_git_probe)
285
+ assert _validate_obj(path, report) == 0
286
+
287
+
288
+ # ------------------------------------------------------------- opt-in marker
289
+
290
+
291
+ def test_wrong_contract_marker_fails():
292
+ report = make_valid_report()
293
+ report["measurement_contract"] = "heldout-measurement/9.9"
294
+ assert errors_of(report)
295
+
296
+
297
+ def test_is_contract_report_detection():
298
+ assert is_contract_report(make_valid_report())
299
+ assert is_contract_report({"measurement_contract": "heldout-measurement/9.9"})
300
+ assert not is_contract_report({"measurement_date": "2026-07-22"})
301
+
302
+
303
+ def test_marker_status_classification():
304
+ assert marker_status(make_valid_report()) == "contract"
305
+ assert marker_status({"measurement_date": "x"}) == "absent"
306
+ # leading space, homoglyph hyphen (U+2011), case games: all near-miss
307
+ assert marker_status({"measurement_contract": " heldout-measurement/1.0"}) == "near_miss"
308
+ assert (
309
+ marker_status({"measurement_contract": "heldout‑measurement/1.0"})
310
+ == "near_miss"
311
+ )
312
+ assert marker_status({"measurement_contract": "Heldout-Measurement/1.0"}) == "near_miss"
313
+ assert marker_status({"measurement_contract": "internal-notes/0.1"}) == "near_miss"
314
+
315
+
316
+ def test_contract_version_single_sourced_from_schema():
317
+ assert CONTRACT_MARKER.startswith("heldout-measurement/")
318
+ assert make_valid_report()["measurement_contract"] == CONTRACT_MARKER
319
+ assert supported_contract_versions() == (
320
+ "heldout-measurement/1.0",
321
+ "heldout-measurement/1.1",
322
+ )
323
+
324
+
325
+ def test_v1_1_template_stays_schema_and_invariant_valid():
326
+ import json
327
+
328
+ template = json.loads(TEMPLATE_PATH.read_text(encoding="utf-8"))
329
+ assert errors_of(template) == []
330
+
331
+
332
+ def test_v1_1_contract_schema_and_template_vocabulary_stay_synced():
333
+ contract_doc = (HELDOUT_ROOT / "MEASUREMENT_CONTRACT.md").read_text(encoding="utf-8")
334
+ template_text = TEMPLATE_PATH.read_text(encoding="utf-8")
335
+ for token in (
336
+ "heldout-measurement/1.1",
337
+ "resolution_direction",
338
+ "estimand_status",
339
+ "blinded_to",
340
+ "preregistration",
341
+ "execution_manifest",
342
+ "treatment_or_cohort_arms",
343
+ "variant_packet_arms",
344
+ ):
345
+ assert token in contract_doc
346
+ assert token in template_text
347
+
348
+
349
+ @pytest.mark.parametrize("field", ["preregistration", "execution_manifest", "results"])
350
+ def test_v1_1_requires_new_top_level_contract_fields(field):
351
+ report = make_valid_report()
352
+ del report[field]
353
+ assert errors_of(report)
354
+
355
+
356
+ def test_v1_1_requires_judge_side_blinding_separately():
357
+ report = make_valid_report()
358
+ del report["judges"][0]["blinded_to"]
359
+ assert errors_of(report)
360
+
361
+
362
+ def test_judge_and_adjudicator_blinding_are_independent():
363
+ report = make_valid_report()
364
+ report["judges"][0]["blinded_to"] = ["condition"]
365
+ report["adjudication"]["blinded_to"] = ["judge_identity"]
366
+ assert errors_of(report) == []
367
+
368
+
369
+ def test_v1_1_requires_design_and_arm_roles():
370
+ report = make_valid_report()
371
+ del report["results"]["arm_roles"]
372
+ assert errors_of(report)
373
+
374
+
375
+ def test_flags_only_requires_lower_bound_estimand_status():
376
+ report = make_valid_report()
377
+ report["adjudication"]["resolution_direction"] = "flags_only"
378
+ assert any("I13" in error for error in errors_of(report))
379
+
380
+
381
+ def test_flags_only_lower_bound_requires_headline_and_caveat_wording():
382
+ report = make_valid_report()
383
+ report["adjudication"]["resolution_direction"] = "flags_only"
384
+ report["aggregate"]["headline"]["estimand_status"] = "lower_bound"
385
+ report["aggregate"]["headline"]["construction_rule"] += "; lower bound"
386
+ report["caveats"].append("The flags-only headline is a lower bound.")
387
+ assert errors_of(report) == []
388
+
389
+
390
+ def test_other_frozen_requires_explicit_note_and_lower_bound_honesty():
391
+ report = make_valid_report()
392
+ report["adjudication"]["resolution_direction"] = "other_frozen"
393
+ assert errors_of(report)
394
+ report["adjudication"]["resolution_direction_note"] = (
395
+ "The frozen rule may remove flags but cannot add missed flags."
396
+ )
397
+ assert any("I13" in error for error in errors_of(report))
398
+ report["aggregate"]["headline"]["estimand_status"] = "lower_bound"
399
+ report["aggregate"]["headline"]["construction_rule"] += "; lower bound"
400
+ report["caveats"].append("The other-frozen headline is a lower bound.")
401
+ assert errors_of(report) == []
402
+
403
+
404
+ def test_judge_template_version_required_only_for_judge_bearing_rows():
405
+ report = make_valid_report()
406
+ del report["preregistration"]["judge_template_version"]
407
+ assert errors_of(report)
408
+ assert errors_of(make_valid_mechanical_report()) == []
409
+
410
+
411
+ def test_preregistration_rubric_must_match_adjudication():
412
+ report = make_valid_report()
413
+ report["preregistration"]["rubric_sha256"] = "f" * 64
414
+ assert any("I14" in error for error in errors_of(report))
415
+
416
+
417
+ def test_amendments_are_unique_and_append_ordered():
418
+ report = make_valid_report()
419
+ report["preregistration"]["amendments"] = [
420
+ {
421
+ "amendment_id": "A1",
422
+ "recorded_at": "2026-08-08T01:00:00Z",
423
+ "description": "first",
424
+ },
425
+ {
426
+ "amendment_id": "a1",
427
+ "recorded_at": "2026-08-08T00:00:00Z",
428
+ "description": "duplicate and out of order",
429
+ },
430
+ ]
431
+ errors = errors_of(report)
432
+ assert sum("I14" in error for error in errors) >= 2
433
+
434
+
435
+ def test_arm_vocabularies_cannot_overlap():
436
+ report = make_valid_report()
437
+ report["results"]["arm_roles"]["variant_packet_arms"] = ["BASELINE"]
438
+ assert any("I14" in error for error in errors_of(report))
439
+
440
+
441
+ def test_design_label_cannot_be_an_arm_label():
442
+ report = make_valid_report()
443
+ report["results"]["design"] = "treatment"
444
+ assert any("I14" in error for error in errors_of(report))
445
+
446
+
447
+ @pytest.mark.parametrize(
448
+ ("text", "claim"),
449
+ [
450
+ ("same-window execution", "same_window"),
451
+ ("ordered execution", "ordering"),
452
+ ("concurrent execution", "concurrency"),
453
+ ],
454
+ )
455
+ def test_timing_claim_requires_execution_manifest_declaration(text, claim):
456
+ report = make_valid_report()
457
+ report["caveats"].append(text)
458
+ assert any("I14" in error for error in errors_of(report))
459
+ report["execution_manifest"]["claims"].append(claim)
460
+ assert errors_of(report) == []
461
+
462
+
463
+ @pytest.mark.parametrize(
464
+ "text",
465
+ [
466
+ "The calls were not run concurrently.",
467
+ "No same-window execution was attempted.",
468
+ "Execution never used ordering guarantees.",
469
+ ],
470
+ )
471
+ def test_negated_timing_language_does_not_create_a_claim(text):
472
+ report = make_valid_report()
473
+ report["caveats"].append(text)
474
+ assert errors_of(report) == []
475
+
476
+
477
+ # ------------------------------------------------------------- schema layer
478
+
479
+
480
+ @pytest.mark.parametrize(
481
+ "missing",
482
+ [
483
+ "suite",
484
+ "suite_class",
485
+ "measurement_date",
486
+ "decision_relevant",
487
+ "subject",
488
+ "judge_plan",
489
+ "judges",
490
+ "aggregate",
491
+ "replicates",
492
+ "adjudication",
493
+ "attempts",
494
+ "raw_outputs",
495
+ "verdict",
496
+ "caveats",
497
+ ],
498
+ )
499
+ def test_missing_required_top_level_field_fails(missing):
500
+ report = make_valid_report()
501
+ del report[missing]
502
+ assert errors_of(report)
503
+
504
+
505
+ def test_bad_suite_class_fails():
506
+ report = make_valid_report()
507
+ report["suite_class"] = "vibes"
508
+ assert errors_of(report)
509
+
510
+
511
+ def test_bad_date_fails():
512
+ report = make_valid_report()
513
+ report["measurement_date"] = "Aug 10, 2026"
514
+ assert errors_of(report)
515
+
516
+
517
+ def test_impossible_date_fails():
518
+ report = make_valid_report()
519
+ report["measurement_date"] = "9999-99-99"
520
+ assert errors_of(report)
521
+
522
+
523
+ def test_invalid_amendment_timestamp_fails_schema_format_check():
524
+ report = make_valid_report()
525
+ report["preregistration"]["amendments"] = [
526
+ {
527
+ "amendment_id": "A1",
528
+ "recorded_at": "not-a-timestamp",
529
+ "description": "invalid fixture",
530
+ }
531
+ ]
532
+ assert errors_of(report)
533
+
534
+
535
+ def test_naive_amendment_timestamp_fails_without_crashing_comparison():
536
+ report = make_valid_report()
537
+ report["preregistration"]["amendments"] = [
538
+ {
539
+ "amendment_id": "A1",
540
+ "recorded_at": "2026-08-08T00:00:00Z",
541
+ "description": "aware",
542
+ },
543
+ {
544
+ "amendment_id": "A2",
545
+ "recorded_at": "2026-08-08T01:00:00",
546
+ "description": "missing timezone",
547
+ },
548
+ ]
549
+ assert errors_of(report)
550
+
551
+
552
+ def test_subject_missing_suite_commit_fails():
553
+ report = make_valid_report()
554
+ del report["subject"]["config"]["suite_commit"]
555
+ assert errors_of(report)
556
+
557
+
558
+ def test_judge_missing_budget_fails():
559
+ report = make_valid_report()
560
+ del report["judges"][0]["judging_budget"]
561
+ assert errors_of(report)
562
+
563
+
564
+ def test_empty_caveats_fails():
565
+ report = make_valid_report()
566
+ report["caveats"] = []
567
+ assert errors_of(report)
568
+
569
+
570
+ def test_blank_caveat_fails():
571
+ report = make_valid_report()
572
+ report["caveats"] = [""]
573
+ assert errors_of(report)
574
+
575
+
576
+ def test_blank_raw_output_path_fails():
577
+ report = make_valid_report()
578
+ report["raw_outputs"]["paths"] = [""]
579
+ assert errors_of(report)
580
+
581
+
582
+ def test_evidence_free_per_item_row_fails():
583
+ report = make_valid_report()
584
+ for judge in report["judges"]:
585
+ judge["per_item"] = [{"item_id": "rp-01"}, {"item_id": "rp-02"}]
586
+ report["aggregate"]["agreement"] = {"rate": 1.0, "divergent_items": [], "note": ""}
587
+ assert errors_of(report)
588
+
589
+
590
+ def test_empty_per_item_on_judged_suite_fails():
591
+ report = make_valid_report()
592
+ for judge in report["judges"]:
593
+ judge["per_item"] = []
594
+ report["aggregate"]["agreement"] = {"rate": None, "divergent_items": [], "note": ""}
595
+ assert errors_of(report)
596
+
597
+
598
+ def test_declared_judge_plan_minimum_rejected():
599
+ """The derived-minimum design: author-declared minimums are not a field."""
600
+ report = make_valid_report()
601
+ report["judge_plan"]["minimum_for_scored"] = 1
602
+ assert errors_of(report)
603
+
604
+
605
+ def test_dash_replicate_exception_rejected():
606
+ report = make_valid_report()
607
+ report["replicates"]["per_item"] = 1
608
+ report["replicates"]["exception"] = "-"
609
+ assert errors_of(report)
610
+
611
+
612
+ def test_legacy_exception_requires_baseline_ref():
613
+ report = make_valid_legacy_row()
614
+ del report["judge_plan"]["legacy_baseline_ref"]
615
+ assert errors_of(report)
616
+
617
+
618
+ def test_schema_invalid_short_circuits_invariants():
619
+ report = make_valid_report()
620
+ del report["judges"]
621
+ errors = errors_of(report)
622
+ assert errors
623
+ assert all(e.startswith("schema ") for e in errors)
624
+
625
+
626
+ # ------------------------------------------- suite-class branches (schema)
627
+
628
+
629
+ def test_zero_judges_non_mechanical_fails():
630
+ report = make_valid_report()
631
+ report["judges"] = []
632
+ report["judge_plan"] = {"exception": "none"}
633
+ assert errors_of(report)
634
+
635
+
636
+ def test_llm_judged_adjudication_applies_false_fails():
637
+ report = make_valid_report()
638
+ report["adjudication"] = {"applies": False}
639
+ assert errors_of(report)
640
+
641
+
642
+ def test_mechanical_exception_on_llm_judged_fails():
643
+ report = make_valid_report()
644
+ report["judge_plan"] = {"exception": "mechanical_suite"}
645
+ assert errors_of(report)
646
+
647
+
648
+ def test_human_expert_exception_on_llm_judged_fails():
649
+ report = make_valid_report()
650
+ report["judge_plan"] = {
651
+ "exception": "human_expert_panel",
652
+ "expert_panel_ref": "evals/heldout/revision_claim_drift/panel.json",
653
+ "expert_panel_sha256": "d" * 64,
654
+ }
655
+ assert errors_of(report)
656
+
657
+
658
+ @pytest.mark.parametrize("field", ["expert_panel_ref", "expert_panel_sha256"])
659
+ def test_human_expert_exception_requires_both_bindings(field: str):
660
+ report = make_valid_human_expert_report()
661
+ del report["judge_plan"][field]
662
+ assert errors_of(report)
663
+
664
+
665
+ def test_human_expert_exception_rejects_model_judges():
666
+ report = make_valid_human_expert_report()
667
+ report["judges"] = [make_valid_report()["judges"][0]]
668
+ assert errors_of(report)
669
+
670
+
671
+ def test_human_expert_exception_requires_applied_adjudication():
672
+ report = make_valid_human_expert_report()
673
+ report["adjudication"] = {"applies": False}
674
+ assert errors_of(report)
675
+
676
+
677
+ @pytest.mark.parametrize("exception", ["none", "legacy_comparability", "mechanical_suite"])
678
+ def test_other_exceptions_reject_expert_panel_fields(exception: str):
679
+ report = make_valid_human_expert_report()
680
+ report["judge_plan"]["exception"] = exception
681
+ if exception == "legacy_comparability":
682
+ report["judge_plan"]["legacy_baseline_ref"] = "legacy.json"
683
+ assert errors_of(report)
684
+
685
+
686
+ def test_applies_false_with_rubric_fails():
687
+ report = make_valid_mechanical_report()
688
+ report["adjudication"] = {"applies": False, "rubric_ref": "sneaky.md"}
689
+ assert errors_of(report)
690
+
691
+
692
+ # --------------------------------------------------- multi-judge invariants
693
+
694
+
695
+ def test_single_judge_without_exception_fails():
696
+ report = make_valid_report()
697
+ report["judges"] = [report["judges"][0]]
698
+ report["aggregate"]["agreement"] = {
699
+ "rate": None,
700
+ "divergent_items": [],
701
+ "note": "single judge",
702
+ }
703
+ assert any("I2" in e for e in errors_of(report))
704
+
705
+
706
+ def test_single_family_judges_fail():
707
+ report = make_valid_report()
708
+ report["judges"][1]["model_family"] = "openai"
709
+ assert any("I2" in e for e in errors_of(report))
710
+
711
+
712
+ def test_case_variant_family_is_same_family():
713
+ report = make_valid_report()
714
+ report["judges"][1]["model_family"] = "OpenAI"
715
+ report["judges"][1]["model_id"] = "gpt-5.5"
716
+ assert any("I2" in e for e in errors_of(report))
717
+
718
+
719
+ def test_duplicate_judge_id_fails():
720
+ report = make_valid_report()
721
+ report["judges"][1]["judge_id"] = "j1"
722
+ assert any("I9" in e for e in errors_of(report))
723
+
724
+
725
+ def test_same_model_two_families_fails():
726
+ report = make_valid_report()
727
+ report["judges"][1]["model_id"] = "gpt-5.6-sol"
728
+ assert any("I9" in e for e in errors_of(report))
729
+
730
+
731
+ def test_same_model_and_prompt_twice_fails():
732
+ report = make_valid_report()
733
+ j2 = report["judges"][1]
734
+ j2["model_id"] = "gpt-5.6-sol"
735
+ j2["model_family"] = "openai"
736
+ assert any("I9" in e for e in errors_of(report))
737
+
738
+
739
+ def test_non_decision_relevant_single_judge_passes():
740
+ report = make_valid_report()
741
+ report["decision_relevant"] = False
742
+ report["judges"] = [report["judges"][0]]
743
+ report["aggregate"]["agreement"] = {
744
+ "rate": None,
745
+ "divergent_items": [],
746
+ "note": "seed run, single judge",
747
+ }
748
+ assert errors_of(report) == []
749
+
750
+
751
+ # --------------------------------------------------- item-identity hygiene
752
+
753
+
754
+ def test_duplicate_item_in_one_judge_fails():
755
+ report = make_valid_report()
756
+ report["judges"][0]["per_item"].append({"item_id": "rp-01", "claim_drift": False})
757
+ assert any("I9" in e for e in errors_of(report))
758
+
759
+
760
+ def test_zero_width_item_id_spoof_fails():
761
+ report = make_valid_report()
762
+ report["judges"][1]["per_item"][1]["item_id"] = "rp-02​"
763
+ assert any("I9" in e for e in errors_of(report))
764
+
765
+
766
+ def test_mismatched_verdict_keysets_fail():
767
+ report = make_valid_report()
768
+ report["judges"][1]["per_item"][1] = {"item_id": "rp-02", "drifted": False}
769
+ assert any("I9" in e for e in errors_of(report))
770
+
771
+
772
+ # ------------------------------------------------- agreement-rate invariant
773
+
774
+
775
+ def test_wrong_agreement_rate_fails():
776
+ report = make_valid_report()
777
+ report["aggregate"]["agreement"]["rate"] = 0.9
778
+ assert any("I1" in e for e in errors_of(report))
779
+
780
+
781
+ def test_null_rate_with_comparable_items_fails():
782
+ report = make_valid_report()
783
+ report["aggregate"]["agreement"]["rate"] = None
784
+ assert any("I1" in e for e in errors_of(report))
785
+
786
+
787
+ def test_nonnull_rate_without_comparable_items_fails():
788
+ report = make_valid_mechanical_report()
789
+ report["aggregate"]["agreement"]["rate"] = 1.0
790
+ assert any("I1" in e for e in errors_of(report))
791
+
792
+
793
+ def test_intra_judge_duplicate_cannot_mint_comparability():
794
+ """One judge listing an item twice is I9, never a >=2-judge comparison."""
795
+ report = make_valid_legacy_row()
796
+ report["judges"][0]["per_item"] = [
797
+ {"item_id": "rp-01", "claim_drift": False},
798
+ {"item_id": "rp-01", "claim_drift": False},
799
+ ]
800
+ report["aggregate"]["agreement"]["rate"] = 1.0
801
+ errors = errors_of(report)
802
+ assert any("I9" in e for e in errors)
803
+ # and the duplicate row is not counted as cross-judge comparability:
804
+ assert any("I1" in e for e in errors)
805
+
806
+
807
+ def test_bool_int_payloads_diverge():
808
+ """JSON true and 1 are different verdicts, not agreement."""
809
+ report = make_valid_report()
810
+ report["judges"][0]["per_item"][1]["claim_drift"] = True
811
+ report["judges"][1]["per_item"][1]["claim_drift"] = 1
812
+ # undeclared: the type-aware comparison must flag rp-02 as divergent
813
+ hidden = copy.deepcopy(report)
814
+ hidden["aggregate"]["agreement"]["divergent_items"] = []
815
+ hidden["aggregate"]["agreement"]["rate"] = 1.0
816
+ assert any("I8" in e for e in errors_of(hidden))
817
+ # declared: the same report validates cleanly
818
+ report["aggregate"]["agreement"]["divergent_items"] = ["rp-02"]
819
+ report["aggregate"]["agreement"]["rate"] = 0.5
820
+ assert errors_of(report) == []
821
+
822
+
823
+ # ---------------------------------------------------- divergence invariants
824
+
825
+
826
+ def test_divergent_item_unknown_id_fails():
827
+ report = make_valid_report()
828
+ report["aggregate"]["agreement"]["divergent_items"] = ["rp-02", "rp-99"]
829
+ assert any("I3" in e for e in errors_of(report))
830
+
831
+
832
+ def test_agreeing_item_declared_divergent_fails():
833
+ report = make_valid_report()
834
+ report["aggregate"]["agreement"]["divergent_items"] = ["rp-02", "rp-01"]
835
+ assert any("I3" in e for e in errors_of(report))
836
+
837
+
838
+ def test_missing_divergent_items_field_fails():
839
+ report = make_valid_report()
840
+ del report["aggregate"]["agreement"]["divergent_items"]
841
+ assert errors_of(report)
842
+
843
+
844
+ def test_actual_cross_judge_divergence_not_listed_fails():
845
+ report = make_valid_report()
846
+ report["aggregate"]["agreement"]["divergent_items"] = []
847
+ report["aggregate"]["agreement"]["rate"] = 0.5
848
+ assert any("I8" in e for e in errors_of(report))
849
+
850
+
851
+ def test_divergence_without_override_fails():
852
+ report = make_valid_report()
853
+ report["adjudication"]["overrides"] = []
854
+ assert any("I10" in e for e in errors_of(report))
855
+
856
+
857
+ # -------------------------------------------------- adjudication invariants
858
+
859
+
860
+ def test_raw_published_false_fails():
861
+ report = make_valid_report()
862
+ report["adjudication"]["raw_published"] = False
863
+ assert errors_of(report)
864
+
865
+
866
+ def test_rubric_not_precommitted_fails():
867
+ report = make_valid_report()
868
+ report["adjudication"]["rubric_precommitted"] = False
869
+ assert errors_of(report)
870
+
871
+
872
+ def test_bad_rubric_hash_fails():
873
+ report = make_valid_report()
874
+ report["adjudication"]["rubric_sha256"] = "nothex"
875
+ assert errors_of(report)
876
+
877
+
878
+ def test_override_unknown_item_fails():
879
+ report = make_valid_report()
880
+ report["adjudication"]["overrides"][0]["item_id"] = "rp-99"
881
+ assert any("I4" in e for e in errors_of(report))
882
+
883
+
884
+ def test_override_unknown_judge_fails():
885
+ report = make_valid_report()
886
+ report["adjudication"]["overrides"][0]["judge_id"] = "judge-that-never-ran"
887
+ assert any("I4" in e for e in errors_of(report))
888
+
889
+
890
+ def test_override_missing_criterion_fails():
891
+ report = make_valid_report()
892
+ del report["adjudication"]["overrides"][0]["criterion_ref"]
893
+ assert errors_of(report)
894
+
895
+
896
+ def test_bad_blinded_to_value_fails():
897
+ report = make_valid_report()
898
+ report["adjudication"]["blinded_to"] = ["vibes"]
899
+ assert errors_of(report)
900
+
901
+
902
+ # ------------------------------------------------- suite-registry invariant
903
+
904
+
905
+ def test_unregistered_suite_fails():
906
+ report = make_valid_report()
907
+ report["suite"] = "not_a_registered_suite"
908
+ assert any("I5" in e for e in errors_of(report))
909
+
910
+
911
+ def test_suite_class_registry_mismatch_fails():
912
+ report = make_valid_report()
913
+ report["suite"] = "pipeline_behavior_robustness"
914
+ assert any("I5" in e for e in errors_of(report))
915
+
916
+
917
+ # ---------------------------------------------------- replicate invariants
918
+
919
+
920
+ def test_decision_relevant_single_replicate_fails():
921
+ report = make_valid_report()
922
+ report["replicates"]["per_item"] = 1
923
+ assert any("I6" in e for e in errors_of(report))
924
+
925
+
926
+ def test_decision_relevant_single_replicate_with_exception_passes():
927
+ report = make_valid_report()
928
+ report["replicates"]["per_item"] = 1
929
+ report["replicates"]["exception"] = (
930
+ "seed run; explicitly labeled not decision-relevant for mechanism claims"
931
+ )
932
+ assert errors_of(report) == []
933
+
934
+
935
+ def test_non_decision_relevant_single_replicate_passes():
936
+ report = make_valid_report()
937
+ report["decision_relevant"] = False
938
+ report["replicates"]["per_item"] = 1
939
+ assert errors_of(report) == []
940
+
941
+
942
+ # ---------------------------------------------------- raw-output invariants
943
+
944
+
945
+ def test_raw_not_retained_fails():
946
+ report = make_valid_report()
947
+ report["raw_outputs"]["retained"] = False
948
+ assert errors_of(report)
949
+
950
+
951
+ def test_raw_retained_empty_paths_fails():
952
+ report = make_valid_report()
953
+ report["raw_outputs"]["paths"] = []
954
+ assert any("I7" in e for e in errors_of(report))
955
+
956
+
957
+ # ---------------------------------------------- partial coverage (I11 / W1)
958
+
959
+
960
+ def test_decision_relevant_item_gap_uncovered_fails():
961
+ report = make_valid_report()
962
+ report["judges"][1]["per_item"] = [{"item_id": "rp-01", "claim_drift": False}]
963
+ report["aggregate"]["agreement"]["divergent_items"] = []
964
+ report["aggregate"]["agreement"]["rate"] = 1.0
965
+ report["adjudication"]["overrides"] = []
966
+ assert any("I11" in e for e in errors_of(report))
967
+
968
+
969
+ def test_decision_relevant_item_gap_covered_by_blocked_runs_passes():
970
+ report = make_valid_report()
971
+ report["judges"][1]["per_item"] = [{"item_id": "rp-01", "claim_drift": False}]
972
+ report["aggregate"]["agreement"]["divergent_items"] = []
973
+ report["aggregate"]["agreement"]["rate"] = 1.0
974
+ report["adjudication"]["overrides"] = []
975
+ report["attempts"]["blocked_runs"] = [
976
+ "j2 rp-02: judge call failed after retry; see runs/raw/2026-08-10/j2-rp-02.log"
977
+ ]
978
+ assert errors_of(report) == []
979
+
980
+
981
+ def test_item_gap_with_partial_unpublished_fails():
982
+ report = make_valid_report()
983
+ report["judges"][1]["per_item"] = [{"item_id": "rp-01", "claim_drift": False}]
984
+ report["aggregate"]["agreement"]["divergent_items"] = []
985
+ report["aggregate"]["agreement"]["rate"] = 1.0
986
+ report["adjudication"]["overrides"] = []
987
+ report["attempts"]["blocked_runs"] = ["j2 rp-02 blocked"]
988
+ report["attempts"]["partial_published"] = False
989
+ assert any("I11" in e for e in errors_of(report))
990
+
991
+
992
+ def test_non_decision_item_gap_warns_not_fails():
993
+ report = make_valid_report()
994
+ report["decision_relevant"] = False
995
+ report["judges"][1]["per_item"] = [{"item_id": "rp-01", "claim_drift": False}]
996
+ report["aggregate"]["agreement"]["divergent_items"] = []
997
+ report["aggregate"]["agreement"]["rate"] = 1.0
998
+ report["adjudication"]["overrides"] = []
999
+ assert errors_of(report) == []
1000
+ assert any("W1" in w for w in warnings_of(report))
1001
+
1002
+
1003
+ def test_valid_report_has_no_warnings():
1004
+ assert warnings_of(make_valid_report()) == []
1005
+
1006
+
1007
+ # ---------------------------------------------------------- strict loading
1008
+
1009
+
1010
+ def test_duplicate_keys_rejected():
1011
+ from check_heldout_measurement_report import _loads_strict
1012
+
1013
+ with pytest.raises(ValueError):
1014
+ _loads_strict('{"raw_published": false, "raw_published": true}')
1015
+
1016
+
1017
+ def test_nan_rejected():
1018
+ from check_heldout_measurement_report import _loads_strict
1019
+
1020
+ with pytest.raises(ValueError):
1021
+ _loads_strict('{"rate": NaN}')
1022
+
1023
+
1024
+ def _execution_manifest_fixture() -> dict:
1025
+ return {
1026
+ "schema_version": "heldout-execution-manifest/1.0",
1027
+ "suite": "revision_claim_drift",
1028
+ "created_at": "2026-08-08T00:00:00Z",
1029
+ "write_once": True,
1030
+ "calls": [
1031
+ {
1032
+ "call_id": "c1",
1033
+ "sequence_index": 1,
1034
+ "started_at": "2026-08-08T00:00:00Z",
1035
+ "completed_at": "2026-08-08T00:00:10Z",
1036
+ "prompt_sha256": "1" * 64,
1037
+ "output_sha256": "2" * 64,
1038
+ "concurrency_group": "g1",
1039
+ },
1040
+ {
1041
+ "call_id": "c2",
1042
+ "sequence_index": 2,
1043
+ "started_at": "2026-08-08T00:00:05Z",
1044
+ "completed_at": "2026-08-08T00:00:15Z",
1045
+ "prompt_sha256": "3" * 64,
1046
+ "output_sha256": "4" * 64,
1047
+ "concurrency_group": "g1",
1048
+ },
1049
+ ],
1050
+ }
1051
+
1052
+
1053
+ def test_execution_manifest_timestamp_format_is_enforced():
1054
+ manifest = _execution_manifest_fixture()
1055
+ manifest["calls"][0]["started_at"] = "not-a-timestamp"
1056
+ assert list(_execution_validator().iter_errors(manifest))
1057
+
1058
+
1059
+ def test_single_call_cannot_support_any_multi_call_execution_claim():
1060
+ manifest = _execution_manifest_fixture()
1061
+ manifest["calls"] = manifest["calls"][:1]
1062
+ errors = _execution_claim_errors(
1063
+ manifest, {"ordering", "concurrency", "same_window"}
1064
+ )
1065
+ assert len(errors) == 3
1066
+
1067
+
1068
+ def test_concurrency_requires_grouped_overlapping_calls():
1069
+ manifest = _execution_manifest_fixture()
1070
+ assert _execution_claim_errors(manifest, {"concurrency"}) == []
1071
+ manifest["calls"][1]["started_at"] = "2026-08-08T00:00:10Z"
1072
+ assert any(
1073
+ "concurrency" in error
1074
+ for error in _execution_claim_errors(manifest, {"concurrency"})
1075
+ )
1076
+
1077
+
1078
+ def test_ordering_requires_contiguous_indexes_and_nondecreasing_starts():
1079
+ manifest = _execution_manifest_fixture()
1080
+ assert _execution_claim_errors(manifest, {"ordering"}) == []
1081
+ manifest["calls"][1]["sequence_index"] = 3
1082
+ assert any(
1083
+ "ordering" in error
1084
+ for error in _execution_claim_errors(manifest, {"ordering"})
1085
+ )
1086
+
1087
+
1088
+ def test_same_window_requires_declared_window_containing_all_calls():
1089
+ manifest = _execution_manifest_fixture()
1090
+ assert any(
1091
+ "same_window" in error
1092
+ for error in _execution_claim_errors(manifest, {"same_window"})
1093
+ )
1094
+ manifest["execution_window"] = {
1095
+ "window_id": "dispatch-1",
1096
+ "started_at": "2026-08-08T00:00:00Z",
1097
+ "completed_at": "2026-08-08T00:00:15Z",
1098
+ }
1099
+ assert _execution_claim_errors(manifest, {"same_window"}) == []
1100
+
1101
+
1102
+ # ------------------------------------------------- reference resolution (R)
1103
+
1104
+
1105
+ def _repo_file_sha256(rel: str) -> str:
1106
+ return hashlib.sha256((REPO_ROOT / rel).read_bytes()).hexdigest()
1107
+
1108
+
1109
+ def make_resolvable_report() -> dict:
1110
+ report = make_valid_report()
1111
+ report["adjudication"]["rubric_ref"] = "README.md"
1112
+ report["adjudication"]["rubric_sha256"] = _repo_file_sha256("README.md")
1113
+ report["preregistration"]["rubric_ref"] = "README.md"
1114
+ report["preregistration"]["rubric_sha256"] = _repo_file_sha256("README.md")
1115
+ report["preregistration"]["plan_ref"] = "POSITIONING.md"
1116
+ report["preregistration"]["plan_sha256"] = _repo_file_sha256("POSITIONING.md")
1117
+ execution_ref = (
1118
+ "evals/heldout/revision_claim_drift/runs/fixtures/"
1119
+ "execution-manifest-v1.1.json"
1120
+ )
1121
+ report["execution_manifest"]["ref"] = execution_ref
1122
+ report["execution_manifest"]["sha256"] = _repo_file_sha256(execution_ref)
1123
+ report["raw_outputs"]["paths"] = ["evals/heldout/revision_claim_drift/README.md"]
1124
+ head = subprocess.run(
1125
+ ["git", "rev-parse", "HEAD"], cwd=REPO_ROOT, capture_output=True, text=True
1126
+ ).stdout.strip()
1127
+ report["subject"]["config"]["suite_commit"] = head
1128
+ report["preregistration"]["frozen_commit"] = head
1129
+ return report
1130
+
1131
+
1132
+ def test_resolvable_report_passes_with_refs():
1133
+ errors, _ = validate_report(make_resolvable_report(), resolve_refs=True)
1134
+ assert errors == []
1135
+
1136
+
1137
+ def test_rubric_hash_mismatch_fails_with_refs():
1138
+ report = make_resolvable_report()
1139
+ report["adjudication"]["rubric_sha256"] = "b" * 64
1140
+ report["preregistration"]["rubric_sha256"] = "b" * 64
1141
+ errors, _ = validate_report(report, resolve_refs=True)
1142
+ assert any("R1" in e for e in errors)
1143
+
1144
+
1145
+ def test_missing_rubric_file_fails_with_refs():
1146
+ report = make_resolvable_report()
1147
+ report["adjudication"]["rubric_ref"] = "does/not/exist.md"
1148
+ report["preregistration"]["rubric_ref"] = "does/not/exist.md"
1149
+ errors, _ = validate_report(report, resolve_refs=True)
1150
+ assert any("R1" in e for e in errors)
1151
+
1152
+
1153
+ def test_traversal_rubric_ref_fails_with_refs():
1154
+ report = make_resolvable_report()
1155
+ report["adjudication"]["rubric_ref"] = "../outside.md"
1156
+ report["preregistration"]["rubric_ref"] = "../outside.md"
1157
+ errors, _ = validate_report(report, resolve_refs=True)
1158
+ assert any("R1" in e for e in errors)
1159
+
1160
+
1161
+ def test_missing_raw_output_path_fails_with_refs():
1162
+ report = make_resolvable_report()
1163
+ report["raw_outputs"]["paths"] = ["evals/heldout/nonexistent-raw-dir/"]
1164
+ errors, _ = validate_report(report, resolve_refs=True)
1165
+ assert any("R2" in e for e in errors)
1166
+
1167
+
1168
+ def test_unknown_suite_commit_fails_with_refs():
1169
+ report = make_resolvable_report()
1170
+ report["subject"]["config"]["suite_commit"] = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"
1171
+ errors, _ = validate_report(report, resolve_refs=True)
1172
+ assert any("R3" in e for e in errors)
1173
+
1174
+
1175
+ def test_preregistration_plan_hash_mismatch_fails_with_refs():
1176
+ report = make_resolvable_report()
1177
+ report["preregistration"]["plan_sha256"] = "d" * 64
1178
+ errors, _ = validate_report(report, resolve_refs=True)
1179
+ assert any("R4" in error for error in errors)
1180
+
1181
+
1182
+ def test_unknown_preregistration_commit_fails_with_refs():
1183
+ report = make_resolvable_report()
1184
+ report["preregistration"]["frozen_commit"] = "deadbeef" * 5
1185
+ errors, _ = validate_report(report, resolve_refs=True)
1186
+ assert any("R4" in error for error in errors)
1187
+
1188
+
1189
+ def test_execution_manifest_hash_mismatch_fails_with_refs():
1190
+ report = make_resolvable_report()
1191
+ report["execution_manifest"]["sha256"] = "e" * 64
1192
+ errors, _ = validate_report(report, resolve_refs=True)
1193
+ assert any("R5" in error for error in errors)
1194
+
1195
+
1196
+ def test_unresolved_refs_ignored_without_flag():
1197
+ """resolve_refs=False (library/test mode) skips R1-R5 by design."""
1198
+ assert errors_of(make_valid_report()) == []
1199
+
1200
+
1201
+ # ------------------------------------------------------- location binding
1202
+
1203
+
1204
+ def test_location_mismatch_fails():
1205
+ report = make_valid_report()
1206
+ path = HELDOUT_ROOT / "pipeline_behavior_robustness" / "measurement-2026-08-10.json"
1207
+ assert any("L1" in e for e in location_errors(path, report))
1208
+
1209
+
1210
+ def test_location_match_passes():
1211
+ report = make_valid_report()
1212
+ path = HELDOUT_ROOT / "revision_claim_drift" / "measurement-2026-08-10.json"
1213
+ assert location_errors(path, report) == []
1214
+
1215
+
1216
+ def test_location_outside_heldout_unchecked():
1217
+ report = make_valid_report()
1218
+ assert location_errors(Path("/tmp/draft.json"), report) == []
1219
+
1220
+
1221
+ def test_location_heldout_root_depth1_fails():
1222
+ report = make_valid_report()
1223
+ path = HELDOUT_ROOT / "measurement-2026-08-10.json"
1224
+ assert any("L1" in e for e in location_errors(path, report))
1225
+
1226
+
1227
+ def test_marker_status_null_value_is_near_miss():
1228
+ assert marker_status({"measurement_contract": None}) == "near_miss"
1229
+
1230
+
1231
+ def test_fullwidth_model_alias_rejected():
1232
+ """NFKC-folded identity: a full-width respelling is the same judge."""
1233
+ report = make_valid_report()
1234
+ j2 = report["judges"][1]
1235
+ j2["model_id"] = "gpt-5.6-sol"
1236
+ j2["model_family"] = "openai-mirror"
1237
+ assert any("I9" in e for e in errors_of(report))
1238
+
1239
+
1240
+ def test_blocked_run_embedded_id_does_not_cover():
1241
+ """rp-02 embedded in rp-020 is not naming the gap (token boundaries)."""
1242
+ report = make_valid_report()
1243
+ report["judges"][1]["per_item"] = [{"item_id": "rp-01", "claim_drift": False}]
1244
+ report["aggregate"]["agreement"]["divergent_items"] = []
1245
+ report["aggregate"]["agreement"]["rate"] = 1.0
1246
+ report["adjudication"]["overrides"] = []
1247
+ report["attempts"]["blocked_runs"] = ["j9 rp-020 unrelated failure"]
1248
+ assert any("I11" in e for e in errors_of(report))
1249
+
1250
+
1251
+ def test_raw_output_path_outside_suite_fails_with_refs():
1252
+ report = make_resolvable_report()
1253
+ report["raw_outputs"]["paths"] = ["README.md"]
1254
+ errors, _ = validate_report(report, resolve_refs=True)
1255
+ assert any("R2" in e for e in errors)
1256
+
1257
+
1258
+ def test_bogus_legacy_baseline_ref_fails_with_refs():
1259
+ report = make_resolvable_report()
1260
+ report["judges"] = [report["judges"][0]]
1261
+ report["judge_plan"] = {
1262
+ "exception": "legacy_comparability",
1263
+ "legacy_baseline_ref": "does/not/exist.json",
1264
+ }
1265
+ report["aggregate"]["agreement"] = {
1266
+ "rate": None,
1267
+ "divergent_items": [],
1268
+ "note": "legacy row",
1269
+ }
1270
+ errors, _ = validate_report(report, resolve_refs=True)
1271
+ assert any("R1" in e for e in errors)
1272
+
1273
+
1274
+ def _valid_expert_panel() -> dict:
1275
+ return {
1276
+ "schema_version": "test-human-expert-panel/1.0",
1277
+ "suite": "review_criteria_constructive_value",
1278
+ "experts": [
1279
+ {
1280
+ "expert_id": "expert-a",
1281
+ "expert_type": "human",
1282
+ "expertise": "methods",
1283
+ "independent": True,
1284
+ "blinded_to": ["arm_identity", "mechanism_state"],
1285
+ },
1286
+ {
1287
+ "expert_id": "expert-b",
1288
+ "expert_type": "human",
1289
+ "expertise": "venue",
1290
+ "independent": True,
1291
+ "blinded_to": ["arm_identity", "mechanism_state"],
1292
+ },
1293
+ ],
1294
+ "adjudication": {
1295
+ "adjudicator_type": "human",
1296
+ "arm_blind": True,
1297
+ "disagreements_retained": True,
1298
+ },
1299
+ }
1300
+
1301
+
1302
+ def _r6_errors(
1303
+ monkeypatch, tmp_path: Path, panel: dict, *, outside: bool = False
1304
+ ) -> list[str]:
1305
+ root = tmp_path / "repo"
1306
+ suite_root = root / "evals" / "heldout" / "review_criteria_constructive_value"
1307
+ panel_path = (root / "outside-panel.json") if outside else (suite_root / "panel.json")
1308
+ panel_path.parent.mkdir(parents=True)
1309
+ raw = json.dumps(panel, sort_keys=True).encode()
1310
+ panel_path.write_bytes(raw)
1311
+
1312
+ report = make_valid_human_expert_report()
1313
+ report["judge_plan"]["expert_panel_ref"] = str(panel_path.relative_to(root))
1314
+ report["judge_plan"]["expert_panel_sha256"] = hashlib.sha256(raw).hexdigest()
1315
+ monkeypatch.setattr(measurement_mod, "REPO_ROOT", root)
1316
+ monkeypatch.setattr(measurement_mod, "HELDOUT_ROOT", root / "evals" / "heldout")
1317
+ return [error for error in _resolution_findings(report) if error.startswith("R6")]
1318
+
1319
+
1320
+ def test_human_expert_panel_ref_resolves(monkeypatch, tmp_path):
1321
+ assert _r6_errors(monkeypatch, tmp_path, _valid_expert_panel()) == []
1322
+
1323
+
1324
+ def test_human_expert_panel_must_live_under_suite(monkeypatch, tmp_path):
1325
+ errors = _r6_errors(monkeypatch, tmp_path, _valid_expert_panel(), outside=True)
1326
+ assert any("not under" in error for error in errors)
1327
+
1328
+
1329
+ def test_human_expert_panel_hash_mismatch_fails(monkeypatch, tmp_path):
1330
+ panel = _valid_expert_panel()
1331
+ root = tmp_path / "repo"
1332
+ panel_path = root / "evals/heldout/review_criteria_constructive_value/panel.json"
1333
+ panel_path.parent.mkdir(parents=True)
1334
+ panel_path.write_text(json.dumps(panel))
1335
+ report = make_valid_human_expert_report()
1336
+ report["judge_plan"]["expert_panel_ref"] = str(panel_path.relative_to(root))
1337
+ report["judge_plan"]["expert_panel_sha256"] = "0" * 64
1338
+ monkeypatch.setattr(measurement_mod, "REPO_ROOT", root)
1339
+ monkeypatch.setattr(measurement_mod, "HELDOUT_ROOT", root / "evals" / "heldout")
1340
+ assert any("hash mismatch" in error for error in _resolution_findings(report))
1341
+
1342
+
1343
+ def test_human_expert_panel_requires_two_experts(monkeypatch, tmp_path):
1344
+ panel = _valid_expert_panel()
1345
+ panel["experts"] = panel["experts"][:1]
1346
+ assert _r6_errors(monkeypatch, tmp_path, panel)
1347
+
1348
+
1349
+ def test_human_expert_panel_requires_independence(monkeypatch, tmp_path):
1350
+ panel = _valid_expert_panel()
1351
+ panel["experts"][1]["independent"] = False
1352
+ assert _r6_errors(monkeypatch, tmp_path, panel)
1353
+
1354
+
1355
+ def test_human_expert_panel_rejects_model_as_expert(monkeypatch, tmp_path):
1356
+ panel = _valid_expert_panel()
1357
+ panel["experts"][1]["expert_type"] = "model"
1358
+ assert _r6_errors(monkeypatch, tmp_path, panel)
1359
+
1360
+
1361
+ def test_human_expert_panel_requires_human_adjudicator(monkeypatch, tmp_path):
1362
+ panel = _valid_expert_panel()
1363
+ panel["adjudication"]["adjudicator_type"] = "model"
1364
+ assert _r6_errors(monkeypatch, tmp_path, panel)
1365
+
1366
+
1367
+ def test_human_expert_panel_rejects_fold_duplicate_ids(monkeypatch, tmp_path):
1368
+ panel = _valid_expert_panel()
1369
+ panel["experts"][1]["expert_id"] = "EXPERT-A"
1370
+ assert _r6_errors(monkeypatch, tmp_path, panel)
1371
+
1372
+
1373
+ def test_human_expert_panel_requires_subject_blinding(monkeypatch, tmp_path):
1374
+ panel = _valid_expert_panel()
1375
+ panel["experts"][1]["blinded_to"] = ["arm_identity"]
1376
+ assert _r6_errors(monkeypatch, tmp_path, panel)
1377
+
1378
+
1379
+ @pytest.mark.parametrize("field", ["arm_blind", "disagreements_retained"])
1380
+ def test_human_expert_panel_requires_blind_retained_adjudication(
1381
+ monkeypatch, tmp_path, field: str
1382
+ ):
1383
+ panel = _valid_expert_panel()
1384
+ panel["adjudication"][field] = False
1385
+ assert _r6_errors(monkeypatch, tmp_path, panel)
1386
+
1387
+
1388
+ def test_commitish_suite_commit_rejected_by_schema():
1389
+ report = make_valid_report()
1390
+ report["subject"]["config"]["suite_commit"] = "HEAD~000"
1391
+ assert errors_of(report)
1392
+
1393
+
1394
+ # ------------------------------------------------------------- purity guard
1395
+
1396
+
1397
+ def test_validate_does_not_mutate_input():
1398
+ report = make_valid_report()
1399
+ snapshot = copy.deepcopy(report)
1400
+ validate_report(report)
1401
+ assert report == snapshot
1402
+
1403
+
1404
+ # ------------------------------------------------------- --all scan (CLI)
1405
+
1406
+
1407
+ def _scan_with_root(monkeypatch, root: Path) -> int:
1408
+ import check_heldout_measurement_report as mod
1409
+
1410
+ monkeypatch.setattr(mod, "HELDOUT_ROOT", root)
1411
+ return mod._scan_all()
1412
+
1413
+
1414
+ def test_scan_ignores_unmarked_legacy_json(monkeypatch, tmp_path, capsys):
1415
+ (tmp_path / "suite").mkdir()
1416
+ (tmp_path / "suite" / "legacy.json").write_text('{"anything": [1, 2, {"x": ')
1417
+ (tmp_path / "suite" / "other.json").write_text('{"measurement_date": "2026-01-01"}')
1418
+ assert _scan_with_root(monkeypatch, tmp_path) == 0
1419
+ assert "no contract-marked reports" in capsys.readouterr().out
1420
+
1421
+
1422
+ def test_scan_duplicate_key_marked_file_fails(monkeypatch, tmp_path, capsys):
1423
+ (tmp_path / "s").mkdir()
1424
+ (tmp_path / "s" / "m.json").write_text(
1425
+ '{"measurement_contract": "heldout-measurement/1.0", '
1426
+ '"raw_published": true, "raw_published": false}'
1427
+ )
1428
+ assert _scan_with_root(monkeypatch, tmp_path) == 1
1429
+ assert "strict JSON parse" in capsys.readouterr().out
1430
+
1431
+
1432
+ def test_scan_near_miss_marker_fails(monkeypatch, tmp_path, capsys):
1433
+ (tmp_path / "s").mkdir()
1434
+ (tmp_path / "s" / "m.json").write_text(
1435
+ '{"measurement_contract": " heldout-measurement/1.0"}'
1436
+ )
1437
+ assert _scan_with_root(monkeypatch, tmp_path) == 1
1438
+ assert "near-miss" in capsys.readouterr().out
1439
+
1440
+
1441
+ def test_scan_follows_directory_symlinks(monkeypatch, tmp_path, capsys):
1442
+ scan_root = tmp_path / "root"
1443
+ scan_root.mkdir()
1444
+ real = scan_root / "real_dir"
1445
+ real.mkdir()
1446
+ (real / "m.json").write_text('{"measurement_contract": "heldout-measurement/1.0"}')
1447
+ (scan_root / "linked").symlink_to(real, target_is_directory=True)
1448
+ # marked but schema-invalid: must be DISCOVERED through the symlink and fail
1449
+ assert _scan_with_root(monkeypatch, scan_root) == 1
1450
+
1451
+
1452
+ def test_scan_external_symlink_is_walk_error(monkeypatch, tmp_path, capsys):
1453
+ outside = tmp_path / "outside"
1454
+ outside.mkdir()
1455
+ (outside / "m.json").write_text('{"measurement_contract": "heldout-measurement/1.0"}')
1456
+ scan_root = tmp_path / "root"
1457
+ scan_root.mkdir()
1458
+ (scan_root / "linked").symlink_to(outside, target_is_directory=True)
1459
+ # the external target is not scanned, and the walk says so loudly
1460
+ assert _scan_with_root(monkeypatch, scan_root) == 1
1461
+ assert "resolves outside" in capsys.readouterr().out
1462
+
1463
+
1464
+ def test_scan_escaped_marker_key_detected(monkeypatch, tmp_path, capsys):
1465
+ """A backslash-u-escaped spelling of the marker key cannot hide a report."""
1466
+ (tmp_path / "s").mkdir()
1467
+ (tmp_path / "s" / "m.json").write_text(
1468
+ '{"\\u006deasurement_contract": "heldout-measurement/1.0"}'
1469
+ )
1470
+ assert _scan_with_root(monkeypatch, tmp_path) == 1
1471
+
1472
+
1473
+ def test_scan_null_marker_value_fails(monkeypatch, tmp_path, capsys):
1474
+ (tmp_path / "s").mkdir()
1475
+ (tmp_path / "s" / "m.json").write_text('{"measurement_contract": null}')
1476
+ assert _scan_with_root(monkeypatch, tmp_path) == 1
1477
+ assert "near-miss" in capsys.readouterr().out
1478
+
1479
+
1480
+ def test_scan_non_utf8_json_fails(monkeypatch, tmp_path, capsys):
1481
+ (tmp_path / "s").mkdir()
1482
+ (tmp_path / "s" / "m.json").write_bytes(b'{"x": "\xff\xfe"}')
1483
+ assert _scan_with_root(monkeypatch, tmp_path) == 1
1484
+ assert "UTF-8" in capsys.readouterr().out
1485
+
1486
+
1487
+ def test_scan_uppercase_extension_discovered(monkeypatch, tmp_path):
1488
+ (tmp_path / "s").mkdir()
1489
+ (tmp_path / "s" / "M.JSON").write_text(
1490
+ '{"measurement_contract": "heldout-measurement/1.0"}'
1491
+ )
1492
+ assert _scan_with_root(monkeypatch, tmp_path) == 1
1493
+
1494
+
1495
+ def test_scan_unreadable_json_fails(monkeypatch, tmp_path):
1496
+ (tmp_path / "s").mkdir()
1497
+ dangling = tmp_path / "s" / "measurement-x.json"
1498
+ dangling.symlink_to(tmp_path / "s" / "does-not-exist.json")
1499
+ assert _scan_with_root(monkeypatch, tmp_path) == 1
1500
+
1501
+
1502
+ def test_scan_external_file_symlink_is_walk_error(monkeypatch, tmp_path, capsys):
1503
+ """A .json FILE symlink resolving outside scan root and repo is loud."""
1504
+ scan_root = tmp_path / "root"
1505
+ (scan_root / "s").mkdir(parents=True)
1506
+ (scan_root / "s" / "external.json").symlink_to("/dev/null")
1507
+ assert _scan_with_root(monkeypatch, scan_root) == 1
1508
+ assert "resolves outside" in capsys.readouterr().out