skills/ssci-polish/SKILL.md
Polish English academic papers for SSCI journal submission. This skill checks grammar, improves readability, and enhances academic tone. Use when the user asks to polish, proofread, edit, or improve their English academic paper, manuscript, or article — especially when targeting SSCI, SCI, or other international journals. Also use when the user asks to "润色", "修改语法", "提升学术性", "polish my paper", or mentions their paper needs language improvement for journal submission. Always trigger on any request involving academic English polishing, even if the user doesn't explicitly say "SSCI."
npx skillsauth add brycewang-stanford/Awesome-Agent-Skills-for-Empirical-Research ssci-polishInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
作者: 刘松岐(辽宁大学)| copaper.ai 团队培训班学员
Polish English academic manuscripts for submission to SSCI/SCI journals. This skill integrates principles from three authoritative writing guides:
When asked to polish a paper, follow this three-pass approach:
Fix objective errors first:
Refer to references/grammar.md for the complete grammar rule checklist.
Improve clarity and fluency:
Refer to references/style.md for the complete style rule checklist.
Enhance academic rigor:
Refer to references/academic.md for the complete academic standards checklist.
When polishing, show results in this structure:
Briefly list what was fixed at each pass level.
Present the full polished text. If only sections were edited, clearly mark which sections.
List specific changes with before/after comparisons for major revisions. Use this format:
"before" → "after"These rules from the three books should be applied in every polishing session unless the user specifies otherwise:
Beyond the standard grammar rules, always verify:
.) must begin with a capital letter, excluding abbreviations (e.g., i.e., e.g., etc., et al.). This applies to all prose paragraphs.import re
for i, p in enumerate(doc.paragraphs):
for s in re.split(r'(?<=[.!?])\s+', p.text.strip()):
if len(s.split()) > 40:
print(f"P{i} ({len(s.split())}w): {s[:120]}...")
Only flag sentences in prose paragraphs (skip table cells, figure captions, and variable definition lists). Split at natural break points: before coordinating conjunctions (and, but, or), relative pronouns (which, that), or between major clause boundaries.
CRITICAL: Use python-docx, not hand-rolled XML surgery. The unpack→lxml→repack approach has a known bug where apply_tc corrupts text that spans multiple <w:t> elements, creating duplicate paragraph fragments. python-docx handles all OOXML internally and cannot introduce this class of bug.
Use python-docx to extract ALL text (body + table cells):
from docx import Document
doc = Document("input.docx")
all_paras = list(doc.paragraphs)
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
for para in cell.paragraphs:
all_paras.append(para)
for p in all_paras:
print(p.text)
Go through ALL paragraphs systematically against the grammar.md, style.md, and academic.md checklists. Document every issue found, then compile the final change list. Only include changes that are definite errors or clear improvements — do not over-polish.
CRITICAL: Before clearing any paragraph, capture its original formatting from the first run. Apply this formatting to all new runs so the output matches the original document.
from docx.shared import Pt, RGBColor, Emu
from docx.oxml.ns import qn
RED = RGBColor(0xFF, 0x00, 0x00)
def get_para_format(para):
"""Capture font name, size, and bold/italic from the paragraph's first run."""
if para.runs:
first = para.runs[0]
return {
'name': first.font.name,
'size': first.font.size,
'bold': first.font.bold,
'italic': first.font.italic,
}
# Fallback: use paragraph style defaults
style = para.style
return {
'name': style.font.name if style.font.name else 'Times New Roman',
'size': style.font.size if style.font.size else Pt(12),
'bold': style.font.bold if style.font.bold else False,
'italic': style.font.italic if style.font.italic else False,
}
def apply_format(run, fmt):
"""Apply captured formatting to a run."""
if fmt['name']: run.font.name = fmt['name']
if fmt['size']: run.font.size = fmt['size']
run.font.bold = fmt['bold']
run.font.italic = fmt['italic']
for old, new in CHANGES:
for para in all_paras:
idx = para.text.find(old)
if idx == -1: continue
fmt = get_para_format(para)
before = para.text[:idx]
after = para.text[idx + len(old):]
# para.clear() preserves paragraph-level formatting
# (alignment, spacing, indentation) but removes all runs
para.clear()
if before:
r = para.add_run(before)
apply_format(r, fmt)
r = para.add_run(new)
apply_format(r, fmt)
r.font.color.rgb = RED
if after:
r = para.add_run(after)
apply_format(r, fmt)
break
Why this preserves formatting:
para.clear() keeps paragraph-level properties (<w:pPr>): alignment, line spacing, indentation, widow control.get_para_format() reads the original font name, size, bold, and italic from the paragraph's first run before clearing.# Check for duplicate paragraphs
seen = {}
for i, p in enumerate(all_paras):
txt = p.text.strip()
if len(txt) > 150 and txt in seen:
print(f"WARNING: P{seen[txt]} == P{i}")
else:
seen[txt] = i
# Check key phrases haven't multiplied
import re
for phrase in ["access to and understanding", "new-type agricultural"]:
count = sum(1 for p in all_paras if phrase in p.text)
# Count should not exceed expected occurrences
doc.save("output.docx")
doc.save("output.docx")
apply_tc function that inserts <w:del> and <w:ins> corrupts text spanning multiple <w:t> elements. This bug has been confirmed across multiple test runs.para.clear(), causing table cell contents to shift en masse (confirmed: 700+ paragraphs affected). Iterate doc.paragraphs only; accept that changes in table cells will be missed.<w:p> elements frequently creates sentence fragments.len(orig.paragraphs) == len(polished.paragraphs) and that prose body paragraphs have no duplicates (>150 chars).tools
Recommend AND run open-source AI tools, agents, Claude Code / Codex skills, and MCP servers for any stage of a literature review — searching, reading, extracting, synthesizing, screening, citation-checking, and paper writing. Use when the user asks "what tool should I use to..." OR "install/run/use <tool> to ..." for research/lit-review work: automating a survey or related-work section, PDF→Markdown extraction for LLMs (MinerU/marker/docling), PRISMA / systematic review (ASReview), citation-backed Q&A over PDFs (PaperQA2), wiring papers into Claude/Cursor via MCP (arxiv/paper-search/zotero servers), or chatting with a Zotero library. Ships a launcher (scripts/litrun.py) that installs each tool in an isolated venv and runs it. Curated catalog of 70+ vetted projects. 支持中英文(用于「文献综述工具选型」与「一键安装/运行」)。
development
Route empirical-research requests through the Auto-Empirical Research Skills catalog when this whole repository is installed as one skill in Codex, CodeBuddy, Claude Code, or another IDE. Use to choose and load the right vendored AERS skill for causal inference, econometrics, replication, data acquisition, manuscript writing, peer review and referee responses, citation checking, de-AIGC editing, or full empirical-paper workflows without reading the entire repository at once.
documentation
Use when the project collects primary data or runs a field, lab, or survey experiment, before the intervention begins — write the pre-analysis plan, size the sample from a power calculation, and register with the AEA RCT Registry. Apply after the design is chosen in aer-identification and before any outcome data are seen.
tools
Guide economists to authoritative data sources with explicit, confirmed data specifications before retrieval; interfaces with Playwright MCP to navigate portals and extract real data, not articles about data.