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

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

Build:
Build:
LAST BUILD BRANCH: v2.4.0
DEFAULT BRANCH: main
Ran 21 Sep 2026 01:42PM UTC
Jobs 1
Files 64
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

21 Sep 2026 01:38PM UTC coverage: 86.434% (+0.4%) from 86.077%
35607217185

push

github

tito10047
feat(mcp): let the tools read a custom record type

The finder rooted every query at RecordLog, so a record type an application
adds by extending Record directly was collected, shown on the dashboard, and
then invisible to the one reader that could act on it. A cron run that never
finished is exactly such a type, and exactly the thing worth handing to an
assistant.

Queries now root at Record and are narrowed by bug_catcher.mcp.record_types,
resolved to discriminator values by the new Mcp\RecordTypes and applied the way
LogList already does it. The default stays RecordLog and RecordLogTrace, so an
application that configures nothing sees no change.

Kept apart from dashboard_list_items on purpose. A token holder can resolve and
archive what it finds, so adding a type is a decision to take on its own, not a
side effect of putting it on a page. A class outside the discriminator map is
refused with an exception naming the ones that are in it - LogList drops unknown
classes silently, and that is precisely how this repository's own test app came
to list a class that does not exist (fixed here too).

Three consequences worth spelling out:

Record now answers getMessage(), getLevel() and getRequestUri() with null, so
every subtype has the shape the tools promise. Deliberately not #[Ignore]d: the
serializer merges attribute metadata down the hierarchy, so ignoring the getter
here also ignores the mapped property in RecordLog, and every ingest POST fails
validation as a blank message. Twenty tests said so.

minLevel cannot read record.level off a Record root - DQL has no TREAT() - so it
becomes a semi-join into RecordLog. That says the right thing as well: asking
for a level floor asks for the records that carry a level, so a cron run drops
out rather than passing itself off as level 0.

groups() sets HINT_FORCE_PARTIAL_LOAD, since a Record root LEFT JOINs every
subtype table and the aggregate reads none of them. representatives() must not:
those entities are ... (continued)

59 of 61 new or added lines in 4 files covered. (96.72%)

1166 of 1349 relevant lines covered (86.43%)

11.58 hits per line

Uncovered Changes

Lines Coverage ∆ File
2
87.1
-5.76% src/Entity/Record.php
Jobs
ID Job ID Ran Files Coverage
1 35607217185.1 21 Sep 2026 01:42PM UTC 64
86.43
GitHub Action Run
Source Files on build 35607217185
  • Tree
  • List 64
  • Changed 4
  • Source Changed 0
  • Coverage Changed 4
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • e32645ba on github
  • Prev Build on main (#34589800380)
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