Skip to content

Commit b367cc8

Browse files
os-zhuangclaude
andauthored
docs(adr): ADR-0091 accepted — grant lifecycle decisions confirmed; D3 gains the no-self-renewal rule (#2764)
Review outcome: delegation keeps substitution (union) semantics with the 30-day configurable ceiling; break-glass stays unapproved with the 4h window (pre-authorization list + alert + D5 review as compensating controls); D1 scope stays confined to the two user-grant tables; D2 resolution-time filtering confirmed as the sole correctness mechanism. Added per review: a delegated row is not self-renewable — extension requires a NEW delegation by the delegator, with its own audit record. Claude-Session: https://claude.ai/code/session_012oLzaP8n7A3YKFmgaHWC8H Co-authored-by: Claude <noreply@anthropic.com>
1 parent d0531c4 commit b367cc8

1 file changed

Lines changed: 9 additions & 5 deletions

File tree

docs/adr/0091-grant-lifecycle-and-recertification.md

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# ADR-0091: Grant lifecycle — effective-dated assignments, delegation, break-glass, recertification substrate
22

3-
- **Status:** Proposed
4-
- **Date:** 2026-07-09
5-
- **Deciders:** (pending review)
3+
- **Status:** Accepted
4+
- **Date:** 2026-07-09 (proposed) · 2026-07-10 (accepted)
5+
- **Deciders:** jack@objectstack.ai
66
- **Relates to:** ADR-0090 (Permission Model v2 — named follow-up #1), ADR-0057 (assignment tables), ADR-0049 (no unenforced security properties), ADR-0016 (open-core boundary)
77

88
## TL;DR
@@ -106,8 +106,12 @@ A user may delegate a position they hold **without being an admin**, iff:
106106
checked by the same gate that owns assignment writes (D12 gate grows a
107107
self-service branch: delegator ≠ admin, but the write is scoped to
108108
positions they hold + delegatable + time-boxed);
109-
4. chains are cut: a row with `delegated_from` set is **not itself
110-
delegatable** (no re-delegation);
109+
4. chains are cut TWO ways: a row with `delegated_from` set is **not itself
110+
delegatable** (no re-delegation), and it is **not self-renewable** — the
111+
delegate cannot extend `valid_until`; continuing past expiry requires the
112+
delegator (or an admin) to issue a NEW delegation, leaving a fresh audit
113+
record. A "temporary" grant that can be quietly rolled forever is a
114+
permanent grant with extra steps;
111115
5. dual audit: the row carries both `granted_by` (writer) and
112116
`delegated_from` (authority source); explain reports "via delegation from
113117
张三, until …".

0 commit comments

Comments
 (0)