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,941 @@
1
+ #!/usr/bin/env python3
2
+ """ARS v3.7.1 byte-equivalence SHA gate + Step 3a Two-Layer Citation Emission invariants.
3
+
4
+ Spec: docs/design/2026-04-30-ars-v3.6.8-trust-provenance-and-drift-transparency-spec.md
5
+ § Step 0 — Lint manifest separation (round-1 codex F-004 amend)
6
+ § Step 3a — Two-Layer Citation Emission (uniform across all modes)
7
+
8
+ Two layers of enforcement:
9
+
10
+ 1. v3.6.7 boundary SHA gate (Step 0): byte-equivalence on v3.6.7-tagged
11
+ PATTERN PROTECTION blocks listed in scripts/v3_6_7_inversion_manifest.json.
12
+ 2. v3.6.8 Step 3a invariants on the "Two-Layer Citation Emission (v3.7.1)"
13
+ prompt block in each agent listed in scripts/v3_6_8_inversion_manifest.json:
14
+ (i) the block specifies the two-layer citation form using a literal
15
+ `<!--ref:` HTML-comment marker AND `<author-year>` visible-form prose
16
+ (ii) the block does NOT mention "finalizer", "orchestrator", or "stage gate"
17
+ (strict partial-inversion: agent must not know about resolver layers)
18
+ (iii) the block does NOT instruct the agent to read frontmatter
19
+
20
+ Boundary rule (per spec):
21
+ - v3.7.1 work does NOT modify the v3.6.7-tagged PATTERN PROTECTION blocks in
22
+ synthesis_agent.md / research_architect_agent.md / report_compiler_agent.md.
23
+ - v3.7.1 MAY add new prompt sections (e.g. "Two-Layer Citation Emission")
24
+ OUTSIDE those v3.6.7-tagged blocks; those v3.6.8-tagged invariants ride
25
+ this script's own manifest (scripts/v3_6_8_inversion_manifest.json).
26
+
27
+ Single source of truth (round-4 R4-002 + round-5 R5-001 + round-6 R6-002):
28
+ - The v3.6.7 frozen manifest at scripts/v3_6_7_inversion_manifest.json is the
29
+ single source of truth for the protected file LIST.
30
+ - The v3.6.7 protected CONTENT is whatever the v3.6.7-tagged block shows at
31
+ the v3.6.7 manifest's most recent modifying commit (derived via
32
+ `git log -1 --format=%H scripts/v3_6_7_inversion_manifest.json`).
33
+ - v3.7.1 lint computes SHA on demand at runtime: hash(block at PR HEAD) ==
34
+ hash(block at v3.6.7 base commit). No stored expected SHAs; no dual truth.
35
+
36
+ Shallow-clone safety (round-6 R6-002 + round-7 R7-001):
37
+ - `actions/checkout@v4` defaults to fetch-depth: 1 in CI; that would render
38
+ `git log -1` vacuous. This lint detects shallow clones and either fetches
39
+ --unshallow against the default branch or hard-fails with a fix-it message.
40
+
41
+ Exit codes: 0 on pass, 1 on any failure (including shallow-clone refusal).
42
+ """
43
+
44
+ from __future__ import annotations
45
+
46
+ import hashlib
47
+ import json
48
+ import os
49
+ import re
50
+ import subprocess
51
+ import sys
52
+ from pathlib import Path
53
+
54
+ # Reuse v3.6.7 lint's heading-based block extractor for byte-equivalence.
55
+ # The extractor must be byte-equivalent between the two lints; the spec
56
+ # explicitly requires the SHARED function (see spec § Step 0 line ~389:
57
+ # "The extractor is the byte-equivalent function shared between v3.6.7 lint
58
+ # and v3.7.1 lint to guarantee identical results").
59
+ sys.path.insert(0, str(Path(__file__).resolve().parent))
60
+ from check_v3_6_7_pattern_protection import ( # noqa: E402
61
+ PROTECTION_BLOCK as V3_6_7_PROTECTION_BLOCK,
62
+ )
63
+
64
+ REPO_ROOT = Path(__file__).resolve().parent.parent
65
+ V3_6_7_MANIFEST = REPO_ROOT / "scripts" / "v3_6_7_inversion_manifest.json"
66
+ V3_6_8_MANIFEST = REPO_ROOT / "scripts" / "v3_6_8_inversion_manifest.json"
67
+
68
+ # Byte-order mark stripped per spec § Step 0: "the file's BOM (if any) is
69
+ # excluded; trailing whitespace of the last block line is preserved".
70
+ _BOM = b"\xef\xbb\xbf"
71
+
72
+
73
+ def _run_git(args: list[str], cwd: Path = REPO_ROOT) -> tuple[int, str, str]:
74
+ """Run git and return (returncode, stdout, stderr) as decoded strings."""
75
+ result = subprocess.run(
76
+ ["git", *args],
77
+ cwd=cwd,
78
+ capture_output=True,
79
+ text=True,
80
+ check=False,
81
+ )
82
+ return result.returncode, result.stdout.strip(), result.stderr.strip()
83
+
84
+
85
+ def _resolve_default_branch() -> tuple[str | None, str | None]:
86
+ """Resolve the repo's default branch via the spec's three-step ladder.
87
+
88
+ (1) `git symbolic-ref --quiet --short refs/remotes/origin/HEAD` → strip 'origin/'
89
+ (2) `$GITHUB_DEFAULT_BRANCH` env (GitHub Actions fallback)
90
+ (3) None — caller must hard-fail.
91
+ """
92
+ rc, out, _ = _run_git(["symbolic-ref", "--quiet", "--short", "refs/remotes/origin/HEAD"])
93
+ if rc == 0 and out.startswith("origin/"):
94
+ return out[len("origin/"):], None
95
+ env_default = os.environ.get("GITHUB_DEFAULT_BRANCH")
96
+ if env_default:
97
+ return env_default, None
98
+ return None, (
99
+ "[ARS-V3.7.1 LINT ERROR: default branch unresolvable; clone must "
100
+ "include origin/HEAD or set GITHUB_DEFAULT_BRANCH env]"
101
+ )
102
+
103
+
104
+ def _ensure_full_clone() -> str | None:
105
+ """Return None on success, error string on hard-fail.
106
+
107
+ If the repo is a shallow clone, attempt `git fetch --unshallow origin
108
+ <default-branch>` first; if that itself fails, hard-fail.
109
+ """
110
+ rc, out, _ = _run_git(["rev-parse", "--is-shallow-repository"])
111
+ if rc != 0:
112
+ return f"[ARS-V3.7.1 LINT ERROR: cannot determine clone depth: {out!r}]"
113
+ if out.strip().lower() != "true":
114
+ return None # full clone — proceed
115
+ default_branch, err = _resolve_default_branch()
116
+ if err is not None:
117
+ return err
118
+ rc, out, stderr = _run_git(["fetch", "--unshallow", "origin", default_branch])
119
+ if rc != 0:
120
+ return (
121
+ "[ARS-V3.7.1 LINT ERROR: shallow clone detected; set fetch-depth: "
122
+ f"0 in checkout step before running v3.7.1 byte-equivalence "
123
+ f"check (unshallow attempt failed: {stderr!r})]"
124
+ )
125
+ return None
126
+
127
+
128
+ def _v3_6_7_base_commit() -> tuple[str | None, str | None]:
129
+ """Derive the v3.6.7 base commit via `git log -1` against the v3.6.7 manifest.
130
+
131
+ This is the single source of truth derivation per spec § Step 0
132
+ (round-4 R4-002 + round-5 R5-001 + round-6 R6-002 amend; no stored
133
+ base_commit field, no dual truth).
134
+ """
135
+ rc, out, stderr = _run_git([
136
+ "log", "-1", "--format=%H", "--",
137
+ "scripts/v3_6_7_inversion_manifest.json",
138
+ ])
139
+ if rc != 0 or not out:
140
+ return None, (
141
+ "[ARS-V3.7.1 LINT ERROR: cannot derive v3.6.7 base commit "
142
+ f"from `git log -1 -- scripts/v3_6_7_inversion_manifest.json`: "
143
+ f"rc={rc} stderr={stderr!r}]"
144
+ )
145
+ return out.strip(), None
146
+
147
+
148
+ def _detect_pr_base_ref() -> str | None:
149
+ """Return a ref that names the PR's base for anti-self-baseline guard.
150
+
151
+ Order: $GITHUB_BASE_REF (CI fast path) → origin/<default-branch> (resolved
152
+ via the same ladder as the shallow-clone safety check). Returns None when
153
+ no remote / default branch is reachable (e.g. detached local check on a
154
+ fork without origin); callers treat that as "skip the guard, fall back to
155
+ derivation alone" — local-only attacks are out of scope (the user can see
156
+ their own diff).
157
+ """
158
+ env_base = os.environ.get("GITHUB_BASE_REF")
159
+ if env_base:
160
+ return f"origin/{env_base}"
161
+ default_branch, _ = _resolve_default_branch()
162
+ if default_branch:
163
+ return f"origin/{default_branch}"
164
+ return None
165
+
166
+
167
+ def _v3_6_7_manifest_unchanged_in_pr() -> tuple[bool, str | None]:
168
+ """Anti-self-baseline guard (round-2 + round-4 codex P2 closure).
169
+
170
+ Without this, a PR could mutate `scripts/v3_6_7_inversion_manifest.json`
171
+ AND a v3.6.7-tagged PATTERN PROTECTION block, causing the SHA gate to
172
+ hash modified content against itself.
173
+
174
+ Round-2 guard (initial): compare manifest bytes at HEAD vs at
175
+ `merge-base <pr-base> HEAD`; refuse to run on byte-difference.
176
+
177
+ Round-4 closure: byte-equality at HEAD is NOT sufficient. A PR with
178
+ commit A (modify manifest + modify protected block) followed by
179
+ commit B (revert manifest to original bytes; leave protected block
180
+ edit) leaves HEAD-vs-base manifest BYTES equal, but `git log -1
181
+ -- manifest` still resolves to commit B as the baseline, and
182
+ `git show B:<protected>` returns the modified content — self-baseline
183
+ attack reappears. Fix: also reject any commit that *touches* the
184
+ manifest in the `merge-base..HEAD` range, regardless of final bytes.
185
+
186
+ Returns (True, None) on success or when the guard cannot be evaluated
187
+ (no PR base detectable — local detached state). Returns (False, msg)
188
+ when the manifest changed in the PR or was touched by any PR commit.
189
+ """
190
+ pr_base = _detect_pr_base_ref()
191
+ if pr_base is None:
192
+ # Local-only / detached state: treat as advisory — surface a note but
193
+ # don't block. The CI run will catch the attack.
194
+ return True, None
195
+ rc_mb, mb, _ = _run_git(["merge-base", pr_base, "HEAD"])
196
+ if rc_mb != 0 or not mb:
197
+ # Cannot compute merge-base (fork without origin?). Be conservative:
198
+ # warn but do not block — CI on the canonical repo will catch it.
199
+ return True, None
200
+ mb = mb.strip()
201
+ rel = "scripts/v3_6_7_inversion_manifest.json"
202
+
203
+ # Round-4 closure: scan merge-base..HEAD for ANY commit that touches the
204
+ # manifest, regardless of whether the final HEAD bytes equal the base
205
+ # bytes. This catches the "touch and revert" pattern where a PR commit
206
+ # modifies the manifest + a protected block, then a later PR commit
207
+ # reverts only the manifest.
208
+ rc_log, log_out, log_err = _run_git([
209
+ "log", "--format=%H", f"{mb}..HEAD", "--", rel,
210
+ ])
211
+ if rc_log != 0:
212
+ # Couldn't list touching commits — be loud, don't pass silently.
213
+ return False, (
214
+ "[ARS-V3.7.1 LINT ERROR: anti-self-baseline guard cannot list "
215
+ f"manifest-touching commits in {mb[:12]}..HEAD: rc={rc_log} "
216
+ f"stderr={log_err!r}]"
217
+ )
218
+ touching = [c for c in log_out.splitlines() if c.strip()]
219
+ if touching:
220
+ commits_str = ", ".join(c[:12] for c in touching[:5])
221
+ suffix = f" (and {len(touching) - 5} more)" if len(touching) > 5 else ""
222
+ return False, (
223
+ "[ARS-V3.7.1 LINT ERROR: anti-self-baseline guard tripped: "
224
+ f"v3.6.7 manifest touched by {len(touching)} commit(s) in "
225
+ f"{mb[:12]}..HEAD: {commits_str}{suffix}. The byte-equivalence "
226
+ "SHA gate uses the manifest's most recent modifying commit as "
227
+ "its baseline; allowing ANY manifest touch in the PR (even one "
228
+ "later reverted) would let the gate hash modified content "
229
+ "against itself. Land manifest amendments in a SEPARATE PR "
230
+ "under a v3.7+ amendment process so the next SHA gate run "
231
+ "sees the new manifest as its baseline. "
232
+ "(round-2 + round-4 codex P2 closure)]"
233
+ )
234
+
235
+ # Defense-in-depth: also verify final HEAD bytes match base bytes.
236
+ # If `git log` somehow under-reports touches (e.g. a corrupted history
237
+ # or a bug in the path filter), the byte comparison still catches the
238
+ # final-state mismatch. This is the round-2 guard, kept as backstop.
239
+ head_path = REPO_ROOT / rel
240
+ head_bytes = head_path.read_bytes() if head_path.exists() else None
241
+ base_bytes, err = _read_blob_at_commit(mb, rel)
242
+ if err is not None:
243
+ return False, (
244
+ "[ARS-V3.7.1 LINT ERROR: anti-self-baseline guard tripped: "
245
+ "v3.6.7 manifest does not exist at PR base commit "
246
+ f"{mb[:12]}. Manifest creation / re-creation is not a "
247
+ "v3.7.1-work-PR action. Land manifest changes in a separate "
248
+ "amendment PR (round-2 codex P2 closure)]"
249
+ )
250
+ if head_bytes is None:
251
+ return False, (
252
+ "[ARS-V3.7.1 LINT ERROR: anti-self-baseline guard tripped: "
253
+ "v3.6.7 manifest is missing at PR HEAD but present at PR base. "
254
+ "Deletion is not a v3.7.1-work-PR action]"
255
+ )
256
+ if head_bytes != base_bytes:
257
+ return False, (
258
+ "[ARS-V3.7.1 LINT ERROR: anti-self-baseline guard tripped: "
259
+ "v3.6.7 manifest bytes differ between HEAD and PR base, but "
260
+ "no commit in merge-base..HEAD lists it as a path. This is a "
261
+ "history-shape anomaly — investigate before proceeding]"
262
+ )
263
+ return True, None
264
+
265
+
266
+ def _strip_file_bom(file_bytes: bytes) -> bytes:
267
+ """Strip a UTF-8 BOM at byte 0 of the FILE, if present.
268
+
269
+ Per spec § Step 0 SHA normalization: "the FILE's BOM (if any) is
270
+ excluded". This strips ONLY the file-level BOM, NOT BOMs that may
271
+ appear later in the file (e.g. inserted right before a protected
272
+ heading as a hidden mutation — round-8 codex P2 closure: spec
273
+ exclusion is file-level only, so block-level BOMs must remain in
274
+ the hashed range so heading-prefix attacks like inserting U+FEFF
275
+ before `## PATTERN PROTECTION (v3.6.7)` are caught).
276
+ """
277
+ if file_bytes.startswith(_BOM):
278
+ return file_bytes[len(_BOM):]
279
+ return file_bytes
280
+
281
+
282
+ # Backward-compat alias for the old name used by the unit test that pins
283
+ # BOM-stripping behaviour (test renamed in the round-8 closure commit).
284
+ _normalize_bytes = _strip_file_bom
285
+
286
+
287
+ def _extract_block_bytes(file_bytes: bytes) -> bytes | None:
288
+ """Extract the v3.6.7 PATTERN PROTECTION block as bytes.
289
+
290
+ Spec § 388 canonical range: "start at the line containing
291
+ `## PATTERN PROTECTION (v3.6.7)` heading; end at the line before the
292
+ next H1 / H2 / H3 heading or EOF". The `## ` heading prefix is part
293
+ of the canonical byte range.
294
+
295
+ Spec § Step 0 SHA normalization: "bytes are read raw; the FILE's
296
+ BOM (if any) is excluded". File-level BOM stripping happens BEFORE
297
+ extraction (caller passes raw file bytes to this function); BOMs
298
+ that appear later in the file (e.g. inserted before a protected
299
+ heading) are NOT stripped — they're real content mutations the
300
+ gate must detect (round-8 codex P2 closure).
301
+
302
+ The v3.6.7 lint's `_extract_block` finds the marker via case-
303
+ insensitive substring match, so it starts the returned slice at
304
+ `PATTERN...` and silently strips the `## ` (or any other) heading
305
+ prefix. That means a mutation of `## PATTERN...` to `### PATTERN...`
306
+ leaves the v3.6.7 lint's extracted block byte-identical, which is
307
+ fine for v3.6.7's invariant greps but DEFEATS the v3.7.1 byte-
308
+ equivalence gate's heading-prefix check (round-3 codex P2 closure).
309
+
310
+ This wrapper extends the start of the v3.6.7 extractor's range
311
+ backward to the start of the marker's line, so the hashed bytes
312
+ include the heading prefix exactly as the spec requires. The end
313
+ position and termination logic are untouched, so the byte range
314
+ stays byte-equivalent to the v3.6.7 extractor everywhere except the
315
+ heading prefix.
316
+
317
+ Returns None when the marker is missing.
318
+ """
319
+ # Strip file-level BOM (byte 0 only) per spec § Step 0. This is the
320
+ # ONLY BOM-stripping point in the pipeline; block-level BOMs stay in
321
+ # the hashed range (round-8 closure: BOM-before-heading mutation
322
+ # must be caught).
323
+ file_bytes = _strip_file_bom(file_bytes)
324
+ text = file_bytes.decode("utf-8", errors="replace")
325
+
326
+ # Round-10 codex P2 closure: do NOT delegate to the v3.6.7 extractor.
327
+ # That extractor uses a substring search (`text.lower().find(marker)`),
328
+ # so when prose before the protected block mentions
329
+ # `PATTERN PROTECTION (v3.6.7)`, it returns the slice starting at the
330
+ # PROSE position. Earlier rounds tried to "correct" by anchoring the
331
+ # heading line afterward and reusing `len(block)`, but the slice
332
+ # length still came from the prose-to-heading fragment, not the real
333
+ # block — so the hashed range was wrong.
334
+ #
335
+ # Round-9 + Round-10 fix: anchor the START at the heading line, AND
336
+ # compute the END independently by searching for the next H1/H2/H3
337
+ # heading after the marker line (or EOF). This mirrors the v3.6.7
338
+ # lint's heading-to-next-heading-or-EOF termination semantics, but
339
+ # with a true heading-anchored start.
340
+ #
341
+ # Pattern: line start, optional indent, 1-3 `#`, whitespace, the marker
342
+ # text. NO `\b` after the marker (ends with `)`, a non-word char).
343
+ # `(?m)` makes `^` match line starts; `(?i)` is the v3.6.7 convention.
344
+ heading_re = re.compile(
345
+ r"(?im)^[ \t]*#{1,3}[ \t]+" + re.escape(V3_6_7_PROTECTION_BLOCK)
346
+ )
347
+ match = heading_re.search(text)
348
+ if match is None:
349
+ # Heading-anchored search found nothing; the marker may exist only
350
+ # as prose (no `#` prefix). Treat as missing.
351
+ return None
352
+ line_start = match.start()
353
+
354
+ # Find block end at next H1/H2/H3 heading after the marker LINE, or EOF.
355
+ next_heading_re = re.compile(r"(?m)^[ \t]*#{1,3}[ \t]+")
356
+ eol = text.find("\n", match.end())
357
+ search_start = (eol + 1) if eol >= 0 else len(text)
358
+ next_match = next_heading_re.search(text, pos=search_start)
359
+ block_end = next_match.start() if next_match else len(text)
360
+ block_with_prefix = text[line_start:block_end]
361
+ return block_with_prefix.encode("utf-8")
362
+
363
+
364
+ def _read_blob_at_commit(commit: str, repo_relpath: str) -> tuple[bytes | None, str | None]:
365
+ """Return (raw bytes, error). Uses `git show <commit>:<path>`."""
366
+ result = subprocess.run(
367
+ ["git", "show", f"{commit}:{repo_relpath}"],
368
+ cwd=REPO_ROOT,
369
+ capture_output=True,
370
+ check=False,
371
+ )
372
+ if result.returncode != 0:
373
+ stderr = result.stderr.decode("utf-8", errors="replace").strip()
374
+ return None, (
375
+ f"[ARS-V3.7.1 LINT ERROR: `git show {commit}:{repo_relpath}` "
376
+ f"failed: {stderr!r}]"
377
+ )
378
+ return result.stdout, None
379
+
380
+
381
+ def _sha256(b: bytes) -> str:
382
+ return hashlib.sha256(b).hexdigest()
383
+
384
+
385
+ def _load_v3_6_7_manifest() -> tuple[list[str] | None, str | None]:
386
+ """Read the v3.6.7 manifest and return (file_list, error)."""
387
+ if not V3_6_7_MANIFEST.exists():
388
+ return None, (
389
+ "[ARS-V3.7.1 LINT ERROR: v3.6.7 manifest missing at "
390
+ f"{V3_6_7_MANIFEST.relative_to(REPO_ROOT)}]"
391
+ )
392
+ try:
393
+ data = json.loads(V3_6_7_MANIFEST.read_text(encoding="utf-8"))
394
+ except (json.JSONDecodeError, OSError) as exc:
395
+ return None, f"[ARS-V3.7.1 LINT ERROR: v3.6.7 manifest unreadable: {exc}]"
396
+ files = data.get("files")
397
+ if not isinstance(files, list) or not all(isinstance(p, str) for p in files):
398
+ return None, (
399
+ "[ARS-V3.7.1 LINT ERROR: v3.6.7 manifest 'files' must be a list "
400
+ "of strings]"
401
+ )
402
+ return files, None
403
+
404
+
405
+ def _load_v3_6_8_manifest() -> tuple[dict | None, str | None]:
406
+ """Read the v3.6.8 manifest. PR-1 ships an empty list; Step 3a populates."""
407
+ if not V3_6_8_MANIFEST.exists():
408
+ return None, (
409
+ "[ARS-V3.7.1 LINT ERROR: v3.6.8 manifest missing at "
410
+ f"{V3_6_8_MANIFEST.relative_to(REPO_ROOT)}]"
411
+ )
412
+ try:
413
+ data = json.loads(V3_6_8_MANIFEST.read_text(encoding="utf-8"))
414
+ except (json.JSONDecodeError, OSError) as exc:
415
+ return None, f"[ARS-V3.7.1 LINT ERROR: v3.6.8 manifest unreadable: {exc}]"
416
+ if data.get("scope") != "v3.6.8-only":
417
+ return None, (
418
+ "[ARS-V3.7.1 LINT ERROR: v3.6.8 manifest 'scope' must be "
419
+ f"'v3.6.8-only', got {data.get('scope')!r}]"
420
+ )
421
+ files = data.get("files")
422
+ if not isinstance(files, list) or not all(isinstance(p, str) for p in files):
423
+ return None, (
424
+ "[ARS-V3.7.1 LINT ERROR: v3.6.8 manifest 'files' must be a list "
425
+ "of strings (may be empty until Step 3a populates)]"
426
+ )
427
+ return data, None
428
+
429
+
430
+ # =============================================================================
431
+ # Step 3a — Two-Layer Citation Emission invariants
432
+ # =============================================================================
433
+ #
434
+ # Spec § Step 3a (line 439): the v3.7.1 lint enforces three invariants on the
435
+ # Two-Layer Citation Emission prompt block in each manifest-listed agent:
436
+ # (i) two-layer form regex on emitted citations in agent test fixtures
437
+ # (ii) absence of "finalizer / orchestrator / stage gate" prose inside the
438
+ # Two-Layer Citation Emission prompt blocks
439
+ # (iii) absence of any frontmatter-read instruction in those blocks
440
+ #
441
+ # Block scope: starts at the H2 line `## Two-Layer Citation Emission (v3.7.1)`
442
+ # and ends at the next H1/H2/H3 heading or EOF.
443
+
444
+ TWO_LAYER_BLOCK_HEADING = "## Two-Layer Citation Emission (v3.7.1)"
445
+
446
+ # Invariant (ii): forbidden terms.
447
+ #
448
+ # R2 P1-B closure: Python `\b` treats `_` as a word character. That means
449
+ # `\bfinalizer\b` does NOT match `cite_provenance_finalizer_agent` (the agent
450
+ # name introduced by Step 3c). Step 3a must reject those exact identifiers
451
+ # because the spec explicitly forbids naming the downstream resolver layer.
452
+ # Use identifier-aware boundaries `(?<![A-Za-z0-9])` / `(?![A-Za-z0-9])`
453
+ # instead of `\b` so underscores DO act as a boundary; this catches both
454
+ # bare `finalizer` and `cite_provenance_finalizer_agent` substring matches.
455
+ _NON_IDENT_BEFORE = r"(?<![A-Za-z0-9])"
456
+ _NON_IDENT_AFTER = r"(?![A-Za-z0-9])"
457
+ # R3 P1-B closure: plural-aware stems. `finalizers`/`orchestrators`/
458
+ # `resolvers`/`stage gates`/`terminal gates` previously slipped past
459
+ # because the right identifier boundary rejected the plural `s`.
460
+ _FORBIDDEN_RESOLVER_TERMS = (
461
+ re.compile(_NON_IDENT_BEFORE + r"finalizers?" + _NON_IDENT_AFTER, re.IGNORECASE),
462
+ re.compile(_NON_IDENT_BEFORE + r"orchestrators?" + _NON_IDENT_AFTER, re.IGNORECASE),
463
+ re.compile(_NON_IDENT_BEFORE + r"stage[\s\-_]?gates?" + _NON_IDENT_AFTER, re.IGNORECASE),
464
+ re.compile(_NON_IDENT_BEFORE + r"terminal[\s\-_]?gates?" + _NON_IDENT_AFTER, re.IGNORECASE),
465
+ # The block instructs the agent to NOT resolve markers; saying so is
466
+ # legitimate self-knowledge ("emit bare; do not resolve"). It is the
467
+ # MENTION of who DOES resolve that breaks partial-inversion. The token
468
+ # "resolver" referring to a downstream entity is forbidden, but the verb
469
+ # "resolve" used negatively ("never resolve") is allowed — handled by
470
+ # forbidding only the "resolver" noun (and its plural), not the verb.
471
+ re.compile(_NON_IDENT_BEFORE + r"resolvers?" + _NON_IDENT_AFTER, re.IGNORECASE),
472
+ )
473
+
474
+ # Invariant (iii): a frontmatter-read instruction is any imperative or
475
+ # descriptive sentence that tells the agent to read / look up / dereference /
476
+ # consult an entry's frontmatter. The agent must learn the slug ONLY from the
477
+ # corpus context already in its prompt — never from frontmatter.
478
+ #
479
+ # R1 P1-3 closure: match `frontmatter` AND its common variants (`front matter`
480
+ # two-word, `front-matter` hyphenated, and across line wraps in bullet text).
481
+ # Whitespace between verb and target spans `\s` (newline + indent) not just
482
+ # `[^.\n]`, so a wrapped bullet `read the entry\n front matter` is caught.
483
+ #
484
+ # Negation: the block legitimately includes prohibitions like "Never read
485
+ # frontmatter" — those must NOT trigger this check. R1 P1-2 closure: bare
486
+ # same-sentence presence of any negation word is too permissive; an attacker
487
+ # could write `Never guess, read the entry frontmatter` and slip past.
488
+ # Negation must scope to the matched read-verb's neighborhood — i.e. the
489
+ # negation must appear within ~80 chars BEFORE the verb (or anywhere in the
490
+ # verb-and-target span). Implemented as a separate left-context match around
491
+ # the verb position rather than a full-sentence wildcard.
492
+ _FRONTMATTER_TARGET_RE = (
493
+ r"front[\s\-_]?matter" # `frontmatter` / `front matter` / `front-matter` / `front_matter`
494
+ )
495
+ # R3 P1-C closure: identifier-aware boundary on the verb side. Python `\b`
496
+ # treats `_` as a word char, so `read_frontmatter()` is one token and
497
+ # `\bread\b` does not match. Use `(?<![A-Za-z0-9])` / `(?![A-Za-z0-9])` so
498
+ # `_` IS a boundary; this catches `read_frontmatter()` style instructions.
499
+ # The target side uses the same boundary for symmetry.
500
+ _FRONTMATTER_READ_VERB_RE = re.compile(
501
+ _NON_IDENT_BEFORE + r"(?P<verb>"
502
+ r"read|reads?|reading|"
503
+ r"look\s*up|looks?\s*up|looking\s*up|"
504
+ r"dereference|dereferences?|dereferencing|"
505
+ r"consult|consults?|consulting|"
506
+ r"open|opens?|opening|"
507
+ r"parse|parses?|parsing|"
508
+ r"load|loads?|loading|"
509
+ r"access|accesses|accessing|"
510
+ r"query|queries|querying|"
511
+ r"fetch|fetches|fetching"
512
+ r")" + _NON_IDENT_AFTER + r"[\s\S]{0,80}?" + _NON_IDENT_BEFORE
513
+ + _FRONTMATTER_TARGET_RE + _NON_IDENT_AFTER,
514
+ re.IGNORECASE,
515
+ )
516
+ # Negation tokens that turn "read frontmatter" into a prohibition. Anchored
517
+ # explicitly to direct preposition of the read verb (≤30 chars upstream)
518
+ # rather than free-floating same-sentence presence — closes R1 P1-2.
519
+ _FRONTMATTER_NEGATION_TOKENS_RE = re.compile(
520
+ r"\b(?:never|do\s+not|don'?t|must\s+not|mustn'?t|"
521
+ r"cannot|can'?t|may\s+not|shall\s+not|forbidden|"
522
+ r"NEVER|DO\s+NOT|MUST\s+NOT)\b",
523
+ re.IGNORECASE,
524
+ )
525
+ # The negation must apply to the read verb itself, not a different clause.
526
+ # Window: 0..30 chars before the verb (covers "NEVER read", "must not read",
527
+ # "do not look up", and "never read the entry's frontmatter"). Wider windows
528
+ # leak across clauses ("Never guess; read frontmatter"); narrower windows
529
+ # fail-stop on valid prose like "NEVER read the entry frontmatter" where
530
+ # the verb is a few words after the negation.
531
+ _FRONTMATTER_NEGATION_WINDOW = 30
532
+
533
+
534
+ # R2 P1-A closure: `\n- ` (bullet boundary) is a clause boundary in
535
+ # Markdown prose. Without this, `- NEVER omit markers\n- read the entry
536
+ # frontmatter` lets `NEVER` (in the previous bullet) leak into the
537
+ # next-bullet's negation window. Treat the bullet boundary as a hard
538
+ # clause terminator alongside `.` / `;` / `!` / `?` and blank lines.
539
+ _SENTENCE_TERMINATOR_RE = re.compile(
540
+ r"[.;!?]\s|[.;!?]$|\n\s*\n|\n[ \t]*[-*+][ \t]+|\n[ \t]*\d+\.[ \t]+"
541
+ )
542
+
543
+
544
+ def _negation_anchored_to_verb(block: str, verb_pos: int) -> bool:
545
+ """Return True iff a negation token appears in the ≤30-char window
546
+ immediately preceding `verb_pos` AND no sentence terminator separates
547
+ the negation from the verb.
548
+
549
+ R1 P1-2 closure: scope negation to the verb's left context within the
550
+ same clause. Unrelated negation words elsewhere in the same paragraph
551
+ (or in a preceding sentence the simple-window check would otherwise
552
+ catch) must not bless a positive read instruction.
553
+
554
+ Algorithm: take the ≤30-char left window; find the LAST sentence
555
+ terminator inside it; truncate the window to start AFTER that
556
+ terminator. Then run the negation-token regex against the truncated
557
+ window. This keeps `NEVER read frontmatter` (no terminator between
558
+ `NEVER` and `read`) but rejects `Never guess. Always read frontmatter`
559
+ (terminator `.` between `Never` and `read`).
560
+ """
561
+ window_start = max(0, verb_pos - _FRONTMATTER_NEGATION_WINDOW)
562
+ window = block[window_start:verb_pos]
563
+ # Find the rightmost sentence terminator in the window, truncate after it.
564
+ last_term = None
565
+ for m in _SENTENCE_TERMINATOR_RE.finditer(window):
566
+ last_term = m
567
+ if last_term is not None:
568
+ window = window[last_term.end():]
569
+ return _FRONTMATTER_NEGATION_TOKENS_RE.search(window) is not None
570
+
571
+
572
+ _TWO_LAYER_TITLE_EXACT_RE = re.compile(
573
+ r"(?m)^[ \t]*(?P<level>#{1,6})[ \t]+Two-Layer Citation Emission \(v3\.7\.1\)[ \t]*$"
574
+ )
575
+ # R3 P1-A closure: heading-DRIFT detector. Any heading at any level whose
576
+ # title STARTS with `Two-Layer Citation Emission (v3.7.1)` but has trailing
577
+ # non-whitespace (e.g., `### Two-Layer Citation Emission (v3.7.1) — extended`)
578
+ # is a drift duplicate. Pre-R3 only exact-title headings counted; a drift
579
+ # heading slipped past AND its body sat outside the scanned block range
580
+ # (since `_extract_two_layer_block` stops at the next H1/H2/H3), so
581
+ # forbidden text under it was invisible to per-block invariants.
582
+ _TWO_LAYER_TITLE_DRIFT_RE = re.compile(
583
+ r"(?m)^[ \t]*(?P<level>#{1,6})[ \t]+Two-Layer Citation Emission \(v3\.7\.1\)"
584
+ r"(?P<trailing>[^\n]*)$"
585
+ )
586
+
587
+
588
+ def _find_all_two_layer_block_positions(text: str) -> list[int]:
589
+ """Return positions of every heading whose title is or BEGINS WITH
590
+ `Two-Layer Citation Emission (v3.7.1)`.
591
+
592
+ R1 P2 + R2 P2 + R3 P1-A closure: counts H1–H6 exact AND drift
593
+ (trailing-text-bearing) titles as duplicates. The canonical form is
594
+ H2 (`## Two-Layer Citation Emission (v3.7.1)`); any other heading
595
+ that begins the same title but at a different level or with extra
596
+ trailing text is a contradiction-vector.
597
+
598
+ The canonical-block-presence check (`_extract_two_layer_block`) still
599
+ requires the FIRST canonical EXACT-title H2 — see that function's
600
+ docstring.
601
+ """
602
+ positions: list[int] = []
603
+ for m in _TWO_LAYER_TITLE_DRIFT_RE.finditer(text):
604
+ # Trailing text after the title must be stripped; a string of
605
+ # whitespace is fine, but anything else marks a drift heading.
606
+ trailing = m.group("trailing")
607
+ if trailing.strip() == "":
608
+ positions.append(m.start())
609
+ else:
610
+ # Drift heading: report the position too. `_check_block_count`
611
+ # relies on the count comparison; presence of drift implies >1.
612
+ positions.append(m.start())
613
+ return positions
614
+
615
+
616
+ def _find_drift_titles(text: str) -> list[tuple[int, str]]:
617
+ """Return (position, full_heading_line) of headings that begin with the
618
+ canonical title but carry trailing non-whitespace text (e.g.
619
+ `## Two-Layer Citation Emission (v3.7.1) — extended`).
620
+
621
+ Used by the duplicate check to emit a more specific failure message
622
+ when a drift heading is detected (R3 P1-A closure).
623
+ """
624
+ drifts: list[tuple[int, str]] = []
625
+ for m in _TWO_LAYER_TITLE_DRIFT_RE.finditer(text):
626
+ trailing = m.group("trailing")
627
+ if trailing.strip() != "":
628
+ line = text[m.start(): m.end()]
629
+ drifts.append((m.start(), line))
630
+ return drifts
631
+
632
+
633
+ def _find_canonical_h2_position(text: str) -> int | None:
634
+ """Return the position of the FIRST canonical EXACT-title H2
635
+ (`## Two-Layer Citation Emission (v3.7.1)`), or None if no exact-H2
636
+ match exists.
637
+
638
+ Used by `_extract_two_layer_block` so the per-block invariants run
639
+ against the canonical (H2 EXACT) instance even when same-title
640
+ duplicates of other heading levels or drift trailing text exist.
641
+ """
642
+ for m in _TWO_LAYER_TITLE_EXACT_RE.finditer(text):
643
+ if m.group("level") == "##":
644
+ return m.start()
645
+ return None
646
+
647
+
648
+ def _extract_two_layer_block(text: str) -> tuple[str | None, int | None, int | None]:
649
+ """Return (block_text, start_offset, end_offset) for the FIRST canonical
650
+ H2 Two-Layer block in the file, or (None, None, None) if no canonical
651
+ H2 instance exists.
652
+
653
+ Block start: line containing the canonical H2 heading. Block end: next
654
+ H1/H2/H3 heading line, or EOF. The returned text INCLUDES the heading
655
+ line and ends just before the terminator.
656
+
657
+ Same-title duplicates at other heading levels (H3, H4, etc.) are
658
+ enumerated separately via `_find_all_two_layer_block_positions` and
659
+ flagged by the duplicate-count check.
660
+ """
661
+ line_start = _find_canonical_h2_position(text)
662
+ if line_start is None:
663
+ return None, None, None
664
+ next_h_re = re.compile(r"(?m)^[ \t]*#{1,3}[ \t]+")
665
+ # Find heading text length so search starts after it.
666
+ head_eol = text.find("\n", line_start + len(TWO_LAYER_BLOCK_HEADING))
667
+ search_start = (head_eol + 1) if head_eol >= 0 else len(text)
668
+ next_match = next_h_re.search(text, pos=search_start)
669
+ block_end = next_match.start() if next_match else len(text)
670
+ return text[line_start:block_end], line_start, block_end
671
+
672
+
673
+ def _split_into_sentences(block: str) -> list[str]:
674
+ """Crude sentence splitter for invariant-(iii) negation-aware scanning.
675
+
676
+ Splits on `. ` / `.\n` / `;` / list-item line breaks. Does not handle
677
+ abbreviation edge cases — the block prose is short and authored, so the
678
+ splitter is good enough for grep-class enforcement.
679
+ """
680
+ # Replace bullet-list `\n- ` boundaries with sentence terminators so each
681
+ # bullet counts as its own sentence (each bullet is an independent
682
+ # obligation in the canonical block).
683
+ normalized = re.sub(r"\n[ \t]*[-*+][ \t]+", ". ", block)
684
+ # Split on sentence-end punctuation followed by whitespace, or on a hard
685
+ # line break that ends a paragraph.
686
+ parts = re.split(r"(?:[.;!?]\s+)|(?:\n\n)", normalized)
687
+ return [p.strip() for p in parts if p.strip()]
688
+
689
+
690
+ def check_step3a_invariants(verbose: bool = True) -> int:
691
+ """Enforce Step 3a's three invariants on each manifest-listed agent.
692
+
693
+ Returns 0 on PASS, 1 on FAIL.
694
+ """
695
+ data, err = _load_v3_6_8_manifest()
696
+ if err is not None:
697
+ print(err)
698
+ return 1
699
+ files: list[str] = data["files"]
700
+ if not files:
701
+ # PR-1 ships an empty list; Step 3a populates. Empty list is fine —
702
+ # invariants vacuously hold (no agents to check).
703
+ if verbose:
704
+ print(
705
+ "[v3.7.1 Step 3a invariants] manifest 'files' empty — Step 3a "
706
+ "has not populated yet (vacuous PASS)"
707
+ )
708
+ return 0
709
+
710
+ failures: list[str] = []
711
+ for rel in files:
712
+ agent_path = REPO_ROOT / rel
713
+ if not agent_path.exists():
714
+ failures.append(
715
+ f" [{rel}] manifest references missing file"
716
+ )
717
+ continue
718
+ text = agent_path.read_text(encoding="utf-8")
719
+ # R1 P2 + R2 P2 + R3 P1-A closure: require exactly one canonical
720
+ # block per manifest file. Counts EXACT and DRIFT (trailing-text)
721
+ # titles at any heading level; drift titles get a dedicated
722
+ # diagnostic so contributors don't waste time looking for "what
723
+ # got duplicated".
724
+ positions = _find_all_two_layer_block_positions(text)
725
+ drifts = _find_drift_titles(text)
726
+ # R4 P3-A closure: emit BOTH drift diagnostics AND exact-duplicate
727
+ # count when both conditions hold, so contributors see every problem
728
+ # at once (was: drift suppressed exact-duplicate report).
729
+ for _, drift_line in drifts:
730
+ failures.append(
731
+ f" [{rel}] FAIL: heading-drift detected: "
732
+ f"{drift_line.strip()!r}. Any heading whose title begins "
733
+ f"with 'Two-Layer Citation Emission (v3.7.1)' but carries "
734
+ f"trailing text is a duplicate-by-drift — its body sits "
735
+ f"outside the canonical block scan range and could carry "
736
+ f"contradictory instructions. Rename or remove."
737
+ )
738
+ # `positions` includes BOTH exact and drift entries (drift regex
739
+ # subsumes exact). Subtract drift count to get exact-title count.
740
+ exact_count = len(positions) - len(drifts)
741
+ if exact_count > 1:
742
+ failures.append(
743
+ f" [{rel}] FAIL: {exact_count} exact-title "
744
+ f"'{TWO_LAYER_BLOCK_HEADING}' headings found; exactly one "
745
+ f"is required per Step 3a (duplicates risk contradictory "
746
+ f"instructions silently passing per-block invariants)"
747
+ )
748
+ # Continue to the per-block invariants on the first occurrence so
749
+ # the operator gets a complete failure list, not just the count.
750
+ block, _, _ = _extract_two_layer_block(text)
751
+ if block is None:
752
+ failures.append(
753
+ f" [{rel}] Two-Layer Citation Emission block missing "
754
+ f"(expected H2 heading '{TWO_LAYER_BLOCK_HEADING}')"
755
+ )
756
+ continue
757
+
758
+ # Invariant (i): two-layer form. Block must contain BOTH the
759
+ # `<!--ref:` HTML-comment literal AND `author-year` visible-form
760
+ # token. We grep for the literal `<!--ref:` (anchors the hidden
761
+ # layer) and for `author-year` or `author, year` (anchors the
762
+ # visible layer). The combination is the two-layer contract.
763
+ has_ref_marker = "<!--ref:" in block
764
+ has_author_year = bool(
765
+ re.search(r"author[\s-]year|author,\s*year", block, re.IGNORECASE)
766
+ )
767
+ if not has_ref_marker:
768
+ failures.append(
769
+ f" [{rel}] invariant (i) FAIL: two-layer form missing "
770
+ f"hidden-layer marker `<!--ref:slug-->`. The block must "
771
+ f"specify the HTML-comment literal `<!--ref:` so agents emit "
772
+ f"the hidden-layer marker."
773
+ )
774
+ if not has_author_year:
775
+ failures.append(
776
+ f" [{rel}] invariant (i) FAIL: two-layer form missing "
777
+ f"visible-layer anchor (author-year / author, year). The "
778
+ f"block must name the visible-layer form."
779
+ )
780
+
781
+ # Invariant (ii): forbidden resolver-layer mentions.
782
+ for pattern in _FORBIDDEN_RESOLVER_TERMS:
783
+ m = pattern.search(block)
784
+ if m is not None:
785
+ failures.append(
786
+ f" [{rel}] invariant (ii) FAIL: block mentions "
787
+ f"'{m.group(0)}' (strict partial-inversion: agent must "
788
+ f"NOT name the resolver layer / finalizer / orchestrator "
789
+ f"/ stage gate / terminal gate / resolver)"
790
+ )
791
+
792
+ # Invariant (iii): no frontmatter-read instruction.
793
+ # R1 P1-2 closure: scan the ENTIRE block (not pre-split sentences),
794
+ # then for each verb-target match, check negation in the ≤30-char
795
+ # window preceding the verb. This eliminates false-pass on sentences
796
+ # like "Never guess, read the entry frontmatter" where the negation
797
+ # word doesn't apply to the read verb.
798
+ for verb_match in _FRONTMATTER_READ_VERB_RE.finditer(block):
799
+ verb_pos = verb_match.start("verb")
800
+ if _negation_anchored_to_verb(block, verb_pos):
801
+ continue
802
+ # Diagnostic excerpt: 60 chars centered on the match.
803
+ excerpt_start = max(0, verb_pos - 30)
804
+ excerpt_end = min(len(block), verb_match.end() + 30)
805
+ excerpt = block[excerpt_start:excerpt_end].replace("\n", " ")
806
+ failures.append(
807
+ f" [{rel}] invariant (iii) FAIL: block instructs agent to "
808
+ f"'{verb_match.group(0).strip()}' frontmatter without "
809
+ f"a directly anchored negation. Agent must learn slug ONLY "
810
+ f"from corpus context in its prompt; frontmatter access is "
811
+ f"forbidden in this block. Excerpt: {excerpt!r}"
812
+ )
813
+
814
+ if verbose and not any(rel in f for f in failures):
815
+ print(f" [{rel}] Step 3a invariants PASS")
816
+
817
+ if failures:
818
+ print("[ARS-V3.7.1 LINT ERROR: Step 3a Two-Layer Citation Emission invariants]")
819
+ for line in failures:
820
+ print(line)
821
+ return 1
822
+ if verbose:
823
+ print(
824
+ f"[v3.7.1 Step 3a invariants] PASSED ({len(files)} manifest agent(s))"
825
+ )
826
+ return 0
827
+
828
+
829
+ def check_byte_equivalence(verbose: bool = True) -> int:
830
+ """Run the SHA byte-equivalence gate.
831
+
832
+ Returns 0 on PASS, 1 on FAIL. Side effect: prints diagnostic lines to stdout.
833
+ """
834
+ # 1. Shallow-clone gate (CI safety)
835
+ err = _ensure_full_clone()
836
+ if err is not None:
837
+ print(err)
838
+ return 1
839
+
840
+ # 2. Anti-self-baseline guard (round-2 codex P2 closure):
841
+ # Refuse to run on PRs that mutate the v3.6.7 manifest. Without this,
842
+ # `git log -1 -- v3_6_7_inversion_manifest.json` would resolve to the
843
+ # PR's own commit and the SHA comparison would hash modified content
844
+ # against itself.
845
+ ok, err = _v3_6_7_manifest_unchanged_in_pr()
846
+ if not ok:
847
+ print(err)
848
+ return 1
849
+
850
+ # 3. v3.6.7 base commit derivation (single source of truth)
851
+ base_commit, err = _v3_6_7_base_commit()
852
+ if err is not None:
853
+ print(err)
854
+ return 1
855
+ if verbose:
856
+ print(f"[v3.7.1 SHA gate] v3.6.7 base commit: {base_commit[:12]}")
857
+
858
+ # 3. Load v3.6.7 manifest (file list = single source of truth)
859
+ files_v367, err = _load_v3_6_7_manifest()
860
+ if err is not None:
861
+ print(err)
862
+ return 1
863
+ if not files_v367:
864
+ # An empty v3.6.7 manifest would be a contract violation; fail loud.
865
+ print(
866
+ "[ARS-V3.7.1 LINT ERROR: v3.6.7 manifest carries empty file list; "
867
+ "expected the three v3.6.7-frozen agent files]"
868
+ )
869
+ return 1
870
+
871
+ # 4. Load v3.6.8 manifest (just for shape validation; entries unused here)
872
+ _, err = _load_v3_6_8_manifest()
873
+ if err is not None:
874
+ print(err)
875
+ return 1
876
+
877
+ # 5. For each v3.6.7 protected file: extract block at HEAD and at base
878
+ # commit, hash both, assert equality.
879
+ failures: list[str] = []
880
+ for rel in files_v367:
881
+ head_path = REPO_ROOT / rel
882
+ if not head_path.exists():
883
+ failures.append(
884
+ f" [{rel}] missing at PR HEAD (deletion of v3.6.7-protected "
885
+ "file would re-open v3.6.7 convergence; restore the file)"
886
+ )
887
+ continue
888
+ head_bytes_full = head_path.read_bytes()
889
+ head_block = _extract_block_bytes(head_bytes_full)
890
+ if head_block is None:
891
+ failures.append(
892
+ f" [{rel}] PATTERN PROTECTION (v3.6.7) marker missing at "
893
+ "PR HEAD (the v3.6.7-tagged block was renamed or removed; "
894
+ "boundary rule violated — v3.7.1 must NOT mutate v3.6.7 blocks)"
895
+ )
896
+ continue
897
+ base_bytes_full, err = _read_blob_at_commit(base_commit, rel)
898
+ if err is not None:
899
+ failures.append(f" [{rel}] {err}")
900
+ continue
901
+ base_block = _extract_block_bytes(base_bytes_full)
902
+ if base_block is None:
903
+ failures.append(
904
+ f" [{rel}] PATTERN PROTECTION (v3.6.7) marker missing at "
905
+ f"v3.6.7 base commit {base_commit[:12]} — manifest "
906
+ "derivation produced an inconsistent base"
907
+ )
908
+ continue
909
+ head_sha = _sha256(head_block)
910
+ base_sha = _sha256(base_block)
911
+ if head_sha != base_sha:
912
+ failures.append(
913
+ f" [{rel}] BYTE-EQUIVALENCE FAIL\n"
914
+ f" HEAD SHA-256: {head_sha}\n"
915
+ f" v3.6.7 SHA-256: {base_sha}\n"
916
+ f" v3.6.7-tagged PATTERN PROTECTION block changed; "
917
+ f"v3.7.1 boundary rule violated. Restore the block or land "
918
+ f"a v3.6.7+ amendment manifest first."
919
+ )
920
+ elif verbose:
921
+ print(f" [{rel}] PASS (sha256={head_sha[:12]})")
922
+
923
+ if failures:
924
+ print("[ARS-V3.7.1 LINT ERROR: v3.6.7 PATTERN PROTECTION block byte-equivalence failures]")
925
+ for line in failures:
926
+ print(line)
927
+ return 1
928
+ if verbose:
929
+ print(f"[v3.7.1 SHA gate] PASSED ({len(files_v367)} v3.6.7 protected file(s))")
930
+ return 0
931
+
932
+
933
+ def main() -> int:
934
+ rc_sha = check_byte_equivalence()
935
+ rc_invariants = check_step3a_invariants()
936
+ # Both must pass; report combined exit code.
937
+ return 1 if (rc_sha or rc_invariants) else 0
938
+
939
+
940
+ if __name__ == "__main__":
941
+ sys.exit(main())