Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .cursor/skills/laconic-prose/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ For spelling choices, grammatical word pairs, compounds and other mechanics (cap

- **Leave effective writing alone.** Tie each edit to a defect, a requested change or a house style rule. When the difference is only taste in a human's draft, keep theirs.
- **Lead with what the reader needs.** The first sentence carries the answer, result or required action. Cut generic setup; keep personal context that contributes.
- **Write literally.** Use the plain word where a metaphor stands in for it. Expand shorthand the reader has not seen. Do not compress a sentence until it loses its verb or its caveat.
- **Write literally.** Use the plain word where a metaphor stands in for it. Expand shorthand the reader has not seen. Do not compress a sentence until it loses its verb or its caveat. In fiction, keep figurative language and judge only its density: metaphors, triads and pivots in sentence after sentence.
- **Name the actor.** Use active voice when it clarifies responsibility; keep passive voice when the actor is unknown or unimportant. An abstract subject may show, indicate or allow; if the verb needs intent or proof (decide, argue, demonstrate, tell us), name who did it.
- **Make verbs do the work.** 'Made a decision' becomes 'decided'; 'serves as' becomes 'is'. Keep the original certainty.
- **Hedge once.** Keep one qualifier at the confidence the evidence supports. Preserve 'I think' and 'maybe' when they carry a human writer's real doubt.
Expand Down
4 changes: 2 additions & 2 deletions .cursor/skills/laconic-prose/references/patterns.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@ Apply these patterns in context using the meaning, voice and protected text rule

## Words to inspect

Current models favour these; inspect them first: load-bearing, carries (meaning holds or conveys), anchor (figurative), fires (meaning triggers, outside platform terms), earns its keep, quietly, landscape, surface (as a verb for show), genuinely, real, actual, crisp, sharp, robust (outside statistics), nuanced.
Current models favour these; inspect them first: load-bearing, carries (meaning holds or conveys), anchor (figurative), fires (meaning triggers, outside platform terms), earns its keep, quietly, landscape, surface (as a verb for show), genuinely, real, actual, crisp, sharp, robust (outside statistics), nuanced, innovative.

The older list still applies but is now rarer in agent output: delve, foster, leverage, utilize, facilitate, empower, streamline, robust, cutting-edge, paradigm shift, game changer, this is huge, this changes everything, tapestry, realm, beacon, multifaceted, meticulous, intricate, paramount, transformative, elevate, embark, supercharge, harness, ever-evolving.

Replace empty or inflated uses with plain wording. Preserve precise technical or literal uses, proper names and quotations: 'financial leverage', 'robust standard errors' and 'a safety harness' are not defects. Explicit user word bans still apply to original prose.

Adverbs that are often empty include just, literally, honestly, simply, actually, truly, fundamentally, importantly, crucially, inherently and inevitably. Cut them when they add nothing; retain real emphasis, uncertainty or characteristic voice.

Phrases that are often empty include it's worth noting, it's important to note, at the end of the day, when it comes to, at its core, in today's world, in a world where, in the age of, in the world of, in this article, the reality is, the truth is, in terms of, with regard to, in order to, going forward and let's dive in. Remove delay and repetition without erasing meaning or ordinary spoken language.
Phrases that are often empty include it's worth noting, it's important to note, at the end of the day, when it comes to, at its core, in today's world, in a world where, in the age of, in the world of, in this article, the reality is, the truth is, in terms of, with regard to, in order to, going forward, let's dive in and practical solutions, and timeless openers such as 'has fascinated people for centuries' and 'since the dawn of time'. Remove delay and repetition without erasing meaning or ordinary spoken language.

Business jargon stands in for a plain verb: navigate (a problem), unpack, lean into, double down, deep dive, take a step back, circle back, on the same page and moving forward. Write what happens: 'handle the backlog', 'explain the variance', 'review it again on Friday'. Keep literal uses ('navigate to Settings', 'the diver made a deep dive').

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ The remaining cases protect existing contextual decisions.
| Gap-filling | 'The ATO is likely reviewing it, which typically takes two weeks,' with no source. Cut or flag the guess. | 'The portal shows the return as under review.' Keep the supplied fact. |
| Own-draft voice | A handoff note or earlier assistant turn offered as the user's voice sample. Do not imitate it; write plainly. | An email the user typed themself. Match its cadence and register. |
| Service-desk empathy | 'I completely understand your frustration and truly appreciate your patience. Rest assured...' Replace with one plain line and the answer. | 'Sorry this has taken so long.' Keep the warranted apology. |
| Social post template | A LinkedIn post opens 'I almost quit.', adds '20 years in tax taught me this:', lists '✅ Consistency ✅ Discipline ✅ Growth' and ends 'Success is a journey.' Lead with the post's supplied point, drop the hook, emoji bullets and moral, and keep the credential only if the point relies on it; invent no story. | 'We released version 2.1 today: bank feeds now import CSV files. Release notes are on the website.' Keep it; a short factual post needs no change. |
| Gutted draft | Cutting slop from a social post leaves 'Details below. 👇' and no point. Rebuild from the supplied facts, drop the pointer and list the facts needed. | A short post whose one claim survives the cuts. Leave it short. |
| Contradicted status | A handoff with no checks-not-run list ends 'Ready for review.' State the true status. | A handoff that lists its checks not run and ends 'Ready for review.' Keep it. |
| Reviewer scope line | A handoff edit cuts 'I didn't touch the CI config'. Keep one short scope line for the reviewer; mark unverified 'behaviour unchanged' as unverified. | A client email saying 'I haven't changed anything else in your file.' Cut it unless the client asked. |
Expand Down
8 changes: 8 additions & 0 deletions .cursor/skills/laconic-prose/references/venues.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,14 @@ Before drafting for a repository or a recurring venue, read 2 or 3 recent exampl
- Give the cause the facts support and the fix, in the order the user acts.
- No restated question, no closing summary, no offer of more help.

## Social post

- First line: the news, result or point itself, with its figure or date. No one-line hook that withholds it ('I almost quit.').
- State credentials once, and only when the claim depends on them.
- Sentences, or a list of real items when there are 3 or more. No emoji-led bullets and no bullet per sentence.
- End on the point or the requested call to action. No moral, lesson or aphorism ('Consistency beats talent.').
- Keep the writer's voice and any hashtags or links they supplied. Invent no anecdote to open the post.

## End-of-task report to the user

- First sentence: what is done, in their terms.
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ Laconic beats the plain instruction by 0.56 weighted. The changes are neutral on

</details>

Limits: 18 to 90 answers per setup from one generating model; the cases are in `evals/cases.jsonl` and the rubric in `evals/rubric.md`. Serial commas remain the most common slip.
Limits: 18 to 90 answers per setup from one generating model; the cases are in `evals/cases.jsonl` and the rubric in `evals/rubric.md`. These cases also guided the rule wording, so the scores are not a held-out test; the next public comparison will use the 10 frozen cases in `evals/holdout-cases.jsonl`, written on 1 November 2026 and not used to tune the rules. Serial commas remain the most common slip.

### Against other humanisers

Expand Down Expand Up @@ -190,7 +190,7 @@ Limits: 40 texts per setup from one generating model, judged by the same model f

## Checker

`tools/laconic-check` is a small Rust CLI with no dependencies. `lint` flags candidates in Markdown prose: em dashes, US spellings, 'while' and 'among' as conjunction and preposition, double quotation marks, possible serial commas, numbers written as words, dates and times in non-Style Manual forms, weekdays that do not match their date, Latin abbreviations, chatbot closers, stock phrases such as 'Bottom line:' or 'circle back', staged contrasts ('it's not X, it's Y'; 'not just X but Y') verbless reveal questions ('The result? A 40% cut.') and unnecessary hyphens such as 'open-source' or 'e-mail', skipping code, URLs and quoted text. It also flags chat-tool residue, such as zero-width characters, citation markers and ChatGPT tracking tags, including inside links. `preserve` reports numbers, sizes and units ('$47.3 million' to '$47.3 billion', '150 km' to '150 miles'), dated months, inline code, URLs, words such as 'not', 'must', 'will', 'if', 'before' and 'likely' and bounds such as 'up to' and 'about 50%' that an edit dropped, and fails on them. It counts 'three' and '3', '1000' and '1,000', and '5 per cent' and '5%' as the same value, and ignores ordered list markers of up to 2 digits. It also lists those the edit added, such as an invented figure, as advice; `--strict` fails on them too, for a rewrite that must add nothing. Names of 2 or 3 capitalised words that an edit lost are listed to check and never fail. It does not read for meaning, so a clean result only rules out these losses. A finding is a reason to look, not proof of a defect.
`tools/laconic-check` is a small Rust CLI with no dependencies. `lint` flags candidates in Markdown prose: em dashes, US spellings, 'while' and 'among' as conjunction and preposition, double quotation marks, possible serial commas, numbers written as words, dates and times in non-Style Manual forms, weekdays that do not match their date, Latin abbreviations, chatbot closers, stock phrases such as 'Bottom line:' or 'circle back', staged contrasts ('it's not X, it's Y'; 'not just X but Y') verbless reveal questions ('The result? A 40% cut.'), timeless openers such as 'since the dawn of time' and unnecessary hyphens such as 'open-source' or 'e-mail', skipping code, URLs and quoted text. It also flags chat-tool residue, such as zero-width characters, citation markers and ChatGPT tracking tags, including inside links. As advice that never fails `lint`, it flags a paragraph with clause dashes (an em dash, or a spaced en dash, hyphen or double hyphen) in 2 or more sentences; a pair around one aside counts once. `preserve` reports numbers, sizes and units ('$47.3 million' to '$47.3 billion', '150 km' to '150 miles'), dated months, inline code, URLs, words such as 'not', 'must', 'will', 'if', 'before' and 'likely' and bounds such as 'up to' and 'about 50%' that an edit dropped, and fails on them. It counts 'three' and '3', '1000' and '1,000', and '5 per cent' and '5%' as the same value, and ignores ordered list markers of up to 2 digits. It also lists those the edit added, such as an invented figure, as advice; `--strict` fails on them too, for a rewrite that must add nothing. Names of 2 or 3 capitalised words that an edit lost are listed to check and never fail. It does not read for meaning, so a clean result only rules out these losses. A finding is a reason to look, not proof of a defect.

```bash
cargo run --manifest-path tools/laconic-check/Cargo.toml -- lint README.md
Expand All @@ -199,7 +199,7 @@ cargo run --manifest-path tools/laconic-check/Cargo.toml -- preserve original.md

Prebuilt binaries for Linux (x86_64, static), Windows (x86_64) and macOS (Apple silicon) are attached to each `laconic-check-v*` release, with SHA-256 checksums; put the binary on the PATH. Building from source needs only Rust.

`lint -` reads standard input, so an agent can check a draft without saving it. When `laconic-check` is on the PATH, both skills run it on written deliverables before sending. Its US-to-Australian word list combines a hand-written list with about 2,400 pairs generated from the [English Speller Database](https://github.com/en-wl/wordlist) and reviewed against the Style Manual (`tools/laconic-check/gen_au_words.py`). Seeded-fault tests plant one known fault per rule into clean prose and require the checker to catch each one exactly once, with no findings on the clean text. A calibration test runs `lint` over the scraped Style Manual (about 208,700 words of human prose) and fails if its 82 findings rise or any stock phrase, staged contrast, reveal question or unnecessary hyphen appears, which guards against a net increase in findings on human text.
`lint -` reads standard input, so an agent can check a draft without saving it. When `laconic-check` is on the PATH, both skills run it on written deliverables before sending. Its US-to-Australian word list combines a hand-written list with about 2,400 pairs generated from the [English Speller Database](https://github.com/en-wl/wordlist) and reviewed against the Style Manual (`tools/laconic-check/gen_au_words.py`). Seeded-fault tests plant one known fault per rule into clean prose and require the checker to catch each one exactly once, with no findings on the clean text. A calibration test runs `lint` over the scraped Style Manual (about 208,700 words of human prose) and fails if its 82 findings or its 2 clause-dash advisories rise, or any stock phrase, staged contrast, reveal question or unnecessary hyphen appears, which guards against a net increase in findings on human text.

`tools/laconic-check/mcp/server.mjs` exposes `lint` and `preserve` as MCP tools, with no dependencies beyond Node:

Expand Down
10 changes: 10 additions & 0 deletions evals/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,16 @@ output file are skipped. A group missing a condition cannot be scored, because t
conditions would no longer be judged on identical rows. It is reported on
stderr and left out rather than silently dropped.

Before citing blocker counts, check the judge against hand labels. `judge-calibration.jsonl` holds 10 responses to existing cases, each labelled blocker or not: a correct and a wrong product, a destructive command with and without confirmation, a list missing Tasmania, a US spelling left in an edit, a status note with and without invented verification, a brief reply and a long but sound recommendation. `--calibrate` judges each alone with the same prompt and reports agreement:

```bash
python3 scripts/judge.py --runner claude --calibrate evals/judge-calibration.jsonl
```

On 1 November 2026 (Claude Code 2.1.312, `claude-opus-5-5`, 1 trial) it agreed on all 10, at a reported US$0.34. Read any disagreement before judging; the labels cover the blocker field only, not the 1 to 5 scores.

`holdout-cases.jsonl` holds 10 frozen cases written on 1 November 2026 and never used to choose rule wording. Use them for the next public comparison (`--cases evals/holdout-cases.jsonl`), and replace the whole set rather than editing it after seeing results; a test pins its contents.

Judging by hand instead is still supported: blind the `condition` field
yourself and write one JSON object per response with these fields.

Expand Down
Loading
Loading