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

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

Build:
Build:
LAST BUILD BRANCH: v2.4.0
DEFAULT BRANCH: main
Repo Added 10 Sep 2024 01:22PM UTC
Files 153
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

LAST BUILD ON BRANCH v2.3.0
branch: v2.3.0
CHANGE BRANCH
x
Reset
  • v2.3.0
  • 0.1.4
  • 1.1.0
  • 1.1.1
  • 1.1.2
  • 1.1.3
  • 1.1.5
  • 1.1.6
  • 1.1.7
  • 1.1.8
  • 1.2.0
  • 1.2.1
  • 1.2.2
  • 1.2.3
  • 1.2.4
  • 1.3.0
  • 1.4.0
  • 1.5.0
  • 1.5.1
  • 1.5.2
  • 1.6.0
  • 1.7.0
  • 1.8.0
  • 1.8.1
  • 1.9.0
  • feat/mcp-server
  • fix/stacktrace-display
  • main
  • multi-login
  • selection
  • tailwind
  • v2.0.0
  • v2.0.0-RC1
  • v2.0.0-RC2
  • v2.0.0-RC3
  • v2.0.0-RC4
  • v2.0.1
  • v2.0.2
  • v2.0.3
  • v2.1.0
  • v2.2.0
  • v2.4.0

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

Relevant lines Covered
Build:
Build:
3463 RELEVANT LINES 3259 COVERED LINES
23.23 HITS PER LINE
Source Files on v2.3.0
  • Tree
  • List 153
  • Changed 0
  • Source Changed 0
  • Coverage Changed 0
Coverage ∆ File Lines Relevant Covered Missed Hits/Line

Recent builds

Builds Branch Commit Type Ran Committer Via Coverage
37310161479 v2.3.0 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 regressio... push 05 Oct 2026 12:32PM UTC tito10047 github
94.11
See All Builds (111)
  • Repo 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