update io.pilot.bowmark v1.0.1: attributable app-store traffic, and a demo that fits a small context - #99
Conversation
… the skill in a small context
9651147 to
3f34af9
Compare
|
Verified and merged. Your three claims all check out independently. The routes. Your read of It does need one operational thing, which is on us, not you: the broker's allow-list is registered configuration rather than something derived per call, so it has to be swapped to The demo. Gates. Production bundles for 1.0.1 are built, signed with the same publisher key, and live on the artifact registry with each public URL fetched back and sha-checked. Runtime e2e against them follows the broker swap. One note for next time, since it cost nothing here but could: 1.0.0's catalogue entry never merged, so the live catalogue is still on 0.1.0. 1.0.1 supersedes it and goes out directly. No user ever sees a 1.0.0. |
One file,
submissions/io.pilot.bowmark/submission.json, version 1.0.0 → 1.0.1.Thanks for the e2e writeup on #97: the broker detail in it is what made this PR possible, and what made me throw away my first attempt.
1. Attribution, via the method path
We cannot currently tell Pilot-driven traffic apart from anyone else's. Our MCP endpoint carries the installing directory in the URL (
/mcp/registry,/mcp/smithery), but the two REST routes the adapter fronts are the plain published ones, so an app-store arrival is indistinguishable from someone who pasted the endpoint by hand.pilot-appis a registered destination on our side, live in production now. An unrecognised segment falls through to normal handling rather than 404ing, so this cannot break in the direction that matters.My first attempt was a second
backend.headers[]entry, and it would have silently done nothing.Submission.BrokerEntrytakes the first non-empty header asAuthHeaderandbreaks, so a second entry never reachesbroker.AppEntry; andbroker.gobuilds a fresh upstream request carrying onlyContent-Typeand the injected key, exactly as its comment says. I ran your broker locally against an echo upstream to be sure:The path survives, no custom header does. So the header is gone from this PR and the path carries it. Nothing changes on your side:
allowis derived from the samehttp.pathvalues, so registration and forwarding stay consistent by construction.If arbitrary header pass-through is ever interesting to you as a feature, we would use it, but the path works today and needs nothing from you.
2. The demo now scores 100.0, from 90.0
demo-scoreput us at 90.0 on #97, and the whole 10 points were brevity: the rendered SKILL was 5145 bytes against the 3000 target. Since that skill is injected into a small-context agent's window, that is a real cost and not just a number.The counter-intuitive part, for anyone reading this later: cutting two examples cost nothing. The rubric bands examples at 2 to 6, so 3 and 5 score identically, and the two we dropped were a second fan-out that duplicated the first and a
Promise.allwhose lesson the remaining drill-down example already teaches. What is left covers the three genuinely different shapes: a capability that fans out across sites, reading an arbitrary page, and calling one named provider with two dependent calls in a single script.3. One line that would have failed your validator
next_steps.edges[2].then[0].whyhad grown to 242 chars against your 160 limit, from a copy change we made after #97 merged.TestAllSubmissionNextStepsValidcaught it. Fixed here.Validated
go test ./internal/publish/ ./internal/demo/ ./internal/demoeval/ ./internal/nextsteps/all pass off currentmain, anddemo-scorereports 100.0 /ok.Changelog
/v1/pilot-app/*, so calls arriving from the Pilot Protocol app store are attributable. No change to method names, parameters, or behaviour.incomplete.failures[].fixableon apartialresult, so an agent can tell its own rejected argument from a site that did not answer, and retry only what is worth retrying.