Back to skills
SKILL.md
Plans
ASecurity> 2026-09-09 更新:钉钉消息与微信消息检查已改为“服务命令任务”(不经过 Agent),本计划中相关的 Agent 形式描述已被 spec 的《修订记录》取代;见 `../specs/2026-09-08-agent-cron-and-managed-minutes-skill-design.md`。 > **执行方式:** 使用 `subagent-driven-development`,严格按任务顺序执行。每项由新的实现子代理以 TDD 完成并提交,随后依次进行规格审查和代码质量审查;审查未通过不得进入下一项。 **目标:** 将 CEO Agent Service 的主动周期性业务统一为顶部“定时任务”,实现 `Cron + Skills + Runtime` 配置、可靠触发与历史,并把每日 AI 听记迁为绑定精确 revision 的 `ceo-minutes-sync` 托管 Skill;Consumer 队列检查统一为内部 Dispatcher,不暴露成 Cron 配置。 **架构:** `scheduled_tasks` 保存用户配置,`schedule...
- 3 stars
- 0 votes
- 0 copies
- 5 views
- Added September 12, 2026
Works with
Security analysis
100/100Pro scans all 21 files and shows the line behind each finding
npx -y skills add callzhang/ceo-agent-service --skill plans --agent claude-codeAre you the author of Plans?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/callzhang-plans)# Agent Cron 与托管听记 Skill 实施计划
> 2026-09-09 更新:钉钉消息与微信消息检查已改为“服务命令任务”(不经过 Agent),本计划中相关的 Agent 形式描述已被 spec 的《修订记录》取代;见 `../specs/2026-09-08-agent-cron-and-managed-minutes-skill-design.md`。
> **执行方式:** 使用 `subagent-driven-development`,严格按任务顺序执行。每项由新的实现子代理以 TDD 完成并提交,随后依次进行规格审查和代码质量审查;审查未通过不得进入下一项。
**目标:** 将 CEO Agent Service 的主动周期性业务统一为顶部“定时任务”,实现 `Cron + Skills + Runtime` 配置、可靠触发与历史,并把每日 AI 听记迁为绑定精确 revision 的 `ceo-minutes-sync` 托管 Skill;Consumer 队列检查统一为内部 Dispatcher,不暴露成 Cron 配置。
**架构:** `scheduled_tasks` 保存用户配置,`scheduled_task_runs` 只保存触发/分发快照。`AgentCronScheduler` 只计算未来触发、原子写入 run 并唤醒 Dispatcher;`ScheduledTaskQueueAdapter` 领取 run 后创建现有统一 Agent 生命周期可消费的业务输入,运行结果继续以 `execution_kind + execution_id` 指向事实来源。其他业务 Queue Adapter 保留各自事实表,只统一 claim、唤醒和分发,不建立万能业务队列表。
**技术栈:** Python 3.12、FastAPI、SQLite、Pydantic、`croniter`、React 19、TypeScript、React Router、Vitest/Testing Library。
## 不可变实施边界
- Cron 与 Skill 分属两个模块;Cron 只在顶部导航,Settings 不出现 Agent Cron。
- Connector 不保存周期、Prompt、Skill 或 Runtime;没有 Connector Cron。
- Consumer 队列轮询、投递、外部效果确认、Audit/feedback/revision 是内部机制。
- 不增加 system Cron、`trigger: cron`、微信复盘或补跑逻辑。
- Runtime 来自当前配置;不可用时跳过并提示,不静默 fallback。
- 托管 Skill 必须绑定精确 revision;创建新 revision 不改变已保存任务。
- 所有 Agent 执行继续遵守 `Consumer -> Audit -> feedback -> revision`,不增加 `discard`/`discarded`。
- 每个迁移项必须先验证新入口,再删除旧计时入口;不得长期双跑。
---
### Task 1:六段 Cron 与时区值对象
**文件:**
- Modify: `pyproject.toml`
- Create: `app/agent_cron/__init__.py`
- Create: `app/agent_cron/schedule.py`
- Create: `tests/test_agent_cron_schedule.py`
**步骤:**
- [ ] 先写失败测试,覆盖:六段秒级 Cron、每分钟、每天北京时间 20:00、周日 18:00、America/Los_Angeles DST 跳时/重时、非法五段/七段表达式、非法时区,以及结果严格大于传入时刻。
- [ ] 运行 `/Users/derek/miniforge3/bin/python -m pytest tests/test_agent_cron_schedule.py -q`,确认因模块缺失失败。
- [ ] 在 `pyproject.toml` 增加受约束的 `croniter` 依赖;实现以下窄接口:
```python
@dataclass(frozen=True)
class CronSchedule:
expression: str
timezone_name: str
@classmethod
def parse(cls, expression: str, timezone_name: str) -> "CronSchedule": ...
def next_after(self, instant: datetime) -> datetime: ...
def describe(self) -> str: ...
```
- [ ] 明确向 `croniter` 传递秒在首段的配置;所有持久化/比较时刻使用 UTC aware datetime,只有 Cron 计算和展示进入指定 `ZoneInfo`。
- [ ] 重跑 focused tests,确认通过;再运行 `/Users/derek/miniforge3/bin/python -m pytest tests/test_agent_cron_schedule.py tests/test_config.py -q`。
- [ ] 提交:`feat(cron): add six-field timezone schedule`。
### Task 2:Scheduled Task 持久化、快照与并发编辑
**文件:**
- Create: `app/agent_cron/models.py`
- Modify: `app/store.py`
- Modify: `tests/test_store.py`
- Create: `tests/test_scheduled_task_store.py`
**步骤:**
- [ ] 先写失败测试覆盖三张表、结构化 Skill refs、精确托管 revision 校验、`migration_key` 幂等、`version` 冲突、启停、删除后 run 历史保留、相同 `(scheduled_task_id, scheduled_for)` 去重、手动 run 独立事件 ID。
- [ ] 将以下表加入 `STORE_SCHEMA_TABLES`、列 manifest、索引 manifest 与 `_initialize()`:`scheduled_tasks`、`scheduled_task_skill_refs`、`scheduled_task_runs`。删除任务采用 `deleted_at` 软删除,避免破坏历史外键;列表默认排除已删除配置。
- [ ] 在 `models.py` 定义不可变 `ScheduledTask`、`ScheduledTaskSkillRef`、`ScheduledTaskRun`、`ScheduledTaskSnapshot`;run 快照保存 JSON 且在写入时校验可反序列化。
- [ ] 在 `AutoReplyStore` 增加窄方法:
```python
create_scheduled_task(...)
update_scheduled_task(task_id, *, expected_version, ...)
set_scheduled_task_enabled(task_id, *, enabled, expected_version)
delete_scheduled_task(task_id, *, expected_version)
get_scheduled_task(task_id, *, include_deleted=False)
list_scheduled_tasks(*, include_deleted=False)
create_scheduled_task_run(...)
claim_scheduled_task_run(...)
link_scheduled_task_run_execution(...)
finish_scheduled_task_dispatch(...)
list_scheduled_task_runs(task_id)
```
- [ ] SQL 更新必须在单事务中完成版本检查、Skill refs 替换和 `updated_at` 更新;不要仅从 Prompt 正则提取 Skill。
- [ ] 运行 focused tests,并运行 schema/managed-skill 回归:`python -m pytest tests/test_scheduled_task_store.py tests/test_store.py tests/test_managed_skills.py -q`。
- [ ] 提交:`feat(cron): persist scheduled tasks and trigger runs`。
### Task 3:运行方式与 Skill 选项解析
**文件:**
- Create: `app/agent_cron/options.py`
- Modify: `app/agent_runtime_config.py`
- Modify: `app/skill_files.py`
- Create: `tests/test_agent_cron_options.py`
**步骤:**
- [ ] 先写失败测试:只返回当前已配置 Runtime route;健康项可选、暂不可用项保留且带原因、未配置项不出现;托管 Skill 返回 revision 列表,operation Skill 返回来源与内容摘要;禁用或缺失精确 revision 被标记不可执行。
- [ ] 实现 `ScheduledTaskOptionService`,组合 `load_runtime_config(...)`、当前 route capability/health、managed Skill store 和 `SkillFileService`,输出稳定 DTO;不要新增 Runtime 枚举副本。
- [ ] Runtime 的保存标识使用 route name(如 `codex_oauth`),快照另存 runtime kind/model/options;执行时再次解析同一 route name,找不到或不健康即返回不可用,不选择其他 route。
- [ ] 运行 `python -m pytest tests/test_agent_cron_options.py tests/test_agent_runtime_config.py tests/test_managed_skills.py tests/test_skill_files.py -q`。
- [ ] 提交:`feat(cron): expose runtime and skill choices`。
### Task 4:Agent Cron 后端 API
**文件:**
- Create: `app/web_api/scheduled_tasks.py`
- Modify: `app/web_api/registration.py`
- Modify: `app/audit_web.py`
- Create: `tests/test_console_scheduled_tasks_api.py`
**步骤:**
- [ ] 先写 API 失败测试,覆盖列表、详情、创建、带 version 更新、冲突 409、启停、手动运行、删除、历史、options、非法 Cron/时区、非法 Runtime/Skill refs 和删除后的历史读取。
- [ ] 在独立注册函数中实现:
```text
GET/POST /api/console/scheduled-tasks
GET/PUT/DELETE /api/console/scheduled-tasks/{id}
POST /api/console/scheduled-tasks/{id}/run
POST /api/console/scheduled-tasks/{id}/enable
POST /api/console/scheduled-tasks/{id}/disable
GET /api/console/scheduled-tasks/{id}/runs
GET /api/console/scheduled-task-options
```
- [ ] API 输入使用 Pydantic 严格模型,拒绝多余字段;输出提供 `schedule_description`、`next_run_at`、最近 run 摘要和结构化 Skill refs。手动运行只创建 `trigger_kind=manual` 的 pending run,不修改正常 `next_run_at`。
- [ ] 在 `audit_web.create_app` 的现有 console route 装配点注入 store、runtime config/health 和唤醒回调;不要把 API 放回 Settings 路径。
- [ ] 运行 `python -m pytest tests/test_console_scheduled_tasks_api.py tests/test_console_managed_skills_api.py tests/test_audit_web.py -q`。
- [ ] 提交:`feat(cron): add scheduled task console API`。
### Task 5:Scheduler 的无补跑、重叠与能力失败语义
**文件:**
- Create: `app/agent_cron/scheduler.py`
- Modify: `app/store.py`
- Modify: `app/cli.py`
- Create: `tests/test_agent_cron_scheduler.py`
- Modify: `tests/test_cli.py`
**步骤:**
- [ ] 先写失败测试:首次启动只设定当前时间之后的触发点;停机跨过多个点不补跑;同一 planned instant 原子去重;上一轮非终态时新 run 为 `skipped`;手动 run 不移动计划;Runtime/managed revision 不可用时 skipped 且写 Attention;多个 scheduler 不重复触发。
- [ ] `AgentCronScheduler.start(now)` 对每个启用任务计算 `next_after(now)`,不枚举过去;`tick(now)` 只处理进程内记录的到期未来点,写 run 后立即计算下一个未来点。
- [ ] 通过 store 查询 `execution_kind + execution_id` 对应事实来源是否终态;状态判断放在 adapter/resolver,不在 run 表复制业务状态。
- [ ] Runtime/Skill 不可用使用稳定原因码,记录 run `skipped` 并进入现有 Attention 数据源;不创建业务执行,不 fallback。
- [ ] 在 `run_service` 加常驻 scheduler 组件和 `threading.Event` 唤醒入口;此时保留旧业务 producer 以便后续逐项迁移,但种子迁移尚未启用,避免双跑。
- [ ] 运行 `python -m pytest tests/test_agent_cron_scheduler.py tests/test_cli.py tests/test_history_actions.py -q`。
- [ ] 提交:`feat(cron): schedule future triggers without catch-up`。
### Task 6:统一内部 Dispatcher 协议和公平领取
**文件:**
- Create: `app/dispatcher/__init__.py`
- Create: `app/dispatcher/models.py`
- Create: `app/dispatcher/service.py`
- Create: `app/dispatcher/adapters.py`
- Modify: `app/cli.py`
- Create: `tests/test_consumer_dispatcher.py`
**步骤:**
- [ ] 先写失败测试:Scheduled/Reply/Meeting/Work Summary 四类 adapter 的 due/claim;原子单领;round-robin 公平;长任务提交到 worker pool 后 dispatcher 继续;空队列不写用户 run;lease 恢复和 execution generation;唤醒与有界等待。
- [ ] 定义统一信封,不复制业务 payload:
```python
@dataclass(frozen=True)
class DispatchEnvelope:
adapter_name: str
source_id: str
available_at: datetime
priority: int
attempt: int
generation: int
```
- [ ] `QueueAdapter` 只暴露 `metrics()`、`claim(now, owner, lease)`、`release(...)`;完成/失败写回各自事实表。`Dispatcher` round-robin adapter,并将信封提交给按 adapter 注册的 Consumer pool。
- [ ] 第一阶段用 adapter 包装现有 claim/consume 边界,不重写 DingTalk、WeChat、Meeting、Work Summary 业务 Consumer;旧 loop 中“扫描+执行”拆出一次执行函数供 worker pool 调用。
- [ ] Dispatcher 使用 `threading.Event.wait(timeout=...)` 作为跨进程/异常兜底,但该 timeout 不进入 UI 或 Settings。
- [ ] 运行 `python -m pytest tests/test_consumer_dispatcher.py tests/test_consumer_agent.py tests/test_meeting_alignment.py tests/wechat -q`。
- [ ] 提交:`feat(dispatcher): unify internal queue claiming`。
### Task 7:Scheduled Agent Consumer 接入统一 Agent 生命周期
**文件:**
- Create: `app/agent_cron/consumer.py`
- Create: `app/agent_cron/context.py`
- Modify: `app/agent_context.py`
- Modify: `app/agent_orchestrator.py`
- Modify: `app/agent_turn_runner.py`
- Modify: `app/store.py`
- Create: `tests/test_scheduled_agent_consumer.py`
- Modify: `tests/test_agent_orchestrator.py`
- Modify: `tests/test_agent_turn_runner.py`
**步骤:**
- [ ] 先写失败测试:claimed run 只创建一个执行事实;Prompt 使用快照描述;只加载结构化 Skill refs 与精确 managed revision;指定 Runtime route;Consumer/Audit/feedback/revision 全链路;完成后写 `execution_kind + execution_id`;不可恢复失败写 failed;重启恢复不重复外部执行。
- [ ] 新建 scheduled execution source(只作为现有 Agent run 的父事实,不复制 Agent 状态),或复用已存在且满足完整 Consumer/Audit 契约的通用 source;不得把 Workbench 的无 Audit turn 直接当作完成。
- [ ] `ScheduledAgentContextBuilder` 从 run 快照组装上下文和 Skill protocol;operation Skills 记录实际来源摘要,managed Skills 从指定 revision 内容加载,不读取“当前最新”。
- [ ] 将 runtime route 作为强约束传给 router;若已不可用,在真正启动 Consumer 前关闭为 skipped/Attention,不走 failover。
- [ ] 保留原始 Agent run、Audit run 和 revision parent;运行终态通过现有 orchestrator 解析,run 表只链接 source ID。
- [ ] 运行 focused tests,再运行 `python -m pytest tests/test_scheduled_agent_consumer.py tests/test_agent_orchestrator.py tests/test_agent_turn_runner.py tests/test_agent_context.py -q`。
- [ ] 提交:`feat(cron): execute scheduled agents through audit lifecycle`。
### Task 8:顶部“定时任务”页面和 API 客户端
**文件:**
- Create: `frontend/src/api/scheduledTasks.ts`
- Create: `frontend/src/api/scheduledTasks.test.ts`
- Create: `frontend/src/pages/ScheduledTasksPage.tsx`
- Create: `frontend/src/pages/ScheduledTasksPage.test.tsx`
- Modify: `frontend/src/app/router.tsx`
- Modify: `frontend/src/components/GlobalNav.tsx`
- Modify: `frontend/src/components/GlobalNav.test.tsx`
- Modify: `frontend/src/styles.css`
**步骤:**
- [ ] 先写失败测试:顶部导航存在“定时任务”且 active;列表/选择;创建编辑;version 冲突;启停;手动运行;删除确认;历史;Runtime 不可用原因;精确 managed revision;`$` Skill 搜索和结构化 refs 同步;加载/空/错误状态。
- [ ] API 客户端对所有响应做运行时字段校验,不接受缺失的 Skill ref、version 或 run 状态。
- [ ] 页面采用紧凑 master-detail:宽屏左侧任务列表、右侧单一编辑表单;小于断点时任务卡片在上、编辑器在下。主要操作只有“保存”,启停/运行/删除为次级操作。
- [ ] Composer 的 `$` 搜索复用交互方式而不共享业务状态;选中 Skill 时同时插入显示 token 和结构化 ref,删除 token/标签时保持一致,后端仍以 refs 为准。
- [ ] 运行 `npm --prefix frontend test -- --run frontend/src/api/scheduledTasks.test.ts frontend/src/pages/ScheduledTasksPage.test.tsx frontend/src/components/GlobalNav.test.tsx`。
- [ ] 提交:`feat(ui): add top-level scheduled tasks workspace`。
### Task 9:暗色模式与窄窗口视觉验收
**文件:**
- Modify: `frontend/src/styles.css`
- Modify: `frontend/src/pages/ScheduledTasksPage.test.tsx`
- Create: `frontend/src/styles.dark-mode.test.ts`
**步骤:**
- [ ] 先写失败测试/静态契约,要求 `:root { color-scheme: light dark; }` 或等价显式 dark tokens,且暗色正文、辅助文字、输入边界、禁用/错误/状态色都来自 token,不保留浅色硬编码背景。
- [ ] 增加 `@media (prefers-color-scheme: dark)` 变量;逐项检查 Cron 页面新增样式,并修正其使用到的共享 status/button/input token。不要借机重做无关页面。
- [ ] 增加窄屏断点,验证无固定双栏最小宽度、操作可换行、Skill 下拉不越界、历史表转卡片或可读列表。
- [ ] 运行完整前端测试:`npm --prefix frontend test -- --run`,并运行 `npm run build:workbench`。
- [ ] 用真实浏览器分别在系统暗色宽屏与约 390px 窗口检查文本、边界、焦点、错误状态、下拉和操作区,保存截图证据。
- [ ] 提交:`fix(ui): make scheduled tasks clear in dark and narrow views`。
### Task 10:`ceo-minutes-sync` 托管 Skill 与幂等种子
**文件:**
- Create: `skills/ceo-minutes-sync/SKILL.md`
- Modify: `app/managed_skills.py`
- Create: `app/agent_cron/seeds.py`
- Modify: `tests/test_managed_skills.py`
- Create: `tests/test_agent_cron_seeds.py`
**步骤:**
- [ ] 按 writing-skills/skill-creator 契约先写 Skill 场景测试,覆盖:分页、摘要+全文、无权限只在需要时申请、内容游标、重新获得访问权限、内容新鲜度证据、分类计数、不得以进程/列表成功冒充同步成功。
- [ ] 编写 `SKILL.md`,frontmatter 只包含 Skill 元数据,不包含 Cron/trigger;引用 `dingtalk-minutes` 和条件性的 `dingtalk-minutes-access-request`。
- [ ] 将名称加入 repository managed baseline;验证导入保持 exact bytes、immutable revision 和已有自定义同名保护。
- [ ] `seed_scheduled_tasks(...)` 使用稳定 `migration_key=ceo-minutes-sync-daily-v1`,创建北京时间 `0 0 20 * * *`、默认健康 Runtime、精确 repository revision;若无健康 Runtime 则保留禁用种子和可见原因,绝不选未配置项。
- [ ] 运行 `python -m pytest tests/test_managed_skills.py tests/test_agent_cron_seeds.py tests/test_calendar_skill.py tests/e2e/test_task5_skill_semantics_live.py -q`。
- [ ] 提交:`feat(cron): manage and seed daily minutes sync`。
### Task 11:逐项迁移现有主动业务生产者
**文件:**
- Modify: `app/agent_cron/seeds.py`
- Modify: `app/cli.py`
- Modify: `app/config.py`
- Modify: `app/meeting_alignment.py`
- Modify: `app/wechat/service.py`
- Modify: `app/weekly_okr_report.py`
- Modify: `tests/test_agent_cron_seeds.py`
- Modify: `tests/test_cli.py`
- Modify: `tests/test_meeting_alignment.py`
- Modify: `tests/wechat/test_service.py`
- Modify: `tests/test_weekly_okr_report.py`
**步骤:**
- [ ] 为每个迁移先写失败测试,再单独完成并验证:DingTalk 消息每分钟、会议每分钟、WeChat 每 15 秒、OA 每小时、工作来源每天、周日 18:00 OKR。Lark 不创建默认种子。
- [ ] 每个 seed 使用稳定 migration key、明确 Prompt、结构化 Skill refs 和当前默认健康 Runtime。会议 Prompt 固定首版资格为 `ended_at + 10 minutes`;不在 Connector/Settings 增加 settle。
- [ ] 先在测试和临时 DB 验证新 Cron 能创建正确 run/业务输入,再从 `run_service` components 删除对应 producer timing loop;保留 Consumer 的一次执行逻辑并由 Dispatcher 驱动。
- [ ] WeChat 只迁移现有 reader/producer 行为,保留联系人、群聊 `@`、`auto/confirm`、sender 授权,不新增复盘或摘要。Sender/delivery 仍为内部机制。
- [ ] `run_task_maintenance_loop` 拆分:工作来源和 weekly OKR 由 Cron 触发;错误恢复、投递确认等内部维护继续常驻且不外化为 Cron。
- [ ] 从用户可见 Settings 配置中移除 producer/meeting/OA/work/weekly 的频率字段;内部 Dispatcher 的等待参数仍为内部常量或服务配置,不出现在 UI。
- [ ] 每迁移一项运行其 focused tests 并检查没有旧/新双入口;全部完成后运行 `python -m pytest tests/test_cli.py tests/test_agent_cron_seeds.py tests/test_meeting_alignment.py tests/test_weekly_okr_report.py tests/wechat -q`。
- [ ] 提交:`refactor(cron): migrate proactive business checks`。
### Task 12:Dispatcher 状态、Attention 与文档
**文件:**
- Modify: `app/web_api/registration.py`
- Modify: `app/quality_gate.py`
- Modify: `frontend/src/pages/StatusPage.tsx`
- Modify: `frontend/src/pages/AttentionPage.tsx`
- Modify: `frontend/src/pages/StatusPage.test.tsx`
- Modify: `frontend/src/pages/AttentionPage.test.tsx`
- Modify: `docs/architecture.md`
- Modify: `docs/runtime-mechanism.md`
- Modify: `README.md`
**步骤:**
- [ ] 先写失败测试,要求每个 adapter 显示 pending/oldest/running/latest_error;空队列不显示假 run;Runtime/Skill 不可用的 Cron 出现在 Attention;scheduler health 与业务结果分离。
- [ ] Status 只展示内部可观察性,不提供 consumer polling 配置。Attention 链接到对应 `/scheduled-tasks?id=...`。
- [ ] 更新架构图和运行机制:Cron 触发边界、Dispatcher adapters、事实来源、execution link、no catch-up、overlap skip、manual run、runtime no-fallback、exact Skill revision。
- [ ] README 运维段说明新 UI、种子幂等和旧循环移除;不得把 removed macOS tasks 重新引入服务。
- [ ] 运行 `python -m pytest tests/test_quality_gate.py tests/test_console_web_api.py -q` 以及相关前端页面测试。
- [ ] 提交:`docs(cron): document scheduler and dispatcher operations`。
### Task 13:全量、生产重启与真实读回
**文件:**
- Modify only for defects found during verification; each defect starts with a failing regression test and receives its own focused commit.
**步骤:**
- [ ] 运行 Python 全量:`/Users/derek/miniforge3/bin/python -m pytest -q`,记录 passed/skipped/deselected 数量。
- [ ] 运行前端全量与构建:`npm --prefix frontend test -- --run && npm run build:workbench`。
- [ ] 运行 `git diff --check`、检查工作树,只保留任务文件;将 `graphify-out/` 与 `app/graphify-out/` 移到废纸篓,不提交生成缓存。
- [ ] 由最终审查子代理检查完整 diff 对设计 Spec、架构生命周期、无 incidental safety logic、暗色/窄屏和迁移无双跑;修复后重新审查。
- [ ] 重启:`launchctl kickstart -k gui/$(id -u)/com.ceo-agent-service.main`;用 `launchctl print gui/$(id -u)/com.ceo-agent-service.main` 确认新 PID。
- [ ] 通过 live API 读回:七个种子各一份、Cron/时区/next run 正确、Settings 无 Agent Cron、options 来自运行配置、managed minutes revision 精确。
- [ ] 手动运行 AI 听记同步,验证真实“发现/成功/跳过/无权限/失败”内容和游标,而非仅 HTTP/进程成功;确认关联 Consumer/Audit/revision 和 History。
- [ ] 观察 DingTalk、Meeting、WeChat 新触发至少一个完整周期,确认 Dispatcher 分发到正确 Consumer 且旧 producer 不再重复运行。
- [ ] 检查数据库没有新增 unresolved `failed`、长期 `processing`、过期 lease 或未认领 pending;外部效果未知状态保持现有语义。
- [ ] 在当前 `http://localhost:62361/` 真实浏览器验收宽屏暗色与窄屏,并保存最终截图。
- [ ] 按 `finishing-a-development-branch` 提供四种收尾选择:本地合并、推送并建 PR、保留分支、丢弃分支;未经选择不自行合并。
## 计划自审清单
- [ ] 所有设计范围均有对应任务;所有非目标均未被实现任务绕过。
- [ ] 每项先有失败测试、最小实现、focused regression、独立提交。
- [ ] 数据类型在存储/API/前端一致:ID、version、UTC 时间、Runtime route、Skill source/revision。
- [ ] `scheduled_task_runs` 不成为第二套业务状态;execution link 可解析到事实来源。
- [ ] Scheduler、Dispatcher、Consumer、Audit、delivery 边界清晰。
- [ ] 迁移顺序保证没有长期双跑,也没有先删旧入口再验证新入口。
- [ ] 发布验收包含真实内容、真实浏览器、新 PID 和 backlog,而非只看测试或 HTTP 200。
Files in this skill
- 2026-05-26-work-profile.md
- 2026-05-27-oa-approval-agent-audit.md
- 2026-05-29-memory-outbox.md
- 2026-05-31-flatten-local-service-layout.md
- 2026-06-02-dingtalk-feedback-card-spike.md
- 2026-06-07-task-summary.md
- 2026-06-08-agent-owned-material-reading.md
- 2026-06-08-okr-review-runner.md
- 2026-06-12-initialization-wizard.md
- 2026-06-13-data-runtime-cleanup.md
- 2026-06-27-dingtalk-todo-sync.md
- 2026-06-29-follow-up-reply-task-agent.md
- 2026-07-02-important-task-boundary.md
- 2026-07-14-meeting-alignment-agent.md
- 2026-07-17-wechat-personal-account-channel.md
- 2026-07-20-universal-consumer-agent.md
- 2026-07-22-cli-channel-adapter.md
- 2026-07-22-oa-feedback-bugfix-channel.md
- 2026-07-25-agent-owned-material-reading.md
- 2026-07-25-single-agent-decision.md
Attribution
Comments
Loading comments…
Newsletter
Get the weekly list of safe new skills, and the ones we pulled.