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,1179 @@
1
+ #!/usr/bin/env python3
2
+ """Validate ARS held-out measurement reports against the #654/#664 contract.
3
+
4
+ Layers:
5
+ 1. JSON Schema (evals/heldout/measurement_report.schema.json) — shape,
6
+ enums, const attestations (rubric_precommitted / raw_published /
7
+ raw_outputs.retained), and the version/suite branches B1-B8.
8
+ 2. Cross-field invariants I1-I15 — rules a schema cannot express.
9
+ Invariants run only on schema-valid reports (schema errors short-circuit).
10
+ 3. Reference resolution R1-R6 (CLI/CI only; validate_report(...,
11
+ resolve_refs=True)) — attested references must resolve: the rubric file
12
+ exists and matches its hash, raw-output paths exist, the suite commit is
13
+ a real object in this repository.
14
+ 4. Location binding L1 (path-aware entry points) — a report filed under
15
+ evals/heldout/<dir>/ must declare suite == <dir>.
16
+
17
+ Invariants:
18
+ I1 aggregate.agreement.rate equals 1 - |divergent| / |items judged by >=2
19
+ distinct judges| (tolerance 0.005); null iff no such item exists.
20
+ I2 derived model-judge minimum: a decision-relevant, non-mechanical run with
21
+ judge_plan.exception == "none" requires >= 2 judges drawn from >= 2
22
+ distinct model families (families compared case-/NFKC-folded). The
23
+ paired-controls-only human_expert_panel exception is schema-closed and
24
+ its suite-owned evidence is resolved by R6.
25
+ I3 declared divergent items that are not actually divergent are rejected
26
+ (declared set must not exceed the recomputed set).
27
+ I4 every adjudication override targets a judge that exists AND an item
28
+ that judge actually scored.
29
+ I5 suite is a key of evals/heldout/suite_registry.json and suite_class
30
+ matches the registry; the registry itself must be well-formed.
31
+ I6 decision_relevant runs require replicates.per_item >= 2 unless a
32
+ written replicates.exception is present.
33
+ I7 raw_outputs.paths is non-empty.
34
+ I8 every recomputed divergent item must be listed in
35
+ aggregate.agreement.divergent_items (divergence is never averaged
36
+ away). With I3 this is set equality.
37
+ I9 identity hygiene: no duplicate judge_id; no model_id under two
38
+ families; no two judges sharing (model_id, prompt_ref); no duplicate
39
+ item_id within one judge's per_item; no two distinct raw item ids that
40
+ fold (NFKC + format-character strip) to the same id; per-item verdict
41
+ key-sets must match across judges on comparable items.
42
+ I10 in adjudication-required classes, every divergent item needs >= 1
43
+ override recording its resolution; in judge-bearing classes without
44
+ adjudication, divergence requires a non-empty agreement.note.
45
+ I11 decision-relevant runs: an item judged by some judges but not others
46
+ must be named in attempts.blocked_runs and partial_published must be
47
+ true. (Non-decision runs get warning W1 instead.)
48
+ I12 measurement_date must be a real calendar date.
49
+ I13 v1.1 flags-only adjudication labels the headline and caveats as a lower
50
+ bound; rubric direction is frozen by reference.
51
+ I14 v1.1 pre-registration, amendment ordering, design/arm vocabulary, and
52
+ declared timing/ordering/concurrency claims remain internally coherent.
53
+ I15 v1.0 is accepted only for the exact path+hash frozen before v1.1; new
54
+ or modified rows cannot select the weaker version.
55
+
56
+ Warnings (never gate):
57
+ W1 judges cover different item sets on a non-decision-relevant run.
58
+
59
+ Usage:
60
+ python scripts/check_heldout_measurement_report.py report.json [...]
61
+ python scripts/check_heldout_measurement_report.py --all
62
+ # walks evals/heldout/ (following directory symlinks, cycle-guarded)
63
+ # and validates every JSON file carrying the opt-in
64
+ # "measurement_contract" key. Files without the key are never parsed;
65
+ # a file WITH the key that fails strict parsing (duplicate keys,
66
+ # non-finite numbers, undecodable bytes) fails loudly; a near-miss
67
+ # marker value (homoglyph / stray whitespace) fails loudly.
68
+ # Legacy rows are out of scope by design.
69
+
70
+ Exit 0 on pass (warnings may print to stderr), 1 on any error.
71
+ """
72
+ from __future__ import annotations
73
+
74
+ import argparse
75
+ import datetime as _dt
76
+ import functools
77
+ import hashlib
78
+ import json
79
+ import os
80
+ import re
81
+ import subprocess
82
+ import sys
83
+ import unicodedata
84
+ from pathlib import Path
85
+
86
+ import jsonschema
87
+
88
+ REPO_ROOT = Path(__file__).resolve().parent.parent
89
+ HELDOUT_ROOT = REPO_ROOT / "evals" / "heldout"
90
+ SCHEMA_PATH = HELDOUT_ROOT / "measurement_report.schema.json"
91
+ EXECUTION_SCHEMA_PATH = HELDOUT_ROOT / "execution_manifest.schema.json"
92
+ TEMPLATE_PATH = HELDOUT_ROOT / "measurement_report.template.json"
93
+ REGISTRY_PATH = HELDOUT_ROOT / "suite_registry.json"
94
+ CONTRACT_PREFIX = "heldout-measurement/"
95
+ MARKER_KEY = "measurement_contract"
96
+ RATE_TOLERANCE = 0.005
97
+ FROZEN_V1_0_ROWS = {
98
+ HELDOUT_ROOT / "revision_claim_drift/measurement-2026-08-07.json":
99
+ "1af137c798e6cf3a5d0a742e379a8af78fe802cb924b4ece22cdf57cb881f573",
100
+ }
101
+
102
+
103
+ def _reject_duplicate_keys(pairs: list[tuple[str, object]]) -> dict:
104
+ seen: dict[str, object] = {}
105
+ for key, value in pairs:
106
+ if key in seen:
107
+ raise ValueError(f"duplicate key {key!r}")
108
+ seen[key] = value
109
+ return seen
110
+
111
+
112
+ def _loads_strict(text: str) -> dict:
113
+ """JSON load rejecting duplicate keys and NaN/Infinity.
114
+
115
+ Duplicate keys are last-value-wins in plain json.loads, which would let a
116
+ file carry `"raw_published": false, ... "raw_published": true` — passing
117
+ the const attestation while reading as false to a human. Same fail-closed
118
+ stance as cross_model_handoff / check_degradation_registry /
119
+ check_evals_gold_set.
120
+ """
121
+ return json.loads(
122
+ text,
123
+ object_pairs_hook=_reject_duplicate_keys,
124
+ parse_constant=lambda name: (_ for _ in ()).throw(
125
+ ValueError(f"non-finite JSON constant {name!r}")
126
+ ),
127
+ )
128
+
129
+
130
+ @functools.cache
131
+ def _validator() -> jsonschema.Draft202012Validator:
132
+ schema = _loads_strict(SCHEMA_PATH.read_text(encoding="utf-8"))
133
+ jsonschema.Draft202012Validator.check_schema(schema)
134
+ return jsonschema.Draft202012Validator(
135
+ schema, format_checker=jsonschema.Draft202012Validator.FORMAT_CHECKER
136
+ )
137
+
138
+
139
+ @functools.cache
140
+ def _execution_validator() -> jsonschema.Draft202012Validator:
141
+ schema = _loads_strict(EXECUTION_SCHEMA_PATH.read_text(encoding="utf-8"))
142
+ jsonschema.Draft202012Validator.check_schema(schema)
143
+ return jsonschema.Draft202012Validator(
144
+ schema, format_checker=jsonschema.Draft202012Validator.FORMAT_CHECKER
145
+ )
146
+
147
+
148
+ def supported_contract_versions() -> tuple[str, ...]:
149
+ """Supported markers, single-sourced from the schema enum."""
150
+ values = _validator().schema["properties"][MARKER_KEY]["enum"]
151
+ return tuple(values)
152
+
153
+
154
+ def contract_version() -> str:
155
+ """Current template marker — the final schema-enum entry."""
156
+ return supported_contract_versions()[-1]
157
+
158
+
159
+ def _suite_class_enum() -> list[str]:
160
+ return _validator().schema["properties"]["suite_class"]["enum"]
161
+
162
+
163
+ @functools.cache
164
+ def _suite_registry() -> tuple[dict, tuple[str, ...]]:
165
+ """(registry mapping, registry-level errors). Fail-closed on bad registry."""
166
+ errors: list[str] = []
167
+ try:
168
+ raw = _loads_strict(REGISTRY_PATH.read_text(encoding="utf-8"))
169
+ except (OSError, ValueError) as exc:
170
+ return {}, (f"I5: suite_registry.json unreadable: {exc}",)
171
+ registry = {k: v for k, v in raw.items() if not k.startswith("_")}
172
+ valid_classes = set(_suite_class_enum())
173
+ for suite, klass in registry.items():
174
+ if klass not in valid_classes:
175
+ errors.append(
176
+ f"I5: suite_registry.json maps {suite!r} to unknown class {klass!r}"
177
+ )
178
+ return registry, tuple(errors)
179
+
180
+
181
+ def is_contract_report(obj: dict) -> bool:
182
+ """True when the file opts into the #654 contract (any version)."""
183
+ marker = obj.get(MARKER_KEY)
184
+ return isinstance(marker, str) and marker.startswith(CONTRACT_PREFIX)
185
+
186
+
187
+ def _fold(value: str) -> str:
188
+ """NFKC-fold, strip Unicode format characters (Cf), casefold.
189
+
190
+ The #524 lesson: fold BEFORE comparison in a gate, or a homoglyph /
191
+ zero-width re-spelling slips through.
192
+ """
193
+ normalized = unicodedata.normalize("NFKC", value)
194
+ stripped = "".join(c for c in normalized if unicodedata.category(c) != "Cf")
195
+ return stripped.casefold().strip()
196
+
197
+
198
+ def marker_status(obj: dict) -> str:
199
+ """'contract' | 'near_miss' | 'absent' for a parsed JSON object.
200
+
201
+ Any presence of the marker KEY with a non-conforming value (null, number,
202
+ empty or unrelated string, homoglyph spelling) is a near-miss — a file
203
+ that mentions the contract never silently skips validation.
204
+ """
205
+ if MARKER_KEY not in obj:
206
+ return "absent"
207
+ marker = obj[MARKER_KEY]
208
+ if isinstance(marker, str) and marker.startswith(CONTRACT_PREFIX):
209
+ return "contract"
210
+ return "near_miss"
211
+
212
+
213
+ def _names_item(folded_entry: str, folded_item: str) -> bool:
214
+ """True when folded_entry names folded_item as a delimited token — an id
215
+ embedded in a longer id (rp-02 in rp-020) or a concatenated blob does not
216
+ count as naming the gap."""
217
+ pattern = rf"(?<![0-9a-z_-]){re.escape(folded_item)}(?![0-9a-z_-])"
218
+ return re.search(pattern, folded_entry) is not None
219
+
220
+
221
+ def _typed(value: object) -> object:
222
+ """Type-tagged canonical form so 1 != True != 1.0 in payload comparison."""
223
+ if isinstance(value, bool):
224
+ return ("bool", value)
225
+ if isinstance(value, int):
226
+ return ("int", value)
227
+ if isinstance(value, float):
228
+ return ("float", value)
229
+ if isinstance(value, str):
230
+ return ("str", value)
231
+ if value is None:
232
+ return ("null",)
233
+ if isinstance(value, list):
234
+ return ("list", tuple(_typed(v) for v in value))
235
+ if isinstance(value, dict):
236
+ return ("dict", tuple(sorted((k, _typed(v)) for k, v in value.items())))
237
+ return ("other", repr(value))
238
+
239
+
240
+ def _has_affirmed_claim(text: str, pattern: str) -> bool:
241
+ """Match a claim only when it is not locally negated.
242
+
243
+ This is intentionally conservative lexical binding, not semantic parsing:
244
+ nearby ``no/not/never/without/neither`` in the same clause suppresses the
245
+ match, so "not run concurrently" cannot create a concurrency attestation.
246
+ """
247
+ for match in re.finditer(pattern, text):
248
+ prefix = text[max(0, match.start() - 100):match.start()]
249
+ clause = re.split(r'''[.;:!?",\[\]{}]|\b(?:but|however)\b''', prefix)[-1]
250
+ words = re.findall(r"[a-z]+", clause)
251
+ if not set(words[-6:]) & {"no", "not", "never", "without", "neither"}:
252
+ return True
253
+ return False
254
+
255
+
256
+ def _parse_timestamp(value: str) -> _dt.datetime:
257
+ """Parse a schema-validated RFC 3339 timestamp as an aware datetime."""
258
+ parsed = _dt.datetime.fromisoformat(value.replace("Z", "+00:00"))
259
+ if parsed.tzinfo is None:
260
+ raise ValueError("timestamp lacks an offset")
261
+ return parsed
262
+
263
+
264
+ def _execution_claim_errors(manifest: dict, claims: set[str]) -> list[str]:
265
+ """Prove declared execution claims from per-call manifest evidence."""
266
+ errors: list[str] = []
267
+ calls = manifest["calls"]
268
+ parsed_calls: list[tuple[dict, _dt.datetime, _dt.datetime]] = []
269
+ for call in calls:
270
+ try:
271
+ started = _parse_timestamp(call["started_at"])
272
+ completed = _parse_timestamp(call["completed_at"])
273
+ except (TypeError, ValueError):
274
+ # Normally caught by the schema format checker; keep this helper
275
+ # fail-closed when unit-called or when parser behavior changes.
276
+ errors.append(
277
+ f"R5: call {call.get('call_id')!r} has an invalid timestamp"
278
+ )
279
+ continue
280
+ if completed < started:
281
+ errors.append(
282
+ f"R5: call {call['call_id']!r} completed before it started"
283
+ )
284
+ parsed_calls.append((call, started, completed))
285
+
286
+ if not claims or errors:
287
+ return errors
288
+ if len(parsed_calls) < 2:
289
+ for claim in sorted(claims):
290
+ errors.append(
291
+ f"R5: {claim!r} requires evidence from at least two calls"
292
+ )
293
+ return errors
294
+
295
+ if "ordering" in claims:
296
+ ordered = sorted(parsed_calls, key=lambda item: item[0]["sequence_index"])
297
+ indexes = [item[0]["sequence_index"] for item in ordered]
298
+ starts = [item[1] for item in ordered]
299
+ if indexes != list(range(1, len(ordered) + 1)) or any(
300
+ later < earlier for earlier, later in zip(starts, starts[1:])
301
+ ):
302
+ errors.append(
303
+ "R5: 'ordering' is not supported by contiguous sequence indexes "
304
+ "and nondecreasing call start times"
305
+ )
306
+
307
+ if "concurrency" in claims:
308
+ groups: dict[str, list[tuple[_dt.datetime, _dt.datetime]]] = {}
309
+ for call, started, completed in parsed_calls:
310
+ group = call.get("concurrency_group")
311
+ if isinstance(group, str) and group.strip():
312
+ groups.setdefault(_fold(group), []).append((started, completed))
313
+ supported = any(
314
+ max(a_start, b_start) < min(a_end, b_end)
315
+ for intervals in groups.values()
316
+ for index, (a_start, a_end) in enumerate(intervals)
317
+ for b_start, b_end in intervals[index + 1:]
318
+ )
319
+ if not supported:
320
+ errors.append(
321
+ "R5: 'concurrency' requires two overlapping calls in the same "
322
+ "non-empty concurrency_group"
323
+ )
324
+
325
+ if "same_window" in claims:
326
+ window = manifest.get("execution_window")
327
+ if not isinstance(window, dict):
328
+ errors.append(
329
+ "R5: 'same_window' requires a declared execution_window"
330
+ )
331
+ else:
332
+ try:
333
+ window_start = _parse_timestamp(window["started_at"])
334
+ window_end = _parse_timestamp(window["completed_at"])
335
+ except (KeyError, TypeError, ValueError):
336
+ errors.append("R5: execution_window has invalid timestamps")
337
+ else:
338
+ if window_end < window_start or any(
339
+ started < window_start or completed > window_end
340
+ for _call, started, completed in parsed_calls
341
+ ):
342
+ errors.append(
343
+ "R5: 'same_window' calls are not contained in the declared "
344
+ "execution_window"
345
+ )
346
+ return errors
347
+
348
+
349
+ def _invariant_findings(report: dict) -> tuple[list[str], list[str]]:
350
+ """Cross-field invariants I1-I15. Assumes the report is schema-valid."""
351
+ errors: list[str] = []
352
+ warnings: list[str] = []
353
+
354
+ suite = report["suite"]
355
+ suite_class = report["suite_class"]
356
+ judges = report["judges"]
357
+ exception = report["judge_plan"]["exception"]
358
+ agreement = report["aggregate"]["agreement"]
359
+ adjudication = report["adjudication"]
360
+
361
+ # ---- I9: identity hygiene (judges) -------------------------------------
362
+ judge_ids = [_fold(j["judge_id"]) for j in judges]
363
+ if len(judge_ids) != len(set(judge_ids)):
364
+ errors.append(f"I9: duplicate judge_id among {sorted(judge_ids)!r} (fold-compared)")
365
+ model_to_families: dict[str, set[str]] = {}
366
+ config_pairs: dict[tuple[str, str], list[str]] = {}
367
+ for j in judges:
368
+ model_to_families.setdefault(_fold(j["model_id"]), set()).add(_fold(j["model_family"]))
369
+ config_pairs.setdefault(
370
+ (_fold(j["model_id"]), _fold(j["prompt_ref"])), []
371
+ ).append(j["judge_id"])
372
+ for model_id, families in model_to_families.items():
373
+ if len(families) > 1:
374
+ errors.append(
375
+ f"I9: model_id {model_id!r} listed under {len(families)} different "
376
+ "model_family values — one physical judge cannot span families"
377
+ )
378
+ for (model_id, _prompt), ids in config_pairs.items():
379
+ if len(ids) > 1:
380
+ errors.append(
381
+ f"I9: judges {sorted(ids)!r} share the same (model_id, prompt_ref) "
382
+ f"({model_id!r}) — the same judge configuration listed twice does "
383
+ "not add independence"
384
+ )
385
+
386
+ # ---- I9: identity hygiene (item ids) + per-judge indexing ---------------
387
+ fold_to_raw: dict[str, str] = {}
388
+ by_item: dict[str, dict[int, dict]] = {}
389
+ for idx, judge in enumerate(judges):
390
+ seen_in_judge: set[str] = set()
391
+ for row in judge["per_item"]:
392
+ raw_id = row["item_id"]
393
+ fid = _fold(raw_id)
394
+ prior_raw = fold_to_raw.setdefault(fid, raw_id)
395
+ if prior_raw != raw_id:
396
+ errors.append(
397
+ f"I9: item ids {prior_raw!r} and {raw_id!r} fold to the same "
398
+ f"identifier {fid!r} — homoglyph/format-character re-spellings "
399
+ "are rejected"
400
+ )
401
+ if fid in seen_in_judge:
402
+ errors.append(
403
+ f"I9: judge {judge['judge_id']!r} lists item {raw_id!r} more "
404
+ "than once"
405
+ )
406
+ continue
407
+ seen_in_judge.add(fid)
408
+ payload = {k: v for k, v in row.items() if k != "item_id"}
409
+ by_item.setdefault(fid, {})[idx] = payload
410
+
411
+ comparable = {i for i, per_judge in by_item.items() if len(per_judge) >= 2}
412
+ divergent: set[str] = set()
413
+ for fid in comparable:
414
+ payloads = list(by_item[fid].values())
415
+ keysets = {tuple(sorted(p)) for p in payloads}
416
+ if len(keysets) > 1:
417
+ errors.append(
418
+ f"I9: judges score different field sets on item {fid!r} "
419
+ f"({sorted(sorted(k) for k in keysets)!r}) — verdict fields must "
420
+ "be comparable across judges"
421
+ )
422
+ if any(_typed(p) != _typed(payloads[0]) for p in payloads[1:]):
423
+ divergent.add(fid)
424
+
425
+ # ---- I1: agreement rate recomputed -------------------------------------
426
+ rate = agreement["rate"]
427
+ if comparable:
428
+ expected = 1 - len(divergent) / len(comparable)
429
+ if rate is None:
430
+ errors.append(
431
+ f"I1: agreement.rate is null but {len(comparable)} item(s) are "
432
+ f"judged by >=2 judges (expected ~{expected:.3f})"
433
+ )
434
+ elif abs(rate - expected) > RATE_TOLERANCE:
435
+ errors.append(
436
+ f"I1: agreement.rate={rate} but recomputation gives "
437
+ f"{expected:.3f} (1 - {len(divergent)}/{len(comparable)})"
438
+ )
439
+ elif rate is not None:
440
+ errors.append(
441
+ "I1: agreement.rate must be null when no item is judged by >=2 judges"
442
+ )
443
+
444
+ # ---- I2: derived judge minimum + family diversity ----------------------
445
+ if (
446
+ report["decision_relevant"]
447
+ and suite_class != "mechanical_match"
448
+ and exception == "none"
449
+ ):
450
+ families = {_fold(j["model_family"]) for j in judges}
451
+ if len(judges) < 2:
452
+ errors.append(
453
+ f"I2: decision-relevant {suite_class} run with {len(judges)} judge(s) "
454
+ "and exception='none' — the derived minimum is 2 judges; label the "
455
+ "exception or add judges"
456
+ )
457
+ elif len(families) < 2:
458
+ errors.append(
459
+ f"I2: judges span a single model family {sorted(families)!r} — "
460
+ "decision-relevant runs require >=2 distinct families "
461
+ "(or a labeled exception)"
462
+ )
463
+
464
+ # ---- I3 + I8: declared divergence == recomputed divergence -------------
465
+ declared = [_fold(i) for i in agreement["divergent_items"]]
466
+ declared_set = set(declared)
467
+ over_declared = declared_set - divergent
468
+ if over_declared:
469
+ errors.append(
470
+ f"I3: declared divergent items {sorted(over_declared)!r} are not "
471
+ "actually divergent (agreeing, single-judge, or unknown items)"
472
+ )
473
+ unlisted = divergent - declared_set
474
+ if unlisted:
475
+ errors.append(
476
+ "I8: cross-judge divergence on "
477
+ f"{sorted(unlisted)} not listed in aggregate.agreement.divergent_items"
478
+ )
479
+
480
+ # ---- I4: overrides bind to a judge AND an item that judge scored -------
481
+ judge_index = {j["judge_id"]: idx for idx, j in enumerate(judges)}
482
+ for override in adjudication.get("overrides", []):
483
+ o_item, o_judge = _fold(override["item_id"]), override["judge_id"]
484
+ if o_judge not in judge_index:
485
+ errors.append(
486
+ f"I4: override references unknown judge {o_judge!r}"
487
+ )
488
+ elif o_item not in by_item or judge_index[o_judge] not in by_item[o_item]:
489
+ errors.append(
490
+ f"I4: override targets item {override['item_id']!r} which judge "
491
+ f"{o_judge!r} never scored"
492
+ )
493
+
494
+ # ---- I5: suite registry binding ----------------------------------------
495
+ registry, registry_errors = _suite_registry()
496
+ errors.extend(registry_errors)
497
+ if suite not in registry:
498
+ errors.append(
499
+ f"I5: suite {suite!r} is not in evals/heldout/suite_registry.json — "
500
+ "register it (with its class) before publishing contract rows"
501
+ )
502
+ elif registry[suite] != suite_class:
503
+ errors.append(
504
+ f"I5: suite {suite!r} is registered as {registry[suite]!r} "
505
+ f"but the report declares suite_class={suite_class!r}"
506
+ )
507
+
508
+ # ---- I6: decision-relevant runs replicate ------------------------------
509
+ replicates = report["replicates"]
510
+ if (
511
+ report["decision_relevant"]
512
+ and replicates["per_item"] < 2
513
+ and not replicates.get("exception")
514
+ ):
515
+ errors.append(
516
+ f"I6: decision_relevant run with replicates.per_item={replicates['per_item']} — "
517
+ "require >=2 or a written replicates.exception"
518
+ )
519
+
520
+ # ---- I7: retained raw outputs need paths -------------------------------
521
+ if not report["raw_outputs"]["paths"]:
522
+ errors.append("I7: raw_outputs.paths is empty")
523
+
524
+ # ---- I10: every divergent item has a recorded resolution ---------------
525
+ if divergent:
526
+ if adjudication.get("applies") is True:
527
+ overridden = {_fold(o["item_id"]) for o in adjudication.get("overrides", [])}
528
+ unresolved = divergent - overridden
529
+ if unresolved:
530
+ errors.append(
531
+ f"I10: divergent items {sorted(unresolved)!r} have no "
532
+ "adjudication override recording their resolution"
533
+ )
534
+ elif not agreement["note"].strip():
535
+ errors.append(
536
+ "I10: divergence present without adjudication — "
537
+ "aggregate.agreement.note must record the resolution"
538
+ )
539
+
540
+ # ---- I11 / W1: partial judge coverage ----------------------------------
541
+ per_judge_sets = [
542
+ {_fold(row["item_id"]) for row in j["per_item"]} for j in judges
543
+ ]
544
+ if per_judge_sets:
545
+ union = set().union(*per_judge_sets)
546
+ gaps = {i for s in per_judge_sets for i in union - s}
547
+ if gaps:
548
+ if report["decision_relevant"]:
549
+ blocked = report["attempts"]["blocked_runs"]
550
+ uncovered = {
551
+ g
552
+ for g in gaps
553
+ if not any(_names_item(_fold(b), g) for b in blocked)
554
+ }
555
+ if uncovered:
556
+ errors.append(
557
+ f"I11: items {sorted(uncovered)!r} are missing from some "
558
+ "judge's rows and not named in attempts.blocked_runs"
559
+ )
560
+ if report["attempts"]["partial_published"] is not True:
561
+ errors.append(
562
+ "I11: partial judge coverage requires "
563
+ "attempts.partial_published=true"
564
+ )
565
+ else:
566
+ warnings.append(
567
+ "W1: judges cover different item sets (partial judge failure?) — "
568
+ "reflect it in attempts.blocked_runs / run notes"
569
+ )
570
+
571
+ # ---- I12: real calendar date -------------------------------------------
572
+ try:
573
+ _dt.date.fromisoformat(report["measurement_date"])
574
+ except ValueError:
575
+ errors.append(
576
+ f"I12: measurement_date {report['measurement_date']!r} is not a real "
577
+ "calendar date"
578
+ )
579
+
580
+ # ---- I13: adjudication direction and lower-bound honesty (v1.1) -------
581
+ if report[MARKER_KEY] == "heldout-measurement/1.1":
582
+ direction = adjudication.get("resolution_direction")
583
+ if direction in {"flags_only", "other_frozen"}:
584
+ headline = report["aggregate"]["headline"]
585
+ if headline["estimand_status"] != "lower_bound":
586
+ errors.append(
587
+ f"I13: {direction} adjudication requires "
588
+ "aggregate.headline.estimand_status='lower_bound'"
589
+ )
590
+ if "lower bound" not in _fold(headline["construction_rule"]):
591
+ errors.append(
592
+ f"I13: {direction} headline construction_rule must explicitly "
593
+ "state that the result is a lower bound"
594
+ )
595
+ if not any("lower bound" in _fold(c) for c in report["caveats"]):
596
+ errors.append(
597
+ f"I13: {direction} adjudication requires a caveat explicitly "
598
+ "calling the headline a lower bound"
599
+ )
600
+
601
+ # ---- I14: preregistration + design vocabulary + claim binding ------
602
+ prereg = report["preregistration"]
603
+ if adjudication.get("applies") is True:
604
+ if prereg.get("rubric_ref") != adjudication.get("rubric_ref"):
605
+ errors.append(
606
+ "I14: preregistration.rubric_ref must equal "
607
+ "adjudication.rubric_ref"
608
+ )
609
+ if prereg.get("rubric_sha256") != adjudication.get("rubric_sha256"):
610
+ errors.append(
611
+ "I14: preregistration.rubric_sha256 must equal "
612
+ "adjudication.rubric_sha256"
613
+ )
614
+
615
+ amendment_ids: set[str] = set()
616
+ prior_time: _dt.datetime | None = None
617
+ for amendment in prereg["amendments"]:
618
+ aid = _fold(amendment["amendment_id"])
619
+ if aid in amendment_ids:
620
+ errors.append(f"I14: duplicate amendment_id {aid!r}")
621
+ amendment_ids.add(aid)
622
+ try:
623
+ recorded = _parse_timestamp(amendment["recorded_at"])
624
+ except (TypeError, ValueError):
625
+ errors.append(
626
+ f"I14: amendment {aid!r} has an invalid recorded_at timestamp"
627
+ )
628
+ continue
629
+ if prior_time is not None and recorded < prior_time:
630
+ errors.append(
631
+ "I14: preregistration amendments must be append-ordered by "
632
+ "recorded_at"
633
+ )
634
+ prior_time = recorded
635
+
636
+ arm_roles = report["results"]["arm_roles"]
637
+ cohort_arms = {_fold(v) for v in arm_roles["treatment_or_cohort_arms"]}
638
+ packet_arms = {_fold(v) for v in arm_roles["variant_packet_arms"]}
639
+ overlap = cohort_arms & packet_arms
640
+ if overlap:
641
+ errors.append(
642
+ f"I14: arm labels {sorted(overlap)!r} appear as both "
643
+ "treatment/cohort and variant-packet arms"
644
+ )
645
+ if _fold(report["results"]["design"]) in cohort_arms | packet_arms:
646
+ errors.append(
647
+ "I14: results.design is an experimental-design label and cannot "
648
+ "reuse an arm label"
649
+ )
650
+
651
+ claim_sources = {
652
+ "attempts": report["attempts"],
653
+ "aggregate": report["aggregate"],
654
+ "results": report["results"],
655
+ "verdict": report["verdict"],
656
+ "caveats": report["caveats"],
657
+ }
658
+ claim_text = _fold(json.dumps(claim_sources, ensure_ascii=False))
659
+ declared_claims = set(report["execution_manifest"]["claims"])
660
+ claim_patterns = {
661
+ "same_window": r"\bsame[- ]window\b",
662
+ "ordering": r"\b(?:ordered|ordering|interleav(?:ed|ing))\b",
663
+ "concurrency": r"\bconcurren(?:t|cy|tly)\b",
664
+ }
665
+ for claim, pattern in claim_patterns.items():
666
+ if _has_affirmed_claim(claim_text, pattern) and claim not in declared_claims:
667
+ errors.append(
668
+ f"I14: report text makes a {claim!r} claim but "
669
+ "execution_manifest.claims does not declare it"
670
+ )
671
+
672
+ return errors, warnings
673
+
674
+
675
+ def _resolution_findings(report: dict) -> list[str]:
676
+ """R1-R6: attested references must resolve. Repo-relative, traversal-safe."""
677
+ errors: list[str] = []
678
+
679
+ def _repo_path(ref: str, label: str) -> Path | None:
680
+ candidate = (REPO_ROOT / ref).resolve()
681
+ if not candidate.is_relative_to(REPO_ROOT):
682
+ errors.append(f"{label}: reference {ref!r} escapes the repository root")
683
+ return None
684
+ return candidate
685
+
686
+ def _hashed_file(ref: str, expected: str, label: str, field: str) -> Path | None:
687
+ path = _repo_path(ref, label)
688
+ if path is None:
689
+ return None
690
+ if not path.is_file():
691
+ errors.append(f"{label}: {field} {ref!r} does not exist in the repository")
692
+ return None
693
+ digest = hashlib.sha256(path.read_bytes()).hexdigest()
694
+ if digest != expected:
695
+ errors.append(
696
+ f"{label}: {field} hash mismatch (declared {expected[:12]}…, "
697
+ f"actual {digest[:12]}…)"
698
+ )
699
+ return path
700
+
701
+ adjudication = report["adjudication"]
702
+ if adjudication.get("applies") is True:
703
+ _hashed_file(
704
+ adjudication["rubric_ref"],
705
+ adjudication["rubric_sha256"],
706
+ "R1",
707
+ "rubric_ref",
708
+ )
709
+
710
+ suite_dir = (HELDOUT_ROOT / report["suite"]).resolve()
711
+ for ref in report["raw_outputs"]["paths"]:
712
+ target = _repo_path(ref, "R2")
713
+ if target is None:
714
+ continue
715
+ if not target.is_relative_to(suite_dir):
716
+ errors.append(
717
+ f"R2: raw_outputs path {ref!r} is not under "
718
+ f"evals/heldout/{report['suite']}/ — raw outputs live in their "
719
+ "suite's directory"
720
+ )
721
+ elif not target.exists():
722
+ errors.append(f"R2: raw_outputs path {ref!r} does not exist")
723
+
724
+ baseline_ref = report["judge_plan"].get("legacy_baseline_ref")
725
+ if baseline_ref is not None:
726
+ baseline = _repo_path(baseline_ref, "R1")
727
+ if baseline is not None and not baseline.is_file():
728
+ errors.append(
729
+ f"R1: legacy_baseline_ref {baseline_ref!r} does not exist in the "
730
+ "repository — the comparability claim must name a real legacy row"
731
+ )
732
+
733
+ expert_ref = report["judge_plan"].get("expert_panel_ref")
734
+ if expert_ref is not None:
735
+ expert_path = _hashed_file(
736
+ expert_ref,
737
+ report["judge_plan"]["expert_panel_sha256"],
738
+ "R6",
739
+ "expert_panel_ref",
740
+ )
741
+ if expert_path is not None:
742
+ if not expert_path.is_relative_to(suite_dir):
743
+ errors.append(
744
+ f"R6: expert panel {expert_ref!r} is not under "
745
+ f"evals/heldout/{report['suite']}/"
746
+ )
747
+ try:
748
+ panel = _loads_strict(expert_path.read_text(encoding="utf-8"))
749
+ except (OSError, UnicodeError, json.JSONDecodeError, ValueError) as exc:
750
+ errors.append(f"R6: expert panel is not strict JSON ({exc})")
751
+ else:
752
+ if not isinstance(panel, dict):
753
+ errors.append("R6: expert panel root must be an object")
754
+ else:
755
+ if panel.get("suite") != report["suite"]:
756
+ errors.append(
757
+ "R6: expert panel suite does not match the measurement report"
758
+ )
759
+ experts = panel.get("experts")
760
+ if not isinstance(experts, list) or len(experts) < 2:
761
+ errors.append(
762
+ "R6: human_expert_panel requires at least two experts"
763
+ )
764
+ else:
765
+ expert_ids: list[str] = []
766
+ for index, expert in enumerate(experts):
767
+ if not isinstance(expert, dict):
768
+ errors.append(
769
+ f"R6: experts[{index}] must be an object"
770
+ )
771
+ continue
772
+ expert_id = expert.get("expert_id")
773
+ if not isinstance(expert_id, str) or not expert_id.strip():
774
+ errors.append(
775
+ f"R6: experts[{index}].expert_id must be non-empty"
776
+ )
777
+ else:
778
+ expert_ids.append(_fold(expert_id))
779
+ if expert.get("expert_type") != "human":
780
+ errors.append(
781
+ f"R6: experts[{index}] must declare expert_type='human'"
782
+ )
783
+ if expert.get("independent") is not True:
784
+ errors.append(
785
+ f"R6: experts[{index}] must attest independent=true"
786
+ )
787
+ blinded = expert.get("blinded_to")
788
+ required_blinding = {"arm_identity", "mechanism_state"}
789
+ if not isinstance(blinded, list) or not required_blinding.issubset(
790
+ set(value for value in blinded if isinstance(value, str))
791
+ ):
792
+ errors.append(
793
+ f"R6: experts[{index}] must be blinded to arm_identity "
794
+ "and mechanism_state"
795
+ )
796
+ if len(expert_ids) != len(set(expert_ids)):
797
+ errors.append(
798
+ "R6: expert_id values must be unique after identity folding"
799
+ )
800
+ panel_adjudication = panel.get("adjudication")
801
+ if not isinstance(panel_adjudication, dict):
802
+ errors.append("R6: expert panel adjudication must be an object")
803
+ else:
804
+ if panel_adjudication.get("adjudicator_type") != "human":
805
+ errors.append(
806
+ "R6: expert panel adjudicator_type must be 'human'"
807
+ )
808
+ if panel_adjudication.get("arm_blind") is not True:
809
+ errors.append(
810
+ "R6: expert panel adjudication must attest arm_blind=true"
811
+ )
812
+ if panel_adjudication.get("disagreements_retained") is not True:
813
+ errors.append(
814
+ "R6: expert panel adjudication must retain disagreements"
815
+ )
816
+
817
+ commit = report["subject"]["config"]["suite_commit"]
818
+ try:
819
+ probe = subprocess.run(
820
+ ["git", "cat-file", "-e", f"{commit}^{{commit}}"],
821
+ cwd=REPO_ROOT,
822
+ capture_output=True,
823
+ text=True,
824
+ )
825
+ missing = probe.returncode != 0
826
+ except (OSError, ValueError) as exc:
827
+ errors.append(f"R3: could not verify suite_commit ({exc})")
828
+ missing = False
829
+ if missing:
830
+ errors.append(
831
+ f"R3: subject.config.suite_commit {commit!r} is not a commit in this "
832
+ "repository"
833
+ )
834
+
835
+ if report[MARKER_KEY] == "heldout-measurement/1.1":
836
+ prereg = report["preregistration"]
837
+ _hashed_file(prereg["plan_ref"], prereg["plan_sha256"], "R4", "plan_ref")
838
+ if adjudication.get("applies") is not True and prereg.get("rubric_ref"):
839
+ _hashed_file(
840
+ prereg["rubric_ref"],
841
+ prereg["rubric_sha256"],
842
+ "R4",
843
+ "rubric_ref",
844
+ )
845
+
846
+ frozen_commit = prereg["frozen_commit"]
847
+ try:
848
+ frozen_probe = subprocess.run(
849
+ ["git", "cat-file", "-e", f"{frozen_commit}^{{commit}}"],
850
+ cwd=REPO_ROOT,
851
+ capture_output=True,
852
+ text=True,
853
+ )
854
+ frozen_missing = frozen_probe.returncode != 0
855
+ except (OSError, ValueError) as exc:
856
+ errors.append(f"R4: could not verify preregistration.frozen_commit ({exc})")
857
+ frozen_missing = False
858
+ if frozen_missing:
859
+ errors.append(
860
+ f"R4: preregistration.frozen_commit {frozen_commit!r} is not a "
861
+ "commit in this repository"
862
+ )
863
+
864
+ execution = report["execution_manifest"]
865
+ manifest_path = _hashed_file(
866
+ execution["ref"], execution["sha256"], "R5", "execution_manifest.ref"
867
+ )
868
+ if manifest_path is not None:
869
+ if not manifest_path.is_relative_to(suite_dir):
870
+ errors.append(
871
+ f"R5: execution manifest {execution['ref']!r} is not under "
872
+ f"evals/heldout/{report['suite']}/"
873
+ )
874
+ try:
875
+ manifest = _loads_strict(manifest_path.read_text(encoding="utf-8"))
876
+ except (OSError, ValueError, RecursionError) as exc:
877
+ errors.append(f"R5: execution manifest is not strict JSON ({exc})")
878
+ else:
879
+ schema_errors = list(_execution_validator().iter_errors(manifest))
880
+ errors.extend(
881
+ f"R5: execution manifest schema {list(e.absolute_path)}: {e.message}"
882
+ for e in schema_errors
883
+ )
884
+ if not schema_errors:
885
+ if manifest["suite"] != report["suite"]:
886
+ errors.append(
887
+ "R5: execution manifest suite does not match the report"
888
+ )
889
+ call_ids: set[str] = set()
890
+ sequence_indexes: set[int] = set()
891
+ for call in manifest["calls"]:
892
+ cid = _fold(call["call_id"])
893
+ if cid in call_ids:
894
+ errors.append(f"R5: duplicate execution call_id {cid!r}")
895
+ call_ids.add(cid)
896
+ seq = call["sequence_index"]
897
+ if seq in sequence_indexes:
898
+ errors.append(f"R5: duplicate execution sequence_index {seq}")
899
+ sequence_indexes.add(seq)
900
+ errors.extend(
901
+ _execution_claim_errors(
902
+ manifest, set(report["execution_manifest"]["claims"])
903
+ )
904
+ )
905
+
906
+ return errors
907
+
908
+
909
+ def location_errors(path: Path, report: dict) -> list[str]:
910
+ """L1: a report filed under evals/heldout/<dir>/ must declare suite == <dir>.
911
+
912
+ Uses the path AS FILED (absolute but unresolved), so a row reached through
913
+ a symlinked suite directory is judged by where it is filed, not where the
914
+ bytes physically live. Paths outside evals/heldout/ (drafts) are unchecked.
915
+ """
916
+ try:
917
+ rel = path.absolute().relative_to(HELDOUT_ROOT.absolute())
918
+ except ValueError:
919
+ return []
920
+ parts = rel.parts
921
+ if len(parts) < 2:
922
+ return [
923
+ "L1: a contract row must live inside a suite directory "
924
+ "(evals/heldout/<suite>/...), not at the evals/heldout/ root"
925
+ ]
926
+ if parts[0] != report.get("suite"):
927
+ return [
928
+ f"L1: report filed under evals/heldout/{parts[0]}/ declares "
929
+ f"suite={report.get('suite')!r} — the containing suite directory "
930
+ "and the declared suite must match"
931
+ ]
932
+ return []
933
+
934
+
935
+ def _validate_report(
936
+ report: dict, *, resolve_refs: bool, allow_frozen_v1_0: bool
937
+ ) -> tuple[list[str], list[str]]:
938
+ """Full validation: (errors, warnings). Does not mutate the input.
939
+
940
+ Schema errors short-circuit: invariants only run on schema-valid reports,
941
+ so a schema-invalid file reports its schema errors alone. resolve_refs
942
+ additionally runs R1-R5 (CLI/CI mode; needs the repository checkout).
943
+ """
944
+ validator = _validator()
945
+ schema_errors = [
946
+ f"schema {list(e.absolute_path)}: {e.message}"
947
+ for e in validator.iter_errors(report)
948
+ ]
949
+ if schema_errors:
950
+ return schema_errors, []
951
+ if (
952
+ report[MARKER_KEY] == "heldout-measurement/1.0"
953
+ and not allow_frozen_v1_0
954
+ ):
955
+ return [
956
+ "I15: heldout-measurement/1.0 is frozen; only the exact allowlisted "
957
+ "path and SHA-256 may use it"
958
+ ], []
959
+ errors, warnings = _invariant_findings(report)
960
+ if resolve_refs and not errors:
961
+ errors.extend(_resolution_findings(report))
962
+ return errors, warnings
963
+
964
+
965
+ def validate_report(
966
+ report: dict, *, resolve_refs: bool = False
967
+ ) -> tuple[list[str], list[str]]:
968
+ """Validate a newly authored report; the weaker frozen v1.0 is rejected.
969
+
970
+ Only the path-aware CLI entry point can authorize the one frozen row after
971
+ matching both its repository path and SHA-256.
972
+ """
973
+ return _validate_report(
974
+ report,
975
+ resolve_refs=resolve_refs,
976
+ allow_frozen_v1_0=False,
977
+ )
978
+
979
+
980
+ def _validate_obj(path: Path, report: dict) -> int:
981
+ allow_frozen_v1_0 = False
982
+ expected_hash = FROZEN_V1_0_ROWS.get(path.absolute())
983
+ if expected_hash is not None and report.get(MARKER_KEY) == "heldout-measurement/1.0":
984
+ try:
985
+ allow_frozen_v1_0 = hashlib.sha256(path.read_bytes()).hexdigest() == expected_hash
986
+ except OSError:
987
+ allow_frozen_v1_0 = False
988
+ errors, warnings = _validate_report(
989
+ report,
990
+ # The byte-pinned 1.0 row predates this resolver contract and may name
991
+ # commits omitted by a shallow CI checkout. Its exact path+SHA is the
992
+ # authorization; do not retrofit R1-R5 onto that frozen artifact.
993
+ resolve_refs=not allow_frozen_v1_0,
994
+ allow_frozen_v1_0=allow_frozen_v1_0,
995
+ )
996
+ errors.extend(location_errors(path, report))
997
+ for w in warnings:
998
+ print(f"{path}: {w}", file=sys.stderr)
999
+ if errors:
1000
+ for e in errors:
1001
+ print(f"ERROR: {path}: {e}")
1002
+ return 1
1003
+ print(f"OK: {path} validates against {report.get(MARKER_KEY)}")
1004
+ return 0
1005
+
1006
+
1007
+ def _walk_json_files(root: Path) -> tuple[list[Path], list[str]]:
1008
+ """All *.json files under root (case-insensitive extension), following
1009
+ directory symlinks with a resolved-path cycle guard.
1010
+
1011
+ Symlinked directories are followed only when their resolved target stays
1012
+ inside the repository — an external target cannot hold repo-published
1013
+ rows (git stores the link, not the content) and following it would let
1014
+ the walk traverse arbitrary trees. Unreadable directories are surfaced
1015
+ as walk errors, never silently skipped."""
1016
+ found: list[Path] = []
1017
+ walk_errors: list[str] = []
1018
+ visited: set[Path] = set()
1019
+ repo_real = REPO_ROOT.resolve()
1020
+ root_real = root.resolve()
1021
+
1022
+ def _walk(directory: Path) -> None:
1023
+ real = directory.resolve()
1024
+ if real in visited:
1025
+ return
1026
+ if not (real.is_relative_to(root_real) or real.is_relative_to(repo_real)):
1027
+ walk_errors.append(
1028
+ f"{directory}: symlinked directory resolves outside the "
1029
+ "repository — not scanned (repo-published rows cannot live there)"
1030
+ )
1031
+ return
1032
+ visited.add(real)
1033
+ try:
1034
+ entries = sorted(os.scandir(directory), key=lambda e: e.name)
1035
+ except OSError as exc:
1036
+ walk_errors.append(f"{directory}: unreadable directory: {exc}")
1037
+ return
1038
+ for entry in entries:
1039
+ p = directory / entry.name
1040
+ try:
1041
+ is_dir = entry.is_dir(follow_symlinks=True)
1042
+ except OSError:
1043
+ is_dir = False
1044
+ if is_dir:
1045
+ _walk(p)
1046
+ elif p.suffix.lower() == ".json":
1047
+ try:
1048
+ file_real = p.resolve()
1049
+ except OSError:
1050
+ file_real = p
1051
+ if not (
1052
+ file_real.is_relative_to(root_real)
1053
+ or file_real.is_relative_to(repo_real)
1054
+ ):
1055
+ walk_errors.append(
1056
+ f"{p}: file symlink resolves outside the repository — "
1057
+ "not scanned (repo-published rows cannot live there)"
1058
+ )
1059
+ continue
1060
+ found.append(p)
1061
+
1062
+ _walk(root)
1063
+ return found, walk_errors
1064
+
1065
+
1066
+ def _scan_all() -> int:
1067
+ rc = 0
1068
+ opted_in = 0
1069
+ scanned = 0
1070
+ files, walk_errors = _walk_json_files(HELDOUT_ROOT)
1071
+ for err in walk_errors:
1072
+ print(f"ERROR: {err}")
1073
+ rc = 1
1074
+ for path in files:
1075
+ if path.resolve() in (
1076
+ SCHEMA_PATH.resolve(),
1077
+ EXECUTION_SCHEMA_PATH.resolve(),
1078
+ TEMPLATE_PATH.resolve(),
1079
+ REGISTRY_PATH.resolve(),
1080
+ ):
1081
+ continue
1082
+ scanned += 1
1083
+ try:
1084
+ raw = path.read_bytes()
1085
+ except OSError as exc:
1086
+ print(f"ERROR: {path}: unreadable JSON file under evals/heldout/: {exc}")
1087
+ rc = 1
1088
+ continue
1089
+ try:
1090
+ text = raw.decode("utf-8")
1091
+ except UnicodeDecodeError as exc:
1092
+ print(f"ERROR: {path}: not valid UTF-8 ({exc}) — JSON must be UTF-8")
1093
+ rc = 1
1094
+ continue
1095
+ # Detection is on the PARSED document, so a \u-escaped spelling of
1096
+ # the marker key cannot hide a report from the scan.
1097
+ try:
1098
+ lenient = json.loads(text)
1099
+ except (ValueError, RecursionError) as exc:
1100
+ if MARKER_KEY in text.replace("\\u005f", "_"):
1101
+ print(
1102
+ f"ERROR: {path}: mentions {MARKER_KEY!r} but does not parse "
1103
+ f"as JSON ({exc})"
1104
+ )
1105
+ rc = 1
1106
+ continue
1107
+ if not isinstance(lenient, dict):
1108
+ continue
1109
+ status = marker_status(lenient)
1110
+ if status == "absent":
1111
+ continue
1112
+ # Marked (or near-miss-marked) files must survive the strict parse.
1113
+ try:
1114
+ obj = _loads_strict(text)
1115
+ except (ValueError, RecursionError) as exc:
1116
+ print(
1117
+ f"ERROR: {path}: carries {MARKER_KEY!r} but fails strict JSON "
1118
+ f"parse ({exc}) — a contract-marked file may not carry duplicate "
1119
+ "keys or non-finite numbers"
1120
+ )
1121
+ rc = 1
1122
+ opted_in += 1
1123
+ continue
1124
+ if status == "near_miss":
1125
+ print(
1126
+ f"ERROR: {path}: {MARKER_KEY} value {lenient.get(MARKER_KEY)!r} is "
1127
+ f"not the exact contract marker (expected prefix {CONTRACT_PREFIX!r}) "
1128
+ "— near-miss markers fail loudly rather than skipping validation"
1129
+ )
1130
+ rc = 1
1131
+ opted_in += 1
1132
+ else:
1133
+ opted_in += 1
1134
+ rc = max(rc, _validate_obj(path, obj))
1135
+ if opted_in == 0 and rc == 0:
1136
+ print(
1137
+ f"OK: no contract-marked reports among {scanned} JSON file(s) "
1138
+ "under evals/heldout/; legacy rows are out of scope by design"
1139
+ )
1140
+ return rc
1141
+
1142
+
1143
+ def _load(path: Path) -> dict | None:
1144
+ try:
1145
+ obj = _loads_strict(path.read_text(encoding="utf-8"))
1146
+ except (OSError, ValueError, RecursionError) as exc:
1147
+ print(f"ERROR: {path}: failed to load: {exc}")
1148
+ return None
1149
+ if not isinstance(obj, dict):
1150
+ print(f"ERROR: {path}: top-level JSON value is not an object")
1151
+ return None
1152
+ return obj
1153
+
1154
+
1155
+ def main() -> int:
1156
+ parser = argparse.ArgumentParser(description=__doc__)
1157
+ parser.add_argument("reports", nargs="*", type=Path)
1158
+ parser.add_argument(
1159
+ "--all",
1160
+ action="store_true",
1161
+ help="walk evals/heldout/ and validate every contract-marked JSON file",
1162
+ )
1163
+ args = parser.parse_args()
1164
+
1165
+ if args.all:
1166
+ return _scan_all()
1167
+
1168
+ if not args.reports:
1169
+ print("ERROR: pass report path(s) or --all", file=sys.stderr)
1170
+ return 2
1171
+ rc = 0
1172
+ for path in args.reports:
1173
+ obj = _load(path)
1174
+ rc = max(rc, 1 if obj is None else _validate_obj(path, obj))
1175
+ return rc
1176
+
1177
+
1178
+ if __name__ == "__main__":
1179
+ sys.exit(main())