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,1249 @@
1
+ #!/usr/bin/env python3
2
+
3
+ from __future__ import annotations
4
+
5
+ import ast
6
+ import json
7
+ import re
8
+ import sys
9
+ from pathlib import Path
10
+
11
+ if __package__: # Package import in tests.
12
+ from ._markdown_lint_util import (
13
+ NON_RELATIVE_LINK_PREFIXES,
14
+ extract_link_targets,
15
+ )
16
+ else: # pragma: no cover - exercised by the CLI smoke path
17
+ from _markdown_lint_util import (
18
+ NON_RELATIVE_LINK_PREFIXES,
19
+ extract_link_targets,
20
+ )
21
+
22
+
23
+ ROOT = Path(__file__).resolve().parents[1]
24
+ ERRORS: list[str] = []
25
+
26
+
27
+ def read(rel_path: str) -> str:
28
+ return (ROOT / rel_path).read_text(encoding="utf-8")
29
+
30
+
31
+ def fail(message: str) -> None:
32
+ ERRORS.append(message)
33
+
34
+
35
+ def expect_contains(rel_path: str, needle: str) -> None:
36
+ text = read(rel_path)
37
+ if needle not in text:
38
+ fail(f"{rel_path}: missing expected text: {needle!r}")
39
+
40
+
41
+ def expect_absent(rel_path: str, needle: str) -> None:
42
+ text = read(rel_path)
43
+ if needle in text:
44
+ fail(f"{rel_path}: forbidden text still present: {needle!r}")
45
+
46
+
47
+ def extract_section(text: str, start: str, end: str) -> str:
48
+ start_idx = text.find(start)
49
+ if start_idx == -1:
50
+ fail(f"missing section start: {start!r}")
51
+ return ""
52
+ end_idx = text.find(end, start_idx + len(start))
53
+ if end_idx == -1:
54
+ fail(f"missing section end after {start!r}: {end!r}")
55
+ return text[start_idx:]
56
+ return text[start_idx:end_idx]
57
+
58
+
59
+ def check_relative_markdown_links(rel_path: str) -> None:
60
+ text = read(rel_path)
61
+ doc_path = ROOT / rel_path
62
+ for raw_target in extract_link_targets(text):
63
+ if raw_target.startswith(NON_RELATIVE_LINK_PREFIXES):
64
+ continue
65
+ target = raw_target.partition("#")[0]
66
+ if not target:
67
+ continue
68
+ resolved = (doc_path.parent / target).resolve()
69
+ if not resolved.exists():
70
+ fail(f"{rel_path}: broken relative markdown link {raw_target!r}")
71
+
72
+
73
+ def check_mode_registry() -> None:
74
+ rel_path = "MODE_REGISTRY.md"
75
+ text = read(rel_path)
76
+ expect_contains(rel_path, "Last updated: v3.21.1 (2026-08-24)")
77
+ for heading in (
78
+ "## deep-research (8 modes)",
79
+ "## academic-paper (11 modes)",
80
+ "## academic-paper-reviewer (6 modes)",
81
+ ):
82
+ if heading not in text:
83
+ fail(f"{rel_path}: missing mode heading {heading!r}")
84
+
85
+
86
+ def check_claude_md() -> None:
87
+ rel_path = ".claude/CLAUDE.md"
88
+ expect_contains(rel_path, "integrity check (Stage 2.5)")
89
+ expect_contains(rel_path, "final integrity check (Stage 4.5)")
90
+ expect_contains(rel_path, "**Suite version**: 3.21.1")
91
+ for forbidden in (
92
+ "6th independent reviewer",
93
+ "Peer review gains 6th independent reviewer",
94
+ ):
95
+ expect_absent(rel_path, forbidden)
96
+
97
+
98
+ # All four skills carry the same frontmatter (`version` / `last_updated`) + Version-Info-table
99
+ # (`| Skill Version |` / `| Last Updated |`) pair. Pre-#377 only the reviewer was policed.
100
+ _SKILL_VERSION_PATHS = (
101
+ "academic-pipeline/SKILL.md",
102
+ "academic-paper/SKILL.md",
103
+ "academic-paper-reviewer/SKILL.md",
104
+ "deep-research/SKILL.md",
105
+ )
106
+
107
+ # The single skill whose `version` tracks the suite version. The other three move independently,
108
+ # so only this one's date is sanity-checked against the release (CHANGELOG) in #377(b).
109
+ _SUITE_SKILL_PATH = "academic-pipeline/SKILL.md"
110
+
111
+
112
+ def _parse_skill_version_block(rel_path: str) -> tuple[str, str, str, str] | None:
113
+ """Return (frontmatter_version, frontmatter_last_updated, table_version, table_last_updated)
114
+ for a SKILL.md, or None (after recording an error) if any surface is unparseable."""
115
+ text = read(rel_path)
116
+ frontmatter_match = re.search(
117
+ r'metadata:\s*[\s\S]*?\n\s+version:\s"([^"]+)"\n\s+last_updated:\s"([^"]+)"',
118
+ text,
119
+ )
120
+ if not frontmatter_match:
121
+ fail(f"{rel_path}: could not parse frontmatter version/last_updated")
122
+ return None
123
+
124
+ version_block_match = re.search(r"\| Skill Version \| ([^|]+) \|", text)
125
+ updated_block_match = re.search(r"\| Last Updated \| ([^|]+) \|", text)
126
+ if not version_block_match or not updated_block_match:
127
+ fail(f"{rel_path}: missing Version Info table rows")
128
+ return None
129
+
130
+ version, last_updated = frontmatter_match.groups()
131
+ return (
132
+ version,
133
+ last_updated,
134
+ version_block_match.group(1).strip(),
135
+ updated_block_match.group(1).strip(),
136
+ )
137
+
138
+
139
+ def check_skill_version_blocks() -> None:
140
+ """#377(a): for ALL FOUR SKILL.md, the frontmatter version/last_updated must match the
141
+ Version-Info-table rows (an internal per-file consistency check)."""
142
+ for rel_path in _SKILL_VERSION_PATHS:
143
+ parsed = _parse_skill_version_block(rel_path)
144
+ if parsed is None:
145
+ continue
146
+ version, last_updated, version_block, updated_block = parsed
147
+ if version != version_block:
148
+ fail(
149
+ f"{rel_path}: frontmatter version {version!r} does not match Version Info block {version_block!r}"
150
+ )
151
+ if last_updated != updated_block:
152
+ fail(
153
+ f"{rel_path}: frontmatter last_updated {last_updated!r} does not match Version Info block {updated_block!r}"
154
+ )
155
+
156
+
157
+ def _latest_changelog_date() -> str | None:
158
+ """Parse the date of the latest release entry in CHANGELOG.md. The file follows
159
+ Keep-a-Changelog convention — entries are reverse-chronological under a leading
160
+ dateless `## [Unreleased]` header — so the FIRST date-bearing
161
+ `## [X.Y.Z] - YYYY-MM-DD` header is the latest release. `## [Unreleased]` carries no
162
+ `- YYYY-MM-DD` suffix and so never matches this date-bearing pattern."""
163
+ match = re.search(rf"^## \[{_VERSION}\] - (\d{{4}}-\d{{2}}-\d{{2}})", read("CHANGELOG.md"), re.M)
164
+ return match.group(1) if match else None
165
+
166
+
167
+ def check_suite_skill_date_sanity() -> None:
168
+ """#377(b): the suite-tracking skill's `last_updated` must NOT predate the latest CHANGELOG
169
+ entry date — a release that bumps the suite version but forgets the date fails here.
170
+
171
+ Scope is deliberately narrow: only `academic-pipeline/SKILL.md` (the suite-tracking skill) is
172
+ date-checked. `academic-paper` / `academic-paper-reviewer` / `deep-research` version
173
+ independently and legitimately keep their own earlier last-change dates, so forcing
174
+ release-date alignment on them would be wrong (#377 out-of-scope)."""
175
+ # check_skill_version_blocks() runs first and already parses the suite SKILL. If it recorded
176
+ # an error for that file (unparseable frontmatter/table), skip rather than re-report the same
177
+ # root cause from a second re-parse here.
178
+ if any(e.startswith(f"{_SUITE_SKILL_PATH}:") for e in ERRORS):
179
+ return
180
+
181
+ changelog_date = _latest_changelog_date()
182
+ if changelog_date is None:
183
+ fail("CHANGELOG.md: could not parse latest release entry date")
184
+ return
185
+
186
+ parsed = _parse_skill_version_block(_SUITE_SKILL_PATH)
187
+ if parsed is None:
188
+ return
189
+ last_updated = parsed[1]
190
+
191
+ # ISO-8601 dates compare correctly as strings (zero-padded, fixed-width).
192
+ if last_updated < changelog_date:
193
+ fail(
194
+ f"{_SUITE_SKILL_PATH}: last_updated {last_updated!r} predates latest CHANGELOG entry "
195
+ f"date {changelog_date!r} — the suite version bumped but the skill date is stale"
196
+ )
197
+
198
+
199
+ def check_pipeline_docs() -> None:
200
+ for rel_path in (
201
+ "academic-pipeline/SKILL.md",
202
+ "academic-pipeline/agents/pipeline_orchestrator_agent.md",
203
+ ):
204
+ expect_absent(rel_path, "auto-continue in 5 seconds")
205
+ expect_contains(rel_path, "One-line status + explicit continue/pause prompt")
206
+
207
+ expect_contains(
208
+ "academic-pipeline/agents/pipeline_orchestrator_agent.md",
209
+ "Stage 2.5 can NEVER be skipped",
210
+ )
211
+ expect_contains(
212
+ "academic-pipeline/agents/pipeline_orchestrator_agent.md",
213
+ "Stage 4.5 can NEVER be skipped",
214
+ )
215
+
216
+
217
+ # A version token is a dot-separated run of ≥3 numeric components. The repo's own grammar
218
+ # already ships 4-component versions (v3.9.4.2), so a fixed `\d+\.\d+\.\d+` would capture only
219
+ # the first three components of `3.9.4.2` and silently compare a truncated `3.9.4` — making a
220
+ # genuinely-stale 4-component marker pass. `(?:\.\d+)*` is greedy, so it captures the FULL token;
221
+ # the trailing `(?!\.?\d)` is a hard right boundary so a longer numeric run can never tail-match a
222
+ # shorter capture (e.g. `3.9.4` must not partial-match inside `3.9.4.2`).
223
+ _VERSION = r"\d+\.\d+\.\d+(?:\.\d+)*(?!\.?\d)"
224
+
225
+
226
+ def _suite_version() -> str | None:
227
+ """Parse the canonical suite version from `.claude/CLAUDE.md` (`**Suite version**: X.Y.Z[.W]`)."""
228
+ match = re.search(rf"\*\*Suite version\*\*:\s*({_VERSION})", read(".claude/CLAUDE.md"))
229
+ return match.group(1) if match else None
230
+
231
+
232
+ def check_architecture_component_version() -> None:
233
+ """Invariant-4 (#345): the *current-component* `academic-pipeline` version markers in
234
+ docs/ARCHITECTURE.md must equal the suite version.
235
+
236
+ docs/ARCHITECTURE.md carries two kinds of version string and only the first must track the
237
+ suite version:
238
+ - current-component markers — the mermaid orchestrator node + the component table row + the
239
+ four stage-table `(gate)` / stage-6 rows — describe what the *current* pipeline is.
240
+ - feature-history markers — the `timeline` block (`vX.Y.Z : <feature>`) and inline
241
+ "introduced in vX.Y.Z" provenance — record which version first shipped a gate/feature and
242
+ must NOT be bumped on a release that adds no new gate.
243
+
244
+ This check anchors on the `academic-pipeline <ver>` component pattern specifically (mermaid
245
+ `<br/>vX.Y.Z` node + ` academic-pipeline vX.Y.Z` table/stage rows) and never inspects the
246
+ timeline block, so a stale current-component marker fails while a feature-history marker is
247
+ left alone. (Surfaced during the v3.11.1 release: six component markers were missed by the
248
+ bump and only caught by a manual sweep — #343/#344.)
249
+ """
250
+ rel_path = "docs/ARCHITECTURE.md"
251
+ version = _suite_version()
252
+ if version is None:
253
+ fail(".claude/CLAUDE.md: could not parse '**Suite version**: X.Y.Z' for ARCHITECTURE check")
254
+ return
255
+ text = read(rel_path)
256
+
257
+ # 1. Mermaid orchestrator node: `academic-pipeline<br/>orchestrator<br/>vX.Y.Z`.
258
+ node_versions = re.findall(
259
+ rf"academic-pipeline<br/>orchestrator<br/>v({_VERSION})", text
260
+ )
261
+ if not node_versions:
262
+ fail(f"{rel_path}: no mermaid `academic-pipeline<br/>orchestrator<br/>vX.Y.Z` node found")
263
+ for found in node_versions:
264
+ if found != version:
265
+ fail(
266
+ f"{rel_path}: mermaid orchestrator node version v{found} != suite v{version} "
267
+ f"(invariant-4: current-component marker must equal the suite version)"
268
+ )
269
+
270
+ # 2. Component table + stage rows: ` academic-pipeline vX.Y.Z` (table cell / `(gate)` rows).
271
+ # Anchored to markdown table rows (`^\s*\|` … on the same line) so the scan only ever sees
272
+ # component/stage cells — never prose like `` `academic-pipeline` v3.9.4 introduced … ``,
273
+ # which is feature-history provenance and must NOT be policed against the suite version.
274
+ # The timeline `vX.Y.Z :` form never carries the `academic-pipeline` token, so it is already
275
+ # out of scope; the table-row anchor additionally excludes any narrative mention.
276
+ row_versions = re.findall(
277
+ rf"(?m)^\s*\|.*?`?academic-pipeline`?\s+v({_VERSION})", text
278
+ )
279
+ if not row_versions:
280
+ fail(f"{rel_path}: no `academic-pipeline vX.Y.Z` component/stage row found")
281
+ for found in row_versions:
282
+ if found != version:
283
+ fail(
284
+ f"{rel_path}: `academic-pipeline v{found}` component/stage row != suite v{version} "
285
+ f"(invariant-4: current-component marker must equal the suite version)"
286
+ )
287
+
288
+
289
+ def check_readme_sections() -> None:
290
+ rel_path = "README.md"
291
+ text = read(rel_path)
292
+
293
+ expect_contains(rel_path, "version-v3.21.1-blue")
294
+ expect_contains(rel_path, "releases/tag/v3.21.1")
295
+ expect_contains(rel_path, "### v3.12.0 (2026-06-08)")
296
+ expect_contains(rel_path, "### v3.11.1 (2026-06-06)")
297
+ expect_contains(rel_path, "### v3.11.0 (2026-06-04)")
298
+ expect_contains(rel_path, "### v3.10.0 (2026-06-01)")
299
+ expect_contains(rel_path, "### v3.9.4.2 (2026-05-19)")
300
+ expect_contains(rel_path, "### v3.9.4.1 (2026-05-19)")
301
+ expect_contains(rel_path, "### v3.9.4 (2026-05-18)")
302
+ expect_contains(rel_path, "### v3.9.1 (2026-05-18)")
303
+ expect_contains(rel_path, "### v3.9.0 (2026-05-17)")
304
+ expect_contains(rel_path, "### v3.8.0 (2026-05-16)")
305
+ expect_contains(rel_path, "### v3.7.0 (2026-05-05)")
306
+ expect_contains(rel_path, "### v3.6.8 (2026-05-03)")
307
+ expect_contains(rel_path, "### v3.6.7 (2026-04-30)")
308
+ expect_contains(rel_path, "### v3.6.5 (2026-04-27)")
309
+ expect_contains(rel_path, "### v3.6.4 (2026-04-25)")
310
+ expect_contains(rel_path, "### v3.6.3 (2026-04-23)")
311
+ expect_contains(rel_path, "### v3.6.2 (2026-04-23)")
312
+ expect_contains(rel_path, "### v3.5.1 (2026-04-22)")
313
+ expect_contains(rel_path, "### v3.5.0 (2026-04-21)")
314
+ expect_contains(rel_path, "### v3.4.0 (2026-04-20)")
315
+ expect_contains(rel_path, "### v3.3.6 (2026-04-15)")
316
+ expect_contains(rel_path, "### v3.3.5 (2026-04-15)")
317
+ expect_contains(rel_path, "### v3.3.4 (2026-04-15)")
318
+ expect_contains(rel_path, "### v3.3.3 (2026-04-15)")
319
+ expect_contains(rel_path, "### v3.3.2 (2026-04-15)")
320
+ for heading in (
321
+ "#### Deep Research (8 modes)",
322
+ "#### Academic Paper (11 modes)",
323
+ "#### Academic Paper Reviewer (6 modes)",
324
+ "### Deep Research (v2.12.1)",
325
+ "### Academic Paper (v3.3.1)",
326
+ "### Academic Paper Reviewer (v1.11.1)",
327
+ "### Academic Pipeline (v3.21.1)",
328
+ ):
329
+ if heading not in text:
330
+ fail(f"{rel_path}: missing heading {heading!r}")
331
+
332
+ paper_usage = extract_section(
333
+ text, "#### Academic Paper (11 modes)", "#### Academic Paper Reviewer (6 modes)"
334
+ )
335
+ for expected in ("outline-only mode", "abstract-only mode", "disclosure mode"):
336
+ if expected not in paper_usage:
337
+ fail(f"{rel_path}: Academic Paper usage section missing {expected!r}")
338
+ for forbidden in ("bilingual-abstract mode", "writing-polish mode", "full-auto mode"):
339
+ if forbidden in paper_usage:
340
+ fail(f"{rel_path}: Academic Paper usage section still contains {forbidden!r}")
341
+
342
+ deep_usage = extract_section(
343
+ text, "#### Deep Research (8 modes)", "#### Academic Paper (11 modes)"
344
+ )
345
+ if "review mode" not in deep_usage:
346
+ fail(f"{rel_path}: Deep Research usage section missing 'review mode'")
347
+ if "paper-review" in deep_usage:
348
+ fail(f"{rel_path}: Deep Research usage section still contains 'paper-review'")
349
+
350
+ reviewer_usage = extract_section(
351
+ text, "#### Academic Paper Reviewer (6 modes)", "#### Academic Pipeline (Orchestrator)"
352
+ )
353
+ if "calibration mode" not in reviewer_usage:
354
+ fail(f"{rel_path}: reviewer usage section missing 'calibration mode'")
355
+
356
+ for forbidden in (
357
+ "6th independent reviewer",
358
+ "Peer review gains 6th independent reviewer",
359
+ ):
360
+ expect_absent(rel_path, forbidden)
361
+ # DOCX contract lines moved to docs/SETUP.md in v3.3.6; checked there instead.
362
+ expect_contains(rel_path, "DOCX (via Pandoc when available)")
363
+ check_relative_markdown_links(rel_path)
364
+
365
+
366
+ def check_readme_ja_sections() -> None:
367
+ """Symmetric coverage of README.ja-JP.md added in PR #161 (closes #170).
368
+
369
+ Pre-#170 the lint silently skipped this file. ja-JP uses ASCII parentheses
370
+ for release blocks (matching the English README), full-width parentheses
371
+ for mode and skill-detail headings, and "モード" instead of "mode".
372
+ """
373
+ rel_path = "README.ja-JP.md"
374
+ text = read(rel_path)
375
+
376
+ expect_contains(rel_path, "version-v3.21.1-blue")
377
+ expect_contains(rel_path, "releases/tag/v3.21.1")
378
+ expect_contains(rel_path, "### v3.12.0 (2026-06-08)")
379
+ expect_contains(rel_path, "### v3.11.1 (2026-06-06)")
380
+ expect_contains(rel_path, "### v3.11.0 (2026-06-04)")
381
+ expect_contains(rel_path, "### v3.10.0 (2026-06-01)")
382
+ expect_contains(rel_path, "### v3.9.4.2 (2026-05-19)")
383
+ expect_contains(rel_path, "### v3.9.4.1 (2026-05-19)")
384
+ expect_contains(rel_path, "### v3.9.4 (2026-05-18)")
385
+ expect_contains(rel_path, "### v3.9.1 (2026-05-18)")
386
+ expect_contains(rel_path, "### v3.9.0 (2026-05-17)")
387
+ expect_contains(rel_path, "### v3.8.0 (2026-05-16)")
388
+ expect_contains(rel_path, "### v3.7.0 (2026-05-05)")
389
+ expect_contains(rel_path, "### v3.6.8 (2026-05-03)")
390
+ expect_contains(rel_path, "### v3.6.7 (2026-04-30)")
391
+ expect_contains(rel_path, "### v3.6.5 (2026-04-27)")
392
+ expect_contains(rel_path, "### v3.6.4 (2026-04-25)")
393
+ expect_contains(rel_path, "### v3.6.3 (2026-04-23)")
394
+ expect_contains(rel_path, "### v3.6.2 (2026-04-23)")
395
+ expect_contains(rel_path, "### v3.5.1 (2026-04-22)")
396
+ expect_contains(rel_path, "### v3.5.0 (2026-04-21)")
397
+ expect_contains(rel_path, "### v3.4.0 (2026-04-20)")
398
+ expect_contains(rel_path, "### v3.3.6 (2026-04-15)")
399
+ expect_contains(rel_path, "### v3.3.5 (2026-04-15)")
400
+ expect_contains(rel_path, "### v3.3.4 (2026-04-15)")
401
+ expect_contains(rel_path, "### v3.3.3 (2026-04-15)")
402
+ expect_contains(rel_path, "### v3.3.2 (2026-04-15)")
403
+ for heading in (
404
+ "#### Deep Research(8 モード)",
405
+ "#### Academic Paper(11 モード)",
406
+ "#### Academic Paper Reviewer(6 モード)",
407
+ "#### Academic Pipeline(オーケストレーター)",
408
+ "### Deep Research(v2.12.1)",
409
+ "### Academic Paper(v3.3.1)",
410
+ "### Academic Paper Reviewer(v1.11.1)",
411
+ "### Academic Pipeline(v3.21.1)",
412
+ ):
413
+ if heading not in text:
414
+ fail(f"{rel_path}: missing heading {heading!r}")
415
+
416
+ for forbidden in (
417
+ "6th independent reviewer",
418
+ "Peer review gains 6th independent reviewer",
419
+ ):
420
+ expect_absent(rel_path, forbidden)
421
+
422
+ # Mode-section content guards (e.g. `outline-only モード` inside the
423
+ # Academic Paper usage block) are deliberately not enforced here; the
424
+ # zh-TW checker uses `extract_section` for that and #171's schema-driven
425
+ # refactor will fold the three locales together. Adding the extract_section
426
+ # mirror now would be discarded by that refactor.
427
+ expect_contains(rel_path, "DOCX(利用可能な場合 Pandoc 経由)")
428
+ check_relative_markdown_links(rel_path)
429
+
430
+
431
+ def check_readme_ko_sections() -> None:
432
+ """Symmetric coverage of README.ko-KR.md added with Korean localization.
433
+
434
+ Korean typography uses ASCII parentheses, so the release-block headings match
435
+ the English / ja-JP convention verbatim (NOT the full-width zh-CN/zh-TW form).
436
+ Localized mode headings use ASCII parens + "N개 모드"; skill-detail headings
437
+ reuse the English ASCII-paren form. Mode-section inner-content guards are
438
+ deliberately omitted here, mirroring check_readme_ja_sections — the #171
439
+ schema-driven refactor will fold the locales together, so an extract_section
440
+ mirror added now would be discarded by it.
441
+ """
442
+ rel_path = "README.ko-KR.md"
443
+ text = read(rel_path)
444
+
445
+ expect_contains(rel_path, "version-v3.21.1-blue")
446
+ expect_contains(rel_path, "releases/tag/v3.21.1")
447
+ expect_contains(rel_path, "### v3.18.0 (2026-07-18)")
448
+ expect_contains(rel_path, "### v3.12.0 (2026-06-08)")
449
+ expect_contains(rel_path, "### v3.11.1 (2026-06-06)")
450
+ expect_contains(rel_path, "### v3.11.0 (2026-06-04)")
451
+ expect_contains(rel_path, "### v3.10.0 (2026-06-01)")
452
+ expect_contains(rel_path, "### v3.9.4.2 (2026-05-19)")
453
+ expect_contains(rel_path, "### v3.9.4.1 (2026-05-19)")
454
+ expect_contains(rel_path, "### v3.9.4 (2026-05-18)")
455
+ expect_contains(rel_path, "### v3.9.1 (2026-05-18)")
456
+ expect_contains(rel_path, "### v3.9.0 (2026-05-17)")
457
+ expect_contains(rel_path, "### v3.8.0 (2026-05-16)")
458
+ expect_contains(rel_path, "### v3.7.0 (2026-05-05)")
459
+ expect_contains(rel_path, "### v3.6.8 (2026-05-03)")
460
+ expect_contains(rel_path, "### v3.6.7 (2026-04-30)")
461
+ expect_contains(rel_path, "### v3.6.5 (2026-04-27)")
462
+ expect_contains(rel_path, "### v3.6.4 (2026-04-25)")
463
+ expect_contains(rel_path, "### v3.6.3 (2026-04-23)")
464
+ expect_contains(rel_path, "### v3.6.2 (2026-04-23)")
465
+ expect_contains(rel_path, "### v3.5.1 (2026-04-22)")
466
+ expect_contains(rel_path, "### v3.5.0 (2026-04-21)")
467
+ expect_contains(rel_path, "### v3.4.0 (2026-04-20)")
468
+ expect_contains(rel_path, "### v3.3.6 (2026-04-15)")
469
+ expect_contains(rel_path, "### v3.3.5 (2026-04-15)")
470
+ expect_contains(rel_path, "### v3.3.4 (2026-04-15)")
471
+ expect_contains(rel_path, "### v3.3.3 (2026-04-15)")
472
+ expect_contains(rel_path, "### v3.3.2 (2026-04-15)")
473
+ for heading in (
474
+ "#### Deep Research (8개 모드)",
475
+ "#### Academic Paper (11개 모드)",
476
+ "#### Academic Paper Reviewer (6개 모드)",
477
+ "#### Academic Pipeline (오케스트레이터)",
478
+ "### Deep Research (v2.12.1)",
479
+ "### Academic Paper (v3.3.1)",
480
+ "### Academic Paper Reviewer (v1.11.1)",
481
+ "### Academic Pipeline (v3.21.1)",
482
+ ):
483
+ if heading not in text:
484
+ fail(f"{rel_path}: missing heading {heading!r}")
485
+
486
+ for forbidden in (
487
+ "6th independent reviewer",
488
+ "Peer review gains 6th independent reviewer",
489
+ ):
490
+ expect_absent(rel_path, forbidden)
491
+
492
+ expect_contains(rel_path, "DOCX (가능한 경우 Pandoc 경유)")
493
+ check_relative_markdown_links(rel_path)
494
+
495
+
496
+ ZH_README_CONFIGS = (
497
+ {
498
+ "rel_path": "README.zh-TW.md",
499
+ "headings": (
500
+ "#### Deep Research(深度研究,8 種模式)",
501
+ "#### Academic Paper(學術論文撰寫,11 種模式)",
502
+ "#### Academic Paper Reviewer(論文審查,6 種模式)",
503
+ "### Deep Research (v2.12.1)",
504
+ "### Academic Paper (v3.3.1)",
505
+ "### Academic Paper Reviewer (v1.11.1)",
506
+ "### Academic Pipeline (v3.21.1)",
507
+ ),
508
+ "paper_start": "#### Academic Paper(學術論文撰寫,11 種模式)",
509
+ "reviewer_start": "#### Academic Paper Reviewer(論文審查,6 種模式)",
510
+ "pipeline_start": "#### Academic Pipeline(全流程調度器)",
511
+ "deep_start": "#### Deep Research(深度研究,8 種模式)",
512
+ "docx_line": "DOCX(Pandoc 可用時)",
513
+ },
514
+ {
515
+ "rel_path": "README.zh-CN.md",
516
+ "headings": (
517
+ "#### Deep Research(深度研究,8 种模式)",
518
+ "#### Academic Paper(学术论文撰写,11 种模式)",
519
+ "#### Academic Paper Reviewer(论文审查,6 种模式)",
520
+ "### Deep Research (v2.12.1)",
521
+ "### Academic Paper (v3.3.1)",
522
+ "### Academic Paper Reviewer (v1.11.1)",
523
+ "### Academic Pipeline (v3.21.1)",
524
+ ),
525
+ "paper_start": "#### Academic Paper(学术论文撰写,11 种模式)",
526
+ "reviewer_start": "#### Academic Paper Reviewer(论文审查,6 种模式)",
527
+ "pipeline_start": "#### Academic Pipeline(全流程调度器)",
528
+ "deep_start": "#### Deep Research(深度研究,8 种模式)",
529
+ "docx_line": "DOCX(Pandoc 可用时)",
530
+ },
531
+ )
532
+
533
+
534
+ def check_readme_zh_sections() -> None:
535
+ for config in ZH_README_CONFIGS:
536
+ rel_path = config["rel_path"]
537
+ text = read(rel_path)
538
+
539
+ expect_contains(rel_path, "version-v3.21.1-blue")
540
+ expect_contains(rel_path, "releases/tag/v3.21.1")
541
+ expect_contains(rel_path, "### v3.12.0(2026-06-08)")
542
+ expect_contains(rel_path, "### v3.11.1(2026-06-06)")
543
+ expect_contains(rel_path, "### v3.11.0(2026-06-04)")
544
+ expect_contains(rel_path, "### v3.10.0(2026-06-01)")
545
+ expect_contains(rel_path, "### v3.9.4.2(2026-05-19)")
546
+ expect_contains(rel_path, "### v3.9.4.1(2026-05-19)")
547
+ expect_contains(rel_path, "### v3.9.4(2026-05-18)")
548
+ expect_contains(rel_path, "### v3.9.1(2026-05-18)")
549
+ expect_contains(rel_path, "### v3.9.0(2026-05-17)")
550
+ expect_contains(rel_path, "### v3.8.0(2026-05-16)")
551
+ expect_contains(rel_path, "### v3.7.0(2026-05-05)")
552
+ expect_contains(rel_path, "### v3.6.8(2026-05-03)")
553
+ expect_contains(rel_path, "### v3.6.7(2026-04-30)")
554
+ expect_contains(rel_path, "### v3.6.5(2026-04-27)")
555
+ expect_contains(rel_path, "### v3.6.4(2026-04-25)")
556
+ expect_contains(rel_path, "### v3.6.3(2026-04-23)")
557
+ expect_contains(rel_path, "### v3.6.2(2026-04-23)")
558
+ expect_contains(rel_path, "### v3.5.1(2026-04-22)")
559
+ expect_contains(rel_path, "### v3.5.0(2026-04-21)")
560
+ expect_contains(rel_path, "### v3.4.0(2026-04-20)")
561
+ expect_contains(rel_path, "### v3.3.6 (2026-04-15)")
562
+ expect_contains(rel_path, "### v3.3.5 (2026-04-15)")
563
+ expect_contains(rel_path, "### v3.3.4 (2026-04-15)")
564
+ expect_contains(rel_path, "### v3.3.3 (2026-04-15)")
565
+ expect_contains(rel_path, "### v3.3.2 (2026-04-15)")
566
+ for heading in config["headings"]:
567
+ if heading not in text:
568
+ fail(f"{rel_path}: missing heading {heading!r}")
569
+
570
+ paper_usage = extract_section(
571
+ text,
572
+ config["paper_start"],
573
+ config["reviewer_start"],
574
+ )
575
+ for expected in ("outline-only mode", "abstract-only mode", "disclosure mode"):
576
+ if expected not in paper_usage:
577
+ fail(f"{rel_path}: Academic Paper usage section missing {expected!r}")
578
+ for forbidden in ("bilingual-abstract mode", "writing-polish mode", "full-auto mode"):
579
+ if forbidden in paper_usage:
580
+ fail(f"{rel_path}: Academic Paper usage section still contains {forbidden!r}")
581
+
582
+ deep_usage = extract_section(
583
+ text,
584
+ config["deep_start"],
585
+ config["paper_start"],
586
+ )
587
+ if "review mode" not in deep_usage:
588
+ fail(f"{rel_path}: Deep Research usage section missing 'review mode'")
589
+ if "paper-review" in deep_usage:
590
+ fail(f"{rel_path}: Deep Research usage section still contains 'paper-review'")
591
+
592
+ reviewer_usage = extract_section(
593
+ text,
594
+ config["reviewer_start"],
595
+ config["pipeline_start"],
596
+ )
597
+ if "calibration mode" not in reviewer_usage:
598
+ fail(f"{rel_path}: reviewer usage section missing 'calibration mode'")
599
+
600
+ for forbidden in (
601
+ "6th independent reviewer",
602
+ "Peer review gains 6th independent reviewer",
603
+ ):
604
+ expect_absent(rel_path, forbidden)
605
+ # DOCX contract lines moved to setup docs in v3.3.6; checked there instead.
606
+ expect_contains(rel_path, config["docx_line"])
607
+ check_relative_markdown_links(rel_path)
608
+
609
+
610
+ def check_setup_docs() -> None:
611
+ expect_contains("docs/SETUP.md", "Direct `.docx` generation uses [Pandoc]")
612
+ expect_contains(
613
+ "docs/SETUP.md",
614
+ "Direct `.docx` generation requires Pandoc, and PDF generation requires `tectonic`",
615
+ )
616
+ expect_contains("docs/SETUP.zh-TW.md", "若要直接產出 `.docx`,需要安裝 [Pandoc]")
617
+ expect_contains(
618
+ "docs/SETUP.zh-TW.md",
619
+ "直接產出 `.docx` 需要 Pandoc,PDF 需要 `tectonic`",
620
+ )
621
+ check_relative_markdown_links("docs/SETUP.md")
622
+ check_relative_markdown_links("docs/SETUP.zh-TW.md")
623
+ # #758 data-flow map: its outbound relative links (audit doc, SECURITY,
624
+ # THIRD_PARTY, cross_model_verification) must keep resolving.
625
+ check_relative_markdown_links("docs/DATA_FLOWS.md")
626
+
627
+
628
+ def check_docx_contract() -> None:
629
+ expect_contains(
630
+ "academic-paper/SKILL.md",
631
+ "LaTeX/DOCX-via-Pandoc/PDF output",
632
+ )
633
+ expect_contains(
634
+ "academic-paper/agents/formatter_agent.md",
635
+ "If Pandoc is available, generate the `.docx` file directly",
636
+ )
637
+ expect_contains(
638
+ "academic-paper/agents/formatter_agent.md",
639
+ "If Pandoc is unavailable, provide complete markdown + DOCX conversion instructions",
640
+ )
641
+ expect_contains(
642
+ "academic-pipeline/SKILL.md",
643
+ "DOCX via Pandoc when available, otherwise conversion instructions",
644
+ )
645
+ expect_contains(
646
+ "academic-pipeline/agents/pipeline_orchestrator_agent.md",
647
+ "DOCX via Pandoc when available (otherwise instructions)",
648
+ )
649
+ for rel_path in (
650
+ "academic-pipeline/SKILL.md",
651
+ "academic-pipeline/agents/pipeline_orchestrator_agent.md",
652
+ ):
653
+ expect_absent(rel_path, "Auto-produce MD + DOCX")
654
+
655
+
656
+ def check_reference_docs() -> None:
657
+ expect_contains(
658
+ "academic-pipeline/references/passport_as_reset_boundary.md",
659
+ "# Passport as Reset Boundary (v3.6.3)",
660
+ )
661
+ expect_contains(
662
+ "academic-pipeline/references/passport_as_reset_boundary.md",
663
+ "## `resume_from_passport` mode contract",
664
+ )
665
+ expect_contains(
666
+ "academic-pipeline/references/passport_as_reset_boundary.md",
667
+ "## Iron rules",
668
+ )
669
+ # Unified PASSPORT-RESET tag format across protocol doc + orchestrator emission + checkpoint template.
670
+ # Divergence here breaks cross-session machine-stable handoff.
671
+ tag_format = "[PASSPORT-RESET: hash=<hash>, stage=<completed>, next=<next>]"
672
+ expect_contains(
673
+ "academic-pipeline/references/passport_as_reset_boundary.md",
674
+ tag_format,
675
+ )
676
+ expect_contains(
677
+ "academic-pipeline/agents/pipeline_orchestrator_agent.md",
678
+ tag_format,
679
+ )
680
+
681
+
682
+ def check_rebuttal_audit_guard() -> None:
683
+ """The rebuttal-audit mode section must declare its integrity boundary.
684
+
685
+ A standalone rebuttal-audit invocation runs outside the pipeline, so it must
686
+ NOT emit Schema 11 / Material Passport / ready_to_submit. This guard is the
687
+ load-bearing reason rebuttal-audit is safe to ship as a mode rather than a
688
+ pipeline stage; if the suppression language is ever dropped, the mode would
689
+ silently re-introduce the false-certification risk it was designed to avoid.
690
+ """
691
+ text = read("academic-paper/SKILL.md")
692
+ m = re.search(r"##\s*Rebuttal-Audit Mode.*?(?=\n##\s|\Z)", text, re.DOTALL)
693
+ section = m.group(0) if m else ""
694
+ if not section:
695
+ fail("academic-paper/SKILL.md: missing '## Rebuttal-Audit Mode' section")
696
+ return
697
+ for kw in ["Schema 11", "Material Passport", "ready_to_submit"]:
698
+ if kw not in section:
699
+ fail(
700
+ f"academic-paper/SKILL.md Rebuttal-Audit Mode section must declare "
701
+ f"{kw!r} suppression (integrity boundary)"
702
+ )
703
+ if "MUST NOT" not in section:
704
+ fail(
705
+ "academic-paper/SKILL.md Rebuttal-Audit Mode section lacks an explicit "
706
+ "'MUST NOT' suppression statement"
707
+ )
708
+
709
+
710
+ def check_ideation_diversity_no_call_contract() -> None:
711
+ """Keep #659's schemas, runner, docs, and CI registration aligned."""
712
+ suite = "evals/heldout/within_session_ideation_diversity"
713
+ schema_paths = {
714
+ "run_plan": f"{suite}/run_plan.schema.json",
715
+ "authorization": f"{suite}/authorization_record.schema.json",
716
+ "transcript": f"{suite}/transcript.schema.json",
717
+ "ingestion": f"{suite}/ingestion_manifest.schema.json",
718
+ "stop_intent": f"{suite}/stop_intent.schema.json",
719
+ "blind_packet": f"{suite}/blind_packet.schema.json",
720
+ "blind_inventory": f"{suite}/blind_inventory.schema.json",
721
+ "blind_manifest": f"{suite}/blind_manifest.schema.json",
722
+ "private_arm_map": f"{suite}/private_arm_map.schema.json",
723
+ "blind_intent": f"{suite}/blind_intent.schema.json",
724
+ }
725
+ schemas: dict[str, dict] = {}
726
+ for name, rel_path in schema_paths.items():
727
+ try:
728
+ value = json.loads(read(rel_path))
729
+ except (OSError, UnicodeError, json.JSONDecodeError) as exc:
730
+ fail(f"{rel_path}: cannot load #659 contract: {exc}")
731
+ continue
732
+ if not isinstance(value, dict) or value.get("additionalProperties") is not False:
733
+ fail(f"{rel_path}: root contract must be a closed object")
734
+ continue
735
+ schemas[name] = value
736
+
737
+ plan = schemas.get("run_plan", {})
738
+ plan_properties = plan.get("properties", {})
739
+ design = plan_properties.get("design", {}).get("properties", {})
740
+ expected_design = {
741
+ "experiments": 2,
742
+ "scenarios": 6,
743
+ "arms_per_experiment": 2,
744
+ "replicates_per_scenario_arm": 2,
745
+ "subject_session_cells": 48,
746
+ }
747
+ for field, expected in expected_design.items():
748
+ if design.get(field, {}).get("const") != expected:
749
+ fail(f"{schema_paths['run_plan']}: {field} must remain const {expected}")
750
+ execution = plan.get("$defs", {}).get("execution", {}).get("properties", {})
751
+ no_call_constants = {
752
+ "tools": [],
753
+ "web_enabled": False,
754
+ "runner_transport": "none",
755
+ "dispatch_available": False,
756
+ "api_spend_ceiling_usd": 0,
757
+ "api_fallback": False,
758
+ "envelope_grants_consent": False,
759
+ "fresh_external_authorization_required": True,
760
+ }
761
+ for field, expected in no_call_constants.items():
762
+ if execution.get(field, {}).get("const") != expected:
763
+ fail(f"{schema_paths['run_plan']}: no-call constant {field!r} drifted")
764
+ provenance = plan_properties.get("suite_commit_provenance", {}).get(
765
+ "properties", {}
766
+ )
767
+ if provenance.get("status", {}).get("const") != "operator_declared_unverified":
768
+ fail(f"{schema_paths['run_plan']}: suite commit must remain unverified")
769
+ cap_boundary = execution.get("token_cap_verification", {}).get("properties", {})
770
+ for field, expected in {
771
+ "status": "operator_declared_unverified",
772
+ "enforced_by_no_call_runner": False,
773
+ "observed_usage_recorded": False,
774
+ "provider_tokenizer_verified": False,
775
+ }.items():
776
+ if cap_boundary.get(field, {}).get("const") != expected:
777
+ fail(
778
+ f"{schema_paths['run_plan']}: token-cap boundary {field!r} drifted"
779
+ )
780
+ judge = plan_properties.get("judge_requirements", {}).get("properties", {})
781
+ for field, expected in {
782
+ "first_round_assignment_ledger_required_before_delivery": True,
783
+ "same_role_card_cross_arm_or_replicate_exposure_forbidden": True,
784
+ "bundle_alone_proves_judge_exposure_blindness": False,
785
+ }.items():
786
+ if judge.get(field, {}).get("const") != expected:
787
+ fail(f"{schema_paths['run_plan']}: judge exposure boundary {field!r} drifted")
788
+ if plan_properties.get("cells", {}).get("minItems") != 48 or plan_properties.get(
789
+ "cells", {}
790
+ ).get("maxItems") != 48:
791
+ fail(f"{schema_paths['run_plan']}: cells must remain exactly 48")
792
+ assets = plan_properties.get("asset_bindings", {})
793
+ if assets.get("minItems") != 18 or assets.get("maxItems") != 18:
794
+ fail(f"{schema_paths['run_plan']}: asset bindings must remain exactly 18")
795
+
796
+ stop_receipt = (
797
+ schemas.get("ingestion", {})
798
+ .get("$defs", {})
799
+ .get("stop_receipt", {})
800
+ .get("properties", {})
801
+ )
802
+ if "pre_stop_inventory" not in stop_receipt:
803
+ fail(f"{schema_paths['ingestion']}: compact pre-stop inventory binding missing")
804
+ blind_intent = schemas.get("blind_intent", {}).get("properties", {})
805
+ for field, expected in {
806
+ "staging_ref": "blind-staging",
807
+ "final_ref": "blind",
808
+ "recovery_policy": "exact_recovery_only_no_second_bundle",
809
+ }.items():
810
+ if blind_intent.get(field, {}).get("const") != expected:
811
+ fail(f"{schema_paths['blind_intent']}: {field!r} recovery boundary drifted")
812
+ intent_protection = blind_intent.get("protection", {}).get("properties", {})
813
+ for field, expected in {
814
+ "procedural_nondisclosure_only": True,
815
+ "file_mode": "0600",
816
+ "deliver_to_judges": False,
817
+ }.items():
818
+ if intent_protection.get(field, {}).get("const") != expected:
819
+ fail(
820
+ f"{schema_paths['blind_intent']}: "
821
+ f"protection boundary {field!r} drifted"
822
+ )
823
+
824
+ runner_path = "scripts/run_ideation_diversity_no_call.py"
825
+ runner_source = read(runner_path)
826
+ try:
827
+ tree = ast.parse(runner_source)
828
+ except SyntaxError as exc:
829
+ fail(f"{runner_path}: cannot parse runner AST: {exc}")
830
+ tree = ast.Module(body=[], type_ignores=[])
831
+ allowed_direct_imports = {
832
+ "argparse",
833
+ "base64",
834
+ "copy",
835
+ "hashlib",
836
+ "json",
837
+ "os",
838
+ "re",
839
+ "secrets",
840
+ "stat",
841
+ "sys",
842
+ "unicodedata",
843
+ "validate_ideation_diversity_assets",
844
+ }
845
+ allowed_from_imports = {
846
+ "__future__": {"annotations"},
847
+ "datetime": {"datetime"},
848
+ "jsonschema": {"Draft202012Validator", "FormatChecker"},
849
+ "pathlib": {"Path"},
850
+ "typing": {"Any", "NoReturn"},
851
+ }
852
+ allowed_module_calls = {
853
+ "argparse": {"ArgumentParser"},
854
+ "base64": {"b64decode", "b64encode"},
855
+ "copy": {"deepcopy"},
856
+ "hashlib": {"sha256"},
857
+ "json": {"dumps", "loads"},
858
+ "os": {
859
+ "chmod",
860
+ "close",
861
+ "fsync",
862
+ "link",
863
+ "open",
864
+ "rename",
865
+ "replace",
866
+ "write",
867
+ },
868
+ "re": {"compile", "escape", "search"},
869
+ "secrets": {"token_hex"},
870
+ "stat": {"S_IFMT", "S_IMODE", "S_ISREG"},
871
+ "unicodedata": {"category", "normalize"},
872
+ "validate_ideation_diversity_assets": {"load_assets", "render_variant"},
873
+ }
874
+ allowed_module_constants = {
875
+ "argparse": {"ArgumentParser", "Namespace"},
876
+ "json": {"JSONDecodeError"},
877
+ "os": {
878
+ "O_CREAT",
879
+ "O_DIRECTORY",
880
+ "O_EXCL",
881
+ "O_NOFOLLOW",
882
+ "O_RDONLY",
883
+ "O_WRONLY",
884
+ },
885
+ "re": {"IGNORECASE"},
886
+ }
887
+ forbidden_dynamic_names = {
888
+ "__builtins__",
889
+ "__import__",
890
+ "breakpoint",
891
+ "compile",
892
+ "delattr",
893
+ "eval",
894
+ "exec",
895
+ "getattr",
896
+ "globals",
897
+ "locals",
898
+ "setattr",
899
+ "vars",
900
+ }
901
+ forbidden_dynamic_attributes = {
902
+ "Popen",
903
+ "__bases__",
904
+ "__builtins__",
905
+ "__class__",
906
+ "__closure__",
907
+ "__code__",
908
+ "__dict__",
909
+ "__getattribute__",
910
+ "__globals__",
911
+ "__import__",
912
+ "__loader__",
913
+ "__subclasses__",
914
+ "_getframe",
915
+ "call",
916
+ "check_call",
917
+ "check_output",
918
+ "connect",
919
+ "create_connection",
920
+ "execv",
921
+ "execve",
922
+ "f_builtins",
923
+ "f_globals",
924
+ "f_locals",
925
+ "fork",
926
+ "import_module",
927
+ "modules",
928
+ "popen",
929
+ "request",
930
+ "run",
931
+ "spawn",
932
+ "system",
933
+ "urlopen",
934
+ }
935
+ commands: set[str] = set()
936
+ forbidden_imports: set[str] = set()
937
+ direct_module_bindings: dict[str, str] = {}
938
+ for node in ast.walk(tree):
939
+ if isinstance(node, ast.Import):
940
+ for alias in node.names:
941
+ if alias.name not in allowed_direct_imports:
942
+ forbidden_imports.add(alias.name)
943
+ continue
944
+ binding = alias.asname or alias.name
945
+ existing = direct_module_bindings.get(binding)
946
+ if existing is not None and existing != alias.name:
947
+ forbidden_imports.add(f"ambiguous-binding:{binding}")
948
+ direct_module_bindings[binding] = alias.name
949
+ elif isinstance(node, ast.ImportFrom):
950
+ module = node.module or "<relative>"
951
+ allowed_symbols = (
952
+ allowed_from_imports.get(module, set())
953
+ if node.level == 0
954
+ else set()
955
+ )
956
+ forbidden_imports.update(
957
+ f"{module}.{alias.name}"
958
+ for alias in node.names
959
+ if alias.name not in allowed_symbols
960
+ )
961
+ if (
962
+ isinstance(node, ast.Call)
963
+ and isinstance(node.func, ast.Attribute)
964
+ and node.func.attr == "add_parser"
965
+ and node.args
966
+ and isinstance(node.args[0], ast.Constant)
967
+ and isinstance(node.args[0].value, str)
968
+ ):
969
+ commands.add(node.args[0].value)
970
+ if forbidden_imports:
971
+ fail(
972
+ f"{runner_path}: imports must match the exact import allowlist: "
973
+ f"{sorted(forbidden_imports)!r}"
974
+ )
975
+
976
+ shadowed_module_bindings: set[str] = set()
977
+ for node in ast.walk(tree):
978
+ if (
979
+ isinstance(node, ast.Name)
980
+ and isinstance(node.ctx, (ast.Store, ast.Del))
981
+ and node.id in direct_module_bindings
982
+ ):
983
+ shadowed_module_bindings.add(node.id)
984
+ elif isinstance(node, ast.arg) and node.arg in direct_module_bindings:
985
+ shadowed_module_bindings.add(node.arg)
986
+ elif isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef, ast.ClassDef)):
987
+ if node.name in direct_module_bindings:
988
+ shadowed_module_bindings.add(node.name)
989
+ elif isinstance(node, ast.ExceptHandler):
990
+ if isinstance(node.name, str) and node.name in direct_module_bindings:
991
+ shadowed_module_bindings.add(node.name)
992
+ elif isinstance(node, (ast.MatchAs, ast.MatchStar)):
993
+ if isinstance(node.name, str) and node.name in direct_module_bindings:
994
+ shadowed_module_bindings.add(node.name)
995
+ elif isinstance(node, ast.MatchMapping):
996
+ if isinstance(node.rest, str) and node.rest in direct_module_bindings:
997
+ shadowed_module_bindings.add(node.rest)
998
+ elif isinstance(node, ast.ImportFrom):
999
+ for alias in node.names:
1000
+ binding = alias.asname or alias.name
1001
+ if binding in direct_module_bindings:
1002
+ shadowed_module_bindings.add(binding)
1003
+ if shadowed_module_bindings:
1004
+ fail(
1005
+ f"{runner_path}: direct module bindings cannot be shadowed: "
1006
+ f"{sorted(shadowed_module_bindings)!r}"
1007
+ )
1008
+
1009
+ parents = {
1010
+ child: parent
1011
+ for parent in ast.walk(tree)
1012
+ for child in ast.iter_child_nodes(parent)
1013
+ }
1014
+ module_reference_errors: set[str] = set()
1015
+ for node in ast.walk(tree):
1016
+ if not (
1017
+ isinstance(node, ast.Name)
1018
+ and isinstance(node.ctx, ast.Load)
1019
+ and node.id in direct_module_bindings
1020
+ ):
1021
+ continue
1022
+ module = direct_module_bindings[node.id]
1023
+ parent = parents.get(node)
1024
+ allowed_hasattr = (
1025
+ isinstance(parent, ast.Call)
1026
+ and isinstance(parent.func, ast.Name)
1027
+ and parent.func.id == "hasattr"
1028
+ and len(parent.args) == 2
1029
+ and parent.args[0] is node
1030
+ and isinstance(parent.args[1], ast.Constant)
1031
+ and parent.args[1].value in {"O_DIRECTORY", "O_NOFOLLOW"}
1032
+ and module == "os"
1033
+ )
1034
+ if allowed_hasattr:
1035
+ continue
1036
+ if not (isinstance(parent, ast.Attribute) and parent.value is node):
1037
+ module_reference_errors.add(
1038
+ f"{module} via {node.id}: bare module reference"
1039
+ )
1040
+ continue
1041
+ attributes = [parent.attr]
1042
+ outer = parent
1043
+ while True:
1044
+ ancestor = parents.get(outer)
1045
+ if not (
1046
+ isinstance(ancestor, ast.Attribute) and ancestor.value is outer
1047
+ ):
1048
+ break
1049
+ attributes.append(ancestor.attr)
1050
+ outer = ancestor
1051
+ attribute_path = ".".join(attributes)
1052
+ use_parent = parents.get(outer)
1053
+ allowed_call = (
1054
+ attribute_path in allowed_module_calls.get(module, set())
1055
+ and isinstance(use_parent, ast.Call)
1056
+ and use_parent.func is outer
1057
+ )
1058
+ allowed_print_value = (
1059
+ module == "sys"
1060
+ and attribute_path == "stderr"
1061
+ and isinstance(use_parent, ast.keyword)
1062
+ and use_parent.arg == "file"
1063
+ and isinstance(parents.get(use_parent), ast.Call)
1064
+ and isinstance(parents[use_parent].func, ast.Name)
1065
+ and parents[use_parent].func.id == "print"
1066
+ )
1067
+ allowed_constant = (
1068
+ attribute_path in allowed_module_constants.get(module, set())
1069
+ and isinstance(outer.ctx, ast.Load)
1070
+ )
1071
+ if not (allowed_call or allowed_print_value or allowed_constant):
1072
+ module_reference_errors.add(
1073
+ f"{module} via {node.id}.{attribute_path}"
1074
+ )
1075
+ if module_reference_errors:
1076
+ fail(
1077
+ f"{runner_path}: direct module references must match exact "
1078
+ "current-use call/value allowlists: "
1079
+ f"{sorted(module_reference_errors)!r}"
1080
+ )
1081
+
1082
+ dynamic_references: set[str] = set()
1083
+ for node in ast.walk(tree):
1084
+ if isinstance(node, ast.Name) and node.id in forbidden_dynamic_names:
1085
+ dynamic_references.add(node.id)
1086
+ elif (
1087
+ isinstance(node, ast.Attribute)
1088
+ and node.attr in forbidden_dynamic_attributes
1089
+ ):
1090
+ dynamic_references.add(node.attr)
1091
+ if dynamic_references:
1092
+ fail(
1093
+ f"{runner_path}: dynamic import, introspection, process, or network "
1094
+ f"references are forbidden: {sorted(dynamic_references)!r}"
1095
+ )
1096
+ expected_commands = {
1097
+ "init-run",
1098
+ "materialize",
1099
+ "validate",
1100
+ "ingest",
1101
+ "prepare-blind-packet",
1102
+ }
1103
+ if commands != expected_commands:
1104
+ fail(f"{runner_path}: command set must be exactly {sorted(expected_commands)!r}")
1105
+
1106
+ readme = f"{suite}/README.md"
1107
+ design_doc = "docs/design/2026-08-13-659-within-session-ideation-diversity-design.md"
1108
+ for rel_path, phrases in (
1109
+ (
1110
+ readme,
1111
+ (
1112
+ "48-cell plan",
1113
+ "no transport, dispatch, probe",
1114
+ "The first binding",
1115
+ "compact canonical digest",
1116
+ "blind-intent.json",
1117
+ "exactly one isolated packet",
1118
+ "cannot authenticate the operator",
1119
+ "two independent human judges",
1120
+ ),
1121
+ ),
1122
+ (
1123
+ design_doc,
1124
+ (
1125
+ "Phase-2 no-call execution envelope",
1126
+ "= 48 subject-session",
1127
+ "API spend ceiling USD 0",
1128
+ "48 write-once isolated single-session packets",
1129
+ "durable deterministic blind intent",
1130
+ "does not authenticate operator identity",
1131
+ "No subject, actor, judge, or adjudicator session is authorized",
1132
+ ),
1133
+ ),
1134
+ ):
1135
+ for phrase in phrases:
1136
+ expect_contains(rel_path, phrase)
1137
+ expect_contains(
1138
+ "scripts/_ci_pytest_manifest.toml",
1139
+ 'id = "659-within-session-ideation-diversity-no-call-envelope"',
1140
+ )
1141
+ expect_contains(
1142
+ "scripts/_ci_pytest_manifest.toml",
1143
+ 'path = "scripts/test_run_ideation_diversity_no_call.py"',
1144
+ )
1145
+ expect_contains(
1146
+ "CHANGELOG.md",
1147
+ "Within-session ideation-diversity Phase-2 no-call envelope (#659)",
1148
+ )
1149
+ def check_indirect_prompt_injection_no_call_envelope() -> None:
1150
+ """Pin #675 Phase-2's no-call surface and human-evidence boundary."""
1151
+ readme = "evals/heldout/indirect_prompt_injection_behavior/README.md"
1152
+ design = "docs/design/2026-08-13-675-indirect-prompt-injection-behavior-eval-spec.md"
1153
+ workflow = ".github/workflows/spec-consistency.yml"
1154
+ manifest = "scripts/_ci_pytest_manifest.toml"
1155
+ for rel_path in (
1156
+ "evals/heldout/indirect_prompt_injection_behavior/run_plan.schema.json",
1157
+ "evals/heldout/indirect_prompt_injection_behavior/authorization_record.schema.json",
1158
+ "evals/heldout/indirect_prompt_injection_behavior/transcript.schema.json",
1159
+ "evals/heldout/indirect_prompt_injection_behavior/ingestion_manifest.schema.json",
1160
+ "evals/heldout/indirect_prompt_injection_behavior/blind_session_packet.schema.json",
1161
+ "evals/heldout/indirect_prompt_injection_behavior/blind_inventory.schema.json",
1162
+ "evals/heldout/indirect_prompt_injection_behavior/blind_private_map.schema.json",
1163
+ "evals/heldout/indirect_prompt_injection_behavior/blind_manifest.schema.json",
1164
+ "evals/heldout/indirect_prompt_injection_behavior/stop_intent.schema.json",
1165
+ "evals/heldout/indirect_prompt_injection_behavior/judge_assignment_ledger.schema.json",
1166
+ "evals/heldout/indirect_prompt_injection_behavior/journal_token.schema.json",
1167
+ "scripts/run_indirect_prompt_injection_no_call.py",
1168
+ "scripts/check_indirect_prompt_injection_no_call.py",
1169
+ "scripts/test_run_indirect_prompt_injection_no_call.py",
1170
+ ):
1171
+ if not (ROOT / rel_path).is_file():
1172
+ fail(f"#675 Phase-2 required surface is missing: {rel_path}")
1173
+ for needle in (
1174
+ "8 scenarios x 2 content conditions x 2 guidance",
1175
+ "runner_transport=none",
1176
+ "64 complete records",
1177
+ "two independent arm-blind human judges",
1178
+ "separate arm-blind human",
1179
+ "does not verify",
1180
+ "operator identity",
1181
+ "pinned canonical-event decoder",
1182
+ "unique receipt id",
1183
+ "write-once stop intent",
1184
+ "pre-armed journal claim",
1185
+ "pre-load-terminal token",
1186
+ "same-inode completed",
1187
+ "ambiguous state before reading another transcript",
1188
+ "deterministic sibling staging path",
1189
+ "pre-load quarantine",
1190
+ "future closed assignment ledger",
1191
+ "does not prove arm blindness",
1192
+ "finalized blind manifest",
1193
+ "map is unencrypted",
1194
+ ):
1195
+ expect_contains(readme, needle)
1196
+ for needle in (
1197
+ "exactly 64 subject",
1198
+ "provider transport, detect, dispatch, probe, model, network, process",
1199
+ "does not authenticate the operator",
1200
+ "two independent arm-blind human judges",
1201
+ "closed write-once stop",
1202
+ "pre-arms 64 immutable ingestion journal tokens",
1203
+ "one pre-load-terminal",
1204
+ "same-inode completed",
1205
+ "claimed-only state is permanently ambiguous",
1206
+ "deterministic sibling staging path",
1207
+ "pre-load quarantine",
1208
+ "future closed assignment ledger",
1209
+ "does not prove that property",
1210
+ "unique receipt id",
1211
+ "final manifest binds the exact",
1212
+ "private map is not encrypted",
1213
+ ):
1214
+ expect_contains(design, needle)
1215
+ expect_contains(workflow, "python3 scripts/check_indirect_prompt_injection_no_call.py")
1216
+ expect_contains(manifest, 'path = "scripts/test_run_indirect_prompt_injection_no_call.py"')
1217
+ check_relative_markdown_links(readme)
1218
+
1219
+
1220
+ def main() -> int:
1221
+ check_mode_registry()
1222
+ check_claude_md()
1223
+ check_skill_version_blocks()
1224
+ check_suite_skill_date_sanity()
1225
+ check_pipeline_docs()
1226
+ check_architecture_component_version()
1227
+ check_readme_sections()
1228
+ check_readme_zh_sections()
1229
+ check_readme_ja_sections()
1230
+ check_readme_ko_sections()
1231
+ check_setup_docs()
1232
+ check_docx_contract()
1233
+ check_reference_docs()
1234
+ check_rebuttal_audit_guard()
1235
+ check_ideation_diversity_no_call_contract()
1236
+ check_indirect_prompt_injection_no_call_envelope()
1237
+
1238
+ if ERRORS:
1239
+ print("Spec consistency check failed:")
1240
+ for error in ERRORS:
1241
+ print(f"- {error}")
1242
+ return 1
1243
+
1244
+ print("Spec consistency check passed.")
1245
+ return 0
1246
+
1247
+
1248
+ if __name__ == "__main__":
1249
+ sys.exit(main())