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.
- package/LICENSE +50 -0
- package/README.md +602 -0
- package/README_FIRST.md +27 -0
- package/bin/medsci-skills.js +159 -0
- package/installers/install-macos.command +19 -0
- package/installers/install-windows.cmd +26 -0
- package/installers/install-windows.ps1 +17 -0
- package/installers/install.py +218 -0
- package/metadata/skills_catalog.json +452 -0
- package/package.json +48 -0
- package/skills/academic-aio/SKILL.md +408 -0
- package/skills/academic-aio/references/case_studies/kjr_mllm_2025.md +82 -0
- package/skills/academic-aio/references/checklists/AIO_GENERAL.md +354 -0
- package/skills/academic-aio/references/journal_summarybox_templates.yaml +126 -0
- package/skills/academic-aio/references/oac_funding_checklist.yaml +129 -0
- package/skills/academic-aio/references/reporting_guideline_mapping.md +39 -0
- package/skills/academic-aio/references/schema_markup_templates/CodeRepository.jsonld +32 -0
- package/skills/academic-aio/references/schema_markup_templates/Dataset.jsonld +36 -0
- package/skills/academic-aio/references/schema_markup_templates/Person.jsonld +30 -0
- package/skills/academic-aio/references/schema_markup_templates/README.md +43 -0
- package/skills/academic-aio/references/schema_markup_templates/ScholarlyArticle.jsonld +55 -0
- package/skills/academic-aio/scripts/batch_metadata_audit.py +169 -0
- package/skills/academic-aio/scripts/validate_schema.py +118 -0
- package/skills/academic-aio/skill.yml +36 -0
- package/skills/academic-aio/templates/aio_audit_checklist.md.j2 +108 -0
- package/skills/add-journal/SKILL.md +482 -0
- package/skills/add-journal/skill.yml +33 -0
- package/skills/analyze-stats/SKILL.md +598 -0
- package/skills/analyze-stats/references/analysis_guides/missing_data.md +109 -0
- package/skills/analyze-stats/references/analysis_guides/nhis_icd10_mapping.md +247 -0
- package/skills/analyze-stats/references/analysis_guides/propensity_score.md +132 -0
- package/skills/analyze-stats/references/analysis_guides/regression.md +115 -0
- package/skills/analyze-stats/references/analysis_guides/repeated_measures.md +160 -0
- package/skills/analyze-stats/references/analysis_guides/survey_weighted.md +366 -0
- package/skills/analyze-stats/references/analysis_guides/test_selection.md +86 -0
- package/skills/analyze-stats/references/style/figure_style.mplstyle +69 -0
- package/skills/analyze-stats/references/style/theme_publication.R +147 -0
- package/skills/analyze-stats/references/table-standards/journal-profiles/ajr.yaml +51 -0
- package/skills/analyze-stats/references/table-standards/journal-profiles/european_radiology.yaml +55 -0
- package/skills/analyze-stats/references/table-standards/journal-profiles/jama.yaml +66 -0
- package/skills/analyze-stats/references/table-standards/journal-profiles/lancet.yaml +57 -0
- package/skills/analyze-stats/references/table-standards/journal-profiles/nejm.yaml +51 -0
- package/skills/analyze-stats/references/table-standards/journal-profiles/radiology.yaml +66 -0
- package/skills/analyze-stats/references/table-standards/table-standards.md +287 -0
- package/skills/analyze-stats/references/table-standards/table-types/diagnostic_accuracy.md +36 -0
- package/skills/analyze-stats/references/table-standards/table-types/meta_analysis.md +58 -0
- package/skills/analyze-stats/references/table-standards/table-types/model_comparison.md +36 -0
- package/skills/analyze-stats/references/table-standards/table-types/regression_results.md +50 -0
- package/skills/analyze-stats/references/table-standards/table-types/table1_demographics.md +51 -0
- package/skills/analyze-stats/references/table-standards/tool-comparison.md +79 -0
- package/skills/analyze-stats/references/templates/agreement_analysis.py +436 -0
- package/skills/analyze-stats/references/templates/dca_plot.R +237 -0
- package/skills/analyze-stats/references/templates/diagnostic_accuracy.py +401 -0
- package/skills/analyze-stats/references/templates/dta_meta_analysis.R +384 -0
- package/skills/analyze-stats/references/templates/forest_plot.py +412 -0
- package/skills/analyze-stats/references/templates/likert_summary.py +356 -0
- package/skills/analyze-stats/references/templates/meta_analysis.R +365 -0
- package/skills/analyze-stats/references/templates/propensity_score.py +478 -0
- package/skills/analyze-stats/references/templates/regression.py +425 -0
- package/skills/analyze-stats/references/templates/repeated_measures.py +434 -0
- package/skills/analyze-stats/references/templates/sample_size.R +382 -0
- package/skills/analyze-stats/references/templates/survey_weighted_analysis.py +411 -0
- package/skills/analyze-stats/references/templates/survival_analysis.py +325 -0
- package/skills/analyze-stats/references/templates/table1_demographics.py +287 -0
- package/skills/analyze-stats/scripts/check_generated_code.py +335 -0
- package/skills/analyze-stats/skill.yml +38 -0
- package/skills/analyze-stats/tests/fixtures/gen_bad.R +16 -0
- package/skills/analyze-stats/tests/fixtures/gen_bad.py +24 -0
- package/skills/analyze-stats/tests/fixtures/gen_clean.py +21 -0
- package/skills/analyze-stats/tests/test_generated_code.sh +59 -0
- package/skills/analyze-stats/tests/test_survival_template.sh +53 -0
- package/skills/author-strategy/SKILL.md +117 -0
- package/skills/author-strategy/analyze_patterns.py +303 -0
- package/skills/author-strategy/fetch_pubmed.py +374 -0
- package/skills/author-strategy/skill.yml +34 -0
- package/skills/batch-cohort/SKILL.md +223 -0
- package/skills/batch-cohort/references/base_template_knhanes.R +210 -0
- package/skills/batch-cohort/references/batch_template_generator.R +222 -0
- package/skills/batch-cohort/references/variable_coding_registry.md +136 -0
- package/skills/batch-cohort/skill.yml +35 -0
- package/skills/calc-sample-size/SKILL.md +491 -0
- package/skills/calc-sample-size/references/formulas.md +655 -0
- package/skills/calc-sample-size/references/observational_cohort.md +49 -0
- package/skills/calc-sample-size/skill.yml +51 -0
- package/skills/check-reporting/SKILL.md +534 -0
- package/skills/check-reporting/references/LICENSES.md +41 -0
- package/skills/check-reporting/references/checklists/AMSTAR2.md +54 -0
- package/skills/check-reporting/references/checklists/ARRIVE_2.md +234 -0
- package/skills/check-reporting/references/checklists/CARE.md +102 -0
- package/skills/check-reporting/references/checklists/CLAIM_2024.md +128 -0
- package/skills/check-reporting/references/checklists/CLEAR.md +113 -0
- package/skills/check-reporting/references/checklists/CONSORT.md +86 -0
- package/skills/check-reporting/references/checklists/COSMIN_RoB.md +136 -0
- package/skills/check-reporting/references/checklists/GRRAS.md +61 -0
- package/skills/check-reporting/references/checklists/MI_CLEAR_LLM.md +167 -0
- package/skills/check-reporting/references/checklists/MOOSE.md +85 -0
- package/skills/check-reporting/references/checklists/NOS.md +88 -0
- package/skills/check-reporting/references/checklists/PRISMA_2020.md +135 -0
- package/skills/check-reporting/references/checklists/PRISMA_DTA.md +36 -0
- package/skills/check-reporting/references/checklists/PRISMA_P.md +56 -0
- package/skills/check-reporting/references/checklists/PROBAST.md +75 -0
- package/skills/check-reporting/references/checklists/PROBAST_AI.md +130 -0
- package/skills/check-reporting/references/checklists/QUADAS2.md +77 -0
- package/skills/check-reporting/references/checklists/QUADAS_C.md +131 -0
- package/skills/check-reporting/references/checklists/ROBINS_E.md +179 -0
- package/skills/check-reporting/references/checklists/ROBINS_I.md +87 -0
- package/skills/check-reporting/references/checklists/ROBIS.md +114 -0
- package/skills/check-reporting/references/checklists/ROB_ME.md +126 -0
- package/skills/check-reporting/references/checklists/RoB2.md +79 -0
- package/skills/check-reporting/references/checklists/RoB_NMA.md +96 -0
- package/skills/check-reporting/references/checklists/SPIRIT.md +112 -0
- package/skills/check-reporting/references/checklists/SQUIRE_2.md +68 -0
- package/skills/check-reporting/references/checklists/STARD.md +129 -0
- package/skills/check-reporting/references/checklists/STARD_AI.md +211 -0
- package/skills/check-reporting/references/checklists/STROBE.md +80 -0
- package/skills/check-reporting/references/checklists/SWiM.md +33 -0
- package/skills/check-reporting/references/checklists/TRIPOD.md +157 -0
- package/skills/check-reporting/references/checklists/TRIPOD_AI.md +140 -0
- package/skills/check-reporting/references/step4c_registration_timing.md +93 -0
- package/skills/check-reporting/references/step4d_prisma_figure_audit.md +137 -0
- package/skills/check-reporting/scripts/check_checklist_exists.py +183 -0
- package/skills/check-reporting/scripts/check_checklist_version.py +168 -0
- package/skills/check-reporting/scripts/check_framework_naming.py +206 -0
- package/skills/check-reporting/scripts/check_prisma_figure.py +209 -0
- package/skills/check-reporting/scripts/prisma_cascade_check.py +274 -0
- package/skills/check-reporting/skill.yml +41 -0
- package/skills/check-reporting/tests/fixtures/framework_bad.md +8 -0
- package/skills/check-reporting/tests/fixtures/framework_clean.md +7 -0
- package/skills/check-reporting/tests/test_checklist_fail_fast.sh +77 -0
- package/skills/check-reporting/tests/test_checklist_version.sh +72 -0
- package/skills/check-reporting/tests/test_framework_naming.sh +45 -0
- package/skills/check-reporting/tests/test_prisma_cascade.sh +104 -0
- package/skills/clean-data/SKILL.md +180 -0
- package/skills/clean-data/references/cleaning_patterns.md +299 -0
- package/skills/clean-data/references/profiling_template.py +304 -0
- package/skills/clean-data/scripts/check_structural_zero.py +174 -0
- package/skills/clean-data/skill.yml +35 -0
- package/skills/clean-data/tests/fixtures/smoking.csv +8 -0
- package/skills/clean-data/tests/test_structural_zero.sh +49 -0
- package/skills/cross-national/SKILL.md +264 -0
- package/skills/cross-national/skill.yml +37 -0
- package/skills/define-variables/SKILL.md +146 -0
- package/skills/define-variables/references/common_definitions.md +190 -0
- package/skills/define-variables/skill.yml +34 -0
- package/skills/define-variables/templates/variable_operationalization.md +64 -0
- package/skills/deidentify/SKILL.md +203 -0
- package/skills/deidentify/deidentify.py +1224 -0
- package/skills/deidentify/locales/_template.json +45 -0
- package/skills/deidentify/locales/au.json +43 -0
- package/skills/deidentify/locales/ca.json +44 -0
- package/skills/deidentify/locales/cn.json +47 -0
- package/skills/deidentify/locales/de.json +48 -0
- package/skills/deidentify/locales/fr.json +48 -0
- package/skills/deidentify/locales/in.json +48 -0
- package/skills/deidentify/locales/jp.json +48 -0
- package/skills/deidentify/locales/kr.json +48 -0
- package/skills/deidentify/locales/uk.json +45 -0
- package/skills/deidentify/locales/us.json +43 -0
- package/skills/deidentify/references/date_shift_guide.md +82 -0
- package/skills/deidentify/references/hipaa_18_identifiers.md +48 -0
- package/skills/deidentify/references/korean_phi_patterns.md +135 -0
- package/skills/deidentify/skill.yml +43 -0
- package/skills/deidentify/tests/README.md +26 -0
- package/skills/deidentify/tests/test_clean.csv +16 -0
- package/skills/deidentify/tests/test_edge_cases.csv +11 -0
- package/skills/deidentify/tests/test_phi_korean.csv +11 -0
- package/skills/design-ai-benchmarking/SKILL.md +214 -0
- package/skills/design-ai-benchmarking/references/benchmark_export_schema.json +69 -0
- package/skills/design-ai-benchmarking/references/elicitation_rubric_template.md +37 -0
- package/skills/design-ai-benchmarking/skill.yml +38 -0
- package/skills/design-study/SKILL.md +298 -0
- package/skills/design-study/skill.yml +33 -0
- package/skills/fill-icmje-coi/SKILL.md +216 -0
- package/skills/fill-icmje-coi/scripts/fill_icmje_coi.py +140 -0
- package/skills/fill-icmje-coi/skill.yml +35 -0
- package/skills/fill-icmje-coi/templates/icmje_coi_seed_synthetic.docx +0 -0
- package/skills/fill-protocol/SKILL.md +248 -0
- package/skills/fill-protocol/examples/example_irb_template.yaml +53 -0
- package/skills/fill-protocol/references/best_practices.md +121 -0
- package/skills/fill-protocol/scripts/doc_to_docx.py +111 -0
- package/skills/fill-protocol/scripts/fill_form.py +611 -0
- package/skills/fill-protocol/scripts/inspect_template.py +61 -0
- package/skills/fill-protocol/setup.sh +162 -0
- package/skills/fill-protocol/skill.yml +37 -0
- package/skills/find-cohort-gap/SKILL.md +309 -0
- package/skills/find-cohort-gap/references/cohort_profile_template.md +93 -0
- package/skills/find-cohort-gap/references/onepager_template.md +84 -0
- package/skills/find-cohort-gap/references/pattern_scoring_rubric.md +169 -0
- package/skills/find-cohort-gap/references/saturation_query_templates.md +143 -0
- package/skills/find-cohort-gap/skill.yml +35 -0
- package/skills/find-journal/POLICY.md +87 -0
- package/skills/find-journal/SKILL.md +340 -0
- package/skills/find-journal/references/journal_profiles/AJNR.md +29 -0
- package/skills/find-journal/references/journal_profiles/AJR.md +30 -0
- package/skills/find-journal/references/journal_profiles/Abdominal_Radiology.md +30 -0
- package/skills/find-journal/references/journal_profiles/Academic_Radiology.md +30 -0
- package/skills/find-journal/references/journal_profiles/Annals_of_Internal_Medicine.md +33 -0
- package/skills/find-journal/references/journal_profiles/Artificial_Intelligence_in_Medicine.md +28 -0
- package/skills/find-journal/references/journal_profiles/BMC_Medicine.md +31 -0
- package/skills/find-journal/references/journal_profiles/British_Journal_of_Radiology.md +39 -0
- package/skills/find-journal/references/journal_profiles/CVIR.md +30 -0
- package/skills/find-journal/references/journal_profiles/Chest.md +39 -0
- package/skills/find-journal/references/journal_profiles/Clinical_Radiology.md +30 -0
- package/skills/find-journal/references/journal_profiles/Clinical_and_Molecular_Hepatology.md +32 -0
- package/skills/find-journal/references/journal_profiles/Diabetes_Metabolism_Journal.md +36 -0
- package/skills/find-journal/references/journal_profiles/Diagnostic_and_Interventional_Radiology.md +32 -0
- package/skills/find-journal/references/journal_profiles/Endocrinology_and_Metabolism.md +37 -0
- package/skills/find-journal/references/journal_profiles/European_Journal_of_Preventive_Cardiology.md +39 -0
- package/skills/find-journal/references/journal_profiles/European_Radiology.md +29 -0
- package/skills/find-journal/references/journal_profiles/Hepatology_Communications.md +40 -0
- package/skills/find-journal/references/journal_profiles/Hepatology_International.md +37 -0
- package/skills/find-journal/references/journal_profiles/IEEE_JBHI.md +28 -0
- package/skills/find-journal/references/journal_profiles/IEEE_TMI.md +28 -0
- package/skills/find-journal/references/journal_profiles/INSI.md +29 -0
- package/skills/find-journal/references/journal_profiles/Investigative_Radiology.md +25 -0
- package/skills/find-journal/references/journal_profiles/JACC_Advances.md +41 -0
- package/skills/find-journal/references/journal_profiles/JACC_Asia.md +30 -0
- package/skills/find-journal/references/journal_profiles/JACR.md +28 -0
- package/skills/find-journal/references/journal_profiles/JAMA.md +40 -0
- package/skills/find-journal/references/journal_profiles/JAMA_Network_Open.md +30 -0
- package/skills/find-journal/references/journal_profiles/JCSM.md +39 -0
- package/skills/find-journal/references/journal_profiles/JKMS.md +32 -0
- package/skills/find-journal/references/journal_profiles/JMIR.md +29 -0
- package/skills/find-journal/references/journal_profiles/JMIR_Medical_Education.md +29 -0
- package/skills/find-journal/references/journal_profiles/JNIS.md +35 -0
- package/skills/find-journal/references/journal_profiles/JVIR.md +31 -0
- package/skills/find-journal/references/journal_profiles/Journal_of_Biomedical_Informatics.md +29 -0
- package/skills/find-journal/references/journal_profiles/Journal_of_Clinical_Endocrinology_and_Metabolism.md +40 -0
- package/skills/find-journal/references/journal_profiles/Journal_of_Magnetic_Resonance_Imaging.md +30 -0
- package/skills/find-journal/references/journal_profiles/Journal_of_Nuclear_Medicine.md +31 -0
- package/skills/find-journal/references/journal_profiles/Journal_of_Stroke.md +32 -0
- package/skills/find-journal/references/journal_profiles/KJR.md +38 -0
- package/skills/find-journal/references/journal_profiles/Korean_Circulation_Journal.md +38 -0
- package/skills/find-journal/references/journal_profiles/Korean_Journal_of_Internal_Medicine.md +36 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Diabetes_and_Endocrinology.md +40 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Gastroenterology_and_Hepatology.md +49 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Infectious_Diseases.md +38 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Neurology.md +39 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Oncology.md +40 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Psychiatry.md +38 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Public_Health.md +30 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Respiratory_Medicine.md +39 -0
- package/skills/find-journal/references/journal_profiles/Liver_International.md +33 -0
- package/skills/find-journal/references/journal_profiles/Medical_Image_Analysis.md +28 -0
- package/skills/find-journal/references/journal_profiles/NEJM.md +33 -0
- package/skills/find-journal/references/journal_profiles/Nature_Machine_Intelligence.md +31 -0
- package/skills/find-journal/references/journal_profiles/Nature_Medicine.md +39 -0
- package/skills/find-journal/references/journal_profiles/Neuroradiology.md +31 -0
- package/skills/find-journal/references/journal_profiles/Nutrition_Metabolism_and_Cardiovascular_Diseases.md +39 -0
- package/skills/find-journal/references/journal_profiles/PLOS_Medicine.md +32 -0
- package/skills/find-journal/references/journal_profiles/RYAI.md +28 -0
- package/skills/find-journal/references/journal_profiles/Radiology.md +29 -0
- package/skills/find-journal/references/journal_profiles/Skeletal_Radiology.md +31 -0
- package/skills/find-journal/references/journal_profiles/Stroke.md +37 -0
- package/skills/find-journal/references/journal_profiles/The_BMJ.md +31 -0
- package/skills/find-journal/references/journal_profiles/The_Lancet.md +31 -0
- package/skills/find-journal/references/journal_profiles/The_Lancet_Digital_Health.md +29 -0
- package/skills/find-journal/references/journal_profiles/World_Journal_of_Hepatology.md +53 -0
- package/skills/find-journal/references/journal_profiles/npj_Digital_Medicine.md +29 -0
- package/skills/find-journal/skill.yml +34 -0
- package/skills/fulltext-retrieval/SKILL.md +174 -0
- package/skills/fulltext-retrieval/fetch_oa.py +433 -0
- package/skills/fulltext-retrieval/pdf_to_md.py +160 -0
- package/skills/fulltext-retrieval/skill.yml +41 -0
- package/skills/generate-codebook/SKILL.md +155 -0
- package/skills/generate-codebook/references/codebook_schema.md +76 -0
- package/skills/generate-codebook/scripts/generate_codebook.py +278 -0
- package/skills/generate-codebook/skill.yml +35 -0
- package/skills/generate-codebook/tests/test_generate_codebook.sh +76 -0
- package/skills/grant-builder/SKILL.md +251 -0
- package/skills/grant-builder/skill.yml +34 -0
- package/skills/humanize/SKILL.md +251 -0
- package/skills/humanize/references/ai_patterns.md +571 -0
- package/skills/humanize/skill.yml +33 -0
- package/skills/intake-project/SKILL.md +264 -0
- package/skills/intake-project/skill.yml +34 -0
- package/skills/lit-sync/SKILL.md +448 -0
- package/skills/lit-sync/references/locale/ko/note_templates.md +110 -0
- package/skills/lit-sync/skill.yml +52 -0
- package/skills/lit-sync/tests/test_poll_logic.sh +92 -0
- package/skills/ma-scout/SKILL.md +640 -0
- package/skills/ma-scout/references/project_readme_template.md +95 -0
- package/skills/ma-scout/references/project_readme_template_ko.md +82 -0
- package/skills/ma-scout/skill.yml +33 -0
- package/skills/make-figures/SKILL.md +957 -0
- package/skills/make-figures/references/critic_rubrics/data_plot.md +166 -0
- package/skills/make-figures/references/critic_rubrics/flow_diagram.md +169 -0
- package/skills/make-figures/references/design_principles.md +181 -0
- package/skills/make-figures/references/exemplar_diagrams/README.md +65 -0
- package/skills/make-figures/references/exemplar_diagrams/consort/README.md +15 -0
- package/skills/make-figures/references/exemplar_diagrams/consort/template_input.yaml +37 -0
- package/skills/make-figures/references/exemplar_diagrams/consort/template_output.pdf +0 -0
- package/skills/make-figures/references/exemplar_diagrams/consort/template_output.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/consort/template_output_600.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/other/other_02.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/other/other_02.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/other/other_02_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/README.md +15 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_01.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_01.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_01_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_03.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_03.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_03_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_04.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_04.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_04_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_05.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_05.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_05_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_06.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_06.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_06_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_07.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_07.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_07_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_08.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_08.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_08_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_09.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_09.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_09_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_10.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_10.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_10_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/prisma/README.md +15 -0
- package/skills/make-figures/references/exemplar_diagrams/prisma/template_input.yaml +47 -0
- package/skills/make-figures/references/exemplar_diagrams/prisma/template_output.pdf +0 -0
- package/skills/make-figures/references/exemplar_diagrams/prisma/template_output.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/prisma/template_output_600.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/stard/README.md +15 -0
- package/skills/make-figures/references/exemplar_diagrams/stard/template_input.yaml +40 -0
- package/skills/make-figures/references/exemplar_diagrams/stard/template_output.pdf +0 -0
- package/skills/make-figures/references/exemplar_diagrams/stard/template_output.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/stard/template_output_600.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/strobe/template_input.yaml +43 -0
- package/skills/make-figures/references/exemplar_diagrams/strobe/template_input_pptx.yaml +43 -0
- package/skills/make-figures/references/exemplar_diagrams/strobe/template_output.pdf +0 -0
- package/skills/make-figures/references/exemplar_diagrams/strobe/template_output.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/strobe/template_output.pptx +0 -0
- package/skills/make-figures/references/exemplar_diagrams/strobe/template_output_600.png +0 -0
- package/skills/make-figures/references/figure_specs.md +291 -0
- package/skills/make-figures/references/flow_diagram_lessons.md +164 -0
- package/skills/make-figures/references/jacc_central_illustration_principles.md +91 -0
- package/skills/make-figures/references/medical_illustration_sources.md +98 -0
- package/skills/make-figures/references/pipeline_concepts_medical_ai.md +240 -0
- package/skills/make-figures/references/reporting_guideline_figure_map.md +104 -0
- package/skills/make-figures/references/visual_abstract_templates/european_radiology.pptx +0 -0
- package/skills/make-figures/references/visual_abstract_templates/jacc_central_illustration.pptx +0 -0
- package/skills/make-figures/references/visual_abstract_templates/medsci_default.pptx +0 -0
- package/skills/make-figures/references/visual_abstract_templates/template_guide.md +114 -0
- package/skills/make-figures/scripts/build_jacc_template.py +77 -0
- package/skills/make-figures/scripts/build_prisma2020_template.py +371 -0
- package/skills/make-figures/scripts/build_strobe_template.py +351 -0
- package/skills/make-figures/scripts/critic_figure.py +264 -0
- package/skills/make-figures/scripts/derive_figure_legend_counts.py +138 -0
- package/skills/make-figures/scripts/extract_exemplar_from_pdf.py +186 -0
- package/skills/make-figures/scripts/fetch_official_templates.sh +88 -0
- package/skills/make-figures/scripts/fill_prisma_template.py +142 -0
- package/skills/make-figures/scripts/generate_flow_diagram.R +133 -0
- package/skills/make-figures/scripts/generate_image.py +99 -0
- package/skills/make-figures/scripts/generate_visual_abstract.py +438 -0
- package/skills/make-figures/scripts/validate_pptx_mac_compat.py +233 -0
- package/skills/make-figures/skill.yml +52 -0
- package/skills/make-figures/templates/official/NOTES.md +62 -0
- package/skills/make-figures/templates/official/consort2010/CONSORT_2025_editable_checklist.docx +0 -0
- package/skills/make-figures/templates/official/consort2010/CONSORT_2025_flow_diagram.docx +0 -0
- package/skills/make-figures/templates/official/prisma2020/PRISMA_2020_flow_new_v1.pptx +0 -0
- package/skills/make-figures/templates/official/prisma2020/PRISMA_2020_flow_new_v2.pptx +0 -0
- package/skills/make-figures/templates/official/prisma2020/PRISMA_2020_flow_updated_v2.pptx +0 -0
- package/skills/make-figures/templates/official/spirit2013/SPIRIT_2025_editable_checklist.docx +0 -0
- package/skills/make-figures/templates/official/spirit2013/SPIRIT_2025_participant_timeline.docx +0 -0
- package/skills/make-figures/templates/official/stard2015/STARD_2015_checklist.docx +0 -0
- package/skills/make-figures/templates/official/stard2015/STARD_2015_flow_diagram.pdf +0 -0
- package/skills/make-figures/tests/fixtures/figure1_flow.yaml +8 -0
- package/skills/make-figures/tests/fixtures/manuscript_ok.md +9 -0
- package/skills/make-figures/tests/fixtures/manuscript_stale.md +4 -0
- package/skills/make-figures/tests/test_legend_reconcile.sh +36 -0
- package/skills/manage-project/SKILL.md +358 -0
- package/skills/manage-project/references/pre_submission_checklist.md +53 -0
- package/skills/manage-project/references/project_state_template.json +37 -0
- package/skills/manage-project/references/scaffold_templates.md +118 -0
- package/skills/manage-project/references/status_output_format.md +44 -0
- package/skills/manage-project/references/timeline_example.md +20 -0
- package/skills/manage-project/skill.yml +36 -0
- package/skills/manage-project/templates/SSOT.yaml.template +41 -0
- package/skills/manage-refs/LICENSE.zotero-mcp +21 -0
- package/skills/manage-refs/NOTICE.md +29 -0
- package/skills/manage-refs/SKILL.md +289 -0
- package/skills/manage-refs/citation_styles/README.md +40 -0
- package/skills/manage-refs/citation_styles/american-journal-of-roentgenology.csl +211 -0
- package/skills/manage-refs/citation_styles/cardiovascular-and-interventional-radiology.csl +19 -0
- package/skills/manage-refs/citation_styles/european-radiology.csl +19 -0
- package/skills/manage-refs/citation_styles/journal-of-cachexia-sarcopenia-and-muscle.csl +150 -0
- package/skills/manage-refs/citation_styles/journal-of-korean-medical-science-strict.csl +533 -0
- package/skills/manage-refs/citation_styles/journal-of-korean-medical-science.csl +16 -0
- package/skills/manage-refs/citation_styles/korean-journal-of-radiology.csl +155 -0
- package/skills/manage-refs/citation_styles/nature.csl +189 -0
- package/skills/manage-refs/citation_styles/nlm-citation-sequence.csl +535 -0
- package/skills/manage-refs/citation_styles/radiology.csl +228 -0
- package/skills/manage-refs/citation_styles/springer-basic-brackets.csl +187 -0
- package/skills/manage-refs/citation_styles/springer-vancouver-brackets.csl +276 -0
- package/skills/manage-refs/citation_styles/vancouver-superscript.csl +536 -0
- package/skills/manage-refs/citation_styles/vancouver.csl +535 -0
- package/skills/manage-refs/references/REFERENCE_STYLE_SPECS.md +59 -0
- package/skills/manage-refs/references/check_xref_symptoms.md +35 -0
- package/skills/manage-refs/scripts/_vendor_citation_writer.py +600 -0
- package/skills/manage-refs/scripts/check_citation_keys.py +112 -0
- package/skills/manage-refs/scripts/check_csl_render.py +102 -0
- package/skills/manage-refs/scripts/check_xref.py +633 -0
- package/skills/manage-refs/scripts/fill_journal_abbrev.py +104 -0
- package/skills/manage-refs/scripts/inject_zotero_cwyw.py +133 -0
- package/skills/manage-refs/scripts/md_marker_convert.py +193 -0
- package/skills/manage-refs/scripts/pre_submission_gate.sh +238 -0
- package/skills/manage-refs/scripts/render_pandoc.sh +88 -0
- package/skills/manage-refs/skill.yml +70 -0
- package/skills/manage-refs/tests/fixtures/pre_submission_gate/README.md +32 -0
- package/skills/manage-refs/tests/fixtures/pre_submission_gate/manuscript.md +10 -0
- package/skills/manage-refs/tests/fixtures/pre_submission_gate/refs.bib +34 -0
- package/skills/manage-refs/tests/fixtures/pre_submission_gate/run.sh +117 -0
- package/skills/manage-refs/tests/test_vN_docx_check.sh +145 -0
- package/skills/meta-analysis/SKILL.md +739 -0
- package/skills/meta-analysis/references/LICENSES.md +21 -0
- package/skills/meta-analysis/references/PROSPERO_template.md +221 -0
- package/skills/meta-analysis/references/ai_pre_screening_template.py +245 -0
- package/skills/meta-analysis/references/checklists/JBI_Case_Series.md +45 -0
- package/skills/meta-analysis/references/checklists/NOS.md +88 -0
- package/skills/meta-analysis/references/checklists/PRISMA_DTA.md +36 -0
- package/skills/meta-analysis/references/checklists/PROBAST.md +75 -0
- package/skills/meta-analysis/references/checklists/QUADAS2.md +77 -0
- package/skills/meta-analysis/references/checklists/ROBINS_I.md +87 -0
- package/skills/meta-analysis/references/checklists/RoB2.md +79 -0
- package/skills/meta-analysis/references/data_integrity_checklist.md +57 -0
- package/skills/meta-analysis/references/icmje_coi_guide.md +181 -0
- package/skills/meta-analysis/references/phase10_recovery.md +136 -0
- package/skills/meta-analysis/references/phase4_km_composite.md +58 -0
- package/skills/meta-analysis/references/phase6_statistical_synthesis.md +148 -0
- package/skills/meta-analysis/references/phase9_circulation.md +84 -0
- package/skills/meta-analysis/references/post_submission_release_ops.md +41 -0
- package/skills/meta-analysis/references/r_templates.md +132 -0
- package/skills/meta-analysis/references/review_orchestration.md +40 -0
- package/skills/meta-analysis/references/submission_package_drift.md +71 -0
- package/skills/meta-analysis/scripts/check_pool_consistency.py +201 -0
- package/skills/meta-analysis/scripts/cohort_overlap_check.py +242 -0
- package/skills/meta-analysis/scripts/dta_extraction_qc.py +137 -0
- package/skills/meta-analysis/scripts/screening_reconcile.py +160 -0
- package/skills/meta-analysis/skill.yml +47 -0
- package/skills/meta-analysis/templates/FINAL_POOL_LOCK.yaml.template +70 -0
- package/skills/meta-analysis/templates/extraction_form_v2.md +129 -0
- package/skills/meta-analysis/templates/supplementary_8file_checklist.md +94 -0
- package/skills/meta-analysis/tests/test_pool_consistency.sh +123 -0
- package/skills/orchestrate/SKILL.md +501 -0
- package/skills/orchestrate/references/dialogue_nodes.md +196 -0
- package/skills/orchestrate/references/report_template.md +109 -0
- package/skills/orchestrate/references/report_template_ko.md +88 -0
- package/skills/orchestrate/skill.yml +44 -0
- package/skills/peer-review/SKILL.md +381 -0
- package/skills/peer-review/references/aczel_2021_reviewer2_patterns.md +88 -0
- package/skills/peer-review/references/domain-probes/ai_overclaiming.md +47 -0
- package/skills/peer-review/references/domain-probes/narrative_review.md +44 -0
- package/skills/peer-review/references/domain-probes/observational_confounding.md +48 -0
- package/skills/peer-review/references/domain-probes/radiomics.md +38 -0
- package/skills/peer-review/references/domain-probes/sr_ma.md +87 -0
- package/skills/peer-review/references/domain-probes/survival_prognostic.md +68 -0
- package/skills/peer-review/references/exemplar_reviews/README.md +43 -0
- package/skills/peer-review/references/exemplar_reviews/ai_overclaiming.md +47 -0
- package/skills/peer-review/references/exemplar_reviews/calibration_missing.md +44 -0
- package/skills/peer-review/references/exemplar_reviews/data_leakage.md +48 -0
- package/skills/peer-review/references/exemplar_reviews/reference_standard_validity.md +45 -0
- package/skills/peer-review/references/narrative_review_audit.md +67 -0
- package/skills/peer-review/references/reviewer_calibration/README.md +34 -0
- package/skills/peer-review/references/reviewer_calibration/compliance_floor.md +52 -0
- package/skills/peer-review/references/reviewer_profiles/AJR.md +82 -0
- package/skills/peer-review/references/reviewer_profiles/EURE.md +64 -0
- package/skills/peer-review/references/reviewer_profiles/INSI.md +57 -0
- package/skills/peer-review/references/reviewer_profiles/KJR.md +100 -0
- package/skills/peer-review/references/reviewer_profiles/README.md +32 -0
- package/skills/peer-review/references/reviewer_profiles/RYAI.md +86 -0
- package/skills/peer-review/skill.yml +39 -0
- package/skills/present-paper/SKILL.md +675 -0
- package/skills/present-paper/references/critic_rubrics/slide.md +155 -0
- package/skills/present-paper/references/generate_pptx_templates.py +604 -0
- package/skills/present-paper/references/medical_presentation_templates.md +277 -0
- package/skills/present-paper/references/slide_design_principles.md +202 -0
- package/skills/present-paper/references/slide_visual_styles/nature_lancet.md +168 -0
- package/skills/present-paper/references/workflow-checklist.md +109 -0
- package/skills/present-paper/scripts/extract_pdf_figures.py +243 -0
- package/skills/present-paper/scripts/inject_pronunciation_notes.py +178 -0
- package/skills/present-paper/scripts/inject_speaker_notes.py +133 -0
- package/skills/present-paper/scripts/strip_notes_for_sharing.py +140 -0
- package/skills/present-paper/scripts/trim_caption.py +271 -0
- package/skills/present-paper/skill.yml +41 -0
- package/skills/present-paper/templates/build_pptx_nature_lancet.py +688 -0
- package/skills/publish-skill/SKILL.md +370 -0
- package/skills/publish-skill/references/license-compatibility-matrix.md +132 -0
- package/skills/publish-skill/references/pii-patterns.md +130 -0
- package/skills/publish-skill/scripts/audit_skill.sh +278 -0
- package/skills/publish-skill/skill.yml +35 -0
- package/skills/render-pdf-doc/SKILL.md +146 -0
- package/skills/render-pdf-doc/references/known_pitfalls.md +53 -0
- package/skills/render-pdf-doc/references/pandoc_korean_cheatsheet.md +77 -0
- package/skills/render-pdf-doc/scripts/check_deps.sh +42 -0
- package/skills/render-pdf-doc/scripts/infer_colwidths.py +164 -0
- package/skills/render-pdf-doc/scripts/render_pdf.sh +98 -0
- package/skills/render-pdf-doc/skill.yml +57 -0
- package/skills/render-pdf-doc/templates/anchor-doc.md +27 -0
- package/skills/render-pdf-doc/templates/anchor-doc_ko.md +25 -0
- package/skills/render-pdf-doc/templates/briefing-handout.md +33 -0
- package/skills/render-pdf-doc/templates/briefing-handout_ko.md +31 -0
- package/skills/render-pdf-doc/templates/proposal-cover.md +33 -0
- package/skills/render-pdf-doc/templates/proposal-cover_ko.md +31 -0
- package/skills/render-pdf-doc/templates/reference-table.md +22 -0
- package/skills/render-pdf-doc/templates/reference-table_ko.md +20 -0
- package/skills/replicate-study/SKILL.md +150 -0
- package/skills/replicate-study/references/harmonization_3country.csv +47 -0
- package/skills/replicate-study/references/harmonization_knhanes_nhanes.csv +68 -0
- package/skills/replicate-study/references/methodology_extraction_template.md +134 -0
- package/skills/replicate-study/skill.yml +37 -0
- package/skills/review-paper/SKILL.md +104 -0
- package/skills/review-paper/references/macro_skeleton.md +6 -0
- package/skills/review-paper/skill.yml +25 -0
- package/skills/revise/SKILL.md +515 -0
- package/skills/revise/references/r2r_voice.md +346 -0
- package/skills/revise/skill.yml +43 -0
- package/skills/search-lit/SKILL.md +443 -0
- package/skills/search-lit/references/parse_pubmed.py +326 -0
- package/skills/search-lit/references/pubmed_eutils.sh +111 -0
- package/skills/search-lit/skill.yml +46 -0
- package/skills/self-review/SKILL.md +1045 -0
- package/skills/self-review/references/domain-probes/ai_overclaiming.md +47 -0
- package/skills/self-review/references/domain-probes/narrative_review.md +44 -0
- package/skills/self-review/references/domain-probes/observational_confounding.md +48 -0
- package/skills/self-review/references/domain-probes/radiomics.md +38 -0
- package/skills/self-review/references/domain-probes/sr_ma.md +87 -0
- package/skills/self-review/references/domain-probes/survival_prognostic.md +68 -0
- package/skills/self-review/references/exemplar_findings/README.md +43 -0
- package/skills/self-review/references/exemplar_findings/cohort_arithmetic_mismatch.md +35 -0
- package/skills/self-review/references/exemplar_findings/estimand_drift_posthoc_primary.md +39 -0
- package/skills/self-review/references/exemplar_findings/scope_overreach_cross_sectional.md +35 -0
- package/skills/self-review/references/exemplar_findings/unadjusted_confounder.md +36 -0
- package/skills/self-review/references/panel_review_template.md +177 -0
- package/skills/self-review/scripts/check_artifact_coverage.py +301 -0
- package/skills/self-review/scripts/check_claim_artifact.py +248 -0
- package/skills/self-review/scripts/check_classical_style.py +185 -0
- package/skills/self-review/scripts/check_cohort_arithmetic.py +481 -0
- package/skills/self-review/scripts/check_confounding_completeness.py +287 -0
- package/skills/self-review/scripts/check_panel_diversity.py +336 -0
- package/skills/self-review/scripts/check_reference_adequacy.py +392 -0
- package/skills/self-review/scripts/check_reviewer_team_consistency.py +412 -0
- package/skills/self-review/scripts/check_scope_coherence.py +177 -0
- package/skills/self-review/skill.yml +47 -0
- package/skills/self-review/tests/fixtures/claim_manuscript.md +17 -0
- package/skills/self-review/tests/fixtures/claim_prereg.md +6 -0
- package/skills/self-review/tests/fixtures/cohort_bad.md +21 -0
- package/skills/self-review/tests/fixtures/cohort_clean.md +21 -0
- package/skills/self-review/tests/fixtures/cohort_partition.csv +5 -0
- package/skills/self-review/tests/fixtures/coverage_analysis/31_delong_nested_added_value.csv +3 -0
- package/skills/self-review/tests/fixtures/coverage_analysis/table1_demographics.csv +3 -0
- package/skills/self-review/tests/fixtures/coverage_clean.md +13 -0
- package/skills/self-review/tests/fixtures/coverage_manuscript.md +11 -0
- package/skills/self-review/tests/fixtures/panel_collapse.json +27 -0
- package/skills/self-review/tests/fixtures/panel_good.json +32 -0
- package/skills/self-review/tests/fixtures/panel_monoculture.json +32 -0
- package/skills/self-review/tests/fixtures/refadeq_letter.md +13 -0
- package/skills/self-review/tests/fixtures/refadeq_original_fixed.md +42 -0
- package/skills/self-review/tests/fixtures/refadeq_original_uncited.md +40 -0
- package/skills/self-review/tests/fixtures/scope_bad.md +9 -0
- package/skills/self-review/tests/fixtures/scope_clean.md +8 -0
- package/skills/self-review/tests/fixtures/scope_surrogate.md +8 -0
- package/skills/self-review/tests/fixtures/style_bad.md +13 -0
- package/skills/self-review/tests/fixtures/style_clean.md +11 -0
- package/skills/self-review/tests/fixtures/table1_by_exposure.csv +11 -0
- package/skills/self-review/tests/test_artifact_coverage.sh +44 -0
- package/skills/self-review/tests/test_claim_artifact.sh +50 -0
- package/skills/self-review/tests/test_classical_style.sh +44 -0
- package/skills/self-review/tests/test_cohort_arithmetic.sh +49 -0
- package/skills/self-review/tests/test_confounding_completeness.sh +66 -0
- package/skills/self-review/tests/test_panel_diversity.sh +55 -0
- package/skills/self-review/tests/test_panel_mode.sh +69 -0
- package/skills/self-review/tests/test_reference_adequacy.sh +68 -0
- package/skills/self-review/tests/test_reviewer_team_consistency.sh +138 -0
- package/skills/self-review/tests/test_scope_coherence.sh +46 -0
- package/skills/setup-medsci/SKILL.md +110 -0
- package/skills/setup-medsci/references/setup-checklist.md +51 -0
- package/skills/setup-medsci/skill.yml +30 -0
- package/skills/sync-submission/SKILL.md +382 -0
- package/skills/sync-submission/scripts/author_registry_example.yaml +36 -0
- package/skills/sync-submission/scripts/blind_sweep.py +203 -0
- package/skills/sync-submission/scripts/check_asset_anonymization.py +300 -0
- package/skills/sync-submission/scripts/check_cross_artifact_stale.py +211 -0
- package/skills/sync-submission/scripts/cover_letter_drift_check.py +451 -0
- package/skills/sync-submission/scripts/cross_document_n_check.py +486 -0
- package/skills/sync-submission/scripts/detect_copy_divergence.py +136 -0
- package/skills/sync-submission/scripts/preflight_gate.py +458 -0
- package/skills/sync-submission/scripts/scope_drift_check.py +362 -0
- package/skills/sync-submission/scripts/sync_submission.py +169 -0
- package/skills/sync-submission/skill.yml +43 -0
- package/skills/sync-submission/tests/fixtures/copy_ok.md +5 -0
- package/skills/sync-submission/tests/fixtures/copy_stale.md +5 -0
- package/skills/sync-submission/tests/fixtures/ssot.md +5 -0
- package/skills/sync-submission/tests/test_asset_anonymization.sh +99 -0
- package/skills/sync-submission/tests/test_copy_divergence.sh +44 -0
- package/skills/sync-submission/tests/test_cross_artifact_stale.sh +80 -0
- package/skills/sync-submission/tests/test_cross_document_n.sh +132 -0
- package/skills/sync-submission/tests/test_preflight_gate.sh +112 -0
- package/skills/sync-submission/tests/test_scope_drift.sh +122 -0
- package/skills/sync-submission/tests/test_vN_docx_assertion.sh +51 -0
- package/skills/verify-refs/SKILL.md +177 -0
- package/skills/verify-refs/references/manual_checkpoint_guide.md +100 -0
- package/skills/verify-refs/scripts/verify_cli.sh +62 -0
- package/skills/verify-refs/scripts/verify_refs.py +782 -0
- package/skills/verify-refs/skill.yml +44 -0
- package/skills/verify-refs/tests/fixtures/pagination_placeholder.bib +17 -0
- package/skills/verify-refs/tests/test_pagination_placeholder.sh +42 -0
- package/skills/version-dataset/SKILL.md +143 -0
- package/skills/version-dataset/references/manifest_schema.md +72 -0
- package/skills/version-dataset/scripts/version_dataset.py +242 -0
- package/skills/version-dataset/skill.yml +35 -0
- package/skills/version-dataset/tests/test_version_dataset.sh +52 -0
- package/skills/write-paper/SKILL.md +1148 -0
- package/skills/write-paper/references/exemplar_methods/README.md +38 -0
- package/skills/write-paper/references/exemplar_methods/ai_validation_tripod_claim.md +47 -0
- package/skills/write-paper/references/exemplar_methods/diagnostic_accuracy_stard.md +50 -0
- package/skills/write-paper/references/exemplar_methods/observational_cohort_strobe.md +43 -0
- package/skills/write-paper/references/journal_profiles/AJNR.md +185 -0
- package/skills/write-paper/references/journal_profiles/AJR.md +149 -0
- package/skills/write-paper/references/journal_profiles/Abdominal_Radiology.md +139 -0
- package/skills/write-paper/references/journal_profiles/Academic_Radiology.md +90 -0
- package/skills/write-paper/references/journal_profiles/Annals_of_Internal_Medicine.md +150 -0
- package/skills/write-paper/references/journal_profiles/Artificial_Intelligence_in_Medicine.md +82 -0
- package/skills/write-paper/references/journal_profiles/British_Journal_of_Radiology.md +161 -0
- package/skills/write-paper/references/journal_profiles/CVIR.md +157 -0
- package/skills/write-paper/references/journal_profiles/Chest.md +270 -0
- package/skills/write-paper/references/journal_profiles/Clinical_Radiology.md +160 -0
- package/skills/write-paper/references/journal_profiles/Clinical_and_Molecular_Hepatology.md +147 -0
- package/skills/write-paper/references/journal_profiles/Diabetes_Metabolism_Journal.md +163 -0
- package/skills/write-paper/references/journal_profiles/Diagnostic_and_Interventional_Radiology.md +216 -0
- package/skills/write-paper/references/journal_profiles/Endocrinology_and_Metabolism.md +167 -0
- package/skills/write-paper/references/journal_profiles/European_Journal_of_Preventive_Cardiology.md +192 -0
- package/skills/write-paper/references/journal_profiles/European_Radiology.md +159 -0
- package/skills/write-paper/references/journal_profiles/Hepatology_Communications.md +110 -0
- package/skills/write-paper/references/journal_profiles/Hepatology_International.md +106 -0
- package/skills/write-paper/references/journal_profiles/IEEE_TMI.md +180 -0
- package/skills/write-paper/references/journal_profiles/INSI.md +163 -0
- package/skills/write-paper/references/journal_profiles/Investigative_Radiology.md +86 -0
- package/skills/write-paper/references/journal_profiles/JACC_Advances.md +197 -0
- package/skills/write-paper/references/journal_profiles/JACC_Asia.md +168 -0
- package/skills/write-paper/references/journal_profiles/JACR.md +87 -0
- package/skills/write-paper/references/journal_profiles/JAMA.md +188 -0
- package/skills/write-paper/references/journal_profiles/JAMA_Network_Open.md +170 -0
- package/skills/write-paper/references/journal_profiles/JCSM.md +266 -0
- package/skills/write-paper/references/journal_profiles/JKMS.md +201 -0
- package/skills/write-paper/references/journal_profiles/JMIR.md +88 -0
- package/skills/write-paper/references/journal_profiles/JMIR_Medical_Education.md +86 -0
- package/skills/write-paper/references/journal_profiles/JNIS.md +227 -0
- package/skills/write-paper/references/journal_profiles/JVIR.md +158 -0
- package/skills/write-paper/references/journal_profiles/Journal_of_Clinical_Endocrinology_and_Metabolism.md +191 -0
- package/skills/write-paper/references/journal_profiles/Journal_of_Stroke.md +176 -0
- package/skills/write-paper/references/journal_profiles/KJR.md +185 -0
- package/skills/write-paper/references/journal_profiles/Korean_Circulation_Journal.md +184 -0
- package/skills/write-paper/references/journal_profiles/Korean_Journal_of_Internal_Medicine.md +178 -0
- package/skills/write-paper/references/journal_profiles/Lancet_Gastroenterology_and_Hepatology.md +127 -0
- package/skills/write-paper/references/journal_profiles/Liver_International.md +165 -0
- package/skills/write-paper/references/journal_profiles/Medical_Image_Analysis.md +147 -0
- package/skills/write-paper/references/journal_profiles/NEJM.md +147 -0
- package/skills/write-paper/references/journal_profiles/Nature_Medicine.md +181 -0
- package/skills/write-paper/references/journal_profiles/Neuroradiology.md +151 -0
- package/skills/write-paper/references/journal_profiles/Nutrition_Metabolism_and_Cardiovascular_Diseases.md +184 -0
- package/skills/write-paper/references/journal_profiles/PLOS_Medicine.md +166 -0
- package/skills/write-paper/references/journal_profiles/RYAI.md +124 -0
- package/skills/write-paper/references/journal_profiles/Radiology.md +173 -0
- package/skills/write-paper/references/journal_profiles/Skeletal_Radiology.md +135 -0
- package/skills/write-paper/references/journal_profiles/Stroke.md +210 -0
- package/skills/write-paper/references/journal_profiles/The_BMJ.md +121 -0
- package/skills/write-paper/references/journal_profiles/The_Lancet.md +112 -0
- package/skills/write-paper/references/journal_profiles/The_Lancet_Digital_Health.md +104 -0
- package/skills/write-paper/references/journal_profiles/World_Journal_of_Hepatology.md +106 -0
- package/skills/write-paper/references/journal_profiles/npj_Digital_Medicine.md +93 -0
- package/skills/write-paper/references/paper_types/ai_validation.md +270 -0
- package/skills/write-paper/references/paper_types/animal_study.md +194 -0
- package/skills/write-paper/references/paper_types/case_report.md +237 -0
- package/skills/write-paper/references/paper_types/cross_national.md +328 -0
- package/skills/write-paper/references/paper_types/letter.md +127 -0
- package/skills/write-paper/references/paper_types/meta_analysis.md +181 -0
- package/skills/write-paper/references/paper_types/nhis_cohort.md +297 -0
- package/skills/write-paper/references/paper_types/original_article.md +221 -0
- package/skills/write-paper/references/paper_types/technical_note.md +131 -0
- package/skills/write-paper/references/section_guides/discussion.md +155 -0
- package/skills/write-paper/references/section_guides/introduction.md +108 -0
- package/skills/write-paper/references/section_guides/methods.md +144 -0
- package/skills/write-paper/references/section_guides/results.md +113 -0
- package/skills/write-paper/references/section_guides/step7_1_classical_qc.md +67 -0
- package/skills/write-paper/references/section_guides/step7_4a_audit_recovery.md +74 -0
- package/skills/write-paper/references/section_guides/title_abstract.md +123 -0
- package/skills/write-paper/references/section_templates/methods_statistical.md +147 -0
- package/skills/write-paper/scripts/check_placeholders.py +182 -0
- package/skills/write-paper/skill.yml +48 -0
- package/skills/write-paper/tests/test_placeholders.sh +107 -0
- package/skills/write-protocol/SKILL.md +243 -0
- package/skills/write-protocol/references/ethics_checklist.md +150 -0
- package/skills/write-protocol/references/protocol_template.md +304 -0
- 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 ]]
|