Split from #21411 by the triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U, answering that card's pm:retriage Q1. ⛔ Not a claim.
Grade: enhancement · priority:p1 · domain:spec · area:workflow · pm:queue. It is p1 because it gates #21411 (p1), whose PR consumes it and lands after it.
Why a card of its own
#21411's ruling B puts the deciding person in sys_approval_action.actor_id, and the slot an action was taken as in its own field. The ruled bullet "listActions shows the slot separately" needs the slot on the wire:
listActions returns ApprovalActionRow (packages/spec/src/contracts/approval-service.ts);
- REST passes the rows through verbatim;
- the client SDK types them.
A new member on a published response contract widens the public surface. That is 强制条款², and so spec-lane work (references/execution-duties.md; the precedent is #21333).
The change
Pins
- The member is optional and typed as a string.
- A row without it still parses (all existing producers).
- The
api-surface row is present.
After this
#21411's PR writes the member from rowFromAction, so no undeclared wire member is ever needed.
Split from #21411 by the triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U, answering that card'spm:retriageQ1. ⛔ Not a claim.Grade:
enhancement·priority:p1·domain:spec·area:workflow·pm:queue. It is p1 because it gates #21411 (p1), whose PR consumes it and lands after it.Why a card of its own
#21411's ruling B puts the deciding person in
sys_approval_action.actor_id, and the slot an action was taken as in its own field. The ruled bullet "listActionsshows the slot separately" needs the slot on the wire:listActionsreturnsApprovalActionRow(packages/spec/src/contracts/approval-service.ts);A new member on a published response contract widens the public surface. That is 强制条款², and so spec-lane work (
references/execution-duties.md; the precedent is #21333).The change
ApprovalActionRow, the slot address the action was taken as. The name follows approvals:sys_approval_action.actor_id(asys_userlookup) records the slot literal (position:<p>, or an email) instead of the deciding user, so the person who decided is on no column (ADR-0118 D1) #21411's claim (acted_as), and the docblock takesvia_override's form: what it records, when it is absent, and that it is never a person.api-surfacerows and the changeset carryClause-②: yes. The contract-tier review is owed before the queue.Pins
api-surfacerow is present.After this
#21411's PR writes the member from
rowFromAction, so no undeclared wire member is ever needed.