From d6a6e7ac60b58350531b315b8e3852d4def3e55e Mon Sep 17 00:00:00 2001 From: Jakub Zych Date: Thu, 22 Oct 2026 12:36:13 +0200 Subject: [PATCH] docs(19.6.1): record code review disposition --- .../19.6.1-REVIEW-DISPOSITION.md | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 .planning/phases/19.6.1-backend-administrators-screen/19.6.1-REVIEW-DISPOSITION.md diff --git a/.planning/phases/19.6.1-backend-administrators-screen/19.6.1-REVIEW-DISPOSITION.md b/.planning/phases/19.6.1-backend-administrators-screen/19.6.1-REVIEW-DISPOSITION.md new file mode 100644 index 00000000..cfebd8fb --- /dev/null +++ b/.planning/phases/19.6.1-backend-administrators-screen/19.6.1-REVIEW-DISPOSITION.md @@ -0,0 +1,68 @@ +--- +phase: 19.6.1 +review: 19.6.1-REVIEW.md +titles: json +findings: + - id: CR-01 + severity: critical + disposition: open + title: "Roles screen lets a non-superuser rename or create a role onto a code with code-declared grants (D-07 ceiling bypass, self-escalation)" + - id: WR-01 + severity: warning + disposition: open + title: "D-07/D-19 ceilings ignore a scoped personal API token's scope" + - id: WR-02 + severity: warning + disposition: open + title: "Stored override values other than 1/-1 are dropped on every save, re-granting what they removed" + - id: WR-03 + severity: warning + disposition: open + title: "Record actions contributed to the Administrators screen bypass D-19 (outranking) and D-09 (last superuser)" + - id: IN-01 + severity: info + disposition: open + title: "Last-superuser guard silently depends on READ COMMITTED" + - id: IN-02 + severity: info + disposition: open + title: "Re-deleting a soft-deleted administrator reports success and bumps tokens" + - id: IN-03 + severity: info + disposition: open + title: "Role code uniqueness is a check-then-insert without a lock" + - id: IN-04 + severity: info + disposition: open + title: "Role delete counts holders without locking against concurrent assignment" + - id: IN-05 + severity: info + disposition: open + title: "`toggleOn` reads unknown switch encodings as \"off\"" + - id: IN-06 + severity: info + disposition: open + title: "Role picker on your own record is editable in the SPA but always refused" +open: 10 +total: 10 +recorded: 2026-10-22T10:36:13.024Z +--- + +# Phase 19.6.1: Code Review Disposition + +| Finding | Severity | Disposition | Source | +|---------|----------|-------------|--------| +| CR-01 | critical | open | - | +| WR-01 | warning | open | - | +| WR-02 | warning | open | - | +| WR-03 | warning | open | - | +| IN-01 | info | open | - | +| IN-02 | info | open | - | +| IN-03 | info | open | - | +| IN-04 | info | open | - | +| IN-05 | info | open | - | +| IN-06 | info | open | - | + +Dispositions: `open` (recorded, not yet triaged), `fixed`, `skipped`, `deferred`. +Set `deferred` by hand and put the reason in the Source cell; both are preserved. A `|` in the reason is kept as prose and escaped on the next run. +Re-running the gate keeps every row it can. A row the current review no longer reports is kept and its Source cell flagged, so a finding does not leave this record silently. ONE exception: when a finding id is REUSED by a different finding, the earlier decision cannot keep a row — the id is taken — and it is dropped. A RECORDED decision (anything but `open`) is named on the console when that happens; a row still at `open` is replaced silently, because `open` records no decision to lose.