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
A sellable agent service that smoke-tests another Obol Stack's public surface and leaves a verifiable trail: report committed to a public GitHub repo, verdict recorded as an ERC-8004 ValidationRegistry response.
scripts/smoke.py — strictly read-only probes against a target base URL: /skill.md (200 + non-empty), /api/services.json (200 + valid catalog shape), per advertised service a 402-shape check (valid x402 accepts[]: scheme/network/payTo/asset/amount), /.well-known/agent-registration.json (informational). Never sends X-PAYMENT, never signs, bodies capped at 1 MiB. Emits report.md + machine-readable results.json (score 0–100, sha256 of the report bytes).
scripts/gh_post.py — commits the report to a seller-owned public repo via the GitHub contents API. Token only from env, a no-redirect handler prevents the Bearer header ever following a redirect cross-host, ≤2 writes per run, bounded Retry-After backoff, token never logged.
obol smoke calldata — derives the ValidationRegistry validationResponse calldata for the run (requestHash = keccak256("obol/smoke-test/v1|<target>|<runId>"), golden-tested; selector 0x3d659a96 pinned). The operator submits with their own wallet — the agent and controller never sign chain transactions. This PR carries the additive internal/erc8004/validation.go calldata builders it needs.
Provisioning: stock machinery — obol agent new <name> --skills smoke-test, then obol sell agent <name> to gate it behind x402. GitHub credentials ride the existing optional hermes-env Secret (already whitelisted by the admission policy and RBAC) — this PR adds zero render/RBAC/admission changes.
Why
Buyers paying for a test run shouldn't have to trust the agent's word. The trail is tamper-evident at three layers: the report's sha256 is in results.json, the same bytes are committed to a public repo (independently timestamped), and the same hash lands on-chain in the validation response. Either side rewriting history becomes detectable.
v0 deliberately posts to the seller's report repo — no buyer token handoff, no third-party repo access to reason about. Buyer-repo posting is a follow-up with an explicit access-grant handshake.
Validation
Full unit suite green (golden request-hash + calldata tests, CLI flag validation, redirect-guard regression test in tests/).
Live smoke on a fresh k3d cluster: agent provisioned via agent new --skills smoke-test with a local Ollama model, skill materialized in-pod, in-pod self-probe of the stack's own public surface → 3/3 checks, score 100/100, well-formed report + results, and obol smoke calldata produced the correct registry calldata for the run. (The per-service 402 check exercised a live paid offer end-to-end.)
GitHub posting path covered by unit test + degrades gracefully to local-report-only when no token is configured.
New flows/flow-20-smoke-agent.sh (cluster/GitHub gated, skips clean) + docs/guides/smoke-test-agent.md (includes GitHub App vs fine-grained PAT guidance and rate-limit/AUP notes).
Known v0 limitations
Results are self-reported by the agent; the verifiable trail makes lying detectable after the fact, not impossible. Pairing runs with independent re-execution is the planned hardening.
GitHub 422-on-concurrent-create is not retried (single-writer assumption per report repo).
flow-20 is standalone, not yet wired into release-smoke.
I don't think obol smoke is a good verb. maybe obol test. i think this is a bit confusingly framed yet, and not easy enough to understand the why, (i guess 'Pay an agent to test your sold services and publish a report about them', longer desc: 'This command sends a third party agent enough fees + data to test a given service you have on offer, publishing a report on the test to a permanent URL, allowing you to use it as an Agent sale verification (ERC8004). Use this service if you want to improve the legitimacy of your service for discovery.
and tbh, i'm not sure we need such a feature yet. IDK if any key registries use the 8004 format for verification, do you know of any?
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
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.
What
A sellable agent service that smoke-tests another Obol Stack's public surface and leaves a verifiable trail: report committed to a public GitHub repo, verdict recorded as an ERC-8004 ValidationRegistry response.
Three pieces:
smoke-testskill (internal/embed/skills/smoke-test/):scripts/smoke.py— strictly read-only probes against a target base URL:/skill.md(200 + non-empty),/api/services.json(200 + valid catalog shape), per advertised service a 402-shape check (valid x402accepts[]: scheme/network/payTo/asset/amount),/.well-known/agent-registration.json(informational). Never sendsX-PAYMENT, never signs, bodies capped at 1 MiB. Emitsreport.md+ machine-readableresults.json(score 0–100, sha256 of the report bytes).scripts/gh_post.py— commits the report to a seller-owned public repo via the GitHub contents API. Token only from env, a no-redirect handler prevents the Bearer header ever following a redirect cross-host, ≤2 writes per run, bounded Retry-After backoff, token never logged.obol smoke calldata— derives the ValidationRegistryvalidationResponsecalldata for the run (requestHash = keccak256("obol/smoke-test/v1|<target>|<runId>"), golden-tested; selector0x3d659a96pinned). The operator submits with their own wallet — the agent and controller never sign chain transactions. This PR carries the additiveinternal/erc8004/validation.gocalldata builders it needs.obol agent new <name> --skills smoke-test, thenobol sell agent <name>to gate it behind x402. GitHub credentials ride the existing optionalhermes-envSecret (already whitelisted by the admission policy and RBAC) — this PR adds zero render/RBAC/admission changes.Why
Buyers paying for a test run shouldn't have to trust the agent's word. The trail is tamper-evident at three layers: the report's sha256 is in
results.json, the same bytes are committed to a public repo (independently timestamped), and the same hash lands on-chain in the validation response. Either side rewriting history becomes detectable.v0 deliberately posts to the seller's report repo — no buyer token handoff, no third-party repo access to reason about. Buyer-repo posting is a follow-up with an explicit access-grant handshake.
Validation
tests/).agent new --skills smoke-testwith a local Ollama model, skill materialized in-pod, in-pod self-probe of the stack's own public surface → 3/3 checks, score 100/100, well-formed report + results, andobol smoke calldataproduced the correct registry calldata for the run. (The per-service 402 check exercised a live paid offer end-to-end.)flows/flow-20-smoke-agent.sh(cluster/GitHub gated, skips clean) +docs/guides/smoke-test-agent.md(includes GitHub App vs fine-grained PAT guidance and rate-limit/AUP notes).Known v0 limitations