From jazzsequence-skills
Write, edit, or review Pantheon documentation. Applies Pantheon style guide, inclusive language guidelines, Diátaxis structure, and Google Developer Style Guide. Use when creating new docs, editing existing ones, reviewing PRs for style, or deciding how to structure content.
How this skill is triggered — by the user, by Claude, or both
Slash command
/jazzsequence-skills:pantheon-docs-writerThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
- Writing a new doc or guide from scratch
Before writing a single word, classify the content. All Pantheon docs fall into one of four quadrants:
| Quadrant | Orientation | User goal | Pantheon form |
|---|---|---|---|
| Tutorial | Learning | "Let me try this" | Paginated guide with numbered steps |
| How-to guide | Task | "How do I accomplish X?" | Guide or doc with clear steps |
| Explanation | Understanding | "Why does this work this way?" | Doc, conceptual, no step-by-step |
| Reference | Information | "What are the exact values/options?" | Doc, table/list-heavy, dry and complete |
Rule: A single document should serve one quadrant. Don't mix a tutorial with a reference. If you're covering both concepts and steps, split them.
Pantheon mapping:
contenttype: [guide]) in src/source/content/guides/contenttype: [doc]) in src/source/content/src/source/content/contenttype: [doc])src/source/content/FILENAME.mdcontenttype: [guide])src/source/content/guides/GUIDE-NAME/FILENAME.mdinnav: [true]; all other pages: innav: [false]title: (the guide name), each gets a unique subtitle:Every file requires frontmatter at the very top, wrapped in ---.
---
title: Title of the Doc or Guide
description: One sentence describing what this doc covers or accomplishes.
contenttype: [doc]
innav: [true]
categories: [category-slug]
cms: [--]
audience: [development]
product: [--]
integration: [--]
reviewed: "2024-06-01"
---
| Field | Required | Type | Notes |
|---|---|---|---|
title | yes | string | Title of doc or guide (shared across all guide pages) |
description | yes | string | One sentence summary |
contenttype | yes | array | [doc] or [guide] |
innav | yes | array | [true] for first/only page; [false] for guide subsections |
categories | yes | array | Content category slugs |
cms | yes | array | [wordpress], [drupal], [wordpress, drupal], or [--] |
audience | yes | array | [development], [agency], [business], [sysadmin], [marketing] |
product | yes | array | Specific Pantheon product or [--] |
integration | yes | array | Third-party integration name or [--] |
reviewed | yes | string | ISO date of last review: "2024-06-01" — always set to today when creating a new doc |
subtitle | no | string | Guide pages only — unique title for this page |
tags | no | array | Search tags |
contributors | no | array | GitHub usernames |
showtoc | no | boolean | true to show right-side table of contents |
## Before You Begin) — prerequisites only. Use a bulleted list.## for major steps, ### for subsections. Don't go deeper than ### unless unavoidable.## Troubleshooting) — if applicable. Error messages as ### headers, verbatim.## More Resources) — 3–5 links. Last section. Always present.## Before You Begin
Be sure that you have:
- An existing WordPress site on Pantheon, or [create](https://dashboard.pantheon.io/sites/create) one.
- [Terminus](/terminus) installed on your local computer.
- A [local clone](/guides/git/git-config#clone-your-site-codebase) of your site's codebase.
If the guide uses shell variables, add the export callout here (see Variables section below).
Error message headers are ###, written verbatim as they appear in the UI/terminal. This makes them findable by search.
### RedisException: Redis server went away
## More Resources
- [Getting Started with Terminus](/terminus)
- [Git on Pantheon Guide](/guides/git)
title: in frontmatter renders as the H1 — don't repeat it in the body#### to ####)**text**) — UI elements, navigation paths, and new terms on first introduction only. Not for general emphasis.*text*) — emphasis within prose. Used sparingly.\backticks``) — file names, directory paths, variables, commands, and output within sentences```bash, ```php, ```yaml```bash{promptUser: user} — adds the $ prompt automatically without copying it```bash{outputLines: 2-6} — marks those lines as non-copyable output```yaml:title=pantheon.yml[Terminus Guide](/terminus) not full URLs1. for every item (the site auto-numbers them)✓ for yes, ❌ for no<Popover> for column header tooltips if neededAlways orient the user before giving instructions. Don't say "Click the Backup tab" — first tell them where they are:
1. [Go to the Site Dashboard](/guides/account-mgmt/workspace-sites-teams/sites#site-dashboard).
1. Click the **Backup** tab.
Standard navigation links:
[Go to the Site Dashboard](/guides/account-mgmt/workspace-sites-teams/sites#site-dashboard)[Go to My Dashboard](/guides/account-mgmt/workspace-sites-teams/workspaces#switch-between-workspaces)[Go to the workspace](/guides/account-mgmt/workspace-sites-teams/workspaces#switch-between-workspaces)<!-- Info note -->
<Alert title="Note" type="info">
Use notes for important information the reader shouldn't miss.
</Alert>
<!-- Warning -->
<Alert title="Warning" type="danger">
Use warnings for critical info, especially things that can cause data loss.
</Alert>
<!-- Variable export -->
<Alert title="Exports" type="export">
This process uses [Terminus](/terminus) extensively. Set the variables `$site` and `$env`:
```bash{promptUser: user}
export site=yoursitename
export env=dev
```
Use for extraneous but useful info — troubleshooting details, pro tips, optional steps.
<Accordion title="Panel Title" id="unique-id" icon="wrench">
### Panel Content Header
Additional context or advanced instructions.
</Accordion>
<TabList>
<Tab title="WordPress" id="wp-example" active={true}>
WordPress-specific instructions here.
</Tab>
<Tab title="Drupal" id="d7-example">
Drupal-specific instructions here.
</Tab>
</TabList>
Before writing content that might already exist:
src/source/partials/ for existing partials on the topic<Partial file="partial-name.md" />src/source/partials/ and include via <Partial>Partial files don't need frontmatter.
Given two sites with slugs <Popover title="Slugs" content="URL-friendly descriptions for a site." /> `first-site` and `second-site`:
<ProductGroup>
<Product title="Product Name" link="/product-path">
Short description of this product.
</Product>
</ProductGroup>
Use <dfn> for new terms — they're indexed to the Glossary automatically:
<dfn id="unique-slug">Term</dfn>
When a guide requires the reader to substitute values (site names, env names, etc.), define them upfront with an export callout in "Before You Begin":
<Alert title="Exports" type="export">
Before we begin, set the variables `$site` and `$env` in your terminal:
```bash{promptUser: user}
export site=yoursitename
export env=dev
```
Then reference them consistently: $site, $env, $uuid, etc. (lowercase for variables, uppercase for constants).
Apply these rules throughout. Refer to /inclusive-language for full guidance.
| Avoid | Use instead |
|---|---|
| sanity check | validation, verification |
| crazy, insane | unexpected, surprising, baffling |
| blind to, turn a blind eye | unaware of, ignore |
| crippled, lame, crippling | broken, hindering, slow |
| OCD | meticulous, detail-oriented |
allowlist / blocklist (not whitelist / blacklist)main (not master) for default branch namesprimary / replica / secondary (not master / slave)legacy or exempt from (not "grandfathered in")Before delivering or committing any doc:
Structure
doc vs guide) and file locationreviewed set to today's dateRelease notes only
YYYY-MM-DD-slug.md and slug will produce the correct URLpublished_at set to an accurate ISO timestampdescription present and written as a complete sentenceaction-required category added if customer action is neededStyle
Inclusive language
Components
Mechanics
Release notes live in src/source/releasenotes/ and follow a completely different structure from docs and guides.
Include:
Do not include:
YYYY-MM-DD-short-slug.md
The filename determines the URL. 2026-06-15-terminus-4-4-0.md becomes /release-notes/2026/06/terminus-4-4-0. Use the date the change goes live or is announced — not the date you're writing the file.
Release notes use a distinct schema. Do not use contenttype, innav, audience, or other regular doc frontmatter fields.
---
title: "Short, specific title describing what changed"
published_date: "YYYY-MM-DD"
published_at: "YYYY-MM-DDTHH:MM:SSZ"
categories: [category-slug, category-slug]
description: "One sentence summary shown in listings and RSS."
---
| Field | Required | Notes |
|---|---|---|
title | yes | Specific and descriptive. Use quotes if it contains special characters. |
published_date | yes | ISO date: "YYYY-MM-DD" |
published_at | yes | Full ISO timestamp — reflects the actual publish time; drives RSS ordering. Format: "2026-06-15T14:00:00Z" |
categories | yes | One or more slugs from the list below |
description | yes | One sentence shown in listing pages and RSS feeds |
Choose from the slugs in src/source/releasenotescategories/releaseNoteCategories.json:
| Slug | When to use |
|---|---|
new-feature | New capabilities or improvements |
action-required | Customer must act to avoid disruption |
infrastructure | Platform/infrastructure changes |
security | Security fixes or updates |
wordpress | WordPress-specific changes |
drupal | Drupal-specific changes |
plugins | Pantheon-maintained WordPress plugin updates |
modules | Pantheon-maintained Drupal module updates |
tools-apis | Terminus, APIs, CLI tools |
user-interface | Dashboard/UI changes |
performance | Performance improvements |
deprecated | Features being phased out |
policy | Policy changes |
billing | Billing and finance |
account-management | Account/permissions changes |
migration | Migration-related updates |
documentation | Significant doc additions or changes |
nextjs | Next.js support changes |
content-publisher | Content Publisher updates |
general | Catch-all for changes that don't fit elsewhere |
Use multiple categories when appropriate: [wordpress, action-required].
Release notes use sentence case for all headings — capitalize only the first word and proper nouns. This is the opposite of regular docs.
## Explore new features in Pantheon's latest Drupal updates## Explore New Features in Pantheon's Latest Drupal UpdatesThe opening paragraph should summarize the core change and its benefit to the user. Don't bury the point.
Don't just name the thing — say what it does or why it matters.
Break substantial information into bullet points and short paragraphs. Don't pack multiple distinct benefits into a single run-on sentence.
End with or include a link to the relevant documentation:
For UI changes and step-by-step instructions, include screenshots. Images go in src/source/images/release-notes/.
Simple announcement:
Brief description of what changed and why it matters.
[Learn more in the documentation](/path/to/doc).
Action required:
Brief description of what changed.
## Action required
What the customer must do, by when, and what happens if they don't act.
[Upgrade instructions](/path/to/doc).
Version release (Terminus, plugin, module):
[Product Name X.Y.Z](link-to-github-release) is now available. One sentence on what's new.
## Key improvements in this release
- **Feature name** — what it does ([#PR](link))
- **Fix name** — what it fixes ([#PR](link))
## How to upgrade
Steps or link to upgrade documentation.
action-required category when customers must do something to avoid disruptionSite navigation is defined in src/components/omni-components/. Each section of the nav has its own TypeScript file. Navigation is not driven by frontmatter — you must explicitly add new pages to the appropriate omni-component file.
| File | Nav section |
|---|---|
get-started.ts | Get Started |
workflows.ts | Workflows / Develop |
go-live.ts | Go Live |
web-infrastructure.ts | Web Infrastructure / Platform |
account-management.ts | Account Management |
terminus.ts | Terminus |
security.ts | Security |
support.ts | Support |
Use simpleLink(path, title) to add a standalone page:
simpleLink("/your-doc-slug", "Your Doc Title"),
Use getGuideDirectory(relativePath, overrideTitle?) to add an entire multi-page guide. The path is relative to source/content/:
getGuideDirectory("guides/your-guide-name", "Your Guide Title"),
This reads the guide's directory and auto-generates nav entries from the files present. Guide sub-page nav titles come from the navtitle frontmatter field if present, otherwise from subtitle.
simpleLink("/parent-path", "Parent Title", [
simpleLink("/parent-path/child-one", "Child One"),
simpleLink("/parent-path/child-two", "Child Two"),
]),
Redirects are required whenever:
Redirects live in src/middleware.ts in the RedirectMap object near the top of the file. Add entries as "/old-path": "/new-path":
const RedirectMap: Record<string, string> = {
// ... existing entries ...
"/old/path/to/doc": "/new/path/to/doc",
};
Rules:
/old-path, not https://docs.pantheon.io/old-pathWhen a PR contains redirects:
| From | To |
|---|---|
| `/old-path` | `/new-path` |
| `/old-path/sub-page` | `/new-path/sub-page` |
When creating a new doc or editing an existing one:
{issue-number}-{short-description} (e.g., 10234-add-redis-guide)docs: add Redis configuration guide)src/middleware.tsUse Pantheon's canonical terms:
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
Applies a firm's KYC/AML rules grid to parsed onboarding records: assigns risk rating, checks required documents, outputs rule outcomes with citations, and routes for escalation.
Generates daily or weekly digests of activity from connected sources (chat, email, docs, tasks, CRM), highlighting action items, decisions, mentions, and project updates.
npx claudepluginhub jazzsequence/claude-skill-pantheon-docs-writer --plugin jazzsequence-skills