skill-writer-long-form — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited skill-writer-long-form (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Three flows a writer working on something long — an essay, a chapter, a novel, a technical book, a dissertation, a screenplay — actually does inside a working session: plan a writing block in scene-shaped atomic tasks for the next N hours, ask the graph who a character or source or concept is from prior notes, and check honestly whether they are stuck in a re-edit loop on a chapter that should already be closed. The trigger phrases are unambiguous on purpose — they will not steal activation from adhd-daily-planner, the skill-eng-manager-1on1 decomposition flow, or any general planning skill.
This skill respects the slowness of real writing. It does not measure success in words per hour. It does not call editing "polishing" or praise re-revisiting a closed chapter as care for the craft. When the rumination check fires, it returns a hard, verbatim closing line and refuses to "take another look".
Activate when the user's message contains one of the trigger phrases verbatim. The trigger phrase determines which of the three flows runs:
plan today's writing block, <N> hours / plan tomorrow's writing block, <N> hours / plan my writing block, <N> hours → Flow A: writing-block planner.who is <name> / who's <name> → Flow B: recall character/source/concept.am I ruminating / I keep editing chapter <N>, am I ruminating / keep rewriting chapter <N> → Flow C: rumination check.Do not activate on partial matches (thinking of planning a writing block), past tense (I planned a writing block yesterday), or generic questions (who is the target reader). Do not activate if another skill — for example adhd-daily-planner or ocd-decision-finalizer — is already running its flow in this turn; let it finish.
The user says some variant of plan today's writing block, 3 hours. Goal: a list of scene/section-shaped atomic tasks sized to the time budget. The output is NOT word-count goals. Word counts are a content-mill metric and an anti-pattern for writers in actual flow — see "Do not" below.
1.5) followed by hour, hours, hr, or hrs. Multiply by 60 to get minutes. Render as ISO 8601 duration: PT<minutes>M (e.g. PT180M for 3 hours, PT90M for 1.5 hours). If no time budget is parseable, ask one short question: How many hours? I'll plan the block around that. Wait. Do not assume a default.for chapter 4, on the cache-invalidation essay), capture it verbatim as project_context. If absent, leave it empty — do not invent. Writing block planning for: <project_context, or "the user's current long-form work in progress">. Time budget: <human-readable form, e.g. "3 hours">. Break this into scene-shaped or section-shaped atomic tasks — for example "draft scene 3: kitchen confrontation", "outline the counter-argument in section 4", "revise the opening paragraph of chapter 2 for voice". Each task should be a concrete, finite piece of writing or a discrete revision pass. Do NOT generate word-count goals (e.g. "write 500 words"). Do NOT invent scene titles, character names, plot points, or section headings; if specifics are missing, generate generic shaped tasks ("draft the next scene", "revise the previous section") instead.Pass time_budget: "PT<minutes>M" as computed in step 1.
That time budget is shorter than the smallest atomic writing task. Try a longer block, or pick one specific scene to draft. Stop.The user says who is Marlene (a character), who is Pollan (a source), or who is the unreliable narrator (a concept). Goal: surface what the graph remembers about the entity, including internal contradictions the user has accidentally introduced across earlier sessions.
who is or who's is the entity. Trim. Treat verbatim — do not normalise capitalisation, do not strip articles (the unreliable narrator stays as written).the audience, the reader, my reader, the target reader, the protagonist, the antagonist, the narrator (unqualified), respond with one line: That's a generic question. I can recall a specific named character, source, or concept from the graph — ask "who is <name>". Stop.name_or_alias: "<parsed entity>".resolution.method is alias, fuzzy, or embedding, surface the resolved entity name and the resolution score before continuing. Ask one question: I read "<parsed>" as the entity "<resolved>" (<method> match, score <score>). Continue? Wait for confirmation. Do not assume.No entity in the graph matches "<parsed>". If this is a new character/source, you can write them now and capture notes as you go. Stop.entity.type — person for characters and real-world sources, concept for thematic concepts or unnamed roles.facts[] — every fact whose subject is this entity. Quote the literal text verbatim. Sort by recorded_at ascending so older notes come first and the user can see the timeline.neighbours[] — connected projects, chapters, or other entities.facts[] array and look for pairs whose object.literal strings contain a numeric or short-form descriptor (height, age, hair colour, town of origin, profession, year of an event) that disagrees. The detection rule is intentionally simple in v0.1.0: a pair of facts is flagged when both contain a matching predicate keyword from this list — height, age, tall, years old, feet, metres, cm, eyes, hair, from, born in, married to, works at, chapter — and their literal strings differ in the numeric or short-form part of that match. If a contradiction is detected, list it explicitly in the output. Do NOT smooth over.The user says I keep editing chapter 4, am I ruminating? (or one of the equivalent triggers). This is the load-bearing ND-supportive flow. The skill MUST defer the detection to the guardrail server, MUST NEVER re-open a previously-closed chapter for "another look", and MUST return the verbatim closing line below when rumination is detected.
prologue / epilogue / intro / conclusion) after chapter. If no chapter reference is found, ask one short question: Which chapter? Wait. Do not assume.neurodock-guardrail is not available in this session, respond with the verbatim line: The rumination check requires the neurodock-guardrail server, which is not available here. I will not fabricate a check. If you want the answer, install the guardrail server; in the meantime, treat the urge to re-edit as the signal. Stop.history argument — recent prior prompts from the same user that reference the same chapter. The skill SHOULD source the history from prior turns in the current session plus, optionally, any graph-recorded prompts tagged to this chapter. Window: 90 minutes by default, or profile.guardrails.rumination_window_minutes if set. Threshold: 3 by default, or profile.guardrails.rumination_threshold if set.Call shape:
{
"current_prompt": "<the user's invoking message, verbatim>",
"history": [
/* prior prompts referencing this chapter, oldest-first */
],
"window_minutes": 90,
"threshold_count": 3
}No rumination pattern detected on chapter <N>. <count> matching prompts within the window, threshold is <threshold>. Carry on. Stop. Do not editorialise. Rumination pattern detected on chapter <N>. <count> near-identical prompts within <window_minutes> minutes, threshold <threshold>.
Confidence: <confidence rounded to 2 decimals>. Heuristic: <heuristic.name> v<heuristic.version>.
Chapter <N> is in the can. Open a new question if there is a NEW concern, or move to Chapter <N+1>.The literal sentence Chapter <N> is in the can. Open a new question if there is a NEW concern, or move to Chapter <N+1>. MUST appear verbatim as the final line of the response. The <N> is substituted; the <N+1> is the next integer. For prologue substitute Chapter 1; for the final chapter / epilogue substitute the next project.
unless you'd like me to take another look, but if you want I can review it again, or any equivalent. The flow ends at the closing line. The user has overrides on the guardrail server side (override-once, fresh-context, etc.) if they need to escape — surfacing those overrides in this skill would defeat the point.Strict "Answer First". First sentence ≤ 100 characters.
Writing block — <human time budget>. <N> atomic tasks.
### Tasks
- <task title> (<estimated_minutes> min)
Acceptance: <first acceptance criterion>
- <task title> (<estimated_minutes> min)
Acceptance: <first acceptance criterion>
- ...
These tasks are shaped to the time you have. Word counts are not in the plan, on purpose.Rules:
decompose result. Do not paraphrase.These tasks are shaped to the time you have. Word counts are not in the plan, on purpose. is mandatory and verbatim.Note: tasks sum to <sum> min vs <budget> min budget.<entity name> — <entity.type>. Last note recorded: <relative timestamp>.
### What the graph remembers
- <fact 1, literal, with date>
- <fact 2, literal, with date>
- <fact 3, literal, with date>
- ...
### Connected
- <neighbour 1: project/chapter/entity> (<relationship>)
- <neighbour 2: project/chapter/entity> (<relationship>)
### Internal contradictions
- <fact A literal> vs <fact B literal> — these disagree on <descriptor>. Pick one.
These are the notes you've recorded. I have not invented anything.Rules:
recall_entity — never paraphrased.### Internal contradictions section is omitted entirely when no contradictions are detected. When it is present, list every detected pair; do not summarise multiple contradictions into one line.These are the notes you've recorded. I have not invented anything. is mandatory.### What the graph remembers — if more exist, list the five most recent and append one line: (<M> older notes not shown — call "who is <entity>" with no limit to see all.) Note: v0.1.0 has no "no limit" call; the line is a hook for v0.2.Empty-graph fallback (used when the entity is null or has no facts):
<entity name> — no notes recorded yet. Write them as you go; the graph will remember next time.See step 5 of Flow C above. The closing line is verbatim and the response stops there.
When the result is detected: false:
No rumination pattern detected on chapter <N>. <count> matching prompts within the window, threshold is <threshold>. Carry on.productivity, optimise, streamline, crush, power through, flow state (as praise), writer's block (as diagnosis), polish (as a euphemism for re-editing), wordsmith, prolific.recall_entity — quote the literal text.override_options list in Flow C. The user knows their overrides; surfacing them in the closing-line moment turns the redirect into a negotiation.decompose in Flow B or Flow C.recall_entity in Flow A or Flow C.check_rumination in Flow A or Flow B.record_fact without explicit user opt-in. The cognitive graph is the user's notebook, not the skill's logbook.See tests/:
tests/01-plan-writing-block.md — Flow A with a 3-hour budget, no specific project context.tests/02-who-is-character.md — Flow B recalling a character with two facts and one detected contradiction.tests/03-rumination-on-chapter.md — Flow C with the rumination heuristic firing; asserts the verbatim closing line and asserts the skill does NOT offer to re-validate.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.