medsci-skills 4.1.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 (702) hide show
  1. package/LICENSE +50 -0
  2. package/README.md +602 -0
  3. package/README_FIRST.md +27 -0
  4. package/bin/medsci-skills.js +159 -0
  5. package/installers/install-macos.command +19 -0
  6. package/installers/install-windows.cmd +26 -0
  7. package/installers/install-windows.ps1 +17 -0
  8. package/installers/install.py +218 -0
  9. package/metadata/skills_catalog.json +452 -0
  10. package/package.json +48 -0
  11. package/skills/academic-aio/SKILL.md +408 -0
  12. package/skills/academic-aio/references/case_studies/kjr_mllm_2025.md +82 -0
  13. package/skills/academic-aio/references/checklists/AIO_GENERAL.md +354 -0
  14. package/skills/academic-aio/references/journal_summarybox_templates.yaml +126 -0
  15. package/skills/academic-aio/references/oac_funding_checklist.yaml +129 -0
  16. package/skills/academic-aio/references/reporting_guideline_mapping.md +39 -0
  17. package/skills/academic-aio/references/schema_markup_templates/CodeRepository.jsonld +32 -0
  18. package/skills/academic-aio/references/schema_markup_templates/Dataset.jsonld +36 -0
  19. package/skills/academic-aio/references/schema_markup_templates/Person.jsonld +30 -0
  20. package/skills/academic-aio/references/schema_markup_templates/README.md +43 -0
  21. package/skills/academic-aio/references/schema_markup_templates/ScholarlyArticle.jsonld +55 -0
  22. package/skills/academic-aio/scripts/batch_metadata_audit.py +169 -0
  23. package/skills/academic-aio/scripts/validate_schema.py +118 -0
  24. package/skills/academic-aio/skill.yml +36 -0
  25. package/skills/academic-aio/templates/aio_audit_checklist.md.j2 +108 -0
  26. package/skills/add-journal/SKILL.md +482 -0
  27. package/skills/add-journal/skill.yml +33 -0
  28. package/skills/analyze-stats/SKILL.md +598 -0
  29. package/skills/analyze-stats/references/analysis_guides/missing_data.md +109 -0
  30. package/skills/analyze-stats/references/analysis_guides/nhis_icd10_mapping.md +247 -0
  31. package/skills/analyze-stats/references/analysis_guides/propensity_score.md +132 -0
  32. package/skills/analyze-stats/references/analysis_guides/regression.md +115 -0
  33. package/skills/analyze-stats/references/analysis_guides/repeated_measures.md +160 -0
  34. package/skills/analyze-stats/references/analysis_guides/survey_weighted.md +366 -0
  35. package/skills/analyze-stats/references/analysis_guides/test_selection.md +86 -0
  36. package/skills/analyze-stats/references/style/figure_style.mplstyle +69 -0
  37. package/skills/analyze-stats/references/style/theme_publication.R +147 -0
  38. package/skills/analyze-stats/references/table-standards/journal-profiles/ajr.yaml +51 -0
  39. package/skills/analyze-stats/references/table-standards/journal-profiles/european_radiology.yaml +55 -0
  40. package/skills/analyze-stats/references/table-standards/journal-profiles/jama.yaml +66 -0
  41. package/skills/analyze-stats/references/table-standards/journal-profiles/lancet.yaml +57 -0
  42. package/skills/analyze-stats/references/table-standards/journal-profiles/nejm.yaml +51 -0
  43. package/skills/analyze-stats/references/table-standards/journal-profiles/radiology.yaml +66 -0
  44. package/skills/analyze-stats/references/table-standards/table-standards.md +287 -0
  45. package/skills/analyze-stats/references/table-standards/table-types/diagnostic_accuracy.md +36 -0
  46. package/skills/analyze-stats/references/table-standards/table-types/meta_analysis.md +58 -0
  47. package/skills/analyze-stats/references/table-standards/table-types/model_comparison.md +36 -0
  48. package/skills/analyze-stats/references/table-standards/table-types/regression_results.md +50 -0
  49. package/skills/analyze-stats/references/table-standards/table-types/table1_demographics.md +51 -0
  50. package/skills/analyze-stats/references/table-standards/tool-comparison.md +79 -0
  51. package/skills/analyze-stats/references/templates/agreement_analysis.py +436 -0
  52. package/skills/analyze-stats/references/templates/dca_plot.R +237 -0
  53. package/skills/analyze-stats/references/templates/diagnostic_accuracy.py +401 -0
  54. package/skills/analyze-stats/references/templates/dta_meta_analysis.R +384 -0
  55. package/skills/analyze-stats/references/templates/forest_plot.py +412 -0
  56. package/skills/analyze-stats/references/templates/likert_summary.py +356 -0
  57. package/skills/analyze-stats/references/templates/meta_analysis.R +365 -0
  58. package/skills/analyze-stats/references/templates/propensity_score.py +478 -0
  59. package/skills/analyze-stats/references/templates/regression.py +425 -0
  60. package/skills/analyze-stats/references/templates/repeated_measures.py +434 -0
  61. package/skills/analyze-stats/references/templates/sample_size.R +382 -0
  62. package/skills/analyze-stats/references/templates/survey_weighted_analysis.py +411 -0
  63. package/skills/analyze-stats/references/templates/survival_analysis.py +325 -0
  64. package/skills/analyze-stats/references/templates/table1_demographics.py +287 -0
  65. package/skills/analyze-stats/scripts/check_generated_code.py +335 -0
  66. package/skills/analyze-stats/skill.yml +38 -0
  67. package/skills/analyze-stats/tests/fixtures/gen_bad.R +16 -0
  68. package/skills/analyze-stats/tests/fixtures/gen_bad.py +24 -0
  69. package/skills/analyze-stats/tests/fixtures/gen_clean.py +21 -0
  70. package/skills/analyze-stats/tests/test_generated_code.sh +59 -0
  71. package/skills/analyze-stats/tests/test_survival_template.sh +53 -0
  72. package/skills/author-strategy/SKILL.md +117 -0
  73. package/skills/author-strategy/analyze_patterns.py +303 -0
  74. package/skills/author-strategy/fetch_pubmed.py +374 -0
  75. package/skills/author-strategy/skill.yml +34 -0
  76. package/skills/batch-cohort/SKILL.md +223 -0
  77. package/skills/batch-cohort/references/base_template_knhanes.R +210 -0
  78. package/skills/batch-cohort/references/batch_template_generator.R +222 -0
  79. package/skills/batch-cohort/references/variable_coding_registry.md +136 -0
  80. package/skills/batch-cohort/skill.yml +35 -0
  81. package/skills/calc-sample-size/SKILL.md +491 -0
  82. package/skills/calc-sample-size/references/formulas.md +655 -0
  83. package/skills/calc-sample-size/references/observational_cohort.md +49 -0
  84. package/skills/calc-sample-size/skill.yml +51 -0
  85. package/skills/check-reporting/SKILL.md +534 -0
  86. package/skills/check-reporting/references/LICENSES.md +41 -0
  87. package/skills/check-reporting/references/checklists/AMSTAR2.md +54 -0
  88. package/skills/check-reporting/references/checklists/ARRIVE_2.md +234 -0
  89. package/skills/check-reporting/references/checklists/CARE.md +102 -0
  90. package/skills/check-reporting/references/checklists/CLAIM_2024.md +128 -0
  91. package/skills/check-reporting/references/checklists/CLEAR.md +113 -0
  92. package/skills/check-reporting/references/checklists/CONSORT.md +86 -0
  93. package/skills/check-reporting/references/checklists/COSMIN_RoB.md +136 -0
  94. package/skills/check-reporting/references/checklists/GRRAS.md +61 -0
  95. package/skills/check-reporting/references/checklists/MI_CLEAR_LLM.md +167 -0
  96. package/skills/check-reporting/references/checklists/MOOSE.md +85 -0
  97. package/skills/check-reporting/references/checklists/NOS.md +88 -0
  98. package/skills/check-reporting/references/checklists/PRISMA_2020.md +135 -0
  99. package/skills/check-reporting/references/checklists/PRISMA_DTA.md +36 -0
  100. package/skills/check-reporting/references/checklists/PRISMA_P.md +56 -0
  101. package/skills/check-reporting/references/checklists/PROBAST.md +75 -0
  102. package/skills/check-reporting/references/checklists/PROBAST_AI.md +130 -0
  103. package/skills/check-reporting/references/checklists/QUADAS2.md +77 -0
  104. package/skills/check-reporting/references/checklists/QUADAS_C.md +131 -0
  105. package/skills/check-reporting/references/checklists/ROBINS_E.md +179 -0
  106. package/skills/check-reporting/references/checklists/ROBINS_I.md +87 -0
  107. package/skills/check-reporting/references/checklists/ROBIS.md +114 -0
  108. package/skills/check-reporting/references/checklists/ROB_ME.md +126 -0
  109. package/skills/check-reporting/references/checklists/RoB2.md +79 -0
  110. package/skills/check-reporting/references/checklists/RoB_NMA.md +96 -0
  111. package/skills/check-reporting/references/checklists/SPIRIT.md +112 -0
  112. package/skills/check-reporting/references/checklists/SQUIRE_2.md +68 -0
  113. package/skills/check-reporting/references/checklists/STARD.md +129 -0
  114. package/skills/check-reporting/references/checklists/STARD_AI.md +211 -0
  115. package/skills/check-reporting/references/checklists/STROBE.md +80 -0
  116. package/skills/check-reporting/references/checklists/SWiM.md +33 -0
  117. package/skills/check-reporting/references/checklists/TRIPOD.md +157 -0
  118. package/skills/check-reporting/references/checklists/TRIPOD_AI.md +140 -0
  119. package/skills/check-reporting/references/step4c_registration_timing.md +93 -0
  120. package/skills/check-reporting/references/step4d_prisma_figure_audit.md +137 -0
  121. package/skills/check-reporting/scripts/check_checklist_exists.py +183 -0
  122. package/skills/check-reporting/scripts/check_checklist_version.py +168 -0
  123. package/skills/check-reporting/scripts/check_framework_naming.py +206 -0
  124. package/skills/check-reporting/scripts/check_prisma_figure.py +209 -0
  125. package/skills/check-reporting/scripts/prisma_cascade_check.py +274 -0
  126. package/skills/check-reporting/skill.yml +41 -0
  127. package/skills/check-reporting/tests/fixtures/framework_bad.md +8 -0
  128. package/skills/check-reporting/tests/fixtures/framework_clean.md +7 -0
  129. package/skills/check-reporting/tests/test_checklist_fail_fast.sh +77 -0
  130. package/skills/check-reporting/tests/test_checklist_version.sh +72 -0
  131. package/skills/check-reporting/tests/test_framework_naming.sh +45 -0
  132. package/skills/check-reporting/tests/test_prisma_cascade.sh +104 -0
  133. package/skills/clean-data/SKILL.md +180 -0
  134. package/skills/clean-data/references/cleaning_patterns.md +299 -0
  135. package/skills/clean-data/references/profiling_template.py +304 -0
  136. package/skills/clean-data/scripts/check_structural_zero.py +174 -0
  137. package/skills/clean-data/skill.yml +35 -0
  138. package/skills/clean-data/tests/fixtures/smoking.csv +8 -0
  139. package/skills/clean-data/tests/test_structural_zero.sh +49 -0
  140. package/skills/cross-national/SKILL.md +264 -0
  141. package/skills/cross-national/skill.yml +37 -0
  142. package/skills/define-variables/SKILL.md +146 -0
  143. package/skills/define-variables/references/common_definitions.md +190 -0
  144. package/skills/define-variables/skill.yml +34 -0
  145. package/skills/define-variables/templates/variable_operationalization.md +64 -0
  146. package/skills/deidentify/SKILL.md +203 -0
  147. package/skills/deidentify/deidentify.py +1224 -0
  148. package/skills/deidentify/locales/_template.json +45 -0
  149. package/skills/deidentify/locales/au.json +43 -0
  150. package/skills/deidentify/locales/ca.json +44 -0
  151. package/skills/deidentify/locales/cn.json +47 -0
  152. package/skills/deidentify/locales/de.json +48 -0
  153. package/skills/deidentify/locales/fr.json +48 -0
  154. package/skills/deidentify/locales/in.json +48 -0
  155. package/skills/deidentify/locales/jp.json +48 -0
  156. package/skills/deidentify/locales/kr.json +48 -0
  157. package/skills/deidentify/locales/uk.json +45 -0
  158. package/skills/deidentify/locales/us.json +43 -0
  159. package/skills/deidentify/references/date_shift_guide.md +82 -0
  160. package/skills/deidentify/references/hipaa_18_identifiers.md +48 -0
  161. package/skills/deidentify/references/korean_phi_patterns.md +135 -0
  162. package/skills/deidentify/skill.yml +43 -0
  163. package/skills/deidentify/tests/README.md +26 -0
  164. package/skills/deidentify/tests/test_clean.csv +16 -0
  165. package/skills/deidentify/tests/test_edge_cases.csv +11 -0
  166. package/skills/deidentify/tests/test_phi_korean.csv +11 -0
  167. package/skills/design-ai-benchmarking/SKILL.md +214 -0
  168. package/skills/design-ai-benchmarking/references/benchmark_export_schema.json +69 -0
  169. package/skills/design-ai-benchmarking/references/elicitation_rubric_template.md +37 -0
  170. package/skills/design-ai-benchmarking/skill.yml +38 -0
  171. package/skills/design-study/SKILL.md +298 -0
  172. package/skills/design-study/skill.yml +33 -0
  173. package/skills/fill-icmje-coi/SKILL.md +216 -0
  174. package/skills/fill-icmje-coi/scripts/fill_icmje_coi.py +140 -0
  175. package/skills/fill-icmje-coi/skill.yml +35 -0
  176. package/skills/fill-icmje-coi/templates/icmje_coi_seed_synthetic.docx +0 -0
  177. package/skills/fill-protocol/SKILL.md +248 -0
  178. package/skills/fill-protocol/examples/example_irb_template.yaml +53 -0
  179. package/skills/fill-protocol/references/best_practices.md +121 -0
  180. package/skills/fill-protocol/scripts/doc_to_docx.py +111 -0
  181. package/skills/fill-protocol/scripts/fill_form.py +611 -0
  182. package/skills/fill-protocol/scripts/inspect_template.py +61 -0
  183. package/skills/fill-protocol/setup.sh +162 -0
  184. package/skills/fill-protocol/skill.yml +37 -0
  185. package/skills/find-cohort-gap/SKILL.md +309 -0
  186. package/skills/find-cohort-gap/references/cohort_profile_template.md +93 -0
  187. package/skills/find-cohort-gap/references/onepager_template.md +84 -0
  188. package/skills/find-cohort-gap/references/pattern_scoring_rubric.md +169 -0
  189. package/skills/find-cohort-gap/references/saturation_query_templates.md +143 -0
  190. package/skills/find-cohort-gap/skill.yml +35 -0
  191. package/skills/find-journal/POLICY.md +87 -0
  192. package/skills/find-journal/SKILL.md +340 -0
  193. package/skills/find-journal/references/journal_profiles/AJNR.md +29 -0
  194. package/skills/find-journal/references/journal_profiles/AJR.md +30 -0
  195. package/skills/find-journal/references/journal_profiles/Abdominal_Radiology.md +30 -0
  196. package/skills/find-journal/references/journal_profiles/Academic_Radiology.md +30 -0
  197. package/skills/find-journal/references/journal_profiles/Annals_of_Internal_Medicine.md +33 -0
  198. package/skills/find-journal/references/journal_profiles/Artificial_Intelligence_in_Medicine.md +28 -0
  199. package/skills/find-journal/references/journal_profiles/BMC_Medicine.md +31 -0
  200. package/skills/find-journal/references/journal_profiles/British_Journal_of_Radiology.md +39 -0
  201. package/skills/find-journal/references/journal_profiles/CVIR.md +30 -0
  202. package/skills/find-journal/references/journal_profiles/Chest.md +39 -0
  203. package/skills/find-journal/references/journal_profiles/Clinical_Radiology.md +30 -0
  204. package/skills/find-journal/references/journal_profiles/Clinical_and_Molecular_Hepatology.md +32 -0
  205. package/skills/find-journal/references/journal_profiles/Diabetes_Metabolism_Journal.md +36 -0
  206. package/skills/find-journal/references/journal_profiles/Diagnostic_and_Interventional_Radiology.md +32 -0
  207. package/skills/find-journal/references/journal_profiles/Endocrinology_and_Metabolism.md +37 -0
  208. package/skills/find-journal/references/journal_profiles/European_Journal_of_Preventive_Cardiology.md +39 -0
  209. package/skills/find-journal/references/journal_profiles/European_Radiology.md +29 -0
  210. package/skills/find-journal/references/journal_profiles/Hepatology_Communications.md +40 -0
  211. package/skills/find-journal/references/journal_profiles/Hepatology_International.md +37 -0
  212. package/skills/find-journal/references/journal_profiles/IEEE_JBHI.md +28 -0
  213. package/skills/find-journal/references/journal_profiles/IEEE_TMI.md +28 -0
  214. package/skills/find-journal/references/journal_profiles/INSI.md +29 -0
  215. package/skills/find-journal/references/journal_profiles/Investigative_Radiology.md +25 -0
  216. package/skills/find-journal/references/journal_profiles/JACC_Advances.md +41 -0
  217. package/skills/find-journal/references/journal_profiles/JACC_Asia.md +30 -0
  218. package/skills/find-journal/references/journal_profiles/JACR.md +28 -0
  219. package/skills/find-journal/references/journal_profiles/JAMA.md +40 -0
  220. package/skills/find-journal/references/journal_profiles/JAMA_Network_Open.md +30 -0
  221. package/skills/find-journal/references/journal_profiles/JCSM.md +39 -0
  222. package/skills/find-journal/references/journal_profiles/JKMS.md +32 -0
  223. package/skills/find-journal/references/journal_profiles/JMIR.md +29 -0
  224. package/skills/find-journal/references/journal_profiles/JMIR_Medical_Education.md +29 -0
  225. package/skills/find-journal/references/journal_profiles/JNIS.md +35 -0
  226. package/skills/find-journal/references/journal_profiles/JVIR.md +31 -0
  227. package/skills/find-journal/references/journal_profiles/Journal_of_Biomedical_Informatics.md +29 -0
  228. package/skills/find-journal/references/journal_profiles/Journal_of_Clinical_Endocrinology_and_Metabolism.md +40 -0
  229. package/skills/find-journal/references/journal_profiles/Journal_of_Magnetic_Resonance_Imaging.md +30 -0
  230. package/skills/find-journal/references/journal_profiles/Journal_of_Nuclear_Medicine.md +31 -0
  231. package/skills/find-journal/references/journal_profiles/Journal_of_Stroke.md +32 -0
  232. package/skills/find-journal/references/journal_profiles/KJR.md +38 -0
  233. package/skills/find-journal/references/journal_profiles/Korean_Circulation_Journal.md +38 -0
  234. package/skills/find-journal/references/journal_profiles/Korean_Journal_of_Internal_Medicine.md +36 -0
  235. package/skills/find-journal/references/journal_profiles/Lancet_Diabetes_and_Endocrinology.md +40 -0
  236. package/skills/find-journal/references/journal_profiles/Lancet_Gastroenterology_and_Hepatology.md +49 -0
  237. package/skills/find-journal/references/journal_profiles/Lancet_Infectious_Diseases.md +38 -0
  238. package/skills/find-journal/references/journal_profiles/Lancet_Neurology.md +39 -0
  239. package/skills/find-journal/references/journal_profiles/Lancet_Oncology.md +40 -0
  240. package/skills/find-journal/references/journal_profiles/Lancet_Psychiatry.md +38 -0
  241. package/skills/find-journal/references/journal_profiles/Lancet_Public_Health.md +30 -0
  242. package/skills/find-journal/references/journal_profiles/Lancet_Respiratory_Medicine.md +39 -0
  243. package/skills/find-journal/references/journal_profiles/Liver_International.md +33 -0
  244. package/skills/find-journal/references/journal_profiles/Medical_Image_Analysis.md +28 -0
  245. package/skills/find-journal/references/journal_profiles/NEJM.md +33 -0
  246. package/skills/find-journal/references/journal_profiles/Nature_Machine_Intelligence.md +31 -0
  247. package/skills/find-journal/references/journal_profiles/Nature_Medicine.md +39 -0
  248. package/skills/find-journal/references/journal_profiles/Neuroradiology.md +31 -0
  249. package/skills/find-journal/references/journal_profiles/Nutrition_Metabolism_and_Cardiovascular_Diseases.md +39 -0
  250. package/skills/find-journal/references/journal_profiles/PLOS_Medicine.md +32 -0
  251. package/skills/find-journal/references/journal_profiles/RYAI.md +28 -0
  252. package/skills/find-journal/references/journal_profiles/Radiology.md +29 -0
  253. package/skills/find-journal/references/journal_profiles/Skeletal_Radiology.md +31 -0
  254. package/skills/find-journal/references/journal_profiles/Stroke.md +37 -0
  255. package/skills/find-journal/references/journal_profiles/The_BMJ.md +31 -0
  256. package/skills/find-journal/references/journal_profiles/The_Lancet.md +31 -0
  257. package/skills/find-journal/references/journal_profiles/The_Lancet_Digital_Health.md +29 -0
  258. package/skills/find-journal/references/journal_profiles/World_Journal_of_Hepatology.md +53 -0
  259. package/skills/find-journal/references/journal_profiles/npj_Digital_Medicine.md +29 -0
  260. package/skills/find-journal/skill.yml +34 -0
  261. package/skills/fulltext-retrieval/SKILL.md +174 -0
  262. package/skills/fulltext-retrieval/fetch_oa.py +433 -0
  263. package/skills/fulltext-retrieval/pdf_to_md.py +160 -0
  264. package/skills/fulltext-retrieval/skill.yml +41 -0
  265. package/skills/generate-codebook/SKILL.md +155 -0
  266. package/skills/generate-codebook/references/codebook_schema.md +76 -0
  267. package/skills/generate-codebook/scripts/generate_codebook.py +278 -0
  268. package/skills/generate-codebook/skill.yml +35 -0
  269. package/skills/generate-codebook/tests/test_generate_codebook.sh +76 -0
  270. package/skills/grant-builder/SKILL.md +251 -0
  271. package/skills/grant-builder/skill.yml +34 -0
  272. package/skills/humanize/SKILL.md +251 -0
  273. package/skills/humanize/references/ai_patterns.md +571 -0
  274. package/skills/humanize/skill.yml +33 -0
  275. package/skills/intake-project/SKILL.md +264 -0
  276. package/skills/intake-project/skill.yml +34 -0
  277. package/skills/lit-sync/SKILL.md +448 -0
  278. package/skills/lit-sync/references/locale/ko/note_templates.md +110 -0
  279. package/skills/lit-sync/skill.yml +52 -0
  280. package/skills/lit-sync/tests/test_poll_logic.sh +92 -0
  281. package/skills/ma-scout/SKILL.md +640 -0
  282. package/skills/ma-scout/references/project_readme_template.md +95 -0
  283. package/skills/ma-scout/references/project_readme_template_ko.md +82 -0
  284. package/skills/ma-scout/skill.yml +33 -0
  285. package/skills/make-figures/SKILL.md +957 -0
  286. package/skills/make-figures/references/critic_rubrics/data_plot.md +166 -0
  287. package/skills/make-figures/references/critic_rubrics/flow_diagram.md +169 -0
  288. package/skills/make-figures/references/design_principles.md +181 -0
  289. package/skills/make-figures/references/exemplar_diagrams/README.md +65 -0
  290. package/skills/make-figures/references/exemplar_diagrams/consort/README.md +15 -0
  291. package/skills/make-figures/references/exemplar_diagrams/consort/template_input.yaml +37 -0
  292. package/skills/make-figures/references/exemplar_diagrams/consort/template_output.pdf +0 -0
  293. package/skills/make-figures/references/exemplar_diagrams/consort/template_output.png +0 -0
  294. package/skills/make-figures/references/exemplar_diagrams/consort/template_output_600.png +0 -0
  295. package/skills/make-figures/references/exemplar_diagrams/other/other_02.meta.yaml +4 -0
  296. package/skills/make-figures/references/exemplar_diagrams/other/other_02.png +0 -0
  297. package/skills/make-figures/references/exemplar_diagrams/other/other_02_why.md +13 -0
  298. package/skills/make-figures/references/exemplar_diagrams/pipeline/README.md +15 -0
  299. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_01.meta.yaml +4 -0
  300. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_01.png +0 -0
  301. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_01_why.md +13 -0
  302. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_03.meta.yaml +4 -0
  303. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_03.png +0 -0
  304. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_03_why.md +13 -0
  305. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_04.meta.yaml +4 -0
  306. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_04.png +0 -0
  307. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_04_why.md +13 -0
  308. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_05.meta.yaml +4 -0
  309. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_05.png +0 -0
  310. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_05_why.md +13 -0
  311. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_06.meta.yaml +4 -0
  312. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_06.png +0 -0
  313. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_06_why.md +13 -0
  314. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_07.meta.yaml +4 -0
  315. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_07.png +0 -0
  316. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_07_why.md +13 -0
  317. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_08.meta.yaml +4 -0
  318. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_08.png +0 -0
  319. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_08_why.md +13 -0
  320. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_09.meta.yaml +4 -0
  321. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_09.png +0 -0
  322. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_09_why.md +13 -0
  323. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_10.meta.yaml +4 -0
  324. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_10.png +0 -0
  325. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_10_why.md +13 -0
  326. package/skills/make-figures/references/exemplar_diagrams/prisma/README.md +15 -0
  327. package/skills/make-figures/references/exemplar_diagrams/prisma/template_input.yaml +47 -0
  328. package/skills/make-figures/references/exemplar_diagrams/prisma/template_output.pdf +0 -0
  329. package/skills/make-figures/references/exemplar_diagrams/prisma/template_output.png +0 -0
  330. package/skills/make-figures/references/exemplar_diagrams/prisma/template_output_600.png +0 -0
  331. package/skills/make-figures/references/exemplar_diagrams/stard/README.md +15 -0
  332. package/skills/make-figures/references/exemplar_diagrams/stard/template_input.yaml +40 -0
  333. package/skills/make-figures/references/exemplar_diagrams/stard/template_output.pdf +0 -0
  334. package/skills/make-figures/references/exemplar_diagrams/stard/template_output.png +0 -0
  335. package/skills/make-figures/references/exemplar_diagrams/stard/template_output_600.png +0 -0
  336. package/skills/make-figures/references/exemplar_diagrams/strobe/template_input.yaml +43 -0
  337. package/skills/make-figures/references/exemplar_diagrams/strobe/template_input_pptx.yaml +43 -0
  338. package/skills/make-figures/references/exemplar_diagrams/strobe/template_output.pdf +0 -0
  339. package/skills/make-figures/references/exemplar_diagrams/strobe/template_output.png +0 -0
  340. package/skills/make-figures/references/exemplar_diagrams/strobe/template_output.pptx +0 -0
  341. package/skills/make-figures/references/exemplar_diagrams/strobe/template_output_600.png +0 -0
  342. package/skills/make-figures/references/figure_specs.md +291 -0
  343. package/skills/make-figures/references/flow_diagram_lessons.md +164 -0
  344. package/skills/make-figures/references/jacc_central_illustration_principles.md +91 -0
  345. package/skills/make-figures/references/medical_illustration_sources.md +98 -0
  346. package/skills/make-figures/references/pipeline_concepts_medical_ai.md +240 -0
  347. package/skills/make-figures/references/reporting_guideline_figure_map.md +104 -0
  348. package/skills/make-figures/references/visual_abstract_templates/european_radiology.pptx +0 -0
  349. package/skills/make-figures/references/visual_abstract_templates/jacc_central_illustration.pptx +0 -0
  350. package/skills/make-figures/references/visual_abstract_templates/medsci_default.pptx +0 -0
  351. package/skills/make-figures/references/visual_abstract_templates/template_guide.md +114 -0
  352. package/skills/make-figures/scripts/build_jacc_template.py +77 -0
  353. package/skills/make-figures/scripts/build_prisma2020_template.py +371 -0
  354. package/skills/make-figures/scripts/build_strobe_template.py +351 -0
  355. package/skills/make-figures/scripts/critic_figure.py +264 -0
  356. package/skills/make-figures/scripts/derive_figure_legend_counts.py +138 -0
  357. package/skills/make-figures/scripts/extract_exemplar_from_pdf.py +186 -0
  358. package/skills/make-figures/scripts/fetch_official_templates.sh +88 -0
  359. package/skills/make-figures/scripts/fill_prisma_template.py +142 -0
  360. package/skills/make-figures/scripts/generate_flow_diagram.R +133 -0
  361. package/skills/make-figures/scripts/generate_image.py +99 -0
  362. package/skills/make-figures/scripts/generate_visual_abstract.py +438 -0
  363. package/skills/make-figures/scripts/validate_pptx_mac_compat.py +233 -0
  364. package/skills/make-figures/skill.yml +52 -0
  365. package/skills/make-figures/templates/official/NOTES.md +62 -0
  366. package/skills/make-figures/templates/official/consort2010/CONSORT_2025_editable_checklist.docx +0 -0
  367. package/skills/make-figures/templates/official/consort2010/CONSORT_2025_flow_diagram.docx +0 -0
  368. package/skills/make-figures/templates/official/prisma2020/PRISMA_2020_flow_new_v1.pptx +0 -0
  369. package/skills/make-figures/templates/official/prisma2020/PRISMA_2020_flow_new_v2.pptx +0 -0
  370. package/skills/make-figures/templates/official/prisma2020/PRISMA_2020_flow_updated_v2.pptx +0 -0
  371. package/skills/make-figures/templates/official/spirit2013/SPIRIT_2025_editable_checklist.docx +0 -0
  372. package/skills/make-figures/templates/official/spirit2013/SPIRIT_2025_participant_timeline.docx +0 -0
  373. package/skills/make-figures/templates/official/stard2015/STARD_2015_checklist.docx +0 -0
  374. package/skills/make-figures/templates/official/stard2015/STARD_2015_flow_diagram.pdf +0 -0
  375. package/skills/make-figures/tests/fixtures/figure1_flow.yaml +8 -0
  376. package/skills/make-figures/tests/fixtures/manuscript_ok.md +9 -0
  377. package/skills/make-figures/tests/fixtures/manuscript_stale.md +4 -0
  378. package/skills/make-figures/tests/test_legend_reconcile.sh +36 -0
  379. package/skills/manage-project/SKILL.md +358 -0
  380. package/skills/manage-project/references/pre_submission_checklist.md +53 -0
  381. package/skills/manage-project/references/project_state_template.json +37 -0
  382. package/skills/manage-project/references/scaffold_templates.md +118 -0
  383. package/skills/manage-project/references/status_output_format.md +44 -0
  384. package/skills/manage-project/references/timeline_example.md +20 -0
  385. package/skills/manage-project/skill.yml +36 -0
  386. package/skills/manage-project/templates/SSOT.yaml.template +41 -0
  387. package/skills/manage-refs/LICENSE.zotero-mcp +21 -0
  388. package/skills/manage-refs/NOTICE.md +29 -0
  389. package/skills/manage-refs/SKILL.md +289 -0
  390. package/skills/manage-refs/citation_styles/README.md +40 -0
  391. package/skills/manage-refs/citation_styles/american-journal-of-roentgenology.csl +211 -0
  392. package/skills/manage-refs/citation_styles/cardiovascular-and-interventional-radiology.csl +19 -0
  393. package/skills/manage-refs/citation_styles/european-radiology.csl +19 -0
  394. package/skills/manage-refs/citation_styles/journal-of-cachexia-sarcopenia-and-muscle.csl +150 -0
  395. package/skills/manage-refs/citation_styles/journal-of-korean-medical-science-strict.csl +533 -0
  396. package/skills/manage-refs/citation_styles/journal-of-korean-medical-science.csl +16 -0
  397. package/skills/manage-refs/citation_styles/korean-journal-of-radiology.csl +155 -0
  398. package/skills/manage-refs/citation_styles/nature.csl +189 -0
  399. package/skills/manage-refs/citation_styles/nlm-citation-sequence.csl +535 -0
  400. package/skills/manage-refs/citation_styles/radiology.csl +228 -0
  401. package/skills/manage-refs/citation_styles/springer-basic-brackets.csl +187 -0
  402. package/skills/manage-refs/citation_styles/springer-vancouver-brackets.csl +276 -0
  403. package/skills/manage-refs/citation_styles/vancouver-superscript.csl +536 -0
  404. package/skills/manage-refs/citation_styles/vancouver.csl +535 -0
  405. package/skills/manage-refs/references/REFERENCE_STYLE_SPECS.md +59 -0
  406. package/skills/manage-refs/references/check_xref_symptoms.md +35 -0
  407. package/skills/manage-refs/scripts/_vendor_citation_writer.py +600 -0
  408. package/skills/manage-refs/scripts/check_citation_keys.py +112 -0
  409. package/skills/manage-refs/scripts/check_csl_render.py +102 -0
  410. package/skills/manage-refs/scripts/check_xref.py +633 -0
  411. package/skills/manage-refs/scripts/fill_journal_abbrev.py +104 -0
  412. package/skills/manage-refs/scripts/inject_zotero_cwyw.py +133 -0
  413. package/skills/manage-refs/scripts/md_marker_convert.py +193 -0
  414. package/skills/manage-refs/scripts/pre_submission_gate.sh +238 -0
  415. package/skills/manage-refs/scripts/render_pandoc.sh +88 -0
  416. package/skills/manage-refs/skill.yml +70 -0
  417. package/skills/manage-refs/tests/fixtures/pre_submission_gate/README.md +32 -0
  418. package/skills/manage-refs/tests/fixtures/pre_submission_gate/manuscript.md +10 -0
  419. package/skills/manage-refs/tests/fixtures/pre_submission_gate/refs.bib +34 -0
  420. package/skills/manage-refs/tests/fixtures/pre_submission_gate/run.sh +117 -0
  421. package/skills/manage-refs/tests/test_vN_docx_check.sh +145 -0
  422. package/skills/meta-analysis/SKILL.md +739 -0
  423. package/skills/meta-analysis/references/LICENSES.md +21 -0
  424. package/skills/meta-analysis/references/PROSPERO_template.md +221 -0
  425. package/skills/meta-analysis/references/ai_pre_screening_template.py +245 -0
  426. package/skills/meta-analysis/references/checklists/JBI_Case_Series.md +45 -0
  427. package/skills/meta-analysis/references/checklists/NOS.md +88 -0
  428. package/skills/meta-analysis/references/checklists/PRISMA_DTA.md +36 -0
  429. package/skills/meta-analysis/references/checklists/PROBAST.md +75 -0
  430. package/skills/meta-analysis/references/checklists/QUADAS2.md +77 -0
  431. package/skills/meta-analysis/references/checklists/ROBINS_I.md +87 -0
  432. package/skills/meta-analysis/references/checklists/RoB2.md +79 -0
  433. package/skills/meta-analysis/references/data_integrity_checklist.md +57 -0
  434. package/skills/meta-analysis/references/icmje_coi_guide.md +181 -0
  435. package/skills/meta-analysis/references/phase10_recovery.md +136 -0
  436. package/skills/meta-analysis/references/phase4_km_composite.md +58 -0
  437. package/skills/meta-analysis/references/phase6_statistical_synthesis.md +148 -0
  438. package/skills/meta-analysis/references/phase9_circulation.md +84 -0
  439. package/skills/meta-analysis/references/post_submission_release_ops.md +41 -0
  440. package/skills/meta-analysis/references/r_templates.md +132 -0
  441. package/skills/meta-analysis/references/review_orchestration.md +40 -0
  442. package/skills/meta-analysis/references/submission_package_drift.md +71 -0
  443. package/skills/meta-analysis/scripts/check_pool_consistency.py +201 -0
  444. package/skills/meta-analysis/scripts/cohort_overlap_check.py +242 -0
  445. package/skills/meta-analysis/scripts/dta_extraction_qc.py +137 -0
  446. package/skills/meta-analysis/scripts/screening_reconcile.py +160 -0
  447. package/skills/meta-analysis/skill.yml +47 -0
  448. package/skills/meta-analysis/templates/FINAL_POOL_LOCK.yaml.template +70 -0
  449. package/skills/meta-analysis/templates/extraction_form_v2.md +129 -0
  450. package/skills/meta-analysis/templates/supplementary_8file_checklist.md +94 -0
  451. package/skills/meta-analysis/tests/test_pool_consistency.sh +123 -0
  452. package/skills/orchestrate/SKILL.md +501 -0
  453. package/skills/orchestrate/references/dialogue_nodes.md +196 -0
  454. package/skills/orchestrate/references/report_template.md +109 -0
  455. package/skills/orchestrate/references/report_template_ko.md +88 -0
  456. package/skills/orchestrate/skill.yml +44 -0
  457. package/skills/peer-review/SKILL.md +381 -0
  458. package/skills/peer-review/references/aczel_2021_reviewer2_patterns.md +88 -0
  459. package/skills/peer-review/references/domain-probes/ai_overclaiming.md +47 -0
  460. package/skills/peer-review/references/domain-probes/narrative_review.md +44 -0
  461. package/skills/peer-review/references/domain-probes/observational_confounding.md +48 -0
  462. package/skills/peer-review/references/domain-probes/radiomics.md +38 -0
  463. package/skills/peer-review/references/domain-probes/sr_ma.md +87 -0
  464. package/skills/peer-review/references/domain-probes/survival_prognostic.md +68 -0
  465. package/skills/peer-review/references/exemplar_reviews/README.md +43 -0
  466. package/skills/peer-review/references/exemplar_reviews/ai_overclaiming.md +47 -0
  467. package/skills/peer-review/references/exemplar_reviews/calibration_missing.md +44 -0
  468. package/skills/peer-review/references/exemplar_reviews/data_leakage.md +48 -0
  469. package/skills/peer-review/references/exemplar_reviews/reference_standard_validity.md +45 -0
  470. package/skills/peer-review/references/narrative_review_audit.md +67 -0
  471. package/skills/peer-review/references/reviewer_calibration/README.md +34 -0
  472. package/skills/peer-review/references/reviewer_calibration/compliance_floor.md +52 -0
  473. package/skills/peer-review/references/reviewer_profiles/AJR.md +82 -0
  474. package/skills/peer-review/references/reviewer_profiles/EURE.md +64 -0
  475. package/skills/peer-review/references/reviewer_profiles/INSI.md +57 -0
  476. package/skills/peer-review/references/reviewer_profiles/KJR.md +100 -0
  477. package/skills/peer-review/references/reviewer_profiles/README.md +32 -0
  478. package/skills/peer-review/references/reviewer_profiles/RYAI.md +86 -0
  479. package/skills/peer-review/skill.yml +39 -0
  480. package/skills/present-paper/SKILL.md +675 -0
  481. package/skills/present-paper/references/critic_rubrics/slide.md +155 -0
  482. package/skills/present-paper/references/generate_pptx_templates.py +604 -0
  483. package/skills/present-paper/references/medical_presentation_templates.md +277 -0
  484. package/skills/present-paper/references/slide_design_principles.md +202 -0
  485. package/skills/present-paper/references/slide_visual_styles/nature_lancet.md +168 -0
  486. package/skills/present-paper/references/workflow-checklist.md +109 -0
  487. package/skills/present-paper/scripts/extract_pdf_figures.py +243 -0
  488. package/skills/present-paper/scripts/inject_pronunciation_notes.py +178 -0
  489. package/skills/present-paper/scripts/inject_speaker_notes.py +133 -0
  490. package/skills/present-paper/scripts/strip_notes_for_sharing.py +140 -0
  491. package/skills/present-paper/scripts/trim_caption.py +271 -0
  492. package/skills/present-paper/skill.yml +41 -0
  493. package/skills/present-paper/templates/build_pptx_nature_lancet.py +688 -0
  494. package/skills/publish-skill/SKILL.md +370 -0
  495. package/skills/publish-skill/references/license-compatibility-matrix.md +132 -0
  496. package/skills/publish-skill/references/pii-patterns.md +130 -0
  497. package/skills/publish-skill/scripts/audit_skill.sh +278 -0
  498. package/skills/publish-skill/skill.yml +35 -0
  499. package/skills/render-pdf-doc/SKILL.md +146 -0
  500. package/skills/render-pdf-doc/references/known_pitfalls.md +53 -0
  501. package/skills/render-pdf-doc/references/pandoc_korean_cheatsheet.md +77 -0
  502. package/skills/render-pdf-doc/scripts/check_deps.sh +42 -0
  503. package/skills/render-pdf-doc/scripts/infer_colwidths.py +164 -0
  504. package/skills/render-pdf-doc/scripts/render_pdf.sh +98 -0
  505. package/skills/render-pdf-doc/skill.yml +57 -0
  506. package/skills/render-pdf-doc/templates/anchor-doc.md +27 -0
  507. package/skills/render-pdf-doc/templates/anchor-doc_ko.md +25 -0
  508. package/skills/render-pdf-doc/templates/briefing-handout.md +33 -0
  509. package/skills/render-pdf-doc/templates/briefing-handout_ko.md +31 -0
  510. package/skills/render-pdf-doc/templates/proposal-cover.md +33 -0
  511. package/skills/render-pdf-doc/templates/proposal-cover_ko.md +31 -0
  512. package/skills/render-pdf-doc/templates/reference-table.md +22 -0
  513. package/skills/render-pdf-doc/templates/reference-table_ko.md +20 -0
  514. package/skills/replicate-study/SKILL.md +150 -0
  515. package/skills/replicate-study/references/harmonization_3country.csv +47 -0
  516. package/skills/replicate-study/references/harmonization_knhanes_nhanes.csv +68 -0
  517. package/skills/replicate-study/references/methodology_extraction_template.md +134 -0
  518. package/skills/replicate-study/skill.yml +37 -0
  519. package/skills/review-paper/SKILL.md +104 -0
  520. package/skills/review-paper/references/macro_skeleton.md +6 -0
  521. package/skills/review-paper/skill.yml +25 -0
  522. package/skills/revise/SKILL.md +515 -0
  523. package/skills/revise/references/r2r_voice.md +346 -0
  524. package/skills/revise/skill.yml +43 -0
  525. package/skills/search-lit/SKILL.md +443 -0
  526. package/skills/search-lit/references/parse_pubmed.py +326 -0
  527. package/skills/search-lit/references/pubmed_eutils.sh +111 -0
  528. package/skills/search-lit/skill.yml +46 -0
  529. package/skills/self-review/SKILL.md +1045 -0
  530. package/skills/self-review/references/domain-probes/ai_overclaiming.md +47 -0
  531. package/skills/self-review/references/domain-probes/narrative_review.md +44 -0
  532. package/skills/self-review/references/domain-probes/observational_confounding.md +48 -0
  533. package/skills/self-review/references/domain-probes/radiomics.md +38 -0
  534. package/skills/self-review/references/domain-probes/sr_ma.md +87 -0
  535. package/skills/self-review/references/domain-probes/survival_prognostic.md +68 -0
  536. package/skills/self-review/references/exemplar_findings/README.md +43 -0
  537. package/skills/self-review/references/exemplar_findings/cohort_arithmetic_mismatch.md +35 -0
  538. package/skills/self-review/references/exemplar_findings/estimand_drift_posthoc_primary.md +39 -0
  539. package/skills/self-review/references/exemplar_findings/scope_overreach_cross_sectional.md +35 -0
  540. package/skills/self-review/references/exemplar_findings/unadjusted_confounder.md +36 -0
  541. package/skills/self-review/references/panel_review_template.md +177 -0
  542. package/skills/self-review/scripts/check_artifact_coverage.py +301 -0
  543. package/skills/self-review/scripts/check_claim_artifact.py +248 -0
  544. package/skills/self-review/scripts/check_classical_style.py +185 -0
  545. package/skills/self-review/scripts/check_cohort_arithmetic.py +481 -0
  546. package/skills/self-review/scripts/check_confounding_completeness.py +287 -0
  547. package/skills/self-review/scripts/check_panel_diversity.py +336 -0
  548. package/skills/self-review/scripts/check_reference_adequacy.py +392 -0
  549. package/skills/self-review/scripts/check_reviewer_team_consistency.py +412 -0
  550. package/skills/self-review/scripts/check_scope_coherence.py +177 -0
  551. package/skills/self-review/skill.yml +47 -0
  552. package/skills/self-review/tests/fixtures/claim_manuscript.md +17 -0
  553. package/skills/self-review/tests/fixtures/claim_prereg.md +6 -0
  554. package/skills/self-review/tests/fixtures/cohort_bad.md +21 -0
  555. package/skills/self-review/tests/fixtures/cohort_clean.md +21 -0
  556. package/skills/self-review/tests/fixtures/cohort_partition.csv +5 -0
  557. package/skills/self-review/tests/fixtures/coverage_analysis/31_delong_nested_added_value.csv +3 -0
  558. package/skills/self-review/tests/fixtures/coverage_analysis/table1_demographics.csv +3 -0
  559. package/skills/self-review/tests/fixtures/coverage_clean.md +13 -0
  560. package/skills/self-review/tests/fixtures/coverage_manuscript.md +11 -0
  561. package/skills/self-review/tests/fixtures/panel_collapse.json +27 -0
  562. package/skills/self-review/tests/fixtures/panel_good.json +32 -0
  563. package/skills/self-review/tests/fixtures/panel_monoculture.json +32 -0
  564. package/skills/self-review/tests/fixtures/refadeq_letter.md +13 -0
  565. package/skills/self-review/tests/fixtures/refadeq_original_fixed.md +42 -0
  566. package/skills/self-review/tests/fixtures/refadeq_original_uncited.md +40 -0
  567. package/skills/self-review/tests/fixtures/scope_bad.md +9 -0
  568. package/skills/self-review/tests/fixtures/scope_clean.md +8 -0
  569. package/skills/self-review/tests/fixtures/scope_surrogate.md +8 -0
  570. package/skills/self-review/tests/fixtures/style_bad.md +13 -0
  571. package/skills/self-review/tests/fixtures/style_clean.md +11 -0
  572. package/skills/self-review/tests/fixtures/table1_by_exposure.csv +11 -0
  573. package/skills/self-review/tests/test_artifact_coverage.sh +44 -0
  574. package/skills/self-review/tests/test_claim_artifact.sh +50 -0
  575. package/skills/self-review/tests/test_classical_style.sh +44 -0
  576. package/skills/self-review/tests/test_cohort_arithmetic.sh +49 -0
  577. package/skills/self-review/tests/test_confounding_completeness.sh +66 -0
  578. package/skills/self-review/tests/test_panel_diversity.sh +55 -0
  579. package/skills/self-review/tests/test_panel_mode.sh +69 -0
  580. package/skills/self-review/tests/test_reference_adequacy.sh +68 -0
  581. package/skills/self-review/tests/test_reviewer_team_consistency.sh +138 -0
  582. package/skills/self-review/tests/test_scope_coherence.sh +46 -0
  583. package/skills/setup-medsci/SKILL.md +110 -0
  584. package/skills/setup-medsci/references/setup-checklist.md +51 -0
  585. package/skills/setup-medsci/skill.yml +30 -0
  586. package/skills/sync-submission/SKILL.md +382 -0
  587. package/skills/sync-submission/scripts/author_registry_example.yaml +36 -0
  588. package/skills/sync-submission/scripts/blind_sweep.py +203 -0
  589. package/skills/sync-submission/scripts/check_asset_anonymization.py +300 -0
  590. package/skills/sync-submission/scripts/check_cross_artifact_stale.py +211 -0
  591. package/skills/sync-submission/scripts/cover_letter_drift_check.py +451 -0
  592. package/skills/sync-submission/scripts/cross_document_n_check.py +486 -0
  593. package/skills/sync-submission/scripts/detect_copy_divergence.py +136 -0
  594. package/skills/sync-submission/scripts/preflight_gate.py +458 -0
  595. package/skills/sync-submission/scripts/scope_drift_check.py +362 -0
  596. package/skills/sync-submission/scripts/sync_submission.py +169 -0
  597. package/skills/sync-submission/skill.yml +43 -0
  598. package/skills/sync-submission/tests/fixtures/copy_ok.md +5 -0
  599. package/skills/sync-submission/tests/fixtures/copy_stale.md +5 -0
  600. package/skills/sync-submission/tests/fixtures/ssot.md +5 -0
  601. package/skills/sync-submission/tests/test_asset_anonymization.sh +99 -0
  602. package/skills/sync-submission/tests/test_copy_divergence.sh +44 -0
  603. package/skills/sync-submission/tests/test_cross_artifact_stale.sh +80 -0
  604. package/skills/sync-submission/tests/test_cross_document_n.sh +132 -0
  605. package/skills/sync-submission/tests/test_preflight_gate.sh +112 -0
  606. package/skills/sync-submission/tests/test_scope_drift.sh +122 -0
  607. package/skills/sync-submission/tests/test_vN_docx_assertion.sh +51 -0
  608. package/skills/verify-refs/SKILL.md +177 -0
  609. package/skills/verify-refs/references/manual_checkpoint_guide.md +100 -0
  610. package/skills/verify-refs/scripts/verify_cli.sh +62 -0
  611. package/skills/verify-refs/scripts/verify_refs.py +782 -0
  612. package/skills/verify-refs/skill.yml +44 -0
  613. package/skills/verify-refs/tests/fixtures/pagination_placeholder.bib +17 -0
  614. package/skills/verify-refs/tests/test_pagination_placeholder.sh +42 -0
  615. package/skills/version-dataset/SKILL.md +143 -0
  616. package/skills/version-dataset/references/manifest_schema.md +72 -0
  617. package/skills/version-dataset/scripts/version_dataset.py +242 -0
  618. package/skills/version-dataset/skill.yml +35 -0
  619. package/skills/version-dataset/tests/test_version_dataset.sh +52 -0
  620. package/skills/write-paper/SKILL.md +1148 -0
  621. package/skills/write-paper/references/exemplar_methods/README.md +38 -0
  622. package/skills/write-paper/references/exemplar_methods/ai_validation_tripod_claim.md +47 -0
  623. package/skills/write-paper/references/exemplar_methods/diagnostic_accuracy_stard.md +50 -0
  624. package/skills/write-paper/references/exemplar_methods/observational_cohort_strobe.md +43 -0
  625. package/skills/write-paper/references/journal_profiles/AJNR.md +185 -0
  626. package/skills/write-paper/references/journal_profiles/AJR.md +149 -0
  627. package/skills/write-paper/references/journal_profiles/Abdominal_Radiology.md +139 -0
  628. package/skills/write-paper/references/journal_profiles/Academic_Radiology.md +90 -0
  629. package/skills/write-paper/references/journal_profiles/Annals_of_Internal_Medicine.md +150 -0
  630. package/skills/write-paper/references/journal_profiles/Artificial_Intelligence_in_Medicine.md +82 -0
  631. package/skills/write-paper/references/journal_profiles/British_Journal_of_Radiology.md +161 -0
  632. package/skills/write-paper/references/journal_profiles/CVIR.md +157 -0
  633. package/skills/write-paper/references/journal_profiles/Chest.md +270 -0
  634. package/skills/write-paper/references/journal_profiles/Clinical_Radiology.md +160 -0
  635. package/skills/write-paper/references/journal_profiles/Clinical_and_Molecular_Hepatology.md +147 -0
  636. package/skills/write-paper/references/journal_profiles/Diabetes_Metabolism_Journal.md +163 -0
  637. package/skills/write-paper/references/journal_profiles/Diagnostic_and_Interventional_Radiology.md +216 -0
  638. package/skills/write-paper/references/journal_profiles/Endocrinology_and_Metabolism.md +167 -0
  639. package/skills/write-paper/references/journal_profiles/European_Journal_of_Preventive_Cardiology.md +192 -0
  640. package/skills/write-paper/references/journal_profiles/European_Radiology.md +159 -0
  641. package/skills/write-paper/references/journal_profiles/Hepatology_Communications.md +110 -0
  642. package/skills/write-paper/references/journal_profiles/Hepatology_International.md +106 -0
  643. package/skills/write-paper/references/journal_profiles/IEEE_TMI.md +180 -0
  644. package/skills/write-paper/references/journal_profiles/INSI.md +163 -0
  645. package/skills/write-paper/references/journal_profiles/Investigative_Radiology.md +86 -0
  646. package/skills/write-paper/references/journal_profiles/JACC_Advances.md +197 -0
  647. package/skills/write-paper/references/journal_profiles/JACC_Asia.md +168 -0
  648. package/skills/write-paper/references/journal_profiles/JACR.md +87 -0
  649. package/skills/write-paper/references/journal_profiles/JAMA.md +188 -0
  650. package/skills/write-paper/references/journal_profiles/JAMA_Network_Open.md +170 -0
  651. package/skills/write-paper/references/journal_profiles/JCSM.md +266 -0
  652. package/skills/write-paper/references/journal_profiles/JKMS.md +201 -0
  653. package/skills/write-paper/references/journal_profiles/JMIR.md +88 -0
  654. package/skills/write-paper/references/journal_profiles/JMIR_Medical_Education.md +86 -0
  655. package/skills/write-paper/references/journal_profiles/JNIS.md +227 -0
  656. package/skills/write-paper/references/journal_profiles/JVIR.md +158 -0
  657. package/skills/write-paper/references/journal_profiles/Journal_of_Clinical_Endocrinology_and_Metabolism.md +191 -0
  658. package/skills/write-paper/references/journal_profiles/Journal_of_Stroke.md +176 -0
  659. package/skills/write-paper/references/journal_profiles/KJR.md +185 -0
  660. package/skills/write-paper/references/journal_profiles/Korean_Circulation_Journal.md +184 -0
  661. package/skills/write-paper/references/journal_profiles/Korean_Journal_of_Internal_Medicine.md +178 -0
  662. package/skills/write-paper/references/journal_profiles/Lancet_Gastroenterology_and_Hepatology.md +127 -0
  663. package/skills/write-paper/references/journal_profiles/Liver_International.md +165 -0
  664. package/skills/write-paper/references/journal_profiles/Medical_Image_Analysis.md +147 -0
  665. package/skills/write-paper/references/journal_profiles/NEJM.md +147 -0
  666. package/skills/write-paper/references/journal_profiles/Nature_Medicine.md +181 -0
  667. package/skills/write-paper/references/journal_profiles/Neuroradiology.md +151 -0
  668. package/skills/write-paper/references/journal_profiles/Nutrition_Metabolism_and_Cardiovascular_Diseases.md +184 -0
  669. package/skills/write-paper/references/journal_profiles/PLOS_Medicine.md +166 -0
  670. package/skills/write-paper/references/journal_profiles/RYAI.md +124 -0
  671. package/skills/write-paper/references/journal_profiles/Radiology.md +173 -0
  672. package/skills/write-paper/references/journal_profiles/Skeletal_Radiology.md +135 -0
  673. package/skills/write-paper/references/journal_profiles/Stroke.md +210 -0
  674. package/skills/write-paper/references/journal_profiles/The_BMJ.md +121 -0
  675. package/skills/write-paper/references/journal_profiles/The_Lancet.md +112 -0
  676. package/skills/write-paper/references/journal_profiles/The_Lancet_Digital_Health.md +104 -0
  677. package/skills/write-paper/references/journal_profiles/World_Journal_of_Hepatology.md +106 -0
  678. package/skills/write-paper/references/journal_profiles/npj_Digital_Medicine.md +93 -0
  679. package/skills/write-paper/references/paper_types/ai_validation.md +270 -0
  680. package/skills/write-paper/references/paper_types/animal_study.md +194 -0
  681. package/skills/write-paper/references/paper_types/case_report.md +237 -0
  682. package/skills/write-paper/references/paper_types/cross_national.md +328 -0
  683. package/skills/write-paper/references/paper_types/letter.md +127 -0
  684. package/skills/write-paper/references/paper_types/meta_analysis.md +181 -0
  685. package/skills/write-paper/references/paper_types/nhis_cohort.md +297 -0
  686. package/skills/write-paper/references/paper_types/original_article.md +221 -0
  687. package/skills/write-paper/references/paper_types/technical_note.md +131 -0
  688. package/skills/write-paper/references/section_guides/discussion.md +155 -0
  689. package/skills/write-paper/references/section_guides/introduction.md +108 -0
  690. package/skills/write-paper/references/section_guides/methods.md +144 -0
  691. package/skills/write-paper/references/section_guides/results.md +113 -0
  692. package/skills/write-paper/references/section_guides/step7_1_classical_qc.md +67 -0
  693. package/skills/write-paper/references/section_guides/step7_4a_audit_recovery.md +74 -0
  694. package/skills/write-paper/references/section_guides/title_abstract.md +123 -0
  695. package/skills/write-paper/references/section_templates/methods_statistical.md +147 -0
  696. package/skills/write-paper/scripts/check_placeholders.py +182 -0
  697. package/skills/write-paper/skill.yml +48 -0
  698. package/skills/write-paper/tests/test_placeholders.sh +107 -0
  699. package/skills/write-protocol/SKILL.md +243 -0
  700. package/skills/write-protocol/references/ethics_checklist.md +150 -0
  701. package/skills/write-protocol/references/protocol_template.md +304 -0
  702. package/skills/write-protocol/skill.yml +34 -0
@@ -0,0 +1,412 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ check_reviewer_team_consistency.py — fabrication-grade self-review check.
4
+
5
+ Detects manuscripts that simultaneously claim dual independent reviewers
6
+ (in Methods + PROSPERO) and confess to single-reviewer execution (in
7
+ Discussion §Limitations). Either claim alone is fine; the conjunction is
8
+ a fabrication-grade red flag.
9
+
10
+ Why this check exists
11
+ =====================
12
+ Cross-project precedent (anonymized): a reporting-quality SR-of-AI-tools
13
+ manuscript had:
14
+ - Methods: "Two reviewers independently screened titles and abstracts ..."
15
+ - PROSPERO record: "Two independent reviewers will perform full-text
16
+ screening and data extraction."
17
+ - Discussion §Limitations: "Single primary reviewer; a 20% sample by an
18
+ additional reviewer is deferred to before submission."
19
+
20
+ The conjunction admits in Limitations what Methods denies in narrative
21
+ form. Reviewers and editors who notice this read it as fabrication-grade
22
+ (the manuscript misrepresents what was actually done) and reject.
23
+
24
+ Detection strategy
25
+ ==================
26
+ Section-aware grep for two regex families:
27
+ - DUAL claim: "(independently|dual|two reviewers|both reviewers|two
28
+ independent)" within Methods OR a PROSPERO record file.
29
+ - SINGLE confession: "(single primary reviewer|one additional reviewer|
30
+ 20% sample|sample of records|deferred to before submission|due to
31
+ resource constraints|by the first reviewer alone)" within Limitations
32
+ OR Discussion.
33
+
34
+ Both present → MAJOR self-review red flag.
35
+
36
+ Two further fabrication-grade axes (the prose↔JSON↔confession 3-way):
37
+ - LLM-AS-REVIEWER (fatal): a per-study extraction JSON whose reviewer /
38
+ screener / extractor / rater field is an LLM ("Claude", "GPT-4", "LLM",
39
+ "Gemini"). An LLM is a tool, not an independent reviewer; listing it as
40
+ one misrepresents the screening team regardless of the prose. Pass the
41
+ extraction JSON (file or directory) via --extraction-json.
42
+ - DEFERRED-MITIGATION (MAJOR): a future-tense mitigation promise — "a 20%
43
+ sample will be completed before submission" — that is unmet at the time
44
+ the manuscript circulates. The promise is evidence the work is not done.
45
+
46
+ Usage
47
+ =====
48
+
49
+ python check_reviewer_team_consistency.py \\
50
+ --manuscript manuscript.md \\
51
+ --prospero prospero/record.md \\
52
+ --out _audit_self/reviewer_team_consistency.md
53
+
54
+ Output
55
+ ======
56
+ Markdown report at `--out` summarizing matches. Also a JSON sidecar at
57
+ `--out` + ".json".
58
+
59
+ Exit codes
60
+ ==========
61
+ 0 no conflict
62
+ 1 MAJOR red flag detected (both DUAL and SINGLE patterns present)
63
+ 2 invocation error
64
+ """
65
+
66
+ from __future__ import annotations
67
+
68
+ import argparse
69
+ import json
70
+ import re
71
+ import sys
72
+ from dataclasses import dataclass, field
73
+ from pathlib import Path
74
+
75
+
76
+ DUAL_PATTERNS = [
77
+ (
78
+ re.compile(r"\btwo\s+(?:independent\s+)?reviewers?\b", re.IGNORECASE),
79
+ "two reviewers",
80
+ ),
81
+ (re.compile(r"\bdual\s+(?:independent\s+)?(?:reviewers?|extractors?)\b", re.IGNORECASE),
82
+ "dual reviewers"),
83
+ (re.compile(r"\bindependent(?:ly)?\s+screened\b", re.IGNORECASE), "independently screened"),
84
+ (
85
+ re.compile(r"\bboth\s+reviewers?\s+(?:independently|extracted|screened)\b", re.IGNORECASE),
86
+ "both reviewers",
87
+ ),
88
+ (
89
+ re.compile(r"\bindependent(?:ly)?\s+(?:extracted|coded|assessed)\b", re.IGNORECASE),
90
+ "independent extraction",
91
+ ),
92
+ (
93
+ re.compile(r"\bindependent\s+reviewers?\b", re.IGNORECASE),
94
+ "independent reviewers",
95
+ ),
96
+ ]
97
+
98
+ SINGLE_PATTERNS = [
99
+ (re.compile(r"\bsingle\s+primary\s+reviewer\b", re.IGNORECASE), "single primary reviewer"),
100
+ (
101
+ re.compile(r"\bone\s+additional\s+reviewer\b", re.IGNORECASE),
102
+ "one additional reviewer",
103
+ ),
104
+ (
105
+ re.compile(r"\b20\s*%?\s+sample\b", re.IGNORECASE),
106
+ "20% sample",
107
+ ),
108
+ (
109
+ re.compile(r"\bsample\s+of\s+records\b", re.IGNORECASE),
110
+ "sample of records",
111
+ ),
112
+ (
113
+ re.compile(r"\bdeferred\s+to\s+before\s+submission\b", re.IGNORECASE),
114
+ "deferred to before submission",
115
+ ),
116
+ (
117
+ re.compile(r"\bdue\s+to\s+resource\s+constraints\b", re.IGNORECASE),
118
+ "due to resource constraints",
119
+ ),
120
+ (
121
+ re.compile(r"\b(?:by|with)\s+(?:the\s+)?first\s+reviewer\s+(?:alone|only)\b", re.IGNORECASE),
122
+ "first reviewer alone",
123
+ ),
124
+ ]
125
+
126
+
127
+ # An LLM named where an independent reviewer should be (fatal). Bare "ai" is too
128
+ # broad (matches names), so it is excluded; explicit model families + "LLM" only.
129
+ LLM_NAME_RE = re.compile(
130
+ r"\b(?:claude|chatgpt|gpt-?\d|gpt|llm|large language model|gemini|copilot|bard|"
131
+ r"ai model|an ai\b)\b", re.IGNORECASE)
132
+ REVIEWER_KEY_RE = re.compile(
133
+ r"reviewer|screener|extractor|rater|annotator|adjudicator|coder", re.IGNORECASE)
134
+
135
+ # A future-tense mitigation promised but not yet executed at circulation.
136
+ DEFERRED_MITIGATION_RE = re.compile(
137
+ r"(?:will be|to be|is to be|are to be)\s+"
138
+ r"(?:completed|performed|conducted|done|undertaken|carried out|finalized|finalised)\b"
139
+ r"[^.]{0,80}?(?:before|prior to|ahead of)\s+(?:final\s+)?submission",
140
+ re.IGNORECASE)
141
+
142
+
143
+ SECTION_HEADERS = {
144
+ "Methods": re.compile(
145
+ r"^#{1,3}\s*\*{0,2}(?:METHODS?|Method[s]?|Materials and Methods)\*{0,2}\s*$",
146
+ re.IGNORECASE | re.MULTILINE,
147
+ ),
148
+ "Discussion": re.compile(
149
+ r"^#{1,3}\s*\*{0,2}(?:DISCUSSION|Discussion)\*{0,2}\s*$",
150
+ re.IGNORECASE | re.MULTILINE,
151
+ ),
152
+ "Limitations": re.compile(
153
+ r"^#{1,3}\s*\*{0,2}(?:LIMITATIONS?|Limitations?|Study Limitations)\*{0,2}\s*$",
154
+ re.IGNORECASE | re.MULTILINE,
155
+ ),
156
+ }
157
+
158
+
159
+ @dataclass
160
+ class Hit:
161
+ pattern_label: str
162
+ line: int
163
+ context: str
164
+
165
+
166
+ @dataclass
167
+ class Report:
168
+ submission_safe: bool
169
+ dual_hits: list[dict] = field(default_factory=list)
170
+ single_hits: list[dict] = field(default_factory=list)
171
+ llm_reviewer_hits: list[dict] = field(default_factory=list)
172
+ deferred_mitigation_hits: list[dict] = field(default_factory=list)
173
+
174
+
175
+ def split_sections(text: str) -> dict[str, str]:
176
+ out: dict[str, str] = {name: "" for name in SECTION_HEADERS}
177
+ headers: list[tuple[str, int, int]] = []
178
+ for name, pat in SECTION_HEADERS.items():
179
+ for m in pat.finditer(text):
180
+ headers.append((name, m.start(), m.end()))
181
+ headers.sort(key=lambda t: t[1])
182
+ for i, (name, _, hdr_end) in enumerate(headers):
183
+ end = headers[i + 1][1] if i + 1 < len(headers) else len(text)
184
+ out[name] = (out[name] + "\n" + text[hdr_end:end]).strip()
185
+ return out
186
+
187
+
188
+ def scan_text(text: str, patterns: list[tuple[re.Pattern[str], str]]) -> list[Hit]:
189
+ hits: list[Hit] = []
190
+ lines = text.splitlines()
191
+ for lineno, line in enumerate(lines, start=1):
192
+ for pat, label in patterns:
193
+ if pat.search(line):
194
+ ctx = line.strip()
195
+ if len(ctx) > 200:
196
+ ctx = ctx[:200] + "..."
197
+ hits.append(Hit(pattern_label=label, line=lineno, context=ctx))
198
+ return hits
199
+
200
+
201
+ def hit_to_dict(h: Hit, source: str) -> dict:
202
+ return {
203
+ "source": source,
204
+ "pattern": h.pattern_label,
205
+ "line": h.line,
206
+ "context": h.context,
207
+ }
208
+
209
+
210
+ def _iter_extraction_files(path: Path):
211
+ if path.is_dir():
212
+ yield from sorted(path.rglob("*.json"))
213
+ elif path.is_file():
214
+ yield path
215
+
216
+
217
+ def _walk_reviewer_fields(obj, source: str, hits: list[dict], keypath: str = "") -> None:
218
+ """Recursively find reviewer-role fields whose value names an LLM."""
219
+ if isinstance(obj, dict):
220
+ for k, v in obj.items():
221
+ kp = f"{keypath}.{k}" if keypath else str(k)
222
+ if isinstance(v, str) and REVIEWER_KEY_RE.search(str(k)) and LLM_NAME_RE.search(v):
223
+ hits.append({"source": source, "field": kp, "value": v[:120]})
224
+ _walk_reviewer_fields(v, source, hits, kp)
225
+ elif isinstance(obj, list):
226
+ for i, v in enumerate(obj):
227
+ _walk_reviewer_fields(v, source, hits, f"{keypath}[{i}]")
228
+
229
+
230
+ def scan_llm_reviewers(extraction: Path | None) -> list[dict]:
231
+ hits: list[dict] = []
232
+ if extraction is None:
233
+ return hits
234
+ for f in _iter_extraction_files(extraction):
235
+ try:
236
+ data = json.loads(f.read_text(encoding="utf-8"))
237
+ except (json.JSONDecodeError, OSError):
238
+ continue
239
+ _walk_reviewer_fields(data, f.name, hits)
240
+ return hits
241
+
242
+
243
+ def scan_deferred_mitigation(manuscript: str) -> list[dict]:
244
+ hits: list[dict] = []
245
+ for lineno, line in enumerate(manuscript.splitlines(), start=1):
246
+ m = DEFERRED_MITIGATION_RE.search(line)
247
+ if m:
248
+ hits.append({"source": "manuscript", "line": lineno, "context": m.group(0).strip()[:160]})
249
+ return hits
250
+
251
+
252
+ def build_report(manuscript: str, prospero: str | None,
253
+ extraction: Path | None = None) -> Report:
254
+ sections = split_sections(manuscript)
255
+
256
+ dual_hits: list[dict] = []
257
+ single_hits: list[dict] = []
258
+
259
+ # Methods → DUAL evidence.
260
+ for h in scan_text(sections.get("Methods", ""), DUAL_PATTERNS):
261
+ dual_hits.append(hit_to_dict(h, "manuscript:Methods"))
262
+
263
+ # PROSPERO → DUAL evidence.
264
+ if prospero is not None:
265
+ for h in scan_text(prospero, DUAL_PATTERNS):
266
+ dual_hits.append(hit_to_dict(h, "prospero"))
267
+
268
+ # Discussion & Limitations → SINGLE evidence.
269
+ for region in ("Limitations", "Discussion"):
270
+ for h in scan_text(sections.get(region, ""), SINGLE_PATTERNS):
271
+ single_hits.append(hit_to_dict(h, f"manuscript:{region}"))
272
+
273
+ llm_reviewer_hits = scan_llm_reviewers(extraction)
274
+ deferred_hits = scan_deferred_mitigation(manuscript)
275
+
276
+ submission_safe = not (
277
+ (dual_hits and single_hits) or llm_reviewer_hits or deferred_hits
278
+ )
279
+ return Report(
280
+ submission_safe=submission_safe,
281
+ dual_hits=dual_hits,
282
+ single_hits=single_hits,
283
+ llm_reviewer_hits=llm_reviewer_hits,
284
+ deferred_mitigation_hits=deferred_hits,
285
+ )
286
+
287
+
288
+ def _render_extra(lines: list[str], report: Report) -> None:
289
+ if report.llm_reviewer_hits:
290
+ lines.append("")
291
+ lines.append("## LLM-AS-REVIEWER (fatal)")
292
+ lines.append("An LLM is named where an independent reviewer is required:")
293
+ for h in report.llm_reviewer_hits:
294
+ lines.append(f"- `{h['source']}` field `{h['field']}` = {h['value']}")
295
+ lines.append("Fix: list a human reviewer; an LLM is a tool, not a member of the review team.")
296
+ if report.deferred_mitigation_hits:
297
+ lines.append("")
298
+ lines.append("## DEFERRED-MITIGATION (MAJOR)")
299
+ lines.append("A mitigation is promised in the future tense but not yet executed:")
300
+ for h in report.deferred_mitigation_hits:
301
+ lines.append(f"- line {h['line']}: {h['context']}")
302
+ lines.append("Fix: execute and report the mitigation before circulation, or remove the claim.")
303
+
304
+
305
+ def render_markdown(report: Report) -> str:
306
+ lines = ["# Reviewer-team consistency audit", ""]
307
+ if report.submission_safe:
308
+ lines.append(
309
+ "Status: **PASS** — no conjunction of DUAL claim + SINGLE confession."
310
+ )
311
+ lines.append("")
312
+ if report.dual_hits:
313
+ lines.append(f"DUAL claims found ({len(report.dual_hits)}, OK alone):")
314
+ for h in report.dual_hits:
315
+ lines.append(f"- `{h['source']}` line {h['line']}: `{h['pattern']}` — {h['context']}")
316
+ if report.single_hits:
317
+ lines.append("")
318
+ lines.append(f"SINGLE confessions found ({len(report.single_hits)}, OK alone):")
319
+ for h in report.single_hits:
320
+ lines.append(f"- `{h['source']}` line {h['line']}: `{h['pattern']}` — {h['context']}")
321
+ else:
322
+ triggers = []
323
+ if report.dual_hits and report.single_hits:
324
+ triggers.append("DUAL claim + SINGLE confession")
325
+ if report.llm_reviewer_hits:
326
+ triggers.append("LLM-as-reviewer")
327
+ if report.deferred_mitigation_hits:
328
+ triggers.append("deferred mitigation")
329
+ lines.append(f"Status: **MAJOR red flag** — {', '.join(triggers)}.")
330
+ lines.append("")
331
+ lines.append("Reviewers will read this as fabrication-grade.")
332
+ if report.dual_hits and report.single_hits:
333
+ lines.append("")
334
+ lines.append("## DUAL claims (Methods / PROSPERO)")
335
+ for h in report.dual_hits:
336
+ lines.append(f"- `{h['source']}` line {h['line']}: `{h['pattern']}`")
337
+ lines.append(f" > {h['context']}")
338
+ lines.append("")
339
+ lines.append("## SINGLE confessions (Discussion / Limitations)")
340
+ for h in report.single_hits:
341
+ lines.append(f"- `{h['source']}` line {h['line']}: `{h['pattern']}`")
342
+ lines.append(f" > {h['context']}")
343
+ _render_extra(lines, report)
344
+ return "\n".join(lines) + "\n"
345
+
346
+
347
+ def main(argv: list[str] | None = None) -> int:
348
+ parser = argparse.ArgumentParser(
349
+ description="Reviewer-team consistency check (fabrication-grade self-review)."
350
+ )
351
+ parser.add_argument("--manuscript", type=Path, required=True)
352
+ parser.add_argument("--prospero", type=Path, default=None)
353
+ parser.add_argument(
354
+ "--extraction-json", type=Path, default=None,
355
+ help="per-study extraction JSON file or directory (reviewer-field LLM scan)",
356
+ )
357
+ parser.add_argument(
358
+ "--out",
359
+ type=Path,
360
+ default=Path("_audit_self/reviewer_team_consistency.md"),
361
+ )
362
+ parser.add_argument("--quiet", action="store_true")
363
+ args = parser.parse_args(argv)
364
+
365
+ if not args.manuscript.is_file():
366
+ print(f"ERROR: manuscript not found: {args.manuscript}", file=sys.stderr)
367
+ return 2
368
+ prospero_text: str | None = None
369
+ if args.prospero is not None:
370
+ if not args.prospero.is_file():
371
+ print(f"ERROR: prospero not found: {args.prospero}", file=sys.stderr)
372
+ return 2
373
+ prospero_text = args.prospero.read_text(encoding="utf-8")
374
+ if args.extraction_json is not None and not args.extraction_json.exists():
375
+ print(f"ERROR: extraction-json not found: {args.extraction_json}", file=sys.stderr)
376
+ return 2
377
+
378
+ text = args.manuscript.read_text(encoding="utf-8")
379
+ report = build_report(text, prospero_text, args.extraction_json)
380
+
381
+ args.out.parent.mkdir(parents=True, exist_ok=True)
382
+ args.out.write_text(render_markdown(report), encoding="utf-8")
383
+ json_out = args.out.with_suffix(args.out.suffix + ".json")
384
+ json_out.write_text(
385
+ json.dumps(
386
+ {
387
+ "submission_safe": report.submission_safe,
388
+ "dual_hits": report.dual_hits,
389
+ "single_hits": report.single_hits,
390
+ "llm_reviewer_hits": report.llm_reviewer_hits,
391
+ "deferred_mitigation_hits": report.deferred_mitigation_hits,
392
+ },
393
+ indent=2,
394
+ ),
395
+ encoding="utf-8",
396
+ )
397
+
398
+ if not args.quiet:
399
+ counts = (f"DUAL={len(report.dual_hits)} SINGLE={len(report.single_hits)} "
400
+ f"LLM={len(report.llm_reviewer_hits)} "
401
+ f"DEFERRED={len(report.deferred_mitigation_hits)}")
402
+ if report.submission_safe:
403
+ print(f"PASS: no fabrication-grade conflict. {counts}")
404
+ else:
405
+ print(f"FAIL: MAJOR red flag. {counts}")
406
+ print(f"See {args.out}")
407
+
408
+ return 0 if report.submission_safe else 1
409
+
410
+
411
+ if __name__ == "__main__":
412
+ sys.exit(main())
@@ -0,0 +1,177 @@
1
+ #!/usr/bin/env python3
2
+ """Endpoint↔conclusion scope-coherence gate (self-review §D).
3
+
4
+ Two overclaim patterns where the conclusion's action exceeds what the design or
5
+ endpoint can support. Both are deterministic when a design/endpoint signal and a
6
+ conclusion action verb co-occur, and both are documented anti-patterns
7
+ (scope-coherence-gate.md):
8
+
9
+ CROSS_SECTIONAL_PROGNOSTIC the design is cross-sectional / single-visit /
10
+ prevalence, yet the conclusion makes a prognostic or
11
+ surveillance claim (rescreen interval, surveillance,
12
+ disease progression, predicting future risk). A single
13
+ time point cannot license a longitudinal conclusion.
14
+ SURROGATE_CARE_DIRECTIVE a binary surrogate endpoint (present/absent, >0,
15
+ dichotomized) drives a patient-care directive (defer,
16
+ withhold, initiate/discontinue therapy, statin). A
17
+ risk-stratification marker is not a management trigger.
18
+
19
+ The gate is conservative: it fires only when both a signal and a conclusion-region
20
+ verb are present, to keep false positives low on a widely-used skill.
21
+
22
+ INPUTS
23
+ --manuscript manuscript markdown/text (required).
24
+
25
+ OUTPUT
26
+ A reconciliation table (stdout) and, with --out, a JSON artifact:
27
+ {manuscript, claims[{verdict, severity, detail, where}], summary}
28
+ Both verdicts are Major. Exit 1 (with --strict) when any Major claim exists.
29
+
30
+ Stdlib-only (json / re / argparse / pathlib). Exit codes: 0 clean (or report-only),
31
+ 1 Major claim(s) found (with --strict), 2 input/usage error.
32
+ """
33
+
34
+ from __future__ import annotations
35
+
36
+ import argparse
37
+ import json
38
+ import re
39
+ import sys
40
+ from pathlib import Path
41
+
42
+ DESIGN_CROSS_SECTIONAL = re.compile(
43
+ r"cross[-\s]?sectional|single[-\s](?:time[-\s]?point|visit|examination|measurement)|"
44
+ r"at (?:a |one )?(?:single |one )?time[-\s]?point|point[-\s]prevalence|"
45
+ r"prevalence (?:study|survey|design)", re.IGNORECASE)
46
+
47
+ PROGNOSTIC_VERB = re.compile(
48
+ r"surveillance|re[-\s]?screen|screening interval|rescreening|"
49
+ r"monitor(?:ed|ing)?\s+over\s+time|disease progression|progress(?:es|ion)\s+to|"
50
+ r"prognost|predict(?:s|ing|ed)?\s+(?:incident|future|long[-\s]?term|the risk of developing)|"
51
+ r"longitudinal (?:follow|risk|trajector)", re.IGNORECASE)
52
+
53
+ DIRECTIVE_VERB = re.compile(
54
+ r"\bdefer(?:ral|red|ring)?\b|\bwithhold\b|\bforgo\b|\binitiat(?:e|ed|ion)\b|"
55
+ r"\bdiscontinu(?:e|ed|ation)\b|start(?:ing)?\s+(?:statin|therapy|treatment|pharmacotherapy)|"
56
+ r"(?:statin|treatment|therapy|pharmacotherapy)\s+(?:can|should|may)\s+be\s+(?:deferred|withheld|started|initiated)|"
57
+ r"recommend(?:ed)?\s+(?:statin|treatment|therapy|initiation|against treatment)|"
58
+ r"guide\s+(?:treatment|management|therapy)", re.IGNORECASE)
59
+
60
+ SURROGATE_SIGNAL = re.compile(
61
+ r"binary (?:surrogate|endpoint|outcome|marker)|dichotom(?:ous|ised|ized)|surrogate (?:endpoint|marker|outcome)|"
62
+ r"presence (?:or absence )?of|present (?:vs\.?|versus|or) absent|positive (?:vs\.?|versus|or) negative|"
63
+ r"categor(?:ised|ized) as (?:positive|present|absent)|>\s?0\b", re.IGNORECASE)
64
+
65
+ CONCLUSION_HEADINGS = re.compile(
66
+ r"^#{1,4}\s*\*{0,2}(?:CONCLUSIONS?|Conclusions?|DISCUSSION|Discussion|"
67
+ r"Clinical Implications?|Interpretation)\*{0,2}\s*$", re.IGNORECASE | re.MULTILINE)
68
+
69
+
70
+ def conclusion_region(text: str) -> str:
71
+ """Text under Conclusion/Discussion/Implications headings, plus any inline
72
+ 'Conclusion:' clause (abstract). Fallback: the last 25% of the document."""
73
+ spans = []
74
+ starts = [m.end() for m in CONCLUSION_HEADINGS.finditer(text)]
75
+ # heading-delimited regions: from each heading to the next top-level heading
76
+ all_headings = [m.start() for m in re.finditer(r"^#{1,4}\s", text, re.MULTILINE)]
77
+ for s in starts:
78
+ nxt = next((h for h in all_headings if h > s), len(text))
79
+ spans.append(text[s:nxt])
80
+ for m in re.finditer(r"(?:^|\n)\s*\*{0,2}Conclusions?\*{0,2}\s*[:.]\s*(.+?)(?:\n\n|$)",
81
+ text, re.IGNORECASE | re.DOTALL):
82
+ spans.append(m.group(1))
83
+ if not spans:
84
+ spans.append(text[int(len(text) * 0.75):])
85
+ return "\n".join(spans)
86
+
87
+
88
+ def check(text: str) -> list[dict]:
89
+ claims = []
90
+ concl = conclusion_region(text)
91
+
92
+ if DESIGN_CROSS_SECTIONAL.search(text):
93
+ pm = PROGNOSTIC_VERB.search(concl)
94
+ if pm:
95
+ claims.append({
96
+ "verdict": "CROSS_SECTIONAL_PROGNOSTIC",
97
+ "severity": "Major",
98
+ "detail": (f"cross-sectional/single-visit design, but the conclusion makes a "
99
+ f"prognostic/surveillance claim ('{pm.group(0).strip()}')"),
100
+ "where": concl[max(0, pm.start() - 40):pm.end() + 40].strip()[:160],
101
+ })
102
+
103
+ dm = DIRECTIVE_VERB.search(concl)
104
+ sm = SURROGATE_SIGNAL.search(concl)
105
+ if dm and sm:
106
+ claims.append({
107
+ "verdict": "SURROGATE_CARE_DIRECTIVE",
108
+ "severity": "Major",
109
+ "detail": (f"a binary surrogate endpoint ('{sm.group(0).strip()}') drives a "
110
+ f"patient-care directive ('{dm.group(0).strip()}') in the conclusion"),
111
+ "where": concl[max(0, dm.start() - 40):dm.end() + 40].strip()[:160],
112
+ })
113
+
114
+ return claims
115
+
116
+
117
+ def analyze(manuscript: str) -> dict:
118
+ p = Path(manuscript)
119
+ if not p.is_file():
120
+ sys.stderr.write(f"ERROR: manuscript not found: {manuscript}\n")
121
+ sys.exit(2)
122
+ claims = check(p.read_text(encoding="utf-8"))
123
+ n_major = sum(1 for c in claims if c["severity"] == "Major")
124
+ return {
125
+ "manuscript": str(p),
126
+ "claims": claims,
127
+ "summary": {
128
+ "n_claims": len(claims),
129
+ "n_major": n_major,
130
+ "n_flag": len(claims) - n_major,
131
+ "verdict": "MAJOR_CANDIDATE" if n_major else "OK",
132
+ },
133
+ }
134
+
135
+
136
+ def render(result: dict) -> str:
137
+ lines = ["| Check | Severity | Detail |", "|---|---|---|"]
138
+ for c in result["claims"]:
139
+ lines.append(f"| {c['verdict']} | {c['severity']} | {c['detail']} |")
140
+ if len(lines) == 2:
141
+ lines.append("| (none) | — | conclusion scope matches the design/endpoint |")
142
+ return "\n".join(lines)
143
+
144
+
145
+ def main() -> int:
146
+ ap = argparse.ArgumentParser(description="Endpoint↔conclusion scope-coherence gate (§D).")
147
+ ap.add_argument("--manuscript", required=True, help="manuscript markdown/text")
148
+ ap.add_argument("--out", help="write JSON artifact to this path")
149
+ ap.add_argument("--strict", action="store_true", help="exit 1 if any Major claim exists")
150
+ ap.add_argument("--quiet", action="store_true", help="suppress stdout table")
151
+ args = ap.parse_args()
152
+
153
+ result = analyze(args.manuscript)
154
+
155
+ if not args.quiet:
156
+ print("=" * 41)
157
+ print(" Scope Coherence (§D)")
158
+ print("=" * 41)
159
+ print(render(result))
160
+ print()
161
+ s = result["summary"]
162
+ if s["n_major"]:
163
+ print(f"MAJOR candidate: {s['n_major']} endpoint↔conclusion scope mismatch(es).")
164
+ else:
165
+ print("OK: conclusion scope matches the design/endpoint.")
166
+
167
+ if args.out:
168
+ Path(args.out).parent.mkdir(parents=True, exist_ok=True)
169
+ Path(args.out).write_text(json.dumps(result, indent=2), encoding="utf-8")
170
+ if not args.quiet:
171
+ print(f"\nwrote {args.out}")
172
+
173
+ return 1 if (args.strict and result["summary"]["n_major"]) else 0
174
+
175
+
176
+ if __name__ == "__main__":
177
+ sys.exit(main())
@@ -0,0 +1,47 @@
1
+ schema_version: 2
2
+ name: self-review
3
+ layer: D
4
+ owner_domain: own_manuscript_critique
5
+ when_to_use:
6
+ - Pre-submission self-criticism on the user's own manuscript across 10 review categories
7
+ - Generating Anticipated Major / Minor Comments before sending to senior co-authors
8
+ - Phase 2.5a numerical source-fidelity audit (CSV ↔ analysis ↔ manuscript ↔ primary paper)
9
+ - Producing R0-numbered comments that flow into /revise for the response document
10
+ - Multi-agent panel review (--panel) — parallel domain-expert reviewers + editor synthesis for a high-stakes pre-submission final pass
11
+ when_NOT_to_use:
12
+ - Reviewing external (assigned) manuscripts (use /peer-review)
13
+ - Drafting the user's manuscript (use /write-paper)
14
+ - Generating reviewer-response prose (use /revise)
15
+ - Silently fixing non-AI-fixable issues without surfacing them to the user (forbidden)
16
+ inputs:
17
+ - manuscript/manuscript.md
18
+ outputs:
19
+ - qc/self_review.md
20
+ - qc/self_review.json
21
+ - qc/reference_adequacy.json
22
+ deterministic_scripts:
23
+ - scripts/check_reference_adequacy.py
24
+ side_effects:
25
+ - may_edit_manuscript_when_fix_flag_set
26
+ downstream_consumers:
27
+ - revise
28
+ - sync-submission
29
+ forbidden_actions:
30
+ - review_external_manuscripts_as_peer_reviewer
31
+ - silently_fix_non_ai_fixable_issues
32
+
33
+ # v2.1 quality card
34
+ purpose: "Pre-submission self-review of the user's own manuscript from a reviewer's perspective across 10 categories, with severity-framed anticipated comments."
35
+ safety_boundaries:
36
+ - "Reviews the user's own manuscript only; not for reviewing external (journal-assigned) manuscripts."
37
+ - "Does not silently fix non-AI-fixable issues; it flags them for the author."
38
+ known_limitations:
39
+ - "Anticipates likely reviewer comments; cannot predict a specific reviewer's focus."
40
+ - "Advisory; produces recommendations, not manuscript edits."
41
+ validation_commands:
42
+ - "python3 scripts/check_reviewer_team_consistency.py"
43
+ - "python3 scripts/check_domain_probe_sync.py --strict"
44
+ - "bash tests/test_panel_mode.sh"
45
+ - "bash tests/test_reference_adequacy.sh"
46
+ - "feed R0-numbered output into /revise"
47
+ evidence_surface: demo
@@ -0,0 +1,17 @@
1
+ # Synthetic manuscript fixture (claim-vs-artifact test)
2
+
3
+ ## Methods
4
+
5
+ The primary analysis was the association between emphysema and all-cause mortality
6
+ estimated by a multiple-imputation Cox model. This primary endpoint was re-designated
7
+ at the manuscript stage from the pre-specified complete-case model after the imputed
8
+ estimate was found to be more favourable.
9
+
10
+ ## Results
11
+
12
+ In the primary model, emphysema was not associated with all-cause mortality. The
13
+ E-value for the primary association (HR 1.34) was 2.79, which we interpret as robust
14
+ to unmeasured confounding.
15
+
16
+ In an exploratory analysis, the E-value for the cancer-specific subdistribution hazard
17
+ (sHR 2.25) was 3.93, suggesting the cancer signal is hard to explain away.
@@ -0,0 +1,6 @@
1
+ # Synthetic pre-registration fixture (claim-vs-artifact test)
2
+
3
+ Primary outcome: the association between emphysema and all-cause mortality in the
4
+ complete-case multivariable Cox model is the primary analysis of this study.
5
+
6
+ Secondary outcomes: cause-specific mortality (cancer, cardiovascular, respiratory).
@@ -0,0 +1,21 @@
1
+ # Results
2
+
3
+ ## Incidence
4
+
5
+ During follow-up there were 120 events over 50,000 person-years, an incidence
6
+ rate of 5.0 per 1,000 person-years.
7
+
8
+ ## Study population
9
+
10
+ Of 4,252 participants, 583 had missing data, leaving 3,667 in the analytic cohort.
11
+
12
+ ## Risk by tier
13
+
14
+ The cohort was partitioned into three mutually exclusive risk tiers.
15
+
16
+ | Risk tier | n | events |
17
+ | --- | --- | --- |
18
+ | Low | 5,000 | 30 |
19
+ | Medium | 4,000 | 50 |
20
+ | High | 3,498 | 45 |
21
+ | Total | 12,019 | 115 |