Files
qinglong/docs/adr/ADR-0325-local-identity-credential-command-domain-ownership.md
T

116 lines
8.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ADR-0325Local Identity Credential Command 领域归属
- 状态:Accepted
- 日期:2026-08-10
- 关联 RFCQL-RFC-0001 D-75、D-76、D-79、D-80、D-81、D-82、D-87、D-257
- 关联 ADRADR-0075、ADR-0076、ADR-0081、ADR-0082、ADR-0083、ADR-0209、ADR-0276、ADR-0324
## 背景
QingLong 3.0 已把 workspace package 收敛到 16 个,并用 package boundary gate 禁止单文件和浅层源码 package。
当前问题不再是继续合并 package,而是部分既有 package 内仍有单文件同时拥有多个安全职责。审计
`@qinglong/local-owner-cli` 时发现,`security-management/identityCredentialCommand.ts` 的 1,226 行实现同时拥有:
1. public command/result contract 与三个稳定 error identity
2. command path、exact-shape request codec 和 private command-file read
3. dependency、clock、failure audit、current credential 与 transaction fence
4. Identity inspect/register/enable/disable
5. API Credential inspect/issue/rotate/revoke
6. credential delivery acknowledgement 与最终 runner composition。
这些能力共享同一个短生命周期 Owner CLI deployment/authority boundary,不具备拆成新 workspace package 的独立交付
价值;但继续平铺在一个文件内会让协议、低权限解析和高权限执行无法独立评审,也会诱导未来修改取得超过职责所需的
数据库、Pepper、Secret delivery 或管理服务权限。
编辑前已对文件内 26 个 function、class 和 method 逐一执行 GitNexus upstream impact。稳定
`LocalIdentityCredentialCommandConfigurationError` 为 HIGH15 direct/17 total/1 process,覆盖 5 条 run flow);
其余两个 error 与所有 helper/coordinator 为 LOW。HIGH 风险已先告警,本轮只移动 ownership、建立 delegation 和精确
依赖边界,不修改命令或执行语义。
## 决策
保持一个 `@qinglong/local-owner-cli` package、既有 public file seam 和 23 行稳定 facade,在
`security-management/identity-credential-command/` 下建立 package-private DAG
```text
identityCredentialCommand.ts # stable public facade
identity-credential-command/
├── contracts.ts # public types and stable error identity
├── contractAuthority.ts # type-only reviewed contract bridge
├── codec.ts # path, exact-shape request and command-file codec
├── codecAuthority.ts # command-file and pure validator bridge
├── executionSupport.ts # dependencies, clock, audit and auth fence
├── executionAuthority.ts # database/auth/Pepper/admin authority bridge
└── runner.ts # identity/credential/delivery orchestration
```
依赖固定为 contracts→codec/execution support→runner。`contractAuthority.ts` 只导出 contract 所需类型;
`codecAuthority.ts` 只导出 command-file reader 和纯 validator`executionAuthority.ts` 才拥有真实数据库、认证、Pepper、
Secret delivery 和 administration authority。三个桥都是精确文件、精确 specifier allowlist,不允许目录 wildcard。
不建立一个 all-in-one internal barrel。Node CommonJS 的聚合 barrel 会在只解析 command 时 eager load 数据库、Pepper、
delivery 和管理服务,扩大启动 RSS、加载时间和 authority closure;角色桥使低配路由设备的一次性 CLI 只加载当前阶段
需要的模块。Cluster 节点也复用相同源码边界,但不把本机 SQLite/credential file CLI 误当成 PostgreSQL 管理协议。
原 facade 只显式 re-export 既有 public types、三个稳定 error、runner factory 和 command-file runner。5 个 runtime
export 与 owning module 保持同一个 object,维持 constructor、`instanceof`、错误 code/message、package export 和
调用路径;没有新增 public subpath、workspace package、production dependency、进程或部署单元。
本轮不修改:command JSON/path/shape、private-file fence、Identity/Credential operation、认证、Pepper、entropy、token
digest、credential lifetime、current credential、delivery、acknowledgement、failure audit、SQLite transaction fence、
exact replay、错误映射或低敏输出。
## 边界门反馈
第一次 dependency audit 拒绝了四个新 owner 对外部 authority 的直接导入。该反馈证明“只移动到子目录”仍可能扩大
权限面。本轮没有给整个目录增加 allowlist,而是建立三个按角色分离的精确 bridge,并把旧 facade 的许可分别迁移到
exact file/exact specifier。`auditSourceImports` 编辑前为 LOW/0 affected process;最终 Local Owner CLI 72 个源码文件
全部受审,dependency findings 为空。
## 小设备与集群影响
Identity Credential Command 是显式调用、短生命周期的 Owner 管理面,不进入 Edge、Standalone、Adopted、Application、
AI 或 Application AI 十档稳态 Profile artifact。十档 closure、bytes、physical files 与 loaded modules 相对
ADR-0324 精确不变;最低配 Edge/Standalone 仍为 49 loaded modules。没有新增常驻连接、Pool、timer、watcher、listener、
缓存、目录扫描或后台进程。
Cluster 使用独立 PostgreSQL、RBAC、TLS 和职责分离管理面,不导入本机 command runner。本轮没有 SQL、migration、
PostgreSQL、Cluster runtime、Kubernetes resource 或部署拓扑变化,因此虽然已获准运行 PostgreSQL HA Docker 门,
仍不制造与本次变更无关的新 HA 证据。
## 被否决方案
1. **为 Identity、Credential、Delivery 各建 workspace package**:没有独立部署或消费者闭包,会重新制造微包,拒绝。
2. **继续保留 1,226 行平铺文件**:协议、低权限解析和高权限执行继续耦合,拒绝。
3. **一个聚合 internal barrel**:会 eager load 高权限 adapter,扩大低配 CLI 启动闭包,拒绝。
4. **为整个内部目录开放 wildcard allowlist**:未来文件可静默获得全部 authority,拒绝。
5. **按每个 operation 拆一个文件**:会形成一函数一文件并分散共享 transaction/audit fence,拒绝。
6. **趁拆分重写状态机、鉴权或 delivery 协议**HIGH blast radius 下无法区分 ownership 与语义回归,拒绝。
## 验收证据
- facade 1,226→23 行;contracts 252、contract bridge 9、codec 452、codec bridge 7、execution support 198、
execution bridge 45、runner 369 行;总计 1,355 行,新增行主要是显式 import/export 边界。
- facade 与 owner 的 5 个 runtime export identity 全部相同;Owner CLI 134/134。
- 完整 16-package clean topology build/test 退出 0;所有执行测试 0 fail,外部 PostgreSQL/S3 与 Linux `/proc` 条件项
保持显式 skip。
- package boundary 为 16 package、845 source、25 root、820 nested`singleSourcePackages=[]`
`shallowSourcePackages=[]`、findings 为空;Owner CLI 为 72 source、1 root binary/71 nested。Edge import 为 121
modules 且无 forbiddenCluster dependency 与 deployment 全部 compatible/findings 为空。
- 十档 artifact 与 ADR-0324 精确相同:Edge/Standalone 3,644,543/3,644,579 bytes、342 files、49 modules
Adopted 4,265,052/4,265,112 bytes、394 files、50 modulesApplication 4,762,901/4,763,021 bytes、453 files、
116 modulesAI 5,039,854/5,039,902 bytes、421 files、50 modulesApplication AI
6,158,278/6,158,410 bytes、532 files、115 modules。
- 最终强制索引为 44,076 nodes/100,398 edges/1,730 clusters/274 flows。post-impact 中配置 error 保持 HIGH
18 direct/21 total/1 process);codec read、failure audit、auth fence、runner factory/file runner 与边界审计函数均为
LOW,高风险关系没有被 facade 或桥隐藏。
- `detect_changes` all/compare `develop` 仍只映射已跟踪 Legacy baseline 的 12/31 与 14/34、low/0 process;当前 QL3
孵化树尚未完整进入 Git baseline,因此该结果只作补充,不能替代逐 symbol impact、强制全索引、完整测试与制品门。
## 后续约束
Identity Credential Command 后续修改必须落入明确 owner。纯 contract 不得取得 runtime authoritycodec 不得取得
数据库/Pepper/admin authorityexecution authority 不得泄漏为新 public subpath;跨包引用只能经三个精确角色桥,
不得扩大为目录 wildcard。下一轮继续审计 package 内真正的多职责平铺实现;单一 schema、normalizer、repository 或
很小但拥有清晰共享边界的 package 不按 LOC/文件数机械拆分或合并。