{
  "id": "no-ai-voice-writing",
  "type": "loadout",
  "title": "Writing rules that avoid AI-sounding prose",
  "summary": "Rules and a linter that stop agents writing 'seamlessly empowers', 'not just X, it's Y', fake proof and em-dash runs into your docs, PRs and release notes.",
  "description": "Readers now spot machine prose in a sentence and stop trusting the page. The tells are well documented: inflated words like delve, tapestry and pivotal, 'it's not just X, it's Y', reflexive groups of three, em-dash runs, emoji bullets, chat filler and proof nobody can check. This loadout gives the agent plain-English rules for every file it writes, a word list with the plain alternative for each pattern, and a standard-library linter that skips code and quotations. The verifier runs the linter on a sloppy README (22 findings) and on a plain rewrite (none).\n",
  "highlights": [
    "Rules for docs, READMEs, PRs, commit messages, release notes and UI copy",
    "Word list with the plain alternative for each pattern, UK spelling",
    "Linter skips fenced code, inline code, quotes and front matter",
    "Flags fake proof such as '10,000+ users' and 'trusted by thousands'",
    "Allow-list for deliberate exceptions"
  ],
  "version": "1.0.0",
  "license": "MIT",
  "author": {
    "name": "Agent Loadout",
    "url": "https://loadout.jnw-it.com"
  },
  "credits": [
    {
      "title": "Wikipedia: Signs of AI writing (WikiProject AI Cleanup)",
      "url": "https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing"
    },
    {
      "title": "@CDGalpha: the tells, from 'delve' and 'seamless' to em-dash spam and fake '10,000+ users' proof",
      "url": "https://x.com/CDGalpha/status/2110292549210620174"
    },
    {
      "title": "plainlanguage.gov: federal plain language guidelines",
      "url": "https://www.plainlanguage.gov/guidelines/"
    }
  ],
  "categories": [
    "workflow"
  ],
  "stacks": [
    "any",
    "markdown"
  ],
  "files": [
    {
      "path": "AGENTS.md",
      "role": "instructions",
      "description": "Plain-writing rules for every file and reply the agent writes.",
      "skill": null,
      "agent": null,
      "install_to": {
        "claude-code": "AGENTS.md",
        "codex": "AGENTS.md",
        "cursor": "AGENTS.md",
        "gemini-cli": "AGENTS.md",
        "antigravity-cli": "AGENTS.md",
        "copilot": "AGENTS.md"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/AGENTS.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/latest/AGENTS.md",
      "bytes": 1788,
      "lang": "markdown",
      "content": "# AGENTS.md: write like a person, not a press release\n\nApplies to everything you write for this project: docs, READMEs, commit messages, PR descriptions, release notes,\nchangelogs, UI copy and replies to the user. Readers now recognise machine prose on sight and stop trusting it.\n\n## Rules\n- Say the thing. Lead with the fact, the number or the instruction. No warm-up sentence, no summary of what you are\n  about to say, no closing recap.\n- Plain words. \"Use\" not \"leverage\", \"has\" not \"boasts\", \"important\" only when you say why. The `plain-prose` skill has the full word list.\n- No inflated significance: nothing is a \"testament\", a \"tapestry\", \"pivotal\", \"game-changing\" or \"a journey\".\n- No \"it's not just X, it's Y\" and no \"not only X but also Y\". State what it is.\n- No reflexive groups of three. Use the number of items there are.\n- Punctuation: full stops and commas. At most one em dash per paragraph; prefer a colon, comma or new sentence.\n- No emoji as bullets or headings. No bold on every other phrase. Sentence-case headings.\n- No unverifiable proof: \"trusted by thousands\", \"10,000+ users\", \"industry-leading\". Give a source or cut it.\n- No chat filler in files: \"Great question\", \"I hope this helps\", \"Let's dive in\", \"Certainly!\".\n- Be specific. Replace \"improves performance\" with the measurement, \"various issues\" with the issues.\n- Follow the project's spelling. This project uses UK English unless a file already uses another variant.\n\n## Check before you finish\n- Run the `plain-prose` skill's linter (`scripts/prose_lint.py` in the skill folder) on prose you wrote or changed. Fix every finding or explain why it stays. Use the `plain-prose` skill for rewrites.\n- Code, identifiers and quoted text are exempt. Do not \"fix\" a word inside backticks or a quotation.\n"
    },
    {
      "path": "CLAUDE.md",
      "role": "adapter",
      "description": "Imports AGENTS.md for Claude Code.",
      "skill": null,
      "agent": "claude-code",
      "install_to": {
        "claude-code": "CLAUDE.md",
        "codex": null,
        "cursor": null,
        "gemini-cli": null,
        "antigravity-cli": null,
        "copilot": null
      },
      "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/CLAUDE.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/latest/CLAUDE.md",
      "bytes": 393,
      "lang": "markdown",
      "content": "# CLAUDE.md\n\n@AGENTS.md\n\n## Claude Code notes\n- Skills from this loadout live in `.claude/skills/`: `plain-prose`. Use them when their description matches the task.\n- Follow AGENTS.md above; where this file and AGENTS.md disagree, AGENTS.md wins.\n\n<!-- From the Agent Loadout \"Writing rules that avoid AI-sounding prose\" v1.0.0 — https://loadout.jnw-it.com/loadouts/no-ai-voice-writing/ -->\n"
    },
    {
      "path": "GEMINI.md",
      "role": "adapter",
      "description": "Imports AGENTS.md for Gemini CLI.",
      "skill": null,
      "agent": "gemini-cli",
      "install_to": {
        "claude-code": null,
        "codex": null,
        "cursor": null,
        "gemini-cli": "GEMINI.md",
        "antigravity-cli": null,
        "copilot": null
      },
      "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/GEMINI.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/latest/GEMINI.md",
      "bytes": 394,
      "lang": "markdown",
      "content": "# GEMINI.md\n\n@./AGENTS.md\n\n## Gemini CLI notes\n- Skills from this loadout live in `.agents/skills/`: `plain-prose`. Use them when their description matches the task.\n- Follow AGENTS.md above; where this file and AGENTS.md disagree, AGENTS.md wins.\n\n<!-- From the Agent Loadout \"Writing rules that avoid AI-sounding prose\" v1.0.0 — https://loadout.jnw-it.com/loadouts/no-ai-voice-writing/ -->\n"
    },
    {
      "path": "skills/plain-prose/SKILL.md",
      "role": "skill",
      "description": "Lint, rewrite and re-check prose.",
      "skill": "plain-prose",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/plain-prose/SKILL.md",
        "codex": ".agents/skills/plain-prose/SKILL.md",
        "cursor": ".agents/skills/plain-prose/SKILL.md",
        "gemini-cli": ".agents/skills/plain-prose/SKILL.md",
        "antigravity-cli": ".agents/skills/plain-prose/SKILL.md",
        "copilot": ".agents/skills/plain-prose/SKILL.md"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/skills/plain-prose/SKILL.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/latest/skills/plain-prose/SKILL.md",
      "bytes": 1450,
      "lang": "markdown",
      "content": "---\nname: plain-prose\ndescription: Rewrite or check prose so it does not read as machine-written. Use for READMEs, docs, release notes, PR descriptions, commit messages and UI copy, before showing them to the user.\n---\n\n# Plain prose\n\n1. Lint first: `python3 scripts/prose_lint.py <file> [<file> ...]`. It skips fenced code, inline code and block\n   quotes, and prints `path:line rule \"match\" -> suggestion`. Exit code 1 means there are findings.\n2. Fix each finding by rewriting the sentence, not by swapping in a synonym. Most findings mean the sentence has no\n   content: delete it, or replace it with the specific fact it was gesturing at.\n3. Read `references/word-list.md` for the patterns and the plain alternatives.\n4. Re-run the lint until it is clean, or until every remaining finding is deliberate (a quotation, a product name).\n   Pass `--allow word` for a deliberate exception and say why in your reply.\n5. Read the result aloud in your head. If a sentence would sound odd said to a colleague, rewrite it.\n\n## Before and after\n- Before: \"This powerful tool seamlessly empowers teams to unlock their full potential.\"\n  After: \"Runs the test suite on every push and posts failures to the PR.\"\n- Before: \"It's not just a linter, it's a complete quality journey.\"\n  After: \"It lints Markdown and checks links.\"\n- Before: \"Trusted by 10,000+ developers worldwide.\"\n  After: cut it, or \"Downloaded 12,400 times last month (npm, October 2026).\"\n"
    },
    {
      "path": "skills/plain-prose/scripts/prose_lint.py",
      "role": "reference",
      "description": "Standard-library linter for machine-prose patterns.",
      "skill": "plain-prose",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/plain-prose/scripts/prose_lint.py",
        "codex": ".agents/skills/plain-prose/scripts/prose_lint.py",
        "cursor": ".agents/skills/plain-prose/scripts/prose_lint.py",
        "gemini-cli": ".agents/skills/plain-prose/scripts/prose_lint.py",
        "antigravity-cli": ".agents/skills/plain-prose/scripts/prose_lint.py",
        "copilot": ".agents/skills/plain-prose/scripts/prose_lint.py"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/skills/plain-prose/scripts/prose_lint.py",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/latest/skills/plain-prose/scripts/prose_lint.py",
      "bytes": 5460,
      "lang": "markdown",
      "content": "#!/usr/bin/env python3\n\"\"\"Flag prose patterns that read as machine-written.\n\nUsage: python3 prose_lint.py [--allow word,word] [--max-dashes N] FILE [FILE ...]\nSkips fenced code blocks, inline code, block quotes and YAML front matter.\nPrints \"path:line rule \"match\" -> suggestion\" and exits 1 if anything is found. Standard library only.\n\"\"\"\nimport re\nimport sys\n\nW = r\"\\b\"\nVOCAB = [\n    (r\"delv(?:e|es|ed|ing)|deep[- ]dive\", \"look at, read, check\"),\n    (r\"leverag(?:e|es|ed|ing)\", \"use\"),\n    (r\"utili[sz](?:e|es|ed|ing|ation)\", \"use\"),\n    (r\"boasts\", \"has\"),\n    (r\"seamless(?:ly)?\", \"say what happens, or cut\"),\n    (r\"robust(?:ly|ness)?\", \"say what it withstands\"),\n    (r\"tapestry|testament\", \"cut\"),\n    (r\"pivotal|crucial\", \"important, and say why\"),\n    (r\"underscor(?:e|es|ed|ing)\", \"show\"),\n    (r\"showcas(?:e|es|ed|ing)\", \"show\"),\n    (r\"foster(?:s|ed|ing)?\", \"build, encourage\"),\n    (r\"empower(?:s|ed|ing)?|unlock(?:s|ed|ing)? (?:the |your |their )?(?:full )?potential|elevat(?:e|es|ed|ing) your\", \"say what it lets someone do\"),\n    (r\"cutting[- ]edge|game[- ]chang(?:er|ing)|revolutionary|next[- ]level|best[- ]in[- ]class|industry[- ]leading\", \"cut\"),\n    (r\"vibrant|intricate|meticulous(?:ly)?|multifaceted\", \"cut, or be specific\"),\n    (r\"navigat(?:e|ing) the (?:complexities|challenges|world)\", \"handle, deal with\"),\n    (r\"ever[- ](?:evolving|changing) (?:landscape|world)|in the (?:\\w+ )?landscape of\", \"cut\"),\n    (r\"(?:a|the|this|your) journey\", \"cut (figurative 'journey')\"),\n]\nPHRASES = [\n    (\"not-just\", r\"\\b(?:it'?s|this is|is) not just (?:a |an |about )?[^.,;]{1,40}[,;:]\\s*(?:it'?s|but)\\b\", \"say what it is\"),\n    (\"not-only\", r\"\\bnot only\\b[^.]{1,80}\\bbut also\\b\", \"say what it is\"),\n    (\"whether-youre\", r\"\\bwhether you'?re (?:a |an )?\\w+ or\\b\", \"cut\"),\n    (\"fast-paced\", r\"\\bin today'?s (?:fast[- ]paced|digital|modern) (?:world|age|landscape)\\b\", \"cut\"),\n    (\"serves-as\", r\"\\b(?:stands|serves) as (?:a|an|the)\\b\", \"is\"),\n    (\"plays-a-role\", r\"\\bplays? an? (?:crucial|key|pivotal|vital|important) role\\b\", \"say what it does\"),\n    (\"chat-opener\", r\"^(?:certainly|absolutely|great question|of course)[!,.]\", \"cut\"),\n    (\"chat-closer\", r\"\\b(?:i hope this helps|let me know if you (?:have|need)|happy to help)\\b\", \"cut\"),\n    (\"lets-dive\", r\"\\blet'?s (?:dive|jump|get started)\\b\", \"cut\"),\n    (\"recap\", r\"^(?:in conclusion|in summary|overall),\", \"cut the recap\"),\n    (\"additionally\", r\"^additionally,\", \"also, or a new paragraph\"),\n    (\"unverified-proof\", r\"\\b\\d{1,3}(?:,\\d{3})+\\+|\\btrusted by (?:thousands|millions|teams|developers)\\b\", \"give a source and date, or cut\"),\n]\nEMOJI_BULLET = re.compile(r\"^\\s*(?:[-*]\\s+)?[\\U0001F300-\\U0001FAFF\\u2600-\\u27BF\\u2705\\u274C]\\s*\\S|^#+\\s*[\\U0001F300-\\U0001FAFF\\u2600-\\u27BF]\")\nDASH = \"\\u2014\"\n\n\ndef strip_inline(line):\n    return re.sub(r\"`[^`]*`\", lambda m: \" \" * len(m.group(0)), line)\n\n\ndef lint(path, allow, max_dashes):\n    out = []\n    with open(path, encoding=\"utf-8\") as fh:\n        lines = fh.read().splitlines()\n    in_code = False\n    in_front = bool(lines) and lines[0].strip() == \"---\"\n    para_dashes = 0\n    vocab = [(re.compile(W + \"(?:\" + p + \")\" + W, re.I), s) for p, s in VOCAB]\n    phrases = [(n, re.compile(p, re.I), s) for n, p, s in PHRASES]\n    for n, raw in enumerate(lines, 1):\n        if in_front:\n            if n > 1 and raw.strip() == \"---\":\n                in_front = False\n            continue\n        if raw.lstrip().startswith((\"```\", \"~~~\")):\n            in_code = not in_code\n            continue\n        if in_code or raw.lstrip().startswith(\">\"):\n            continue\n        if not raw.strip():\n            para_dashes = 0\n            continue\n        line = strip_inline(raw)\n        text = re.sub(r\"^\\s*(?:[-*+]|\\d+\\.)\\s+\", \"\", line)\n        text = re.sub(r\"^#+\\s*\", \"\", text).strip()\n        for rx, sugg in vocab:\n            for m in rx.finditer(line):\n                if m.group(0).lower() not in allow:\n                    out.append((n, \"ai-vocabulary\", m.group(0), sugg))\n        for name, rx, sugg in phrases:\n            m = rx.search(text)\n            if m and m.group(0).lower() not in allow:\n                out.append((n, name, m.group(0), sugg))\n        if EMOJI_BULLET.search(line):\n            out.append((n, \"emoji-bullet\", line.strip()[:20], \"plain bullet or heading\"))\n        if len(re.findall(r\"\\*\\*[^*]+\\*\\*\", line)) >= 3:\n            out.append((n, \"bold-spam\", \"**\", \"bold one thing at most\"))\n        para_dashes += line.count(DASH)\n        if line.count(DASH) and para_dashes > max_dashes:\n            out.append((n, \"em-dash\", DASH, \"colon, comma or a new sentence\"))\n    return [(path, *f) for f in out]\n\n\ndef main(argv):\n    allow, max_dashes, files = set(), 1, []\n    it = iter(argv[1:])\n    for a in it:\n        if a == \"--allow\":\n            allow |= {w.strip().lower() for w in next(it, \"\").split(\",\") if w.strip()}\n        elif a == \"--max-dashes\":\n            max_dashes = int(next(it, \"1\"))\n        else:\n            files.append(a)\n    if not files:\n        print(__doc__.strip())\n        return 2\n    findings = []\n    for f in files:\n        findings += lint(f, allow, max_dashes)\n    for path, n, rule, match, sugg in findings:\n        print(f'{path}:{n} {rule} \"{match}\" -> {sugg}')\n    print(f\"{len(findings)} finding{'s' if len(findings) != 1 else ''} in {len(files)} file{'s' if len(files) != 1 else ''}\")\n    return 1 if findings else 0\n\n\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv))\n"
    },
    {
      "path": "skills/plain-prose/references/word-list.md",
      "role": "reference",
      "description": "Patterns and plain alternatives.",
      "skill": "plain-prose",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/plain-prose/references/word-list.md",
        "codex": ".agents/skills/plain-prose/references/word-list.md",
        "cursor": ".agents/skills/plain-prose/references/word-list.md",
        "gemini-cli": ".agents/skills/plain-prose/references/word-list.md",
        "antigravity-cli": ".agents/skills/plain-prose/references/word-list.md",
        "copilot": ".agents/skills/plain-prose/references/word-list.md"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/skills/plain-prose/references/word-list.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/latest/skills/plain-prose/references/word-list.md",
      "bytes": 1874,
      "lang": "markdown",
      "content": "# Word list: patterns that read as machine-written\n\nPatterns, not banned words. \"Key\" is fine in \"API key\"; \"landscape\" is fine for a painting. The linter flags\nfigurative uses where it can; you decide.\n\n## Inflated vocabulary (use the plain word or cut)\n| Pattern | Instead |\n| --- | --- |\n| delve, deep dive | look at, read, check |\n| leverage | use |\n| utilise | use |\n| boasts | has |\n| seamless, seamlessly | say what actually happens, or cut |\n| robust | say what it withstands |\n| tapestry, testament, journey (figurative) | cut |\n| pivotal, crucial, vital | important, and say why |\n| underscore, highlight (as verbs for ideas) | show |\n| showcase, showcasing | show |\n| foster, fostering | build, encourage |\n| empower, unlock, elevate | let, allow, improve (with a number) |\n| cutting-edge, game-changing, revolutionary, next-level | cut |\n| vibrant, intricate, meticulous, multifaceted | cut, or be specific |\n| navigate (the complexities of) | handle, deal with |\n| in the ever-evolving landscape of | cut |\n| additionally (opening a sentence) | also, or start a new paragraph |\n\n## Constructions\n- \"It's not just X, it's Y\" / \"not only X but also Y\": say what it is.\n- \"Whether you're a beginner or an expert\": cut.\n- \"In today's fast-paced world\": cut.\n- \"Stands as a\", \"serves as a\": \"is\".\n- \"Plays a crucial role in\": say what it does.\n- Opening chat: \"Certainly!\", \"Great question\", \"Absolutely\". Closing chat: \"I hope this helps\", \"Let me know if\".\n- \"In conclusion\", \"Overall,\", \"In summary,\" at the end of a short text: cut the recap.\n\n## Punctuation and layout\n- Em dashes: at most one per paragraph.\n- Emoji used as bullets or before headings.\n- Bold on several phrases in one paragraph.\n- Title Case Headings: use sentence case.\n\n## Proof\n- \"Trusted by thousands\", \"10,000+ users\", \"industry-leading\", \"best-in-class\": give a source and date, or cut.\n"
    }
  ],
  "requires": {
    "tools": [
      "python3"
    ],
    "env": [],
    "mcp": []
  },
  "tested": {
    "status": "untested",
    "last_run": null,
    "fixture": null,
    "per_agent": {
      "claude-code": "untested",
      "codex": "untested",
      "cursor": "untested",
      "gemini-cli": "untested",
      "antigravity-cli": "untested",
      "copilot": "untested"
    }
  },
  "security": {
    "scanned": true,
    "scanner": "intake-precheck/1",
    "verdict": "clean",
    "network": false,
    "scripts": [
      "prose_lint.py"
    ],
    "notes": "The linter only reads the files you pass it. No network access, no dependencies."
  },
  "featured": false,
  "deprecated": false,
  "last_checked": "2026-10-17",
  "published": "2026-10-17",
  "updated": "2026-10-17",
  "compatibility": {
    "claude-code": "native",
    "codex": "native",
    "cursor": "native",
    "gemini-cli": "native",
    "antigravity-cli": "native",
    "copilot": "native"
  },
  "counts": {
    "rules": 1,
    "skills": 1,
    "mcp": 0
  },
  "url": "https://loadout.jnw-it.com/loadouts/no-ai-voice-writing/",
  "api_url": "https://loadout.jnw-it.com/api/loadouts/no-ai-voice-writing.json",
  "verification": {
    "level": "verified-install",
    "status": "verified",
    "label": "Verified install",
    "verified": true,
    "checked_at": "2026-10-17T09:35:26Z",
    "commit": "021470d33f1f82ab91e12f0c64c43ad15bac6118",
    "content_current": true,
    "agent_tests": "not-run",
    "counts": {
      "pass": 9,
      "fail": 0,
      "skip": 0,
      "not_applicable": 1
    },
    "meaning": "Level 1: automated checks on the files (parse, install paths, MCP config, safety scan, references, size, licence, starter build). No AI agent was run.",
    "checks": [
      {
        "id": "listing",
        "name": "Listing",
        "status": "pass",
        "summary": "Schema valid; 6 files declared, none missing or extra",
        "details": [
          "tested.status: untested (agent tests are separate from Level 1)"
        ]
      },
      {
        "id": "parse",
        "name": "Files parse",
        "status": "pass",
        "summary": "All 6 files parse; front matter valid",
        "details": []
      },
      {
        "id": "adapters",
        "name": "Adapters",
        "status": "pass",
        "summary": "CLAUDE.md and GEMINI.md import AGENTS.md and are up to date",
        "details": [
          "CLAUDE.md: matches the generator",
          "GEMINI.md: matches the generator"
        ]
      },
      {
        "id": "install-paths",
        "name": "Install paths",
        "status": "pass",
        "summary": "Correct paths for all 6 agents; layouts re-discovered",
        "details": [
          "Claude Code: 5 files, 1 skill in .claude/skills/",
          "Codex CLI: 4 files, 1 skill in .agents/skills/",
          "Cursor: 4 files, 1 skill in .agents/skills/",
          "Gemini CLI: 5 files, 1 skill in .agents/skills/",
          "Antigravity CLI: 4 files, 1 skill in .agents/skills/",
          "GitHub Copilot: 4 files, 1 skill in .agents/skills/"
        ]
      },
      {
        "id": "mcp",
        "name": "MCP config",
        "status": "n/a",
        "summary": "No MCP servers in this loadout",
        "details": []
      },
      {
        "id": "safety",
        "name": "Safety scan",
        "status": "pass",
        "summary": "Clean: no credentials, risky shell or hidden text",
        "details": [
          "Scanner intake-precheck/1: verdict clean; network no (listing says no)"
        ]
      },
      {
        "id": "references",
        "name": "References",
        "status": "pass",
        "summary": "4 references between files resolve for every agent",
        "details": []
      },
      {
        "id": "size",
        "name": "Size limits",
        "status": "pass",
        "summary": "6 files, 11.1 KB total; largest skills/plain-prose/scripts/prose_lint.py 5.3 KB",
        "details": [
          "Limits: 30 files, 32 KB per file, 128 KB total, 500 lines per skill or rule"
        ]
      },
      {
        "id": "licence",
        "name": "Licence",
        "status": "pass",
        "summary": "MIT, by Agent Loadout; text in the repository LICENSE",
        "details": []
      },
      {
        "id": "starter-build",
        "name": "Starter build",
        "status": "pass",
        "summary": "The plain-prose linter finds 22 machine-prose tells in a sloppy README (vocabulary, 'not just X, it's Y', fake proof, em-dash runs, emoji bullets, chat filler) while ignoring code and quotes, and passes a plain rewrite",
        "details": [
          "Applied 9 loadout files at every agent's paths",
          "✓ sloppy README is flagged: bash -c python3 .agents/skills/plain-prose/scripts/prose_lint.py sloppy.md; echo \"exit=$?\"",
          "✓ plain rewrite passes: python3 .agents/skills/plain-prose/scripts/prose_lint.py plain.md",
          "✓ allow-list and dash limit: bash -c python3 .agents/skills/plain-prose/scripts/prose_lint.py --allow crucial,robust --max-dashes 3 sloppy.md | tail -n 1",
          "Covers: Inflated vocabulary with plain alternatives",
          "Covers: Constructions: not just X it's Y, plays a crucial role, stands as a, chat openers and closers",
          "Covers: Unverifiable proof, em-dash runs, emoji bullets and bold spam",
          "Covers: Fenced code, inline code, block quotes and front matter are skipped"
        ]
      }
    ]
  },
  "install": {
    "claude-code": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "CLAUDE.md",
          "target": "CLAUDE.md",
          "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/CLAUDE.md",
          "role": "adapter"
        },
        {
          "path": "skills/plain-prose/SKILL.md",
          "target": ".claude/skills/plain-prose/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/skills/plain-prose/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/plain-prose/scripts/prose_lint.py",
          "target": ".claude/skills/plain-prose/scripts/prose_lint.py",
          "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/skills/plain-prose/scripts/prose_lint.py",
          "role": "reference"
        },
        {
          "path": "skills/plain-prose/references/word-list.md",
          "target": ".claude/skills/plain-prose/references/word-list.md",
          "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/skills/plain-prose/references/word-list.md",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/no-ai-voice-writing/claude-code.zip"
    },
    "codex": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/plain-prose/SKILL.md",
          "target": ".agents/skills/plain-prose/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/skills/plain-prose/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/plain-prose/scripts/prose_lint.py",
          "target": ".agents/skills/plain-prose/scripts/prose_lint.py",
          "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/skills/plain-prose/scripts/prose_lint.py",
          "role": "reference"
        },
        {
          "path": "skills/plain-prose/references/word-list.md",
          "target": ".agents/skills/plain-prose/references/word-list.md",
          "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/skills/plain-prose/references/word-list.md",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/no-ai-voice-writing/codex.zip"
    },
    "cursor": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/plain-prose/SKILL.md",
          "target": ".agents/skills/plain-prose/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/skills/plain-prose/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/plain-prose/scripts/prose_lint.py",
          "target": ".agents/skills/plain-prose/scripts/prose_lint.py",
          "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/skills/plain-prose/scripts/prose_lint.py",
          "role": "reference"
        },
        {
          "path": "skills/plain-prose/references/word-list.md",
          "target": ".agents/skills/plain-prose/references/word-list.md",
          "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/skills/plain-prose/references/word-list.md",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/no-ai-voice-writing/cursor.zip"
    },
    "gemini-cli": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "GEMINI.md",
          "target": "GEMINI.md",
          "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/GEMINI.md",
          "role": "adapter"
        },
        {
          "path": "skills/plain-prose/SKILL.md",
          "target": ".agents/skills/plain-prose/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/skills/plain-prose/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/plain-prose/scripts/prose_lint.py",
          "target": ".agents/skills/plain-prose/scripts/prose_lint.py",
          "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/skills/plain-prose/scripts/prose_lint.py",
          "role": "reference"
        },
        {
          "path": "skills/plain-prose/references/word-list.md",
          "target": ".agents/skills/plain-prose/references/word-list.md",
          "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/skills/plain-prose/references/word-list.md",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/no-ai-voice-writing/gemini-cli.zip"
    },
    "antigravity-cli": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/plain-prose/SKILL.md",
          "target": ".agents/skills/plain-prose/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/skills/plain-prose/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/plain-prose/scripts/prose_lint.py",
          "target": ".agents/skills/plain-prose/scripts/prose_lint.py",
          "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/skills/plain-prose/scripts/prose_lint.py",
          "role": "reference"
        },
        {
          "path": "skills/plain-prose/references/word-list.md",
          "target": ".agents/skills/plain-prose/references/word-list.md",
          "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/skills/plain-prose/references/word-list.md",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/no-ai-voice-writing/antigravity-cli.zip"
    },
    "copilot": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/plain-prose/SKILL.md",
          "target": ".agents/skills/plain-prose/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/skills/plain-prose/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/plain-prose/scripts/prose_lint.py",
          "target": ".agents/skills/plain-prose/scripts/prose_lint.py",
          "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/skills/plain-prose/scripts/prose_lint.py",
          "role": "reference"
        },
        {
          "path": "skills/plain-prose/references/word-list.md",
          "target": ".agents/skills/plain-prose/references/word-list.md",
          "raw_url": "https://loadout.jnw-it.com/raw/no-ai-voice-writing/1.0.0/skills/plain-prose/references/word-list.md",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/no-ai-voice-writing/copilot.zip"
    }
  },
  "source_zip_url": "https://loadout.jnw-it.com/download/no-ai-voice-writing/source.zip"
}