CtrlK
BlogDocsLog inGet started
Tessl Logo

testland/web-push-tests

Test the browser web-push subscription lifecycle - `pushManager.subscribe({ userVisibleOnly, applicationServerKey })` per [W3C Push API][w3c-push] returning a `PushSubscription` with `endpoint` + `keys.p256dh` + `keys.auth` + optional `expirationTime`; the `pushsubscriptionchange` service-worker event on refresh / revoke / expiry; the `push` event delivery with `PushMessageData`; VAPID auth per RFC 8292 (ES256 JWT, `aud` / `exp` ≤ 24h / `sub`); RFC 8030 push-service responses (201 Created, 410 Gone for expired endpoints, 413 Payload Too Large, 429); and `unsubscribe()` cleanup. Use when a PWA ships web-push and the subscription lifecycle needs release-gate coverage - scoped to the browser Push API, not to cross-channel delivery over native APNs / FCM.

67

Quality

84%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide
SecuritybySnyk

Passed

No findings from the security scan

Overview
Quality
Evals
Security
Files

Quality

Content

67%Weight 40%Scale 1-5

Reviews the quality of instructions and guidance provided to agents. Good implementation is clear, handles edge cases, and produces reliable results.

A strong, well-sequenced authoring guide with mostly executable Playwright/Vitest code, real one-level-deep references, and an unusually honest Limitations section. Its main costs are token weight: spec tables and per-spec sentences restating API knowledge Claude already has, and two test snippets with elided setup.

Suggestions

Move the spec-reference tables (PushSubscription properties, PushMessageData methods) into references/push-protocol.md and keep only the tested assertions inline — this trims API reference Claude already knows and directly addresses the lowest-scoring dimension, conciseness.

Replace the '// ... subscribe as Step 2 ...' and '// ... subscribe ...' elisions in Steps 3 and 8 with a shared subscribe() helper (like the existing swReady helper) so every test snippet is copy-paste executable.

Add a short 'When a test fails' checkpoint after the Running section — e.g., common Playwright push failures mapped to their anti-pattern fix — making the error-recovery feedback loop explicit instead of implicit in the anti-patterns table.

DimensionReasoningScore

Conciseness

The bulk is executable test code, but several passages restate API reference Claude already knows: the PushSubscription property table ('P-256 ECDH Diffie-Hellman public key', 'authentication secret that an application server uses'), the PushMessageData methods table ('Parses as JSON', 'Decodes UTF-8'), and 'Per [mdn-push], `PushManager.getSubscription()` returns the active subscription if one exists, else `null`'. This fits the 3 anchor ('mostly efficient but includes some unnecessary explanation') — not 4, because these padded passages are more than minor; not 2, because the genuinely non-obvious content (headed-mode requirement, Firefox push quota, synthetic-dispatch caveats, endpoint-host brittleness) earns its place.

3 / 5

Actionability

Concrete executable Playwright/Vitest test code for each lifecycle stage, runnable commands ('npx web-push generate-vapid-keys', 'npx playwright test tests/web-push.spec.ts', 'npx vitest run tests/subscription-cleanup.spec.ts'), and CI YAML. It fits the 4 anchor ('mostly executable; concrete code or commands with minor gaps') rather than 5 because Steps 3 and 8 contain elisions ('// ... subscribe as Step 2 ...', '// ... subscribe ...') so those snippets are not copy-paste complete as written, and Steps 6–7 delegate their code to the reference file.

4 / 5

Workflow Clarity

A clear 8-step authoring sequence with a Running section (local + CI) and an anti-patterns table mapping each failure mode to a fix. It fits the 4 anchor ('clear sequence with most checkpoints present; minor validation gaps') rather than 5 because there is no explicit validate→fix→retry loop for a failing test run — error recovery is implicit in the anti-patterns table — and per-step checkpoints are implicit; not 3, because the sequence is coherent and every step produces a concrete, asserted outcome.

4 / 5

Progressive Disclosure

references/push-protocol.md is a real file, one level deep, clearly signaled in Steps 6–7 ('The full response-code table and the cleanup-on-410 Vitest test are in references/push-protocol.md'), and it delivers the promised content (response-code table, VAPID claim table, complete Vitest tests). The split — runnable browser-side core inline, server-side protocol detail in the reference — is appropriate, fitting the 4 anchor; not 5 because the SKILL.md body still inlines substantial spec-reference detail (property and method tables) that a leaner overview would move to the reference.

4 / 5

Total

15

/

20

Passed

Description

92%Weight 40%Scale 1-5

Based on the skill's description, can an agent find and select it at the right time? Clear, specific descriptions lead to better discovery.

A highly specific, well-scoped description that names concrete API calls, spec citations, and response codes, and pairs them with an explicit 'Use when...' trigger plus an explicit out-of-scope boundary against cross-channel push skills. The only weakness is modest synonym coverage of natural trigger phrasings.

DimensionReasoningScore

Specificity

The description lists multiple specific concrete actions with comprehensive lifecycle coverage: '`pushManager.subscribe({ userVisibleOnly, applicationServerKey })`', 'the `pushsubscriptionchange` service-worker event on refresh / revoke / expiry', 'VAPID auth per RFC 8292 (ES256 JWT, `aud` / `exp` ≤ 24h / `sub`)', 'RFC 8030 push-service responses (201 Created, 410 Gone for expired endpoints, 413 Payload Too Large, 429)', and '`unsubscribe()` cleanup'. It matches the 5 anchor ('multiple specific concrete actions; comprehensive coverage') rather than 4 because no lifecycle stage is left out.

5 / 5

Completeness

Both questions are answered explicitly: the what is the detailed action list, and the when is 'Use when a PWA ships web-push and the subscription lifecycle needs release-gate coverage'. This matches the 5 anchor ('clearly and explicitly answers both what AND when with concrete trigger phrases') — it does not fit 4 since the 'when' clause is fully explicit, not merely present.

5 / 5

Trigger Term Quality

Good natural keyword coverage: 'web-push', 'PWA', 'VAPID', 'subscription lifecycle', 'endpoint', 'unsubscribe', plus scoping terms 'APNs / FCM'. It fits the 4 anchor ('good keyword coverage; a few natural terms missing') rather than 5 ('comprehensive... including synonyms') because common user phrasings like 'push notifications' or 'browser notifications' are absent, and 'service worker' appears only as an event qualifier.

4 / 5

Distinctiveness Conflict Risk

A clear niche with an explicit boundary: 'scoped to the browser Push API, not to cross-channel delivery over native APNs / FCM', and the sibling-skill differentiation is unambiguous. It matches the 5 anchor ('clear niche with distinct triggers; minimal conflict risk') and not 4, since the overlap risk with adjacent push/notification skills is explicitly fenced off.

5 / 5

Total

19

/

20

Passed

Validation

100%

Checks the skill against the spec for correct structure and formatting. All validation checks must pass before discovery and implementation can be scored.

Validation — 16 / 16 Passed

Validation for skill structure

No warnings or errors.

Reviewed

Table of Contents