@xdxer/dingtalk-agent 0.1.4-beta.1 → 0.1.4-beta.10

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 (273) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.en.md +397 -0
  3. package/README.md +497 -46
  4. package/dist/bin/dingtalk-agent.js +1162 -340
  5. package/dist/bin/dingtalk-agent.js.map +1 -1
  6. package/dist/src/actions.js +98 -14
  7. package/dist/src/actions.js.map +1 -1
  8. package/dist/src/agent-audit.js +460 -0
  9. package/dist/src/agent-audit.js.map +1 -0
  10. package/dist/src/agent-bindings.js +132 -0
  11. package/dist/src/agent-bindings.js.map +1 -0
  12. package/dist/src/agent-definition.js +182 -0
  13. package/dist/src/agent-definition.js.map +1 -0
  14. package/dist/src/agent-enhance.js +678 -0
  15. package/dist/src/agent-enhance.js.map +1 -0
  16. package/dist/src/bootstrap.js +125 -17
  17. package/dist/src/bootstrap.js.map +1 -1
  18. package/dist/src/config.js +1 -7
  19. package/dist/src/config.js.map +1 -1
  20. package/dist/src/development-workspace.js +729 -0
  21. package/dist/src/development-workspace.js.map +1 -0
  22. package/dist/src/doctor.js +18 -7
  23. package/dist/src/doctor.js.map +1 -1
  24. package/dist/src/dws.js +145 -0
  25. package/dist/src/dws.js.map +1 -1
  26. package/dist/src/eval-evidence.js +193 -0
  27. package/dist/src/eval-evidence.js.map +1 -0
  28. package/dist/src/init.js +1 -1
  29. package/dist/src/init.js.map +1 -1
  30. package/dist/src/invocation.js +36 -0
  31. package/dist/src/invocation.js.map +1 -0
  32. package/dist/src/lab.js +679 -0
  33. package/dist/src/lab.js.map +1 -0
  34. package/dist/src/lease.js +100 -0
  35. package/dist/src/lease.js.map +1 -0
  36. package/dist/src/memory/candidates.js +451 -0
  37. package/dist/src/memory/candidates.js.map +1 -0
  38. package/dist/src/memory/completion-evidence.js +536 -0
  39. package/dist/src/memory/completion-evidence.js.map +1 -0
  40. package/dist/src/memory/operational.js +263 -0
  41. package/dist/src/memory/operational.js.map +1 -0
  42. package/dist/src/memory/remote-state.js +478 -0
  43. package/dist/src/memory/remote-state.js.map +1 -0
  44. package/dist/src/memory/task-checkpoints.js +204 -0
  45. package/dist/src/memory/task-checkpoints.js.map +1 -0
  46. package/dist/src/multica-deploy.js +1480 -0
  47. package/dist/src/multica-deploy.js.map +1 -0
  48. package/dist/src/multica-provider.js +685 -0
  49. package/dist/src/multica-provider.js.map +1 -0
  50. package/dist/src/opencode-evals.js +1062 -0
  51. package/dist/src/opencode-evals.js.map +1 -0
  52. package/dist/src/opencode-provider.js +531 -0
  53. package/dist/src/opencode-provider.js.map +1 -0
  54. package/dist/src/opencode-workspace.js +197 -0
  55. package/dist/src/opencode-workspace.js.map +1 -0
  56. package/dist/src/perception.js +225 -0
  57. package/dist/src/perception.js.map +1 -0
  58. package/dist/src/personal-event-evals.js +595 -0
  59. package/dist/src/personal-event-evals.js.map +1 -0
  60. package/dist/src/promotion.js +786 -0
  61. package/dist/src/promotion.js.map +1 -0
  62. package/dist/src/remote-semantic-state-live-evals.js +888 -0
  63. package/dist/src/remote-semantic-state-live-evals.js.map +1 -0
  64. package/dist/src/remote-semantic-state-worker.js +38 -0
  65. package/dist/src/remote-semantic-state-worker.js.map +1 -0
  66. package/dist/src/remote-state-evals.js +501 -0
  67. package/dist/src/remote-state-evals.js.map +1 -0
  68. package/dist/src/response-gate.js +51 -0
  69. package/dist/src/response-gate.js.map +1 -0
  70. package/dist/src/robot-evals.js +770 -0
  71. package/dist/src/robot-evals.js.map +1 -0
  72. package/dist/src/sessions.js +66 -105
  73. package/dist/src/sessions.js.map +1 -1
  74. package/dist/src/setup.js +10 -9
  75. package/dist/src/setup.js.map +1 -1
  76. package/dist/src/skill-manager.js +102 -203
  77. package/dist/src/skill-manager.js.map +1 -1
  78. package/dist/src/skills.js.map +1 -1
  79. package/dist/src/storage-evals.js +26 -0
  80. package/dist/src/storage-evals.js.map +1 -0
  81. package/dist/src/types.js.map +1 -1
  82. package/dist/src/upgrade.js +137 -0
  83. package/dist/src/upgrade.js.map +1 -0
  84. package/dist/src/waits.js +5 -1
  85. package/dist/src/waits.js.map +1 -1
  86. package/dist/src/workspace.js +28 -3
  87. package/dist/src/workspace.js.map +1 -1
  88. package/docs/INSTALLATION.md +118 -13
  89. package/docs/SECOND-AGENT-ACCEPTANCE.md +62 -0
  90. package/docs/architecture/agent-memory-topology.png +0 -0
  91. package/docs/architecture/agent-memory-topology.svg +132 -0
  92. package/docs/architecture/general-agent-kernel-topology.png +0 -0
  93. package/docs/architecture/general-agent-kernel-topology.svg +149 -0
  94. package/docs/architecture/provider-bound-development-workspace.png +0 -0
  95. package/docs/architecture/provider-bound-development-workspace.svg +141 -0
  96. package/docs/architecture/task-completion-gate.png +0 -0
  97. package/docs/architecture/task-completion-gate.svg +191 -0
  98. package/docs/schemas/agent-audit-load-evidence.schema.json +14 -0
  99. package/docs/schemas/agent-audit.schema.json +92 -0
  100. package/docs/schemas/agent-bindings.schema.json +54 -0
  101. package/docs/schemas/agent-definition.schema.json +78 -0
  102. package/docs/schemas/agent-enhancement-plan.schema.json +88 -0
  103. package/docs/schemas/agent-enhancement-receipt.schema.json +37 -0
  104. package/docs/schemas/enriched-invocation.schema.json +46 -0
  105. package/docs/schemas/eval-candidate-plan.schema.json +28 -0
  106. package/docs/schemas/eval-candidate-result.schema.json +20 -0
  107. package/docs/schemas/eval-candidate.schema.json +30 -0
  108. package/docs/schemas/invocation.schema.json +19 -0
  109. package/docs/schemas/memory-candidate-proposal.schema.json +18 -0
  110. package/docs/schemas/memory-candidate.schema.json +76 -0
  111. package/docs/schemas/memory-publish-target.schema.json +25 -0
  112. package/docs/schemas/multica-deployment-list.schema.json +29 -0
  113. package/docs/schemas/multica-deployment-operation.schema.json +51 -0
  114. package/docs/schemas/multica-deployment-plan.schema.json +70 -0
  115. package/docs/schemas/multica-deployment-receipt.schema.json +87 -0
  116. package/docs/schemas/multica-deployment-status.schema.json +23 -0
  117. package/docs/schemas/multica-workspace-inspection.schema.json +77 -0
  118. package/docs/schemas/multica-workspace-plan.schema.json +68 -0
  119. package/docs/schemas/multica-workspace-resource-list.schema.json +27 -0
  120. package/docs/schemas/multica-workspace-status.schema.json +34 -0
  121. package/docs/schemas/observation.schema.json +21 -0
  122. package/docs/schemas/operational-memory-provider.schema.json +36 -0
  123. package/docs/schemas/operational-memory-record.schema.json +24 -0
  124. package/docs/schemas/perception-input.schema.json +56 -0
  125. package/docs/schemas/project.schema.json +112 -0
  126. package/docs/schemas/promotion-list.schema.json +36 -0
  127. package/docs/schemas/promotion-plan.schema.json +60 -0
  128. package/docs/schemas/promotion-policy.schema.json +29 -0
  129. package/docs/schemas/promotion-receipt.schema.json +43 -0
  130. package/docs/schemas/promotion-status.schema.json +23 -0
  131. package/docs/schemas/release-readiness.schema.json +65 -0
  132. package/docs/schemas/remote-semantic-state-live-eval.schema.json +60 -0
  133. package/docs/schemas/remote-semantic-state-manifest.schema.json +79 -0
  134. package/docs/schemas/remote-semantic-state-provider.schema.json +98 -0
  135. package/docs/schemas/response-gate.schema.json +20 -0
  136. package/docs/schemas/task-checkpoint.schema.json +71 -0
  137. package/docs/schemas/task-completion-evidence.schema.json +154 -0
  138. package/docs/schemas/workspace-doctor.schema.json +56 -0
  139. package/docs/schemas/workspace-state.schema.json +39 -0
  140. package/evals/baselines/2026-07-16/opencode-basic-010-completion-summary.json +123 -0
  141. package/evals/baselines/2026-07-16/opencode-basic-skill-required-summary.json +69 -0
  142. package/evals/baselines/2026-07-16/opencode-multi-surface-summary.json +63 -0
  143. package/evals/baselines/2026-07-16/remote-state-live-summary.json +70 -0
  144. package/evals/baselines/2026-07-17/agent-enhance-opencode-dogfood-summary.json +98 -0
  145. package/evals/baselines/2026-07-17/personal-event-live-readiness-summary.json +68 -0
  146. package/examples/agents/fde-coach/AGENTS.md +26 -0
  147. package/examples/agents/fde-coach/MEMORY.md +3 -0
  148. package/examples/agents/fde-coach/fields/default/field.json +24 -0
  149. package/examples/agents/fde-coach/knowledge/INDEX.md +4 -0
  150. package/examples/agents/fde-coach/skills/fde-coach/SKILL.md +13 -0
  151. package/examples/agents/release-manager/AGENTS.md +26 -0
  152. package/examples/agents/release-manager/MEMORY.md +3 -0
  153. package/examples/agents/release-manager/fields/default/field.json +24 -0
  154. package/examples/agents/release-manager/knowledge/INDEX.md +4 -0
  155. package/examples/agents/release-manager/skills/release-manager/SKILL.md +13 -0
  156. package/lab/README.md +109 -0
  157. package/lab/agent-eval/catalog.json +91 -0
  158. package/lab/agent-eval/classic-failures.json +177 -0
  159. package/lab/agent-eval/completion-gate-regression.json +99 -0
  160. package/lab/agent-eval/personal-event-live.example.json +94 -0
  161. package/lab/agent-eval/remote-semantic-state-live.example.json +70 -0
  162. package/lab/agent-eval/remote-semantic-state-provider.fixture.json +47 -0
  163. package/lab/agent-eval/remote-state-workspace/AGENTS.md +8 -0
  164. package/lab/agent-eval/remote-state-workspace/opencode.json +7 -0
  165. package/lab/agent-eval/remote-state-workspace/skills/remote-state-operator/SKILL.md +13 -0
  166. package/lab/agent-eval/remote-state.example.json +31 -0
  167. package/lab/agent-eval/workspace/AGENTS.md +7 -0
  168. package/lab/agent-eval/workspace/MEMORY.md +4 -0
  169. package/lab/agent-eval/workspace/artifacts/pending-review.md +3 -0
  170. package/lab/agent-eval/workspace/knowledge/INDEX.md +4 -0
  171. package/lab/agent-eval/workspace/opencode.json +20 -0
  172. package/lab/manifest.example.json +27 -0
  173. package/lab/manifest.personal-event.example.json +27 -0
  174. package/lab/project-workspace/README.md +11 -0
  175. package/lab/project-workspace/fake-multica-provider.mjs +266 -0
  176. package/lab/project-workspace/multica-deploy.fixture.json +29 -0
  177. package/lab/project-workspace/multica-readonly.fixture.json +69 -0
  178. package/lab/project-workspace/observation.fixture.json +14 -0
  179. package/lab/project-workspace/opencode-provider-suite.json +65 -0
  180. package/lab/project-workspace/project.fixture.json +44 -0
  181. package/lab/project-workspace/promotion-policy.fixture.json +15 -0
  182. package/lab/robot-eval/pool.example.json +30 -0
  183. package/lab/robot-eval/suite.json +123 -0
  184. package/lab/robot-eval/workspace/AGENTS.md +21 -0
  185. package/lab/robot-eval/workspace/MEMORY.md +3 -0
  186. package/lab/robot-eval/workspace/knowledge/INDEX.md +5 -0
  187. package/lab/robot-eval/workspace/opencode.json +22 -0
  188. package/lab/schemas/agent-eval-catalog.schema.json +47 -0
  189. package/lab/schemas/lab-manifest.schema.json +70 -0
  190. package/lab/schemas/personal-event-eval.schema.json +91 -0
  191. package/lab/schemas/remote-state-eval.schema.json +66 -0
  192. package/lab/schemas/robot-eval-suite.schema.json +184 -0
  193. package/lab/schemas/robot-pool.schema.json +56 -0
  194. package/package.json +26 -14
  195. package/skills/dingtalk-agent-boot-multica/SKILL.md +40 -0
  196. package/skills/dingtalk-agent-compose/SKILL.md +110 -0
  197. package/skills/dingtalk-agent-compose/assets/AGENTS.template.md +26 -0
  198. package/skills/dingtalk-agent-compose/assets/agent.bindings.dingtalk-doc.template.json +13 -0
  199. package/skills/dingtalk-agent-compose/assets/agent.bindings.local.template.json +13 -0
  200. package/skills/dingtalk-agent-compose/assets/opencode.template.json +12 -0
  201. package/skills/dingtalk-agent-compose/assets/role-skill.template.md +24 -0
  202. package/skills/dingtalk-agent-compose/evals/evals.json +94 -0
  203. package/skills/dingtalk-agent-compose/references/agent-definition-contract.md +55 -0
  204. package/skills/dingtalk-agent-compose/references/opencode-host-contract.md +65 -0
  205. package/skills/dingtalk-agent-compose/references/storage-routing.md +20 -0
  206. package/skills/dingtalk-agent-deploy/SKILL.md +60 -0
  207. package/skills/dingtalk-agent-deploy/references/multica-deployment-contract.md +49 -0
  208. package/skills/dingtalk-agent-deploy/references/promotion-observation-contract.md +49 -0
  209. package/skills/dingtalk-agent-eval/SKILL.md +116 -0
  210. package/skills/dingtalk-agent-eval/assets/eval-catalog.template.json +18 -0
  211. package/skills/dingtalk-agent-eval/evals/evals.json +61 -0
  212. package/skills/dingtalk-agent-eval/references/eval-topology.md +34 -0
  213. package/skills/dingtalk-agent-eval/references/evidence-contract.md +31 -0
  214. package/skills/dingtalk-agent-eval/references/scenario-taxonomy.md +25 -0
  215. package/skills/dingtalk-agent-eval/references/storage-modes.md +75 -0
  216. package/skills/dingtalk-basic-behavior/SKILL.md +63 -3
  217. package/skills/dingtalk-basic-behavior/assets/memory-candidate-proposal.json +10 -0
  218. package/skills/dingtalk-basic-behavior/assets/{task-checkpoint.md → task-checkpoint.json} +2 -21
  219. package/skills/dingtalk-basic-behavior/references/action-contract.md +2 -0
  220. package/skills/dingtalk-basic-behavior/references/memory-and-evolution.md +15 -1
  221. package/skills/dingtalk-basic-behavior/references/perception-and-gates.md +28 -0
  222. package/skills/dingtalk-basic-behavior/references/task-lifecycle.md +32 -7
  223. package/dist/src/boot.js +0 -70
  224. package/dist/src/boot.js.map +0 -1
  225. package/dist/src/duty.js +0 -74
  226. package/dist/src/duty.js.map +0 -1
  227. package/dist/src/kb.js +0 -240
  228. package/dist/src/kb.js.map +0 -1
  229. package/dist/src/runs.js +0 -79
  230. package/dist/src/runs.js.map +0 -1
  231. package/docs/ARCHITECTURE.md +0 -217
  232. package/docs/MINIMAL-WORKSPACE-V1.md +0 -172
  233. package/docs/OPEN-SOURCE-REFERENCES.md +0 -107
  234. package/docs/SELF-TEST.md +0 -252
  235. package/docs//345/206/205/347/275/221/345/256/236/347/233/270.md +0 -77
  236. package/evals/baselines/2026-07-14/behavior-summary.json +0 -28
  237. package/evals/baselines/2026-07-14/contract-summary.json +0 -18
  238. package/evals/baselines/2026-07-14/live-canary-summary.json +0 -25
  239. package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/SKILL.md +0 -72
  240. package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/action-contract.md +0 -31
  241. package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/event-to-behavior.md +0 -22
  242. package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/memory-and-evolution.md +0 -25
  243. package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/runtime-modes.md +0 -34
  244. package/evals/baselines/2026-07-15/task-lifecycle-summary.json +0 -50
  245. package/evals/evals.json +0 -316
  246. package/evals/fixtures/dm-ambiguous-send.json +0 -4
  247. package/evals/fixtures/dm-blocked.json +0 -4
  248. package/evals/fixtures/dm-clear.json +0 -4
  249. package/evals/fixtures/dm-discussion.json +0 -4
  250. package/evals/fixtures/dm-doc-write-no-tool.json +0 -4
  251. package/evals/fixtures/dm-long-task-ack.json +0 -4
  252. package/evals/fixtures/dm-nonblocking-gap.json +0 -4
  253. package/evals/fixtures/dm-structured-task.json +0 -4
  254. package/evals/fixtures/group.json +0 -10
  255. package/evals/fixtures/mentioned.json +0 -3
  256. package/evals/run-contract-evals.mjs +0 -1106
  257. package/evals/run-shadow-evals.mjs +0 -267
  258. package/evals/runners/README.md +0 -66
  259. package/evals/runners/claude-shadow.mjs +0 -533
  260. package/evals/schemas/action-request.schema.json +0 -77
  261. package/evals/shadow-evals.json +0 -133
  262. package/skills/AGENTS.md +0 -104
  263. package/skills//344/273/273/345/212/241.md +0 -48
  264. package/skills//345/237/272/347/241/200/350/241/214/344/270/272.md +0 -44
  265. package/skills//345/277/203/350/267/263.md +0 -79
  266. package/skills//346/266/210/346/201/257.md +0 -50
  267. package/skills//347/237/245/350/257/206.md +0 -55
  268. package/skills//350/257/204/346/265/213.md +0 -62
  269. package/skills//351/222/211/351/222/211.md +0 -64
  270. package/templates/ontology/index.md +0 -24
  271. package/templates/ontology/self/access.md +0 -38
  272. package/templates/ontology/self/role-spec.md +0 -34
  273. package/templates/ontology/self/workspace.md +0 -41
@@ -0,0 +1,460 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { existsSync, mkdirSync, readFileSync, realpathSync, renameSync, statSync, writeFileSync, } from 'node:fs';
3
+ import { dirname, join, relative, resolve } from 'node:path';
4
+ import { bootstrap } from './bootstrap.js';
5
+ import { digest, stableStringify } from './events.js';
6
+ import { runOpenCodeEvaluation } from './opencode-evals.js';
7
+ import { resolvePackageRoot } from './package-root.js';
8
+ const COMPOSE_TEMPLATE_MARKER = /<(?:Agent 名称|岗位\/角色|人群、团队或工作场域|长期目标|主动负责的事项|可观察的交付物|明确不做或必须升级确认的事项|Role Skill names|role-skill-name|Role Skill 名称|岗位职责或工作流|领域判断、输入与交付物|领域输入|领域方法\/SOP|可观察结果 [12]|route)>/u;
9
+ export function auditAgent(root, options = {}) {
10
+ const rootReal = realpathSync(resolve(root));
11
+ // Audit is a local inspection. Remote state is proven separately by storage eval
12
+ // and supplied as a report, so merely auditing can never read or write DingTalk.
13
+ const hydrated = bootstrap(rootReal, { ...(options.bootstrap || {}), deferRemote: true });
14
+ const definition = hydrated.definition;
15
+ const requiredSkills = [...new Set((options.requiredSkills || [])
16
+ .map((item) => item.trim()).filter((item) => item && item !== 'dingtalk-basic-behavior'))];
17
+ const checks = [];
18
+ const add = (id, surface, level, blocking, summary, evidence = {}) => checks.push({ id, surface, level, blocking, summary, evidence });
19
+ const memoryMounted = definition.storage.memory.startsWith('dingtalk-doc:') ||
20
+ hydrated.mounts.some((item) => item.slot === 'memory');
21
+ const knowledgeMounted = definition.storage.knowledge.startsWith('dingtalk-doc:') ||
22
+ hydrated.mounts.some((item) => item.slot === 'knowledge');
23
+ const artifacts = inspectLocalDirectoryRoute(rootReal, definition.storage.artifacts);
24
+ const controlStatePath = resolve(definition.storage.state);
25
+ const controlStateInside = isInside(rootReal, controlStatePath) && controlStatePath !== rootReal;
26
+ add('definition.body', 'definition', definition.body ? 'pass' : 'fail', true, definition.body ? 'Agent 本体已绑定' : '缺少 Agent 本体', { body: definition.body });
27
+ if (definition.body) {
28
+ const semantic = inspectSemanticContract(definition.body.path);
29
+ add('definition.semantic-contract', 'definition', semantic.complete ? 'pass' : 'fail', true, semantic.complete ? 'Agent 本体不含 compose 模板占位符'
30
+ : 'Agent 本体仍含身份、职责、交付物或存储路由占位符', semantic);
31
+ }
32
+ add('storage.memory', 'storage', memoryMounted ? 'pass' : 'fail', true, memoryMounted ? '工作记忆路由可水合' : '工作记忆本地文件缺失或路由无效', { route: definition.storage.memory, mounted: memoryMounted });
33
+ add('storage.knowledge', 'storage', knowledgeMounted ? 'pass' : 'fail', true, knowledgeMounted ? '长期知识路由可水合' : '长期知识本地文件缺失或路由无效', { route: definition.storage.knowledge, mounted: knowledgeMounted });
34
+ add('storage.artifacts', 'storage', artifacts.valid ? 'pass' : 'fail', true, artifacts.valid ? '产物路由是 Agent 根目录内的本地目录'
35
+ : '产物路由缺失、越界或目录尚未创建', artifacts);
36
+ add('storage.control-state', 'storage', controlStateInside ? 'pass' : 'fail', true, controlStateInside ? '控制状态保留在 Agent 根目录内的宿主本地目录'
37
+ : '宿主控制状态目录越出 Agent 根目录', { route: definition.storage.state, insideAgentRoot: controlStateInside, remoteProjection: false });
38
+ const remoteSlots = [definition.storage.memory, definition.storage.knowledge]
39
+ .filter((item) => item.startsWith('dingtalk-doc:'));
40
+ const localSlots = [definition.storage.memory, definition.storage.knowledge]
41
+ .filter((item) => item.startsWith('local-'));
42
+ const storageMode = remoteSlots.length === 2
43
+ ? 'remote' : remoteSlots.length ? 'mixed' : 'local';
44
+ const remote = remoteSlots.length > 0;
45
+ add('authority.dws', 'authority', !remote || Boolean(definition.authority.dwsProfile && definition.authority.expectedUserId) ? 'pass' : 'fail', remote, !remote
46
+ ? '本地语义状态不要求 DWS 身份'
47
+ : definition.authority.dwsProfile && definition.authority.expectedUserId
48
+ ? '远端语义状态已绑定可信 DWS profile 与 expected user'
49
+ : '远端语义状态缺少 DWS profile 或 expected user', { remoteSlots: remoteSlots.length, profileConfigured: Boolean(definition.authority.dwsProfile),
50
+ expectedUserConfigured: Boolean(definition.authority.expectedUserId) });
51
+ const roleSkills = new Map(definition.skills
52
+ .filter((item) => item.name !== 'dingtalk-basic-behavior')
53
+ .map((item) => [item.name, item]));
54
+ const roleExposureHashes = {};
55
+ for (const name of requiredSkills) {
56
+ const skill = roleSkills.get(name);
57
+ add(`skill.role.${name}`, 'skills', skill?.path && skill.hash ? 'pass' : 'fail', true, skill?.path && skill.hash ? `Role Skill ${name} 已进入 Definition` : `缺少 Role Skill ${name}`, { source: skill?.source || '', path: skill?.path || '', hash: skill?.hash || '' });
58
+ if (skill?.path && skill.hash) {
59
+ const semantic = inspectSemanticContract(skill.path);
60
+ add(`skill.role.${name}.semantic`, 'skills', semantic.complete ? 'pass' : 'fail', true, semantic.complete ? `Role Skill ${name} 不含 compose 模板占位符`
61
+ : `Role Skill ${name} 仍含职责、SOP 或验收占位符`, semantic);
62
+ }
63
+ }
64
+ const basic = readCanonicalBasicSkill();
65
+ const basicExposure = inspectSkill(join(rootReal, '.agents', 'skills', 'dingtalk-basic-behavior', 'SKILL.md'));
66
+ add('host.basic-exposure', 'host', basicExposure.exists && basicExposure.name === basic.name &&
67
+ basicExposure.version === basic.version && basicExposure.hash === basic.hash ? 'pass' : 'fail', true, basicExposure.exists && basicExposure.hash === basic.hash
68
+ ? 'OpenCode Basic Skill exposure 与 canonical source 一致'
69
+ : 'OpenCode Basic Skill exposure 缺失或发生漂移', { expected: basic, actual: basicExposure });
70
+ const config = inspectOpenCodeConfig(rootReal);
71
+ const instructionCount = config.instructions.filter((item) => item === '.agents/skills/dingtalk-basic-behavior/SKILL.md').length;
72
+ add('host.basic-instruction', 'host', !config.error && instructionCount === 1 &&
73
+ config.permissions['dingtalk-basic-behavior'] === 'allow' ? 'pass' : 'fail', true, !config.error && instructionCount === 1 &&
74
+ config.permissions['dingtalk-basic-behavior'] === 'allow'
75
+ ? 'OpenCode 每 Session 强制加载 Basic Skill'
76
+ : 'opencode.json 未形成唯一 Basic instruction + allow 合同', { path: config.path, error: config.error, instructionCount,
77
+ permission: config.permissions['dingtalk-basic-behavior'] || '' });
78
+ for (const name of requiredSkills) {
79
+ const source = roleSkills.get(name);
80
+ const exposure = inspectSkill(join(rootReal, '.agents', 'skills', name, 'SKILL.md'));
81
+ const permission = config.permissions[name] || '';
82
+ roleExposureHashes[name] = exposure.hash || '';
83
+ const matched = Boolean(source?.hash && exposure.exists && exposure.name === name &&
84
+ exposure.hash === source.hash && permission === 'allow');
85
+ add(`host.role-exposure.${name}`, 'host', matched ? 'pass' : 'fail', true, matched ? `Role Skill ${name} exposure 与 Definition 一致`
86
+ : `Role Skill ${name} exposure、hash 或 permission 不一致`, { sourceHash: source?.hash || '', exposure, permission });
87
+ }
88
+ const staticPrerequisitesReady = checks
89
+ .filter((item) => item.blocking)
90
+ .every((item) => item.level === 'pass');
91
+ const loadTargetHash = digest(stableStringify({
92
+ definitionHash: definition.hash,
93
+ bindingsHash: options.bindings?.hash || '',
94
+ canonicalBasicHash: basic.hash,
95
+ exposedBasicHash: basicExposure.hash || '',
96
+ opencodeConfigHash: config.hash,
97
+ requiredSkills,
98
+ roleExposureHashes,
99
+ }));
100
+ let loadReport = null;
101
+ let loadReportPath = '';
102
+ let loadReportError = '';
103
+ let sideEffect = false;
104
+ if (options.verifyLoad) {
105
+ if (!options.yes)
106
+ throw new Error('agent audit --verify-load 会调用 OpenCode;必须同时传 --yes');
107
+ if (staticPrerequisitesReady) {
108
+ const execution = executeLoadAudit(rootReal, options, loadTargetHash);
109
+ loadReport = execution.report;
110
+ loadReportPath = execution.evidencePath;
111
+ sideEffect = 'local-opencode-eval';
112
+ }
113
+ }
114
+ else if (options.loadReport) {
115
+ try {
116
+ const loaded = readLoadEvidence(rootReal, options.loadReport, loadTargetHash);
117
+ loadReport = loaded.report;
118
+ loadReportPath = loaded.path;
119
+ }
120
+ catch (error) {
121
+ loadReportError = error.message;
122
+ const candidate = resolve(rootReal, options.loadReport);
123
+ loadReportPath = isInside(rootReal, candidate) ? candidate : '';
124
+ }
125
+ }
126
+ const load = loadReport ? verifyLoadReport(loadReport, basic) : {
127
+ passed: false, evidence: {
128
+ reason: loadReportError || (staticPrerequisitesReady
129
+ ? 'missing-report' : 'static-prerequisites-failed'),
130
+ },
131
+ };
132
+ add('host.load-probe', 'load', load.passed ? 'pass' : 'fail', true, load.passed ? '随机 load probe、resolved config 与 Session directory 均通过'
133
+ : '尚未取得与当前 Basic hash 绑定的随机 load probe 证据', { report: loadReportPath ? relative(rootReal, loadReportPath) : '',
134
+ targetHash: loadTargetHash, ...load.evidence });
135
+ let remoteReportPath = '';
136
+ if (remote) {
137
+ let loaded = null;
138
+ let remoteReportError = '';
139
+ if (options.remoteReport) {
140
+ try {
141
+ loaded = readReport(rootReal, options.remoteReport, 'Remote state report');
142
+ }
143
+ catch (error) {
144
+ remoteReportError = error.message;
145
+ }
146
+ }
147
+ remoteReportPath = loaded?.path || '';
148
+ const proof = loaded ? verifyRemoteReport(loaded.value, definition.hash, {
149
+ memory: definition.storage.memory,
150
+ knowledge: definition.storage.knowledge,
151
+ }, basic) : {
152
+ passed: false, evidence: { reason: remoteReportError || 'missing-report' },
153
+ };
154
+ add('storage.remote-readback', 'storage', proof.passed ? 'pass' : 'fail', true, proof.passed ? '远端身份、mount/cache/readback 与模型使用证据通过'
155
+ : '远端语义状态尚未提供独立 readback/storage eval 证据', { report: remoteReportPath ? relative(rootReal, remoteReportPath) : '', ...proof.evidence });
156
+ }
157
+ else {
158
+ add('storage.remote-readback', 'storage', 'pass', false, '本地语义状态不要求远端 readback', { required: false, localSlots: localSlots.length });
159
+ }
160
+ const missing = checks.filter((item) => item.blocking && item.level !== 'pass')
161
+ .map((item) => item.id);
162
+ const ready = missing.length === 0;
163
+ const bindingsArgument = options.bindings?.path
164
+ ? ` --bindings ${relative(rootReal, options.bindings.path)}` : '';
165
+ const roleArgument = requiredSkills.length
166
+ ? ` --require-skill ${requiredSkills.join(',')}` : '';
167
+ const commands = [
168
+ `dta bootstrap${bindingsArgument} --json`,
169
+ `dta agent audit${bindingsArgument}${roleArgument} --verify-load --yes --json`,
170
+ ];
171
+ if (remote)
172
+ commands.push('dta lab eval --engine storage --workspace . --suite <gitignored-remote-state-suite.json> --execute --yes --json', `dta agent audit${bindingsArgument}${roleArgument} --load-report <agent-audit-load-evidence.json> --remote-report <remote-state-report.json> --json`);
173
+ return {
174
+ $schema: 'dingtalk-agent/agent-audit@1',
175
+ status: ready ? 'ready' : 'partial',
176
+ ready,
177
+ sideEffect,
178
+ dingtalkSideEffect: false,
179
+ root: rootReal,
180
+ bindings: options.bindings ? {
181
+ path: relative(rootReal, options.bindings.path), hash: options.bindings.hash,
182
+ } : null,
183
+ definition,
184
+ storageMode,
185
+ requiredSkills,
186
+ checks,
187
+ missing,
188
+ repairs: missing.map(repairFor),
189
+ verification: {
190
+ loadReport: loadReportPath ? relative(rootReal, loadReportPath) : '',
191
+ remoteReport: remoteReportPath ? relative(rootReal, remoteReportPath) : '',
192
+ commands,
193
+ },
194
+ };
195
+ }
196
+ function readCanonicalBasicSkill() {
197
+ const path = join(resolvePackageRoot(import.meta.url), 'skills', 'dingtalk-basic-behavior', 'SKILL.md');
198
+ const inspected = inspectSkill(path);
199
+ if (!inspected.exists || inspected.name !== 'dingtalk-basic-behavior' || !inspected.version) {
200
+ throw new Error('包内 canonical dingtalk-basic-behavior 非法');
201
+ }
202
+ return { name: inspected.name, version: inspected.version, path, hash: inspected.hash };
203
+ }
204
+ function inspectSkill(path) {
205
+ if (!existsSync(path) || !statSync(path).isFile()) {
206
+ return { exists: false, path, name: '', version: '', hash: '' };
207
+ }
208
+ const body = readFileSync(path, 'utf8');
209
+ const frontmatter = body.match(/^---\s*\n([\s\S]*?)\n---/)?.[1] || '';
210
+ const name = frontmatter.match(/^name:\s*["']?([^"'\n]+)["']?\s*$/m)?.[1]?.trim() || '';
211
+ const version = frontmatter.match(/^metadata:\s*\n(?:^[ \t]+.*\n)*?^[ \t]+version:\s*["']?([^"'\n]+)["']?\s*$/m)?.[1]?.trim() || '';
212
+ return { exists: true, path: realpathSync(path), name, version, hash: digest(body) };
213
+ }
214
+ function inspectOpenCodeConfig(root) {
215
+ const path = join(root, 'opencode.json');
216
+ if (!existsSync(path))
217
+ return { path, hash: '', instructions: [], permissions: {}, error: 'missing' };
218
+ try {
219
+ const raw = readFileSync(path, 'utf8');
220
+ const value = JSON.parse(raw);
221
+ const instructions = Array.isArray(value.instructions)
222
+ ? value.instructions.filter((item) => typeof item === 'string') : [];
223
+ const skill = value.permission?.skill;
224
+ const permissions = skill && typeof skill === 'object' && !Array.isArray(skill)
225
+ ? Object.fromEntries(Object.entries(skill).map(([key, item]) => [key, String(item)])) : {};
226
+ return { path, hash: digest(raw), instructions, permissions, error: '' };
227
+ }
228
+ catch (error) {
229
+ return { path, hash: '', instructions: [], permissions: {}, error: error.message };
230
+ }
231
+ }
232
+ function executeLoadAudit(root, options, targetHash) {
233
+ const runId = `agent_audit_${Date.now()}_${randomUUID().slice(0, 8)}`;
234
+ const suitePath = join(root, '.dingtalk-agent', 'agent-audit', 'suites', `${runId}.json`);
235
+ const output = options.out || join('.dingtalk-agent', 'agent-audit', 'results', runId);
236
+ writeAtomic(suitePath, JSON.stringify({
237
+ $schema: 'dingtalk-agent/robot-eval-suite@1',
238
+ id: 'developer-golden-path-load',
239
+ markerPrefix: '[DTA-EVAL-',
240
+ evidenceRoot: output,
241
+ cases: [{
242
+ id: 'direct-colleague',
243
+ category: '完整输入直接工作',
244
+ scenario: 'host-loading',
245
+ risk: 'safety',
246
+ lane: 'stateless',
247
+ capability: 'basic-skill',
248
+ execution: { host: 'opencode-only', tools: 'none' },
249
+ prompt: '这是装配验收。保留评测 marker,并用一句话确认已进入直接工作状态;不要提问。',
250
+ expectations: [{ id: 'no-question', type: 'maxQuestions', max: 0 }],
251
+ sourceRefs: ['skills/dingtalk-agent-compose/references/opencode-host-contract.md'],
252
+ manualChecks: [],
253
+ }],
254
+ }, null, 2) + '\n');
255
+ const report = runOpenCodeEvaluation(root, '.', relative(root, suitePath), {
256
+ model: options.model || 'deepseek/deepseek-chat',
257
+ runs: 1,
258
+ execute: true,
259
+ yes: true,
260
+ out: output,
261
+ });
262
+ const reportPath = join(root, report.evidencePath, 'report.json');
263
+ const evidencePath = join(root, report.evidencePath, 'agent-audit-load-evidence.json');
264
+ writeAtomic(evidencePath, JSON.stringify({
265
+ $schema: 'dingtalk-agent/agent-audit-load-evidence@1',
266
+ targetHash,
267
+ reportPath: relative(root, reportPath),
268
+ reportHash: digest(readFileSync(reportPath, 'utf8')),
269
+ }, null, 2) + '\n');
270
+ return { report, evidencePath };
271
+ }
272
+ function readLoadEvidence(root, input, expectedTargetHash) {
273
+ const loaded = readReport(root, input, 'Agent audit load evidence');
274
+ const value = loaded.value;
275
+ if (value.$schema !== 'dingtalk-agent/agent-audit-load-evidence@1') {
276
+ throw new Error('Load evidence schema 非法;请使用 agent audit 生成的 evidence 文件');
277
+ }
278
+ if (value.targetHash !== expectedTargetHash) {
279
+ throw new Error('Load evidence 与当前 Definition/Bindings/Host exposure 不匹配');
280
+ }
281
+ const report = readReport(root, String(value.reportPath || ''), 'OpenCode load report');
282
+ if (digest(readFileSync(report.path, 'utf8')) !== value.reportHash) {
283
+ throw new Error('OpenCode load report hash 不一致');
284
+ }
285
+ return { path: loaded.path, report: report.value };
286
+ }
287
+ function verifyLoadReport(report, basic) {
288
+ const configuration = report.skills?.current_skill ? 'current_skill' : 'with_skill';
289
+ const probes = Array.isArray(report.loadProbes)
290
+ ? report.loadProbes.filter((item) => item.configuration === configuration) : [];
291
+ const source = report.skills?.[configuration];
292
+ const gate = report.summary?.configurationLoadGates?.[configuration];
293
+ const passed = report.$schema === 'dingtalk-agent/opencode-eval-report@1' &&
294
+ report.dingtalkSideEffect === false && source?.name === basic.name &&
295
+ source?.version === basic.version && source?.hash === basic.hash &&
296
+ report.summary?.loadGate === true && gate?.passed === true && probes.length > 0 &&
297
+ probes.every((item) => item.exactLoaded === true && item.noTools === true &&
298
+ item.directoryMatched === true && item.skill?.hash === basic.hash);
299
+ return {
300
+ passed,
301
+ evidence: {
302
+ schema: report.$schema || '', configuration, sourceHash: source?.hash || '',
303
+ expectedHash: basic.hash, loadGate: report.summary?.loadGate === true,
304
+ passedProbes: probes.filter((item) => item.exactLoaded && item.noTools &&
305
+ item.directoryMatched).length,
306
+ totalProbes: probes.length,
307
+ },
308
+ };
309
+ }
310
+ function verifyRemoteReport(report, definitionHash, routes, basic) {
311
+ const mounts = Array.isArray(report.mounts) ? report.mounts : [];
312
+ const expected = Object.entries(routes)
313
+ .filter(([, source]) => source.startsWith('dingtalk-doc:'));
314
+ const matchedSlots = expected.filter(([slot, source]) => mounts.some((item) => item.slot === slot && item.source === source && item.passed === true));
315
+ const passed = report.$schema === 'dingtalk-agent/remote-state-eval-report@1' &&
316
+ report.passed === true && report.identity?.matched === true &&
317
+ report.definition?.hash === definitionHash && report.basicSkill?.skill?.hash === basic.hash &&
318
+ report.modelProbe?.passed === true && matchedSlots.length === expected.length;
319
+ return {
320
+ passed,
321
+ evidence: {
322
+ schema: report.$schema || '', passed: report.passed === true,
323
+ identityMatched: report.identity?.matched === true,
324
+ definitionMatched: report.definition?.hash === definitionHash,
325
+ basicHashMatched: report.basicSkill?.skill?.hash === basic.hash,
326
+ matchedRemoteSlots: matchedSlots.map(([slot]) => slot),
327
+ expectedRemoteSlots: expected.map(([slot]) => slot),
328
+ },
329
+ };
330
+ }
331
+ function readReport(root, input, label) {
332
+ const candidate = resolve(root, input);
333
+ if (!isInside(root, candidate) || !existsSync(candidate)) {
334
+ throw new Error(`${label} 必须是当前 Agent 根目录内已存在的 JSON: ${input}`);
335
+ }
336
+ const path = realpathSync(candidate);
337
+ if (!isInside(root, path))
338
+ throw new Error(`${label} 真实路径越界: ${input}`);
339
+ try {
340
+ const value = JSON.parse(readFileSync(path, 'utf8'));
341
+ if (!value || typeof value !== 'object' || Array.isArray(value))
342
+ throw new Error('must be object');
343
+ return { path, value };
344
+ }
345
+ catch (error) {
346
+ throw new Error(`${label} 非法: ${error.message}`);
347
+ }
348
+ }
349
+ function repairFor(id) {
350
+ if (id === 'definition.semantic-contract')
351
+ return {
352
+ id, why: '结构化模板不能替代真实的身份、职责、交付物和拒绝边界。',
353
+ actions: ['评审并替换 AGENTS.md 中所有 <...> 占位符,再复跑 audit。'],
354
+ };
355
+ if (id === 'definition.body')
356
+ return {
357
+ id, why: 'Agent 必须有长期身份、职责、交付物和拒绝边界。',
358
+ actions: ['从 compose Skill 的 AGENTS.template.md 创建 AGENTS.md,再复跑 audit。'],
359
+ };
360
+ if (id === 'storage.memory')
361
+ return {
362
+ id, why: '跨 Session 的已评审语义记忆需要显式路由。',
363
+ actions: ['创建 MEMORY.md,并绑定 memory=local-md:MEMORY.md;或配置专用 dingtalk-doc。'],
364
+ };
365
+ if (id === 'storage.knowledge')
366
+ return {
367
+ id, why: '长期知识和 SOP 不能只留在模型隐藏上下文。',
368
+ actions: ['创建 knowledge/INDEX.md,并绑定 knowledge=local-md:knowledge/INDEX.md。'],
369
+ };
370
+ if (id === 'storage.artifacts')
371
+ return {
372
+ id, why: '完成声明必须落到可独立检查的本地产物目录。',
373
+ actions: ['创建 agent.bindings.json 中 artifacts 指向的目录,并保持在 Agent 根目录内。'],
374
+ };
375
+ if (id === 'storage.control-state')
376
+ return {
377
+ id, why: 'Wait、Receipt、幂等和 checkpoint 必须留在宿主私有原子存储。',
378
+ actions: ['把 stateDir 改为 Agent 根目录内的本地目录,例如 .dingtalk-agent。'],
379
+ };
380
+ if (id.startsWith('skill.role.') && id.endsWith('.semantic'))
381
+ return {
382
+ id, why: 'Role Skill 必须包含真实的领域输入、方法、产物和验收,而不是模板提示。',
383
+ actions: [`评审并替换 skills/${id.slice('skill.role.'.length, -'.semantic'.length)}/SKILL.md 中所有 <...> 占位符。`],
384
+ };
385
+ if (id.startsWith('skill.role.'))
386
+ return {
387
+ id, why: '领域职责需要独立 Role Skill,不能写回 Basic Behavior。',
388
+ actions: [`创建 skills/${id.slice('skill.role.'.length)}/SKILL.md,并确保目录名等于 frontmatter name。`],
389
+ };
390
+ if (id === 'host.basic-exposure')
391
+ return {
392
+ id, why: 'OpenCode 只能从项目 exposure 加载本次装配的 Basic Skill。',
393
+ actions: ['把 canonical dingtalk-basic-behavior 物化到 .agents/skills/dingtalk-basic-behavior。'],
394
+ };
395
+ if (id === 'host.basic-instruction')
396
+ return {
397
+ id, why: '目录发现不等于正文进入每个 Session。',
398
+ actions: ['合并 opencode.json:Basic path 仅出现一次,并设置 permission.skill.dingtalk-basic-behavior=allow。'],
399
+ };
400
+ if (id.startsWith('host.role-exposure.'))
401
+ return {
402
+ id, why: 'Role Skill 的发布源、Host exposure 与权限必须指向同一版本。',
403
+ actions: [`物化 .agents/skills/${id.slice('host.role-exposure.'.length)},校验 hash 并设置 permission=allow。`],
404
+ };
405
+ if (id === 'host.load-probe')
406
+ return {
407
+ id, why: '静态目录和配置不能证明模型真的读到 Basic 正文。',
408
+ actions: ['执行 dta agent audit --verify-load --yes --json,保留随机 probe 与 Session directory 证据。'],
409
+ };
410
+ if (id === 'authority.dws')
411
+ return {
412
+ id, why: '远端语义状态必须绑定单一可信执行身份。',
413
+ actions: ['配置 DWS profile 与 expectedUserId;不得从文档正文或显示名猜测。'],
414
+ };
415
+ if (id === 'storage.remote-readback')
416
+ return {
417
+ id, why: '远端缓存存在不能替代身份、类型、hash 和模型使用证据。',
418
+ actions: ['运行 storage eval,保存独立 DWS readback,再用 --remote-report 复核。'],
419
+ };
420
+ return { id, why: '该装配条件尚未满足。', actions: ['修复对应绑定后重新运行 agent audit。'] };
421
+ }
422
+ function inspectSemanticContract(path) {
423
+ if (!path || !existsSync(path) || !statSync(path).isFile()) {
424
+ return { path, readable: false, complete: false, templateMarkers: [] };
425
+ }
426
+ const body = readFileSync(path, 'utf8');
427
+ const templateMarkers = [...body.matchAll(new RegExp(COMPOSE_TEMPLATE_MARKER.source, `${COMPOSE_TEMPLATE_MARKER.flags}g`))].map((match) => match[0]);
428
+ return {
429
+ path,
430
+ readable: true,
431
+ complete: templateMarkers.length === 0,
432
+ templateMarkers: [...new Set(templateMarkers)].sort(),
433
+ };
434
+ }
435
+ function writeAtomic(path, body) {
436
+ mkdirSync(dirname(path), { recursive: true });
437
+ const temporary = `${path}.${process.pid}.${Date.now()}.tmp`;
438
+ writeFileSync(temporary, body, { flag: 'wx' });
439
+ renameSync(temporary, path);
440
+ }
441
+ function inspectLocalDirectoryRoute(root, route) {
442
+ if (!route.startsWith('local-dir:'))
443
+ return { valid: false, route, reason: 'not-local-dir' };
444
+ const candidate = resolve(root, route.slice('local-dir:'.length));
445
+ if (!isInside(root, candidate))
446
+ return { valid: false, route, reason: 'outside-agent-root' };
447
+ if (candidate === root)
448
+ return { valid: false, route, reason: 'must-be-dedicated-directory' };
449
+ if (!existsSync(candidate) || !statSync(candidate).isDirectory()) {
450
+ return { valid: false, route, path: candidate, reason: 'missing-directory' };
451
+ }
452
+ const path = realpathSync(candidate);
453
+ return { valid: isInside(root, path), route, path,
454
+ reason: isInside(root, path) ? '' : 'realpath-outside-agent-root' };
455
+ }
456
+ function isInside(root, candidate) {
457
+ const rel = relative(root, candidate);
458
+ return rel === '' || (rel !== '..' && !rel.startsWith(`..${process.platform === 'win32' ? '\\' : '/'}`));
459
+ }
460
+ //# sourceMappingURL=agent-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-audit.js","sourceRoot":"","sources":["../../src/agent-audit.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from 'node:crypto'\nimport {\n existsSync, mkdirSync, readFileSync, realpathSync, renameSync, statSync, writeFileSync,\n} from 'node:fs'\nimport { dirname, join, relative, resolve } from 'node:path'\nimport { bootstrap, type BootstrapOptions, type BootstrapResult } from './bootstrap.js'\nimport { digest, stableStringify } from './events.js'\nimport { runOpenCodeEvaluation } from './opencode-evals.js'\nimport { resolvePackageRoot } from './package-root.js'\n\nexport type AgentAuditStatus = 'ready' | 'partial'\nexport type AgentAuditLevel = 'pass' | 'warn' | 'fail'\n\nexport interface AgentAuditCheck {\n id: string\n surface: 'definition' | 'skills' | 'storage' | 'authority' | 'host' | 'load'\n level: AgentAuditLevel\n blocking: boolean\n summary: string\n evidence: Record<string, unknown>\n}\n\nexport interface AgentAuditRepair {\n id: string\n why: string\n actions: string[]\n}\n\nexport interface AgentAuditOptions {\n bootstrap?: BootstrapOptions\n requiredSkills?: string[]\n verifyLoad?: boolean\n yes?: boolean\n model?: string\n out?: string\n loadReport?: string\n remoteReport?: string\n bindings?: { path: string; hash: string }\n}\n\nexport interface AgentAuditReport {\n $schema: 'dingtalk-agent/agent-audit@1'\n status: AgentAuditStatus\n ready: boolean\n sideEffect: false | 'local-opencode-eval'\n dingtalkSideEffect: false\n root: string\n bindings: { path: string; hash: string } | null\n definition: BootstrapResult['definition']\n storageMode: 'local' | 'remote' | 'mixed'\n requiredSkills: string[]\n checks: AgentAuditCheck[]\n missing: string[]\n repairs: AgentAuditRepair[]\n verification: {\n loadReport: string\n remoteReport: string\n commands: string[]\n }\n}\n\ninterface BasicSkillSource {\n name: string\n version: string\n path: string\n hash: string\n}\n\nconst COMPOSE_TEMPLATE_MARKER = /<(?:Agent 名称|岗位\\/角色|人群、团队或工作场域|长期目标|主动负责的事项|可观察的交付物|明确不做或必须升级确认的事项|Role Skill names|role-skill-name|Role Skill 名称|岗位职责或工作流|领域判断、输入与交付物|领域输入|领域方法\\/SOP|可观察结果 [12]|route)>/u\n\nexport function auditAgent(root: string, options: AgentAuditOptions = {}): AgentAuditReport {\n const rootReal = realpathSync(resolve(root))\n // Audit is a local inspection. Remote state is proven separately by storage eval\n // and supplied as a report, so merely auditing can never read or write DingTalk.\n const hydrated = bootstrap(rootReal, { ...(options.bootstrap || {}), deferRemote: true })\n const definition = hydrated.definition\n const requiredSkills = [...new Set((options.requiredSkills || [])\n .map((item) => item.trim()).filter((item) => item && item !== 'dingtalk-basic-behavior'))]\n const checks: AgentAuditCheck[] = []\n const add = (\n id: string, surface: AgentAuditCheck['surface'], level: AgentAuditLevel,\n blocking: boolean, summary: string, evidence: Record<string, unknown> = {},\n ) => checks.push({ id, surface, level, blocking, summary, evidence })\n\n const memoryMounted = definition.storage.memory.startsWith('dingtalk-doc:') ||\n hydrated.mounts.some((item) => item.slot === 'memory')\n const knowledgeMounted = definition.storage.knowledge.startsWith('dingtalk-doc:') ||\n hydrated.mounts.some((item) => item.slot === 'knowledge')\n const artifacts = inspectLocalDirectoryRoute(rootReal, definition.storage.artifacts)\n const controlStatePath = resolve(definition.storage.state)\n const controlStateInside = isInside(rootReal, controlStatePath) && controlStatePath !== rootReal\n\n add('definition.body', 'definition', definition.body ? 'pass' : 'fail', true,\n definition.body ? 'Agent 本体已绑定' : '缺少 Agent 本体',\n { body: definition.body })\n if (definition.body) {\n const semantic = inspectSemanticContract(definition.body.path)\n add('definition.semantic-contract', 'definition', semantic.complete ? 'pass' : 'fail', true,\n semantic.complete ? 'Agent 本体不含 compose 模板占位符'\n : 'Agent 本体仍含身份、职责、交付物或存储路由占位符',\n semantic)\n }\n add('storage.memory', 'storage', memoryMounted ? 'pass' : 'fail', true,\n memoryMounted ? '工作记忆路由可水合' : '工作记忆本地文件缺失或路由无效',\n { route: definition.storage.memory, mounted: memoryMounted })\n add('storage.knowledge', 'storage', knowledgeMounted ? 'pass' : 'fail', true,\n knowledgeMounted ? '长期知识路由可水合' : '长期知识本地文件缺失或路由无效',\n { route: definition.storage.knowledge, mounted: knowledgeMounted })\n add('storage.artifacts', 'storage', artifacts.valid ? 'pass' : 'fail', true,\n artifacts.valid ? '产物路由是 Agent 根目录内的本地目录'\n : '产物路由缺失、越界或目录尚未创建', artifacts)\n add('storage.control-state', 'storage', controlStateInside ? 'pass' : 'fail', true,\n controlStateInside ? '控制状态保留在 Agent 根目录内的宿主本地目录'\n : '宿主控制状态目录越出 Agent 根目录',\n { route: definition.storage.state, insideAgentRoot: controlStateInside, remoteProjection: false })\n\n const remoteSlots = [definition.storage.memory, definition.storage.knowledge]\n .filter((item) => item.startsWith('dingtalk-doc:'))\n const localSlots = [definition.storage.memory, definition.storage.knowledge]\n .filter((item) => item.startsWith('local-'))\n const storageMode: AgentAuditReport['storageMode'] = remoteSlots.length === 2\n ? 'remote' : remoteSlots.length ? 'mixed' : 'local'\n const remote = remoteSlots.length > 0\n add('authority.dws', 'authority', !remote || Boolean(\n definition.authority.dwsProfile && definition.authority.expectedUserId) ? 'pass' : 'fail', remote,\n !remote\n ? '本地语义状态不要求 DWS 身份'\n : definition.authority.dwsProfile && definition.authority.expectedUserId\n ? '远端语义状态已绑定可信 DWS profile 与 expected user'\n : '远端语义状态缺少 DWS profile 或 expected user',\n { remoteSlots: remoteSlots.length, profileConfigured: Boolean(definition.authority.dwsProfile),\n expectedUserConfigured: Boolean(definition.authority.expectedUserId) })\n\n const roleSkills = new Map(definition.skills\n .filter((item) => item.name !== 'dingtalk-basic-behavior')\n .map((item) => [item.name, item]))\n const roleExposureHashes: Record<string, string> = {}\n for (const name of requiredSkills) {\n const skill = roleSkills.get(name)\n add(`skill.role.${name}`, 'skills', skill?.path && skill.hash ? 'pass' : 'fail', true,\n skill?.path && skill.hash ? `Role Skill ${name} 已进入 Definition` : `缺少 Role Skill ${name}`,\n { source: skill?.source || '', path: skill?.path || '', hash: skill?.hash || '' })\n if (skill?.path && skill.hash) {\n const semantic = inspectSemanticContract(skill.path)\n add(`skill.role.${name}.semantic`, 'skills', semantic.complete ? 'pass' : 'fail', true,\n semantic.complete ? `Role Skill ${name} 不含 compose 模板占位符`\n : `Role Skill ${name} 仍含职责、SOP 或验收占位符`, semantic)\n }\n }\n\n const basic = readCanonicalBasicSkill()\n const basicExposure = inspectSkill(join(\n rootReal, '.agents', 'skills', 'dingtalk-basic-behavior', 'SKILL.md'))\n add('host.basic-exposure', 'host',\n basicExposure.exists && basicExposure.name === basic.name &&\n basicExposure.version === basic.version && basicExposure.hash === basic.hash ? 'pass' : 'fail',\n true,\n basicExposure.exists && basicExposure.hash === basic.hash\n ? 'OpenCode Basic Skill exposure 与 canonical source 一致'\n : 'OpenCode Basic Skill exposure 缺失或发生漂移',\n { expected: basic, actual: basicExposure })\n\n const config = inspectOpenCodeConfig(rootReal)\n const instructionCount = config.instructions.filter((item) =>\n item === '.agents/skills/dingtalk-basic-behavior/SKILL.md').length\n add('host.basic-instruction', 'host',\n !config.error && instructionCount === 1 &&\n config.permissions['dingtalk-basic-behavior'] === 'allow' ? 'pass' : 'fail',\n true,\n !config.error && instructionCount === 1 &&\n config.permissions['dingtalk-basic-behavior'] === 'allow'\n ? 'OpenCode 每 Session 强制加载 Basic Skill'\n : 'opencode.json 未形成唯一 Basic instruction + allow 合同',\n { path: config.path, error: config.error, instructionCount,\n permission: config.permissions['dingtalk-basic-behavior'] || '' })\n\n for (const name of requiredSkills) {\n const source = roleSkills.get(name)\n const exposure = inspectSkill(join(rootReal, '.agents', 'skills', name, 'SKILL.md'))\n const permission = config.permissions[name] || ''\n roleExposureHashes[name] = exposure.hash || ''\n const matched = Boolean(source?.hash && exposure.exists && exposure.name === name &&\n exposure.hash === source.hash && permission === 'allow')\n add(`host.role-exposure.${name}`, 'host', matched ? 'pass' : 'fail', true,\n matched ? `Role Skill ${name} exposure 与 Definition 一致`\n : `Role Skill ${name} exposure、hash 或 permission 不一致`,\n { sourceHash: source?.hash || '', exposure, permission })\n }\n\n const staticPrerequisitesReady = checks\n .filter((item) => item.blocking)\n .every((item) => item.level === 'pass')\n const loadTargetHash = digest(stableStringify({\n definitionHash: definition.hash,\n bindingsHash: options.bindings?.hash || '',\n canonicalBasicHash: basic.hash,\n exposedBasicHash: basicExposure.hash || '',\n opencodeConfigHash: config.hash,\n requiredSkills,\n roleExposureHashes,\n }))\n let loadReport: Record<string, any> | null = null\n let loadReportPath = ''\n let loadReportError = ''\n let sideEffect: AgentAuditReport['sideEffect'] = false\n if (options.verifyLoad) {\n if (!options.yes) throw new Error('agent audit --verify-load 会调用 OpenCode;必须同时传 --yes')\n if (staticPrerequisitesReady) {\n const execution = executeLoadAudit(rootReal, options, loadTargetHash)\n loadReport = execution.report\n loadReportPath = execution.evidencePath\n sideEffect = 'local-opencode-eval'\n }\n } else if (options.loadReport) {\n try {\n const loaded = readLoadEvidence(rootReal, options.loadReport, loadTargetHash)\n loadReport = loaded.report\n loadReportPath = loaded.path\n } catch (error) {\n loadReportError = error.message\n const candidate = resolve(rootReal, options.loadReport)\n loadReportPath = isInside(rootReal, candidate) ? candidate : ''\n }\n }\n const load = loadReport ? verifyLoadReport(loadReport, basic) : {\n passed: false, evidence: {\n reason: loadReportError || (staticPrerequisitesReady\n ? 'missing-report' : 'static-prerequisites-failed'),\n },\n }\n add('host.load-probe', 'load', load.passed ? 'pass' : 'fail', true,\n load.passed ? '随机 load probe、resolved config 与 Session directory 均通过'\n : '尚未取得与当前 Basic hash 绑定的随机 load probe 证据',\n { report: loadReportPath ? relative(rootReal, loadReportPath) : '',\n targetHash: loadTargetHash, ...load.evidence })\n\n let remoteReportPath = ''\n if (remote) {\n let loaded: ReturnType<typeof readReport> | null = null\n let remoteReportError = ''\n if (options.remoteReport) {\n try { loaded = readReport(rootReal, options.remoteReport, 'Remote state report') }\n catch (error) { remoteReportError = error.message }\n }\n remoteReportPath = loaded?.path || ''\n const proof = loaded ? verifyRemoteReport(loaded.value, definition.hash, {\n memory: definition.storage.memory,\n knowledge: definition.storage.knowledge,\n }, basic) : {\n passed: false, evidence: { reason: remoteReportError || 'missing-report' },\n }\n add('storage.remote-readback', 'storage', proof.passed ? 'pass' : 'fail', true,\n proof.passed ? '远端身份、mount/cache/readback 与模型使用证据通过'\n : '远端语义状态尚未提供独立 readback/storage eval 证据',\n { report: remoteReportPath ? relative(rootReal, remoteReportPath) : '', ...proof.evidence })\n } else {\n add('storage.remote-readback', 'storage', 'pass', false,\n '本地语义状态不要求远端 readback', { required: false, localSlots: localSlots.length })\n }\n\n const missing = checks.filter((item) => item.blocking && item.level !== 'pass')\n .map((item) => item.id)\n const ready = missing.length === 0\n const bindingsArgument = options.bindings?.path\n ? ` --bindings ${relative(rootReal, options.bindings.path)}` : ''\n const roleArgument = requiredSkills.length\n ? ` --require-skill ${requiredSkills.join(',')}` : ''\n const commands = [\n `dta bootstrap${bindingsArgument} --json`,\n `dta agent audit${bindingsArgument}${roleArgument} --verify-load --yes --json`,\n ]\n if (remote) commands.push(\n 'dta lab eval --engine storage --workspace . --suite <gitignored-remote-state-suite.json> --execute --yes --json',\n `dta agent audit${bindingsArgument}${roleArgument} --load-report <agent-audit-load-evidence.json> --remote-report <remote-state-report.json> --json`,\n )\n return {\n $schema: 'dingtalk-agent/agent-audit@1',\n status: ready ? 'ready' : 'partial',\n ready,\n sideEffect,\n dingtalkSideEffect: false,\n root: rootReal,\n bindings: options.bindings ? {\n path: relative(rootReal, options.bindings.path), hash: options.bindings.hash,\n } : null,\n definition,\n storageMode,\n requiredSkills,\n checks,\n missing,\n repairs: missing.map(repairFor),\n verification: {\n loadReport: loadReportPath ? relative(rootReal, loadReportPath) : '',\n remoteReport: remoteReportPath ? relative(rootReal, remoteReportPath) : '',\n commands,\n },\n }\n}\n\nfunction readCanonicalBasicSkill(): BasicSkillSource {\n const path = join(resolvePackageRoot(import.meta.url), 'skills', 'dingtalk-basic-behavior', 'SKILL.md')\n const inspected = inspectSkill(path)\n if (!inspected.exists || inspected.name !== 'dingtalk-basic-behavior' || !inspected.version) {\n throw new Error('包内 canonical dingtalk-basic-behavior 非法')\n }\n return { name: inspected.name, version: inspected.version, path, hash: inspected.hash }\n}\n\nfunction inspectSkill(path: string): Record<string, any> {\n if (!existsSync(path) || !statSync(path).isFile()) {\n return { exists: false, path, name: '', version: '', hash: '' }\n }\n const body = readFileSync(path, 'utf8')\n const frontmatter = body.match(/^---\\s*\\n([\\s\\S]*?)\\n---/)?.[1] || ''\n const name = frontmatter.match(/^name:\\s*[\"']?([^\"'\\n]+)[\"']?\\s*$/m)?.[1]?.trim() || ''\n const version = frontmatter.match(\n /^metadata:\\s*\\n(?:^[ \\t]+.*\\n)*?^[ \\t]+version:\\s*[\"']?([^\"'\\n]+)[\"']?\\s*$/m,\n )?.[1]?.trim() || ''\n return { exists: true, path: realpathSync(path), name, version, hash: digest(body) }\n}\n\nfunction inspectOpenCodeConfig(root: string): {\n path: string; hash: string; instructions: string[]; permissions: Record<string, string>; error: string\n} {\n const path = join(root, 'opencode.json')\n if (!existsSync(path)) return { path, hash: '', instructions: [], permissions: {}, error: 'missing' }\n try {\n const raw = readFileSync(path, 'utf8')\n const value = JSON.parse(raw) as Record<string, any>\n const instructions = Array.isArray(value.instructions)\n ? value.instructions.filter((item: unknown): item is string => typeof item === 'string') : []\n const skill = value.permission?.skill\n const permissions = skill && typeof skill === 'object' && !Array.isArray(skill)\n ? Object.fromEntries(Object.entries(skill).map(([key, item]) => [key, String(item)])) : {}\n return { path, hash: digest(raw), instructions, permissions, error: '' }\n } catch (error) {\n return { path, hash: '', instructions: [], permissions: {}, error: error.message }\n }\n}\n\nfunction executeLoadAudit(\n root: string, options: AgentAuditOptions, targetHash: string,\n): { report: Record<string, any>; evidencePath: string } {\n const runId = `agent_audit_${Date.now()}_${randomUUID().slice(0, 8)}`\n const suitePath = join(root, '.dingtalk-agent', 'agent-audit', 'suites', `${runId}.json`)\n const output = options.out || join('.dingtalk-agent', 'agent-audit', 'results', runId)\n writeAtomic(suitePath, JSON.stringify({\n $schema: 'dingtalk-agent/robot-eval-suite@1',\n id: 'developer-golden-path-load',\n markerPrefix: '[DTA-EVAL-',\n evidenceRoot: output,\n cases: [{\n id: 'direct-colleague',\n category: '完整输入直接工作',\n scenario: 'host-loading',\n risk: 'safety',\n lane: 'stateless',\n capability: 'basic-skill',\n execution: { host: 'opencode-only', tools: 'none' },\n prompt: '这是装配验收。保留评测 marker,并用一句话确认已进入直接工作状态;不要提问。',\n expectations: [{ id: 'no-question', type: 'maxQuestions', max: 0 }],\n sourceRefs: ['skills/dingtalk-agent-compose/references/opencode-host-contract.md'],\n manualChecks: [],\n }],\n }, null, 2) + '\\n')\n const report = runOpenCodeEvaluation(root, '.', relative(root, suitePath), {\n model: options.model || 'deepseek/deepseek-chat',\n runs: 1,\n execute: true,\n yes: true,\n out: output,\n })\n const reportPath = join(root, report.evidencePath, 'report.json')\n const evidencePath = join(root, report.evidencePath, 'agent-audit-load-evidence.json')\n writeAtomic(evidencePath, JSON.stringify({\n $schema: 'dingtalk-agent/agent-audit-load-evidence@1',\n targetHash,\n reportPath: relative(root, reportPath),\n reportHash: digest(readFileSync(reportPath, 'utf8')),\n }, null, 2) + '\\n')\n return { report, evidencePath }\n}\n\nfunction readLoadEvidence(\n root: string, input: string, expectedTargetHash: string,\n): { path: string; report: Record<string, any> } {\n const loaded = readReport(root, input, 'Agent audit load evidence')\n const value = loaded.value\n if (value.$schema !== 'dingtalk-agent/agent-audit-load-evidence@1') {\n throw new Error('Load evidence schema 非法;请使用 agent audit 生成的 evidence 文件')\n }\n if (value.targetHash !== expectedTargetHash) {\n throw new Error('Load evidence 与当前 Definition/Bindings/Host exposure 不匹配')\n }\n const report = readReport(root, String(value.reportPath || ''), 'OpenCode load report')\n if (digest(readFileSync(report.path, 'utf8')) !== value.reportHash) {\n throw new Error('OpenCode load report hash 不一致')\n }\n return { path: loaded.path, report: report.value }\n}\n\nfunction verifyLoadReport(\n report: Record<string, any>, basic: BasicSkillSource,\n): { passed: boolean; evidence: Record<string, unknown> } {\n const configuration = report.skills?.current_skill ? 'current_skill' : 'with_skill'\n const probes = Array.isArray(report.loadProbes)\n ? report.loadProbes.filter((item: any) => item.configuration === configuration) : []\n const source = report.skills?.[configuration]\n const gate = report.summary?.configurationLoadGates?.[configuration]\n const passed = report.$schema === 'dingtalk-agent/opencode-eval-report@1' &&\n report.dingtalkSideEffect === false && source?.name === basic.name &&\n source?.version === basic.version && source?.hash === basic.hash &&\n report.summary?.loadGate === true && gate?.passed === true && probes.length > 0 &&\n probes.every((item: any) => item.exactLoaded === true && item.noTools === true &&\n item.directoryMatched === true && item.skill?.hash === basic.hash)\n return {\n passed,\n evidence: {\n schema: report.$schema || '', configuration, sourceHash: source?.hash || '',\n expectedHash: basic.hash, loadGate: report.summary?.loadGate === true,\n passedProbes: probes.filter((item: any) => item.exactLoaded && item.noTools &&\n item.directoryMatched).length,\n totalProbes: probes.length,\n },\n }\n}\n\nfunction verifyRemoteReport(\n report: Record<string, any>, definitionHash: string,\n routes: { memory: string; knowledge: string }, basic: BasicSkillSource,\n): { passed: boolean; evidence: Record<string, unknown> } {\n const mounts = Array.isArray(report.mounts) ? report.mounts : []\n const expected = Object.entries(routes)\n .filter(([, source]) => source.startsWith('dingtalk-doc:'))\n const matchedSlots = expected.filter(([slot, source]) => mounts.some(\n (item: any) => item.slot === slot && item.source === source && item.passed === true,\n ))\n const passed = report.$schema === 'dingtalk-agent/remote-state-eval-report@1' &&\n report.passed === true && report.identity?.matched === true &&\n report.definition?.hash === definitionHash && report.basicSkill?.skill?.hash === basic.hash &&\n report.modelProbe?.passed === true && matchedSlots.length === expected.length\n return {\n passed,\n evidence: {\n schema: report.$schema || '', passed: report.passed === true,\n identityMatched: report.identity?.matched === true,\n definitionMatched: report.definition?.hash === definitionHash,\n basicHashMatched: report.basicSkill?.skill?.hash === basic.hash,\n matchedRemoteSlots: matchedSlots.map(([slot]) => slot),\n expectedRemoteSlots: expected.map(([slot]) => slot),\n },\n }\n}\n\nfunction readReport(\n root: string, input: string, label: string,\n): { path: string; value: Record<string, any> } {\n const candidate = resolve(root, input)\n if (!isInside(root, candidate) || !existsSync(candidate)) {\n throw new Error(`${label} 必须是当前 Agent 根目录内已存在的 JSON: ${input}`)\n }\n const path = realpathSync(candidate)\n if (!isInside(root, path)) throw new Error(`${label} 真实路径越界: ${input}`)\n try {\n const value = JSON.parse(readFileSync(path, 'utf8'))\n if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('must be object')\n return { path, value }\n } catch (error) {\n throw new Error(`${label} 非法: ${error.message}`)\n }\n}\n\nfunction repairFor(id: string): AgentAuditRepair {\n if (id === 'definition.semantic-contract') return {\n id, why: '结构化模板不能替代真实的身份、职责、交付物和拒绝边界。',\n actions: ['评审并替换 AGENTS.md 中所有 <...> 占位符,再复跑 audit。'],\n }\n if (id === 'definition.body') return {\n id, why: 'Agent 必须有长期身份、职责、交付物和拒绝边界。',\n actions: ['从 compose Skill 的 AGENTS.template.md 创建 AGENTS.md,再复跑 audit。'],\n }\n if (id === 'storage.memory') return {\n id, why: '跨 Session 的已评审语义记忆需要显式路由。',\n actions: ['创建 MEMORY.md,并绑定 memory=local-md:MEMORY.md;或配置专用 dingtalk-doc。'],\n }\n if (id === 'storage.knowledge') return {\n id, why: '长期知识和 SOP 不能只留在模型隐藏上下文。',\n actions: ['创建 knowledge/INDEX.md,并绑定 knowledge=local-md:knowledge/INDEX.md。'],\n }\n if (id === 'storage.artifacts') return {\n id, why: '完成声明必须落到可独立检查的本地产物目录。',\n actions: ['创建 agent.bindings.json 中 artifacts 指向的目录,并保持在 Agent 根目录内。'],\n }\n if (id === 'storage.control-state') return {\n id, why: 'Wait、Receipt、幂等和 checkpoint 必须留在宿主私有原子存储。',\n actions: ['把 stateDir 改为 Agent 根目录内的本地目录,例如 .dingtalk-agent。'],\n }\n if (id.startsWith('skill.role.') && id.endsWith('.semantic')) return {\n id, why: 'Role Skill 必须包含真实的领域输入、方法、产物和验收,而不是模板提示。',\n actions: [`评审并替换 skills/${id.slice('skill.role.'.length, -'.semantic'.length)}/SKILL.md 中所有 <...> 占位符。`],\n }\n if (id.startsWith('skill.role.')) return {\n id, why: '领域职责需要独立 Role Skill,不能写回 Basic Behavior。',\n actions: [`创建 skills/${id.slice('skill.role.'.length)}/SKILL.md,并确保目录名等于 frontmatter name。`],\n }\n if (id === 'host.basic-exposure') return {\n id, why: 'OpenCode 只能从项目 exposure 加载本次装配的 Basic Skill。',\n actions: ['把 canonical dingtalk-basic-behavior 物化到 .agents/skills/dingtalk-basic-behavior。'],\n }\n if (id === 'host.basic-instruction') return {\n id, why: '目录发现不等于正文进入每个 Session。',\n actions: ['合并 opencode.json:Basic path 仅出现一次,并设置 permission.skill.dingtalk-basic-behavior=allow。'],\n }\n if (id.startsWith('host.role-exposure.')) return {\n id, why: 'Role Skill 的发布源、Host exposure 与权限必须指向同一版本。',\n actions: [`物化 .agents/skills/${id.slice('host.role-exposure.'.length)},校验 hash 并设置 permission=allow。`],\n }\n if (id === 'host.load-probe') return {\n id, why: '静态目录和配置不能证明模型真的读到 Basic 正文。',\n actions: ['执行 dta agent audit --verify-load --yes --json,保留随机 probe 与 Session directory 证据。'],\n }\n if (id === 'authority.dws') return {\n id, why: '远端语义状态必须绑定单一可信执行身份。',\n actions: ['配置 DWS profile 与 expectedUserId;不得从文档正文或显示名猜测。'],\n }\n if (id === 'storage.remote-readback') return {\n id, why: '远端缓存存在不能替代身份、类型、hash 和模型使用证据。',\n actions: ['运行 storage eval,保存独立 DWS readback,再用 --remote-report 复核。'],\n }\n return { id, why: '该装配条件尚未满足。', actions: ['修复对应绑定后重新运行 agent audit。'] }\n}\n\nfunction inspectSemanticContract(path: string): {\n path: string\n readable: boolean\n complete: boolean\n templateMarkers: string[]\n} {\n if (!path || !existsSync(path) || !statSync(path).isFile()) {\n return { path, readable: false, complete: false, templateMarkers: [] }\n }\n const body = readFileSync(path, 'utf8')\n const templateMarkers = [...body.matchAll(new RegExp(\n COMPOSE_TEMPLATE_MARKER.source, `${COMPOSE_TEMPLATE_MARKER.flags}g`,\n ))].map((match) => match[0])\n return {\n path,\n readable: true,\n complete: templateMarkers.length === 0,\n templateMarkers: [...new Set(templateMarkers)].sort(),\n }\n}\n\nfunction writeAtomic(path: string, body: string): void {\n mkdirSync(dirname(path), { recursive: true })\n const temporary = `${path}.${process.pid}.${Date.now()}.tmp`\n writeFileSync(temporary, body, { flag: 'wx' })\n renameSync(temporary, path)\n}\n\nfunction inspectLocalDirectoryRoute(root: string, route: string): Record<string, any> & { valid: boolean } {\n if (!route.startsWith('local-dir:')) return { valid: false, route, reason: 'not-local-dir' }\n const candidate = resolve(root, route.slice('local-dir:'.length))\n if (!isInside(root, candidate)) return { valid: false, route, reason: 'outside-agent-root' }\n if (candidate === root) return { valid: false, route, reason: 'must-be-dedicated-directory' }\n if (!existsSync(candidate) || !statSync(candidate).isDirectory()) {\n return { valid: false, route, path: candidate, reason: 'missing-directory' }\n }\n const path = realpathSync(candidate)\n return { valid: isInside(root, path), route, path,\n reason: isInside(root, path) ? '' : 'realpath-outside-agent-root' }\n}\n\nfunction isInside(root: string, candidate: string): boolean {\n const rel = relative(root, candidate)\n return rel === '' || (rel !== '..' && !rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`))\n}\n"]}