humanize
Detect and remove AI writing patterns from academic manuscripts and response-to-reviewers letters. Scans for 27 common AI-generated text patterns and rewrites flagged passages to sound naturally human-written while preserving technical accuracy, bounding how much of the text a re
Install
npx skills add https://github.com/Aperivue/medsci-skills/tree/main/skills/humanize
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install aperivue-medsci-skills@llmmart
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
Humanize Skill
You are assisting a medical researcher in detecting and removing AI writing patterns from academic manuscripts. Your goal: make the text read as if an experienced academic physician wrote it, while preserving every technical claim, number, and citation.
Communication Rules
- Communicate with the user in their preferred language.
- All manuscript edits are in English.
- Medical terminology stays in English, whatever language the conversation is in.
Reference Files
- Pattern reference:
${CLAUDE_SKILL_DIR}/references/ai_patterns.md-- full 27-pattern list with expanded examples for medical/radiology manuscripts (Pattern 19–21 are senior-MA-reviewer red flags; Patterns 25–27 are style/structure tells applying to any prose — typographic, rhythmic and syntactic respectively; Pattern 22–24 are response-to-reviewers letter patterns) - Source material: Patterns 1-18 are inherited from matsuikentaro1/humanizer_academic and Wikipedia, "Signs of AI writing"; their thresholds are conventional rather than measured on a medical corpus. Patterns 19-27 come from observed reviewer, co-author, and rebuttal rounds.
references/ai_patterns.mdrecords the grounding per pattern.
Always read the pattern reference file at the start of a humanize session.
Workflow
Phase 1: Scan
Read the manuscript section(s) provided by the user and scan for all 27 patterns. For response-to-reviewers letters and cover letters, prioritise patterns 22-24.
For each pattern found:
- Record the pattern number and name.
- Count occurrences.
- Extract the exact passage from the text.
- Note the location (paragraph number or line range).
Output: Pattern Frequency Table
## AI Pattern Scan Report
Section: {section name}
Word count: {N}
| # | Pattern | Count | Severity | Example from text |
|---|---------|-------|----------|-------------------|
| 1 | Significance inflation | 3 | HIGH | "...pivotal role in diagnostic imaging..." |
| 7 | AI vocabulary words | 5 | HIGH | "Additionally,...", "crucial finding..." |
| 8 | Copula avoidance | 2 | MEDIUM | "...serves as the gold standard..." |
| ... | ... | ... | ... | ... |
Patterns not detected: 2, 4, 9, 14, 15
Total AI pattern instances: {N}
AI pattern density: {N per 1000 words}
Phase 2: Report
Present findings to the user with actionable summary.
Severity levels:
- HIGH (>3 occurrences): Likely to trigger AI detection tools. Fix immediately.
- MEDIUM (1-3 occurrences): Noticeable to careful readers. Should fix.
- LOW (0 occurrences): Clean for this pattern.
AI Pattern Score:
- Count total pattern instances across all 27 categories.
- Compute density: instances per 1000 words.
- Target: < 2.0 instances per 1000 words.
Gate: Present the report and ask the user which patterns to fix. Default: fix all HIGH and MEDIUM.
Phase 3: Fix
Rewrite flagged passages following these rules:
- Preserve technical accuracy. Every number, statistic, p-value, confidence interval, and clinical fact must remain identical.
- Preserve citation density. Do not remove or relocate citations.
- Preserve formal academic register. Do not make the text casual or conversational.
- Do not force casualness. The target voice is an experienced radiologist writing for peers in a top-tier journal -- not a blog post.
- Keep domain-specific terminology intact. "Convolutional neural network," "apparent diffusion coefficient," "Fleiss' kappa" stay as-is.
- Never introduce new claims or remove existing ones.
- Vary sentence structure. Mix short declarative sentences (8-12 words) with longer ones
(25-35 words). Avoid uniform length. A de-AI pass tends to flatten rhythm — it shortens the
long sentences and pads the short ones toward a comfortable middle, which is itself a tell.
scripts/check_sentence_variety.pyverifies this rule in Phase 4. - Use active voice where natural. "We analyzed" rather than "Analysis was performed."
- Thin out antithesis and cleft constructions (Pattern 27, the M2 heuristic). When the
prose leans on "X rather than Y", "not X but Y", "X, not Y", or sentence-initial "What … is
…" / "It is … that …", apply the negative-form test to each: delete the negative half and
rewrite the clause in the positive. If a fact disappears, the contrast was functional — keep
it; if nothing disappears, it was decoration — cut it. Judge by the manuscript's overall
rate, not instance by instance, and keep two or three for emphasis. Rewrite clefts in plain
subject-verb order ("What matters is X" → "X matters").
scripts/check_rhetorical_density.py(in/self-review) measures this in Phase 4. (M2 test adapted from the SNL-UCSB paper-writing skill, MIT.)
Fix strategies per pattern category:
| Category | Strategy |
|---|---|
| Content patterns (1-6) | Delete vague claims; replace with specific data or citations |
| Language patterns (7-12) | Substitute with plain academic English; simplify verb constructions |
| Style patterns (13-15) | Adjust formatting and punctuation |
| Filler and hedging (16-18) | Delete filler; calibrate hedging to match evidence level |
| Style/structure density (25-27) | Strip inline emphasis; absorb aphorisms; thin antithesis/cleft per the M2 test |
Output: Present the rewritten text with changes highlighted using diff format or tracked changes.
Phase 4: Verify
Keep the pre-rewrite text. Before editing in place, copy the original somewhere the fidelity
check can read it (cp manuscript.md /tmp/pre_humanize.md). Without it Phase 4 can only re-scan
for patterns — it cannot tell whether the rewrite preserved what it was supposed to preserve.
Run both deterministic checks, then re-scan the rewritten text using the same 27 patterns.
python3 "${CLAUDE_SKILL_DIR}/scripts/check_rewrite_fidelity.py" \
--before /tmp/pre_humanize.md --after manuscript.md \
--out qc/rewrite_fidelity.json --strict
python3 "${CLAUDE_SKILL_DIR}/scripts/check_sentence_variety.py" \
--manuscript manuscript.md --out qc/sentence_variety.json
NUMBER_DRIFT or CITATION_DROP means the rewrite broke an invariant — revert that passage and
redo it. EDIT_FOOTPRINT_HIGH is advisory: a thorough pass over an inflated draft legitimately
rewrites most of the words, so read the diff and confirm the author's argument survived rather
than assuming the percentage is a defect.
Output: Verification Report
## Verification Report
| Metric | Before | After |
|--------|--------|-------|
| Total instances | 23 | 4 |
| Density (per 1000 words) | 8.2 | 1.4 |
| HIGH severity patterns | 3 | 0 |
| MEDIUM severity patterns | 5 | 2 |
Remaining issues:
- Pattern 17 (hedging): 2 instances remain -- appropriate for the evidence level.
Verdict: PASS (density < 2.0)
If the density remains above 2.0, run another fix-verify cycle (max 3 rounds).
The 27 Detection Patterns
Content Patterns
| # | Pattern | What to look for | Fix |
|---|---|---|---|
| 1 | Significance inflation | "pivotal," "evolving landscape," "underscores the critical importance" | Delete or state the specific importance with data |
| 2 | Notability claims | "landmark trial," "renowned investigators," "groundbreaking" | Remove; let the data speak |
| 3 | Superficial -ing analyses | "highlighting the cardioprotective effects," "underscoring the broad applicability" | End the sentence at the data; start a new sentence for interpretation |
| 4 | Promotional language | "remarkable findings," "dramatic reductions," "profound impact" | State the actual numbers neutrally |
| 5 | Vague attributions | "Studies have shown," "Experts argue," "Several publications" | Cite the specific study |
| 6 | Formulaic challenges sections | "Despite challenges... future outlook... continues to provide" | State specific limitations factually |
Language Patterns
| # | Pattern | What to look for | Fix |
|---|---|---|---|
| 7 | AI vocabulary words | Additionally, crucial, delve, enhance, fostering, pivotal, showcase, tapestry, underscore, landscape (abstract) | Delete or replace with plain English |
| 8 | Copula avoidance | "serves as," "stands as," "represents a" | Use "is" |
| 9 | Negative parallelisms | "not only X but also Y" | "X and Y" |
| 10 | Rule of three overuse | Forcing ideas into groups of three repeatedly | Use natural grouping (2, 4, 5 items) |
| 11 | Synonym cycling | patients/participants/subjects/individuals | Pick one term, use consistently |
| 12 | False ranges | "from improved renal function to enhanced cardiac outcomes" | List the specific outcomes directly |
Style Patterns
| # | Pattern | What to look for | Fix |
|---|---|---|---|
| 13 | Em dash overuse | More than 2 em dashes per page | Use parentheses or restructure. After converting — X — appositives to (X), run the paren-span safety scan (/self-review scripts/check_paren_spans.py): a bulk conversion can pair two unrelated dashes across a sentence boundary and wrap a whole sentence (or an ordinal "Sixth, …" limitation) inside one parenthesis — paren-balanced but broken, so a balance check misses it. Operate per-sentence; never match across . |
| 14 | Title case in headings | "Statistical Analysis And Primary Endpoints" | Sentence case per journal style |
| 15 | Curly quotation marks | Curly quotes from ChatGPT | Straight quotes |
Filler and Hedging
| # | Pattern | What to look for | Fix |
|---|---|---|---|
| 16 | Filler phrases | "It is important to note that," "In order to," "Due to the fact that" | Delete the filler; state the content directly |
| 17 | Excessive hedging | "may potentially suggest the possibility" | Choose the appropriate certainty level: "suggests" |
| 18 | Generic positive conclusions | "The future looks bright," "continues to reshape," "paves the way" | State the specific next step or implication |
Senior MA Reviewer and Typographic Patterns
| # | Pattern | What to look for | Fix |
|---|---|---|---|
| 19 | § (section sign) marker | "as in §2.3", "(see §Discussion)", "§Results" | Delete or replace with section name ("Methods", "Results") — grep -c "§" = 0 |
| 20 | Methods/Results self-reference parenthetical | "(Methods §X)", "(Results §3.1)", "(Methods, Section 2.3)" | Drop the parenthetical or shorten to "(see Methods)" |
| 21 | AI Disclosure boilerplate (body) | "## Artificial Intelligence Disclosure", "Generative AI was not used to create..." in manuscript body | Remove from body → place in cover letter / submission form only (per ~/.claude/rules/journal-ai-image-policies.md) |
| 25 | Inline-emphasis over-use (typographic over-signposting) | Single-word italics (into, passive, same), whole-clause italics (a redesign of the relationship itself), bold used mid-paragraph to signpost | Remove inline emphasis; keep only legitimate italics — statistical symbols (P, t, n), Latin (in vivo, et al.), gene/species (BRCA1). A bold run-in subheading at line start is fine (Nature/npj style) |
Response-Letter Patterns (R2R)
Patterns 22-24 apply only when scanning a response-to-reviewers letter or editor cover letter,
not manuscript bodies. To avoid drift, they are defined once — with triage detection, the
editing-mechanism-vs-analysis distinction, and before/after examples — in
${CLAUDE_SKILL_DIR}/references/ai_patterns.md (Response-Letter Patterns section). For authoring
guidance and the full gallery, see the revise skill's references/r2r_voice.md.
Section-Specific Focus
When scanning a full manuscript, prioritize these patterns per section:
| Section | Priority Patterns | Reason |
|---|---|---|
| Abstract | ALL (1-21, 25) | Most visible section; most scrutinized for AI patterns |
| Introduction | 1, 2, 5, 7, 12 | AI inflates background importance and uses vague attributions |
| Methods | 8, 16 | Methods should be straightforward; copula avoidance and filler are common |
| Results | 3, 4, 6, 10, 11 | AI adds interpretive -ing clauses and promotional language to results |
| Discussion | 1, 5, 6, 17, 18 | AI produces formulaic discussions with excessive hedging |
| Conclusion | 1, 18 | AI generates generic positive conclusions |
| Methods (MA / SR) | 19, 20, 21 | § markers, self-reference parentheticals, AI Disclosure boilerplate are senior-MA-reviewer red flags |
| Discussion (MA / SR) | 19, 20 | Self-reference parentheticals especially common when discussing methods |
| Body (any) | 21 | AI Disclosure belongs in cover letter / submission form, not manuscript body |
| Response to Reviewers / cover letter | 22, 23, 24 (+ 13, 16, 19) | Editing-mechanism narration, internal draft line numbers, and tooling leaks are the dominant tells in machine-drafted rebuttals (see ai_patterns.md R2R section) |
Interaction with Other Skills
| Calling skill | When this skill is invoked |
|---|---|
/write-paper |
Phase 7 (Polish) -- automatic scan before submission |
/peer-review |
When reviewing one's own manuscript for AI patterns |
/revise |
When drafting response-to-reviewers letters and cover letters -- patterns 22-24 are the enforced gate before submission |
When called by another skill, return the verification report so the calling skill can check the pass/fail status.
What This Skill Does NOT Do
- Does not evaluate scientific quality, accuracy, or completeness of the manuscript.
- Does not add new content or citations.
- Does not assess journal compliance or formatting.
- Does not translate between languages.
- Only removes AI patterns; does not perform general copy-editing.
Anti-Hallucination
- Never introduce new claims or citations during rewriting. Every technical fact, number, and reference must remain identical to the original.
- Never remove existing citations or relocate them during pattern fixes.
- Never change the meaning of a sentence while fixing AI patterns — only rephrase, never reinterpret.
- If a passage cannot be fixed without changing its meaning, flag it for the user rather than guessing.
Gates
| Gate | Severity | Trigger | Action on fail |
|---|---|---|---|
| AI-pattern density target | ADVISORY | density > 2.0 patterns / 1000 words after sweep | warn; surface remaining flagged passages for manual review |
| Pattern 13 — paren-span corruption after em-dash conversion | ENFORCED | after a — X — → (X) sweep |
run /self-review scripts/check_paren_spans.py --strict; PAREN_SPAN_ORDINAL / PAREN_SPAN_SENTENCE means a conversion wrapped a sentence/ordinal inside parens — fix before finalizing |
Pattern 19 — § symbol |
ENFORCED (senior MA reviewer prep) | grep -c "§" manuscript.md > 0 |
auto-strip; verify post-rewrite count == 0 |
Pattern 20 — (see Methods §X) self-reference |
ENFORCED | match found | rewrite to direct section name reference |
| Pattern 21 — AI Disclosure paragraph in body | ENFORCED | "Generative AI was not used..." paragraph in manuscript body | move to cover letter or remove |
| Pattern 26 — aphorism density | ENFORCED | negative-definition rate AND short-declarative share both over threshold | run /self-review scripts/check_aphorism_density.py --manuscript manuscript.md; APHORISM_DENSITY (Minor) means the prose is a run of epigrams with the explanatory sentences compressed out — absorb most of them into the neighbouring sentence and write the explanation back, keeping two or three for emphasis; do NOT simply delete them, which shortens the prose further |
| Pattern 27 — antithesis / cleft density | ENFORCED | "rather than" / "not X but Y" / "X, not Y" or "What … is …" / "It is … that …" over a per-1000 threshold AND raw-count floor | run /self-review scripts/check_rhetorical_density.py --manuscript manuscript.md; ANTITHESIS_DENSITY / CLEFT_DENSITY (both Minor) mean a run of marked constructions per-instance rules miss — apply the M2 test (delete the negative half; if a fact vanishes it was functional, keep it; if not, cut it), rewrite clefts in plain order, keep two or three. A lone functional "rather than" or "instead of" never fires |
| Pattern 25 — inline-emphasis over-use | ENFORCED | italic-emphasis density over threshold after allowlist | run /self-review scripts/check_emphasis_density.py --manuscript manuscript.md; EMPHASIS_OVERUSE (Minor) means strip inline italics (keep only stat symbols / Latin / gene-species); whole-clause italics are the strongest tell |
| Patterns 22-24 — R2R editing-mechanism / draft line-number / tooling leak | TRIAGE (response letters); § = 0 hard |
detection greps in ai_patterns.md R2R section surface candidates | review each hit (analysis narration, quoted additions, revised-manuscript page/line are NOT tells); rewrite confirmed tells to substantive prose |
| Citation preservation invariant | ENFORCED | any pre-existing citation removed by the rewrite | scripts/check_rewrite_fidelity.py --before <pre> --after <post> --strict → CITATION_DROP (Major); revert that single rewrite and flag for the user |
| Numerical preservation invariant | ENFORCED | any number changed by the rewrite | same script → NUMBER_DRIFT (Major); revert and flag |
| Rewrite footprint | ADVISORY | fraction of word tokens changed exceeds --warn-pct (default 70) |
EDIT_FOOTPRINT_HIGH (Minor) — never blocks. Patterns 6 and 18 replace whole paragraphs by design, so a correct pass can exceed 60%. Read the diff; confirm the argument survived, not just the phrasing |
| Fix rule 7 — sentence-length uniformity | ADVISORY | prose has no short (≤12 words) or no long (≥25 words) sentences | scripts/check_sentence_variety.py --manuscript <file> → SENTENCE_UNIFORM (Minor); break up or combine sentences until both bands exist. Silent below 15 sentences |
Global-rule references
Some passages in this skill cite a path of the form ~/.claude/rules/<name>.md. Those are the
maintainer's personal global rules, kept outside this repository. They are not shipped with
this skill and will not exist on your machine; they appear only as provenance for where a
convention came from. If one of them looks like it is standing in for an instruction you actually
need, that is a bug — please open an issue, because the instruction belongs here.
Files (medsci-skills)
-
references
-
ai_patterns.md 40.4 KB
# AI Writing Pattern Reference for Medical/Radiology Manuscripts Detailed reference for the 27 AI writing patterns, with expanded examples and suggested rewrites specifically tailored for medical imaging and radiology research. Patterns 1-18 are the general set; 19-21 are senior-MA-reviewer red flags; 25-27 are style/structure tells that apply to any prose — typographic (25), rhythmic (26), and syntactic (27); 22-24 are response-to-reviewers (R2R) letter patterns. Sources (grounding differs by pattern — treat accordingly): - Patterns 1-18: matsuikentaro1/humanizer_academic (English 18 patterns) + Wikipedia, "Signs of AI writing". Inherited lists — the thresholds they carry (em-dash per 1000 words, overall density) are conventional, not measured on a medical-manuscript corpus. - Patterns 19-21, 22-24: observed in this user's own circulation and rebuttal rounds (senior-MA-reviewer comments; machine-drafted response letters). - Pattern 25: observed in a co-author's track-changed edits of AI-drafted prose. - Patterns 26-27: a prose-rhythm (26) and a prose-structure (27) tell, found when a native-fluent reader flagged AI-drafted argumentative prose that had already cleared the lexical and typographic sweeps. Pattern 27's antithesis rewrite test (M2) is adapted from the SNL-UCSB paper-writing skill's `gate_mechanical.md` (MIT-licensed). - Adapted for radiology/medical imaging context --- ## Content Patterns ### Pattern 1: Significance Inflation AI inflates importance with vague claims about "broader impact" instead of stating specific clinical or scientific significance. **Watch words:** pivotal, evolving landscape, underscores, highlights its importance, setting the stage for, deeply rooted, focal point, indelible mark, paradigm shift, unprecedented | # | BAD (AI-generated) | GOOD (Human-written) | |---|-------------------|---------------------| | 1 | "CT plays a pivotal role in the evolving landscape of oncologic imaging" | "CT is the primary imaging modality for cancer staging" | | 2 | "This underscores the critical importance of early detection in improving patient outcomes" | "Early detection reduced mortality by 20% in the NLST trial" | | 3 | "AI represents a paradigm shift in radiology practice" | "AI-assisted detection increased sensitivity from 0.78 to 0.91" | | 4 | "Deep learning has made an indelible mark on medical image analysis" | "Deep learning models have achieved diagnostic accuracy comparable to radiologists in several tasks" | | 5 | "Setting the stage for transformative advances in precision radiology" | "These methods may improve lesion detection in low-dose protocols" | **Radiology-specific note:** Radiology papers are particularly susceptible to this pattern in introductions discussing AI/deep learning. State the specific performance metric or clinical outcome instead. --- ### Pattern 2: Notability Claims AI labels studies, institutions, or researchers with unearned superlatives. **Watch words:** landmark, renowned, prestigious, groundbreaking, impressive, seminal, pioneering, state-of-the-art | # | BAD | GOOD | |---|-----|------| | 1 | "This groundbreaking study from a prestigious institution" | "In a multicenter study of 12,000 patients (Smith et al., 2024)" | | 2 | "The landmark NLST trial" | "The National Lung Screening Trial (NLST)" | | 3 | "Using a state-of-the-art deep learning architecture" | "Using a ResNet-50 model pretrained on ImageNet" | | 4 | "These impressive results demonstrate" | "The AUC was 0.94 (95% CI: 0.91-0.97)" | **Radiology-specific note:** "State-of-the-art" is especially overused in AI radiology papers. Name the specific architecture and training approach instead. --- ### Pattern 3: Superficial -ing Analyses AI appends "-ing" participial phrases to sentences, creating fake analytical depth without adding information. **Watch words (at end of sentence):** highlighting, underscoring, emphasizing, showcasing, fostering, reflecting, contributing to, demonstrating, suggesting, indicating | # | BAD | GOOD | |---|-----|------| | 1 | "The AUC was 0.93 (95% CI: 0.90-0.96), highlighting the strong diagnostic performance of the model" | "The AUC was 0.93 (95% CI: 0.90-0.96)." | | 2 | "Sensitivity improved from 78% to 91%, underscoring the value of AI-assisted detection" | "Sensitivity improved from 78% to 91%. This improvement corresponded to detection of 13 additional malignant nodules per 1000 screens." | | 3 | "Inter-reader agreement was excellent (ICC = 0.92), demonstrating the reproducibility of the measurement technique" | "Inter-reader agreement was excellent (ICC = 0.92; 95% CI: 0.88-0.95)." | | 4 | "Processing time decreased by 40%, showcasing the efficiency gains" | "Processing time decreased by 40% (from 5.2 to 3.1 minutes per case)." | | 5 | "The false-positive rate decreased to 3.2%, reflecting improved specificity" | "The false-positive rate decreased to 3.2%." | **Fix strategy:** End the sentence at the data. If interpretation is needed, start a new sentence with a specific claim supported by the numbers. --- ### Pattern 4: Promotional Language AI uses adjectives and adverbs that promote rather than describe. **Watch words:** remarkable, dramatic, stunning, profound, extraordinary, exceptional, breathtaking, robust (unless describing a statistical method), comprehensive, innovative, novel (overused) | # | BAD | GOOD | |---|-----|------| | 1 | "Our model achieved remarkable diagnostic accuracy" | "Our model achieved an AUC of 0.95" | | 2 | "A dramatic reduction in false-positive rates was observed" | "The false-positive rate decreased from 12.3% to 4.1%" | | 3 | "This comprehensive framework provides a robust solution" | "This framework reduced processing time by 60% while maintaining accuracy" | | 4 | "The novel deep learning approach demonstrated exceptional performance" | "The proposed approach outperformed the baseline by 0.08 AUC points (p = 0.003)" | | 5 | "A robust and comprehensive evaluation was conducted" | "We evaluated the model on three external datasets" | **Radiology-specific note:** "Robust" is acceptable when describing a statistical method (e.g., "robust standard errors") but not as a general-purpose adjective for frameworks, pipelines, or results. --- ### Pattern 5: Vague Attributions AI attributes claims to unnamed sources instead of citing specific studies. **Watch words:** Studies have shown, Experts argue, Some researchers, It is widely accepted, Several publications, The literature suggests, It has been reported, Research indicates | # | BAD | GOOD | |---|-----|------| | 1 | "Studies have shown that AI can improve diagnostic accuracy" | "In a meta-analysis of 82 studies, AI systems achieved pooled sensitivity of 87% (Liu et al., 2019)" | | 2 | "It is widely accepted that MRI is superior for soft tissue contrast" | "MRI provides superior soft tissue contrast resolution compared with CT (reference)" | | 3 | "Several studies have demonstrated the utility of radiomics" | "Aerts et al. (2014) demonstrated that radiomic features predicted outcomes in lung and head-and-neck cancer" | | 4 | "Research indicates that prompt engineering affects LLM output quality" | "Prompt structure affected diagnostic accuracy by up to 15 percentage points in GPT-4V evaluations (Wu et al., 2024)" | | 5 | "It has been reported that CAD systems reduce reading time" | "Park et al. (2023) reported a 25% reduction in reading time with AI-assisted detection" | **Fix strategy:** Replace every vague attribution with a specific citation. If you do not know the specific reference, flag it for the user to fill in with `[CITE NEEDED]`. --- ### Pattern 6: Formulaic Challenges Sections AI produces template limitation/future-work sections that could apply to any paper. **Watch words:** Despite these limitations, Future outlook, Continues to provide valuable insights, Further research is warranted, More studies are needed | # | BAD | GOOD | |---|-----|------| | 1 | "Despite these limitations, our study provides valuable insights into AI-assisted diagnosis" | "The single-center design limits generalizability to community practice settings where case mix and image quality differ" | | 2 | "Further research is warranted to validate these findings" | "External validation on a multi-institutional dataset with variable scanner protocols is needed before clinical deployment" | | 3 | "More studies are needed to fully understand the potential of this approach" | "Prospective evaluation comparing AI-assisted and conventional reading in a screening population would quantify the clinical impact" | | 4 | "Despite challenges, the future of AI in radiology is promising" | "Integration into the clinical PACS workflow remains an engineering challenge requiring vendor collaboration" | **Fix strategy:** State the specific limitation, its consequence, and the specific study design that would address it. --- ## Language Patterns ### Pattern 7: AI Vocabulary Words Words whose frequency increased markedly in post-2023 AI-generated text. Their presence at high density signals AI authorship. **High-signal words to eliminate or replace:** | AI Word | Replacement | |---------|-------------| | Additionally | (delete, or use "In addition," sparingly) | | Furthermore | (delete, or restructure the sentence) | | Moreover | (delete) | | Crucial | Important (or delete) | | Delve | Examine, analyze, investigate | | Enhance | Improve | | Fostering | Promoting, supporting (or delete) | | Garner | Receive, attract | | Highlight (verb) | Show, demonstrate (or delete) | | Interplay | Interaction, relationship | | Intricate | Complex (or delete if unnecessary) | | Key (adjective, overused) | Important, main, primary | | Landscape (abstract) | Field, domain (or delete) | | Leverage | Use, apply | | Multifaceted | (delete; describe the specific facets) | | Pivotal | Important, central | | Showcase | Show, demonstrate | | Tapestry | (delete entirely) | | Testament | Evidence, indication | | Underscore (verb) | (delete; state the point directly) | | Utilize | Use | | Valuable | Useful (or delete) | **Radiology examples:** | BAD | GOOD | |-----|------| | "Additionally, we utilized a novel architecture to enhance detection" | "We used a ResNet-50 to improve detection" | | "This crucial finding underscores the pivotal role of AI" | "This finding supports the use of AI" | | "We delved into the intricate interplay between image quality and model performance" | "We examined how image quality affected model performance" | **Rule:** If more than 3 of these words appear in a single page, the section needs revision. --- ### Pattern 8: Copula Avoidance (Avoiding "is") AI substitutes elaborate verb constructions for simple "is/are." **Watch words:** serves as, stands as, marks, represents [a], boasts, features, offers [a], constitutes, functions as | # | BAD | GOOD | |---|-----|------| | 1 | "CT serves as the primary imaging modality for lung cancer screening" | "CT is the primary imaging modality for lung cancer screening" | | 2 | "This metric represents a significant improvement" | "This metric is a significant improvement" | | 3 | "The dataset features 12,000 annotated images" | "The dataset contains 12,000 annotated images" | | 4 | "DWI stands as the most sensitive sequence for acute stroke detection" | "DWI is the most sensitive sequence for acute stroke detection" | | 5 | "This architecture constitutes a major advance" | "This architecture is a major advance" | --- ### Pattern 9: Negative Parallelisms AI overuses "Not only X but also Y" constructions. | # | BAD | GOOD | |---|-----|------| | 1 | "The model not only improved sensitivity but also reduced false positives" | "The model improved sensitivity and reduced false positives" | | 2 | "This approach not only streamlines workflow but also enhances diagnostic confidence" | "This approach reduces reading time by 30% and improves diagnostic confidence" | | 3 | "AI not only assists in detection but also aids in characterization" | "AI assists in both detection and characterization" | **Threshold:** More than 1 per section is a red flag. --- ### Pattern 10: Rule of Three Overuse AI forces ideas into groups of exactly three. | # | BAD | GOOD | |---|-----|------| | 1 | "accuracy, efficiency, and reproducibility" (repeated across 4 paragraphs) | Vary: sometimes mention two, sometimes four, as the content demands | | 2 | "detection, segmentation, and classification" | "detection and segmentation" (if classification is not relevant to the point) | | 3 | "clinical, technical, and educational implications" | Group naturally: state the specific implications rather than labeling categories | | 4 | "sensitivity, specificity, and accuracy" repeated 5 times | Report each metric where relevant; do not always bundle all three | **Detection method:** Search for the pattern `X, Y, and Z` -- if it appears more than 3 times in a section, the author (or AI) is forcing triples. --- ### Pattern 11: Synonym Cycling (Elegant Variation) AI avoids repeating the same word by cycling through synonyms, which creates inconsistency in medical writing where precision matters. | # | BAD | GOOD | |---|-----|------| | 1 | "patients... participants... subjects... individuals" | "patients" (consistent throughout, matching IRB language) | | 2 | "lesions... abnormalities... findings... pathology" | "lesions" (if referring to the same thing) | | 3 | "radiologists... readers... interpreters... physicians" | "radiologists" or "readers" (pick one per context) | | 4 | "images... scans... examinations... studies" | "examinations" for the procedure, "images" for the pictures | | 5 | "model... algorithm... system... tool... framework" | "model" (if it is a model) | **Radiology-specific note:** Inconsistent terminology is a real problem in radiology manuscripts. "Lesion" and "finding" have different meanings; "examination" and "image" are not interchangeable. Pick the most precise term and use it consistently. --- ### Pattern 12: False Ranges AI uses "from X to Y" where X and Y are not on a meaningful continuum. | # | BAD | GOOD | |---|-----|------| | 1 | "from improved detection to enhanced workflow efficiency" | "improved detection and workflow efficiency" | | 2 | "ranging from data augmentation to transfer learning" | "including data augmentation and transfer learning" | | 3 | "from clinical practice to research applications" | "in clinical practice and research" | --- ## Style Patterns ### Pattern 13: Em Dash Overuse AI uses em dashes far more frequently than human academic writers. **Threshold:** More than 2 em dashes per 1000 words. | # | BAD | GOOD | |---|-----|------| | 1 | "The model -- trained on 50,000 images -- achieved an AUC of 0.94" | "The model, trained on 50,000 images, achieved an AUC of 0.94" | | 2 | "Three features -- size, shape, and margin -- were selected" | "Three features (size, shape, and margin) were selected" | | 3 | "CT -- the most widely used modality -- remains essential" | "CT, the most widely used modality, remains essential" | --- ### Pattern 14: Title Case in Headings AI capitalizes all major words in section headings. Most medical journals use sentence case. | # | BAD | GOOD | |---|-----|------| | 1 | "Statistical Analysis And Primary Endpoints" | "Statistical analysis and primary endpoints" | | 2 | "Deep Learning Model Architecture" | "Deep learning model architecture" | | 3 | "Inter-Reader Agreement Assessment" | "Inter-reader agreement assessment" | **Note:** Follow the target journal's style guide. Most radiology journals (Radiology, AJR, European Radiology) use sentence case for section headings. --- ### Pattern 15: Curly Quotation Marks ChatGPT and similar tools produce curly (smart) quotes. Many journal submission systems and LaTeX workflows expect straight quotes. | BAD | GOOD | |-----|------| | \u201csensitivity\u201d | "sensitivity" | | \u2018specificity\u2019 | 'specificity' | **Fix:** Find-and-replace all curly quotes with straight quotes before submission. --- ## Filler and Hedging Patterns ### Pattern 16: Filler Phrases Empty phrases that add words without adding meaning. | # | BAD | GOOD | |---|-----|------| | 1 | "It is important to note that the AUC exceeded 0.90" | "The AUC exceeded 0.90" | | 2 | "It is worth noting that sensitivity decreased in smaller lesions" | "Sensitivity decreased in smaller lesions" | | 3 | "In order to evaluate diagnostic performance" | "To evaluate diagnostic performance" | | 4 | "Due to the fact that the dataset was imbalanced" | "Because the dataset was imbalanced" | | 5 | "At the present time, no consensus exists" | "No consensus exists" | | 6 | "With respect to image quality" | "For image quality" | | 7 | "The model has the ability to detect" | "The model can detect" | | 8 | "In the context of emergency radiology" | "In emergency radiology" | **Detection method:** Search for "It is" at sentence start, "In order to," "Due to the fact," "With respect to," "has the ability to," "In the context of." --- ### Pattern 17: Excessive Hedging AI stacks multiple hedging words, making claims weaker than the evidence supports. | # | BAD | GOOD | |---|-----|------| | 1 | "may potentially suggest the possibility of improved outcomes" | "improved outcomes" (if the data clearly shows it) or "suggests improved outcomes" (if uncertain) | | 2 | "It could be argued that this might have some impact" | "This may affect diagnostic accuracy" | | 3 | "These findings seem to indicate that AI may perhaps assist" | "These findings indicate that AI assists" (if the data supports it) | **Calibration guide for radiology manuscripts:** - Strong evidence (p < 0.001, large effect, prospective design): State as fact. "AI improved detection." - Moderate evidence (p < 0.05, moderate effect, retrospective): Single hedge. "AI may improve detection." - Weak evidence (trend, small sample, pilot, single-center): Measured hedge. "These preliminary results suggest AI may improve detection." - Exploratory (secondary analysis, post hoc): Explicit qualifier. "In exploratory analysis, AI-assisted reading was associated with higher sensitivity." --- ### Pattern 18: Generic Positive Conclusions AI ends papers with content-free optimistic statements. | # | BAD | GOOD | |---|-----|------| | 1 | "The future looks bright for AI-assisted radiology" | (delete) | | 2 | "This paves the way for transformative advances in diagnostic imaging" | "Prospective validation in a screening population is the next step before clinical implementation" | | 3 | "AI continues to reshape the landscape of medical imaging" | "AI-assisted detection reduced missed cancers by 12% in this retrospective analysis" | | 4 | "These findings open new avenues for research" | "Future work should evaluate the model on external datasets with heterogeneous scanner protocols" | | 5 | "This work lays the foundation for future innovations" | "The trained model and evaluation code are publicly available at [URL]" | **Fix strategy:** Replace with the single most specific implication or the concrete next step. --- ## Senior MA Reviewer and Typographic Patterns ### Pattern 19: § (Section-Sign) Marker AI models frequently use the `§` symbol to point to sections in the body text. A senior MA reviewer recognizes this immediately as an "AI pattern" — a LaTeX-style notation that is almost never used in Korean or US medical-journal manuscripts. | # | BAD | GOOD | |---|-----|------| | 1 | "as described in §2.3" | "as described in the Methods" | | 2 | "(see §Discussion)" | "(see Discussion)" | | 3 | "§Results" | "Results" | **Detection:** `grep -c "§" manuscript.md` → must be 0. **Fix strategy:** Delete every § or replace it with the section name (`Methods`, `Results`, `Discussion`). --- ### Pattern 20: Methods/Results Self-Reference Parenthetical Self-reference parentheticals of the form `(Methods §X)`, `(Results §Y)`, `(Methods, Section 2.3)`. Frequently co-occurs with Pattern 19 (§). A reviewer judges that there is no need to cross-reference one's own section. | # | BAD | GOOD | |---|-----|------| | 1 | "We applied bootstrap resampling (Methods §2.3) to..." | "We applied bootstrap resampling (described in Methods) to..." or simply delete | | 2 | "The pooled estimate (Results §3.1) was..." | "The pooled estimate was..." | | 3 | "As shown in Table 1 (Methods)..." | "As shown in Table 1..." | **Detection:** `grep -inE "\((Methods|Results|Discussion|Introduction)\s*§" manuscript.md` → 0 lines. **Fix strategy:** Delete the parenthetical when the flow is self-evident. When an explicit pointer is needed, shorten to "(Methods)" or "(see Methods)". --- ### Pattern 21: AI Disclosure Boilerplate (Body) Boilerplate paragraphs such as "Artificial Intelligence Disclosure" / "Generative AI was not used to create..." / "AI Acknowledgement" appearing in the manuscript body. These are needed on submission forms and cover letters, but placing them in the body reads to a reviewer as a declaration that "this was written by AI" — an AI-generated signal. | # | BAD | GOOD | |---|-----|------| | 1 | An "## Artificial Intelligence Disclosure" paragraph at the end of the body | Delete the whole paragraph → state it only in the cover letter or submission form | | 2 | "Generative AI was not used to create, modify, or alter any images, figures, or tables in this manuscript." (in body Methods) | (delete) — the `~/.claude/rules/journal-ai-image-policies.md` boilerplate belongs only in the cover letter | | 3 | "We acknowledge the use of ChatGPT for language editing" in the Acknowledgments section | Move to the cover letter per journal policy, or reduce to "Language editing was performed" | **Detection:** `grep -inE "artificial intelligence disclosure|generative ai was not used|ai acknowledg(e)?ment" manuscript.md` → 0 lines (body). **Fix strategy:** Remove from the body → keep only on the submission form / cover letter. Exception only when the journal requires an in-body statement. --- ### Pattern 25: Inline-Emphasis Over-Use (Typographic Over-Signposting) LLM-drafted prose italicises words the sentence already stresses. A human copy-editor strips almost all of it — which is how this pattern was found, in a co-author's track-changed edits of an AI-drafted section. Unlike Patterns 19-21 this is not senior-MA-specific; it applies to any prose, including response letters. **Watch for:** single-word italics (*into*, *passive*, *same*, *not*), whole-clause italics (*a redesign of the relationship itself*), bold used mid-paragraph to signpost a phrase. | # | BAD | GOOD | |---|-----|------| | 1 | "The model was trained *on* the derivation cohort, not *within* it." | "The model was trained on the derivation cohort, not within it." | | 2 | "This is *a fundamental shift in how the reference standard is constructed*." | "This changes how the reference standard is constructed." | | 3 | "Sensitivity improved, but **only in the subgroup with prior imaging**." | "Sensitivity improved only in the subgroup with prior imaging." | **Legitimate italics — never strip these:** statistical symbols (*P*, *t*, *n*, *F*, *r*), Latin (*in vivo*, *et al.*, *post hoc*), gene and species names (*BRCA1*, *E. coli*), journal titles. A **bold run-in subheading** at line start is correct Nature/npj style (`manuscript-style-classical.md` §1.2) and is not counted. **Detection:** `/self-review` `scripts/check_emphasis_density.py --manuscript manuscript.md` → `EMPHASIS_OVERUSE` (Minor). Counts non-allowlisted *italic* spans per 1,000 body words; bold is deliberately excluded so the gate does not fight the run-in-subheading rule. Fires only when density and raw count both clear a floor, so one stray italic in a short note is never flagged. A whole-clause italic span carries an escalation note — it is the strongest tell. **Fix strategy:** Delete the emphasis and let word order carry the stress. If the sentence genuinely needs the contrast, rewrite it so the contrast is structural rather than typographic. ### Pattern 26: Aphorism Density (Every Sentence Lands, None Explains) LLM-drafted argumentative prose writes in epigrams. Each sentence is built to be quotable, and the sentences that merely carry information forward — the ones a human writer puts between the good lines — are missing. Two co-occurring signals make this measurable: the **negative definition** (`X is not Y` as a whole short sentence) and a high share of **very short declaratives** used as punchlines. Found when an external reader said a heavily revised draft was "clearer, but still reads like AI", and the cause turned out to be rhythm rather than grammar. **Watch for:** "Authority is not cognition." "Involvement is not independence." "It did not." "It is not one." "It cost more than it paid." Any paragraph whose every sentence could be pulled out and put on a slide. | # | BAD | GOOD | |---|-----|------| | 1 | "Agreement is not confirmation. The circle does not merely overlap. It is dragged inward." | "Agreement here is not confirmation, because the tool is working from the reader's own framing; rather than overlapping the reader's error, its error is pulled toward it." | | 2 | "That answer is only half-built. It is not sufficient." | "That answer is only half-built, and the missing half is the part the safety argument actually rests on." | | 3 | "Involvement is not independence. Partial decorrelation is not independence either." | "Involvement is not independence, and partial decorrelation does not close the gap either, since the bound assumes the stronger property." | **Calibration.** Across eight published *npj Digital Medicine* Perspectives, cleaned to body prose, the negative-definition rate ran 0.00–0.45% of sentences (seven of eight were 0.00%) and the short-declarative share 0.94–10.47%. A manuscript at 2% and 24% is outside that range on both axes. **Detection:** `/self-review` `scripts/check_aphorism_density.py --manuscript manuscript.md` → `APHORISM_DENSITY` (Minor). Fires only when BOTH rates clear thresholds set above the observed published maxima, so ordinary emphatic prose does not trip it. Use `--calibrate` to regenerate thresholds on your own corpus; the shipped numbers come from argumentative Perspectives and another genre may sit elsewhere. **Fix strategy:** Do not delete the epigrams — two or three are what a reader remembers. Absorb most of them into the neighbouring sentence and write back the explanatory sentence that was compressed out. Deleting them instead of absorbing them shortens the prose further and makes the problem worse. ### Pattern 27: Antithesis-and-Cleft Density (Structural AI Tells) LLM-drafted argumentative prose over-builds two marked constructions that no per-instance rule can flag, because each single occurrence is grammatical and often functional: - **antithesis parallelism** — "authority *rather than* cognition", "*not* a check *but* a second road", "involvement, *not* independence". - **cleft / pseudo-cleft** — sentence-initial "*What* matters *is* …", "*It is* X *that* …". One of each is legitimate; a run of them is an epigram machine. Found when a native-fluent co-author's comprehension review flagged prose that had already cleared the em-dash, passive and vocabulary sweeps (Patterns 7, 13) — the residue was structural, not lexical (one draft carried 28 "rather than" and roughly ten sentence-initial clefts). Unlike Pattern 26 (whole-sentence negative definitions), this counts *within-sentence* antithesis markers and fronting constructions, and is a density measure — never a single instance. **Watch for:** "X rather than Y" (the dominant tic), "not X but Y", "X, not Y", "What X is Y", "It is X that Y". Do NOT touch "instead of" — it is the functional, non-decorative sibling of "rather than" and its presence is not a tell. | # | BAD (antithesis / cleft density) | GOOD (plain construction) | |---|---|---| | 1 | "The model earns trust by what it measures rather than by what it claims. What matters is the validation set, not the training curve. It is the external cohort, rather than the internal split, that carries the evidence." | "The model earns trust from what it measures. The validation set matters more than the training curve, and the external cohort carries the evidence the internal split cannot." | | 2 | "This is calibration, not discrimination. What the reader needs is a probability, rather than a rank." | "This is calibration rather than discrimination; the reader needs a probability, and a rank does not supply one." | | 3 | "It is the disagreement that informs, not the agreement." | "Disagreement between the two readers is what carries the information here." | **Calibration.** Across this toolkit's three published-quality demo manuscripts, "rather than" runs 1.4–3.8 per 1,000 body words and sentence-initial clefts are absent. The gate's thresholds (antithesis 6.0 / 1,000, cleft 2.5 / 1,000, each behind a raw-count floor) sit above that range, so a lone functional "rather than" or one pseudo-cleft never trips it. **Detection:** `/self-review` `scripts/check_rhetorical_density.py --manuscript manuscript.md` → `ANTITHESIS_DENSITY` / `CLEFT_DENSITY` (both Minor, independent). Each fires only when the per-1,000 rate AND the raw count both clear a floor, so functional use in ordinary prose does not trip it. **Fix strategy (M2 heuristic):** For each negative/antithesis construction, delete the negative half and rewrite the clause in the positive. If a fact disappears the contrast was functional — keep it; if nothing disappears it was decoration — cut it. Judge by the manuscript's overall rate, not instance by instance, and keep two or three for emphasis. Rewrite clefts in plain subject-verb order ("What matters is X" → "X matters"). The negative-form test is adapted from the SNL-UCSB paper-writing skill's `gate_mechanical.md` (MIT-licensed). --- ## Response-Letter Patterns (R2R) These three patterns are specific to response-to-reviewers (R2R) letters and editor cover letters. They rarely appear in manuscript bodies but dominate machine-drafted rebuttals, where the model narrates the editing process instead of the science. Apply them whenever the text under review is a response letter or cover letter. See the revise skill's `references/r2r_voice.md` for full before/after skeletons. Examples below are synthetic (a fictional deep-learning lung-nodule CT study). **Related (triage, not a fixed-string pattern):** *defensive over-elaboration* — pre-emptive cross-reviewer lobbying ("Reviewers 2 and 3 also accepted this"), defensive meta-comments ("we confirm this is unchanged and not softened"), manufactured paragraphs answering a satisfied reviewer, or a separate cover letter on an R2+ round when its content belongs in the response-letter head — is a succinctness / round-discipline issue, not a regex pattern, and is most common on R2+ rounds. The normative guidance lives in the revise skill (Step 5 + Response-Letter Voice), its `references/r2r_voice.md`, and the `rebuttal-letter-style` rule; humanize only cross-references it (no hard fail, no detection regex added here). ### Pattern 22: Editing-Mechanism / Change-Log Narration The response prose narrates *how the text was edited* — what was added, where, how many phrases were swapped, which pass produced it — instead of stating what changed and why. The reviewer reads this as auto-generated and as checklist-clearing rather than scientific engagement. **Scope — this targets editing-mechanism narration only (avoid over-flagging):** narrating a *new analysis you ran* ("we performed a sensitivity analysis restricted to one eye per patient, and the result held") is the science the reviewer asked for — never flag it. Likewise "we added a sentence to the Methods: '...'", structured `Response:` / `Changes made:` blocks, and `Original → Revised` before/after pairs are normal human conventions. The tell is the *editing mechanism* layered on top, not the act of describing, quoting, or locating a change. **Watch phrases (the tell):** version-prefixed edits ("v2 Methods adds one sentence"), "we softened six phrases", "demoted the term at all N locations", "a grep-and-soften pass", "the v2 revision changes", bare "No further manuscript change" stubs, "reframed via the vocabulary cascade". | # | BAD (editing-mechanism) | GOOD (substantive / science) | |---|---|---| | 1 | "v2 Methods adds one sentence: '...'. This is a short visible clarification rather than only in the Limitations." | "We agree the design is observational; we have added to the Methods: '...'" | | 2 | "We softened six over-interpretive phrases in Results and Discussion." | "We have rephrased the over-interpretive passages; for example, '...' now reads '...'." | | 3 | "No further manuscript change was applied." | "The existing Discussion text already addresses this; the relevant statement is '...'." | **Detection (triage, not auto-fail):** `grep -inE "v[0-9]+ .*(add|demote|soften|reframe)|softened [0-9a-z]+ phrases|no further (manuscript )?change|grep-and-soften|vocabulary cascade|demoted .* at all [0-9]+" response_to_reviewers.md` — review each hit and flag only genuine editing-mechanism narration, never analysis narration or quoted additions. **Fix strategy:** Delete the mechanism narration. State the substantive change and quote the new sentence; omit how it was found or made. ### Pattern 23: Internal Line-Number Reference Tone Pointing reviewers to internal draft/markdown line numbers ("(line 43)", "at lines 43, 49, 58, 60, 77–79"). These never match the reviewer's view of the revised manuscript and read as a diff log. Section names are what authors actually use. | # | BAD | GOOD | |---|-----|------| | 1 | "We clarified this at line 43." | "We clarified this in the Methods (Design subsection)." | | 2 | "Single-sentence clarifications were added at lines 43, 49, 58, 60, and 77–79." | "We added short clarifications to the Methods covering the design, the intervention, and the outcome definitions." | | 3 | "v2 line 127 retains this sentence and adds the adjustment after it." | "In the Results (Between-group comparison) we retained the original sentence and added the adjustment immediately after." | **Not a tell:** a **revised-manuscript** page/line ("page 7, lines 177-178") when the letter states once that all page/line numbers refer to the revised manuscript the reviewer is reading. The tell is the *internal draft* line number that will not match the reviewer's PDF. **Detection:** `grep -inE "\(line [0-9]+|at lines? [0-9]+|line [0-9]+(–|-)[0-9]+" response_to_reviewers.md` → review each hit; keep only those that demonstrably point to the revised manuscript. **Fix strategy:** Replace internal/draft line numbers with a section name; keep revised-manuscript page/line only if it matches what the reviewer sees. ### Pattern 24: Tooling / Scaffolding Leak Exposing internal tooling, verification mechanics, or draft scaffolding to the reviewer: grep counts, internal FIX/category codes, references to "the circulated bundle" or "the internal supplementary index", or `§` self-references carried into the response letter. | # | BAD | GOOD | |---|-----|------| | 1 | "Final grep verification returned zero occurrences across the circulated bundle." | (delete — describe the corrected wording instead) | | 2 | "Addressed via the FIX-1 vocabulary cascade." | "We replaced [old term] with [new term] throughout the manuscript." | | 3 | "These strings remain only in the internal supplementary index, which is not part of the circulated bundle." | (delete — never reference internal scaffolding to a reviewer) | | 4 | "as reframed in §Discussion" | "as reframed in the Discussion" | **Detection (triage, except `§`):** `grep -inE "grep verification|grep-and-soften|circulated bundle|internal (supplementary )?index|FIX-[0-9]|vocabulary cascade|§" response_to_reviewers.md cover_letter.md` — only `§` is a hard 0 (always a tell). The other terms can rarely be legitimate (e.g., "a cascade detector", "we grep-checked our own data pipeline"), so confirm each hit is an internal-tooling reference before flagging. **Fix strategy:** Strip confirmed references to internal tooling, verification passes, and draft scaffolding. The reviewer should see only the science and the substantive changes. --- ## Section-Specific Application Guide ### Abstract (ALL patterns) The abstract is the most visible section and the most likely to be checked for AI writing. Apply all applicable patterns (1-21 and 25) with zero tolerance. **Common abstract issues:** - Pattern 1 in the Background sentence. - Pattern 4 in the Results sentence ("demonstrated remarkable performance"). - Pattern 18 in the Conclusion sentence ("paves the way"). ### Introduction (Patterns 1, 2, 5, 7, 12) - Opening paragraph: Check for significance inflation (Pattern 1) and AI vocabulary (Pattern 7). - Literature review paragraph: Check for vague attributions (Pattern 5). - Gap statement: Check for notability claims (Pattern 2). ### Methods (Patterns 8, 16) - Methods should be the most straightforward section. Watch for copula avoidance ("serves as the reference standard" instead of "is the reference standard") and filler phrases. ### Results (Patterns 3, 4, 6, 10, 11) - After every statistical result, check for appended -ing clauses (Pattern 3). - Check for promotional adjectives before numbers (Pattern 4). - Check for synonym cycling of key terms (Pattern 11). ### Discussion (Patterns 1, 5, 6, 17, 18) - First paragraph: Check for significance inflation (Pattern 1). - Comparison paragraphs: Check for vague attributions (Pattern 5). - Limitations: Check for formulaic language (Pattern 6). - Final paragraph: Check for generic conclusions (Pattern 18) and excessive hedging (Pattern 17). ### Conclusion (Patterns 1, 18) - The conclusion should be 1-3 sentences stating the main finding and its specific implication. - No significance inflation, no generic optimism. ### Response to Reviewers / Cover letter (Patterns 22, 23, 24 — plus 13, 16, 19) - Response letters and cover letters are reviewer-facing argument, not change-logs. The dominant AI-tell here is the editing-mechanism register (Pattern 22), internal draft line-number pointers (Pattern 23), and tooling/scaffolding leaks (Pattern 24). - Also sweep for em dashes (13), filler phrases (16), and `§` markers (19). - Patterns 1-18 still apply where relevant, but 22-24 are the highest-yield checks for this document type. --- ## Quick Checklist (Pre-Submission) Run this checklist on the final manuscript before submission: - [ ] No "Additionally" / "Furthermore" / "Moreover" at sentence start (allow max 1 total) - [ ] No "pivotal" / "crucial" / "landscape" / "delve" / "utilize" / "leverage" - [ ] No "-ing" participial phrases appended to statistical results - [ ] No "serves as" / "stands as" / "represents a" (use "is") - [ ] No vague "Studies have shown" without a specific citation - [ ] No "not only X but also Y" (allow max 1 total) - [ ] No generic positive conclusions ("paves the way," "the future looks bright") - [ ] Consistent terminology throughout (no synonym cycling) - [ ] Em dashes: fewer than 2 per 1000 words - [ ] Hedging calibrated to evidence level (no stacked hedges) - [ ] Filler phrases eliminated ("It is important to note that," "In order to") - [ ] Straight quotation marks (not curly) - [ ] Sentence case in headings (unless journal requires title case) - [ ] AI pattern density < 2.0 per 1000 words - [ ] § (section sign): 0 occurrences (Pattern 19) — `grep -c "§"` = 0 - [ ] (Methods §X) / (Results §Y) self-reference: 0 occurrences (Pattern 20) - [ ] AI Disclosure boilerplate in body: 0 occurrences (Pattern 21) — cover letter / submission form only - [ ] Inline-emphasis over-use (Pattern 25) — `check_emphasis_density.py`; strip single-word and whole-clause italics, keep stat symbols / Latin / gene-species - [ ] Aphorism density (Pattern 26) — `check_aphorism_density.py`; a run of negative definitions plus very short declaratives; absorb most into neighbouring sentences, keep two or three - [ ] Antithesis / cleft density (Pattern 27) — `check_rhetorical_density.py`; "rather than" / "not X but Y" / "X, not Y" and sentence-initial "What … is …" / "It is … that …"; delete the negative half and rewrite positive, keep two or three - [ ] Sentence-length variety (SKILL.md Fix rule 7) — `check_sentence_variety.py`; short (8-12 words) and long (25-35 words) sentences both present - [ ] Rewrite footprint within bounds — `check_edit_footprint.py` when humanize rewrote a file; >30% changed warrants a re-read, >50% is a halt ### Response letters / cover letters only (Patterns 22-24) - [ ] No editing-mechanism narration (Pattern 22) — "v2 adds one sentence", "softened N phrases", "No further manuscript change" (analysis narration and quoted additions are fine) - [ ] No internal draft line-number pointers (Pattern 23) — "(line NN)", "at lines N, M" (revised-manuscript page/line is fine) - [ ] No tooling/scaffolding leak (Pattern 24) — "grep", "FIX-N", "circulated bundle", "internal index", `§`
-
-
scripts
-
check_rewrite_fidelity.py 8.3 KB
#!/usr/bin/env python3 """Bound how much of a text a humanize rewrite is allowed to touch (humanize Phase 3). De-AI editing is subtractive: strip the tells, keep the author's sentences. A model asked to "make this sound human" will also rewrite paragraphs that had nothing wrong with them, and the result reads fluently enough that the loss is invisible on review — the author's voice is gone and nobody can point to the sentence where it went. Pattern-by-pattern fixes touch a small fraction of the words; a wholesale rewrite touches most of them. That difference is measurable, so this gate measures it instead of trusting the rewrite to have been restrained. It also enforces the two invariants the humanize skill declares but never checked: every number and every citation present before the rewrite must still be present after it. Verdicts: NUMBER_DRIFT (Major) a numeric token's count changed across the rewrite. CITATION_DROP (Major) a citation present before is absent after. EDIT_FOOTPRINT_HIGH (Minor) more than --warn-pct of the words changed — re-read the diff. Why the footprint is advisory and the invariants are not: the two invariants are the skill's own declared contract ("every number, statistic, p-value, confidence interval and clinical fact must remain identical"; "do not remove or relocate citations"), so a violation is unambiguous. The footprint percentage has no such backing. Measured on this skill's own fixtures, a *correct* de-AI pass over an AI-inflated Discussion changed 61% of word tokens — because Patterns 6 and 18 require replacing formulaic limitation and conclusion paragraphs with specific content, which rewrites whole paragraphs by design. A hard threshold would therefore fail exactly the edits the skill asks for. The percentage is reported so a human can notice an implausible one; it is not evidence of over-editing on its own, and the default is deliberately loose. Exit codes: 0 clean or Minor-only, 1 with --strict when any Major fires, 2 usage error. Scoped to keep false positives low: * Comparison is on WORD tokens, not characters, so punctuation-only fixes (Pattern 13 em-dash -> parenthesis, Pattern 15 curly -> straight quotes) barely move the number. * Citation markers are stripped before numeric extraction, so a reference number is checked once as a citation and never again as a number. * Fenced code blocks are excluded from both sides. Stdlib-only. Usage: python3 check_rewrite_fidelity.py --before original.md --after humanized.md \ [--out qc/rewrite_fidelity.json] [--warn-pct 70] [--strict] [--quiet] """ from __future__ import annotations import argparse import difflib import json import re import sys from collections import Counter from pathlib import Path DETECTOR_ID = "check_rewrite_fidelity" FENCE_RE = re.compile(r"```.*?```", re.S) # Pandoc citation keys and bare numeric markers, e.g. [@smith2020], [12], [3-5], [3–5]. CITEKEY_RE = re.compile(r"\[@[^\]\s]+\]") NUMMARK_RE = re.compile(r"\[\d+(?:\s*[-–,]\s*\d+)*\]") WORD_RE = re.compile(r"[A-Za-z0-9''-]+") # A numeric token: integer, decimal, or percentage. Sign and thousands separators kept out # so that "1,200" and "1200" compare equal after separator removal. NUMBER_RE = re.compile(r"\d+(?:\.\d+)?") def _strip_fences(text: str) -> str: return FENCE_RE.sub(" ", text) def _citations(text: str) -> Counter: keys = CITEKEY_RE.findall(text) marks = NUMMARK_RE.findall(text) return Counter(k.strip() for k in keys + marks) def _numbers(text: str) -> Counter: """Numeric tokens with citation markers removed first, so a reference number is not double-counted as a statistic.""" without_cites = NUMMARK_RE.sub(" ", CITEKEY_RE.sub(" ", text)) without_seps = without_cites.replace(",", "") return Counter(NUMBER_RE.findall(without_seps)) def _words(text: str) -> list[str]: return WORD_RE.findall(text.lower()) def _changed_fraction(before: list[str], after: list[str]) -> float: """Fraction of word tokens that differ, measured against the longer side so that a rewrite cannot lower the score by deleting text.""" if not before and not after: return 0.0 matcher = difflib.SequenceMatcher(a=before, b=after, autojunk=False) matched = sum(block.size for block in matcher.get_matching_blocks()) denom = max(len(before), len(after)) return 1.0 - (matched / denom) if denom else 0.0 def _diff_counter(before: Counter, after: Counter) -> list[dict]: out = [] for token in sorted(set(before) | set(after)): b, a = before.get(token, 0), after.get(token, 0) if b != a: out.append({"token": token, "before": b, "after": a}) return out def main(argv: list[str] | None = None) -> int: ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) ap.add_argument("--before", required=True, type=Path, help="text as it was before the rewrite") ap.add_argument("--after", required=True, type=Path, help="text after the humanize rewrite") ap.add_argument("--out", type=Path, help="write the JSON envelope here") ap.add_argument("--warn-pct", type=float, default=70.0, help="Minor above this %% of words changed (default 70; advisory, see module docstring)") ap.add_argument("--strict", action="store_true", help="exit 1 when any Major fires") ap.add_argument("--quiet", action="store_true") args = ap.parse_args(argv) for path in (args.before, args.after): if not path.is_file(): print(f"usage error: no such file: {path}", file=sys.stderr) return 2 before_raw = _strip_fences(args.before.read_text(encoding="utf-8")) after_raw = _strip_fences(args.after.read_text(encoding="utf-8")) changed = _changed_fraction(_words(before_raw), _words(after_raw)) changed_pct = round(changed * 100, 1) num_delta = _diff_counter(_numbers(before_raw), _numbers(after_raw)) cite_delta = _diff_counter(_citations(before_raw), _citations(after_raw)) claims: list[dict] = [] if changed_pct > args.warn_pct: claims.append({ "verdict": "EDIT_FOOTPRINT_HIGH", "severity": "Minor", "changed_pct": changed_pct, "threshold_pct": args.warn_pct, "message": ( f"{changed_pct}% of word tokens changed (advisory threshold {args.warn_pct}%). " "A thorough de-AI pass can legitimately reach this level when Patterns 6 and 18 " "replace whole paragraphs; re-read the diff and confirm the author's argument, " "not just their phrasing, survived." ), }) if num_delta: claims.append({ "verdict": "NUMBER_DRIFT", "severity": "Major", "tokens": num_delta[:40], "message": ( f"{len(num_delta)} numeric token(s) changed count across the rewrite. " "Humanize must never alter a number." ), }) if cite_delta: claims.append({ "verdict": "CITATION_DROP", "severity": "Major", "tokens": cite_delta[:40], "message": ( f"{len(cite_delta)} citation(s) changed count across the rewrite. " "Humanize must never remove or relocate a citation." ), }) envelope = { "detector": "check_rewrite_fidelity", "before": str(args.before), "after": str(args.after), "changed_pct": changed_pct, "words_before": len(_words(before_raw)), "words_after": len(_words(after_raw)), "claims": claims, } if args.out: args.out.parent.mkdir(parents=True, exist_ok=True) args.out.write_text(json.dumps(envelope, indent=2, ensure_ascii=False), encoding="utf-8") if not args.quiet: print(f"{DETECTOR_ID}: {changed_pct}% of words changed " f"({len(_words(before_raw))} -> {len(_words(after_raw))})") for claim in claims: print(f" [{claim['severity']}] {claim['verdict']}: {claim['message']}") if not claims: print(" clean: footprint within bounds, numbers and citations preserved") if args.strict and any(c["severity"] == "Major" for c in claims): return 1 return 0 if __name__ == "__main__": sys.exit(main()) -
check_sentence_variety.py 10.3 KB
#!/usr/bin/env python3 """Verify the sentence-length variety the humanize skill already prescribes (Fix rule 7). SKILL.md Phase 3 tells the rewriter: "Mix short declarative sentences (8-12 words) with longer ones (25-35 words). Avoid uniform length." Until now nothing checked whether the rewrite obeyed it, and a de-AI pass tends to flatten rhythm rather than restore it — the model shortens the long sentences and pads the short ones toward a comfortable middle, which is itself a tell. The threshold is not borrowed from any corpus. It is the skill's own specification: a text that prescribes a mix of short and long sentences and then contains none of one kind has failed its own rule. So this gate fires only on that unambiguous case — an absent band — and reports the distribution for everything else rather than inventing a cutoff. Rule 7 names a RANGE, and until 2026-07-29 this gate only checked its lower edge. A single 97-word sentence populates the ">= 25 words" band, so a text could satisfy the check while containing a sentence nearly three times the top of the range rule 7 prescribes -- and the gate printed `max_words: 97` in its own stats while reporting "clean". Two external reviewers independently read such prose as machine-written on two different manuscripts while this detector returned nothing. Choosing the ceiling was the delicate part, and the measurement is recorded here so the number is auditable rather than asserted. Rule 7's own top is 35, but firing there is unusable: across the six manuscripts in this repository with enough sentences to measure, 97 sentences exceed 35 words (~24%, 16-22 per manuscript). Those are the project's own exemplars, so a gate that condemns them is measuring the wrong thing -- 25-35 is a target band, not a ceiling. Doubling rule 7's top gives 70, at which the same corpus yields 4 sentences in 6 manuscripts (~1%, at most one per file). So the number is still derived from the skill's own specification (35 x 2), and the corpus was used only to confirm it does not condemn good prose. Verdicts: SENTENCE_UNIFORM (Minor) the prose contains no short sentences (<= --short-max words) or no long ones (>= --long-min), i.e. every sentence sits in the middle band. Break up or combine sentences until both bands are populated. SENTENCE_OVERLONG (Minor) at least one sentence exceeds --long-max (default 70 = twice the top of rule 7's range). Not "a longer one" in the sense rule 7 means; a reader loses the subject before the verb arrives. Split it. Scoped to keep false positives low: * Headings, list items, table rows, code fences, and YAML front matter are excluded — their lengths say nothing about prose rhythm. * Common academic abbreviations (et al., e.g., i.e., vs., Fig., approx.) and decimals do not split a sentence. * Citation markers are removed before counting, so [@key] and [12] never inflate a length. * Silent below --min-sentences (default 15): an abstract or a short note has too few sentences for rhythm to mean anything. Exit codes: 0 clean or Minor-only, 1 with --strict when any Major fires (none — Minor only), 2 usage error. Stdlib-only. Usage: python3 check_sentence_variety.py --manuscript manuscript.md \ [--out qc/sentence_variety.json] [--short-max 12] [--long-min 25] \ [--min-sentences 15] [--strict] [--quiet] """ from __future__ import annotations import argparse import json import re import statistics import sys from pathlib import Path DETECTOR_ID = "check_sentence_variety" FENCE_RE = re.compile(r"```.*?```", re.S) FRONTMATTER_RE = re.compile(r"\A---\n.*?\n---\n", re.S) SKIP_LINE_RE = re.compile(r"^\s*(#{1,6}\s|[-*+]\s|\d+\.\s|\||>\s|!\[|\[.*\]:)") CITE_RE = re.compile(r"\[@[^\]\s]+\]|\[\d+(?:\s*[-–,]\s*\d+)*\]") WORD_RE = re.compile(r"[A-Za-z0-9''-]+") SENT_SPLIT_RE = re.compile(r"(?<=[.!?])\s+(?=[\"'(]?[A-Z0-9])") # Abbreviations whose trailing period must not end a sentence. Order matters: longer first. ABBREVIATIONS = ( "et al.", "e.g.", "i.e.", "cf.", "vs.", "approx.", "Fig.", "Figs.", "Tab.", "No.", "Dr.", "Prof.", "St.", "Sr.", "Jr.", "Inc.", "Ltd.", "min.", "max.", "sec.", ) _SENTINEL = "\x00ABBR%d\x00" _DOT = "\x00DOT\x00" def _prose_lines(text: str) -> str: """Body prose only: drop front matter, fences, headings, lists, tables, block quotes.""" text = FRONTMATTER_RE.sub("", text) text = FENCE_RE.sub(" ", text) kept = [ln for ln in text.splitlines() if ln.strip() and not SKIP_LINE_RE.match(ln)] return " ".join(kept) def _split_sentences(prose: str) -> list[str]: masked = prose for i, abbr in enumerate(ABBREVIATIONS): masked = masked.replace(abbr, _SENTINEL % i) # Protect decimals ("0.05", "P = .03") from the splitter. A lambda replacement is used # because a NUL byte cannot appear in an re.sub template string. masked = re.sub(r"(\d)\.(\d)", lambda m: m.group(1) + _DOT + m.group(2), masked) masked = re.sub(r"(?<=[=<>]\s)\.(\d)", lambda m: _DOT + m.group(1), masked) parts = SENT_SPLIT_RE.split(masked) out = [] for part in parts: restored = part.replace(_DOT, ".") for i, abbr in enumerate(ABBREVIATIONS): restored = restored.replace(_SENTINEL % i, abbr) restored = restored.strip() if restored: out.append(restored) return out def _word_count(sentence: str) -> int: return len(WORD_RE.findall(CITE_RE.sub(" ", sentence))) def main(argv: list[str] | None = None) -> int: ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) ap.add_argument("--manuscript", required=True, type=Path) ap.add_argument("--out", type=Path, help="write the JSON envelope here") ap.add_argument("--short-max", type=int, default=12, help="a short sentence is <= this (SKILL.md rule 7)") ap.add_argument("--long-min", type=int, default=25, help="a long sentence is >= this (SKILL.md rule 7)") ap.add_argument("--long-max", type=int, default=70, help="a sentence over this is overlong (default 70 = twice the top of rule 7's 25-35 range)") ap.add_argument("--min-sentences", type=int, default=15, help="stay silent below this many sentences") ap.add_argument("--strict", action="store_true") ap.add_argument("--quiet", action="store_true") args = ap.parse_args(argv) if not args.manuscript.is_file(): print(f"usage error: no such file: {args.manuscript}", file=sys.stderr) return 2 sentences = _split_sentences(_prose_lines(args.manuscript.read_text(encoding="utf-8"))) lengths = [n for n in (_word_count(s) for s in sentences) if n > 0] claims: list[dict] = [] stats: dict = {"sentences": len(lengths)} if len(lengths) >= args.min_sentences: short = [n for n in lengths if n <= args.short_max] long_ = [n for n in lengths if n >= args.long_min] over_band = [n for n in lengths if n > 35] overlong = sorted((n for n in lengths if n > args.long_max), reverse=True) stats.update({ "short_count": len(short), "long_count": len(long_), "median_words": round(statistics.median(lengths), 1), "min_words": min(lengths), "max_words": max(lengths), "stdev_words": round(statistics.pstdev(lengths), 1), # Reported, not judged. Rule 7's band tops out at 35, but ~24% of sentences in this # repository's own exemplar manuscripts exceed it, so the count is information for a # rewriter rather than grounds for a verdict. "over_rule7_band_count": len(over_band), "overlong_word_counts": overlong, }) if not short or not long_: missing = "short" if not short else "long" band = (f"<= {args.short_max} words" if not short else f">= {args.long_min} words") claims.append({ "verdict": "SENTENCE_UNIFORM", "severity": "Minor", "missing_band": missing, "message": ( f"No {missing} sentences ({band}) across {len(lengths)} sentences " f"(median {stats['median_words']}, range {stats['min_words']}-{stats['max_words']}). " "SKILL.md Fix rule 7 requires both bands; uniform length is itself an AI tell." ), }) if overlong: claims.append({ "verdict": "SENTENCE_OVERLONG", "severity": "Minor", "count": len(overlong), "word_counts": overlong, "message": ( f"{len(overlong)} sentence(s) over {args.long_max} words " f"({', '.join(str(n) for n in overlong)}). Rule 7's long band is 25-35 words; " f"{args.long_max} is twice its top, so these are not 'a longer one' in the sense " "the rule means — the reader loses the subject before the verb arrives. Split them." ), }) else: stats["skipped"] = f"only {len(lengths)} sentences (< --min-sentences {args.min_sentences})" envelope = { "detector": "check_sentence_variety", "manuscript": str(args.manuscript), "short_max": args.short_max, "long_min": args.long_min, "long_max": args.long_max, "stats": stats, "claims": claims, } if args.out: args.out.parent.mkdir(parents=True, exist_ok=True) args.out.write_text(json.dumps(envelope, indent=2, ensure_ascii=False), encoding="utf-8") if not args.quiet: if "skipped" in stats: print(f"{DETECTOR_ID}: skipped — {stats['skipped']}") else: print(f"{DETECTOR_ID}: {stats['sentences']} sentences, median {stats['median_words']} words, " f"{stats['short_count']} short / {stats['long_count']} long") for claim in claims: print(f" [{claim['severity']}] {claim['verdict']}: {claim['message']}") if not claims and "skipped" not in stats: print(" clean: both short and long sentence bands are populated") if args.strict and any(c["severity"] == "Major" for c in claims): return 1 return 0 if __name__ == "__main__": sys.exit(main())
-
-
tests
-
fixtures
-
rewrite_after_bounded.md 815 B
# Discussion Our model achieved an AUC of 0.94 (95% CI: 0.91-0.97) in the external validation cohort [@smith2024]. Sensitivity improved from 78% to 91%. The proposed architecture is described in the Methods. Lee et al. reported that deep learning approaches improve nodule detection [@lee2023]. Our framework reduces reading time and improves diagnostic confidence. Because the dataset was imbalanced, we used a weighted sampling strategy. The false-positive rate decreased to 3.2%. The single-center design limits generalizability to community practice settings where case mix and image quality differ. External validation on a multi-institutional dataset with variable scanner protocols is needed before clinical deployment. Prospective evaluation in a screening population would quantify the clinical impact. -
rewrite_after_numdrift.md 804 B
# Discussion Our model achieved an AUC of 0.94 (95% CI: 0.91-0.97) in the external validation cohort [@smith2024]. Sensitivity improved from 78% to 93%. The proposed architecture is described in the Methods. Lee et al. reported that deep learning approaches improve nodule detection. Our framework reduces reading time and improves diagnostic confidence. Because the dataset was imbalanced, we used a weighted sampling strategy. The false-positive rate decreased to 3.2%. The single-center design limits generalizability to community practice settings where case mix and image quality differ. External validation on a multi-institutional dataset with variable scanner protocols is needed before clinical deployment. Prospective evaluation in a screening population would quantify the clinical impact. -
rewrite_after_wholesale.md 1.2 KB
# Discussion We evaluated a convolutional network for pulmonary nodule triage across two hospitals. On the held-out set the area under the curve reached 0.94 (95% CI: 0.91-0.97), and per-reader sensitivity rose from 78% to 91% [@smith2024]. Radiologists spent less time on negative cases, which matters more in screening than in symptomatic imaging. Prior work anticipated part of this result [@lee2023]. What differs here is the acquisition spectrum: earlier series drew from teaching repositories, whereas every examination in this cohort came from consecutive clinical scanning with the vendor protocols in routine use. Class imbalance was handled by weighted sampling rather than synthetic oversampling, because oversampling distorted the calibration curve in pilot runs. The false-positive rate settled at 3.2%. Three constraints bound the interpretation. Both sites share a regional referral pattern, so case mix is narrower than a community practice would present. Reference standards were assigned by consensus rather than histology in a minority of cases. Finally, no reader worked under time pressure, and reading-room conditions rarely resemble a research protocol. A prospective screening trial with per-reader randomization would address all three. -
rewrite_before.md 1.1 KB
# Discussion It is important to note that our model achieved remarkable diagnostic accuracy, with an AUC of 0.94 (95% CI: 0.91-0.97) in the external validation cohort [@smith2024]. Additionally, the sensitivity improved from 78% to 91%, underscoring the pivotal role of AI-assisted detection in the evolving landscape of thoracic imaging. Furthermore, this groundbreaking finding serves as a testament to the robust performance of the proposed architecture. Studies have shown that deep learning approaches enhance nodule detection [@lee2023]. Our comprehensive framework not only streamlines the reading workflow but also enhances diagnostic confidence. Due to the fact that the dataset was imbalanced, we utilized a weighted sampling strategy. The false-positive rate decreased to 3.2%, reflecting improved specificity. Despite these limitations, our study provides valuable insights into AI-assisted diagnosis. Further research is warranted to validate these findings. The future looks bright for AI in thoracic radiology, paving the way for transformative advances in precision medicine. -
variety_long_within_bound.md 1.4 KB
# METHODS We enrolled 412 adults. Follow-up was complete. No participant withdrew. The primary outcome was mortality. Two readers scored each scan. Agreement was high. We used a random-effects model. All tests were two-sided. Baseline characteristics were balanced across the two study arms with respect to age and sex and comorbidity burden. Sensitivity analyses excluding the smallest centre produced estimates that were consistent with the primary result. The calibration slope was close to unity across the full range of predicted risk in the validation cohort. Discrimination was assessed with the area under the receiver operating characteristic curve and reported with intervals. Missing covariate data were addressed by multiple imputation with twenty imputations under a missing-at-random assumption. We report absolute risk differences alongside relative measures because the baseline risk varied between the sites. A post-hoc subgroup analysis by age tertile is reported in the supplement and should be read as exploratory. The model was evaluated on a held-out cohort assembled from three tertiary centres between January and December, and although the baseline characteristics of the included participants differed modestly across sites in age, sex distribution and the prevalence of prior cardiovascular events, the primary analysis was pre-specified to adjust for centre as a random effect, which means that the pooled estimate reported below should be. -
variety_mixed.md 1.6 KB
The cohort was retrospective. Consecutive adults who underwent chest computed tomography at two centers between January 2019 and December 2022 were eligible, and no patient was excluded on the basis of scanner vendor or reconstruction kernel. Two radiologists read every examination independently. Disagreements went to a third reader. That reader was blinded to both prior assessments, which matters because the second opinion would otherwise inherit the anchor of the first. The reference standard combined histology with twelve months of imaging follow-up. Baseline characteristics were compared using the chi-square test. Continuous variables were summarized as medians with interquartile ranges. The model was trained on the derivation cohort and locked before any validation data were examined, so no tuning decision could have been informed by the numbers we now report. Calibration was assessed with reliability diagrams. Sensitivity and specificity carry bootstrap confidence intervals from two thousand resamples, computed at the deployment prevalence rather than at the enriched prevalence of the development set. Subgroup estimates were produced for scanner vendor and slice thickness. Missing covariates were rare. Complete-case analysis was therefore used, and a sensitivity analysis with multiple imputation reproduced every point estimate to within one percentage point. All tests were two-sided. Analyses ran in R 4.3.1. The institutional review board approved the protocol and waived written informed consent because the extracted data were fully de-identified before any investigator saw them. -
variety_overlong.md 1.6 KB
# METHODS We enrolled 412 adults. Follow-up was complete. No participant withdrew. The primary outcome was mortality. Two readers scored each scan. Agreement was high. We used a random-effects model. All tests were two-sided. Baseline characteristics were balanced across the two study arms with respect to age and sex and comorbidity burden. Sensitivity analyses excluding the smallest centre produced estimates that were consistent with the primary result. The calibration slope was close to unity across the full range of predicted risk in the validation cohort. Discrimination was assessed with the area under the receiver operating characteristic curve and reported with intervals. Missing covariate data were addressed by multiple imputation with twenty imputations under a missing-at-random assumption. We report absolute risk differences alongside relative measures because the baseline risk varied between the sites. A post-hoc subgroup analysis by age tertile is reported in the supplement and should be read as exploratory. The model was evaluated on a held-out cohort assembled from three tertiary centres between January and December, and although the baseline characteristics of the included participants differed modestly across sites in age, sex distribution and the prevalence of prior cardiovascular events, the primary analysis was pre-specified to adjust for centre as a random effect, which means that the pooled estimate reported below should be read as an average across settings rather than as a within-centre effect, a distinction that matters for anyone attempting to transport the result to a single institution with a materially different case mix. -
variety_uniform.md 1.5 KB
The retrospective cohort included consecutive adults who underwent chest computed tomography at two centers. Two radiologists reviewed every examination independently and recorded nodule location and size. Disagreements were resolved by a third reader who was blinded to both prior assessments. The reference standard combined histology with twelve months of imaging follow-up in all cases. Baseline characteristics were compared using the chi-square test for categorical variables. Continuous variables were summarized as medians with interquartile ranges throughout the analysis. The model was trained on the derivation cohort and locked before any validation data were examined. Calibration was assessed with reliability diagrams at the deployment prevalence of the screening population. Sensitivity and specificity were reported with bootstrap confidence intervals from two thousand resamples. Subgroup estimates were produced for scanner vendor and for slice thickness separately. Missing covariates were handled by complete-case analysis because the missingness fraction remained below three percent overall. All statistical tests were two-sided and the significance threshold was set at five percent. Analyses were performed in R version 4.3.1 with the tidyverse and pROC packages. The protocol received approval from the institutional review board at the coordinating center. Written informed consent was waived because the data had been fully de-identified before extraction. Reporting followed the STARD 2015 checklist and the completed form accompanies this submission.
-
-
test_rewrite_fidelity.sh 2.7 KB
#!/usr/bin/env bash # Regression test for the humanize rewrite-fidelity gate. # (bounded) a correct de-AI pass -> no claim, even though it changed ~62% of the words; # (wholesale) a full rewrite -> EDIT_FOOTPRINT_HIGH only (Minor, never blocks); # (numdrift) a changed number and a dropped citation -> NUMBER_DRIFT + CITATION_DROP, exit 1. set -u HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCRIPT="$HERE/../scripts/check_rewrite_fidelity.py" BEFORE="$HERE/fixtures/rewrite_before.md" BOUNDED="$HERE/fixtures/rewrite_after_bounded.md" WHOLESALE="$HERE/fixtures/rewrite_after_wholesale.md" NUMDRIFT="$HERE/fixtures/rewrite_after_numdrift.md" OUT="$(mktemp -t rwfid_XXXX).json" trap 'rm -f "$OUT"' 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: script missing" >&2; exit 2; } python3 "$SCRIPT" --before "$BEFORE" --after "$BOUNDED" --out "$OUT" --quiet >/dev/null 2>&1 check "no claim on a correct de-AI pass (numbers + citations preserved)" python3 -c " import json d=json.load(open('$OUT')) assert not d['claims'], d['claims'] assert d['detector']=='check_rewrite_fidelity', d.get('detector') " check "a correct de-AI pass does not block under --strict" \ python3 "$SCRIPT" --before "$BEFORE" --after "$BOUNDED" --strict --quiet python3 "$SCRIPT" --before "$BEFORE" --after "$WHOLESALE" --out "$OUT" --quiet >/dev/null 2>&1 check "EDIT_FOOTPRINT_HIGH on a wholesale rewrite" python3 -c " import json d=json.load(open('$OUT')) c=[x for x in d['claims'] if x['verdict']=='EDIT_FOOTPRINT_HIGH'] assert c, d['claims'] assert c[0]['severity']=='Minor', c[0] " check "footprint alone never blocks under --strict (advisory only)" \ python3 "$SCRIPT" --before "$BEFORE" --after "$WHOLESALE" --strict --quiet python3 "$SCRIPT" --before "$BOUNDED" --after "$NUMDRIFT" --out "$OUT" --quiet >/dev/null 2>&1 check "NUMBER_DRIFT when a statistic changed" python3 -c " import json d=json.load(open('$OUT')) assert any(c['verdict']=='NUMBER_DRIFT' and c['severity']=='Major' for c in d['claims']), d['claims'] " check "CITATION_DROP when a citation disappeared" python3 -c " import json d=json.load(open('$OUT')) assert any(c['verdict']=='CITATION_DROP' and c['severity']=='Major' for c in d['claims']), d['claims'] " if python3 "$SCRIPT" --before "$BOUNDED" --after "$NUMDRIFT" --strict --quiet >/dev/null 2>&1; then printf ' FAIL %s\n' "--strict exits 1 on an invariant violation"; fail=$((fail+1)) else printf ' PASS %s\n' "--strict exits 1 on an invariant violation" fi echo "fail=$fail"; [[ "$fail" -eq 0 ]] && echo "ALL PASS" || echo "FAILURES: $fail" exit "$fail" -
test_sentence_variety.sh 4.4 KB
#!/usr/bin/env bash # Regression test for the sentence-length variety gate (humanize SKILL.md Fix rule 7). # (uniform) every sentence in the middle band, no long ones -> SENTENCE_UNIFORM; # (mixed) both short (<=12) and long (>=25) bands populated -> no claim; # (short) a text below --min-sentences is skipped rather than judged. set -u HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCRIPT="$HERE/../scripts/check_sentence_variety.py" UNIFORM="$HERE/fixtures/variety_uniform.md" MIXED="$HERE/fixtures/variety_mixed.md" OUT="$(mktemp -t svar_XXXX).json" SHORT="$(mktemp -t svarshort_XXXX).md" trap 'rm -f "$OUT" "$SHORT"' 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: script missing" >&2; exit 2; } python3 "$SCRIPT" --manuscript "$UNIFORM" --out "$OUT" --quiet >/dev/null 2>&1 check "SENTENCE_UNIFORM when no long sentences exist" python3 -c " import json d=json.load(open('$OUT')) c=[x for x in d['claims'] if x['verdict']=='SENTENCE_UNIFORM'] assert c, d['claims'] assert c[0]['missing_band']=='long', c[0] assert d['detector']=='check_sentence_variety', d.get('detector') " python3 "$SCRIPT" --manuscript "$MIXED" --out "$OUT" --quiet >/dev/null 2>&1 check "no claim when both bands are populated" python3 -c " import json d=json.load(open('$OUT')) assert not d['claims'], d['claims'] assert d['stats']['short_count'] > 0 and d['stats']['long_count'] > 0, d['stats'] " check "decimals and abbreviations do not split a sentence" python3 -c " import json d=json.load(open('$OUT')) # 'R 4.3.1' and 'et al.' appear in the mixed fixture; a naive splitter inflates the count. assert d['stats']['sentences'] < 25, d['stats'] " printf 'One short line. Another one here. A third.\n' > "$SHORT" python3 "$SCRIPT" --manuscript "$SHORT" --out "$OUT" --quiet >/dev/null 2>&1 check "a text below --min-sentences is skipped, not judged" python3 -c " import json d=json.load(open('$OUT')) assert not d['claims'], d['claims'] assert 'skipped' in d['stats'], d['stats'] " # Rule 7 names a RANGE and this gate only ever checked its lower edge: a single 97-word # sentence populates the ">= 25 words" band, so the check passed while printing max_words: 97 # in its own stats. Two external reviewers read such prose as machine-written on two different # manuscripts while the detector returned nothing. OL="$HERE/fixtures/variety_overlong.md" python3 "$SCRIPT" --manuscript "$OL" --out "$OUT" --quiet >/dev/null 2>&1 check "a 97-word sentence fires SENTENCE_OVERLONG" python3 -c " import json d=json.load(open('$OUT')) c=[x for x in d['claims'] if x['verdict']=='SENTENCE_OVERLONG'] assert c, d['claims'] assert c[0]['word_counts']==[97], c[0] " check "...and the band check still says the prose is varied" python3 -c " import json d=json.load(open('$OUT')) assert not [x for x in d['claims'] if x['verdict']=='SENTENCE_UNIFORM'], d['claims'] " check "...and it stays Minor: --strict does not fail the build" test "$(python3 "$SCRIPT" --manuscript "$OL" --strict >/dev/null 2>&1; echo $?)" -eq 0 # The bound has to be a bound, not a synonym for "long". Same text, longest sentence at 64 # words -- over rule 7's band of 25-35, under the 70 ceiling -- must stay silent, or the # verdict would just be re-reporting the long band it already checks. WB="$HERE/fixtures/variety_long_within_bound.md" python3 "$SCRIPT" --manuscript "$WB" --out "$OUT" --quiet >/dev/null 2>&1 check "a 64-word sentence does NOT fire (over rule 7's band, under the ceiling)" python3 -c " import json d=json.load(open('$OUT')) assert not [x for x in d['claims'] if x['verdict']=='SENTENCE_OVERLONG'], d['claims'] " check "...and the count over rule 7's band is reported, not judged" python3 -c " import json d=json.load(open('$OUT')) assert d['stats']['over_rule7_band_count'] >= 1, d['stats'] assert not d['claims'], d['claims'] " # The threshold is configurable, and lowering it must actually change the answer -- otherwise # the default could be doing nothing and every assertion above would still pass. python3 "$SCRIPT" --manuscript "$WB" --out "$OUT" --long-max 50 --quiet >/dev/null 2>&1 check "--long-max 50 makes the same 64-word sentence fire" python3 -c " import json d=json.load(open('$OUT')) assert [x for x in d['claims'] if x['verdict']=='SENTENCE_OVERLONG'], d['claims'] " echo "fail=$fail"; [[ "$fail" -eq 0 ]] && echo "ALL PASS" || echo "FAILURES: $fail" exit "$fail"
-
-
SKILL.md 18.7 KB
--- name: humanize description: Detect and remove AI writing patterns from academic manuscripts and response-to-reviewers letters. Scans for 27 common AI-generated text patterns and rewrites flagged passages to sound naturally human-written while preserving technical accuracy, bounding how much of the text a rewrite is allowed to touch. triggers: humanize, AI patterns, AI 문체, remove AI writing, make it sound natural, 자연스럽게, de-AI tools: Read, Write, Edit, Grep, Glob, Bash model: inherit --- # Humanize Skill You are assisting a medical researcher in detecting and removing AI writing patterns from academic manuscripts. Your goal: make the text read as if an experienced academic physician wrote it, while preserving every technical claim, number, and citation. ## Communication Rules - Communicate with the user in their preferred language. - All manuscript edits are in English. - Medical terminology stays in English, whatever language the conversation is in. ## Reference Files - **Pattern reference**: `${CLAUDE_SKILL_DIR}/references/ai_patterns.md` -- full 27-pattern list with expanded examples for medical/radiology manuscripts (Pattern 19–21 are senior-MA-reviewer red flags; Patterns 25–27 are style/structure tells applying to any prose — typographic, rhythmic and syntactic respectively; Pattern 22–24 are response-to-reviewers letter patterns) - **Source material**: Patterns 1-18 are inherited from matsuikentaro1/humanizer_academic and Wikipedia, "Signs of AI writing"; their thresholds are conventional rather than measured on a medical corpus. Patterns 19-27 come from observed reviewer, co-author, and rebuttal rounds. `references/ai_patterns.md` records the grounding per pattern. Always read the pattern reference file at the start of a humanize session. --- ## Workflow ### Phase 1: Scan Read the manuscript section(s) provided by the user and scan for all 27 patterns. For response-to-reviewers letters and cover letters, prioritise patterns 22-24. **For each pattern found:** 1. Record the pattern number and name. 2. Count occurrences. 3. Extract the exact passage from the text. 4. Note the location (paragraph number or line range). **Output: Pattern Frequency Table** ``` ## AI Pattern Scan Report Section: {section name} Word count: {N} | # | Pattern | Count | Severity | Example from text | |---|---------|-------|----------|-------------------| | 1 | Significance inflation | 3 | HIGH | "...pivotal role in diagnostic imaging..." | | 7 | AI vocabulary words | 5 | HIGH | "Additionally,...", "crucial finding..." | | 8 | Copula avoidance | 2 | MEDIUM | "...serves as the gold standard..." | | ... | ... | ... | ... | ... | Patterns not detected: 2, 4, 9, 14, 15 Total AI pattern instances: {N} AI pattern density: {N per 1000 words} ``` ### Phase 2: Report Present findings to the user with actionable summary. **Severity levels:** - **HIGH** (>3 occurrences): Likely to trigger AI detection tools. Fix immediately. - **MEDIUM** (1-3 occurrences): Noticeable to careful readers. Should fix. - **LOW** (0 occurrences): Clean for this pattern. **AI Pattern Score:** - Count total pattern instances across all 27 categories. - Compute density: instances per 1000 words. - Target: < 2.0 instances per 1000 words. **Gate:** Present the report and ask the user which patterns to fix. Default: fix all HIGH and MEDIUM. ### Phase 3: Fix Rewrite flagged passages following these rules: 1. **Preserve technical accuracy.** Every number, statistic, p-value, confidence interval, and clinical fact must remain identical. 2. **Preserve citation density.** Do not remove or relocate citations. 3. **Preserve formal academic register.** Do not make the text casual or conversational. 4. **Do not force casualness.** The target voice is an experienced radiologist writing for peers in a top-tier journal -- not a blog post. 5. **Keep domain-specific terminology intact.** "Convolutional neural network," "apparent diffusion coefficient," "Fleiss' kappa" stay as-is. 6. **Never introduce new claims** or remove existing ones. 7. **Vary sentence structure.** Mix short declarative sentences (8-12 words) with longer ones (25-35 words). Avoid uniform length. A de-AI pass tends to *flatten* rhythm — it shortens the long sentences and pads the short ones toward a comfortable middle, which is itself a tell. `scripts/check_sentence_variety.py` verifies this rule in Phase 4. 8. **Use active voice** where natural. "We analyzed" rather than "Analysis was performed." 9. **Thin out antithesis and cleft constructions (Pattern 27, the M2 heuristic).** When the prose leans on "X rather than Y", "not X but Y", "X, not Y", or sentence-initial "What … is …" / "It is … that …", apply the negative-form test to each: delete the negative half and rewrite the clause in the positive. If a fact disappears, the contrast was functional — keep it; if nothing disappears, it was decoration — cut it. Judge by the manuscript's overall rate, not instance by instance, and keep two or three for emphasis. Rewrite clefts in plain subject-verb order ("What matters is X" → "X matters"). `scripts/check_rhetorical_density.py` (in `/self-review`) measures this in Phase 4. (M2 test adapted from the SNL-UCSB paper-writing skill, MIT.) **Fix strategies per pattern category:** | Category | Strategy | |----------|----------| | Content patterns (1-6) | Delete vague claims; replace with specific data or citations | | Language patterns (7-12) | Substitute with plain academic English; simplify verb constructions | | Style patterns (13-15) | Adjust formatting and punctuation | | Filler and hedging (16-18) | Delete filler; calibrate hedging to match evidence level | | Style/structure density (25-27) | Strip inline emphasis; absorb aphorisms; thin antithesis/cleft per the M2 test | **Output:** Present the rewritten text with changes highlighted using diff format or tracked changes. ### Phase 4: Verify **Keep the pre-rewrite text.** Before editing in place, copy the original somewhere the fidelity check can read it (`cp manuscript.md /tmp/pre_humanize.md`). Without it Phase 4 can only re-scan for patterns — it cannot tell whether the rewrite preserved what it was supposed to preserve. Run both deterministic checks, then re-scan the rewritten text using the same 27 patterns. ```bash python3 "${CLAUDE_SKILL_DIR}/scripts/check_rewrite_fidelity.py" \ --before /tmp/pre_humanize.md --after manuscript.md \ --out qc/rewrite_fidelity.json --strict python3 "${CLAUDE_SKILL_DIR}/scripts/check_sentence_variety.py" \ --manuscript manuscript.md --out qc/sentence_variety.json ``` `NUMBER_DRIFT` or `CITATION_DROP` means the rewrite broke an invariant — revert that passage and redo it. `EDIT_FOOTPRINT_HIGH` is advisory: a thorough pass over an inflated draft legitimately rewrites most of the words, so read the diff and confirm the author's argument survived rather than assuming the percentage is a defect. **Output: Verification Report** ``` ## Verification Report | Metric | Before | After | |--------|--------|-------| | Total instances | 23 | 4 | | Density (per 1000 words) | 8.2 | 1.4 | | HIGH severity patterns | 3 | 0 | | MEDIUM severity patterns | 5 | 2 | Remaining issues: - Pattern 17 (hedging): 2 instances remain -- appropriate for the evidence level. Verdict: PASS (density < 2.0) ``` If the density remains above 2.0, run another fix-verify cycle (max 3 rounds). --- ## The 27 Detection Patterns ### Content Patterns | # | Pattern | What to look for | Fix | |---|---------|------------------|-----| | 1 | Significance inflation | "pivotal," "evolving landscape," "underscores the critical importance" | Delete or state the specific importance with data | | 2 | Notability claims | "landmark trial," "renowned investigators," "groundbreaking" | Remove; let the data speak | | 3 | Superficial -ing analyses | "highlighting the cardioprotective effects," "underscoring the broad applicability" | End the sentence at the data; start a new sentence for interpretation | | 4 | Promotional language | "remarkable findings," "dramatic reductions," "profound impact" | State the actual numbers neutrally | | 5 | Vague attributions | "Studies have shown," "Experts argue," "Several publications" | Cite the specific study | | 6 | Formulaic challenges sections | "Despite challenges... future outlook... continues to provide" | State specific limitations factually | ### Language Patterns | # | Pattern | What to look for | Fix | |---|---------|------------------|-----| | 7 | AI vocabulary words | Additionally, crucial, delve, enhance, fostering, pivotal, showcase, tapestry, underscore, landscape (abstract) | Delete or replace with plain English | | 8 | Copula avoidance | "serves as," "stands as," "represents a" | Use "is" | | 9 | Negative parallelisms | "not only X but also Y" | "X and Y" | | 10 | Rule of three overuse | Forcing ideas into groups of three repeatedly | Use natural grouping (2, 4, 5 items) | | 11 | Synonym cycling | patients/participants/subjects/individuals | Pick one term, use consistently | | 12 | False ranges | "from improved renal function to enhanced cardiac outcomes" | List the specific outcomes directly | ### Style Patterns | # | Pattern | What to look for | Fix | |---|---------|------------------|-----| | 13 | Em dash overuse | More than 2 em dashes per page | Use parentheses or restructure. **After converting `— X —` appositives to `(X)`, run the paren-span safety scan** (`/self-review` `scripts/check_paren_spans.py`): a bulk conversion can pair two *unrelated* dashes across a sentence boundary and wrap a whole sentence (or an ordinal "Sixth, …" limitation) inside one parenthesis — paren-balanced but broken, so a balance check misses it. Operate per-sentence; never match across `. ` | | 14 | Title case in headings | "Statistical Analysis And Primary Endpoints" | Sentence case per journal style | | 15 | Curly quotation marks | Curly quotes from ChatGPT | Straight quotes | ### Filler and Hedging | # | Pattern | What to look for | Fix | |---|---------|------------------|-----| | 16 | Filler phrases | "It is important to note that," "In order to," "Due to the fact that" | Delete the filler; state the content directly | | 17 | Excessive hedging | "may potentially suggest the possibility" | Choose the appropriate certainty level: "suggests" | | 18 | Generic positive conclusions | "The future looks bright," "continues to reshape," "paves the way" | State the specific next step or implication | ### Senior MA Reviewer and Typographic Patterns | # | Pattern | What to look for | Fix | |---|---------|------------------|-----| | 19 | § (section sign) marker | "as in §2.3", "(see §Discussion)", "§Results" | Delete or replace with section name ("Methods", "Results") — `grep -c "§"` = 0 | | 20 | Methods/Results self-reference parenthetical | "(Methods §X)", "(Results §3.1)", "(Methods, Section 2.3)" | Drop the parenthetical or shorten to "(see Methods)" | | 21 | AI Disclosure boilerplate (body) | "## Artificial Intelligence Disclosure", "Generative AI was not used to create..." in manuscript body | Remove from body → place in cover letter / submission form only (per `~/.claude/rules/journal-ai-image-policies.md`) | | 25 | Inline-emphasis over-use (typographic over-signposting) | Single-word italics (*into*, *passive*, *same*), whole-clause italics (*a redesign of the relationship itself*), bold used mid-paragraph to signpost | Remove inline emphasis; keep only legitimate italics — statistical symbols (*P*, *t*, *n*), Latin (*in vivo*, *et al.*), gene/species (*BRCA1*). A bold **run-in subheading** at line start is fine (Nature/npj style) | ### Response-Letter Patterns (R2R) Patterns 22-24 apply only when scanning a response-to-reviewers letter or editor cover letter, not manuscript bodies. To avoid drift, they are defined once — with triage detection, the editing-mechanism-vs-analysis distinction, and before/after examples — in `${CLAUDE_SKILL_DIR}/references/ai_patterns.md` (Response-Letter Patterns section). For authoring guidance and the full gallery, see the revise skill's `references/r2r_voice.md`. --- ## Section-Specific Focus When scanning a full manuscript, prioritize these patterns per section: | Section | Priority Patterns | Reason | |---------|------------------|--------| | Abstract | ALL (1-21, 25) | Most visible section; most scrutinized for AI patterns | | Introduction | 1, 2, 5, 7, 12 | AI inflates background importance and uses vague attributions | | Methods | 8, 16 | Methods should be straightforward; copula avoidance and filler are common | | Results | 3, 4, 6, 10, 11 | AI adds interpretive -ing clauses and promotional language to results | | Discussion | 1, 5, 6, 17, 18 | AI produces formulaic discussions with excessive hedging | | Conclusion | 1, 18 | AI generates generic positive conclusions | | Methods (MA / SR) | 19, 20, 21 | § markers, self-reference parentheticals, AI Disclosure boilerplate are senior-MA-reviewer red flags | | Discussion (MA / SR) | 19, 20 | Self-reference parentheticals especially common when discussing methods | | Body (any) | 21 | AI Disclosure belongs in cover letter / submission form, not manuscript body | | Response to Reviewers / cover letter | 22, 23, 24 (+ 13, 16, 19) | Editing-mechanism narration, internal draft line numbers, and tooling leaks are the dominant tells in machine-drafted rebuttals (see ai_patterns.md R2R section) | --- ## Interaction with Other Skills | Calling skill | When this skill is invoked | |---------------|---------------------------| | `/write-paper` | Phase 7 (Polish) -- automatic scan before submission | | `/peer-review` | When reviewing one's own manuscript for AI patterns | | `/revise` | When drafting response-to-reviewers letters and cover letters -- patterns 22-24 are the enforced gate before submission | When called by another skill, return the verification report so the calling skill can check the pass/fail status. --- ## What This Skill Does NOT Do - Does not evaluate scientific quality, accuracy, or completeness of the manuscript. - Does not add new content or citations. - Does not assess journal compliance or formatting. - Does not translate between languages. - Only removes AI patterns; does not perform general copy-editing. ## Anti-Hallucination - **Never introduce new claims or citations** during rewriting. Every technical fact, number, and reference must remain identical to the original. - **Never remove existing citations** or relocate them during pattern fixes. - **Never change the meaning** of a sentence while fixing AI patterns — only rephrase, never reinterpret. - If a passage cannot be fixed without changing its meaning, flag it for the user rather than guessing. --- ## Gates | Gate | Severity | Trigger | Action on fail | |---|---|---|---| | AI-pattern density target | ADVISORY | density > 2.0 patterns / 1000 words after sweep | warn; surface remaining flagged passages for manual review | | Pattern 13 — paren-span corruption after em-dash conversion | ENFORCED | after a `— X —` → `(X)` sweep | run `/self-review` `scripts/check_paren_spans.py --strict`; `PAREN_SPAN_ORDINAL` / `PAREN_SPAN_SENTENCE` means a conversion wrapped a sentence/ordinal inside parens — fix before finalizing | | Pattern 19 — `§` symbol | ENFORCED (senior MA reviewer prep) | `grep -c "§" manuscript.md` > 0 | auto-strip; verify post-rewrite count == 0 | | Pattern 20 — `(see Methods §X)` self-reference | ENFORCED | match found | rewrite to direct section name reference | | Pattern 21 — AI Disclosure paragraph in body | ENFORCED | "Generative AI was not used..." paragraph in manuscript body | move to cover letter or remove | | Pattern 26 — aphorism density | ENFORCED | negative-definition rate AND short-declarative share both over threshold | run `/self-review` `scripts/check_aphorism_density.py --manuscript manuscript.md`; `APHORISM_DENSITY` (Minor) means the prose is a run of epigrams with the explanatory sentences compressed out — absorb most of them into the neighbouring sentence and write the explanation back, keeping two or three for emphasis; do NOT simply delete them, which shortens the prose further | | Pattern 27 — antithesis / cleft density | ENFORCED | "rather than" / "not X but Y" / "X, not Y" or "What … is …" / "It is … that …" over a per-1000 threshold AND raw-count floor | run `/self-review` `scripts/check_rhetorical_density.py --manuscript manuscript.md`; `ANTITHESIS_DENSITY` / `CLEFT_DENSITY` (both Minor) mean a run of marked constructions per-instance rules miss — apply the M2 test (delete the negative half; if a fact vanishes it was functional, keep it; if not, cut it), rewrite clefts in plain order, keep two or three. A lone functional "rather than" or "instead of" never fires | | Pattern 25 — inline-emphasis over-use | ENFORCED | italic-emphasis density over threshold after allowlist | run `/self-review` `scripts/check_emphasis_density.py --manuscript manuscript.md`; `EMPHASIS_OVERUSE` (Minor) means strip inline italics (keep only stat symbols / Latin / gene-species); whole-clause italics are the strongest tell | | Patterns 22-24 — R2R editing-mechanism / draft line-number / tooling leak | TRIAGE (response letters); `§` = 0 hard | detection greps in ai_patterns.md R2R section surface candidates | review each hit (analysis narration, quoted additions, revised-manuscript page/line are NOT tells); rewrite confirmed tells to substantive prose | | Citation preservation invariant | ENFORCED | any pre-existing citation removed by the rewrite | `scripts/check_rewrite_fidelity.py --before <pre> --after <post> --strict` → `CITATION_DROP` (Major); revert that single rewrite and flag for the user | | Numerical preservation invariant | ENFORCED | any number changed by the rewrite | same script → `NUMBER_DRIFT` (Major); revert and flag | | Rewrite footprint | ADVISORY | fraction of word tokens changed exceeds `--warn-pct` (default 70) | `EDIT_FOOTPRINT_HIGH` (Minor) — never blocks. Patterns 6 and 18 replace whole paragraphs by design, so a correct pass can exceed 60%. Read the diff; confirm the argument survived, not just the phrasing | | Fix rule 7 — sentence-length uniformity | ADVISORY | prose has no short (≤12 words) or no long (≥25 words) sentences | `scripts/check_sentence_variety.py --manuscript <file>` → `SENTENCE_UNIFORM` (Minor); break up or combine sentences until both bands exist. Silent below 15 sentences | ## Global-rule references Some passages in this skill cite a path of the form `~/.claude/rules/<name>.md`. Those are the maintainer's personal global rules, kept outside this repository. They are **not shipped with this skill** and will not exist on your machine; they appear only as provenance for where a convention came from. If one of them looks like it is standing in for an instruction you actually need, that is a bug — please open an issue, because the instruction belongs here. -
skill.yml 1.4 KB
schema_version: 2 name: humanize layer: C owner_domain: ai_pattern_removal maturity: official when_to_use: "Detect and remove the 27 common AI-writing patterns from an academic manuscript while preserving technical accuracy." when_NOT_to_use: "Drafting content (use write-paper); AI-search optimization (use academic-aio)." inputs: - "manuscript / section text (Markdown)" outputs: - "revised text with AI patterns removed" side_effects: - writes_project_artifacts downstream_consumers: - self-review - write-paper forbidden_actions: - alter_numeric_values_or_citations - change_scientific_meaning # v2.1 quality card purpose: "Rewrite flagged passages to read as naturally human-written without changing facts, numbers, or citations." safety_boundaries: - "Edits style only; never alters numeric values, citations, or scientific meaning." - "Preserves the manuscript's technical claims while removing AI tells." known_limitations: - "Pattern detection is heuristic; subtle tells may remain and need a human pass." - "No standalone demo; judgement is required on borderline phrasings." - "Patterns 1-18 are inherited from an external list; their thresholds are conventional, not measured on a medical corpus." validation_commands: - "scripts/check_rewrite_fidelity.py --before <pre> --after <post> --strict" - "scripts/check_sentence_variety.py --manuscript <file>" - "/self-review" evidence_surface: manual_workflow
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.