Repository navigation
Commit 7faa237
docs(adr): ADR-0069 amended in place — per-organization overrides live in the settings tenant rung (#31041)
Refs #30922
Clause-②: no
Metadata-protocol: none
## 维护者速读
- **改了什么**:只改 ADR-0069 的文字(就地修订,状态行追加一条 2026-11-06 的「Amended in
place」):写明「组织级访问策略覆盖值」存放在设置的租户层(`access_policy` 命名空间,每个组织一行
`sys_setting`),而不是 `sys_organization.*` 字段;涉及 TL;DR 6、D3、D5、D7 四处,并在 D7
末尾加一段说明;另外 D3 的双重验证要求从「开关」改为三档 `off` / `administrators` / `everyone`(不强制
/ 管理员必须开 / 全员必须开,管理员即 ADR-0090 D12
的租户级、组织级和委派管理员),部署级是默认值和下限,组织级同样三档、不得弱于部署级(可相同或更强)。
- **为什么改**:执行你在 #30922 上的裁决「修订 ADR 写明存放位置(推荐)」;PR #31013 把这些值存在设置租户层,ADR
原文仍写组织表字段,两者不一致;三档双重验证依据你在 cloud#3668 的裁决「可以,按三档做(推荐)」,一并记入
ADR,免得再开第二个受管 PR。
-
**风险与回滚**:零运行时风险,只有文字,没有代码、spec、文档站改动;「组织只能收紧、不能放宽部署下限」这条规则原意不变,其他决策不变。回滚
= revert 这一个提交。
- **先看**:`docs/adr/0069-enterprise-authentication-hardening.md` 的 D7
末尾新增说明段(风险最高:它写了存放位置和理由);其次 D3、D5 两张表里改名的那一行,以及状态行末尾。
- **两分钟验证**:`git diff origin/main -- docs/adr/0069-*` 应只见状态行末尾、TL;DR
6、D3 两行(存放位置与三档)、D5 一行、D7 一行的改写,加 D7 末尾 1 段新增说明;`pnpm check:adr-index`
应报告 `docs/adr/README.md` 为最新。
- **需要你做的**:审阅后亲手合并(Tier H,草稿状态,席位不会转 ready、不入队、不开 auto-merge)。
## What changes
ADR-0069 is amended in place on the maintainer's ruling recorded on
#30922 (ruling record
[`6692407743`](#30922 (comment)),
maintainer, verbatim: 「修订 ADR 写明存放位置(推荐)」). Per-organization
access-policy overrides live in the settings tenant rung of ADR-0007 /
ADR-0131: the tenant-scoped `access_policy` namespace, one `sys_setting`
row per organization, as PR #31013 implements. TL;DR 6, D3, D5 and D7
named `sys_organization.*` columns. D3's `mfa_required` also changes
from a global toggle to the three levels `off` / `administrators` /
`everyone`, at the deployment and per organization, on the maintainer's
ruling G2 on objectstack-ai/cloud#3668 (verbatim 「可以,按三档做(推荐)」). The
tighten-only rule is unchanged in meaning, and no other decision
changes.
The diff touches only
`docs/adr/0069-enterprise-authentication-hardening.md`. `pnpm adr:index`
ran and left `docs/adr/README.md` unchanged (the index shows a truncated
status prefix, which this note does not reach), so the README is not in
the diff. The status line stays on line 3, inside the index's 40-line
header window.
| Passage | Before | After |
|:---|:---|:---|
| Status line (appended) | no 2026-11-06 note | "**Amended in place**
(2026-11-06, ruling record `6692407743` on #30922, maintainer, verbatim
「修订 ADR 写明存放位置(推荐)」; implemented by PR #31013): per-organization
overrides live in the settings tenant rung (the tenant-scoped
`access_policy` namespace, one `sys_setting` row per organization), not
in `sys_organization.*` columns, and D3's `mfa_required` is three
levels, `off` / `administrators` / `everyone`, at the deployment (the
default and the floor) and per organization (ruling G2 on
objectstack-ai/cloud#3668, record `6684194038`, verbatim 「可以,按三档做(推荐)」);
the tighten-only rule is unchanged and no other decision changes (TL;DR
6, D3, D5, D7); see the note under D7." |
| TL;DR 6 | "per-org overrides (`sys_organization.*`) are explicit and
additive (an org can only *tighten*, never loosen, the global floor)" |
"per-org overrides are explicit and additive (an org can only *tighten*,
never loosen, the global floor) and live in the settings **tenant
rung**: the tenant-scoped `access_policy` namespace, one `sys_setting`
row per organization", with a store-amended marker |
| D3, deployment row | "`mfa_required` (global toggle)"; "When
`mfa_required`, a session for a user ..." | "`mfa_required` (deployment
level: `off` / `administrators` / `everyone`)" with a levels-amended
marker; "When the level covers the user (`everyone`: every user;
`administrators`: the tenant-level, organization-level and delegated
administrators of ADR-0090 D12), a session for a user ...". Default
`off`, seam unchanged. |
| D3, per-org row, setting cell | `sys_organization.require_mfa`
(per-org) | `access_policy.mfa_required` (per-org, settings tenant
rung), with a marker that the column is retired. Seam cell unchanged.
The mechanism cell gains "on the same three levels: `off` (nothing
beyond the deployment's) or a level at least as strong as the
deployment's, never a weaker one (`off`, then `administrators`, then
`everyone`)". |
| D5, first row, setting cell | `sys_organization.allowed_ip_ranges`
(CIDR[]) | `access_policy.allowed_ip_ranges` (CIDR[], per-org, settings
tenant rung), with a marker. Seam and mechanism cells are unchanged. |
| D7, field list | "`sys_organization`: `require_mfa`,
`allowed_ip_ranges`" | "per-organization overrides: no
`sys_organization` field; they live in the `access_policy` settings
namespace", with a marker |
| D7, new closing note | (none) | Records where the values live and that
the deployment's `auth` values are the default and the floor. Restates
the tighten-only rule. Gives the reason: only a settings write predicate
receives the saving request's transport, which the per-organization
self-lock-out save guard needs, and the settings rung is the store
organization administrators already write. Records that
`sys_organization.require_mfa` is retired (readonly, migrated) and that
no `sys_organization.allowed_ip_ranges` field is added. |
## Acceptance notes
- The dated implementation-status snapshots are left as written, because
they record what was true on their dates: D7's "Implementation status
(2026-07-04)" paragraph and the *Phasing* table's P1 and P2 rows still
say `sys_organization.*`. The new note says so.
- D3 records the three MFA levels at the deployment and per
organization, on the maintainer's ruling G2 on objectstack-ai/cloud#3668
(record
[`6684194038`](objectstack-ai/cloud#3668 (comment)),
verbatim 「可以,按三档做(推荐)」). The status-line note gains one clause for them.
The per-organization row allows a level at least as strong as the
deployment's, never a weaker one.
- On purpose, nothing about PR #31013's in-rework mechanics is described
here (the concurrent cap, the organization-switch rules).
## Verification
All readings were taken at head `f3ce9c02b3`, where the gates were
re-run after the wording commit (review 6694338252 S1/S2).
dispatch-gates warned that the tree is 6 or more commits behind
origin/main and that `scripts/regen-artifacts.mjs` (not in this diff)
changed across that range. The derived list was identical to the first
run's. main was not merged into the open PR (AGENTS.md section 10); CI
runs on the merge ref.
<details><summary>Derived gate families (dispatch-gates --commands, 21)
— 20 exit 0, 1 NOT MEASURED</summary>
- `node scripts/check-adr-links.mjs` (and `--self-test`): exit 0 / exit
0
- `node scripts/check-closing-keyword-parity.mjs` (and `--self-test`):
exit 0 / exit 0
- `node scripts/check-comment-mask-corpus.mjs`: exit 0
- `node scripts/ci/plan-test-core-shards.mjs --self-test`: exit 0
- `pnpm check:adr-anchors`, `check:adr-index`,
`check:adr-symbol-anchors`, `check:ci-filter-parity`,
`check:closed-ceremony-text`, `check:cross-package-test-inputs`,
`check:doc-authoring`, `check:driver-memory-census`,
`check:gitlink-declared`, `check:nul-bytes`, `check:pm-governed-merges`,
`check:pm-prior-rulings`, `check:refd-timer-probe`,
`check:watch-hint-literal`: exit 0 each
- `pnpm --filter @objectstack/lint run check:doc-formula-expressions`:
exit 3, PREREQUISITE NOT MET (`@objectstack/formula` /
`@objectstack/lint` not built). NOT MEASURED locally, a declared
narrowing. Two 9-minute queue attempts for the prerequisite build on the
shared verify lock timed out (exit 99) behind another run. CI's `Lint &
Repo Gates` runs this family.
- `dispatch-gates --ran` reconciliation: "21 derived famil(ies)
accounted for — 20 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit
3)", exit 0.
</details>
<details><summary>ADR index</summary>
`node scripts/adr-index.mjs`: exit 0, "adr-index: unchanged
docs/adr/README.md (237 lines)."
</details>
Docs only, under the `docs/adr/**` fast path: nothing publishes, so no
changeset is added and this PR carries `skip-changeset`.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01Q4EjjRhUZjdy8VXs6Kkur2)_
<!-- signed: repo:cloud#3 · hotlong · session_01Q4EjjRhUZjdy8VXs6Kkur2
-->
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 8d13c0b commit 7faa237
1 file changed
Lines changed: 24 additions & 6 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
19 | | - | |
| 19 | + | |
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
| |||
80 | 80 | | |
81 | 81 | | |
82 | 82 | | |
83 | | - | |
| 83 | + | |
84 | 84 | | |
85 | | - | |
| 85 | + | |
86 | 86 | | |
87 | 87 | | |
88 | 88 | | |
| |||
132 | 132 | | |
133 | 133 | | |
134 | 134 | | |
135 | | - | |
| 135 | + | |
136 | 136 | | |
137 | 137 | | |
138 | 138 | | |
| |||
167 | 167 | | |
168 | 168 | | |
169 | 169 | | |
170 | | - | |
| 170 | + | |
171 | 171 | | |
172 | 172 | | |
173 | 173 | | |
174 | 174 | | |
175 | 175 | | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
176 | 194 | | |
177 | 195 | | |
178 | 196 | | |
| |||
0 commit comments