Skip to content

docs(spf): describe pr skill#1624

Open
cjpillsbury wants to merge 5 commits into
mainfrom
docs/spf-describe-pr-skill
Open

docs(spf): describe pr skill#1624
cjpillsbury wants to merge 5 commits into
mainfrom
docs/spf-describe-pr-skill

Conversation

@cjpillsbury

@cjpillsbury cjpillsbury commented May 28, 2026

Copy link
Copy Markdown
Collaborator

TL;DR

Adds /spf-describe-pr — a new agent skill that drafts reviewer-oriented PR descriptions for SPF-area PRs. Eight-section structure (TL;DR → How to read → Smoke test → What changed → Decisions → Callouts → Breaking → Tests), five-label depth grid (scope × intensity), smoke-test section with a human-in-the-loop proposal pattern, link discipline that survives merge. Methodology validated by applying the skill manually to rewrite #1584 and #1605 descriptions before shipping.

Also "smuggles in" a long-pending rename: the SPF-specific behavior-workflow skills get a consistent spf- prefix (refactor-behaviorspf-refactor-behavior, merge-behaviorsspf-merge-behaviors, split-behaviorspf-split-behavior), with cross-reference propagation across 6 sibling skills, the README, and 2 design docs.

No runtime impact. Documentation + Claude Code skills only.

For reviewers — how to read this PR

No runtime; the substantive new content is one new skill file. Everything else is the rename cascade.

Design doc cross-ref cascade (skim or skip)

internal/design/spf/conventions/behaviors.md (+6/−6), internal/design/spf/features/clusters.md (+1/−1) — token swap propagating the skill rename; no semantic change.

Agent skills (focus on the new skill)

Skim file: .claude/skills/spf-describe-pr/SKILL.md (+770, new) — the PR's load-bearing artifact. Read prose for: eight-section structure, five-label depth grid ([Read fully] / [Targeted careful read] / [Skim file] / [Skim structure only] / [Skim or skip]), Smoke-test discipline (proposal pattern, no fabrication, no hard-coded hostname), Compression / Link / Cursor-Bugbot / Stacked-PR / Carry-forward disciplines, Audit-pattern checklist, Common-pitfalls list.

Skim or skip:

  • 3 renamed skills (spf-refactor-behavior, spf-merge-behaviors, spf-split-behavior) — directory + frontmatter name: + body token swap; no semantic change
  • 6 sibling skills with cross-reference updates (spf-create-behavior, spf-document-feature, spf-document-use-case, spf-implement-feature, spf-implement-use-case, spf-update-behavior) — token swap only
  • .claude/skills/README.md (+6/−4) — quick-reference row + skills-table entries

Smoke test

No reviewer-actionable smoke test for this PR — skill-only / docs-only changes with no runtime surface. The skill's methodology was validated by applying it manually to the descriptions of #1584 and #1605 before this PR shipped; reviewers wanting to test-drive can run /spf-describe-pr <pr-num> against any open SPF-area PR.

What changed — by surface

/spf-describe-pr skill — eight-section structure. TL;DR → For reviewers (how to read) → Smoke test → What changed → Notable design decisions → Reviewer callouts → Breaking → Test plan. Smoke test sits at section 3 (high in the order) so a reviewer who can confirm the change works in 30 seconds reads the rest with different eyes than one who can't. Each section has explicit rules for shape, scope-narrowing, and what to cut.

Five-label depth grid. Per-file labels in How to read live on a 2D grid: scope of attention × intensity of attention. [Read fully] / [Targeted careful read] / [Skim file] / [Skim structure only] plus a fifth tier [Skim or skip]. Explicit rule against medium-tier labels like [Spot-check] — they collapse into the four cells, and the per-file Look for prose carries mode-of-attention nuance.

Smoke-test discipline with human-in-the-loop. The skill scans the diff for smoke-test signals (sandbox templates touched, demo presets changed, new observable behaviors, bug fixes with user-visible signatures) but cannot reliably synthesize meaningful URLs + observables. Mandates an AskUserQuestion-based proposal pattern where the author confirms URL + source + observables before the section is written. Explicit guidance against fabricating smoke tests when none applies (skill-only / docs-only / internal refactors) — use the explicit "no smoke-test applicable" note when reviewers might expect one and look for it.

Bucket-3-friendly framing for docs/skill-only PRs. The bucket calibration (Runtime / Design docs / Agent skills) anticipates PRs that mix categories; for an all-Bucket-3 PR like this one, the audit-pattern checklist and bucket-framing rules still apply but Bucket 1 is omitted entirely. This PR is itself the first worked example.

SPF-prefix rename. merge-behaviors → spf-merge-behaviors, refactor-behavior → spf-refactor-behavior, split-behavior → spf-split-behavior brings the behavior-workflow skills into line with the existing SPF-namespace convention (spf-create-behavior, spf-document-feature, etc.). Token swap with no semantic change; propagates frontmatter name:, cross-references in 6 sibling skills, the README skills table, and 2 design docs in internal/design/spf/.

Notable design decisions

  • Smoke test as section 3, not a subsection of Test plan. Reviewers can confirm "does this work in my hands?" before reading 800 lines of design narrative; that confirmation changes how they read the rest. Alternative considered: Smoke test as a subsection of Test plan (section 8). Rejected because reviewers naturally read top-down — burying the smoke-test at the bottom defeats its purpose. Authors writing only a Test-plan checklist line ("Manual sandbox verification") give reviewers a description rather than a runnable URL.

  • Smoke test is human-in-the-loop, not skill-synthesized. The skill scans the diff for candidates but explicitly asks the user to confirm URL + source + observables via AskUserQuestion before writing the section. Alternative considered: the skill picks defaults (closest-matching sandbox template + first manifest in some source registry). Rejected because the wrong URL or observable burns reviewer time worse than a missing section, and the author always has context the skill doesn't.

  • Path-only smoke-test URLs, no hostname. Reviewers append the path to whichever host they use — local Vite, Vercel preview, Netlify preview, etc. Alternative considered: hard-code the Vercel preview-URL convention. Rejected because deploy-preview conventions vary per project and per PR, and committed URLs rot when redeploys happen.

  • Rename SPF-specific skills to spf- prefix. Brings merge-behaviors, refactor-behavior, split-behavior into line with spf-create-behavior, spf-document-feature, etc. Alternative considered: leave them as-is. Rejected because the naming inconsistency obscures the SPF-namespace boundary — a reader scanning .claude/skills/ should be able to identify which skills are SPF-specific vs. cross-cutting (docs, git, commit-pr) from the file names alone.

  • Bundle the rename with the new skill in one PR (not split). The rename ("smuggled in") rides on the same branch as the new skill. Alternative considered: two PRs (skill first, rename second). Rejected because both are documentation-only with zero merge-conflict risk, and a single squash-commit on main keeps history compact.

Reviewer callouts — known limitations

Breaking changes

The three skill renames (/refactor-behavior/spf-refactor-behavior, etc.) don't break any committed code but may break user muscle memory or saved local Claude Code commands. The old names are gone — no aliasing shim. SPF stays alpha; no public-API surface affected.

Test plan


Note

Low Risk
Documentation and agent-skill changes only; slash-command renames may break saved workflows but do not affect shipped product code.

Overview
Adds /spf-describe-pr, a large new Claude skill that tells agents how to draft reviewer-oriented SPF PR bodies (eight sections, runtime/design/skills buckets, five depth labels, smoke-test + link/compression rules, user check-in before gh pr edit).

Renames the behavior workflow skills to the shared spf- namespace (refactor-behaviorspf-refactor-behavior, merge-behaviorsspf-merge-behaviors, split-behaviorspf-split-behavior) and propagates those command names through sibling skills, .claude/skills/README.md, and internal/design/spf/conventions/behaviors.md / features/clusters.md.

No runtime or library code — agent skills and internal design doc cross-refs only.

Reviewed by Cursor Bugbot for commit c434682. Bugbot is set up for automated code reviews on this repo. Configure here.

cjpillsbury and others added 2 commits May 28, 2026 08:22
Reviewer-oriented PR-description discipline for SPF-area PRs.
Bucket-calibrated reading order (Runtime / Doc cascades / Agent
skills), five-label depth set (scope × intensity), smoke-test
section with proposal pattern (human-in-the-loop URL + observables),
choice/alternative/why decisions, link discipline that survives
merge. Methodology validated via #1584 and #1605 description
rewrites.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bring merge-behaviors → spf-merge-behaviors,
refactor-behavior → spf-refactor-behavior,
split-behavior → spf-split-behavior into line with the existing
SPF-namespace convention. Updates frontmatter `name:`, cross-
references across sibling skills (spf-create-behavior,
spf-document-feature, spf-document-use-case, spf-implement-feature,
spf-implement-use-case, spf-update-behavior), and the README skills
table.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented May 28, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
v10-sandbox Ready Ready Preview, Comment May 28, 2026 5:39pm

Request Review

@netlify

netlify Bot commented May 28, 2026

Copy link
Copy Markdown

Deploy Preview for vjs10-site ready!

Name Link
🔨 Latest commit c434682
🔍 Latest deploy log https://app.netlify.com/projects/vjs10-site/deploys/6a187dd7f11b7200082bb621
😎 Deploy Preview https://deploy-preview-1624--vjs10-site.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

@github-actions

github-actions Bot commented May 28, 2026

Copy link
Copy Markdown
Contributor

📦 Bundle Size Report

🎨 @videojs/html — no changes
Presets (7)
Entry Size
/video (default) 39.19 kB
/video (default + hls) 172.60 kB
/video (minimal) 38.67 kB
/video (minimal + hls) 172.41 kB
/audio (default) 33.46 kB
/audio (minimal) 30.41 kB
/background 4.23 kB
Media (9)
Entry Size
/media/background-video 1.04 kB
/media/container 1.72 kB
/media/dash-video 236.58 kB
/media/hls-video 135.02 kB
/media/mux-audio 161.01 kB
/media/mux-video 160.96 kB
/media/native-hls-video 4.62 kB
/media/simple-hls-audio-only 14.66 kB
/media/simple-hls-video 16.63 kB
Players (5)
Entry Size
/video/player 7.17 kB
/audio/player 5.18 kB
/background/player 3.92 kB
/live-video/player 7.19 kB
/live-audio/player 5.19 kB
Skins (30)
Entry Type Size
/video/minimal-skin.css css 4.71 kB
/video/skin.css css 4.77 kB
/video/minimal-skin js 38.67 kB
/video/minimal-skin.tailwind js 39.09 kB
/video/skin js 39.11 kB
/video/skin.tailwind js 39.52 kB
/audio/minimal-skin.css css 2.90 kB
/audio/skin.css css 2.94 kB
/audio/minimal-skin js 30.42 kB
/audio/minimal-skin.tailwind js 30.61 kB
/audio/skin js 33.41 kB
/audio/skin.tailwind js 33.66 kB
/background/skin.css css 133 B
/background/skin js 1.16 kB
/live-video/minimal-skin.css css 4.71 kB
/live-video/skin.css css 4.77 kB
/live-video/minimal-skin js 33.79 kB
/live-video/minimal-skin.tailwind js 33.83 kB
/live-video/skin js 33.84 kB
/live-video/skin.tailwind js 33.84 kB
/live-audio/minimal-skin.css css 2.90 kB
/live-audio/skin.css css 2.94 kB
/live-audio/minimal-skin js 25.62 kB
/live-audio/minimal-skin.tailwind js 25.42 kB
/live-audio/skin js 28.21 kB
/live-audio/skin.tailwind js 28.01 kB
/global.css css 176 B
/shared.css css 88 B
/tailwind.css css 228 B
/skin-element js 1.37 kB
UI Components (36)
Entry Size
/ui/airplay-button 2.05 kB
/ui/alert-dialog 634 B
/ui/alert-dialog-close 248 B
/ui/alert-dialog-description 262 B
/ui/alert-dialog-title 265 B
/ui/buffering-indicator 2.03 kB
/ui/captions-button 2.06 kB
/ui/cast-button 2.02 kB
/ui/compounds 5.39 kB
/ui/controls 2.00 kB
/ui/error-dialog 2.47 kB
/ui/fullscreen-button 2.03 kB
/ui/hotkey 2.76 kB
/ui/menu 2.68 kB
/ui/mute-button 2.07 kB
/ui/pip-button 2.02 kB
/ui/play-button 2.10 kB
/ui/playback-rate-button 2.18 kB
/ui/playback-rate-menu 3.04 kB
/ui/popover 1.77 kB
/ui/poster 1.82 kB
/ui/seek-button 2.05 kB
/ui/seek-indicator 2.70 kB
/ui/seek-indicator-value 227 B
/ui/slider 1.11 kB
/ui/status-announcer 2.39 kB
/ui/status-indicator 2.43 kB
/ui/status-indicator-value 115 B
/ui/thumbnail 2.42 kB
/ui/time 2.16 kB
/ui/time-slider 2.93 kB
/ui/tooltip 1.74 kB
/ui/volume-indicator 2.75 kB
/ui/volume-indicator-fill 184 B
/ui/volume-indicator-value 189 B
/ui/volume-slider 3.51 kB

Sizes are marginal over the root entry point.

⚛️ @videojs/react — no changes
Presets (7)
Entry Size
/video (default) 32.86 kB
/video (default + hls) 165.09 kB
/video (minimal) 32.88 kB
/video (minimal + hls) 165.26 kB
/audio (default) 26.70 kB
/audio (minimal) 26.80 kB
/background 754 B
Media (8)
Entry Size
/media/background-video 575 B
/media/dash-video 235.21 kB
/media/hls-video 133.61 kB
/media/mux-audio 159.74 kB
/media/mux-video 159.75 kB
/media/native-hls-video 3.13 kB
/media/simple-hls-audio-only 13.23 kB
/media/simple-hls-video 15.25 kB
Skins (27)
Entry Type Size
/tailwind.css css 228 B
/video/minimal-skin.css css 4.62 kB
/video/skin.css css 4.68 kB
/video/minimal-skin js 32.79 kB
/video/minimal-skin.tailwind js 37.55 kB
/video/skin js 32.74 kB
/video/skin.tailwind js 37.60 kB
/audio/minimal-skin.css css 2.78 kB
/audio/skin.css css 2.80 kB
/audio/minimal-skin js 26.72 kB
/audio/minimal-skin.tailwind js 26.49 kB
/audio/skin js 26.65 kB
/audio/skin.tailwind js 29.72 kB
/background/skin.css css 90 B
/background/skin js 272 B
/live-video/minimal-skin.css css 4.62 kB
/live-video/skin.css css 4.68 kB
/live-video/minimal-skin js 24.23 kB
/live-video/minimal-skin.tailwind js 28.67 kB
/live-video/skin js 24.22 kB
/live-video/skin.tailwind js 28.71 kB
/live-audio/minimal-skin.css css 2.78 kB
/live-audio/skin.css css 2.80 kB
/live-audio/minimal-skin js 20.12 kB
/live-audio/minimal-skin.tailwind js 22.63 kB
/live-audio/skin js 20.14 kB
/live-audio/skin.tailwind js 22.72 kB
UI Components (30)
Entry Size
/ui/airplay-button 2.12 kB
/ui/alert-dialog 1.17 kB
/ui/buffering-indicator 1.91 kB
/ui/captions-button 2.11 kB
/ui/cast-button 2.15 kB
/ui/controls 1.94 kB
/ui/error-dialog 2.43 kB
/ui/fullscreen-button 2.11 kB
/ui/gesture 1.35 kB
/ui/hotkey 2.01 kB
/ui/live-button 2.16 kB
/ui/menu 4.40 kB
/ui/mute-button 2.16 kB
/ui/pip-button 2.13 kB
/ui/play-button 2.11 kB
/ui/playback-rate-button 2.12 kB
/ui/playback-rate-menu 4.89 kB
/ui/popover 2.40 kB
/ui/poster 1.85 kB
/ui/seek-button 2.11 kB
/ui/seek-indicator 1.90 kB
/ui/slider 3.28 kB
/ui/status-announcer 1.78 kB
/ui/status-indicator 1.93 kB
/ui/thumbnail 2.09 kB
/ui/time 1.99 kB
/ui/time-slider 2.97 kB
/ui/tooltip 2.70 kB
/ui/volume-indicator 1.96 kB
/ui/volume-slider 2.78 kB

Sizes are marginal over the root entry point.

🧩 @videojs/core — no changes
Entries (10)
Entry Size
. 7.57 kB
/dom 15.44 kB
/dom/media/custom-media-element 1.90 kB
/dom/media/dash 234.36 kB
/dom/media/google-cast 4.07 kB
/dom/media/hls 132.99 kB
/dom/media/mux 158.95 kB
/dom/media/native-hls 2.52 kB
/dom/media/simple-hls 14.59 kB
/dom/media/simple-hls-audio-only 12.61 kB
🏷️ @videojs/element — no changes
Entries (2)
Entry Size
. 996 B
/context 943 B
📦 @videojs/store — no changes
Entries (3)
Entry Size
. 1.39 kB
/html 696 B
/react 360 B
🔧 @videojs/utils — no changes
Entries (10)
Entry Size
/array 104 B
/dom 2.00 kB
/events 319 B
/function 327 B
/object 275 B
/predicate 265 B
/string 192 B
/style 190 B
/time 478 B
/number 158 B
📦 @videojs/spf — no changes
Entries (3)
Entry Size
. 4.45 kB
/dom 6.32 kB
/hls 14.08 kB

ℹ️ How to interpret

All sizes are standalone totals (minified + brotli).

Icon Meaning
No change
🔺 Increased ≤ 10%
🔴 Increased > 10%
🔽 Decreased
🆕 New (no baseline)

Run pnpm size locally to check current sizes.

Three refinements surfaced while running the skill on its own PR:

- Bucket calibration — empty-bucket guidance for docs/skill-only PRs.
  Omit Bucket 1 entirely when no runtime; drop bucket numbering when
  only 1–2 buckets populated; the PR's load-bearing artifact gets
  [Skim file] regardless of which bucket it sits in.
- Smoke-test threshold — sharper omit-vs-explicit-note rule. Explicit
  note for large PRs (~10+ files or ~500+ lines) regardless of runtime
  impact; omit for small docs-only PRs.
- Carry-forward — when a sibling PR has already shipped, log the gap
  as a Reviewer callout in the current PR rather than retroactively
  editing the closed PR's description.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Three refinements informed by review feedback on #1605:

- Jargon discipline — don't inherit meta-discourse labels (Tier N,
  Phase N, Stage A/B) from feature docs without translating to
  substance. Gloss table is for durable code terms only.
- Reviewer comparative advantage — Look-for prose names concerns
  (invariants, ordering, contracts) not impl details (function
  signatures, ctx field lists). Human reviewers do comprehension;
  LLM-driven reviewers do per-line. Description should serve the
  human.
- Section contractibility — Sections 4–8 are include-if-load-bearing,
  not required. Empty Reviewer callouts / Breaking / Test plan
  sections omitted rather than performed as "None" boilerplate;
  perfunctory test-plan checklists cut.

Adds "Less is more" framing to Compression discipline; new pitfalls
(AI-enthusiasm verbose mode, feature-doc jargon, performed empty
sections, routine-impl design decisions); 4 new audit checklist items.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
GitHub already shows X files / +Y / −Z above every PR body, so
restating the diff stat at the top of the For-reviewers section adds
zero signal. The line is now opt-in: include only when paired with a
weight-imbalance call-out reviewers should know about (agent-skill-
heavy PR, mass rename, generated-code-heavy). Bare numerical
recitation always cut.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

1 participant