Agents · Repository Partition · 仓库分区铁律(v4 · file_claims 协议)
核心原则:K-thread.file_claims 协议 · 写权限属于 K-thread(常驻基础设施线程)· U-thread 通过 occupies 字段临时占用 K-thread · 同一时刻同一 K-thread 只能被一个 U-thread 占用 · 不同 K-thread 不冲突即可并发(突破 v3 "目录独占")
v4 关键变化(2026-05-26 · 配合 ADR-AIOS-06 v0.3 落地): - 权限单元从"目录"升级到 K-thread.file_claims(细到文件级) - 隔离从"目录级互斥"升级到 文件级 conflict avoidance(同一目录不同文件可同时跑) - 全栈 10 进程写权限对齐:P5-backend-csharp / P6-dsp-algo / P7-pysidecar / P_contracts 各自独立写权限矩阵 - P_contracts 仅 ClaudeB 写(沿用 ADR-AIOS-01 v3 决议 · 契约一致性) - 越权检测从"author + 路径 grep"升级到 commit-msg 三元组 hook 校验(
[occupies=]与 K-thread.file_claims 子集匹配) - lock 协议废弃 · 由 K-thread state 状态机替代(sleeping/running/extending)关联: - ADR-AIOS-06 v0.3 · OS 化模型决议 - agents/Roster.md v4 · 9 CPU 实例 + 主战场表 - agents/Process-Model.md · K-thread / U-thread 概念 - agents/Commit-Convention.md · 三元组规范 + git hook - PCB.md · 进程总览(各 PROCESS.md 含 file_claims)
1. v3 → v4 模型升级(权限单元)
1.1 v3 模型(已升级)
权限单元 = 目录(粗粒度)
ClaudeA → frontend_vue3/(全程独占整个目录)
ClaudeB → backend_csharp/ + dsp_algo/ + contracts/(独占 3 个目录)
冲突检测 = git author + 路径 grep
问题:同一目录不同文件不能并发(如 frontend_vue3/stages/xitune/X.vue 和 frontend_vue3/stages/xilink/Y.vue 实际无冲突,但 v3 不允许两个 CPU 同时改)。
1.2 v4 模型(当前)
权限单元 = K-thread.file_claims(细粒度 · 文件级)
P3.K5-stage-toolbar.file_claims = [stages/xitune/toolbar/*, components/shell/StageBar.vue]
↑ 这是写权限的最小单位
U-thread 通过 occupies 占用 K-thread:
P3.U2-tuning-mode-ui.occupies = [P3.K5, P3.K7, P0.K-shared-types]
→ 占用期间这 3 个 K-thread state: sleeping → running
→ 期间任何其他 U-thread 想改 P3.K5 的 file_claims 必须等
冲突检测 = commit-msg 三元组 hook 校验
[occupies=K_a+K_b+...] 必须 ⊆ U-thread.occupies
[files=...] 必须 ⊆ ∪(K-thread.file_claims for K in occupies)
优势: - 同进程不同 K-thread 的 U-thread 可并发(如 P3.U-x 占 K3 + P3.U-y 占 K7 → 同时跑给两个 CPU) - 跨进程 K-thread 锁清晰(P3.U2 占 P0.K-shared-types · 期间 P2.U-x 想改 types/widget.ts 必须等) - 文件级冲突检测 · 不再误报"同目录冲突"
2. 全栈 10 进程写权限矩阵(v0.3 对齐)
完整 K-thread.file_claims 列表:见各进程
processes/<pid>/PROCESS.md· 本表只列进程级写权限主战场 + 副战场。
2.1 业务代码进程(04_development/)
| 进程 | 物理目录 | 主战场 CPU(可写) | 副战场 CPU(可写) | 只读 CPU | 备注 |
|---|---|---|---|---|---|
| P0-xishell(daemon) | frontend_vue3/components/shell/ + frontend_vue3/stores/ + frontend_vue3/shared/ |
ClaudeA | ClaudeC(机动) | ClaudeB / ClaudeD / Cline-Worker / Copilot-Worker / Continue-Worker | 9 K-thread(K1-K6 + K-shared-types/contracts/test-aux) |
| P1-xilink(user-process) | frontend_vue3/stages/xilink/ |
ClaudeA | ClaudeC(机动) | ClaudeB / ClaudeD / 其他 | 7 K-thread |
| P2-xiforge(user-process) | frontend_vue3/stages/xiforge/ |
ClaudeB | ClaudeA(协作)/ ClaudeC | ClaudeD / 其他 | 7 K-thread |
| P3-xitune(user-process) | frontend_vue3/stages/xitune/ |
ClaudeC | ClaudeA(机动) | ClaudeB / ClaudeD / 其他 | 7 K-thread |
| P4-xitest(user-process) | frontend_vue3/stages/xitest/ |
ClaudeD | ClaudeC(机动) | ClaudeA / ClaudeB / 其他 | 6 K-thread |
| P5-backend-csharp(daemon) | backend_csharp/ |
ClaudeB | Copilot-Worker(work-copilot · refresh-link) | ClaudeA / ClaudeC / ClaudeD / 其他 | 9 K-thread(controllers / services / models / websocket / routes / interop / aiagent / extensions / data-persistence) |
| P6-dsp-algo(daemon) | dsp_algo/ |
ClaudeB | ClaudeC(部分 modules) | ClaudeA / ClaudeD / 其他 | 6 K-thread(framework / modules / platform / include / build-system / config) |
| P7-pysidecar(daemon) | pysidecar/ |
ClaudeB(兼管) | ClaudeD(维护 scripts/) | ClaudeA / ClaudeC / 其他 | 3 K-thread(analyzer / reporter / scripts) |
| P_contracts(daemon) | 04_development/contracts/protocol-v1.md |
ClaudeB(写独占) | (无副战场 · 沿用 ADR-AIOS-01 v3) | 所有其他 CPU(只读) | 1 K-thread(K1-protocol-v1 · ⚠️ Day 5 EOD HARD-DEADLINE) |
2.2 调度元数据进程(06_docs/site-build/)
| 进程 / 路径 | 写权限 | 副写权限 | 只读 |
|---|---|---|---|
P_arch(arch-event 容器)· 40-aios/processes/P_arch/ |
Cline-AIOS | ClaudeB / ClaudeA(被派发 U-thread 时) | 其他 |
40-aios/PCB.md / RUNQ.md / INDEX.md |
Cline-AIOS | - | 其他 |
40-aios/KANBAN-archive-v6.md |
(只读历史 · 无写权限) | - | 全员 |
40-aios/ADR/ |
Cline-AIOS(终审) | ClaudeB(草拟) | 其他 |
40-aios/agents/ |
Cline-AIOS | - | 其他 |
40-aios/Human-*.md / index.md |
Cline-AIOS | - | 其他 |
40-aios/processes/<pid>/PROCESS.md |
Cline-AIOS(维护 K-thread / U-thread state) | - | 业务 CPU(只读 · 被派发时引用) |
40-aios/processes/<pid>/user_threads/<U>/STEP.md |
Cline-AIOS(派发提示词时写) | - | 接收派发的业务 CPU(只读) |
30-frontend-vue3/active/ archive/ |
(历史 · 6 个月 redirect 期不写) | - | 全员只读(等价 INDEX.md §2 映射) |
02-products/ 03-platform/ ..../*.md |
Cline-AIOS | ClaudeB(架构相关) | 其他 |
mkdocs.yml / scripts/aios-*.ps1 |
Cline-AIOS | - | 其他 |
backup/* 分支 |
Continue-Worker | - | 其他 |
2.3 P_contracts 写独占说明(沿用 ADR-AIOS-01 v3)
- 唯一写权限:ClaudeB(B1 §1-§3 / B2 §4-§6 / B3 §7-§9 / B4 freeze + tag · 后续 protocol-v2 也是 ClaudeB)
- 只读权限:所有其他 CPU(ClaudeA/C/D / Cline-Worker / Copilot-Worker / Continue-Worker)
- 理由:
- 契约一致性(单线写避免协议分裂)
- ADR-AIOS-01 v3 决议保留(跨栈职能解耦核心铁律)
- ⚠️ Day 5 EOD HARD-DEADLINE · 多 CPU 写会导致 freeze 时机失控
- 副战场说明:没有副战场(P5/P6/P7 都允许副战场 CPU 临时介入 · 但 P_contracts 例外 · 这是它独立提升为 daemon 的根本原因)
3. file_claims 协议详细规则
3.1 file_claims 声明位置
- 每个 K-thread 在所属
processes/<pid>/PROCESS.md的kernel_threads[].file_claims字段声明 - 例:
3.2 U-thread occupies 子集匹配
派发 U-thread 时必须满足:
∀ f ∈ U-thread.files
∃ K ∈ U-thread.occupies
f ∈ K.file_claims (glob 匹配)
且 ∀ K ∈ U-thread.occupies
K.state == sleeping (RUNQ Step 3 校验)
3.3 共享区(shared/)的并发协议
shared/types/ shared/contracts/ shared/test-aux/ 由 P0 daemon 持有 K-thread:
- P0.K-shared-types.file_claims = [frontend_vue3/src/shared/types/*]
- P0.K-shared-contracts.file_claims = [frontend_vue3/src/shared/contracts/*]
- P0.K-shared-test-aux.file_claims = [frontend_vue3/src/shared/test-aux/*]
任何进程都可读 · 但写需要进 RUNQ 显式占用 P0.K-shared-* · 同一时刻只能一个 U-thread 写。
例:
- P3.U2.occupies = [P3.K5, P3.K7, P0.K-shared-types] → 写期间 P0.K-shared-types running
- 同期 P2.U-x.occupies = [P2.K7, P0.K-shared-types] → ❌ 阻塞(P0.K-shared-types 已 running)
- 同期 P2.U-y.occupies = [P2.K7] → ✅ 可并发(K-thread 不冲突)
3.4 跨进程 K-thread 锁
跨进程引用通过 shared_resources.via 显式声明:
shared_resources:
- via: P0.K-shared-types
files: [types/xmlTuning.ts, types/tuningMode.ts]
- via: P_contracts.K1-protocol-v1
files: [contracts/protocol-v1.md] # 跨栈契约引用 · 通常只读
写权限规则:
- via 指向他进程的 K-thread → 必须把该 K-thread 加入本 U-thread 的 occupies(并参与 RUNQ Step 3 校验)
- 没有 via 声明的跨进程文件引用 → 越权(commit-msg hook 检测)
4. K-thread 状态机(替代 v3 lock 协议)
| state | 含义 | 触发 |
|---|---|---|
sleeping |
空闲 · 无 U-thread 占用 | 默认初始 + U-thread zombie 释放后 |
running |
正被某 U-thread 占用 | RUNQ 派发 U-thread 时(Step 5) |
extending |
架构升级中(file_claims 范围扩展) | ADR 触发 K-thread 扩展(罕见 · 例如 P3.K7 加入新 store) |
4.1 状态变更触发
| 触发事件 | K-thread state 变化 |
|---|---|
| RUNQ 派发 U-thread | sleeping → running(per K in U.occupies) |
U-thread 完成最后 commit · [step=N/M] 中 N==M |
running → sleeping(commit-msg hook 触发) |
| ADR 决议扩展 K-thread.file_claims | sleeping → extending → sleeping(扩展完后) |
| K-thread 扩展期间禁止派发依赖它的 U-thread | RUNQ Step 3 把 extending 视同 running 阻塞 |
4.2 PCB 中的可视化
详见 PCB.md §2 K-thread 占用快照(当前 running 的 K-thread)。
5. 越权检测与 git hook 校验
5.1 commit-msg 三元组规范回顾
<type>(<pid>.U<N>/<thread-name>): <subject>
[step=<N>/<M>] [pid=<P>] [uid=U<N>] [occupies=K<a>+K<b>+...] [files=<f1>,<f2>,...]
[ipc=<channel>|none]
详见 agents/Commit-Convention.md。
5.2 越权检测规则(commit-msg hook 自动校验)
| 越权类型 | 检测规则 | 处置 |
|---|---|---|
| files 不在 occupies 的 file_claims 并集中 | files ∩ (∪ K.file_claims for K in occupies) ≠ files |
hook 拒绝 commit + 报错"越权:files 超出 K-thread.file_claims 范围" |
| occupies 中某 K-thread state ≠ running | 检查 processes/<pid>/PROCESS.md 中各 K state |
hook 拒绝 commit + 报错"K-thread 未在派发态 · 你不该 commit" |
| U-thread state ≠ running | 检查 processes/<pid>/PROCESS.md 中 U state |
hook 拒绝 commit + 报错"U-thread 未派发或已 zombie" |
| 跨进程 K-thread 引用未声明 shared_resources.via | files 跨进程目录但无 via | hook 警告(7 天宽限期)+ 后续硬拒 |
| CPU author 与主战场表不匹配且无 trailer | git author 不在主/副战场 · 无 [need: <CPU>] trailer |
hook 警告 + AIOS 在 standup 时仲裁 |
| CPU 在 PROMPT 路径下改 STEP.md(自改提示词) | 路径 grep processes/<pid>/user_threads/.../STEP.md + author ≠ Cline-AIOS |
hook 拒绝 + revert + AIOS 重派 |
Cline-AIOS 改业务代码(04_development/ 任何路径) |
author == Cline-AIOS + 路径在 04_development | hook 拒绝(除非 emergency hotfix · 必须 ADR 备案) |
5.3 7 天宽限期
ADR-AIOS-06 落地后 7 天内 · 旧格式 commit 仅 warning · 不硬拒。期间业务 CPU 适应新规范。 2026-06-02 起 · commit-msg hook 进入 strict mode · 所有违规硬拒。
5.4 兜底:AIOS 每日 standup 跑 audit 脚本
(详见 T16 升级后的脚本)· 输出过去 24h 内的: - ✅ 合规 commit 数 / 越权 commit 数(警告级) - ❌ 硬越权(commit 已被 hook 拒绝但仍 push 的 · 罕见) - ⚠️ 缺三元组的 commit(7 天宽限期内)
6. 边界情形(灰色地带 · v4 重写)
6.1 ClaudeA 发现 P5 backend 有 bug
❌ 错误:自己 stash + 跨进程改 P5.K 文件(越权 · file_claims 不在 ClaudeA 主战场)
✅ 正确*:在 commit message 里写 trailer [need: ClaudeB] P5.K5 bug at <file>:<line> → AIOS 在 standup 派 P5.U-bugfix-NN 给 ClaudeB
6.2 ClaudeB 想加一个前端组件
❌ 错误:自己改 frontend_vue3/(P0-P4 主战场是 ClaudeA/C) ✅ 正确:写 P_contracts.U-protocol-vN 草稿 + 在 P2/P3 PROCESS.md 起新 U-thread 行 → AIOS 派 ClaudeA/ClaudeC 实施
6.3 ClaudeB 闲置时
- ❌ 不要跨进程写前端
- ✅ 正确做法(沿用 v3 提前铺路 · 升级到进程化语言):
- 提前完成 P_contracts.U-thread(B2/B3)给 ClaudeA 下下个 phase 用
- 提前完成 P5.U-source-sink-api(Week 3 末 HARD-DEADLINE)
- 接 AIOS 派的 P_arch.ADR-NN 草稿任务
6.4 紧急生产 hotfix 跨多进程
例外协议:
- 人类(你)在 standup 标 🔴 EMERGENCY-CROSS-PROCESS
- AIOS 临时授权(或亲自跑)跨界改动 · 临时降级 commit-msg hook
- 修复后 24 小时内补 ADR(P_arch/ADR-AIOS-NN-emergency-hotfix-YYYY-MM-DD/)说明跨界原因 + 受影响 K-thread
6.5 多 CPU 同时改不同 K-thread(v4 新增)
✅ 允许(v3 不允许 · v4 鼓励): - ClaudeA 改 P3.K3-right-dock(file_claims 在 stages/xitune/right/) - ClaudeC 同时改 P3.K7-stores(file_claims 在 stores/) - → 同进程不同 K-thread · 不冲突 · RUNQ Step 3 都 sleeping · 双派发
6.6 K-thread.file_claims 扩展(架构升级)
例:ADR-04 P0 决议把 widget 注册表加入 P2.K7 的 file_claims。 流程: 1. ADR-AIOS-04 §X 写明 K-thread.file_claims 扩展范围 2. AIOS 把 P2.K7.state: sleeping → extending(锁定) 3. 派 U-thread(P2.U3-widget-registry)修改 PROCESS.md(扩展 file_claims)+ 实施代码 4. U-thread zombie 后 P2.K7.state: extending → sleeping(释放) 5. PCB.md / INDEX.md 同步更新
7. 物理隔离(资源层 · v4 更新)
| CPU | 物理 | 端口 | 进程 |
|---|---|---|---|
| ClaudeA(CLI #1) | claude code 终端 #1 | 5173(vite dev) | pnpm dev in frontend_vue3/ |
| ClaudeB(CLI #2) | claude code 终端 #2 | 5000(dotnet) | dotnet run in backend_csharp/ |
| ClaudeC(CLI #3) | claude code 终端 #3 | (按需) | 测试 / 机动任务 |
| ClaudeD(CLI #4) | claude code 终端 #4 | (按需) | 测试 / P4 / P7 维护 |
| Cline-Worker | Claude Code in work-cline/ |
5174 / 5001(独立) | 独立 worktree · 主力 sync 任务 |
| Copilot-Worker | Copilot 终端 in work-copilot/ |
5175 / 5002(独立) | refresh-link 收尾 |
| Continue-Worker | Continue 插件 in work-continue/ |
8000(mkdocs) | 文档同步 + 备份 |
| Cline-AIOS | VSCode 插件本会话 | -(只读 04_*) | 调度内核 · 不跑 dev server |
| Copilot 内联 | VSCode 行内补全 | -(IDE 内嵌) | 人类打字时灰字 |
9 个端口互不冲突(并发域 A 用同一仓库不同终端 · 并发域 B 用独立 worktree 端口分配)。
v4 简化:每个 CPU 只跑自己主战场进程对应的 dev server(如 ClaudeB 全程不跑 vite · ClaudeA 全程不跑 dotnet)。
8. 验证脚本(升级 v3 · 待 T16 集成到 aios-standup-fetch.ps1)
8.1 越权检测(file_claims 协议)
# 1. 检查 commit message 三元组合规率(过去 24h)
git log --since="24 hours ago" --pretty=format:"%h %an %s%n%b" \
| grep -E "^\[(step|pid|uid|occupies|files|ipc)=" -c
# 输出应 ≥ commit 总数 × 6(每个 commit 6 行三元组)
# 2. 检查 ClaudeA 的 commit files 是否在 P0/P1/P2/P3/P4/P_contracts(前端)的 file_claims 中
# (具体由 commit-msg hook + audit 脚本完成 · 详见 T16)
# 3. 检查 ClaudeB 的 commit 是否触及 frontend_vue3/(除非有 trailer)
git log --since="24 hours ago" --author="claudeb" --pretty=format:"%h %s" \
-- frontend_vue3/
# 输出应为空(除非配 [need: ClaudeA] trailer)
# 4. 检查 P_contracts 的写独占
git log --since="24 hours ago" --pretty=format:"%h %an %s" \
-- 04_development/contracts/protocol-v1.md \
| grep -v -i "claudeb"
# 输出应为空(只有 ClaudeB 能改)
# 5. 检查 Cline-AIOS 是否触及 04_development/
git log --since="24 hours ago" --author="Cline" --pretty=format:"%h %s" \
-- 04_development/
# 输出应为空(除 emergency hotfix)
# 6. 检查 STEP.md 是否被业务 CPU 自改
git log --since="24 hours ago" --pretty=format:"%h %an %s" \
-- 'docs/08-implementation/40-aios/processes/**/user_threads/**/STEP.md' \
| grep -v -i "cline-aios\|cline"
# 输出应为空(只有 Cline-AIOS 写 STEP.md)
8.2 K-thread 状态校验
9. v3 → v4 迁移指引(给业务 CPU 读)
9.1 你需要做什么
- commit message 加三元组(7 天宽限期 · 见 Commit-Convention.md)
- 派发时读 STEP.md 而不是 PROMPT-claudex-xxx.md(路径已 T7 git mv · 见 INDEX.md §2)
- 跨栈协作走 trailer(
[need: <CPU>])· 不直接改对方主战场 - 共享区(shared/)写需占用 P0.K-shared-*(在 occupies 中声明)
9.2 你不需要做什么
- ❌ 不需要手动维护 KANBAN.md(已 archive · 由 PCB.md / RUNQ.md 替代 · Cline-AIOS 维护)
- ❌ 不需要在派发前读全局 KANBAN(读你拿到的 STEP.md 即可)
- ❌ 不需要担心目录粒度太粗(v4 是文件级 · 你和别人不会因"同目录"被阻塞)
10. 演进规则
| 何时修改本文件 | 处理 |
|---|---|
| 新增进程(如 P8) | Cline-AIOS 在 §2 表追加一行 + 同步 Roster.md §7 主战场表 |
| K-thread.file_claims 扩展 | 写 ADR + 走 §6.6 K-thread.state extending 流程 |
| 业务 CPU 能力变化 | 写 ADR + 修改 Roster.md §3-§4 + 同步本表副战场列 |
| 越权事件累计 ≥ 3 | 重新评估 K-thread 划分 + 可能拆分某 K-thread |
| 新增 CPU(如 Sonnet-5) | 重新分配主/副战场 + 同步 Roster.md §1 总表 |
| 版本 | 日期 | 变化 |
|---|---|---|
| v1.0 | 2026-05-19 上午 | 初始权限矩阵(4 智能体)(已废弃) |
| v2.0 | 2026-05-19 傍晚 | 时间窗共享 frontend_vue3/(已废弃 · 串行错误) |
| v3.0 | 2026-05-19 傍晚晚 | 跨栈职能解耦 · 目录级独占 · ClaudeA / ClaudeB / contracts 三块 |
| v4.0 | 2026-05-26 | OS 化模型 · K-thread.file_claims 协议替代目录独占 · 全栈 10 进程写权限矩阵 · P_contracts 沿用 ClaudeB 写独占 · commit-msg hook 三元组校验取代 lock · 7 天宽限期 |