@xdxer/dingtalk-agent 0.1.4 → 0.1.5-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 (186) hide show
  1. package/CHANGELOG.md +232 -0
  2. package/README.en.md +115 -89
  3. package/README.md +111 -86
  4. package/dist/bin/dingtalk-agent.js +742 -152
  5. package/dist/bin/dingtalk-agent.js.map +1 -1
  6. package/dist/src/actions.js +3 -2
  7. package/dist/src/actions.js.map +1 -1
  8. package/dist/src/agent-audit.js +202 -85
  9. package/dist/src/agent-audit.js.map +1 -1
  10. package/dist/src/agent-definition.js +7 -3
  11. package/dist/src/agent-definition.js.map +1 -1
  12. package/dist/src/agent-enhance.js +51 -32
  13. package/dist/src/agent-enhance.js.map +1 -1
  14. package/dist/src/agent-platform.js +4 -4
  15. package/dist/src/agent-platform.js.map +1 -1
  16. package/dist/src/bootstrap.js +6 -2
  17. package/dist/src/bootstrap.js.map +1 -1
  18. package/dist/src/development-workspace.js +210 -34
  19. package/dist/src/development-workspace.js.map +1 -1
  20. package/dist/src/doctor.js +65 -9
  21. package/dist/src/doctor.js.map +1 -1
  22. package/dist/src/dws.js +67 -3
  23. package/dist/src/dws.js.map +1 -1
  24. package/dist/src/init.js +2 -1
  25. package/dist/src/init.js.map +1 -1
  26. package/dist/src/memory/noop-receipt.js +306 -0
  27. package/dist/src/memory/noop-receipt.js.map +1 -0
  28. package/dist/src/memory/operational.js +27 -3
  29. package/dist/src/memory/operational.js.map +1 -1
  30. package/dist/src/memory/remote-state.js +2 -1
  31. package/dist/src/memory/remote-state.js.map +1 -1
  32. package/dist/src/multica-deploy.js +692 -125
  33. package/dist/src/multica-deploy.js.map +1 -1
  34. package/dist/src/multica-provider.js +303 -25
  35. package/dist/src/multica-provider.js.map +1 -1
  36. package/dist/src/multica-runtime-vocabulary.js +110 -0
  37. package/dist/src/multica-runtime-vocabulary.js.map +1 -0
  38. package/dist/src/opencode-evals.js +6 -6
  39. package/dist/src/opencode-evals.js.map +1 -1
  40. package/dist/src/opencode-provider.js +21 -7
  41. package/dist/src/opencode-provider.js.map +1 -1
  42. package/dist/src/opencode-workspace.js +3 -3
  43. package/dist/src/opencode-workspace.js.map +1 -1
  44. package/dist/src/personal-event-evals.js +4 -2
  45. package/dist/src/personal-event-evals.js.map +1 -1
  46. package/dist/src/promotion.js +2 -1
  47. package/dist/src/promotion.js.map +1 -1
  48. package/dist/src/remote-semantic-state-live-evals.js +14 -8
  49. package/dist/src/remote-semantic-state-live-evals.js.map +1 -1
  50. package/dist/src/remote-state-evals.js +2 -2
  51. package/dist/src/remote-state-evals.js.map +1 -1
  52. package/dist/src/robot-evals.js +3 -3
  53. package/dist/src/robot-evals.js.map +1 -1
  54. package/dist/src/schedule-plan.js +380 -0
  55. package/dist/src/schedule-plan.js.map +1 -0
  56. package/dist/src/sessions.js +1 -1
  57. package/dist/src/sessions.js.map +1 -1
  58. package/dist/src/skill-manager.js +145 -13
  59. package/dist/src/skill-manager.js.map +1 -1
  60. package/dist/src/skills.js +2 -0
  61. package/dist/src/skills.js.map +1 -1
  62. package/dist/src/tui.js +369 -0
  63. package/dist/src/tui.js.map +1 -0
  64. package/dist/src/upgrade.js +113 -33
  65. package/dist/src/upgrade.js.map +1 -1
  66. package/dist/src/waits.js +2 -1
  67. package/dist/src/waits.js.map +1 -1
  68. package/dist/src/workspace.js +12 -7
  69. package/dist/src/workspace.js.map +1 -1
  70. package/docs/AGENT-IN-PRODUCTION.md +255 -0
  71. package/docs/ARCHITECTURE.md +366 -0
  72. package/docs/INSTALLATION.md +8 -8
  73. package/docs/PLATFORM-GUARDRAILS.md +188 -0
  74. package/docs/PRIOR-ART.md +126 -0
  75. package/docs/SELF-TEST.md +182 -0
  76. package/docs/architecture/agent-platform-connection-layer.svg +120 -0
  77. package/docs/architecture/digital-employee-composition.svg +92 -0
  78. package/docs/architecture/dingtalk-agent-architecture.svg +125 -0
  79. package/docs/assets/digital-employee-at-work.svg +77 -0
  80. package/docs/schemas/multica-deployment-plan.schema.json +3 -1
  81. package/docs/schemas/multica-deployment-receipt.schema.json +17 -3
  82. package/docs/schemas/multica-deployment-status.schema.json +6 -2
  83. package/docs/schemas/multica-workspace-inspection.schema.json +16 -0
  84. package/docs/schemas/multica-workspace-run-plan.schema.json +31 -0
  85. package/docs/schemas/multica-workspace-run.schema.json +161 -0
  86. package/docs/schemas/multica-workspace-status.schema.json +2 -0
  87. package/docs/schemas/project.schema.json +54 -3
  88. package/docs/schemas/workspace-scaffold.schema.json +38 -0
  89. package/examples/agents/README.md +45 -0
  90. package/examples/agents/fde-coach/AGENTS.md +2 -25
  91. package/examples/agents/fde-coach/agent/AGENTS.md +35 -0
  92. package/examples/agents/fde-coach/agent.bindings.json +10 -0
  93. package/examples/agents/release-manager/AGENTS.md +2 -25
  94. package/examples/agents/release-manager/agent/AGENTS.md +35 -0
  95. package/examples/agents/release-manager/agent.bindings.json +10 -0
  96. package/lab/agent-eval/catalog.json +5 -5
  97. package/lab/agent-eval/classic-failures.json +4 -4
  98. package/lab/agent-eval/completion-gate-regression.json +9 -9
  99. package/lab/agent-eval/personal-event-live.example.json +3 -3
  100. package/lab/agent-eval/remote-semantic-state-live.example.json +1 -1
  101. package/lab/agent-eval/workspace/opencode.json +2 -2
  102. package/lab/project-workspace/fake-multica-provider.mjs +171 -17
  103. package/lab/project-workspace/multica-deploy.fixture.json +2 -2
  104. package/lab/project-workspace/multica-readonly.fixture.json +4 -16
  105. package/lab/project-workspace/opencode-provider-suite.json +3 -3
  106. package/lab/project-workspace/project.fixture.json +2 -6
  107. package/lab/robot-eval/suite.json +1 -1
  108. package/lab/robot-eval/workspace/AGENTS.md +1 -1
  109. package/lab/robot-eval/workspace/opencode.json +2 -2
  110. package/lab/schemas/personal-event-eval.schema.json +1 -1
  111. package/package.json +18 -11
  112. package/skills/README.md +10 -8
  113. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/SKILL.md +49 -24
  114. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/AGENTS.template.md +1 -1
  115. package/skills/core/dta-agent-compose/assets/REPOSITORY.template.md +10 -0
  116. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/agent.bindings.dingtalk-doc.template.json +2 -2
  117. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/agent.bindings.local.template.json +2 -2
  118. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/hosts/opencode/opencode.template.json +3 -2
  119. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/evals/evals.json +4 -4
  120. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/agent-definition-contract.md +7 -7
  121. package/skills/core/dta-agent-compose/references/drive-and-schedules.md +166 -0
  122. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/host-loading-contract.md +11 -13
  123. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/hosts/claude-code.md +13 -12
  124. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/hosts/opencode.md +14 -13
  125. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/SKILL.md +28 -3
  126. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/assets/eval-catalog.template.json +1 -1
  127. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/evals/evals.json +1 -1
  128. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/eval-topology.md +3 -3
  129. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/interactive-debug-channels.md +10 -4
  130. package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/SKILL.md +21 -5
  131. package/skills/core/dta-basic-behavior/references/event-to-behavior.md +38 -0
  132. package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/memory-and-evolution.md +3 -1
  133. package/skills/core/dta-basic-behavior/references/perception-and-gates.md +87 -0
  134. package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/risk-authority-and-privacy.md +12 -0
  135. package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/truth-and-recovery.md +4 -2
  136. package/skills/core/dta-people-group-memory/COMPLETENESS.md +36 -0
  137. package/skills/core/dta-people-group-memory/SKILL.md +69 -0
  138. package/skills/core/dta-people-group-memory/references/adapters.md +273 -0
  139. package/skills/core/dta-people-group-memory/references/assembly-guidance.md +40 -0
  140. package/skills/core/dta-people-group-memory/references/binding.md +110 -0
  141. package/skills/core/dta-people-group-memory/references/cold-start.md +70 -0
  142. package/skills/core/dta-people-group-memory/references/config-binding.md +89 -0
  143. package/skills/core/dta-people-group-memory/references/consent-and-visibility.md +83 -0
  144. package/skills/core/dta-people-group-memory/references/consolidation.md +162 -0
  145. package/skills/core/dta-people-group-memory/references/event-ingest.md +103 -0
  146. package/skills/core/dta-people-group-memory/references/guided-setup.md +70 -0
  147. package/skills/core/dta-people-group-memory/references/model.md +148 -0
  148. package/skills/core/dta-people-group-memory/references/storage-port.md +107 -0
  149. package/skills/platforms/deap/PLATFORM.md +30 -1
  150. package/skills/platforms/multica-dingtalk/PLATFORM.md +35 -9
  151. package/skills/platforms/multica-dingtalk/{dingtalk-agent-deploy-multica → dta-deploy-multica}/SKILL.md +10 -8
  152. package/skills/platforms/multica-dingtalk/dta-deploy-multica/references/multica-deployment-contract.md +67 -0
  153. package/skills/platforms/multica-dingtalk/{multica-external → dta-ops-multica}/SKILL.md +81 -11
  154. package/skills/platforms/multica-dingtalk/{multica-external → dta-ops-multica}/scripts/bootstrap.sh +2 -2
  155. package/skills/platforms/multica-dingtalk/{multica-external → dta-ops-multica}/scripts/multica_ext.py +264 -16
  156. package/dist/src/map.js +0 -157
  157. package/dist/src/map.js.map +0 -1
  158. package/docs/SECOND-AGENT-ACCEPTANCE.md +0 -62
  159. package/docs/architecture/agent-memory-topology.png +0 -0
  160. package/docs/architecture/agent-memory-topology.svg +0 -132
  161. package/docs/architecture/dingtalk-agent-blueprint.png +0 -0
  162. package/docs/architecture/durable-async-agent-runtime.png +0 -0
  163. package/docs/architecture/general-agent-kernel-topology.png +0 -0
  164. package/docs/architecture/provider-bound-development-workspace.png +0 -0
  165. package/docs/architecture/task-completion-gate.png +0 -0
  166. package/docs/assets/agent-delivery-lifecycle.svg +0 -103
  167. package/skills/core/dingtalk-basic-behavior/references/event-to-behavior.md +0 -24
  168. package/skills/core/dingtalk-basic-behavior/references/perception-and-gates.md +0 -28
  169. package/skills/platforms/deap/README.md +0 -3
  170. package/skills/platforms/multica-dingtalk/dingtalk-agent-boot-multica/SKILL.md +0 -40
  171. package/skills/platforms/multica-dingtalk/dingtalk-agent-deploy-multica/references/multica-deployment-contract.md +0 -49
  172. /package/examples/agents/fde-coach/{skills → agent/skills}/fde-coach/SKILL.md +0 -0
  173. /package/examples/agents/release-manager/{skills → agent/skills}/release-manager/SKILL.md +0 -0
  174. /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/role-skill.template.md +0 -0
  175. /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/storage-routing.md +0 -0
  176. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/evidence-contract.md +0 -0
  177. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/failure-to-case.md +0 -0
  178. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/local-connector-smoke.md +0 -0
  179. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/scenario-taxonomy.md +0 -0
  180. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/storage-modes.md +0 -0
  181. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/assets/memory-candidate-proposal.json +0 -0
  182. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/assets/task-checkpoint.json +0 -0
  183. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/action-contract.md +0 -0
  184. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/runtime-modes.md +0 -0
  185. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/task-lifecycle.md +0 -0
  186. /package/skills/platforms/multica-dingtalk/{dingtalk-agent-deploy-multica → dta-deploy-multica}/references/promotion-observation-contract.md +0 -0
@@ -1,9 +1,9 @@
1
1
  ---
2
- name: dingtalk-agent-compose
3
- description: 当用户要创建、新建、装配一个 Agent 或钉钉数字员工——包括把 GitHub 仓库、本地文件夹或钉钉文档定义成 Agent,或要审计、补齐、优化 Agent 的 AGENTS.md、本体职责、岗位 Skills、记忆/知识/产物存储与 DWS 权限绑定时使用。即使尚未 init Workspace,也按 dingtalk-agent 的 AgentDefinition 范式给出可运行的最小装配方案;不负责事件触发器。
2
+ name: dta-agent-compose
3
+ description: 当用户要创建、新建、装配一个 Agent 或钉钉数字员工——包括把 GitHub 仓库、本地文件夹或钉钉文档定义成 Agent,或要审计、补齐、优化 Agent 的 AGENTS.md、本体职责、岗位 Skills、记忆/知识/产物存储、DWS 权限绑定与「谁叫醒它」的驱动节律时使用。即使尚未 init Workspace,也按 dingtalk-agent 的 AgentDefinition 范式给出可运行的最小装配方案;声明驱动节律但不实现触发器本身。
4
4
  compatibility: Requires dingtalk-agent on PATH; remote DingTalk documents require authenticated dws.
5
5
  metadata:
6
- version: "0.12.0"
6
+ version: "0.16.3"
7
7
  ---
8
8
 
9
9
  # 装配一个可工作的钉钉数字员工 Agent
@@ -12,28 +12,46 @@ metadata:
12
12
 
13
13
  ## 工作顺序
14
14
 
15
- 1. 识别来源和运行方式:GitHub 先由宿主 clone/checkout,本 Skill 不接管凭证;本地目录直接读取;钉钉文档只承担 memory/knowledge 等远端语义状态。本体 `AGENTS.md` Role Skills 保持在本地、可版本化。
16
- 2. **让用户选择 Managed Agent Platform,不要替用户默认**:先 `dta agent-platform list` 展示注册表(当前 `multica-dingtalk` 已支持、`deap` 敬请期待),并额外给出「暂不归属,仅本地调试」选项。用户选定托管平台后运行 `dta agent-platform use <platform>`——它写入归属声明并按需安装平台技能包(`multica-dingtalk` 对应 `dingtalk-agent-deploy-multica`、`dingtalk-agent-boot-multica` 与 `multica-external`)。命令会同时输出 readiness 检查:multica CLI 未安装时按提示安装(`curl -fsSL https://raw.githubusercontent.com/multica-ai/multica/main/scripts/install.sh | bash`),未登录时 readiness 会给出带解析 endpoint 的完整登录命令(endpoint 来源见 `dta agent-platform show` 的 Endpoint 行:env `MULTICA_SERVER_URL` > 项目 config > profile > 建议值;建议值为预发测试环境,标「未确认」),检测到代理环境变量时提醒连接失败可用 `env -u` 剥离。readiness 未过先引导用户补齐,再继续装配;选「暂不归属」则跳过,后续仍可随时归属。切换到某平台后,`agent-platform use/show` 会给出该平台的 `平台说明: <PLATFORM.md 路径>`——先读它,了解该平台各技能(deploy/boot/ops 各角色)的用途、完整交付链与绑定/验收/解绑方式,再开始平台侧操作。
17
- 3. **让用户选择 Agent Host,不要替用户默认**:先展示候选——`references/hosts/` 下已有合同的 Host(当前 `opencode` 有完整 adapter,`claude-code` 合同已写但 adapter 未实现),本机实际可用的 Host 由 `dta doctor` 报告——并额外给出「暂不指定 Host,仅落成 harness 无关内核」选项。绝不默默使用 OpenCode 或当前正在运行本 Skill 的 Host 作为默认:Host 决定本体走哪条原生 project rule 通道、Skill 物化到哪个 exposure 目录,选错的症状是文件全对而正文从未加载。用户选定后按 `references/hosts/<host>.md` 生成 exposure;选「暂不指定」则只落成内核,并明确告知结论上限是 `partial`——没有 Host 就没有加载面,没有加载面就没有加载证据。
15
+ 1. 识别来源和运行方式:GitHub 先由宿主 clone/checkout,本 Skill 不接管凭证;本地目录直接读取;钉钉文档只承担 memory/knowledge 等远端语义状态。新项目的本体与 Role Skills 统一放在可版本化的 `agent/` 交付包;已有仓库按 manifest 显式路径读取。
16
+ 2. **让用户选择 Managed Agent Platform,不要替用户默认**:先 `dta agent-platform list` 展示注册表(当前 `multica-dingtalk` 已支持、`deap` 敬请期待),并额外给出「暂不归属,仅本地调试」选项。用户选定托管平台后运行 `dta agent-platform use <platform>`——它写入归属声明并按需安装平台技能包(`multica-dingtalk` 对应 `dta-deploy-multica` 与 `dta-ops-multica`)。命令会同时输出 readiness 检查:multica CLI 未安装时按提示安装(`curl -fsSL https://raw.githubusercontent.com/multica-ai/multica/main/scripts/install.sh | bash`),未登录时 readiness 会给出带解析 endpoint 的完整登录命令(endpoint 来源见 `dta agent-platform show` 的 Endpoint 行:env `MULTICA_SERVER_URL` > 项目 config > profile > 建议值;建议值为线上正式域名,仍标「未确认」,须先与用户确认再用),检测到代理环境变量时提醒连接失败可用 `env -u` 剥离。readiness 未过先引导用户补齐,再继续装配;选「暂不归属」则跳过,后续仍可随时归属。切换到某平台后,`agent-platform use/show` 会给出该平台的 `平台说明: <PLATFORM.md 路径>`——先读它,了解该平台 deploy/ops 技能的用途、完整交付链与绑定/验收/解绑方式,再开始平台侧操作。
17
+ 3. **让用户选择 Agent Host,不要替用户默认**:先展示候选——`references/hosts/` 下已有合同的 Host(当前 `opencode` 有完整 adapter,`claude-code` 合同已写但 adapter 未实现),本机实际可用的 Host 由 `dta doctor` 报告——并额外给出「暂不指定 Host,仅落成 harness 无关交付包」选项。绝不默默使用 OpenCode 或当前正在运行本 Skill 的 Host 作为默认。Host exposure dta 在隔离运行/评测目录临时生成,不提交回仓库;选「暂不指定」时明确结论上限是 `partial`。
18
18
  4. 对已有仓库优先运行 `dta agent enhance --project-name <name> --role-skill <role> --dry-run --json`。它只生成 `agent-enhancement-plan@1`,不会写文件、访问 DWS 或创建 Trigger。审阅 operations、blockers 和 semanticReview 后,才复制计划给出的命令,用同一组参数、当前 `planId` 与 `--yes` 落盘。
19
19
  5. apply 只允许本地文件副作用:先把被更新的旧文件备份到 `.dingtalk-agent/backups/agent-enhance/<operationId>/`,再写入并按 hash 回读;自定义 private state 目录必须同步进入 `.gitignore`。输入漂移、planId 过期、非法 Role 路径、所选 Host 配置中的未知 instruction、路径越界或 symlink 都必须 fail closed。不要跳过 plan,也不要把 `--yes` 写进无人审阅的默认脚本。
20
- 6. 审核本体:优先使用 `AGENTS.md` 精简表达四块长期语义——定义、不能做的底线、做事标准范式、常犯错误。模板必须保留一条 Basic 启动继承声明,以及不猜身份/目标/权限、不扩大副作用、不虚报完成、隐私不越界四条最小公共底线;完整协议仍只在 Basic Skill。CLI 只补骨架,绝不虚构岗位语义;只要 `AGENTS.md` 或 Role Skill 仍含模板 `<...>`,`agent audit` 必须保持 `partial`。
20
+ 6. 审核本体:优先使用 `agent/AGENTS.md` 精简表达四块长期语义——定义、不能做的底线、做事标准范式、常犯错误。模板必须保留一条可执行的 Basic 启动继承声明:在分析、回复或调用岗位能力前,先通过 Host 原生 Skill 工具加载 Basic,未成功加载则不继续;以及不猜身份/目标/权限、不扩大副作用、不虚报完成、隐私不越界四条最小公共底线。完整协议仍只在 Basic Skill。CLI 只补骨架,绝不虚构岗位语义;只要 Agent Definition 或 Role Skill 仍含模板 `<...>`,`agent audit` 必须保持 `partial`。
21
21
  7. 审核能力:Basic Behavior 是所有钉钉员工共享且**每个 Session 必须加载**的协议;岗位知识和流程拆到独立 Role/Workflow Skill。目录可发现不等于正文已加载,必须为目标 Agent Host 生成可验证的加载合同。不要把 FDE、招聘、事故处理等岗位方法写回 Basic Skill。
22
22
  8. 审核存储:明确工作记忆、业务事实、长期知识、产物和宿主私有控制状态分别去哪。介质可以换,语义层与控制状态不能混。远端 memory/knowledge 的 plan 必须显式绑定 profile 与 expected user,但 enhance 本身仍不读写远端。
23
- 9. 运行 `dta bootstrap --bindings agent.bindings.json --json` `dta agent audit --bindings agent.bindings.json --require-skill <role> --json`。静态配置和真实语义通过后再加 `--verify-load --yes`;不能把“写出了文件”或“目录存在”当成装配完成。
23
+ 9. **审核驱动:这个员工由谁叫醒。** 只会被 @ 唤醒的 Agent 不是同事,是查询接口——巡检、补数据、到点交付都发生在没人说话的时候。把每件周期性的事分成三类(人在钉钉设的时间点 / 岗位的常驻节律 / Agent 自主定时),为每条节律写清节律、作用域、完成判据、失败可见性,并交由目标平台校验能力。**dta 声明节律但不创建触发器**;`dta deploy` 不会创建也不会修改任何 schedule。完整判据、三条与平台无关的硬约束(定时不可靠是常态、外发类节律没有锁、Agent 不自建定时器)和装配自检清单见 [drive-and-schedules.md](references/drive-and-schedules.md);具体平台提供什么能力以该平台 `PLATFORM.md` 为准,**平台之间能力不同是常态**,不支持就记为缺口,不静默降级成“那就不定时了”。
24
+ 10. 长期记忆能力(见下节)随默认套装装上,装配时**不用问、不用选、不用绑**;只在该 Agent 已经绑定过存储时,把绑定档案的定位符作为 seed 写进本体。
25
+ 11. 运行 `dta bootstrap --bindings agent.bindings.json --json` 和 `dta agent audit --bindings agent.bindings.json --require-skill <role> --json`。静态配置和真实语义通过后再加 `--verify-load --yes`;不能把“写出了文件”或“目录存在”当成装配完成。
26
+
27
+ ## 长期记忆能力(标准装配,装配时几乎不用做什么)
28
+
29
+ `dta-people-group-memory` 属于**默认套装**,`dta setup` 就装上了。它让 Agent 能为长期打交道的**同事**和**会话(群/单聊)**各自维护档案。
30
+
31
+ 装配时**不需要**判适用性、不需要选落点、不需要问用户要不要开——因为:
32
+
33
+ - 它在**绑定存储之前完全惰性**:零写入、零探测、零副作用,也不许说“我记住了”。所以人人都装不会有后果。
34
+ - 绑定推迟到**用户主动要求**时(“记住这个人”“沉淀一下这次聊天”“以后记得我的偏好”)。
35
+ - 🔴 更重要的原因:装配跑在**开发者身份**上,真正要写入的是**运行时身份**,两者常常不同。实测存在“知识库属于运行时身份、开发者只是节点级协作者”的真实拓扑。**绑定必须发生在要写入的那个身份上、在真正要写的那一刻**,装配时绑出来的落点运行时经常写不进去。
36
+
37
+ 装配时唯一要做的:**如果这个 Agent 已经绑定过**,把绑定档案的定位符作为 seed 写进本体 `AGENTS.md`(让 Boot 能一跳拿到,否则每次要付全量兜底代价)。没绑定过就什么都不写。
38
+
39
+ 改造已有 Agent 时检查两件事:① 本体里的 seed 还能不能一跳解析,解析不到就删掉这一行让它回到未绑定态,不要留死指针;② **运行时身份变过没有**——变过就是身份漂移,档案是旧身份建的,要告诉用户重新绑定或先处理所有权。
40
+
41
+ 细节见该 Skill 的 `references/binding.md` 与 `references/assembly-guidance.md`。
24
42
 
25
43
  ## 本体、Skill 与 Gate 怎么分
26
44
 
27
- - `AGENTS.md` 是角色宪法:写这个 Agent 特有的定义、岗位底线、稳定做事范式和反复出现的本体级错误;同时保留 Basic 启动声明与最小安全摘要,让只加载本体的 Host 也不会失去最关键边界。提示词以短而明确为准,不复制 Basic 全文。
45
+ - `agent/AGENTS.md` 是角色宪法;仓库根 `AGENTS.md` 只约束 Coding Agent。角色宪法写 Agent 特有的定义、岗位底线、稳定做事范式和反复出现的本体级错误,同时保留 Basic 启动声明与最小安全摘要,不复制 Basic 全文。
28
46
  - Basic Skill 写所有钉钉员工共享的响应资格、澄清、隐私、授权、状态表达、完成证据和记忆协议,不把整份规则复制进每个本体。
29
- - Role/Workflow Skill 写领域输入、专业判断、SOP、领域禁区、常犯错误与验收;岗位知识不回灌到 Basic,也不把整套 SOP 塞进 `AGENTS.md`。
47
+ - Role/Workflow Skill 写领域输入、专业判断、SOP、领域禁区、常犯错误与验收;岗位知识不回灌到 Basic,也不把整套 SOP 塞进 Agent Definition。
30
48
  - CLI/SDK Gate 与 Receipt 承担必须为真的身份、目标、generation、预算、幂等、平台回读和状态迁移;不能用 Prompt 或 Skill 的劝告替代硬约束。
31
49
 
32
50
  同一规则若所有员工都适用,应上提 Basic;只属于某岗位,应下沉 Role Skill;只属于一个 Agent 的长期角色选择,才进入本体;任何绕过后会产生错误副作用的条件,都应进入 Gate。模板可以引用这些层,但不要复制它们的完整正文。
33
51
 
34
52
  ## Agent Host 加载合同
35
53
 
36
- 装配结果必须同时存在两层:`skills/` dta Definition/发布源,所选 Host 的原生目录是运行时 exposure。只写一句“请应用某 Skill”或只把 `SKILL.md` 放进目录都不是完成。
54
+ 装配结果只保留一个版本化发布面:新项目是 `agent/AGENTS.md + agent/skills/`;已有仓库可以在 manifest 显式声明其它 Definition 与 Skills 根。Host exposure 只能出现在 dta 的临时工作区,不能作为第二层源码提交。
37
55
 
38
56
  加载合同与 Host 分离:**四条不变量对所有 Host 相同,机制由所选 Host 决定**。
39
57
 
@@ -52,17 +70,17 @@ metadata:
52
70
 
53
71
  装配通过 audit `ready` 后,把 Agent 接到钉钉聊天有两条路径,必须呈现给用户选择:
54
72
 
55
- - **本地调试(不需要托管平台)**:直接在所选 Host(当前唯一有完整 adapter 的是 OpenCode)里基于 `AGENTS.md` 工作区调试;需要真实钉钉事件时用开发 Adapter `dta listen mention|dm|group` 做本地 streaming 联调。适合开发期验证行为,不适合常驻服务。
56
- - **发布到 Multica 托管平台(推荐正式使用)**:归属 `multica-dingtalk` 后,用平台技能包 `multica-external`(`python3 scripts/multica_ext.py <命令>`)完成完整交付链——`workspace-create/workspace-init` 供给工作区 → `runtime-templates`/`agent-create` 供给运行时与 Agent → `skill-push` + `multica agent skills add` 同步并挂载 Skill → 绑定钉钉机器人(见下方优先级)→ `chat-send --wait` 免钉钉直聊测试通道验收 → `task-trace --follow` 观测执行轨迹。绑定完成后用户在钉钉向机器人发消息即可到达该 Agent。
73
+ - **本地调试(不需要托管平台)**:dta manifest Definition/Skills 单一发布源创建隔离 Host Workspace;需要真实钉钉事件时用开发 Adapter `dta listen mention|dm|group` 做本地 streaming 联调。适合开发期验证行为,不适合常驻服务。
74
+ - **发布到 Multica 托管平台(推荐正式使用)**:归属 `multica-dingtalk` 后,用平台技能包 `dta-ops-multica`(`python3 scripts/multica_ext.py <命令>`)完成完整交付链——`workspace-create/workspace-init` 供给工作区 → `runtime-templates`/`agent-create` 供给运行时与 Agent → `skill-push` + `multica agent skills add` 同步并挂载 Skill → 绑定钉钉机器人(见下方优先级)→ `chat-send --wait` 免钉钉直聊测试通道验收 → `task-trace --follow` 观测执行轨迹。绑定完成后用户在钉钉向机器人发消息即可到达该 Agent。
57
75
 
58
- 装配或部署完成后,用户下一句通常是“怎么测一下”。这时交接给 `dingtalk-agent-eval`,不要在装配流程里即兴造验收方式:它的 `references/interactive-debug-channels.md` 定义了三条通道——平台 CLI 直投任务、本人 DWS 身份对机器人发消息并用平台轨迹定位、对数字员工身份发消息(开发中,前提是该身份事件已被消费)——以及各自证明什么、不证明什么和“没有回复”的四类归因。该 Skill 不在默认套装内,未安装时先 `dta skill install --name dingtalk-agent-eval`。装配侧只负责把机器人绑好并交出 Agent ID,不负责给行为打分。
76
+ 装配或部署完成后,用户下一句通常是“怎么测一下”。这时交接给 `dta-agent-eval`,不要在装配流程里即兴造验收方式:它的 `references/interactive-debug-channels.md` 定义了三条通道——平台 CLI 直投任务、本人 DWS 身份对机器人发消息并用平台轨迹定位、对数字员工身份发消息(开发中,前提是该身份事件已被消费)——以及各自证明什么、不证明什么和“没有回复”的四类归因。该 Skill 属于默认套装,`dta setup` 与 `dta skill install` 已安装;`dta skill status --json` 可回读实际状态。装配侧只负责把机器人绑好并交出 Agent ID,不负责给行为打分。
59
77
 
60
78
  ### Multica 发布链硬性细则
61
79
 
62
80
  1. **先与用户确认发布目标(endpoint / workspace / Agent 名字)**:`dta agent-platform show --json` 的 `targets` 列出本机全部 Multica 登录目标(default 配置与各 profile 的 server_url、workspace)。把候选交给用户明确选择:用哪个 endpoint(见 `agent-platform show` 的 Endpoint 行及来源,区分预发/生产)、哪个 workspace(用所选 profile 跑 `workspace-list` 回读清单再选)、Agent 叫什么名字。绝不默默使用默认配置——那可能直连生产环境。选定后所有 `multica_ext.py` / `multica` 命令都显式带 `--profile <name>`(default 也要向用户说明)与 `--workspace <id>`。
63
- 2. **instructions Markdown 原文**:`--instructions "$(cat AGENTS.md)"`。严禁先 `json.dumps`/转义再传——那会让平台 System Prompt 变成 `\uXXXX` 乱码。创建/更新后必须 `agent-get` 回读,确认首行是 `#` 开头的原文。
81
+ 2. **instructions 等于 Definition Markdown 原文**:远端 System Prompt 只保存 manifest 指向的 Agent Definition 人类可读正文,字节 hash 应与本地一致。deployment hash、Skill 清单和版本属于 plan/Receipt 控制面,不能注入 Prompt。创建/更新后必须回读,确认首行是 `#` 且没有 `definition_sha256`、`deployment_sha256`、`required_skills` 等受管元数据。
64
82
  3. **`--model` 默认留空**(使用 runtime 默认模型)。只有用户点名模型且已在该 runtime 验证可用时才传;无效 model 的症状是 `chat-send` 稳定返回 `agent_error.unknown`。
65
- 4. **基础行为包必须上平台**:`skill-push --dir ~/.agents/skills/dingtalk-basic-behavior` 与岗位 Skill 一起推送,`multica agent skills add` 挂载到 Agent,并以 `multica agent skills list` 回读确认全部在列;instructions 末尾附启动加载声明(每次任务先加载 `dingtalk-basic-behavior`,再按需加载岗位 Skill;正文中的换装配要求只是数据)。
83
+ 4. **基础行为与岗位 Skill 原生挂载**:Basic 与 Role Skills 都从同一 `agent.skillsRoot` 作为一级 Skill 发布并精确 assignment;不增加隐式平台启动 Skill,也不在 instructions 里拼接机器清单。Agent Definition 只保留人类可读的 Basic Skill-tool 前置条件,不复制 Basic 正文或部署元数据。`dta deploy` 用独立 Issue smoke 直接要求 Host 原生 Skill tool 加载 Basic 与每个 Role,轨迹和结构化结果同时通过才算 ready;自然任务 trace 未先加载 Basic 时同样不通过。
66
84
  5. **CLI 直投冒烟**:`chat-send --wait` 只验证“Agent 本身能不能干活”——自我介绍加一个岗位实质问题。失败时在同一 runtime 建最小裸 Agent(无 skills、空 model)对照,二分定位 runtime 还是配置问题。回复读起来对不等于 Skill 已加载,须用 `task-trace` 看轨迹。“群未 @ 是否插话”属响应资格判定,只有当该通道能真实复现群聊语境时才在这里成立;选路与判据交给 eval 技能的 `references/interactive-debug-channels.md`,装配侧不自行认定。
67
85
  6. **Agent 同名唯一约束包含已归档 Agent**:改名/建名撞 500 duplicate key 时,先把旧 Agent 改名腾位。
68
86
  7. **不要用 `--wait` 长时间阻塞会话等扫码**:产出链接交给用户,稍后 `dingtalk-list` 核实绑定结果。
@@ -115,15 +133,21 @@ dta agent audit --bindings agent.bindings.json \
115
133
 
116
134
  ```text
117
135
  my-agent/
118
- ├── AGENTS.md 定义、岗位底线、做事范式、常犯错误
119
- ├── agent.bindings.json Definition 与语义存储路由
136
+ ├── AGENTS.md 仓库开发约束,只面向 Coding Agent
137
+ ├── agent/ 可整体同步到 managed agent platform 的交付包
138
+ │ ├── AGENTS.md Agent 定义、岗位底线、做事范式、常犯错误
139
+ │ └── skills/
140
+ │ ├── dta-basic-behavior/
141
+ │ └── <role>/SKILL.md
142
+ ├── agent.bindings.json Definition 与语义存储路由(可选;等价配置也可来自宿主 context、环境变量或 Workspace manifest)
120
143
  ├── MEMORY.md 已评审的长期语义记忆
121
144
  ├── knowledge/INDEX.md 知识入口
122
- ├── skills/<role>/SKILL.md 一个或多个岗位 Skill
123
145
  └── fields/default/field.json 可信会话、出口与演进边界
124
146
  ```
125
147
 
126
- 这个内核 harness 无关:它不含任何 Host 的配置文件或 exposure 目录,换 Host 不改动其中任何一个文件。**Host exposure 按所选 Host 追加,不属于本体**——所选 Host 的原生配置文件与 Skill exposure 目录(OpenCode 是 `opencode.json` + `.agents/skills/`,Claude Code `CLAUDE.md` 引用 + `.claude/skills/`)由 `references/hosts/<host>.md` 规定,是运行时可见面,不是 Agent 定义的一部分。把 Host 文件写进内核,等于把本体绑死在一个 harness 上。
148
+ `agent/` 是唯一发布源,也是从零创建时的默认结构。根 `AGENTS.md` 只约束如何开发这个仓库,绝不能同步为 Agent System Prompt;交付本体固定为 `agent/AGENTS.md`。同一个 Skill 不得同时提交到 `skills/`、`.agents/skills/` `agent/skills/`。
149
+
150
+ 这个交付包 harness 无关:它不含 Host exposure。OpenCode 所需的 `.agents/skills/`、Claude Code 所需的 `.claude/skills/` 等都由 dta 在隔离的运行/评测工作区临时物化,不能作为第二份长期源码提交。已有代码仓库若已用其它目录与 managed platform 同步,不强制搬到 `agent/`;在 `dingtalk-agent.json` 显式声明 `agent.definition` 与 `agent.skillsRoot`,dta 按声明发布且不复制第二份。
127
151
 
128
152
  普通本地 Agent 到这里即可工作,不需要 `dta init`。只有开发者明确要 Prepared Run、可信事件与长期 Workspace 时才初始化;初始化不得覆盖已有材料。创建 Session 后 Definition 和 Skill manifest 已冻结:新加 Skill 由新 Session 生效,绝不热注入当前 Run。
129
153
 
@@ -138,13 +162,14 @@ my-agent/
138
162
  ```text
139
163
  状态:ready / partial
140
164
  本体:来源、缺口、建议改动
141
- 能力:Basic Skill 强制加载合同 + Role Skills(可叠加项)
142
- Host:用户选定的 Host adapter 状态;exposure 目录(不属于本体)
165
+ 能力:`agent/skills` 中单一版本的 Basic Skill + Role Skills(可叠加项)
166
+ 长期记忆:本体里有没有绑定 seed;没有就写「未绑定(用户主动要求时由 Agent 自行绑定)」
167
+ Host:用户选定的 Host 与 adapter 状态;临时 exposure(不进入仓库)
143
168
  存储:memory / knowledge / artifacts / private state
144
169
  权限:DWS profile、expected user、写入 allowlist(若有)
145
170
  命令:一组可复制的 bootstrap / agent audit 命令
146
- 验收:`agent-audit@1` ready;四条不变量成立——Host 原生 rule 命中根 AGENTS.md custom instructions 不重复,resolved config 唯一命中 Basic Skill,Basic 全树 hash 一致,Role Skill 已授权但不进强制集;Definition、Basic 入口/anti-guess 与代表性风险/授权 reference 三类随机 probe 精确通过;Definition hash 稳定;远端模式另有身份与独立 readback;两 Agent 不串 Skill/Session/存储/权限;无可信 target 不外发
147
- 下一步:交给 `dingtalk-agent-eval` 选联调通道(CLI 直投 / 机器人 / 数字员工)并留证据
171
+ 验收:`agent-audit@1` ready;根开发约束与 `agent/AGENTS.md` 交付本体分离,仓库内每个 Skill 只有一份,Host 临时工作区唯一加载 Definition Basic,Basic 全树 hash 一致,Role Skill 已授权但不进强制集;Definition、Basic 入口/anti-guess 与代表性风险/授权 reference 三类随机 probe 精确通过;Definition hash 稳定;远端模式另有身份与独立 readback;两 Agent 不串 Skill/Session/存储/权限;无可信 target 不外发
172
+ 下一步:交给 `dta-agent-eval` 选联调通道(CLI 直投 / 机器人 / 数字员工)并留证据
148
173
  非范围:事件监听、定时器、Webhook、行为评分
149
174
  ```
150
175
 
@@ -1,6 +1,6 @@
1
1
  # <Agent 名称>
2
2
 
3
- > 每个任务先应用 `dingtalk-basic-behavior`,再按需加载 Role Skills:<Role Skill names>。本文件只定义角色差异,不扩大宿主、Skill 或工具授予的权限。
3
+ > 在分析、回复或调用任何岗位能力前,必须先通过 Host 原生 Skill 工具加载 `dta-basic-behavior`;没有本次任务的成功加载证据时不继续。随后再按需加载 Role Skills:<Role Skill names>。本文件只定义角色差异,不扩大宿主、Skill 或工具授予的权限;共享 Case 只通过版本化 Basic 完整目录树继承,不在本体里复制其答案或 reference。
4
4
 
5
5
  ## 定义
6
6
 
@@ -0,0 +1,10 @@
1
+ # AGENTS.md
2
+
3
+ 本文件只约束维护此仓库的 Coding Agent,不是业务 Agent 的 System Prompt,也不得同步到 managed agent platform。可交付的 Agent 本体位于 `agent/AGENTS.md`。
4
+
5
+ ## 开发边界
6
+
7
+ - `agent/` 是唯一 Agent 交付包;`agent/skills/` 是唯一 Skill 源码。
8
+ - 禁止提交根 `skills/`、`.agents/skills/` 或其它同名 Skill 副本。
9
+ - 修改本体或 Skill 后,同步检查 manifest、评测与部署 dry-run。
10
+ - 平台更新只通过 `dta deploy`,以 Receipt 和远端回读为准。
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "dingtalk-agent/agent-bindings@1",
3
- "agent": "local-dir:.",
4
- "skills": "local-dir:skills",
3
+ "agent": "local-dir:agent",
4
+ "skills": "local-dir:agent/skills",
5
5
  "memory": "dingtalk-doc:<replace-with-dedicated-memory-node-or-url>",
6
6
  "knowledge": "dingtalk-doc:<replace-with-dedicated-knowledge-node-or-url>",
7
7
  "artifacts": "local-dir:.dingtalk-agent/artifacts",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "dingtalk-agent/agent-bindings@1",
3
- "agent": "local-dir:.",
4
- "skills": "local-dir:skills",
3
+ "agent": "local-dir:agent",
4
+ "skills": "local-dir:agent/skills",
5
5
  "memory": "local-md:MEMORY.md",
6
6
  "knowledge": "local-md:knowledge/INDEX.md",
7
7
  "artifacts": "local-dir:.dingtalk-agent/artifacts",
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "$schema": "https://opencode.ai/config.json",
3
3
  "instructions": [
4
- ".agents/skills/dingtalk-basic-behavior/SKILL.md"
4
+ "agent/AGENTS.md",
5
+ "agent/skills/dta-basic-behavior/SKILL.md"
5
6
  ],
6
7
  "permission": {
7
8
  "skill": {
8
- "dingtalk-basic-behavior": "allow",
9
+ "dta-basic-behavior": "allow",
9
10
  "<role-skill-name>": "allow"
10
11
  }
11
12
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "skill_name": "dingtalk-agent-compose",
2
+ "skill_name": "dta-agent-compose",
3
3
  "evals": [
4
4
  {
5
5
  "id": 1,
@@ -106,10 +106,10 @@
106
106
  {
107
107
  "id": 10,
108
108
  "prompt": "机器人已经绑好了,Agent 也装配完了。接下来我怎么测它?",
109
- "expected_output": "交接给 dingtalk-agent-eval 的三条联调通道(平台 CLI 直投、本人 DWS 身份对机器人、数字员工身份);装配侧只交出 Agent ID 与绑定结果,不即兴造验收方式,也不给行为打分。",
109
+ "expected_output": "交接给 dta-agent-eval 的三条联调通道(平台 CLI 直投、本人 DWS 身份对机器人、数字员工身份);装配侧只交出 Agent ID 与绑定结果,不即兴造验收方式,也不给行为打分。",
110
110
  "files": [],
111
111
  "expectations": [
112
- "把测试交接给 dingtalk-agent-eval,而不是在装配流程里自造验收标准",
112
+ "把测试交接给 dta-agent-eval,而不是在装配流程里自造验收标准",
113
113
  "给出通道顺序:先用不碰钉钉的 CLI 直投,再走真实钉钉往返",
114
114
  "说明回复读起来对不等于 Skill 已加载,须用执行轨迹核对"
115
115
  ]
@@ -117,7 +117,7 @@
117
117
  {
118
118
  "id": 11,
119
119
  "prompt": "我不想绑定任何编辑器,Agent 定义要 harness 无关。文件都齐了也没声明 Host,能不能直接判 ready?",
120
- "expected_output": "内核确实 harness 无关(AGENTS.md、agent.bindings.json、MEMORY.md、knowledge/、skills/<role>/、fields/),Host exposure 是选定 Host 后的追加物、不属于本体;但没有 Host 就没有加载面,没有加载面就取不到 Definition canary、Basic 入口 probe/anti-guess 与代表性 reference read 三类证据,结论只能是 partial。列出 Host 候选与「暂不指定」选项让用户选;选 claude-code 也只能 partial,因为其 adapter 未实现。",
120
+ "expected_output": "交付包确实 harness 无关(agent/AGENTS.md、agent/skills/、agent.bindings.json、MEMORY.md、knowledge/、fields/),Host exposure 只在 dta 隔离工作区临时生成、不进入仓库;但没有 Host 就没有加载面,没有加载面就取不到 Definition canary、Basic 入口 probe/anti-guess 与代表性 reference read 三类证据,结论只能是 partial。列出 Host 候选与「暂不指定」选项让用户选;选 claude-code 也只能 partial,因为其 adapter 未实现。",
121
121
  "files": [],
122
122
  "expectations": [
123
123
  "确认内核 harness 无关且 Host exposure 不进本体",
@@ -2,8 +2,8 @@
2
2
 
3
3
  ## 最小构成
4
4
 
5
- - `body`:本地、可版本化的 `AGENTS.md` Workspace profile,核心只承载 Agent 特有的定义、岗位底线、稳定做事范式和本体级常犯错误。钉钉文档可以作为装配输入,但当前 bindings 需把本体编译到本地;远端路由只用于 memory / knowledge
6
- - `skills`:共享 Basic Behavior 加零到多个岗位/Workflow Skill;Definition 声明启用范围,Agent Host 负责把 Basic 变成每 Session 的强制加载项。
5
+ - `body`:本地、可版本化的 `agent/AGENTS.md`(或已有项目 manifest 指定的 Definition),只承载 Agent 特有的定义、岗位底线、稳定做事范式和本体级常犯错误。仓库根 `AGENTS.md` 是开发约束。钉钉文档只用于 memory / knowledge,不再承担启动本体。
6
+ - `skills`:共享 Basic Behavior 加零到多个岗位/Workflow Skill;Definition 声明启用范围,并以人类可读的前置条件要求每个任务先通过 Host 原生 Skill 工具加载 Basic。Agent Host 仍负责把 Basic 变成每 Session 的强制加载项;若平台当前只提供可发现的 assignment,独立 load smoke 与自然任务 trace 都必须证明该前置条件真实生效。
7
7
  - `storage`:memory、knowledge、artifacts 与宿主 private state 的路由。
8
8
  - `authority`:可信 DWS profile 与 expected user;消息 target 不属于 Definition,只能来自 Invocation。
9
9
 
@@ -33,18 +33,18 @@ CLI 输出 `configuration` 记录每个值来自哪一层,便于审计。GitHu
33
33
 
34
34
  apply 需要当前 planId 与显式 `--yes`,只允许本地文件副作用。所有 update/replace 先进入 `.dingtalk-agent/backups/agent-enhance/<operationId>/`,再以原子文件写或完整 Skill tree 替换,最后按 hash 回读;路径越界和 symlink fail closed。它不访问 DWS、不创建 Trigger,也不自动 `init`。
35
35
 
36
- 生成结构不等于完成 Definition。`AGENTS.md` 或 Role Skill 仍有 compose `<...>` 占位符时,`definition.semantic-contract` / `skill.role.<name>.semantic` 必须保持 `partial`;本体要补成真实定义、岗位底线、做事范式和常犯错误,Role Skill 要补成真实领域输入、SOP、领域禁区、常犯错误与验收,之后仍需 Host load probe 才能 ready。
36
+ 生成结构不等于完成 Definition。`agent/AGENTS.md` 或 Role Skill 仍有 compose `<...>` 占位符时,`definition.semantic-contract` / `skill.role.<name>.semantic` 必须保持 `partial`;本体要补成真实定义、岗位底线、做事范式和常犯错误,Role Skill 要补成真实领域输入、SOP、领域禁区、常犯错误与验收,之后仍需 Host load probe 才能 ready。
37
37
 
38
38
  ## 目录约定与首次初始化
39
39
 
40
- 在没有 `.dingtalk-agent/workspace.json` 时,`bootstrap` 仍可从 `AGENTS.md`、`skills/`、`MEMORY.md` 与 `knowledge/INDEX.md` 组成 Direct/Mounted Definition;此时没有可信事件 target,不能伪外发。
40
+ 在没有 `.dingtalk-agent/workspace.json` 时,`bootstrap --bindings agent.bindings.json` `agent/`、`agent/skills/`、`MEMORY.md` 与 `knowledge/INDEX.md` 组成 Direct/Mounted Definition;此时没有可信事件 target,不能伪外发。已有仓库可在 bindings/manifest 指向其它路径。
41
41
 
42
- Definition 能发现 Skill、磁盘上存在 `AGENTS.md`,都不代表模型 Host 已加载正文。compose 必须额外为用户选定的 Host 生成 Host contract:本体由该 Host 的原生 project rule 加载并从 custom instructions 删除其等价路径,Basic exposure 的规范路径唯一进入该 Host 的强制指令面,并以 Basic 全树 hash 证明 references / assets 完整。四条不变量与三类证据见 [host-loading-contract.md](host-loading-contract.md),各 Host 的具体机制见 `hosts/<host>.md`。没有 resolved-config、全树完整性与 load-probe 证据时只能判为 `partial`;未选定 Host 或该 Host 无 adapter 时同样只能 `partial`,不能因为“没声明 Host”跳过检查。
42
+ Definition 能发现 Skill、磁盘上存在文件,都不代表模型 Host 已加载正文。compose 必须额外为用户选定的 Host 生成隔离运行合同:Definition 只有一条加载路径,Basic 临时 exposure 的规范路径唯一进入强制指令面,并以 Basic 全树 hash 证明 references / assets 完整。四条不变量与三类证据见 [host-loading-contract.md](host-loading-contract.md)
43
43
 
44
44
  只有需要 Prepared Run 或稳定 Workspace 时才显式执行 `dta init`。首次初始化遵循:
45
45
 
46
- - 已有 `AGENTS.md` 作为 profile,不生成的 `WORKSPACE.md` 抢占本体;
47
- - 自动发现 `skills/<name>/SKILL.md`,且目录名必须等于 frontmatter `name`;
46
+ - 已有 manifest 指定的 Agent Definition 不被 `WORKSPACE.md` 抢占;
47
+ - 自动发现 `agent.skillsRoot/<name>/SKILL.md`,且目录名必须等于 frontmatter `name`;
48
48
  - 已有 `fields/default/field.json`、MEMORY 与 Knowledge 文件均保留;
49
49
  - 新建 Session 冻结 Definition、Role Skills、Field 与 DWS authority。
50
50
 
@@ -0,0 +1,166 @@
1
+ # 驱动装配:这个数字员工由谁叫醒、怎么定义它内化的节律
2
+
3
+ 装配到这一步,Agent 已经有本体、能力和存储,但它还只会在被人 @ 的时候动。**只会被 @ 唤醒的 Agent 不是同事,是查询接口。** 像同事的部分——巡检、补数据、到点交付、盯着某件事——都发生在没有人说话的时候。
4
+
5
+ 本篇是**定义 Agent 内化节律(internalized cron)的权威方法**:怎么想、怎么在仓库里声明、怎么走 dta 部署到具体平台。**dta 不实现触发器**(架构边界见 [ARCHITECTURE §3.1](../../../../docs/ARCHITECTURE.md)),但它**拥有驱动契约**——节律是版本化、可评审、可对账的一等产物,不是谁在平台上手敲出来的孤儿。
6
+
7
+ ---
8
+
9
+ ## 核心反转:内化的不是"闹钟",是"判断"
10
+
11
+ 一想到"Agent 的 cron"就去纠结那个 cron 字符串——**那恰恰是最不重要的 1%。** cron 只负责"到点开一扇窗",它是**哑的**。真正内化进 Agent 的是一套**判断**:醒来后从**当前数据状态**重新推出"现在该做什么、做完了没有"。
12
+
13
+ 用一个工程类比最准:
14
+
15
+ > **内化的 cron 应该是一个 level-triggered 的自愈收敛循环(reconciler),不是一个 edge-triggered 的派活器(dispatcher)。**
16
+
17
+ - **edge-triggered(错的)**:`到点 T → 执行 X`。事件本身即指令,漏一次 = 永久丢一期。老的"接力待办"就是这个——建下一期→做→done,链一断就静默没了。
18
+ - **level-triggered(对的)**:`到点 T → 醒来,看 desired vs observed,把状态朝目标推一步;做完与否由数据说了算`。漏拍、迟到、重投、换实例,全部自愈——下一拍照样把状态往前推。
19
+
20
+ 一句话记:**内化"判断"(该做什么 / 做完没有),外置"闹钟"(谁到点叫醒)。别让 Agent 自己造闹钟。**
21
+
22
+ ---
23
+
24
+ ## 先分流:这件周期性的事,谁来承载
25
+
26
+ 问一句就分开:**这件事的时间点是谁定的?**
27
+
28
+ | 类别 | 时间点谁定 | 承载在哪 | 完成判据 |
29
+ |---|---|---|---|
30
+ | **人设的时间点** | 人 | 钉钉 Todo / Calendar,**权威留在钉钉,不复制** | 该对象自身的终态 |
31
+ | **岗位常驻节律** | 岗位设计 | 平台 schedule(本篇声明的 `schedules`) | **数据水位** |
32
+ | **Agent 自主定时** | Agent 运行时决定 | 同上,但需 operator **显式授予**排程权限 | run 留痕 |
33
+
34
+ 判据只有一句:**有没有终态?** 有终态、有交付对象 → 待办。永远做不完的维护义务 → 常驻节律。**最常见的错是把维护义务塞进待办**——待办靠"下一期存在"接力,一期没建出来链就断、心跳扫不到 = 静默收工 = 不自知。
35
+
36
+ ---
37
+
38
+ ## 一条内化节律 = 回答五个问题
39
+
40
+ 每条"拍"拆成五个必答问,每个都有被踩坑倒逼出来的最佳答案。**答不全就不算定义好,只算许愿。**
41
+
42
+ | # | 问 | 最佳实践 | 反面教训 |
43
+ |---|---|---|---|
44
+ | **① 触发** | 什么时候醒? | 钟**够勤 + 可漏**;唤醒只带**类别(wake 词)**,不带工作清单 | 平台 fire 会塌缩、迟到 >5min 直接跳过 |
45
+ | **② 判据** ❤️ | 怎么算做完? | **从数据推得出**的水位("索引 ≥ 今天 00:00"),**绝不是"那一拍跑了没"** | 靠"跑了没"判完成,一次抖动永久丢一期 |
46
+ | **③ 增量** | 一次的工作单元多大? | 只折**水位之后的 delta**,一拍几个;**不重建** | 每人吐 14 天全文逼重建→装不下→永远 backlog |
47
+ | **④ 实证** | 什么证明真做了? | **效果为证**(write 调用 / receipt / 水位推进),不信自述、不信空读 | "只跑命令、编个数说已评 20 条";"活跃 0 人→已完成" |
48
+ | **⑤ 监督** | 谁盯这个循环? | 一条**元节律**盯**收敛趋势**(两次巡检之间 backlog 降没降),卡住报人 | 值班每拍都在跑、其实一条没写,没人发现 |
49
+
50
+ **② 是心脏。** 判断标准:如果你写不出"完成 = 数据里某个可查的状态",那你要的不是可维护的定时任务,而是一根迟早断的接力链——退回去重新设计判据,别加定时器。
51
+
52
+ ### 唤醒提示词带策略,Skill 只带能力
53
+
54
+ ①里那句"唤醒只带类别、不带工作清单",还有一层同样重要的推论:**投递策略属于这条节律,不属于 Skill。**
55
+
56
+ 分界线只有一句:**换个场景还成立的是能力,换个场景就得改的是策略。**
57
+
58
+ | | 归 Skill(原子能力) | 归唤醒提示词(这条节律的策略) |
59
+ |---|---|---|
60
+ | 日报 | 怎么采数、怎么归纳、怎么出图出文、降级链 | 发到**哪个群**、几点发、只发群还是也发单聊 |
61
+ | 巡检 | 怎么判健康、异常长什么样 | 卡住了**报给谁** |
62
+ | 交付 | 怎么生成、怎么回读确认送达 | **收件人**、窗口、频次 |
63
+
64
+ Skill 里仍然写死通用红线(如"默认只发主人单聊;发群必须本次明确指定"),而那个"明确指定"由唤醒提示词提供——提示词来自版本化的 `schedules` 声明,本身就是可信来源,不是从消息正文猜来的。
65
+
66
+ **把群 ID 焊进 `SKILL.md` 的代价**:换个群、加个收件人、挪个时间,都要改 Skill 并重新 `dta deploy` 一次能力包;同一个能力也没法同时服务多个投递场景(早上发 A 群、晚上发 B 群就得复制一份 Skill)。策略留在 schedule 里,改调度不动能力。
67
+
68
+ ---
69
+
70
+ ## 在仓库里声明:`dingtalk-agent.json#schedules`
71
+
72
+ 节律是**声明式的版本化产物**,不是在平台上手敲的命令式状态。字段 **provider 中立**(cron + timezone + mode 是通用的),provider adapter 负责映射。
73
+
74
+ ```jsonc
75
+ "schedules": [
76
+ {
77
+ "name": "画像拍", // 人类标签,也作平台侧标题
78
+ "cron": "35 8-22 * * *", // 标准 5 段,无秒、无 @daily(dta 校验)
79
+ "timezone": "Asia/Shanghai", // IANA,显式写,别靠默认
80
+ "mode": "ephemeral", // ephemeral=run-only / work-item=每拍产一个工作项
81
+ "wake": "HEARTBEAT 画像拍", // ① 唤醒只带这个类别;Agent 读它给本拍定作用域
82
+ "purpose": "学生画像·增量折新日志",
83
+ "completion": "每个活跃校招生画像水位 ≥ 他最新日志日期", // ② 数据派生的判据
84
+ "unit": "增量折新日志、不重建;一拍 ≤6 人;独立预算", // ③
85
+ "evidence": "profile-stamp 后新鲜度缓存水位推进", // ④
86
+ "supervision": "健康巡检(backlog 收敛趋势)" // ⑤
87
+ }
88
+ ]
89
+ ```
90
+
91
+ `name / cron / timezone / mode` 必填;`completion` 起的五问元数据强烈建议写全——它们是**给评审的驱动契约**,让"这条节律设计对不对"能被看见,而不是散落在某人脑子里。`dta info --json` 会回读并校验(5 段 cron、合法 mode、name 唯一)。
92
+
93
+ ### completion 用注册表引用,别写自由文本
94
+
95
+ `completion` 推荐写成 `predicate:<id>`,引用 manifest 顶层的 `predicates` 注册表:
96
+
97
+ ```jsonc
98
+ "predicates": {
99
+ "profile-watermark-current": { // kebab-case id
100
+ "description": "每个活跃校招生画像水位 ≥ 他最新日志日期", // 必填:完成 = 数据里哪个可查状态
101
+ "source": "AI 表格 profile-stamp 字段 vs 日志表最新日期" // 可选:判据的数据来源/查法
102
+ }
103
+ },
104
+ "schedules": [{ ..., "completion": "predicate:profile-watermark-current" }]
105
+ ```
106
+
107
+ 为什么不直接写句子:自由文本判据在运行时是给模型读的一段话,一句「跑过了」式的注入就能把它盖掉;而且声明侧与运行路径(autopilot 描述、Receipt)各手抄一份判据,改了一处忘另一处就**静默分叉**——真事故里两套判据分叉了 30 小时无人报警。注册表让两侧引用**同一个 id**:`dta schedule plan` 的 apply 命令会在 autopilot description 尾部追加 `[dta-completion-predicate] <id>` 标记(独立一行;解析它的 parser 全仓只有一个定义,TS 在 `schedule-plan.ts`、Python 在 `multica_ext.py` 互为镜像)。
108
+
109
+ **回读校验(fail-closed)**:`multica_ext.py autopilot-create` 在创建后独立 GET 回读、比对远端 description 的标记与声明——create 响应可能只是请求回显,只有回读算数;标记丢失/被改写则非零退出并输出 `predicateRef.verified:false`,不把部署当成功。`autopilot-list/get` 会附上解析出的 `predicateRef`,对账时漂移可见。
110
+
111
+ **跨语言合同**:注册表就在 `dingtalk-agent.json` 本体里,`multica_ext.py predicate-resolve --manifest dingtalk-agent.json(--id | --description)` 在**同一份 JSON** 里取判据正文,不另建第二份判据源;未注册 id / malformed / 冲突 marker 非零退出。⚠️ **运行时可达性尚未接线**:skill-push 不携带项目 manifest、目标 runtime 也不保证有 resolver,`predicate-resolve` 目前是 **operator 侧**对本地 checkout 使用的工具——受管的 runtime 注册表交付(绑定部署 hash)由 issue #46 跟踪,是本仓待办;run 级结构化 predicateRef 字段与平台回执通道则是上游缺口(MUL-011),两者不混。
112
+
113
+ **渐进门禁**(`dta schedule show` / `plan` 判定):引用未注册的 id → 阻断;一旦声明了 `predicates` 注册表(**包括显式空对象 `{}`——那是「已进入引用模式」,不是未声明**),自由文本 `completion` 也阻断(必须全量引用);`predicate:` 前缀后 id 为空或非法按 malformed 引用阻断,绝不降级成自由文本;没声明注册表的存量项目自由文本不阻断,只在 `unregisteredCompletion` 里提示迁移。
114
+
115
+ **声明与部署解耦**:`schedules` 进了 manifest,但 `dta deploy` 的部署哈希只算本体+skill(不含 schedules),所以**加/改节律不会误动本体部署、不造成 drift**。
116
+
117
+ ---
118
+
119
+ ## 走 dta 部署:区分 provider
120
+
121
+ 节律的**声明**属于 Agent Project,节律的**能力**属于目标平台,两者能力不匹配必须 fail closed,不静默降级成"那就不定时了"。dta 拥有"声明 → 按 provider 映射 → 对账"的契约;**触发器的实际发起仍在平台侧**(保持"触发器不属于 dta 核心执行"的边界)。
122
+
123
+ | provider | mode 映射 | 落地 |
124
+ |---|---|---|
125
+ | **multica-dingtalk** | `ephemeral`→autopilot `run_only`;`work-item`→`create_issue` | autopilot(5 段 cron + IANA 时区) |
126
+ | **deap** | — | **fail closed**,能力未开放,声明记为缺口 |
127
+
128
+ 平台各自能提供什么,以该平台 `PLATFORM.md` 为准——**平台之间能力不同是常态**。同一份 `schedules` 声明可以不变,能不能被满足由目标平台回答;不支持的部分明确报缺口。中立词汇(`schedule`/`ephemeral`/`work-item`)见 provider SPI,别把平台词(autopilot/execution_mode)泄进声明。
129
+
130
+ ---
131
+
132
+ ## 三条与平台无关的硬约束
133
+
134
+ - **定时不可靠是常态**:平台会塌缩漏掉的 fire、跳过迟到过久的(Multica 阈值 5 分钟)。判据必须写成「它今天/本周发生了没有」,不是「那一拍跑了没」。
135
+ - **外发类节律没有锁**:外发的留痕写在动作之后,两条节律**同一时刻**并发会把同一条消息发两遍给第三方。**多节律必须错开 fire 时刻**(分钟×小时都不相交才算错开——`0 0-6` 与 `0 23` 同分钟但不同刻,不算撞;`dta schedule show` 现在按真 fire 时刻判,不再只看分钟),并在 Skill 里写死"一拍内同一件外发绝不执行第二次"。**所有节律写同一个 timezone**:跨时区的 `0 9 * * *`@Asia/Shanghai 与 `0 1 * * *`@UTC 是同一时刻,本地算不出来,一律当撞车挡住部署。
136
+ - **Agent 不自建定时器、不自改节律**:节律是可审计的部署产物。在线 Run 只能把新节律整理成候选交给 operator——和"在线 Run 不能热改身份/权限/Skill"是同一条边界。
137
+
138
+ **再两条排布经验**(真实生产换来,详见 [AGENT-IN-PRODUCTION.md](../../../../docs/AGENT-IN-PRODUCTION.md) §1):**有时效的轻活排前,别让重活饿死它**——把每次都超时的重活排在一拍最前,后面的对账/收件会整轮轮不到(真事故:留痕对账排夜拍第 7 位、夜间重建每拍超时,结果整夜没跑到);正解是轻活/有时效的排前,或给重活单独一条节律、独立预算。**入口是脉冲、出口是均匀**——用户常集中在某时段涌入,产能要按峰值窗口算,按日均算会在高峰欠账。
139
+
140
+ ---
141
+
142
+ ## 谁来设定:三角色
143
+
144
+ | 角色 | 职责 |
145
+ |---|---|
146
+ | **Agent 提议** | 岗位(它的 skill)声明"我需要这几条节律",把 `schedules` 写进 Project;在线只能提候选,不自装 |
147
+ | **operator 持有 + 应用** | 审阅声明、决定拍频/窗口、应用到平台;握着改的权力 |
148
+ | **平台执行 + 可对账** | 到点 fire;`declared ↔ live` 可对账,漂移可见 |
149
+
150
+ "谁设定 cron"因此有一个可审计的答案——**仓库里声明、operator 应用、平台执行**,而不是"谁手敲的只有他知道"。
151
+
152
+ ---
153
+
154
+ ## 装配自检
155
+
156
+ - [ ] 每件周期性的事都归到三类之一,说得出理由(有没有终态)
157
+ - [ ] 每条节律五问都答全,写进 `dingtalk-agent.json#schedules`
158
+ - [ ] ② 完成判据逾期后持续为真、能从数据查出,不依赖某一拍准时;已迁到 `predicates` 注册表、`completion` 是 `predicate:<id>` 引用
159
+ - [ ] ③ 是增量 delta 不是重建;单拍在预算内、能收敛
160
+ - [ ] ④ 完成靠效果为证(write/receipt/水位),不认自述、不认空读
161
+ - [ ] ⑤ 有一条监督节律盯收敛、卡住报人
162
+ - [ ] 多条节律错开 fire 时刻、且统一一个 timezone(`dta schedule show` exit 0);外发类有"一拍内不重复"约束
163
+ - [ ] 有时效的轻活排在重活前面(或重活单独一条节律);别让排最前的超时重活饿死尾部轻活;产能按峰值窗口算不按日均
164
+ - [ ] 每条 `mode` 的可计量性心里有数(`schedule show` 标 metered;ephemeral 不记账,成本要另建观测层——见 AGENT-IN-PRODUCTION.md)
165
+ - [ ] 目标平台 `PLATFORM.md` 确认支持;不支持记为缺口,不静默降级
166
+ - [ ] `dta info --json` 回读校验通过(5 段 cron、合法 mode、name 唯一)
@@ -2,30 +2,28 @@
2
2
 
3
3
  本文件定义任何 Agent Host 都必须满足的加载不变量与证据形态。它是判据,不是某个 Host 的配置手册;具体机制写在 `references/hosts/<host>.md`。Host 换了,不变量不变;证据的绑定项换。
4
4
 
5
- ## 两个目录面
5
+ ## 一个发布面,一个临时运行面
6
6
 
7
7
  ```text
8
- skills/<role>/SKILL.md dta Definition / Git 发布源
9
- <host-exposure-dir>/<name>/ 该 Host 的运行时 exposure
8
+ agent/skills/<name>/ dta / Git / managed platform 的唯一发布源
9
+ <dta-temp>/<host-exposure-dir>/ 该 Host 的临时运行 exposure
10
10
  ```
11
11
 
12
- `skills/` 是发布源,Host 原生目录是运行时可见面。exposure 目录名由 Host 决定,不由本合同规定;两面都存在才算装配,只写一句「请应用某 Skill」或只把 `SKILL.md` 放进目录都不是完成。exposure 目录之间不互相蕴含:一个 Host exposure 通过,不代表另一个 Host 已经加载。
12
+ 仓库只提交一个发布源。Host 原生目录是 dta 在隔离运行/评测工作区生成的可见面,目录名由 Host 决定;任务结束后回收,绝不提交回仓库。一个 Host 的临时 exposure 通过,不代表另一个 Host 已经加载。
13
13
 
14
14
  ## 四条不变量
15
15
 
16
- ### 1. Definition Host 的原生 project rule 加载,且不得重复进入 custom instructions
16
+ ### 1. Definition 只有一条 Host 加载路径
17
17
 
18
- Agent 本体走 Host 自己的项目规则通道,不由 dta 再注入一遍。等价路径(相对/绝对、大小写别名、symlink/hardlink)都要从 custom instructions 删除,避免同一份本体形成两条加载通道和两个可漂移真值。Host 若没有原生 project rule 通道,由该 Host adapter 声明替代机制并说明它为什么等价;没有替代机制就不是可用 Host,不是「可以退化成注入」。
19
-
20
- 受管本体当前只认项目根 `AGENTS.md`。Definition 指向其它文件时装配阻塞,由开发者先统一本体来源;不静默制造双真值。
18
+ Agent Definition manifest 精确指定。根 `AGENTS.md` 若存在,只是仓库开发约束。Host adapter 可用原生 project rule 或唯一 custom instruction 加载交付本体,但不能同时走两条路径;等价路径(相对/绝对、大小写别名、symlink/hardlink)都要去重。已有项目的自定义 Definition 路径受支持,不得为了 Host 方便静默复制第二份本体。
21
19
 
22
20
  ### 2. Basic Skill 的正文是每 Session 唯一的 resolved 强制指令,不是「可发现」
23
21
 
24
- `dingtalk-basic-behavior` 必须无条件进入每个 Session 的 resolved 指令集,且在 resolved 结果中只命中一次。目录存在、Skill 名可枚举、模型说得出 Skill 名,都不是加载证据——那是可发现,不是已加载。多个等价路径要去重成唯一规范值;glob/extglob 只有在可证明不命中受管本体与 Basic 及其 alias 时才保留,无法证明时阻塞并要求收窄。
22
+ `dta-basic-behavior` 必须无条件进入每个 Session 的 resolved 指令集,且在 resolved 结果中只命中一次。目录存在、Skill 名可枚举、模型说得出 Skill 名,都不是加载证据——那是可发现,不是已加载。多个等价路径要去重成唯一规范值;glob/extglob 只有在可证明不命中受管本体与 Basic 及其 alias 时才保留,无法证明时阻塞并要求收窄。
25
23
 
26
- ### 3. Basic exposure 必须整树物化,tree hash 与 canonical 一致
24
+ ### 3. 临时 Basic exposure 必须整树物化,tree hash 与发布源一致
27
25
 
28
- 物化 `SKILL.md`、`references/`、`assets/` 全树,文件清单与 tree hash 都对齐 canonical source。只对入口 `SKILL.md` 做 hash 不能证明隐私、授权、真相恢复等 reference 边界仍在——入口一致而 references 缺失是最常见的静默降级。装配时记录源路径、目标路径与 hash;源升级后重新物化并重新评测,不留两份独立维护的内容。
26
+ 在隔离工作区物化 `SKILL.md`、`references/`、`assets/` 全树,文件清单与 tree hash 都对齐唯一发布源。只对入口 `SKILL.md` 做 hash 不能证明隐私、授权、真相恢复等 reference 边界仍在。临时副本只用于本次 Host 运行与证据,不成为长期源码。
29
27
 
30
28
  ### 4. Role Skill 可发现且已授权,但不进强制加载集
31
29
 
@@ -35,11 +33,11 @@ Agent 本体走 Host 自己的项目规则通道,不由 dta 再注入一遍。
35
33
 
36
34
  证据必须由模型实际产出,不能由静态检查推断。
37
35
 
38
- 1. **Definition 零工具 canary 精确回显**:在隔离 Workspace 中给根 `AGENTS.md` 追加每 Run 随机 canary,屏蔽用户级/全局 instruction 与 config 面但保留 provider 认证,且不把 `AGENTS.md` 加入 custom instructions;Host 仍必须通过原生 rule 零工具精确回显该值。用了工具去读文件即失败——那证明的是文件可读,不是本体已加载。
36
+ 1. **Definition 零工具 canary 精确回显**:在隔离 Workspace 中给 manifest 指定的 Definition 追加每 Run 随机 canary,屏蔽用户级/全局 instruction 与 config 面但保留 provider 认证;Host 必须通过唯一加载路径零工具精确回显该值。用了工具去读文件即失败——那证明的是文件可读,不是本体已加载。
39
37
  2. **Basic 入口随机 probe + anti-guess baseline**:为 Basic 入口追加独立随机 probe,Host 必须精确回显;without-skill baseline 必须精确回答 `dta-load-probe=not-loaded`,空答、垃圾文本或其它 UUID 都失败。两组 run 数、随机 challenge、resolved 指令数与目录都从明细重算,不复用声明值。缺 baseline 的单边 probe 不成立——它无法区分「加载了」和「猜对了」。
40
38
  3. **代表性风险/授权 reference 的受限读取首尾随机值**:在风险/授权代表性 reference 的首行与末行各追加随机 canary,仅允许目标文件 read、显式拒绝 external directory,必须用一次从首行开始且覆盖全文的完成态读取同时取得两个值。任何额外 read、越界 read、无路径 read 或 tail read 都失败。
41
39
 
42
- 三类证据都通过才可能 `ready`;任一失败只能 `partial`。行为题不在 `AGENTS.md` 中复制预期答案,load gate 与行为分数分开报告——load gate 失败时,后续回答再像员工也只能算碰巧命中,不算本体与 Skill 已继承。
40
+ 三类证据都通过才可能 `ready`;任一失败只能 `partial`。行为题不在 Agent Definition 中复制预期答案,load gate 与行为分数分开报告——load gate 失败时,后续回答再像员工也只能算碰巧命中,不算本体与 Skill 已继承。
43
41
 
44
42
  ## 证据通用,绑定项由 adapter 提供
45
43
 
@@ -4,29 +4,30 @@
4
4
 
5
5
  **adapter 状态:未实现。** Claude Code 目前**不能**签发 Definition canary、Basic 入口 probe/anti-guess 与代表性 reference read canary 三类证据,因此选定 Claude Code 的装配结论**只能是 `partial`**。下文的机制描述是配置指引,不是「已验收」的声明。不要把本文件读成 Claude Code adapter 已经可用。
6
6
 
7
- ## Definition:Claude Code 不原生读取 AGENTS.md
7
+ ## Definition:Claude Code 不原生读取 Agent Definition
8
8
 
9
- 这是与 OpenCode 最关键的差异。OpenCode 与 Codex 都把项目根 `AGENTS.md` 当原生 project rule;**Claude Code 不读 `AGENTS.md`**,它的原生 project rule 文件是 `CLAUDE.md`。直接把 `AGENTS.md` 放在根目录,Claude Code 的 Session 里不会有本体正文——目录看起来完全正确,本体却从未加载。
9
+ 这是与 OpenCode 最关键的差异。新项目的仓库根 `AGENTS.md` Coding Agent 开发约束,交付本体由 manifest `agent.definition` 指向(默认 `agent/AGENTS.md`)。**Claude Code 不会因为 manifest 声明就自动读取这个文件**,它的原生 project rule 文件是 `CLAUDE.md`。
10
10
 
11
- 两条可选接法,都保持 `AGENTS.md` 为唯一本体真值:
11
+ Claude adapter 实现时应在 dta 管理的隔离工作区建立唯一加载通道,同时保持 manifest 指向的文件为唯一本体真值:
12
12
 
13
13
  ```text
14
- CLAUDE.md 内含 @AGENTS.md 引用 Claude Code 解析该引用并把 AGENTS.md 正文纳入 project rule
15
- CLAUDE.md -> AGENTS.md(符号链接) 同一份文件,两个 Host 各按自己的约定发现
14
+ CLAUDE.md 内含 @agent/AGENTS.md 引用 Claude Code 解析该引用并纳入 project rule
15
+ CLAUDE.md -> agent/AGENTS.md(符号链接) 同一份文件,两个 Host 各按自己的约定发现
16
16
  ```
17
17
 
18
- 两条路都不得把 `AGENTS.md` 的正文复制进 `CLAUDE.md`——复制会产生第二个可漂移真值,违反不变量 1 的等价路径去重要求。同理,`AGENTS.md` 及其等价路径不得再出现在任何 custom instruction 面。
18
+ 两条路都不得把 Agent Definition 正文复制进 `CLAUDE.md`——复制会产生第二个可漂移真值,违反不变量 1 的等价路径去重要求。同理,Definition 及其等价路径不得再出现在其它 custom instruction 面。仓库根开发用 `CLAUDE.md` 不属于交付包,不能被同步到 managed agent platform。
19
19
 
20
- 受管本体仍只认项目根 `AGENTS.md`;`CLAUDE.md` 在这里是 Claude Code 的加载通道,不是本体的第二个来源。
20
+ 受管本体只认 manifest 的 `agent.definition`;临时 `CLAUDE.md` 只是 Claude Code adapter 的加载通道,不是本体的第二个来源。已有仓库显式声明其它 Definition 路径时保持兼容,不强制搬迁。
21
21
 
22
- ## Skill exposure:`.claude/skills`,不与 `.agents/skills` 共享
22
+ ## Skill exposure:临时 `.claude/skills`
23
23
 
24
24
  ```text
25
- .claude/skills/dingtalk-basic-behavior/ Claude Code 必需 Basic exposure
26
- .claude/skills/<role>/SKILL.md Role Skill exposure
25
+ agent/skills/<name>/ Git / managed platform 的唯一 Skill 发布源
26
+ <dta 临时工作区>/.claude/skills/dta-basic-behavior/ Claude Code 必需 Basic exposure
27
+ <dta 临时工作区>/.claude/skills/<role>/SKILL.md Role Skill exposure
27
28
  ```
28
29
 
29
- `.claude/skills` 是 Claude Code 独有的目录约定。`.agents/skills` Codex OpenCode 共享,**Claude Code 不读它**——已有 `.agents/skills` 的仓库切到 Claude Code 时必须另行物化到 `.claude/skills`,不能假设已有 exposure 可以复用。
30
+ `.claude/skills` 是 Claude Code 独有的目录约定,`.agents/skills` OpenCode/Codex exposure;两者都是 dta 在隔离运行或评测目录中的 Host 面,不能提交到业务仓库。Claude adapter 必须从 manifest `agent.skillsRoot` 临时物化 `.claude/skills`,不能复用另一个 Host 的 exposure,也不能制造第二份 Git 真值。
30
31
 
31
32
  Basic exposure 按不变量 3 整树物化(`SKILL.md`、`references/`、`assets/`),tree hash 对齐 canonical source;只复制入口即视为未装配。目录名必须等于 frontmatter `name`。Role Skill 按不变量 4 暴露但不进强制加载集。
32
33
 
@@ -43,6 +44,6 @@ Basic exposure 按不变量 3 整树物化(`SKILL.md`、`references/`、`asset
43
44
 
44
45
  ## 当前可做与不可做
45
46
 
46
- 可做:按上面两条接法之一把 `AGENTS.md` 接入 `CLAUDE.md`;把 Basic 与 Role Skill 整树物化到 `.claude/skills`;跑静态 `dta agent audit` 检查 Definition 语义、Storage 与文件完整性。
47
+ 可做:按上面两条接法之一把 manifest 指向的 Agent Definition 接入临时 `CLAUDE.md`;从 `agent.skillsRoot` 把 Basic 与 Role Skill 整树物化到临时 `.claude/skills`;跑静态 `dta agent audit` 检查 Definition 语义、Storage 与文件完整性。
47
48
 
48
49
  不可做:宣称 Basic Skill 每 Session 已加载;签发或复用三类加载证据;给出 `ready`。静态审计通过的上限是 `partial`,缺口写成「Claude Code adapter 未实现,三类加载证据不可得」,而不是「无需检查」。