UI half of objectstack#11993 (split at triage 2026-08-26; the server-side refusal-message i18n half stays there under domain:services). Source: maintainer-side field report on @objectstack/*@17.2.0, Console, a record_change approval flow (4-level position approval on a custom object).
Behaviour
- User A submits a record into approval (
approval_status=pending). - User B — NOT the submitter, has read access, not an admin — opens the record detail page.
- The approval area / page header still shows the withdraw-approval button. Clicking it changes nothing (the server correctly refuses) and surfaces a mixed-language error: a Chinese prefix concatenated with the raw English server text "No pending approval request found for this record".
This card's scope (UI only)
Withdraw semantically belongs to the submitter (or the platform's established admin-rescue posture — the reporter explicitly ruled out the admin case, cf. objectstack#9464). A non-submitter should not see a clickable withdraw entry: "a lit button whose click must fail" is the same writability-feedback-mismatch family as #3794. Hide (or disable with reason) based on the submitter identity the record/approval row already carries.
The refusal-message translation (server emitting untranslated English through the i18n seam) is NOT this card — it stays on objectstack#11993.
Reporter notes the state is never corrupted — pure feedback-layer defect. Screenshots available on request from the reporter (private app repo).
UI half of objectstack#11993 (split at triage 2026-08-26; the server-side refusal-message i18n half stays there under
domain:services). Source: maintainer-side field report on@objectstack/*@17.2.0, Console, arecord_changeapproval flow (4-level position approval on a custom object).Behaviour
approval_status=pending).This card's scope (UI only)
Withdraw semantically belongs to the submitter (or the platform's established admin-rescue posture — the reporter explicitly ruled out the admin case, cf. objectstack#9464). A non-submitter should not see a clickable withdraw entry: "a lit button whose click must fail" is the same writability-feedback-mismatch family as #3794. Hide (or disable with reason) based on the submitter identity the record/approval row already carries.
The refusal-message translation (server emitting untranslated English through the i18n seam) is NOT this card — it stays on objectstack#11993.
Reporter notes the state is never corrupted — pure feedback-layer defect. Screenshots available on request from the reporter (private app repo).