Repository navigation
Conversation
The solution card -- shape, agent build, model, provider, the options that actually applied, skill, command template, setup line, timeout -- plus a sha256 digest over the identity-bearing fields, computed from canonical JSON so a server in another language can recompute it and refuse a mismatch. - `report.json` records it under `provenance.solution.adapter` and `provenance.solution.adapter_digest`. Both additive and optional; no existing key changed. - A live-synced run is named after it: `identity.name`, `model.config` and `skills.installed` come from the card, so a site-graded row reads `claude-agent-acp@0.76.0 · sonnet · a/b@0123456` instead of "model not recorded". - `tp submit` shows the card's `cmd` and `setup` verbatim before publishing them -- unconditionally, including under `--yes`, since that flag means the user pre-consented to skipping the prompt, not that they were never told. Split out of #34. The half left behind is the submit-time capability gate: `GET /api/v2/capabilities` on the deployed site advertises no `solution_adapter` key today, so that gate would withhold the solution repo from every carded, anchored submit -- exactly the built-in-shape runs -- and send them up unranked, with no flag to override and a probe failure reading identically to a server that answered no. It belongs with the site-side work (W1/W2) that makes it resolve both ways, not ahead of it. `docs/reference/solution-card.md` plus `tests/data/solution_card_vectors.json` are the contract for the TypeScript implementation. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This was referenced Sep 22, 2026
This branch has not been deployed
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.
Split out of #34 — the additive half, with the submit-time capability gate left behind.
What lands here
The solution card: the labels that decide what a run measured — shape, agent build, model, provider, the options that actually applied, skill, command template, setup line, timeout — plus a
sha256digest over the identity-bearing fields, from canonical JSON so the site can recompute it and refuse a mismatch.report.jsonrecords it underprovenance.solution.adapterandprovenance.solution.adapter_digest. Both additive and optional; no existing key changed (CLAUDE.md constraint 4).identity.name,model.configandskills.installedcome from the card, so a site-graded row readsclaude-agent-acp@0.76.0 · sonnet · a/b@0123456instead of "model not recorded".tp submitshows the command line before publishing it. The card'scmdandsetupare echoed verbatim — never paraphrased, truncated or re-quoted — and unconditionally, including under--yes: that flag means the user pre-consented to skipping the prompt, not that they were never told what a carded submit makes public.docs/reference/solution-card.md+tests/data/solution_card_vectors.jsonare the contract for the TypeScript side (W1/W2/W6/W7). Both worked examples and all four shared vectors recompute byte-for-byte from live code.What is deliberately left out, and why
#34 also gated
tp submiton aGET /api/v2/capabilitiesprobe forfeatures.solution_adapter.supported, withholding the solution repository when the server would not confirm it stores cards. Verified against the deployed site today:There is no
solution_adapterkey, so that gate resolves one way for every caller. Merging it now would mean every carded, anchoredtp submitloses its repo and goes up unranked — which is exactly the built-in-shape runs, the path that exists so someone can measure an agent without writing a solution. Three things compound it:capabilities()catcheshttpx.HTTPErrorand returns{}, which takes the same branch, and the user-facing message reads the same either way — so a flaky network silently demotes a run.cmd/setupare shown, not checked), so the gate adds surface without adding protection.None of that is an argument against the gate — it is an argument for landing it with the site work that makes it resolve both ways. The card model,
card_digestandcard_labelhere are unchanged from #34, so that half rebases onto this cleanly.Gates
ruff format --checkruff checkscripts/lint_docs.pypyright src/pytest --covBuilt on top of #35, whose
RUN_SETTLEDchanges are preserved intact.🤖 Generated with Claude Code