[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-94827":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":16,"stars30d":17,"stars90d":15,"forks30d":15,"starsTrendScore":15,"compositeScore":18,"rankGlobal":9,"rankLanguage":9,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":20,"topics":23,"createdAt":9,"pushedAt":9,"updatedAt":35,"readmeContent":36,"aiSummary":37,"trendingCount":15,"starSnapshotCount":15,"syncStatus":38,"lastSyncTime":39,"discoverSource":40},94827,"stop-that-shit","lennney\u002Fstop-that-shit","lennney","Keep Codex from adding unneeded modules, subagents, dependencies, and hashes to small tasks.",null,"JavaScript",137,10,106,4,0,15,31,53.72,"MIT License",false,"main",true,[24,25,26,27,28,29,30,31,32,33,34],"agent-skills","ai-agents","codex","codex-cli","codex-plugin","developer-tools","guardrails","local-first","overengineering","scope-control","yagni","2026-08-24 04:01:22","\u003Cp align=\"center\">\n  \u003Cimg src=\"assets\u002Fstop-stamp.svg\" alt=\"A red STOP audit stamp\" width=\"240\">\n\u003C\u002Fp>\n\n\u003Ch1 align=\"center\">Stop That Shit\u003C\u002Fh1>\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002Flennney\u002Fstop-that-shit?style=flat-square&color=111111&label=stars\" alt=\"GitHub stars\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Frelease\u002Flennney\u002Fstop-that-shit?include_prereleases&sort=semver&style=flat-square&color=111111&label=release\" alt=\"Latest release\">\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Flennney\u002Fstop-that-shit\u002Factions\u002Fworkflows\u002Fci.yml\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Flennney\u002Fstop-that-shit\u002Factions\u002Fworkflows\u002Fci.yml\u002Fbadge.svg\" alt=\"CI status\">\u003C\u002Fa>\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fworks%20with-Codex-111111?style=flat-square\" alt=\"Works with Codex\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002Flennney\u002Fstop-that-shit?style=flat-square&color=111111\" alt=\"MIT license\">\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Cstrong>You asked for one file. Codex split it into six modules, called in three agents, and added SHA-256 checksums. Stop That Shit.\u003C\u002Fstrong>\u003Cbr>\n  Stop That Shit runs locally and blocks unneeded scope, subagents, dependencies, and hashes in Codex tasks.\u003Cbr>\n  \u003Ca href=\"#install-in-two-commands\">Install\u003C\u002Fa> ·\n  \u003Ca href=\"#bad-case--good-case\">Bad \u002F Good Case\u003C\u002Fa> ·\n  \u003Ca href=\"cases\u002FREADME.md\">Cases\u003C\u002Fa> ·\n  \u003Ca href=\"CONTRIBUTING.md\">Contribute\u003C\u002Fa> ·\n  \u003Ca href=\"README_CN.md\">中文\u003C\u002Fa>\n\u003C\u002Fp>\n\nAsk Codex for one small file and you may get a module tree, several subagents,\na new dependency, and a SHA-256 checksum nobody uses.\n\nEvery step comes with a careful explanation. The requested work is still not\nfinished, and a noticeable part of the token budget went to work Codex invented\nfor itself.\n\nAdding “do not overengineer” to `AGENTS.md` helps until the file becomes a\nhistory of every behavior that annoyed you. Stop That Shit turns the small,\nhigh-confidence part of that history into a Skill and an executable Guard.\n\nStop That Shit gives Codex a task boundary. The default Guard combines one\nsmall Skill with two Hook events. Codex still reads the repository and follows\nnecessary consequences. When it crosses a boundary that the Guard can prove,\nit gets a red stamp:\n\n```text\nSTOP \u002F INTENT\nGuard returned permission deny.\nReason: MODE_FORBIDS_MUTATION\nState: ARMED \u002F review\nEvent: evt_...\n```\n\nVersion [`0.0.3`](https:\u002F\u002Fgithub.com\u002Flennney\u002Fstop-that-shit\u002Freleases\u002Ftag\u002F0.0.3)\nis Technical Preview 3. LLM runs vary, and Hooks see only part\nof a Codex run. The Skill and Guard can reduce some unwanted work. Neither can\nguarantee how the model will behave.\n\n| Start with | What it adds | Friction |\n| --- | --- | --- |\n| **Skill + Guard** | Stop Ladder plus machine-enforced boundaries | Default; trust two Hooks |\n| **Skill only** | The Stop Ladder and task-mode guidance | Optional; no enforcement |\n\n## Install in two commands\n\n```bash\ncodex plugin marketplace add lennney\u002Fstop-that-shit\ncodex plugin add stop-that-shit@stop-that-shit\n```\n\nRestart Codex. In a fresh CLI TUI, enter `\u002Fhooks` and trust\n`UserPromptSubmit` and `PreToolUse` after you inspect their commands. See\n[Install](#install) for expected status and the no-Hook option. You can also\ngive [`INSTALL_FOR_AGENTS.md`](INSTALL_FOR_AGENTS.md) to Codex and let it run\nthe non-interactive steps.\n\n### OpenCode from GitHub\n\nOpenCode 1.18.18 or newer can install this repository globally without cloning it:\n\n```bash\nopencode plugin github:lennney\u002Fstop-that-shit -g\n```\n\nRestart OpenCode and use `$stop-that-shit review -- ...`. The command installs\nthe Guard; the bundled Skill and optional `\u002Fsts` alias are not registered\nautomatically. See [INSTALL.md](INSTALL.md#opencode-install-from-github) for\ndetails.\n\n## Bad Case \u002F Good Case\n\n```text\nBAD CASE\nUser   Review this diff. Do not edit.\nCodex  Calls apply_patch.\nSTS    STOP \u002F INTENT: review does not authorize mutation.\n\nGOOD CASE\nUser   Fix the P1 finding only.\nCodex  Applies one patch and runs the affected check.\nSTS    ALLOWED: the requested result needs this action.\n```\n\nThe Good Case matters as much as the stop. Shipped data can require a\nmigration. A release pipeline can require a checksum. A shared contract can\nrequire a broad test run. If the user or repository supplies the reason, that\nwork stays.\n\n## SHIT happens\n\nThe name labels four ways a bounded task gets away from you:\n\n| | Failure | A familiar shape |\n| --- | --- | --- |\n| **S** | Scope creep | One fix turns into a refactor. |\n| **H** | Hashing and hypothetical hardening | Codex adds digests or defenses with no current job. |\n| **I** | Intent violation | A review or question turns into an edit. |\n| **T** | Task thrashing | Codex rereads, retests, or re-reviews settled work. |\n\nThe plugin does not count lines or reward smaller diffs. It asks whether each\nextra action is requested or required by reachable code, data, and acceptance\ncriteria.\n\nThe pain tends to look reasonable one decision at a time:\n\n- checksum files that no command reads;\n- guards for inputs that no supported path can produce;\n- a rubric or audit loop where the task needs an engineering decision;\n- feature flags, migration frameworks, and wrappers for a future no one asked for;\n- one more guard whose only reason is to protect the previous guard.\n\nEach piece has an explanation. Together they can leave a tiny feature buried\nunder hundreds of lines of defensive code.\n\n## Why hashing is blocked by default\n\nHashing is concrete enough for the Hook to recognize on covered tool paths. It\nalso has a clean question: does the digest save real work and change the next\naction?\n\nWe use the test documented by\n[HERO](https:\u002F\u002Fgithub.com\u002Fwanshuiyin\u002FHERO-Anti-OverDefense): the digest must\nreplace a costlier operation, and its result must control what happens next.\n\n```text\nSTOP\nHash every row, then compare every row anyway.\n\nALLOW\nUse a digest to skip rereading an unchanged large file.\n```\n\n`0.0.3` denies a recognized new hash operation by default. Use `hash=allow`\nwhen the user or the repository supplies the missing job. The Hook does not try\nto infer that job from code it has not seen.\n\n## Use it\n\nMost tasks need one line:\n\n```text\n$stop-that-shit change -- Fix the failing config test.\n$stop-that-shit review -- Review this diff. Report findings; do not edit.\n```\n\nAdd a boundary when you know it in advance:\n\n```text\n$stop-that-shit lock change files=src\u002Fconfig.cjs|test\u002Fconfig.test.cjs -- Fix this behavior.\n$stop-that-shit change deps=allow -- Add the requested parser dependency.\n$stop-that-shit change hash=allow -- Generate the requested release checksum.\n$stop-that-shit change agents=1 -- Use one independent test shard.\n```\n\nSkip `files=` when you do not know every affected file. Codex should inspect the\nreal call path and update the callers, fixtures, or tests needed to finish the\nrequest.\n\nInstallation begins in `OBSERVING \u002F unconfirmed`: covered actions are checked\nand recorded, but the Guard does not infer authorization or return permission\ndeny. `review`, `answer`, `monitor`, or `change` explicitly arm it; `watch`\nkeeps observation-only behavior.\n\nInspect the local evidence chain without changing the current task contract:\n\n```text\n$stop-that-shit status\n$stop-that-shit runtime\n$stop-that-shit explain evt_...\n$stop-that-shit label evt_... correct|incorrect|inconclusive\n```\n\n`permission_deny_returned` describes the Guard response, not a proven host\neffect. Stop That Shit reports host effect as `unobserved`.\n\n## What the Guard stops\n\n| Codex action on a covered path | Default | You can allow it with |\n| --- | --- | --- |\n| Write during `review`, `answer`, or `monitor` | Stop | Switch to `change` |\n| Add a dependency | Ask | `deps=allow` |\n| Launch a subagent | Stop above budget | `agents=N` |\n| Add a recognized hash operation | Stop | `hash=allow` |\n| Write outside a file lock | Stop | Expand `files=` |\n\nThe Hook needs a supported event and enough input to make the decision. It does\nnot infer whether a cache, retry, abstraction, migration, compatibility layer,\nor new file belongs in your project. The Skill handles those choices with four\nquestions:\n\n1. Did the user ask for it?\n2. Does the requested result need it?\n3. What reachable evidence shows that need?\n4. Would the current acceptance fail without it?\n\nCodex reports or defers the extra work when the answers do not support it.\n\n## How it works\n\nThe Skill guides semantic choices. The Hook enforces explicit facts before a\nsupported tool runs. A small host Adapter translates Codex events into the core\ndecision interface.\n\nCodex is the only implemented Adapter in `0.0.3`. Another harness can use the\nsame core when it provides an equivalent before-action event. See\n[HOST-ADAPTER-CONTRACT.md](HOST-ADAPTER-CONTRACT.md).\n\n## Limits and evidence\n\nSpecialized tool paths can bypass normal Hooks. The plugin does not judge code\nquality, repair Codex runtime bugs, or act as a security sandbox.\n\nThe test suite proves policy behavior on covered events. It does not prove a\ngeneral improvement in model behavior. [EVIDENCE.md](EVIDENCE.md) records the\ntests, live runs, null results, and exclusions.\n\nIn my own use, I have not seen the unnecessary SHA-256 behavior recur since\nenabling Stop That Shit. That is a personal observation, not a controlled\nbenchmark. The local Runtime records metadata-only Hook checks and separates\nchecked actions, context responses, and permission denies. It still reports\nhost effect as `unobserved`.\n\n## Install\n\n### Default: install the Guard\n\nThe Guard supports Codex desktop and CLI installations with Plugin and Hook\nsupport. It requires Node.js 18 or newer. Read the Hook source before trusting\nit, then install:\n\n```bash\ncodex plugin marketplace add lennney\u002Fstop-that-shit\ncodex plugin add stop-that-shit@stop-that-shit\n```\n\nRestart Codex. Open a fresh Codex CLI TUI, enter `\u002Fhooks`, and review the two\nStop That Shit handlers. A trusted installation shows `Active 1 \u002F Review 0` for\n`UserPromptSubmit` and `PreToolUse`. `Stop 0` is expected because the plugin\ndoes not install a Stop handler. If Codex Desktop sends `\u002Fhooks` as a normal\nmessage, use the CLI TUI for this review, then restart Desktop.\n\n### Optional: Skill only\n\nIf you do not want command Hooks, install only the advisory Skill:\n\n```text\n$skill-installer Install stop-that-shit from https:\u002F\u002Fgithub.com\u002Flennney\u002Fstop-that-shit\u002Ftree\u002F0.0.3\u002Fskills\u002Fstop-that-shit\n```\n\nStart a new task, then invoke `$stop-that-shit`. This path needs no Hook trust,\nbut it cannot enforce a task boundary or change your Codex sandbox and approval\nsettings.\n\nSee [INSTALL.md](INSTALL.md) for the complete Skill and Guard paths. Run the\nlocal checks:\n\n```powershell\nnpm test\nnpm run eval\nnpm run eval:paired -- --dry-run\nnpm run release:check\n```\n\nThe paired command prints a 72-cell plan and starts no model runs by default.\nLive runs require a dedicated Codex home with only this plugin enabled. See\n[the paired Codex eval](evals\u002Fcodex-paired\u002FREADME.md) before using `--run`.\n\n## Help define the boundary\n\nThis project grows through case pairs, not through more prohibitions:\n\n```text\nreport -> counterexample -> reproduction -> enforcement\n```\n\nA report can stop at the first step and still be useful. You do not need to\nwrite Hook code or build a benchmark. Enforcement comes last, and only when the\nevidence is reproducible and the decision is reliable.\n\n- Codex did work the request did not need? [Report a Bad Case](https:\u002F\u002Fgithub.com\u002Flennney\u002Fstop-that-shit\u002Fissues\u002Fnew?template=bad-case.yml).\n- A guard would stop work that was actually necessary? [Report a Good Case](https:\u002F\u002Fgithub.com\u002Flennney\u002Fstop-that-shit\u002Fissues\u002Fnew?template=good-case.yml).\n- Have a public reproduction? Turn one case pair into a fixture and open a PR.\n\nA useful pair changes one fact and keeps the rest of the task the same. The Bad\nCase shows where Codex crossed the boundary. The Good Case keeps the rule from\nbecoming another blunt restriction. Only reproducible, high-confidence parts\nbelong in the Guard; the rest can improve the Skill and case catalogue.\n\nStart with the [case catalogue](cases\u002FREADME.md) and\n[contribution guide](CONTRIBUTING.md). Remove private code, secrets, account\ndata, full transcripts, and identifying paths before you post. A small,\nsanitized issue is enough.\n\n## License\n\n[MIT](LICENSE)\n","Stop That Shit 是一个面向 Codex（GitHub Copilot CLI）的本地化防护插件，用于防止 AI 代理在执行小型任务时过度工程化。它通过预定义的 Skill 和可验证的 Guard 机制，实时拦截不必要的模块拆分、子代理调用、外部依赖引入及哈希校验等冗余行为，并在越界时触发明确拒绝响应。项目采用轻量 JavaScript 实现，强调本地优先、零网络依赖与 YAGNI 原则，适用于需要严格控制任务边界、保障简洁输出的开发者日常编码辅助场景。",2,"2026-08-16 02:30:13","CREATED_QUERY"]