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

None yet

Development

Successfully merging this pull request may close these issues.

2 participants