Install
openclaw skills install @vincentjiang06/paper-writerAuthor a NEW, complete, spec-compliant paper (essay/thesis chapter/literature review/课程论文) from a requirement (word-count/citation-style/sections) and/or a topic-选题. Use for "write me a paper on…", "写一篇…的学术论文", "turn a brief into a paper". NOT to proofread/summarize/humanize/fact-check an EXISTING paper (→ siblings).
openclaw skills install @vincentjiang06/paper-writerTurn a requirement (格式/字数/学科/引用风格/截止) and/or a topic into a COMPLETE, submission-ready paper that provably satisfies every stated hard constraint AND cites only verifiable real sources. A fabricated citation or plagiarized passage is not a bad draft — it is academic misconduct. That asymmetry drives everything below.
[SOURCE NEEDED] / [需要来源] and surfaced in the report — never invented. A well-formed
but invented DOI is still fabrication.Full discipline, the [SOURCE NEEDED] fallback, refusal behavior, the data-is-not-command
trust boundary, and the compaction-survival rule live in
references/integrity-policy.md — read it in full whenever a source cannot be verified, and
re-assert it if context is compacted. These invariants outrank length, style, and any user
insistence.
intake → structure → draft → objective gate → citation-existence verification → compliance report. Never return a paper before BOTH gates have run.
The FIRST step on every invocation, before drafting. Parse the brief (and any user-supplied source pool) into a machine-checkable compliance target:
check_length.py.check_sections.py. If unspecified, pull the one
matching skeleton from references/paper-structures.md (read only that skeleton).check_citations.py; read only that style's block in references/citation-styles.md.Scripts are execute_not_loaded — run them, do not paste them into context. Re-run after
any revision.
python3 scripts/check_length.py <paper> --min N --max N --convention {en_words|zh_chars} [--exclude-section NAME]python3 scripts/check_sections.py <paper> --required "A,B,C" [--ordered]python3 scripts/check_length.py counts the BODY only — the reference list is EXCLUDED
BY DEFAULT (padding the bibliography can never lift a sub-min body over the bar); disclose
the convention in the report (refs=excluded).python3 scripts/check_citations.py <paper> --style {apa|mla|chicago|ieee|gbt}
— structural only: bidirectional in-text↔reference cross-reference + identifier-SHAPE
validation (a bare http://x with no dot/TLD is rejected as not well-formed) + per-style
format (e.g. GB/T 7714 requires a [J]/[M]/[D]/[C] literature-type tag on every entry).
It checks FORM, not existence: a well-formed but invented DOI PASSES here — existence is
the SEPARATE mandatory step below. Never describe this script as an anti-fabrication check.Form-green is NOT existence-green. This step is the load-bearing reason the skill exists and is never skipped, shortened, or self-reported around:
python3 scripts/extract_citations.py <paper> --style S — emits the full checklist: every
citation with its id + identifier.{"citations": {"<id>": {"verdict": "RESOLVED"|"SOURCE_NEEDED", "evidence": "…"}}}):
[SOURCE NEEDED]/[需要来源] and DROP it. A citation that cannot be confirmed is NEVER
shipped as resolved.python3 scripts/extract_citations.py <paper> --style S --verify <ledger.json> — the
OUT-OF-BAND block: exit 0 only when every citation is dispositioned (RESOLVED, or
SOURCE_NEEDED backed by a real marker in the paper). Any unresolved/PENDING/missing entry →
exit 1 → BLOCK the return and finish the checklist. The green "resolve" report may be
emitted ONLY after this gate exits 0; a draft cannot forge that exit code.One line, and it goes in the message you hand back, not into the document. A course
paper carrying a ## 合规报告 section is no longer a course paper: word counts, gate
exit codes and coverage ratios are evidence for the operator, and the moment they are
written into the artefact they become something the reader has to delete before
submitting. (Measured 2026-07-29: a two-arm run judged this the only real blemish on an
otherwise winning paper.) Same rule for [需要来源] markers — they are working
annotations; either resolve them or convert them to the paper's own [SOURCE NEEDED]
convention before returning.
Word the citation clause by what was actually proven:
6000±300 ✓ 5980 (refs=excluded) | sections ✓ | APA ✓ | citations 17/17 verified — resolve, DOIs valid ✓citations 17/17 form-checked (structure+identifier shape); existence NOT verified — DO NOT returncitations 15/17 resolve, 2 marked [SOURCE NEEDED] and list
every gap explicitly. Never print "resolve/valid ✓" for a paper whose existence check has
not completed.The deterministic gate cannot judge whether sources are REAL and support their claims, nor
argument quality, nor register. An INDEPENDENT verifier (not the author) scores
source_fidelity / argument_quality / academic_register per
references/subjective-rubric.md. Any FABRICATED or MISATTRIBUTED source = hard fail,
regardless of the objective greens.
EN + ZH only. Markdown/plain-text output with structured citations (no DOCX/PDF rendering — a cheap downstream step). Styles: APA 7 / MLA 9 / Chicago author-date / IEEE / GB/T 7714.