Observed (agent-bundle 105c65d)
contract.ts documents: "Route id -> fixture. Every compiled non-app route on the server must be covered" and "MCP Apps are not registered at this level".
Running runPackedContractMatrix over a packed server with one MCP App (src/mcp/hauler/apps/dashboard.tsx) with fixtures for all six tools only:
Contract matrix reported 1 violation(s) at the packed-stdio proof level.
- app:hauler/dashboard / coverage: compiled route has no fixture entry
Adding 'app:hauler/dashboard': {} makes it pass, and the report then shows coverage/surface-completeness/sweep: passed for the app (it does read the ui:// resource). So the packed level does cover apps — which is good — but the docs and the ContractMatrixOptions.fixtures comment say otherwise, and ContractRouteFixture has no way to express "resource route, no input" other than an empty object.
Request
- Either exempt app routes from the coverage check at every level, or (better, since the sweep is useful) update the docs to say apps are covered and accept
{}.
- Consider a typed
{ kind: 'resource' } fixture or an apps: 'auto' option so consumers don't have to enumerate app route ids by hand.
Related: cancellation check wording
tool:hauler/hauler_await / cancellation: aborted callTool settled without throwing or rejecting. fired because my fixture aborted at 50ms a call that had already returned (the awaited ticket was finished). That's a fixture mistake, but the message reads like a route bug. If the call settles before abortAfterMs elapses, report not-applicable with reason "invocation completed before abort; use an input that stays in flight" instead of failed.
Observed (agent-bundle 105c65d)
contract.tsdocuments: "Route id -> fixture. Every compiled non-app route on the server must be covered" and "MCP Apps are not registered at this level".Running
runPackedContractMatrixover a packed server with one MCP App (src/mcp/hauler/apps/dashboard.tsx) with fixtures for all six tools only:Adding
'app:hauler/dashboard': {}makes it pass, and the report then showscoverage/surface-completeness/sweep: passedfor the app (it does read theui://resource). So the packed level does cover apps — which is good — but the docs and theContractMatrixOptions.fixturescomment say otherwise, andContractRouteFixturehas no way to express "resource route, no input" other than an empty object.Request
{}.{ kind: 'resource' }fixture or anapps: 'auto'option so consumers don't have to enumerate app route ids by hand.Related: cancellation check wording
tool:hauler/hauler_await / cancellation: aborted callTool settled without throwing or rejecting.fired because my fixture aborted at 50ms a call that had already returned (the awaited ticket was finished). That's a fixture mistake, but the message reads like a route bug. If the call settles beforeabortAfterMselapses, reportnot-applicablewith reason "invocation completed before abort; use an input that stays in flight" instead offailed.