@pm_zhousl/xinyun-ai-init 1.7.1 → 1.7.3

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.
Files changed (29) hide show
  1. package/README.md +1 -1
  2. package/init/xinyun-ai-init/README.md +37 -1
  3. package/init/xinyun-ai-init/rules/directory-self-completion.md +15 -0
  4. package/init/xinyun-ai-init/rules/init-rules.md +19 -0
  5. package/init/xinyun-ai-init/rules/session-workbench.md +28 -0
  6. package/init/xinyun-ai-init/rules/upgrade-rules.md +18 -0
  7. package/init/xinyun-ai-init/templates/AGENTS.template.md +18 -0
  8. package/init/xinyun-ai-init/templates/core-rules.template.md +34 -0
  9. package/init/xinyun-ai-init/templates/current-task.template.md +25 -0
  10. package/init/xinyun-ai-init/templates/init-result.template.json +14 -1
  11. package/init/xinyun-ai-init/templates/managed-baseline.template.json +2 -2
  12. package/init/xinyun-ai-init/templates/manifest.template.json +54 -5
  13. package/init/xinyun-ai-init/templates/project-check.template.md +22 -0
  14. package/init/xinyun-ai-init/templates/project-guide.template.md +21 -0
  15. package/init/xinyun-ai-init/templates/project-index.template.json +33 -0
  16. package/init/xinyun-ai-init/templates/role-execution.template.md +53 -0
  17. package/init/xinyun-ai-init/templates/role-session-binding.template.json +43 -0
  18. package/init/xinyun-ai-init/templates/task-index.template.json +29 -0
  19. package/init/xinyun-ai-init/templates/team/README.md +10 -0
  20. package/init/xinyun-ai-init/templates/team/assignments.json +6 -1
  21. package/init/xinyun-ai-init/version.json +2 -2
  22. package/package.json +2 -2
  23. package/scripts/verify-init-package.js +286 -22
  24. package/scripts/verify-rules-package.js +91 -7
  25. package/test-scenarios/README.md +12 -4
  26. package/test-scenarios/review-template.md +11 -3
  27. package/test-scenarios/scenarios.md +76 -4
  28. package/test-scenarios/v1.7.2-scenarios.md +51 -0
  29. package/test-scenarios/v1.7.3-scenarios.md +79 -0
@@ -4,7 +4,36 @@
4
4
  "executableTaskIds": [],
5
5
  "archivedTaskIds": [],
6
6
  "currentTaskId": null,
7
+ "roleExecutionDirectory": "xinyun-ai/tasks/role-execution/",
8
+ "roleExecutionTaskIds": [],
9
+ "roleSessionBindingIds": [],
10
+ "roleExecutionStatusEnum": ["pending", "assigned", "accepted", "executing", "paused", "blocked", "completed", "cancelled"],
11
+ "roleSessionStatusEnum": ["pending", "creating", "created", "onboarding", "ready", "blocked", "failed", "closed"],
12
+ "roleExecutionPriority": {
13
+ "project-owner": 10,
14
+ "project-product": 20,
15
+ "chief-engineer": 30,
16
+ "programmer": 40,
17
+ "test-reviewer": 50
18
+ },
19
+ "taskSortOrder": ["priority", "createdAt", "roleId", "taskId"],
20
+ "currentTaskPolicy": {
21
+ "idleWhenActiveTaskIdsEmpty": true,
22
+ "activeButNotExecutableStatus": ["pending", "blocked"],
23
+ "idleTaskId": null
24
+ },
25
+ "idempotency": {
26
+ "keyFields": ["sourceTaskId", "roleId", "taskKind", "targetVersion"],
27
+ "algorithm": "JCS-SHA-256",
28
+ "duplicatePolicy": "reuse"
29
+ },
30
+ "roleSessionIdempotency": {
31
+ "keyFields": ["taskId", "roleId", "provider", "targetVersion"],
32
+ "algorithm": "JCS-SHA-256",
33
+ "duplicatePolicy": "reuse"
34
+ },
7
35
  "tasks": [],
36
+ "roleSessionBindings": [],
8
37
  "archiveTransactions": [],
9
38
  "statusEnum": ["pending", "executing", "partial", "blocked", "completed", "cancelled"],
10
39
  "idleCurrentTask": {
@@ -9,6 +9,16 @@
9
9
  - `confirmations/<roleId>.md` 和 `understandings/<roleId>.md` 的 `createdAt`、`updatedAt` 必须存在且为 ISO 8601 时间;首次落盘可使用模板初始时间或替换为当前时间,但不得留空。
10
10
  - `xinyun-ai/team/**` 属于 AI 工作区控制文件,不授权修改业务代码、数据库、API、依赖、构建脚本或执行发布操作。
11
11
 
12
+ ## Codex 角色会话绑定
13
+
14
+ - v1.7.3 起,在 Codex 宿主支持创建子会话时,主会话可以为五个默认角色自动创建真实角色子会话,并把真实 `sessionId` 回写到角色任务、`assignments.json`、`task-index.json`、`manifest.json`、`project-index.json` 和 `xinyun-ai/sessions/role-session-bindings.json`。
15
+ - 固定角色为 `project-owner`、`project-product`、`chief-engineer`、`programmer`、`test-reviewer`,不得因为初始化或升级创建超过 5 个角色会话。
16
+ - `sessionId` 必须来自 Codex 宿主返回值,不得使用任务 ID、随机占位字符串、本地文件名或历史会话记忆冒充。
17
+ - 会话绑定最小字段为 `taskId`、`roleId`、`sessionId`、`parentSessionId`、`provider`、`sessionStatus`、`createdAt`、`updatedAt`。
18
+ - 会话状态固定为 `pending/creating/created/onboarding/ready/blocked/failed/closed`。
19
+ - 创建成功后先进入 `onboarding`,只允许只读理解职责范围和项目资料;职责理解、确认关系和执行门禁满足后才允许 `ready`。
20
+ - Codex 宿主不支持创建子会话、权限不足或创建失败时,必须进入本地降级:保留 `sessionId=null`,记录 `sessionStatus=blocked/failed`、失败原因和下一步动作,不得伪造会话。
21
+
12
22
  ## 默认角色
13
23
 
14
24
  - `project-owner`:项目负责人,负责需求最终确认、业务验收和发布授权。
@@ -10,6 +10,10 @@
10
10
  "assignmentId",
11
11
  "taskId",
12
12
  "roleId",
13
+ "sessionId",
14
+ "parentSessionId",
15
+ "provider",
16
+ "sessionStatus",
13
17
  "memberId",
14
18
  "workstream",
15
19
  "scope",
@@ -27,7 +31,8 @@
27
31
  ],
28
32
  "pausedRule": "status=paused requires pauseReason; other statuses require pauseReason=null.",
29
33
  "blockedRule": "status=blocked requires blockedReason=approver-unavailable or member-conflict.",
30
- "executionEligibility": "member bound, role ready, responsibility confirmed, understanding ready, and executor memberId not equal to final approver member IDs."
34
+ "executionEligibility": "member bound, role ready, sessionStatus=ready, responsibility confirmed, understanding ready, and executor memberId not equal to final approver member IDs.",
35
+ "sessionBindingRule": "sessionId must be a real host-returned value when provider=codex; if the host cannot create sessions, sessionId remains null and sessionStatus=blocked or failed with a local degradation reason."
31
36
  },
32
37
  "updatedAt": ""
33
38
  }
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "packageName": "xinyun-ai-init",
3
3
  "displayName": "欣芸技术开发 Agent 流初始化包",
4
- "version": "1.7.1",
5
- "scriptVersion": "2026.07.20",
4
+ "version": "1.7.3",
5
+ "scriptVersion": "2026.07.22",
6
6
  "schemaVersion": "1",
7
7
  "defaultMode": "fast-init",
8
8
  "targetWorkspace": "xinyun-ai",
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.3",
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.3",
107
+ packageJson.version === "1.7.3",
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.3",
112
+ versionJson.version === "1.7.3",
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.3",
117
+ manifestTemplate.xinyunAiVersion === "1.7.3",
118
118
  `当前版本为 ${manifestTemplate.xinyunAiVersion}`
119
119
  );
120
120
  }
@@ -469,8 +469,8 @@ function verifyInitRules() {
469
469
 
470
470
  function verifyTestScenarios() {
471
471
  requireIncludes("test-scenarios/scenarios.md", [
472
- "1-87",
473
- "88",
472
+ "1-96",
473
+ "97",
474
474
  "## 40. v1.6-A",
475
475
  "## 53. v1.6 tarball",
476
476
  "## 55. verify:rules",
@@ -479,14 +479,18 @@ function verifyTestScenarios() {
479
479
  "## 69. verify:rules JSON schema",
480
480
  "## 71. v1.7.1 主任务命名",
481
481
  "## 87. v1.7.1 普通咨询和版本回归",
482
- "## 88. Skill",
482
+ "## 89. v1.7.3 Codex 真实角色会话创建",
483
+ "## 96. v1.7.3 普通咨询边界",
484
+ "## 97. Skill",
483
485
  ]);
484
486
 
485
487
  requireIncludes("test-scenarios/README.md", [
486
- "pm_zhousl-xinyun-ai-init-1.7.1.tgz",
487
- "1-87",
488
- "88",
488
+ "pm_zhousl-xinyun-ai-init-1.7.3.tgz",
489
+ "1-96",
490
+ "97",
489
491
  "npm run verify:rules",
492
+ "v1.7.2-scenarios.md",
493
+ "v1.7.3-scenarios.md",
490
494
  ]);
491
495
 
492
496
  requireIncludes("test-scenarios/v1.7.1-scenarios.md", [
@@ -497,6 +501,26 @@ function verifyTestScenarios() {
497
501
  "CodeGraph记录与失败矩阵",
498
502
  "普通咨询边界",
499
503
  ]);
504
+
505
+ requireIncludes("test-scenarios/v1.7.2-scenarios.md", [
506
+ "role-execution",
507
+ "activeTaskIds",
508
+ "executableTaskIds",
509
+ "固定优先级",
510
+ "幂等补建",
511
+ "补建失败和索引恢复",
512
+ ]);
513
+
514
+ requireIncludes("test-scenarios/v1.7.3-scenarios.md", [
515
+ "真实角色子会话创建",
516
+ "provider=codex",
517
+ "sessionStatus=onboarding",
518
+ "taskId + roleId + provider + targetVersion",
519
+ "local-degraded-no-fake-session-id",
520
+ "created-but-writeback-failed",
521
+ "单角色失败不影响其他角色",
522
+ "普通咨询边界",
523
+ ]);
500
524
  }
501
525
  function verifyFrameworkRules() {
502
526
  const required = [
@@ -741,7 +765,7 @@ function verifyV16Contracts() {
741
765
  ]);
742
766
 
743
767
  requireIncludes("init/xinyun-ai-init/README.md", [
744
- "当前规则版本:`1.7.1`",
768
+ "当前规则版本:`1.7.3`",
745
769
  "v1.6 初始化任务、幂等恢复与结果记录",
746
770
  "xinyun-ai/tasks/.idempotency/",
747
771
  "xinyun-ai/init-result.json",
@@ -941,7 +965,7 @@ function verifyV16Contracts() {
941
965
  }
942
966
 
943
967
  addCheck("init-result mode 为 initialization", initResult.mode === "initialization");
944
- addCheck("init-result targetVersion=1.7.1", initResult.targetVersion === "1.7.1");
968
+ addCheck("init-result targetVersion=1.7.3", initResult.targetVersion === "1.7.3");
945
969
  addCheck("init-result businessCodeChanged 初始为 unknown", initResult.businessCodeChanged && initResult.businessCodeChanged.value === "unknown");
946
970
  addCheck("task-lock scope=xinyun-ai-control", taskLock.scope === "xinyun-ai-control");
947
971
  addCheck("task-lock audit 包含 released", Array.isArray(taskLock.audit) && taskLock.audit.some((item) => item.action === "released"));
@@ -1047,7 +1071,7 @@ function verifyV17Contracts() {
1047
1071
  addCheck("html migration pilot requires separate confirmation", htmlMigration.pilotPlan && htmlMigration.pilotPlan.requiresSeparateConfirmation === true);
1048
1072
 
1049
1073
  requireIncludes("init/xinyun-ai-init/README.md", [
1050
- "当前规则版本:`1.7.1`",
1074
+ "当前规则版本:`1.7.3`",
1051
1075
  "v1.7 规则包一致性检查与 verify:rules",
1052
1076
  "frameworkStatus=confirmed/inferred/not-found/unknown/detected-unsupported",
1053
1077
  "v1.7 深化预算:5 层目录、80 个关键文件、100 条证据",
@@ -1066,17 +1090,17 @@ function verifyV17Contracts() {
1066
1090
  ]);
1067
1091
 
1068
1092
  requireIncludes("test-scenarios/scenarios.md", [
1069
- "当前必测场景为 1-87",
1070
- "当前观察场景为 88",
1093
+ "当前必测场景为 1-96",
1094
+ "当前观察场景为 97",
1071
1095
  "## 55. verify:rules 正常通过",
1072
1096
  "## 69. verify:rules JSON schema 和重复执行",
1073
- "## 88. Skill 触发测试",
1097
+ "## 97. Skill 触发测试",
1074
1098
  ]);
1075
1099
 
1076
1100
  requireIncludes("test-scenarios/README.md", [
1077
- "pm_zhousl-xinyun-ai-init-1.7.1.tgz",
1078
- "当前必测场景为 `scenarios.md` 的 1-87",
1079
- "当前观察场景为 `scenarios.md` 的 88",
1101
+ "pm_zhousl-xinyun-ai-init-1.7.3.tgz",
1102
+ "当前必测场景为 `scenarios.md` 的 1-96",
1103
+ "当前观察场景为 `scenarios.md` 的 97",
1080
1104
  "npm run verify:rules",
1081
1105
  ]);
1082
1106
  }
@@ -1142,7 +1166,7 @@ function verifyV171Contracts() {
1142
1166
  addCheck("init-result taskTree role count", initResult.taskTree && initResult.taskTree.roleTaskCount === 5, "init-result taskTree.roleTaskCount 应为 5");
1143
1167
 
1144
1168
  requireIncludes("init/xinyun-ai-init/README.md", [
1145
- "当前规则版本:`1.7.1`",
1169
+ "当前规则版本:`1.7.3`",
1146
1170
  "项目初始化:<项目显示名>",
1147
1171
  "xinyun-ai/tasks/task-index.json",
1148
1172
  "xinyun-ai/tasks/.archive-transactions/<archiveTransactionId>.json",
@@ -1210,6 +1234,244 @@ function verifyJsonAndMarkdown() {
1210
1234
  }
1211
1235
  }
1212
1236
 
1237
+ function verifyV172Contracts() {
1238
+ const manifestTemplate = JSON.parse(readText("init/xinyun-ai-init/templates/manifest.template.json"));
1239
+ const projectIndexTemplate = JSON.parse(readText("init/xinyun-ai-init/templates/project-index.template.json"));
1240
+ const taskIndex = JSON.parse(readText("init/xinyun-ai-init/templates/task-index.template.json"));
1241
+ const roleExecution = readText("init/xinyun-ai-init/templates/role-execution.template.md");
1242
+ const expectedPriority = {
1243
+ "project-owner": 10,
1244
+ "project-product": 20,
1245
+ "chief-engineer": 30,
1246
+ "programmer": 40,
1247
+ "test-reviewer": 50,
1248
+ };
1249
+
1250
+ requireFile("init/xinyun-ai-init/templates/role-execution.template.md");
1251
+ requireFile("test-scenarios/v1.7.2-scenarios.md");
1252
+ addCheck(
1253
+ "manifest v1.7.2 roleExecutionVisibility",
1254
+ manifestTemplate.capabilities && manifestTemplate.capabilities.roleExecutionVisibility === true,
1255
+ "manifest 缺少 roleExecutionVisibility 能力"
1256
+ );
1257
+ addCheck(
1258
+ "manifest roleExecutionDirectory",
1259
+ manifestTemplate.tasking && manifestTemplate.tasking.roleExecutionDirectory === "xinyun-ai/tasks/role-execution/",
1260
+ "manifest roleExecutionDirectory 不一致"
1261
+ );
1262
+ addCheck(
1263
+ "project-index roleExecutionDirectory",
1264
+ projectIndexTemplate.tasking && projectIndexTemplate.tasking.roleExecutionDirectory === "xinyun-ai/tasks/role-execution/",
1265
+ "project-index roleExecutionDirectory 不一致"
1266
+ );
1267
+ addCheck(
1268
+ "manifest roleExecution path pattern",
1269
+ manifestTemplate.taskTree && manifestTemplate.taskTree.roleExecutionPathPattern === "xinyun-ai/tasks/role-execution/<roleTaskId>.md",
1270
+ "manifest roleExecution path pattern 不一致"
1271
+ );
1272
+ addCheck(
1273
+ "task-index roleExecutionDirectory",
1274
+ taskIndex.roleExecutionDirectory === "xinyun-ai/tasks/role-execution/",
1275
+ "task-index roleExecutionDirectory 不一致"
1276
+ );
1277
+ addCheck("task-index roleExecutionTaskIds array", Array.isArray(taskIndex.roleExecutionTaskIds), "roleExecutionTaskIds 必须是数组");
1278
+ addCheck(
1279
+ "task-index roleExecution status enum",
1280
+ JSON.stringify(taskIndex.roleExecutionStatusEnum) === JSON.stringify(["pending", "assigned", "accepted", "executing", "paused", "blocked", "completed", "cancelled"]),
1281
+ "roleExecutionStatusEnum 不完整"
1282
+ );
1283
+ addCheck(
1284
+ "task-index task sort order",
1285
+ JSON.stringify(taskIndex.taskSortOrder) === JSON.stringify(["priority", "createdAt", "roleId", "taskId"]),
1286
+ "任务稳定排序字段不一致"
1287
+ );
1288
+ addCheck(
1289
+ "task-index current task idle policy",
1290
+ taskIndex.currentTaskPolicy && taskIndex.currentTaskPolicy.idleWhenActiveTaskIdsEmpty === true && taskIndex.currentTaskPolicy.idleTaskId === null,
1291
+ "current-task idle policy 不完整"
1292
+ );
1293
+ addCheck(
1294
+ "task-index role idempotency fields",
1295
+ taskIndex.idempotency && JSON.stringify(taskIndex.idempotency.keyFields) === JSON.stringify(["sourceTaskId", "roleId", "taskKind", "targetVersion"]) && taskIndex.idempotency.algorithm === "JCS-SHA-256" && taskIndex.idempotency.duplicatePolicy === "reuse",
1296
+ "逐角色幂等契约不完整"
1297
+ );
1298
+ for (const [roleId, priority] of Object.entries(expectedPriority)) {
1299
+ addCheck(
1300
+ `task-index priority ${roleId}`,
1301
+ taskIndex.roleExecutionPriority && taskIndex.roleExecutionPriority[roleId] === priority,
1302
+ `${roleId} 默认优先级不一致`
1303
+ );
1304
+ addCheck(
1305
+ `manifest priority ${roleId}`,
1306
+ manifestTemplate.taskTree && manifestTemplate.taskTree.roleExecutionPriority && manifestTemplate.taskTree.roleExecutionPriority[roleId] === priority,
1307
+ `${roleId} manifest 默认优先级不一致`
1308
+ );
1309
+ }
1310
+
1311
+ const requiredRoleFields = [
1312
+ "taskId", "roleTaskId", "parentTaskId", "roleId", "taskKind", "title", "priority", "status",
1313
+ "assignmentStatus", "understandingStatus", "confirmationStatus", "memberId", "sessionId",
1314
+ "executionEligible", "blockedReason", "nextAction", "sourceTaskId", "idempotencyKey", "createdAt", "updatedAt",
1315
+ ];
1316
+ for (const field of requiredRoleFields) {
1317
+ addCheck(`role-execution template field ${field}`, roleExecution.includes(`- ${field}:`), `role-execution 模板缺少 ${field}`);
1318
+ }
1319
+ requireIncludes("init/xinyun-ai-init/README.md", [
1320
+ "当前规则版本:`1.7.3`",
1321
+ "xinyun-ai/tasks/role-execution/<roleTaskId>.md",
1322
+ "activeTaskIds",
1323
+ "executableTaskIds",
1324
+ "priority ASC",
1325
+ "JCS-SHA-256",
1326
+ "blockedReason=write-failed",
1327
+ ]);
1328
+ requireIncludes("init/xinyun-ai-init/templates/core-rules.template.md", [
1329
+ "v1.7.2 初始化后角色任务可见性与执行任务分离",
1330
+ "xinyun-ai/tasks/role-execution/<roleTaskId>.md",
1331
+ "activeTaskIds",
1332
+ "executableTaskIds",
1333
+ "JCS-SHA-256",
1334
+ ]);
1335
+ requireIncludes("init/xinyun-ai-init/rules/init-rules.md", ["v1.7.2 角色后续任务可见性", "role-execution"]);
1336
+ requireIncludes("init/xinyun-ai-init/rules/upgrade-rules.md", ["v1.7.2 升级补建角色后续任务", "write-failed"]);
1337
+ requireIncludes("init/xinyun-ai-init/rules/directory-self-completion.md", ["v1.7.2 任务可见性目录", "role-execution"]);
1338
+ requireIncludes("init/xinyun-ai-init/rules/session-workbench.md", ["v1.7.2 角色执行任务补充字段", "roleExecutionResult"]);
1339
+ }
1340
+
1341
+ function verifyV173Contracts() {
1342
+ const manifestTemplate = JSON.parse(readText("init/xinyun-ai-init/templates/manifest.template.json"));
1343
+ const projectIndexTemplate = JSON.parse(readText("init/xinyun-ai-init/templates/project-index.template.json"));
1344
+ const taskIndex = JSON.parse(readText("init/xinyun-ai-init/templates/task-index.template.json"));
1345
+ const initResult = JSON.parse(readText("init/xinyun-ai-init/templates/init-result.template.json"));
1346
+ const assignments = JSON.parse(readText("init/xinyun-ai-init/templates/team/assignments.json"));
1347
+ const bindingTemplate = JSON.parse(readText("init/xinyun-ai-init/templates/role-session-binding.template.json"));
1348
+ const roleExecution = readText("init/xinyun-ai-init/templates/role-execution.template.md");
1349
+ const statusEnum = ["pending", "creating", "created", "onboarding", "ready", "blocked", "failed", "closed"];
1350
+
1351
+ requireFile("init/xinyun-ai-init/templates/role-session-binding.template.json");
1352
+ requireFile("test-scenarios/v1.7.3-scenarios.md");
1353
+
1354
+ addCheck(
1355
+ "manifest v1.7.3 codexRoleSessionOrchestration",
1356
+ manifestTemplate.capabilities && manifestTemplate.capabilities.codexRoleSessionOrchestration === true,
1357
+ "manifest 缺少 codexRoleSessionOrchestration 能力"
1358
+ );
1359
+ addCheck(
1360
+ "manifest roleSessions provider codex",
1361
+ manifestTemplate.roleSessions && manifestTemplate.roleSessions.provider === "codex",
1362
+ "manifest roleSessions.provider 必须为 codex"
1363
+ );
1364
+ addCheck(
1365
+ "manifest roleSessions targetVersion=1.7.3",
1366
+ manifestTemplate.roleSessions && manifestTemplate.roleSessions.targetVersion === "1.7.3",
1367
+ "manifest roleSessions.targetVersion 必须为 1.7.3"
1368
+ );
1369
+ addCheck(
1370
+ "manifest roleSessions bindings path",
1371
+ manifestTemplate.roleSessions && manifestTemplate.roleSessions.bindings === "xinyun-ai/sessions/role-session-bindings.json",
1372
+ "manifest roleSessions.bindings 不一致"
1373
+ );
1374
+ addCheck(
1375
+ "manifest roleSessions directory",
1376
+ manifestTemplate.roleSessions && manifestTemplate.roleSessions.directory === "xinyun-ai/sessions/roles/",
1377
+ "manifest roleSessions.directory 不一致"
1378
+ );
1379
+ addCheck(
1380
+ "manifest roleSessions bindingTemplate",
1381
+ manifestTemplate.roleSessions && manifestTemplate.roleSessions.bindingTemplate === "xinyun-ai-init/templates/role-session-binding.template.json",
1382
+ "manifest roleSessions.bindingTemplate 不一致"
1383
+ );
1384
+ addCheck(
1385
+ "manifest roleSessions requiredRoleCount=5",
1386
+ manifestTemplate.roleSessions && manifestTemplate.roleSessions.requiredRoleCount === 5,
1387
+ "manifest roleSessions.requiredRoleCount 必须为 5"
1388
+ );
1389
+ addCheck(
1390
+ "manifest roleSessions status enum",
1391
+ manifestTemplate.roleSessions && JSON.stringify(manifestTemplate.roleSessions.statusEnum) === JSON.stringify(statusEnum),
1392
+ "manifest roleSessions.statusEnum 不完整"
1393
+ );
1394
+ addCheck(
1395
+ "manifest roleSessions idempotency fields",
1396
+ manifestTemplate.roleSessions && manifestTemplate.roleSessions.idempotency && JSON.stringify(manifestTemplate.roleSessions.idempotency.keyFields) === JSON.stringify(["taskId", "roleId", "provider", "targetVersion"]),
1397
+ "manifest roleSessions.idempotency.keyFields 不一致"
1398
+ );
1399
+ addCheck(
1400
+ "manifest roleSessions host unsupported policy",
1401
+ manifestTemplate.roleSessions && manifestTemplate.roleSessions.hostUnsupportedPolicy === "local-degraded-no-fake-session-id",
1402
+ "manifest roleSessions.hostUnsupportedPolicy 不一致"
1403
+ );
1404
+
1405
+ addCheck(
1406
+ "project-index roleSessions path",
1407
+ projectIndexTemplate.roleSessions && projectIndexTemplate.roleSessions.bindings === "xinyun-ai/sessions/role-session-bindings.json",
1408
+ "project-index roleSessions.bindings 不一致"
1409
+ );
1410
+ addCheck(
1411
+ "project-index roleSessions status enum",
1412
+ projectIndexTemplate.roleSessions && JSON.stringify(projectIndexTemplate.roleSessions.statusEnum) === JSON.stringify(statusEnum),
1413
+ "project-index roleSessions.statusEnum 不完整"
1414
+ );
1415
+ addCheck("project-index roleSessions records array", projectIndexTemplate.roleSessions && Array.isArray(projectIndexTemplate.roleSessions.records), "project-index roleSessions.records 必须是数组");
1416
+
1417
+ addCheck("task-index roleSessionBindingIds array", Array.isArray(taskIndex.roleSessionBindingIds), "task-index roleSessionBindingIds 必须是数组");
1418
+ addCheck("task-index roleSessionBindings array", Array.isArray(taskIndex.roleSessionBindings), "task-index roleSessionBindings 必须是数组");
1419
+ addCheck(
1420
+ "task-index roleSession status enum",
1421
+ JSON.stringify(taskIndex.roleSessionStatusEnum) === JSON.stringify(statusEnum),
1422
+ "task-index roleSessionStatusEnum 不完整"
1423
+ );
1424
+ addCheck(
1425
+ "task-index roleSession idempotency fields",
1426
+ taskIndex.roleSessionIdempotency && JSON.stringify(taskIndex.roleSessionIdempotency.keyFields) === JSON.stringify(["taskId", "roleId", "provider", "targetVersion"]),
1427
+ "task-index roleSessionIdempotency.keyFields 不一致"
1428
+ );
1429
+
1430
+ addCheck("init-result roleSessions provider codex", initResult.roleSessions && initResult.roleSessions.provider === "codex", "init-result roleSessions.provider 必须为 codex");
1431
+ addCheck("init-result roleSessions requiredRoleCount=5", initResult.roleSessions && initResult.roleSessions.requiredRoleCount === 5, "init-result roleSessions.requiredRoleCount 必须为 5");
1432
+ for (const field of ["createdCount", "reusedCount", "failedCount", "blockedCount", "localDegradedCount"]) {
1433
+ addCheck(`init-result roleSessions ${field}`, initResult.roleSessions && typeof initResult.roleSessions[field] === "number", `init-result roleSessions.${field} 必须是数字`);
1434
+ }
1435
+
1436
+ for (const field of ["sessionId", "parentSessionId", "provider", "sessionStatus"]) {
1437
+ addCheck(`assignments required field ${field}`, assignments.recordContract && assignments.recordContract.requiredFields.includes(field), `assignments recordContract 缺少 ${field}`);
1438
+ }
1439
+ addCheck("assignments session binding rule mentions real host value", assignments.recordContract && assignments.recordContract.sessionBindingRule.includes("real host-returned value"), "assignments sessionBindingRule 必须说明真实宿主返回值");
1440
+
1441
+ addCheck("binding template provider codex", bindingTemplate.provider === "codex", "binding template provider 必须为 codex");
1442
+ addCheck("binding template targetVersion=1.7.3", bindingTemplate.targetVersion === "1.7.3", "binding template targetVersion 必须为 1.7.3");
1443
+ addCheck("binding template fakeSessionId prohibited", bindingTemplate.degradation && bindingTemplate.degradation.fakeSessionIdProhibited === true, "binding template 必须禁止伪造 sessionId");
1444
+ addCheck("binding template onboarding readOnly", bindingTemplate.onboarding && bindingTemplate.onboarding.readOnly === true, "binding template onboarding.readOnly 必须为 true");
1445
+
1446
+ for (const field of ["parentSessionId", "provider", "sessionStatus", "sessionBindingId", "sessionBindingPath", "sessionIdempotencyKey"]) {
1447
+ addCheck(`role-execution v1.7.3 field ${field}`, roleExecution.includes(`- ${field}:`), `role-execution 模板缺少 ${field}`);
1448
+ }
1449
+
1450
+ const snippets = [
1451
+ "v1.7.3 Codex 角色会话自动创建与绑定",
1452
+ "provider=codex",
1453
+ "sessionStatus=pending/creating/created/onboarding/ready/blocked/failed/closed",
1454
+ "taskId + roleId + provider + targetVersion",
1455
+ "真实 `sessionId`",
1456
+ "不得伪造 sessionId",
1457
+ "local-degraded-no-fake-session-id",
1458
+ "onboarding",
1459
+ "created-but-writeback-failed",
1460
+ "创建成功不等于业务代码修改授权",
1461
+ ];
1462
+ requireIncludes("init/xinyun-ai-init/README.md", snippets);
1463
+ requireIncludes("init/xinyun-ai-init/templates/core-rules.template.md", snippets);
1464
+ requireIncludes("init/xinyun-ai-init/templates/AGENTS.template.md", ["v1.7.3 Codex 角色会话自动创建与绑定", "provider=codex", "local-degraded-no-fake-session-id"]);
1465
+ requireIncludes("init/xinyun-ai-init/rules/init-rules.md", ["v1.7.3 Codex 角色会话初始化", "provider=codex", "local-degraded-no-fake-session-id"]);
1466
+ requireIncludes("init/xinyun-ai-init/rules/upgrade-rules.md", ["v1.7.3 升级创建和绑定真实角色会话", "created-but-writeback-failed", "不得伪造 sessionId"]);
1467
+ requireIncludes("init/xinyun-ai-init/rules/directory-self-completion.md", ["v1.7.3 角色会话绑定目录", "xinyun-ai/sessions/role-session-bindings.json", "local-degraded-no-fake-session-id"]);
1468
+ requireIncludes("init/xinyun-ai-init/rules/session-workbench.md", ["v1.7.3 角色会话交接字段", "roleSessionIdempotency", "不得伪造 sessionId"]);
1469
+ requireIncludes("init/xinyun-ai-init/templates/project-guide.template.md", ["v1.7.3 Codex role session anchors", "roleSessionIdempotency", "local-degraded-no-fake-session-id"]);
1470
+ requireIncludes("init/xinyun-ai-init/templates/project-check.template.md", ["v1.7.3 checks", "provider=codex", "不存在伪造 sessionId"]);
1471
+ requireIncludes("test-scenarios/scenarios.md", ["当前必测场景为 1-96", "当前观察场景为 97", "## 89. v1.7.3 Codex 真实角色会话创建", "## 96. v1.7.3 普通咨询边界", "## 97. Skill"]);
1472
+ requireIncludes("test-scenarios/review-template.md", ["1-96 必测", "89. v1.7.3 Codex 真实角色会话创建", "96. v1.7.3 普通咨询边界", "97. Skill"]);
1473
+ }
1474
+
1213
1475
  function main() {
1214
1476
  requireFile("bin/xinyun-ai-init.js");
1215
1477
  requireFile("init/xinyun-ai-init/README.md");
@@ -1223,6 +1485,8 @@ function main() {
1223
1485
  verifyV16Contracts();
1224
1486
  verifyV17Contracts();
1225
1487
  verifyV171Contracts();
1488
+ verifyV172Contracts();
1489
+ verifyV173Contracts();
1226
1490
  verifyTestScenarios();
1227
1491
  verifyJsonAndMarkdown();
1228
1492