You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Second agent-journey run (Claude Code · Sonnet 4.6, intent: "I'm evaluating this product. What does it cost?"): 44 steps / 155s / 848k tokens ($0.60) to reconstruct pricing that worldmonitor.app/pricing.md answers in one fetch. Reliability 70%, link-following 61%. Sibling of #4850 (signup journey); the UA-403 root cause is tracked there.
The core failure: pricing is only discoverable via llms.txt (line 31: "Keys, plans & limits: https://worldmonitor.app/pricing.md"). This journey entered through the other discovery chain — Link headers → .well-known/api-catalog → agent-skills/index.json → server-card.json → openapi.yaml — and none of those surfaces mention pricing at all (verified by grep: zero hits in all four). So the agent guessed doc slugs and endpoint paths, and every guess 404'd.
no CommerceService in the OpenAPI set — commerce ops exist only as prose in docs/api-commerce.mdx
api.worldmonitor.app/api/plans
403 (its UA)
actually 404 with a good UA — WAF masks "missing" as "blocked" (#4850 item 1)
Also: public/pricing.md says nothing about overage/429 behavior — the agent had to infer "429, no auto-billing" from a rate-limit-header mention.
Fixes
Put pricing on the discovery chain agents actually follow. Add /pricing.md + GET /api/product-catalog references to: .well-known/api-catalog linkset, server-card.json, agent-skills/index.json, and the root openapi.yamlinfo.description. Optionally a Link header entry alongside the existing rel set in vercel.json.
CommerceService in the OpenAPI/api-reference set — at minimum GET /api/product-catalog (public, keyless) as docs/api/CommerceService.openapi.yaml + docs.json api-reference group, so the canonical Mintlify path the agent guessed actually exists.
"Limits & overage" section in pricing.md (mirror pointer in usage-rate-limits): hard 429 + Retry-After, no auto-billing today, upgrade path. Word it to stay true once the feat(api): add Dodo overage event contract #4791 overage event contract lands.
What the journey report got wrong (for the record)
"No centralized rate-limits page" — false: /docs/usage-rate-limits exists with a working .md twin; the slug just isn't guessable and nothing the agent read linked it.
Context
Second agent-journey run (Claude Code · Sonnet 4.6, intent: "I'm evaluating this product. What does it cost?"): 44 steps / 155s / 848k tokens ($0.60) to reconstruct pricing that
worldmonitor.app/pricing.mdanswers in one fetch. Reliability 70%, link-following 61%. Sibling of #4850 (signup journey); the UA-403 root cause is tracked there.The core failure: pricing is only discoverable via
llms.txt(line 31: "Keys, plans & limits: https://worldmonitor.app/pricing.md"). This journey entered through the other discovery chain — Link headers →.well-known/api-catalog→agent-skills/index.json→server-card.json→openapi.yaml— and none of those surfaces mention pricing at all (verified by grep: zero hits in all four). So the agent guessed doc slugs and endpoint paths, and every guess 404'd.Verified failure inventory (2026-07-05, descriptive UA)
/docs/pricing.md,/docs/tiers.md,/docs/plans.md/pricing.md(200, text/markdown)/docs/rate-limit.md,/docs/rate-limits.md/docs/usage-rate-limits(+ working.mdtwin)/docs/mcp-api-key.md/docs/usage-auth/docs/api-reference/commerceservice/getproductcatalog(.md)docs/api-commerce.mdxapi.worldmonitor.app/api/plansAlso:
public/pricing.mdsays nothing about overage/429 behavior — the agent had to infer "429, no auto-billing" from a rate-limit-header mention.Fixes
/pricing.md+GET /api/product-catalogreferences to:.well-known/api-cataloglinkset,server-card.json,agent-skills/index.json, and the rootopenapi.yamlinfo.description. Optionally aLinkheader entry alongside the existing rel set invercel.json.docs/pricing.mdx("Plans & pricing") in the Mintlify nav — gives/docs/pricing+ free.mdtwin. Keep tier copy generated/derived fromconvex/config/productCatalog.tsor link-only, to avoid the pro-bundle-freshness drift class (process: catalog marketingFeatures changes silently ship stale /pro copy (freshness gate misses convex→pro-test; copy triplicated) #4575/feat(welcome): any-stack builders story — hero cue, install terminal, SDK pricing copy #4845).docs.jsonredirects (block already exists) for natural guesses:plans→pricing,tiers→pricing,rate-limit/rate-limits→usage-rate-limits,mcp-api-key→usage-auth.GET /api/product-catalog(public, keyless) asdocs/api/CommerceService.openapi.yaml+docs.jsonapi-reference group, so the canonical Mintlify path the agent guessed actually exists.pricing.md(mirror pointer inusage-rate-limits): hard 429 +Retry-After, no auto-billing today, upgrade path. Word it to stay true once the feat(api): add Dodo overage event contract #4791 overage event contract lands.What the journey report got wrong (for the record)
/docs/usage-rate-limitsexists with a working.mdtwin; the slug just isn't guessable and nothing the agent read linked it./api/product-catalogblocked" — endpoint works; 403 is the Cloudflare UA rule (feat(agent-readiness): signup-journey gaps — WAF UA-403 undocumented, account creation invisible to fetch agents, /blog/posts 404 #4850).Dup pre-flight:
gh-axi search issuesfor pricing discoverability / docs redirects / CommerceService openapi → no existing coverage beyond #4850's overlap.