• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

php-bug-catcher / bug-catcher / 37310161479
94%
main: 94%

Build:
Build:
LAST BUILD BRANCH: v2.4.0
DEFAULT BRANCH: main
Ran 05 Oct 2026 12:32PM UTC
Jobs 1
Files 153
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

05 Oct 2026 12:30PM UTC coverage: 94.109%. First build
37310161479

push

github

tito10047
feat(perf): a window you can point at, and a way in from the regression

`/performance` took no query parameters at all, so the only view it could offer
was the last N hours of everything - which is the one view that cannot answer
what a regression asks. The window also lived three times over as an
unsynchronised `int $hours`, and `PerfReportBuilder::timeSeries()` has taken a
`$path` since it was written with nothing ever passing one.

The window is now `(at, hours)`: `[at, at + hours)`, with no `at` meaning "ends
now", byte for byte what every panel did before. `PerfRangeResolver` is the only
thing between the query string and a chart and owns both hardenings - `hours` is
clamped to `[1, MAX_HOURS]` (a year, the last window that is still a chart at 365
day-points; without a ceiling `?hours=100000` is a denial of service anybody can
type against a page that is often behind no firewall), and an `at` that does not
parse falls back to live rather than throwing. Strict parsing on purpose: `now`
and `+3 weeks` would make a link's window depend on when it was clicked.

Each panel keeps its own copies, the way each already keeps its own `sort` and
`group`; the URL seeds the first render. Granularity stays out of the controls -
`GranularityResolver` picks it from the width and the x labels already self-thin.

`Detail:PerfChart` closes the loop with a link carrying `at` half a window *before*
`windowAt`, so the spike lands in the middle, plus the route and a
`#perf-path-<md5>` fragment the matching `PerfTopPaths` row answers to. Centring
is the link's decision, not the resolver's, so a time picked by hand is the time
you get. The fragment often points at a row that is not in the table - a route
slow enough to regress is frequently not one called often enough to be heavy - so
the panel says so instead of silently not scrolling.

Three things about the pickers that each fail silently otherwise:

- they emit only their own `vdp:`/`vtp:` CustomEvents, so the contr... (continued)

59 of 60 new or added lines in 9 files covered. (98.33%)

3259 of 3463 relevant lines covered (94.11%)

23.23 hits per line

Uncovered Changes

Lines Coverage ∆ File
1
95.65
src/Twig/Components/PerfTopPaths.php
Jobs
ID Job ID Ran Files Coverage
1 37310161479.1 05 Oct 2026 12:32PM UTC 153
94.11
GitHub Action Run
Source Files on build 37310161479
  • Tree
  • List 153
  • Changed 0
  • Source Changed 0
  • Coverage Changed 0
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • 8ab8c9e9 on github
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc