ci(adcp): add storyboard CI job for seller_agent.py compliance checks#309
Merged
ci(adcp): add storyboard CI job for seller_agent.py compliance checks#309
Conversation
Adds a non-blocking storyboard CI job (continue-on-error: true) that boots examples/seller_agent.py and runs the @adcp/client storyboard suite on every PR. Uses curl-based HTTP readiness polling instead of lsof, bounds the wait with a 30s timeout + PID-alive-check, and guards json.load with a file-existence check. Artifact always uploaded. Non-blocking until seller-agent content gaps in #304 are resolved. Closes #305 https://claude.ai/code/session_01SSje6ebBHD85TWdQbEig9m
- overall_status check: 'pass' → 'passing' (actual runner enum value) - Assert step: dump full JSON on failure instead of d[k] (avoids KeyError) - Artifact upload: add if-no-files-found: warn and run_attempt suffix - Comment: document @latest intent and 405-ok readiness check rationale https://claude.ai/code/session_01SSje6ebBHD85TWdQbEig9m
Acting on dx-expert review of this PR: On dual-stack hosts (and Ubuntu runners since actions/runner 2.300+), ``localhost`` resolves to ``::1`` first. uvicorn's default bind is IPv4-only, so the readiness probe and runner invocation each eat a connection-refused round-trip on ``::1`` before falling back to ``127.0.0.1``. Curl falls back automatically (so it still works), but it's wasteful and slightly fragile. Pin both call sites to ``127.0.0.1`` directly. The agent's bind address is unchanged (still ``0.0.0.0`` via ``ADCP_HOST`` default in #296); only the client-side address resolution changes. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ad17812 to
60375a9
Compare
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.
Closes #305
Adds a
storyboardCI job that bootsexamples/seller_agent.pyon port 3001 and runs the@adcp/clientstoryboard suite against it on every PR. The job catches end-to-end response-shape, status-enum, and capability-declaration regressions that unit tests and import smoke checks cannot see — exactly the class of breakage that silently broke#295/#296.The job is
continue-on-error: true(informational, non-blocking) becauseexamples/seller_agent.pyon currentmainhas known content gaps (#304) that produce partial results. Once those are fixed and the job goes green, removecontinue-on-errorto promote it to a required check.What's tested
python3 -c "import yaml; yaml.safe_load(...)"✓pytest,mypy,ruffnot applicable to this diffImplementation notes
http://localhost:3001/mcp(any non-000HTTP code means uvicorn is accepting HTTP); 30s timeout with PID-alive-check to fail fast if the agent crashes on startup@adcp/client@latest: intentionally unpinned — this is AdCP's own CI running AdCP's own canonical storyboard runner. Tracking latest surfaces protocol drift immediately, which is the purpose of this job. (The supply-chain risk vs.npx playwrighttreatment question was the only blocker/nit split in the prior triage;/triage executeresolved it.)storyboard-result-${{ github.run_attempt }}(suffixed to avoid v4 conflict on re-runs), withif-no-files-found: warnso a startup failure doesn't add a second noisy annotationPre-PR review
'pass'→'passing'enum mismatch (would have made the job permanently red) andd[k]KeyError in diagnostic print; both fixedupload-artifact@v4hard-error on missing file; fixed withif-no-files-found: warn; notedrun_attemptsuffix for re-run safety; appliedNits noted (not fixed):
Session: https://claude.ai/code/session_01SSje6ebBHD85TWdQbEig9m
Generated by Claude Code