Claude Skill

fill-icmje-coi

Batch-generate per-author ICMJE Conflict of Interest Disclosure Forms (`coi_disclosure.docx`) for manuscript submission. Pre-fills all 13 disclosure items as "☒ None" + final certification ☒ using a synthetic seed template shipped with the skill, then clones the seed per author w

LLM Mart · 0 points · 3 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download aperivue-medsci-skills-skills_fill-icmje-coi-815765c.zip · 35 KB
Part of aperivue/medsci-skills — 47 skills

Install

skills CLI npx skills add https://github.com/Aperivue/medsci-skills/tree/main/skills/fill-icmje-coi
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install aperivue-medsci-skills@llmmart
Git git clone https://github.com/Aperivue/medsci-skills.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole aperivue/medsci-skills collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

Fill-ICMJE-COI Skill

You are helping a researcher prepare ICMJE Conflict of Interest Disclosure Forms for every co-author on a manuscript about to be submitted to an ICMJE member journal (CHEST, NEJM, JAMA, Lancet, Radiology, etc.). This skill batch-generates one personalized .docx per author from a synthetic all-None seed shipped with the skill, avoiding 10–20 minutes of repetitive Word clicking per author.

Why This Skill Exists

The official ICMJE coi_disclosure.docx puts every field inside Word Content Controls (Structured Document Tags, a.k.a. SDTs). Naive python-docx manipulation of cell.text silently ignores SDT content, so the straightforward programmatic approach does not work. The historical workaround was to open the template in Word and manually fill each author's form (21 authors × 13 checkboxes × 2 clicks = ~500 clicks). This skill replaces that by operating directly on word/document.xml inside the docx zip and doing literal-string replacement — but that requires the target strings to already exist in the seed, so the skill ships a pre-filled synthetic seed.

Effect: a full author roster auto-fills in seconds from the synthetic seed, with zero Word clicks.

Core Principles (Do Not Violate)

  1. Never author SDT XML from scratch. Only replace existing strings in an already-populated seed. Creating Content Controls programmatically is fragile and Word-version-dependent.
  2. Never ship a real author's filled form as the seed. The template directory contains icmje_coi_seed_synthetic.docx with all PII scrubbed (synthetic name, title, date; metadata reset to ICMJE / Anonymous). Real-person seeds leak PII through both document.xml and docProps.
  3. Never modify the 13 disclosure items or certification checkbox. The script only replaces Date/Name/Title. If any author has a real disclosure, they must edit in Word manually — the skill's purpose is the common all-None case.
  4. Always verify before circulation. Each output must have 14 × ☒ and 13 × "None" in document.xml. The script runs this check implicitly by preserving the seed structure; a post-generation grep is cheap insurance.

When to Use This Skill

  • Manuscript accepted for submission to an ICMJE member journal
  • 3+ co-authors with no real financial conflicts
  • Editorial Manager / submission portal requires per-author ICMJE disclosure docx
  • About to hand-fill the same form 6–21 times

Skip this skill when:

  • Any author has a real financial disclosure to list (they fill their own form in Word; this skill does not help)
  • Target journal uses its own declaration form (not ICMJE) — check author guidelines first
  • Only 1 author (not worth the setup)

Execution

Phase 1 — Intake

Ask the user (or extract from conversation):

  1. Manuscript title (exact, as it will appear on title page)
  2. Submission date (e.g., "April 20, 2026")
  3. Author list — ordered, one name per slot: [(1, "Author One"), (2, "Author Two"), ...]
  4. Output directory — typically submission/{journal}/icmje_forms/

Present the intake back to the user for confirmation (Gate 1 — user approval) before generating anything. Explicitly name which authors will get all-None forms and remind that anyone with a real disclosure must instead fill their own form in Word.

Phase 2 — Generate

Invoke the script with the synthetic seed that ships with this skill:

python3 ${SKILL_DIR}/scripts/fill_icmje_coi.py \
  --seed ${SKILL_DIR}/templates/icmje_coi_seed_synthetic.docx \
  --seed-name "Placeholder Author" \
  --seed-title "Placeholder Manuscript Title" \
  --seed-date "January 1, 2000" \
  --new-title "{exact manuscript title}" \
  --new-date "{submission date}" \
  --out-dir {out_dir} \
  --authors '[[1,"Author One"],[2,"Author Two"],...]'

The script exits nonzero if any seed string is not found, preventing silent failures.

Phase 3 — Verify

For each generated docx, confirm:

  • ☒ count = 14 (13 disclosure items + 1 final certification)
  • "None" count = 13
  • Correct name appears after "Your Name:"
  • Correct title appears after "Manuscript Title:"
  • No leakage of seed placeholder strings (Placeholder Author, Placeholder Manuscript Title, January 1, 2000)

Verification one-liner:

for f in {out_dir}/*.docx; do
  python3 -c "
import zipfile, sys
xml = zipfile.ZipFile('$f').read('word/document.xml').decode()
assert xml.count('☒') == 14, 'bad ☒ count'
assert xml.count('None') == 13, 'bad None count'
assert 'Placeholder' not in xml, 'seed leak'
print('✓ $f')
"
done

Present verification results to user (Gate 2 — user review) before handing off files.

Phase 4 — Circulation Guidance

Provide the user with circulation copy to send with each personalized form (write it in the co-authors' preferred language — Korean is common for Korean co-authors):

Please review the attached ICMJE COI form.

  • If the contents are correct, sign and reply with a PDF.
  • If a change is needed, edit/check the relevant item, sign, and reply.
  • If there are no changes at all, reply "no changes" and return the signed PDF separately.

All 6–21 authors can be emailed in one gws gmail draft batch (Gate 3 — user approves batch send before actually dispatching).

Custom Seeds

If the user wants a custom seed (e.g., different default wording, pre-filled items 2/3 with a common grant), generate it once as follows:

  1. Open templates/icmje_coi_seed_synthetic.docx in Word
  2. Edit the desired fields
  3. Save as a new file under {project}/submission/{journal}/ or a local private seeds directory (outside this repo)
  4. Pass --seed /path/to/custom.docx to the script along with the new seed values for --seed-name, --seed-title, --seed-date

Do NOT commit custom seeds that contain real author names to the public medsci-skills repo. Keep them in private per-project directories or a local private seeds directory (outside this repo).

Seed Provenance (how the shipped synthetic seed was created)

The shipped templates/icmje_coi_seed_synthetic.docx was derived from the official ICMJE coi_disclosure.docx through the following steps:

  1. Downloaded the official ICMJE template (https://www.icmje.org/downloads/coi_disclosure.docx)
  2. Opened in Word, typed placeholder values:
    • Date: January 1, 2000
    • Your Name: Placeholder Author
    • Manuscript Title: Placeholder Manuscript Title
  3. Checked each of the 13 disclosure items' "None" option (14 checkboxes total including final certification)
  4. Typed "None" in the "Name all entities" column for each item
  5. Scrubbed docProps/core.xml metadata: creator=ICMJE, lastModifiedBy=Anonymous, dates=2000-01-01
  6. Scrubbed docProps/app.xml Company/Manager fields

No real author's disclosure data is embedded. The file is safe to redistribute.

Anti-Hallucination

  • Never invent author names, email addresses, or ORCIDs. Pull them verbatim from the manuscript's title page or the user's author list.
  • Never claim to have filled the 13 disclosure items — they come from the seed unchanged. If the user asks whether the script "handled the disclosures," the honest answer is "it cloned the seed's ☒ None entries; no author-specific disclosure reasoning happened."
  • Never promise the script works on a blank ICMJE template. It does not — the seed must be pre-filled with all-None ☒ + text.
  • Never edit seed XML by authoring new SDT elements. If an error requires altering the seed structure, stop and escalate to the user; Word-generated SDT XML is the ground truth.
  • Never push private seed files to public repos. If the user asks to promote a custom seed, verify by unzip -p seed.docx docProps/core.xml that no real names remain in metadata before committing.

References

Related Skills

Skill Relationship
write-paper Completes the manuscript whose title is used as input
find-journal Identifies whether the target journal requires ICMJE form
add-journal Journal profile records whether ICMJE form is required
revise After revision, updated title may require re-generating forms

Non-Goals

  • Filling journal-specific disclosure forms (Elsevier Declaration of Interest, BMJ ICMJE derivative, etc.) — only the canonical ICMJE form
  • Handling authors with real disclosures — those authors fill their own forms
  • Signing the forms — authors sign manually after receiving their personalized docx
  • Uploading to Editorial Manager — that remains manual, post-signature
Files (medsci-skills)
  • scripts
    • fill_icmje_coi.py 5.2 KB
      #!/usr/bin/env python3
      """
      fill_icmje_coi.py — Batch-fill ICMJE Conflict of Interest Disclosure Forms.
      
      Approach: ICMJE's official `coi_disclosure.docx` uses Content Controls (SDTs).
      python-docx's `cell.text` ignores SDT-wrapped content, so we operate on
      `word/document.xml` directly via zipfile + targeted string replacement.
      
      Template strategy (works because it avoids authoring SDT XML from scratch):
      - Use a previously-filled ICMJE form ("seed template") as the source, where
        all 13 disclosure items are already marked ☒ + "None" and the final
        certification is ☒.
      - Clone the seed per-author and replace only three fields:
          1. Date  (e.g. "April 12, 2026" → "April 20, 2026")
          2. Name  (seed author full name → target author full name)
          3. Title (seed manuscript title → target manuscript title)
      
      Usage (Python API):
          from fill_icmje_coi import fill_icmje_forms
          fill_icmje_forms(
              seed_docx=Path("/path/to/icmje_seed_filled.docx"),
              seed_name="Placeholder Author",
              seed_title="Placeholder Manuscript Title",
              seed_date="January 1, 2000",
              new_title="Your Manuscript Title",
              new_date="Month D, YYYY",
              authors=[(1, "Author One"), (2, "Author Two"), ...],
              out_dir=Path("submission/{journal}/icmje_forms"),
          )
      
      CLI:
          fill_icmje_coi.py --seed <docx> --seed-name "X" --seed-title "Y" \
              --seed-date "April 12, 2026" --new-title "Z" \
              --new-date "April 20, 2026" --out-dir <dir> \
              --authors '[[1,"A"],[2,"B"]]'
      
      Safety:
      - Only a literal-string replacement in word/document.xml; no SDT surgery.
      - Seed-value collisions inside other document text are unlikely but verify
        by dumping the seed XML first (see test section in source).
      - All other .docx parts (styles.xml, rels, etc.) copied byte-identically.
      """
      from __future__ import annotations
      
      import argparse
      import json
      import re
      import shutil
      import sys
      import zipfile
      from pathlib import Path
      from typing import Iterable
      
      
      DOCUMENT_XML = "word/document.xml"
      
      
      def _replace_in_zip(src: Path, dst: Path, replacements: dict[str, str]) -> None:
          """Copy src → dst, replacing text in word/document.xml per replacements."""
          with zipfile.ZipFile(src, "r") as zin, zipfile.ZipFile(dst, "w", zipfile.ZIP_DEFLATED) as zout:
              for item in zin.infolist():
                  data = zin.read(item.filename)
                  if item.filename == DOCUMENT_XML:
                      text = data.decode("utf-8")
                      for old, new in replacements.items():
                          if old and old not in text:
                              raise ValueError(
                                  f"[{dst.name}] seed string not found in document.xml: {old!r}\n"
                                  f"Dump with: unzip -p <seed.docx> word/document.xml | grep -o '<w:t[^>]*>[^<]*</w:t>'"
                              )
                          if old:
                              # XML-escape new value (& < > " ')
                              escaped = (new.replace("&", "&amp;")
                                            .replace("<", "&lt;")
                                            .replace(">", "&gt;"))
                              text = text.replace(old, escaped)
                      data = text.encode("utf-8")
                  zout.writestr(item, data)
      
      
      def fill_icmje_forms(
          seed_docx: Path,
          seed_name: str,
          seed_title: str,
          seed_date: str,
          new_title: str,
          new_date: str,
          authors: Iterable[tuple[int, str]],
          out_dir: Path,
          filename_template: str = "ICMJE_COI_{idx:02d}_{slug}.docx",
      ) -> list[Path]:
          """Generate one filled docx per author. Returns list of written paths."""
          out_dir.mkdir(parents=True, exist_ok=True)
          written: list[Path] = []
          for idx, author_name in authors:
              slug = re.sub(r"\s+", "_", author_name.strip())
              out_path = out_dir / filename_template.format(idx=idx, slug=slug)
              replacements = {
                  seed_title: new_title,
                  seed_date: new_date,
                  seed_name: author_name,
              }
              _replace_in_zip(seed_docx, out_path, replacements)
              written.append(out_path)
              print(f"  ✓ {out_path.name}  ({author_name})")
          return written
      
      
      def main() -> int:
          p = argparse.ArgumentParser(description=__doc__.split("\n\n")[0])
          p.add_argument("--seed", type=Path, required=True, help="Filled ICMJE docx to clone")
          p.add_argument("--seed-name", required=True)
          p.add_argument("--seed-title", required=True)
          p.add_argument("--seed-date", required=True)
          p.add_argument("--new-title", required=True)
          p.add_argument("--new-date", required=True)
          p.add_argument("--out-dir", type=Path, required=True)
          p.add_argument("--authors", required=True, help='JSON list: [[1,"Full Name"],...]')
          args = p.parse_args()
      
          authors = [tuple(x) for x in json.loads(args.authors)]
          print(f"Seed: {args.seed}")
          print(f"Output dir: {args.out_dir}")
          print(f"Authors: {len(authors)}")
          fill_icmje_forms(
              seed_docx=args.seed,
              seed_name=args.seed_name,
              seed_title=args.seed_title,
              seed_date=args.seed_date,
              new_title=args.new_title,
              new_date=args.new_date,
              authors=authors,
              out_dir=args.out_dir,
          )
          print(f"Done. {len(authors)} forms written to {args.out_dir}")
          return 0
      
      
      if __name__ == "__main__":
          sys.exit(main())
      
  • templates
    • icmje_coi_seed_synthetic.docx 29.6 KB · in bundle
  • tests
    • test_fill_icmje_coi.sh 2.9 KB
      #!/usr/bin/env bash
      # Regression test for fill_icmje_coi.py (per-author ICMJE COI form cloning).
      # Clones the shipped synthetic seed for two authors and asserts the documented
      # contract on each output: 14 checked boxes, 13 "None" disclosures, the new
      # title/date substituted, the author name present, and NO leakage of the seed
      # placeholder strings. The seed-clone path is stdlib (zipfile) only and
      # network-free. Hangul-free (the only non-ASCII char is the checkbox glyph
      # U+2612, which the locale-inventory gate does not flag).
      set -u
      
      HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
      SKILL="$HERE/.."
      SCRIPT="$SKILL/scripts/fill_icmje_coi.py"
      SEED="$SKILL/templates/icmje_coi_seed_synthetic.docx"
      OUTDIR="$(mktemp -d -t icmje_XXXX)"
      trap 'rm -rf "$OUTDIR"' EXIT
      
      fail=0
      check() { local label="$1"; shift
          if "$@" >/dev/null 2>&1; then printf '  PASS  %s\n' "$label"
          else printf '  FAIL  %s\n' "$label"; fail=$((fail+1)); fi
      }
      
      [[ -f "$SCRIPT" ]] || { echo "ENV-ERR: fill_icmje_coi.py missing" >&2; exit 2; }
      [[ -f "$SEED" ]]   || { echo "ENV-ERR: synthetic seed missing"   >&2; exit 2; }
      
      NEW_TITLE="Diagnostic Accuracy of Synthetic Test Imaging"
      NEW_DATE="June 20, 2026"
      
      python3 "$SCRIPT" \
          --seed "$SEED" \
          --seed-name "Placeholder Author" \
          --seed-title "Placeholder Manuscript Title" \
          --seed-date "January 1, 2000" \
          --new-title "$NEW_TITLE" \
          --new-date "$NEW_DATE" \
          --out-dir "$OUTDIR" \
          --authors '[[1,"Alice Kim"],[2,"Bob Lee"]]' >/dev/null 2>&1
      check "CLI exit 0" test "$?" -eq 0
      
      # Two output docx, author names in filenames.
      check "two forms written" test "$(ls "$OUTDIR"/*.docx 2>/dev/null | wc -l)" -eq 2
      DOC1="$OUTDIR/ICMJE_COI_01_Alice_Kim.docx"
      DOC2="$OUTDIR/ICMJE_COI_02_Bob_Lee.docx"
      check "author 1 file named" test -f "$DOC1"
      check "author 2 file named" test -f "$DOC2"
      
      # Per-document contract checks (read word/document.xml from the zip).
      assert_doc() {  # $1=docx  $2=expected author name
          local doc="$1" name="$2"
          python3 - "$doc" "$name" "$NEW_TITLE" "$NEW_DATE" <<'PY'
      import sys, zipfile
      doc, name, title, date = sys.argv[1:5]
      xml = zipfile.ZipFile(doc).read("word/document.xml").decode("utf-8")
      checked = xml.count("☒")      # checked box glyph (U+2612)
      none = xml.count(">None<") + xml.count(">None ")
      assert checked == 14, f"checked boxes={checked} (want 14)"
      assert none == 13, f"None disclosures={none} (want 13)"
      assert title in xml, "new title not substituted"
      assert date in xml, "new date not substituted"
      assert name in xml, f"author name {name!r} absent"
      for ph in ("Placeholder Author", "Placeholder Manuscript Title", "January 1, 2000"):
          assert ph not in xml, f"placeholder leaked: {ph!r}"
      PY
      }
      check "doc1 contract (14 boxes / 13 None / subst / no leak)" assert_doc "$DOC1" "Alice Kim"
      check "doc2 contract (14 boxes / 13 None / subst / no leak)" assert_doc "$DOC2" "Bob Lee"
      
      echo "fail=$fail"; [[ "$fail" -eq 0 ]] && echo "ALL PASS" || echo "FAILURES: $fail"
      exit "$fail"
      
  • SKILL.md 9.7 KB
    ---
    name: fill-icmje-coi
    description: >
      Batch-generate per-author ICMJE Conflict of Interest Disclosure Forms
      (`coi_disclosure.docx`) for manuscript submission. Pre-fills all 13 disclosure
      items as "☒ None" + final certification ☒ using a synthetic seed template
      shipped with the skill, then clones the seed per author with Date, Name, and
      Manuscript Title replaced. Designed for the common case of hospital-based
      observational research where no author has real financial conflicts; the
      circulated forms become "reply 'no changes' + sign" for most authors and only
      flag those who need to amend.
    triggers: ICMJE, COI form, conflict of interest form, disclosure form, coi_disclosure.docx, 이해상충, 이해상충 폼, icmje 폼, 저자 동의서, submission forms
    tools: Read, Write, Edit, Bash, Grep, Glob
    model: inherit
    ---
    
    # Fill-ICMJE-COI Skill
    
    You are helping a researcher prepare ICMJE Conflict of Interest Disclosure Forms
    for every co-author on a manuscript about to be submitted to an ICMJE member
    journal (CHEST, NEJM, JAMA, Lancet, Radiology, etc.). This skill batch-generates
    one personalized `.docx` per author from a synthetic all-None seed shipped with
    the skill, avoiding 10–20 minutes of repetitive Word clicking per author.
    
    ## Why This Skill Exists
    
    The official ICMJE `coi_disclosure.docx` puts every field inside Word Content
    Controls (Structured Document Tags, a.k.a. SDTs). Naive `python-docx`
    manipulation of `cell.text` silently ignores SDT content, so the straightforward
    programmatic approach does not work. The historical workaround was to open the
    template in Word and manually fill each author's form (21 authors × 13
    checkboxes × 2 clicks = ~500 clicks). This skill replaces that by operating
    directly on `word/document.xml` inside the docx zip and doing literal-string
    replacement — but that requires the target strings to already exist in the
    seed, so the skill ships a pre-filled synthetic seed.
    
    **Effect:** a full author roster auto-fills in seconds from the synthetic seed, with
    zero Word clicks.
    
    ## Core Principles (Do Not Violate)
    
    1. **Never author SDT XML from scratch.** Only replace existing strings in an
       already-populated seed. Creating Content Controls programmatically is
       fragile and Word-version-dependent.
    2. **Never ship a real author's filled form as the seed.** The template
       directory contains `icmje_coi_seed_synthetic.docx` with all PII scrubbed
       (synthetic name, title, date; metadata reset to `ICMJE` / `Anonymous`).
       Real-person seeds leak PII through both document.xml and docProps.
    3. **Never modify the 13 disclosure items or certification checkbox.** The
       script only replaces Date/Name/Title. If any author has a real disclosure,
       they must edit in Word manually — the skill's purpose is the common
       all-None case.
    4. **Always verify before circulation.** Each output must have 14 × ☒ and
       13 × "None" in document.xml. The script runs this check implicitly by
       preserving the seed structure; a post-generation grep is cheap insurance.
    
    ## When to Use This Skill
    
    - Manuscript accepted for submission to an ICMJE member journal
    - 3+ co-authors with no real financial conflicts
    - Editorial Manager / submission portal requires per-author ICMJE disclosure docx
    - About to hand-fill the same form 6–21 times
    
    Skip this skill when:
    - Any author has a real financial disclosure to list (they fill their own form
      in Word; this skill does not help)
    - Target journal uses its own declaration form (not ICMJE) — check author
      guidelines first
    - Only 1 author (not worth the setup)
    
    ## Execution
    
    ### Phase 1 — Intake
    
    Ask the user (or extract from conversation):
    1. **Manuscript title** (exact, as it will appear on title page)
    2. **Submission date** (e.g., "April 20, 2026")
    3. **Author list** — ordered, one name per slot: `[(1, "Author One"), (2, "Author Two"), ...]`
    4. **Output directory** — typically `submission/{journal}/icmje_forms/`
    
    Present the intake back to the user for confirmation (**Gate 1 — user approval**)
    before generating anything. Explicitly name which authors will get all-None
    forms and remind that anyone with a real disclosure must instead fill their own
    form in Word.
    
    ### Phase 2 — Generate
    
    Invoke the script with the synthetic seed that ships with this skill:
    
    ```bash
    python3 ${SKILL_DIR}/scripts/fill_icmje_coi.py \
      --seed ${SKILL_DIR}/templates/icmje_coi_seed_synthetic.docx \
      --seed-name "Placeholder Author" \
      --seed-title "Placeholder Manuscript Title" \
      --seed-date "January 1, 2000" \
      --new-title "{exact manuscript title}" \
      --new-date "{submission date}" \
      --out-dir {out_dir} \
      --authors '[[1,"Author One"],[2,"Author Two"],...]'
    ```
    
    The script exits nonzero if any seed string is not found, preventing silent
    failures.
    
    ### Phase 3 — Verify
    
    For each generated docx, confirm:
    - ☒ count = 14 (13 disclosure items + 1 final certification)
    - "None" count = 13
    - Correct name appears after "Your Name:"
    - Correct title appears after "Manuscript Title:"
    - No leakage of seed placeholder strings (`Placeholder Author`, `Placeholder Manuscript Title`, `January 1, 2000`)
    
    Verification one-liner:
    ```bash
    for f in {out_dir}/*.docx; do
      python3 -c "
    import zipfile, sys
    xml = zipfile.ZipFile('$f').read('word/document.xml').decode()
    assert xml.count('☒') == 14, 'bad ☒ count'
    assert xml.count('None') == 13, 'bad None count'
    assert 'Placeholder' not in xml, 'seed leak'
    print('✓ $f')
    "
    done
    ```
    
    Present verification results to user (**Gate 2 — user review**) before handing
    off files.
    
    ### Phase 4 — Circulation Guidance
    
    Provide the user with circulation copy to send with each personalized form (write it in the co-authors' preferred language — Korean is common for Korean co-authors):
    
    > Please review the attached ICMJE COI form.
    > - If the contents are correct, sign and reply with a PDF.
    > - If a change is needed, edit/check the relevant item, sign, and reply.
    > - If there are no changes at all, reply "no changes" and return the signed PDF separately.
    
    All 6–21 authors can be emailed in one `gws gmail draft` batch (**Gate 3 — user
    approves batch send** before actually dispatching).
    
    ## Custom Seeds
    
    If the user wants a custom seed (e.g., different default wording, pre-filled
    items 2/3 with a common grant), generate it once as follows:
    
    1. Open `templates/icmje_coi_seed_synthetic.docx` in Word
    2. Edit the desired fields
    3. Save as a new file under `{project}/submission/{journal}/` or a
       local private seeds directory (outside this repo)
    4. Pass `--seed /path/to/custom.docx` to the script along with the new seed
       values for `--seed-name`, `--seed-title`, `--seed-date`
    
    Do NOT commit custom seeds that contain real author names to the public
    medsci-skills repo. Keep them in private per-project directories or a
    local private seeds directory (outside this repo).
    
    ## Seed Provenance (how the shipped synthetic seed was created)
    
    The shipped `templates/icmje_coi_seed_synthetic.docx` was derived from the
    official ICMJE `coi_disclosure.docx` through the following steps:
    
    1. Downloaded the official ICMJE template (`https://www.icmje.org/downloads/coi_disclosure.docx`)
    2. Opened in Word, typed placeholder values:
       - Date: `January 1, 2000`
       - Your Name: `Placeholder Author`
       - Manuscript Title: `Placeholder Manuscript Title`
    3. Checked each of the 13 disclosure items' "None" option (14 checkboxes total including final certification)
    4. Typed "None" in the "Name all entities" column for each item
    5. Scrubbed `docProps/core.xml` metadata: creator=`ICMJE`, lastModifiedBy=`Anonymous`, dates=`2000-01-01`
    6. Scrubbed `docProps/app.xml` Company/Manager fields
    
    No real author's disclosure data is embedded. The file is safe to redistribute.
    
    ## Anti-Hallucination
    
    - **Never invent author names, email addresses, or ORCIDs.** Pull them
      verbatim from the manuscript's title page or the user's author list.
    - **Never claim to have filled the 13 disclosure items** — they come from the
      seed unchanged. If the user asks whether the script "handled the
      disclosures," the honest answer is "it cloned the seed's ☒ None entries;
      no author-specific disclosure reasoning happened."
    - **Never promise the script works on a blank ICMJE template.** It does not —
      the seed must be pre-filled with all-None ☒ + text.
    - **Never edit seed XML by authoring new SDT elements.** If an error requires
      altering the seed structure, stop and escalate to the user; Word-generated
      SDT XML is the ground truth.
    - **Never push private seed files to public repos.** If the user asks to
      promote a custom seed, verify by `unzip -p seed.docx docProps/core.xml` that
      no real names remain in metadata before committing.
    
    ## References
    
    - ICMJE Disclosure of Interest page: https://www.icmje.org/disclosure-of-interest/
    - ICMJE COI form download: https://www.icmje.org/downloads/coi_disclosure.docx
    - ICMJE FAQ on disclosure forms: https://www.icmje.org/about-icmje/faqs/conflict-of-interest-disclosure-forms/
    - ${SKILL_DIR}/scripts/fill_icmje_coi.py — generator CLI + Python API
    - ${SKILL_DIR}/templates/icmje_coi_seed_synthetic.docx — shipped synthetic seed (PII-free)
    
    ## Related Skills
    
    | Skill | Relationship |
    |---|---|
    | `write-paper` | Completes the manuscript whose title is used as input |
    | `find-journal` | Identifies whether the target journal requires ICMJE form |
    | `add-journal` | Journal profile records whether ICMJE form is required |
    | `revise` | After revision, updated title may require re-generating forms |
    
    ## Non-Goals
    
    - Filling journal-specific disclosure forms (Elsevier Declaration of Interest,
      BMJ ICMJE derivative, etc.) — only the canonical ICMJE form
    - Handling authors with real disclosures — those authors fill their own forms
    - Signing the forms — authors sign manually after receiving their personalized docx
    - Uploading to Editorial Manager — that remains manual, post-signature
    
  • skill.yml 1.4 KB
    schema_version: 2
    name: fill-icmje-coi
    layer: A
    owner_domain: form_filling
    maturity: official
    
    when_to_use: "Batch-generate per-author ICMJE COI disclosure forms from a synthetic seed, pre-filled as 'None' with date/name/title replaced."
    when_NOT_to_use: "Filling an IRB or institutional Word form (use fill-protocol)."
    
    inputs:
      - "author list"
      - "manuscript title"
      - "date"
    outputs:
      - "per-author coi_disclosure.docx files"
    deterministic_scripts:
      - scripts/fill_icmje_coi.py
    side_effects:
      - writes_docx_forms
    downstream_consumers:
      - none
    forbidden_actions:
      - alter_checkboxes_or_disclosure_items
      - use_a_seed_containing_real_author_pii
    
    # v2.1 quality card
    purpose: "Clone the ICMJE COI form per author with date/name/title filled, defaulting all 13 items to 'None' for the no-conflict common case."
    safety_boundaries:
      - "Only date, name, and manuscript title are substituted; the 13 items and certification come from the seed unchanged."
      - "Ships a synthetic PII-free seed; never commits a seed with real author PII."
    known_limitations:
      - "Authors with real disclosures must edit their form in Word; the skill cannot infer conflicts."
      - "A blank ICMJE template cannot be used as the seed (the safety check requires the pre-filled 'None' strings)."
    validation_commands:
      - "verify each output: 14 checked boxes, 13 'None', no seed-placeholder leakage"
    evidence_surface: bundled_script
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related