60 lines
2.6 KiB
Markdown
60 lines
2.6 KiB
Markdown
# /unslop cleanup
|
|
|
|
Surface AI patterns as reviewable edits the user accepts or rejects, rather than
|
|
a finished rewrite. Agent-invoked, never a background daemon. Route here on
|
|
`/unslop cleanup` or when the user wants suggestions instead of a silent rewrite.
|
|
Set `$INPUT` to the source.
|
|
|
|
## Report-only variant
|
|
|
|
When the user says "flag only", "just detect", "audit only", "don't change
|
|
anything", or passes `--report`, change nothing. Scan and report:
|
|
|
|
```bash
|
|
python3 scripts/banned_phrase_scan.py <<< "$INPUT"
|
|
python3 scripts/structure_scan.py <<< "$INPUT"
|
|
python3 scripts/silhouette_scan.py <<< "$INPUT"
|
|
python3 scripts/readability_metrics.py <<< "$INPUT"
|
|
```
|
|
|
|
Report each issue by span, category, severity, and why it reads as machine-
|
|
written, separating clear problems from register-dependent judgment calls (the
|
|
audit-only shape in SKILL.md **Output Format**). Re-read negations, scope, and
|
|
certainty yourself; the scanners are necessary, not sufficient.
|
|
|
|
## Suggestion flow
|
|
|
|
```bash
|
|
python3 scripts/suggest.py document.md # emit suggestions
|
|
python3 scripts/suggest.py doc.md --apply-replacements repl.json # merge model replacements
|
|
python3 scripts/check_suggestions.py suggestions.json # blocking contract gates
|
|
```
|
|
|
|
- **Detection is cheap and deterministic.** `suggest.py` runs both scanners and
|
|
emits LSP-style suggestions `{span, severity, category, rationale,
|
|
suggested_replacement, phrased_as_question}`, ordered and non-overlapping.
|
|
- **Replacement generation is delegated to a stronger model.** `suggest.py`
|
|
leaves `suggested_replacement` null; the stronger model fills them, merged back
|
|
via `--apply-replacements`.
|
|
- **Hard findings** become direct replacements; **soft findings** are register-
|
|
dependent, so their rationale is phrased as a question
|
|
(`phrased_as_question: true`).
|
|
- **Suggestions are surfaced to the user, never silently applied.**
|
|
|
|
## Contract gates
|
|
|
|
`check_suggestions.py` is the blocking contract. Every replacement clears all
|
|
four gates or it is rejected:
|
|
|
|
- `span-minimality`: the edit changes only its span (a whole-sentence rewrite
|
|
fails).
|
|
- `replacement-scanner`: each replacement passes both scanners in isolation and
|
|
adds no new violation in context.
|
|
- `accept-all`: applying every suggestion yields a document that passes both
|
|
scanners with `validate_preservation` exit 0 versus the original.
|
|
- `span-overlap`: spans must not overlap.
|
|
|
|
Non-English input is declined the way the scanners decline it: `suggest.py`
|
|
returns `non_english: true` with no suggestions. For a full rewrite instead of
|
|
suggestions, route to `references/commands/rewrite.md`.
|