Files
agent-skills/skills/humanize-generated-content/SKILL.md
T
MalinandClaude Sonnet 5 3b288c0a21 feat: add humanize-generated-content skill
Codifies the existing (but silently skippable) humanize step as a
checked skill after a real content batch published without it —
codex hand-rolled its own generation call instead of going through
content-agent/agent.py, which unconditionally runs both draft_rewrite()
and humanize(). This skill makes the requirement explicit, gives the
safe invocation path, and states how to verify the pass actually ran
rather than trusting a delegate's self-report.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-19 14:47:19 +02:00

5.4 KiB

name, description
name description
humanize-generated-content Use whenever generating text that will be published somewhere a real external reader sees it — a WordPress post, landing-page copy, marketing content, a public-facing article. Not for internal docs, code, commit messages, or conversational replies. Ensures every such draft passes through a humanize rewrite before publishing, not just the pipelines that happen to already do it.

Humanize Generated Content

Scope — read this first

This applies to generated text intended for public, external-facing publication: blog posts, landing-page copy, marketing content, articles on any of the granja-managed sites. It does not apply to internal docs, code, commit messages, memory notes, or normal conversational replies — running an AI-detection-evasion pass on a commit message would be wasted effort with no reader who cares. If it's not going to sit on a public page for a stranger to read, this skill doesn't apply.

The rule

Any draft headed for publication gets a humanize pass before it goes live — not "usually," not "the pipeline probably does it," a checked step.

This exists because it already failed silently once: a content batch delegated to a coding CLI hand-rolled its own draft-generation call instead of going through the project's own content-agent/agent.py, and the humanize pass never ran. Nothing errored. The post just published AI-flavored. The fix isn't "be more careful next time" — it's routing through a path that can't skip it, and checking that it didn't.

The mechanism

Preferred: use content-agent/agent.py directly, don't hand-roll generation. Its main() unconditionally calls draft_rewrite() then humanize() — there is no flag to skip the humanize pass. If content-agent already covers the site/niche, this is the safe path by construction:

cd /home/malin/granja
REPLICATE_API_TOKEN=<from content-agent/.env> python3 content-agent/agent.py \
  --domain <site-domain> --niche <news|travel|tech|lifestyle|luxury|taboo|health> \
  --language <lang-code> \
  --source-text "<raw material>" \
  --out /tmp/<descriptive-name>.json

The output JSON's models.humanize field records which model actually ran the pass — that's your verification, not the exit code.

If content-agent doesn't cover the target (a one-off script, a delegate task outside the existing niches/domains), still route the draft through the same humanize step manually before publishing:

from agent import humanize, agy_run  # content-agent/agent.py
final = humanize(config, token, niche, draft_text, language)

or, for a standalone call outside that module, agy_run(prompt, model="gemini-3.1-pro-high") — see content-agent/agent.py's agy_run() for the exact CLI invocation (absolute path to the agy binary, required when not running under a login shell — a cron job silently failed on this once by using a bare agy that wasn't on PATH).

Why agy/gemini-3.1-pro-high specifically, not a different backend: resolved via a direct A/B test (2026-07-24), not a per-task guess — the identical humanize prompt scored 97-99% AI-detected when run through Replicate's google/gemini-3-pro, and 63% when run through agy on the same content. Don't substitute a different backend without re-running that kind of comparison first.

Verify, don't trust

A delegate or subagent reporting "I humanized it" is a claim, not a fact — matches this repo's general "verify, don't relay" rule. Before treating a batch as done:

  • Check the actual output artifact names which model ran the humanize pass (models.humanize in content-agent's JSON output, or equivalent) — not just that a step in the log says it happened.
  • For anything higher-stakes than a routine local-news recap, spot-check with an actual AI-detector rather than trusting the pass ran clean.

What "good" humanized output actually looks like (so you can spot bad output, not just missing output)

The humanize prompt itself (see content-agent/agent.py::humanize()) is built from confirmed, specific tells — worth knowing when reviewing output, since a technically-humanized draft can still fail if it re-adds these:

  • Fabrication risk from the "add a small concrete detail" instruction. Confirmed twice as a real failure mode: a fabricated "18 euro/day" sunbed rate and a "3 euro" coffee with no source basis, and a wholly invented named orchestra performing at a castle. A concrete detail must be grounded in the source material or genuinely safe general knowledge — never a specific invented name, statistic, or price.
  • A compact bulleted "quick tips" closer is a strong AI tell — confirmed as the exact difference between a 100%-AI-scored and a 78%-human-scored version of otherwise-comparable content. Should read as full paragraphs with real specifics, not a terse bulleted list.
  • Personifying the destination/subject as an agent acting on the reader ("the island hits you with...", "leaves you breathless") is a confirmed high-impact tell (caught by GPTZero's own sentence-level flagging). Should read as a plain stated observation instead.
  • The "not just X, but Y" contrastive construction and reflexive rule-of-three lists are both known LLM tics the pass should be actively breaking, not reproducing.

If reviewing output that still shows these patterns, treat it as a failed humanize pass even if the pipeline step technically ran.