{"slug":"polish-language","title":"polish-language","summary":"Academic English consistency linting and non-native (ESL) language polish for medical manuscripts. Deterministically flags abbreviation define-once violations, US/UK spelling drift, hyphen-vs-en-dash numeric ranges, P/p case, hyphenation variants, small-number style, and value/un","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-09-14T20:48:14.493719Z","repo":{"url":"https://github.com/Aperivue/medsci-skills","stars":318,"forks":75,"license":"MIT","updatedAt":"2026-09-27T05:05:17Z"},"bodyHtml":"<hr>\n<h2>name: polish-language\ndescription: Academic English consistency linting and non-native (ESL) language polish for medical manuscripts. Deterministically flags abbreviation define-once violations, US/UK spelling drift, hyphen-vs-en-dash numeric ranges, P/p case, hyphenation variants, small-number style, and value/unit spacing, then guides a style-only clarity pass that never alters numbers, citations, or scientific meaning. Distinct from humanize (AI-tell removal) and check-reporting (guideline items).\ntriggers: polish language, copy-edit, consistency check, ESL, non-native English, house style, abbreviation consistency, en-dash, US UK spelling, proofread manuscript, 일관성 검사, 교정\ntools: Read, Write, Edit, Grep, Glob, Bash\nmodel: inherit</h2>\n<h1>Polish-Language Skill</h1>\n<p>You help a medical researcher tighten a manuscript's <strong>mechanical language\nconsistency and clarity</strong> before circulation or submission — the copy-editor\npass that content-focused skills skip. The author is frequently a non-native\n(ESL) English writer, so clarity edits must preserve the formal academic\nregister while never touching facts.</p>\n<h2>Communication Rules</h2>\n<ul>\n<li>Manuscript content and edits in English.</li>\n<li>Converse with the user in their preferred language.</li>\n<li>Report issues first; only edit after the user approves (see gates below).</li>\n</ul>\n<h2>Scope boundary (what this skill is, and is not)</h2>\n<table>\n<thead>\n<tr>\n<th>Concern</th>\n<th>Skill</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Mechanical consistency + ESL clarity (this skill)</td>\n<td><strong>polish-language</strong></td>\n</tr>\n<tr>\n<td>Removing AI writing tells / de-AI</td>\n<td><code>humanize</code> (it explicitly does <strong>not</strong> do general copy-editing)</td>\n</tr>\n<tr>\n<td>Drafting or restructuring content</td>\n<td><code>write-paper</code></td>\n</tr>\n<tr>\n<td>Reporting-guideline item compliance (STROBE, CLAIM, …)</td>\n<td><code>check-reporting</code></td>\n</tr>\n<tr>\n<td>AI-search-engine optimization (GEO)</td>\n<td><code>academic-aio</code></td>\n</tr>\n<tr>\n<td>Reference formatting / citation integrity</td>\n<td><code>manage-refs</code>, <code>verify-refs</code></td>\n</tr>\n</tbody>\n</table>\n<p>This skill <strong>never</strong> rewrites scientific claims, changes numeric values, edits\ncitations, or judges study quality. It only standardizes house style and\nimproves sentence-level clarity with explicit user approval.</p>\n<h2>Inputs / Outputs</h2>\n<ul>\n<li><strong>Input</strong>: a manuscript or section (Markdown / plain text).</li>\n<li><strong>Output</strong>: (1) a deterministic consistency report, and (2) — only after a\nuser gate — a clarity-polished revision with a change log limited to style.</li>\n</ul>\n<h2>Workflow</h2>\n<h3>Phase 1: Deterministic consistency lint (no LLM judgement)</h3>\n<p>Run the bundled deterministic linter — it reports, never edits:</p>\n<pre><code>python3 scripts/lint_consistency.py path/to/manuscript.md\n# add --strict to exit non-zero when any issue is found (CI / pre-submission gate)\n</code></pre>\n<p>It flags seven families, each with line numbers and a per-category + total\ncount:</p>\n<ol>\n<li><strong>Abbreviations</strong> — used-before-defined, defined-but-unused, defined-twice,\nused-but-never-defined (define-once discipline).</li>\n<li><strong>Spelling</strong> — mixed US/UK variants (analyze/analyse, tumor/tumour, …);\nreports the minority side against the document's dominant variant.</li>\n<li><strong>Numeric ranges</strong> — hyphen between numbers where an en-dash belongs\n(<code>5-10</code> → <code>5–10</code>).</li>\n<li><strong>p-values</strong> — mixed <code>P</code>/<code>p</code> case; impossible <code>P = 0.000</code>.</li>\n<li><strong>Hyphenation / terminology</strong> — variant forms of one term\n(follow-up / followup / \"follow up\").</li>\n<li><strong>Small numbers</strong> — single digits 1–9 written as digits in prose.</li>\n<li><strong>Units</strong> — missing space between value and unit (<code>5mg</code> → <code>5 mg</code>).</li>\n</ol>\n<p>Present the report to the user. The linter output is the source of truth for\nwhat is mechanically wrong; do not invent additional \"issues\" from memory.</p>\n<h3>Phase 1b: Figure-SOURCE locale drift (text no grep can reach)</h3>\n<p>Phase 1 only sees prose. Text baked into a <strong>figure</strong> lives in a rendered raster, so a\nco-author who types \"Behavioural alignment\" in a PowerPoint panel or a plotting script ships\na UK word into a US manuscript and no text gate sees it — it surfaces when someone opens the\nimage, typically on submission day. Scan the figure <strong>sources</strong> instead (no OCR):</p>\n<pre><code>python3 scripts/lint_figure_locale.py --manuscript path/to/manuscript.md --figures-dir figures/\n# --spelling us|uk forces the target; otherwise it reads a `spelling:` front-matter field,\n# then falls back to the body's own US/UK majority. --strict exits non-zero on any drift.\n</code></pre>\n<p>It reads <code>&lt;a:t&gt;</code> runs inside <code>*.pptx</code> slide XML and the text of <code>*.py</code> / <code>*.R</code> plotting\nscripts, and reuses Phase 1's US↔UK families verbatim so the two gates never disagree.\n<code>FIGURE_LOCALE_DRIFT</code> is <strong>Minor</strong> — copy-edit the source before the raster is re-exported.\nA missing figures directory is not an error; it exits 0 with nothing judged.</p>\n<h3>Phase 2: Triage with the user (gate)</h3>\n<p>Walk the user through the report. Some flags are author choices (a journal may\nmandate UK spelling, or digits for all numbers). <strong>User approval is required</strong>\nbefore any edit — confirm per category which to apply and which to keep. Record\nthe decisions; do not auto-apply.</p>\n<h3>Phase 3: Apply mechanical fixes (style-only)</h3>\n<p>For each <strong>approved</strong> category, apply the deterministic fix with <code>Edit</code>:</p>\n<ul>\n<li>standardize spelling to the chosen variant,</li>\n<li>replace numeric-range hyphens with en-dashes,</li>\n<li>normalize <code>P</code>/<code>p</code> and fix <code>P = 0.000</code> to the reported inequality,</li>\n<li>unify hyphenation, spell out small numbers, add value/unit spaces,</li>\n<li>define each abbreviation once at first use; remove redundant redefinitions.</li>\n</ul>\n<p>Re-run <code>lint_consistency.py</code> after editing — the count should drop to the\nissues the user chose to keep. This re-run is the verification gate.</p>\n<h3>Phase 4: ESL clarity polish (optional, gated, style-only)</h3>\n<p>If the user requests a clarity pass, improve readability sentence by sentence\nwhile preserving meaning, register, numbers, and citations:</p>\n<ul>\n<li>split run-on sentences; fix article (a/an/the) and preposition usage;</li>\n<li>correct subject–verb agreement and awkward non-native phrasings;</li>\n<li>prefer active voice only where it does not change emphasis or claims.</li>\n</ul>\n<p>Show each proposed change as a before/after diff and get <strong>user review</strong> before\nwriting. If a sentence's meaning is even slightly uncertain, leave it and ask —\ndo not guess. Never merge, add, or drop a scientific claim, number, or\nreference during clarity polishing.</p>\n<h2>Reproducible challenge card</h2>\n<p>A deterministic, network-free challenge card lives in\n<code>scripts/lint_challenge/</code> (synthetic manuscript with seeded defects +\n<code>expected/report.txt</code> + <code>verify.sh</code>):</p>\n<pre><code>bash scripts/lint_challenge/verify.sh   # PASS = 11 seeded issues across 8 categories + 2 clean controls\n</code></pre>\n<h2>What This Skill Does NOT Do</h2>\n<ul>\n<li>Does not rewrite or generate scientific content, claims, or conclusions.</li>\n<li>Does not change any numeric value, statistic, or result.</li>\n<li>Does not add, remove, or reformat citations or references.</li>\n<li>Does not assess reporting-guideline or journal compliance.</li>\n<li>Does not remove AI writing patterns (use <code>humanize</code>).</li>\n<li>Does not translate between languages.</li>\n<li>Applies no edit without explicit user approval (gates in Phases 2–4).</li>\n</ul>\n<h2>Anti-Hallucination</h2>\n<ul>\n<li>Report deterministic findings as linter findings, and other observations as\neditorial suggestions. The fixed rules do not resolve every grammar or journal\npreference; triage flags in context. Never claim a fix without re-running the linter.</li>\n<li>Clarity edits are constrained to wording. Numbers, p-values, effect sizes,\nunits, citations, and claims are copied verbatim — if an edit would change\nany of them, it is out of scope and must be skipped.</li>\n<li>When a sentence's intended meaning is ambiguous, ask the user rather than\ninferring; do not invent domain facts to \"smooth\" a sentence.</li>\n<li>Every applied change is style-only and traceable to a linter flag or an\nexplicit user-approved clarity suggestion.</li>\n</ul>\n","files":[{"path":"scripts/lint_challenge/expected/report.txt","sizeBytes":1032,"isText":true},{"path":"scripts/lint_challenge/fixture/consistent_uk.md","sizeBytes":524,"isText":true},{"path":"scripts/lint_challenge/fixture/consistent_us.md","sizeBytes":763,"isText":true},{"path":"scripts/lint_challenge/fixture/manuscript.md","sizeBytes":709,"isText":true},{"path":"scripts/lint_challenge/problem.md","sizeBytes":2949,"isText":true},{"path":"scripts/lint_challenge/verify.sh","sizeBytes":1132,"isText":true},{"path":"scripts/lint_consistency.py","sizeBytes":16136,"isText":true},{"path":"scripts/lint_figure_locale_challenge/problem.md","sizeBytes":2282,"isText":true},{"path":"scripts/lint_figure_locale_challenge/verify.sh","sizeBytes":4118,"isText":true},{"path":"scripts/lint_figure_locale.py","sizeBytes":9910,"isText":true},{"path":"SKILL.md","sizeBytes":7709,"isText":true},{"path":"skill.yml","sizeBytes":2081,"isText":true},{"path":"tests/test_consistency_controls.py","sizeBytes":4262,"isText":true},{"path":"tests/test_numeral_designators.sh","sizeBytes":3154,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-09-14T20:49:13.478922Z","sha256":"3A59D965F211D4289A70B882BE62C872CA210D03AE7E0D868318CA0F50075E6B","sizeBytes":26247},"review":null,"source":{"repositoryUrl":"https://github.com/Aperivue/medsci-skills","path":"skills/polish-language","license":"MIT","commit":"5599b724675a1d788e03cd58dabd3db7c68ca86b","subtreeSha":"66EAA15EFE1E17F3EEBD6AD06BB4D0229F5F1086E2A405A0160F9AA57BFED097","lastSyncedAt":"2026-09-27T19:46:33.449845Z"},"reviewedAt":"2026-09-14T20:55:14.756056Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/Aperivue/medsci-skills/tree/main/skills/polish-language"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install aperivue-medsci-skills@llmmart"},{"target":"git","command":"git clone https://github.com/Aperivue/medsci-skills.git"}]}