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,1191 @@
1
+ #!/usr/bin/env bash
2
+ # version: 1.0.0
3
+ #
4
+ # This wrapper is NOT to be invoked by an in-LLM Bash tool call from the same
5
+ # session producing the audited deliverable. Allowed invokers: human interactive
6
+ # shell, CI workflow step, SubagentStop hook, second-terminal Bash from outside
7
+ # the LLM session. Same-session in-LLM invocation creates Pattern C3 exposure.
8
+ # See spec §4.7.
9
+ #
10
+ # Usage:
11
+ # scripts/run_codex_audit.sh \
12
+ # --stage <1-6> \
13
+ # --agent <synthesis_agent|research_architect_agent|report_compiler_agent> \
14
+ # --deliverable <repo-relative-path> \
15
+ # --round <N> \
16
+ # [--target-rounds <N>] # default 3
17
+ # [--supporting <p1,p2,...>] # comma-separated repo-relative paths
18
+ # [--previous-findings <path>] # required when --round > 1
19
+ # [--bundle-id <string>]
20
+ # [--output-dir <dir>] # default audit_artifacts/
21
+ # [--dry-run] # validate inputs only; write nothing
22
+ #
23
+ # Exit codes (§4.6):
24
+ # 0 Audit complete; verdict is PASS / MINOR / MATERIAL
25
+ # 64 EX_USAGE — input validation failed (no files written)
26
+ # 70 EX_SOFTWARE — AUDIT_FAILED (JSONL parse error or bundle mutation)
27
+ # 73 EX_CANTCREAT — tee write failed; JSONL integrity not guaranteed
28
+ # 75 EX_TEMPFAIL — codex rate-limited / transient error (retry candidate)
29
+ # other codex non-zero exit (preserved as-is; AUDIT_FAILED artifact set written)
30
+
31
+ set -euo pipefail
32
+
33
+ # ---------------------------------------------------------------------------
34
+ # Bash version guard — §4.1 requires Bash 4+ for indexed arrays, read -ra, <<<
35
+ # ---------------------------------------------------------------------------
36
+ if [[ "${BASH_VERSINFO[0]}" -lt 4 ]]; then
37
+ printf '[run_codex_audit] error: Bash 4+ required (found %s). On macOS: brew install bash\n' \
38
+ "${BASH_VERSION}" >&2
39
+ exit 64
40
+ fi
41
+
42
+ # ---------------------------------------------------------------------------
43
+ # Helper functions — defined before the dependency preflight so they are
44
+ # available for the _sha256 check itself.
45
+ # ---------------------------------------------------------------------------
46
+
47
+ # SHA-256 backend selection — cached once to avoid forking `command -v` per call
48
+ # (Step 0b + Step 3a together produce 8+ hash calls).
49
+ if command -v sha256sum >/dev/null 2>&1; then
50
+ _SHA256_CMD=(sha256sum)
51
+ else
52
+ _SHA256_CMD=(shasum -a 256)
53
+ fi
54
+
55
+ # _sha256 <path>
56
+ # Portable SHA-256 hex digest. Prefers GNU sha256sum (Linux / coreutils);
57
+ # falls back to BSD shasum -a 256 (macOS stock).
58
+ _sha256() {
59
+ "${_SHA256_CMD[@]}" "$1" | awk '{print $1}'
60
+ }
61
+
62
+ # _sha256_str <string>
63
+ # SHA-256 of an in-memory string (for the bundle manifest).
64
+ _sha256_str() {
65
+ printf '%s' "$1" | "${_SHA256_CMD[@]}" | awk '{print $1}'
66
+ }
67
+
68
+ # _atomic_write <dest-path>
69
+ # Reads stdin, writes to <dest>.tmp, fsyncs, then renames over <dest>.
70
+ # Used for sidecar, verdict, and proposal entry — the three files §4.4 §4.8
71
+ # guarantees orchestrator observes whole-or-not-at-all. JSONL is exempt
72
+ # because codex streams it over the audit's runtime; see §4.4 atomicity note.
73
+ #
74
+ # F-010 (§3.6): each sub-step (cat, fsync, mv) is explicitly error-checked.
75
+ # A raw cat/fsync/mv failure with set -euo pipefail would abort the wrapper
76
+ # before AUDIT_FAILED artifacts are written, violating §4.6 invariant E8.
77
+ # All three failure cases now emit a diagnostic and exit 73 (EX_CANTCREAT).
78
+ _atomic_write() {
79
+ local path="$1"
80
+ local tmp="${path}.tmp"
81
+ if ! cat > "${tmp}" 2>/dev/null; then
82
+ printf '[run_codex_audit] error: failed to write %s\n' "${tmp}" >&2
83
+ exit 73
84
+ fi
85
+ if command -v python3 >/dev/null 2>&1; then
86
+ if ! python3 -c "import os,sys; f=open(sys.argv[1],'rb'); os.fsync(f.fileno()); f.close()" "${tmp}" 2>/dev/null; then
87
+ rm -f "${tmp}"
88
+ printf '[run_codex_audit] error: fsync failed for %s\n' "${tmp}" >&2
89
+ exit 73
90
+ fi
91
+ else
92
+ sync
93
+ fi
94
+ if ! mv -f "${tmp}" "${path}" 2>/dev/null; then
95
+ rm -f "${tmp}"
96
+ printf '[run_codex_audit] error: rename failed for %s\n' "${path}" >&2
97
+ exit 73
98
+ fi
99
+ }
100
+
101
+ # _extract_jsonl_thread_id <jsonl-path>
102
+ # Returns the thread_id from the first thread.started event, or empty string
103
+ # when JSONL is missing / empty / lacks a parseable thread.started event.
104
+ # codex 0.125+ emits thread_id only on the opening thread.started event (§3.3).
105
+ #
106
+ # F-001 (§3.6): jq must be non-fatal. A SIGKILL'd or disk-full partial JSONL can
107
+ # make jq exit non-zero; with set -euo pipefail that would abort the wrapper BEFORE
108
+ # the mandatory AUDIT_FAILED sidecar/verdict/proposal trio is written, violating §4.6
109
+ # invariant E8. The `|| printf ''` ensures the function always returns success.
110
+ _extract_jsonl_thread_id() {
111
+ local path="$1"
112
+ if [[ ! -s "${path}" ]]; then
113
+ printf ''
114
+ return 0
115
+ fi
116
+ # F-015 (§3.1): jq emits the literal string "null" when thread_id is absent or
117
+ # non-string; a malformed thread.started event would then propagate "null" into
118
+ # the sidecar's stream.jsonl_thread_id, failing the schema UUID regex.
119
+ # Chain select(type == "string") + UUID-pattern guard to degrade gracefully to
120
+ # empty string (permitted by schema when companion verdict is AUDIT_FAILED).
121
+ jq -r '
122
+ select(.type == "thread.started")
123
+ | .thread_id
124
+ | select(type == "string")
125
+ | select(test("^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"))
126
+ ' "${path}" 2>/dev/null \
127
+ | head -1 \
128
+ || printf ''
129
+ }
130
+
131
+ # _codex_version
132
+ # Extracts bare semver from `codex --version`. codex 0.125+ prints
133
+ # "codex-cli X.Y.Z" (e.g., "codex-cli 0.128.0"); we strip the prefix and return just the dotted-triple.
134
+ # Exits 64 if no semver-shaped token is found — guards against future CLI
135
+ # format changes silently leaking garbage into the sidecar's codex_cli_version.
136
+ _codex_version() {
137
+ local v
138
+ v=$(codex --version 2>/dev/null \
139
+ | awk 'match($0, /[0-9]+\.[0-9]+\.[0-9]+/) { print substr($0, RSTART, RLENGTH); exit }')
140
+ if [[ -z "${v}" ]]; then
141
+ printf '[run_codex_audit] error: cannot parse semver from `codex --version`\n' >&2
142
+ exit 64
143
+ fi
144
+ printf '%s\n' "${v}"
145
+ }
146
+
147
+ # _now_rfc3339_ms
148
+ # UTC timestamp with millisecond precision in RFC 3339 format.
149
+ # Format: YYYY-MM-DDTHH:MM:SS.mmmZ (colons in time — JSON field format).
150
+ # This is the JSON/sidecar field format; run_id uses hyphens instead.
151
+ _now_rfc3339_ms() {
152
+ python3 -c "
153
+ import datetime
154
+ now = datetime.datetime.now(datetime.timezone.utc)
155
+ ms = now.strftime('%Y-%m-%dT%H:%M:%S') + '.{:03d}Z'.format(now.microsecond // 1000)
156
+ print(ms)
157
+ "
158
+ }
159
+
160
+ # _random_4hex
161
+ # Four random lowercase hex characters from /dev/urandom.
162
+ # Used as the run_id suffix to disambiguate sub-second concurrent runs.
163
+ _random_4hex() {
164
+ od -An -N2 -tx1 < /dev/urandom | tr -d ' \n'
165
+ }
166
+
167
+ # _make_run_id
168
+ # Generates a run_id per §3.1 / §3.7 F1 contract:
169
+ # <ISO-8601-Z>-<4-hex>
170
+ # where the date-time portion uses HYPHENS in place of colons (filename safe).
171
+ # Example: 2026-04-30T15-22-04Z-d8f3
172
+ # Note: JSON field values (started_at, ended_at) use colons per RFC 3339.
173
+ _make_run_id() {
174
+ local dt
175
+ dt=$(python3 -c "
176
+ import datetime
177
+ now = datetime.datetime.now(datetime.timezone.utc)
178
+ print(now.strftime('%Y-%m-%dT%H-%M-%SZ'))
179
+ ")
180
+ printf '%s-%s\n' "${dt}" "$(_random_4hex)"
181
+ }
182
+
183
+ # _duration_seconds <started_at_rfc3339_ms> <ended_at_rfc3339_ms>
184
+ # Returns elapsed seconds as a float.
185
+ # F-009 (§3.1): clamp to minimum 0.001 — audit_sidecar.schema.json sets
186
+ # duration_seconds exclusiveMinimum: 0; very fast failures (codex exits before
187
+ # 1ms) would produce 0.000 which violates the schema constraint.
188
+ _duration_seconds() {
189
+ python3 -c "
190
+ import datetime, sys
191
+ fmt = '%Y-%m-%dT%H:%M:%S.%fZ'
192
+ t0 = datetime.datetime.strptime(sys.argv[1], fmt)
193
+ t1 = datetime.datetime.strptime(sys.argv[2], fmt)
194
+ secs = (t1-t0).total_seconds()
195
+ # Clamp to schema exclusiveMinimum: 0
196
+ if secs <= 0:
197
+ secs = 0.001
198
+ print('{:.3f}'.format(secs))
199
+ " "$1" "$2"
200
+ }
201
+
202
+ # _git_dirty
203
+ # Prints 'true' when the working tree is dirty, 'false' otherwise.
204
+ # Uses `--exit-code` so diff exits non-zero on dirty state; we catch that.
205
+ _git_dirty() {
206
+ if git diff --quiet 2>/dev/null && git diff --cached --quiet 2>/dev/null; then
207
+ printf 'false'
208
+ else
209
+ printf 'true'
210
+ fi
211
+ }
212
+
213
+ # _to_repo_relative <path>
214
+ # If <path> is absolute, strip the leading slash (unlikely — §4.2 says
215
+ # deliverable is repo-relative, but belt-and-suspenders). If it starts with
216
+ # ./ normalize that away. Does not validate ..; that is the caller's job.
217
+ _to_repo_relative() {
218
+ local p="$1"
219
+ # Remove leading ./
220
+ p="${p#./}"
221
+ printf '%s' "${p}"
222
+ }
223
+
224
+ # _validate_repo_relative <path> <flag-name>
225
+ # F-006 (§3.1): Validates the path satisfies the audit_sidecar.schema.json
226
+ # repo_relative_path constraint: no leading /, no whitespace, no .. segments.
227
+ # Absolute paths, .. traversals, or whitespace paths fail schema validation
228
+ # downstream (proposal entry artifact_paths.{jsonl,sidecar,verdict} regex).
229
+ # Exits EX_USAGE 64 on violation.
230
+ _validate_repo_relative() {
231
+ local path="$1"
232
+ local flag="$2"
233
+ # Must not be empty
234
+ if [[ -z "${path}" ]]; then
235
+ printf '[run_codex_audit] error: %s path must not be empty\n' "${flag}" >&2
236
+ exit 64
237
+ fi
238
+ # Must not be absolute (leading /)
239
+ if [[ "${path}" == /* ]]; then
240
+ printf '[run_codex_audit] error: %s path must be repo-relative (no leading /): %s\n' \
241
+ "${flag}" "${path}" >&2
242
+ exit 64
243
+ fi
244
+ # Must not contain whitespace
245
+ if [[ "${path}" =~ [[:space:]] ]]; then
246
+ printf '[run_codex_audit] error: %s path must not contain whitespace: %s\n' \
247
+ "${flag}" "${path}" >&2
248
+ exit 64
249
+ fi
250
+ # Must not contain .. segments (path traversal)
251
+ if [[ "${path}" =~ (^|/)\.\.(/|$) ]]; then
252
+ printf '[run_codex_audit] error: %s path must not contain .. segments: %s\n' \
253
+ "${flag}" "${path}" >&2
254
+ exit 64
255
+ fi
256
+ }
257
+
258
+ # _json_escape <string>
259
+ # Minimal JSON string escaping (backslash, double-quote, control chars).
260
+ _json_escape() {
261
+ python3 -c "import json,sys; print(json.dumps(sys.argv[1]))" "$1"
262
+ }
263
+
264
+ # _yaml_escape_oneline <string>
265
+ # Produce a safe single-quoted YAML scalar. Single-quotes are escaped by
266
+ # doubling them per YAML spec.
267
+ _yaml_escape_oneline() {
268
+ local s="$1"
269
+ # Replace ' with '' for YAML single-quote escaping
270
+ s="${s//\'/\'\'}"
271
+ printf "'%s'" "${s}"
272
+ }
273
+
274
+ # ---------------------------------------------------------------------------
275
+ # Dependency preflight — exits 64 with "missing dependency: <name>" before
276
+ # any artifact write. Checked: bash (version already done above), git, awk,
277
+ # jq, od, tr, uname, sort, head, tee, mv, python3, codex, sha256sum|shasum.
278
+ # ---------------------------------------------------------------------------
279
+ _check_dep() {
280
+ local cmd="$1"
281
+ if ! command -v "${cmd}" >/dev/null 2>&1; then
282
+ printf '[run_codex_audit] error: missing dependency: %s\n' "${cmd}" >&2
283
+ exit 64
284
+ fi
285
+ }
286
+
287
+ for _dep in git awk jq od tr uname sort head tee mv python3 codex; do
288
+ _check_dep "${_dep}"
289
+ done
290
+
291
+ # SHA-256 helper: need at least one of sha256sum or shasum
292
+ if ! command -v sha256sum >/dev/null 2>&1 && ! command -v shasum >/dev/null 2>&1; then
293
+ printf '[run_codex_audit] error: missing dependency: sha256sum or shasum\n' >&2
294
+ exit 64
295
+ fi
296
+
297
+ # ---------------------------------------------------------------------------
298
+ # Input parsing
299
+ # ---------------------------------------------------------------------------
300
+ STAGE=""
301
+ AGENT=""
302
+ DELIVERABLE=""
303
+ SUPPORTING_CSV=""
304
+ ROUND=""
305
+ TARGET_ROUNDS="3"
306
+ PREV_FINDINGS=""
307
+ OUT_DIR="audit_artifacts"
308
+ BUNDLE_ID=""
309
+ DRY_RUN=false
310
+
311
+ # F-005 (§3.5): require_arg guards all value-taking flags so a missing operand
312
+ # (e.g. `--stage --agent foo`) exits EX_USAGE 64, not set -u unbound-variable
313
+ # exit 1. Checks $# >= 2 AND next token doesn't look like a flag (^--).
314
+ _require_arg() {
315
+ local flag="$1"
316
+ # $# here is the caller's argument count after its own shift operations.
317
+ # We receive $# from the while-loop via the special `shift` semantics below;
318
+ # instead test the second positional ($2) of the calling while iteration.
319
+ # Because this is called from within the case block, $2 is the while-loop's $2.
320
+ if [[ $# -lt 3 || "$3" =~ ^-- ]]; then
321
+ printf '[run_codex_audit] error: %s requires a value\n' "${flag}" >&2
322
+ exit 64
323
+ fi
324
+ }
325
+
326
+ while [[ $# -gt 0 ]]; do
327
+ case "$1" in
328
+ --stage)
329
+ if [[ $# -lt 2 || "$2" =~ ^-- ]]; then
330
+ printf '[run_codex_audit] error: --stage requires a value\n' >&2; exit 64
331
+ fi
332
+ STAGE="$2"; shift 2 ;;
333
+ --agent)
334
+ if [[ $# -lt 2 || "$2" =~ ^-- ]]; then
335
+ printf '[run_codex_audit] error: --agent requires a value\n' >&2; exit 64
336
+ fi
337
+ AGENT="$2"; shift 2 ;;
338
+ --deliverable)
339
+ if [[ $# -lt 2 || "$2" =~ ^-- ]]; then
340
+ printf '[run_codex_audit] error: --deliverable requires a value\n' >&2; exit 64
341
+ fi
342
+ DELIVERABLE="$2"; shift 2 ;;
343
+ --supporting)
344
+ if [[ $# -lt 2 || "$2" =~ ^-- ]]; then
345
+ printf '[run_codex_audit] error: --supporting requires a value\n' >&2; exit 64
346
+ fi
347
+ SUPPORTING_CSV="$2"; shift 2 ;;
348
+ --round)
349
+ if [[ $# -lt 2 || "$2" =~ ^-- ]]; then
350
+ printf '[run_codex_audit] error: --round requires a value\n' >&2; exit 64
351
+ fi
352
+ ROUND="$2"; shift 2 ;;
353
+ --target-rounds)
354
+ if [[ $# -lt 2 || "$2" =~ ^-- ]]; then
355
+ printf '[run_codex_audit] error: --target-rounds requires a value\n' >&2; exit 64
356
+ fi
357
+ TARGET_ROUNDS="$2"; shift 2 ;;
358
+ --previous-findings)
359
+ if [[ $# -lt 2 || "$2" =~ ^-- ]]; then
360
+ printf '[run_codex_audit] error: --previous-findings requires a value\n' >&2; exit 64
361
+ fi
362
+ PREV_FINDINGS="$2"; shift 2 ;;
363
+ --output-dir)
364
+ if [[ $# -lt 2 || "$2" =~ ^-- ]]; then
365
+ printf '[run_codex_audit] error: --output-dir requires a value\n' >&2; exit 64
366
+ fi
367
+ OUT_DIR="$2"; shift 2 ;;
368
+ --bundle-id)
369
+ if [[ $# -lt 2 || "$2" =~ ^-- ]]; then
370
+ printf '[run_codex_audit] error: --bundle-id requires a value\n' >&2; exit 64
371
+ fi
372
+ BUNDLE_ID="$2"; shift 2 ;;
373
+ --dry-run) DRY_RUN=true; shift ;;
374
+ # Explicitly reject flags from early drafts that are NOT part of §4.2
375
+ --bundle)
376
+ printf '[run_codex_audit] error: --bundle is not a valid flag (use --bundle-id); see spec §4.2\n' >&2
377
+ exit 64
378
+ ;;
379
+ --audit-template)
380
+ printf '[run_codex_audit] error: --audit-template is not a valid flag; see spec §4.2\n' >&2
381
+ exit 64
382
+ ;;
383
+ *)
384
+ printf '[run_codex_audit] error: unknown flag: %s\n' "$1" >&2
385
+ exit 64
386
+ ;;
387
+ esac
388
+ done
389
+
390
+ # ---------------------------------------------------------------------------
391
+ # Input validation (§4.2) — all failures → exit 64 EX_USAGE
392
+ # ---------------------------------------------------------------------------
393
+
394
+ # Required flags
395
+ for _flag_name in STAGE AGENT DELIVERABLE ROUND; do
396
+ _flag_val="${!_flag_name}"
397
+ if [[ -z "${_flag_val}" ]]; then
398
+ _flag_cli=$(printf '%s' "${_flag_name}" | tr 'A-Z_' 'a-z-')
399
+ printf '[run_codex_audit] error: --%s is required\n' "${_flag_cli}" >&2
400
+ exit 64
401
+ fi
402
+ done
403
+
404
+ # --stage: integer 1-6
405
+ if ! [[ "${STAGE}" =~ ^[1-6]$ ]]; then
406
+ printf '[run_codex_audit] error: --stage must be an integer 1-6 (got: %s)\n' "${STAGE}" >&2
407
+ exit 64
408
+ fi
409
+
410
+ # --agent: closed enum
411
+ case "${AGENT}" in
412
+ synthesis_agent|research_architect_agent|report_compiler_agent) ;;
413
+ *)
414
+ printf '[run_codex_audit] error: --agent must be one of synthesis_agent, research_architect_agent, report_compiler_agent (got: %s)\n' "${AGENT}" >&2
415
+ exit 64
416
+ ;;
417
+ esac
418
+
419
+ # --deliverable: must exist and be readable
420
+ if [[ ! -f "${DELIVERABLE}" || ! -r "${DELIVERABLE}" ]]; then
421
+ printf '[run_codex_audit] error: --deliverable not found or not readable: %s\n' "${DELIVERABLE}" >&2
422
+ exit 64
423
+ fi
424
+
425
+ # --round: integer >= 1
426
+ if ! [[ "${ROUND}" =~ ^[0-9]+$ ]] || [[ "${ROUND}" -lt 1 ]]; then
427
+ printf '[run_codex_audit] error: --round must be an integer >= 1 (got: %s)\n' "${ROUND}" >&2
428
+ exit 64
429
+ fi
430
+
431
+ # --target-rounds: integer >= 1
432
+ if ! [[ "${TARGET_ROUNDS}" =~ ^[0-9]+$ ]] || [[ "${TARGET_ROUNDS}" -lt 1 ]]; then
433
+ printf '[run_codex_audit] error: --target-rounds must be an integer >= 1 (got: %s)\n' "${TARGET_ROUNDS}" >&2
434
+ exit 64
435
+ fi
436
+
437
+ # --round <= --target-rounds (§3.7 A3)
438
+ if [[ "${ROUND}" -gt "${TARGET_ROUNDS}" ]]; then
439
+ printf '[run_codex_audit] error: --round (%s) must be <= --target-rounds (%s)\n' \
440
+ "${ROUND}" "${TARGET_ROUNDS}" >&2
441
+ exit 64
442
+ fi
443
+
444
+ # --previous-findings required when --round > 1 (audit template Section 4(a) violation)
445
+ if [[ "${ROUND}" -gt 1 && -z "${PREV_FINDINGS}" ]]; then
446
+ printf '[run_codex_audit] error: --previous-findings is required when --round > 1\n' >&2
447
+ exit 64
448
+ fi
449
+
450
+ if [[ -n "${PREV_FINDINGS}" && ! -f "${PREV_FINDINGS}" ]]; then
451
+ printf '[run_codex_audit] error: --previous-findings not found: %s\n' "${PREV_FINDINGS}" >&2
452
+ exit 64
453
+ fi
454
+
455
+ # --supporting: each path must exist
456
+ declare -a SUPPORTING=()
457
+ if [[ -n "${SUPPORTING_CSV}" ]]; then
458
+ IFS=',' read -ra SUPPORTING <<< "${SUPPORTING_CSV}"
459
+ for _sup_path in "${SUPPORTING[@]}"; do
460
+ if [[ ! -f "${_sup_path}" ]]; then
461
+ printf '[run_codex_audit] error: --supporting path not found: %s\n' "${_sup_path}" >&2
462
+ exit 64
463
+ fi
464
+ done
465
+ fi
466
+
467
+ # ---------------------------------------------------------------------------
468
+ # F-017 (§3.6): inject --previous-findings into SUPPORTING before snapshot.
469
+ # Multi-round audits depend on the previous-findings file as context input.
470
+ # If it is NOT included in the bundle manifest, it can mutate between snapshot
471
+ # and codex invocation without detection — codex audits against different
472
+ # findings than the manifest claims.
473
+ #
474
+ # Fix: treat --previous-findings as a mandatory supporting file for round > 1.
475
+ # Inject it into the SUPPORTING array here (dedup by path so a user who also
476
+ # listed it in --supporting does not see duplicate content in the prompt).
477
+ # This preserves the §3.6 manifest role enum (primary | supporting | template)
478
+ # without adding a fourth role.
479
+ #
480
+ # audit_snapshot.py reads PREV_FINDINGS as part of the supporting bundle, so
481
+ # its bytes are snapshotted alongside other supporting files and its SHA enters
482
+ # the manifest — no live cat call after snapshot phase.
483
+ # ---------------------------------------------------------------------------
484
+ if [[ -n "${PREV_FINDINGS}" ]]; then
485
+ _pf_already_in=0
486
+ for _s in "${SUPPORTING[@]+"${SUPPORTING[@]}"}"; do
487
+ if [[ "${_s}" = "${PREV_FINDINGS}" ]]; then
488
+ _pf_already_in=1
489
+ break
490
+ fi
491
+ done
492
+ if [[ "${_pf_already_in}" -eq 0 ]]; then
493
+ SUPPORTING+=("${PREV_FINDINGS}")
494
+ fi
495
+ fi
496
+
497
+ # Audit template path — constant per §3.4 schema constraint
498
+ readonly AUDIT_TEMPLATE_PATH="shared/templates/codex_audit_multifile_template.md"
499
+ if [[ ! -f "${AUDIT_TEMPLATE_PATH}" ]]; then
500
+ printf '[run_codex_audit] error: audit template not found: %s\n' "${AUDIT_TEMPLATE_PATH}" >&2
501
+ exit 64
502
+ fi
503
+
504
+ # ---------------------------------------------------------------------------
505
+ # F-016 (§3.1): Normalize and validate all path inputs BEFORE the dry-run
506
+ # early-exit check. Previously the _to_repo_relative + _validate_repo_relative
507
+ # calls came AFTER Step 0a, so --dry-run reported "inputs valid" even when
508
+ # an absolute or .. path would have failed EX_USAGE 64 on a real run.
509
+ # These calls are pure validation (no mkdir, no file writes), so reordering
510
+ # is safe and preserves the "dry-run is side-effect-free" invariant.
511
+ # ---------------------------------------------------------------------------
512
+ DELIVERABLE=$(_to_repo_relative "${DELIVERABLE}")
513
+ # F-006 (§3.1): validate deliverable and supporting paths satisfy repo_relative_path
514
+ # schema constraint (no leading /, no whitespace, no .. segments) AFTER normalization.
515
+ # Rejects /tmp/... or ../... paths that fail audit_artifact_entry schema validation.
516
+ _validate_repo_relative "${DELIVERABLE}" "--deliverable"
517
+ _norm_supporting=()
518
+ for _s in "${SUPPORTING[@]+"${SUPPORTING[@]}"}"; do
519
+ _norm_sup=$(_to_repo_relative "${_s}")
520
+ _validate_repo_relative "${_norm_sup}" "--supporting"
521
+ _norm_supporting+=("${_norm_sup}")
522
+ done
523
+ SUPPORTING=("${_norm_supporting[@]+"${_norm_supporting[@]}"}")
524
+ # Normalize PREV_FINDINGS to match the normalized SUPPORTING entries (F-017):
525
+ # audit_snapshot.py dedupes PREV_FINDINGS against SUPPORTING by path equality,
526
+ # so paths must agree after _to_repo_relative normalization or both will be
527
+ # snapshotted as separate entries.
528
+ if [[ -n "${PREV_FINDINGS}" ]]; then
529
+ PREV_FINDINGS=$(_to_repo_relative "${PREV_FINDINGS}")
530
+ fi
531
+ # F-014 (§3.1): validate --output-dir BEFORE mkdir -p to avoid creating a
532
+ # directory at an invalid path (absolute, .. traversal) before EX_USAGE 64 rejects it.
533
+ # "No side effects on input validation rejection" — mkdir must not fire first.
534
+ _validate_repo_relative "${OUT_DIR}" "--output-dir"
535
+
536
+ # ---------------------------------------------------------------------------
537
+ # Step 0a — dry-run early exit. §10 Phase 6.1 verification gate and §1.2
538
+ # threat model: writing artifacts at zero codex cost is Pattern C3 attack
539
+ # surface. --dry-run is input-validation only; nothing is written.
540
+ # (F-016: path validation runs above, before this check, so dry-run correctly
541
+ # rejects absolute/.. paths rather than reporting "inputs valid" for them.)
542
+ # ---------------------------------------------------------------------------
543
+ if [[ "${DRY_RUN}" = true ]]; then
544
+ printf '[run_codex_audit] dry-run: inputs valid; no files written\n'
545
+ exit 0
546
+ fi
547
+
548
+ # ---------------------------------------------------------------------------
549
+ # SIGTERM / SIGINT trap — F-059 closure.
550
+ # On termination: clean up partial artifacts (*.tmp + empty JSONL placeholder)
551
+ # and exit 75 (EX_TEMPFAIL). run_id may not be set yet when the trap fires,
552
+ # so we record it in a variable that the trap closure reads.
553
+ # ---------------------------------------------------------------------------
554
+ _CURRENT_RUN_ID=""
555
+ _OUT_DIR_FOR_TRAP=""
556
+
557
+ _cleanup_on_signal() {
558
+ local rid="${_CURRENT_RUN_ID}"
559
+ local odir="${_OUT_DIR_FOR_TRAP}"
560
+ if [[ -n "${rid}" && -n "${odir}" ]]; then
561
+ rm -f \
562
+ "${odir}/${rid}.jsonl" \
563
+ "${odir}/${rid}.meta.json" \
564
+ "${odir}/${rid}.meta.json.tmp" \
565
+ "${odir}/${rid}.verdict.yaml" \
566
+ "${odir}/${rid}.verdict.yaml.tmp" \
567
+ "${odir}/${rid}.audit_artifact_entry.json" \
568
+ "${odir}/${rid}.audit_artifact_entry.json.tmp" \
569
+ "${odir}/${rid}.stdout" \
570
+ "${odir}/${rid}.stderr" \
571
+ "${odir}/${rid}.manifest.txt" 2>/dev/null || true
572
+ fi
573
+ printf '[run_codex_audit] caught signal; cleaned up partial artifacts; exiting 75\n' >&2
574
+ exit 75
575
+ }
576
+
577
+ trap '_cleanup_on_signal' SIGTERM SIGINT
578
+
579
+ # F-010 (§3.6): EXIT trap removes partial .tmp artifacts left by any aborted
580
+ # _atomic_write call. Preserves final contract files (no .tmp suffix).
581
+ # Coexists with SIGTERM/SIGINT trap above — EXIT fires after signal handler exits.
582
+ _cleanup_partials_on_exit() {
583
+ if [[ -n "${run_id:-}" && -n "${OUT_DIR:-}" ]]; then
584
+ rm -f "${OUT_DIR}/${run_id}".*.tmp 2>/dev/null || true
585
+ fi
586
+ }
587
+ trap '_cleanup_partials_on_exit' EXIT
588
+
589
+ # ---------------------------------------------------------------------------
590
+ # Setup: run_id, output dir, codex version, git metadata
591
+ # ---------------------------------------------------------------------------
592
+ # Note: path normalization + validation (DELIVERABLE, SUPPORTING, OUT_DIR)
593
+ # was moved above Step 0a (F-016 fix) — paths are already normalized here.
594
+ run_id=$(_make_run_id)
595
+ _CURRENT_RUN_ID="${run_id}"
596
+
597
+ # F-010 (§3.6): normalize mkdir failure to EX_CANTCREAT 73.
598
+ # mkdir intentionally stays AFTER dry-run: dry-run must be side-effect-free.
599
+ if ! mkdir -p "${OUT_DIR}" 2>/dev/null; then
600
+ printf '[run_codex_audit] error: cannot create output dir: %s\n' "${OUT_DIR}" >&2
601
+ exit 73
602
+ fi
603
+ _OUT_DIR_FOR_TRAP="${OUT_DIR}"
604
+
605
+ CODEX_VERSION=$(_codex_version)
606
+ GIT_SHA=$(git rev-parse --short HEAD 2>/dev/null || printf 'unknown')
607
+ GIT_DIRTY=$(_git_dirty)
608
+ HOSTNAME_VAL=$(uname -n)
609
+ CWD_VAL=$(pwd)
610
+
611
+ # Primary deliverable array (always exactly one element)
612
+ declare -a PRIMARY=("${DELIVERABLE}")
613
+
614
+ # ---------------------------------------------------------------------------
615
+ # F-018 (§3.6): Reject binary/NUL inputs before snapshot.
616
+ # ---------------------------------------------------------------------------
617
+ # Step 0b — snapshot bundle (DELEGATED TO scripts/audit_snapshot.py).
618
+ #
619
+ # Round 5 architectural redesign: the Bash-side snapshot helper had three
620
+ # structural failures across rounds 1-5 of codex review:
621
+ #
622
+ # F-004 (5 rounds partial): Bash command substitution runs the helper in a
623
+ # subshell, so global SHA assignment didn't propagate to the parent.
624
+ # F-018 (Round 4 fix broke wrapper): grep -q $'\0' is empty pattern → all
625
+ # non-empty files rejected as binary.
626
+ # F-020 (trailing newline drift): $(cat file) strips \n; manifest SHA from
627
+ # in-memory content drifts from sha256sum(file) → Step 3a false-positive.
628
+ #
629
+ # All three are eliminated by moving byte-exact operations to Python:
630
+ # - Single read per file (no TOCTOU window)
631
+ # - Binary-safe NUL detection (b"\0" in content)
632
+ # - hashlib.sha256(file_bytes) matches sha256sum(file) exactly
633
+ #
634
+ # scripts/audit_snapshot.py snapshot mode:
635
+ # - Reads all bundle files as bytes (binary-safe)
636
+ # - Rejects NUL-containing files (exit 64)
637
+ # - Computes per-file SHA-256 + bundle manifest SHA from same bytes
638
+ # - Writes <run_id>.manifest.txt and <run_id>.prompt.txt
639
+ # - Emits JSON summary to stdout for the wrapper to consume
640
+ #
641
+ # Step 3a uses scripts/audit_snapshot.py verify mode against the same manifest;
642
+ # their SHAs match exactly (no trailing-newline drift).
643
+ # ---------------------------------------------------------------------------
644
+
645
+ # F-021 (§3.6) closure: dedup --previous-findings against SUPPORTING after
646
+ # normalization (which the wrapper does upstream). audit_snapshot.py also
647
+ # dedupes internally; doing it here too prevents the manifest from listing
648
+ # the same file under both --supporting and --previous-findings paths.
649
+ if [[ -n "${PREV_FINDINGS}" ]]; then
650
+ _already_in_supporting=0
651
+ for _s in "${SUPPORTING[@]+"${SUPPORTING[@]}"}"; do
652
+ if [[ "${_s}" = "${PREV_FINDINGS}" ]]; then
653
+ _already_in_supporting=1
654
+ break
655
+ fi
656
+ done
657
+ if [[ "${_already_in_supporting}" -eq 0 ]]; then
658
+ SUPPORTING+=("${PREV_FINDINGS}")
659
+ fi
660
+ fi
661
+
662
+ # Build snapshot CLI args (--primary repeated, --supporting repeated)
663
+ _snap_args=()
664
+ for _p in "${PRIMARY[@]}"; do
665
+ _snap_args+=("--primary" "${_p}")
666
+ done
667
+ for _s in "${SUPPORTING[@]+"${SUPPORTING[@]}"}"; do
668
+ _snap_args+=("--supporting" "${_s}")
669
+ done
670
+
671
+ # Run snapshot helper. Capture JSON summary on stdout, errors on stderr.
672
+ SNAPSHOT_JSON_FILE="${OUT_DIR}/${run_id}.snapshot.tmp"
673
+ SNAPSHOT_STDERR_FILE="${OUT_DIR}/${run_id}.snapshot_stderr.tmp"
674
+ set +e
675
+ _prev_findings_arg=()
676
+ if [[ -n "${PREV_FINDINGS}" ]]; then
677
+ _prev_findings_arg=(--previous-findings "${PREV_FINDINGS}")
678
+ fi
679
+
680
+ python3 scripts/audit_snapshot.py snapshot \
681
+ "${_snap_args[@]}" \
682
+ "${_prev_findings_arg[@]+"${_prev_findings_arg[@]}"}" \
683
+ --audit-template "${AUDIT_TEMPLATE_PATH}" \
684
+ --output-dir "${OUT_DIR}" \
685
+ --run-id "${run_id}" \
686
+ --round "${ROUND}" \
687
+ --target-rounds "${TARGET_ROUNDS}" \
688
+ --git-sha "${GIT_SHA}" \
689
+ --stage "${STAGE}" \
690
+ --agent "${AGENT}" \
691
+ > "${SNAPSHOT_JSON_FILE}" \
692
+ 2> "${SNAPSHOT_STDERR_FILE}"
693
+ SNAPSHOT_EXIT=$?
694
+ set -e
695
+
696
+ if [[ "${SNAPSHOT_EXIT}" -ne 0 ]]; then
697
+ # Forward Python error to user. exit 64 (NUL detection / bad args) propagates;
698
+ # exit 2 (file not found / OSError) we surface as exit 73 (EX_CANTCREAT).
699
+ cat "${SNAPSHOT_STDERR_FILE}" >&2
700
+ rm -f "${SNAPSHOT_JSON_FILE}" "${SNAPSHOT_STDERR_FILE}"
701
+ case "${SNAPSHOT_EXIT}" in
702
+ 64) exit 64 ;;
703
+ 2) exit 73 ;;
704
+ *) exit "${SNAPSHOT_EXIT}" ;;
705
+ esac
706
+ fi
707
+
708
+ # Parse JSON summary into Bash variables. Use python3 for reliable JSON access
709
+ # (jq might not be present; we already require python3 in §4.1 dependency table).
710
+ BUNDLE_MANIFEST_SHA=$(python3 -c "
711
+ import json, sys
712
+ d = json.load(open(sys.argv[1]))
713
+ print(d['manifest_sha'])
714
+ " "${SNAPSHOT_JSON_FILE}")
715
+
716
+ AUDIT_TEMPLATE_SHA_PRE=$(python3 -c "
717
+ import json, sys
718
+ d = json.load(open(sys.argv[1]))
719
+ print(d['audit_template_sha'])
720
+ " "${SNAPSHOT_JSON_FILE}")
721
+
722
+ SHA_DELIVERABLE=$(python3 -c "
723
+ import json, sys
724
+ d = json.load(open(sys.argv[1]))
725
+ print(d['primary_files'][0]['sha'])
726
+ " "${SNAPSHOT_JSON_FILE}")
727
+
728
+ SNAPSHOT_PROMPT_PATH="${OUT_DIR}/${run_id}.prompt.txt"
729
+ SNAPSHOT_MANIFEST_PATH="${OUT_DIR}/${run_id}.manifest.txt"
730
+
731
+ # Clean up temp files (manifest.txt and prompt.txt remain — they're contract artifacts)
732
+ rm -f "${SNAPSHOT_STDERR_FILE}"
733
+ # Keep SNAPSHOT_JSON_FILE for sidecar emission (need to enumerate primary/supporting).
734
+
735
+ # Initialize mutation state. Step 3a (post-codex SHA recompute) may set these.
736
+ # Declaring here ensures BUNDLE_MUTATION_FILES is always an array.
737
+ BUNDLE_MUTATION_DETECTED=0
738
+ declare -a BUNDLE_MUTATION_FILES=()
739
+
740
+ # ---------------------------------------------------------------------------
741
+ # Step 1 — prompt rendered by audit_snapshot.py (Step 0b above) into
742
+ # <run_id>.prompt.txt. The Bash wrapper feeds it to codex stdin via shell
743
+ # redirection in Step 2b. No template-rendering logic in Bash anymore — that
744
+ # moved to Python alongside the byte-exact snapshot, so the prompt embeds
745
+ # exactly the snapshotted bytes (no trailing-newline drift, no second cat).
746
+ # ---------------------------------------------------------------------------
747
+
748
+ # ---------------------------------------------------------------------------
749
+ # Step 0c — REMOVED in Round 5 architecture.
750
+ # Bash-side TOCTOU defenses (Steps 0b/0c partial across rounds 1-5) are gone.
751
+ # audit_snapshot.py reads each file ONCE and computes both SHA and prompt bytes
752
+ # from the same read — there is no second-read window to defend against.
753
+ # Step 3a (post-codex) still detects post-snapshot disk mutations.
754
+ # ---------------------------------------------------------------------------
755
+ PRE_CODEX_MUTATION_DETECTED=0 # no pre-codex check needed; kept for Step 2b gate
756
+
757
+ # ---------------------------------------------------------------------------
758
+ # Step 2a — pre-touch empty JSONL placeholder (F-059 closure).
759
+ # This ensures the file exists at its final path even if codex is killed before
760
+ # emitting any output. AUDIT_FAILED verdict referencing an empty JSONL is
761
+ # handled correctly by §5.6 Path B5 short-circuit without Layer 2 validation.
762
+ #
763
+ # F-010 (§3.6): guard the pre-touch; a failure here (permissions, disk full)
764
+ # means the JSONL path would never be created, breaking the artifact invariant
765
+ # E8. Exit 73 (EX_CANTCREAT) to signal the output directory is unusable.
766
+ # ---------------------------------------------------------------------------
767
+ if ! : > "${OUT_DIR}/${run_id}.jsonl" 2>/dev/null; then
768
+ printf '[run_codex_audit] error: cannot create jsonl placeholder: %s\n' \
769
+ "${OUT_DIR}/${run_id}.jsonl" >&2
770
+ exit 73
771
+ fi
772
+
773
+ # ---------------------------------------------------------------------------
774
+ # Step 2b — invoke codex CLI.
775
+ #
776
+ # Skipped when PRE_CODEX_MUTATION_DETECTED=1 (Step 0c, F-004): bundle was
777
+ # mutated between SHA snapshot and prompt render; no codex invocation needed
778
+ # since BUNDLE_MUTATION_DETECTED is already set and Step 4 will emit AUDIT_FAILED.
779
+ #
780
+ # We use a real pipeline + ${PIPESTATUS[@]}, NOT process substitution
781
+ # `> >(tee ...)`, because:
782
+ # 1. Process substitution hides tee's exit status (wrapper never knows if
783
+ # tee failed — disk full / EIO would silently corrupt the JSONL artifact).
784
+ # 2. Process substitution races on draining: orchestrator can read the JSONL
785
+ # before the tee subshell flushes.
786
+ # 3. PIPESTATUS captures both codex exit (pipe[0]) AND tee exit (pipe[1]).
787
+ #
788
+ # `set +e` is required because pipefail would abort on codex's non-zero exit
789
+ # before ${PIPESTATUS[@]} is captured. We re-enable after capture.
790
+ #
791
+ # This is `codex exec`, not `codex exec resume` — every audit run starts a
792
+ # fresh thread; the wrapper never resumes a prior thread.
793
+ # ---------------------------------------------------------------------------
794
+ STARTED_AT=$(_now_rfc3339_ms)
795
+ CODEX_EXIT=0
796
+ TEE_EXIT=0
797
+
798
+ if [[ "${PRE_CODEX_MUTATION_DETECTED}" -eq 0 ]]; then
799
+ set +e
800
+ codex exec \
801
+ -m gpt-5.5 \
802
+ -c 'model_reasoning_effort="xhigh"' \
803
+ --json \
804
+ - \
805
+ 2> "${OUT_DIR}/${run_id}.stderr" \
806
+ < "${SNAPSHOT_PROMPT_PATH}" \
807
+ | tee "${OUT_DIR}/${run_id}.stdout" > "${OUT_DIR}/${run_id}.jsonl"
808
+ pipe=("${PIPESTATUS[@]}")
809
+ CODEX_EXIT="${pipe[0]}"
810
+ TEE_EXIT="${pipe[1]}"
811
+ set -e
812
+ fi
813
+
814
+ ENDED_AT=$(_now_rfc3339_ms)
815
+
816
+ # tee write failure → EX_CANTCREAT (73): JSONL integrity not guaranteed.
817
+ # Clean up all partial artifacts so orchestrator never sees a sidecar/verdict/
818
+ # proposal pointing at a corrupt JSONL.
819
+ if [[ "${TEE_EXIT}" -ne 0 ]]; then
820
+ rm -f \
821
+ "${OUT_DIR}/${run_id}.jsonl" \
822
+ "${OUT_DIR}/${run_id}.stdout" \
823
+ "${OUT_DIR}/${run_id}.stderr" \
824
+ "${OUT_DIR}/${run_id}.manifest.txt" 2>/dev/null || true
825
+ printf '[run_codex_audit] error: tee write failed (exit %s); JSONL artifact may be corrupt\n' \
826
+ "${TEE_EXIT}" >&2
827
+ exit 73
828
+ fi
829
+
830
+ # ---------------------------------------------------------------------------
831
+ # Step 3a — detect post-snapshot disk mutation via audit_snapshot.py verify.
832
+ # Compares each manifest entry's recorded SHA against current file content.
833
+ # Round 5 redesign: byte-exact comparison via Python (hashlib reads disk bytes
834
+ # verbatim), so manifest SHA and recompute SHA agree on trailing-newline
835
+ # semantics — F-020 false-positive (Bash strips \n, sha256sum doesn't) is gone.
836
+ #
837
+ # Output: list of mutated paths to stdout (one per line) on exit 1; empty
838
+ # stdout on exit 0 (no mutation).
839
+ # ---------------------------------------------------------------------------
840
+ VERIFY_OUT_FILE="${OUT_DIR}/${run_id}.verify_stdout.tmp"
841
+ set +e
842
+ python3 scripts/audit_snapshot.py verify \
843
+ --manifest "${SNAPSHOT_MANIFEST_PATH}" \
844
+ > "${VERIFY_OUT_FILE}" \
845
+ 2>/dev/null
846
+ VERIFY_EXIT=$?
847
+ set -e
848
+
849
+ if [[ "${VERIFY_EXIT}" -eq 1 ]]; then
850
+ # Mutation detected — read mutated paths from stdout.
851
+ while IFS= read -r _mutated_path; do
852
+ if [[ -n "${_mutated_path}" ]]; then
853
+ BUNDLE_MUTATION_DETECTED=1
854
+ BUNDLE_MUTATION_FILES+=("${_mutated_path}")
855
+ fi
856
+ done < "${VERIFY_OUT_FILE}"
857
+ elif [[ "${VERIFY_EXIT}" -ne 0 ]]; then
858
+ # F-024 (P2, R6): verify internal error must NOT pass through to PASS/MINOR/MATERIAL.
859
+ # If we cannot run the post-snapshot freshness check, treat the audit as
860
+ # AUDIT_FAILED — orchestrator must not assume "no mutation" from "verify
861
+ # could not run". §4.6 contract: AUDIT_FAILED proposal blocks transition.
862
+ BUNDLE_MUTATION_DETECTED=1
863
+ BUNDLE_MUTATION_FILES+=("(audit_snapshot.py verify failed: exit ${VERIFY_EXIT})")
864
+ printf '[run_codex_audit] error: audit_snapshot verify failed (exit %s); forcing AUDIT_FAILED\n' "${VERIFY_EXIT}" >&2
865
+ fi
866
+ rm -f "${VERIFY_OUT_FILE}"
867
+
868
+ # Step 3b: bundle_manifest_sha stays pinned to the PRE-codex value (Step 0b).
869
+ # The orchestrator's L3-4 check compares current-state SHAs against the
870
+ # manifest written at audit time — updating it post-mutation would silently
871
+ # accept a stale audit.
872
+
873
+ # ---------------------------------------------------------------------------
874
+ # Step 3c — write sidecar (atomic). §3.4 / §4.3.
875
+ # All timestamps, versions, and bundle context captured here for Layer 3
876
+ # anti-fake-audit evidence.
877
+ # ---------------------------------------------------------------------------
878
+ DURATION_S=$(_duration_seconds "${STARTED_AT}" "${ENDED_AT}")
879
+ JSONL_THREAD_ID=$(_extract_jsonl_thread_id "${OUT_DIR}/${run_id}.jsonl")
880
+
881
+ # Build JSON arrays for primary and supporting deliverables.
882
+ # Sources from the SNAPSHOT_JSON_FILE (audit_snapshot.py output) — same shape
883
+ # the schema requires: [{path, sha}, ...].
884
+ _primary_deliverables_json() {
885
+ python3 -c "
886
+ import json, sys
887
+ d = json.load(open(sys.argv[1]))
888
+ print(json.dumps([{'path': f['path'], 'sha': f['sha']} for f in d['primary_files']]))
889
+ " "${SNAPSHOT_JSON_FILE}"
890
+ }
891
+
892
+ _supporting_context_json() {
893
+ python3 -c "
894
+ import json, sys
895
+ d = json.load(open(sys.argv[1]))
896
+ print(json.dumps([{'path': f['path'], 'sha': f['sha']} for f in d['supporting_files']]))
897
+ " "${SNAPSHOT_JSON_FILE}"
898
+ }
899
+
900
+ # stdout_path and stderr_path: repo-relative POSIX paths (no leading /, no ..)
901
+ # OUT_DIR may be absolute or relative; we normalise to repo-relative by
902
+ # stripping the CWD prefix if it matches, or using as-is if already relative.
903
+ _repo_relative_out_path() {
904
+ local full="${OUT_DIR}/${run_id}.${1}"
905
+ # If OUT_DIR starts with /, attempt to strip CWD prefix
906
+ if [[ "${full}" == /* ]]; then
907
+ local cwd_prefix="${CWD_VAL}/"
908
+ full="${full#"${cwd_prefix}"}"
909
+ fi
910
+ # Remove leading ./ if present
911
+ full="${full#./}"
912
+ printf '%s' "${full}"
913
+ }
914
+
915
+ STDOUT_PATH=$(_repo_relative_out_path "stdout")
916
+ STDERR_PATH=$(_repo_relative_out_path "stderr")
917
+
918
+ # Optional bundle_id field in sidecar
919
+ _bundle_id_sidecar_field=""
920
+ if [[ -n "${BUNDLE_ID}" ]]; then
921
+ _bundle_id_sidecar_field="\"bundle_id\":$(_json_escape "${BUNDLE_ID}"),"
922
+ fi
923
+
924
+ _sidecar_json() {
925
+ cat <<EOF
926
+ {
927
+ "run_id": $(_json_escape "${run_id}"),
928
+ "codex_cli_version": $(_json_escape "${CODEX_VERSION}"),
929
+ "runner": {
930
+ "hostname": $(_json_escape "${HOSTNAME_VAL}"),
931
+ "cwd": $(_json_escape "${CWD_VAL}"),
932
+ "git_sha": $(_json_escape "${GIT_SHA}"),
933
+ "git_dirty": ${GIT_DIRTY}
934
+ },
935
+ "timing": {
936
+ "started_at": $(_json_escape "${STARTED_AT}"),
937
+ "ended_at": $(_json_escape "${ENDED_AT}"),
938
+ "duration_seconds": ${DURATION_S}
939
+ },
940
+ "process": {
941
+ "exit_code": ${CODEX_EXIT},
942
+ "stdout_path": $(_json_escape "${STDOUT_PATH}"),
943
+ "stderr_path": $(_json_escape "${STDERR_PATH}")
944
+ },
945
+ "stream": {
946
+ "jsonl_thread_id": $(_json_escape "${JSONL_THREAD_ID}")
947
+ },
948
+ "prompt": {
949
+ "audit_template_path": $(_json_escape "${AUDIT_TEMPLATE_PATH}"),
950
+ "audit_template_sha": $(_json_escape "${AUDIT_TEMPLATE_SHA_PRE}"),
951
+ "bundle": {
952
+ ${_bundle_id_sidecar_field}
953
+ "bundle_manifest_sha": $(_json_escape "${BUNDLE_MANIFEST_SHA}"),
954
+ "primary_deliverables": $(_primary_deliverables_json),
955
+ "supporting_context": $(_supporting_context_json)
956
+ }
957
+ }
958
+ }
959
+ EOF
960
+ }
961
+
962
+ _sidecar_json | _atomic_write "${OUT_DIR}/${run_id}.meta.json"
963
+
964
+ # ---------------------------------------------------------------------------
965
+ # Step 4 — produce verdict file.
966
+ # Three triggers force the AUDIT_FAILED branch:
967
+ # (a) codex exited non-zero
968
+ # (b) parse_audit_verdict.py --probe rejects the JSONL
969
+ # (c) bundle mutation detected in Step 3a
970
+ # wrapper_exit_code starts as codex's actual exit; AUDIT_FAILED path may
971
+ # raise it to 70 when codex itself exited 0 (cases b and c).
972
+ # ---------------------------------------------------------------------------
973
+ WRAPPER_EXIT_CODE="${CODEX_EXIT}"
974
+
975
+ # _truncate_failure_reason <string>
976
+ # F-008 (§3.1): failure_reason maxLength is 500 per audit_verdict.schema.json,
977
+ # and the schema regex rejects multi-line strings (^[^\n\r]+$). Truncate to 497
978
+ # chars with ellipsis and strip embedded newlines/carriage-returns.
979
+ _truncate_failure_reason() {
980
+ local s="$1"
981
+ # Strip newlines/CRs — schema regex ^[^\n\r]+$ rejects multi-line values
982
+ s=$(printf '%s' "${s}" | tr -d '\n\r')
983
+ if [[ "${#s}" -gt 500 ]]; then
984
+ printf '%s...' "${s:0:497}"
985
+ else
986
+ printf '%s' "${s}"
987
+ fi
988
+ }
989
+
990
+ # Helper: synthesize a failure reason from codex exit code + stderr tail
991
+ _synthesize_failure_reason() {
992
+ local exit_code="$1"
993
+ local stderr_path="$2"
994
+ local tail_msg=""
995
+ if [[ -s "${stderr_path}" ]]; then
996
+ # Take last non-empty line as context
997
+ tail_msg=$(grep -v '^[[:space:]]*$' "${stderr_path}" 2>/dev/null | tail -1 || true)
998
+ fi
999
+ local reason=""
1000
+ if [[ -n "${tail_msg}" ]]; then
1001
+ reason=$(printf 'codex exit %s: %s' "${exit_code}" "${tail_msg}")
1002
+ else
1003
+ reason=$(printf 'codex exit %s' "${exit_code}")
1004
+ fi
1005
+ # F-008: apply truncation and newline-strip before returning
1006
+ _truncate_failure_reason "${reason}"
1007
+ }
1008
+
1009
+ # Helper: emit an AUDIT_FAILED verdict YAML.
1010
+ # Reuses ENDED_AT (already captured post-codex) for generated_at to avoid a
1011
+ # second python3 fork purely for timestamp generation.
1012
+ _emit_audit_failed_verdict() {
1013
+ local failure_reason="$1"
1014
+ cat <<EOF
1015
+ run_id: $(_yaml_escape_oneline "${run_id}")
1016
+ verdict_status: AUDIT_FAILED
1017
+ round: ${ROUND}
1018
+ target_rounds: ${TARGET_ROUNDS}
1019
+ finding_counts:
1020
+ p1: 0
1021
+ p2: 0
1022
+ p3: 0
1023
+ findings: []
1024
+ failure_reason: $(_yaml_escape_oneline "${failure_reason}")
1025
+ generated_at: $(_yaml_escape_oneline "${ENDED_AT}")
1026
+ generated_by: 'scripts/run_codex_audit.sh'
1027
+ generator_version: '1.0.0'
1028
+ EOF
1029
+ }
1030
+
1031
+ # Helper: parse finding_counts from verdict YAML emitted by parse_audit_verdict.py
1032
+ _parse_verdict_counts_from_yaml() {
1033
+ local verdict_path="$1"
1034
+ python3 -c "
1035
+ import sys, re
1036
+
1037
+ content = open(sys.argv[1]).read()
1038
+
1039
+ def extract_int(key, text):
1040
+ m = re.search(r'^\s*' + key + r'\s*:\s*(\d+)', text, re.MULTILINE)
1041
+ return int(m.group(1)) if m else 0
1042
+
1043
+ p1 = extract_int('p1', content)
1044
+ p2 = extract_int('p2', content)
1045
+ p3 = extract_int('p3', content)
1046
+
1047
+ # Extract verdict_status
1048
+ sm = re.search(r'^\s*verdict_status\s*:\s*(\S+)', content, re.MULTILINE)
1049
+ status = sm.group(1).strip(\"'\") if sm else 'AUDIT_FAILED'
1050
+
1051
+ print('{} {} {} {}'.format(status, p1, p2, p3))
1052
+ " "${verdict_path}"
1053
+ }
1054
+
1055
+ AUDIT_FAILED_REASON=""
1056
+
1057
+ # F-007 (§3.6): capture probe stderr explicitly so the actual parser rejection
1058
+ # reason (e.g. "no agent_message in stream", "stream contains error event") is
1059
+ # preserved in AUDIT_FAILED_REASON rather than a hardcoded fallback string.
1060
+ _probe_stderr=""
1061
+ _probe_exit=0
1062
+ _probe_stderr=$(python3 scripts/parse_audit_verdict.py \
1063
+ --probe "${OUT_DIR}/${run_id}.jsonl" 2>&1 >/dev/null) \
1064
+ || _probe_exit=$?
1065
+
1066
+ if [[ "${CODEX_EXIT}" -eq 0 ]] \
1067
+ && [[ "${BUNDLE_MUTATION_DETECTED}" -eq 0 ]] \
1068
+ && [[ "${_probe_exit}" -eq 0 ]]; then
1069
+ # Clean path: codex exited 0, bundle stable, JSONL probe passed.
1070
+ # F-003 (§3.6): capture full parser stdout/stderr/exit BEFORE piping to
1071
+ # _atomic_write. If full parse fails after probe passed (cross-validation
1072
+ # disagreement, malformed finding entry, etc.), fall through to AUDIT_FAILED
1073
+ # rather than writing a partial verdict.yaml.tmp and aborting mid-rename.
1074
+ _verdict_yaml_content=""
1075
+ # F-010 (§3.6) Round 3: eliminate mktemp dependency — use a deterministic path
1076
+ # under OUT_DIR so the file is (a) always writable when OUT_DIR is writable and
1077
+ # (b) cleaned up automatically by the EXIT trap (_cleanup_partials_on_exit removes
1078
+ # "${OUT_DIR}/${run_id}".*.tmp). Round 2 used mktemp /tmp/... which could fail
1079
+ # with EX_CANTCREAT 73 when /tmp is full or permission-denied, aborting the wrapper
1080
+ # before AUDIT_FAILED artifacts are written — violating §4.6 invariant E8.
1081
+ _full_parse_stderr_file="${OUT_DIR}/${run_id}.parse_stderr.tmp"
1082
+ if _verdict_yaml_content=$(python3 scripts/parse_audit_verdict.py \
1083
+ --jsonl "${OUT_DIR}/${run_id}.jsonl" \
1084
+ --round "${ROUND}" \
1085
+ --target-rounds "${TARGET_ROUNDS}" \
1086
+ 2>"${_full_parse_stderr_file}"); then
1087
+ printf '%s' "${_verdict_yaml_content}" | _atomic_write "${OUT_DIR}/${run_id}.verdict.yaml"
1088
+ rm -f "${_full_parse_stderr_file}"
1089
+ else
1090
+ _full_parse_stderr=$(cat "${_full_parse_stderr_file}" 2>/dev/null || true)
1091
+ rm -f "${_full_parse_stderr_file}"
1092
+ # F-003: full parse failed after probe passed — fall through to AUDIT_FAILED
1093
+ # so proposal entry is still written (invariant E8) and orchestrator sees a
1094
+ # complete artifact set instead of a missing verdict. F-008 truncation applied.
1095
+ AUDIT_FAILED_REASON=$(_truncate_failure_reason \
1096
+ "JSONL parse error: ${_full_parse_stderr:-full parse failed after probe passed}")
1097
+ _emit_audit_failed_verdict "${AUDIT_FAILED_REASON}" \
1098
+ | _atomic_write "${OUT_DIR}/${run_id}.verdict.yaml"
1099
+ if [[ "${WRAPPER_EXIT_CODE}" -eq 0 ]]; then
1100
+ WRAPPER_EXIT_CODE=70
1101
+ fi
1102
+ fi
1103
+ else
1104
+ # AUDIT_FAILED path: determine failure reason
1105
+ if [[ "${BUNDLE_MUTATION_DETECTED}" -eq 1 ]]; then
1106
+ AUDIT_FAILED_REASON=$(_truncate_failure_reason \
1107
+ "bundle file(s) mutated during audit run: ${BUNDLE_MUTATION_FILES[*]}")
1108
+ elif [[ "${CODEX_EXIT}" -ne 0 ]]; then
1109
+ AUDIT_FAILED_REASON=$(_synthesize_failure_reason \
1110
+ "${CODEX_EXIT}" "${OUT_DIR}/${run_id}.stderr")
1111
+ else
1112
+ # F-007: codex exit 0 but --probe rejected the JSONL — use captured stderr
1113
+ # for the actual rejection message rather than a hardcoded fallback string.
1114
+ AUDIT_FAILED_REASON=$(_truncate_failure_reason \
1115
+ "JSONL parse error: ${_probe_stderr:-no parseable agent_message found in JSONL stream}")
1116
+ fi
1117
+
1118
+ _emit_audit_failed_verdict "${AUDIT_FAILED_REASON}" \
1119
+ | _atomic_write "${OUT_DIR}/${run_id}.verdict.yaml"
1120
+
1121
+ # When codex exited 0 but wrapper rejects (cases b and c), raise to 70
1122
+ # so wrapper's process exit always agrees with the AUDIT_FAILED verdict
1123
+ # it just wrote (§4.6 contract: exit 0 ↔ PASS/MINOR/MATERIAL only).
1124
+ if [[ "${WRAPPER_EXIT_CODE}" -eq 0 ]]; then
1125
+ WRAPPER_EXIT_CODE=70
1126
+ fi
1127
+ fi
1128
+
1129
+ # ---------------------------------------------------------------------------
1130
+ # Step 5 — emit proposal entry (LAST write per invariant E8).
1131
+ # Verdict block mirrors the verdict.yaml just written.
1132
+ # verified_at and verified_by are NOT set — orchestrator fills them at merge.
1133
+ # Proposal entries carrying these fields are rejected at §5.6 Path B4
1134
+ # as Pattern C3 attack surface.
1135
+ # ---------------------------------------------------------------------------
1136
+
1137
+ # Read back the verdict status and finding counts from the just-written YAML
1138
+ _verdict_info=$(_parse_verdict_counts_from_yaml "${OUT_DIR}/${run_id}.verdict.yaml")
1139
+ read -r VERDICT_STATUS P1_COUNT P2_COUNT P3_COUNT <<< "${_verdict_info}"
1140
+
1141
+ _optional_bundle_id_entry_field=""
1142
+ if [[ -n "${BUNDLE_ID}" ]]; then
1143
+ _optional_bundle_id_entry_field="\"bundle_id\":$(_json_escape "${BUNDLE_ID}"),"
1144
+ fi
1145
+
1146
+ _optional_failure_reason_field=""
1147
+ if [[ "${VERDICT_STATUS}" = "AUDIT_FAILED" ]]; then
1148
+ _optional_failure_reason_field="\"failure_reason\":$(_json_escape "${AUDIT_FAILED_REASON}"),"
1149
+ fi
1150
+
1151
+ _proposal_entry_json() {
1152
+ cat <<EOF
1153
+ {
1154
+ "stage": ${STAGE},
1155
+ "agent": $(_json_escape "${AGENT}"),
1156
+ "deliverable_path": $(_json_escape "${DELIVERABLE}"),
1157
+ "deliverable_sha": $(_json_escape "${SHA_DELIVERABLE}"),
1158
+ "run_id": $(_json_escape "${run_id}"),
1159
+ ${_optional_bundle_id_entry_field}
1160
+ "bundle_manifest_sha": $(_json_escape "${BUNDLE_MANIFEST_SHA}"),
1161
+ "artifact_paths": {
1162
+ "jsonl": $(_json_escape "$(_repo_relative_out_path "jsonl")"),
1163
+ "sidecar": $(_json_escape "$(_repo_relative_out_path "meta.json")"),
1164
+ "verdict": $(_json_escape "$(_repo_relative_out_path "verdict.yaml")")
1165
+ },
1166
+ "verdict": {
1167
+ "status": $(_json_escape "${VERDICT_STATUS}"),
1168
+ ${_optional_failure_reason_field}
1169
+ "round": ${ROUND},
1170
+ "target_rounds": ${TARGET_ROUNDS},
1171
+ "finding_counts": {
1172
+ "p1": ${P1_COUNT},
1173
+ "p2": ${P2_COUNT},
1174
+ "p3": ${P3_COUNT}
1175
+ }
1176
+ }
1177
+ }
1178
+ EOF
1179
+ }
1180
+
1181
+ _proposal_entry_json | _atomic_write "${OUT_DIR}/${run_id}.audit_artifact_entry.json"
1182
+
1183
+ # ---------------------------------------------------------------------------
1184
+ # Step 6 — exit with wrapper_exit_code (§4.6 contract).
1185
+ # Orchestrator also reads proposal entry's verdict.status; the two signals
1186
+ # are independently consumed. A zero exit iff PASS/MINOR/MATERIAL.
1187
+ # ---------------------------------------------------------------------------
1188
+ printf '[run_codex_audit] run_id=%s verdict=%s exit=%s\n' \
1189
+ "${run_id}" "${VERDICT_STATUS}" "${WRAPPER_EXIT_CODE}" >&2
1190
+
1191
+ [[ "${WRAPPER_EXIT_CODE}" -eq 0 ]] && exit 0 || exit "${WRAPPER_EXIT_CODE}"