literary-criticBLOCK
Lets an LLM index, analyse and advise on a whole novel manuscript like a professional editor, across drafts.
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.
- 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.
- 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.
- 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
cb2783beb12dOBSERVED · 2026-10-13Install
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
Host compatibility
What the documentation claims. We have not run a compatibility test.
| Host | Status | Notes |
|---|---|---|
| claude-code | mentioned | |
| claude-desktop | mentioned | |
| codex | mentioned | |
| cursor | mentioned |
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.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.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | WARN |
| L2 | Instruction surface (what it tells the agent) | FAIL |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (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)
| `access:secrets` | machine-local credentials | naming it at `/queue-next` |
return importlib.import_module(f"{__name__}.{name}")text = re.sub("[]", "", text).coderabbit.yaml
.pre-commit-config.yaml
.arsenal-manifest
.bundle-version
payload-template.md
return "doc-" + hashlib.sha1(text.encode("utf-8")).hexdigest()[:8] # a name, not a signaturereturn "doc-" + hashlib.sha1(text.encode("utf-8")).hexdigest()[:8] # a name, not a signatureout[sc["id"]] = hashlib.sha1(body.encode("utf-8")).hexdigest()[:16]span.sha1 = hashlib.sha1(body.encode("utf-8")).hexdigest()and hashlib.sha1(body.encode("utf-8")).hexdigest() == span.sha1for slug in ("../../x", "/tmp/x"):- Writer-facing report (S1), session flow and journal (S2), Claude packaging and local tool server (S3), editing real files, docx-fixer integration.
<li>Writer-facing report (S1), session flow and journal (S2), Claude packaging and local tool server (S3), editing real files, docx-fixer integration.</li>
- Writer-facing report (S1), session flow and journal (S2), Claude packaging and local tool server (S3), editing real files, docx-fixer integration.
Gates applied: no_behavioural_pass.
cb2783beb12dfull audit observations/trust-audit/skill/nuncaeslupus__literary-critic.json · Report an issue / request a re-scanAudit history
Every audit this skill has had.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-13 | cb2783beb12d | BLOCK | D | 69 | first audit |
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.