Before publishing, scan the spoken script to identify copy risks that may trigger Douyin throttling/muting/removal. It is a versioned heuristic screening, not Douyin's official reviewer, and does not guarantee publishing outcomes.
Core Philosophy
Douyin review is not a simple match of "if there is a sensitive word, it is a violation"—the same word is completely legal in contexts such as quotation, negation, and technical terminology. Over-flagging is worse than under-flagging: if every detection reports a bunch of low risks, users will develop the habit of ignoring the report, and the truly high risks will be drowned out. Therefore, it is better to under-flag than to falsely flag—only flag real risks; mark uncertain ones as low risk and note the reason (except for high-risk categories, see scoring rules).
Inapplicable Scenarios
- Video visual violations (watermarks, vulgar visuals) → this skill only handles copy
- Other platforms (Xiaohongshu/Zhihu, etc.) → the lexicon targets Douyin; other platforms have different rules
- Legal compliance review → this is platform rule detection, not legal review
- Missing copy content → stop and tell the user they need to provide a copy file or text
Workflow
1. Read in the copy
Receive the copy source (file path or direct text) and extract the plain text content.
- Completion condition: Obtain a plain text string
- If the copy content cannot be obtained → stop and tell the user they need to provide a file path or paste the text directly
2. Scan by 9 categories
First read references/ruleset.json. When scan time exceeds expires_at , write ruleset_warning: STALE in the report and arrange a review, but do not automatically block the copy because the rules are outdated; only REVISE_REQUIRED|BLOCKEDwhen a clear unresolved high risk is hit or the scan simply cannot be completed. Then scan category by category according to the references/keywords.md lexicon, scoring each category independently.
| Category | Code | Risk Level | Description |
|---|---|---|---|
| Traffic diversion violation | YL | High | Guiding users to add WeChat/scan codes/private message, etc., for off-platform traffic diversion (including homophonic variants: 薇信/徵信/加V♥, etc.) |
| Superlative terms/Advertising Law | JX | High | Absolute terms such as most, first, only |
| Medical efficacy promises | YL-MED | High | Medical claims such as cure, root cure, 100% effective |
| Financial return promises | YL-FIN | High | Guaranteed returns, stable profit, specific return figures |
| Low-quality/clickbait | DZ | Medium | Shocking style, suspense bait, empty information |
| Sensitive topics | MG | High | Politically sensitive, unverified news, controversial topics |
| Platform-specific restrictions | PT | Medium | Douyin-specific hidden throttling rules (repeated publishing, induced interaction, etc.) |
| Vulgar/sexual content | DS | High | Douyin's number one red line: borderline/sexual innuendo/soft porn gets throttled, hardcore porn gets banned |
| Inciting conflict and abusive language | ZH | High | Personal attacks/regional attacks/comparison-baiting conflict/Profanity, AI reviews easily cross the comparison-baiting line |
- Completion conditions: All 9 categories scanned, all matches and their context recorded
3. Output report
When the parameters include --episode episodes/<slug> , the report can only be written to episodes/<slug>/02-违规报告.md, and must start with the following frontmatter;script_hash is the SHA-256 of that issue's 01-口播稿.md . Any revision must rerun this step and cannot reuse an old report.
---
script_hash: <sha256>
risk_status: CLEAR # CLEAR | REVISE_REQUIRED | BLOCKED
unresolved_high_risk_count: 0
ruleset_version: douyin-text-risk-2026-10-05
ruleset_reviewed_at: <复制 references/ruleset.json reviewed_at>
ruleset_expires_at: <复制 references/ruleset.json expires_at>
scan_completed_at: <ISO-8601>
platform_guarantee: false
---
## 违规检测报告
**文案**: {文件名或前20字}
**整体风险**: 🟢当前规则集未发现未解决高风险 / 🟡低风险 / 🟠中风险 / 🔴高风险
### 发现问题
| # | 类别 | 风险 | 原文片段 | 建议替换 |
|---|------|------|---------|---------|
### 统计
- 高风险: X处 | 中风险: X处 | 低风险: X处
- 总扫描字数: X字
### 建议
{高风险>0 → 建议不发布;中风险 → 给修改建议;低风险 → 提醒;无问题 → 明确“当前版本规则集未发现未解决高风险,不代表平台保证”}
- Completion conditions: The report includes all matches, statistics, and recommendations
risk_status is the mechanical conclusion for bianpai: when clearly high-risk and unresolved, write REVISE_REQUIRED; when the scan simply cannot be completed, write BLOCKED; otherwise write CLEAR and unresolved_high_risk_count: 0. Use ruleset_warning: STALE to remind if the rules are expired, and do not automatically change CLEAR to BLOCKED. Must copy the ruleset version/review/expiry time, the actual scan time, and write platform_guarantee: false. Must not rely solely on script_hash to let the report pass.
4. Provide a revised version (optional)
When the user requests, directly provide the revised copy, marking the changed positions with [原词→新词] .
Operating rules
Global constraints across steps—must be followed during both scanning and output:
Matching method
- Exact keyword matching: Directly match traffic-driving words, extreme words, etc.
- Pattern matching: Numbers + income (e.g. "30k per month"), contact patterns (WeChat ID, mobile number)
- Normalization of variants (pre-scan): Douyin evasion tactics commonly use homophones/inserted symbols/full-width and half-width characters to bypass detection. Before scanning each category, first normalize the copy and then match—for homophone variants (薇信→微信) directly check the variants listed in the YL lexicon; convert full-width letters (VX) to half-width; tolerate 0-3 non-Chinese-character symbols inserted within a word (加★微★信→加微信). See
references/keywords.md"Variant normalization rules". Pinyin initials/character splitting and other aggressive variants are not detected for now (rare in spoken scenarios, and over-detection harms normal words).
Context exemption
The same word has different risk in different contexts. The following cases are not violations; do not report them falsely:
❌ Bad (false positive): "He said this tool earns a million a month" → flagged as YL-FIN high risk (this is citing someone else's opinion, not an income promise)
✅ Good (correct exemption): "He said this tool earns a million a month" → not flagged (citation context exemption)
Exemption conditions:
- Quoting/relaying others' views ("someone says XXX")
- Objectively stating facts ("this tool has 10 million monthly active users")
- Negative sentence patterns ("don't believe in earning a million a month")
- Technical terms ("first principles")
Principle of preferring misses over false positives
❌ Bad (over-flagging): Flag every "most" as high risk → users learn to ignore reports → truly high-risk items get drowned out
✅ Good (precise flagging): "The best AI tool" in a tutorial recommendation context → flag as low risk + note "tutorial recommendation context, actual risk is low" "Add my WeChat xxx123" → flag as high risk (clear traffic-driving behavior)
Mark as "low risk" only when the context is uncertain and even the most unfavorable interpretation does not constitute high risk, and note the reason; if the uncertainty involves traffic diversion, promises, qualifications, medical/financial, or other high-risk categories, write as above REVISE_REQUIRED, and do not downgrade using low risk.
Scoring rules
| Situation | Overall risk |
|---|---|
| Any 1 high risk | 🔴High risk |
| 2 or more medium risks | 🟠Medium risk |
| 1 medium risk | 🟡Low risk |
| Only low risk or none | 🟢No unresolved high risk found in the current rule set |
Relationship with other skills
- After writing the spoken script and before publishingrun laohan-weigui once
- A "violation detection" step can be added to the laohan-jiaozhun process (pre-publish check)
- Independent of laohan-chuangzuo, it can be called separately at any point in the creation process
Vocabulary maintenance
The value of the vocabulary comes from users' actual throttling experience—a word that has been throttled once is more useful than 100 guessed words.
- Vocabulary file:
references/keywords.md - Rule list:
references/ruleset.json; review at least every 90 days or after a real platform penalty occurs - Each time it is used, prompt: "If you have had throttling experience before, tell me the specific keywords, and I will add them to the vocabulary"
- When adding, record the source (which video was throttled, what the platform feedback was), to facilitate later judgment of whether the rule is outdated