[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6K5C25JB1R8APMTG9S3ZNSX":3,"skill-same:01M6K5C25JB1R8APMTG9S3ZNSX":63},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":34,"linkOnly":35,"markdownContent":36,"markdownBody":37,"frontMatter":38,"refName":41,"commitSha":42,"skillDirectory":43,"forksCount":44,"repositoryHtmlUrl":45,"repositoryHomepageUrl":46,"ownerHtmlUrl":47,"ownerBlogUrl":46,"ownerDescription":48,"updatedAt":49,"install":50,"resources":62},"01M6K5C25JB1R8APMTG9S3ZNSX","finalize-month",null,"Finalize the month: package approved content into the delivery folder with copy files and manifest. \"package the month for the client\"","indranilbanerjee\u002Fsocialforge","indranilbanerjee","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1857369?v=4","01M6K5AJ210R87KXT6WF07RC4T","Indranil Banerjee","01M6K5AJ6FXW6Y1CDESBGX191P",44,"MIT","https:\u002F\u002Fgithub.com\u002Findranilbanerjee\u002Fsocialforge\u002Fblob\u002Fmain\u002Fskills\u002Ffinalize-month\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33],"finalize month","files","delivery","brand","for","true","package","manifest","with","high","folder","name","copy","client","content","2026-11-10 10:12:30",false,"---\nname: finalize-month\ndescription: \"Finalize the month: package approved content into the delivery folder with copy files and manifest. \\\"package the month for the client\\\"\"\nargument-hint: \"[--brand \u003Cname>] [--force]\"\neffort: high\nuser-invocable: true\ndisable-model-invocation: true\n---\n\n# \u002Fsocialforge:finalize-month — Month Finalizer\n\n> **Script location.** If your host does not set `${CLAUDE_PLUGIN_ROOT}`, the scripts are in this plugin's `scripts\u002F` folder, next to `skills\u002F`. Run them with Python 3.10 or newer: `python`, or `python3` where `python` is not found (macOS, many Linux systems).\n\nPackage all approved posts into the organized delivery folder structure.\n\nThe user starts this skill: it is not model-invocable (`disable-model-invocation: true`), because it copies the delivery, can upload it and send a completion message, and offers the scheduler hand-off. An orchestrator that reaches this step tells the user to run `\u002Fsocialforge:finalize` (or `\u002Fsocialforge:finalize-month`) and stops.\n\n## Execution gate\n\nPackaging copies and renames files, and steps 5-6 can upload to a Drive and send a completion message. After the Step 0 delivery audit passes, show an Execution Summary (posts packaged, any force-finalized posts, destination folder, whether a Drive upload and a notification will happen and to whom) and proceed only on an explicit `yes`; any other reply cancels with nothing written or sent. `--force` still needs the user to have typed it.\n\n## Pre-Finalization Check\n\n**Step 0 — run the delivery audit, before any packaging:**\n\n```bash\npython \"${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fdelivery_audit.py\" --brand {brand} --month {YYYY-MM}\n```\n\nIt re-derives the month's claims from the ledger and the disk: every status in the vocabulary, revision history landing on the recorded status, no ghost posts the calendar never knew, no gate bypassed on the way to delivery (`force_finalized` is surfaced loudly, not left as a buried flag), every FINAL post's referenced file existing and non-empty, the failure log loadable, and cost totals honest about incompleteness. **Exit 1 means the delivery is claiming something the disk does not support — resolve the findings before packaging, never around them.** The verdict lands in `delivery-audit.json` beside the tracker.\n\nThen:\n- All posts must be FINAL status (or --force to skip unapproved)\n  **WARNING:** `--force` bypasses ALL approval gates. Use only in emergencies, and **only when the user has typed `--force` (or explicitly said to force-finalize) in this conversation** — never add it on your own initiative, including when this skill was invoked without the user typing its command (hosts such as Codex ignore `disable-model-invocation`). All force-finalized posts are logged with `force_finalized: true` in status-tracker.json for audit trail — and the delivery audit reports every one of them as a violation the client-facing record must acknowledge.\n- All compliance checks passed\n- All required approvals obtained per approval-chain.json\n- Calendar document assembled\n\nIf any posts are not FINAL: \"3 posts still pending approval. Finalize anyway with --force, or resolve pending items first.\"\n\n## Final Folder Structure\n```\nFINAL\u002F\n├── 00-Calendar-Document\u002F\n│   └── {brand}-{month}-calendar.json   # delivery manifest; DOCX conversion is a manual step\n├── 01-Ready-to-Publish\u002F\n│   └── Week-{N}\u002F\n│       └── {date}-Post{id}-{title}\u002F\n│           └── {platform}\u002F\n│               ├── image-{WxH}.png\n│               ├── copy.txt\n│               └── preview.png\n├── 02-Carousels\u002F\n├── 03-Video-Production-Kit\u002F\n├── 04-Stories-Shorts\u002F\n├── 05-Review-Gallery\u002F\n├── 06-Publishing-Schedule\u002F\n└── 07-Production-Checklist\u002F\n```\n\n## Process\n1. Verify all approval gates\n2. Organize files into folder structure\n3. Generate publishing schedule (dates + times + platforms)\n4. Generate production checklist (remaining manual tasks)\n5. Upload to Google Drive (if connected)\n6. Send completion notification via Slack\u002Femail\n7. Remind the user: once the month has run, ingest its analytics export with\n   `\u002Fsocialforge:ingest-performance` — that is what lets next month's\n   `\u002Fsocialforge:ideate-month` compound measured wins instead of memory\n8. Only if the user asks: the optional scheduler hand-off below\n\n## Optional: hand off to a scheduler (opt-in)\n\nFinalizing is complete without this. Offer it only when the user asks and a scheduler connector (`~~scheduler`) is already connected; the catalog entry is `postiz` in `.mcp.json.connectors-reference`, and nothing connects by default. SocialForge never schedules or publishes on its own initiative.\n\n1. **Preconditions.** The Step 0 delivery audit passed and every post to be handed off is FINAL. A post that was force-finalized is handed off only after the user re-confirms that post by id.\n2. **Show the exact batch before any scheduler call**: per post, the id, the channel\u002Faccount, the date and time, the copy exactly as it will post, the media file, and which posts used AI generation so the platform-native AI-content label is set where it applies (`references\u002Fcontent-credentials-by-platform.md`).\n3. **Explicit approval for exactly that batch.** The approval names the posts and the times. Changing any post, channel or time is a new approval, and \"the folder looks good\" is not approval to schedule.\n4. **Say which action you are asking for.** The Postiz MCP's scheduling tool can schedule, save a draft, or publish immediately ([docs.postiz.com\u002Fmcp\u002Fintroduction](https:\u002F\u002Fdocs.postiz.com\u002Fmcp\u002Fintroduction), checked 2026-10-04). Default to a draft or a scheduled post; publish immediately only for a post the user named and said to publish now.\n5. **Record what the scheduler returned** (post ids, channel, time) next to `06-Publishing-Schedule\u002F`. If a call fails, report the failure; never retry blind and never say \"scheduled\" for a post whose call did not return success.\n\nConnector facts, checked 2026-10-04: Postiz is open source and self-hostable (AGPL-3.0, [github.com\u002Fgitroomhq\u002Fpostiz-app](https:\u002F\u002Fgithub.com\u002Fgitroomhq\u002Fpostiz-app)), connects to Claude through OAuth at the URL in the catalog entry ([postiz.com\u002Fclaude](https:\u002F\u002Fpostiz.com\u002Fclaude)), and is listed in Anthropic's plugin directory ([claude.com\u002Fplugins\u002Fpostiz](https:\u002F\u002Fclaude.com\u002Fplugins\u002Fpostiz)). Postiz's directory connector leaves out its media-generation tools, per Postiz's own page; SocialForge does not use them.\n","# \u002Fsocialforge:finalize-month — Month Finalizer\n\n> **Script location.** If your host does not set `${CLAUDE_PLUGIN_ROOT}`, the scripts are in this plugin's `scripts\u002F` folder, next to `skills\u002F`. Run them with Python 3.10 or newer: `python`, or `python3` where `python` is not found (macOS, many Linux systems).\n\nPackage all approved posts into the organized delivery folder structure.\n\nThe user starts this skill: it is not model-invocable (`disable-model-invocation: true`), because it copies the delivery, can upload it and send a completion message, and offers the scheduler hand-off. An orchestrator that reaches this step tells the user to run `\u002Fsocialforge:finalize` (or `\u002Fsocialforge:finalize-month`) and stops.\n\n## Execution gate\n\nPackaging copies and renames files, and steps 5-6 can upload to a Drive and send a completion message. After the Step 0 delivery audit passes, show an Execution Summary (posts packaged, any force-finalized posts, destination folder, whether a Drive upload and a notification will happen and to whom) and proceed only on an explicit `yes`; any other reply cancels with nothing written or sent. `--force` still needs the user to have typed it.\n\n## Pre-Finalization Check\n\n**Step 0 — run the delivery audit, before any packaging:**\n\n```bash\npython \"${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fdelivery_audit.py\" --brand {brand} --month {YYYY-MM}\n```\n\nIt re-derives the month's claims from the ledger and the disk: every status in the vocabulary, revision history landing on the recorded status, no ghost posts the calendar never knew, no gate bypassed on the way to delivery (`force_finalized` is surfaced loudly, not left as a buried flag), every FINAL post's referenced file existing and non-empty, the failure log loadable, and cost totals honest about incompleteness. **Exit 1 means the delivery is claiming something the disk does not support — resolve the findings before packaging, never around them.** The verdict lands in `delivery-audit.json` beside the tracker.\n\nThen:\n- All posts must be FINAL status (or --force to skip unapproved)\n  **WARNING:** `--force` bypasses ALL approval gates. Use only in emergencies, and **only when the user has typed `--force` (or explicitly said to force-finalize) in this conversation** — never add it on your own initiative, including when this skill was invoked without the user typing its command (hosts such as Codex ignore `disable-model-invocation`). All force-finalized posts are logged with `force_finalized: true` in status-tracker.json for audit trail — and the delivery audit reports every one of them as a violation the client-facing record must acknowledge.\n- All compliance checks passed\n- All required approvals obtained per approval-chain.json\n- Calendar document assembled\n\nIf any posts are not FINAL: \"3 posts still pending approval. Finalize anyway with --force, or resolve pending items first.\"\n\n## Final Folder Structure\n```\nFINAL\u002F\n├── 00-Calendar-Document\u002F\n│   └── {brand}-{month}-calendar.json   # delivery manifest; DOCX conversion is a manual step\n├── 01-Ready-to-Publish\u002F\n│   └── Week-{N}\u002F\n│       └── {date}-Post{id}-{title}\u002F\n│           └── {platform}\u002F\n│               ├── image-{WxH}.png\n│               ├── copy.txt\n│               └── preview.png\n├── 02-Carousels\u002F\n├── 03-Video-Production-Kit\u002F\n├── 04-Stories-Shorts\u002F\n├── 05-Review-Gallery\u002F\n├── 06-Publishing-Schedule\u002F\n└── 07-Production-Checklist\u002F\n```\n\n## Process\n1. Verify all approval gates\n2. Organize files into folder structure\n3. Generate publishing schedule (dates + times + platforms)\n4. Generate production checklist (remaining manual tasks)\n5. Upload to Google Drive (if connected)\n6. Send completion notification via Slack\u002Femail\n7. Remind the user: once the month has run, ingest its analytics export with\n   `\u002Fsocialforge:ingest-performance` — that is what lets next month's\n   `\u002Fsocialforge:ideate-month` compound measured wins instead of memory\n8. Only if the user asks: the optional scheduler hand-off below\n\n## Optional: hand off to a scheduler (opt-in)\n\nFinalizing is complete without this. Offer it only when the user asks and a scheduler connector (`~~scheduler`) is already connected; the catalog entry is `postiz` in `.mcp.json.connectors-reference`, and nothing connects by default. SocialForge never schedules or publishes on its own initiative.\n\n1. **Preconditions.** The Step 0 delivery audit passed and every post to be handed off is FINAL. A post that was force-finalized is handed off only after the user re-confirms that post by id.\n2. **Show the exact batch before any scheduler call**: per post, the id, the channel\u002Faccount, the date and time, the copy exactly as it will post, the media file, and which posts used AI generation so the platform-native AI-content label is set where it applies (`references\u002Fcontent-credentials-by-platform.md`).\n3. **Explicit approval for exactly that batch.** The approval names the posts and the times. Changing any post, channel or time is a new approval, and \"the folder looks good\" is not approval to schedule.\n4. **Say which action you are asking for.** The Postiz MCP's scheduling tool can schedule, save a draft, or publish immediately ([docs.postiz.com\u002Fmcp\u002Fintroduction](https:\u002F\u002Fdocs.postiz.com\u002Fmcp\u002Fintroduction), checked 2026-10-04). Default to a draft or a scheduled post; publish immediately only for a post the user named and said to publish now.\n5. **Record what the scheduler returned** (post ids, channel, time) next to `06-Publishing-Schedule\u002F`. If a call fails, report the failure; never retry blind and never say \"scheduled\" for a post whose call did not return success.\n\nConnector facts, checked 2026-10-04: Postiz is open source and self-hostable (AGPL-3.0, [github.com\u002Fgitroomhq\u002Fpostiz-app](https:\u002F\u002Fgithub.com\u002Fgitroomhq\u002Fpostiz-app)), connects to Claude through OAuth at the URL in the catalog entry ([postiz.com\u002Fclaude](https:\u002F\u002Fpostiz.com\u002Fclaude)), and is listed in Anthropic's plugin directory ([claude.com\u002Fplugins\u002Fpostiz](https:\u002F\u002Fclaude.com\u002Fplugins\u002Fpostiz)). Postiz's directory connector leaves out its media-generation tools, per Postiz's own page; SocialForge does not use them.\n",{"name":5,"effort":28,"description":7,"argument-hint":39,"user-invocable":40,"disable-model-invocation":40},"[--brand \u003Cname>] [--force]",true,"main","8a9265fce82b93b728230eab5cf054480f5d6cf2","skills\u002Ffinalize-month",9,"https:\u002F\u002Fgithub.com\u002Findranilbanerjee\u002Fsocialforge","https:\u002F\u002Findranil.in","https:\u002F\u002Fgithub.com\u002Findranilbanerjee","Builder across trustworthy AI, agentic systems, and marketing engineering. Security roots; focused on human capability amplified by software.","2026-11-08 01:03:55",{"source":8,"skillName":5,"commands":51,"prompt":61,"zipAvailable":40},[52,55,58],{"tool":53,"command":54},"npx","npx skills add indranilbanerjee\u002Fsocialforge --skill finalize-month",{"tool":56,"command":57},"bunx","bunx skills add indranilbanerjee\u002Fsocialforge --skill finalize-month",{"tool":59,"command":60},"pnpm","pnpm dlx skills add indranilbanerjee\u002Fsocialforge --skill finalize-month","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Findranilbanerjee\u002Fsocialforge\u002Fblob\u002Fmain\u002Fskills\u002Ffinalize-month\u002FSKILL.md",[],[64,93,115,141,159,188],{"skillNo":65,"name":66,"nameZh":6,"description":67,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":68,"categories":69,"keywords":75,"publishedAt":34},"01M6K5E21QEYHCT7Z2HA4AQ804","setup","One-time setup of image and video generation credentials, verified before use. \"set up my API keys\"","https:\u002F\u002Fgithub.com\u002Findranilbanerjee\u002Fsocialforge\u002Fblob\u002Fmain\u002Fskills\u002Fsetup\u002FSKILL.md",[70],{"categoryNo":71,"categoryName":72,"taxonomyType":73,"taxonomyTypeDesc":74},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[66,76,77,78,79,80,24,81,82,83,84,85,86,87,88,89,90,91,92],"video generation","api keys","verified","keys","my","reset","generation","time","fallback","up","use","Video","api","credentials","SET","status","image",{"skillNo":94,"name":95,"nameZh":6,"description":96,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":102,"publishedAt":34},"01M6K5DWRWPF1ZHZ93VE8Z1NB4","research-month","Turn supplied comment exports and competitor ads into a what's-working brief before planning a month. \"analyse these competitor ads and comments\"","https:\u002F\u002Fgithub.com\u002Findranilbanerjee\u002Fsocialforge\u002Fblob\u002Fmain\u002Fskills\u002Fresearch-month\u002FSKILL.md",[99],{"categoryNo":100,"categoryName":101,"taxonomyType":73,"taxonomyTypeDesc":74},"01JBSEEDCAT000000000000021","资料检索与研究",[103,104,105,106,22,107,108,109,110,111,112,30,28,24,113,114],"research month","research","csv","export","text","ads","brief","planning","screenshots","comments","posts","mm",{"skillNo":116,"name":117,"nameZh":6,"description":118,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":124,"publishedAt":34},"01M6K5DQ47966ZG9N916VA7Y68","render-carousels","Render multi-slide carousels from HTML templates into platform-ready images or PDF. \"build the carousel slides\"","https:\u002F\u002Fgithub.com\u002Findranilbanerjee\u002Fsocialforge\u002Fblob\u002Fmain\u002Fskills\u002Frender-carousels\u002FSKILL.md",[121],{"categoryNo":122,"categoryName":123,"taxonomyType":73,"taxonomyTypeDesc":74},"01JBSEEDCAT000000000000002","文档处理",[125,126,127,128,129,130,131,132,28,24,133,134,135,136,137,138,139,140],"render carousels","render","platform","type","id","carousel","post","multi","template","images","ready","html","slides","templates","PDF","build",{"skillNo":142,"name":143,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":145,"categories":146,"keywords":147,"publishedAt":34},"01M6K5DHDFMZAK4BN2QFEVM614","price-check","Price a generation run from live provider rates before any spend. \"how much will this cost\"","https:\u002F\u002Fgithub.com\u002Findranilbanerjee\u002Fsocialforge\u002Fblob\u002Fmain\u002Fskills\u002Fprice-check\u002FSKILL.md",[],[148,149,150,151,24,152,30,129,82,153,154,155,156,157,158],"check","price","price check","live","compare","provider","cost","model","how","batch","run",{"skillNo":160,"name":161,"nameZh":6,"description":162,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":163,"categories":164,"keywords":174,"publishedAt":34},"01M6K5DDGBCGTN4SBEHZD5G9H8","parse-calendar","Parse a content calendar or plan from DOCX, XLSX, Notion or pasted text into structured posts. \"load this month's calendar\"","https:\u002F\u002Fgithub.com\u002Findranilbanerjee\u002Fsocialforge\u002Fblob\u002Fmain\u002Fskills\u002Fparse-calendar\u002FSKILL.md",[165,166,169],{"categoryNo":122,"categoryName":123,"taxonomyType":73,"taxonomyTypeDesc":74},{"categoryNo":167,"categoryName":168,"taxonomyType":73,"taxonomyTypeDesc":74},"01JBSEEDCAT000000000000004","电子表格",{"categoryNo":170,"categoryName":171,"taxonomyType":172,"taxonomyTypeDesc":173},"01JBSEEDCAT000000000000034","行政与办公人员","PROFESSION","适用职业",[175,176,113,177,178,179,107,180,181,33,182,183,184,185,186,187,24],"parse calendar","calendar","URL","structured","content calendar","plan","file","notion","xlsx","docx","paste","path","load",{"skillNo":189,"name":190,"nameZh":6,"description":191,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":192,"categories":193,"keywords":194,"publishedAt":34},"01M6K5D9NZ6QEP1F5M9P8EXM7E","model-check","Find the best current model for a capability from the live catalogue and record its source. \"which model should we use\"","https:\u002F\u002Fgithub.com\u002Findranilbanerjee\u002Fsocialforge\u002Fblob\u002Fmain\u002Fskills\u002Fmodel-check\u002FSKILL.md",[],[195,155,148,196,23,197,24,198,30,151,199,153,86,200],"model check","source","which","kind","record","find"]