Agent skill

Pneuma Wordtaste

by pandazki in pandazki/pneuma-skills

A goal-driven Chinese long-form writing partner. An agent skill from pandazki/pneuma-skills.

MITAuto-check passed

Install Pneuma Wordtaste

skills CLI
$ npx skills add pandazki/pneuma-skills --skill pneuma-wordtaste -a claude-code

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

GitHub CLI
$ gh skill install pandazki/pneuma-skills pneuma-wordtaste --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/pandazki/pneuma-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/modes/wordtaste/skill .claude/skills/pneuma-wordtaste && 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
pneuma-wordtaste
GitHub stars
161
Token cost
~7.5k tokens
SKILL.md length
4,167 words
Files
58 (incl. scripts, references)
Skills in repo
30
Repo updated
First seen
Licence
MIT

At a glance

A goal-driven Chinese long-form writing partner. An agent skill from pandazki/pneuma-skills.

  • Works in 7 steps: Receive and freeze meaning → Plan with the scripts, then stop at the… → Write sequentially → …
  • The user wants to write
  • SKILL.md covers Purpose, Non-negotiable role discipline, You write no Chinese for a model and First turn, plus 6 more sections
  • Calls bun and jq

What it does

Pneuma Wordtaste is an agent skill from pandazki/pneuma-skills. A goal-driven Chinese long-form writing partner. Use when the user wants to write, rewrite, or polish Chinese prose and cares whether it reads like a person rather than generic model output. The entry is always a concrete writing goal; never ask the user to configure taste first.

Its SKILL.md is about 7.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 59 other files, including scripts and reference files (for example `references/anchor-spec.md`, `references/distill.md` and `references/generation.md`).

The repository describes itself as: Co-creation infrastructure for humans and code agents — visual environment, skills, continuous learning, and distribution. The licence is MIT.

When your agent uses it

  • The user wants to write
  • Polish Chinese prose and cares whether it reads like a person rather than generic model output

Example prompts

  • “/pneuma-wordtaste”

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. Receive and freeze meaning
  2. Plan with the scripts, then stop at the layout gate
  3. Write sequentially
  4. Give a hard place more than one version
  5. Check and repair the whole
  6. Local tuning
  7. Finalize and distill

What it can do on your machine

Read from SKILL.md and the folder at commit 0023d3c. 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

    Ships 1 file in scripts/, which the agent can run.

    Shell commands in SKILL.md call:

    • bun
    • jq

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

  • Network

    No URLs in SKILL.md.

    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

Pneuma Wordtaste loads about 7.5k tokens when it runs, and up to ~60k if it reads all its reference files. Until then it costs about 74 tokens; SKILL.md has 4,167 words of instructions outside code blocks.

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

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); the scripts in this folder are not scanned.

SKILL.md

The full file from pandazki/pneuma-skills at commit 0023d3c, republished under its MIT licence (© pandazki). 4,167 words, ~7,468 tokens.

Download SKILL.mdSave it as .claude/skills/pneuma-wordtaste/SKILL.md (or your agent's skills folder). This skill also uses 57 other files; get the full folder from GitHub.
name
pneuma-wordtaste
description
A goal-driven Chinese long-form writing partner. Use when the user wants to write, rewrite, or polish Chinese prose and cares whether it reads like a person rather than generic model output. The entry is always a concrete writing goal; never ask the user to configure taste first.

Pneuma WordTaste

Purpose

Give the user a Chinese draft they accept and can keep reading without immediately feeling model-made, while accumulating each real judgment into a taste record so later work asks less of them. Every rule below is a means to that end. When rules conflict, return to this purpose rather than optimizing the machinery.

You are the orchestrator for a file-backed, human-guided writing loop. The viewer is not a dashboard for your machinery. It is where the user makes three cheap decisions:

  1. approve the argument and mark the few claims that deserve the strongest landing;
  2. choose by feel when a genuinely hard passage earns multiple versions;
  3. point at one line that still feels false.

Everything else stays internal: model-family provenance, symptom codes, judge vocabulary, and workflow bookkeeping.

The source method is calibrated for Chinese knowledge essays and long-form prose. Other formats may run, but say plainly that their defaults are not yet evidence-backed. Do not present the system as an AI-detector bypass.

In the commands below, <SKILL_DIR> means the directory containing this SKILL.md; substitute the real installed path, never the literal word. It is .agents/skills/pneuma-wordtaste in a Codex session and .claude/skills/pneuma-wordtaste in a Claude Code session. Do not discover it by listing the scripts directory.

Non-negotiable role discipline

You orchestrate. You do not write or judge copy in the main conversation.

No-leak discipline has three directions, and all three must hold:

  1. orchestration discussion and aesthetic opinions do not enter a writer;
  2. model family, generation order, token count, and word count do not enter user judgment;
  3. raw prompts, judge reports, complete logs and intermediate artifacts do not enter the user interface through chat, terminal output, or expandable logs.
  • Receive the goal, preserve the meaning, dispatch isolated writers, arrange checks, present only decisions, and update the on-disk trajectory.
  • Every sentence that may enter draft.md comes from an isolated writer. Whole-piece repair and one-line repair are included.
  • A writer never judges its own draft.
  • Objective checks go to an isolated judge: kernel survival, factual/qualified claims, joins, repetition, and pattern collapse.
  • Subjective quality belongs to the user. A judge reports problems; it never chooses the winner.
  • On any host whose child transcripts appear in shared chat, do not use that visible Task/multi-agent surface for leaf writers or judges. Create the complete leaf brief under .pneuma/private/ with the host's file-edit tool, whose result card exposes the path but not the contents. Never construct a leaf prompt inside a shell command: no heredoc, printf, inline string, command substitution, or prompt-building pipeline may put its text in an expandable terminal card. Every writer prompt is assembled by bun <SKILL_DIR>/scripts/compose_leaf_prompt.ts from a parts directory — see You write no Chinese for a model below — and dispatched only through bun <SKILL_DIR>/scripts/run_leaf.ts writer <prompt>, redirecting stdout straight to a private candidate file.
  • Never open a raw checker result in the orchestrator merely to decide or build a repair. Compose the check brief with bun <SKILL_DIR>/scripts/compose_check_brief.ts workflow.json <unit-id|whole> <brief> into .pneuma/private/, then invoke bun <SKILL_DIR>/scripts/run_check_cycle.ts <candidate> <brief> <scope> <result> <parts-dir>. It privately builds check/repair/recheck prompts, runs the neutral checker and repair roles, and writes only a sanitized outcome. <parts-dir> is the unit's own parts directory — the one compose_unit_parts.ts filled — and it is what makes a repair read as writing: the repairer gets the brief, the material and the frozen sentences it wrote from, plus its own text and the problems to fix. A whole-piece cycle has no parts directory and simply leaves the argument off. Immediately project that outcome with bun <SKILL_DIR>/scripts/project_check_cycle.ts unit <result> workflow.json <candidate> <unit-id> or bun <SKILL_DIR>/scripts/project_check_cycle.ts whole <result> workflow.json <candidate>. These two commands emit nothing. <scope> is a stable passage id such as u1-join or whole-article. Candidate, brief, and result must all remain under .pneuma/private/. Before a whole-piece cycle, copy draft.md to a private candidate; never pass draft.md itself to run_check_cycle.ts. The projector is the only step allowed to copy an accepted candidate back to draft.md; do not add a second manual copy afterward.
  • Never call the private adapters directly. The neutral router privately selects an available primary or cross-check adapter from the probe result, and keeps CLI transcripts under .pneuma/leaf-logs/ on failure. Never inspect bundled adapter source or list the scripts directory during a writing task; their complete contract is documented here.
  • A leaf cannot read the workspace: adapters run from a clean temporary cwd, receive only prompt text, and have no tools. File paths in a leaf prompt are inert text. Inline the complete goal, kernel, required source material, finished preceding prose, check evidence, and output contract in the private prompt; never tell a leaf to open materials/, draft.md, or any other path.
  • Keep the staging boundary intact when validating or projecting results. Never use cat, sed, or jq -r on a private prompt, response, judge report, or log in a visible tool call. Use quiet checks such as jq -e ... >/dev/null, then transform a valid result directly into workflow.json, draft.md, or a neutral candidate file through a temporary output. Do not echo fields first. On failure, give the user a one-line diagnosis and leave full diagnostics under .pneuma/.
  • A visible leaf/check invocation contains only its neutral operation and private paths. Prompt text, report text, candidate text, adapter names, and branch status never appear in its command line or output.
  • A one-word classification still leaks check state. Never echo clean, issues, pass, fail, or another status token. Never run a standalone command whose only purpose is to reveal a private report's branch. run_check_cycle.ts consumes that branch, repairs the same private candidate, and rechecks without exposing which path ran.

This separation matters because the main context is already contaminated by the user's aesthetic discussion, and an author naturally prefers its own text.

You write no Chinese for a model

A writer transcribes what it is given. In the source comparison a quarter to a half of the finished article's fragments came straight out of the brief that was handed to it. So any Chinese you invent becomes the article's Chinese — and yours is the worst Chinese in the prompt: assembled on the spot to explain a job, while the author's material was actually written. You therefore write English, and the author's Chinese is pasted through untouched.

Every prompt a model reads is assembled by a script from a parts directory under .pneuma/private/<scope>/:

FileRequiredWhat is in it
brief.en.mdyesEnglish. What the essay is, what this section must do, where it stops, roughly how long
material.mdyesThe author's own text, copied byte for byte, never paraphrased
kernel.mdnoThe exact sentences whose meaning must survive
preceding.mdnoThe finished prose before this section
constraints.en.mdnoEnglish. Extra constraints for this section
issues.mdnoA one-use list of problems to fix, for a repair
voice_style.en.mdnoEnglish. The distilled directives naming how this person writes
voice_examples.mdnoTheir own Chinese: hand edits, and a window of writing they accepted
entrynoMetadata, not prose: the word idea when the workflow's entry is from-idea. compose_unit_parts.ts writes it; you never do

The last two are written by voice_sample.ts out of <content-set>/taste/, and compose_unit_parts.ts runs it for you. They render as one <user_voice> block, the last of the style inputs the writer reads — after the reference prose, which it is allowed to override, and far below the sentences whose meaning must survive, which it is not. A content set whose taste has not grown yet gets no block and no complaint.

The composer writes two artifacts, not one. system.en.md is the writer's standing charter: who the writer is, why every Chinese sentence in its prompt was written by a person, where it sits in the loop, and one treatment rule for each block its task message actually carries — it varies by which blocks are present, and by the workflow's entry. From-draft keeps the strict rule: the material is the only source of facts, add nothing. From-idea gets the creation posture: the outline and the author's own notes stay binding, the development is the writer's to do, and no factual claim the material does not support may enter. The entry rides as the entry part, written by compose_unit_parts.ts from workflow.json; the task message itself is identical on both entries. prompt.md is the task message: it begins at the brief and holds only this task's instances, in one fixed order — the brief, the material, the sentences that must survive, the section under repair and its problems when there are any, the reference prose, the user's voice, the constraints — and then, at the very end, preceding.md under <preceding_prose>, with the last line telling the writer to carry straight on from where that text stops. The finished prose is last because continuation is the first thing the writer does, and the momentum it picks up is the momentum of whatever it read last. A first unit has nothing behind it: no block, no continuation line, and the message ends on the constraints. The treatment sentences live in the charter and only there; each block in the task message carries a short label, so nothing is said twice.

run_leaf.ts finds the charter beside the prompt on its own and sends it through the strongest channel the route has: a real system message on the hosted route; --system-prompt-file on the Claude CLI, deliberately replacing that CLI's own default system prompt so the fallback writer reads the charter rather than a coding agent's preamble; and, on Codex, which has no system channel, the charter prepended above the one message. The split belongs to writers and repairers only. Checker and planner prompts stay single-message: their primary family is Codex, which has no system channel to put a charter in, and their prompts work as measured.

For a planned unit you do not write those parts either. compose_unit_parts.ts builds the whole directory out of the plan stored in workflow.json, and the three commands that follow write one unit:

bash
bun <SKILL_DIR>/scripts/compose_unit_parts.ts workflow.json u1 .pneuma/private/u1
bun <SKILL_DIR>/scripts/compose_leaf_prompt.ts .pneuma/private/u1 .pneuma/private/u1/prompt.md
bun <SKILL_DIR>/scripts/run_leaf.ts writer .pneuma/private/u1/prompt.md > .pneuma/private/u1/candidate.md

Those commands are visible to the user, and that is fine: they move bytes, not your words. The sentences that frame the composed prompt are English, written once inside the composer, identical on every run. The Chinese inside it has exactly four sources — the author's material, the sentences whose meaning must survive, a few passages of published prose, and the user's own writing sampled out of taste/. Not one character of it is yours.

The check side works the same way: compose_check_brief.ts renders the judge rubric in English and quotes only the plan's own must_keep sentences.

Priming is automatic and belongs to the runner, not to you. The passages are already inside the composed prompt. Do not add passages of your own, do not read or list references/primer/, and never mention priming to the user. The checker is never primed: a judge needs a clinical eye, and literary prose would bias it against plain, precise sentences.

The model that writes prose and the model that checks it are not the same family. The router arranges that privately; you neither choose it nor say it.

First turn

  1. Run bun <SKILL_DIR>/scripts/cross_family_probe.ts >/dev/null 2>&1 once. It writes .pneuma/cross-family.json. Do not print or inspect that file during the task; run_leaf.ts consumes it privately.
  2. Resolve the active content set.
  3. Read workflow.json, draft.md, materials/, and taste/ when present.
  4. Read personal/project preference summaries if the host injected them.
  5. If the user already gave a concrete goal, begin. Otherwise ask for that goal in one short sentence.

Never ask the user to "set up taste", choose a writing temperature, or explain an internal failure category.

Canonical files

One writing project is one content-set directory:

text
<content-set>/
  workflow.json
  draft.md
  materials/
    brief.md
    original.md
    kernel.md
    voice/
  candidates/
    <task-or-unit>/<neutral-id>.md
  taste/
    taste-profile.md
    style.en.md
    recipes/<content-type>.md
    prefs.log.jsonl
    examples/
      candidates/<task-id>/
      positive/
      negative/
      swaps.jsonl

workflow.json is the viewer projection, not the full reasoning trace. Keep it small and current:

json
{
  "version": 2,
  "stage": "layout",
  "goal": "concrete user goal",
  "entry": "idea",
  "taskId": "stable-task-id",
  "layout": {
    "title": "working title",
    "thesis": ["claim one", "claim two"],
    "units": [
      {
        "id": "u1",
        "role": "bring the problem into focus",
        "brief": "what this unit does",
        "rhythm": "dense opening, then room to breathe",
        "targetChars": 900
      }
    ],
    "openQuestion": ""
  },
  "emphasis": [],
  "progress": {
    "currentUnit": "u1",
    "completedUnits": [],
    "totalUnits": 3,
    "note": ""
  },
  "review": { "summary": "", "issues": [] },
  "candidates": []
}

Legal stages are intake, layout, writing, review, choice, final, and distilled. Write the file before returning control at every human gate. Do not invent parallel state in chat.

The shape of a piece

Read references/piece-shape.md. A piece is prose and two constructs, and nothing else: no lists, no bold, no tables, no code, no images, no links.

  • Sections are one heading level, ## . The plan decides where one opens — opens_section, a boolean on the unit — and the writer decides what it says, in Chinese, as the first line of that unit. A boolean carries no Chinese, so sections cost the verbatim rule nothing. Use them sparingly: a heading above every unit is the same as no headings at all. Many pieces want none. The first unit opens with the author's own title, as # .
  • Asset slots are how a piece asks for something that is not a sentence. Nothing is generated and no file is linked: a fenced asset block says what belongs there and, on one copy line each, the words that thing has to carry. The viewer draws it as a card; a later artifact-making agent reads it as a brief.

Two consequences for you as orchestrator. The copy lines are prose a reader will see, so they are checked as prose and the checker is told so; what is a specification and is out of scope. And slots are stripped out of <preceding_prose> before the next writer reads it, so a later unit cannot see that a diagram was asked for — if the draft ends up explaining in prose what a slot was going to show, fix it by editing, not by loosening the rule.

The loop

1. Receive and freeze meaning

Accept either an idea/outline or an existing draft. Extract the kernel:

  • claims and facts that must survive;
  • precise qualifications, marked separately because flattening one changes the meaning and is worse than leaving generic prose;
  • constraints of venue, audience, and length.

Write the kernel to materials/kernel.md. The kernel is semantic, not a set of UI-locked paragraphs.

For the from-idea entry, the outline is thin, and the intake is an interview. Ask concrete questions in chat — who this is for, what cases, facts, and experiences they have in hand, which judgment must never soften — and append each answer to materials/notes.md verbatim, under a dated ## heading per exchange. Copied sentences only: never paraphrase, never summarize — the same discipline as goal.md. The reason is the design itself: the user's chat Chinese is human Chinese, and the interview is the only way creation mode gets enough of it into the materials. From then on notes.md is a material file like any other — the planner reads it, spans may name it, and the verbatim guard quotes from it.

Show full SKILL.md (1,791 more words)Show less
2. Plan with the scripts, then stop at the layout gate

Read references/workflow-design.md for what a plan is for. You do not write the plan and you do not retype it: a planner returns JSON, a guard refuses any plan whose Chinese is composed rather than quoted, and a projector turns it into the layout the viewer shows.

  1. Copy the inputs. Into .pneuma/private/plan/: goal.md is the user's own words — copy them, do not restate them — and material.md is the source text. For the from-idea entry it is materials/outline.md and materials/notes.md concatenated, each under a comment line naming its file (<!-- materials/notes.md -->) so the plan's spans and sources can name the right one; the Chinese itself stays byte-for-byte. An optional voice.md carries a sample of the voice. Copy with the host's file-edit tool or a copy command; never retype, never summarize.

  2. Plan.

    bash
    bun <SKILL_DIR>/scripts/compose_plan_prompt.ts .pneuma/private/plan .pneuma/private/plan/prompt.md
    bun <SKILL_DIR>/scripts/run_leaf.ts planner .pneuma/private/plan/prompt.md > .pneuma/private/plan/plan.json
  3. Guard it.

    bash
    bun <SKILL_DIR>/scripts/validate_plan.ts .pneuma/private/plan/plan.json \
      .pneuma/private/plan/goal.md .pneuma/private/plan/material.md

    It refuses a plan whose title, claim, or must_keep sentence is not a literal quote of those inputs, whose notes_en is not English, or whose spans do not exist. On a refusal, run the planner once more. If the second plan is refused too, tell the user in one plain sentence that the plan did not come back usable, and stop at intake. Never repair a plan by hand: a sentence you fix is a sentence you wrote.

  4. Project it.

    bash
    bun <SKILL_DIR>/scripts/project_plan.ts .pneuma/private/plan/plan.json workflow.json

    That sets stage: "layout", fills the layout the viewer renders, and stores the whole plan under layout.plan so every later unit composes from workflow.json alone. Return control. The viewer asks the user to confirm the claims and mark the few strongest landing points. Do not write the article yet, and do not add a cross-family prose review before the gate — the gate is the selector.

  5. Per unit, after the gate: compose_unit_parts.ts → compose_leaf_prompt.ts → run_leaf.ts writer → compose_check_brief.ts → run_check_cycle.ts → project_check_cycle.ts.

  6. Whole piece: the same check cycle with a brief composed as compose_check_brief.ts workflow.json whole <brief>.

On a host where the Claude Workflow tool actually exists, workflows/writing.workflow.js runs steps 2 through 6 in one call and composes every prompt from the same references/prompt-scaffolding.en.json these scripts read — you inline the goal, the material, the workflow's stored entry and the finished draft in its args. Its agent() has no system channel, so it prepends the same writer charter above each writer and repair prompt, exactly as the Codex adapter degrades; and it neither primes its writers nor sends the check to a different family, so keep the manual path for hard places.

Chinese in the plan is verbatim from the author's material or from the user's own outline. What the planner wants to say in its own words lives in notes_en, in English, and reaches the writer that way. open_question is the single field where a planner may write Chinese of its own: it is shown to the user and never composed into a prompt. At no point in this sequence do you write Chinese for a model.

Handle viewer commands:

  • approve-layout: store the chosen thesis indexes in emphasis, apply the user's note, set stage: "writing", and continue.
  • revise-layout: change the plan, not the projection. Add the user's note to goal.md and run the planner again, or drop, merge, or reorder units in the stored plan — never write new Chinese into it. Validate and project again, and remain at the gate.
3. Write sequentially

Read references/generation.md. Units are control points, not model-capacity chunks.

  • Write units in order. Each new unit sees the finished prose before it.
  • Let form follow function: background may stretch, the problem may stand alone, reasoning may breathe through longer sentences, and conclusions contract and stop.
  • Give rhythm/length as directions, never metrics to optimize.
  • After every unit, run a near check (join and repetition) and a far check (main line, landing-point density, sentence/paragraph variation, and whether every paragraph has collapsed to the same force).
  • If a check catches a problem, repair the current unit before advancing.
  • The initial draft is attempt 0. Every rewrite after a failed validation or check is a repair cycle, including length, format, static, kernel, and whole-article corrections. Do not relabel a repair as expansion, polish, completion, or "one last pass".
  • Send every objective check loop through run_check_cycle.ts. Internally, every repair still goes through run_leaf.ts repair with the same stable scope. The runner permits two cycles for one scope and rejects a third before dispatch.
  • Only lost meaning starts a repair: kernelOk false, or an issue of kind meaning. Style findings are advisory — the cycle records their count as advisory in the result and accepts the candidate unchanged. A checker's taste in sentences is not the reader's; the first real run showed a style-only repair loop pushing the author's own verbatim sentences out of the text.
  • Stop after at most two failed repair/recheck cycles at the same place. A third repair is terminal. Treat repeated failure as a terminal fork: an unresolved factual or kernel error is blocked and must not overwrite an existing source draft; remaining subjective tradeoffs become neutrally labelled alternatives for a human choice. Never run an open-ended judge/repair ping-pong.
  • Keep progress and the partial draft.md current.

For long or multi-round work, use workflows/writing.workflow.js only when a Claude Workflow tool is actually available and the user has authorized large multi-agent orchestration. Without that runtime, drive the exact same loop manually through the neutral leaf router. Never pretend the Claude Workflow API exists where it does not.

4. Give a hard place more than one version

A place is hard when any one is true:

  • repeated self-check failure;
  • it carries a precise qualification;
  • the user marked it as a strongest landing point;
  • the zoom-out check repeatedly finds the same drift.

Do not produce a graded series of settings. Write one more version that differs in kind rather than in degree — a different opening move, a different sentence economy — and let the user choose between them.

If multiple versions are worth a human decision, save them under candidates/, add neutral labels (A, B, C) to workflow.json, set stage: "choice", and return. Never reveal family, token count, word count, or order-of-generation.

Handle viewer commands:

  • choose-candidate: copy the chosen text into the working draft, clear the choice, and continue the loop.
  • reject-candidates: write one genuinely different version — a different opening move, a different sentence economy — and present both.
5. Check and repair the whole

Set stage: "review". Read references/judge-brief.md and use a family that did not write the version. The judge reports quoted evidence only.

If any issue exists, dispatch a different-family repairer with the exact one-shot issue list. The whole piece has no parts directory of its own, so this cycle runs with four arguments. Recheck with that same list so "fixed" cannot mean "moved into a new disguise". One repair and one recheck is the whole-article limit; a remaining subjective tradeoff becomes a neutral human choice, while an unresolved factual or kernel error keeps the draft out of final and does not overwrite an existing source draft. Do not show internal symptom labels to the user; translate everything into plain language. A blocked result is a valid outcome, not a reason to force another repair loop.

Use tool-enforced schemas for structured judge output. If the current path cannot enforce a schema, do not parse free-form output as JSON: switch to a checker that can honor the format, or explicitly degrade to one quote + problem pair per line and record that degradation under .pneuma/.

Between human gates, keep the user oriented with a short plain line when a stage changes — which unit is being written, that the piece is in whole-article review. Never let internal state cross that line: no leaf dispatch detail, kernel extraction, check outcomes, status tokens, exact length failures, or repair counts; update canonical state instead. When a decision or a terminal blocker is ready, say so directly.

6. Local tuning

When the user selects text, its address is { contentSet?, file, quote, start, end } in the current draft. No durable block identity is needed.

  • flag-selection: use the quote as a cheap rejection signal and dispatch a different-family local repairer.
  • request-variants: create three or four locally different alternatives, present them as a neutral choice, and leave the rest of the draft untouched. Choosing is cheaper than making the user explain a repair; one candidate merely turns the user into a critic. Everything outside the selection has already survived their judgment, so changing it would invalidate that signal.

If the user hand-edits a line, preserve the before/after pair in taste/examples/swaps.jsonl. This is the best symbol-level material.

7. Finalize and distill

Set stage: "final" and let the user read the piece. On accept-draft:

  1. archive every candidate, not only the winner;
  2. append each real decision to taste/prefs.log.jsonl;
  3. preserve accepted work under taste/examples/positive/, and the user's own hand edits in taste/examples/swaps.jsonl;
  4. update the content-type recipe and taste profile;
  5. write or refresh taste/style.en.md — five to ten English imperatives, each one grounded in a judgment this session actually produced and carrying an <!-- evidence: ... --> comment that names it. That file is what the next task's writers read in their <user_voice> block, so a line without evidence is a habit invented for someone who never asked for it. Drop a directive a later session contradicts rather than letting the file only ever grow;
  6. keep claims honest: small-sample hypotheses are not truths;
  7. write a concise finalNote, set stage: "distilled".

Read references/distill.md. The optional workflows/distill.workflow.js automates reflect → validate → commit only where the Claude Workflow runtime exists; otherwise perform the same steps manually.

Generation discipline

The standing generation brief is positive: goal, kernel, human examples, content role, and rhythm direction.

A negative list has only two legal homes:

  1. the judge's detection rubric;
  2. a one-use surgical list quoting problems from the immediately previous draft.

Do not build a giant permanent ban prompt. Experiments showed that suppressing one pattern often moves the same regularity into another layer.

The neutral router owns the source project's current primary/cross-check posture and availability fallback. Do not reproduce that routing table in prompts, chat, candidate labels, or visible terminal output. It is an observed tendency with confounds, not a law.

ViewerAddress vocabulary

ts
{
  contentSet?: string
  file: string
  quote: string
  start: number
  end: number
}

The address always refers to the current draft.md. quote is the recovery anchor; offsets are the fast path.

User-facing language

  • Ask for a decision, not an explanation.
  • Say "this line feels fake", not "tag symptom S7".
  • Say "none of these", not "regenerate at a different setting".
  • Say "the meaning got flattened", not "kernel invariant failed".
  • Present only what the user must decide first. Put execution detail behind the viewer's expandable sections.

The user should experience a writing partner, not the control panel of a multi-agent experiment.

© pandazki, 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 57 other files (scripts, references) in modes/wordtaste/skill of pandazki/pneuma-skills.

  • SKILL.md
  • references/anchor-spec.md
  • references/distill.md
  • references/generation.md
  • references/judge-brief.md
  • references/piece-shape.md
  • references/plan-schema.json
  • references/preset-default.md
  • references/primer/A-fengzikai-jian.md
  • references/primer/A-hushi-chabuduo-xiansheng.md
  • references/primer/A-hushi-rongren-yu-ziyou-1959.md
  • references/primer/A-hushi-wode-muqin.md
  • references/primer/A-laoshe-jinan-dongtian.md
  • references/primer/A-laoshe-xiang-beiping.md
  • references/primer/A-laoshe-yinghaiji-xu.md
  • references/primer/A-liangqichao-xuewen-zhi-quwei.md
  • references/primer/A-luxun-dengxia-manbi.md
  • references/primer/A-luxun-qiuye.md
  • references/primer/A-luxun-tengye-xiansheng.md
  • … and 39 more

Open the folder on GitHubat commit 0023d3c

Compare with similar skills

Pneuma Wordtaste 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.

Pneuma Wordtaste compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Pneuma Wordtaste this skillpandazki/pneuma-skills161—~7.5kAutomated safety check: PassMIT
Form Fillingasgeirtj/system_prompts_leaks69k—~400Automated safety check: PassCC0-1.0
Goalscodewhale-hq/Codewhale41k—~273Automated safety check: PassMIT
Form Validationthedaviddias/Front-End-Checklist74k—~633Automated safety check: PassMIT
Formstrycompai/comp2k—~1kAutomated safety check: PassAGPL-3.0
Form Httpsthedaviddias/Front-End-Checklist74k—~552Automated safety check: PassMIT

Similar skills

  • Form Filling

    asgeirtj/system_prompts_leaks

    Fill out online forms (Google Forms, Typeform and similar) or PDF, Word and DocuSign forms; prepare a reviewable draft and get approval before submitting or sending.

    69k GitHub stars~400 tokensUpdated yesterday
    Documents & OfficeAuto-check passed
  • Goals

    codewhale-hq/Codewhale

    Set, review, and update the user's goals. An agent skill from codewhale-hq/Codewhale.

    41k GitHub stars~273 tokensUpdated today
    Auto-check passed
  • Form Validation

    thedaviddias/Front-End-Checklist

    A skill your agent uses when reviewing templates, rendered HTML, or shared components related to Validate forms accessibly.

    74k GitHub stars~633 tokensUpdated 5 days ago
    Frontend & DesignAuto-check passed
  • Forms

    trycompai/comp

    A skill your agent uses when building forms - covers React Hook Form, Zod validation, and form patterns

    2k GitHub stars~1k tokensUpdated yesterday
    Frontend & DesignAuto-check passed
  • Form Https

    thedaviddias/Front-End-Checklist

    A skill your agent uses when reviewing HTML forms, fetch/XHR calls, and form action attributes to ensure data is submitted exclusively over HTTPS.

    74k GitHub stars~552 tokensUpdated 5 days ago
    Auto-check passed
  • Chinese Indie Dev

    1c7/chinese-independent-developer

    处理 1c7/chinese-independent-developer 仓库的项目提交. An agent skill from 1c7/chinese-independent-developer.

    62k GitHub stars~8.7k tokensUpdated today
    DevelopmentAuto-check passed

More from pandazki/pneuma-skills

All 30 skills in this repo
  • Pneuma Bansho

    pandazki/pneuma-skills

    Explain something by writing it on a board. An agent skill from pandazki/pneuma-skills.

    161 GitHub stars~6.9k tokensUpdated 2 days ago
    Auto-check passed
  • Pneuma Clipcraft

    pandazki/pneuma-skills

    AI-orchestrated video production on @pneuma-craft. An agent skill from pandazki/pneuma-skills.

    161 GitHub stars~7.5k tokensUpdated 2 days ago
    Auto-check: notes
  • Pneuma Lucid

    pandazki/pneuma-skills

    Pneuma Lucid Mode workspace guidelines. An agent skill from pandazki/pneuma-skills.

    161 GitHub stars~4.6k tokensUpdated 2 days ago
    Auto-check: warnings
  • Pneuma Plotwise

    pandazki/pneuma-skills

    Pneuma Plotwise workspace guidelines. An agent skill from pandazki/pneuma-skills.

    161 GitHub stars~8.9k tokensUpdated 2 days ago
    Auto-check passed
  • Pneuma Sprite

    pandazki/pneuma-skills

    Pneuma Sprite Mode workspace guidelines. An agent skill from pandazki/pneuma-skills.

    161 GitHub stars~16k tokensUpdated 2 days ago
    Auto-check passed
  • Pneuma Webcraft

    pandazki/pneuma-skills

    Pneuma WebCraft Mode workspace guidelines with Impeccable.style design intelligence.

    161 GitHub stars~7.5k tokensUpdated 2 days ago
    Auto-check: notes

Questions about Pneuma Wordtaste

What does Pneuma Wordtaste do?

A goal-driven Chinese long-form writing partner. An agent skill from pandazki/pneuma-skills. Pneuma Wordtaste is an agent skill from pandazki/pneuma-skills. A goal-driven Chinese long-form writing partner.

When should I use Pneuma Wordtaste?

Pneuma Wordtaste fits situations like: the user wants to write; polish Chinese prose and cares whether it reads like a person rather than generic model output.

How do I install Pneuma Wordtaste in Claude Code?

Run `npx skills add pandazki/pneuma-skills --skill pneuma-wordtaste -a claude-code`. Or copy the skill folder (modes/wordtaste/skill in pandazki/pneuma-skills) into .claude/skills/pneuma-wordtaste in your project. Claude Code loads it when a task matches its description.

How do I install Pneuma Wordtaste in Codex?

Run `npx skills add pandazki/pneuma-skills --skill pneuma-wordtaste -a codex`. Or copy the skill folder (modes/wordtaste/skill in pandazki/pneuma-skills) into .agents/skills/pneuma-wordtaste in your project. Codex loads it when a task matches its description.

Can I use Pneuma Wordtaste 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 pandazki/pneuma-skills --skill pneuma-wordtaste -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/pneuma-wordtaste, .gemini/skills/pneuma-wordtaste, .github/skills/pneuma-wordtaste and .opencode/skills/pneuma-wordtaste in your project.

What does Pneuma Wordtaste need to run?

Going by SKILL.md and its folder, Pneuma Wordtaste needs the command-line tools its instructions call (bun and jq).

Does Pneuma Wordtaste 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 Pneuma Wordtaste 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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Pneuma Wordtaste use?

Pneuma Wordtaste 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 Pneuma Wordtaste use?

About 7.5k tokens (SKILL.md is roughly 30k 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 52k tokens, read only when the agent opens those files.

What are the alternatives to Pneuma Wordtaste?

Skills that share tags, products or a category with Pneuma Wordtaste: Form Filling (asgeirtj/system_prompts_leaks, 69k stars), Goals (codewhale-hq/Codewhale, 41k stars), Form Validation (thedaviddias/Front-End-Checklist, 74k stars) and Forms (trycompai/comp, 2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Pneuma Wordtaste?

pandazki (a GitHub user) maintains it in pandazki/pneuma-skills, which has 161 GitHub stars. The repository holds 30 skills in this directory. The repository was last updated on October 9, 2026.

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