Repository navigation
fix(audit): audit waivers on bulk saves and drafts; re-read grants on an edit save - #1296
Merged
Merged
Conversation
The Agent schema sets fireEventsOnBulkWrites, so an OpenRegister bulk save raises the object events per row (register 0.52.0, Agent 0.13.0). The waiver listener also listens to DraftCreatedEvent and DraftUpdatedEvent, and does not record the created event that follows a save out of draft a second time. A tool id that Talk could read as a mention, link or markdown is no longer put in the approval text. Assisted-by: ClaudeCode:claude-opus-5-5
The form wrote back the grants as they were when it opened, so a change made meanwhile in another tab was undone. The save now reads the stored value first and carries it. When it moved and the form changed the grants too, or it cannot be read, nothing is saved. Assisted-by: ClaudeCode:claude-opus-5-5
rubenvdlinde
requested review from
Rem-Dam,
SudoThijn,
WilcoLouwerse,
bbrands02,
remko48 and
rjzondervan
as code owners
November 3, 2026 22:17
…ver-audit-followups
…form Hermiq's agent endpoint gives an admin a row without tools, which the save read as no grants and wrote back as an empty list. The save now reads through store.fetchObject, and refuses when that read holds no list and the form read grants. OpenRegister's floor rises to the first tag reading fireEventsOnBulkWrites. Every approval line to Talk goes through TalkSafeText. Assisted-by: ClaudeCode:claude-opus-5-5
Contributor
Quality Report — ConductionNL/hermiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-specs | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| format | ❌ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| check-bundle-budget | ✅ | ||||
| composer | ✅ | ✅ 126/126 | |||
| npm | ✅ | ✅ 854/854 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| lockfile sync | ✅ | ||||
| PHPUnit | ❌ 3042/3049 | ||||
| Newman | ✅ 15/15 | ||||
| Playwright | ⏭️ deferred: E2E runs locally and on the promotion path only. This pull request targets development, so the suite is asked once per promotion into beta and main rather than once per push per open pull request. Run it locally with npx playwright test, or from the Actions tab on a branch with no open pull request into development. |
||||
| Hydra gates | ✅ |
Quality workflow — 2026-11-04 02:40 UTC
Download the full PDF report from the workflow artifacts.
…ver-audit-followups
Contributor
Quality Report — ConductionNL/hermiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-specs | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| check-bundle-budget | ✅ | ||||
| composer | ✅ | ✅ 126/126 | |||
| npm | ✅ | ✅ 854/854 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| lockfile sync | ✅ | ||||
| PHPUnit | ❌ 3056/3063 | ||||
| Newman | ✅ 15/15 | ||||
| Playwright | ⏭️ deferred: E2E runs locally and on the promotion path only. This pull request targets development, so the suite is asked once per promotion into beta and main rather than once per push per open pull request. Run it locally with npx playwright test, or from the Actions tab on a branch with no open pull request into development. |
||||
| Hydra gates | ✅ |
Quality workflow — 2026-11-04 07:27 UTC
Download the full PDF report from the workflow artifacts.
Assisted-by: ClaudeCode:claude-opus-5-5
Contributor
Quality Report — ConductionNL/hermiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-specs | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| check-bundle-budget | ✅ | ||||
| composer | ✅ | ✅ 126/126 | |||
| npm | ✅ | ✅ 854/854 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| lockfile sync | ✅ | ||||
| PHPUnit | ❌ 3063/3070 | ||||
| Newman | ✅ 15/15 | ||||
| Playwright | ⏭️ deferred: E2E runs locally and on the promotion path only. This pull request targets development, so the suite is asked once per promotion into beta and main rather than once per push per open pull request. Run it locally with npx playwright test, or from the Actions tab on a branch with no open pull request into development. |
||||
| Hydra gates | ✅ |
Quality workflow — 2026-11-04 10:48 UTC
Download the full PDF report from the workflow artifacts.
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.
REVIEW, held. Follow-ups from RW129 on #1294, the stale-grants loss in the agent form, and RW150's findings on this PR.
Waiver audit
fireEventsOnBulkWrites: true(register 0.52.0, Agent 0.13.0, app version raised for gate 120). Test reads the shipped schema.MIN_OPENREGISTER_VERSIONrises to2.1.43-unstable.20261102171844, the first tag holding 959be02f8; an older version drops the setting. That constant is only named in a message, soBulkWriteEventsalso joins the required classes, which is what the upgrade check actually tests.AgentWaiverChangeListeneralso listens toDraftCreatedEventandDraftUpdatedEvent. Leaving draft raisesDraftUpdatedEventand thenObjectCreatedEventfor the same agent; the second is not recorded again. The mark is keyed on the agent's uuid, now tested (RW150 mutant L8).Residual: a draft written before this ships is not recorded when it leaves draft. OpenRegister's system operations and a failed old-entity read still raise no usable event.
Talk
A new
TalkSafeTextdecides which names go in a Talk message. It now coversApprovalPreviewBuilder::toolLine, both approval lines inDeliveryService(the schedule, flow and skill name at line 594 included), andTalkApprovalNotifier::requestText, which had the same exposure and was not on the list. An unsafe name reads "a tool" or "an action". The id pattern now anchors withD, so a trailing newline no longer passes.Agent form
An edit save re-reads the stored
toolsfirst, through the samestore.fetchObjectthat seeded a routed form. Hermiq's own agent endpoint gives an instance admin a reduced row withouttools; reading that as "no grants" was the wipe RW150 found. An admin can still rename the agent and its grants stay.Tests cover each of these, and the same-size waiver toggle (RW129 F6).
Not closed: only
toolsis re-read, so other fields changed elsewhere are still overwritten from the form's copy, and a write between the re-read and the save can still be lost.Catalogue form. RW150 asked whether edit is reachable from a reduced row. From the code, no: the catalogue is configured with
registerandschemaand has no endpoint of its own, so its rows come from OpenRegister's objects API.AgentCatalog::pageis served at/api/agents, which the form does not read. Chat mounts the form with a draft, and the detail page usesfetchObject. Read from code, not run live.Verified
--fail-on-riskyexit 0, 3070 tests, 1 skip, 0 risky; vitest 0; check:specs 0; lint 0; format 0; l10n 0; gates 0, 75 of 75 applicable ran, gate 122 PASS, gate 123 PASS with 25 of 34 4-star checks. Merging development afterwards changed nothing in that tree.Assisted by Claude Code.
🤖 Generated with Claude Code