/socialforge:assemble-document — Document Assembler
Create the final delivery manifest — a structured JSON file describing the complete monthly calendar, its posts, copy, and metadata. The manifest is the deliverable this skill produces; a formatted DOCX is a manual/optional step downstream (see below).
Manifest Structure
assemble_docx.js emits these sections into the JSON manifest:
- Title block (brand name, month, generation timestamp)
- Monthly overview (post count, platform breakdown, tier distribution, content-type distribution)
- Weekly sections:
- For each post: post id, date, title, tier, platforms, content type, copy option A, visual direction, creative mode, status
- Publishing schedule (date, day of week, post id, title, platforms)
Process
- Load calendar-data.json and status-tracker.json for the brand + month
- Group posts by week and merge in each post's tracked status and creative mode
- Build the manifest structure
- Save to
${CLAUDE_PLUGIN_DATA}/socialforge/output/{brand}/{month}/FINAL/00-Calendar-Document/{brand}-{month}-calendar.json (falls back to ~/socialforge-workspace/output/... when ${CLAUDE_PLUGIN_DATA} is unset)
AI-assistance note (delivery manifest)
Read ai_disclosure from brand-config.json (missing block = {"mode": "claude-surfaces", "text": null}) and decide whether the manifest carries the AI-assistance note:
- Run
python ${CLAUDE_PLUGIN_ROOT}/scripts/detect_surface.py --mode {mode} — its disclosure_applies field IS the decision. Fail-safe: an uncertain surface applies the note in claude-surfaces mode; skipping requires an AFFIRMATIVE non-Claude fingerprint. Never override the script's answer.
- When it applies, add to the manifest metadata:
"ai_assistance_note": "Creative produced with AI assistance under human review and brand approval gates." (or the brand's custom text verbatim). The default wording is vendor-neutral and claims only the review this pipeline actually performs — every post passed the approval chain.
- Record the decision either way:
"disclosure": {"applied": true|false, "mode": ..., "surface": ...} in the manifest — an unapplied note is a recorded choice, not an omission.
- Remind the user at handoff: platform-native AI-content labels (Instagram/TikTok/YouTube toggles) are the right place for per-post disclosure — flag which posts used AI generation so whoever publishes can set them.
Producing a DOCX (manual/optional)
No DOCX is generated automatically — the script reports docx package not available and emits JSON only. To produce a Word document, hand the manifest JSON to a document tool of your choice, or lay it out against assets/document-template/. Image previews are referenced by path in the manifest rather than embedded.
Timeout & Fallback
- Manifest assembly: 2-minute timeout for 30 posts.
1---2name: assemble-document3description: Assemble the final month-end delivery manifest — every approved post with its copy, creative files, platform variants, and metadata in one structured JSON handoff. Triggers on "/assemble-document", "assemble the delivery", "final document", "package the month", "client handoff file", "delivery manifest", or when all posts are approved and the month needs packaging. Runs after finalize-month; the output is what the client receives.4---56# /socialforge:assemble-document — Document Assembler78Create the final delivery manifest — a structured JSON file describing the complete monthly calendar, its posts, copy, and metadata. The manifest is the deliverable this skill produces; a formatted DOCX is a manual/optional step downstream (see below).910## Manifest Structure1112`assemble_docx.js` emits these sections into the JSON manifest:13141. Title block (brand name, month, generation timestamp)152. Monthly overview (post count, platform breakdown, tier distribution, content-type distribution)163. Weekly sections:17 - For each post: post id, date, title, tier, platforms, content type, copy option A, visual direction, creative mode, status184. Publishing schedule (date, day of week, post id, title, platforms)1920## Process211. Load calendar-data.json and status-tracker.json for the brand + month222. Group posts by week and merge in each post's tracked status and creative mode233. Build the manifest structure244. Save to `${CLAUDE_PLUGIN_DATA}/socialforge/output/{brand}/{month}/FINAL/00-Calendar-Document/{brand}-{month}-calendar.json` (falls back to `~/socialforge-workspace/output/...` when `${CLAUDE_PLUGIN_DATA}` is unset)2526## AI-assistance note (delivery manifest)2728Read `ai_disclosure` from brand-config.json (missing block = `{"mode": "claude-surfaces", "text": null}`) and decide whether the manifest carries the AI-assistance note:29301. Run `python ${CLAUDE_PLUGIN_ROOT}/scripts/detect_surface.py --mode {mode}` — its `disclosure_applies` field IS the decision. Fail-safe: an `uncertain` surface applies the note in claude-surfaces mode; skipping requires an AFFIRMATIVE non-Claude fingerprint. Never override the script's answer.312. When it applies, add to the manifest metadata: `"ai_assistance_note": "Creative produced with AI assistance under human review and brand approval gates."` (or the brand's custom `text` verbatim). The default wording is vendor-neutral and claims only the review this pipeline actually performs — every post passed the approval chain.323. Record the decision either way: `"disclosure": {"applied": true|false, "mode": ..., "surface": ...}` in the manifest — an unapplied note is a recorded choice, not an omission.334. Remind the user at handoff: platform-native AI-content labels (Instagram/TikTok/YouTube toggles) are the right place for per-post disclosure — flag which posts used AI generation so whoever publishes can set them.3435## Producing a DOCX (manual/optional)3637No DOCX is generated automatically — the script reports `docx package not available` and emits JSON only. To produce a Word document, hand the manifest JSON to a document tool of your choice, or lay it out against `assets/document-template/`. Image previews are referenced by path in the manifest rather than embedded.3839## Timeout & Fallback40- Manifest assembly: 2-minute timeout for 30 posts.