Repository navigation
Conversation
Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
jeremi
marked this pull request as ready for review
October 13, 2026 04:12
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
6 of 7 tasks
…ch/pr2029 Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
Registry Coordinator has never been released, so a second adapter ABI selected by the presence of onDeclaredRefusal guards no deployed snapshot. The edge is an optional member of the frozen call step: a snapshot without it keeps its bytes, digest and behavior, and the closed step decoder refuses a member it does not know instead of dropping it. Restore still refuses the edge on an operation that does not declare the capability, now held by its own snapshot test. Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
An optional member with no default says in its description what leaving it out does. Without the edge a declared refusal fails the run with product-refused, like every other refusal. Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
A server error that carries an action.refused body, and a 422 action.refused without a refusal code, are outside the typed contract the refusal route trusts. Both leave the dispatched command uncertain and never reach the authored branch. Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
The adapter classifies a refusal only after an unknown outcome has already returned, so the classifier needs no flag for it. No runtime path validates a value against the declared-refusal contract, so the contract keeps the schema and drops the compiled validator and its check. The generated reference links the refusal schema by operation identifier, and the refusal code pattern spells its control-character bound the way the other Coordinator schemas do. Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
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.
Summary
An
invoke-breg-actionbusiness refusal currently ends a Coordinator run and loses its refusal code. This adds an optionalonDeclaredRefusaledge whose output is exactly{refusalCode}. Successful calls keep their receipt onnext. Authorization, transport, validation and protocol failures keep their existing failure behavior, and a call without the edge still fails the run withproduct-refusedon a declared refusal.Only
invoke-breg-actiondeclares the capability. Mapping checks are route-aware: a step reached only throughnextreads the operation output, a step reached only throughonDeclaredRefusalreads{refusalCode}, and at or beyond a join of the two the call output cannot be read. Scenarios, the governed-action example and the generated operation reference cover the new route.There is one adapter ABI,
coordinator/product-operations/v1. The capability sits outside the operation identity and the snapshot carries the authored edge itself. A snapshot without the edge is byte-identical to one written before this change and restores with the same digest, identities and behavior. Restoring refuses an edge on an operation that does not declare the capability (definition.operation), and a binary that predates the edge refuses a snapshot carrying it (definition.snapshot). No database migration and no persisted-state change.Stacked on #1956 (
codex/coordinator-pilot) and merged with its current head.Closes #1988. Note: the issue will not close automatically while this pull request targets a branch other than the default branch; close it by hand when the stack lands.
Security review notes
Threat. A response that is not a genuine no-effect refusal is treated as one, so a run continues down a business branch although the action may have committed, or a cancellation is recorded as effect-free when it was not. Second, text supplied by the called service reaches workflow data.
Enforcement point. The BReg action adapter (
breg_action.rs) classifies a declared refusal only for the mutating invocation, only on HTTP 422 with the typed problemaction.refused, only with a refusal code that is non-empty, at most 128 characters and free of control characters, and only after the expired-receipt and unknown-outcome guards have run. The worker routes it only when the workflow authored the edge and the step has no prior uncertain attempt. Authoring, snapshot restore and the mapping check refuse the edge on any other operation and refuse a mapping that reads the wrong route's output.What still refuses.
action.refused-shaped body, and a 422action.refusedwithoutrefusalCode, staytransport-uncertainand are never routed.product-refusedand stays held as uncertain.product-refused, as before.{refusalCode}.Proven and not proven.
action.refused; the Base Registry Engine alone enforces that the code is one the action declared. The routed code is therefore service-supplied text that a workflow can copy into its finish output. Coordinator bounds its shape, not its vocabulary.cancelledinstead ofcancelled-after-effect. This rests on the engine's guarantee that a refused action commits no effect; Coordinator does not verify that independently. Calls without the edge, and every other outcome, keepcancelled-after-effect.mainandrelease/1.0and this pull request is stacked on another base. The checks below were run locally.Evidence
Local macOS validation with a disposable PostgreSQL 17.11 database:
cargo test --locked -p registry-coordinator --features schema: 376 passed.products/coordinator/scripts/test-postgres.sh: 206 passed, 3 ignored. The ignored tests are the existing opt-in activation-fence and backup/restore exercises; their separate runners were not run.python3 products/coordinator/scripts/test-breg-action.py: 2 passed against current-source BReg and Messaging executables.cargo test --locked -p registry-coordinator-client -p registry-stack-client: 37 passed.cargo clippy --locked -p registry-coordinator --all-targets -- -D warnings, also with--features schemaand with--features schema,postgres-test: passed.cargo fmt --checkandgit diff --check: passed.products/coordinator/scripts/check-schemas.sh,check_dependency_direction.py,products/identifiers/scripts/generate.py --check-references, the configuration convention lint (with the pilot branch as baseline, and--rule-coverage),check-config-conformance.py --check-generated, and the configuration conformance corpus for the three Coordinator formats (323 cells, 271 pass, 52 not applicable, 0 fail): passed. Coordinator script tests: 26 passed.Not run: workspace-wide check, clippy, test and deny; the full strict conformance corpus across all products; the docs site checks.
Notes
The public reference page
docs/site/src/content/docs/reference/coordinator-configuration.mdxdoes not yet describeonDeclaredRefusalor the route-aware reading rule; that belongs to a docs-site change. Release timing follows #1956.DCO
Signed-off-bytrailer.