skilldrop-cli 0.16.35 → 0.16.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/agents/README.md +4 -1
- package/agents/docs-reviewer.md +47 -0
- package/agents/finding-adjudicator.md +49 -0
- package/agents/test-reviewer.md +52 -0
- package/catalogue.json +17 -7
- package/model-routing.json +40 -0
- package/package.json +1 -1
- package/packs/ai-engineering/skills/agent-config-review/SKILL.md +116 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/eval_queries.json +12 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/evals.json +75 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/1/.claude/agents/db-migrator.md +8 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/1/.claude/agents/reviewer.md +9 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/1/.claude/settings.json +48 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/1/.claude/settings.local.json +5 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/1/.mcp.json +22 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/1/package.json +12 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/2/.cursor/mcp.json +17 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/2/config.toml +21 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/4/my-user-settings.json +11 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/4/quillstack/.claude/agents/release-notes.md +13 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/4/quillstack/.claude/settings.json +39 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/4/quillstack/.mcp.json +18 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/4/quillstack/package.json +14 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/5/.github/workflows/codex-triage.yml +29 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/5/AGENTS.md +16 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/5/codex/config.toml +34 -0
- package/packs/ai-engineering/skills/agent-config-review/examples/inputs/tidewater-ingest/.claude/settings.json +22 -0
- package/packs/ai-engineering/skills/agent-config-review/examples/inputs/tidewater-ingest/.mcp.json +9 -0
- package/packs/ai-engineering/skills/agent-config-review/examples/python-repo-tighten.md +81 -0
- package/packs/ai-engineering/skills/agent-config-review/manifest.json +60 -0
- package/packs/ai-engineering/skills/agent-config-review/reference.md +205 -0
- package/packs/ai-engineering/skills/agent-config-review/scripts/agent_config_scan.py +989 -0
- package/packs/ai-engineering/skills/agent-incident-response/SKILL.md +175 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/eval_queries.json +14 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/evals.json +107 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/1/agent-session-excerpt.txt +11 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/1/ci-build-log.txt +24 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/1/incident-notes.md +19 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/2/mcp-config.json +20 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/2/session-transcript.txt +8 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/4/agent-session.log +70 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/4/infra/staging-db.tf +25 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/5/jobs/nightly-triage/job.yaml +19 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/5/jobs/nightly-triage/run.log +13 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/5/usage-export-2026-10-20.csv +13 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/6/.mcp.json +20 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/6/git-log.txt +12 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/6/notesync-excerpt.txt +30 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/6/notesync.log +15 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/6/ssh-config.txt +16 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/.github/workflows/ci.yml +28 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/SECURITY.md +8 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/issue-479.md +35 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/package.json +15 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/pr-482.diff +20 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/run-log.txt +30 -0
- package/packs/ai-engineering/skills/agent-incident-response/examples/injected-issue-comment.md +57 -0
- package/packs/ai-engineering/skills/agent-incident-response/manifest.json +55 -0
- package/packs/ai-engineering/skills/agent-incident-response/reference.md +152 -0
- package/packs/ai-engineering/skills/agent-incident-response/scripts/find_secret_exposure.py +239 -0
- package/packs/ai-engineering/skills/agent-incident-response/scripts/usage_split.py +194 -0
- package/packs/converters/skills/file-to-markdown/SKILL.md +2 -1
- package/packs/converters/skills/file-to-markdown/evals/eval_queries.json +4 -0
- package/packs/converters/skills/file-to-markdown/manifest.json +2 -2
- package/packs/converters/skills/file-to-markdown/scripts/to_markdown.py +253 -3
- package/packs/converters/skills/md-to-confluence/SKILL.md +139 -0
- package/packs/converters/skills/md-to-confluence/evals/eval_queries.json +42 -0
- package/packs/converters/skills/md-to-confluence/evals/evals.json +89 -0
- package/packs/converters/skills/md-to-confluence/evals/files/1/img/latency-dashboard.png +0 -0
- package/packs/converters/skills/md-to-confluence/evals/files/1/payments-runbook.md +60 -0
- package/packs/converters/skills/md-to-confluence/evals/files/2/deploy-checklist.md +33 -0
- package/packs/converters/skills/md-to-confluence/evals/files/3/img/after/screen.png +0 -0
- package/packs/converters/skills/md-to-confluence/evals/files/3/img/before/screen.png +0 -0
- package/packs/converters/skills/md-to-confluence/evals/files/3/release-notes-4.2.md +49 -0
- package/packs/converters/skills/md-to-confluence/evals/files/4/docs/img/topology.png +0 -0
- package/packs/converters/skills/md-to-confluence/evals/files/4/docs/ingest-pipeline-design.md +65 -0
- package/packs/converters/skills/md-to-confluence/evals/files/5/support/troubleshooting-sso.md +57 -0
- package/packs/converters/skills/md-to-confluence/examples/inputs/img/queue-depth.png +0 -0
- package/packs/converters/skills/md-to-confluence/examples/inputs/queue-runbook.fixed.md +21 -0
- package/packs/converters/skills/md-to-confluence/examples/inputs/queue-runbook.md +21 -0
- package/packs/converters/skills/md-to-confluence/examples/queue-runbook.md +57 -0
- package/packs/converters/skills/md-to-confluence/manifest.json +52 -0
- package/packs/converters/skills/md-to-confluence/reference.md +92 -0
- package/packs/converters/skills/md-to-confluence/scripts/md_to_confluence.py +821 -0
- package/packs/converters/skills/md-to-pptx/SKILL.md +131 -0
- package/packs/converters/skills/md-to-pptx/evals/eval_queries.json +12 -0
- package/packs/converters/skills/md-to-pptx/evals/evals.json +84 -0
- package/packs/converters/skills/md-to-pptx/evals/files/1/img/defect-burndown.png +0 -0
- package/packs/converters/skills/md-to-pptx/evals/files/1/status-report.md +75 -0
- package/packs/converters/skills/md-to-pptx/evals/files/3/brand.json +12 -0
- package/packs/converters/skills/md-to-pptx/evals/files/3/night-shift-induction.md +53 -0
- package/packs/converters/skills/md-to-pptx/evals/files/4/charts/ontime.png +0 -0
- package/packs/converters/skills/md-to-pptx/evals/files/4/qbr-q3.md +85 -0
- package/packs/converters/skills/md-to-pptx/evals/files/5/vendor-sync-notes.md +28 -0
- package/packs/converters/skills/md-to-pptx/examples/support-weekly-input.md +48 -0
- package/packs/converters/skills/md-to-pptx/examples/support-weekly.md +75 -0
- package/packs/converters/skills/md-to-pptx/examples/tickets-by-week.png +0 -0
- package/packs/converters/skills/md-to-pptx/manifest.json +49 -0
- package/packs/converters/skills/md-to-pptx/reference.md +139 -0
- package/packs/converters/skills/md-to-pptx/scripts/md_to_pptx.py +1841 -0
- package/packs/dev-team/loops/modernize/LOOP.md +124 -0
- package/packs/dev-team/loops/modernize/evals/eval_queries.json +9 -0
- package/packs/dev-team/loops/modernize/evals/evals.json +27 -0
- package/packs/dev-team/loops/modernize/loop.json +60 -0
- package/packs/dev-team/skills/behaviour-equivalence/SKILL.md +155 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/eval_queries.json +11 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/evals.json +76 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/cases.jsonl +12 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/new.jsonl +12 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/notes.md +15 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/old.jsonl +12 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/old_rerun.jsonl +12 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/pricing_v1.py +45 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/pricing_v2.py +65 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/rules.json +10 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/3/diff-summary.txt +16 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/diff.txt +13 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/fee_calc_py2.py +16 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/fee_calc_py3.py +24 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/input.csv +13 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/new_output.csv +13 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/old_output.csv +13 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/5/TEAM_NOTES.md +19 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/5/normalisation.yaml +12 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/5/recordings/new_run.jsonl +8 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/5/recordings/old_run1.jsonl +8 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/5/recordings/old_run2.jsonl +8 -0
- package/packs/dev-team/skills/behaviour-equivalence/examples/delivery-date.md +78 -0
- package/packs/dev-team/skills/behaviour-equivalence/manifest.json +33 -0
- package/packs/dev-team/skills/behaviour-equivalence/reference.md +97 -0
- package/packs/dev-team/skills/behaviour-equivalence/scripts/golden_diff.py +524 -0
- package/packs/dev-team/skills/behaviour-equivalence/templates/accepted.json +10 -0
- package/packs/dev-team/skills/behaviour-equivalence/templates/rules.json +7 -0
- package/packs/frontend/pack.json +55 -0
- package/packs/frontend/skills/rendering-strategy/SKILL.md +149 -0
- package/packs/frontend/skills/rendering-strategy/evals/eval_queries.json +38 -0
- package/packs/frontend/skills/rendering-strategy/evals/evals.json +77 -0
- package/packs/frontend/skills/rendering-strategy/evals/files/1/fernhill-app.md +40 -0
- package/packs/frontend/skills/rendering-strategy/evals/files/3/routes.md +33 -0
- package/packs/frontend/skills/rendering-strategy/evals/files/4/build-notes.txt +5 -0
- package/packs/frontend/skills/rendering-strategy/evals/files/4/nuxt.config.ts +19 -0
- package/packs/frontend/skills/rendering-strategy/evals/files/4/pages/recipes/[slug].vue +37 -0
- package/packs/frontend/skills/rendering-strategy/evals/files/4/routes.md +15 -0
- package/packs/frontend/skills/rendering-strategy/evals/files/5/routes.txt +18 -0
- package/packs/frontend/skills/rendering-strategy/evals/files/5/src/hooks.server.ts +14 -0
- package/packs/frontend/skills/rendering-strategy/evals/files/5/src/routes/(marketing)/pricing/+page.server.ts +10 -0
- package/packs/frontend/skills/rendering-strategy/evals/files/5/src/routes/+layout.server.ts +10 -0
- package/packs/frontend/skills/rendering-strategy/evals/files/5/svelte.config.js +10 -0
- package/packs/frontend/skills/rendering-strategy/evals/files/5/traffic.md +18 -0
- package/packs/frontend/skills/rendering-strategy/examples/saas-site.md +42 -0
- package/packs/frontend/skills/rendering-strategy/manifest.json +50 -0
- package/packs/frontend/skills/rendering-strategy/reference.md +116 -0
- package/packs/frontend/skills/rendering-strategy/scripts/render_load.py +181 -0
- package/packs/frontend/skills/web-performance-review/SKILL.md +106 -0
- package/packs/frontend/skills/web-performance-review/evals/eval_queries.json +38 -0
- package/packs/frontend/skills/web-performance-review/evals/evals.json +76 -0
- package/packs/frontend/skills/web-performance-review/evals/files/1/psi.json +1065 -0
- package/packs/frontend/skills/web-performance-review/evals/files/2/after.json +359 -0
- package/packs/frontend/skills/web-performance-review/evals/files/2/before.json +375 -0
- package/packs/frontend/skills/web-performance-review/evals/files/4/psi-pdp-mobile-2026-10-19.json +171 -0
- package/packs/frontend/skills/web-performance-review/evals/files/4/rum-inp-attribution-oct14-19.csv +6 -0
- package/packs/frontend/skills/web-performance-review/evals/files/4/rum-inp-daily.csv +15 -0
- package/packs/frontend/skills/web-performance-review/evals/files/5/crux-home-phone.json +35 -0
- package/packs/frontend/skills/web-performance-review/evals/files/5/lighthouse-home-mobile.json +173 -0
- package/packs/frontend/skills/web-performance-review/examples/quayside-article-lhr.json +480 -0
- package/packs/frontend/skills/web-performance-review/examples/quayside-article.md +103 -0
- package/packs/frontend/skills/web-performance-review/manifest.json +48 -0
- package/packs/frontend/skills/web-performance-review/reference.md +105 -0
- package/packs/frontend/skills/web-performance-review/scripts/lh_summary.py +743 -0
- package/packs/product-manager/skills/lean-canvas/SKILL.md +162 -0
- package/packs/product-manager/skills/lean-canvas/evals/eval_queries.json +42 -0
- package/packs/product-manager/skills/lean-canvas/evals/evals.json +82 -0
- package/packs/product-manager/skills/lean-canvas/evals/files/1/pawpass-notes.md +54 -0
- package/packs/product-manager/skills/lean-canvas/evals/files/3/lunchloop-pitch.md +30 -0
- package/packs/product-manager/skills/lean-canvas/evals/files/4/clubkit-notes.md +44 -0
- package/packs/product-manager/skills/lean-canvas/evals/files/5/cost-model.csv +5 -0
- package/packs/product-manager/skills/lean-canvas/evals/files/5/proposal.md +40 -0
- package/packs/product-manager/skills/lean-canvas/evals/files/5/stakeholder-emails.txt +18 -0
- package/packs/product-manager/skills/lean-canvas/examples/bike-repair.md +72 -0
- package/packs/product-manager/skills/lean-canvas/manifest.json +34 -0
- package/packs/product-manager/skills/lean-canvas/reference.md +102 -0
- package/packs/product-manager/skills/lean-canvas/scripts/unit_economics.py +211 -0
- package/packs/solution-architect/skills/api-contract-draft/SKILL.md +2 -2
- package/packs/solution-architect/skills/api-contract-draft/manifest.json +28 -6
- package/packs/solution-architect/skills/event-contract-draft/SKILL.md +167 -0
- package/packs/solution-architect/skills/event-contract-draft/evals/eval_queries.json +38 -0
- package/packs/solution-architect/skills/event-contract-draft/evals/evals.json +76 -0
- package/packs/solution-architect/skills/event-contract-draft/evals/files/1/order-events-brief.md +45 -0
- package/packs/solution-architect/skills/event-contract-draft/evals/files/4/NOTES.md +23 -0
- package/packs/solution-architect/skills/event-contract-draft/evals/files/4/schemas/shipment-update.json +40 -0
- package/packs/solution-architect/skills/event-contract-draft/evals/files/5/invoice.example.json +25 -0
- package/packs/solution-architect/skills/event-contract-draft/examples/order-service.asyncapi.json +246 -0
- package/packs/solution-architect/skills/event-contract-draft/examples/order-service.md +92 -0
- package/packs/solution-architect/skills/event-contract-draft/manifest.json +25 -0
- package/packs/solution-architect/skills/event-contract-draft/reference.md +113 -0
- package/packs/solution-architect/skills/event-contract-draft/scripts/check_asyncapi.py +502 -0
- package/packs/solution-architect/skills/event-contract-draft/templates/asyncapi-skeleton.json +144 -0
- package/packs/sre-oncall/skills/slo-spec/SKILL.md +161 -0
- package/packs/sre-oncall/skills/slo-spec/evals/eval_queries.json +38 -0
- package/packs/sre-oncall/skills/slo-spec/evals/evals.json +75 -0
- package/packs/sre-oncall/skills/slo-spec/evals/files/1/order-service.md +51 -0
- package/packs/sre-oncall/skills/slo-spec/evals/files/3/search-slo-status.md +30 -0
- package/packs/sre-oncall/skills/slo-spec/evals/files/4/alerts/payments-api.rules.yaml +16 -0
- package/packs/sre-oncall/skills/slo-spec/evals/files/4/docs/dependencies.md +8 -0
- package/packs/sre-oncall/skills/slo-spec/evals/files/4/metrics/summary-90d.md +51 -0
- package/packs/sre-oncall/skills/slo-spec/evals/files/5/ops-notes.md +34 -0
- package/packs/sre-oncall/skills/slo-spec/examples/ticket-booking.md +88 -0
- package/packs/sre-oncall/skills/slo-spec/manifest.json +34 -0
- package/packs/sre-oncall/skills/slo-spec/reference.md +113 -0
- package/packs/sre-oncall/skills/slo-spec/scripts/slo_math.py +449 -0
- package/packs/sre-oncall/skills/slo-spec/templates/slo-spec.md +35 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# Worked example: Quayside Ledger article page
|
|
2
|
+
|
|
3
|
+
## Input
|
|
4
|
+
|
|
5
|
+
The user says: *"Our article pages feel janky and Search Console is unhappy. Here's a Lighthouse
|
|
6
|
+
run of the Harbour Bridge story. Our RUM dashboard says, for mobile over the last 28 days, LCP p75
|
|
7
|
+
3.4 s, INP p75 160 ms, CLS p75 0.31. What do we fix first?"* and supplies
|
|
8
|
+
[`quayside-article-lhr.json`](quayside-article-lhr.json), a hand-built Lighthouse 12 result
|
|
9
|
+
(default mobile, simulated throttling). All names and hosts are fictional.
|
|
10
|
+
|
|
11
|
+
The agent passes the RUM numbers to the script with the report:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
python3 scripts/lh_summary.py examples/quayside-article-lhr.json \
|
|
15
|
+
--lcp-p75 3400 --inp-p75 160 --cls-p75 0.31 --field-source "RUM, last 28 days, mobile"
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Script output (real; run header and main-thread section cut)
|
|
19
|
+
|
|
20
|
+
```markdown
|
|
21
|
+
## Field data (real users, p75): decides whether there is a problem
|
|
22
|
+
RUM, last 28 days, mobile
|
|
23
|
+
|
|
24
|
+
| Metric | p75 | Rating | Share good |
|
|
25
|
+
|---|---|---|---|
|
|
26
|
+
| LCP | 3.40 s | needs-improvement | - |
|
|
27
|
+
| INP | 160 ms | good | - |
|
|
28
|
+
| CLS | 0.31 | poor | - |
|
|
29
|
+
|
|
30
|
+
Core Web Vitals (field): FAILED: LCP needs-improvement, CLS poor
|
|
31
|
+
|
|
32
|
+
## Lab metrics (this run): explains why
|
|
33
|
+
|
|
34
|
+
Performance score: 78 (a lab weighting, not a Core Web Vitals result)
|
|
35
|
+
|
|
36
|
+
| Metric | Value | Lab rating | Threshold |
|
|
37
|
+
|---|---|---|---|
|
|
38
|
+
| FCP | 2.05 s | needs-improvement | good <= 1800ms, poor > 3000ms |
|
|
39
|
+
| LCP | 3.12 s | needs-improvement | good <= 2500ms, poor > 4000ms |
|
|
40
|
+
| TBT | 140 ms | good | good <= 200ms, poor > 600ms |
|
|
41
|
+
| CLS | 0.22 | needs-improvement | good <= 0.1, poor > 0.25 |
|
|
42
|
+
| Server response (lab TTFB) | 1.42 s | - | - |
|
|
43
|
+
|
|
44
|
+
## LCP element
|
|
45
|
+
Selector: article > figure.article-lead > img.article-lead__image
|
|
46
|
+
Flags: fetchpriority=high present
|
|
47
|
+
|
|
48
|
+
| Phase | Time | Share |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| TTFB | 1.65 s | 53% |
|
|
51
|
+
| Resource load delay | 180 ms | 6% |
|
|
52
|
+
| Resource load duration | 820 ms | 26% |
|
|
53
|
+
| Element render delay | 470 ms | 15% |
|
|
54
|
+
Dominant phase: TTFB
|
|
55
|
+
|
|
56
|
+
## Layout shift culprits (load window only; shifts after load are not in a lab run)
|
|
57
|
+
- body > div.ad-slot.ad-slot--top: 0.150, cause: Injected iframe (https://ads.adharbor.example/serve/frame.html)
|
|
58
|
+
- article > figure.article-lead > img.article-lead__image: 0.070, cause: Unsized image element
|
|
59
|
+
|
|
60
|
+
## Failing opportunities and diagnostics, ranked by the vital they move
|
|
61
|
+
| Audit | Est. load saving | Metric savings | Note |
|
|
62
|
+
|---|---|---|---|
|
|
63
|
+
| * server-response-time: Reduce initial server response time | 1.32 s | FCP 1.32 s, LCP 1.32 s | |
|
|
64
|
+
| * unused-css-rules: Reduce unused CSS | 150 ms / 69 KiB | FCP 150 ms, LCP 150 ms | |
|
|
65
|
+
| * layout-shifts: Avoid large layout shifts | - | CLS 0.22 | |
|
|
66
|
+
| * unsized-images: Image elements do not have explicit width and height | - | none | acts on CLS directly |
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## What the agent decides
|
|
70
|
+
|
|
71
|
+
- CLS is the vital furthest past its threshold (0.31 against 0.1, poor), so the shift fixes go
|
|
72
|
+
first, even though the script's table lists the server fix first by milliseconds.
|
|
73
|
+
- The LCP image already has `fetchpriority="high"` and almost no load delay, so the preload
|
|
74
|
+
advice a plain review gives would change nothing. TTFB is 53% of LCP: the server is the LCP fix.
|
|
75
|
+
- INP is good in the field, so TBT (140 ms) and the ad script's long task are not on the list.
|
|
76
|
+
- Field CLS (0.31) is above lab CLS (0.22): part of the shift happens after load, where this run
|
|
77
|
+
can't see it.
|
|
78
|
+
|
|
79
|
+
## Reply
|
|
80
|
+
|
|
81
|
+
Readers do have a problem, and layout shift is the bigger one: on mobile, CLS at p75 is 0.31
|
|
82
|
+
(poor; good is 0.1) and LCP is 3.4 s (needs improvement; good is 2.5 s). Responsiveness is fine
|
|
83
|
+
(INP 160 ms). Most of the shift comes from the top ad slot, and most of the LCP time is spent
|
|
84
|
+
waiting for the server.
|
|
85
|
+
|
|
86
|
+
1. **Reserve space for the top ad.** `div.ad-slot--top` grows when the ad iframe arrives, which is
|
|
87
|
+
0.15 of the 0.22 shift in this run. Give the slot a `min-height` equal to the tallest ad it serves
|
|
88
|
+
on mobile. Moves CLS.
|
|
89
|
+
2. **Give the lead image dimensions.** `img.article-lead__image` (`bridge-1200.webp`) has no
|
|
90
|
+
`width` or `height`, which is another 0.07 of the shift. Add both attributes, or an
|
|
91
|
+
`aspect-ratio`, so the space is held before the image loads. Moves CLS.
|
|
92
|
+
3. **Cut the article's server response.** The HTML took 1.42 s to arrive, and time to first byte
|
|
93
|
+
is 1.65 s of the 3.12 s lab LCP. Serve the article HTML from the CDN cache, or find where the
|
|
94
|
+
backend spends that time. Lighthouse estimates up to 1.3 s off LCP in the lab. Moves LCP and FCP.
|
|
95
|
+
4. **Then trim the stylesheet.** `site.css` is 77% unused, about 150 ms of LCP in the lab. Small;
|
|
96
|
+
do it after the three above.
|
|
97
|
+
|
|
98
|
+
What this run can't show: field CLS is higher than the run's 0.22, so some shifting happens after
|
|
99
|
+
load (later ads, scrolling) that a single page-load test doesn't record. RUM that reports which
|
|
100
|
+
element shifted would name it. The numbers come from one run on an emulated mid-range phone on
|
|
101
|
+
slow 4G; re-test with the median of three to five runs, then watch RUM p75 over the following weeks.
|
|
102
|
+
|
|
103
|
+
**To confirm:** the ad sizes the top slot serves on mobile, which set its `min-height`.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "web-performance-review",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Read a Lighthouse report or PageSpeed Insights result, with field data when there is any (CrUX, PSI loadingExperience or RUM p75), and say what makes the page slow for real users and what to fix first, ranked by how much each fix moves LCP, INP and CLS at the 75th percentile. Names the LCP element and which LCP phase dominates, the elements that shift and why, the long tasks and third parties by main-thread time, and treats estimated savings as lab estimates that overlap. Use when the user shares a Lighthouse JSON or PSI result and asks \"why is this page slow\", \"what should we fix first\", \"we score 92 but Search Console says LCP is poor\", \"did our change fix INP\", \"review this Lighthouse report\", or \"how do we pass Core Web Vitals\".",
|
|
5
|
+
"entrypoint": "SKILL.md",
|
|
6
|
+
"deps": {
|
|
7
|
+
"npm": [],
|
|
8
|
+
"pip": []
|
|
9
|
+
},
|
|
10
|
+
"env": {
|
|
11
|
+
"required": [],
|
|
12
|
+
"optional": []
|
|
13
|
+
},
|
|
14
|
+
"related": [
|
|
15
|
+
"accessibility-audit",
|
|
16
|
+
"observability-plan",
|
|
17
|
+
"rendering-strategy"
|
|
18
|
+
],
|
|
19
|
+
"handoff": [
|
|
20
|
+
{
|
|
21
|
+
"to": "observability-plan",
|
|
22
|
+
"when": "there is no field data, or the review needs RUM with per-element attribution to find after-load shifts or slow interactions",
|
|
23
|
+
"purpose": "Set up real-user collection of LCP, INP and CLS at p75 so fixes can be verified on users, not on one lab run.",
|
|
24
|
+
"fallback": "If observability-plan is absent, name the three vitals to collect at p75 per page type and form factor, with the element attribution for each, in one paragraph."
|
|
25
|
+
}
|
|
26
|
+
],
|
|
27
|
+
"tags": [
|
|
28
|
+
"web-performance",
|
|
29
|
+
"core-web-vitals",
|
|
30
|
+
"lighthouse",
|
|
31
|
+
"frontend"
|
|
32
|
+
],
|
|
33
|
+
"permissions": {
|
|
34
|
+
"network": [
|
|
35
|
+
"registry.npmjs.org"
|
|
36
|
+
],
|
|
37
|
+
"commands": [
|
|
38
|
+
"lighthouse",
|
|
39
|
+
"npx"
|
|
40
|
+
],
|
|
41
|
+
"files": "named-paths",
|
|
42
|
+
"notes": "The script reads the Lighthouse, PageSpeed Insights or CrUX JSON it is given and writes only an -o path the user names; it makes no network calls. The instructions run the Lighthouse CLI (through npx, which fetches it from the npm registry) against the page the user names."
|
|
43
|
+
},
|
|
44
|
+
"model": {
|
|
45
|
+
"tier": "standard",
|
|
46
|
+
"rationale": "The metrics, opportunities and the elements behind them are read out of the Lighthouse report by its script; the model ranks fixes by what moves the user-facing numbers."
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# web-performance-review reference
|
|
2
|
+
|
|
3
|
+
## Thresholds
|
|
4
|
+
|
|
5
|
+
Core Web Vitals are judged at the 75th percentile of real page loads, per form factor.
|
|
6
|
+
|
|
7
|
+
| Metric | Good | Needs improvement | Poor | Field or lab |
|
|
8
|
+
|---|---|---|---|---|
|
|
9
|
+
| LCP | ≤ 2.5 s | 2.5–4 s | > 4 s | both |
|
|
10
|
+
| INP | ≤ 200 ms | 200–500 ms | > 500 ms | field only (or a Lighthouse timespan run) |
|
|
11
|
+
| CLS | ≤ 0.1 | 0.1–0.25 | > 0.25 | both; lab sees the load window only |
|
|
12
|
+
| FCP | ≤ 1.8 s | 1.8–3 s | > 3 s | both, supporting metric |
|
|
13
|
+
| TTFB | ≤ 0.8 s | 0.8–1.8 s | > 1.8 s | field; lab has `server-response-time` |
|
|
14
|
+
| TBT | ≤ 200 ms | 200–600 ms | > 600 ms | lab only, a proxy for INP |
|
|
15
|
+
|
|
16
|
+
A page passes Core Web Vitals when LCP, INP and CLS are all good at p75. With no INP data, CrUX
|
|
17
|
+
assesses on LCP and CLS.
|
|
18
|
+
|
|
19
|
+
The Performance score (Lighthouse 10 and later) weights lab metrics: TBT 30%, LCP 25%, CLS 25%,
|
|
20
|
+
FCP 10%, Speed Index 10%. It is a lab number. A page can score 90+ and fail every vital in the
|
|
21
|
+
field, or score 50 and pass.
|
|
22
|
+
|
|
23
|
+
## Fields the script reads
|
|
24
|
+
|
|
25
|
+
**Lighthouse result (LHR):** `lighthouseVersion`, `fetchTime`, `finalDisplayedUrl` (older:
|
|
26
|
+
`finalUrl`), `runWarnings`, `runtimeError`, `environment.benchmarkIndex`, `entities` (origins
|
|
27
|
+
grouped by company, `isFirstParty`), `configSettings.formFactor`, `.screenEmulation`,
|
|
28
|
+
`.throttlingMethod`, `.throttling` (`rttMs`, `throughputKbps`, `cpuSlowdownMultiplier`; the
|
|
29
|
+
`devtools` method uses `requestLatencyMs`, `downloadThroughputKbps`), `categories.performance.score`
|
|
30
|
+
(0–1), and `audits.<id>` with `score`, `scoreDisplayMode`, `numericValue`, `displayValue`,
|
|
31
|
+
`metricSavings` (Lighthouse 11 and later: `{LCP, FCP, TBT, CLS, INP}`) and `details`
|
|
32
|
+
(`type` is `opportunity`, `table`, `list` or `checklist`; rows in `details.items`; opportunities
|
|
33
|
+
add `overallSavingsMs` and `overallSavingsBytes`). An audit with score ≥ 0.9 passed.
|
|
34
|
+
|
|
35
|
+
**PageSpeed Insights v5:** `lighthouseResult` (the LHR), `loadingExperience` (this URL) and
|
|
36
|
+
`originLoadingExperience` (whole origin). Each has `metrics.<KEY>.percentile`, `.category`
|
|
37
|
+
(`FAST`, `AVERAGE`, `SLOW`) and `.distributions`. Keys: `LARGEST_CONTENTFUL_PAINT_MS`,
|
|
38
|
+
`INTERACTION_TO_NEXT_PAINT`, `CUMULATIVE_LAYOUT_SHIFT_SCORE` (**multiplied by 100**: 14 means
|
|
39
|
+
0.14), `FIRST_CONTENTFUL_PAINT_MS`, `EXPERIMENTAL_TIME_TO_FIRST_BYTE`. `origin_fallback: true`
|
|
40
|
+
means the URL had too little traffic and the numbers are the origin's. The PSI strategy (mobile
|
|
41
|
+
or desktop) sets which form factor the field data is.
|
|
42
|
+
|
|
43
|
+
**CrUX API record:** `record.key` (`url` or `origin`, `formFactor`), `record.metrics.<name>.percentiles.p75`
|
|
44
|
+
(CLS p75 is a string such as `"0.14"`), `histogram[0].density` (share good), `collectionPeriod`.
|
|
45
|
+
|
|
46
|
+
## Audits by the vital they act on
|
|
47
|
+
|
|
48
|
+
| Audit id | Acts on | Reads as |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| `largest-contentful-paint-element` | LCP | the element, and the phase table (`TTFB`, `Load Delay`, `Load Time`, `Render Delay`) |
|
|
51
|
+
| `lcp-lazy-loaded` | LCP | score 0 means the LCP image has `loading="lazy"` |
|
|
52
|
+
| `prioritize-lcp-image` | LCP | the LCP image is requested late; a preload or `fetchpriority` would start it sooner |
|
|
53
|
+
| `server-response-time`, `redirects`, `uses-rel-preconnect` | LCP, FCP | time before the first byte or first request |
|
|
54
|
+
| `render-blocking-resources` | FCP, LCP render delay | CSS or sync JS in the head |
|
|
55
|
+
| `uses-responsive-images`, `modern-image-formats`, `uses-optimized-images`, `offscreen-images` | LCP only when the LCP image is in the rows | otherwise bytes and load time |
|
|
56
|
+
| `unused-javascript`, `unused-css-rules`, `unminified-*`, `uses-text-compression` | whatever `metricSavings` says | often load time only |
|
|
57
|
+
| `layout-shifts` (older: `layout-shift-elements`), `unsized-images`, `font-display`, `non-composited-animations` | CLS | the element and the cause |
|
|
58
|
+
| `long-tasks`, `bootup-time`, `mainthread-work-breakdown`, `third-party-summary`, `third-party-facades` | TBT, a proxy for INP | scripts and entities by main-thread time |
|
|
59
|
+
|
|
60
|
+
Lighthouse 12 also emits `*-insight` audits (`lcp-breakdown-insight` or `lcp-phases-insight`,
|
|
61
|
+
`lcp-discovery-insight`, `cls-culprits-insight`, `third-parties-insight`,
|
|
62
|
+
`render-blocking-insight`); the script reads the LCP and third-party ones when the classic audit is
|
|
63
|
+
missing.
|
|
64
|
+
|
|
65
|
+
## LCP phases
|
|
66
|
+
|
|
67
|
+
| Phase | What it measures | When it dominates |
|
|
68
|
+
|---|---|---|
|
|
69
|
+
| TTFB | navigation start to the HTML's first byte | cache the HTML (CDN or edge), remove redirects, fix backend time |
|
|
70
|
+
| Resource load delay | first byte to the LCP resource's request | remove `loading="lazy"`, add `fetchpriority="high"`, put the `<img>` in the server HTML; a CSS background or JS-inserted image needs `<link rel="preload" as="image" fetchpriority="high">` |
|
|
71
|
+
| Resource load duration | the LCP resource's download | `srcset`/`sizes` matched to the viewport, AVIF or WebP, a CDN close to users |
|
|
72
|
+
| Element render delay | resource loaded to element painted | inline critical CSS, defer non-critical JS, avoid client-side rendering of the LCP element, break up long tasks before paint |
|
|
73
|
+
|
|
74
|
+
A text LCP element has zero load delay and duration. The healthy split puts most of the time in
|
|
75
|
+
TTFB and load duration, with load delay and render delay near zero.
|
|
76
|
+
|
|
77
|
+
## CLS causes Lighthouse reports
|
|
78
|
+
|
|
79
|
+
| Cause | Fix |
|
|
80
|
+
|---|---|
|
|
81
|
+
| Unsized image element | `width` and `height` attributes, or CSS `aspect-ratio` |
|
|
82
|
+
| Web font loaded | `font-display: optional` or `swap` with a `size-adjust`ed fallback; preload the font |
|
|
83
|
+
| Injected iframe, ad or banner | reserve the slot with `min-height`; overlay banners instead of pushing content |
|
|
84
|
+
| Media element | dimensions on `<video>` and embeds |
|
|
85
|
+
| Non-composited animation | animate `transform` and `opacity` only |
|
|
86
|
+
|
|
87
|
+
A navigation run records shifts during load. Shifts on scroll, after consent clicks or from late
|
|
88
|
+
ads count in field CLS and not in the lab, so field CLS above lab CLS points there; the web-vitals
|
|
89
|
+
library's attribution build reports the element per shift in RUM.
|
|
90
|
+
|
|
91
|
+
## Run settings
|
|
92
|
+
|
|
93
|
+
| Preset | RTT | Throughput | CPU | Screen |
|
|
94
|
+
|---|---|---|---|---|
|
|
95
|
+
| Default mobile (also PSI mobile) | 150 ms | 1.6 Mbps | 4x slowdown | 412 × 823 (Moto G Power) |
|
|
96
|
+
| `--preset=desktop` (also PSI desktop) | 40 ms | 10 Mbps | 1x | 1350 × 940 |
|
|
97
|
+
|
|
98
|
+
`throttlingMethod: simulate` (default) loads unthrottled and models the throttled timings, so
|
|
99
|
+
metrics are estimates; `devtools` applies throttling for real; `provided` applies none.
|
|
100
|
+
`benchmarkIndex` is the host CPU's score: a slow or busy machine inflates TBT and LCP. Runs
|
|
101
|
+
compare only with the same URL, preset, throttling, Lighthouse version and a similar host.
|
|
102
|
+
Lighthouse scores vary between runs of the same page; take the median of 3 to 5.
|
|
103
|
+
|
|
104
|
+
CrUX field data is a rolling 28 days, so a fix shows fully about four weeks after release. RUM
|
|
105
|
+
p75 for the same days shows it sooner.
|