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

stacklok / toolhive / 30376052943
70%

Build:
DEFAULT BRANCH: main
Ran 28 Jul 2026 04:07PM UTC
Jobs 1
Files 853
Run time 2min
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

28 Jul 2026 03:59PM UTC coverage: 69.883% (+0.01%) from 69.87%
30376052943

push

github

web-flow
Reject malformed prior act claims at token exchange (#6114)

* Reject malformed prior act claims at token exchange

RFC 8693 §4.1 requires the act claim to be a JSON object, but the token
exchange handler copied a subject token's prior act into the newly minted
token without checking its shape. The depth gate did not catch it either:
actChainDepth returned 0 for any non-map, making "absent" and "malformed"
indistinguishable, so a subject token carrying act: "some-agent" produced
a minted token asserting a delegation chain we ourselves would flag as
non-conformant on the consuming side.

Reuse the shared audit-side parser adopted in #6107 rather than teaching
the bespoke walker about shapes: it reports the depth and the conformance
verdict in one pass, so the two cannot disagree. The exchange is now
rejected with invalid_grant, consistent with the adjacent depth, consent,
and expiry gates.

The new gate is monotonically stricter than the old one: a well-formed
chain yields len(Chain) == min(depth, cap), so the depth boundary is
unchanged and nothing previously rejected is newly accepted.

Closes #6093

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Pin the iss_not_string rejection reason

The gate rejects on every reason ParseDelegationChain reports and surfaces
the reason in the client-visible hint, but only three of the four were
covered. Add the non-string iss case so the fourth reason and its hint are
pinned too.

The hop keeps a valid sub: the parser reports the first violation it finds
and checks iss before sub, so a hop with both non-string would report only
iss_not_string and leave this branch unpinned.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>

19 of 19 new or added lines in 1 file covered. (100.0%)

4 existing lines in 2 files now uncovered.

81804 of 117058 relevant lines covered (69.88%)

97.88 hits per line

Coverage Regressions

Lines Coverage ∆ File
2
73.78
-0.24% pkg/transport/proxy/streamable/streamable_proxy.go
2
88.24
-5.88% pkg/vmcp/backendregistry/registry.go
Jobs
ID Job ID Ran Files Coverage
1 30376052943.1 28 Jul 2026 04:07PM UTC 853
69.88
GitHub Action Run
Source Files on build 30376052943
  • Tree
  • List 853
  • Changed 10
  • Source Changed 1
  • Coverage Changed 10
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Github Actions Build #30376052943
  • 735225f0 on github
  • Prev Build on main (#30374920773)
  • Next Build on main (#30377444162)
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