# /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:** `./references/dependencies/conversint-current/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 `./references/dependencies/conversint-current/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.
- **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.
- Read `./references/dependencies/conversint-current/research-thought-leadership/_inventory/articles.md`. Diff the RSS items against the existing `Substack URL` column (exact string match on the URL).
- 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.
- 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 `./references/dependencies/conversint-current/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.)
- 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).
- 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.