Skill v1.0.2
currentAutomated scan72/10010 files
version: "1.0.2" name: fill-protocol description: Use when an institutional Word form (.doc/.docx IRB protocol, ethics application, grant template) must be filled without breaking its styles, tables, fonts or page layout. Renders content drafted by /write-protocol into the template; CJK-aware. metadata: triggers: "fill protocol, fill template, fill IRB form, IRB template, ethics template, grant template, 양식 채우기, 연구계획서 작성, 신청서 작성, 정부 양식, 병원 양식, 워드 템플릿"
Fill-Protocol Skill
Core Principles (Do Not Violate)
- Open the existing template — never create from scratch. Use
Document(template_path), not
Document(): rebuilding loses the header logo, custom margins, footer placeholders and page numbering. Replace cell/paragraph text in place; never a single cell.text = "value" assignment, which erases run-level styles (bold, color, eastAsia font).
- Convert .doc → .docx via LibreOffice headless before any editing.
pandoc -f docis not
supported; textutil corrupts table structure (merged cells dropped).
- Match cells by left-label text, not row/column coordinates such as
table.cell(2, 1).
Templates evolve and coordinate matching breaks silently.
- Apply `cantSplit` to every filled row so a row never breaks across pages.
- For CJK languages, set the `eastAsia` font attribute, not just
run.font.name, or
Hangul/Kanji/Hanzi render in fallback fonts.
- Validate every fill operation: resolve every
[MISS]line and everyWARN:line
([TABLE-MISS], [SECTION-MISS], [RAW-NEWLINE]) before the filled form is submitted.
Dependencies
Python packages docxtpl python-docx pyyaml are always required. LibreOffice is needed only for a legacy .doc template (~700 MB on macOS). The bundled setup.sh detects what is missing:
bash ${CLAUDE_SKILL_DIR}/setup.sh check # report what's installed (read-only)bash ${CLAUDE_SKILL_DIR}/setup.sh install # install missing pieces (asks before each)
When invoking this skill on behalf of a user:
- Skip LibreOffice entirely if the template is already
.docx. - Before calling `doc_to_docx.py`, run
setup.sh check. If LibreOffice is missing, **ask the
user** before installing, because the cask is ~700 MB.
- Never pass
--yestosetup.sh installunless the user has explicitly authorized
unattended installation in this session, because it installs without prompting.
- If the user declines, ask them to convert the
.docmanually (Word/LibreOffice/Pages → Save
As → .docx) and re-run with the converted file.
Workflow
Step 1 — Convert legacy .doc to .docx (if needed)
python3 ${CLAUDE_SKILL_DIR}/scripts/doc_to_docx.py path/to/template.doc path/to/template.docx
Step 2 — Inspect the template structure
python3 ${CLAUDE_SKILL_DIR}/scripts/inspect_template.py path/to/template.docx
It lists every table, every cell (coordinates and content preview) and every top-level paragraph. Take the exact labels for the YAML from this output.
Step 3 — Author a content YAML
Start from ${CLAUDE_SKILL_DIR}/examples/example_irb_template.yaml. Three fill modes; all keys are optional.
protections:korean_font: "맑은 고딕" # CJK font (set to "Noto Sans CJK KR", "SimSun",# "MS Mincho", etc. for other locales)cant_split: true # Apply <w:cantSplit/> to every filled row# Readability options (defaults shown)blank_between_paragraphs: true # Enter between \n\n chunksblank_around_section_header: true # Enter above/below filled sectionsblank_around_all_section_headers: false # opt-in; also touches untouched sectionsnormalize_page_breaks: true # empty page-break paragraphs -> pageBreakBefore# Mode 1 — table key/value (left-label cell → right value cell)table_kv:"Study Title": "Multi-center prospective validation of ...""Principal Investigator": "Last, First (Department)""연구 목적": "본 연구는 ..."# Mode 2 — section replacement (find numbered header, replace until next header)section_replace:"1. Background":"Hepatocellular carcinoma is the third leading cause of ...""4. 연구 배경 및 이론적 근거":"..."# Mode 3 — single paragraph in-place text replacementparagraph_replace:"Title:":"Title: Multi-center prospective validation of ..."
Read ${CLAUDE_SKILL_DIR}/references/best_practices.md (Readability knobs) before changing any readability option from its default.
Content rules: put a reference in only with a /search-lit-confirmed DOI or PMID, otherwise mark it [UNVERIFIED - NEEDS MANUAL CHECK]; mark any unconfirmed clinical definition, diagnostic criterion or guideline claim [VERIFY] and ask the user.
Step 4 — Run the fill
python3 ${CLAUDE_SKILL_DIR}/scripts/fill_form.py \--template path/to/template.docx \--content content.yaml \--output path/to/filled.docx
The CLI prints [OK] / [MISS] for every fill operation, a summary, then any WARN: lines. Investigate every [MISS] and WARN: before submitting (Principle 6).
Step 5 — Visual verification
soffice --headless --convert-to pdf path/to/filled.docx
Open the PDF and confirm: page count is sensible, no table row was split across pages, no font fell back to Times New Roman, all required fields are populated.
Read ${CLAUDE_SKILL_DIR}/references/best_practices.md when a label or section header does not match, the template has no numbered section headers (stop_pattern via the Python API), a cell needs multi-line content, or cells are merged.
Known Limitations
- HWP / HWPX input is not handled directly — convert it to
.docxfirst. - Merged cells: filling a label cell that participates in a vertical merge may overwrite the
merged region's content. Test on a copy first.
- Embedded form fields (Word content controls): not supported; plain paragraph and table cell
content only.
- Right-to-left scripts (Arabic, Hebrew): untested.