## 中文
新增通用助手的双语展示条目,主文件明确声明 system/repository,sidecar 使用
listing-only。市场展示内置状态,更新复用 Agent 仓库合并;客户端负责离线安装与默认手动多会话。
独立公开源仓库:[agent-general-assistant](https://github.com/desirecore/agent-general-assistant),初始内容已通过
PR #1 合入 main。客户端实现:desirecore/desirecore#4814。
验证:i18n 与 catalog metadata 均 0 errors(105
条既有条目警告),翻译新鲜度与公开内容检查通过;客户端已从真实 main 生成种子,真实 bundle verification 通过。
## English
Add the bilingual General Assistant listing with explicit
system/repository policies and listing-only availability. The client
owns offline provisioning and manual multi-session defaults; updates use
the agent repository merge flow.
The public source repository is available on main. Client integration:
desirecore/desirecore#4814. i18n/catalog validation passed with 0 errors
and 105 existing warnings, alongside translation freshness and
publication checks. The real main-based seed and bundle verification
passed.
Upstream health checks could select a different branch ending in `main`,
index internal skills or lowercase reference documents, treat a valid
pinned path as broken after an upstream move, and close the tracking
issue while unpinned or unknown entries remained. Resolve exact refs and
tracked filenames, compare the installed snapshot, and drive issue
decisions from structured results.
Refresh 26 reviewed pointers, pin DingTalk and Matt Pocock collections,
remove the deleted merge-conflict skill, and add the six new public
children with reviewed translations. Synchronize sidecars, observed
release facts, license evidence and external dependency disclosures.
Identical-tree Agent pins and their versions remain unchanged. The
per-entry review is recorded in
`docs/upstream-health-189-remediation.md`.
Validation: 99 unit tests pass; all nine pinned collections reproduce;
catalog/i18n and translation-freshness checks pass; online health checks
all 41 external entries with zero broken, actionable or unknown results.
Existing catalog warnings decrease from 123 to 105 with no new warning
groups. Python/workflow shell syntax and whitespace checks pass.
Closes#189.
The catalog previously showed opaque icons or text fallbacks for the
seven digital employees, and source-pointer installs could still get
different avatars. This updates every catalog card to a 512×512
transparent portrait, bumps the listed releases, and pins the six source
repositories to commits that include the matching AgentFS avatar.
Validation: `validate_catalog_metadata.py --require-complete` (0
errors), `validate-i18n.py` (0 errors), and `translate.py --check`. All
seven WebP files have an alpha channel with fully transparent pixels and
are below 50 KB each.
## 变更说明 / What this changes
新增官方 Agent 条目「MiMo 模型余量检测」,以不可变 source pointer 形态收录,内容仓库为
`desirecore-agent/mimo-model-quota-monitor`。
- `agents/mimo-model-quota-monitor/entry.json` 指向已发布提交
`911c0a226346a8157f07d5218207f16e32ea82e0`。
-
`agents/mimo-model-quota-monitor/catalog-metadata.v1.json`:provenance、MIT
许可证证据、合规审查(`reviewedRef` 与内容 ref 一致),`availability: installable`。
- `requiredClientVersion: 10.0.156`:依赖该版本起的调度完成判据、调度权限上限与内嵌浏览器操作记录修复。
- `manifest.json`:Agent 计数与更新日期。
Agent 做什么:按计划(默认每小时)读取小米 MiMo 开放平台 Token Plan 余量,结构化写入 `latest.json`
与每轮一份历史文件,在余量偏低、消耗过快、即将重置或登录失效时提醒。只读、不执行命令;遇到验证码或短信验证时停下请人处理;登录凭据只经
DesireCore 加密凭据存储的占位符注入。
Adds the official "MiMo model quota monitor" Agent as an immutable
source pointer to `desirecore-agent/mimo-model-quota-monitor` at commit
`911c0a226346a8157f07d5218207f16e32ea82e0`, with a bilingual catalog
sidecar (provenance, MIT license evidence, compliance review with
`reviewedRef` equal to the content ref, `availability: installable`) and
`requiredClientVersion: 10.0.156`. The Agent reads the Xiaomi MiMo Token
Plan quota on a schedule, writes structured results, and alerts on low
quota, fast burn, upcoming reset or an expired login. It is read-only,
runs no shell commands, stops for CAPTCHA or SMS verification, and
receives credentials only through DesireCore's encrypted credential
placeholders.
## 校验 / Validation
- `uv run --quiet scripts/catalog/validate_catalog_metadata.py
--require-complete`:0 error(既有条目的 warning 未变)。
- 条目目录内所有 40
位十六进制值只有一个,即上面的提交号(`source.ref`、`provenance.content.ref`、`governance.compliance.reviewedRef`
三处一致)。
- 内容仓库:`agent.json` 通过 agentConfigSchema;`SKILL.md` frontmatter 通过技能
Schema;`HEARTBEAT.md` 被判为实质为空(心跳不会白调模型);结果与账号 Schema 用样例和反例校验,共 19 项通过。
- 内容仓库共两个提交(首版 + SOP 失败分支表更新),不含账号标识、手机号或凭据。Git 提交元数据中的维护者邮箱是 DesireCore
组织所有公开提交一致使用的公开身份邮箱。
`validate_catalog_metadata.py --require-complete` reports 0 errors; the
entry directory contains exactly one 40-hex value, the pinned commit, in
all three places; the content repository passes agent config, skill
frontmatter, heartbeat and result/account schema checks (19 checks) and
has two commits (initial release plus the SOP failure-branch update)
without account identifiers or credentials.
## 真机验证 / Real-device verification
在 DesireCore dev 构建(10.0.156 之后的 dev,含
#2863/#2865/#2869)上安装本提交的内容,智能路由旗舰档,两个账号各一个每小时定时巡检,连续观察四轮:
| 轮次 | 结果 | 说明 |
|---|---|---|
| 账号 2 · 20:30 | ok | 经接口取到数据,`latest.json` 与本轮 history 文件通过
`result.schema.json`,history 先写、关闭会话、`latest.json` 最后写 |
| 账号 1 · 21:00 | blocked(`platform_unavailable`) |
本机网络间歇断连期间内置浏览器开不了会话;如实落盘,未新建浏览器环境、未反复填表,首轮不提醒 |
| 账号 2 · 21:30 | 失败 | 同一次断网里浏览器开不了会话,且 AI 审批上游持续 502,写 `latest.json`
被拒;平台按完成判据续跑一次后记为失败(已写入使用说明「已知限制」) |
| 账号 1 · 22:00 | blocked,已提醒 | 连续第二轮 `platform_unavailable`,按告警规则
`notify=true`、告警项 `blocked:platform_unavailable` |
四轮都没有执行任何命令,没有非预期工具调用,没有写出 `mimo-quota/` 与平台 Plan 目录以外的文件;每轮的结果文件都通过
Schema 校验。浏览器宿主把导航失败统一报成 `BROWSER_HOST_EXECUTION_FAILED` 的问题已在主仓 #2871
修复(10.0.157 起提供 `BROWSER_NAVIGATION_*` 闭集错误码),本提交的 SOP
失败分支表已随之更新:网络类失败按码重试一次、页面跳转顶替(ABORTED)先看停留页再分流、越出授权范围(ORIGIN_NOT_GRANTED
/ SCHEME_DENIED)不新建 space。旧客户端上这些码不会出现,条目行为退回原有兜底,不受影响。
Installed this commit's content on a DesireCore dev build (dev after
10.0.156, including #2863/#2865/#2869) with smart routing at the
flagship tier and one hourly schedule per account, and observed four
runs. Account 2 at 20:30 read the data through the API; `latest.json`
and the per-run history file passed `result.schema.json`, with history
written first, the session closed, and `latest.json` written last.
During a local network outage, account 1 at 21:00 could not open a
browser session and recorded `blocked` / `platform_unavailable` without
creating environments or retrying the login, and without notifying on
the first round; account 2 at 21:30 hit the same outage plus sustained
502s from the AI approval upstream, so its `latest.json` write was
denied and the run was recorded as failed after one platform
continuation (now listed under known limitations); account 1 at 22:00
was the second consecutive `platform_unavailable` and notified with
`blocked:platform_unavailable`. No run executed a command, called an
unexpected tool, or wrote outside `mimo-quota/` and the platform Plan
directory, and every result file passed schema validation. The browser
host reporting all navigation failures as
`BROWSER_HOST_EXECUTION_FAILED` was fixed in the main repository in
#2871 (closed-set `BROWSER_NAVIGATION_*` codes from 10.0.157), and the
SOP in this commit was updated accordingly: network-class failures retry
once by code, a navigation replaced by a page jump (ABORTED) inspects
the landed page before branching, and out-of-grant targets
(ORIGIN_NOT_GRANTED / SCHEME_DENIED) never create a new space. On older
clients these codes simply do not appear and the entry falls back to the
previous behavior.
Pin the reviewed Entry patch prompted by a real Qwen consultation:
distinguish full tender documents from a notice/invitation and describe
useful outcomes without defect-free assurance. Catalog validation
passed; team member pins are unchanged.
Co-authored-by: yige <yige@yigedeMacBook-Neo.local>
Ordinary tender review was blocked by mandatory TaskSpec preparation,
metadata preflight, fixed report packages and runtime receipts, while
the business quality of delivered opinions remained insufficiently
explicit.
This release accepts clear natural-language assignments and defines
concrete goals, good and bad outcomes, evidence expectations and focused
corrections for each role. Chat, tables and files are valid
deliverables. Specialist calculations and legacy structured-export
validators remain available for their specific purposes. It removes
obsolete business input contracts and updates the corresponding
bilingual guides.
Validation was performed after the full multi-repository modification:
JSON/configuration and document-link checks, targeted calculation
regressions, independent content review, and eight synthetic
paper-evaluation scenarios (8/8 after fixing informational-only entry
handling and residual visual preflight/human gates). Paper evaluation is
not a live DesireCore/Qwen or real-tender accuracy result. No real bid
package was tested.
---------
Co-authored-by: yige <yige@yigedeMacBook-Neo.local>
## What this changes
Adds the tender-review team and its onboarding entry to the official
Market catalog as an immutable source pointer, plus bilingual catalog
sidecars.
- `teams/biao-shu-lian-he-shen-cha/entry.json` points to the published
team commit `7ee5650b066cdee385288a722b8cbd8e1947d0fe`.
- `agents/tender-review-assistant/entry.json` points to assistant commit
`4b6855d2edb535f81c29847e06145c0da87942d0`.
- Both entries include bilingual descriptions, privacy boundaries and
`requiredClientVersion: 10.0.155`.
- The listing is deliberately `pointer` / preview. It does not claim the
v10.0.155 release is fully green or production-certified; newcomer
qualification remains pending.
## Validation
- `python3 scripts/catalog/validate_catalog_metadata.py --json` — 0
errors (existing catalog warnings unchanged).
- Market entry and both `catalog-metadata.v1.json` sidecars validate
against the current client/catalog schemas.
- Published source repositories and full commit pins were checked before
creating this branch.
---------
Co-authored-by: yige <yige@yigedeMacBook-Neo.local>
## 中文
上一个 PR(#136)把两条能力边界写进了 `USAGE.md`。但 `USAGE.md` **刻意不进模型上下文**(ADR-143,与
`fullDesc` 分开正是为了不占每轮 token)——也就是说运行时模型并不知道这些边界,遇到 `851003` 仍会当故障重试。本 PR
把它们落到技能侧。
重新 pin 到内容仓库
[`ebb1903`](ebb19035bb)。
### 三条改动
**1. `wecom-shared` 新增「零之四:企业人数改变机器人的身份」**
| 企业规模 | 模式 | 以谁的身份调用 | 能否读到真人的东西 |
| --- | --- | --- | --- |
| ≤ 10 人 | 小团队模式 | 授权真人 | 能,继承其文档权限 |
| > 10 人 | 企业模式 | 机器人独立身份 | **不能** |
写明了它与既有「零之一」的分工——零之一管**写**(任何规模下只能写机器人自己建的),本条管**读**(>10
人连读都不继承)。给出正确动作:说明边界 + 建议把文档显式分享给机器人,而不是重试。并标注**这条不可自查**:CLI
没有查企业人数的接口,`identity whoami` 也不返回规模,只能从实际返回反推。来源为上游 issue #64 维护者确认。
此前这个概念只藏在 `wecomcli-smartsheet/references/smart-sheet-webhook.md`
里,是局部知识,而且表述成「写入接口被限制」——真实机制是身份不继承,本 PR 一并修正。
**2. `wecom-shared` 易错点补「方法描述里也有不存在的参数」**
比既有的「服务描述里有不存在的能力」更隐蔽:方法真的存在,只是做不到描述承诺的事。实测三处,`--schema` 请求体里根本没有对应字段:
| 方法 | 描述承诺 | 请求体实际只有 |
| --- | --- | --- |
| `calendar schedules cancel` | 周期日程需指定编辑规则 | `schedule_id` |
| `calendar schedules update` | 同上 | 11 个字段,无一是周期规则 |
| `meeting cancel` | 周期会议取消单次需指定子会议 ID | `meeting_id` |
这解释了 `wecomcli-calendar` / `wecomcli-meeting` 为何禁止操作周期日程——**不是技能保守,是 CLI
没暴露参数**。顺带把 `calendar` 的「日历本列表查询」补进既有的服务描述清单。
**3. `smartsheet get` 是 `sheets list` 的别名**
两者官方描述逐字相同、返回同一份子表列表。此前 `smartsheet get` 在整个仓库零字面出现,模型只能靠 `--help`
自己摸到,然后在两者之间犹豫。
### vendor 纪律
第 3 条与 webhook 归因修正都落在 **vendor 自上游的 `wecomcli-smartsheet`**
上。脚本头注释明确「不要手工编辑 `skills/wecomcli-*`,改动会在下次重跑时被无声抹掉」,所以走
`patches/snippets/` + `injections.tsv` 注入,不手工改文件。
`bash scripts/vendor-official-skills.sh` **连跑两次 diff 不变**,幂等成立;注入计数 6 →
8,脚本摘要与 tsv 注释同步更新。
### 条目改动
三处 ref 一起改(这次用全文扫 40 位 hex 复核,只剩一个值),`releasePublishedAt` 不动——版本仍 1.0.0:
- `entry.source.ref`
- `provenance.content.ref`
- `governance.compliance.reviewedRef`
推之前本地跑过 `uv run scripts/catalog/validate_catalog_metadata.py
--require-complete`:**0 error**(129 warning 为全仓存量)。
---
## English
#136 put two capability limits into `USAGE.md`, which is **deliberately
kept out of model context** (ADR-143). At runtime the model therefore
still doesn't know them and retries `851003` as a failure. This PR lands
them in the skills.
1. **`wecom-shared` gains "rule zero-four": corporation size changes the
bot's identity.** ≤10 people — the bot calls *as the authorizing user*
and inherits their document permissions; >10 — it calls under its own
identity and inherits nothing. Spelled out against the existing "rule
zero-one" (that one governs *writes*; this one governs *reads*). Marked
as non-self-checkable: no API returns the corporation size, so it can
only be inferred from responses. Source: upstream issue #64.
2. **A new pitfall: method descriptions also promise parameters that
don't exist** — subtler than the existing service-level note, since the
method does exist. Three verified cases where `--schema` has no such
field, which is precisely why the calendar/meeting skills forbid
recurring-event operations.
3. **`smartsheet get` is an alias of `sheets list`** — identical
official descriptions, same payload.
Items 2–3 touch vendored upstream skills, so they go through
`patches/snippets/` + `injections.tsv` rather than hand edits; the
vendor script is idempotent across two consecutive runs. Catalog
validator reports 0 errors locally before pushing.
## 中文
企业微信助手的市场详情页「使用说明」区此前为空。内容仓库
[`desirecore-agent/wecom-assistant@047928a`](047928afe1)
新增 `USAGE.md`,本 PR 把条目重新 pin 过去。
### 为什么要写这两条
它们都是**装之前**该知道、且**装完也改不了**的边界,正是 `USAGE.md` 的定位(ADR-143:与 `fullDesc`
分开,不进模型上下文)。
**1. 群聊历史目前仅对 ≤10 人企业开放。** 官方错误码 `853001` 的释义原文如此。实际触发返回相邻的 `853006`:
```
errcode: 853006
errmsg: this tool is not available for your corporation
```
措辞是 **for your
corporation**,不是「机器人未开通某品类」——所以让用户去找管理员开通品类是无效动作。本机实测复现,同一凭证下其余 12
个服务域全部正常,`chat` 是唯一被拒的域。上游 `WecomTeam/wecom-cli` #106 / #107 / #132 三个
issue 都在追这件事,截至提交时全部 OPEN、官方未回复。
**2. 同一条命令在不同规模的企业行为不同,而且不报错。** 上游维护者在 issue #64 确认:≤10
人「小团队模式」机器人以**授权用户身份**调用、继承其文档权限;>10
人「企业模式」机器人以**独立身份**调用、不继承。后果是同事分享给你的文档,小公司读得到、大公司读同一份返回
`851003`。这不是故障,但不写出来必然被当成故障反复重试。
顺带记入第三条与规模无关的边界:`wecom-cli identity whoami`
返回原文「只能写入或修改机器人创建或拥有的数据」——这是邮件署名固定为「XXX的机器人」、用户对助手所建文档反而没有管理权的根因。
### 条目改动
pointer 条目的 `USAGE.md` 由客户端从内容仓库**按 pinned ref** 抓取(`sync/market.ts` 的
`pointerUsage` ← `code-repo/file-fetcher.ts`),所以只推内容仓库不改 ref
的话客户端看不到。四处一起改,保持 ADR-137 证据链自洽:
| 字段 | 旧 | 新 |
| --- | --- | --- |
| `entry.source.ref` | `665ab1d2` | `047928a` |
| `compliance.reviewedRef` | `665ab1d2` | `047928a` |
| `compliance.reviewedAt` | 2026-09-04 | 2026-09-06 |
| `timestamps.reviewedAt.value` | 2026-09-04 | 2026-09-06 |
| `timestamps.catalogUpdatedAt.value` | 2026-09-04 | 2026-09-06 |
`releasePublishedAt` **不动**——版本仍是 1.0.0,本次只增文档。
已核对:`reviewedRef === source.ref`、`timestamps.reviewedAt ===
compliance.reviewedAt`、`availability: installable`、`license.state:
known`、compliance 五项必填齐全、ref 为 40 位 SHA、`repoUrl` 在官方前缀内。
### 证据等级
| 结论 | 来源 |
| --- | --- |
| `853006` 错误原文与触发条件 | 本机实测复现 |
| 「仅对 ≤10 人企业开放」 | 官方错误码 `853001` 释义 |
| 小团队 / 企业模式身份差异 | 上游 issue #64 维护者确认 |
| 「只能写入机器人拥有的数据」 | `identity whoami` 返回原文 |
| 群聊 7 天限制 | `chat messages list` 的 `begin_time` 字段 schema |
**未核实**:`853006` 的具体判定标准(是否严格按人数、有无灰度名单)与开通路径,官方未公开、上游 issue
未获回复。`USAGE.md` 里已如实标注。
### 追加:一并修正 docs 的 853006 归因
同一 ref 里还带了内容仓库
[`047928a`](047928afe1)
的一处事实修正。原 docs 把 `853006` 写成「机器人未开通『群聊会话』品类」,并给出
「要让它可用:为机器人开通群聊会话品类」——**这是让用户去做一件做不成的事**。
改了 6 处(`04-群聊历史` 四处、`README` / `01-快速开始` / `99-风险与确认` 各处),
只纠正群聊这一处的归因,**不动「能力按品类逐项开通」这条通则**——那条对 `850002`
依然成立。技能侧(`wecom-shared` / `wecom-workflows` / `wecomcli-message`)本就写的是
「企业级不可用」,本次是让 docs 与技能口径一致。
---
## English
The agent detail page's "Usage" section was empty for the WeCom
assistant. The content repo now carries a `USAGE.md`; this PR repins the
listing to it.
It documents two limits that a reader needs **before** installing and
cannot change afterwards:
1. **Chat history is currently limited to corporations of 10 people or
fewer.** Official error `853001` states this; the actual response is
`853006 this tool is not available for your corporation` — the wording
is *corporation*, not *bot*, so asking an admin to enable a bot
capability is a dead end. Reproduced locally; all 12 other service
domains work under the same credential. Upstream issues #106 / #107 /
#132 all remain OPEN with no official response.
2. **The same command behaves differently by corporation size, without
erroring.** Per the upstream maintainer in issue #64, bots in ≤10-person
"small team mode" call **as the authorizing user** and inherit their
document permissions; in ">10 person" enterprise mode they call **under
their own identity** and do not. A doc shared with you is readable in a
small company and returns `851003` in a large one.
A pointer listing's `USAGE.md` is fetched from the content repo **at the
pinned ref**, so `source.ref` and the ref-bound compliance evidence are
updated together to keep the ADR-137 chain self-consistent.
`releasePublishedAt` is unchanged — still 1.0.0, docs only.
## 问题 / Problem
真机三轮整理实测:Agent 全部写出 `报告/整理报告-<运行日期>.md`,而技能里只定义了 `报告/<YYYY-MM>.md`。
**原因不是模型不听话。** 测试范围跨了 2020-08 到 2024-09 共十几个月,`<YYYY-MM>`
在多月场景下无从填写——技能没给出这种情况的文件名,Agent 只能自己发明一个。
**后果不是难看,而是会攒垃圾。** `invoice-automation` 的定时任务每月重建的是 `报告/<上月
YYYY-MM>.md`;与按运行日期命名的手工报告永远不会互相覆盖,用户目录里会留下一堆内容重叠、无从分辨新旧的报告。
Three real-machine runs all produced `报告/整理报告-<run date>.md`, while the
skills only define `报告/<YYYY-MM>.md`. The runs spanned 2020-08 through
2024-09, so `<YYYY-MM>` was unfillable and the agent improvised. Because
the scheduled monthly job rebuilds `报告/<last month YYYY-MM>.md`, the two
naming schemes never overwrite each other and the user's directory
accumulates overlapping reports with no way to tell which is current.
## 改动 / Changes
- `invoice-workflow` 第 7 步补一张表,把两种文件名钉死:
| 本次覆盖 | 文件名 | 例 |
| --- | --- | --- |
| 恰好一个自然月 | `报告/<YYYY-MM>.md` | `报告/2024-08.md` |
| 跨多个月 | `报告/<起始 YYYY-MM>_<结束 YYYY-MM>.md` | `报告/2020-08_2024-09.md` |
并写明月份按**开票日期**归属(与台账同口径)、同名直接覆盖(报告是从 `.index/ledger.json`
全量重建的派生产物,不像台账需要先备份)、以及**为什么不许用运行日期命名**
- `invoice-ledger` 与 `references/月度报告模板.md` 同步该约定
- 目录布局示例与中英 USAGE 一并标注跨月形态
## 为什么不在本 PR 里 bump 版本 / Why no version bump here
`contentSource` 的 `ref` 必须 pin 到**已合并的 commit**,本 PR 合并前拿不到那个 SHA。先 bump
版本会让目录声称 1.0.1、却仍按指向 1.0.0 内容的 pin 去取文件——比不 bump 更糟。版本号、pin 与 changelog
留到后续 PR 一起改。
The `contentSource` ref must pin to an already-merged commit, which does
not exist until this PR lands. Bumping the version now would advertise
1.0.1 while still serving 1.0.0 content. Version, pin and changelog
follow in a second PR.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---
## 追加:台账四张表必须全建 / Also: all four ledger sheets must always exist
真机压测(只有 1 张发票)产出的 `台账.xlsx` **只有三张表**——Agent 判定「按销售方汇总」在单一销售方下冗余而略过:
```
发票测试(23 张) → ['明细', '月度汇总', '按销售方汇总', '异常']
发票压测(1 张) → ['明细', '月度汇总', '异常'] ← 少一张
```
技能写的是「四张表,顺序固定」,但没说「即使为空也必须存在」。台账是要被重复重建、被用户自己写公式引用、被下一次整理覆盖的产物;表的位置一旦随数据量浮动,「第
3 张是按销售方汇总」这类引用就会在下个月悄悄指错。已在 `invoice-ledger` 里把这条钉死。
A stress run with a single invoice produced only three sheets — the
agent judged the per-seller summary redundant. The skill said "four
sheets, fixed order" but never said "even when empty". Sheet positions
that float with row count silently break user formulas and rebuilds; now
pinned.
## 中文
sidecar 的 `spec` 未声明 `installPolicy` / `updatePolicy`,而 legacy 侧对双缺省派生为
`market` / `market`,导致 `compareMarketCatalogWithLegacy` 判定
`spec.agent.policy` 不一致,**整个 sidecar 被拒**(`sidecarRejected`)并回退
listing-only。
真机取证——客户端市场索引 `cache/market/index.json` 中该条目:
```json
"sidecarRejected": true,
"catalogDiagnostics": [
{"code": "market.catalog-legacy-mismatch", "field": "governance.availability"},
{"code": "market.catalog-legacy-mismatch", "field": "spec.agent.policy"}
]
```
本 PR 修掉其中的 `spec.agent.policy`。另一条 `governance.availability`
是**客户端侧的结构性缺陷**,不在本仓库范围:`market-agent-entry.client.schema.json` 等 5 个
market schema 均无 `availability` 字段且 `additionalProperties: false`,因此
pointer 条目的 legacy availability 恒为 `listing-only`,sidecar 声明
`installable` 必然 mismatch。主仓库已另开 PR 修复,客户端发版后本条目即可生效;在此之前旧客户端会降级为
listing-only 展示,不影响可用性。
校验:`validate_catalog_metadata.py` 0 error。
---
## English
The sidecar's `spec` omitted `installPolicy` / `updatePolicy`, while the
legacy side derives `market` / `market` from the double default.
`compareMarketCatalogWithLegacy` therefore flagged `spec.agent.policy`
as inconsistent and **rejected the whole sidecar**, falling back to
listing-only.
Verified against a live client's market index, which showed
`sidecarRejected: true` with diagnostics for both `spec.agent.policy`
and `governance.availability`.
This PR fixes the former. The latter is a **structural gap on the client
side**, outside this repository: none of the five market schemas carry
an `availability` field and all set `additionalProperties: false`, so a
pointer entry's legacy availability is always `listing-only` and any
sidecar declaring `installable` must mismatch. A separate PR in the main
repository addresses that; this entry becomes effective once the client
ships it. Older clients degrade to listing-only, which does not affect
usability.
Validation: 0 errors from `validate_catalog_metadata.py`.
## 中文
把「企业微信助手」从 inline 形态改为 pointer 形态,并补齐严格证据门槛,使其成为**首个可一键安装的 Market
Agent**。
### 为什么改
此前该条目在市场详情页显示「仅收录 / 当前不能由 DesireCore 一键获取」。判定源是
`evaluateCatalogAcquisitionEligibility`:Agent 类条目**不享受** builtin Skill 的
`isTrustedBundledBuiltin` 快捷通道(该函数硬编码 `kind === 'skill'`),必须走 content
不可变 + license known + compliance 三重匹配的严格门槛。这与本仓库 README 的「Agent pointers
do not receive the built-in Skill exceptions」及 ADR-137 一致,是有意的设计而非缺陷。
inline 形态还存在自指问题:证据要求 `content` 指向不可变 commit,而 inline
内容就在本仓库里,条目无法预知自己将被合并进哪个 commit。现网 41 个 inline 条目全部没有 `content`,30 个
pointer 条目全部有——数据印证了这一点。
### 改了什么
**形态**:内容迁至 `desirecore-agent/wecom-assistant`,本仓库只保留 `entry.json` 与
sidecar。删除 53 个文件 / 16494 行,条目从 1.0M(全仓最大的 Agent 条目)降到数 KB。符合
ADR-038「market 仓库只放元数据、不放具体内容」。
**证据六项**:
| 项 | 值 |
|---|---|
| `provenance.content` | git + `665ab1d2…`(https + 40 位 SHA) |
| `governance.license` | `unknown` → `known` / MIT,`evidencePath:
LICENSE` |
| `governance.compliance` | 五项齐备,`reviewedRef` 等于 `content.ref` |
| `timestamps.reviewedAt` | 与 `compliance.reviewedAt` 逐字一致 |
| `availability` | `listing-only` → `installable` |
| `redistribution` | 与 `entry.json` 同为 `source-pointer-only` |
**内容侧**(在内容仓库中完成):13 个业务技能改为 vendor 企业微信官方
`WecomTeam/wecom-cli`(MIT,pinned `78c514b2`),自维护 `wecom-shared` /
`wecom-chat` / `wecom-workflows` 三个治理与增量技能。官方内容量为原自研版的 1.6 倍(21.6k vs
13.7k 行),并已修正官方 `meeting rooms search` 的 3
个失效参数名——`room_keyword`/`min_capacity`/`building_city` 在 CLI 1.2.0 已改名,而
CLI 对未知字段不校验、原样透传,会导致静默订错会议室。MIT 署名义务由内容仓库的 `NOTICE` 与
`third_party/wecom-cli/LICENSE` 履行。
### 校验
`validate_catalog_metadata.py` 0 error、`validate-i18n.py` 0
error、`gen-collection-children.py --check` 通过(wecom-cli 14 children)。129
个 warning 均为其他既有条目所有,本次未新增。
### 已知风险
市场 Agent 的安装链路此前**从未被真实用户走过**(现网 0 个 installable
agent,仅有单测覆盖)。合并后需真机验证安装、并重启客户端后再验一次卸载。
---
## English
Switches the WeCom Assistant entry from inline to pointer form and
supplies the full acquisition evidence, making it the **first
installable Market Agent**.
### Why
The entry previously rendered as listing-only. Agent items do **not**
receive the builtin-Skill fast path in
`evaluateCatalogAcquisitionEligibility` (`isTrustedBundledBuiltin`
hardcodes `kind === 'skill'`), so they must satisfy the strict gate:
immutable content, known license, and ref-bound compliance. That matches
this repo's README ("Agent pointers do not receive the built-in Skill
exceptions") and ADR-137 — it is deliberate, not a defect.
Inline form also has a self-reference problem: the gate requires
`content` to pin an immutable commit, but inline content lives in this
repository and cannot know which commit will carry it. All 41 inline
entries currently lack `content`; all 30 pointer entries have it.
### What changed
**Form**: content moved to `desirecore-agent/wecom-assistant`; only
`entry.json` and the sidecar remain here. 53 files / 16494 lines
removed, shrinking the entry from 1.0M (the largest Agent entry in the
repo) to a few KB, per ADR-038.
**Evidence**: `provenance.content` pins `665ab1d2…`; license becomes
known/MIT with `evidencePath`; compliance carries all five required
fields with `reviewedRef` equal to `content.ref`;
`timestamps.reviewedAt` matches `compliance.reviewedAt`; availability
becomes `installable`; redistribution aligns with `entry.json`.
**Content side**: 13 business skills are now vendored from the official
`WecomTeam/wecom-cli` (MIT, pinned `78c514b2`) — 1.6× the volume of the
previous in-house set — with three self-maintained skills for governance
and coverage gaps. Three stale meeting-room parameter names were
corrected; the CLI passes unknown fields through without validation, so
the stale names would silently book the wrong room. MIT attribution is
carried by `NOTICE` and `third_party/wecom-cli/LICENSE` in the content
repository.
### Validation
0 errors from the catalog and i18n validators; collection children check
passes. The 129 warnings all belong to pre-existing entries.
### Known risk
The Market Agent install path has never been exercised by a real user (0
installable agents in production; unit tests only). Post-merge, install
should be verified on a real client, and uninstall re-verified after a
restart.
## 摘要 / Summary
**中文**:新增市场第 2 个 Agent 条目
`dingtalk-workspace`(钉钉工作台助手),作为钉钉全产品能力的**发现入口**。条目只提供发现元数据与治理事实,Agent
正文不在本仓库分发。
**English**: Adds the marketplace's second Agent listing,
`dingtalk-workspace` (DingTalk Workspace Assistant), as a **discovery
entry** for DingTalk's product surface. The listing carries discovery
metadata and governance facts only; the Agent's own content is not
distributed from this repository.
## 变更 / Changes
| 文件 / File | 说明 / Note |
| --- | --- |
| `agents/dingtalk-workspace/agent.json` | 市场展示元数据,zh-CN + en-US 双语 /
Market display metadata, zh-CN + en-US |
| `agents/dingtalk-workspace/catalog-metadata.v1.json` | 治理 sidecar /
Governance sidecar |
| `agents/dingtalk-workspace/assets/avatar.webp` | 512×512 中性图形头像 /
Neutral 512×512 avatar |
| `manifest.json` | `totalAgents` 1 → 2;version 1.2.30 →
1.3.0;lastUpdated |
| `README.md` | Agent 计数与目录示意 / Agent count and repository shape |
## 条目形态:可安装 / Shape: installable
**中文**:条目随附完整 Agent 正文(`persona.md`、`principles.md`、2 个 Skill、13
篇文档),安装后即得到完整可用的 Agent。
治理字段取值与理由:
| 字段 | 取值 | 理由 |
| --- | --- | --- |
| `installPolicy` / `updatePolicy` | `market` / `market` |
正文已在条目内,Market 负责安装与更新。这也避开了
`isMarketAgentMetadataOnly()`(`sync/market.ts:113-128`)——它只在
`system`+`repository` 时返回 true,另一条分支是对 `desirecore` 的 id 硬编码特判,本条目不适用 |
| `release` | `known` `1.0.0` `semver` | 非 system Agent 时
`validate_catalog_metadata.py:625-630` 要求 `release` 保留 legacy `version`
|
| `timestamps.releasePublishedAt` | `2026-09-01` | 本次发布日 |
| `governance.availability` | `listing-only` | 见下 |
**为什么 `availability` 不是
`installable`**:`validate_catalog_metadata.py:650-712` 的强证据门禁要求不可变
`provenance.content`(git 40 位 SHA 或 sha256)+ 已知 license + 已知
`reviewedAt` + `compliance`。本条目正文就在本仓库这次提交里,无法自指一个尚不存在的固定
ref;未做治理审查,也不会编造 `reviewedAt` 与许可证据。`listing-only`
在本仓库既有先例(`wecom-cli`、`larksuite-cli` 都是 `listing-only`
且实际可安装),且客户端不读该字段——真正决定可安装性的是 `installPolicy`。
**English**: The listing ships the complete Agent content (`persona.md`,
`principles.md`, 2 Skills, 13 documents), so installing yields a fully
working Agent.
| Field | Value | Rationale |
| --- | --- | --- |
| `installPolicy` / `updatePolicy` | `market` / `market` | Content lives
in the listing, so Market owns install and update. This also avoids
`isMarketAgentMetadataOnly()` (`sync/market.ts:113-128`), which returns
true only for `system`+`repository`; its other branch is an id-hardcoded
special case for `desirecore` that does not apply here |
| `release` | `known` `1.0.0` `semver` | For a non-system Agent,
`validate_catalog_metadata.py:625-630` requires `release` to preserve
the legacy `version` |
| `timestamps.releasePublishedAt` | `2026-09-01` | Publication date |
| `governance.availability` | `listing-only` | See below |
**Why `availability` is not `installable`**: the strict evidence gate at
`validate_catalog_metadata.py:650-712` requires an immutable
`provenance.content` (40-hex Git SHA or sha256) plus a known license, a
known `reviewedAt`, and `compliance`. This listing's content lives in
this very commit, so it cannot pin a ref that does not yet exist; no
governance review was performed, and no `reviewedAt` or license evidence
will be invented. `listing-only` has precedent here (`wecom-cli` and
`larksuite-cli` are both `listing-only` yet installable in practice),
and the client does not read the field — installability is actually
decided by `installPolicy`.
### agent.json 的双重身份 / agent.json serves two contracts
**中文**:安装时整个 `agents/<id>/` 目录被 `cpSync` 到
`~/.desirecore/agents/<id>/`(`market-routes.ts:1228-1252`),因此这个
`agent.json` **同时**是市场展示元数据和 AgentFS 运行时配置。已把源 Agent 的运行时配置并入(`llm` 智能路由
flagship、`heartbeat`、`session_mode`、`env`、`mcp_servers`、并发上限等)。
已知副作用:两套 Schema 在 10 个字段上不相交(市场侧的 `category` / `updatedAt` /
`maintainer` / `i18n` / `persona` / `changelog` / `installPolicy` /
`updatePolicy`,以及 `avatar.t` / `avatar.bg`),AgentFS 侧
`agentConfigSchema` 是 `additionalProperties: false`,`id` 还要求 UUID
形态。因此安装后
`parseAgentJsonText`(`agent/reader.ts:375-397`)会走宽松解析分支,每个进程打印一条
warning。宽松分支原样返回解析结果,配置全部生效——已实测确认(见下)。这是「内联可安装 Market
Agent」这一形态固有的,本仓库此前没有先例。
**English**: On install the whole `agents/<id>/` directory is
`cpSync`-ed into `~/.desirecore/agents/<id>/`
(`market-routes.ts:1228-1252`), so this `agent.json` is
**simultaneously** the marketplace display metadata and the AgentFS
runtime config. The source Agent's runtime configuration has been merged
in (`llm` smart routing at flagship tier, `heartbeat`, `session_mode`,
`env`, `mcp_servers`, concurrency cap).
Known side effect: the two schemas are disjoint on 10 fields
(market-side `category`, `updatedAt`, `maintainer`, `i18n`, `persona`,
`changelog`, `installPolicy`, `updatePolicy`, plus `avatar.t` /
`avatar.bg`), AgentFS's `agentConfigSchema` is `additionalProperties:
false`, and its `id` expects a UUID shape. So after install,
`parseAgentJsonText` (`agent/reader.ts:375-397`) takes the lenient
branch and prints one warning per process. That branch returns the
parsed object as-is, so every setting still applies — verified below.
This is inherent to the "inline installable Market Agent" shape, which
has no prior precedent in this repository.
## 外部依赖披露 / External dependency disclosure
**中文**:本 Agent 依赖一个由第三方独立分发的命令行程序,并需要用户自行完成钉钉账号 OAuth 授权。按仓库
`CLAUDE.md`「External dependency disclosure」要求,已在四处披露:
1. **发现描述** — `agent.json#i18n.<locale>.shortDesc`(zh-CN 与 en-US 各一份)
2. **`compatibility` 字段** — sidecar `compatibility.requirements[]`,4
条:runtime(用户自行安装第三方 CLI)、runtime(官方产品技能需手工拷贝且每次升级重做)、permission(钉钉账号
OAuth,能力范围取决于授权范围)、connection(网络与所在组织已开通的产品/权益)
3. **本地化市场文案** — `agent.json#i18n.<locale>.fullDesc` 与 sidecar
`presentation.i18n.<locale>.description` 中的「外部依赖声明」整节
4. **执行约定** — 同一节明确:依赖不可用(未安装 / 未授权 / 无权限 /
组织未开通)时,在发起外部调用**之前**停止并如实说明,**不编造成功结果**
明确声明 DesireCore
**不打包、不分发、不授权、不安装、不代付、不运营**该程序及其背后的产品;凭据与费用由用户与服务方之间的条款约束。
**English**: This Agent depends on an independently distributed
third-party CLI and requires the user's own account OAuth. Per
`CLAUDE.md` "External dependency disclosure", it is disclosed in all
four required places:
1. **Discovery description** — `agent.json#i18n.<locale>.shortDesc`, in
both zh-CN and en-US
2. **`compatibility` field** — sidecar `compatibility.requirements[]`,
four entries: runtime (user installs the third-party CLI), runtime
(official product skills must be copied manually and re-copied after
each upgrade), permission (account OAuth; coverage depends on granted
scopes), connection (network plus the products and entitlements enabled
for the user's own organization)
3. **Localized marketplace text** — the "External dependency disclosure"
section inside `agent.json#i18n.<locale>.fullDesc` and sidecar
`presentation.i18n.<locale>.description`
4. **Execution instructions** — the same section states that when the
dependency is unavailable (not installed, not authorized, not permitted,
or not enabled), the Agent stops **before** the external call and never
fabricates a successful result
It states explicitly that DesireCore does **not bundle, distribute,
license, install, pay for, or operate** that program or the products
behind it; credentials and fees are governed by terms between the user
and the service provider.
## 品牌与商标 / Branding
**中文**:`branding.relationship: independent-listing` / `nameUsage:
nominative` / `logoStatus: not-used`。头像是自制的中性图形(对话气泡 + 终端提示符
`>_`,表达「自然语言意图 → 命令调用」),**未使用任何第三方 logo 或商标图形**。
**English**: `branding.relationship: independent-listing` / `nameUsage:
nominative` / `logoStatus: not-used`. The avatar is an original neutral
mark (a speech bubble containing a `>_` terminal prompt, expressing
"natural-language intent becomes a command call"). **No third-party logo
or trademark artwork is used.**
## 未审查的事实保持 unknown / Unverified facts left unknown
**中文**:未做治理审查,因此
`governance.license`、`timestamps.reviewedAt`、`timestamps.releasePublishedAt`、`timestamps.upstreamObservedAt`、`release`
一律如实为 `unknown`,不编造许可证据或审查时间。`compatibility.platforms` 同样为
`unknown`——实际只在 macOS 上验证过,不宣称未验证的平台。
**English**: No governance review was performed, so
`governance.license`, `timestamps.reviewedAt`,
`timestamps.releasePublishedAt`, `timestamps.upstreamObservedAt`, and
`release` are all honestly `unknown`; no license evidence or review date
is invented. `compatibility.platforms` is likewise `unknown` — only
macOS was actually exercised, and untested platforms are not claimed.
## 校验 / Validation
**中文**:按 `.github/workflows/i18n-validate.yml` 的顺序在本地跑完 7 步,全部 `exit
0`;`0 error(s)`,116 warning 全部是主干既有条目的历史告警,**新条目零告警**。
**English**: All seven steps from `.github/workflows/i18n-validate.yml`
were run locally in order; every step exited `0`. `0 error(s)`; all 116
warnings are pre-existing on `main` for other listings — **the new
listing produces none**.
```
exit=0 errors=0 新条目命中=0 <-- scripts/i18n/test_validate_i18n.py
exit=0 errors=0 新条目命中=0 <-- scripts/catalog/test_validate_catalog_metadata.py
exit=0 errors=0 新条目命中=0 <-- scripts/catalog/test_collection_generator.py
exit=0 errors=0 新条目命中=0 <-- scripts/catalog/validate_catalog_metadata.py --require-complete
exit=0 errors=0 新条目命中=0 <-- scripts/i18n/validate-i18n.py
exit=0 errors=0 新条目命中=0 <-- scripts/i18n/translate.py --check
exit=0 errors=0 新条目命中=0 <-- scripts/gen-collection-children.py --check
0 error(s), 116 warning(s). agents=2, builtinSkills=34, pointerSkills=28,
publishableSkills=62, collections=7, collectionChildren=147, sidecars=64
```
另外用客户端契约做了运行时验证:按 `readAgentDetail` 的归一化逻辑(i18n 拍平 + changelog 按 locale
解析 + system 策略下 `version` → `metadataRevision`)还原 detail
对象后,`validateMarketAgent` 在 zh-CN 与 en-US 下均 PASS。
Additionally verified against the client contract: after reproducing
`readAgentDetail`'s normalization (i18n flattening, per-locale changelog
resolution, and `version` → `metadataRevision` under the system policy),
`validateMarketAgent` PASSes for both zh-CN and en-US.
### 安装验证 / Install verification
**中文**:用 agent-service 的**真实导出函数**复刻 `market-routes.ts:1185-1260`
的安装流水线(`skillCopyFilter`、`computeCapabilityContentDigest`、`isMarketAgentMetadataOnly`、`extractAgentVersion`、`parseAgentJsonText`),在
vitest unit project 中执行。
**English**: The install pipeline from `market-routes.ts:1185-1260` was
reproduced using agent-service's **real exported functions**
(`skillCopyFilter`, `computeCapabilityContentDigest`,
`isMarketAgentMetadataOnly`, `extractAgentVersion`,
`parseAgentJsonText`) and executed inside the vitest unit project.
```
[1] isMarketAgentMetadataOnly = false => 放行可装
[2] cpSync ok; source=cb8c961bb55b9abe… staged=cb8c961bb55b9abe…
[3] installedVersion = 1.0.0
[5] 应存在 19 项,缺失 0 项
[6] parseAgentJsonText => 可用配置
name=钉钉工作台助手 llm.routingMode=smart tier=flagship
max_concurrent_sessions=3 accepts_messages=true
avatar.image.path=assets/avatar.webp
✓ packages/agent-service/src/__tests__/… (1 test) 75ms
Test Files 1 passed (1)
```
19 项断言覆盖 `agent.json` / `persona.md` / `principles.md` / 2 个 `SKILL.md`
/ `assets/avatar.webp` / 13 篇文档,全部存在;staged 摘要与源摘要一致(内容无漂移)。
All 19 assertions — `agent.json`, `persona.md`, `principles.md`, both
`SKILL.md` files, `assets/avatar.webp`, and all 13 documents — are
present, and the staged digest matches the source digest (no content
drift).
## 公开信息边界 / Public information boundary
**中文**:按 `CLAUDE.md`「Required pre-publication
check」执行完毕。敏感令牌清单通过私有渠道获取并保存在仓库之外,未落盘、未写入否定名单。全工作树扫描(含隐藏文件、排除 `.git`)后,本
PR 新增与修改的文件(含本次新增的 17
个正文文件)**零命中**;已对示例做语义复核,正文示例统一使用「某某」「张三」这类中文通用占位人名,正文只描述公开的软件包名、公开命令与中立能力域,不含任何租户、客户、伙伴或个人身份,也无截图。分支名、commit
标题与正文、以及本 PR 文本同样零命中。检查通过。
**English**: The `CLAUDE.md` "Required pre-publication check" was
completed. The sensitive token list was obtained through a private
channel and kept outside the repository; it was not persisted and not
added to any denylist. After scanning the complete working tree
(including hidden files, excluding `.git`), the files added or modified
by this PR — including the 17 content files added in this round —
produce **zero hits**. Examples were reviewed semantically: the text
describes only public package names, public commands, and neutral
capability domains, with no tenant, customer, partner, or individual
identity, and no screenshots. The branch name, commit subject and body,
and this PR text are likewise clean. Check passed.
## 备注 / Notes
**中文**:与 #104(`skills/dingtalk-cli` 技能条目)互补——那个 PR 登记工具层,本 PR 登记 Agent
层。两者都改了 `manifest.json` 与 `README.md` 的统计行,后合并的一方需要重算计数。本分支基于 `main`,不依赖
#104。
目录 slug 选用 `dingtalk-workspace` 而非本机 AgentFS 实例目录名:AgentFS
实例目录是创建时按中文名自动生成的拼音串,不满足市场 slug 的语义可读性要求;`dingtalk-workspace`
与它所面向的产品域(钉钉工作台)及上游 CLI 包名一一对应,对应关系明确可查。
**English**: Complementary to #104 (the `skills/dingtalk-cli` listing) —
that PR registers the tool layer, this one the Agent layer. Both touch
the stats lines in `manifest.json` and `README.md`, so whichever merges
second must recount. This branch is based on `main` and does not depend
on #104.
The directory slug is `dingtalk-workspace` rather than the local AgentFS
instance directory name: that instance directory is an auto-generated
pinyin transliteration of the Chinese display name and is not
meaningfully readable as a marketplace slug. `dingtalk-workspace` maps
one-to-one onto the product surface it fronts and onto the upstream CLI
package name, so the correspondence stays explicit.
---------
Co-authored-by: yi-ge <jackyoncode@gmail.com>
Removes the temporary QA-only Agent listing after successful real Market
installation verification. The installed local copy is intentionally
verified separately to ensure delisting does not delete user-owned
installations.
Temporary QA-only Agent pointer for validating the real publish,
install, and delist lifecycle.\n\n- Source repo is public and MIT
licensed\n- Pointer is pinned to immutable commit
dd4abbe342f25d0569dba152ce1be3fb867c3474\n- No user data, credentials,
or third-party content\n- A follow-up PR will remove this entry after
installation verification