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,160 @@
1
+ #!/usr/bin/env python3
2
+ """Reconcile meta-analysis screening ID sets into a canonical JSON artifact."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import argparse
7
+ import csv
8
+ import json
9
+ import re
10
+ import sys
11
+ from pathlib import Path
12
+
13
+
14
+ INCLUDE_VALUES = {"include", "included", "yes", "y", "1", "true", "eligible", "include-qualitative"}
15
+ EXCLUDE_VALUES = {"exclude", "excluded", "no", "n", "0", "false", "ineligible"}
16
+
17
+
18
+ def read_table(path: Path) -> list[dict[str, str]]:
19
+ if not path.exists():
20
+ raise FileNotFoundError(path)
21
+ delimiter = "\t" if path.suffix.lower() in {".tsv", ".tab"} else ","
22
+ with path.open(encoding="utf-8-sig", newline="") as fh:
23
+ return [{k.strip(): (v or "").strip() for k, v in row.items()} for row in csv.DictReader(fh, delimiter=delimiter)]
24
+
25
+
26
+ def find_col(rows: list[dict[str, str]], candidates: list[str]) -> str | None:
27
+ if not rows:
28
+ return None
29
+ lower = {k.lower(): k for k in rows[0].keys()}
30
+ for cand in candidates:
31
+ if cand.lower() in lower:
32
+ return lower[cand.lower()]
33
+ for key in rows[0].keys():
34
+ lk = key.lower()
35
+ if any(cand.lower() in lk for cand in candidates):
36
+ return key
37
+ return None
38
+
39
+
40
+ def norm_id(value: str) -> str:
41
+ value = value.strip()
42
+ if not value:
43
+ return ""
44
+ match = re.search(r"\d+", value)
45
+ return match.group(0) if match else value
46
+
47
+
48
+ def decision_kind(value: str) -> str:
49
+ v = value.strip().lower()
50
+ if any(token in v for token in INCLUDE_VALUES):
51
+ return "include"
52
+ if any(token in v for token in EXCLUDE_VALUES):
53
+ return "exclude"
54
+ return "unknown"
55
+
56
+
57
+ def ids_from_table(path: Path, id_col_arg: str | None, decision_col_arg: str | None, include_only: bool) -> tuple[set[str], dict[str, str]]:
58
+ rows = read_table(path)
59
+ id_col = id_col_arg or find_col(rows, ["id", "record_id", "study_id", "ref_id"])
60
+ if not id_col:
61
+ raise ValueError(f"Could not identify ID column in {path}")
62
+ decision_col = decision_col_arg or find_col(rows, ["decision", "verdict", "include", "screening", "consensus", "outcome"])
63
+ ids: set[str] = set()
64
+ decisions: dict[str, str] = {}
65
+ for row in rows:
66
+ rid = norm_id(row.get(id_col, ""))
67
+ if not rid:
68
+ continue
69
+ decision = row.get(decision_col, "") if decision_col else ""
70
+ kind = decision_kind(decision)
71
+ decisions[rid] = decision
72
+ if include_only:
73
+ if kind == "include":
74
+ ids.add(rid)
75
+ else:
76
+ ids.add(rid)
77
+ return ids, decisions
78
+
79
+
80
+ def main() -> int:
81
+ parser = argparse.ArgumentParser(description="Reconcile MA screening ID sets.")
82
+ parser.add_argument("--screening", required=True, help="TSV/CSV with screening decisions")
83
+ parser.add_argument("--consensus", help="TSV/CSV with final consensus decisions")
84
+ parser.add_argument("--table1", help="TSV/CSV containing bivariate/Table 1 study IDs")
85
+ parser.add_argument("--output", default="2_Screening/screening_consensus.json")
86
+ parser.add_argument("--screening-id-col")
87
+ parser.add_argument("--screening-decision-col")
88
+ parser.add_argument("--consensus-id-col")
89
+ parser.add_argument("--consensus-decision-col")
90
+ parser.add_argument("--table1-id-col")
91
+ args = parser.parse_args()
92
+
93
+ screening_path = Path(args.screening)
94
+ screening_include, screening_decisions = ids_from_table(
95
+ screening_path, args.screening_id_col, args.screening_decision_col, include_only=True
96
+ )
97
+
98
+ if args.consensus:
99
+ consensus_ids, consensus_decisions = ids_from_table(
100
+ Path(args.consensus), args.consensus_id_col, args.consensus_decision_col, include_only=False
101
+ )
102
+ consensus_exclude = {rid for rid, dec in consensus_decisions.items() if decision_kind(dec) == "exclude"}
103
+ consensus_include = {rid for rid, dec in consensus_decisions.items() if decision_kind(dec) == "include"}
104
+ else:
105
+ consensus_ids = set()
106
+ consensus_exclude = set()
107
+ consensus_include = set()
108
+
109
+ if args.table1:
110
+ table1_ids, _ = ids_from_table(Path(args.table1), args.table1_id_col, None, include_only=False)
111
+ else:
112
+ table1_ids = set()
113
+
114
+ qualitative = (screening_include - consensus_exclude) | consensus_include
115
+ bivariate = table1_ids
116
+ narrative_only = qualitative - bivariate
117
+
118
+ payload = {
119
+ "schema_version": 1,
120
+ "sources": {
121
+ "screening": str(screening_path),
122
+ "consensus": args.consensus,
123
+ "table1": args.table1,
124
+ },
125
+ "sets": {
126
+ "screening_include": sorted(screening_include, key=lambda x: (len(x), x)),
127
+ "consensus_exclude": sorted(consensus_exclude, key=lambda x: (len(x), x)),
128
+ "consensus_include": sorted(consensus_include, key=lambda x: (len(x), x)),
129
+ "qualitative": sorted(qualitative, key=lambda x: (len(x), x)),
130
+ "bivariate": sorted(bivariate, key=lambda x: (len(x), x)),
131
+ "narrative_only": sorted(narrative_only, key=lambda x: (len(x), x)),
132
+ },
133
+ "totals": {
134
+ "k_screening_include": len(screening_include),
135
+ "k_consensus_exclude": len(consensus_exclude),
136
+ "k_consensus_include": len(consensus_include),
137
+ "k_qualitative": len(qualitative),
138
+ "k_bivariate": len(bivariate),
139
+ "k_narrative_only": len(narrative_only),
140
+ },
141
+ "blocking_issues": [],
142
+ }
143
+
144
+ if bivariate and not bivariate <= qualitative:
145
+ payload["blocking_issues"].append(
146
+ {
147
+ "code": "TABLE1_NOT_IN_QUALITATIVE",
148
+ "ids": sorted(bivariate - qualitative, key=lambda x: (len(x), x)),
149
+ }
150
+ )
151
+
152
+ output = Path(args.output)
153
+ output.parent.mkdir(parents=True, exist_ok=True)
154
+ output.write_text(json.dumps(payload, indent=2, ensure_ascii=False), encoding="utf-8")
155
+ print(json.dumps(payload["totals"], indent=2))
156
+ return 1 if payload["blocking_issues"] else 0
157
+
158
+
159
+ if __name__ == "__main__":
160
+ sys.exit(main())
@@ -0,0 +1,47 @@
1
+ schema_version: 2
2
+ name: meta-analysis
3
+ layer: B
4
+ owner_domain: meta_analysis_integrity
5
+ when_to_use:
6
+ - Running an end-to-end systematic review or meta-analysis (PROSPERO → search → screen → extract → synthesis → PRISMA)
7
+ - Diagnostic test accuracy meta-analysis (bivariate / HSROC) or intervention meta-analysis (random-effects)
8
+ - Screening reconciliation across two reviewers with Cohen's kappa and adjudication round
9
+ - Risk of bias batch (QUADAS-2 / ROBINS-I) tied to extraction CSV ID receipts
10
+ - Phase 6b post-analysis source-fidelity audit when CSV ↔ R output ↔ manuscript drift suspected
11
+ when_NOT_to_use:
12
+ - Single-study analysis (use /analyze-stats)
13
+ - Topic discovery before a protocol exists (use /ma-scout)
14
+ - Reporting checklist generation only (use /check-reporting)
15
+ - Manuscript prose drafting after synthesis (use /write-paper)
16
+ inputs:
17
+ - protocol/search_strategies.md
18
+ - screening/*.tsv
19
+ - extraction/*.csv
20
+ outputs:
21
+ - 2_Screening/screening_consensus.json
22
+ - analysis/meta_analysis_outputs.json
23
+ - manuscript/manuscript.md
24
+ deterministic_scripts:
25
+ - scripts/screening_reconcile.py
26
+ side_effects:
27
+ - writes_project_artifacts
28
+ downstream_consumers:
29
+ - write-paper
30
+ - self-review
31
+ - make-figures
32
+ forbidden_actions:
33
+ - report_counts_without_id_receipts
34
+ - continue_after_p0_reconciliation_mismatch
35
+
36
+ # v2.1 quality card
37
+ purpose: "Run the SR/MA pipeline: PROSPERO registration, search, screening, extraction, risk of bias, synthesis (bivariate/HSROC or random-effects), and PRISMA reporting."
38
+ safety_boundaries:
39
+ - "Study counts are never reported without ID-level receipts; halts on a P0 reconciliation mismatch."
40
+ - "Pool composition is locked to a single source of truth; downstream counts are re-derived, not copied."
41
+ known_limitations:
42
+ - "Synthesis validity depends on correct extraction; the skill enforces process, not clinical correctness."
43
+ - "DTA pooling assumes adequate per-study 2x2 / threshold data."
44
+ validation_commands:
45
+ - "python3 scripts/screening_reconcile.py"
46
+ - "python3 scripts/check_pool_consistency.py"
47
+ evidence_surface: demo
@@ -0,0 +1,70 @@
1
+ # FINAL_POOL_LOCK.yaml — frozen pool composition for an SR/MA
2
+ #
3
+ # Created at Phase 3f.5 (round-3 adjudication freeze) by /meta-analysis.
4
+ # All downstream artifacts (extraction TSV, manuscript prose counts,
5
+ # PRISMA flow caption, supplementary INDEX, cover letter free-text)
6
+ # must agree with these values exactly. /sync-submission Phase 5
7
+ # `scripts/cross_document_n_check.py --pool-lock` enforces this.
8
+ #
9
+ # Why a lock file
10
+ # ---------------
11
+ # Cross-project precedent (anonymized): an LLM reporting-quality SR carried
12
+ # five documents that disagreed on INCLUDE (63 vs 64) and EXCLUDE
13
+ # (108/109/111). Three EXCLUDE rows existed in the extraction sheet
14
+ # without matching INCLUDE. The drift traced to a late round-3 adjudication
15
+ # whose result was applied to some artifacts and not others.
16
+ #
17
+ # The lock file is the single source of truth. Once the freeze line is
18
+ # crossed, NEVER re-derive the counts from raw artifacts in a downstream
19
+ # script — always reference the lock.
20
+
21
+ # ---------------------------------------------------------------------------
22
+ # Metadata
23
+ # ---------------------------------------------------------------------------
24
+
25
+ # ISO-8601 date when the pool was frozen.
26
+ freeze_date: "YYYY-MM-DD"
27
+
28
+ # Round at which freeze occurred — typically "round_3_adjudication".
29
+ freeze_stage: "round_3_adjudication"
30
+
31
+ # Freeform note describing which screening sheet anchored this lock.
32
+ provenance:
33
+ screening_artifact: "2_Screening/round3_adjudication.tsv"
34
+ adjudicator: "first_reviewer"
35
+ ai_assisted_round: false # set true if AI pre-screening was used per SKILL.md Phase 3c
36
+
37
+ # ---------------------------------------------------------------------------
38
+ # Counts (canonical numbers — NEVER edit without re-freezing)
39
+ # ---------------------------------------------------------------------------
40
+
41
+ # Studies in the final pool (Phase 4 extraction candidate set).
42
+ final_pool_n: 0
43
+
44
+ # Total INCLUDE decisions across rounds (post-adjudication).
45
+ include_count: 0
46
+
47
+ # Total EXCLUDE decisions (full-text excluded).
48
+ exclude_count: 0
49
+
50
+ # Mixed (eligible for some outcomes, excluded for others).
51
+ mixed_count: 0
52
+
53
+ # ---------------------------------------------------------------------------
54
+ # Identifier sets
55
+ # ---------------------------------------------------------------------------
56
+
57
+ # UID lists. Use stable IDs (PMID, DOI, or screening-sheet record ID).
58
+ include_uids: []
59
+ exclude_uids: []
60
+ mixed_uids: []
61
+
62
+ # ---------------------------------------------------------------------------
63
+ # Integrity hash
64
+ # ---------------------------------------------------------------------------
65
+
66
+ # SHA-256 of the sorted include_uids + exclude_uids + mixed_uids list,
67
+ # joined with newlines. Provides tamper-evidence: any single UID edit
68
+ # changes the hash. Recompute with:
69
+ # python -c 'import hashlib; ids = sorted(open("..._uids.txt").read().splitlines()); print(hashlib.sha256("\n".join(ids).encode()).hexdigest())'
70
+ sha256: ""
@@ -0,0 +1,129 @@
1
+ # SR-MA Data Extraction Form v2
2
+
3
+ **Version**: v2.0
4
+ **Motivation**: Recent SR-MA peer-review cycles surfaced three recurring extraction-stage failure modes — diagnostic 2×2 cell sens/spec swap, undisclosed cohort overlap via shared public databases, and undocumented diagnostic vs prognostic subset N. v2 adds three column families to prevent recurrence.
5
+
6
+ ## Coverage
7
+
8
+ Use this form for any SR-MA with diagnostic accuracy and/or prognostic prediction outcomes. Compatible with QUADAS-AI / PROBAST-AI / METRICS frameworks.
9
+
10
+ ## Column schema (CSV / Google Sheets)
11
+
12
+ ### Identity (always required)
13
+
14
+ | Column | Description | Example |
15
+ |---|---|---|
16
+ | `study_id` | Internal ID (`<Surname>_<Year>_<seq>`) | `StudyA_2021_1` |
17
+ | `pmid` | PubMed ID | `00000000` |
18
+ | `doi` | DOI | `10.xxxx/example.YYYY.NNNNNN` |
19
+ | `first_author_lastname` | LastName from PubMed | `Surname` |
20
+ | `first_author_forename` | ForeName from PubMed | `Forename` |
21
+ | `year` | Publication year | `2021` |
22
+ | `country` | Per affiliation (use country of cohort, not publisher) | `[Country]` |
23
+ | `journal` | Full journal name | `[Journal Full Title]` |
24
+ | `study_design` | retrospective / prospective / case-control / cross-sectional | `retrospective` |
25
+
26
+ ### Cohort source (NEW in v2 — prevents undisclosed overlap)
27
+
28
+ | Column | Description | Example |
29
+ |---|---|---|
30
+ | `cohort_source` | One of: `institutional` / `multi-center prospective` / `MIMIC-IV` / `eICU` / `MIMIC-III` / `KNHIS` / `UK Biobank` / `TriNetX` / `Optum` / `MarketScan` / `SEER` / etc. | `MIMIC-IV` |
31
+ | `institution_primary` | Verbatim institution name from corresponding-author affiliation | `Tertiary Academic Medical Center, [City]` |
32
+ | `institutions_additional` | Pipe-separated additional centers | `Other Affiliated Hospital` |
33
+ | `enrollment_period_start` | YYYY-MM | `2017-01` |
34
+ | `enrollment_period_end` | YYYY-MM | `2019-12` |
35
+ | `data_sharing_statement` | Yes / No / NotReported | `NotReported` |
36
+ | `overlap_flag_reviewer1` | Reviewer 1 suspects cohort overlap with which study_id (or empty) | `StudyB_YYYY` |
37
+ | `overlap_flag_reviewer2` | Reviewer 2's overlap flag | `StudyB_YYYY` |
38
+
39
+ ### Sample sizes (diagnostic subset N transparency)
40
+
41
+ | Column | Description | Example |
42
+ |---|---|---|
43
+ | `sample_n_total` | Total study N | `452` |
44
+ | `sample_n_train` | Training set N | `273` |
45
+ | `sample_n_internal_test` | Internal test N | `68` |
46
+ | `sample_n_external_test` | External test N | `111` |
47
+ | `sample_n_dta_pool` | N contributing to DTA bivariate (sens/spec extraction) | `111` |
48
+ | `sample_n_prognostic_pool` | N contributing to prognostic AUC pool | `0` |
49
+ | `prevalence_in_dta_pool` | (TP+FN) / sample_n_dta_pool | `0.414` |
50
+
51
+ ### DTA outcome extraction (2×2 cell integrity)
52
+
53
+ For each cohort that contributes to bivariate pool, extract:
54
+
55
+ | Column | Description | Example |
56
+ |---|---|---|
57
+ | `dta_cohort_label` | Which cohort the values come from (must match `sample_n_external_test` or similar) | `external_test` |
58
+ | `tp` | True positive count | `45` |
59
+ | `fn` | False negative count | `1` |
60
+ | `tn` | True negative count | `36` |
61
+ | `fp` | False positive count | `29` |
62
+ | `extracted_sens` | TP / (TP+FN), decimal | `0.978` |
63
+ | `extracted_spec` | TN / (TN+FP), decimal | `0.554` |
64
+ | **`source_sens_reported`** | Sensitivity as reported in source paper (decimal) | `0.978` |
65
+ | **`source_spec_reported`** | Specificity as reported in source paper (decimal) | `0.554` |
66
+ | **`source_page_ref`** | Page + Table/Figure number in source paper | `Table 3, p.7` |
67
+ | **`source_verbatim_quote`** | Verbatim sentence containing the sens/spec values | `"The deep-integrated model achieved a sensitivity of 0.978..."` |
68
+ | `extractor1_initials` | First extractor | `R1` |
69
+ | `extractor2_initials` | Second extractor | `R2` |
70
+ | `extraction_consensus_status` | Resolved / DiscussNeeded / Conflict | `Resolved` |
71
+
72
+ **QC**: Run `scripts/dta_extraction_qc.py` with `--tolerance 0.02` after dual-extractor entry. Any FLAG_SWAP or FLAG_MISMATCH requires third-reviewer adjudication.
73
+
74
+ ### Prognostic outcome extraction (PROBAST-AI compatible)
75
+
76
+ | Column | Description | Example |
77
+ |---|---|---|
78
+ | `prognostic_outcome_type` | mortality / AKI / disease_progression / readmission / etc. | `mortality` |
79
+ | `prognostic_endpoint_definition` | Verbatim definition | `In-hospital all-cause death within index admission` |
80
+ | `auc_point` | Reported AUC, decimal | `0.87` |
81
+ | `auc_ci_lower` | 95% CI lower | `0.83` |
82
+ | `auc_ci_upper` | 95% CI upper | `0.90` |
83
+ | `validation_type` | internal / external / leave-one-out / k-fold | `external` |
84
+ | `calibration_reported` | Yes / No | `No` |
85
+ | `dca_reported` | Decision curve analysis Yes/No | `No` |
86
+
87
+ ### Risk of bias (per-study × per-domain)
88
+
89
+ QUADAS-AI (for DTA studies):
90
+
91
+ | Column | Description |
92
+ |---|---|
93
+ | `quadasai_d1_patient_selection` | Low / High / Unclear |
94
+ | `quadasai_d2_index_test` | Low / High / Unclear |
95
+ | `quadasai_d3_reference_standard` | Low / High / Unclear |
96
+ | `quadasai_d4_flow_timing` | Low / High / Unclear |
97
+ | `quadasai_d1_justification` | Verbatim short reason |
98
+ | `quadasai_d2_justification` | ... |
99
+ | ... | (same for D3, D4) |
100
+ | `quadasai_overall` | Low / High / Unclear (consensus) |
101
+
102
+ PROBAST-AI (for prognostic studies): D1 Participants / D2 Predictors / D3 Outcome / D4 Analysis — same Low/High/Unclear + justification.
103
+
104
+ METRICS: 4 domains (data, model dev, validation, reporting) per study.
105
+
106
+ ### Authors of extraction record
107
+
108
+ | Column | Description |
109
+ |---|---|
110
+ | `extraction_date_initial` | YYYY-MM-DD |
111
+ | `extraction_date_consensus` | YYYY-MM-DD |
112
+ | `cohens_kappa_d1` | Pre-adjudication inter-rater κ for domain D1 |
113
+ | ... | (record κ for each pre-adjudication discrepancy domain) |
114
+
115
+ ## Workflow (dual-extractor consensus)
116
+
117
+ 1. Extractor 1 + Extractor 2 independently fill all cells, source_page_ref, source_verbatim_quote
118
+ 2. Run `dta_extraction_qc.py --tolerance 0.02` → flag mismatches
119
+ 3. Pre-adjudication κ recorded for D1-D4
120
+ 4. Discrepancies → third-reviewer adjudication, consensus_status updated
121
+ 5. Run `cohort_overlap_check.py --enrich` → populate database_source via PubMed if missing
122
+ 6. Manual review of HIGH/MEDIUM clusters → confirm or override
123
+ 7. Lock extraction (read-only) before statistical analysis
124
+
125
+ ## Related
126
+
127
+ - `scripts/dta_extraction_qc.py`
128
+ - `scripts/cohort_overlap_check.py`
129
+ - `templates/supplementary_8file_checklist.md`
@@ -0,0 +1,94 @@
1
+ # SR-MA Supplementary Package — 8-File Standard
2
+
3
+ **Motivation**: Recent SR-MA peer reviews surfaced supplementary packages that contained only figure captions (≈90 lines), missing PRISMA checklist, exclusion list, extraction table, per-study RoB — despite Methods citing "Supplementary Table S1". Below is the minimum package to avoid this pattern.
4
+
5
+ **Apply to**: every SR-MA submission. Radiology / Radiology-AI / European Radiology / JCSM / Lancet family / JAMA family / BMJ family all expect this level of supplementary.
6
+
7
+ ## 8 mandatory files
8
+
9
+ ### S1 — PRISMA / PRISMA-DTA / PRISMA-S checklist
10
+
11
+ - 27-item PRISMA 2020 (general) or PRISMA-DTA (diagnostic accuracy SR-MA)
12
+ - Each item filled with main-manuscript page reference (`p.3, lines 45-48`)
13
+ - Use checklist template from your institutional checklist store
14
+ - For pure search reporting: PRISMA-S 16-item additional
15
+
16
+ ### S2 — PROSPERO protocol PDF (snapshot + amendments)
17
+
18
+ - Download from prospero.york.ac.uk at registration AND at submission
19
+ - Include all amendments with date + rationale
20
+ - **If subgroup analyses changed post-registration**: explicit amendment record with date
21
+
22
+ ### S3 — Full search strategy verbatim (per database)
23
+
24
+ - Each database (PubMed / Embase / Cochrane / Scopus / Web of Science) with:
25
+ - Search date (YYYY-MM-DD)
26
+ - Final string verbatim (copy-paste from interface)
27
+ - Filter use (date, language, study type)
28
+ - Number of records retrieved per database
29
+
30
+ ### S4 — Full-text exclusion list with reasons (PRISMA item 16b)
31
+
32
+ - Every full-text article excluded with:
33
+ - First author, year, title
34
+ - PMID / DOI
35
+ - Exclusion reason (one of pre-specified categories)
36
+ - Use Rayyan export or equivalent
37
+
38
+ ### S5 — Per-study data extraction table
39
+
40
+ - One row per included study × all extracted variables (use `extraction_form_v2.md` schema)
41
+ - Include `source_page_ref` + `source_verbatim_quote` for outcome cells (DTA 2×2 or AUC)
42
+ - Locked read-only file (CSV + PDF snapshot)
43
+
44
+ ### S6 — Per-study × per-domain risk-of-bias table
45
+
46
+ - For DTA: QUADAS-AI (4 domains × N_diagnostic studies) + applicability concerns
47
+ - For prognostic: PROBAST-AI (4 domains × N_prognostic studies)
48
+ - Per-cell: Low / High / Unclear + 1-line justification
49
+ - Optionally: METRICS framework parallel column
50
+ - Include pre-adjudication Cohen's κ per domain
51
+
52
+ ### S7 — Subgroup forest plots (all pre-specified + clearly labeled exploratory)
53
+
54
+ - Each forest plot with:
55
+ - Subgroup label
56
+ - "Pre-specified in PROSPERO" or "Exploratory (post-hoc)" tag
57
+ - Heterogeneity (I², τ²) per stratum
58
+ - **k=1 strata excluded from formal test OR flagged as descriptive only**
59
+
60
+ ### S8 — Sensitivity analyses + publication bias
61
+
62
+ - Leave-one-out for primary outcome (forest plot or table)
63
+ - Cohort overlap sensitivity analysis (exclude one of HIGH-confidence overlap pair)
64
+ - Deeks' funnel asymmetry test for DTA studies (mada::funnel)
65
+ - Funnel plot + Egger / Begg for prognostic AUC pooling
66
+ - Trim-and-fill if asymmetry detected
67
+
68
+ ## Submission gate check
69
+
70
+ Before submitting, verify:
71
+
72
+ ```bash
73
+ ls -la submission/supplementary/
74
+ # Expected: at minimum 8 files (S1-S8)
75
+
76
+ # Each file size > 5 KB (figure caption only is ~3 KB)
77
+ for f in submission/supplementary/S*.{md,pdf,csv,docx}; do
78
+ size=$(stat -f%z "$f" 2>/dev/null || stat -c%s "$f" 2>/dev/null)
79
+ echo "$f: $size bytes"
80
+ done
81
+ ```
82
+
83
+ If any S-file is missing or only contains figure captions → **NOT READY for submission**.
84
+
85
+ ## Cross-link to AI Disclosure (`/sync-submission` gate)
86
+
87
+ The supplementary checklist should be combined with the AI Disclosure presence check. Most major imaging journals require an affirmative or negative disclosure statement either in manuscript text or in S-file metadata.
88
+
89
+ ## Related
90
+
91
+ - `templates/extraction_form_v2.md`
92
+ - `scripts/dta_extraction_qc.py`
93
+ - `scripts/cohort_overlap_check.py`
94
+ - `/peer-review` Phase 2A P5 (supplementary completeness probe)
@@ -0,0 +1,123 @@
1
+ #!/usr/bin/env bash
2
+ # Regression tests for meta-analysis check_pool_consistency.py.
3
+
4
+ set -uo pipefail
5
+
6
+ REPO_ROOT="$(cd "$(dirname "$0")/../../.." && pwd)"
7
+ SCRIPT="$REPO_ROOT/skills/meta-analysis/scripts/check_pool_consistency.py"
8
+ TMP="$(mktemp -d -t pool_consist.XXXXXX)"
9
+ trap 'rm -rf "$TMP"' EXIT
10
+
11
+ [[ -f "$SCRIPT" ]] || { echo "ENV-ERR: script missing" >&2; exit 2; }
12
+ python3 -c "import yaml" 2>/dev/null || { echo "SKIP: pyyaml unavailable"; exit 0; }
13
+
14
+ fail=0
15
+ ran=0
16
+ assert_exit() {
17
+ local label="$1" expected="$2" actual="$3"
18
+ ran=$((ran + 1))
19
+ if [[ "$expected" == "$actual" ]]; then
20
+ printf ' PASS %-50s exit=%s\n' "$label" "$actual"
21
+ else
22
+ printf ' FAIL %-50s expected=%s actual=%s\n' "$label" "$expected" "$actual"
23
+ fail=$((fail + 1))
24
+ fi
25
+ }
26
+
27
+ # --------------------------------------------------------------------------
28
+ # Case 1: lock and TSV agree on 3 UIDs => PASS
29
+ # --------------------------------------------------------------------------
30
+ mkdir -p "$TMP/c1"
31
+ cat > "$TMP/c1/lock.yaml" <<'EOF'
32
+ freeze_date: "2026-01-01"
33
+ final_pool_n: 3
34
+ include_count: 3
35
+ exclude_count: 0
36
+ mixed_count: 0
37
+ include_uids: [UID_001, UID_002, UID_003]
38
+ exclude_uids: []
39
+ mixed_uids: []
40
+ EOF
41
+ cat > "$TMP/c1/r3.tsv" <<'EOF'
42
+ uid round3_decision notes
43
+ UID_001 INCLUDE ok
44
+ UID_002 INCLUDE ok
45
+ UID_003 INCLUDE ok
46
+ UID_004 EXCLUDE out of scope
47
+ EOF
48
+ python3 "$SCRIPT" --lock "$TMP/c1/lock.yaml" \
49
+ --adjudication-tsv "$TMP/c1/r3.tsv" \
50
+ --out "$TMP/c1/report.json" --quiet
51
+ assert_exit "case 1: lock and TSV agree" 0 $?
52
+
53
+ # --------------------------------------------------------------------------
54
+ # Case 2: TSV has extra UID => FAIL
55
+ # --------------------------------------------------------------------------
56
+ mkdir -p "$TMP/c2"
57
+ cat > "$TMP/c2/lock.yaml" <<'EOF'
58
+ include_uids: [UID_001, UID_002]
59
+ exclude_uids: []
60
+ mixed_uids: []
61
+ EOF
62
+ cat > "$TMP/c2/r3.tsv" <<'EOF'
63
+ uid round3_decision
64
+ UID_001 INCLUDE
65
+ UID_002 INCLUDE
66
+ UID_009 INCLUDE
67
+ EOF
68
+ python3 "$SCRIPT" --lock "$TMP/c2/lock.yaml" \
69
+ --adjudication-tsv "$TMP/c2/r3.tsv" \
70
+ --out "$TMP/c2/report.json" --quiet
71
+ assert_exit "case 2: TSV extra UID (FAIL)" 1 $?
72
+ python3 - "$TMP/c2/report.json" <<'PY' || fail=$((fail + 1))
73
+ import json, sys
74
+ with open(sys.argv[1]) as fh: r = json.load(fh)
75
+ assert "UID_009" in r["in_tsv_not_lock"], r
76
+ assert not r["in_lock_not_tsv"], r
77
+ PY
78
+
79
+ # --------------------------------------------------------------------------
80
+ # Case 3: lock has extra UID => FAIL
81
+ # --------------------------------------------------------------------------
82
+ mkdir -p "$TMP/c3"
83
+ cat > "$TMP/c3/lock.yaml" <<'EOF'
84
+ include_uids: [UID_001, UID_002, UID_999]
85
+ mixed_uids: []
86
+ exclude_uids: []
87
+ EOF
88
+ cat > "$TMP/c3/r3.tsv" <<'EOF'
89
+ uid round3_decision
90
+ UID_001 INCLUDE
91
+ UID_002 INCLUDE
92
+ EOF
93
+ python3 "$SCRIPT" --lock "$TMP/c3/lock.yaml" \
94
+ --adjudication-tsv "$TMP/c3/r3.tsv" \
95
+ --out "$TMP/c3/report.json" --quiet
96
+ assert_exit "case 3: lock extra UID (FAIL)" 1 $?
97
+ python3 - "$TMP/c3/report.json" <<'PY' || fail=$((fail + 1))
98
+ import json, sys
99
+ with open(sys.argv[1]) as fh: r = json.load(fh)
100
+ assert "UID_999" in r["in_lock_not_tsv"], r
101
+ PY
102
+
103
+ # --------------------------------------------------------------------------
104
+ # Case 4: missing decision column => exit 2
105
+ # --------------------------------------------------------------------------
106
+ mkdir -p "$TMP/c4"
107
+ cat > "$TMP/c4/lock.yaml" <<'EOF'
108
+ include_uids: [UID_001]
109
+ mixed_uids: []
110
+ exclude_uids: []
111
+ EOF
112
+ cat > "$TMP/c4/r3.tsv" <<'EOF'
113
+ uid notes
114
+ UID_001 whatever
115
+ EOF
116
+ python3 "$SCRIPT" --lock "$TMP/c4/lock.yaml" \
117
+ --adjudication-tsv "$TMP/c4/r3.tsv" \
118
+ --out "$TMP/c4/report.json" --quiet 2>/dev/null
119
+ assert_exit "case 4: missing decision col (exit 2)" 2 $?
120
+
121
+ echo ""
122
+ echo "ran=$ran fail=$fail"
123
+ [[ $fail -eq 0 ]]