Repository navigation
feat: align product config vocabulary (actsAs, label, holiday sets) - #2581
Merged
Merged
Conversation
Codex Review Summary: ✅ CompletedThis 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. |
jeremi
force-pushed
the
feat/product-alignment
branch
from
November 7, 2026 04:54
3de92da to
6e5a843
Compare
github-merge-queue
Bot
removed this pull request from the merge queue due to a conflict with the base branch
Nov 7, 2026
Aligns configuration vocabulary that differed between products; the product is pre-1.0. Every renamed key has a `config.removed-key` entry naming its replacement, a CFG-NAME-5 row, a `BREAKING:` line in the product CHANGELOG, a note in `release/notes/config-conventions/`, and updated examples, fixtures, docs and regenerated schemas. No migration code. BREAKING: - Casework, Documents and Messaging access profiles: `role` is renamed `actsAs`; values unchanged. The schema definitions `CaseworkRole` and `AccessRole` become `CaseworkActsAs` and `ActsAs`, and the Casework diagnostic `casework.access-profile.missing-role` becomes `casework.access-profile.missing-acts-as`. BReg profiles and the data sense of `role` (event records, Evidence subjects) are unchanged. - Coordinator: `title` is renamed `label` on a project, function, operation and step; the explain member `presentation.title` becomes `presentation.label`; the duplicate-title diagnostics become `...duplicate-function-label`, `...duplicate-operation-label` and `...duplicate-step-label`. - Casework holiday-set file: `holidaySet` is renamed `id`, and an optional `label` is allowed. A calendar's `holidaySet` member, which names the set it uses, is unchanged. - Scheduling: a holiday set's `because` is renamed `label`, and `label` is now optional (the id names a set that writes none), as in the Casework holiday-set file. The schema definition `HolidaySetPolicy` becomes `HolidaySet`. `because` stays on every other Scheduling item. - `caseworkctl dev` report: a client names `actsAs` where it named `role`. - Upgrade: this release does not read state stored by 0.45.0 or earlier. Start Casework and Scheduling on a new database; finish Coordinator runs before upgrading. A stored document that holds a removed member is refused with a message that says it was stored by an earlier release and names the member. Additive: - Coordinator event triggers accept an optional `label` and `description`, stored under `presentation.eventTriggers.<id>`, reported by `check --explain`, and outside the semantic revision (a wording edit keeps `workflowRevision`). Closes #2549. - Casework, Documents, Messaging and Evidence access profiles accept an optional `label` and `description` (BReg profiles already have `display`). They are accepted for authoring and tooling. Casework keeps them in the review policy description, which any caller who may read that description, requesters included, can see, and they do not change a policy's behavioral binding. Evidence drops them at compile; Documents and Messaging only parse them, and none serve them until a view exists. Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
jeremi
force-pushed
the
feat/product-alignment
branch
from
November 7, 2026 06:47
6e5a843 to
0dcc9fd
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.
Summary
Aligns configuration vocabulary that differed between products; the product is pre-1.0. Every renamed key has a
config.removed-keyentry naming its replacement, a CFG-NAME-5 row, aBREAKING:line in the product CHANGELOG, a note inrelease/notes/config-conventions/, and updated examples, fixtures, docs and regenerated schemas. No migration code.BREAKING:
roleis renamedactsAs; values unchanged. The schema definitionsCaseworkRoleandAccessRolebecomeCaseworkActsAsandActsAs, and the Casework diagnosticcasework.access-profile.missing-rolebecomescasework.access-profile.missing-acts-as. BReg profiles and the data sense ofrole(event records, Evidence subjects) are unchanged.titleis renamedlabelon a project, function, operation and step; the explain memberpresentation.titlebecomespresentation.label; the duplicate-title diagnostics become...duplicate-function-label,...duplicate-operation-labeland...duplicate-step-label.holidaySetis renamedid, and an optionallabelis allowed. A calendar'sholidaySetmember, which names the set it uses, is unchanged.becauseis renamedlabel, andlabelis now optional (the id names a set that writes none), as in the Casework holiday-set file. The schema definitionHolidaySetPolicybecomesHolidaySet.becausestays on every other Scheduling item.caseworkctl devreport: a client namesactsAswhere it namedrole.Additive:
labelanddescription, stored underpresentation.eventTriggers.<id>, reported bycheck --explain, and outside the semantic revision (a wording edit keepsworkflowRevision). Closes coordinator: let an event trigger declare a title and description #2549.labelanddescription(BReg profiles already havedisplay). They are accepted for authoring and tooling. Casework keeps them in the review policy description, which any caller who may read that description, requesters included, can see, and they do not change a policy's behavioral binding. Evidence drops them at compile; Documents and Messaging only parse them, and none serve them until a view exists.Commits
One per item, tests first:
roletoactsAs(Casework, Documents, Messaging).labelanddescription.titletolabel.{id, revision, label, dates}.labelanddescription.titlewithdefinition.snapshot, and a steptitlein the free-formpresentation.stepsmap still restores and is shown as written), with one PostgreSQL test per product.labeloptional;caseworkctl devreportactsAs; removed-key tests for Documents, Messaging and Coordinator operations; wording and upgrade notes.main.Earlier follow-up fixes the first and fourth commits missed: code behind the
postgres-testfeature, a holiday-set diagnostic path with two regenerated report examples, and a raw SQL query that readrolefrom the pinned policy snapshot (it now readsactsAs; found by the PostgreSQL staffing suites).Security review notes
This change renames each access profile's
roletoactsAsin Casework, Documents and Messaging. It adds an optionallabelanddescriptionto access profiles and to Coordinator event triggers, renames the Coordinatortitletolabel, and gives the Casework and Scheduling holiday sets one shape. The branch had an independent security review of every reader of the renamed members, including reads of state stored by earlier releases.Authorization meaning
actsAs. The other stored-policy queries (deciding profiles, exclusions, required approvals) read members this change does not rename.requiredScopes,requesterClients,actorKind,requesterTags) are untouched, including where they differ between products. The newlabelanddescriptionare never matched against a caller and reach no authorization decision, audit record, token, problem detail or log line; they areDisplayText, so bidirectional-control characters are refused. Coordinator trigger wording is kept outside the workflow revision, and a test pins that.Refusals
config.removed-keynaming its replacement: access-profilerole(Casework, Documents, Messaging), the Casework holiday-set file'sholidaySet, SchedulingholidaySets[*].because, and the Coordinatortitleat project, function, operation and step. A test per removed key checks it.actsAsis required.Holiday sets
Stored state from earlier releases
titleall carry the old member names. Every reader of stored state refuses them rather than reading a missing member as absent, and no compatibility read was added. The one exception is a Coordinator steptitle, which 0.45.0 wrote into the free-formpresentation.stepsmap: it still restores and is shown as written, display only.definition.snapshotrefusal has its own test. Upgrade procedure: start Casework and Scheduling on a new database, and finish Coordinator runs first. Casework activation refuses while any stored review, in any lifecycle, holds the earlier shape. A PostgreSQL test covers a database whose only earlier review is no longer open. Casework history stored before the upgrade is not readable after it.Stated limits
Not verified
Kept out of this PR
unrestricted, which ofrequesterClientsandactorKindis required). Unifying them changes who can reach what, so it needs its own security-reviewed change.purposestring on each grant and on each assertion definition, with nothing to attach a label to. Adding a label would mean inventing a catalogue, which is a design change, not an alignment.lifecycleandReviewResult.statustostate. A wire-protocol change with no authoring benefit; a follow-up.Notes for review
HolidaySetdefinition with{id, revision, label, dates}. Remaining difference: Casework allows 3660 dates; Scheduling allows 256. Both labels are optional.actsAsCFG-NAME-5 row has an empty refused-spellings column, because the lint refuses listed keys globally androlestays valid in its data sense. Review enforces it.holidaySet; only the authored file changes.Follow-up
dev/config.rs,dev/tests.rs,project.rsandreport.rs; messagingctllib.rs; the Casework, Evidence and Messaging CHANGELOGs; the Casework CLIreport.schema.json; andconfig-formats.yaml. Whichever lands second needsmainmerged and the caseworkctl and messagingctl tests re-run.Verification
Run on this branch:
check-checkpoint.sh,check-schemas.shcheck-checkpoint.sh,check-contracts.shcheck-checkpoint.sh,check-contracts.shcheck-schemas.sh,check_dependency_direction.pycheck-checkpoint.sh,check-contracts.shcheck-contracts.shcheck-contracts.sh,check-authoring-schema.sh,check-authoring-no-io.sh,check-config-key-paths.shgenerate.py --check-referencescheck-config-conventions.pycargo fmt --checkcargo clippy --locked --all-targets -D warningson the changed cratescargo test --lockedon the changed cratesPostgreSQL (
postgres:17,postgres-testfeature, disposable database), on the tree after mergingmain:caseworkctlinstall_scripttests andat_least_once_completion_durably_deduplicates_after_lost_ack_and_exhausts_bounded_retries; see belowmessagingctltest-postgres.shdoes)messaging_integration,process_restartand the ignoredscheduling_event_nativerun: all passevidencectlpostgres:17; the 15 PostGIS spatial tests need PostGIS and failed there, then passed onpostgis/postgis:17-3.5(postgres_spatial_read10 pass, 1 ignored;postgres_spatial_storage10 pass). No BReg crate code changedstaffing_notice_counts_distinct_available_reviewers_without_exposing_membersruns both thesufficient=falseandsufficient=truecases and is inside the Casework count.Three Casework tests failed in the full PostgreSQL run under parallel load: the two
install_scriptsignal-injection tests (signal_injecting_mv_exits_from_the_signal_it_sends,failed_post_switch_adoption_restores_every_changed_command_and_pointer) andat_least_once_completion_durably_deduplicates_after_lost_ack_and_exhausts_bounded_retries(a retry-count assertion). Rerun alone,install_scriptpasses 14 of 14 (under three different temporary directories) andreview_postgrespasses 73 of 73. The cause is load, by inference and not proven. This branch touches none ofinstall_script.rs,crates/registry-casework/install.shorrelease/glibc-floor.env, so those tests are pre-existing and unaffected by it.Config conformance corpus (binaries rebuilt from this tree): 6116 cells, 4554 pass, 3 expected failures, 0 fail, 0 blocked.
cargo clippy --locked --all-targets -D warningswithpostgres-teston the changed crates passes;cargo fmt --checkpasses.No CLI help text changed, so the CLI catalog is not regenerated.
🤖 Generated with Claude Code