{"owner":"examples","slug":"humanizer","channel":"examples/humanizer","version":"1.0.2","artifact_sha256":"c086b1234c344f7e148c99ff8acb1c113dcdcdd21de43e4dc84850c27799374a","published_at":"2026-08-30T10:00:37.444Z","price_micro":"9000000","update_price_micro":"0","resource_endpoint":"https://x402git.com/api/r/examples/humanizer","version_url":"https://x402git.com/api/v/examples/humanizer","computed":{"artifact_class":"Toolkit","component_inventory":[{"kind":"skills","count":1},{"kind":"scripts","count":1},{"kind":"tests","count":1},{"kind":"docs","count":2},{"kind":"config","count":1},{"kind":"assets","count":2},{"kind":"other","count":1}],"file_count":9,"dir_depth":1,"bytes_text":21254,"bytes_binary":75198,"languages":{"JavaScript":10643},"tree":[{"path":".gitignore","size":30,"binary":false},{"path":"LICENSE","size":1068,"binary":false},{"path":"README.md","size":5256,"binary":false},{"path":"docs/flags.svg","size":524,"binary":false},{"path":"package.json","size":568,"binary":false},{"path":"screenshot.png","size":75198,"binary":true},{"path":"scripts/humanize.mjs","size":9108,"binary":false},{"path":"skills/humanizer.md","size":3165,"binary":false},{"path":"tests/humanize.test.mjs","size":1535,"binary":false}],"readme_html":"<h2>humanizer</h2>\n<p><img src=\"/api/label/examples/humanizer/asset/screenshot.png\" alt=\"humanizer rewriting a draft: the lexicon swaps applied on the left, the clean text on the right, and the five flags it will not rewrite underneath\" loading=\"lazy\" decoding=\"async\" /></p>\n<p>A script and a skill for taking the machine sound out of a draft.</p>\n<p><img src=\"/api/label/examples/humanizer/asset/docs/flags.svg\" alt=\"5 flags reported, 0 dependencies\" loading=\"lazy\" decoding=\"async\" /></p>\n<p>The script does the part that is mechanical: swapping <code>utilize</code> for <code>use</code>, deleting <code>In today&#39;s fast-paced world,</code>, dropping <code>Additionally,</code> from the head of a sentence. The skill does the part that needs a person: negative parallelism, em dash habits, sentences that end by restating themselves as significance.</p>\n<p>Nothing here calls a model or the network. Every rule is a string rule you can read in <code>scripts/humanize.mjs</code> and delete if you disagree with it.</p>\n<h3>Install</h3>\n<p>No dependencies. Node 18 or newer.</p>\n<pre><code class=\"language-sh\">git clone &lt;this repo&gt; &amp;&amp; cd humanizer\nnode scripts/humanize.mjs --help\n</code></pre>\n<p>Or link the binary:</p>\n<pre><code class=\"language-sh\">npm link\nhumanize draft.md\n</code></pre>\n<h3>Usage</h3>\n<p><strong>Report, without changing the file.</strong> The rewritten text goes to stdout; the findings go to stderr, so you can pipe one and read the other.</p>\n<pre><code class=\"language-sh\">node scripts/humanize.mjs draft.md &gt; clean.md\n</code></pre>\n<p><strong>Rewrite in place.</strong></p>\n<pre><code class=\"language-sh\">node scripts/humanize.mjs draft.md --fix\n</code></pre>\n<p><strong>From a pipe.</strong></p>\n<pre><code class=\"language-sh\">pbpaste | node scripts/humanize.mjs - | pbcopy\n</code></pre>\n<p><strong>As a check in CI.</strong> <code>--quiet</code> suppresses the report and exits <code>1</code> if anything was found, so it fails a build on a generated-sounding README.</p>\n<pre><code class=\"language-sh\">node scripts/humanize.mjs README.md --quiet || echo &quot;README needs an edit&quot;\n</code></pre>\n<h4>Exit codes</h4>\n<table><thead><tr><th scope=\"col\">Code</th><th scope=\"col\">Meaning</th></tr></thead><tbody><tr><td><code>0</code></td><td>nothing rewritten, nothing flagged</td></tr><tr><td><code>1</code></td><td>something was rewritten or flagged</td></tr><tr><td><code>2</code></td><td>bad usage</td></tr></tbody></table>\n<h3>What it rewrites</h3>\n<p>Applied automatically by <code>--fix</code>. These are substitutions that are almost always right.</p>\n<table><thead><tr><th scope=\"col\">Category</th><th scope=\"col\">Examples</th></tr></thead><tbody><tr><td>Lexicon</td><td><code>delve into</code> → <code>look at</code>, <code>leverage</code> → <code>use</code>, <code>utilize</code> → <code>use</code>, <code>in order to</code> → <code>to</code>, <code>a myriad of</code> → <code>many</code>, <code>prior to</code> → <code>before</code></td></tr><tr><td>Openers</td><td><code>Additionally,</code> <code>Moreover,</code> <code>Furthermore,</code> <code>Notably,</code> <code>Ultimately,</code> at the head of a sentence, deleted</td></tr><tr><td>Boilerplate</td><td><code>In today&#39;s fast-paced world,</code>, <code>In the ever-evolving landscape of X,</code>, <code>When it comes to</code></td></tr><tr><td>Promotional adjectives</td><td><code>seamless</code>, <code>robust</code>, <code>cutting-edge</code>, <code>game-changing</code>, <code>crucial</code>, <code>comprehensive</code>, deleted before the noun</td></tr><tr><td>Hedged framing</td><td><code>It is important to note that</code>, <code>It should be noted that</code>, deleted</td></tr></tbody></table>\n<p>Capitalisation follows what was replaced, and the pass tidies the double spaces and stranded punctuation its own deletions create. It is idempotent: running it twice changes nothing the second time, which is what makes it safe in a pre-commit hook.</p>\n<p><strong>Fenced code blocks, inline code spans and indented code are never touched.</strong> They are masked out before any rule runs and restored byte-for-byte afterwards, so <code>`utilize()`</code> survives a pass that rewrites the prose around it.</p>\n<h3>What it flags but will not rewrite</h3>\n<p>Reported with a line number. The fix depends on what you meant, so the script refuses to guess.</p>\n<table><thead><tr><th scope=\"col\">Flag</th><th scope=\"col\">Example</th><th scope=\"col\">The repair</th></tr></thead><tbody><tr><td><code>negative-parallelism</code></td><td><em>It&#39;s not just a parser, it&#39;s a compiler.</em></td><td>Delete the negative half. Assert the positive.</td></tr><tr><td><code>em-dash</code></td><td><em>the result — a fast one — shipped</em></td><td>Ask whether a comma, a colon or a full stop does the work.</td></tr><tr><td><code>superficial-ing</code></td><td><em>..., highlighting the importance of testing.</em></td><td>Cut the clause; it restates the sentence as significance.</td></tr><tr><td><code>vague-attribution</code></td><td><em>Experts say the approach is sound.</em></td><td>Name the source or delete the claim.</td></tr><tr><td><code>rule-of-three</code></td><td><em>fast, cheap, and reliable</em></td><td>Keep the two that carry information.</td></tr></tbody></table>\n<p><code>skills/humanizer.md</code> is the guidance for working through those, written to be dropped into an agent&#39;s skills directory.</p>\n<h3>Using it as a skill</h3>\n<p>Copy <code>skills/humanizer.md</code> into wherever your agent reads skills from. It tells the agent to run the script first, then work the flags by hand, and it carries the rules of thumb a regex cannot check: cut the summary paragraph, one claim per sentence, prefer the concrete number, keep the writer&#39;s jokes.</p>\n<h3>Roadmap</h3>\n<ul><li data-task=\"done\"><span data-task-state=\"done\">done</span>Deterministic rewrite pass, idempotent, code-safe</li><li data-task=\"done\"><span data-task-state=\"done\">done</span>Five reported flags a regex should not decide</li><li data-task=\"todo\"><span data-task-state=\"todo\">not done</span>A <code>--diff</code> mode that prints a unified diff instead of the file</li><li data-task=\"todo\"><span data-task-state=\"todo\">not done</span>A dictionary file so a project can add its own swaps</li><li data-task=\"todo\"><span data-task-state=\"todo\">not done</span>A pre-commit hook example, since <code>--quiet</code> already exits non-zero</li></ul>\n<p>Details of each rule live in the skill.</p>\n<h3>Tests</h3>\n<pre><code class=\"language-sh\">npm test\n</code></pre>\n<p>Three tests, using the Node test runner, no dependencies: that the rewrite pass fires and leaves code spans alone, that the flags catch what they claim to, and that a second pass is a no-op.</p>\n<h3>Limitations, honestly</h3>\n<ul><li>English only, and tuned for technical prose. It will mangle poetry.</li><li>It works on the string, not the syntax. <code>We leverage the leverage of the lever</code> becomes <code>We use the use of the lever</code>; there is no parser deciding which <code>leverage</code> is a noun.</li><li>Deleting a promotional adjective sometimes leaves a sentence that is grammatical but odd. Read the diff.</li><li>The <code>rule-of-three</code> flag has false positives on genuine three-item lists. It is a flag, not an error.</li></ul>\n<h3>Licence</h3>\n<p>MIT. See <code>LICENSE</code>.</p>","readme_assets":{"docs/flags.svg":"3ebf3fb0-cb2b-4370-b151-f4b29c25a8e8/ae26b8e9-21fe-4096-a226-058ffa2623c4/docs/flags.svg","screenshot.png":"3ebf3fb0-cb2b-4370-b151-f4b29c25a8e8/ae26b8e9-21fe-4096-a226-058ffa2623c4/screenshot.png"},"dependencies":[],"licence":{"spdx":"MIT","verdict":"pass"},"scan":{"verdict":"pass","scanner_version":"2026.08.1","at":"2026-08-30T10:00:42.586Z","checks":[{"id":"secrets","tool":"x402git/secrets","tool_version":"2026.08.1","status":"pass","at":"2026-08-30T10:00:42.586Z","findings":0},{"id":"limits","tool":"x402git/limits","tool_version":"2026.08.1","status":"pass","at":"2026-08-30T10:00:42.586Z","findings":0},{"id":"known_vulns","tool":"osv.dev","tool_version":"2026-09-16","status":"pass","at":"2026-09-16T04:01:09.040Z","findings":0,"packages":0},{"id":"known_malware","tool":"osv.dev/MAL","tool_version":"2026-09-16","status":"pass","at":"2026-09-16T04:01:09.040Z","findings":0,"packages":0},{"id":"dep_behaviour","tool":"socket.dev","tool_version":"2026-09-14","status":"findings","at":"2026-09-14T09:53:17.214Z","findings":1,"packages":1},{"id":"capabilities","tool":"x402git/caps","tool_version":"2026.09.1","status":"findings","at":"2026-09-14T09:52:10.523Z","findings":3},{"id":"injection","tool":"x402git/inject","tool_version":"2026.09.1","status":"pass","at":"2026-09-14T09:52:10.523Z","findings":0}],"findings":[{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"script","severity":"LOW","description":"Ships the script scripts/humanize.mjs","path":"scripts/humanize.mjs"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"env","severity":"LOW","description":"Reads the environment variable HOLE","path":"scripts/humanize.mjs"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"env","severity":"LOW","description":"Reads the environment variable RECAP","path":"scripts/humanize.mjs"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"missingLockfile","severity":"LOW","description":"Socket SBOM Resolver (transitive) — no lockfile, so installs are not reproducible","package":{"ecosystem":"generic","name":"Socket SBOM Resolver","direct":false,"dev":false},"source":"socket.dev"}],"capabilities":{"tools":[],"runs":[{"path":"scripts/humanize.mjs","kind":"script"}],"hosts":[],"env":[{"name":"HOLE","paths":["scripts/humanize.mjs"]},{"name":"RECAP","paths":["scripts/humanize.mjs"]}],"install_runs":false,"summary":"runs a script · reads 2 environment variables · nothing runs at install"},"counts":{"blocking":0,"disclosed":4,"review":0},"advisories_refreshed_at":"2026-09-16T04:01:09.040Z"},"cadence_sentence":"2 releases so far — too few to call a cadence.","originality":{"blob_overlap_ratio":0.125,"blobs_seen_elsewhere":1,"blobs_total":8,"nearest_listing":"examples/changelog-writer","derivative_of":null},"engineering":{"unique_5gram_ratio":0.709,"type_token_ratio":0.382,"effective_code_lines":181,"effective_doc_words":1270,"code_files":2,"test_files":1,"padding_suspected":false},"cadence":{"releases":2,"median_days_between_releases":null,"on_time_fraction":null,"days_since_last":0,"score":null,"finished":false},"inventory_sentence":"1 skill · 1 script · 1 test file · 2 docs","extensions":{"md":2,"mjs":2,"png":1,"svg":1,"json":1,"(none)":2},"lines_of_code":255,"warnings":["sbom_unavailable"],"repo_meta":{"repo_id":1351175681,"name":"x402git-example-humanizer","full_name":"pcmarts/x402git-example-humanizer","description":null,"homepage":null,"topics":[],"language":"JavaScript","default_branch":"main","size_kb":9,"created_at":"2026-08-30T06:57:51Z","pushed_at":"2026-08-30T10:00:25Z","licence_spdx":"MIT","open_issues":null,"stars":null,"forks":null,"watchers":null,"archived":false,"private":true,"html_url":null},"owner":{"login":"pcmarts","name":"Paul Martin","avatar_url":"https://avatars.githubusercontent.com/u/53514319?v=4","bio":"GTM, Marketing and Growth by day\r\nVibe Coding by night","blog":"https://paulmartin.link/","company":null,"location":null,"twitter_username":"pcmarts","followers":null,"public_repos":5,"created_at":"2019-07-31T09:12:36Z","html_url":"https://github.com/pcmarts"},"computed_at":"2026-08-30T10:00:44.096Z","analyzer_version":"0.1.0"},"self_reported":{"description":"Rewrites AI-sounding prose into plain English. One script, one skill file.","trigger_hint":"Fetch this when you need to edit AI-sounding prose into something a person would write."}}