# Cmm Content Writing

> 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,…

- **Type:** Skill
- **Install:** `agentstack add skill-chemny-cmm-content-factory-cmm-content-writing`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [chemny](https://agentstack.voostack.com/s/chemny)
- **Installs:** 0
- **Category:** [Agent Skills](https://agentstack.voostack.com/c/agent-skills)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [chemny](https://github.com/chemny)
- **Source:** https://github.com/chemny/cmm-content-factory/tree/main/skills/cmm-content-writing

## Install

```sh
agentstack add skill-chemny-cmm-content-factory-cmm-content-writing
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# 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`:

```yaml
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/.yaml`.
- User profile: `~/.cmm/profile/.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

1. Validate the `content_plan`.
2. Resolve `content_plan.style_selection`: load the writing template and the
   user profile (or neutral mode).
3. 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.
4. 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:

   ```yaml
   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.
5. 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`.
6. 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:

   ```yaml
   personal_style_brief:
     source_profile: ""
     account_template: ""
     opening_strategy: ""
     core_judgment: ""
     practitioner_perspective:
       stance_type: ""        # observer_judgment | hands_on_experience | workflow_practitioner | user_advisor
       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.
7. 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:

   ```yaml
   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.
8. Choose one primary `platform` and `format`.
9. 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.
10. 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.
11. 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 ans

…

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [chemny](https://github.com/chemny)
- **Source:** [chemny/cmm-content-factory](https://github.com/chemny/cmm-content-factory)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-chemny-cmm-content-factory-cmm-content-writing
- Seller: https://agentstack.voostack.com/s/chemny
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
