| name | cmm-content-writing |
| description | Use this CMM skill to turn a content_plan into platform-specific draft content packages for WeChat, X, Weibo, Xiaohongshu, blog, newsletter, or script-style outputs. It directly creates CMM draft packages using internalized research, blog, social, and script writing patterns while defaulting to local draft-only output. This new CMM layer does not modify legacy writing skills and never publishes, schedules, or writes to external systems unless the user explicitly asks for a later publishing workflow. |
| version | 0.1.2 |
CMM Content Writing
cmm-content-writing is the writing layer in the CMM content factory.
It consumes a content_plan from cmm-content-planning and produces a
content_package for downstream visual, video, and publishing workflows.
Boundary
Use this skill for:
- Turning a
content_plan into a draft article, post, thread, note, or script.
- Choosing the right writing pattern for the target platform.
- Producing structured
content_package output.
- Repurposing one plan into multiple platform drafts when requested.
- Preserving source discipline, claim caution, and platform-specific structure.
Do not use this skill for:
- Selecting topics. Use
cmm-content-planning only after topic selection.
- Generating images or video.
- Publishing, scheduling, posting, or writing to Notion.
Legacy Boundary
Do not invoke or modify legacy writing skills by default. Their useful patterns
are internalized here as CMM writing methods. If a legacy skill exposes a useful
edge case, record it as legacy_gap and update this CMM skill, its references,
or its contract.
Input
Preferred input is a content_plan:
content_plan:
topic: ""
audience: ""
platform: ""
format: ""
core_angle: ""
core_claim: ""
evidence: []
risks: []
expression_strategy: ""
title_cover_direction: ""
outline_direction: []
first_action: ""
writing_decision:
user_real_need: ""
reader_takeaway: ""
article_type: ""
target_length: ""
length_reason: ""
one_sentence_spine: ""
must_include: []
must_exclude: []
scope_boundary: ""
drafting_instruction:
title_promise: ""
body_must_center_on: ""
article_shape: ""
personal_style_role:
source_profile: ""
voice: ""
rhythm: ""
stance: ""
lexicon: []
avoid: []
must_include: []
forbidden_drift: []
length_strategy: ""
source_boundaries: ""
style_selection:
user_profile: ""
writing: ""
visual: ""
layout: ""
downstream_needs:
writing: true
visual: true
video: false
publishing: false
status: draft
If the user only provides a topic, ask to run planning first or build a minimal
content plan before drafting.
Read references/content-package-contract.md for exact output fields. Read
references/writing-method.md for platform structure, evidence handling, and
repurposing rules. Read references/wechat-writing-style.md for the full
WeChat long-form quality standard when platform: wechat. Read
references/xhs-copy-spec.md for Xiaohongshu/Rednote note structure, card copy,
caption, hashtags, and preflight rules when platform: xiaohongshu. For
Xiaohongshu titles and cover hooks, also read
references/xhs-title-templates.md.
Before drafting, resolve content_plan.style_selection:
- Writing template:
cmm-content-factory/references/styles/writing/<id>.yaml.
- User profile:
~/.cmm/profile/<name>.yaml when set; if absent, use the
shipped persona-neutral references/styles/default-profile.yaml (then bare
neutral only if that is missing) per
cmm-content-factory/references/styles/style-system.md.
- The generic anti-AI gate in
style-system.md always applies; the user
profile may add personal bans on top.
Template rules and user-profile persona/audience/lexicon are mandatory writing
constraints, not suggestions. A user instruction in the current turn overrides
them for this task only.
No styleless drafting gate: content_plan.style_selection.user_profile,
writing, visual, and layout must be resolved before drafting any article.
Profiles are runtime configuration. For this local CMM workflow,
~/.cmm/profile/neo.yaml is the local default only when it exists and the user
did not request another style. Do not hardcode Neo-specific writing traits into
the shared skill; derive drafting_instruction.personal_style_role from the
active user profile for each run. If user_profile or writing is empty, stop
and return a planning/style-selection block instead of producing正文. Do not write
in the model's generic voice and then retrofit style afterward.
Profile-to-constraints gate: Loading a profile is not enough. Before any
article正文 is drafted, convert the active user profile, account template, writing
template, and this task's personal_style_brief into
drafting_instruction.pre_draft_style_constraints. This object is the writing
constraint package, not a review note. It must name the opening move, first-300-
character judgment, article backbone, section intent, paragraph rhythm, allowed
first-person stance, required judgment signals, banned generic shapes, and
rewrite triggers for this exact article. If it is missing, generic, or not
connected to the selected title promise, block drafting. A later
voice_match_evidence.passed: true is invalid unless it proves the draft
followed these pre-draft constraints with excerpts or concrete reasons.
Routing
Choose the writing pattern by platform, format, and evidence needs.
| Need | Pattern |
|---|
| WeChat long-form analysis, cited article, tutorial, case study | Research article pattern |
| Personal blog or opinion essay | Blog draft pattern |
| X thread, Weibo post, Xiaohongshu copy, LinkedIn-style post | Social draft pattern |
口播稿 / 短视频口播脚本(真人出镜要念的稿,format=talking_script) | 口播稿 pattern → references/talking-script-method.md(钩子先行批量选 + 时长卡字数 + 口播/分镜双轨 + 人设口吻) |
| 其它短视频脚本(纯文本/旁白) | Script draft pattern |
| Multi-platform adaptation | Repurpose pattern |
Writing scope:
- All writing methods are internalized here: evidence-first structure,
voice-aware longform, platform adaptation, thread compression, and social copy
formatting. No external writing skill is required.
- Any external save, Notion write, schedule, or publish action belongs outside
this skill.
Workflow
-
Validate the content_plan.
-
Resolve content_plan.style_selection: load the writing template and the
user profile (or neutral mode).
-
Confirm the style gate passed:
user_profile_loaded: true
writing_template_loaded: true
style_selection.user_profile is non-empty
style_selection.writing is non-empty
If any item fails, block drafting and ask/route back for style selection.
-
For WeChat long-form drafts, run the account-template context gate before
generating title or正文. Read references/wechat-writing-style.md,
references/platform-copy-specs.md, references/title-spec.md, and, for AI
tool / product update / workflow topics, references/wechat-title-templates.md;
then read the selected user profile and the resolved WeChat account template. If the active
profile declares account_templates.wechat, expand and read that template
file; otherwise read the bundled persona-neutral fallback
cmm-content-factory/references/templates/wechat-default-template.md. Write
wechat_context_gate before drafting:
wechat_context_gate:
platform_rules_loaded: true
user_profile_loaded: true
account_template_path: ""
account_template_loaded: true
article_type_template_loaded: true
calibration_style_checked: true
passed: true
source_files: []
If the resolved account template was not read, block drafting. The account
template must be converted into concrete constraints
in voice_contract: opening pattern, article structure, paragraph style,
practicality pattern, personal judgment pattern, and closing pattern. Do not
satisfy this gate by merely naming the profile. Treat the account template
as the primary visible article shape. Platform, length, density, and quality
gates are backend constraints; they must not cause the draft to grow extra
tables, prompt packs, check-standard blocks, or process artifacts that the
account template did not call for.
-
Check the writing decision gate for article drafts. content_plan should
contain writing_decision.user_real_need, reader_takeaway,
article_type, density_level, target_length, one_sentence_spine,
must_include, must_exclude, and scope_boundary. If it is missing but
the request is clear, build the decision before drafting and record it in the
output. If the
one-sentence spine is vague, reader takeaway is unclear, or target length is
unsupported by the topic payload, stop and route back to planning instead of
padding the draft. For WeChat, choose one canonical article type and target
length from references/wechat-writing-style.md before drafting:
quick_opinion 800-1200, opinion_essay 1200-1800,
practical_method 1200-1800, tutorial 1800-2600,
workflow_template 1800-2600, trend_explainer 1800-2600,
case_study 2200-3200, tool_list_comparison 2200-3200. For product
updates, tool introductions, feature explainers, AI workflow updates, and
ordinary opinion/news-analysis pieces, prefer 1800-2400 chars unless the
article has a concrete long-form deliverable. Any draft above 3200 chars
must record a long-form qualification in length_reason; any draft over
3800 chars is a long_special_report exception and requires explicit user
confirmation. Also choose one density_level from
references/wechat-writing-style.md: compact, standard, or expanded.
Default from tight: product updates, feature explainers, short tool
introductions, and one-point opinions use compact; tutorials and workflow
explanations use standard; real testing, case studies, multi-option
comparisons, reusable templates/checklists, and source-heavy analysis may use
expanded.
-
Build or validate personal_style_brief before drafting. It must come from
the selected user profile plus any loaded account template, and it must shape
this exact article rather than restating the profile generically:
personal_style_brief:
source_profile: ""
account_template: ""
opening_strategy: ""
core_judgment: ""
practitioner_perspective:
stance_type: ""
usable_scene: ""
author_would_do: ""
likely_misuse: ""
evidence_boundary: ""
structure_strategy: ""
selection_logic: ""
paragraph_rhythm: ""
must_sound_like: []
forbidden_shape: []
generic_template_risk: ""
article_type_override: ""
Treat this brief as the writing engine below the selected title's promise. It
must be derived from the active user profile for this task, not from any
hardcoded creator voice inside the shared skill. For AI tools, product
updates, workflow articles, tutorials, and practical tech explainers,
practitioner_perspective is required: state whether the author is writing
from observation, hands-on use, workflow practice, or user-advisor judgment;
name one realistic use scene; say how the author would or would not use it;
name one likely misuse; and state the evidence boundary. Do not fake
hands-on experience. If there is no real test material, use
observer_judgment or workflow_practitioner, not hands_on_experience. If
the generic article type would produce a manual, average listicle, or
equal-weight tool explanation that conflicts with the user's profile, use
article_type_override to preserve the personal article backbone, but do not
replace or hide the title's promised subject. Example: a title with "10 tools"
may still be practical_method + curated_tool_path, but the 10 tools must
remain visible article subjects; the method only explains the selection and
order. If personal_style_brief is missing and a user profile is available,
stop and build it before writing.
-
Convert the loaded profile and personal_style_brief into
drafting_instruction.pre_draft_style_constraints before drafting. This
object must be concrete enough to generate from, not merely to evaluate after
the fact:
pre_draft_style_constraints:
source_profile: ""
source_account_template: ""
opening_move: ""
first_300_chars_must_do: []
core_judgment_to_state: ""
practitioner_perspective:
stance_type: ""
usable_scene: ""
author_would_do: ""
author_would_not_do: ""
likely_misuse: ""
evidence_boundary: ""
article_backbone: ""
section_intent:
- section: ""
job: ""
style_requirement: ""
paragraph_rhythm: ""
first_person_stance: ""
required_judgment_signals: []
required_reader_guidance: []
allowed_lexicon: []
banned_shapes: []
rewrite_triggers: []
Block drafting if:
core_judgment_to_state is vague or only repeats the topic;
- AI tool/product/workflow articles lack
practitioner_perspective;
practitioner_perspective.stance_type claims hands-on use without real
user-provided or source-backed experience;
opening_move would produce a product-doc or dictionary opening;
article_backbone is a generic feature list when the profile calls for a
judgment-led article;
section_intent does not show how each section advances the profile-shaped
judgment;
banned_shapes and rewrite_triggers are missing.
-
Choose one primary platform and format.
-
Lock the platform copy budget before drafting. Read
references/platform-copy-specs.md and references/title-spec.md, then
record the budget in content_package.platform_copy_budget. For WeChat,
title_cmm_hard_max: 25 is a hard production standard; the official draft
API's 32-character limit is recorded only as title_official_api_max and
must not be used to loosen title generation. The upstream content_plan
should already contain a title_direction_gate; inherit its selected
direction as the title promise, but do not treat it as the final publish
title. For WeChat AI tool / product update / workflow topics, use
references/wechat-title-templates.md to avoid flat feature-log titles while
preserving subject and evidence boundaries. After正文 is drafted, run the
final_title_gate: generate 3-5 final
title candidates under the CMM hard max, compute the length with a tool,
discard over-budget candidates before recommending, and write the result to
title_quality_gate. Candidate pattern values must be one of the six
canonical patterns in references/title-spec.md; do not invent ad-hoc labels
such as "tool + action", "object + result", or "suggestion". Put those
explanations in reason instead. Do not rely on model self-counting.
-
Check evidence:
- If the plan has sources, use them and preserve source references.
- If evidence is weak or uninspected, keep claims cautious and add
fact_check_status: needs_review.
- Deep backfill: if the outline exposes a claim that needs a number, date,
case, or quote not present in the plan, call
cmm-web-search in
fact_check intent for that specific claim before drafting it. Planning
owns breadth research; writing owns claim-level backfill.
- Before drafting, load or build
drafting_instruction from the selected
title, outline, writing decision, personal_style_brief, and
pre_draft_style_constraints. This package is
the generation instruction, not a post-draft rubric. Do not draft until it
clearly states the title promise, what the正文 must center on, article shape,
runtime-derived personal-style role, must-include items, forbidden drift, length strategy, and
source boundaries. It must block drafting when:
- the title promises a counted list but the article shape hides the counted
objects;
personal_style_brief changes the article from the title's subject to a
different framework;
pre_draft_style_constraints are missing or generic;
- the one-sentence spine no longer answers the title promise.
- Draft the content in the requested platform shape, using
drafting_instruction as the primary input. personal_style_brief, writing
templates, platform rules, and quality gates are constraints inside that
instruction package, not independent engines competing after the draft exists.
Enforce the writing decision while drafting: fulfill the one-sentence spine,
keep only must_include content, do not expand must_exclude adjacent topics,
and keep length inside target_length unless a clear source-backed reason is
recorded in review notes. Do not write a generic tool manual and then sprinkle
personal phrases on top; also do not over-correct by turning an explicit
list/recommendation title into a hidden workflow essay.
- Build and enforce a
voice_contract for the selected style. The contract
must turn the loaded writing template + user profile into concrete checks:
opening pattern, viewpoint/persona, reader stance, sentence rhythm,
required/allowed lexicon, forbidden tones, structure signature, and closing
pattern. For WeChat, it must also include any loaded account template as a
source file and reflect that template's article shape and practicality rules.
It must also include the personal_style_brief fields: core judgment,
practitioner perspective, structure strategy, selection logic, forbidden
shape, and generic-template risk, plus the pre_draft_style_constraints
fields. This rule is universal:
it applies to Neo and to any future profile or style. Do not rely on style
labels alone.
- Run
voice_match_evidence before output. For each important item in the
voice_contract, cite a short excerpt or state the concrete reason it
passes. If the draft only uses surface vocabulary but misses structure,
viewpoint, or rhythm, mark it failed and rewrite before output. For profile-
driven articles, evidence must explicitly check:
personal_judgment: whether the piece has a clear author judgment;
first_hand_logic: whether the article explains why the author orders or
selects things this way;
practitioner_perspective: whether the article includes a realistic use
scene, what the author would or would not do, a likely misuse, and an
honest evidence boundary;
anti_generic_shape: whether it avoids manual/listicle/explainer drift;
reader_path: whether the reader gets a usable path, not just item
descriptions;
compression: whether non-core explanations were compressed or removed.
Evidence must also prove that pre_draft_style_constraints shaped the
opening, first-300-character judgment, backbone, section intent, paragraph
rhythm, and rewrite-trigger cleanup. If any rewrite_triggers are present in
the draft, voice_match_evidence.passed must be false and the draft must be
rewritten before downstream stages.
- Run the generic anti-AI gate (plus user-profile additions) on the draft and
rewrite failing passages.
- Run the WeChat opening quality gate when
platform: wechat and the draft is
long-form. The default opening is 80-150 Chinese characters; 150-180 requires
a useful context reason; over 180 requires a recorded reason. The opening
must state the reader problem, relevance, and article promise without padding.
Write opening_quality_gate.
- Run the WeChat paragraph density gate when
platform: wechat and the draft
is long-form. Personal spoken cadence does not override platform shape:
tutorial/practical articles default to 2-4 sentences per natural paragraph;
one-sentence paragraphs are reserved for emphasis, transition, key judgments,
section openings/endings, or closing cadence. Count body paragraphs excluding
headings, lists, quotes, code blocks, and examples, then write
paragraph_density_gate. If the rhythm looks like a talking script, memo, or
line-broken note, merge/rewrite before output.
- Run the WeChat article length gate when
platform: wechat and the draft is
long-form. Count final正文 with a tool and write article_length_gate. If the
draft exceeds the target upper bound by more than 10%, compress it or ask the
user to confirm the longer draft. If it is below the lower bound by more than
15%, check whether it under-serves the promised reader takeaway.
- Run the unified WeChat content quality gate when
platform: wechat and the
draft is long-form. Write content_quality_gate with concrete evidence for:
reader takeaway, one-sentence spine, information density, practical value,
structure coherence, evidence support, scope control, no padding, and
conclusion payoff. Also check closing density: for compact product updates,
tool introductions, feature explainers, and short opinion articles, delete
ceremonial sign-offs when the previous sentence already lands the useful
judgment. For practical/tutorial/workflow articles, also prove there is an
actionable deliverable (step-by-step workflow, template, checklist, reusable
prompt, example output, or quality rubric) and that the article is not a
principle-only/theory-first explainer. The deliverable may be an
article-native method, judgment path, decision sequence, or editing flow; do
not force a visible table, prompt block, or checklist just to satisfy this
gate. If any item fails, rewrite before output.
- Run the WeChat information-density compression gate when
platform: wechat
and the draft is long-form. This gate is separate from article_length_gate:
a draft can be inside the length band and still be too loose. Use the
selected density_level as the expansion rule. For every draft, at minimum
check repeated judgments, generic background or empty significance, and
mergeable scenarios/limitations/closing paragraphs. For product updates, tool
introductions, feature explainers, AI workflow updates, and timely practical
articles, prefer a sharp 2200-2400 Chinese-character draft.
If the final正文 exceeds 2500 characters, explicitly check repeated judgments,
loose explanations, mergeable scenario sections, over-explained limitations,
and padded closing paragraphs. Compress before output unless the extra length
is justified by hands-on testing, a detailed tutorial, a comparison table, a
reusable template/checklist, or multi-source analysis. Write
information_density_compression_gate with the compression decision and
evidence.
- Add review notes:
- source gaps
- claims needing verification
- visual/video handoff needs
- platform constraints
- deviations from the writing decision, especially length or scope changes
- Add platform metadata, downstream needs,
writing_decision,
voice_contract,
voice_match_evidence, and quality_gate.voice_match. voice_match may be
passed only if evidence is present and failures are empty.
- Output
content_package.
- Stop before visual generation, video rendering, scheduling, or publishing.
Platform Draft Rules
WeChat
- Use
body_markdown.
- Prefer clear sections, evidence, and one central claim.
- Keep source references in
sources_used.
- Add
visual_needs for cover and body illustrations when useful.
- Fill
cover_copy: main_title is required — it is the article title
verbatim, do not shorten or reword it (the cover renders it across two lines
if long); emphasis, subtitle, tags are optional (leave empty when not
needed — the cover template enlarges the title and adds whitespace).
subject_theme is just a
one-line concept hint; the right-side illustration elements are left to the
image model (and it renders no text there). Do not let the image stage invent
cover copy — decide it here.
- Article title and
cover_copy.main_title: follow
references/title-spec.md — generate across 2-3 patterns, screen by the 5
铁律 + length red lines (platform-copy-specs.md: WeChat title ≤25;
cover_copy.main_title = the article title verbatim) + the 3-tier
exaggeration 尺度, then pick by judgment. If the article came from a WeChat
title_direction_gate, keep the confirmed direction's promise but rework the
final title from the finished正文. Offer the user 3-5 candidates with their
canonical 6-pattern label, computed length, and angle reason; never ship a number in the title unless it is verified,
unambiguous, and non-misleading.
- Fill
illustration_briefs for body images that carry article substance (steps,
comparisons, frameworks, key-point summaries): each gives a title (required)
and points (word-level items) — this copy is content and belongs here, not
invented at image time. Style is not chosen here; it follows the account visual
style registry (default + overridable). Default to information-bearing images,
not decorative ones.
- Avoid turning uninspected search snippets into factual paragraphs.
X
平台限制:
| 项目 | 免费账号 | Premium 账号 |
|---|
| 正文字数 | 280 字符 | 25,000 字符 |
| 图片数量 | 最多 4 张 | 最多 4 张 |
| 图片格式 | JPG / PNG / WebP / GIF | 同左 |
| 图片大小 | 单张 ≤ 5MB(GIF ≤ 15MB) | 同左 |
| 推荐图片尺寸 | 1200×675(16:9)或 1200×1200(1:1) | 同左 |
| 链接计字 | 每条链接固定计 23 字符(t.co 缩短) | 同左 |
内容规则:
- 默认写单条帖子,不做 thread(多条连发)
- 默认中文写作,除非用户明确要求英文
- 从长文改写时:提炼核心观点为一条帖子,配 1 张带文字的 16:9 封面图
- 280 字符限制下写中文更充裕(一个汉字 = 1 字符),适合信息密度高的表达
- 链接放在正文末尾,计入 23 字符
- 配图需求写入
visual_needs,指定 16:9 封面 + 中文标题文字
Weibo
- Use shorter commentary or article-summary style.
- Keep title and summary length constraints in
publish_notes when relevant.
Xiaohongshu
- Follow
references/xhs-copy-spec.md as the platform-specific copy contract.
- Choose one note type before drafting:
tutorial, checklist, pitfall,
tool_review, case_breakdown, or opinion_note.
- Produce separated
platform_title, cover_hook, card page copy, caption,
hashtags, and visual_needs.
- Keep the publish title display-safe around 20 Chinese characters and keep the
prepared body under the Xiaohongshu margin in
platform-copy-specs.md /
cmm-publishing (<= 950 chars before the trailing hashtag line when preparing
a browser publish package).
- Write for a 3:4 card set: one idea per card, default 1 cover + 4-8 content
cards, with at least one save-worthy artifact such as a checklist, comparison,
prompt, template, step list, or decision rule.
- Keep copy scannable and save-worthy; do not write dense article paragraphs.
- Do not stack emoji, fake urgency, unsupported rankings/numbers, vague
attribution, or slogan endings.
- Add
visual_needs with type: xhs_card_set; do not leave card text for the
image model to invent.
Blog
- Produce a local draft only.
- Do not call or require Notion publication.
- Mark
publish_notes with "external publication not requested".
Script
- Write spoken-language script or short-video draft only.
- Add
video_needs for later video production.
- Separate hook, main beats, ending, and caption text.
Quality Gate
Before output, check:
| Gate | Requirement |
|---|
claim_integrity | Major claims are supported or marked for review. |
platform_fit | Draft shape matches the platform and format. |
need_fit | Draft solves the user's real need, gives the stated reader takeaway, honors the one-sentence spine, and stays within the justified length/scope. |
drafting_instruction_followed | Light sanity check that the draft follows the pre-draft instruction package; do not add new creative requirements here. |
voice_cleanliness | Avoid generic AI filler, empty slogans, and unsupported certainty. |
voice_match | Draft follows the style profile's persona, tone, structure rules, and lexicon; must be proven by voice_match_evidence, not asserted. |
anti_ai_gate | Draft passes the style profile's anti-AI rules; failing passages rewritten. |
structure | Draft has a clear opening, body, and close for its format. |
handoff | Visual/video/publishing needs are explicit enough for downstream skills. |
Output
Always output a content_package:
content_package:
plan_id: ""
platform: ""
format: ""
title: ""
body_markdown: ""
summary: ""
variants: []
sources_used: []
visual_needs: []
video_needs: []
publish_notes: ""
fact_check_status: pending
review_notes: []
writing_decision:
user_real_need: ""
reader_takeaway: ""
article_type: ""
target_length: ""
length_reason: ""
one_sentence_spine: ""
must_include: []
must_exclude: []
scope_boundary: ""
drafting_instruction:
title_promise: ""
body_must_center_on: ""
article_shape: ""
personal_style_role:
source_profile: ""
voice: ""
rhythm: ""
stance: ""
lexicon: []
avoid: []
must_include: []
forbidden_drift: []
length_strategy: ""
source_boundaries: ""
wechat_context_gate:
platform_rules_loaded: false
user_profile_loaded: false
account_template_path: ""
account_template_loaded: false
article_type_template_loaded: false
calibration_style_checked: false
passed: false
source_files: []
style_selection: {}
voice_contract:
profile: ""
mode: ""
must_have: []
must_not: []
voice_match_evidence:
checked: false
passed: false
evidence: []
failures: []
quality_gate:
claim_integrity: ""
platform_fit: ""
need_fit: ""
drafting_instruction_followed: ""
voice_cleanliness: ""
voice_match: ""
anti_ai_gate: ""
structure: ""
handoff: ""
status: draft
Stop Conditions
Stop and ask before:
- Posting or scheduling anywhere.
- Writing to Notion, Feishu, Google Docs, or external systems.
- Calling paid APIs.
- Generating images or rendering videos.