Atlas / Skills / nuncaeslupus / literary-critic

literary-criticBLOCK

skills/nuncaeslupus/literary-critic

Lets an LLM index, analyse and advise on a whole novel manuscript like a professional editor, across drafts.

Verdict
BLOCK
Grade
D
Trust score
69 /100
Version
—
Hosts
4 documented
License
Apache-2.0
Stars
0
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Tooling that lets an LLM work through a full novel manuscript as a professional editor would — and that keeps working across many chat sessions and drafts.

  1. Index — turn the manuscript into stable anchors (part → chapter → scene →

paragraph) and a Codex — a knowledge base of scenes, characters, places, facts, setups/payoffs and findings, each tied to its text — so the LLM can find and relate anything without loading the whole book.

  1. Analyse — run a generic catalogue of checks (structure, characters, plot,

scenes, POV, prose, dialogue, continuity, ...), adapted to each novel, with evidence anchored to the text and script-measured metrics wherever possible.

  1. Advise — produce prioritised, concrete revision actions in rounds

(structural first, then scene, then line level), track their status, re-index the next draft and measure what changed.

For novelists, and the editors who work with them, who want an LLM's reading of a whole manuscript without handing it the pen. In Claude Code:

git clone https://github.com/nuncaeslupus/literary-critic.git && cd literary-critic && claude
# then say: "I want to use literary-critic for my novel"

Status: early development. See status/specification.md and status/plan.md.

How it is used

Read from source at commit cb2783beb12dOBSERVED · 2026-10-13
Advertisement
02

Install

Commands as the repository documents them. They are shown, not run.

uv lock --upgrade        # or --upgrade-package NAME for one targeted bump
uv sync                  # lock rewrites the file only; tests need the new install
uv run --with pip-audit pip-audit
uv run --with playwright python3 .../capture_har.py --url URL --output capture.har
uvx --from git+https://github.com/nuncaeslupus/drawspec drawspec
uv run lc
03

Host compatibility

What the documentation claims. We have not run a compatibility test.

HostStatusNotes
claude-codementioned
claude-desktopmentioned
codexmentioned
cursormentioned
04

What it tells the agent

The instruction file, verbatim from the audited commit — this is the text the model reads, and the surface the audit's instruction layer examines. Quoted here so you can judge it without cloning anything.

---
name: coverage-gaps
description: Ranks the highest-value missing tests from coverage.py's coverage.json; cheaper than mutmut-report. Use when the user asks what tests are missing or where coverage gaps are. Not for running the suite or non-Python coverage.
argument-hint: "--input coverage.json --limit N"
user-invocable: true
metadata:
  section: python
---

# coverage-gaps

Turns an existing coverage.py report into a ranked list of the tests worth
writing next.

CANARY: coverage-gaps-loaded-2026-06-04-ea39c2b5-b32fe2b1b5ae5e96

## When to load

Load when the question is which coverage gaps to fill first. This is the cheap,
line-level pass; once line coverage is healthy and the question is whether
tests assert behaviour, use the `mutmut-report` skill.

## Step 1 — Ensure a JSON report exists

The script reads coverage.py's JSON export, not the `.coverage` database, and
exits 2 without it. Regenerate it after a refactor, since old line numbers
drift from the source.

```bash
coverage json                                    # after `coverage run -m pytest`
pytest --cov=PKG --cov-branch --cov-report=json  # or in one shot, with branches
```

## Step 2 — Rank the gaps

```bash
python3 "${CLAUDE_SKILL_DIR}/scripts/analyze_coverage.py" --input coverage.json --limit 20
```

The JSON carries `total_percent_covered`, `files_with_gaps`, and a ranked `gaps`
list with `missing_count`, `percent_covered`, `missing_branches` (populated only
with branch coverage), `largest_run` and `missing_runs` (inclusive line ranges).

## Step 3 — Propose tests

Open the source at each `missing_runs` range before recommending, because a long
run can be a generated block, a `__repr__` or an `if TYPE_CHECKING:` island;
rank by what the code does, not by line count. Then report:

1. The 2–3 tests worth writing now: which function, which input, which branch.
2. Branch gaps in otherwise well-covered files, from `missing_branches`.
3. Low-value gaps (scattered defensive `raise` or logging lines) that can wait
   or take `# pragma: no cover`.

Covered means executed, not asserted, so treat this ranking as the floor.
05

Trust audit

BLOCKgrade D · trust 69/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)FAIL
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (5 observation(s))
Network
declared (10 observation(s))
Shell
declared (1 observation(s))
Dependencies
pinned
Secrets in source
none-found

Findings (17)

HIGHPrompt injection · prompt.credential_read · CWE-94, CWE-1427
.claude/skills/queue-add/SKILL.md:71
| `access:secrets` | machine-local credentials | naming it at `/queue-next` |
Why it matters. asks the agent to read credentials
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
src/litcritic/kinds/__init__.py:31
return importlib.import_module(f"{__name__}.{name}")
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
src/litcritic/ingest.py:77
text = re.sub("[]", "", text)
LOWInventory / provenance · inv.hidden_file · CWE-1104
.coderabbit.yaml
.coderabbit.yaml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.pre-commit-config.yaml
.pre-commit-config.yaml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
claude-arsenal/.arsenal-manifest
.arsenal-manifest
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
claude-arsenal/.bundle-version
.bundle-version
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.suspicious_name · CWE-1104
.claude/skills/queue-add/references/payload-template.md
payload-template.md
Why it matters. member named after an attack tool
Fix. remove or justify
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
.claude/skills/init/assets/scripts/create_reader.py:235
return "doc-" + hashlib.sha1(text.encode("utf-8")).hexdigest()[:8]  # a name, not a signature
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
claude-arsenal/scripts/create_reader.py:235
return "doc-" + hashlib.sha1(text.encode("utf-8")).hexdigest()[:8]  # a name, not a signature
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/litcritic/packets.py:282
out[sc["id"]] = hashlib.sha1(body.encode("utf-8")).hexdigest()[:16]
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/litcritic/spans.py:148
span.sha1 = hashlib.sha1(body.encode("utf-8")).hexdigest()
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/litcritic/spans.py:192
and hashlib.sha1(body.encode("utf-8")).hexdigest() == span.sha1
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/test_pack.py:139
for slug in ("../../x", "/tmp/x"):
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
arsenal/project/codex/plan-annotated.md:116
- Writer-facing report (S1), session flow and journal (S2), Claude packaging and local tool server (S3), editing real files, docx-fixer integration.
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
arsenal/project/codex/plan-reader.html:318
<li>Writer-facing report (S1), session flow and journal (S2), Claude packaging and local tool server (S3), editing real files, docx-fixer integration.</li>
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
arsenal/project/codex/plan.md:78
- Writer-facing report (S1), session flow and journal (S2), Claude packaging and local tool server (S3), editing real files, docx-fixer integration.
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine

Gates applied: no_behavioural_pass.

Audited 2026-10-13 · audit v0.4.1 · source sha cb2783beb12dfull audit observations/trust-audit/skill/nuncaeslupus__literary-critic.json · Report an issue / request a re-scan
06

Audit history

Every audit this skill has had.

DateSourceVerdictGradeScoreChange
2026-10-13cb2783beb12dBLOCKD69first audit
07

Questions

What does the literary-critic skill do?

Lets an LLM index, analyse and advise on a whole novel manuscript like a professional editor, across drafts.

Is literary-critic safe to install?

No — not without reading the findings first. The audit graded it D (69/100) and found 1 critical or high issue in the source. Each one is listed on this page with the file and line it is on.

What can literary-critic 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 literary-critic 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 (cb2783beb12d), read on 2026-10-13. The repository is watched, and a new audit runs when it changes — this is the first audit.

Advertisement