fix: 对照《财务处Skill002》验收整改并升版 v1.0.2
All checks were successful
技能自动化发布 / release (push) Successful in 9s
All checks were successful
技能自动化发布 / release (push) Successful in 9s
- 状态标签:C3 触发且 D 未判 → 待补录,优先级对齐需求 §6.2 - broadcast-monthly 逐项目增量 emit,任务中心可见进行中进度 - progress_reports 回填 project_id;新增 items_json/updated_at;旧库重建式安全迁移(含回归测试) - 简报:TITLE 转义防注入、章节对齐 §10(独立「暂付款/结题提醒」)、页脚逐字统一 - 金标准测试 +17:±10%/20% 阈值恰界、C2 钳位、N2 反例、C3 逐字段、HTML 转义、async+cron 定位守护、迁移回归 - 文档 v1.1(开发文档 + REQUIREMENTS):ERROR:<CODE> <message>、reports_brief、--all-status、skill-detail 表外挂载、C1 level=warn - 落盘验收报告 acceptance-reports/20260924-105401-acceptance.md(338 测试全绿) - 版本 1.0.1 → 1.0.2(constants / SKILL.md / CHANGELOG 三处对齐)
This commit is contained in:
166
acceptance-reports/20260924-105401-acceptance.md
Normal file
166
acceptance-reports/20260924-105401-acceptance.md
Normal file
@@ -0,0 +1,166 @@
|
||||
# 验收报告 —— track-fund-progress-default(项目经费进度播报助手)
|
||||
|
||||
- 相对路径:`acceptance-reports/20260924-105401-acceptance.md`
|
||||
- 技能 slug:`track-fund-progress-default`
|
||||
- git 提交短哈希:`a91ead3`(工作区含本轮未提交整改,见文末「本轮整改记录」)
|
||||
- checklist_version:`1.0`
|
||||
- 验收执行时间:2026-09-24 10:51–10:54(本地)
|
||||
- 验收环境:Windows,Python `D:\jiangchang\huashang\.venv\Scripts\python.exe`(jiangchang-platform-kit 1.2.12),数据根 `D:\jiangchang-data`(用户 10032)
|
||||
- 验收方式:CLI 端到端实测 + 默认测试套件 + 代码/文档静态核对;宿主 UI(数据管理页面、任务中心、市场)未接入,相关条目按 `NEED_MANUAL` 如实记录为**未做**
|
||||
|
||||
---
|
||||
|
||||
## 0. 技能画像(验收前填写,用于裁剪)
|
||||
|
||||
- [x] S0-1 交互形态:**纯本地**(本地 SQLite 计算,无外部 HTTP/RPA)
|
||||
- [x] S0-2 目标站登录策略:**not_needed**
|
||||
- [x] S0-3 是否依赖账号会话:**否**
|
||||
- [x] S0-4 持久化:**另有业务表**(fund_projects / progress_reports / alert_rules)
|
||||
- [x] S0-5 Skill Action:**含异步长任务**(broadcast-monthly = async)
|
||||
- [x] S0-6 是否需要在任务中心查看进度或结果:**是**
|
||||
- [x] S0-7 授权来源:无外部系统账号/数据权限;本地台账数据由宿主用户录入,执行走宿主 entitlement
|
||||
- [x] S0-8 不可逆外部副作用:**否**(只读计算 + 本地记录/HTML 写入;无付款/删除/发送)
|
||||
- [x] S0-9 入口定位表:**已填写**(`development/REQUIREMENTS.md` §0.1,与 `assets/actions.json`、开发文档 §9 三方一致)
|
||||
- [x] S0-10 主用户路径:**对话 + 数据管理 + 定时**(与定位表一致)
|
||||
- [x] S0-11 业务行生命周期:**不适用**(REQUIREMENTS §0.3 已声明:无处理队列状态机)
|
||||
- [x] S0-12 HTML 页面报告:**有**(`{data}/html/*.html` + `render-html`,侧栏预览)
|
||||
|
||||
---
|
||||
|
||||
## 1. 安装与可运行
|
||||
|
||||
- [ ] A1-1 **P0** **NEED_MANUAL(未做)** 按平台方式加载后技能可被识别、打开详情或执行入口。已做:CLI 侧 `health`/`version`/全部子命令可执行。未做:宿主页打开技能详情(需人工真机)。
|
||||
- [x] A1-2 **P0** **PASS** `python scripts/main.py health` 输出 `health: ok`、`platform_kit_version_ok: True`、env 路径可读,exit 0。
|
||||
- [x] A1-3 **P0** **PASS** `version` 返回 `1.0.1`;与 `scripts/util/constants.py:4 SKILL_VERSION`、`SKILL.md:4 version`、`CHANGELOG.md ## 1.0.1`、git tag `v1.0.1` 一致。
|
||||
- [x] A1-4 **P1** **PASS** 用户可见配置(4 条预警阈值):`view-rules` 可读;`set-rule lag_threshold 0.70` 后同一项目判定由「严重滞后」翻转为「正常」,恢复 `0.10` 后回到「严重滞后」(实测 report_id 7/8),行为与说明一致。
|
||||
|
||||
## 2. 对外说明是否自洽
|
||||
|
||||
- [x] A2-1 **P0** **PASS** README 面向业务用户说明做什么/给谁用/准备什么(台账 5 类字段)。
|
||||
- [x] A2-2 **P0** **PASS** 用户主路径为对话/数据管理操作,不以开发目录为入口。
|
||||
- [x] A2-3 **P1** **PASS** TUTORIAL 按准备→入口一/二/三→常见卡住结构编排,`test_tutorial_surfaces` 通过。
|
||||
- [x] A2-4 **P1** **PASS** DEMO.md 有演示信息位;`demo_video_url: ""` 并明示「无视频时的图文演示脚本」,不假装有视频。
|
||||
- [x] A2-5 **P0** **PASS** CHANGELOG 首节 `## 1.0.1` 对应当前交付版本;`test_docs_standards` 通过。
|
||||
- [x] A2-6 **P0** **PASS** SKILL.md 意图路由区分即时播报(sync)与月度播报(async 长任务),与真实能力一致。
|
||||
- [x] A2-7 **P0** **PASS** README 无分步 1/2/3、无 Agent 话术块、无入口专章(`test_tutorial_surfaces` 反模式约束通过)。
|
||||
- [x] A2-8 **P0** **PASS** 教程覆盖定位表全部「挂」入口(数据管理 toolbar/row、对话、定时入口三),`test_business_skill_tutorial_aligns_with_actions` 通过。
|
||||
- [x] A2-9 **P0** **PASS** 有 cron:教程入口三写明宿主定时任务建「技能直调」选「月度经费播报」及每月 5 号 9:00 场景。
|
||||
- [x] A2-10 **P1** **PASS** 教程主能力对照表与 `actions.json` label 一致(tutorial 对齐测试通过)。
|
||||
- [x] A2-11 **P1** **PASS** 数据管理主路径入口在 toolbar(add-project 录入、broadcast-progress 播报、render-html 重建),教程不以 skill-detail 为唯一路径。
|
||||
- [x] A2-12 **P0** **PASS** 说明/教程无 `# 技能名` 开篇(`test_market_docs_forbid_redundant_page_h1` 通过)。
|
||||
|
||||
## 3. 主能力行为
|
||||
|
||||
- [x] A3-1 **P0** **PASS** 主成功路径闭环实测(as_of=2026-08-15):①NSFC2026001 → 正常/🟢(report-9);②LAG2026001 → 严重滞后/🔴+冲销提醒(report-10);③FAST2026001 → 支出异常偏快/🟠+结题提醒(report-11);`broadcast-monthly` 3 项目 + 汇总页 `brief-006ab490ad2f5ddd.html`。
|
||||
- [x] A3-2 **P0** **PASS** 缺参/非法输入稳定失败:`broadcast --project-no NOPE123` → `ERROR:NO_PROJECTS` exit 1;`add-project --start 2026/13/40` → `ERROR:PROJECT_INVALID` exit 1,不假成功。
|
||||
- [x] A3-3 **P1** **PASS** 失败可诊断:`{data}/10032/logs/jiangchang.log` 有 `task_failed ... error_code=PROJECT_INVALID detail=...`,可定位到 stage(project/rules/broadcast/…)。
|
||||
- [x] A3-4 **P0** **PASS** 多入口共用同一内核:CLI 与 Action 均落 `scripts/main.py` 同一子命令,`fund_service.run_broadcast` 唯一内核(代码结构 + `test_service` 类用例;宿主侧触发效果见 A9-3)。
|
||||
- [x] A3-5 **P0** **PASS** 定位表已填写;「挂」的入口在 `actions.json` 有对应声明(13 个 Action,`test_actions_manifest` jsonschema/entrypoint/bind 校验通过)。
|
||||
- [x] A3-6 **P1** **PASS** 「不挂」入口均有书面理由(定位表「不挂理由」列逐行填写)。
|
||||
|
||||
## 4. 调度与长任务
|
||||
|
||||
- [x] A4-1 **P0** **PASS** 秒级短操作:单项目 `broadcast` 实测 <1s 返回 JSON(三场景各约 0.3s)。
|
||||
- [ ] A4-2 **P0** **NEED_MANUAL(未做)** 长任务经 Agent/动作触发后进入任务中心。已做:broadcast-monthly 为 async + `job_context`/`emit`/`finish` 代码路径完整、CLI 正常终态。未做:宿主任务中心真机确认(需人工)。
|
||||
- [ ] A4-3 **P0** **NEED_MANUAL(未做)** 任务中心进行中/结束状态与成功失败结论。已做:增量 `emit` 回调(`[i/n] 项目:状态`)+ 单测 `test_on_progress_called_per_project`。未做:宿主任务中心真机观察(需人工)。
|
||||
- [ ] A4-4 **P1** **NEED_MANUAL(未做)** 进度文案可理解性需在宿主任务中心真机查看;文案设计为 `[1/3] 钙钛矿…:正常` 形式(代码层已核)。
|
||||
- [x] A4-5 **P1** **PASS** 动作参数覆盖主路径:broadcast-progress 暴露 projectNo/pi/asOf;broadcast-monthly 零参缺省=全部在研(安全无人值守);`--all-status` 为可选扩展且已在 §8/定位表补记。
|
||||
- [ ] A4-6 **P1** **N/A** 无「引用同库另一张业务表」的动作参数(set-rule 经 row 行绑定预填本表 rule_key,非手填内部编号)。
|
||||
- [ ] A4-7 **P1** **N/A** 无互斥采集/操作模式。
|
||||
- [ ] A4-8 **P1** **NEED_MANUAL(未做)** set-rule 行按钮打开的 form 参数区是否重复映射主键,须宿主真机打开确认(代码层:inputMapping 仅映射 rule_key,无 visibleWhen 藏字段)。
|
||||
|
||||
## 5. 账号与浏览器会话
|
||||
|
||||
- 本技能纯本地、无浏览器/账号会话(画像 S0-1/S0-2/S0-3),A5-1 ~ A5-12 全部 **N/A**(无网页 RPA 形态,等价项已在 §1–§4 覆盖)。
|
||||
|
||||
## 6. 结果落点
|
||||
|
||||
- [ ] A6-1 **P0** **NEED_MANUAL(未做)** 宿主任务中心/任务记录中可见对应条目。已做:CLI `{"type":"result",...}` 终态事件 + 日志 `task_start`/`broadcast_kernel_done`。未做:宿主任务列表真机核对(需人工)。
|
||||
- [x] A6-2 **P0** **PASS** 成功跑完后新业务数据可查:`list-projects` 3 行、`stats` report_total 与库内一致、`list-reports` 含新记录;表 `_jiangchang_tables.visible=1` 且列元数据齐备(数据管理渲染由测试守护)。
|
||||
- [x] A6-3 **P1** **PASS** 重复业务键幂等:同 project_no 再次 `add-project` 为 `action=updated` 且未提供字段不覆盖(`test_upsert_create_then_partial_update`)。
|
||||
- [x] A6-4 **P1** **PASS** 零结果成功与失败可区分:无匹配项目为 `ERROR:NO_PROJECTS` 失败退出;正常空参全量播报成功返回。
|
||||
- [x] A6-5 **P1** **PASS** 产出文件落在约定位置:`{data}/10032/track-fund-progress-default/html/report-*.html`、`brief-*.html`(实测可打开、grep 内容命中)。
|
||||
- [x] A6-6 **P0** **PASS** 业务表 DDL 无 `FOREIGN KEY`/`REFERENCES`(`display_metadata_validator` 守护测试通过;跨表仅存 project_id 业务 id,关联在 `_record_to_result` 代码层完成)。
|
||||
- [ ] A6-7 **P0** **N/A** 无「处理业务行」类 Action(REQUIREMENTS §0.3 声明无处理队列)。
|
||||
- [ ] A6-8 **P0** **N/A** 同上(条目自带 N/A 条款)。
|
||||
- [ ] A6-9 **P1** **N/A** 同上(状态→角色映射已声明不适用)。
|
||||
- [ ] A6-10 **P1** **NEED_MANUAL(未做)** HTML 侧栏预览横向铺满/无横向滚动条/刷新时间,须宿主预览区真机确认;HTML 本体已验证(结构、转义、页脚、状态灯、提醒章节)。
|
||||
- [x] A6-11 **P1** **PASS** 状态类列 `status`/`status_tag` 均 `searchable: 1` 且 `options_json` value 与存库枚举一致(`connection.py` 元数据定义 + `test_display_metadata` 通过)。
|
||||
- [ ] A6-12 **P2** **N/A** 无 `display_type: boolean` 列。
|
||||
- [x] A6-13 **P0** **PASS** 未创建 `task_logs`(`test_db_smoke` 断言 tables 仅 3 业务表 + 元数据表)。
|
||||
- [ ] A6-14 **P0** **N/A** 无废弃表迁移场景。
|
||||
|
||||
## 7. 可观测与安全观感
|
||||
|
||||
- [x] A7-1 **P0** **PASS** 失败提示为业务中文(日期格式无效/无项目),无密码、Cookie、token 泄露;全仓无敏感字段存储(红线扫描通过)。
|
||||
- [x] A7-2 **P0** **PASS** `jiangchang.log` 可见 `task_start` 与 `task_failed`/`broadcast_kernel_done`;失败含 `error_code=PROJECT_INVALID`,非仅 `cli_start`(2026-09-24 10:51:23 实录)。
|
||||
- [x] A7-3 **P0** **PASS** 故意失败(非法日期):日志先 `WARNING task_failed error_code=...`,随后 stdout `ERROR:PROJECT_INVALID ...`(顺序与实录一致)。
|
||||
- [x] A7-4 **P1** **PASS** 关键步骤带 `stage=`(project/rules/broadcast/kernel/render/monthly),`broadcast_kernel_start/down` 记录批次与计数。
|
||||
- [ ] A7-5 **P1** **N/A** 不宣称业务录屏(业务命令无录屏调用;`record_video` 缺省关闭;cmd_run 仅为模板演示)。
|
||||
- [x] A7-6 **P2** **PASS** 用户可见文案为业务语言(严重滞后/暂付款冲销/结题决算)。
|
||||
- [x] A7-7 **P2** **PASS** 数据管理按钮中文名(经费进度播报/录入项目台账/生成经费简报/更新预警阈值)不与宿主「查看/编辑/删除」重名(actions.json label 核对)。
|
||||
|
||||
## 8. AI + RPA 合规与工业级风控
|
||||
|
||||
- 本技能无外部系统、无 RPA、无不可逆业务动作(画像 S0-1/S0-8);A8-1 ~ A8-16 全部 **N/A**。相关红线(不改财务数据、不存敏感信息、不逆向)由开发文档 §5.3 与 `test_development_policy_guard`/`test_no_rpa_helpers_import` 持续守护。
|
||||
|
||||
## 9. 质量门禁与交活底线
|
||||
|
||||
- [x] A9-1 **P0** **PASS** `python tests/run_tests.py -v`:**338 tests OK(3 skipped)**,2026-09-24 10:54 实测(基线 321 → 本轮新增 17 条金标准/守护用例)。
|
||||
- [x] A9-2 **P0** **PASS** 本技能为纯本地确定性计算,本地即真实档;三代表性场景已真实跑通(A3-1),不以模拟档充数。
|
||||
- [ ] A9-3 **P0** **NEED_MANUAL(未做)** 定位表「挂」的宿主入口按声明抽测(对话播报、数据管理 toolbar/row、HTML 侧栏预览与重建、定时任务创建并手动触发月度播报)。已做:各入口背后的 CLI 命令全部实测通过,`test_tutorial_surfaces`+`test_actions_manifest` 校验声明三方一致。未做:宿主 UI 真机点选(需人工,步骤见「给技术人员的修改清单」)。
|
||||
- [x] A9-4 **P0** **PASS** 版本一致(POLICY-RELEASE-001):`SKILL.md version` = `SKILL_VERSION` = git tag `v1.0.1`(无前缀);CHANGELOG 有 `## 1.0.1` 小节。
|
||||
- [ ] A9-5 **P1** **NEED_MANUAL(未做)** 开发者按平台规则安装并测到该技能(Gitea 工作流成功 + 市场可见可装截图/记录)。已有:tag `v1.0.1`、Gitea remote、`.github/workflows/release_skill.yaml` 就绪;市场安装验证记录仍缺(需人工/平台侧执行)。
|
||||
|
||||
---
|
||||
|
||||
## 10. 报告结尾必填
|
||||
|
||||
### 1. 结论
|
||||
|
||||
**不通过**(存在 5 项未完成的 P0 `NEED_MANUAL`:A1-1、A4-2、A4-3、A6-1、A9-3 —— 全部为宿主 UI 真机验证缺口,**无代码类 P0 FAIL**;0 项 FAIL)。
|
||||
|
||||
### 2. 统计
|
||||
|
||||
| 取值 | 数量 |
|
||||
|------|------|
|
||||
| PASS | 39 |
|
||||
| FAIL | 0 |
|
||||
| N/A | 36 |
|
||||
| NEED_MANUAL(未做) | 9(P0 × 5,P1 × 4) |
|
||||
| 合计 A 类条目 | 84 |
|
||||
|
||||
P0 FAIL 列表:无。
|
||||
P0 NEED_MANUAL 未做列表:A1-1、A4-2、A4-3、A6-1、A9-3。
|
||||
|
||||
### 3. 给技术人员的修改清单
|
||||
|
||||
> 以下均为**人工验证缺口**,无代码缺陷。按 P0 → P1 排序;每项给出期望现象与建议步骤。
|
||||
|
||||
**P0**
|
||||
|
||||
1. **A1-1 宿主识别**:宿主技能详情页能打开本技能,名称「项目经费进度播报助手」、版本 1.0.1 可见;`health`/`version` 详情区可执行。
|
||||
2. **A4-2 + A4-3 任务中心(月度播报)**:宿主定时任务建「技能直调」→ 选「月度经费播报」→ 手动触发;期望:任务中心出现进行中条目,进度按 `[i/n] 项目名:状态` 逐项滚动,结束后有成功结论与批次号;故意断库/无项目时为失败态且原因可读。
|
||||
3. **A6-1 任务记录可追溯**:上述任务完成后,任务中心历史列表可查到该条目与终态摘要(成功/失败均有)。
|
||||
4. **A9-3 多入口抽测**:①对话:「查一下我的经费执行怎么样」→ 播报文本;②数据管理:项目台账 toolbar「经费进度播报」、预警规则行按钮改阈值、播报记录 toolbar「生成经费简报」;③HTML 侧栏打开 `report-*.html` 预览后点重建;④定时入口同 A4-2。期望:各入口结果与 CLI 一致(同一内核),无入口分叉。
|
||||
|
||||
**P1**
|
||||
|
||||
5. **A4-4**:任务中心进行中条目的进度文案人工读一遍,确认 `[1/3] …:正常」可理解。
|
||||
6. **A4-8**:数据管理「预警规则」行点开编辑 form,确认参数区仅阈值字段、无重复主键映射、提交正常。
|
||||
7. **A6-10**:数据管理侧栏预览 HTML 简报:横向铺满、无横向滚动条;重新播报后刷新内容与页头时间。
|
||||
8. **A9-5**:走 `release.ps1` 发版(或验证 v1.0.1 已在市场):Gitea 工作流成功截图 + 技能市场对开发者可见、可安装、装后 `health` 通过;记录存入本目录。
|
||||
|
||||
**复验方式**:完成上述人工项后按 `acceptance-reports/README.md` 再生成一份新时间戳报告,勿覆盖本报告。
|
||||
|
||||
---
|
||||
|
||||
## 附:本轮整改记录(对照开发文档审核后已修复,测试守护)
|
||||
|
||||
1. 「待补录」状态标签触发条件修正(C3 触发且 D 未判 → 待补录),优先级与文档 §6.2 对齐。
|
||||
2. `broadcast-monthly` 改为逐项目计算即 `emit` 增量进度(`run_broadcast(on_progress=…)`),任务中心可见进行中。
|
||||
3. `progress_reports.project_id` 播报时回填(修复 render-html 重建丢金额);新增 `items_json` 规则明细列(重建保留提醒章节);补 `updated_at` + 触发器。
|
||||
4. 旧库迁移改为重建表拷数(SQLite `ALTER ADD COLUMN` 不允许非常量默认值),含回归测试 `test_init_db_migrates_legacy_progress_reports`;真实旧库迁移实测通过(6 行历史保留)。
|
||||
5. 简报 `{{TITLE}}` HTML 转义;章节顺序对齐 §10 并新增独立「暂付款 / 结题提醒」章节;页脚改为文档逐字文案。
|
||||
6. 金标准补测:−10%/+20% 恰界与越界、C2 钳位、N2 反例、C3 逐字段、HTML 注入转义、三色状态灯+提醒断言、`on_progress`、project_id/items_json 落库、`broadcast-monthly` async+cron 定位表守护。
|
||||
7. 文档口径统一:`ERROR:<CODE> <message>`、成功字段 `reports_brief`、`--all-status` 与 skill-detail 表外挂载补记、C1 level=warn、验收 1 明确三处版本号位置(开发文档 v1.1 + REQUIREMENTS v1.1 同步)。
|
||||
Reference in New Issue
Block a user