docs(reward): state the checks that run, and that the worker is unreleased - #212
Merged
Conversation
…eased Two classes of claim on docs.openadapt.ai/commercial/seal-reward/ are false against the published packages. The install path. The page opens "Run it locally with MockMed" with `pip install 'openadapt-flow[reward]'` and `openadapt-flow serve-reward`. openadapt-flow 1.34.0 on PyPI declares no `reward` extra, ships no `openadapt_flow/reward/`, and registers no `serve-reward` subcommand. Both of those exist only at the repository head. Anyone following the page today gets a failed install and an unknown command. The published commands stay as what the release will carry, with the git-head install beside them. Enforcement that does not exist. Nothing verifies a reward certificate's signature: `_validate_signature` in openadapt_types checks base64 and a 64-byte length, and there is no issuer key registry. `issuer` is an unauthenticated string; `RewardCertificateV1._issue_window` refuses only `self_signed` combined with a non-synthetic scope, so an `organization` issuer with `production` scope validates. `grep -rni revok` across the reward code in openadapt-types, openadapt-evals and openadapt-flow returns nothing. `RewardCertificateV1.satisfies` has no caller outside a unit test. So this drops the revocation column and the revocation-key gloss, restates `issuer` as a declared field, says plainly that nothing calls `satisfies`, and replaces "the only issuer that can state production scope" with what the design intends and what the code actually reads. The properties that are enforced stay as they were: the tier floor (`refuse_development_certification`, `score`), the unscored rule (`RewardScoringPolicyV1.scalar_for`, `_scoring_contract`), receipt-versus- Seal separation, idempotency and digest binding (`RewardWorker.score_episode`, `RewardWorker._check_binding`), and credentials staying on the worker's machine. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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.
docs.openadapt.ai/commercial/seal-reward/publishes two classes of claim that are false against the published packages.The install path
The page opens "Run it locally with MockMed" with:
I downloaded the wheel and read it.
openadapt-flow1.34.0 declaresbrowser, capture, console, dev, grounder, grounding, hosted, interop, linux, macos, privacy, rdp, service, service-mlx, windowsand noreward; the wheel contains no path matchingreward;entry_points.txtregistersopenadapt-flowandopenadapt-flow-vlm-serviceand nothing else. Therewardextra and theserve-rewardsubcommand exist only atopenadapt-flow@main. A reader following the page today gets a resolution failure and then an unknown command.The two commands stay on the page as what the release will carry, with a sentence saying it is not published and no date, and the git-head install beside them.
Enforcement that does not run
openadapt_types.process_capability._validate_signaturechecks that the field is base64 and decodes to 64 bytes. There is no issuer key registry.issueris unauthenticated.RewardCertificateV1._issue_windowrefuses onlyself_signedcombined with a non-synthetic scope, soissuer="organization"withcalibration_scope="production"validates.grep -rni revokover the reward code inopenadapt-types,openadapt-evalsandopenadapt-flowreturns one test line assigningrevoked = Falseand one sentence inopenadapt-flow/docs/REWARD_WORKER.md.RewardCertificateV1.satisfiesis called only fromopenadapt-types/tests/test_reward.py. Nothing compares a certificate against its contract'scertificate_policy.Changed accordingly: the control-service row drops "revocation" and "the revocation list"; the
certificate_idrow drops "Revocation key. The issuer checks the revocation list"; theissuerrow says the field is declared and that the validator does not check who the issuer is; thesatisfiessentence says nothing on the worker or trainer path calls it; "it is the only issuer that can stateproductionscope" becomes what the design intends plus what the code reads."Today the only certificate anyone can compute is
syntheticscope" also became "the only certificate our code issues", because anyone can hand-build a production-scope one.What did not change
The review confirmed these, each with an enforcing function, and this PR leaves them alone.
certifiedrefuse_development_certification,score,RewardEvidenceReceiptV1._scoring_contractRewardScoringPolicyV1.scalar_for,_scoring_contract,CertifiedRewardFunctionRewardEvidenceReceiptV1field set,assert_no_forbidden_keysRewardWorker.score_episode(409duplicate_episode)RewardWorker._check_binding(422contract_mismatch)require_certified_or_unscoredChecks
uv run pytest tests/ -q39 passed,validate_docs.pypassed,check_published_version_claims.py --offlinepassed,mkdocs build --strictpassed. No copy test pins any sentence changed here.Two checks fail on every pull request on this repository because Advanced Security is off. That is pre-existing.
Not in this PR
The same revocation claim also appears in
openadapt-types/openadapt_types/reward.py(theRewardCertificateV1docstring, which ships in the published package) and inopenadapt-flow/docs/REWARD_WORKER.mdline 29. Both need a separate change in their own repository.Opened by an agent session, not the founder.
🤖 Generated with Claude Code