Write
Skill r-bart/scribetronic-plugin/plugins/scribetronic/skills/write
Master writing skill. Orchestrates the full pipeline (seed → draft → edit → slop-check → optional repurpose) for any post type — long-form (long-form-weekly-newsletter, long-form-monthly-devlog, long-form-hot-take, long-form-how-to, long-form-launch-retro, long-form-manifesto) or short-form (short-form-x-vs-y, short-form-listicle, short-form-observation, short-form-motivational, short-form-present-vs-future, short-form-thread-from-longform, short-form-carousel-li). Drafts live inside the active week's calendar directory. Invoke with `/write <type> "<seed>"` or just `/write` to be routed via interview. Interactive by default, autonomous with --auto.From its SKILL.md
npx -y skills add r-bart/scribetronic-plugin --skill writeAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
16.7 KB, ~4.2k tokens by cl100k_base, as published. Nobody here has run it
/write
Single entry point for the writing system. Loads the right templates, runs the pipeline, saves drafts inside the active week's calendar directory, and (for long-form) derives short-form repurposes.
Invocation
/write → router: 2-3 question interview, picks type
/write <type> → directly to that type's draft flow
/write <type> "<seed>" → with topic seed, skips topic interview
/write --from <file> → seed from a notes/idea file
/write --repurpose <draft.md> → skip everything, only run thread-from-longform
/write --edit <draft.md> → skip drafting, only run editing-pass + ai-slop-check
/write --list → show the 13 types with one-line guidance
Flags
| Flag | Effect |
|---|---|
| (none) | Default: interactive. Asks before each phase transition. |
--auto | Run all phases end-to-end without confirmation prompts. Output the final draft. |
--step | Alias for default (interactive). Explicit version. |
--draft-only | Stop after Phase 2 (Draft). Skip edit + slop check + repurpose. |
--no-repurpose | Run all phases except Phase 5 (Repurpose). |
--from <file> | Use the file's content as input/notes for the draft. |
--repurpose <file> | Jump to Phase 5 only. <file> must be an existing long-form draft. |
--edit <file> | Jump to Phases 3+4 only. <file> must be an existing draft. |
--ignore-agenda | Skip the agenda proposal in Phase 0; go directly to the type interview. |
--list | Print the 13 types with one-line "use when" guidance. Exit. |
Types (positional)
Long-form:
long-form-weekly-newsletter— Sunday long-form weekly recap/newsletter (the recurring Sunday default)long-form-monthly-devlog— reflective monthly recap, ~1200-2000 wordslong-form-hot-take— contrarian opinion, ~800-1500 wordslong-form-how-to— actionable guide, ~1500-3500 wordslong-form-launch-retro— post-launch breakdown with numbers, ~800-1500 wordslong-form-manifesto— vision/strategy piece, ~1500-3000 words
Short-form:
short-form-x-vs-y— comparison postshort-form-listicle— numbered list postshort-form-observation— single noticed thingshort-form-motivational— motivational post (use sparingly, max 1-2/mo)short-form-present-vs-future— temporal contrastshort-form-thread-from-longform— derives short-form pieces from existing long-form (alias for--repurpose-style flow when you want to start from a long-form file)short-form-carousel-li— LinkedIn carousel content
Pipeline
Phase 0 — Routing
If no type provided AND no --repurpose/--edit flag:
First, unless --ignore-agenda was passed, consult today's agenda via the active week's plan:
- Compute
current_week= ISO week of today usingdate +%G-W%V(note:%G, not%Y— required around year boundaries). Format isYYYY-WNN(e.g.2026-W18). - Look for
scribetronic/calendar/<current_week>/plan.md.- If file missing: resolver returns null (no week scaffolded). The fallback interview (below) should suggest
/agenda plan-week todaybefore continuing.
- If file missing: resolver returns null (no week scaffolded). The fallback interview (below) should suggest
- Find rows in plan.md where
Date== today ANDStatus==queued.- 0 matches → resolver returns null. Fall through to rules-only resolution per
/agenda's algorithm, then to the interview if still null. - 1 match → propose to the user:
"Today's slot is
{type}— '{seed}' (slug:{slug}). Proceed? (y / pick another / cancel)".y→ skip the interview; go to Phase 1 with thattype+seed+slug.pick another→ fall through to the interview.cancel→ exit.
-
1 matches → surface the conflict, list all rows, ask which one (or
pick another/cancel).
- 0 matches → resolver returns null. Fall through to rules-only resolution per
- The resolver is resilient — if
plan.mdis missing or malformed, it returns null. It will not throw.
Interview (fallback when no agenda slot, agenda declined, or --ignore-agenda):
Ask 2-3 questions, max:
- "Long-form or short-form?"
- (Long) "Is this about something you DID (devlog/retro/how-to) or something you THINK (hot-take/manifesto)?" (Short) "Comparing two things, listing items, sharing an observation, or repurposing a long-form piece?"
- (If still ambiguous) one final disambiguating question.
Then proceed to Phase 1 with the chosen type.
If type IS provided: skip Phase 0.
Phase 1 — Seed
Load context (mandatory order):
- Voice base (always). Resolve in this order:
a.
scribetronic/style/writing-style.mdin the project root, if it exists — user's personalized override. b. Otherwise, the bundledwriting-style/SKILL.mdtemplate. - The type's template file (e.g.,
long-form-hot-take/SKILL.md,long-form-weekly-newsletter/SKILL.md). - If short-form: also
short-form-voice-adjustments/SKILL.md.
Then:
- If
--from <file>was passed: read it as raw notes/seed. - If a
"<seed>"was passed positionally: treat it as the topic. - If neither: ask 2-4 type-specific questions per the template's "Workflow" section.
- Example for
long-form-hot-take: "What's the conventional wisdom you're disagreeing with? What's your alternative? Concrete failure modes?" - Example for
long-form-weekly-newsletter: "What did you ship this week? Any conversations/people moments? Insights from this specific week?" - Example for
long-form-launch-retro: "What launched? When? What were the numbers? Pre-launch expectation?"
- Example for
Stop after seed is captured. Confirm with user: "Ready to draft? (y / change seed / cancel)" — unless --auto.
Phase 2 — Draft
Generate draft following the template's structure exactly. Apply the voice rules loaded in Phase 1 (project override or bundled template).
Save path — drafts live inside the active week's calendar directory:
-
Compute
current_week=date +%G-W%V(formatYYYY-WNN). -
If
scribetronic/calendar/<current_week>/does NOT exist, refuse with the message:"No week scaffolded for
<current_week>. Run/agenda plan-week todayfirst."Do NOT auto-scaffold the week — that requires a newsletter seed and is owned by
/agenda plan-week. -
Determine the path:
- For
type == long-form-weekly-newsletter:scribetronic/calendar/<current_week>/newsletter.md - For all other types:
wherescribetronic/calendar/<current_week>/derivatives/<weekday>-<type>-<slug>.md<weekday>is today's weekday as a lowercase 3-letter abbreviation (mon/tue/wed/thu/fri/sat/sun). - Lazily create
derivatives/if it doesn't exist yet. - NO
-x/-li/-threads/-carouselsuffix in the filename. ONE file per derivative — platform lives in the file's frontmatter.
- For
Frontmatter — two shapes per Contract 6.
For long-form-weekly-newsletter at <week>/newsletter.md:
---
type: long-form-weekly-newsletter
status: draft
created: YYYY-MM-DD
week: YYYY-WNN
seed: "<first 80 chars of seed>"
length_words: <N>
---
For derivatives at <week>/derivatives/<weekday>-<type>-<slug>.md:
---
type: <one of the 7 short-form types>
status: draft
created: YYYY-MM-DD
week: YYYY-WNN
day: YYYY-MM-DD # date this derivative is targeting
platform: x | linkedin | threads | carousel
parent: newsletter # always
seed: "<first 80 chars>"
length_chars: <N>
---
published_date: YYYY-MM-DDis appended later by/write-publishon successful publish. Thepublishedstatus is owned by/write-publish—/writenever writes it.
Show the full draft to the user.
If interactive: ask "Continue to editing? (y / iterate draft / save & stop)".
If --auto: continue.
If --draft-only: stop here. Output draft path.
Phase 3 — Edit
Run editing-pass/SKILL.md against the draft. Apply changes inline.
Output: same file, edited. The pre-edit version is preserved as {filename}.draft.md (suffix .draft before .md) in the same directory so the user can recover the unedited version.
Update frontmatter status to edited.
Show the edits as a diff or as the new full version (user choice if interactive).
If interactive: "Continue to slop check? (y / iterate edit / save & stop)".
If --auto: continue.
Phase 4 — Slop check
Run ai-slop-check/SKILL.md against the edited draft.
Output: a report with issues by severity (HIGH / MEDIUM / LOW).
For HIGH issues: propose fixes inline. If interactive, ask before applying. If --auto, apply automatically and log.
For MEDIUM: surface, ask for decision (interactive) or apply if confidence is high (auto).
For LOW: just surface.
After fixes, re-run if any HIGH was fixed. Re-run cap: 2 passes total. If still HIGH after 2 passes, flag for manual review.
Update frontmatter status to ready (passes Phase 4 cleanly) or leave as edited (HIGH still unresolved after cap).
If interactive: "Mark as ready to publish? (y / iterate / save & stop)".
If --auto: continue.
Phase 5 — Repurpose (long-form only)
Skip if:
- Type is short-form.
--no-repurposeflag.- User declines in interactive mode.
Otherwise, derive short-form pieces from the just-finished long-form parent (the newsletter):
- Read
scribetronic/calendar/<current_week>/plan.md. - Find rows whose
Sourceisnewsletter(ornewsletter (thread)) AND whoseStatusisqueued. These are the planned derivatives for this week. - For each such row, generate one derivative draft using
short-form-thread-from-longform/SKILL.md. Save to:
where:scribetronic/calendar/<current_week>/derivatives/<weekday>-<type>-<slug>.md<weekday>is the row'sDay(lowercase 3-letter abbreviation),<type>is the row'sType,<slug>is the row'sSlug.
- Frontmatter follows Contract 6's derivative shape. The
platformfield is taken from the plan.md row'sPlatformcolumn.parent: newsletter. - If a derivative type proposed by Phase 5 has NO matching plan.md row:
- Interactive: ask the user for the platform (and confirm slug).
--auto: skip that derivative with a warning logged in the final output.
- Each derivative goes through Phase 4 (slop check) before save. Same severity handling, same re-run cap.
There is ONE file per derivative. The channel (X, LinkedIn, Threads, carousel) is recorded in the file's platform frontmatter — never in the filename suffix.
Phase 6 — Final output
Print:
✓ Long-form: scribetronic/calendar/<current_week>/newsletter.md
✓ Edited: yes
✓ Slop check: clean (or: 1 MEDIUM unresolved)
Derivatives:
- thu-thread-niches-are-dead (platform: x)
- fri-carousel-niches-are-dead (platform: carousel)
Ready to publish:
[ ] Final read-through aloud
[ ] Cross-platform cadence check (don't ship X+LI+Threads same day)
[ ] Schedule or post
Update frontmatter status to ready on the main draft (and on each derivative that passed Phase 4 cleanly).
Then update calendar bookkeeping (both files use markdown tables — see agenda/SKILL.md for the full schema):
-
history.md — append a row to the markdown table at
scribetronic/calendar/history.md:| YYYY-MM-DD | {type} | {slug} | ready | /write |Use today's date. Schema:
| Date | Type | Slug | Status | Source |. If the file or table is missing (first run), create it with the header documented inagenda/SKILL.md§ File contracts, then append. Append one row per finalized draft (the newsletter and each derivative). -
plan.md — for each finalized draft, find the row in
scribetronic/calendar/<current_week>/plan.mdwhoseSlugmatches the draft's slug, and set itsStatusfromqueuedtodrafted. Plan column schema:| Date | Day | Type | Slug | Platform | Source | Status |The only transition
/writeis allowed to make isqueued → drafted. ONE write per matched row. If no row matches: surface a warning (don't error — the user may have written off-plan).
Status-write ownership (do not violate):
/writewritesdrafted(to plan.md) andready(to history.md). Nothing else./write-publishownspublishedrows in history.md and thepublishedtransition on plan.md./agenda skipowns theskippedtransition on plan.md.
This avoids race conditions when multiple flows touch the same files.
Interactive prompts — phrasing rules
- Always offer 3 choices: continue (
y), iterate (change seed/iterate draft/ etc.), abort (save & stop). - Never ask open-ended "what would you like to do?" — too vague.
- After a phase produces output, show the output IN the chat (don't just say "draft saved"). User must see what was written.
- If user says "iterate", ask ONE specific question: "What should change?" — don't run a 5-question questionnaire mid-flow.
Slug rules
{slug} derivation, in priority order:
- Slug from the matched plan.md row (if Phase 0 routed via agenda).
- Explicit slug in seed (if user wrote one).
- First 4-6 meaningful words from seed → kebab-case.
- Auto from headline → kebab-case, max 60 chars.
Examples
/write
→ Phase 0: reads scribetronic/calendar/2026-W18/plan.md. Finds today's queued slot.
→ "Today's slot is `long-form-weekly-newsletter` — 'shipping fast is overrated...'. Proceed? (y / pick another / cancel)"
→ y → loads long-form-weekly-newsletter template + writing-style.
→ Drafts to scribetronic/calendar/2026-W18/newsletter.md. Edits. Slop-checks.
→ Phase 5 reads plan.md, derives the queued thread + carousel rows. Done.
/write long-form-hot-take "shipping fast is overrated when you have no audience"
→ Loads long-form-hot-take template + writing-style.
→ Asks: "Whose advice are you disagreeing with? What's your alternative?"
→ Drafts to scribetronic/calendar/2026-W18/derivatives/mon-long-form-hot-take-shipping-fast-overrated.md.
→ Edits. Slop-checks. Repurpose? → derives matching plan.md rows.
/write --from scribetronic/ideas/idea-launch-retro.md
→ Reads file. Auto-detects type if possible (else asks).
→ Drafts using file as seed, into the active week's directory.
/write --repurpose scribetronic/calendar/2026-W18/newsletter.md
→ Skips Phases 0-4. Reads same week's plan.md, generates queued derivatives.
/write --edit scribetronic/calendar/2026-W18/derivatives/wed-short-form-thread-from-longform-niches-are-dead.md
→ Runs editing-pass + ai-slop-check on existing draft only.
/write --auto long-form-launch-retro "Product #2 — Boilerplate kit"
→ Asks zero questions beyond seed details. Runs end-to-end. Outputs final.
/write --list
→ Prints 13 types with one-line "use when" each.
Anti-patterns
- Don't run any phase without loading the voice base first (Phase 1 step 1: project-local override
scribetronic/style/writing-style.mdif present, else bundledwriting-style/SKILL.md). The voice base is non-negotiable. - Don't skip the seed interview for ambiguous types — the 2-4 quick questions save 10 minutes of bad draft.
- Don't auto-fix MEDIUM slop issues without asking unless
--auto. - Don't generate a draft + 4 derivatives in one phase. Repurpose is its own phase, optional, separate output.
- Don't write outside
scribetronic/calendar/<current_week>/. The week directory is the unit of organization. - Don't append
-x/-li/-threads/-carouselto filenames. ONE file per derivative; platform is in frontmatter. - Don't auto-scaffold a missing week directory. Refuse and instruct the user to run
/agenda plan-week today.
Failure modes
- No week scaffolded: refuse with a message pointing to
/agenda plan-week today. Do not create the directory. - User asks for a type that doesn't exist: suggest the closest match from the 13. Don't invent.
- No seed and
--auto: abort with error.--autorequires a seed (positional or--from). - Type is long-form but user wants only a thread: suggest
/write short-form-thread-from-longformor/write --repurpose <file>instead. - Edit conflicts (user already modified the draft between phases): detect via mtime; ask before overwriting.
- Slug not in plan.md at Phase 6: warn ("off-plan draft — no plan.md row updated") but still complete the run and append to history.md.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.