Live survey304 models · 14 providers · 22,792 auditsAudited grill-with-docs · SAFE →What changedHow we verifyllms.txt

Agent skill · Audited from source

prose-critique

skill · haowjy/creative-writing-skillsApache-2.0 licenceAudited 27 Oct 2026 · source b4cd5895b975

★ 547pushed today
✕BLOCKGrade D · 62/100 · 19 findings · b4cd589
547repo stars · whole haowjy/creative-writing-skills

Is it safe? No — BLOCK, grade D (62/100). We read this skill's source at commit b4cd5895b975 and observed filesystem, network and shell access and no hard-coded secrets. The audit raised 19 findings, 3 critical or high. What it does: Speak as a specified character from their current knowledge, voice, and emotional state. Use for skill-only workflows that need in-character conversation, voice discovery, or relationship pressure tests.

Ask an AI about this pageGChatGPTCClaudePPerplexityGeGeminiXGrok
More
Cite

Cite this page

ModelsAtlas. “prose-critique (haowjy/creative-writing-skills)”. Retrieved 27 Oct 2026. https://modelsatlas.com/skills/haowjy/prose-critique

Blocked. The page stays public so you can check this skill if someone recommended it to you. The audit found 3 critical or high findings, starting with “Code injection” in plugin/claude/skills/writing-sync/scripts/drive_sync/storage.py:27. Do not install it without reading them.

4 skills are called “prose-critique”. You are viewing haowjy/creative-writing-skills. 3 of them are BLOCK.

Trust audit

Audit 0.4.1 · source read 27 Oct 2026

Trust score62/100✕BLOCK D
0 critical3 high2 medium14 low0 info

BLOCK means the audit found something that could harm you or your machine. Grade D is shared by 721 of 17,602 audited skills.

What the source does

  • FilesystemDeclared1 observation
  • NetworkDeclared2 observations
  • ShellDeclared3 observations
  • DependenciesPinnedNothing floats
  • SecretsNone foundNo keys in source

Five audit layers

LayerWhat we checkResultFindings
L0 ProvenanceRepo owner, licence, archive status, activityPASS1
L1 Static sourceSecrets, path traversal, supply chain, hidden codeFAIL18
L2 InstructionsPrompt injection, authority framing, hidden directivesPASS0
L3 InventoryThe files and declarations match the sourcePASS0
L4 SandboxRun in isolation and watch behaviourSKIPPED why0

Gates applied: no behavioural pass.

Findings (19)

HIGHCode injectioncode.deserialize · plugin/claude/skills/writing-sync/scripts/drive_sync/storage.py:27
F-02 Code injectionCWE-78 · CWE-94 · CWE-95Layer L1
raw = yaml.load(data.decode("utf-8"))
Why
deserialises untrusted bytes into live objects
Fix
use json or yaml.safe_load
HIGHCode injectioncode.deserialize · plugin/cursor/skills/writing-sync/scripts/drive_sync/storage.py:27
F-02 Code injectionCWE-78 · CWE-94 · CWE-95Layer L1
raw = yaml.load(data.decode("utf-8"))
Why
deserialises untrusted bytes into live objects
Fix
use json or yaml.safe_load
HIGHCode injectioncode.deserialize · plugin/opencode/skills/writing-sync/scripts/drive_sync/storage.py:27
F-02 Code injectionCWE-78 · CWE-94 · CWE-95Layer L1
raw = yaml.load(data.decode("utf-8"))
Why
deserialises untrusted bytes into live objects
Fix
use json or yaml.safe_load
MEDIUMNetwork egressnet.raw_ip · plugin/claude/skills/writing-sync/scripts/drive_sync/auth.py:97
F-04 Network egressCWE-200 · CWE-319Layer L1
callback.append('https://127.0.0.1:' + str(self.server.server_port) + self.path)
Why
No further detail recorded for this rule.
Fix
—
MEDIUMNetwork egressnet.raw_ip · plugin/claude/skills/writing-sync/scripts/drive_sync/auth.py:105
F-04 Network egressCWE-200 · CWE-319Layer L1
flow.redirect_uri = f'http://127.0.0.1:{server.server_port}/'
Why
No further detail recorded for this rule.
Fix
—
LOWInventory / provenanceinv.hidden_file · plugin/.mars-plugin.json
F-13 Inventory / provenanceCWE-1104Layer L0
.mars-plugin.json
Why
hidden member outside the usual dotfiles
Fix
review its purpose
LOWFilesystem / pathfs.traversal · plugin/claude/skills/writing-sync/tests/live_integration.py:96
F-05 Filesystem / pathCWE-22 · CWE-59Layer L1
expected = [{'source_href': '../../a.md', 'destination_url': url,
Why
No further detail recorded for this rule.
Fix
—
LOWFilesystem / pathfs.traversal · plugin/claude/skills/writing-sync/tests/live_integration.py:101
F-05 Filesystem / pathCWE-22 · CWE-59Layer L1
or source != b'Nested fixture. [Read parent](../../a.md).\n'):
Why
No further detail recorded for this rule.
Fix
—
LOWFilesystem / pathfs.traversal · plugin/claude/skills/writing-sync/tests/live_integration.py:422
F-05 Filesystem / pathCWE-22 · CWE-59Layer L1
output.write(b'Nested fixture. [Read parent](../../a.md).\n')
Why
No further detail recorded for this rule.
Fix
—
LOWFilesystem / pathfs.traversal · plugin/claude/skills/writing-sync/tests/test_live_runner.py:151
F-05 Filesystem / pathCWE-22 · CWE-59Layer L1
(path / 'g.md').write_bytes(b'Nested fixture. [Read parent](../../a.md).\n')
Why
No further detail recorded for this rule.
Fix
—
LOWFilesystem / pathfs.traversal · plugin/claude/skills/writing-sync/tests/test_live_runner.py:161
F-05 Filesystem / pathCWE-22 · CWE-59Layer L1
bindings = {'3': {'link_provenance': [{'source_href': '../../a.md',
Why
No further detail recorded for this rule.
Fix
—
LOWNetwork egressnet.raw_ip · plugin/claude/skills/writing-sync/tests/test_auth.py:68
F-04 Network egressCWE-200 · CWE-319Layer L1
session.callback.append('https://127.0.0.1/?code=synthetic&state=test-state')
Why
No further detail recorded for this rule.
Fix
—
LOWNetwork egressnet.raw_ip · plugin/claude/skills/writing-sync/tests/test_auth.py:115
F-04 Network egressCWE-200 · CWE-319Layer L1
session.callback.append('https://127.0.0.1/?code=synthetic&state=test-state')
Why
No further detail recorded for this rule.
Fix
—
LOWNetwork egressnet.raw_ip · plugin/claude/skills/writing-sync/tests/test_auth.py:122
F-04 Network egressCWE-200 · CWE-319Layer L1
picker.callback.append('https://127.0.0.1/?code=synthetic&state=test-state&picked_file_ids=granted-folder')
Why
No further detail recorded for this rule.
Fix
—
LOWObfuscation / stealthobf.decode_call · plugin/claude/skills/writing-sync/scripts/drive_sync/conversion_worker.py:23
F-07 Obfuscation / stealthCWE-506 · CWE-94Layer L1
decode = lambda value: base64.b64decode(value, validate=True)
Why
No further detail recorded for this rule.
Fix
—
LOWObfuscation / stealthobf.decode_call · plugin/claude/skills/writing-sync/scripts/drive_sync/return_conversion.py:95
F-07 Obfuscation / stealthCWE-506 · CWE-94Layer L1
return Candidate(b64decode(result['data'], validate=True), result['source_hash'],
Why
No further detail recorded for this rule.
Fix
—
LOWObfuscation / stealthobf.decode_call · plugin/claude/skills/writing-sync/tests/test_metadata_application.py:70
F-07 Obfuscation / stealthCWE-506 · CWE-94Layer L1
self.assertEqual(bytes.fromhex(record['attributes']['user.drive-sync-fixture']),
Why
No further detail recorded for this rule.
Fix
—
LOWObfuscation / stealthobf.decode_call · plugin/cursor/skills/writing-sync/scripts/drive_sync/conversion_worker.py:23
F-07 Obfuscation / stealthCWE-506 · CWE-94Layer L1
decode = lambda value: base64.b64decode(value, validate=True)
Why
No further detail recorded for this rule.
Fix
—
LOWObfuscation / stealthobf.decode_call · plugin/cursor/skills/writing-sync/scripts/drive_sync/return_conversion.py:95
F-07 Obfuscation / stealthCWE-506 · CWE-94Layer L1
return Candidate(b64decode(result['data'], validate=True), result['source_hash'],
Why
No further detail recorded for this rule.
Fix
—

Audit 0.4.1 · source sha b4cd5895b975 · 27 Oct 2026Report an issue or request a re-scan

Provenance

Who published it, and what the verdict is pinned to

  • Publisherhaowjy GitHub userOwner of the repository this skill is read from
  • Source folderhaowjy/creative-writing-skillsThe exact folder we audited
  • LicenceApache-2.0As the repository states it
  • Commit pinned for this verdictb4cd5895b975A new audit runs when the source changes
  • Repository statusNot archivedPushed today
  • Sandboxed runNot runSkills are read, not executed; layer L4 is skipped

What it tells the agent

Full source on GitHub ↗

Its description: Speak as a specified character from their current knowledge, voice, and emotional state. Use for skill-only workflows that need in-character conversation, voice discovery, or relationship pressure tests.

---
name: character-sim
description: >
  Speak as a specified character from their current knowledge, voice, and emotional state. Use for skill-only workflows that need in-character conversation, voice discovery, or relationship pressure tests.
model-invocable: true
metadata:
  type: mode-shift
---

# Character Simulation

Become the specified character for conversation. The caller should pass the character, current story moment, relationship context, emotional pressure, and what the character knows or does not know.

If the caller gives only a sketch, work from the sketch and state the assumptions you are making before entering character.

## Method

Build the character from the available evidence. Style shows how they talk: speech patterns, vocabulary, rhythms. Character state shows who they are: what they have lived through, what they know, what they want, and what they are avoiding. Load both. If character state is missing, find it.

Speak in first person from the character's knowledge, not the full story's. When they would be confused, be confused. When they would deflect, deflect. When they would misunderstand, misunderstand.

Match how they actually talk. Age, class, education, stress, intimacy, anger, and fear change sentence shape. Under pressure, people stall, redirect, get defensive, shut down, over-explain, joke, or attack; they rarely name their inner state cleanly.

Let the conversation be messy. Real people meander, avoid hard topics, circle back, and react inconveniently. When there is no obvious answer, improvise from who the character is.

The conversation is the output. Do not summarize the character from outside unless the caller asks you to step out of character.

Excerpt, first 1,712 characters of SKILL.md, verbatim from the audited commit. It is text from someone else’s repository, quoted so you can judge it before your agent reads it.

Install

Pinned to the audited commit b4cd589

uv run resources/analyze.py <file.md> [window_size]
uv run resources/analyze.py "$chapter"
uv sync --locked --no-editable --python 3.11

Commands as the repository documents them: shown, never run by us. Our verdict covers commit b4cd5895b975 only.

Works in which agents?

What its own text says, not a test

AgentStatusMore
Claude CodeMentioned in its text, not testedSkills for Claude Code · About Claude Code
Claude DesktopMentioned in its text, not testedSkills for Claude Desktop · About Claude Desktop
CodexMentioned in its text, not testedSkills for Codex · About Codex
CursorMentioned in its text, not testedSkills for Cursor · About Cursor
“Mentioned” means the skill’s text names the agent. We have not run it there.

Audit history

Every audit, every source change

  1. ✕BLOCK D 62 / 100

    first audit · source b4cd5895b975

Similar skills

Questions about prose-critique

What does the prose-critique skill do?
claude skills focused on creative writing
Is prose-critique safe to install?
No — not without reading the findings first. The audit graded it D (62/100) and found 3 critical or high issues in the source. Each one is listed on this page with the file and line it is on.
What can prose-critique access on my machine?
The audit observed that it reaches the network, runs shell commands and reads or writes files. Each of those is consistent with what it says it does. Secrets in the source: none found.
Which assistants does prose-critique work with?
Its documentation mentions claude-code, claude-desktop, codex and cursor. That is what the text claims, not a compatibility test we ran.
How current is this page?
The grade is for one exact copy of the source (b4cd5895b975), read on 2026-10-27. The repository is watched, and a new audit runs when it changes — this is the first audit.

Sources

Spotted something wrong? Report a correction · Methodology

Keep going in your AI

Opens with this page as the source. We add nothing else to the prompt.