Skip to content

Commit 79cd9ef

Browse files
docs(adr): generated README index, one status-line spelling, shared numbers cited by stem (#26503)
Fixes #26076 Clause-②: no Metadata-protocol: none ## 维护者速读 - **改了什么**:新增脚本生成的 `docs/adr/README.md` 索引(状态、编号、标题、日期、取代/被取代),143 条记录统一为一种状态行写法(`**Status**: `,改了 17 个文件的那一行,内容不动);四个重号(0006 三个版本,0010/0019/0057 各两条无关决策)在各自文件头互相标注、在索引里并列,不改号不挪文件;`check-adr-anchors.mjs` 支持 `ADR-0057-system-data-lifecycle-and-retention` 这种按文件名引用,只指向一条记录;`ui/docs/adr` 以 `ui-` 前缀登记进根索引,文件不动;退役的 `PRIORITIZATION.md` 删除,其"落地即翻状态"规则并入索引约定。 - **为什么改**:143 条决策没有目录,四个编号各有两份文件,状态行四种写法让两种统计口径对同一批文件给出不同数字;裁决 A(评论 6417460375):做索引、并列重号、门禁不加。 - **风险与回滚**:只动文档与仓库脚本,不动运行时与发布面;lint 多一个独立步骤 `pnpm check:adr-index`(= 生成脚本自身的 `--self-test`,只跑 fixture、不断言任何记录的内容,再接永远 exit 0 的 `--report`);记录写错状态行只出 warning,索引过期不判红,不新增必过门禁;回滚 = revert。 - **先看**(按风险):1) `scripts/check-adr-anchors.mjs` 新增的 `resolveQualified` / `auditQualifiedCitations`(裸号语义不变,带 stem 的引用必须指到一条真记录,否则红);2) `.github/workflows/lint.yml` 新增的 `ADR index is current (report-only)` 步骤与 `scripts/adr-index.mjs` 的 Live tree battery(只证明脚本能读真目录,不断言记录);3) `docs/adr/README.md` 的 Shared numbers 节。 - **两分钟验证**:`pnpm adr:index && git diff --quiet docs/adr/README.md && pnpm check:adr-index && pnpm check:adr-anchors` —— 预期 README 无 diff,index 打印 "--report: OK",anchors 打印 OK 且含 "37 of them stem-qualified to one record"。 - **需要你做的**:`docs/adr/**` 与 `.github/workflows/**` 是受管面(Tier H),需 governed approver 审阅后合并;PR 保持 draft,席位不 ready、不排队。 ## What changes **The index** — `docs/adr/README.md` is new and generated (`node scripts/adr-index.mjs`, `pnpm adr:index`). It carries a visible generated banner, a Conventions block (the one status spelling, the keyword vocabulary, the status-hygiene rule that `PRIORITIZATION.md` used to hold, how shared numbers and the ObjectUI registry are cited), a summary count per status, a **Shared numbers** section listing each of the four numbers side by side with the id to cite, the records table (number, title, status, date, supersedes, superseded by), and the ObjectUI registry table under the `ui-` prefix. **One status-line spelling** — the generator reads exactly one line shape, `**Status**: <keyword> …`, and lists a record whose line is missing or names no keyword as **Unparsed** rather than guessing from a heading or a bullet. Today 143/143 root records and 11/11 ui records parse. The 12 files the card's grep found matching none of the four spellings, before normalization: | File | What it had instead | |---|---| | `0009-execution-pinned-metadata.md` | no status line at all — status stated nowhere in the header | | `0010-metadata-protection-model.md` | no status line at all — status stated nowhere in the header | | `0014-record-form-field-type.md` | no status line at all — status stated nowhere in the header | | `0091-grant-lifecycle-and-recertification.md` | no status line at all — status stated nowhere in the header | | `0092-sys-user-profile-field-delegation.md` | no status line at all — status stated nowhere in the header | | `0093-tenancy-mode-and-membership-lifecycle.md` | no status line at all — status stated nowhere in the header | | `0098-pinyin-search-companion-column.md` | `- **Status:**` (bullet, colon inside the bold) | | `0100-credential-field-channels.md` | `- **Status:**` (bullet, colon inside the bold) | | `0103-managedby-write-policy-and-engine-write-guard.md` | `- **Status:**` (bullet, colon inside the bold) | | `0104-field-runtime-value-shape-contract.md` | `- **Status:**` (bullet, colon inside the bold) | | `0132-multi-organization-runtime-is-open-core.md` | `- **Status:**` (bullet, colon inside the bold) | | `0133-org-management-open-basics.md` | `- **Status:**` (bullet, colon inside the bold) | Five more records had a spelling the card's grep accepted but the one-instrument rule does not (`## Status` heading in 0071; `- **状态**:` in 0117, 0118, 0121; `- **Status**:` in 0079). All 17 normalized files, with the spelling each had: | File | Previous spelling | |---|---| | `0009-execution-pinned-metadata.md` | no status line at all | | `0010-metadata-protection-model.md` | no status line at all | | `0014-record-form-field-type.md` | no status line at all | | `0071-dataset-semantic-layer-depth.md` | `## Status` heading with the value on the next paragraph | | `0079-record-display-name.md` | `- **Status:**` (bullet, colon inside the bold) | | `0091-grant-lifecycle-and-recertification.md` | no status line at all | | `0092-sys-user-profile-field-delegation.md` | no status line at all | | `0093-tenancy-mode-and-membership-lifecycle.md` | no status line at all | | `0098-pinyin-search-companion-column.md` | `- **Status:**` (bullet, colon inside the bold) | | `0100-credential-field-channels.md` | `- **Status:**` (bullet, colon inside the bold) | | `0103-managedby-write-policy-and-engine-write-guard.md` | `- **Status:**` (bullet, colon inside the bold) | | `0104-field-runtime-value-shape-contract.md` | `- **Status:**` (bullet, colon inside the bold) | | `0117-owning-business-unit-record-stamp.md` | `- **状态**:` / Chinese key | | `0118-non-user-actor-contract.md` | `- **状态**:` / Chinese key | | `0121-declarative-endpoint-routing-namespace-and-channel-split.md` | `- **状态**:` / Chinese key | | `0132-multi-organization-runtime-is-open-core.md` | `- **Status:**` (bullet, colon inside the bold) | | `0133-org-management-open-basics.md` | `- **Status:**` (bullet, colon inside the bold) | Only the status line changed in those files; the value after it is byte-identical. **Shared numbers, cross-referenced and never renumbered** (Prime Directive 13) — each of the nine files under 0006/0010/0019/0057 gains one header line directly under its status line. The 0010/0019/0057 pairs get `**Shares its number with**: [sibling](./sibling.md) (title) — an unrelated decision under the same number … cite this record unambiguously as ADR-<stem>`; the three 0006 files get `**Versions of this number**: v2 · v3 · v4 (current) — one decision revised twice`. The index lists all four side by side. **`check-adr-anchors.mjs` is unambiguous on those four** — a citation may now be stem-qualified, `ADR-NNNN-<slug>[.vN]` (`ADR-0057-system-data-lifecycle-and-retention`, `ADR-0006-project-environment-split.v4`), and such a citation resolves to exactly one record; a stem that names no record is an error (so a typo cannot pass as a bare number), and a bare `ADR-NNNN` keeps its existing meaning (resolves against the number; the 4 bare `ADR-0057` anchors stay on the existing ambiguity note, unchanged). Decision-letter citations on a stem-qualified id are checked against that one record's decisions. The grammar is the ADR filename grammar, so nothing new is invented. A new battery, *Stem-qualified citations name ONE record (#26076)*, pins 21 cases; the battery floor moves from 6 to 7. 36 stem-qualified citations exist in the tree after this PR (the nine new header lines, the README, and the scripts' own literals) and all resolve. **Report-only in CI** — a new lint step, *ADR index is current (report-only — warnings, never a red on a record)*, runs the root alias `pnpm check:adr-index` (= `node scripts/adr-index.mjs --self-test && node scripts/adr-index.mjs --report`), in the alias form the GATE INVOCATION IDIOM note (c91544a) asks of a new gate step; the anchors step is unchanged. The self-test runs with the flag because `check-self-test-wired` reds a self-test no workflow executes, and it exercises **fixtures only**: its live-tree battery proves the generator reads and renders the real registry and never asserts on what a record says (the respin moved the two assertions that did — one spelling everywhere, ui records parse — out; they were already `--report` warnings). `--report` checks the committed index against a fresh rendering and every record's status line, prints `::warning file=…::` annotations (and a `$GITHUB_STEP_SUMMARY` block) for anything off, and **exits 0 whatever it finds** — so the only red this step can show is a broken generator, never a record or a stale index. `--check` is the gate's spelling (exit 1 on drift or an unparsed record) for the day a maintainer names one; nothing calls it in CI. No new required check, no branch-protection change. **ObjectUI registry (#26080, ruling 6417494426)** — the 11 records under `ui/docs/adr/` are listed in the root index under `ui-NNNN` with their files untouched. Their numbers overlap the root sequence (ui 0053, 0057 …) and mean different decisions, so an index row never reads `ADR-NNNN` for them, and a citation keeps the `ObjectUI ADR-NNNN` spelling the anchor checker already recognises as another registry's. Rows link to `../../ui/docs/adr/…`, which `check-adr-links` resolves. **`docs/adr/PRIORITIZATION.md` removed** — it declared itself retired; the one live rule it still carried (a PR landing an ADR's implementation flips the status line to `Accepted — implemented` with one line of evidence) is now the *Status hygiene* bullet in the README conventions, and ADR-0110's pointer to it names the README. Non-ADR notes stay out of the index by construction: a filename that is not `NNNN-slug[.vN].md` is reported as foreign, never listed. **Respin after the contract review (record 6434963378)** — (1) the self-test no longer asserts on live records (above); (2) merged `origin/main` as a merge commit to clear the `package.json` conflict with c91544a and took its alias form; (3) README: a versions group now says the bare `ADR-0006` names the decision whose current text is v4 and cites the superseded unversioned file by its stem; a `**Decided**:` line is a date line, so ADR-0079 dates to 2026-06-28; ADR-0071's status paragraph is folded onto its one line. **Stale Proposed — listed, not relabelled.** 18 records carry `Proposed` with a status date before 2026-07-26 (the card counted 19; ADR-0025 is the 19th, see row 19). Each has an implementation reading from the tree (anchor files that the gate pins to it; files under `packages/` naming the number). None of these status lines changed; the reading is for the records' authors and the maintainer, not a verdict. <details><summary>19 stale Proposed records with an implementation reading each</summary> | # | Record | Status line as written | Anchored source files | Files under packages/ naming the bare number | Implementation reading | |---|---|---|---|---|---| | 1 | ADR-0010 `docs/adr/0010-metadata-protection-model.md` | Proposed | 0 | 138 src / 77 test (bare number — counts cover both ADR-0010 records) | **partly realized, undeclared** — 138 non-test source files name it, no anchor pins any. Author to decide: accept with evidence, or narrow the record to what landed. | | 2 | ADR-0019 `docs/adr/0019-app-as-consumer-unit.md` | Proposed (v3 — narrowed to the consumer-surface decision) | 0 | 90 src / 32 test (bare number — counts cover both ADR-0019 records) | **partly realized, undeclared** — 90 non-test source files name it, no anchor pins any. Author to decide: accept with evidence, or narrow the record to what landed. | | 3 | ADR-0022 `docs/adr/0022-connectors-vs-messaging-channels.md` | Proposed (2026-05-31) — routing decision recorded; both substrates now exist independently (`co… | 0 | 21 src / 2 test | **partly realized, undeclared** — 21 non-test source files name it, no anchor pins any. Author to decide: accept with evidence, or narrow the record to what landed. | | 4 | ADR-0026 `docs/adr/0026-client-ui-plugin-distribution.md` | Proposed | 0 | 0 src / 0 test | **not started** — nothing under packages/ cites it. Still a proposal; Withdrawn is a one-line edit if it is no longer wanted. | | 5 | ADR-0027 `docs/adr/0027-metadata-authoring-lifecycle.md` | Proposed (2026-06-01) | 0 | 6 src / 2 test | **partly realized, undeclared** — 6 non-test source files name it, no anchor pins any. Author to decide: accept with evidence, or narrow the record to what landed. | | 6 | ADR-0038 `docs/adr/0038-build-verification-loop.md` | Proposed (2026-06-11) — cloud-owned; framework slice partially implemented (2026-07-16 audit): … | 0 | 7 src / 4 test | **partly realized, undeclared** — 7 non-test source files name it, no anchor pins any. Author to decide: accept with evidence, or narrow the record to what landed. | | 7 | ADR-0046 `docs/adr/0046-package-docs-as-metadata.md` | Proposed (2026-06-12, revised — simplified from the original directory/docSet design) | 2 | 52 src / 29 test | **implemented, status never followed** — the anchor gate pins 2 source file(s) to it (`packages/rest/src/meta-item-read-gate.ts`, `packages/rest/src/meta-item-read-routes.ts`). Candidate for `Accepted — implemented` + one line of evidence, by its author. | | 8 | ADR-0050 `docs/adr/0050-form-layout-vs-presentation.md` | Proposed (2026-06-15) · **Amended** (2026-10-20, letter B′ on [#24692](https://github.com/objec… | 0 | 0 src / 0 test | **not started** — nothing under packages/ cites it. Still a proposal; Withdrawn is a one-line edit if it is no longer wanted. | | 9 | ADR-0051 `docs/adr/0051-inline-metadata-views-in-docs.md` | Proposed (2026-06-16) — P1 authoring surface implemented (2026-07-16 audit): `ElementMetadataVi… | 0 | 3 src / 1 test | **partly realized, undeclared** — 3 non-test source files name it, no anchor pins any. Author to decide: accept with evidence, or narrow the record to what landed. | | 10 | ADR-0052 `docs/adr/0052-audit-is-not-the-activity-feed.md` | Proposed (2026-06-16) — partially implemented (2026-07-16 audit): §5b declarative activity (`tr… | 0 | 47 src / 16 test | **partly realized, undeclared** — 47 non-test source files name it, no anchor pins any. Author to decide: accept with evidence, or narrow the record to what landed. | | 11 | ADR-0063 `docs/adr/0063-two-kernel-agents-skills-are-the-extension-primitive.md` | Proposed (2026-06-22) — cloud-owned (2026-07-16 audit): the framework spec dependencies shipped… | 1 | 33 src / 11 test | **implemented, status never followed** — the anchor gate pins 1 source file(s) to it (`packages/cli/src/commands/generate.ts`). Candidate for `Accepted — implemented` + one line of evidence, by its author. | | 12 | ADR-0064 `docs/adr/0064-tool-scoping-to-agent.md` | Proposed (2026-06-22) — cloud-owned (2026-07-16 audit): the only framework dependency (`skill.s… | 0 | 16 src / 5 test | **partly realized, undeclared** — 16 non-test source files name it, no anchor pins any. Author to decide: accept with evidence, or narrow the record to what landed. | | 13 | ADR-0071 `docs/adr/0071-dataset-semantic-layer-depth.md` | Proposed. (Refocused — see **Correction** below. The first merged draft also | 0 | 12 src / 5 test | **partly realized, undeclared** — 12 non-test source files name it, no anchor pins any. Author to decide: accept with evidence, or narrow the record to what landed. | | 14 | ADR-0072 `docs/adr/0072-reference-scope-and-resolvability.md` | Proposed (2026-06-25) | 0 | 31 src / 12 test | **partly realized, undeclared** — 31 non-test source files name it, no anchor pins any. Author to decide: accept with evidence, or narrow the record to what landed. | | 15 | ADR-0073 `docs/adr/0073-automation-execution-identity.md` | Proposed (2026-06-25) | 0 | 23 src / 5 test | **partly realized, undeclared** — 23 non-test source files name it, no anchor pins any. Author to decide: accept with evidence, or narrow the record to what landed. | | 16 | ADR-0077 `docs/adr/0077-authoring-surface-boundary-hook-flow-validation.md` | Proposed (2026-06-28) | 0 | 2 src / 1 test | **touched, not landed** — 2 source file(s) and 1 test(s) mention it; the decision is still open. | | 17 | ADR-0080 `docs/adr/0080-ai-authored-ui-jsx-source.md` | Proposed (2026-06-29) — partially implemented (2026-07-16 audit): `sdui-parser` package (parse≠… | 1 | 38 src / 7 test | **implemented, status never followed** — the anchor gate pins 1 source file(s) to it (`packages/sdui-parser/src/parse.ts`). Candidate for `Accepted — implemented` + one line of evidence, by its author. | | 18 | ADR-0096 `docs/adr/0096-execution-surface-identity-admission.md` | Proposed (2026-07-15) | 0 | 58 src / 40 test | **partly realized, undeclared** — 58 non-test source files name it, no anchor pins any. Author to decide: accept with evidence, or narrow the record to what landed. | | 19 | ADR-0025 `docs/adr/0025-plugin-package-distribution.md` | Proposed — partially implemented (2026-09-12 audit, superseding 2026-07-16): the `.osplugin` ar… | 0 | 51 src / 11 test | the card's 19th: its status line carries a 2026-09-12 audit stamp, so the generated index dates it after the cut; by first proposal date it is stale. **partly realized, undeclared** — 51 non-test source files name it, no anchor pins any. Author to decide: accept with evidence, or narrow the record to what landed. | Counts read from `git grep -l '\bADR-NNNN\b' -- packages` (non-test vs `__tests__`/`*.test.*`) and from `scripts/adr-anchors/*.json` at this PR's head. </details> **One row in `scripts/pm/dispatch-gates.data.mjs`** — `COMPOUND_ANCHOR_LEDGER` classifies every compound self-test name the dispatch-gates anchor matches; the generator's `runSelfTest` is a new one, so `check:pm-dispatch-gates` reddened until it was classified (genuine battery, fixtures masked as hints) and the docblock's pinned counts moved 34→35 / 23→24. The ledger forbids dodging the anchor by renaming, so the row is the fix. **Out of scope, on purpose**: no record is relabelled, renumbered or moved; no citation in the tree is rewritten to the stem form (bare citations keep working); no new required gate. ## Tests - `node scripts/adr-index.mjs --self-test` — 46 assertions over 7 pinned batteries (record parsing incl. `**Decided**:` as a date line; the one spelling with every other spelling Unparsed; supersession refs extracted not invented; shared-number grouping and the versions cite-as; deterministic rendering of both registries; `--check` reds / `--report` never does; live tree: the generator reads and renders the real registry — no assertion on a record's content). Self-test shape copied from a landed one (battery roster, pinned floors, verdict handshake). - `node scripts/check-adr-anchors.mjs --self-test` — 133 assertions (was 112), new battery of 21 for stem-qualified citations: resolves to one record, malformed stem is red, versioned stem checks the `.vN` file, bare number unchanged, collision pair cited by stem is unambiguous, decision letters on a qualified id check that record only. The live run on the merged head: 37 stem-qualified citations resolve (the README's versions note is the 37th). - `pnpm adr:index` then `git diff --quiet docs/adr/README.md` — the committed index is byte-equal to a fresh rendering. - `node scripts/check-self-test-wired.mjs` and `node scripts/check-self-test-workflow-commands.mjs` — exit 0 with the self-test wired through the `check:adr-index` alias (the first pass of the gates caught the generator's self-test as unrun; fixed by wiring, not by an allowlist row). - `pnpm check:adr-index` — exit 0 (self-test, then `--report: OK`); `--check` — exit 0. ## Acceptance notes - Ruling A (comment 6417460375, batch #398 item 3): index generated from the records, read from one normalized spelling ✔; four duplicated numbers cross-referenced in each header and listed side by side, never renumbered ✔; `check-adr-anchors.mjs` unambiguous on those four ✔; index script with `--self-test`, called report-only from the existing lint ADR step, no new required gate ✔ (门禁不加); 19 stale Proposed listed with a reading, not relabelled ✔; 12 no-match files listed before normalizing ✔; non-ADR notes out of the index ✔; `PRIORITIZATION.md` removed ✔. - Ruling 6417494426 (#26080): `ui/docs/adr` registered in the root index under the `ui-` prefix, files not renamed ✔. - Tier H: `docs/adr/**` and `.github/workflows/**` are governed surfaces; this PR stays draft and lands on a governed approver's review. - `skip-changeset`: the diff touches `docs/adr/**`, root `scripts/`, root `package.json` and a workflow — nothing any package ships in its `files[]`. ## Verification Head: `9e254cb3` (merge of origin/main 00874b9 + the respin commit). Commands below were run from the repository root on that head; exit codes captured before any pipe. <details><summary>Scripts and index</summary> ``` node scripts/adr-index.mjs --self-test → exit 0 · ✓ 46 assertions over the real parseRecord() / renderIndex() / verdict() paths node scripts/adr-index.mjs → exit 0 · unchanged docs/adr/README.md (231 lines) node scripts/adr-index.mjs --check → exit 0 · OK — docs/adr/README.md is current and every record parsed pnpm check:adr-index → exit 0 · self-test green, then --report: OK — current, every record parsed. Report-only node scripts/check-adr-anchors.mjs --self-test → exit 0 · ✓ 133 assertions node scripts/check-adr-anchors.mjs → exit 0 · OK (91 anchored file(s) … 138 decision number(s) … 59770 citation(s) across 8329 file(s) resolve, 37 of them stem-qualified to one record; …) pnpm exec eslint --no-inline-config scripts/adr-index.mjs scripts/check-adr-anchors.mjs scripts/pm/dispatch-gates.data.mjs → exit 0 pnpm check:adr-links → exit 0 (README links incl. ../../ui/docs/adr/… resolve) ``` </details> <details><summary>Dispatch gates — every command from `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack`, reconciled with `--ran`</summary> Pass 3 on the pre-merge head `d1a0cfe5` ran all 76 derived commands green (`--ran`: 76 derived / 76 run / 0 unrun). On this head `9e254cb3` (merge of origin/main + the respin) the full pass 4 (73 derived commands) was still running when this body was written; the quick checks named above plus `pnpm check:pm-dispatch-gates` (1935 cases) are exit 0 on it, and the complete `--ran` record of pass 4 is posted as the os-dev-report comment on #26076 when it completes. Changed lines 1542 vs the human-merge threshold 3000: under. </details> --- _Generated by [Claude Code](https://claude.ai/code/session_01WGufzgAZv5vcb4H6qvqBAM)_ --------- Co-authored-by: objectstack-fleet[bot] <noreply@anthropic.com>
1 parent c7d6ca8 commit 79cd9ef

33 files changed

Lines changed: 1457 additions & 85 deletions

‎.github/workflows/lint.yml‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -601,6 +601,21 @@ jobs:
601601
continue-on-error: true
602602
run: pnpm check:adr-anchors
603603

604+
# #26076 ADR index, REPORT-ONLY by the maintainer's ruling (门禁不加).
605+
# docs/adr/README.md is generated by scripts/adr-index.mjs from the
606+
# records' one `**Status**:` line; the alias runs the generator's
607+
# `--self-test` (fixtures only — it never asserts on what the records
608+
# say) and then `--report`, which prints a `::warning::` for a stale
609+
# index or a record whose status line is missing or unreadable and exits
610+
# 0 whatever it finds. So the only red this step can show is a broken
611+
# generator, never a record. `pnpm adr:index` regenerates; `--check` is
612+
# the gate's spelling for the day a maintainer names one. Alias form per
613+
# the GATE INVOCATION IDIOM note at the top of this file.
614+
- name: ADR index is current (report-only — warnings, never a red on a record)
615+
id: adr-index-current-report-only
616+
continue-on-error: true
617+
run: pnpm check:adr-index
618+
604619
# @objectstack/verify stand-in erasure guard (#6399). The third and
605620
# narrowest member of the slot-lookup and query-options erasure ratchets
606621
# (in the scoped lanes since #22991). `checkReadCoercion` /

‎docs/adr/0006-project-environment-split.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# ADR-0006: Environment & Project as Independent Siblings — v3
22

33
**Status**: Superseded by v4 (`0006-project-environment-split.v4.md`) — 2026-05-20
4+
**Versions of this number**: [v2](./0006-project-environment-split.v2.md) · [v3](./0006-project-environment-split.md) · [v4, current](./0006-project-environment-split.v4.md) — one decision revised twice; the number is shared only by its own revisions (AGENTS.md Prime Directive 13). A version is cited as `ADR-0006 v4` in prose or, stem-qualified, as `ADR-0006-project-environment-split.v4`.
45
**Date**: 2026-05-20 (v3)
56
**Deciders**: ObjectStack Protocol Architects
67
**Supersedes**: v1 (strict tree), v2 (siblings + sys_deployment join)

‎docs/adr/0006-project-environment-split.v2.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# ADR-0006: Three-Layer Tenancy — Organization, Project, Environment
22

33
**Status**: Superseded by v4 (`0006-project-environment-split.v4.md`) — 2026-05-20
4+
**Versions of this number**: [v2](./0006-project-environment-split.v2.md) · [v3](./0006-project-environment-split.md) · [v4, current](./0006-project-environment-split.v4.md) — one decision revised twice; the number is shared only by its own revisions (AGENTS.md Prime Directive 13). A version is cited as `ADR-0006 v4` in prose or, stem-qualified, as `ADR-0006-project-environment-split.v4`.
45
**Date**: 2026-05-20 (v1) / 2026-05-20 (v2 — same day revision)
56
**Deciders**: ObjectStack Protocol Architects
67
**Builds on**: ADR-0002 (Environment-Per-Database Isolation), ADR-0003 (Package as First-Class Citizen), ADR-0005 (Metadata Customization Overlay)

‎docs/adr/0006-project-environment-split.v4.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# ADR-0006: Environment & Project — v4 (drop dev-workspace Project, unify on Package)
22

33
**Status**: Accepted (v4 — supersedes v3) — API-surface vocabulary boundary recorded 2026-08-27 (#12473): the v5.0 `project` → `environment` rename stops at the CLI's user-facing vocabulary; three API surfaces keep `project` deliberately (see the addendum). **D1 retired by execution (2026-08-28, #12867 — see the second addendum):** D2 fired on the maintainer's 2026-08-28 ruling; all three of those surfaces are renamed to `environment` / `environments` with no aliases, authored and parked for one coordinated release. Read the first addendum's D1 as history — the boundary it draws no longer exists.
4+
**Versions of this number**: [v2](./0006-project-environment-split.v2.md) · [v3](./0006-project-environment-split.md) · [v4, current](./0006-project-environment-split.v4.md) — one decision revised twice; the number is shared only by its own revisions (AGENTS.md Prime Directive 13). A version is cited as `ADR-0006 v4` in prose or, stem-qualified, as `ADR-0006-project-environment-split.v4`.
45
**Date**: 2026-05-20 (v4)
56
**Deciders**: ObjectStack Protocol Architects
67
**Supersedes**: v1 (strict tree), v2 (siblings + sys_deployment join), v3 (siblings + deferred dev-workspace `sys_project`)

‎docs/adr/0009-execution-pinned-metadata.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# ADR-0009: Execution-Pinned Metadata
22

3-
**Status:** Accepted
3+
**Status**: Accepted
44
**Date:** 2026-05-22
55
**Supersedes:** —
66
**Builds on:** ADR-0008 (Metadata Repository & Change Log)

‎docs/adr/0010-metadata-protection-model.md‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
> **Protocol 18 update (2026-10-12, ADR-0131 C5, #22340):** The per-type overlay opt-in on `MetadataTypeRegistryEntry` is spelled `allowEnvironmentOverlay` from protocol 18 (`packages/spec/src/kernel/metadata-plugin.zod.ts#allowEnvironmentOverlay`). [ADR-0131](./0131-total-organization-ownership-no-null-organization-id.md) D6 retired the per-organization overlay axis, so the key now names the one scope it governs — whether an environment may overlay an item of this type that a managed package ships. The old key `allowOrgOverride` stays on the registry entry schema only as a tombstone that refuses at parse with the new name in its prescription: no second key, no alias, no conversion. The lines below that name `allowOrgOverride` describe the field as it was spelled when they were written and are preserved verbatim.
44
5-
**Status:** Proposed
5+
**Status**: Proposed
6+
**Shares its number with**: [`0010-nl-to-flow-authoring`](./0010-nl-to-flow-authoring.md) (Natural-Language → Flow Authoring) — an unrelated decision under the same number. Numbers are never reassigned (AGENTS.md Prime Directive 13); cite this record unambiguously as `ADR-0010-metadata-protection-model`.
67
**Date:** 2026-05-29
78
**Supersedes:** —
89
**Builds on:** ADR-0005 (Metadata Customization Overlay), ADR-0008 (Metadata Repository & Change Log), ADR-0009 (Execution-Pinned Metadata)

‎docs/adr/0010-nl-to-flow-authoring.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# ADR-0010: Natural-Language → Flow Authoring (Platform Capability)
22

33
**Status**: Draft (2026-05-24)
4+
**Shares its number with**: [`0010-metadata-protection-model`](./0010-metadata-protection-model.md) (Metadata Protection Model) — an unrelated decision under the same number. Numbers are never reassigned (AGENTS.md Prime Directive 13); cite this record unambiguously as `ADR-0010-nl-to-flow-authoring`.
45
**Authors**: HotCRM (objectstack-ai/hotcrm) — surfacing requirements from the v1 launch story
56
**Consumers**: `@objectstack/service-ai`, `@objectstack/spec` (automation), `objectui` (plugin-designer, plugin-chatbot), every app that ships flows
67

‎docs/adr/0014-record-form-field-type.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# ADR-0014 — `record` Form Field Type
22

3-
- **Status:** Accepted
3+
**Status**: Accepted
44
- **Date:** 2026-04-17
55
- **Supersedes:** —
66
- **Related:** ADR-0005 (Metadata Customization Overlay), Prime Directive #1 (Zod First)

‎docs/adr/0019-app-as-consumer-unit.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# ADR-0019: App as the Consumer-Facing Unit
22

33
**Status**: Proposed (v3 — narrowed to the consumer-surface decision)
4+
**Shares its number with**: [`0019-approval-as-flow-node`](./0019-approval-as-flow-node.md) (Collapse Approval into Flow — approval as a durable-pause node) — an unrelated decision under the same number. Numbers are never reassigned (AGENTS.md Prime Directive 13); cite this record unambiguously as `ADR-0019-app-as-consumer-unit`.
45
**Date**: 2026-05-31
56
**Deciders**: ObjectStack Protocol Architects
67
**Builds on**: ADR-0003 (Package as First-Class Citizen), ADR-0006 (Three-Layer Tenancy), ADR-0016 (Studio Package Authoring & Publish)

‎docs/adr/0019-approval-as-flow-node.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# ADR-0019: Collapse Approval into Flow — one engine, approval as a durable-pause node
22

33
**Status**: Accepted (2026-05-31) — fully implemented (A1–A5)
4+
**Shares its number with**: [`0019-app-as-consumer-unit`](./0019-app-as-consumer-unit.md) (App as the Consumer-Facing Unit) — an unrelated decision under the same number. Numbers are never reassigned (AGENTS.md Prime Directive 13); cite this record unambiguously as `ADR-0019-approval-as-flow-node`.
45
**Deciders**: ObjectStack Protocol Architects
56
**Builds on**: [ADR-0018](./0018-unified-node-action-registry.md) (open action registry — approval becomes a consumer), [ADR-0009](./0009-execution-pinned-metadata.md) (execution pinning — reconcile to one mechanism), [ADR-0012](./0012-notification-platform.md) (outbox / `notify`), [ADR-0010](./0010-nl-to-flow-authoring.md) + [ADR-0011](./0011-actions-as-ai-tools.md) (AI authoring — the design center)
67
**Revises**: ADR-0018's premise that Approval stays a separate paradigm with its own closed `ApprovalActionType` enum, and the "Workflow-Rule → Flow compiler" (M5) — both dropped here (greenfield, no legacy).

0 commit comments

Comments
 (0)