feat: rewrite README around the seller journey + harden buyer discovery surfaces#699
Open
OisinKyne wants to merge 2 commits into
Open
feat: rewrite README around the seller journey + harden buyer discovery surfaces#699OisinKyne wants to merge 2 commits into
OisinKyne wants to merge 2 commits into
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Two related pushes toward the same goal — making it easier for buyers to find, understand, and pay a seller running the Obol Stack.
README rewrite
The README still pitched "run decentralised infrastructure locally" while the actual product story — sell inference/agents/HTTP services via x402, get discovered, buy from other sellers — lived almost entirely in the Troubleshooting section.
obol sell http/agent/pricing/register/info/identity,obol buy inference, and all ofobol domainappeared nowhere.The new README is journey-ordered: Overview → Getting Started → Sell your first paid service → Sell other service types → Run your business → Buy services → Agents/Skills → Models → Networks → Apps. Notables:
/,/skill.md,/api/services.json,/openapi.json,/.well-known/agent-registration.json,/services/<name>/*).obol buy inferencedocumented as a first-class CLI command (previously only mentioned viabuy.py).cmd/obolflag definitions (e.g.sell inference --networkalias--chaindefaultbase;agent newpositional name +--model/--skills/--objective/--create-wallet).Buyer discovery surface bundle
Four gaps that directly hurt buyer conversion, from the discovery-surface audit:
obol-catalog-headersTraefik Middleware (Access-Control-Allow-Origin: *,GET, OPTIONS,Cache-Control: public, max-age=300) attached viaExtensionRefto/skill.md,/openapi.json,/api, and/api/services.json. Browser-based buyers and dashboards could previously not fetch the catalog at all. Deliberately not attached to paid/services/*routes, nor to the ERC-8004 registration routes (those live in per-agent namespaces where a Gateway API ExtensionRef cannot reference anx402-namespace Middleware)./skill.md— every service block gains a "Try it" section: a 402-probe curl plus, for inference/agent offers, the paid chat-completions request built frominternal/buyprompts— byte-identical to thebuy.examplefield services.json publishes, so the two surfaces cannot drift. Model resolution (incl. theStatus.AgentResolutionfallback for agent offers) extracted into a sharedcatalogModelName()helper used by both generators.schemaVersion: "1"on the services.json envelope — first field of the envelope, added to the JSON schema as required. All in-repo consumers verified lenient (plainjson.Unmarshal, noDisallowUnknownFields; the storefront'scatalog.tspicks named fields; buy.py reads specific keys).Link: </api/services.json>; rel="catalog"header on 402 responses — both JSON and HTML paths, so an agent landing on a paid endpoint cold can self-serve discovery. Header-only; zero change to verification/settlement logic or the 402 body schema.Testing
go build ./...,go test ./internal/serviceoffercontroller/... ./internal/x402/... ./internal/schemas/... ./internal/buyprompts/... ./cmd/obol/... ./internal/buy/...serviceoffer-controller): CORS/Cache-Control headers present on catalog routes, Try-it blocks render with real model ids, 402 carries the Link header.Review focus
internal/x402/forwardauth.go/paymentrequired.go: the Link header must be the only behavioral delta — no change to verify/settle flow, status codes, or 402 body.internal/serviceoffercontroller/render.go: the headers Middleware must not be attached to any/services/*paid route (locked by the pre-existingTestBuildHTTPRouteno-filter invariant).internal/schemas/: schemaVersion isrequiredin the schema — acceptable because the controller is the only producer and schema ships in lockstep.🤖 Generated with Claude Code