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,382 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sync-submission
|
|
3
|
+
description: Audit SSOT-to-submission drift and create journal submission manifests from canonical manuscript artifacts.
|
|
4
|
+
triggers: sync submission, build submission, submission drift, SSOT sync, journal package, retarget journal, freeze submission
|
|
5
|
+
tools: Read, Write, Edit, Bash, Grep, Glob
|
|
6
|
+
model: inherit
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Sync Submission
|
|
10
|
+
|
|
11
|
+
You help keep the canonical manuscript and journal-specific submission packages
|
|
12
|
+
from drifting apart. The skill treats `submission/{journal}/` as derived output
|
|
13
|
+
and records whether it is current, stale, or frozen.
|
|
14
|
+
|
|
15
|
+
## When to Use
|
|
16
|
+
|
|
17
|
+
- Before submitting a journal package.
|
|
18
|
+
- After a journal portal or Word editor changed a submission manuscript.
|
|
19
|
+
- After rejection, before retargeting to another journal.
|
|
20
|
+
- Before `/orchestrate --e2e` marks a project as submission-ready.
|
|
21
|
+
|
|
22
|
+
## Inputs
|
|
23
|
+
|
|
24
|
+
1. Project root containing `project.yaml`, or a direct canonical manuscript path.
|
|
25
|
+
2. Journal short name, e.g. `chest`, `ryai`, `academic_radiology`.
|
|
26
|
+
3. Optional mode:
|
|
27
|
+
- `audit`: compare existing submission against canonical source.
|
|
28
|
+
- `build`: copy canonical source into `submission/{journal}/manuscript/` and write metadata.
|
|
29
|
+
- `freeze`: mark a package as submitted/frozen.
|
|
30
|
+
|
|
31
|
+
## Deterministic Script
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
python "${CLAUDE_SKILL_DIR}/scripts/sync_submission.py" audit --project-root . --journal chest
|
|
35
|
+
python "${CLAUDE_SKILL_DIR}/scripts/sync_submission.py" build --project-root . --journal chest
|
|
36
|
+
python "${CLAUDE_SKILL_DIR}/scripts/sync_submission.py" freeze --project-root . --journal chest --status submitted
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
For double-blind journals, sweep author identifiers across all upload artifacts:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
python "${CLAUDE_SKILL_DIR}/scripts/blind_sweep.py" \
|
|
43
|
+
--registry _shared/authors/author_registry.yaml \
|
|
44
|
+
--files submission/{journal}/supplementary/*.md submission/{journal}/cover_letter.md \
|
|
45
|
+
--backup-dir .cache/blind_sweep_backup
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
The registry is a project-local YAML mapping author identifiers (full names, native scripts, initials with/without periods, email, ORCID) to role labels (e.g., "Reviewer 1"). See `scripts/author_registry_example.yaml` for schema. Never commit a populated registry to a public repository — keep it next to the manuscript.
|
|
49
|
+
|
|
50
|
+
## Output Contract
|
|
51
|
+
|
|
52
|
+
| Artifact | Path | Purpose |
|
|
53
|
+
|---|---|---|
|
|
54
|
+
| Submission metadata | `submission/{journal}/.journal_meta.json` | Source hash, status, canonical path |
|
|
55
|
+
| Sync audit | `qc/submission_sync_{journal}.json` | Drift result consumed by orchestrator |
|
|
56
|
+
| Manifest update | `artifact_manifest.json` | Submission package registry |
|
|
57
|
+
| Pre-flight gate | `qc/preflight_gate_report.json` | Aggregated halt-on-failure manifest (see "Pre-flight gate" below) |
|
|
58
|
+
|
|
59
|
+
## Pre-flight gate (single command — last step before freeze)
|
|
60
|
+
|
|
61
|
+
Run this once, right before `freeze`/submission. It orchestrates the existing
|
|
62
|
+
deterministic checks and the `/verify-refs` audit into one halt-on-failure gate,
|
|
63
|
+
writes a single aggregated manifest (`qc/preflight_gate_report.json`), and exits
|
|
64
|
+
**non-zero** so a build wrapper or CI step can stop the freeze. It shells out to
|
|
65
|
+
the per-check scripts and reimplements none of them — the halt decision is driven
|
|
66
|
+
by each sub-check's normalized exit code.
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
python "${CLAUDE_SKILL_DIR}/scripts/preflight_gate.py" --project-root . --journal chest
|
|
70
|
+
# add --strict to also halt on the heuristic/conditional (P1) checks
|
|
71
|
+
# add --online to make fabricated / author-mismatched references halt (PubMed/CrossRef)
|
|
72
|
+
# add --double-blind to make the asset-anonymization scan halt
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
By default the gate **halts only on the unambiguous, deterministic errors** (P0):
|
|
76
|
+
leftover placeholder/markers (`check_placeholders.py`), undefined `[@key]`
|
|
77
|
+
citations (`check_citation_keys.py`), duplicate references (`verify_refs.py`,
|
|
78
|
+
offline-deterministic), and a canonical-vs-submission hash mismatch
|
|
79
|
+
(`sync_submission.py audit`). The heuristic or conditional checks — `check_xref`,
|
|
80
|
+
`detect_copy_divergence`, `scope_drift_check`, `cover_letter_drift_check`,
|
|
81
|
+
`cross_document_n_check`, `check_cross_artifact_stale` — **run and report as P1
|
|
82
|
+
`warn` but do not halt** unless promoted with `--strict` or `--require ID`;
|
|
83
|
+
`check_asset_anonymization` is P1 unless `--double-blind`. A check whose inputs are
|
|
84
|
+
absent (no rendered docx, no cover letter, no copies, no journal) is recorded
|
|
85
|
+
`skipped`, never a blocker. Exit codes: `0` clean, `1` halt (≥1 blocker), `2` gate
|
|
86
|
+
config error (e.g. a `--require`'d check could not run).
|
|
87
|
+
|
|
88
|
+
The gate's offline references pass is the deterministic subset (duplicates +
|
|
89
|
+
pagination placeholders); an online `/verify-refs --strict` against PubMed/CrossRef
|
|
90
|
+
remains the authoritative fabrication and author-name check before submission.
|
|
91
|
+
|
|
92
|
+
## Workflow
|
|
93
|
+
|
|
94
|
+
1. Resolve canonical manuscript from `project.yaml` or explicit input.
|
|
95
|
+
2. Run the script in the requested mode.
|
|
96
|
+
3. If `audit` reports `DRIFT`, do not retarget or freeze until the user either
|
|
97
|
+
patches the canonical manuscript or records the difference as journal-only.
|
|
98
|
+
4. If `build` succeeds, run `/verify-refs` before final submission.
|
|
99
|
+
|
|
100
|
+
## Quality Gates
|
|
101
|
+
|
|
102
|
+
- Gate 0 (pre-flight, last step before freeze): run `scripts/preflight_gate.py --project-root . --journal {journal}` to aggregate the deterministic checks below into one halt-on-failure manifest (`qc/preflight_gate_report.json`). Non-zero exit blocks the freeze. See "Pre-flight gate" above for the P0/P1 tiering and flags. This orchestrates Gates 1–3, 5b, 8, 9, 11 plus the placeholder and citation-key checks; the individual gates remain runnable on their own.
|
|
103
|
+
- Gate 1: block freezing when canonical manuscript is missing.
|
|
104
|
+
- Gate 2: block retargeting when the previous submission has unresolved drift.
|
|
105
|
+
- Gate 3: require `/verify-refs` audit before marking a package submission-safe.
|
|
106
|
+
- Gate 4: docx audits must use a recursive walk (paragraphs + tables + nested-table cells); a flat `document.paragraphs` scan is insufficient.
|
|
107
|
+
- Gate 5: before freeze, confirm portal free-text fields (cover letter, data availability, acknowledgements, abstract, author contributions) match the manuscript body.
|
|
108
|
+
- Gate 6 (double-blind journals): before freeze, export the portal's blinded review PDF and grep for all author identifiers across the entire upload set — manuscript, supplementary, cover letter, registry record PDFs (PROSPERO/ClinicalTrials), portal Letter-field text. A clean manuscript blind does not imply a clean portal blind.
|
|
109
|
+
- Gate 7 (text-only docx rebuilds): never use `pandoc --reference-doc=manuscript.docx` for response/cover/supplementary text-only docx — the reference docx ships its embedded media (figure files) into the new docx, bloating size 50–100×. Use plain `pandoc input.md -o output.docx` for text-only artifacts.
|
|
110
|
+
- Gate 5b (Phase 4 cover-letter free-text drift): before freeze, run `scripts/cover_letter_drift_check.py` to verify the cover letter's word-count / reference-count / table-figure-count claims still match the manuscript. Cover letters routinely go stale across v_N → v_(N+1) branching and are not covered by any docx-level audit. See "Phase 4 — Cover-letter free-text drift" below.
|
|
111
|
+
- Gate 8 (Phase 5 cross-document N consistency): before freeze, run `scripts/cross_document_n_check.py` over the manuscript bundle (abstract, body, PROSPERO record, cover letter, supplementary, INDEX, PRISMA flow caption). Any N category with >1 distinct integer value is a P0 drift. When a `FINAL_POOL_LOCK.yaml` is present, supply `--pool-lock` to make the locked counts the authoritative baseline. See "Phase 5 — Cross-document N consistency" below.
|
|
112
|
+
- Gate 9 (Phase 6 intra-manuscript scope drift): run `scripts/scope_drift_check.py` against the manuscript (and optionally the PROSPERO record). Numeric anchors (AUC, OR/HR/RR, sensitivity/specificity) appearing in Limitations / Discussion but absent from Methods + Results are P0 SCOPE_DRIFT. PROSPERO ↔ Methods synthesis-method disagreement is a P0 PROSPERO_DRIFT.
|
|
113
|
+
- Gate 10 (Phase 7 v_(N+1) docx regeneration): when building a new submission from a frozen prior version, run `scripts/verify_package_integrity.py --assert-vN-docx-changed --vN-docx <prev>.docx --new-docx <next>.docx`. Identical MD5 = unmodified seed copy = block submission. Defense-in-depth — required even when the upstream pipeline appears to have regenerated the docx.
|
|
114
|
+
- Gate 11 (Phase 8 multi-copy divergence): when the project hand-maintains more than one manuscript copy (working SSOT, circulation, portal), run `scripts/detect_copy_divergence.py --ssot <ssot>.md --copy <copy>.md ...` before freeze or circulation. Any `STALE_COPY` (an SSOT numeric claim or heading that did not propagate to a copy) is a P0 drift. See "Phase 8 — Multi-copy manuscript divergence" below.
|
|
115
|
+
- Gate 12 (target-journal metadata drift): on `build` / retarget, cross-check the target the manuscript is written *for* against the target the project is being submitted *to*. Compare `project.yaml` `target` (and any in-manuscript header/footer "for submission to X" string) against the journal the package is built for, and check the structural metadata the target dictates — abstract heading structure (4- vs 5-heading), body word limit, citation style (Vancouver / AMA), required elements (Highlights / Central Illustration / Key Points). A mismatch (e.g., a header still reading the previous journal after a cascade retarget, or a 4-heading abstract for a 5-heading target) is a target-restructure trigger — branch to v_(N+1) per `manuscript-versioning.md` §2 and sync every sidecar (cover letter, title page, ICMJE COI list) — not a silent build.
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
# header target vs project.yaml target
|
|
119
|
+
TGT=$(python3 -c "import yaml;print(yaml.safe_load(open('project.yaml')).get('target',''))" 2>/dev/null)
|
|
120
|
+
grep -niE 'for submission to|submitted to|prepared for' manuscript/manuscript.md # compare against "$TGT"
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Phase 4 — Cover-letter free-text drift
|
|
124
|
+
|
|
125
|
+
Cover letters live outside the submission docx files but are read by the
|
|
126
|
+
editor side-by-side with the manuscript. Their `## Article details`
|
|
127
|
+
block — body word count, abstract word count, reference count,
|
|
128
|
+
table/figure count — is a sidecar SSOT that routinely goes stale when a
|
|
129
|
+
manuscript branches v_N → v_(N+1) (word limit retarget, abstract
|
|
130
|
+
restructure, late reference batch).
|
|
131
|
+
|
|
132
|
+
`scripts/cover_letter_drift_check.py` measures the manuscript truth and
|
|
133
|
+
compares it to the cover letter's numeric claims:
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
python "${CLAUDE_SKILL_DIR}/scripts/cover_letter_drift_check.py" \
|
|
137
|
+
--manuscript manuscript.md \
|
|
138
|
+
--cover-letter cover_letter.md \
|
|
139
|
+
--refs refs.bib \
|
|
140
|
+
--out qc/cover_letter_drift.json
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Body words are matched with a 5% tolerance ("approximately N words"
|
|
144
|
+
phrasing). Abstract words tolerate ±5. Reference / table / figure counts
|
|
145
|
+
require exact match.
|
|
146
|
+
|
|
147
|
+
Output `qc/cover_letter_drift.json`:
|
|
148
|
+
|
|
149
|
+
```json
|
|
150
|
+
{
|
|
151
|
+
"submission_safe": false,
|
|
152
|
+
"truth": {"body_words": 3036, "abstract_words": 319, "references": 12,
|
|
153
|
+
"tables": 3, "figures": 4},
|
|
154
|
+
"claims": {"body_words": 3790, "abstract_words": 250, "references": 12},
|
|
155
|
+
"drifts": [
|
|
156
|
+
{"field": "body_words", "truth": 3036, "cover_letter_claim": 3790,
|
|
157
|
+
"severity": "MAJOR",
|
|
158
|
+
"note": "|claim - truth| = 754 > tolerance 151"}
|
|
159
|
+
]
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Drift resolution: regenerate the cover letter from the manuscript at
|
|
164
|
+
v_(N+1) build time. The script never edits the cover letter — that is
|
|
165
|
+
left to the manuscript build pipeline so the cover letter stays a
|
|
166
|
+
deliberate authored artifact.
|
|
167
|
+
|
|
168
|
+
## Phase 5 — Cross-document N consistency
|
|
169
|
+
|
|
170
|
+
Multi-document cohort-size drift is a high-frequency desk-reject pattern.
|
|
171
|
+
Manuscript abstracts, body prose, PROSPERO records, supplementary extraction
|
|
172
|
+
sheets, and PRISMA flow captions all repeat the same `k included` / `k excluded`
|
|
173
|
+
/ `N patients` totals — and any disagreement between them is read by reviewers
|
|
174
|
+
as either a data-integrity failure or a late-edit failure. Either reading
|
|
175
|
+
ends the round.
|
|
176
|
+
|
|
177
|
+
`scripts/cross_document_n_check.py` scans the submission package, extracts
|
|
178
|
+
every "N <noun>" claim by category (patients, cases, included, excluded,
|
|
179
|
+
nodules, tumors, studies_total), and groups them by category. A category with
|
|
180
|
+
more than one distinct integer value is a P0 drift.
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
python "${CLAUDE_SKILL_DIR}/scripts/cross_document_n_check.py" \
|
|
184
|
+
--root . \
|
|
185
|
+
--out qc/cross_document_n.json
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
When the project has frozen a `2_Data/FINAL_POOL_LOCK.yaml` from `/meta-analysis`
|
|
189
|
+
Phase 3f.5, pass it as the authoritative anchor:
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
python "${CLAUDE_SKILL_DIR}/scripts/cross_document_n_check.py" \
|
|
193
|
+
--root . \
|
|
194
|
+
--pool-lock 2_Data/FINAL_POOL_LOCK.yaml \
|
|
195
|
+
--out qc/cross_document_n.json
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Output `qc/cross_document_n.json`:
|
|
199
|
+
|
|
200
|
+
```json
|
|
201
|
+
{
|
|
202
|
+
"submission_safe": false,
|
|
203
|
+
"drift_count": 1,
|
|
204
|
+
"drifts": [
|
|
205
|
+
{
|
|
206
|
+
"category": "included",
|
|
207
|
+
"values": [63, 64],
|
|
208
|
+
"locations": [
|
|
209
|
+
{"file": "abstract.md", "line": 4, "value": 63, "context": "..."},
|
|
210
|
+
{"file": "supplementary/s1.md", "line": 12, "value": 64, "context": "..."}
|
|
211
|
+
],
|
|
212
|
+
"severity": "MAJOR"
|
|
213
|
+
}
|
|
214
|
+
],
|
|
215
|
+
"lock_violations": []
|
|
216
|
+
}
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
Treat `submission_safe: false` as a halt. Resolve drift by tracing each
|
|
220
|
+
location to its data artifact (extraction sheet, PRISMA cascade TSVs) and
|
|
221
|
+
correcting the document(s) that disagree with the locked count.
|
|
222
|
+
|
|
223
|
+
## Phase 6 — Intra-manuscript scope drift
|
|
224
|
+
|
|
225
|
+
Late-revision sensitivity analyses sometimes get introduced in the
|
|
226
|
+
Discussion or Limitations subsection without ever propagating back to
|
|
227
|
+
Methods + Results. The manuscript then makes claims (with explicit AUC,
|
|
228
|
+
OR, sensitivity numbers) whose primary report never exists. Reviewers
|
|
229
|
+
read this as a fabrication-grade red flag, and editors desk-reject.
|
|
230
|
+
|
|
231
|
+
A second variant of the same anti-pattern: the PROSPERO record commits to
|
|
232
|
+
a synthesis method (Freeman-Tukey, random-effects DerSimonian-Laird,
|
|
233
|
+
bivariate, HSROC, Bayesian, etc.) but the Methods section uses a
|
|
234
|
+
different one — or the PROSPERO record was updated and Methods stayed
|
|
235
|
+
behind. When accompanied by a Methods line saying "no amendment lodged",
|
|
236
|
+
this becomes a documented silent protocol deviation.
|
|
237
|
+
|
|
238
|
+
`scripts/scope_drift_check.py` detects both patterns:
|
|
239
|
+
|
|
240
|
+
```bash
|
|
241
|
+
python "${CLAUDE_SKILL_DIR}/scripts/scope_drift_check.py" \
|
|
242
|
+
--manuscript manuscript.md \
|
|
243
|
+
--prospero prospero/prospero_v2.md \
|
|
244
|
+
--out qc/scope_drift.json
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
Output:
|
|
248
|
+
|
|
249
|
+
```json
|
|
250
|
+
{
|
|
251
|
+
"submission_safe": false,
|
|
252
|
+
"limitations_only_anchors": [
|
|
253
|
+
{
|
|
254
|
+
"anchor": "0.869",
|
|
255
|
+
"kind": "AUC",
|
|
256
|
+
"found_in": ["Limitations:31"],
|
|
257
|
+
"missing_from": ["Methods", "Results"]
|
|
258
|
+
}
|
|
259
|
+
],
|
|
260
|
+
"synthesis_method_drift": [
|
|
261
|
+
{"method": "Freeman-Tukey", "prospero": true, "methods": false}
|
|
262
|
+
]
|
|
263
|
+
}
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
Resolution: either (a) propagate the anchor into Methods + Results as a
|
|
267
|
+
primary report or (b) remove it from Limitations / Discussion. For
|
|
268
|
+
synthesis-method drift, file a PROSPERO amendment and update Methods to
|
|
269
|
+
match — both must agree before submission.
|
|
270
|
+
|
|
271
|
+
## Phase 7 — v_(N+1) docx regeneration gate
|
|
272
|
+
|
|
273
|
+
When a v_N submission package was frozen and a v_(N+1) is being built
|
|
274
|
+
(after a markdown body edit, reviewer round, or cascade-rejection
|
|
275
|
+
re-target), the v_(N+1) docx MUST differ from the v_N docx. The most
|
|
276
|
+
common silent-revert pattern is a `cp v_N/manuscript.docx
|
|
277
|
+
v_(N+1)/manuscript.docx` step that skips the pandoc / Zotero CWYW
|
|
278
|
+
regeneration entirely. The markdown body is then edited, but the docx
|
|
279
|
+
the portal receives is the frozen v_N — the change silently reverts at
|
|
280
|
+
peer review.
|
|
281
|
+
|
|
282
|
+
Run the byte-identity assertion at the top of the v_(N+1) submission
|
|
283
|
+
gate:
|
|
284
|
+
|
|
285
|
+
```bash
|
|
286
|
+
python3 /path/to/medsci-skills/scripts/verify_package_integrity.py \
|
|
287
|
+
--assert-vN-docx-changed \
|
|
288
|
+
--vN-docx SUBMISSION/<journal>/v<N>/manuscript.docx \
|
|
289
|
+
--new-docx SUBMISSION/<journal>/v<N+1>/manuscript.docx
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
Identical MD5 → exit 1 with explanatory error. Block submission until
|
|
293
|
+
the regeneration step is fixed.
|
|
294
|
+
|
|
295
|
+
## Phase 8 — Multi-copy manuscript divergence
|
|
296
|
+
|
|
297
|
+
When a project keeps several hand-maintained manuscript copies — `manuscript.md`
|
|
298
|
+
(the working SSOT), `manuscript_circulation.md` (co-author feedback), and
|
|
299
|
+
`submission/<journal>/manuscript.md` (portal) — a batch of edits applied to the
|
|
300
|
+
SSOT routinely lands in only some of the copies. The portal then receives a copy
|
|
301
|
+
missing a subset of the edits, and the divergence surfaces (if at all) only when a
|
|
302
|
+
reviewer notices the inconsistency.
|
|
303
|
+
|
|
304
|
+
Before freezing a package or sending a circulation round, run the directional
|
|
305
|
+
detector (SSOT → each copy):
|
|
306
|
+
|
|
307
|
+
```bash
|
|
308
|
+
python3 ${CLAUDE_SKILL_DIR}/scripts/detect_copy_divergence.py \
|
|
309
|
+
--ssot manuscript.md \
|
|
310
|
+
--copy manuscript_circulation.md \
|
|
311
|
+
--copy submission/<journal>/manuscript.md \
|
|
312
|
+
--out qc/copy_divergence.json --strict
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
It reports, per copy, the SSOT *claims* (numeric assertions — `n = N`, percentages,
|
|
316
|
+
`p`, OR/HR/RR, 95% CI — and section headings) that did not propagate. A `STALE_COPY`
|
|
317
|
+
(`DIVERGENT` overall) is a **P0 blocker**: re-propagate the unpropagated claims, or —
|
|
318
|
+
better — stop hand-maintaining parallel copies and **generate the circulation /
|
|
319
|
+
submission variants from the single SSOT via a build step** (pandoc transform), so
|
|
320
|
+
there is only one editable source. Claims are matched as normalized strings, so
|
|
321
|
+
wording differences do not register — only a changed or absent number/heading does;
|
|
322
|
+
legitimately copy-specific content (a circulation cover note) shows up as `copy_only`
|
|
323
|
+
and can be ignored.
|
|
324
|
+
|
|
325
|
+
## Verification Blind Spots
|
|
326
|
+
|
|
327
|
+
Post-submission learnings (npj Digital Medicine R1, 2026-05): a clean docx-level audit still missed several stale artifacts that surfaced only at the portal review stage. Apply these whenever auditing a submission package.
|
|
328
|
+
|
|
329
|
+
### B1. docx scanning must be recursive
|
|
330
|
+
|
|
331
|
+
`python-docx` `paragraph.runs` does not expose runs inside `<w:hyperlink>`; `document.paragraphs` skips table cells; `document.tables` does not recurse into nested tables. Figures, captions, and reporting checklists are routinely wrapped in 1×1 or nested tables, so flat scans silently miss them.
|
|
332
|
+
|
|
333
|
+
- Walk `paragraphs + tables + nested-table cells` recursively for every stale-string scan.
|
|
334
|
+
- For run-level edits near hyperlinks or fields, inspect the paragraph XML, not just `.runs` — a missing inline element can be misread as an empty `()` artifact and "fixed" into a real defect.
|
|
335
|
+
|
|
336
|
+
### B2. Portal input fields are a separate SSOT
|
|
337
|
+
|
|
338
|
+
Cover letter, Data Availability, Acknowledgements, Abstract, and Author Contributions are often typed directly into the journal portal, outside any docx this skill audits. A clean docx audit does not imply a clean portal.
|
|
339
|
+
|
|
340
|
+
- Before final submission, diff the portal's final review page against the manuscript body 1:1.
|
|
341
|
+
- Treat each portal free-text field as its own drift target.
|
|
342
|
+
|
|
343
|
+
### B3a. Double-blind compliance must cover ALL upload artifacts
|
|
344
|
+
|
|
345
|
+
A clean manuscript-level blind sweep does not imply a clean portal-level blind. Author identifiers commonly leak through:
|
|
346
|
+
|
|
347
|
+
- Supplementary materials (per-material `.md`/`.docx` files, especially methodology logs, agreement metrics, amendment logs)
|
|
348
|
+
- Cover letter (separately-uploaded file is portal-default visible to reviewers unless explicitly toggled "Don't show in review PDF")
|
|
349
|
+
- Registry record PDFs (PROSPERO, ClinicalTrials.gov, IRB approval PDFs)
|
|
350
|
+
- Portal free-text Letter field if cover-letter signature was pasted
|
|
351
|
+
- Response-to-reviewers (revision rounds)
|
|
352
|
+
|
|
353
|
+
Blind sweep regex coverage must include both period and no-period initial forms (e.g., `Y.N.` and `YN`), full names in roman + native scripts, institution names, ORCID IDs, and submission email domains. The first blind PDF export from the portal is the authoritative drift detector — always export and grep before final submit.
|
|
354
|
+
|
|
355
|
+
### B3b. PROSPERO public-record PDF shows only current amendment
|
|
356
|
+
|
|
357
|
+
PROSPERO's "Print/PDF" export from the public record renders only the current amendment narrative. Previous versions are accessible only by selecting older versions in the public-record version-history dropdown. When citing PROSPERO version state, never rely on a single PDF export to verify cross-version consistency — record each published version's PDF independently and clarify in cover/supplementary which version anchors the methodology vs. which version reflects documentation-only erratum.
|
|
358
|
+
|
|
359
|
+
For documentation-only PROSPERO errata (correcting a narrative fact without changing methods/eligibility/synthesis), prefer a single Revision-Note append over a new structured amendment entry. Preserves historical audit trail and minimizes portal edit surface.
|
|
360
|
+
|
|
361
|
+
### B3c. Text-only docx rebuilds must not inherit manuscript media
|
|
362
|
+
|
|
363
|
+
If `response_to_reviewers.docx` / `cover_letter.docx` / supplementary text-only docx grow to >100 KB after a rebuild, suspect `--reference-doc` pulling manuscript figure media. Verify with `unzip -l output.docx | grep word/media/` — should be empty for text-only artifacts.
|
|
364
|
+
|
|
365
|
+
### B3. Verify change propagation across the whole SSOT tree
|
|
366
|
+
|
|
367
|
+
A tone, wording, or number change applied to one file (e.g. the abstract) must propagate to every file that repeats it — discussion, response-to-reviewers quotes, reporting checklists, supplementary captions, title page.
|
|
368
|
+
|
|
369
|
+
- grep the OLD string across the entire SSOT tree, never a subset of files.
|
|
370
|
+
- Watch for substring near-misses (`expertise-dependent patterns` vs `expertise-dependent evaluation patterns`) — an exact-match grep on the short form passes while the long form remains stale.
|
|
371
|
+
|
|
372
|
+
## What This Skill Does NOT Do
|
|
373
|
+
|
|
374
|
+
- Does not invent journal formatting rules.
|
|
375
|
+
- Does not silently merge submission edits back into the SSOT.
|
|
376
|
+
- Does not replace `/write-paper`; it packages already canonical content.
|
|
377
|
+
|
|
378
|
+
## Anti-Hallucination
|
|
379
|
+
|
|
380
|
+
- Never claim a submission package is current without matching source hashes.
|
|
381
|
+
- Never mark a package as submitted without writing `.journal_meta.json`.
|
|
382
|
+
- Never hide journal-only differences; record them as drift or explicit exceptions.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Author registry — example for blind_sweep.py
|
|
2
|
+
#
|
|
3
|
+
# Each reviewer entry maps an author's identifiers to their double-blind role label
|
|
4
|
+
# (e.g., "Reviewer 1", "Reviewer 2"). The blind_sweep.py script reads this YAML
|
|
5
|
+
# and performs phased substitution across supplementary, cover, and response files.
|
|
6
|
+
#
|
|
7
|
+
# Place a project-local copy under your manuscript root (e.g.,
|
|
8
|
+
# `<project>/_shared/authors/author_registry.yaml`) and pass its path to the script.
|
|
9
|
+
# Do NOT commit real author identifiers to a public repository — keep the populated
|
|
10
|
+
# registry alongside the manuscript, not inside this skill.
|
|
11
|
+
|
|
12
|
+
reviewers:
|
|
13
|
+
- role: "Reviewer 1"
|
|
14
|
+
full_names: ["Given Surname"] # roman script, primary author
|
|
15
|
+
native_names: [] # e.g., ["성명"] for hangul / kanji
|
|
16
|
+
initials_with_period: ["G.S."]
|
|
17
|
+
initials_no_period: ["GS"]
|
|
18
|
+
email: "first.author@example.org"
|
|
19
|
+
orcid: "0000-0000-0000-0000"
|
|
20
|
+
|
|
21
|
+
- role: "Reviewer 2"
|
|
22
|
+
full_names: ["Coauthor Name"]
|
|
23
|
+
native_names: []
|
|
24
|
+
initials_with_period: ["C.N."]
|
|
25
|
+
initials_no_period: ["CN"]
|
|
26
|
+
email: null
|
|
27
|
+
orcid: null
|
|
28
|
+
|
|
29
|
+
institutions:
|
|
30
|
+
- replace: "Hospital A / University B"
|
|
31
|
+
with: "the review team's affiliated institutions"
|
|
32
|
+
|
|
33
|
+
references:
|
|
34
|
+
# Self-cited PROSPERO record or preprint
|
|
35
|
+
- replace: "Given Surname, Coauthor Name. Title of Registered Review"
|
|
36
|
+
with: "[Authors]. Title of Registered Review"
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Blind sweep — redact author identifiers across submission artifacts for double-blind review.
|
|
3
|
+
|
|
4
|
+
Usage:
|
|
5
|
+
python blind_sweep.py --registry path/to/author_registry.yaml \
|
|
6
|
+
--files file1.md file2.md ... \
|
|
7
|
+
[--inplace | --out-dir staging/blinded]
|
|
8
|
+
|
|
9
|
+
Reads an author registry (YAML) describing identifiers and their role-label
|
|
10
|
+
replacements, then performs phased substitution (specific patterns first,
|
|
11
|
+
then bare forms, then regex word-boundary forms). Reports residual identifier
|
|
12
|
+
counts for each file after blinding.
|
|
13
|
+
|
|
14
|
+
Registry schema (YAML):
|
|
15
|
+
reviewers:
|
|
16
|
+
- role: "Reviewer 1"
|
|
17
|
+
full_names: ["Given Surname"] # roman script
|
|
18
|
+
native_names: ["성명"] # native script (e.g., hangul)
|
|
19
|
+
initials_with_period: ["G.S."]
|
|
20
|
+
initials_no_period: ["GS"]
|
|
21
|
+
email: "user@example.com"
|
|
22
|
+
orcid: "0000-0000-0000-0000"
|
|
23
|
+
- role: "Reviewer 2"
|
|
24
|
+
...
|
|
25
|
+
institutions:
|
|
26
|
+
- replace: "Institution A / University B"
|
|
27
|
+
with: "the review team's affiliated institutions"
|
|
28
|
+
references:
|
|
29
|
+
- replace: "Given Surname, Other Author. Title"
|
|
30
|
+
with: "[Authors]. Title"
|
|
31
|
+
|
|
32
|
+
Order of substitution (per file):
|
|
33
|
+
1. Institution and reference patterns (longest specific strings first).
|
|
34
|
+
2. Role-combination patterns (e.g., "Given Surname (GS, 1st reviewer)").
|
|
35
|
+
3. Bare full names and native names.
|
|
36
|
+
4. Regex word-boundary patterns for initials (period and no-period forms),
|
|
37
|
+
emails, ORCIDs, and combined initial patterns.
|
|
38
|
+
|
|
39
|
+
The script does NOT hard-code any author identifiers — all PII is sourced
|
|
40
|
+
from the registry the caller provides. This keeps the tool PII-free for OSS
|
|
41
|
+
distribution.
|
|
42
|
+
"""
|
|
43
|
+
from __future__ import annotations
|
|
44
|
+
|
|
45
|
+
import argparse
|
|
46
|
+
import pathlib
|
|
47
|
+
import re
|
|
48
|
+
import shutil
|
|
49
|
+
import sys
|
|
50
|
+
from dataclasses import dataclass, field
|
|
51
|
+
from typing import Iterable
|
|
52
|
+
|
|
53
|
+
try:
|
|
54
|
+
import yaml # type: ignore
|
|
55
|
+
except ImportError:
|
|
56
|
+
print("blind_sweep requires PyYAML. Install: pip install pyyaml", file=sys.stderr)
|
|
57
|
+
sys.exit(2)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@dataclass
|
|
61
|
+
class Reviewer:
|
|
62
|
+
role: str
|
|
63
|
+
full_names: list[str] = field(default_factory=list)
|
|
64
|
+
native_names: list[str] = field(default_factory=list)
|
|
65
|
+
initials_with_period: list[str] = field(default_factory=list)
|
|
66
|
+
initials_no_period: list[str] = field(default_factory=list)
|
|
67
|
+
email: str | None = None
|
|
68
|
+
orcid: str | None = None
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def load_registry(path: pathlib.Path) -> tuple[list[Reviewer], list[tuple[str, str]], list[tuple[str, str]]]:
|
|
72
|
+
data = yaml.safe_load(path.read_text(encoding="utf-8"))
|
|
73
|
+
reviewers = [Reviewer(**r) for r in data.get("reviewers", [])]
|
|
74
|
+
institutions = [(i["replace"], i["with"]) for i in data.get("institutions", [])]
|
|
75
|
+
references = [(r["replace"], r["with"]) for r in data.get("references", [])]
|
|
76
|
+
return reviewers, institutions, references
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def build_substitutions(reviewers: list[Reviewer]) -> tuple[list[tuple[str, str]], list[tuple[str, str]], list[tuple[str, str]]]:
|
|
80
|
+
"""Return (phase2_combined, phase3_bare, phase4_regex)."""
|
|
81
|
+
phase2_combined: list[tuple[str, str]] = []
|
|
82
|
+
phase3_bare: list[tuple[str, str]] = []
|
|
83
|
+
phase4_regex: list[tuple[str, str]] = []
|
|
84
|
+
|
|
85
|
+
for r in reviewers:
|
|
86
|
+
for name in r.full_names:
|
|
87
|
+
for init in r.initials_no_period + r.initials_with_period:
|
|
88
|
+
for label in (
|
|
89
|
+
f"{name} ({init}, 1st reviewer)", f"{name} ({init}, 2nd reviewer)",
|
|
90
|
+
f"{name} ({init}, 1st)", f"{name} ({init}, 2nd)",
|
|
91
|
+
f"{name} ({init})",
|
|
92
|
+
):
|
|
93
|
+
phase2_combined.append((label, r.role))
|
|
94
|
+
phase3_bare.append((name, r.role))
|
|
95
|
+
for name in r.native_names:
|
|
96
|
+
phase3_bare.append((name, r.role))
|
|
97
|
+
for init in r.initials_with_period:
|
|
98
|
+
esc = re.escape(init)
|
|
99
|
+
phase4_regex.append((rf"\b{esc}", r.role))
|
|
100
|
+
for init in r.initials_no_period:
|
|
101
|
+
phase4_regex.append((rf"\b{re.escape(init)}\b", r.role))
|
|
102
|
+
if r.email:
|
|
103
|
+
phase4_regex.append((re.escape(r.email), "[redacted email]"))
|
|
104
|
+
if r.orcid:
|
|
105
|
+
phase4_regex.append((re.escape(r.orcid), "[redacted ORCID]"))
|
|
106
|
+
|
|
107
|
+
# Sort phase2/phase3 by length desc so longer-specific patterns win
|
|
108
|
+
phase2_combined.sort(key=lambda kv: -len(kv[0]))
|
|
109
|
+
phase3_bare.sort(key=lambda kv: -len(kv[0]))
|
|
110
|
+
return phase2_combined, phase3_bare, phase4_regex
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def blind_text(text: str, phase1: Iterable[tuple[str, str]],
|
|
114
|
+
phase2: Iterable[tuple[str, str]], phase3: Iterable[tuple[str, str]],
|
|
115
|
+
phase4_regex: Iterable[tuple[str, str]]) -> tuple[str, int]:
|
|
116
|
+
changes = 0
|
|
117
|
+
for old, new in list(phase1) + list(phase2) + list(phase3):
|
|
118
|
+
if old in text:
|
|
119
|
+
count = text.count(old)
|
|
120
|
+
text = text.replace(old, new)
|
|
121
|
+
changes += count
|
|
122
|
+
for pat, repl in phase4_regex:
|
|
123
|
+
matches = re.findall(pat, text)
|
|
124
|
+
if matches:
|
|
125
|
+
text = re.sub(pat, repl, text)
|
|
126
|
+
changes += len(matches)
|
|
127
|
+
return text, changes
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def residual_scan(text: str, reviewers: list[Reviewer]) -> list[str]:
|
|
131
|
+
residual: list[str] = []
|
|
132
|
+
for r in reviewers:
|
|
133
|
+
for name in r.full_names + r.native_names:
|
|
134
|
+
c = text.count(name)
|
|
135
|
+
if c > 0:
|
|
136
|
+
residual.append(f"{name}={c}")
|
|
137
|
+
for init in r.initials_with_period:
|
|
138
|
+
c = len(re.findall(rf"\b{re.escape(init)}", text))
|
|
139
|
+
if c > 0:
|
|
140
|
+
residual.append(f"{init}={c}")
|
|
141
|
+
for init in r.initials_no_period:
|
|
142
|
+
c = len(re.findall(rf"\b{re.escape(init)}\b", text))
|
|
143
|
+
if c > 0:
|
|
144
|
+
residual.append(f"{init}={c}")
|
|
145
|
+
if r.email:
|
|
146
|
+
c = text.count(r.email)
|
|
147
|
+
if c > 0:
|
|
148
|
+
residual.append(f"{r.email}={c}")
|
|
149
|
+
if r.orcid:
|
|
150
|
+
c = text.count(r.orcid)
|
|
151
|
+
if c > 0:
|
|
152
|
+
residual.append(f"{r.orcid}={c}")
|
|
153
|
+
return residual
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def main() -> int:
|
|
157
|
+
ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
|
|
158
|
+
ap.add_argument("--registry", required=True, type=pathlib.Path, help="Author registry YAML")
|
|
159
|
+
ap.add_argument("--files", nargs="+", required=True, type=pathlib.Path, help="Files to blind")
|
|
160
|
+
ap.add_argument("--inplace", action="store_true", help="Overwrite in place (default)")
|
|
161
|
+
ap.add_argument("--out-dir", type=pathlib.Path, help="Write blinded copies under this directory")
|
|
162
|
+
ap.add_argument("--backup-dir", type=pathlib.Path, help="Copy originals here before in-place edit")
|
|
163
|
+
args = ap.parse_args()
|
|
164
|
+
|
|
165
|
+
if not args.inplace and not args.out_dir:
|
|
166
|
+
args.inplace = True
|
|
167
|
+
|
|
168
|
+
reviewers, institutions, references = load_registry(args.registry)
|
|
169
|
+
phase1 = institutions + references
|
|
170
|
+
phase2, phase3, phase4_regex = build_substitutions(reviewers)
|
|
171
|
+
|
|
172
|
+
if args.backup_dir:
|
|
173
|
+
args.backup_dir.mkdir(parents=True, exist_ok=True)
|
|
174
|
+
if args.out_dir:
|
|
175
|
+
args.out_dir.mkdir(parents=True, exist_ok=True)
|
|
176
|
+
|
|
177
|
+
print(f"{'FILE':<55} {'CHANGES':<8} RESIDUAL")
|
|
178
|
+
overall_residual = False
|
|
179
|
+
for src in args.files:
|
|
180
|
+
if not src.exists():
|
|
181
|
+
print(f"{src.name:<55} {'-':<8} MISSING")
|
|
182
|
+
continue
|
|
183
|
+
text = src.read_text(encoding="utf-8")
|
|
184
|
+
if args.backup_dir:
|
|
185
|
+
shutil.copy(src, args.backup_dir / src.name)
|
|
186
|
+
new_text, changes = blind_text(text, phase1, phase2, phase3, phase4_regex)
|
|
187
|
+
residual = residual_scan(new_text, reviewers)
|
|
188
|
+
|
|
189
|
+
if args.out_dir:
|
|
190
|
+
(args.out_dir / src.name).write_text(new_text, encoding="utf-8")
|
|
191
|
+
else:
|
|
192
|
+
src.write_text(new_text, encoding="utf-8")
|
|
193
|
+
|
|
194
|
+
flag = "clean" if not residual else " ".join(residual) + " WARN"
|
|
195
|
+
if residual:
|
|
196
|
+
overall_residual = True
|
|
197
|
+
print(f"{src.name:<55} {changes:<8} {flag}")
|
|
198
|
+
|
|
199
|
+
return 1 if overall_residual else 0
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
if __name__ == "__main__":
|
|
203
|
+
sys.exit(main())
|