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>
This commit is contained in:
@@ -0,0 +1,108 @@
|
||||
---
|
||||
name: humanize-generated-content
|
||||
description: 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:
|
||||
|
||||
```python
|
||||
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.
|
||||
Reference in New Issue
Block a user