Skip to content

feat: project.favicon, a 10 s step check, and the history copy fix - #20

Merged
psanders merged 3 commits into
mainfrom
fix/favicon-step-check-page-text
Nov 5, 2026
Merged

psanders merged 3 commits into
mainfrom
fix/favicon-step-check-page-text

Conversation

@psanders

@psanders psanders commented Nov 5, 2026

Copy link
Copy Markdown
Member

Three small changes.

1. project.favicon (feat). perfkit.yaml takes an optional project.favicon: a path relative to perfkit.yaml, .svg only, the same as project.logo. perfkit validate checks that the file exists. The run reads it when it starts and inlines it as project.faviconSvg in report.json and live.json (perfkit/live/v1 reuses the report's project schema). Every page head links it as <link rel="icon" type="image/svg+xml" href="data:image/svg+xml,..."> (URL-encoded SVG): the shells (index.html and each runs/<id>/index.html, so the tab has its icon before the app draws), the run page and the live page. The shells use the favicon of the report being rendered. Without a favicon, no link is written and the pages stay byte for byte the same. The JSON Schema files are regenerated (npm run schemas).

2. Step length check (fix). SIPp writes its counters every 10 s, so a capacity step whose load.rate.every is not a multiple of 10 s mixes two steps. Validation now rejects it: benchmarks[0].load.rate.every: expected a multiple of 10 s (SIPp reports every 10 s); got 15s. The duration-to-seconds helper moved out of checkWarmupShorterThanStep into src/schemas/durationSeconds.ts so both checks use it.

3. History copy (fix). "Every run keeps its own page and report.json. Open one to see it exactly as it was." is now "Every run keeps its own page and report.json.", because the current app redraws every page.

Docs: docs/perfkit-yaml.md (field table and example), docs/report-v1.md (project.faviconSvg), docs/report-page.md, and the README's Capacity section.

For callers pinning a version: perfkit.yaml gains an optional field and rejects steps that aren't a multiple of 10 s (the examples use 60s). report.json and live.json gain an optional project.faviconSvg. The workflow inputs are unchanged.

Verify: npm test (643 passing), npm run typecheck, npm run lint.

🤖 Generated with Claude Code

Pages are drawn by the current app, so an older run is redrawn by a newer perfkit.
SIPp writes its statistics every 10 s, so a step like 15s mixes the counters of two steps. perfkit.yaml validation now rejects it at load.rate.every.
perfkit.yaml takes an optional project.favicon (.svg, relative to the file). The run reads it when it starts and inlines it as project.faviconSvg in report.json and live.json. The shells, the run page and the live page link it as a URL-encoded data:image/svg+xml icon; without one, the pages are unchanged.
@psanders
psanders merged commit 937f3c7 into main Nov 5, 2026
2 checks passed
@psanders psanders mentioned this pull request Nov 5, 2026
@psanders
psanders deleted the fix/favicon-step-check-page-text branch November 5, 2026 14:26
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.

1 participant