@pm_zhousl/xinyun-ai-init 1.7.1 → 1.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -24,7 +24,7 @@ npx --yes @pm_zhousl/xinyun-ai-init@latest --force
24
24
  npm run verify:init
25
25
  npm run verify:rules
26
26
  npm run verify:rules -- --json
27
- npm run verify:rules -- --tarball ./pm_zhousl-xinyun-ai-init-1.7.1.tgz
27
+ npm run verify:rules -- --tarball ./pm_zhousl-xinyun-ai-init-1.7.2.tgz
28
28
  ```
29
29
 
30
30
  `verify:rules` 为只读规则包一致性检查,不自动修复、不安装依赖、不修改 Git 或业务代码。
@@ -2,7 +2,7 @@
2
2
 
3
3
  本目录是“欣芸技术开发 Agent 流”的初始化包,负责把完整 AI 执行要求下发到目标项目。
4
4
 
5
- 当前规则版本:`1.7.1`。
5
+ 当前规则版本:`1.7.2`。
6
6
 
7
7
  ## Codex 一句话入口
8
8
 
@@ -18,6 +18,8 @@ AI 读取本文件后,必须把本 README、`rules/`、`templates/` 作为执
18
18
  npx --yes @pm_zhousl/xinyun-ai-init@latest --force
19
19
  ```
20
20
 
21
+ v1.7.2 fixed task contract keys: `taskKind=initialization-main`, `taskKind=initialization-record`, `taskKind=role-execution`.
22
+
21
23
  执行上面的命令后,会生成 `xinyun-ai-init/`。随后让 AI 读取 `xinyun-ai-init/README.md` 即可。
22
24
 
23
25
  ## AI 执行入口
@@ -1066,3 +1068,17 @@ npx --yes @pm_zhousl/xinyun-ai-init@latest --force
1066
1068
  - 说明验证命令和结果;未验证时说明原因。
1067
1069
  - 说明风险、未完成事项和下一步动作。
1068
1070
  - 少复述规则,不输出明显 AI 话术,不把原型说明文案带入生产页面。
1071
+
1072
+ ## v1.7.2 初始化后角色任务可见性与执行任务分离
1073
+
1074
+ `initialization-record` 只表示初始化控制面登记,可以随已完成主任务归档;它不表示角色已经理解、确认、绑定或完成执行。
1075
+
1076
+ 初始化登记归档时,必须为五个角色补建或保留独立的 `role-execution` 后续任务,保存到 `xinyun-ai/tasks/role-execution/<roleTaskId>.md`。每个任务必须包含 `taskId`、`roleTaskId`、`parentTaskId`、`roleId`、`taskKind`、`title`、`priority`、`status`、`assignmentStatus`、`understandingStatus`、`confirmationStatus`、`memberId`、`sessionId`、`executionEligible`、`blockedReason`、`nextAction`、`sourceTaskId`、`idempotencyKey`、`createdAt` 和 `updatedAt`。
1077
+
1078
+ 五个角色默认优先级为:`project-owner=10`、`project-product=20`、`chief-engineer=30`、`programmer=40`、`test-reviewer=50`;任务按 `priority` 升序、`createdAt` 升序、`roleId` Unicode 字典序、`taskId` 字典序排序(`priority ASC`)。
1079
+
1080
+ `activeTaskIds` 必须包含所有未完成的角色后续任务,`executableTaskIds` 只包含满足成员绑定、职责确认、理解完成、确认人不冲突和 CodeGraph 条件的任务。`executableTaskIds` 可以为空,但只要 `activeTaskIds` 非空,`current-task.md` 就不得使用 `status=idle` 或 `taskId=null`,必须指向排序最高的活动任务;待分配使用 `status=pending`,权限、冲突或失败使用 `status=blocked`,并填写 `blockedReason` 或 `nextAction`。
1081
+
1082
+ 每个角色的幂等键是对 `{sourceTaskId, roleId, taskKind, targetVersion}` 使用 v1.6 JCS 规范化 JSON 后计算的 SHA-256,规范化算法为 `JCS-SHA-256`。同一幂等键只对应一个 `role-execution` 任务;重复升级复用已有任务并补齐索引,不覆盖用户控制文件或业务文件。
1083
+
1084
+ 补建使用逐角色临时文件、完整校验、原子重命名和任务索引原子更新。单角色写入失败记录 `status=blocked`、`blockedReason=write-failed`;部分成功为 `partial`,全失败为 `blocked`。索引更新中断时不得清空 `activeTaskIds` 或伪造 `idle`,下次按幂等键恢复。
@@ -42,3 +42,10 @@
42
42
  - 归档事务文件必须使用 `xinyun-ai/tasks/.archive-transactions/<archiveTransactionId>.json`,不得放入业务目录。
43
43
  - `.codegraph/` 是工具控制目录,属于一句话初始化授权范围;CodeGraph 状态源为 `manifest.json`,其他控制文件只引用同一 `codeGraphRecordId`。
44
44
  - 普通咨询不创建完整主任务、五角色任务树或触发 CodeGraph 初始化。
45
+
46
+ ## v1.7.2 任务可见性目录
47
+
48
+ - 需要补建角色后续任务时创建 `xinyun-ai/tasks/role-execution/`,不得把 `role-execution` 文件写入业务目录。
49
+ - 同步校验 `task-index.json`、`current-task.md`、`manifest.json` 和 `project-index.json` 的角色执行任务路径与索引。
50
+ - 活动角色任务不可执行时仍保留在 `activeTaskIds`;只有活动列表为空才允许 current-task 为 idle/null。
51
+ - 逐角色临时文件和索引必须原子写入;发现中断、冲突或写入失败时保留恢复记录,不清空活动任务。
@@ -55,3 +55,11 @@
55
55
  - 命令不存在=`unavailable`;目录不可写=`permission-denied`;MCP 未连接或健康状态无法确认=`unknown`;初始化命令失败或索引损坏=`failed`。
56
56
  - CodeGraph 必需任务失败时进入 `blocked`;只有用户明确授权限定范围降级时才允许 `partial`。
57
57
  - 不自动安装 CodeGraph,不修改系统环境、业务代码、数据库、API、配置、依赖或 Git。
58
+
59
+ ## v1.7.2 角色后续任务可见性
60
+
61
+ - 初始化主任务使用 `taskKind=initialization-main`;角色登记使用 `taskKind=initialization-record`;后续执行任务使用 `taskKind=role-execution`。
62
+ - 登记归档时必须保留五个 `xinyun-ai/tasks/role-execution/<roleTaskId>.md`,它们的 `sourceTaskId` 指向已归档初始化主任务,不能随登记归档清理。
63
+ - `activeTaskIds` 包含未完成角色任务;`executableTaskIds` 只包含真正满足执行条件的任务。活动任务非空时不得写 `current-task.status=idle` 或 `taskId=null`。
64
+ - 任务选择按 priority、createdAt、roleId、taskId 稳定排序;角色默认 priority 为 10、20、30、40、50。
65
+ - 重复升级按逐角色 JCS-SHA-256 幂等键复用任务。写入失败记录 `blockedReason=write-failed`;部分成功为 `partial`,全失败为 `blocked`;索引失败时保留活动任务并在下次恢复。
@@ -248,3 +248,12 @@ HTML 迁移只允许评估和单页面 / 区块试点计划;实际代码迁移
248
248
  - `degradationAuthorized`
249
249
 
250
250
  `initialization-record` 登记完成不代表 `role-execution` 完成;执行会话不得把未绑定成员、未确认职责或未完成理解的角色任务标记为可执行。归档或 CodeGraph 状态冲突时必须暂停复核或进入 `blocked`,不得静默覆盖历史。
251
+
252
+ ## v1.7.2 角色执行任务补充字段
253
+
254
+ - `roleExecutionPath`:xinyun-ai/tasks/role-execution/<roleTaskId>.md
255
+ - `roleExecutionTaskKind`:role-execution
256
+ - `sourceTaskId`、`idempotencyKey`、`priority`、`blockedReason`、`nextAction`
257
+ - `activeTaskIds`、`executableTaskIds`、`currentTaskId`
258
+ - `roleExecutionResult`:created / reused / blocked / write-failed
259
+ - 活动任务非空时,交接单必须说明不可执行原因和下一步,不得写成“暂无待执行任务”。
@@ -93,3 +93,11 @@
93
93
  - 缺少 CodeGraph 状态闭环时,补齐 `manifest.json` 的 `codeGraphRecordId` 状态源,并让 `project-index.json`、`current-task.md`、`init-result.json` 引用同一记录。
94
94
  - `.codegraph/` 缺失且命令可用时,初始化流程可执行一次 `codegraph init -i`;升级规则不得自动安装 CodeGraph 或修改系统环境。
95
95
  - CodeGraph 命令不可用、目录不可写、MCP 未连接、初始化失败或索引损坏时,按 `unavailable`、`permission-denied`、`unknown`、`failed` 固定矩阵登记,必需任务保持 `blocked`。
96
+
97
+ ## v1.7.2 升级补建角色后续任务
98
+
99
+ - 已发布 v1.7.1 项目升级时,归档中存在五个登记任务但活动索引缺少角色后续任务的,补建五个 `role-execution` 任务到 `xinyun-ai/tasks/role-execution/`。
100
+ - 每个任务必须关联 `sourceTaskId`、`parentTaskId` 和 `roleId`,并使用 `{sourceTaskId, roleId, taskKind, targetVersion}` 的 JCS-SHA-256 幂等键。
101
+ - 已有任务直接复用,缺失任务逐角色补建;不得覆盖用户修改的控制文件、业务任务或业务代码。
102
+ - `activeTaskIds` 非空时,即使 `executableTaskIds=[]`,也必须让 `current-task.md` 指向最高优先级活动任务,不能显示 `idle`。
103
+ - 单角色写入失败为 `blocked/write-failed`,部分成功为 `partial`,全失败为 `blocked`;索引更新失败不得清空活动索引,下次按幂等键恢复。
@@ -178,6 +178,13 @@ HTML 整站转微信小程序或 uni-app 的迁移评估与单页面 / 区块试
178
178
 
179
179
  CodeGraph 为必需能力时,只有 `initialized` 或 `healthy` 才能将结构理解或影响审视标记为完成;失败时相关任务进入 `blocked`,只有用户明确授权限定范围降级才允许 `partial`。不得自动安装 CodeGraph、修改系统环境、业务代码、数据库、API、配置、依赖或 Git。
180
180
 
181
+ ## v1.7.2 角色后续任务可见性
182
+
183
+ - `initialization-main` 是初始化主任务;`initialization-record` 是可归档登记;`role-execution` 是独立后续任务。
184
+ - 登记归档后必须保留五个 `xinyun-ai/tasks/role-execution/<roleTaskId>.md`,并关联已归档主任务的 `sourceTaskId`。
185
+ - `activeTaskIds` 非空时不得把 `current-task.md` 写成 idle/null;不可执行任务使用 pending 或 blocked,并显示 blockedReason/nextAction。
186
+ - 重复升级按逐角色幂等键复用任务;写入或索引失败时保留活动任务并恢复,不得清空索引。
187
+
181
188
  AI 接手本项目时,请先读取:
182
189
 
183
190
  - `xinyun-ai/README.md`
@@ -425,6 +425,10 @@
425
425
  | `completed` | `applied` / `not-started` | `released` |
426
426
  | `cancelled` | `failed` / `not-started` | `released` |
427
427
 
428
+ v1.7.2 fixed task contract keys: `taskKind=initialization-main`, `taskKind=initialization-record`, `taskKind=role-execution`.
429
+ The fixed task ordering expression is `priority ASC`, followed by `createdAt ASC`, roleId Unicode order, and taskId order.
430
+ A single-role write failure records `status=blocked` and `blockedReason=write-failed`.
431
+
428
432
  - `current-task.md`、`tasks/<taskId>.md`、`init-result.json` 和 `task-lock.json` 的 `taskId`、`executionId`、`attempt`、状态和时间必须一致。
429
433
  - 任意文件出现不在表内的组合,主会话必须将任务改为 `blocked`,写入冲突原因并停止继续写入。
430
434
 
@@ -528,6 +532,17 @@
528
532
  - 不自动安装 CodeGraph,不修改系统环境、业务代码、数据库、API、配置、依赖或 Git。
529
533
  - 相同项目、相同 `codeGraphRecordId` 和相同失败状态只提示一次;命令、权限、服务或索引状态变化后才允许再次提示或重试。
530
534
 
535
+ ## v1.7.2 初始化后角色任务可见性与执行任务分离
536
+
537
+ - `initialization-main` 是初始化主任务;`initialization-record` 只表示角色登记控制面完成;`role-execution` 才表示角色后续执行任务。
538
+ - 初始化登记归档时必须补建或保留五个 `role-execution` 任务,路径为 `xinyun-ai/tasks/role-execution/<roleTaskId>.md`,`sourceTaskId` 指向已归档初始化主任务。
539
+ - `role-execution` 最小字段为 `taskId`、`roleTaskId`、`parentTaskId`、`roleId`、`taskKind`、`title`、`priority`、`status`、`assignmentStatus`、`understandingStatus`、`confirmationStatus`、`memberId`、`sessionId`、`executionEligible`、`blockedReason`、`nextAction`、`sourceTaskId`、`idempotencyKey`、`createdAt`、`updatedAt`。
540
+ - `activeTaskIds` 包含所有未完成角色任务;`executableTaskIds` 只包含满足执行前置条件的任务。活动任务存在时 `current-task.md` 不得为 `idle/null`。
541
+ - 默认优先级为 project-owner 10、project-product 20、chief-engineer 30、programmer 40、test-reviewer 50;排序为 priority、createdAt、roleId Unicode 字典序、taskId 字典序。
542
+ - 待分配任务使用 `status=pending`;权限、冲突或失败使用 `status=blocked`,并填写 `blockedReason` 或 `nextAction`。
543
+ - 幂等键固定为 `{sourceTaskId, roleId, taskKind, targetVersion}` 的 JCS-SHA-256;同键复用同一任务。
544
+ - 单角色写入失败为 `blocked/write-failed`,部分成功为 `partial`,全失败为 `blocked`;索引更新中断时保留活动任务并按幂等键恢复,不得伪造 `idle`。
545
+
531
546
  ## 自我学习
532
547
 
533
548
  发现可复用经验时,先记录为候选经验。候选经验必须标注来源、适用范围、可信度、状态和最后验证时间。用户确认后,才能合并进正式规则。
@@ -7,7 +7,7 @@
7
7
  "mode": "initialization",
8
8
  "status": "pending",
9
9
  "currentVersion": null,
10
- "targetVersion": "1.7.1",
10
+ "targetVersion": "1.7.2",
11
11
  "idempotencyKey": null,
12
12
  "createdFiles": [],
13
13
  "updatedFiles": [],
@@ -3,13 +3,13 @@
3
3
  "hashAlgorithm": "sha256",
4
4
  "contentEncoding": "utf8-normalized",
5
5
  "managedBy": "@pm_zhousl/xinyun-ai-init",
6
- "lastAppliedVersion": "1.7.1",
6
+ "lastAppliedVersion": "1.7.2",
7
7
  "files": [
8
8
  {
9
9
  "path": "xinyun-ai/rules/core-rules.md",
10
10
  "baselineHash": null,
11
11
  "templateHash": null,
12
- "lastAppliedVersion": "1.7.1",
12
+ "lastAppliedVersion": "1.7.2",
13
13
  "managedBy": "@pm_zhousl/xinyun-ai-init",
14
14
  "status": "unknown"
15
15
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "projectName": "",
3
- "xinyunAiVersion": "1.7.1",
3
+ "xinyunAiVersion": "1.7.2",
4
4
  "scriptVersion": "2026.07.20",
5
5
  "schemaVersion": "1",
6
6
  "initializationMode": "fast",
@@ -45,6 +45,7 @@
45
45
  "namedInitializationTaskTree": true,
46
46
  "taskArchiveTransactions": true,
47
47
  "codeGraphRequiredInitialization": true
48
+ ,"roleExecutionVisibility": true
48
49
  },
49
50
  "tasking": {
50
51
  "currentTask": "xinyun-ai/current-task.md",
@@ -62,6 +63,8 @@
62
63
  "roleSubtaskTemplate": "xinyun-ai-init/templates/role-subtask.template.md",
63
64
  "taskIndexTemplate": "xinyun-ai-init/templates/task-index.template.json",
64
65
  "archiveTransactionTemplate": "xinyun-ai-init/templates/archive-transaction.template.json"
66
+ ,"roleExecutionDirectory": "xinyun-ai/tasks/role-execution/"
67
+ ,"roleExecutionTemplate": "xinyun-ai-init/templates/role-execution.template.md"
65
68
  },
66
69
  "taskTree": {
67
70
  "enabled": true,
@@ -71,7 +74,18 @@
71
74
  "taskIndex": "xinyun-ai/tasks/task-index.json",
72
75
  "archiveDirectory": "xinyun-ai/tasks/archive/",
73
76
  "archiveTransactionsDirectory": "xinyun-ai/tasks/.archive-transactions/",
74
- "roleTaskCount": 5
77
+ "roleTaskCount": 5,
78
+ "roleExecutionDirectory": "xinyun-ai/tasks/role-execution/",
79
+ "roleExecutionPathPattern": "xinyun-ai/tasks/role-execution/<roleTaskId>.md",
80
+ "roleExecutionTaskKind": "role-execution",
81
+ "roleExecutionPriority": {
82
+ "project-owner": 10,
83
+ "project-product": 20,
84
+ "chief-engineer": 30,
85
+ "programmer": 40,
86
+ "test-reviewer": 50
87
+ },
88
+ "taskSortOrder": ["priority", "createdAt", "roleId", "taskId"]
75
89
  },
76
90
  "codeGraphRequired": {
77
91
  "codeGraphRecordId": null,
@@ -117,6 +117,13 @@
117
117
  - 是否未自动安装 CodeGraph、修改系统环境、业务代码、数据库、API、配置、依赖或 Git:待填写
118
118
  ## v1.7 machine-readable enum anchors
119
119
 
120
+ ## v1.7.2 checks
121
+
122
+ - 归档后是否保留五个 role-execution 活动任务:待填写
123
+ - activeTaskIds 非空且 executableTaskIds 为空时是否指向最高优先级任务:待填写
124
+ - 重复升级是否按逐角色 JCS-SHA-256 幂等键复用:待填写
125
+ - 单角色失败是否为 blocked/write-failed,索引中断是否可恢复:待填写
126
+
120
127
  - frameworkStatus=confirmed/inferred/not-found/unknown/detected-unsupported
121
128
  - moduleStatus=loaded/not-loaded
122
129
  - activation=loaded/not-loaded
@@ -201,6 +201,14 @@
201
201
  - scope/unverifiedScope:每项至少包含 itemId / path / itemType / reason / checkedAt。
202
202
  ## v1.7 machine-readable enum anchors
203
203
 
204
+ ## v1.7.2 role execution anchors
205
+
206
+ - role-execution:xinyun-ai/tasks/role-execution/<roleTaskId>.md
207
+ - activeTaskIds / executableTaskIds:活动任务与可执行任务分离
208
+ - priority ASC / createdAt ASC / roleId Unicode / taskId:稳定排序
209
+ - idempotencyKey:JCS-SHA-256(sourceTaskId, roleId, taskKind, targetVersion)
210
+ - activeTaskIds 非空时 current-task 不得为 idle/null
211
+
204
212
  - frameworkStatus=confirmed/inferred/not-found/unknown/detected-unsupported
205
213
  - moduleStatus=loaded/not-loaded
206
214
  - activation=loaded/not-loaded
@@ -92,6 +92,7 @@
92
92
  "archiveDirectory": "xinyun-ai/tasks/archive/",
93
93
  "archiveTransactionsDirectory": "xinyun-ai/tasks/.archive-transactions/",
94
94
  "archiveTempDirectory": "xinyun-ai/tasks/.archive-tmp/",
95
+ "roleExecutionDirectory": "xinyun-ai/tasks/role-execution/",
95
96
  "initResult": "xinyun-ai/init-result.json",
96
97
  "taskLock": "xinyun-ai/task-lock.json",
97
98
  "managedBaseline": "xinyun-ai/index/managed-baseline.json",
@@ -111,12 +112,25 @@
111
112
  "taskIndex": "xinyun-ai/tasks/task-index.json",
112
113
  "mainTaskPathPattern": "xinyun-ai/tasks/<taskId>.md",
113
114
  "roleSubtaskPathPattern": "xinyun-ai/tasks/<taskId>/subtasks/<roleTaskId>.md",
115
+ "roleExecutionPathPattern": "xinyun-ai/tasks/role-execution/<roleTaskId>.md",
114
116
  "archiveDirectory": "xinyun-ai/tasks/archive/",
115
117
  "archiveTransactionsDirectory": "xinyun-ai/tasks/.archive-transactions/",
116
118
  "currentTaskIdle": {
117
119
  "status": "idle",
118
120
  "taskId": null,
119
121
  "title": "暂无待执行任务"
122
+ },
123
+ "roleExecution": {
124
+ "directory": "xinyun-ai/tasks/role-execution/",
125
+ "taskKind": "role-execution",
126
+ "priority": {
127
+ "project-owner": 10,
128
+ "project-product": 20,
129
+ "chief-engineer": 30,
130
+ "programmer": 40,
131
+ "test-reviewer": 50
132
+ },
133
+ "sortOrder": ["priority", "createdAt", "roleId", "taskId"]
120
134
  }
121
135
  },
122
136
  "codeGraphRequired": {
@@ -0,0 +1,35 @@
1
+ # 角色后续执行任务
2
+
3
+ - taskId:role-execution-task-template
4
+ - roleTaskId:role-task-template
5
+ - parentTaskId:task-template
6
+ - roleId:project-owner
7
+ - taskKind:role-execution
8
+ - title:角色后续执行:project-owner
9
+ - priority:10
10
+ - status:pending
11
+ - assignmentStatus:pending
12
+ - understandingStatus:pending
13
+ - confirmationStatus:pending
14
+ - memberId:null
15
+ - sessionId:null
16
+ - executionEligible:false
17
+ - blockedReason:member-unassigned
18
+ - nextAction:绑定成员、完成职责确认和项目理解后再执行
19
+ - sourceTaskId:task-template
20
+ - idempotencyKey:
21
+ - createdAt:2026-07-21T00:00:00.000Z
22
+ - updatedAt:2026-07-21T00:00:00.000Z
23
+
24
+ ## 状态与可见性
25
+
26
+ - `taskKind=role-execution` 表示角色后续实际执行任务,不表示已经获得业务代码修改授权。
27
+ - 未绑定成员、职责确认待处理或理解未完成时,任务仍属于 `activeTaskIds`,但不得进入 `executableTaskIds`。
28
+ - `executionEligible=true` 必须同时满足成员绑定、角色 ready、职责 confirmed、理解 ready、确认人不冲突和 CodeGraph 必备条件。
29
+ - 待分配任务使用 `status=pending`;权限、冲突、写入失败或不可恢复错误使用 `status=blocked`,并填写 `blockedReason` 和 `nextAction`。
30
+ - `sourceTaskId` 指向已经归档的初始化主任务;角色任务完成前不得加入 `archivedTaskIds`。
31
+
32
+ ## 幂等
33
+
34
+ - `idempotencyKey` 是对 `{sourceTaskId, roleId, taskKind, targetVersion}` 使用 v1.6 JCS 规范化 JSON 后计算的 SHA-256。
35
+ - 同一幂等键只允许对应一个角色后续任务;重复升级必须复用任务并补齐索引。
@@ -4,6 +4,27 @@
4
4
  "executableTaskIds": [],
5
5
  "archivedTaskIds": [],
6
6
  "currentTaskId": null,
7
+ "roleExecutionDirectory": "xinyun-ai/tasks/role-execution/",
8
+ "roleExecutionTaskIds": [],
9
+ "roleExecutionStatusEnum": ["pending", "assigned", "accepted", "executing", "paused", "blocked", "completed", "cancelled"],
10
+ "roleExecutionPriority": {
11
+ "project-owner": 10,
12
+ "project-product": 20,
13
+ "chief-engineer": 30,
14
+ "programmer": 40,
15
+ "test-reviewer": 50
16
+ },
17
+ "taskSortOrder": ["priority", "createdAt", "roleId", "taskId"],
18
+ "currentTaskPolicy": {
19
+ "idleWhenActiveTaskIdsEmpty": true,
20
+ "activeButNotExecutableStatus": ["pending", "blocked"],
21
+ "idleTaskId": null
22
+ },
23
+ "idempotency": {
24
+ "keyFields": ["sourceTaskId", "roleId", "taskKind", "targetVersion"],
25
+ "algorithm": "JCS-SHA-256",
26
+ "duplicatePolicy": "reuse"
27
+ },
7
28
  "tasks": [],
8
29
  "archiveTransactions": [],
9
30
  "statusEnum": ["pending", "executing", "partial", "blocked", "completed", "cancelled"],
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "packageName": "xinyun-ai-init",
3
3
  "displayName": "欣芸技术开发 Agent 流初始化包",
4
- "version": "1.7.1",
4
+ "version": "1.7.2",
5
5
  "scriptVersion": "2026.07.20",
6
6
  "schemaVersion": "1",
7
7
  "defaultMode": "fast-init",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pm_zhousl/xinyun-ai-init",
3
- "version": "1.7.1",
3
+ "version": "1.7.2",
4
4
  "description": "欣芸技术开发 Agent 流初始化包",
5
5
  "bin": {
6
6
  "xinyun-ai-init": "bin/xinyun-ai-init.js"
@@ -30,4 +30,4 @@
30
30
  "engines": {
31
31
  "node": ">=16"
32
32
  }
33
- }
33
+ }
@@ -103,18 +103,18 @@ function verifyPackageFiles() {
103
103
  );
104
104
 
105
105
  addCheck(
106
- "package.json 版本为 1.7.1",
107
- packageJson.version === "1.7.1",
106
+ "package.json 版本为 1.7.2",
107
+ packageJson.version === "1.7.2",
108
108
  `当前版本为 ${packageJson.version}`
109
109
  );
110
110
  addCheck(
111
- "version.json 版本为 1.7.1",
112
- versionJson.version === "1.7.1",
111
+ "version.json 版本为 1.7.2",
112
+ versionJson.version === "1.7.2",
113
113
  `当前版本为 ${versionJson.version}`
114
114
  );
115
115
  addCheck(
116
- "manifest.template.json 版本为 1.7.1",
117
- manifestTemplate.xinyunAiVersion === "1.7.1",
116
+ "manifest.template.json 版本为 1.7.2",
117
+ manifestTemplate.xinyunAiVersion === "1.7.2",
118
118
  `当前版本为 ${manifestTemplate.xinyunAiVersion}`
119
119
  );
120
120
  }
@@ -483,10 +483,11 @@ function verifyTestScenarios() {
483
483
  ]);
484
484
 
485
485
  requireIncludes("test-scenarios/README.md", [
486
- "pm_zhousl-xinyun-ai-init-1.7.1.tgz",
486
+ "pm_zhousl-xinyun-ai-init-1.7.2.tgz",
487
487
  "1-87",
488
488
  "88",
489
489
  "npm run verify:rules",
490
+ "v1.7.2-scenarios.md",
490
491
  ]);
491
492
 
492
493
  requireIncludes("test-scenarios/v1.7.1-scenarios.md", [
@@ -497,6 +498,15 @@ function verifyTestScenarios() {
497
498
  "CodeGraph记录与失败矩阵",
498
499
  "普通咨询边界",
499
500
  ]);
501
+
502
+ requireIncludes("test-scenarios/v1.7.2-scenarios.md", [
503
+ "role-execution",
504
+ "activeTaskIds",
505
+ "executableTaskIds",
506
+ "固定优先级",
507
+ "幂等补建",
508
+ "补建失败和索引恢复",
509
+ ]);
500
510
  }
501
511
  function verifyFrameworkRules() {
502
512
  const required = [
@@ -741,7 +751,7 @@ function verifyV16Contracts() {
741
751
  ]);
742
752
 
743
753
  requireIncludes("init/xinyun-ai-init/README.md", [
744
- "当前规则版本:`1.7.1`",
754
+ "当前规则版本:`1.7.2`",
745
755
  "v1.6 初始化任务、幂等恢复与结果记录",
746
756
  "xinyun-ai/tasks/.idempotency/",
747
757
  "xinyun-ai/init-result.json",
@@ -941,7 +951,7 @@ function verifyV16Contracts() {
941
951
  }
942
952
 
943
953
  addCheck("init-result mode 为 initialization", initResult.mode === "initialization");
944
- addCheck("init-result targetVersion=1.7.1", initResult.targetVersion === "1.7.1");
954
+ addCheck("init-result targetVersion=1.7.2", initResult.targetVersion === "1.7.2");
945
955
  addCheck("init-result businessCodeChanged 初始为 unknown", initResult.businessCodeChanged && initResult.businessCodeChanged.value === "unknown");
946
956
  addCheck("task-lock scope=xinyun-ai-control", taskLock.scope === "xinyun-ai-control");
947
957
  addCheck("task-lock audit 包含 released", Array.isArray(taskLock.audit) && taskLock.audit.some((item) => item.action === "released"));
@@ -1047,7 +1057,7 @@ function verifyV17Contracts() {
1047
1057
  addCheck("html migration pilot requires separate confirmation", htmlMigration.pilotPlan && htmlMigration.pilotPlan.requiresSeparateConfirmation === true);
1048
1058
 
1049
1059
  requireIncludes("init/xinyun-ai-init/README.md", [
1050
- "当前规则版本:`1.7.1`",
1060
+ "当前规则版本:`1.7.2`",
1051
1061
  "v1.7 规则包一致性检查与 verify:rules",
1052
1062
  "frameworkStatus=confirmed/inferred/not-found/unknown/detected-unsupported",
1053
1063
  "v1.7 深化预算:5 层目录、80 个关键文件、100 条证据",
@@ -1074,7 +1084,7 @@ function verifyV17Contracts() {
1074
1084
  ]);
1075
1085
 
1076
1086
  requireIncludes("test-scenarios/README.md", [
1077
- "pm_zhousl-xinyun-ai-init-1.7.1.tgz",
1087
+ "pm_zhousl-xinyun-ai-init-1.7.2.tgz",
1078
1088
  "当前必测场景为 `scenarios.md` 的 1-87",
1079
1089
  "当前观察场景为 `scenarios.md` 的 88",
1080
1090
  "npm run verify:rules",
@@ -1142,7 +1152,7 @@ function verifyV171Contracts() {
1142
1152
  addCheck("init-result taskTree role count", initResult.taskTree && initResult.taskTree.roleTaskCount === 5, "init-result taskTree.roleTaskCount 应为 5");
1143
1153
 
1144
1154
  requireIncludes("init/xinyun-ai-init/README.md", [
1145
- "当前规则版本:`1.7.1`",
1155
+ "当前规则版本:`1.7.2`",
1146
1156
  "项目初始化:<项目显示名>",
1147
1157
  "xinyun-ai/tasks/task-index.json",
1148
1158
  "xinyun-ai/tasks/.archive-transactions/<archiveTransactionId>.json",
@@ -1210,6 +1220,110 @@ function verifyJsonAndMarkdown() {
1210
1220
  }
1211
1221
  }
1212
1222
 
1223
+ function verifyV172Contracts() {
1224
+ const manifestTemplate = JSON.parse(readText("init/xinyun-ai-init/templates/manifest.template.json"));
1225
+ const projectIndexTemplate = JSON.parse(readText("init/xinyun-ai-init/templates/project-index.template.json"));
1226
+ const taskIndex = JSON.parse(readText("init/xinyun-ai-init/templates/task-index.template.json"));
1227
+ const roleExecution = readText("init/xinyun-ai-init/templates/role-execution.template.md");
1228
+ const expectedPriority = {
1229
+ "project-owner": 10,
1230
+ "project-product": 20,
1231
+ "chief-engineer": 30,
1232
+ "programmer": 40,
1233
+ "test-reviewer": 50,
1234
+ };
1235
+
1236
+ requireFile("init/xinyun-ai-init/templates/role-execution.template.md");
1237
+ requireFile("test-scenarios/v1.7.2-scenarios.md");
1238
+ addCheck(
1239
+ "manifest v1.7.2 roleExecutionVisibility",
1240
+ manifestTemplate.capabilities && manifestTemplate.capabilities.roleExecutionVisibility === true,
1241
+ "manifest 缺少 roleExecutionVisibility 能力"
1242
+ );
1243
+ addCheck(
1244
+ "manifest roleExecutionDirectory",
1245
+ manifestTemplate.tasking && manifestTemplate.tasking.roleExecutionDirectory === "xinyun-ai/tasks/role-execution/",
1246
+ "manifest roleExecutionDirectory 不一致"
1247
+ );
1248
+ addCheck(
1249
+ "project-index roleExecutionDirectory",
1250
+ projectIndexTemplate.tasking && projectIndexTemplate.tasking.roleExecutionDirectory === "xinyun-ai/tasks/role-execution/",
1251
+ "project-index roleExecutionDirectory 不一致"
1252
+ );
1253
+ addCheck(
1254
+ "manifest roleExecution path pattern",
1255
+ manifestTemplate.taskTree && manifestTemplate.taskTree.roleExecutionPathPattern === "xinyun-ai/tasks/role-execution/<roleTaskId>.md",
1256
+ "manifest roleExecution path pattern 不一致"
1257
+ );
1258
+ addCheck(
1259
+ "task-index roleExecutionDirectory",
1260
+ taskIndex.roleExecutionDirectory === "xinyun-ai/tasks/role-execution/",
1261
+ "task-index roleExecutionDirectory 不一致"
1262
+ );
1263
+ addCheck("task-index roleExecutionTaskIds array", Array.isArray(taskIndex.roleExecutionTaskIds), "roleExecutionTaskIds 必须是数组");
1264
+ addCheck(
1265
+ "task-index roleExecution status enum",
1266
+ JSON.stringify(taskIndex.roleExecutionStatusEnum) === JSON.stringify(["pending", "assigned", "accepted", "executing", "paused", "blocked", "completed", "cancelled"]),
1267
+ "roleExecutionStatusEnum 不完整"
1268
+ );
1269
+ addCheck(
1270
+ "task-index task sort order",
1271
+ JSON.stringify(taskIndex.taskSortOrder) === JSON.stringify(["priority", "createdAt", "roleId", "taskId"]),
1272
+ "任务稳定排序字段不一致"
1273
+ );
1274
+ addCheck(
1275
+ "task-index current task idle policy",
1276
+ taskIndex.currentTaskPolicy && taskIndex.currentTaskPolicy.idleWhenActiveTaskIdsEmpty === true && taskIndex.currentTaskPolicy.idleTaskId === null,
1277
+ "current-task idle policy 不完整"
1278
+ );
1279
+ addCheck(
1280
+ "task-index role idempotency fields",
1281
+ taskIndex.idempotency && JSON.stringify(taskIndex.idempotency.keyFields) === JSON.stringify(["sourceTaskId", "roleId", "taskKind", "targetVersion"]) && taskIndex.idempotency.algorithm === "JCS-SHA-256" && taskIndex.idempotency.duplicatePolicy === "reuse",
1282
+ "逐角色幂等契约不完整"
1283
+ );
1284
+ for (const [roleId, priority] of Object.entries(expectedPriority)) {
1285
+ addCheck(
1286
+ `task-index priority ${roleId}`,
1287
+ taskIndex.roleExecutionPriority && taskIndex.roleExecutionPriority[roleId] === priority,
1288
+ `${roleId} 默认优先级不一致`
1289
+ );
1290
+ addCheck(
1291
+ `manifest priority ${roleId}`,
1292
+ manifestTemplate.taskTree && manifestTemplate.taskTree.roleExecutionPriority && manifestTemplate.taskTree.roleExecutionPriority[roleId] === priority,
1293
+ `${roleId} manifest 默认优先级不一致`
1294
+ );
1295
+ }
1296
+
1297
+ const requiredRoleFields = [
1298
+ "taskId", "roleTaskId", "parentTaskId", "roleId", "taskKind", "title", "priority", "status",
1299
+ "assignmentStatus", "understandingStatus", "confirmationStatus", "memberId", "sessionId",
1300
+ "executionEligible", "blockedReason", "nextAction", "sourceTaskId", "idempotencyKey", "createdAt", "updatedAt",
1301
+ ];
1302
+ for (const field of requiredRoleFields) {
1303
+ addCheck(`role-execution template field ${field}`, roleExecution.includes(`- ${field}:`), `role-execution 模板缺少 ${field}`);
1304
+ }
1305
+ requireIncludes("init/xinyun-ai-init/README.md", [
1306
+ "当前规则版本:`1.7.2`",
1307
+ "xinyun-ai/tasks/role-execution/<roleTaskId>.md",
1308
+ "activeTaskIds",
1309
+ "executableTaskIds",
1310
+ "priority ASC",
1311
+ "JCS-SHA-256",
1312
+ "blockedReason=write-failed",
1313
+ ]);
1314
+ requireIncludes("init/xinyun-ai-init/templates/core-rules.template.md", [
1315
+ "v1.7.2 初始化后角色任务可见性与执行任务分离",
1316
+ "xinyun-ai/tasks/role-execution/<roleTaskId>.md",
1317
+ "activeTaskIds",
1318
+ "executableTaskIds",
1319
+ "JCS-SHA-256",
1320
+ ]);
1321
+ requireIncludes("init/xinyun-ai-init/rules/init-rules.md", ["v1.7.2 角色后续任务可见性", "role-execution"]);
1322
+ requireIncludes("init/xinyun-ai-init/rules/upgrade-rules.md", ["v1.7.2 升级补建角色后续任务", "write-failed"]);
1323
+ requireIncludes("init/xinyun-ai-init/rules/directory-self-completion.md", ["v1.7.2 任务可见性目录", "role-execution"]);
1324
+ requireIncludes("init/xinyun-ai-init/rules/session-workbench.md", ["v1.7.2 角色执行任务补充字段", "roleExecutionResult"]);
1325
+ }
1326
+
1213
1327
  function main() {
1214
1328
  requireFile("bin/xinyun-ai-init.js");
1215
1329
  requireFile("init/xinyun-ai-init/README.md");
@@ -1223,6 +1337,7 @@ function main() {
1223
1337
  verifyV16Contracts();
1224
1338
  verifyV17Contracts();
1225
1339
  verifyV171Contracts();
1340
+ verifyV172Contracts();
1226
1341
  verifyTestScenarios();
1227
1342
  verifyJsonAndMarkdown();
1228
1343
 
@@ -5,7 +5,7 @@ const os = require("os");
5
5
  const path = require("path");
6
6
  const { spawnSync } = require("child_process");
7
7
 
8
- const VERSION = "1.7.1";
8
+ const VERSION = "1.7.2";
9
9
  const checks = [];
10
10
 
11
11
  function parseArgs(argv) {
@@ -149,6 +149,7 @@ function validatePackageFiles(root, target, isTarball) {
149
149
  "test-scenarios/review-template.md",
150
150
  "test-scenarios/scenarios.md",
151
151
  "test-scenarios/v1.7.1-scenarios.md",
152
+ "test-scenarios/v1.7.2-scenarios.md",
152
153
  "init/xinyun-ai-init/README.md",
153
154
  "init/xinyun-ai-init/rules/frameworks/README.md",
154
155
  "init/xinyun-ai-init/rules/frameworks/backend/php/thinkphp.md",
@@ -172,12 +173,13 @@ function validatePackageFiles(root, target, isTarball) {
172
173
  "init/xinyun-ai-init/templates/task-main.template.md",
173
174
  "init/xinyun-ai-init/templates/role-subtask.template.md",
174
175
  "init/xinyun-ai-init/templates/archive-transaction.template.json",
176
+ "init/xinyun-ai-init/templates/role-execution.template.md",
175
177
  ];
176
178
 
177
179
  for (const file of requiredFiles) requireFile(root, target, file);
178
180
 
179
181
  if (isTarball) {
180
- const sourceOnly = "version-plans/releases/v1.7.1.md";
182
+ const sourceOnly = "version-plans/releases/v1.7.2.md";
181
183
  addCheck(target, "package.source-only", "package", !existsPath(root, sourceOnly) ? "pass" : "warn", sourceOnly, null, "not required in tarball", existsPath(root, sourceOnly) ? "present" : "not present", "source-only version-plans is not required in tarball.", "No action required unless package policy changes.", "optional");
182
184
  }
183
185
  }
@@ -213,6 +215,7 @@ function validateRegistries(root, target) {
213
215
  "namedInitializationTaskTree",
214
216
  "taskArchiveTransactions",
215
217
  "codeGraphRequiredInitialization",
218
+ "roleExecutionVisibility",
216
219
  ]) {
217
220
  addCheck(target, "registry.manifest", "manifest", capabilities[flag] === true ? "pass" : "fail", "init/xinyun-ai-init/templates/manifest.template.json", `capabilities.${flag}`, true, capabilities[flag], "Manifest capability registered.", "Register the missing capability.");
218
221
  }
@@ -260,16 +263,20 @@ function validateRegistries(root, target) {
260
263
  "tasking.archiveDirectory": manifest.tasking && manifest.tasking.archiveDirectory,
261
264
  "tasking.archiveTransactionsDirectory": manifest.tasking && manifest.tasking.archiveTransactionsDirectory,
262
265
  "tasking.archiveTempDirectory": manifest.tasking && manifest.tasking.archiveTempDirectory,
266
+ "tasking.roleExecutionDirectory": manifest.tasking && manifest.tasking.roleExecutionDirectory,
263
267
  };
264
268
  const v171ExpectedPaths = {
265
269
  "tasking.taskIndex": "xinyun-ai/tasks/task-index.json",
266
270
  "tasking.archiveDirectory": "xinyun-ai/tasks/archive/",
267
271
  "tasking.archiveTransactionsDirectory": "xinyun-ai/tasks/.archive-transactions/",
268
272
  "tasking.archiveTempDirectory": "xinyun-ai/tasks/.archive-tmp/",
273
+ "tasking.roleExecutionDirectory": "xinyun-ai/tasks/role-execution/",
269
274
  };
270
275
  for (const [field, expected] of Object.entries(v171ExpectedPaths)) {
271
276
  addCheck(target, "registry.manifest", "manifest", v171TaskingPaths[field] === expected ? "pass" : "fail", "init/xinyun-ai-init/templates/manifest.template.json", field, expected, v171TaskingPaths[field], "Manifest v1.7.1 tasking path checked.", "Register v1.7.1 tasking path.");
272
277
  }
278
+ addCheck(target, "registry.manifest", "manifest", manifest.taskTree && manifest.taskTree.roleExecutionPathPattern === "xinyun-ai/tasks/role-execution/<roleTaskId>.md" ? "pass" : "fail", "init/xinyun-ai-init/templates/manifest.template.json", "taskTree.roleExecutionPathPattern", "xinyun-ai/tasks/role-execution/<roleTaskId>.md", manifest.taskTree && manifest.taskTree.roleExecutionPathPattern, "Manifest role execution path checked.", "Register the role execution path.");
279
+ addCheck(target, "registry.project-index", "project-index", projectIndex.taskTree && projectIndex.taskTree.roleExecutionPathPattern === "xinyun-ai/tasks/role-execution/<roleTaskId>.md" ? "pass" : "fail", "init/xinyun-ai-init/templates/project-index.template.json", "taskTree.roleExecutionPathPattern", "xinyun-ai/tasks/role-execution/<roleTaskId>.md", projectIndex.taskTree && projectIndex.taskTree.roleExecutionPathPattern, "Project-index role execution path checked.", "Register the role execution path.");
273
280
  }
274
281
 
275
282
  function validateV17Content(root, target) {
@@ -291,7 +298,7 @@ function validateV17Content(root, target) {
291
298
  "scope/unverifiedScope",
292
299
  "pauseReason=out-of-scope",
293
300
  ];
294
- requireIncludes(root, target, "init/xinyun-ai-init/README.md", ["当前规则版本:`1.7.1`", ...common]);
301
+ requireIncludes(root, target, "init/xinyun-ai-init/README.md", ["当前规则版本:`1.7.2`", ...common]);
295
302
  requireIncludes(root, target, "init/xinyun-ai-init/templates/core-rules.template.md", common);
296
303
  requireIncludes(root, target, "init/xinyun-ai-init/templates/AGENTS.template.md", ["v1.7 规则包一致性、技术栈 profile 与 HTML 迁移准备", "`verify:rules` 只读", "ThinkPHP 不得误套其他项目", ...common.slice(5)]);
297
304
  requireIncludes(root, target, "init/xinyun-ai-init/templates/current-task.template.md", ["verify:rules.status", "language", "runtime", "platform", "framework", ...common.slice(5)]);
@@ -305,7 +312,7 @@ function validateV17Content(root, target) {
305
312
  requireIncludes(root, target, "init/xinyun-ai-init/rules/frameworks/backend/php/thinkphp.md", ["v1.7 ThinkPHP 深化模块", "frameworkStatus=confirmed", "moduleStatus=loaded", "Controller", "Request/Validate", "Service", "Model/ORM", "Middleware", "队列"]);
306
313
  requireIncludes(root, target, "test-scenarios/scenarios.md", ["当前必测场景为 1-87", "当前观察场景为 88", "## 55. verify:rules 正常通过", "## 69. verify:rules JSON schema 和重复执行"]);
307
314
  requireIncludes(root, target, "test-scenarios/review-template.md", ["55. verify:rules 正常通过", "69. verify:rules JSON schema 和重复执行", "88. Skill 触发测试"]);
308
- requireIncludes(root, target, "test-scenarios/README.md", ["npm run verify:rules", "pm_zhousl-xinyun-ai-init-1.7.1.tgz", "当前必测场景为 `scenarios.md` 的 1-87", "当前观察场景为 `scenarios.md` 的 88"]);
315
+ requireIncludes(root, target, "test-scenarios/README.md", ["npm run verify:rules", "pm_zhousl-xinyun-ai-init-1.7.2.tgz", "v1.7.2-scenarios.md", "当前必测场景为 `scenarios.md` 的 1-87", "当前观察场景为 `scenarios.md` 的 88"]);
309
316
  }
310
317
 
311
318
  function validateV171Content(root, target) {
@@ -338,6 +345,28 @@ function validateV171Content(root, target) {
338
345
  requireIncludes(root, target, "test-scenarios/v1.7.1-scenarios.md", ["主任务命名", "CodeGraph记录与失败矩阵", "普通咨询边界"]);
339
346
  }
340
347
 
348
+ function validateV172Content(root, target) {
349
+ const snippets = [
350
+ "v1.7.2 初始化后角色任务可见性与执行任务分离",
351
+ "xinyun-ai/tasks/role-execution/<roleTaskId>.md",
352
+ "taskKind=initialization-main",
353
+ "taskKind=initialization-record",
354
+ "taskKind=role-execution",
355
+ "activeTaskIds",
356
+ "executableTaskIds",
357
+ "priority ASC",
358
+ "JCS-SHA-256",
359
+ "blockedReason=write-failed",
360
+ ];
361
+ requireIncludes(root, target, "init/xinyun-ai-init/README.md", ["当前规则版本:`1.7.2`", ...snippets]);
362
+ requireIncludes(root, target, "init/xinyun-ai-init/templates/core-rules.template.md", snippets);
363
+ requireIncludes(root, target, "init/xinyun-ai-init/rules/init-rules.md", ["v1.7.2 角色后续任务可见性", "role-execution"]);
364
+ requireIncludes(root, target, "init/xinyun-ai-init/rules/upgrade-rules.md", ["v1.7.2 升级补建角色后续任务", "write-failed"]);
365
+ requireIncludes(root, target, "init/xinyun-ai-init/rules/directory-self-completion.md", ["v1.7.2 任务可见性目录", "role-execution"]);
366
+ requireIncludes(root, target, "init/xinyun-ai-init/rules/session-workbench.md", ["v1.7.2 角色执行任务补充字段", "roleExecutionResult"]);
367
+ requireIncludes(root, target, "test-scenarios/v1.7.2-scenarios.md", ["固定优先级", "幂等补建", "补建失败和索引恢复"]);
368
+ }
369
+
341
370
  function validateJsonFiles(root, target) {
342
371
  const jsonFiles = [
343
372
  "package.json",
@@ -374,6 +403,7 @@ function validateRoot(root, target, isTarball = false) {
374
403
  validateRegistries(root, target);
375
404
  validateV17Content(root, target);
376
405
  validateV171Content(root, target);
406
+ validateV172Content(root, target);
377
407
  validateJsonFiles(root, target);
378
408
  }
379
409
 
@@ -37,7 +37,7 @@ npm pack
37
37
  随后在临时项目中使用 tarball 测试。注意不要直接执行 `npx <tarball> --force`,该形式可能不会正确调用 bin。推荐:
38
38
 
39
39
  ```powershell
40
- npx --yes --package E:\ai-fabu-xiangmu\AI开发初始化脚本\xinyun-ai-init-npm\pm_zhousl-xinyun-ai-init-1.7.1.tgz xinyun-ai-init --force --no-version-check
40
+ npx --yes --package E:\ai-fabu-xiangmu\AI开发初始化脚本\xinyun-ai-init-npm\pm_zhousl-xinyun-ai-init-1.7.2.tgz xinyun-ai-init --force --no-version-check
41
41
  ```
42
42
 
43
43
  ### 3. 线上回归测试
@@ -70,7 +70,7 @@ npx --yes @pm_zhousl/xinyun-ai-init@latest --force
70
70
  ```powershell
71
71
  npm run verify:rules
72
72
  npm run verify:rules -- --json
73
- npm run verify:rules -- --tarball .\pm_zhousl-xinyun-ai-init-1.7.1.tgz
73
+ npm run verify:rules -- --tarball .\pm_zhousl-xinyun-ai-init-1.7.2.tgz
74
74
  npm run verify:rules:security
75
75
  ```
76
76
 
@@ -85,6 +85,10 @@ npm run verify:init
85
85
 
86
86
  自动校验负责检查包体文件、模板关键规则、JSON 可解析、Markdown 代码块闭合和 CLI 边界。人工场景负责验证 AI 在真实项目里的行为。
87
87
 
88
+ ## v1.7.2 角色任务可见性回归
89
+
90
+ 除 `scenarios.md` 外,发布前必须逐条执行 `v1.7.2-scenarios.md`。重点验证已归档的 v1.7.1 项目能补建 5 个 `role-execution` 任务,活动任务不被错误显示为 idle,重复升级按逐角色幂等键复用,索引中断后可恢复。
91
+
88
92
  ## 审查原则
89
93
 
90
94
  - 重点看 AI 行为是否符合规则,不只看文件是否生成。
@@ -0,0 +1,51 @@
1
+ # v1.7.2 专属测试场景
2
+
3
+ ## 1. 已发布 v1.7.1 项目补建角色任务
4
+
5
+ - 输入:项目已升级到 v1.7.1,归档中存在命名初始化主任务和 5 个角色登记子任务,但 `activeTaskIds=[]`、`executableTaskIds=[]`、`current-task=idle`。
6
+ - 期望:补建或恢复 5 个 `role-execution` 后续任务,任务可在 `task-index.json` 中查看,不修改业务代码。
7
+
8
+ ## 2. 初始化主任务与角色后续任务分离
9
+
10
+ - 输入:首次初始化或升级完成。
11
+ - 期望:`taskKind=initialization-main` 的初始化主任务和 `taskKind=initialization-record` 的登记子任务可以归档;5 个 `taskKind=role-execution` 角色后续任务独立保留,不因主任务归档被删除。
12
+
13
+ ## 3. 未绑定角色可见但不可执行
14
+
15
+ - 输入:5 个角色任务的 `memberId`、`sessionId` 为 null,职责和理解状态为 pending。
16
+ - 期望:角色任务属于 `activeTaskIds`,不属于 `executableTaskIds`;`executionEligible=false`,并显示待分配或待确认原因。
17
+
18
+ ## 4. 活动任务与可执行任务为空集区分
19
+
20
+ - 输入:`activeTaskIds` 有 5 个待分配角色任务,`executableTaskIds=[]`。
21
+ - 期望:`current-task` 不得使用 `status=idle`、`taskId=null`;应按固定优先级指向 `project-owner`,使用 `status=pending` 并输出 nextAction。
22
+
23
+ ## 5. 真正空闲状态
24
+
25
+ - 输入:`activeTaskIds=[]` 且没有任何 pending、blocked、paused 或 executing 任务。
26
+ - 期望:`current-task.status=idle`、`taskId=null`、标题为“暂无待执行任务”。
27
+
28
+ ## 6. 升级幂等补建
29
+
30
+ - 输入:对同一个 v1.7.1 项目重复执行 v1.7.2 升级。
31
+ - 期望:第一次补建 5 个角色后续任务;再次执行复用原任务,不生成重复角色任务或重复主任务。
32
+
33
+ ## 6A. 角色优先级和并列排序
34
+
35
+ - 输入:5 个角色后续任务均待分配,或存在相同 priority 的多个任务。
36
+ - 期望:默认优先级为 project-owner 10、project-product 20、chief-engineer 30、programmer 40、test-reviewer 50;并列按 createdAt、roleId、taskId 稳定排序,不依赖文件系统顺序。
37
+
38
+ ## 6B. 补建失败和索引恢复
39
+
40
+ - 输入:单个角色文件写入失败、任务索引更新失败、补建过程被中断。
41
+ - 期望:成功角色任务保留;失败角色为 blocked/write-failed;结果为 partial 或 blocked;不得清空 activeTaskIds 或伪造 idle;下次通过逐角色 idempotencyKey 恢复索引和缺失任务。
42
+
43
+ ## 7. 已存在角色任务保护
44
+
45
+ - 输入:部分角色后续任务已经存在,且其中包含用户修改过的控制文件。
46
+ - 期望:复用已有任务,补建缺失任务;不覆盖用户修改,不删除业务任务,冲突进入待确认或 blocked。
47
+
48
+ ## 8. 发布边界回归
49
+
50
+ - 输入:执行 v1.7.2 升级和任务补建。
51
+ - 期望:CodeGraph 健康状态复用;不自动创建外部会话,不执行 SQL/Git 写操作,不修改业务代码、数据库、API、配置、依赖;输出明确区分已归档、已创建、已复用、可执行和待分配任务。