agentleFS
seandaviseandavi/scriptorium/skills/outlier-sentence-detector/SKILL.md

outlier-sentence-detector

Skill5 starsChanged 6 months agoMITView on GitHub

Flag sentences that are statistical outliers in the manuscript along three narrow dimensions — length, syntactic complexity, and nominalization density — for human review. Reports candidates as a structured markdown table with location and rationale. Does NOT produce a quality score, a grade, or a pass/fail. Does NOT edit the manuscript. Calibrates against the manuscript's own distribution so the flags adapt to the author's baseline rather than a universal target.

The file

We split this skill into the rules it gives an agent

7 rules. About 0 are common, 3 are distinctive, and 4 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈3

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 4

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    no-writing-quality-score (accuracy; fixed): No overall score, grade or readability index, ever.

    line 111
  2. Very specific:

    If MANUSCRIPT_STATE.yaml is missing, proceed at standard-level density and note in the output that the run was un-grounded.

    line 139
  3. Very specific:

    Read meta.guidance_level from MANUSCRIPT_STATE.yaml (default standard if absent).

    line 144
  4. Distinctive:

    Run the signal-based check-in once if appropriate (see the convention note).

    line 167
  5. Very specific:

    Segment into sentences: Use a conservative segmenter: sentence-final ., !, ?

    line 187
  6. Distinctive:

    Emit the report: Use the section headings below verbatim so downstream skills and future orchestrators can consume the output by structure.

    line 244
  7. Distinctive:

    Descriptive rationale: Every per-row line is "worth re-reading because X" — never "this sentence is bad" or "rewrite to Y." The author owns …

    line 369

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Outlier sentence detector

You are running scriptorium's outlier-sentence-detector skill. The job is to surface a tractable handful of sentences that deviate sharply from the manuscript's own distribution along three narrow dimensions — length, syntactic complexity, and nominalization density — so the author can re-read them and decide whether each one is fine as-is or needs work. This is a critique skill at the line-editing / copyediting boundary (see [[copyediting-vs-developmental]]); it queries, it does not fix.

Critical constraints — read before doing anything else

  1. This skill flags candidates for human review. It is not a quality score. It must never produce an overall rating, grade, percentage, pass/fail verdict, or any number that purports to summarise the manuscript's writing quality. Per [[quantitative-quality-measures]]:

    "There is no single number that captures [writing quality], and any tool that produces one is throwing information away." The first useful operation the note lists is outlier flagging. Outlier flagging is what this skill does. Quality scoring is not. This is the fixed accuracy guard no-writing-quality-score: no override lifts it.

  2. Thresholds are author-tunable via meta.guidance_level. At light ("terse" in scriptorium's scheme), report only the top ~3 flags per dimension; at standard, up to ~7; at full, up to ~15. If every sentence in a manuscript looks like an outlier, the output is useless — calibrate to surface a handful per pass.
  3. Calibrate against the manuscript itself. The distributional statistics (median length, length spread, complexity distribution, nominalization-density distribution) are computed from the submitted prose. The skill adapts to the author's baseline; it does not import a universal target. Per [[quantitative-quality-measures]], universal-target tools (Flesch-Kincaid, SMOG, Coleman-Liau) are theatre for scientific text; this skill is explicitly not that.
  4. Output is descriptive, not directive. Each flag is "worth re-reading because X", never "this sentence is bad" or, by default, "rewrite this sentence to be shorter". The author decides what to do. Concrete rewrites are available only when the author overrides the critique-rewrite-suggestions guard (see Guards and overrides).
  5. Never modify the manuscript. This skill emits a markdown report only.
  6. Use a sensible floor for short manuscripts. A 500-word abstract has a small enough distribution that pure σ-based thresholding produces nonsense. Apply absolute floors below the statistical thresholds (see Operational protocol) so short documents do not over-flag.

Invocation discipline — when to invoke, when not

Invoke when:

  • The user explicitly asks for an outlier-sentence pass.
  • An author is doing a late-stage line-editing review and wants a short list of sentences to re-read.
  • A compression or argumentative-flow pass has just landed and the author wants to surface candidates whose new shape may have drifted out of the document's distribution.

Do not invoke when:

  • The document is in outline phase — distributional statistics on stub prose are noise. This is the outline-phase scope guard; the author can override it.
  • As a silent side-effect of another skill. This is a critique skill the author asks for, not a precondition for another transformation.
  • A user is asking "is my writing any good?" — the skill cannot answer that question. Say so, then offer to surface candidates the author can re-read. This is the fixed no-writing-quality-score guard.

Guards and overrides

This skill's guards are declared in manifest.yaml and follow [[author-authority]]: the author decides what the skill may do, except where proceeding would make the output wrong.

  • outline-phase (scope; default refuse). Fires when document_phase.current is outline. State the concern and its source in one line: "The manuscript is at outline phase; there is not yet enough declared prose for this skill to work on (outline-phase; source: [[declared-work-scope]])." Then decline, and say how to override: answer "proceed" in this run, or add an entry for this guard and this skill under meta.overrides. On override, run the full protocol, short-document floors included, and note in the Summary that the distribution is computed over outline-phase prose.
  • critique-rewrite-suggestions (scope; default refuse). Fires when the author asks how to fix a flagged sentence. State the concern and its source in one line: "This critique skill flags problems for the author to fix; by default it proposes no concrete rewrites (critique-rewrite-suggestions; source: [[copyediting-vs-developmental]])." Then decline, naming the same two override routes. On override, add one rewrite per flagged sentence, marked as a suggestion (see Output format). Each suggestion keeps the sentence's cite keys and numbers verbatim and makes no claim that it is better; the author decides.
  • no-writing-quality-score (accuracy; fixed). No overall score, grade or readability index, ever. Neither a per-run answer nor meta.overrides lifts it; if asked to, say the guard protects correctness and cannot be overridden, then offer the outlier candidates instead.

For each scope guard, the first of these decides: the author's answer in this run, in either direction; an entry under meta.overrides naming the guard and this skill (or "*"); the default, refuse. State the one-line concern at every guidance level, including terse, and even when an override applies. When the run proceeds past a scope guard, the output carries an Overrides applied: line listing the guard ids (see Output format); otherwise the line is omitted.

Inputs you should expect

The user will provide, or you should ask for:

  • Manuscript text — file path(s) or pasted prose. Multi-file projects: every file declared under sections is included so the distributional statistics are over the manuscript as a whole.
  • MANUSCRIPT_STATE.yaml — usually at the manuscript's root. The meta.guidance_level field controls how many flags to surface per dimension. The bibliography.paths field is used to exclude bibliographic prose from the statistics (citation entries are not manuscript prose).

If MANUSCRIPT_STATE.yaml is missing, proceed at standard-level density and note in the output that the run was un-grounded.

Conversational style

Read meta.guidance_level from MANUSCRIPT_STATE.yaml (default standard if absent). Adapt framing — not the structured output's shape — per [[guidance-level]]. Note that on this skill the level also controls how many flags are surfaced (see Critical constraint 2 above):

  • terse — open with a one-line "running outlier-sentence detector"; emit the markdown report; surface up to ~3 flags per dimension; no closing summary.
  • standard — open with a sentence naming the manuscript and the total sentence count; surface up to ~7 flags per dimension; close with a one-line summary.
  • full — open with what this skill produces (length / complexity / nominalization-density outliers, calibrated against the manuscript itself) and a one-paragraph explanation that this is not a quality score; surface up to ~15 flags per dimension; close with a brief reminder that an unflagged sentence is not a good sentence (the skill only finds outliers). If running for the first time in this session, also offer /scriptorium:explain outlier-sentence-detector so the author can learn the skill's design and posture before reading its output.

Run the signal-based check-in once if appropriate (see the convention note). The no-quality-score posture is never relaxed based on guidance level.

Operational protocol

Work in this order. The order matters — distributional statistics have to be computed before any sentence can be called an outlier.

  1. Read MANUSCRIPT_STATE.yaml. Extract meta.guidance_level, bibliography.paths, meta.overrides, and document_phase.current. If document_phase.current == "outline", the outline-phase guard applies: decline unless overridden — there is not enough stable prose to compute a distribution against.
  2. Read every manuscript file. Concatenate the prose. Strip front-matter, code blocks, equations, tables, and figure captions — these have their own distributional characteristics and would skew the statistics. Strip bibliography prose so cited metadata is not counted.
  3. Segment into sentences. Use a conservative segmenter: sentence-final ., !, ? followed by whitespace and a capital letter or end-of-paragraph. Treat common abbreviations ("e.g.", "i.e.", "et al.", "vs.", "Fig.", "Eq.", "Dr.", "Mr.", "Ms.", "Prof.", "Inc.", "Ltd.", numeric decimals) as not sentence boundaries. Drop sentences shorter than 5 words — these are usually fragments, table captions, or list items.
  4. Compute the document's distribution. For each sentence, record:
    • Word count — token count after stripping punctuation and citation markers ([12], (Smith 2020), @pmid:...).
    • Complexity proxy — count of commas plus subordinators (although, because, since, while, whereas, if, unless, when, where, which, who, that, whether, before, after) plus coordinated-conjunction stacks (two or more and / or in the same sentence count as a stack). This is a defensible proxy, not a grammar parse. Do not invoke a full parser — the proxy is a project choice, enough to find outliers and cheap enough to be reliable.
    • Nominalization density — fraction of content words ending in -tion, -ment, -sion, -ance, -ence. Exclude a deny-list of high-frequency false positives: function, evidence, experience, reference, sequence, instance, presence, absence, variance, distance, science, audience, essence, consequence, incidence, compliance, confidence, mention, intention, convention, dimension, extension, version, region, session, precision, decision, vision, mission, division, expression, impression, comparison, position. (These are tokens whose -tion/-sion/-ence endings are etymological residue, not active nominalisation in the Joseph Williams / Helen Sword sense.) Content words are anything other than the ~50 most common English function words.
  5. Compute thresholds. For each dimension, calculate the median (m) and the standard deviation (σ). Apply these thresholds:
    • Length: flag sentences whose word count exceeds max(m + 2.5σ, 35). The 35 is the absolute floor — short documents have small σ and pure σ-thresholding would surface reasonable sentences.
    • Complexity: flag sentences whose complexity proxy exceeds max(m + 2.5σ, 5). The 5 is the floor (a sentence with 5+ commas + subordinators is worth a re-read regardless of document spread).
    • Nominalization density: flag sentences whose density exceeds max(m + 2.5σ, 0.30) — i.e., 30% of content words are nominalizations. The 0.30 floor is a project default; [[quantitative-quality-measures]] does not evaluate nominalization density, and it warns that readability formulas penalise legitimate nominalisation.
  6. Rank within each dimension. Sort flagged sentences by distance from the threshold, most-extreme first.
  7. Cap by guidance level. Surface only the top N per dimension where N is 3 (terse), 7 (standard), or 15 (full). If a sentence appears in multiple dimensions, list it in each — but the rationale per dimension is distinct.
  8. Emit the report. Use the section headings below verbatim so downstream skills and future orchestrators can consume the output by structure.

The thresholds (2.5σ, the absolute floors, the deny-list) are the current defaults. They are not load-bearing in the way the preservation constraints in transformative skills are — a future revision can tune them. What is load-bearing is that the skill calibrates against the manuscript's own distribution and that it surfaces a handful, not hundreds.

Output format

Emit a markdown document with exactly these section headings, in this order:

# Outlier sentence detector

Overrides applied: <guard ids>

(Only when this run proceeded past a scope guard, through a per-run
answer or `meta.overrides`. Omit the line otherwise.)

## Summary

- Sentences analysed: N
- Median sentence length: N words
- Median complexity proxy: N
- Median nominalization density: 0.NN
- Guidance level applied: terse | standard | full
- Length outliers surfaced: N (of M flagged)
- Complexity outliers surfaced: N (of M flagged)
- Nominalization-density outliers surfaced: N (of M flagged)

## Length outliers

(One row per flagged sentence, ranked by distance from threshold.
Excerpts are the first 15-20 words of the sentence followed by
"…" if truncated.)

| Location | Sentence excerpt | Length (words) | Distance from median |
|---|---|---|---|
| section:line | "…first 15–20 words of the sentence…" | N | +Xσ / +Y words |

Per-row rationale and "what to look at" lines follow the table:

- **section:line** — Worth re-reading because this sentence is X×
  the manuscript's median length; consider whether two clauses
  could be split or whether the connective tissue is doing real
  work.
  - *Suggestion (author's call):* "<one possible rewrite>" (only
    under a `critique-rewrite-suggestions` override; one per flagged
    sentence, in every dimension's list).

## Complexity outliers

| Location | Sentence excerpt | Proxy measure | Rationale |
|---|---|---|---|
| section:line | "…" | N commas + M subordinators + K and/or-stacks | High clause depth |

- **section:line** — Worth re-reading because the proxy is X above
  the manuscript's median; consider whether the nested clauses
  are tracking one argument or whether the sentence is doing too
  much.

## Nominalization-density outliers

| Location | Sentence excerpt | Density | Flagged nominalizations |
|---|---|---|---|
| section:line | "…" | 0.NN | "implementation", "evaluation", "demonstration" |

- **section:line** — Worth re-reading because the density is X
  above the manuscript's median; consider whether any of the
  flagged nominalizations could be verbs instead. (Per Joseph
  Williams' style guidance: "the implementation of the algorithm
  demonstrated" reads heavier than "the algorithm demonstrated".)

## What this skill did NOT check

(Honest list. Always include the items below; add specifics from
the current run where relevant.)

- **Writing quality.** Per [[quantitative-quality-measures]],
  writing quality is dimensional and no automatic measure of it
  is defensible for scientific text. An unflagged sentence is
  not a good sentence; a flagged sentence is not a bad sentence.
- **Readability.** Flesch-Kincaid, SMOG, Coleman-Liau and similar
  indices systematically mis-score scientific prose (technical
  terms inflate difficulty); the skill deliberately does not
  emit such a score.
- **Content correctness.** Whether a claim is true, supported,
  or appropriately hedged is `citation-audit`'s territory, not
  this skill's.
- **Argument strength.** Whether the manuscript's reasoning
  holds together is `argumentative-flow` / `reviewer-simulation`
  territory.
- **Sentences in other dimensions** — there are many ways a
  sentence can be unusual that this skill does not check
  (passive-voice density, hedging stack length, ESL-marker
  density). Adding a dimension is a non-trivial design decision
  bounded by [[quantitative-quality-measures]]'s warning
  against universal-target metrics.
- **Sentences in tables, figure captions, equations, and code
  blocks.** Their distributional characteristics differ from
  prose; including them would skew the statistics. Captions and
  caption-attached prose are excluded.

What "good output" looks like

  • Tractable count. A 5000-word manuscript at the standard level should surface roughly 5–10 flags across the three dimensions, not 50. If the manuscript itself has unusually high variance, surfacing fewer is acceptable; surfacing many more means the thresholds or caps are mis-set for the document.
  • Location-anchored. Each row names the section and line so the author can re-read in context. Never "the manuscript contains long sentences"; always "introduction:34, methods:81".
  • Calibrated, not universal. The Summary reports the manuscript's own median for each dimension so the author can see what "outlier" means for this document. A 50-word sentence is a long sentence in some manuscripts and unremarkable in others — calibration to the source is the point.
  • Descriptive rationale. Every per-row line is "worth re-reading because X" — never "this sentence is bad" or "rewrite to Y." The author owns the decision. Under a critique-rewrite-suggestions override, the one suggestion per flag sits below the rationale, labelled as a suggestion.
  • Honest about caps. The Summary names the number surfaced and the number flagged (e.g., "Length outliers surfaced: 7 of 23 flagged") so the author can request a higher guidance level if they want the full list.
  • The "did NOT check" section is loud. Per the convention on did NOT check sections established in citation-audit and used throughout scriptorium, this is where automation complacency is countered — the author should walk away knowing exactly what the skill did and did not look at.

What you must not do

  • Produce an overall manuscript writing-quality score, grade, percentage, pass/fail, rating, or any single number that purports to summarise the manuscript's prose. This is the load-bearing refusal of the skill, and a fixed accuracy guard (no-writing-quality-score).
  • Optimise toward Flesch-Kincaid, SMOG, Coleman-Liau, or any other universal-target readability index. The skill calibrates to the manuscript, not to a generic target.
  • Modify the manuscript.
  • Direct the author to specific rewrites ("change X to Y") unless the author has overridden critique-rewrite-suggestions; even then, offer one suggestion per flag, labelled as such. The skill surfaces candidates; the author decides.
  • Flag the same sentence repeatedly per dimension to inflate the count. One row per dimension per sentence; cross-listed sentences are listed once per dimension with a distinct rationale.
  • Surface so many flags the report is unusable. If every sentence is an outlier, the report has failed at its job; tighten the caps and try again.
  • Make claims about what would make the flagged sentences "better" — the skill has no reliable basis for that claim.

Grounding

This skill is grounded in scriptorium's knowledge layer:

  • [[quantitative-quality-measures]] — the load-bearing grounding note. Its verdict on writing-quality scoring is Selective Yes: general-purpose quality scores (Flesch-Kincaid, SMOG) are theatre for scientific text, and BERTScore-based accept/reject for edits is refused outright, but narrow outlier-detection skills are defensible because they surface candidates for human review without claiming to measure quality. This skill is the v0.3 cash-out of that Selective Yes. The note's specific guidance — "flags sentences outside reasonable distributional bounds for their section [...] Calibration: distributions are computed from the manuscript itself (or a corpus matched to its discipline) so the heuristic adapts to the author's baseline" — is what the operational protocol implements.
  • [[copyediting-vs-developmental]] — situates the skill on the Einsohn / Mossop / CSE editorial gradient. Outlier flagging is a copyediting / line-editing diagnostic: the copyeditor queries the author when a sentence is unusual; the copyeditor does not rewrite. This is the editorial-taxonomy basis for the "descriptive, not directive" default (critique-rewrite-suggestions).
  • [[guidance-level]] — controls the conversational framing and (uniquely on this skill) the cap on how many flags are surfaced per dimension. Both behaviours follow the convention's principle: the structured output shape is unchanged across levels; what changes is how the skill talks and, here, how many candidates it walks the author through.
  • [[declared-work-scope]] — the skill operates on declared prose. By default it declines to run at outline phase (no stable distribution to compute; outline-phase) and does not invent the sentences it flags; it only points at what the author has written.
  • [[author-authority]] — the scope guards are defaults the author can override; no-writing-quality-score is an accuracy guard and stays fixed.

A drift away from these groundings either gets the skill updated or gets the grounding extended; never both unchanged.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.