Severity: low. Individually trivial, collectively the reason agents mis-parse output.
caption --json (SKILL.md:407-421) omits top-level dryRun and skipped (caption.ts:395-401) — so an agent
can't distinguish a dry-run from a real run, or count idempotent skips. SKILL.md gets this right for
title/describe/tag/rename, so it's an inconsistency rather than a systemic gap.
audit --json (SKILL.md:239-257) omits prunedAttachments (audit.ts:325) and summary.unattached (:336).
a11y --json (SKILL.md:634-646) omits errors, truncated, complete (a11y.ts:242-244), and doesn't mention
that a11y.ts:246 sets exit 4 while still returning a valid partial payload.
SKILL.md:215 cites list.ts:437 for the list --json shape; the actual printJson is list.ts:394.
SKILL.md:368-377 presents one bulk dry-run shape as canonical. There are six, and the discriminator itself
flips between dryRun: true and action: 'dry-run': optimize.ts:499, export.ts:175, import.ts:288,
metadata.ts:81, delete.ts:72, regenerate.ts:93, posts.ts:358/459/520. An agent cannot write one detector.
SKILL.md:935 calls --json "NDJSON"; only watch is NDJSON. Contradicts SKILL.md:73.
SKILL.md:~880 omits edit (edit.ts:190) and classify (classify.ts:112) from the snapshot-capturing list;
both do capture.
src/cli/mcp/server.ts:30 (the server instructions — the first thing the host model reads) claims
"Bulk ops (list+optimize/convert/resize/caption with --unoptimized or --all) are dry-run by default", but convert
and resize take <ids...> only and have no --all/--unoptimized, and list isn't a bulk op.
Extracted from a repo audit performed 2026-07 (the audit doc it came from was proposed via an unmerged docs PR).
Severity: low. Individually trivial, collectively the reason agents mis-parse output.
caption --json(SKILL.md:407-421) omits top-leveldryRunandskipped(caption.ts:395-401) — so an agentcan't distinguish a dry-run from a real run, or count idempotent skips. SKILL.md gets this right for
title/describe/tag/rename, so it's an inconsistency rather than a systemic gap.audit --json(SKILL.md:239-257) omitsprunedAttachments(audit.ts:325) andsummary.unattached(:336).a11y --json(SKILL.md:634-646) omitserrors,truncated,complete(a11y.ts:242-244), and doesn't mentionthat
a11y.ts:246sets exit 4 while still returning a valid partial payload.SKILL.md:215citeslist.ts:437for thelist --jsonshape; the actualprintJsonislist.ts:394.SKILL.md:368-377presents one bulk dry-run shape as canonical. There are six, and the discriminator itselfflips between
dryRun: trueandaction: 'dry-run':optimize.ts:499,export.ts:175,import.ts:288,metadata.ts:81,delete.ts:72,regenerate.ts:93,posts.ts:358/459/520. An agent cannot write one detector.SKILL.md:935calls--json"NDJSON"; onlywatchis NDJSON. ContradictsSKILL.md:73.SKILL.md:~880omitsedit(edit.ts:190) andclassify(classify.ts:112) from the snapshot-capturing list;both do capture.
src/cli/mcp/server.ts:30(the serverinstructions— the first thing the host model reads) claims"Bulk ops (list+optimize/convert/resize/caption with --unoptimized or --all) are dry-run by default", but
convertand
resizetake<ids...>only and have no--all/--unoptimized, andlistisn't a bulk op.Extracted from a repo audit performed 2026-07 (the audit doc it came from was proposed via an unmerged docs PR).