@xdxer/dingtalk-agent 0.1.5-beta.14 → 0.1.5-beta.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,21 @@
2
2
 
3
3
  All notable changes to `@xdxer/dingtalk-agent` are documented here. The project follows semantic versioning; prerelease entries describe release candidates and do not imply that Live canaries or registry publication have completed.
4
4
 
5
+ ## 0.1.5-beta.15 - 2026-07-25
6
+
7
+ Starting a general-purpose office Agent from an empty workspace now actually reaches the model. Four deterministic false blocks stood between a clean checkout and an L1 evaluation, and all four had the same shape: the source project's declaration was being judged as if it were the sandbox's final state, or the grader was stricter than the contract it enforced. Ships on the `beta` dist-tag; `latest` stays at 0.1.4. Merged as PR #68.
8
+
9
+ ### Fixed
10
+
11
+ - **A clean workspace was rejected before the runner could materialize the Basic exposure (closes #67).** A source `opencode.json` may declare the managed path `.agents/skills/dta-basic-behavior/SKILL.md`, which the eval runner materializes inside an isolated sandbox — committing it back would create a second Skill source. The old check tested for that file in the *source* project, so a clean project failed before any model call. Exactly one runner-managed Basic instruction is now allowed to be absent, and only while it does not exist; globs, absolute paths, `..`, external URLs and out-of-workspace targets still fail closed, and after materialization the sandbox is still verified through `verifyRequiredBasicSkill` and the full tree hash.
12
+ - **The default model ID had been retired by the provider.** `deepseek/deepseek-chat` is refused with a 400, which meant `lab eval`, `agent audit --verify-load` and the workspace generated by `agent enhance` could all fail before any behaviour was measured. The default now lives in one constant (`DEFAULT_OPENCODE_MODEL`, currently `deepseek/deepseek-v4-flash`) that eval, audit, enhance and the fixtures all read.
13
+ - **`agent enhance` silently chose OpenCode as the Host.** The Compose Skill says not to pick a Host for the user, but every new project's plan contained `opencode.json` and a `local-dev` workspace regardless. `--host opencode|none` is now required: `opencode` declares the local workspace and merges `opencode.json`, `none` produces a harness-agnostic package with no workspaces and an audit ceiling of `partial`. Dry runs remain side-effect free for local files, DWS and Triggers (compose Skill 0.17.0).
14
+ - **`--cases basic-skill-load` reported that an existing case did not exist.** Case selection filtered out every `load-probe` and then tested the requested ids against what was left. Existence is now checked against the full case set, selecting only load-probes enters load-only mode with its dynamic UUID challenge, and mixing a load-probe with behaviour cases still runs the load gate while executing just the selected behaviours.
15
+ - **A single sentence of preamble failed the reference probe.** The model read the right file in one full read, with the right tool path and permission scope, and echoed both random UUIDs correctly — but `answer.trim() === expected` failed it for saying "let me read that file first". Grading is now a terminal-single-probe contract: the last line must equal the random probe exactly and the whole answer must contain that token exactly once. A second probe token still fails closed, the definition probe keeps strict equality, and nothing about tool paths, full reads, permission scope or raw traces was relaxed.
16
+ - **The load report conflated two different baseline failures.** "Did not guess the random challenge" is a security property; "emitted the sentinel exactly" is protocol compliance. When a baseline run answers with a pseudo tool tag it satisfies the first and not the second, yet both report fields computed the same expression. Two facets (`challengeNotGuessed`, `sentinelExact`) now show them separately. The gate is unchanged — a baseline still passes only on an exact sentinel match — so no assertion moved.
17
+
18
+ Model-stability findings from the same session (multi-run variance on three basic office cases; baselines occasionally emitting pseudo tool tags) are kept as open questions with their raw evidence rather than folded into production rules: a single batch does not prove a Skill's gain, and a failure is not turned into a success by relabelling it.
19
+
5
20
  ## 0.1.5-beta.14 - 2026-07-25
6
21
 
7
22
  The packaged docs stop lying to the person following them, and the project says one thing about itself instead of three. Three of the errors were on the first-hour path and shipped inside the tarball, so a fix that only landed on GitHub would not have reached anyone. Ships on the `beta` dist-tag; `latest` stays at 0.1.4. Merged as PRs #63 and #64.
package/README.md CHANGED
@@ -66,9 +66,10 @@ dta agent audit --json # 预期 partial:岗位语义还是模板,这是
66
66
 
67
67
  ```bash
68
68
  # 1. 创建零写入计划,再显式落盘
69
- dta agent enhance --project-name release-agent --role-skill release-manager --dry-run --json
70
69
  dta agent enhance --project-name release-agent --role-skill release-manager \
71
- --plan-id <plan-id> --yes --json
70
+ --host opencode --dry-run --json
71
+ dta agent enhance --project-name release-agent --role-skill release-manager \
72
+ --host opencode --plan-id <plan-id> --yes --json
72
73
 
73
74
  # 2. 审计、运行与评测
74
75
  dta agent audit --bindings agent.bindings.json --require-skill release-manager --json
@@ -128,8 +128,8 @@ dingtalk-agent 开发者装配验收
128
128
  agent audit [--bindings agent.bindings.json] [--require-skill <name>]
129
129
  agent audit [--bindings <file>] [--require-skill <name>] --verify-load --yes
130
130
  agent audit [--bindings <file>] --load-report <agent-audit-load-evidence.json> [--remote-report <report.json>]
131
- agent enhance --role-skill <name>[,<name>] [--project-name <name>] [--dry-run] [--json]
132
- agent enhance --role-skill <name>[,<name>] --plan-id <current-plan-id> --yes [--json]
131
+ agent enhance --role-skill <name>[,<name>] --host <opencode|none> [--project-name <name>] [--dry-run] [--json]
132
+ agent enhance --role-skill <name>[,<name>] --host <opencode|none> --plan-id <current-plan-id> --yes [--json]
133
133
 
134
134
  默认只做本地静态审计,不访问 DWS、不调用模型;状态为 partial 时返回退出码 2。
135
135
  --verify-load --yes 会运行隔离的 OpenCode load probe,但仍不访问钉钉。
@@ -1166,7 +1166,7 @@ async function main() {
1166
1166
  args: argv.slice(2),
1167
1167
  options: {
1168
1168
  bindings: { type: 'string' }, 'project-name': { type: 'string' },
1169
- 'role-skill': { type: 'string' }, model: { type: 'string' },
1169
+ 'role-skill': { type: 'string' }, host: { type: 'string' }, model: { type: 'string' },
1170
1170
  memory: { type: 'string' }, knowledge: { type: 'string' },
1171
1171
  artifacts: { type: 'string' }, 'state-dir': { type: 'string' },
1172
1172
  profile: { type: 'string' }, 'expected-user-id': { type: 'string' },
@@ -1180,7 +1180,8 @@ async function main() {
1180
1180
  fail('agent enhance plan 不接受 --plan-id;它由 dry-run 生成');
1181
1181
  const options = {
1182
1182
  bindings: o.bindings, projectName: o['project-name'],
1183
- roleSkills: o['role-skill']?.split(','), model: o.model,
1183
+ roleSkills: o['role-skill']?.split(','),
1184
+ host: o.host, model: o.model,
1184
1185
  memory: o.memory, knowledge: o.knowledge, artifacts: o.artifacts,
1185
1186
  stateDir: o['state-dir'], profile: o.profile,
1186
1187
  expectedUserId: o['expected-user-id'], cliVersion: PACKAGE_JSON.version,
@@ -1886,7 +1887,7 @@ function printAgentAudit(out) {
1886
1887
  function printAgentEnhance(out) {
1887
1888
  if (out.$schema === 'dingtalk-agent/agent-enhancement-plan@1') {
1888
1889
  console.log(`${strong('dingtalk-agent agent enhance')} · ${mark(out.ready ? 'pass' : 'fail', out.ready ? 'READY PLAN' : 'BLOCKED')}`);
1889
- console.log(` planId=${out.planId} project=${out.projectName}`);
1890
+ console.log(` planId=${out.planId} project=${out.projectName} host=${out.host}`);
1890
1891
  console.log(` sideEffect=${out.sideEffect} dingtalkSideEffect=${out.dingtalkSideEffect}`);
1891
1892
  for (const operation of out.operations) {
1892
1893
  console.log(` ${operation.kind.toUpperCase()} ${operation.path}: ${operation.reason}`);
@@ -1901,7 +1902,7 @@ function printAgentEnhance(out) {
1901
1902
  return;
1902
1903
  }
1903
1904
  console.log(`${strong('dingtalk-agent agent enhance')} · ${mark('pass', 'APPLIED')}`);
1904
- console.log(` operation=${out.operationId} planId=${out.planId}`);
1905
+ console.log(` operation=${out.operationId} planId=${out.planId} host=${out.host}`);
1905
1906
  console.log(` changes=${out.changes.length} idempotent=${out.idempotent}`);
1906
1907
  if (out.backupRoot)
1907
1908
  console.log(` backup=${out.backupRoot}`);