Revise specs against approval-engine's approver-surface requirements
approval-engine replied to INFD-IN-0001 with docs/approver-surface-requirements.md (31da1af, 5203f46) and two corrections. Several of my requirements were wrong or incomplete; revised rather than appended to. Corrected: - PR-02 listed only approval:approve. Wrong — the surface also needs approval:read to fetch what it renders. As drafted it would have shipped a client able to submit an entry it could never display. That changes a registration key-cape has already implemented, so it is their call (open question A). - NC-03 implied approval-engine refuses non-human approver entries. It does not; only /consume is principal-restricted, and the operator service client holds approval:approve. Enforcement of "humans bind, agents draft" is therefore ours alone, and is auditable via schema v4's entries[].principal_type — never from the shape of subject_id. Added: - PR-04 assurance shape. approval-engine persists it verbatim and accepts an empty object, so it is the only place MFA survives into the approval record. Needs auth method, acr/amr, auth_time, agreed with key-cape. - PR-05 entitlement. A 200 from the engine is not permission to view; we owe access-engine a check before rendering. Consuming a decision, not making one. - PR-06 response mapping, including 409 duplicate_approver rendered as SUCCESS (a browser double-submit is routine and the first entry stands) and 503 as fail-closed. - PR-07 and a matching INTENT wrongness condition: never render `approved` as permission to act. That is a PDP in the browser wearing UI copy. - L-05, L-06 and EvidenceModel 8b: view_hash cannot ride into the entry — the POST discards its body by design — so Stage 1 correlates by (approval_id, subject, approved_at). DoD-3 is satisfied by the triple, not by a stored hash. PRD open question 1 is answered by construction: there is no inbox endpoint and there will not be one, so the approvals-inbox shape is foreclosed upstream. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V3W1dQG7GFFM9d94jFx7iR Assistant: claude-code Assistant-Model: opus Assistant-Process: 1565372@bnt-lap001 Assistant-Session: 16bb2f25-b34c-49ef-8e94-5fec3567a568
This commit is contained in:
parent
23fba00b1b
commit
08b190928f
5 changed files with 210 additions and 17 deletions
|
|
@ -217,6 +217,11 @@ never evaluates.
|
|||
presented as binding only those three sections, the UI has produced a lie.
|
||||
- **An agent binds.** If any automation can complete a disposition on a
|
||||
principal's behalf, the identity half is fiction.
|
||||
- **It renders `approved` as permission to act.** `approved` is a state of an
|
||||
object, not authorization. `approval-engine` actively refuses to serialize a
|
||||
decision. A surface that presents approval status as "you may now do the
|
||||
thing" has re-implemented a PDP in the browser — the same failure as an
|
||||
authorization endpoint, wearing UI copy instead of an API.
|
||||
- **It reimplements `approval-engine`.** Caching approval validity, inferring
|
||||
consumption from a decision record, or holding approval current-state here
|
||||
breaks `GH-DEC-2026-003` and the atomicity contract.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue