[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6J8CDAPR76A3JFKCG4CM2RT":3,"skill-same:01M6J8CDAPR76A3JFKCG4CM2RT":92},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":47,"repositoryHtmlUrl":48,"repositoryHomepageUrl":6,"ownerHtmlUrl":49,"ownerBlogUrl":50,"ownerDescription":51,"updatedAt":52,"install":53,"resources":66},"01M6J8CDAPR76A3JFKCG4CM2RT","ig-human",null,"Strip the machine fingerprint out of any draft - em dashes, AI slop words, invisible watermark characters - and score it against a five-check detection panel before it goes out. Use whenever text needs to sound human, when the user says humanize, \"does this sound like AI\", \"remove the em dashes\", \"de-slop this\", \"this sounds like ChatGPT\", or before any caption, script, comment, reply or DM is shown to the user.","sgomez-dev\u002Fclaude-skills","sgomez-dev","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F81492002?v=4","01M6J7TFP3PR3PTGBAG3N9Z007","Santiago Gómez de la Torre Romero","01M6J7TFT704JY40NG1YE3V5JQ",1,"MIT","https:\u002F\u002Fgithub.com\u002Fsgomez-dev\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fexternal\u002Fig-human\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"ig","ig human","human","de","detection","sound","slop","goes","script","it","machine","panel","check","chatgpt","text","draft","humanize","use","remove","user","2026-11-10 10:12:30",false,"---\nname: ig-human\ndescription: >-\n  Strip the machine fingerprint out of any draft - em dashes, AI slop words,\n  invisible watermark characters - and score it against a five-check detection\n  panel before it goes out. Use whenever text needs to sound human, when the\n  user says humanize, \"does this sound like AI\", \"remove the em dashes\",\n  \"de-slop this\", \"this sounds like ChatGPT\", or before any caption, script,\n  comment, reply or DM is shown to the user.\n---\n\n# ig-human\n\nTwo tools live in this folder and they both actually run. Use them. Do not\neyeball this.\n\n```bash\npython3 humanize.py draft.txt --report        # clean it, show what changed\npython3 detect.py draft.txt                    # score it, five checks\npython3 detect.py before.txt after.txt         # prove the delta\n```\n\nBoth read `slop.json`: 154 stock words and phrases with plain-English\nreplacements, 18 invisible character classes, 11 typographic substitutions and\n16 structural tells. The last block of each list is Instagram-specific, the\nvocabulary that only shows up in captions and voiceovers. It is meant to be\nedited. If the user has a word they always use that the lexicon strips, take it\nout of the file.\n\n## Why this matters more on Instagram than it looks\n\nCaptions are short and scripts get said out loud. A written-sounding line in a\n600-character caption is a larger share of the text than the same line in an\nessay, and a voiceover that nobody could say naturally is obvious in the first\ntake. The tell here is not a detector flagging the post. The tell is a person\nscrolling past something that reads like a brand, or a creator stumbling over\ntheir own script.\n\n## What gets fixed automatically\n\n**1. Invisible characters.** Zero-width spaces and joiners, word joiners, soft\nhyphens, byte-order marks, Unicode tag characters, invisible separators,\nnon-breaking and narrow spaces. A keyboard does not produce these. They survive\ncopy-paste, they are invisible in every editor, and they are the most\nmechanical thing in generated text. `humanize.py` deletes every one, including\nany remaining Unicode format character it does not have a name for.\n\n**2. Typography.** Em dash to comma, en dash to hyphen, curly quotes to\nstraight, ellipsis to three dots, bullet character to hyphen. The em dash pass\nis the one that matters: it collapses the dash to a comma and then cleans up\nthe double punctuation and orphaned periods that leaves behind.\n\n**3. The slop lexicon.** delve, leverage, robust, seamless, crucial, testament\nto, \"in today's fast-paced world\", plus the Instagram block: \"stop scrolling\",\n\"in today's video\", \"follow for more\", \"tag someone who needs this\", \"the\nalgorithm loves\", \"run don't walk\". Each swapped for a plain word or deleted,\nwith capitalisation preserved and URLs left untouched.\n\n## What does NOT get fixed automatically\n\nStructural tells get **flagged, not rewritten**, because changing the shape of\na sentence needs judgement:\n\n- \"It's not just X, it's Y\" and \"not only X but also Y\"\n- Rule-of-three triads\n- Rhetorical one-word question lines: \"The result?\"\n- The video preamble: \"in this video I'm going to show you\"\n- Emoji bullet lists\n- Three or more shouted words in a row\n- Hashtag walls\n- Reflex bait: \"follow for more\", \"tag someone who\", \"double tap if\"\n\nThat list is your job. Rewrite each flagged line by hand, keeping the meaning,\nthen re-run `detect.py`. This is the part that moves the score from REVIEW to\nPASS, and it is the part a script cannot do.\n\n## The five checks\n\n`detect.py` scores five signals 0-100, higher is more human:\n\n| check | what it measures | machine looks like |\n| --- | --- | --- |\n| BURSTINESS | sentence-length variation | every sentence the same length |\n| SPECIFICITY | numbers, names, concrete markers per 100 words | abstract nouns, no figures |\n| SLOP DENSITY | lexicon hits per 100 words | stock vocabulary |\n| FINGERPRINT | invisible chars, em dashes, curly quotes per 1k chars | typographically perfect |\n| VOICE | contractions, person, structural tells | no contractions, staged reveals |\n\nThe verdict weights the mean at 60% and the **weakest single check** at 40%,\nbecause one signal is enough. PASS needs an overall of 70+ with no check\nbelow 55.\n\n## Say this honestly\n\nThese are five local heuristics modelled on the signals public detectors key\non. They run entirely on the user's machine and nothing is uploaded. They are\n**not** GPTZero, Originality, Copyleaks, Winston or Turnitin, they do not call\nthose APIs, and they cannot promise those verdicts. Fixing what they measure\ndoes tend to move those numbers, because they are measuring the same underlying\nthings. That is the claim. Do not make a bigger one on the user's behalf, and\ndo not tell a user their text is undetectable.\n\n## Order of operations\n\n1. `humanize.py draft.txt -o clean.txt --report`\n2. Read the structural flags. Rewrite those lines yourself.\n3. `detect.py draft.txt clean.txt` to show the before and after.\n4. If the verdict is not PASS, fix the weakest check named in the output and go\n   again. Two rounds is normal. Five means the draft was written by formula,\n   and the fix is a different draft, not more passes.\n5. Show the user the cleaned text and the score. Never the score alone.\n","# ig-human\n\nTwo tools live in this folder and they both actually run. Use them. Do not\neyeball this.\n\n```bash\npython3 humanize.py draft.txt --report        # clean it, show what changed\npython3 detect.py draft.txt                    # score it, five checks\npython3 detect.py before.txt after.txt         # prove the delta\n```\n\nBoth read `slop.json`: 154 stock words and phrases with plain-English\nreplacements, 18 invisible character classes, 11 typographic substitutions and\n16 structural tells. The last block of each list is Instagram-specific, the\nvocabulary that only shows up in captions and voiceovers. It is meant to be\nedited. If the user has a word they always use that the lexicon strips, take it\nout of the file.\n\n## Why this matters more on Instagram than it looks\n\nCaptions are short and scripts get said out loud. A written-sounding line in a\n600-character caption is a larger share of the text than the same line in an\nessay, and a voiceover that nobody could say naturally is obvious in the first\ntake. The tell here is not a detector flagging the post. The tell is a person\nscrolling past something that reads like a brand, or a creator stumbling over\ntheir own script.\n\n## What gets fixed automatically\n\n**1. Invisible characters.** Zero-width spaces and joiners, word joiners, soft\nhyphens, byte-order marks, Unicode tag characters, invisible separators,\nnon-breaking and narrow spaces. A keyboard does not produce these. They survive\ncopy-paste, they are invisible in every editor, and they are the most\nmechanical thing in generated text. `humanize.py` deletes every one, including\nany remaining Unicode format character it does not have a name for.\n\n**2. Typography.** Em dash to comma, en dash to hyphen, curly quotes to\nstraight, ellipsis to three dots, bullet character to hyphen. The em dash pass\nis the one that matters: it collapses the dash to a comma and then cleans up\nthe double punctuation and orphaned periods that leaves behind.\n\n**3. The slop lexicon.** delve, leverage, robust, seamless, crucial, testament\nto, \"in today's fast-paced world\", plus the Instagram block: \"stop scrolling\",\n\"in today's video\", \"follow for more\", \"tag someone who needs this\", \"the\nalgorithm loves\", \"run don't walk\". Each swapped for a plain word or deleted,\nwith capitalisation preserved and URLs left untouched.\n\n## What does NOT get fixed automatically\n\nStructural tells get **flagged, not rewritten**, because changing the shape of\na sentence needs judgement:\n\n- \"It's not just X, it's Y\" and \"not only X but also Y\"\n- Rule-of-three triads\n- Rhetorical one-word question lines: \"The result?\"\n- The video preamble: \"in this video I'm going to show you\"\n- Emoji bullet lists\n- Three or more shouted words in a row\n- Hashtag walls\n- Reflex bait: \"follow for more\", \"tag someone who\", \"double tap if\"\n\nThat list is your job. Rewrite each flagged line by hand, keeping the meaning,\nthen re-run `detect.py`. This is the part that moves the score from REVIEW to\nPASS, and it is the part a script cannot do.\n\n## The five checks\n\n`detect.py` scores five signals 0-100, higher is more human:\n\n| check | what it measures | machine looks like |\n| --- | --- | --- |\n| BURSTINESS | sentence-length variation | every sentence the same length |\n| SPECIFICITY | numbers, names, concrete markers per 100 words | abstract nouns, no figures |\n| SLOP DENSITY | lexicon hits per 100 words | stock vocabulary |\n| FINGERPRINT | invisible chars, em dashes, curly quotes per 1k chars | typographically perfect |\n| VOICE | contractions, person, structural tells | no contractions, staged reveals |\n\nThe verdict weights the mean at 60% and the **weakest single check** at 40%,\nbecause one signal is enough. PASS needs an overall of 70+ with no check\nbelow 55.\n\n## Say this honestly\n\nThese are five local heuristics modelled on the signals public detectors key\non. They run entirely on the user's machine and nothing is uploaded. They are\n**not** GPTZero, Originality, Copyleaks, Winston or Turnitin, they do not call\nthose APIs, and they cannot promise those verdicts. Fixing what they measure\ndoes tend to move those numbers, because they are measuring the same underlying\nthings. That is the claim. Do not make a bigger one on the user's behalf, and\ndo not tell a user their text is undetectable.\n\n## Order of operations\n\n1. `humanize.py draft.txt -o clean.txt --report`\n2. Read the structural flags. Rewrite those lines yourself.\n3. `detect.py draft.txt clean.txt` to show the before and after.\n4. If the verdict is not PASS, fix the weakest check named in the output and go\n   again. Two rounds is normal. Five means the draft was written by formula,\n   and the fix is a different draft, not more passes.\n5. Show the user the cleaned text and the score. Never the score alone.\n",{"name":5,"description":7},"main","563fd9d0d01a7240bf22073090c9484e9070e8e8","external\u002Fig-human",0,"https:\u002F\u002Fgithub.com\u002Fsgomez-dev\u002Fclaude-skills","https:\u002F\u002Fgithub.com\u002Fsgomez-dev","https:\u002F\u002Fsgomez.dev","\"Volnuratus non victus\"","2026-10-01 18:25:47",{"source":8,"skillName":5,"commands":54,"prompt":64,"zipAvailable":65},[55,58,61],{"tool":56,"command":57},"npx","npx skills add sgomez-dev\u002Fclaude-skills --skill ig-human",{"tool":59,"command":60},"bunx","bunx skills add sgomez-dev\u002Fclaude-skills --skill ig-human",{"tool":62,"command":63},"pnpm","pnpm dlx skills add sgomez-dev\u002Fclaude-skills --skill ig-human","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fsgomez-dev\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fexternal\u002Fig-human\u002FSKILL.md",true,[67,73,77,82,88],{"path":68,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":71,"sourceHtmlUrl":72},"detect.py","SCRIPT","脚本",8526,"https:\u002F\u002Fgithub.com\u002Fsgomez-dev\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fexternal\u002Fig-human\u002Fdetect.py",{"path":74,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":75,"sourceHtmlUrl":76},"humanize.py",10909,"https:\u002F\u002Fgithub.com\u002Fsgomez-dev\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fexternal\u002Fig-human\u002Fhumanize.py",{"path":78,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":80,"sourceHtmlUrl":81},"LICENSE","许可证",1073,"https:\u002F\u002Fgithub.com\u002Fsgomez-dev\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fexternal\u002Fig-human\u002FLICENSE",{"path":83,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":86,"sourceHtmlUrl":87},"slop.json","REFERENCE","参考文档",21632,"https:\u002F\u002Fgithub.com\u002Fsgomez-dev\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fexternal\u002Fig-human\u002Fslop.json",{"path":89,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":90,"sourceHtmlUrl":91},"UPSTREAM.md",794,"https:\u002F\u002Fgithub.com\u002Fsgomez-dev\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fexternal\u002Fig-human\u002FUPSTREAM.md",[93,104,112,124,138,147],{"skillNo":94,"name":95,"nameZh":6,"description":96,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":99,"publishedAt":39},"01M6J8Q0WEP76PV381RJDTRTV4","template","YOUR_DESCRIPTION_HERE (shown in command palette, keep under 80 chars)","https:\u002F\u002Fgithub.com\u002Fsgomez-dev\u002Fclaude-skills\u002Fblob\u002Fmain\u002Ftemplate\u002FSKILL.md",[],[95,100,101,102,103],"command palette","command","palette","keep",{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":110,"publishedAt":39},"01M6J8PY4KNE7SQP5BD2X1YMHJ","multi","Line one continues here.   Second sentence.","https:\u002F\u002Fgithub.com\u002Fsgomez-dev\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fsite\u002Ftests\u002Ffixtures\u002Frepo\u002Fexternal\u002Fmulti\u002FSKILL.md",[],[106,111],"line",{"skillNo":113,"name":114,"nameZh":6,"description":115,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":116,"categories":117,"keywords":118,"publishedAt":39},"01M6J8PVS7AY0AWP36JRQ7T8S6","ffmpeg","FFmpeg recipes for video production.","https:\u002F\u002Fgithub.com\u002Fsgomez-dev\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fsite\u002Ftests\u002Ffixtures\u002Frepo\u002Fexternal\u002Fffmpeg\u002FSKILL.md",[],[114,119,120,121,122,123],"Production","Video","video production","recipes","for",{"skillNo":125,"name":126,"nameZh":6,"description":127,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":128,"categories":129,"keywords":135,"publishedAt":39},"01M6J8PS6NDT2VY6Y72QW3NGGH","secret-skill","Private, never published.","https:\u002F\u002Fgithub.com\u002Fsgomez-dev\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fsite\u002Ftests\u002Ffixtures\u002Frepo\u002Fexternal\u002F.local\u002Fsecret-skill\u002FSKILL.md",[130],{"categoryNo":131,"categoryName":132,"taxonomyType":133,"taxonomyTypeDesc":134},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[136,137],"secret skill","never",{"skillNo":139,"name":140,"nameZh":6,"description":141,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":142,"categories":143,"keywords":144,"publishedAt":39},"01M6J8PQETD1FW6BWPPSWXFH5N","external-no-license","Has no license.","https:\u002F\u002Fgithub.com\u002Fsgomez-dev\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fsite\u002Ftests\u002Ffixtures\u002Frepo\u002Fbroken\u002Fexternal-no-license\u002FSKILL.md",[],[145,146],"license","external no license",{"skillNo":148,"name":149,"nameZh":6,"description":150,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":151,"categories":152,"keywords":164,"publishedAt":39},"01M6J8PJ5XGMZZZZGECEDHN13J","write-swift","How to write modern Swift well — modeling with value types, Swift 6 data-race safety and approachable concurrency (@concurrent, main-actor-by-default, actors, task groups), protocols and generics (some vs any), API design, performance and ARC, Swift Testing, macros, and the modern language features agents don't know about yet. Use when writing, reviewing, or migrating Swift, or when a concurrency error, a hang, a data race, a retain cycle, or a performance problem needs fixing.","https:\u002F\u002Fgithub.com\u002Fsgomez-dev\u002Fclaude-skills\u002Fblob\u002Fmain\u002Fexternal\u002Fwrite-swift\u002FSKILL.md",[153,156,159],{"categoryNo":154,"categoryName":155,"taxonomyType":133,"taxonomyTypeDesc":134},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":157,"categoryName":158,"taxonomyType":133,"taxonomyTypeDesc":134},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":160,"categoryName":161,"taxonomyType":162,"taxonomyTypeDesc":163},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[165,166,167,168,169,170,171,172,173,174,175,176,44,177,178,179,180,181,182,183],"swift","write","write swift","features","retain","testing","types","error","how to","problem","modeling","cycle","default","how","api","concurrency","performance","writing","design"]