Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Draft new or updated Supabase docs content for a feature or launch, grounded in Linear (the ticket plus its product/PM context), a read of the actual code, and the docs style guide once one exists. Use when asked to write docs for a new feature, a launch (e.g. Select 2026), or a Linear ticket that needs net-new content rather than a bug fix. Not for implementing existing docs bug reports — use work-linear-issue for that.
.claude/skills/supabase-write-the-docs/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-06 | ✗→✓ | ▲ Improved | 69% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 60% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 894% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 242% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 305% | 0% |
Drafts net-new Supabase docs content (or product-grounded rewrites) for a feature or launch. Distinct from work-linear-issue, which implements and fixes existing docs tickets, and from edit-the-docs, which restructures and tightens pages that already exist without gathering net-new product intent. This skill is for the case where the content doesn't exist yet (or must be rewritten from intent + code), grounded in four inputs rather than guessed.
ask-the-docs and audit-docs-ia rather than re-deriving that knowledge here.edit-the-docs instead.Four inputs, read in this sequence (sequence, not priority; Linear remains the product-intent source and code remains the behavior source per rule 2 and Phase 1 step 3):
apps/docs/CONTRIBUTING.md and apps/docs/WORD_LIST.md for voice, structure, and terminology. If those don't cover the case, fall back to the nearest comparable existing page under apps/docs/content/ and say explicitly: _"no dedicated style guide yet — following the precedent of <page>."_ See reference/style-fallback.md.pm-the-docs (Frame) and ask-the-docs when Shape/IA is unsettled. Resume only after product intent exists — never invent positioning, and never run Frame/Shape inside this Draft skill.supabase/supabase PR — its diff and description are the most precise "what actually shipped" source, more precise than a general codebase read. If no PR is linked, locate the feature directly in supabase/supabase (or the product's own repo), and apply ask-the-docs's reuse/minimalism lens: understand what exists before describing it. When behavior spans services (CLI, Auth, migrations, platform, …), follow pm-the-docs → universe-lookup capability gate (universe when accessible, else OSS public search / linked repos — not ask-the-docs). If code and PRD disagree, the code wins for behavior claims — flag the mismatch rather than silently picking one.Summarize all four back to the requester before drafting: what's confirmed, what's product intent vs. shipped behavior, what's still a gap. Stop and ask if a real gap would change the draft's structure or scope.
Before drafting, classify what's actually being asked for against apps/docs's real content types (see ask-the-docs's app-map.md "Content types" table, and reference/content-type-gate.md here):
content/guides/. This is what this skill drafts.content/troubleshooting/, sometimes synced from GitHub issues. Also in scope.spec/ (OpenAPI, SDK YAML, CLI config) → features/docs/generated/**. Not hand-authored via the standard MDX path. If the ask is actually reference-type content (a new API endpoint, config option, or SDK method that needs a reference entry), stop drafting MDX — it would diverge from or get silently overwritten by the generator. Instead point to the spec/codegen pipeline (apps/docs/spec/, apps/docs/generator/; see ask-the-docs's management-api-reference.md for the OpenAPI-specific flow) and say so explicitly rather than producing a page that looks done but isn't the real fix.When in doubt, ask ask-the-docs rather than guessing — this classification is the one call in this skill most likely to be wrong if made from outside knowledge of the app.
apps/docs MDX conventions (component usage, frontmatter, code sample wiring) — see ask-the-docs for the pipeline details rather than re-deriving them.audit-docs-ia's nav/IA knowledge rather than guessing a nav slot.ask-the-docs/audit-docs-ia rather than assuming a page is discoverable just because the file exists in the right folder.apps/docs/WORD_LIST.md when introducing or reviewing technical terms, UI actions, abbreviations, and potentially ambiguous language during drafting. This targeted search supplements, but does not replace, the full-file compliance check in Phase 2.5.apps/docs/content/_partials/ instead of copying it. For nav wiring, partials, and file placement, see ask-the-docs's app-map.md and federated-docs.md.Before handing off, confirm:
test-the-docs (optional; Docker Compose sandbox — stack profile for DB/API, examples profile for example-app)Re-read apps/docs/CONTRIBUTING.md and apps/docs/WORD_LIST.md in full before handoff, not just the sections searched during drafting. When a dedicated style guide lands in the repo, extend this checklist to cover it too.
(Optional), not prose asidesWORD_LIST.md (including any terms flagged as imprecise, not just spelling/capitalization)This skill stops at a reviewable draft. It does not open worktrees or PRs itself:
test-the-docs when the draft includes runnable procedural snippets. Ask before starting verification. Gate prerequisites per artifact class (Docker Compose stack profile for DB/API artifacts; examples profile / Node in-runner for example-app). If declined, or a required prerequisite for that class is missing, record deferred for those artifacts only and continue. When accepted, attach the verification report to the PR body / self-review note.review-the-docs local self-review (lint/build/classify).create-pull-request (and work-linear-issue if the ticket needs a full worktree+PR flow) for the actual PR mechanics. Carry the Phase 1/2 flagged-assumptions list forward explicitly into that handoff — it belongs in the PR description (e.g. a "needs review" section) so a reviewer sees it, not just as an inline comment buried in the draft.proof-it-works as the next step rather than capturing evidence here.review-the-docs local self-review: pnpm lint:mdx, pnpm build:guides-markdown where applicable, and anchor checks per reference/drafting-mechanics.md.apps/docs/CONTRIBUTING.md, apps/docs/WORD_LIST.md, reference/style-fallback.mdedit-the-docspm-the-docs's reference/write-the-docs-checklist.mdpm-the-docs → universe-lookuptest-the-docsask-the-docs, audit-docs-iacreate-pull-request, work-linear-issueproof-it-works| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 12,231 | 8,927 | -27% | 1 | 1 | 0% | 314 | 4,215 | +1242% | 0 | 0 | — |
case-02 | fail→fail | 25,318 | 9,720 | -62% | 1 | 1 | 0% | 4,035 | 4,376 | +8% | 0 | 0 | — |
case-03 | fail→fail | 7,513 | 9,340 | +24% | 1 | 1 | 0% | 454 | 4,239 | +834% | 0 | 0 | — |
case-04 | fail→fail | 15,513 | 17,716 | +14% | 1 | 1 | 0% | 2,847 | 4,464 | +57% | 0 | 0 | — |
case-05 | pass→pass | 11,307 | 9,439 | -17% | 1 | 1 | 0% | 1,784 | 5,079 | +185% | 0 | 0 | — |
case-06 | fail→pass | 21,206 | 8,638 | -59% | 1 | 1 | 0% | 3,103 | 5,234 | +69% | 0 | 0 | — |
case-07 | fail→fail | 19,865 | 23,608 | +19% | 1 | 1 | 0% | 3,183 | 6,672 | +110% | 0 | 0 | — |
case-08 | fail→fail | 16,408 | 10,128 | -38% | 1 | 1 | 0% | 2,437 | 4,544 | +86% | 0 | 0 | — |
case-09 | pass→pass | 4,387 | 15,465 | +253% | 1 | 1 | 0% | 723 | 6,316 | +774% | 0 | 0 | — |
case-10 | fail→pass | 31,019 | 37,726 | +22% | 1 | 1 | 0% | 6,615 | 10,603 | +60% | 0 | 0 | — |
case-11 | fail→fail | 14,723 | 10,156 | -31% | 1 | 1 | 0% | 2,598 | 4,308 | +66% | 0 | 0 | — |
case-12 | pass→pass | 10,074 | 7,875 | -22% | 1 | 1 | 0% | 1,593 | 4,923 | +209% | 0 | 0 | — |
case-13 | fail→fail | 13,533 | 12,162 | -10% | 1 | 1 | 0% | 2,058 | 4,339 | +111% | 0 | 0 | — |
case-14 | fail→pass | 4,449 | 15,312 | +244% | 1 | 1 | 0% | 634 | 6,304 | +894% | 0 | 0 | — |
case-15 | fail→fail | 15,035 | 8,807 | -41% | 1 | 1 | 0% | 2,174 | 5,109 | +135% | 0 | 0 | — |
case-16 | fail→pass | 16,898 | 6,186 | -63% | 1 | 1 | 0% | 1,412 | 4,836 | +242% | 0 | 0 | — |
case-17 | pass→pass | 10,857 | 5,151 | -53% | 1 | 1 | 0% | 1,581 | 4,546 | +188% | 0 | 0 | — |
case-18 | fail→pass | 8,537 | 12,861 | +51% | 1 | 1 | 0% | 1,435 | 5,812 | +305% | 0 | 0 | — |
case-19 | fail→fail | 11,229 | 10,228 | -9% | 1 | 1 | 0% | 2,087 | 4,403 | +111% | 0 | 0 | — |
case-20 | pass→pass | 12,749 | 6,512 | -49% | 1 | 1 | 0% | 1,924 | 4,557 | +137% | 0 | 0 | — |
case-21 | fail→pass | 13,090 | 4,123 | -69% | 1 | 1 | 0% | 1,914 | 4,422 | +131% | 0 | 0 | — |
case-22 | pass→pass | 7,747 | 11,607 | +50% | 1 | 1 | 0% | 1,058 | 4,887 | +362% | 0 | 0 | — |
case-23 | fail→pass | 6,647 | 15,080 | +127% | 1 | 1 | 0% | 790 | 4,893 | +519% | 0 | 0 | — |
case-24 | fail→fail | 11,506 | 8,821 | -23% | 1 | 1 | 0% | 729 | 4,400 | +504% | 0 | 0 | — |
case-25 | fail→fail | 16,111 | 10,293 | -36% | 1 | 1 | 0% | 2,680 | 4,272 | +59% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 25 cases were attempted, and 15 counted toward the lift figure. The other 10 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +28 percentage points is the difference between those two pass rates over the 15 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.