Agent skill

evlog Content Writing

by evloghq in evloghq/evlog

Rules for writing and reviewing evlog docs, blog posts, READMEs, skills and AGENTS.md files, with separate review and rewrite roles, a house voice and a catalog of AI-sounding tells.

MITAuto-check passedWriting & Content

Install evlog Content Writing

skills CLI
$ npx skills add evloghq/evlog --skill write-evlog-content -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install evloghq/evlog write-evlog-content --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/evloghq/evlog.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/write-evlog-content .claude/skills/write-evlog-content && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
write-evlog-content
GitHub stars
1.9k
Token cost
~2.9k tokens
SKILL.md length
1,506 words
Files
17 (incl. references)
Skills in repo
20
Repo updated
First seen
Licence
MIT

At a glance

Rules for writing and reviewing evlog docs, blog posts, READMEs, skills and AGENTS.md files, with separate review and rewrite roles, a house voice and a catalog of AI-sounding tells.

  • Works in 6 steps: Separate the rules from the rhythms. A… → Put every rhythm candidate next to its… → Check it against samples.md. These are… → …
  • Drafting a docs page or blog post in the evlog voice
  • SKILL.md covers Structure, The corpus, Severity and Reviewing, plus 3 more sections
  • Calls pnpm

What it does

The skill keeps two roles apart. Review produces findings and a verdict and never rewrites or proposes wording, while rewrite changes only what a finding names and cites the rule or tell ID for each change. Reference files hold the voice and its five tests, which load first, atomic rules grouped by surface (blog, docs, landing, machine and universal), an AI-tells list loaded when reviewing, terminology, samples and corrections. Dossiers on other loggers such as consola, logtape, OpenTelemetry, pino and winston are read before any sentence that names a competitor.

It treats the corpus as prose read by people, such as docs, the landing page, blog posts and READMEs, and prose read by agents, such as skills and AGENTS.md files. Punctuation, terminology, accuracy and dead-link rules apply to both, but rhythm rules do not apply to procedures. A content lint script scans the surfaces but excludes this skill's own references, which should be read by a person. Findings on skill files return as a report, not a rewrite. The excerpt is cut off at severity.

When your agent uses it

  • Drafting a docs page or blog post in the evlog voice
  • Reviewing a README or landing page for accuracy and AI-generated phrasing
  • Editing a SKILL.md or AGENTS.md without breaking its procedure
  • Writing a sentence that compares evlog with another logging library

Example prompts

  • “Review this evlog blog draft and list findings with their rule IDs, without rewriting anything.”
  • “Rewrite the docs page applying only the findings from the review.”
  • “Check this README for AI-sounding phrasing and tell me which tells it hits.”
  • “Write a paragraph comparing evlog with pino using the pino dossier.”

Requirements

  • The evlog repository

Workflow steps

6 steps, taken from the first numbered list in SKILL.md.

  1. Separate the rules from the rhythms. A house rule (U-14 punctuation, T-13 assistant framing, T-15 a retired entry point) is already…
  2. Put every rhythm candidate next to its twin. Each tell in ai-tells.md ships Reads generated and Reads legitimate. Almost every one has a…
  3. Check it against samples.md. These are evlog pages that read right. The test that decides most borderline cases: does the line deliver a…
  4. Verify what the scanner flagged as drift. Every symbol in backticks that the scanner could not find in packages/evlog/src is either a doc…
  5. Check every comparison against its dossier. A U-12 candidate means a sentence claims something about pino, winston, consola, or…
  6. Judge the structure yourself. Header template lock, paragraph-rhythm uniformity, and a page that never lets the reader do anything are…

What it can do on your machine

Read from SKILL.md and the folder at commit 59a105f. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • pnpm

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use pnpm, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

evlog Content Writing loads about 2.9k tokens when it runs, and up to ~22k if it reads all its reference files. Until then it costs about 129 tokens; SKILL.md has 1,506 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~129
When it runs · the whole SKILL.md, loaded when a task matches
~2.9k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~22k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from evloghq/evlog at commit 59a105f, republished under its MIT licence (© evloghq). 1,506 words, ~2,866 tokens.

Download SKILL.mdSave it as .claude/skills/write-evlog-content/SKILL.md (or your agent's skills folder). This skill also uses 16 other files; get the full folder from GitHub.
name
write-evlog-content
description
Write, review, and rewrite any evlog content: a docs page, the landing, a blog post, a package README, a skill, an AGENTS.md, a changeset. Load before drafting or editing prose in apps/docs/content, before writing a blog post, before touching a SKILL.md or an AGENTS.md, and whenever content is reviewed for voice, accuracy, or AI-generated slop. Carries the evlog voice, the atomic rules, the terminology, the competitor dossiers, and the AI-tell corpus with the legitimate twin for each tell.
metadata.internal
true

Writing evlog content

Everything needed to draft or judge evlog prose. Two roles use this skill and they must not be merged.

Review produces findings and a verdict. It never rewrites, never softens, never proposes wording. Rewrite applies findings. It touches only what a finding names, and cites the rule or tell id for every change.

Splitting them is what keeps the loop honest. A reviewer that can rewrite talks itself into changes it cannot justify, and a rewriter that can re-judge its own output always passes.

Structure

references/
  voice.md        the voice and the five tests. Load first, always
  rules/          atomic rules, one file per surface group
    universal.md    every surface
    docs.md         apps/docs/content
    blog.md         blog posts
    landing.md      0.landing.md and other marketing surfaces
    machine.md      skills and AGENTS.md, the surfaces an agent acts on
  ai-tells.md     the tell corpus, each tell with its legitimate twin
  terminology.md  the names evlog gave its own parts (U-15)
  landscape/      what pino, winston, consola, and OpenTelemetry actually do (U-12)
  surfaces/       what each surface owes its reader
    docs.md  blog.md  landing.md  readme.md  skill.md  agents.md  changeset.md
  samples.md      evlog pages that read right, and why. What the tells must not flag
  corrections.md  accumulated lessons from rejected rewrites. Grows over time

Load voice.md first. Then the rule file for the surface, ai-tells.md when reviewing, and the matching surfaces/ file when drafting. Open terminology.md when a U-15 candidate is in play and the relevant landscape/ dossier before writing any sentence that names another logger. Do not load everything.

The corpus

Everything evlog ships as prose, on both sides of the line:

Read bySurfacesWhat decides quality
Peopledocs pages, the landing, blog posts, the package READMEs, Evi's own docs under apps/evi/docs/Whether the reader can act, and whether they believe the page
Agents.agents/skills/, skills/, apps/evi/agent/skills/, the AGENTS.md filesWhether an agent does the right thing having read only this

The house rules cross the line: punctuation, terminology, accuracy, dead links. Rhythm does not. A skill whose four steps read as four parallel imperatives is a procedure, and the scanner leaves rhythm alone there. See rules/machine.md.

One part of that table is excluded from the scan: this skill's own references/, because they quote the prose they ban, worked pair by worked pair, and scanning them measures the examples. The exclusion lives in scripts/content-lint/lib/surfaces.mjs, and it means the scanner will never tell you those files drifted. Read them yourself.

Evi's own trees used to sit outside the corpus too, so the scanner read everything but them while their prose accumulated em dashes for months. They are in now, and that history is the reason: a written surface the scanner cannot see is one that can drift forever. Findings on a skill surface come back as a report for a person to judge, never as a rewrite of the instructions the pass itself runs on.

Severity

  • critical blocks publishing: a wrong code sample, a phantom API, a claim the source contradicts, a landing promise no page delivers.
  • standard is fixed when the page is touched: voice, rhythm, structure, punctuation.

A tell about rhythm is never critical on its own. Epigram density, heading shape, bullet frames, and sentence uniformity describe how prose reads, and prose that reads a certain way has never broken anything.

Correctness takes precedence over the scan score. Verify behavioral claims against the relevant source revision, run examples presented as executable, and check that comparison sources support the exact claim and configuration. Dossiers are research starting points and can be wrong even when recently checked. Search for exceptions to absolute guarantees and check equivalent workloads before drawing benchmark conclusions. A factual fix remains necessary if its style score falls; judge the new candidates before changing the prose again.

Two entries in the tell corpus are not rhythm and do not follow that rule. T-15 is drift: a symbol or entry point the package does not export, which is a fact the source settles and always critical. T-13 is a house rule the maintainer decided, and one occurrence is a finding. They live in ai-tells.md because that is where the scanner's ids are documented, not because they are matters of taste.

Reviewing

Run the scanner first, always:

bash
pnpm content:lint apps/docs/content/2.learn/2.wide-events.md --json

It returns per-page metrics, phrase hits, and API-drift findings. With no path it ranks the whole corpus worst-first, which is how a pass picks its target, and --surface narrows it to one kind of page:

bash
pnpm content:lint --top 10
pnpm content:lint --surface skill --top 5
pnpm content:lint --url https://example.com/post --as blog   # a page outside the repo
cat draft.md | pnpm content:lint --stdin                     # prose that is not a file yet

Some findings are fixed before anyone reads them. pnpm content:lint <paths> --fix applies the rules whose corrected text follows from the rule itself: a retired entry point, a term with one replacement, a link with a redirect behind it. Punctuation is not among them, so every dash reaches you. It re-scans afterwards and reverts any file that scored worse or that introduced a finding id the page did not have, so a fix that trades one problem for another never lands. Run it before reviewing, so a review spends its attention on what a codemod cannot decide.

Rates are compared per surface. A reference page and a skill file have different natural rhythms, and one median over both flatters whichever is looser. A --url scan drops every evlog-specific check: someone else's entry points, links, and vocabulary are theirs, so what comes back is how the page reads.

Every scan returns two lists. The findings are what tripped a counter. modelChecks is what no counter reached on that page, chosen for its surface and its shape: whether the claims carry a mechanism, whether the opening states a situation, whether a skill's description would route to it, whether the code runs. Answer all of them. A review that only works the findings reviews only what was measurable, and a page can satisfy every count while answering nothing.

Then, in order:

  1. Separate the rules from the rhythms. A house rule (U-14 punctuation, T-13 assistant framing, T-15 a retired entry point) is already decided: one occurrence is a finding. A rhythm (epigram density, uniform sentences, header lock) is a judgment call, and the scanner gives you the rate, not the answer.
  2. Put every rhythm candidate next to its twin. Each tell in ai-tells.md ships Reads generated and Reads legitimate. Almost every one has a lawful twin in reference documentation: a required and optional field list is a complement set, three drains listed is a rule of three, uniform sentence length is the register of an API page. Say which side the candidate is nearer. If it is nearer the twin, drop it. If it genuinely sits between, keep it and name what made it survive.
  3. Check it against samples.md. These are evlog pages that read right. The test that decides most borderline cases: does the line deliver a fact, a number, a mechanism, or a decision? A short closer that lands a measurement is voice. The same closer restating the paragraph is a tell.
  4. Verify what the scanner flagged as drift. Every symbol in backticks that the scanner could not find in packages/evlog/src is either a doc that outran a rename or a false hit on prose. Read the source before writing the finding.
  5. Check every comparison against its dossier. A U-12 candidate means a sentence claims something about pino, winston, consola, or OpenTelemetry with nothing behind it. Open landscape/<tool>.md. If the claim is not in the dossier, it is unverified, and unverified is a finding whether or not the claim is true.
  6. Judge the structure yourself. Header template lock, paragraph-rhythm uniformity, and a page that never lets the reader do anything are invisible to a scanner.
Show full SKILL.md (359 more words)Show less

Every finding carries a rule id or a tell id, a verbatim excerpt, and one line on what it costs the reader. A finding that cites neither is taste, and taste does not ship.

Output:

## Content review: <path>

**Verdict**: pass | minor | significant | blocked

### Scan
<one line: score, the metrics that are evidence, drift count. Cite a number only when it argues.>

### Critical
- [id] excerpt, then what it breaks.

### Standard
- [id] excerpt, then what it costs.

Write _None._ under an empty heading. blocked requires a critical finding. significant means two or more standard findings that compound, or one that reaches the lede or the title.

Rewriting

A rewrite starts from a review, never from a page. Rules:

  • Change only what a finding names. A page with three findings gets three edits.
  • Never touch a code block unless a finding says the code is wrong, and then verify the fix against packages/evlog/src before writing it.
  • Preserve MDC structure exactly: component blocks, prop blocks, :br, frontmatter keys and their order.
  • Keep every link target. If a rewrite removes the sentence that held a link, place the link on the sentence that replaces it.
  • Output the full file, not a diff, and list what changed with the id that justified it.
  • A page that passes review comes back unchanged. No finding, no edit. Nothing forces a rewrite to happen.

Content is prose about a system that changes. When the review and the source disagree, the source wins and the finding becomes a doc fix, not a wording fix.

Calibration

Two fixtures pin what this skill is worth: scripts/content-lint/fixtures/generated.md, saturated on purpose, and written.md, which carries the lawful twins. scripts/content-lint/fixtures.test.mjs fails if the distance between their scores closes, and apps/evi/evals/content/ fails if a reviewer passes the first or finds fault with the second.

A change to the corpus, a rule, or a threshold runs both. A tell that cannot separate those two pages is not measuring anything.

Keeping this skill true

The corpus and the rules are working documents. When a review flags something that should have passed, or the maintainer overrides a rule, the lesson goes in corrections.md the same day. When a tell only ever produces its own false positives on this corpus, delete it from ai-tells.md and from scripts/content-lint/lib/corpus.mjs in the same change. A tell nobody trusts is worse than no tell, because it trains the reviewer to skim the list.

© evloghq, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 16 other files (references) in .agents/skills/write-evlog-content of evloghq/evlog.

  • SKILL.md
  • references/ai-tells.md
  • references/corrections.md
  • references/landscape/README.md
  • references/landscape/consola.md
  • references/landscape/logtape.md
  • references/landscape/opentelemetry.md
  • references/landscape/pino.md
  • references/landscape/winston.md
  • references/rules/blog.md
  • references/rules/docs.md
  • references/rules/landing.md
  • references/rules/machine.md
  • references/rules/universal.md
  • references/samples.md
  • references/terminology.md
  • references/voice.md

Open the folder on GitHubat commit 59a105f

Compare with similar skills

evlog Content Writing next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

evlog Content Writing compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
evlog Content Writing this skillevloghq/evlog1.9k—~2.9kAutomated safety check: PassMIT
Chinese Technical Writingleter/zh-tech-writing334—~656Automated safety check: PassMIT
Declaudingoaustegard/claude-skills150—~5.2kAutomated safety check: PassMIT
User-Facing Text Cleanupguillaumemeyer/watermarks-remover24k—~3.5kAutomated safety check: PassMIT
Chinese Text Humanizerop7418/Humanizer-zh19k—~2kAutomated safety check: PassMIT
Korean AI-Text Humanizerepoko77-ai/im-not-ai5.9k1 repos~4.5kAutomated safety check: PassMIT

Similar skills

  • Chinese Technical Writing

    leter/zh-tech-writing

    Sets writing rules for Chinese technical docs: short plain sentences, consistent typography and a checklist for removing AI-sounding filler.

    334 GitHub stars~656 tokensUpdated 13 days ago
    Writing & ContentAuto-check passed
  • Declauding

    oaustegard/claude-skills

    Rewrites model-sounding prose into plain technical writing and checks that every claim survives, for PR text, docs, commit messages and similar drafts.

    150 GitHub stars~5.2k tokensUpdated today
    Writing & ContentAuto-check passed
  • User-Facing Text Cleanup

    guillaumemeyer/watermarks-remover

    Audits prose for invisible Unicode characters and rewrites it while keeping facts, citations, code and required disclosures unchanged and the writer's voice intact.

    24k GitHub stars~3.5k tokensUpdated 2 days ago
    Writing & ContentAuto-check passed
  • Chinese Text Humanizer

    op7418/Humanizer-zh

    Edits Chinese articles, comments and documents to remove filler, repetition and template phrasing while keeping the facts, the level of certainty and the author's voice.

    19k GitHub stars~2k tokensUpdated 15 days ago
    Writing & ContentAuto-check passed
  • Korean AI-Text Humanizer

    epoko77-ai/im-not-ai

    Rewrites Korean text written by AI so it reads like a human wrote it, detecting translationese and other AI patterns while leaving the content untouched.

    5.9k GitHub starsUsed in 1 repo~4.5k tokens
    Writing & ContentAuto-check passed
  • Writes and edits Japanese business documents so they read clearly and naturally, removes AI-sounding phrasing and can score how AI-like a text reads.

    1.9k GitHub stars~2.1k tokensUpdated 1 mo ago
    Writing & ContentAuto-check passed

More from evloghq/evlog

All 20 skills in this repo
  • Walks through adding a new built-in evlog drain adapter for an observability platform: source, build config, exports, tests, docs and PR scope.

    1.9k GitHub stars~2.9k tokensUpdated today
    Auto-check passed
  • Guides adding a new built-in enricher to the evlog package, covering the source, tests, docs, README, a related skill and a changeset.

    1.9k GitHub stars~1.7k tokensUpdated today
    Auto-check passed
  • Walks a contributor through adding a new HTTP framework integration to the evlog logging package: middleware source, build entry, exports, tests, example app and docs.

    1.9k GitHub stars~5k tokensUpdated today
    Auto-check: notes
  • Walks through adding a new rule or framework adapter to `evlog map` in @evlog/cli, from the rule source and registry to types, tests, docs and the published skill.

    1.9k GitHub stars~2.9k tokensUpdated today
    Auto-check passed
  • Before After

    evloghq/evlog

    Produce a before/after visual comparison of an evlog surface (landing, docs, telemetry, playgrounds) and share it as public Blob URLs.

    1.9k GitHub stars~2.7k tokensUpdated today
    Auto-check passed
  • evlog Content Pass

    evloghq/evlog

    Runs the daily review of evlog's written material: picks the worst-scoring files in one group, rewrites what holds up, and opens a single pull request that reports the changes.

    1.9k GitHub stars~4k tokensUpdated today
    Auto-check passed

Questions about evlog Content Writing

What does evlog Content Writing do?

Rules for writing and reviewing evlog docs, blog posts, READMEs, skills and AGENTS.md files, with separate review and rewrite roles, a house voice and a catalog of AI-sounding tells. The skill keeps two roles apart. Review produces findings and a verdict and never rewrites or proposes wording, while rewrite changes only what a finding names and cites the rule or tell ID for each change.

When should I use evlog Content Writing?

evlog Content Writing fits situations like: drafting a docs page or blog post in the evlog voice; reviewing a README or landing page for accuracy and AI-generated phrasing; editing a SKILL.md or AGENTS.md without breaking its procedure; writing a sentence that compares evlog with another logging library.

How do I install evlog Content Writing in Claude Code?

Run `npx skills add evloghq/evlog --skill write-evlog-content -a claude-code`. Or copy the skill folder (.agents/skills/write-evlog-content in evloghq/evlog) into .claude/skills/write-evlog-content in your project. Claude Code loads it when a task matches its description.

How do I install evlog Content Writing in Codex?

Run `npx skills add evloghq/evlog --skill write-evlog-content -a codex`. Or copy the skill folder (.agents/skills/write-evlog-content in evloghq/evlog) into .agents/skills/write-evlog-content in your project. Codex loads it when a task matches its description.

Can I use evlog Content Writing in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add evloghq/evlog --skill write-evlog-content -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/write-evlog-content, .gemini/skills/write-evlog-content, .github/skills/write-evlog-content and .opencode/skills/write-evlog-content in your project.

What does evlog Content Writing need to run?

Going by SKILL.md and its folder, evlog Content Writing needs the command-line tools its instructions call (pnpm). Our summary lists: The evlog repository.

Does evlog Content Writing access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is evlog Content Writing safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does evlog Content Writing use?

evlog Content Writing is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does evlog Content Writing use?

About 2.9k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 19k tokens, read only when the agent opens those files.

What are the alternatives to evlog Content Writing?

Skills that share tags, products or a category with evlog Content Writing: Chinese Technical Writing (leter/zh-tech-writing, 334 stars), Declauding (oaustegard/claude-skills, 150 stars), User-Facing Text Cleanup (guillaumemeyer/watermarks-remover, 24k stars) and Chinese Text Humanizer (op7418/Humanizer-zh, 19k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains evlog Content Writing?

evloghq (a GitHub organization) maintains it in evloghq/evlog, which has 1,887 GitHub stars. The repository holds 20 skills in this directory. The repository was last updated on October 7, 2026.

Source: evloghq/evlog on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.