← Back to the library
Writing and communication

Article outlining

Develop, draft, and publish Conversint Consulting thought leadership. Four modes: 'outline' runs a 5-phase interactive outline workflow (Exploration → Story → Research+Positioning → Action Framework → Finalization) from a topic or raw ideas; 'draft' takes an outline and produces a full article in Conversint's voice (warm, conversational, second-person, no hype, no jargon) with a read-time check on every revision; 'linkedin' generates a brief 40–80 word LinkedIn link-post summary from a finalized article; 'substack-sync' pulls in-Substack edits back into the canonical local Markdown given a Substack post URL. Targets owner-operators, chiefs of staff, and other non-technical business leaders. Use for POV pieces, white papers, client advisories, LinkedIn longform, newsletter essays, and the publish-loop tail.

Works with the context you provideVersion 2.0.2Historical revision

# /thought-leadership — Conversint thought leadership pipeline

Four modes, one pipeline. Outline feeds draft; draft feeds the LinkedIn summary; Substack pull-sync brings post-publish edits back into the canonical local Markdown. All modes share voice rules and output conventions.

**Shared conventions:** Before choosing a mode, read `./references/dependencies/conversint-current/references/skill-operating-standards.md` and `./references/dependencies/conversint-current/references/output-paths.md`. This skill owns thought-leadership artifacts and the article inventory refresh; it does not auto-upload to Drive, and any Google Workspace action must follow `./references/dependencies/conversint-current/references/google-workspace-access.md` through the owning skill or helper.

When the user explicitly positions an article as a paid-campaign destination, assisted-conversion asset, or retargeting path, also read `./references/dependencies/conversint-current/references/digital-marketing-funnel-best-practices.md`. Do not make this reference part of an ordinary editorial article workflow.

**Pipeline (guide, not a forced order):**

``` outline → draft → (optional) compressed variant → linkedin summary → substack-sync ```

Each mode is independently runnable — the pipeline is the canonical happy path, not a sequence the user has to follow start-to-finish.

**Voice & banned terms:** See "Voice & Banned Terms" — and especially **"Voice anti-patterns (article and prose tics)"** — in `./references/dependencies/conversint-current/references/conversint-brand.md` before starting any mode. That section is the cross-skill source of truth for prose tics (*"here's a thing,"* posture moves, SaaS-vendor vocabulary, applause-line closers, etc.); the mode-specific references carry only the drafting-specific expansions. Where `conversint-brand.md` is the *prescriptive* "what to avoid," `./references/dependencies/conversint-current/references/thought-leadership-voice.md` is the *descriptive* companion — the recurring patterns the published Conversint articles positively do (how openings hook, central-metaphor threading, argument structure, sentence rhythm, how CTAs land), each backed by verbatim example phrases from the real pieces. Read it in `outline` and `draft` modes to match the house voice rather than re-deriving it, and run its pre-ship checklist before finalizing. The two files agree; this one shows the positive shape.

**Source citations:** Every external-fact claim in the outline or draft (statistics, analyst findings, case studies, regulatory facts, competitor moves) follows the four-step rule in `./references/dependencies/conversint-current/references/client-deliverable-standards.md` §4 — capture URLs as you research, cite inline at each restatement, list every source in a Research Sources section, and re-verify URL ↔ claim pairings before finalizing. The outline mode's Research Sources section is what carries the captured URLs forward into the draft.

**Client context integrity:** If the outline or draft references a specific named client, customer, or case study (beyond publicly reported facts about a well-known company), apply the **Client Context Integrity** protocol from `./references/dependencies/conversint-current/references/conversint-brand.md` before finalizing.

**Customer voice:** `conversint-admin/customer-voice/Customer Voice Evidence Ledger.md` is internal evidence. Use a verbatim `VOC-###` entry only when Patrick explicitly selects it and separately approves external use; otherwise use only generalized, non-attributable themes.

Target audience (all modes)

Owner-operators, chiefs of staff, and non-IT professionals navigating AI adoption. They are business-focused rather than technically trained, looking for practical application over theory, time-constrained, and seeking confidence and clarity.

Mode selection

Pick the mode from the first positional argument, or infer:

| First arg | Mode | Then load | |---|---|---| | `outline` | outline | `./references/outline.md` | | `draft` | draft | `./references/draft.md` | | `linkedin` | linkedin | `./references/linkedin-summary.md` | | `substack-sync` | substack-sync | `./references/substack-sync.md` | | *(looks like a topic / raw ideas / theme)* | outline | `./references/outline.md` | | *(looks like a complete outline — has section headers, word counts, research sources)* | draft | `./references/draft.md` | | *(a path matching `research-thought-leadership/*/*-outline.md`)* | draft | `./references/draft.md` | | *(a URL containing `substack.com` or a Substack custom domain)* | substack-sync | `./references/substack-sync.md` | | *(a path matching `research-thought-leadership/*/[slug].md` paired with the word "linkedin" or "summary")* | linkedin | `./references/linkedin-summary.md` |

If the input is ambiguous, ask the user which mode they want before loading any reference. Do not guess silently when a real outline vs. rough notes vs. a finalized article is unclear — the workflows are very different.

Shared output conventions

See `./references/dependencies/conversint-current/references/output-paths.md` for the canonical path table. All modes save to the same topic folder:

``` research-thought-leadership/[topic]/ ├── [topic]-research.md # optional research seed (from /research-usecase) ├── [slug]-outline.md # outline mode output ├── [slug].md # draft mode output (long version) ├── [slug]-short.md # optional compressed variant (on-demand from draft mode) └── [slug]-linkedin.md # LinkedIn summary mode output ```

Where `[topic]` is a short kebab-case subject label (e.g., `customer-support`, `lead-gen`) that co-locates every artifact for a subject. `[slug]` is the article's kebab-case slug. The compressed variant (`[slug]-short.md`) is generated only when the user explicitly requests it after the long draft is committed — see `./references/draft.md` § Compressed variant. The Substack pull-sync mode does not produce a new file; it updates `[slug].md` (or `[slug]-short.md`) in place.

**Filename rule:** No date or version suffix — git handles versioning; overwrite in place on re-run. If the topic folder already exists, reuse it; otherwise create it. If the topic is ambiguous, ask the user.

**After saving, commit to `main`:**

```bash ./references/dependencies/conversint-current/scripts/commit-md-to-main.sh \ "<path to the saved .md>" \ "<short message, e.g. 'Update article outline: [slug]' or 'Update article draft: [slug]'>" ```

The helper uses a temporary git worktree so the active branch's working tree is untouched, and skips the commit when `main` already has identical content. Return the **GitHub URL** from the helper's `GitHub URL:` output line as the primary result for the user.

**Do not auto-invoke `/gdrive`** — Google Drive upload is user-driven. If the user wants a Drive copy, they will run `/gdrive` themselves.

Final step (all modes): refresh the article inventory

Reached from the terminal step of every mode reference (`outline.md`, `draft.md`, `linkedin-summary.md`, `substack-sync.md`). Each mode reference explicitly routes here after returning the GitHub URL to the user — do not skip.

After saving and committing the mode's output, refresh `research-thought-leadership/_inventory/articles.md` against the Substack feed so the customer-facing skills (`/prep-lead`, `/exec-summary`, `/research-usecase`) stay current. The inventory is the source of truth those skills read when picking a "we wrote about this" reference.

  1. **Fetch the feed deterministically via Bash, not WebFetch.** WebFetch passes content through a summarizer model and will drop fields; the inventory matching relies on verbatim title / link / pubDate. Run:

```bash curl -fsSL https://conversint.substack.com/feed ```

Then parse the XML in the Read pass that follows — extract each `<item>`'s `<title>`, `<link>`, `<pubDate>`, and `<description>` verbatim from the raw XML.

  1. Read `research-thought-leadership/_inventory/articles.md`. Diff the RSS items against the existing `Substack URL` column (exact string match on the URL).
  1. For each Substack item with no matching row, append a new row to the table. Fill `Title` / `Substack URL` / `Published` from the RSS data verbatim.

**Capture `Substack Tags`** — the author-applied tags attached to the post on Substack. Record them verbatim (their display capitalization, comma-separated) so the inventory keeps a faithful provenance trail of how the piece was tagged on the publication. Source them in this order: 1. **RSS `<category>` elements** inside the item, if present — read the tag names straight from there. (As of this writing Substack does *not* emit `<category>` for these posts, so this is a forward-compatible check, not the common path.) 2. **The post page's preload JSON** (the reliable path today). `curl -fsSL` the `Substack URL`, find the `"postTags":[ … ]` array inside the `window._preloads` blob (the JSON there is backslash-escaped — `\"postTags\":[{\"…`), and read each entry's `name` field. A small Bash/Python extraction is cleaner than eyeballing the raw HTML.

If neither source yields tags, leave `Substack Tags` blank — never invent or back-fill a tag the post doesn't actually carry. `Substack Tags` is reference-only and sits **alongside** the curation columns; it does not replace them and does not count toward the curated-rows gate (see `articles.md` § Tagging conventions).

Then **propose** the curation columns by reading the article body and reasoning over its content plus the existing inventory rows for tag-style consistency. Source the body in this order: 1. Local draft at `research-thought-leadership/<topic>/<slug>.md` (or `<slug>-article.md`, or any sibling .md whose body title matches the Substack `<title>`). Use `Glob` over the topic folders to locate it. 2. If no local draft is found, fall back to `WebFetch` against the Substack URL with a prompt that demands the article body verbatim (same shape as substack-sync's primary fetch).

From the body, propose: - **Topic tags** — 3–6 kebab-case tags in customer-facing problem language, per the file's "Tagging conventions" section. Mirror style of the curated rows already in the inventory; don't invent jargon. - **Audience tags** — 2–4 kebab-case tags naming who the piece is written for. - **One-line summary** — one plain-English sentence per the file's "Tagging conventions" section. No marketing voice ("pioneering," "transformational," "deep dive into the strategic implications of...").

Also fill `Local draft path` if the local file was located in step 3.1 above; otherwise leave blank.

**Fallback for body unavailable** (WebFetch returned a paywall, network error, etc.): write the row with curation columns blank — it stays pending curation per the curated-rows gate and is invisible to consumer skills until Patrick edits it. Surface that to him explicitly so he knows to curate manually.

  1. If a row was appended, surface the values inline so Patrick can eyeball them: the captured `Substack Tags` plus the proposed `Topic tags`, `Audience tags`, `One-line summary`, and `Local draft path`. Remind him he can edit `research-thought-leadership/_inventory/articles.md` directly to override any column. Do not block; the file is committed-as-is. (If the body was unavailable and curation columns are blank, name that fact explicitly so he doesn't miss it.)
  1. If nothing new appeared on RSS, say so in one line and move on. This is the common case in `draft` mode (the freshly-saved piece isn't on Substack yet — it lands in the inventory next time this skill runs, after Patrick publishes).
  1. Commit the inventory change to `main` via `./references/dependencies/conversint-current/scripts/commit-md-to-main.sh` with message `Refresh TL article inventory from Substack RSS`. Skip the commit step if no rows were added.

Idempotent — re-runs add only what's new. Never modify or delete existing rows; tag curation is Patrick's, not the skill's.

Next

Load the mode-specific reference — `./references/outline.md`, `./references/draft.md`, `./references/linkedin-summary.md`, or `./references/substack-sync.md` — and follow it.