Trends are only used for discovery; the final result is an auditable production decision: why do it now, who it is for, on what basis the argument holds, which duplicate angles exist on Douyin, why the other candidates were eliminated, and how to review it after publication within a fixed window.
Boundaries
- This skill is the sole lead writer for ①, writing signals, candidates, source-health and
00-选题.*。 laohan-douyinsousuoonly writes00-抖音搜索证据.{json,md}; the same Agent host executes according to the bianpai routing, without programmatic skill-to-skill calls.- ② is the one that writes the talking-head script; ① does not generate body text, outline paragraphs, or cover art.
- ⑤ is the one that does complete fact-checking; ① must still find at least one PRIMARY original source for the final factual premise.
- Do not install new browsers, crawlers, Python runtimes, or third-party skills. For Douyin platform access, use only the already-installed OpenCLI.
- The same event can form both an opinion candidate and a tutorial candidate; when the audience task, title promise, and content path are genuinely different, they may compete separately. ②—④ follow the selected lane and do not mix writing.
Inputs
Episode mode must read:
- This episode's
episode-config.jsonand00-编排/frozen artifacts. - The feedback snapshot explicitly registered for this episode; if there is none, record
NOT_AVAILABLE, and do not scan old episodes to guess lessons. - This round's real signals and Douyin search evidence.
A standard Episode is AUTO_SELECT: the AI completes discovery, filtering, and topic setting according to the Five-Step Method, and Jeffrey retains post-hoc veto power (00-选题-Jeffrey否决.json, the veto reason is mandatory, and after a veto, rescan according to the reason). When Jeffrey explicitly gives a topic, follow USER_SEED, and still provide at least one real alternative candidate, Douyin evidence, PRIMARY evidence, and a measurement contract.
When what Jeffrey gives is a software, method, or series direction, first followUSER_DIRECTION_RESEARCH: read projectdocs/系列选题研究与分期规格.md, and complete four-platform targeted search, content-level breakdown, demand assessment, series installment planning, and single-episode material package. It does not run an unrelated 9-account broad scan to pad the trend. OnlyDEMAND_VALIDATEDcan enter a series of three or more episodes,EXPERIMENTAL_ONE_OFFonly enters a single episode,DIRECTION_REJECTEDstop. A formal episode must still provide alternative candidates.
Workflow
1. Collect current signals
Write first00-选题-signals.json.discovery_mode: no direction isAUTONOMOUS_SCAN; Jeffrey has already given a direction asUSER_DIRECTION_RESEARCH. The latter writes thenode scripts/check-series-research.mjsthat have passedseries_research_pathand SHA intodirection_research, and registers the four results from Bilibili, Xiaohongshu, Douyin, and Zhihu separately as signal sources.DEMAND_VALIDATEDAt least two platforms have real demand signals;EXPERIMENTAL_ONE_OFFenter a single episode only based on verified official new events, Jeffrey's personal experience, or niche task grounds within the research package, and do not force-fabricate popularity on two platforms.
Episode mode executes the sole deterministic entry point:
node ~/Documents/laohan-skills/laohan-xuanti/scripts/collect-topic-signals.mjs \
--episode episodes/<slug>
AUTONOMOUS_SCANAccording to Step 1 of the Five-Step Method, scan viral hits:数据层/tracked-creators.jsonscan the entire pool creator by creator (ACTIVE must be scanned and failure blocks; PENDING is also scanned for cross-verification, and failures are recorded truthfully without blocking),数据层/self-channel.jsonOwn channel anomaly multiplier (prioritize deep dives in directions where own anomaly multiplier is high), comprehensive hot topics (auxiliary input), andscript-pool/Jeffrey个人表达池.md(material sources). The scan simultaneously executestime layering(anomalies in the last 30 days = current demand, prioritize doing them; anomalies from 3 months ago = evergreen topics, need to re-verify current popularity) andanomaly grading(3x = worth noting, above 10x = big opportunity, prioritize deep dives), and consumes each anomaly'stop_commentshigh-like comments—high-like comments are the audience's unmet questions, directly used as candidate leads. The default discovery and display priority isBENCHMARK_CREATOR(1) > SELF_CHANNEL(2) > BROAD_HOTSPOT(3) > PERSONAL_EXPRESSION(4). The default routes for comprehensive hot topics are AIHOT, Hacker News, Zhihu, Weibo, 36kr, Bilibili, Douyin hot list, Toutiao, Tieba, and Hupu; if one route fails, record it truthfully and the other hot-topic routes continue. Only pass this when you need to narrow the hot-topic route --sources, and it cannot be used to skip the creator library and own channel.
The script only writes:
00-选题-signals.json- Initial
00-选题-source-health.json
The script does not select topics, does not access old episodes, and does not call douyin-ai.js。
2. Standardize, deduplicate, and form candidates
Read signals, and cluster the same factual event by stable signal id; exclude duplicate expressions with the same URL/same promise/same path. For benchmark accounts, only extract the parent topic, public demand, and anomaly signals; do not copy titles, copywriting, cases, or conclusions. Only generate two forms for the same event when "help the audience make a judgment" and "take the audience through completing a task" each hold true. Write schema 4 00-选题-candidates.json, first use the top-level screening_summary to leave the filtering chain, then write at least two genuinely different shortlist candidates.screening_summary Only includes:
raw_signal_count: the actual total number of results in signals;event_cluster_count: the total number of event clusters after deduplication.longlist: when there are enough valid events, record 8–12; when fewer than 8, record all. Each entry contains a uniqueevent_cluster_id、working_title, non-emptysignal_ids, positive integersource_count、disposition: SHORTLISTED|REJECTED, and specificreason。- For each final candidate, the
event_cluster_idmust be marked in the longlist asSHORTLISTED. Do not add intermediate files, extra nodes, or a second scoring system.
Viewpoint/tutorial variants of the same event can be counted separately when the audience task, title promise, and content path differ. Each item must have:
Pre-action for setting the angle:First read the original video—you must have read the transcript or complete content of the original viral video before you are allowed to write tension (rebuttal/deeper supplementation/personal-experience substitution are all based on the actual content; if you haven't read it, it's a guess). Benchmark video transcription reuses the project's existing transcription toolchain (large-v3), and the output is placed in数据层/scans/<日期>/or the episode temporary directory. When you can't think of a difference, use the interest market tool: combining two high-interest topics = audience stacking, and evaluate the size of the parent topic's audience pool (tool/tutorial types are usually larger than pure viewpoint types; at the same quality, prioritize the larger pool).
Before forming candidates, restore the original analysis: mark relevance using direct words such as "AI/GPT/Claude/large models/robots/automation/programming/side hustle" and indirect words such as "education/career/consumption/entrepreneurship/workplace", but retain marginal signals that may generate new angles; tally content types such as installation tutorials/advanced tips/methodology/comparative reviews/hands-on practice/resource recommendations; mark multi-platform resonance, single-platform exclusivity, already crowded angles, and opportunities not covered by competitors. They are used to expand candidates, not to replace the later PRIMARY and Douyin keyword verification.
- unique
id, stable non-emptyevent_cluster_id, non-emptywhy_now、title、content_form: opinion-video|tutorial-video、audience_level: BEGINNER|INTERMEDIATE|ADVANCED、audience_problem、audience_promise、thesis。 candidate_originmust be registered asprimary_lane, the correspondingpriority_rank, non-emptyorigin_signal_idsandcorroborating_lanesCross-verification can improve credibility, but personal expression sources must not be disguised as benchmark hit sources.tensionMust registertype: CONFLICT|MISCONCEPTION|COUNTERINTUITIVE|TRADEOFF、common_assumption、jeffrey_positionand oneconflict_statementthat can be fulfilled by the main text. Writing only a domain name, product launch, or "worth watching" does not count as a candidate.creator_fitMust clearly statebasis: FIRSTHAND_EXPERIENCE|BUILT_OR_TESTED|OWNED_EVIDENCE|LONG_TERM_PRACTICE|RESEARCHED_JUDGMENT|NOT_ESTABLISHED、why_jeffreyanddistinctive_judgment. It answers "why Jeffrey should talk about it, what his basis is, and what judgment it adds compared with a generic retelling." SELECTED does not allowNOT_ESTABLISHED; when there is no firsthand experience,RESEARCHED_JUDGMENTmay be used, but it must form an independent judgment with evidentiary boundaries, and "I also paid attention to it" must not be passed off as a personal advantage.assumed_prerequisitesandjargon_to_explainstring arrays. A BEGINNER candidate must include the key tools, commands, and migration/import concepts in the title and argument in the explanation list, and must not merely raise theaudience_fitscore.- Non-empty
signal_idsandevidence_ids。 - Non-empty
platform_query_intent;platform_alignmentcontainsstatus: ALIGNED|ADJACENT|CONTRADICTED|UNRESOLVED|UNAVAILABLE, non-emptyrationaleandevidence_ids. When there are platform results, evidence ids must be real; when platform access fails, writeUNAVAILABLEand an empty array. content_gapcontainsstatus: CONFIRMED|NOT_CONFIRMED|UNAVAILABLE, non-emptyrationaleandevidence_ids. The first two may be written only when the platform directly provides search volume, supply, or gap evidence; the number of search results, missing interaction fields, or model judgment must never be passed off as a content gap.UNAVAILABLEis legal and does not participate in mechanical elimination.- Non-empty
claim_evidence_map; each item contains a uniqueclaim_id, non-emptyclaim、evidence_ids. It must bind technical facts to PRIMARY; when platform evidence is available, bind "what people on the platform care about" to PLATFORM_SIGNAL, and adjacent keywords must not be made to endorse another argument. When the platformUNAVAILABLE, do not fabricate a PLATFORM_SIGNAL claim. scorecardSeven-dimensional integer 1-5:audience_fit、evidence_strength、platform_relevance、differentiation、creator_fit、production_feasibility、learning_value。- Non-empty
rationale. When the topic is undecided, candidates aredisposition: SHORTLISTEDorREJECTED; the best candidate that passes all five steps is marked by AI asAUTO_SELECTED(at the same time, give the other candidatesREJECTEDplus specific reasons). false_positive_filter(Step 2: eliminate fake hits):status: PASSED|REJECTED、checksFour booleans (celebrity_event/controversy/off_niche/pure_news), non-emptyrationale. Candidates hit by any of the four types of fake signals remain REJECTED and must not be selected.topic_kind(Step 3: check repetition):SERIES_CANDIDATE|ONE_OFF. The former must be bound totopic_corroboration.signal_ids—the same motif appearing abnormally on two different accounts is enough to form a series, and three or more accounts = strong signal reducing risk. For series, prefer a followable format (a progress-style series like "30-day XX challenge" or "teach XX in 10 days," directly capturing the revisit rate weight), and write the format intotopic_corroboration.series_format_hint(may be empty).packaging_assessment(Step 5: verify saves): non-emptytitle_directionandcover_concept(one sentence, no diagram), three-question booleanworth_collecting/evergreen_half_year/title_clickable, non-emptyrationale. For an AUTO_SELECTED candidate, all three questions must be true; if not up to standard, return to Step 4 to change the angle or change the topic.
Scores are challengeable candidate comparisons, not traffic forecasts. Popularity cannot replace audience value, evidence strength, differentiation, or shootability. SELECTED may be ALIGNED, ADJACENTwith a clear differentiation explanation, or, when discovery and PRIMARY are sufficient, UNAVAILABLEthat truthfully explains the scope of missing data; missing platform data lowers platform_relevance confidence but cannot eliminate a candidate on its own.CONTRADICTED|UNRESOLVED must not be selected. Before a tutorial candidate is written as definite steps, it still must be in tutorial_proof Registration status: VERIFIED, current period evidence_path、evidence_sha256, non-empty version_boundary and recovery。
3. Perform Douyin keyword verification on the shortlist
Design one specific query for each of the 1–3 shortlisted items, and have the same host execute laohan-douyinsousuo episode mode. Must obtain 00-抖音搜索证据.json and .md before continuing.
OK: cite the real result id, and clearly state the viewer intent actually proven by the query. Directly supports the candidate title promise, audience task, andwhy_nowtime markerALIGNED; when it only supports the same product, transferred heat, or an adjacent concept, markADJACENT. Prioritize adding more direct queries, but do not automatically eliminate a differentiated new angle just because content with the exact same title is missing.EMPTY_OR_FIELD_UNAVAILABLE: only write "platform evidence pending", and do not write "no one is doing this/blue ocean".- OpenCLI login or all adapters fail: keep the real FAILED evidence, and mark
platform_alignmentandcontent_gapasUNAVAILABLE; as long as discovery and PRIMARY are sufficient, continue comparing, and do not treat platform absence as a blocker.
4. Return to the PRIMARY original source
For the final candidate's factual premises, look up official websites, official announcements, papers, product documentation, or original public records. Platform trending lists, search results, and media paraphrases can only be PLATFORM_SIGNAL or SECONDARY。
Write PRIMARY and PLATFORM_SIGNAL evidence into the candidate file; each has a stable id、source、source_type、url、retrieved_at. When PRIMARY is missing, narrow the argument to what can be proven; if it still cannot hold, switch candidates or use BLOCKED.
5. AI autonomously sets the topic (Jeffrey retains veto power)
After all five steps pass, set the topic directly without waiting for Jeffrey:
- By
异常倍数 > 收藏价值 > 定位重合度sort, take the best candidate and markAUTO_SELECTED, change the rest toREJECTEDand write specific reasons; when tied, prioritizeSELF_CHANNELanomalous direction (a track that has already been verified by yourself). - Write schema 4
00-选题.json(includingauto_selection_rationale) and00-选题.mdthen directly enter ②. - Jeffrey veto: at any time can write schema 1
00-选题-Jeffrey否决.json(vetoed_by/vetoed_at/candidates_sha256/selected_candidate_id/veto_reasonrequired). After veto, enterTOPIC_RESCAN_REQUIRED: rescan according to the veto reason, delete AUTO_SELECTED and the final topic selection; the new candidate must write the veto record (four items + old candidate SHA) verbatim intoscreening_summary.rejection_history[], and must not repeatedly push the vetoed candidate. - When the signal is insufficient to support any candidate passing the five-step method, enter
TOPIC_RESCAN_REQUIREDexpand the scan (newly register creator candidates, supplement Douyin search), and do not force a topic selection.
6. Write the final decision and source health
Update 00-选题-source-health.json, recording for each route:
- Unique
source_idandsource_role: DISCOVERY|BENCHMARK_CREATOR|PERSONAL_EXPRESSION|DOUYIN_SEARCH|PRIMARY_PROOF. Schema 3 must retain the latter two local discovery roles; the personal expression pool allowsEMPTY, and benchmark accounts only allow theOK|EMPTY。 - actual
command_or_url、attempted_at、status、result_count。 - this period relative to
result_fileand realresult_sha256。 - FAILED write
error; SKIPPED writereason。
Status must be consistent: the number of OK entries is greater than 0, and the number of EMPTY/FAILED/SKIPPED entries is 0. At least one DISCOVERY is OK, one DOUYIN_SEARCH has a real attempt record, and one PRIMARY_PROOF is OK; DOUYIN_SEARCH may be FAILED, but must be bound to this period's Douyin evidence file and the original error.
Write schema 4 00-选题.json, binding the AUTO_SELECTED candidate andauto_selection_rationale. Finally execute:
node ~/Documents/laohan-skills/laohan-xuanti/scripts/check-topic-contract.mjs --episode episodes/<slug>
Only outputPASS redian topic contract schema=4counts as ① completion.
schema_version: 4、selected_candidate_id, non-emptyrejected_candidate_ids, non-emptyauto_selection_rationale。- Copy the selected items as-is
content_form、audience_level、audience_promise、creator_fit、assumed_prerequisites、jargon_to_explain、platform_query_intent、platform_alignment、content_gapandclaim_evidence_map。 audience、thesis、evidence、selection_rationale、not_do_reason。- evidence all belongs to the selected candidate, and at least one is PRIMARY; when the platform is available, at least one PLATFORM_SIGNAL,
platform_alignment.status=UNAVAILABLEmay be absent when - experiment contains a single primary intervention, a valid
metric_keys, a positive integerT+N、observation_window_unit: DAYand per-keymetric_targets。
For each metric target:
{
"key": "avg_duration_sec",
"direction": "INCREASE",
"baseline_ref": "recent_5_median",
"measurement_source": "douyin_creator_center"
}
Finally write 00-选题.md, explaining only the real decisions in the machine contract, without adding unregistered facts.
Failure handling
| Trigger condition | Handling |
|---|---|
| A single discovery source fails | Record FAILED; other sources that satisfy the role contract may continue |
| All discovery sources return no results | BLOCKED; do not choose a topic based on model memory |
| Douyin returns a valid empty array | Record EMPTY; do not infer that there is no competition |
| All OpenCLI login/adapter paths fail | Record platform evidence as UNAVAILABLE and continue; do not install an alternative scraper, do not infer a blue ocean |
| The final candidate has no PRIMARY | Narrow the thesis or switch candidates; if still none, BLOCKED |
| Jeffrey vetoes the current topic | EnterTOPIC_RESCAN_REQUIRED; rescan according to the veto reason, carry the veto history into the new candidate, do not enter ② |
| The platform results support only an adjacent topic | Mark ADJACENT, supplement the query; if still adjacent, truthfully explain the differentiation and risks, and it may participate in the final comparison, but must not be passed off as directly aligned |
| The tutorial candidate has no real local execution evidence | Keep REJECTED; it may be retained as a candidate pending verification, but must not be written as a tutorial that is already deliverable |
| The candidate cannot be measured by the existing ⑬ metrics | Change the intervention/metric or switch candidates |
Anti-patterns
❌ "All three platforms are hot, so let's do this one."
✅ "Candidate C02 simultaneously solves the target audience's problem, PRIMARY supports the factual premise, Douyin evidence shows that existing content is concentrated on feature introductions, and this episode differentiates through the real workflow cost; C01/C03 were eliminated due to weak evidence or being unfilmable."
❌ "Someone on Douyin is searching for Claude Code migration, so that proves that 'validation loop closure' is a current platform demand."
✅ "This result only proves migration/import demand, mark it ADJACENT; continue searching for direct intent such as validation failures and launch regressions. If there are still no direct results, 'validation loop closure' may participate in the comparison as a differentiated viewpoint, but make it clear that the platform evidence supports only an adjacent demand."
❌ "0 search results, so this is a blue ocean."
✅ "The search executed successfully but returned 0 results; record it as platform evidence pending, and do not judge competitiveness based on this."
Non-Episode mode
When the user only wants a hot-topic brief, the same collection script may be executed to a temporary directory and then a summary of the current signals returned; do not write to the episode source of truth. When the user only wants Douyin search, route directly laohan-douyinsousuo。