fixed # 修复作物资源位置不对的历史遗留BUG

add # 新增作物会生虫的逻辑
This commit is contained in:
2026-10-19 17:25:25 +08:00
parent 24ae6102c0
commit 15646525cb
80 changed files with 793505 additions and 226 deletions
+24 -7
View File
@@ -74,11 +74,11 @@ now, options),统一 now 使用UTC秒整数。正常未注册/存储故障仍
## 阶段与缓存
布局使用旧30块地坐标。首季由保存成熟时间减首熟时长推导起点;
再生长由下一次成熟时间减再生长时长推导。阶段阈值映射到本季
时长,解决旧代码多季仍引用最初播种时间的问题;仅改变展示,
不修改成熟和收益规则。枯萎优先于成熟。原偏移字段为offsetX/Y/W/H,
新实现使用真实字段,不沿用旧绘图的offic拼写。
布局使用旧30块地坐标。新播种及新一季使用虫害工作量计算阶段,
未启用虫害的迁移前当前季仍从成熟时间和基础时长推导。
枯萎优先于成熟。作物采用完整画布底边中点统一公式,
不再使用人工阶段锚点和旧 offset 字段,详见 `15-crop-position-formula.md`。
虫子使用场景包中的固定坐标与稳定选帧,规则见 `16-pest-mechanics.md`。
素材LRU默认32MiB,成图LRU默认8MiB;零预算禁用对应缓存,超限
条目不入缓存。素材返回副本,缓存底图不被玩家绘制污染。预算按
@@ -98,8 +98,9 @@ RenderService默认一个绘图任务,最多8个活跃/排队的不同请求
## 素材完整性与来源
scripts/export_render_assets.py将673张已有素材原样打包,附202种作物
展示配置和旧布局。--check比对确定性输出,不修改旧基线。
scripts/export_render_assets.py将已有素材原样打包,附202种作物
展示配置、旧布局和统一定位规则;额外打包新提取的 40 张网页素材。
--check比对确定性输出与原图哈希,不修改旧基线。
素材包约束为安装资源,不按用户输入路径访问任意文件、不解压到磁盘。
保留GPL及原始归属;历史素材分发权仍需在公开发布前核实。
@@ -107,6 +108,22 @@ scripts/export_render_assets.py将673张已有素材原样打包,附202种作
缺失时显示问号占位并记录静态警告,避免整个命令失败;尚未补齐
缺失图片,也不推测相近作物素材替代。不会声称202种作物均有完整图片。
## 原版用户面板恢复(2026-10-16)
使用旧版 `background/userInfo.png` 与 `background/frame/frame.png`,
按原有顺序叠放底板、140×150头像、头像框和昵称/经验/等级/货币。
不再用通用圆角信息卡,不额外显示地块数量。无效头像继续安全降级。
用户确认按原底图校正旧坐标:经验条位于原素材经验槽内,等级与两种
货币不越出底板。普通、高清图统一按3072基准坐标缩放。
保留旧版经验计算口径:本级已获经验为累计经验减本级累计门槛,
分母仍为下一级累计经验门槛;等级门槛没有变化。点券取真实账户余额,
不继承旧版硬编码0。素材按目标尺寸缓存,查询仍只读一次一致快照;
头像字节限制、缓存失效、后台限流和格式选项保留。
本次离线测量见 `render-panel-restored-benchmark.json`,
样图在 `runtime/panel-restored`;不代表真实平台发送耗时。
## 测量与验证
```text
+17 -2
View File
@@ -3,6 +3,10 @@
本文件随生成包分发;业务源码只在主仓库main_plugin_farm维护。
生成目标为Shu-Ying/zhenxun_plugin_farm的farm-preview分支,保留main。
preview.3恢复旧版信息底板和头像框、昵称、经验进度、等级及两种货币。
按用户确认校正原素材上的字段错位,保留旧版经验计算口径;点券显示
真实余额。仍使用目标尺寸绘制、一次快照查询及有界缓存。
## 安装前
此版沿用“开通农场”“我的农场”等原指令,没有测试前缀。请先停止
@@ -31,7 +35,17 @@ Pillow>=10.4,<11,不静默升级宿主到12。NoneBot、真寻和Uninfo由
## 配置与指令
在真寻使用的.env配置中文字体路径,例如Windows:
默认优先使用真寻FONT_PATH目录下已有的中文字体,依次尝试
HYWenHei-85W.ttf、msyh.ttf、syht.otf、syst.otf、
AlibabaHealthFont2.0CN-85B.ttf;文件损坏会继续尝试下一个。
宿主目录均不可用时,再尝试Windows微软雅黑/宋体或Linux常用
Noto Sans CJK/文泉驿路径。不会下载或打包额外字体。
上述默认路径仅属于真寻适配层,不作为其他机器人宿主的默认配置。
NoneBot/AstrBot接入时分别解析各自字体资源;共享farm_render只接收
最终文件路径,不依赖真寻FONT_PATH或固定resources/font目录。
通常不必额外配置;需要覆盖默认字体时,在真寻使用的.env指定路径:
```dotenv
FARM_PREVIEW_FONT=C:/Windows/Fonts/msyh.ttc
@@ -39,7 +53,8 @@ FARM_PREVIEW_DEPLOYMENT=zhenxun-preview
FARM_PREVIEW_IMAGE_FORMAT=AUTO
```
Linux请提供合法可用的中文字体。没有字体时文本交易可用,图片命令
Linux请提供合法可用的中文字体。显式配置优先,配置错误时不会静默
替换成其他字体。所有默认候选都不可用时,文本交易可用,图片命令
会提示配置;不捆绑Windows字体。可选FARM_PREVIEW_DATA_DIR显式设置
独立预览数据目录。AUTO默认JPEG以保守兼容真实平台,确认WebP支持后
可设WEBP,也支持JPEG/PNG。
+43
View File
@@ -0,0 +1,43 @@
# 作物字段与文字指令
本次只补充现有玩法所需的规则与身份字段,不导入网页全量目录,
不保存网页作物 ID,也不更改旧版参考数据库。
## 作物规则
`Plant` 新增字段:
| 字段 | 默认值 | 用途 |
| --- | --- | --- |
| `purchasable` | `True` | 控制商店展示与购买,旧目录从 `isBuy` 读取 |
| `enabled` | `True` | 关闭时禁止新购买与播种,不影响已种作物收获和出售 |
| `crop_type` | `1` | 当前只允许类型 1 购买和播种 |
旧目录可选字段 `enabled` 使用整数 0/1,`crop_type` 使用正整数。
未提供时按上表默认值读取,不将网页 `show` 或 `isLock` 当作购买权限。
`isVip`、金币和点券价格、成熟时间、再生长时间继续沿用原规则。
## 本地 ID
库存使用本地 `plant_id` 作为业务标识。名称仅用于展示与指令查找,
目录内允许同名作物,但每个本地 ID 必须唯一且不能改给另一种作物。
目录改名不改变库存归属;已经种下的作物继续按播种快照结算。
文字指令可使用名称或 `#本地编号`,例如 `购买种子 #1 2`。
同名时拒绝按名称执行,要求使用编号;商店与仓库显示本地编号。
`#编号` 建议保留为指令语法,不作为作物名称。
## 数据库升级
新数据库版本为 2,`inventory` 的主键从 `(identity, name)` 改为
`(identity, plant_id)`;保留名称、种子数、产物数和锁定状态。
版本 1 在 `SQLiteStore.initialize()` 时自动迁移,整个过程在同一事务内。
迁移通过本地目录与已种作物快照解析旧名称;不存在唯一对应 ID 时中止,
保留版本 1 的全部数据,不猜测 ID、不丢弃库存。
自定义目录应传入 `initialize(catalogue=自定义目录)`,真寻接入已传入目录。
账户、流水、历史操作回执和地块成熟时间不改写。
迁移提交后记录版本和行数日志,不记录玩家身份或库存明细。
仅在临时测试库验证迁移,不代表已升级部署中的玩家库。
本次不包含生长阶段、浇水虫害或网页数据导入器。
+66
View File
@@ -0,0 +1,66 @@
# 虫子坐标与资源
状态:2026-10-19 用户已授权接入。已从下载的主场景包提取虫子
38 帧及公共种子、枯萎图,共 40 张图片,保存于
`src/farm_render/source_assets`。manifest 保留源 URL、文件哈希、
原图尺寸及统一位置,不保存网页作物 ID。正式静态渲染按虫序稳定选帧,
资源导出脚本将全部帧打包;核心虫害规则见 `16-pest-mechanics.md`。
## 新确认的普通 WebGL 绘制规则
`WebGLMainSceneLandController.lua` 第 279~282 行定义:
```text
PestPos = [(-26, 13), (-5, 42), (24, 24)]
```
第 320~330 行按照 `landData.pest` 数量创建 `mainscene#Pest`,
以 `PestPos[i]` 设置虫子对象的 `localPosition`。
父节点是 `LandsPestAndWeedContent/LandN/PestAndWeedContent`;
对应土地父容器与土地矩形中心对齐。Unity 坐标 x 向右、y 向上。
普通控制器在 step < 6 时显示虫草;上述坐标与作物种类无关。
主场景包存在 `land/webgl/pest.prefab`,其根节点为 Pest,
矩形尺寸 22 × 30,pivot=(0.5,0.5),localScale=(1,1,1),
带 Image 与 Animator;初始 Image 引用精灵 pest1。
预制体初始位置会被运行时的 PestPos 覆盖,不能当作最终位置使用。
若使用原版单位并设统一场景倍率为 s,地块中心是 (Cx,Cy),
虫子对应坐标为 (u,v),则输出画布中的虫子矩形左上角是:
```text
left = Cx + u × s - 22 × s / 2
top = Cy - v × s - 30 × s / 2
```
这是预制体矩形定位;38 帧完整画布均为 44×60,显示尺寸为 22×30。
动画包的采样率为 24,开启循环;本次聊天图片输出不播放动画。
虫子不应套用作物的 0.75 缩放,需遵循其自身预制体尺寸。
已搜索 Lua 包内 2178 个 TextAsset:未发现 `.insect` 或
`["insect"]` 的直接字段读取;普通及时间农场控制器存在 PestPos。
这不能证明 C# 或其他未分析路径从未使用 insect 字段,
但已确认普通 WebGL 控制器本身采用上述固定位置。
## 已保存的证据
原始数据保留在 `captures/qq-farm-2026-10-19/crops.json` 的 `insect` 字段。
这是离线捕获文件,不进入业务数据库,不引入网页作物 ID。
草莓原始值:
```text
0,0,0,0,0,0|50,10,65,-30,110,-2|50,10,65,-30,110,-2|0,0,0,0,0,0
```
字符串包含 4 组数据;每组 6 个数字,可按 3 对坐标进行语法解析。
组与阶段的关系、全零的含义、坐标原点和缩放方式均未核验。
不能直接将这 4 组映射为本地 6 个生长阶段,也不能当作作物位置。
## 剩余验证事项
1. 如需动画消息,另做动画编码、平台能力和上传验证。
2. 网页虫子实际画面与本地绘制对照仍未进行在线像素级验收。
3. 如需使用旧 insect 字段,另查其消费者,不能覆盖已确认的普通 WebGL 规则。
绘制层读取渲染配置,不污染交易状态,不引入网页作物 ID。
+64
View File
@@ -0,0 +1,64 @@
# 作物阶段位置校准
> 历史试验:本页人工锚点方案已被
> `15-crop-position-formula.md` 的统一定位规则取代。
> 后续绘制使用统一公式;以下保留为试验记录,不再扩展。
## 本轮范围
只校准现有本地草莓素材的种子、发芽、小叶、大叶、开花、成熟阶段。
其他作物和通用枯萎图保持原定位;没有自动套用草莓的数据。
不改旧版参考素材,不裁透明留白,不保存网页作物 ID。
## 参考点与证据边界
采用本地美术基准:茎与地面相接处;种子使用种子簇的落地点。
这是一组人工观察后的本地标注,并非 QQ 网页原始 pivot 的复原结果。
低分辨率边缘存在约 1~2 个原始像素的人工标注误差,
后续可以在同一配置中微调,不能宣称已核验所有作物。
坐标原点是完整参考画布的左上角,x 向右,y 向下。
`reference_size` 是标注时的画布宽高,`anchor` 是其内部落地坐标。
数字均为本地参考画布像素,不是屏幕坐标。
| 本地阶段 | 参考画布 | 落地锚点 |
| --- | --- | --- |
| 0 种子 | 35 × 58 | 17, 20 |
| 1 发芽 | 32 × 81 | 19, 27 |
| 2 小叶 | 61 × 99 | 33, 44 |
| 3 大叶 | 102 × 121 | 58, 72 |
| 4 开花 | 107 × 129 | 62, 75 |
| 5 成熟 | 112 × 139 | 64, 78 |
种子图原始文件较大,参考画布采用当前运行时的 35 × 58 显示尺寸。
其他阶段采用原始 PNG 尺寸;全部保留透明区域。
## 拼接公式
```text
地面目标点 = 地块中心 + 原有作物级 offsetX/offsetY
目标锚点 = anchor × 实际绘制图片尺寸 / reference_size
图片左上角 = 地面目标点 − 目标锚点
```
先缩放图片,再按实际宽高换算锚点,避免不同分辨率取整累计漂移。
普通和高清图采用同一参考坐标,不再分别维护偏移。
## 配置与发布
源配置:`src/farm_render/data/crop_positions.json`。
每个阶段保存 `sprite`、`reference_size`、`anchor`、图片 `sha256`。
`basis` 说明人工标注依据。
导出脚本将标注写入渲染 metadata,并检查图片哈希、阶段和画布尺寸。
更换素材或改变种子尺寸后必须重新标注,不能静默套用旧锚点。
这些是绘图数据,保存在包内配置;不需要修改玩家 SQLite 结构。
复现对照图:
```text
python scripts/preview_crop_positions.py --output <输出目录>
```
图中红十字为地块目标点;阶段 0~5 在相同地块和相同缩放比例下比较。
预览同时给出旧居中算法与新落地锚点算法,观察茎根而非叶片或果实边缘。
自动测试校验跨阶段、跨分辨率的坐标变换;美术位置还需结合预览检查。
+70
View File
@@ -0,0 +1,70 @@
# 作物绘制统一定位规则
2026-10-19 经用户确认,后续普通地块作物绘制采用本文公式。
本文取代 `14-crop-position-calibration.md` 中的人工逐阶段定位方案。
不再扩展人工锚点,不按非透明包围盒裁剪图片,不保存网页作物 ID。
## 已确认的来源
网页公开 Lua 包的 `WebGLMainSceneLandController:SetCropTexture`:
先调用 `Image.SetNativeSize()`,生长阶段宽高乘 0.75,
再将 `RectTransform.anchoredPosition` 设为零。
`WebGLMainSceneLandsController:InitLands` 使用
`LandsCrops/LandN/crop` 作为普通地块作物节点。
主场景包中对应的 90 个普通作物节点(含不同预制体副本)
统一采用 `pivot = anchorMin = anchorMax = (0.5, 0)`。
这是完整画布底边中点,不是可见茎根的人工标注点。
普通土地与作物父容器中心一致;参考矩形为 153 × 79.5。
## 计算公式
输出画布左上角为原点,x 向右、y 向下。土地矩形中心为
`(Cx, Cy)`,显示高度为 `D`,作物完整画布最终显示宽高为 `w, h`:
```text
left = Cx - w / 2
top = Cy + D / 2 - h
```
原版原生像素单位一致时,PNG 完整画布为 `W, H`,场景倍率为 `s`:
```text
D = 79.5 × s
w = 0.75 × W × s
h = 0.75 × H × s
left = Cx - 0.375 × W × s
top = Cy + 39.75 × s - 0.75 × H × s
```
先确定统一场景单位,不能把 0.75 重复叠加到已有图片缩放。
以实际最终显示宽高计算位置,仅在落到输出像素时取整。
必须保留透明留白;参考土地矩形,不能使用土壤可见像素包围盒。
## 阶段边界
- 原版 step 2~6:上述生长图片公式。
- step 1:公共种子图,原生尺寸乘 0.5,localPosition=(0,0,0)。
- step 7/8:公共枯萎图,原生尺寸乘 0.5,localPosition=(0,-8,0)。
- 本地阶段编号需正确映射到原版资源阶段,不能直接混用。
- 特殊、动画和其他场景的作物须分别核验其控制器。
## 验证与接入状态
随机抽取本地数据库的茄子、油菜、黄瓜、迎春花、桂圆,
共绘制 24 个生长阶段;保留完整透明画布,不使用人工锚点。
场景倍率为 2,底边对齐的计算误差不超过 0.5 输出像素。
这验证了预览公式的执行与图片效果,不代表所有素材已逐一核对原图。
正式渲染器已切换到本文公式。`crop_positions.json` schema=2 保存统一规则,
不再包含人工逐阶段锚点;导出 metadata 也不再写入人工标注。
种子和枯萎使用场景包原始公共精灵,分别为 69×30 和 209×92。
现有 3072 基准场景沿用旧土地布局;以其土地显示高度 `D` 除以 79.5
得到原版单位到当前布局的统一倍率,再换算作物与虫子尺寸和坐标。
跨输出分辨率只追加 `width/3072`,不重复应用 0.75。
旧土地的宽高比例仍沿用本地布局,因此本次是定位规则移植,
不是对整个网页场景像素级复刻。
`scripts/preview_crop_positions.py` 已改为调用正式渲染器,生成
1024、1536、3072 三种输出档位的作物阶段及虫子预览。
+71
View File
@@ -0,0 +1,71 @@
# 虫害机制
## 规则与来源
用户明确规定:每只虫使生长速度降低 5%;成熟瞬间每只虫使本季
产量减少 5%。最多三只,速度最低为正常速度的 85%。
采用线性相加,不是逐只复乘。减产在地块加成后的整数产量上
再乘 `(100 - 5 × 成熟虫数) / 100`,向下取整;经验不变。
生虫时机是本项目新增规则,不宣称来自网页:每季间隔为
`max(3600, ceil(基础生长秒数/4))`,最多发生三次生虫事件。
每次一只;除虫后已发生事件不重放,尚未到来的事件仍可继续发生。
成熟时停止生虫;如果生虫与成熟恰好同秒,优先成熟。
## 时间与结算
`farm_core/pests.py` 按生虫事件分段计算,剩余工作量以百分之一秒
为整数单位。无虫时每秒完成 100 单位,有 n 只虫时每秒完成
`100-5n` 单位,成熟秒数向上取整。
除虫恢复后续速度,不补回此前已经损失的时间。
不创建定时后台任务;查询以保存的状态和统一 UTC 时间投影,
收获、除虫在既有 SQLite 业务事务中结算并保存。
因此不需要在线挂机,也不会按“看了几次农场”重复生虫。
阶段展示使用已完成生长工作量,不使用减速后的预计成熟时间倒推阶段。
成熟虫数冻结为 `maturity_pests`。成熟后再除虫会清除可见虫子,
但不会恢复本季产量。下一季及重新播种清空虫数、事件数和减产记录,
重新开始生长;枯萎、铲除后没有虫子。
## 状态与迁移
schema v3 的 plots 增加六个字段:
| 字段 | 含义 |
| --- | --- |
| pest_count | 当前虫数 |
| pest_spawned | 本季已经发生的生虫次数 |
| growth_remaining | 剩余工作量,百分之一秒 |
| growth_updated_at | 已结算到的 UTC 秒 |
| next_pest_at | 下一次生虫 UTC 秒;无后续事件时为空 |
| maturity_pests | 成熟瞬间冻结的虫数 |
v1→v2→v3、v2→v3 都在初始化事务内迁移,保留已有资产、流水与地块。
迁移前已经种植的当前季不追溯增加虫害和成熟时间,仍按原规则结算;
下一季或重新播种后启用虫害。底层原始快照保留计算基准,
业务服务的 snapshot 提供指定时刻投影后的虫数、进度和预计成熟时间。
## QQ 指令与绘制
发送 `农场除虫` 或 `除虫`,一次清除自己所有地块现存虫子,
不收费、不奖励经验;无虫时返回明确提示。重复事件返回原结果,
事务失败全部回滚。`农场详述` 显示虫数、当前减速及已冻结减产比例,
收获结果说明发生减产的地块。
正式渲染器采用 `13-insect-coordinates-deferred.md` 中的固定位置,
以地块中心定位,显示 0~3 只虫,成熟后未除虫时仍显示虫子。
这是为展示用户所要求的成熟虫害状态而保留,区别于网页 step<6 的隐藏条件。
静态图片从完整 38 帧中稳定选帧:依据农场作用域摘要、地块、
本地作物编号、当前季数、虫序,以 SHA-256 确定选帧顺序。
同一地块的多只虫不重复选帧;跨地块允许偶然相同。
不依赖进程随机种子,刷新、重启、切换画质、除虫调整成熟时间均不改帧。
下一季重新计算;同一作物重新播种且其他组合相同时会复用该组合的选帧。
无需增加业务数据库字段。虫数与选帧都进入可见场景缓存键,
除虫后不会复用带虫旧图。完整 38 帧均已归档并进入资源包。
## 验证范围
离线测试覆盖分段减速、离线成熟、成熟后除虫仍减产、多季重置、
重复消息、并发除虫、失败回滚、数据库重新打开、旧版本迁移、
QQ 指令编排和渲染缓存失效。未验证真实 QQ 发送或正在运行的宿主部署。
@@ -3,7 +3,7 @@ name: farm-core-foundation
language: en
phase: verify
status: await-user
state_version: 26
state_version: 36
brief: brief.md
document_constraints_version: 3
shape_confirmation_hash: d1bc1489c0aa3d9a28ff7a24c62aa4bcb4e0a953955d265bcf06f802252cec36
@@ -25,10 +25,10 @@ workspace:
loop:
stage: await-user
goal_cycle: 5
iteration: 2
iteration: 5
attempt: 1
retry_epoch: 0
failed_iteration_count: 0
failed_iteration_count: 1
no_progress_count: 0
execution_failure_count: 0
previous_unresolved_ids: []
@@ -39,21 +39,21 @@ acceptance:
text: "A1: 旧基线 827 文件校验继续通过;新核心不导入三框架、无导入副作用, 可从安装包或源码独立运行,核心不通过路径引用 legacy。"
result: passed
reason:
text: 827文件基线正式检查通过;核心源码仅相对导入,安装及导入副作用测试通过,不依赖legacy或框架。
text: 正式all-offline基线校验827文件通过,独立导入/安装测试通过;源码分层无框架依赖且不经legacy运行。
truncated: false
- id: A2
source: brief.md
text: "A2: 可复现导出 202 条作物配置,名称和必要数值对应源静态数据库; 本地加载支持格式校验,坏数据明确失败,不访问网络。"
result: passed
reason:
text: 202条目录源值及导出复现、损坏目录拒绝测试通过;Catalogue本地读取且验证schema与重复对象。
text: 正式目录可复现校验与源202行对照、损坏输入拒绝测试通过。
truncated: false
- id: A3
source: brief.md
text: "A3: 注册立即可查询 500 农场币、0 点券、0 经验、3 块空地; 重复注册不重复赠送;不同显式作用域不串号。"
result: passed
reason:
text: repository.register在事务内发放500币和3地;重复注册与四段身份隔离正式测试通过。
text: 注册默认资产、三空地、重复领取和作用域隔离正式测试通过;repository.register只首次赠送。
truncated: false
- id: A4
source: brief.md
@@ -61,7 +61,7 @@ acceptance:
不留下部分写入。"
result: passed
reason:
text: 购买播种均通过同一事务调用,整数/等级/资产/空地检查明确;失败无部分写入测试通过。
text: 购买/播种在单事务中完成;非法整数、资源/等级不足、对象不存在和失败无部分写入正式测试通过。
truncated: false
- id: A5
source: brief.md
@@ -69,7 +69,7 @@ acceptance:
多季次数及枯萎/铲除遵守保存的规则与可注入时钟。"
result: passed
reason:
text: 收获按各地块单独计算增量、保存多季状态;成熟边界、加成排序、冻结规则与枯萎测试通过。
text: 成熟边界、多季、逐地加成及100+20=120正式测试通过;application.harvest只累加本次经验。
truncated: false
- id: A6
source: brief.md
@@ -77,7 +77,7 @@ acceptance:
不发生旧版模板参数缺失。"
result: passed
reason:
text: 指定和全部出售均保护锁定状态,只加本次收入;文本及结构化回执返回真实账户,回归通过。
text: 指定/全部出售保护锁定且收益只增加一次;正式回归覆盖真实余额和安全文本。
truncated: false
- id: A7
source: brief.md
@@ -85,14 +85,14 @@ acceptance:
不重复领取,不吞数据库故障伪装成功;重启后数据可读。"
result: passed
reason:
text: BEGIN IMMEDIATE和操作指纹/持久结果覆盖原子回滚、幂等冲突、并发及取消重放;重启/模式拒绝测试通过。
text: storage显式事务与幂等指纹;故障回滚、并发超卖/重复领取、重启恢复和取消重放正式检查通过。
truncated: false
- id: A8
source: brief.md
text: "A8: 提供可执行的离线测试、运行入口和使用说明,保留真实宿主、 真实库迁移及远程发布未验证的说明;文档记录已实现范围和剩余项。"
result: passed
reason:
text: 离线入口、完整56项回归及实现说明可复核;真实宿主、迁库及远程发布边界有说明。
text: 完整离线入口与文档存在,真实宿主/旧库迁移/远端操作边界已记录;当前用户测试不扩大历史自动验证结论。
truncated: false
- id: A9
source: brief.md
@@ -100,35 +100,35 @@ acceptance:
依赖;安装包含所需素材。"
result: passed
reason:
text: Canvas支持透明合成/复制/缩放/裁剪/文字/三格式编码;核心无Pillow运行依赖,wheel独立渲染测试通过。
text: canvas透明合成/裁剪/文本/三编码、wheel独立运行正式测试通过;新面板两素材离线导出并校验。
truncated: false
- id: A10
source: brief.md
text: "A10: 从一次快照绘制空地、生长、成熟、再生长、枯萎及锁定地块, 使用统一时间、旧布局和正确偏移;输出普通/高清可解码图片。"
result: passed
reason:
text: 统一快照和now生成场景,阶段按首熟/再生长锚点映射,枯萎优先并使用实际偏移;普通高清解码及边界测试通过。
text: 一次快照与统一now绘图、各阶段/尺寸正式测试通过;源码与旧drawUserInfo对照恢复userInfo/frame、140x150头像和信息内容,按用户选择校正底图槽位;样图目视确认无框外货币。
truncated: false
- id: A11
source: brief.md
text: "A11: 小画布从开始按目标尺寸绘制;素材和结果缓存有内存上限, 共享素材不被污染;阶段/成熟边界、账户、头像及作用域变化不复用旧图。"
result: passed
reason:
text: 底图直接为目标宽度;素材返回副本,LRU预算有界;身份、可见账户/地块阶段、头像和配置纳入键,正式缓存测试通过。
text: 目标尺寸绘制、LRU预算/复制保护、阶段/账户/头像/身份缓存失效正式测试通过;新增经验边界和经验变化失效覆盖本轮面板。
truncated: false
- id: A12
source: brief.md
text: "A12: 合成和编码在后台执行且限制并发,相同请求合并;取消和异常 不提前释放运行名额、不泄漏后台任务;记录耗时、尺寸和缓存状态。"
result: passed
reason:
text: RenderService整图to_thread,有限排队及并发、相同请求合并,shield取消和关闭排空;并发/取消/失败重试测试通过。
text: RenderService后台线程/信号量/单任务合并/取消保护/关闭排空实现与正式并发测试一致,日志记录时长尺寸缓存。
truncated: false
- id: A13
source: brief.md
text: "A13: 离线生成农场样例、对比尺寸/编码与冷暖缓存,保存测量报告和 接入文档;验证旧基线及原有核心测试,明确尚未接入真实消息平台。"
result: passed
reason:
text: 离线样例报告标注本机单次及未测上传;三格式冷暖数据、布局及文档保留,旧基线和原核心回归继续通过。
text: 离线样例与本机性能报告完整;恢复面板报告675素材、三编码冷暖数据,明确未测低配上传;全回归与基线通过。
truncated: false
- id: A14
source: brief.md
@@ -136,7 +136,7 @@ acceptance:
独立测试数据库与启动/关闭生命周期;缺字体时给出配置提示。"
result: passed
reason:
text: 沿用原中文指令及旧子命令,独立预览库、稳定事件哈希、完整身份、生命周期/字体/头像降级已核对;余额不足映射修正并通过无扣款新测试。
text: 真寻原指令、稳定事件ID、身份隔离与独立库生命周期模拟测试通过;默认FONT_PATH在适配层,显式覆盖与缺失提示有测试。
truncated: false
- id: A15
source: brief.md
@@ -144,14 +144,14 @@ acceptance:
源提交/脏工作区明确记录,相同输入可复现,构建不修改开发源码。"
result: passed
reason:
text: 构建白名单包含私有模块、素材/许可证NOTICE及来源哈希,固定ZIP元数据,不修改开发导入;复现测试通过;最终修复包校验30文件且runtime匹配源码。
text: 白名单构建私有模块/素材/许可证/来源哈希,固定ZIP元数据,正式可复现测试通过;最终preview.3的30文件校验且renderer与源码一致。
truncated: false
- id: A16
source: brief.md
text: "A16: 离线校验ZIP内容、导入和命令路由;安装脚本拒绝路径穿越、 哈希错误和已有目标,不覆盖旧插件或玩家数据;不自动启动真实机器人。"
result: passed
reason:
text: 校验器拒绝重复/额外/穿越/符号链接/哈希错误,先验再安装且独占创建不覆盖;正式边界测试通过。Windows临时目录实测尾点空格变体未复现逃逸。
text: 安装先校验、已有目标拒绝、路径穿越/哈希/符号链接等正式边界测试通过;最终安装目录与ZIP逐文件一致,不启动宿主。
truncated: false
- id: A17
source: brief.md
@@ -159,7 +159,7 @@ acceptance:
由Secrets提供且不进入产物;发布仓库收到生成内容后可独立校验。"
result: passed
reason:
text: CI默认只读/附件输出;同步需手动main触发与受保护环境Secret,脚本默认离线且固定仓库farm-preview、拒绝默认/非生成分支、无force并保护竞态;模拟/守卫通过。
text: 工作流触发/只读权限/矩阵/附件与专用手动发布源码核对,正式守卫通过;固定farm-preview且非force,默认离线,冲突及默认分支拒绝模拟测试通过。
truncated: false
- id: A18
source: brief.md
@@ -168,15 +168,16 @@ acceptance:
提供下载、字体/数据路径、测试命令、回退/卸载和Secrets配置说明。"
result: passed
reason:
text: Windows本机56项及隔离Pillow10.4下24项均正式通过;CI矩阵明确Windows/Linux和10.4/12.3,文档含安装/字体/数据/原指令冲突/卸载/Secrets及未验证边界。
text: 完整60项与Pillow10.4的28项本机正式检查通过,工作流包含Windows/Linux和10.4/12.3;说明记录字体/数据/安装/回退/Secrets及真实消息和远端运行限制。
truncated: false
builder_handoff:
candidate_id: 24c9df3f-4c07-4b34-a21a-8f2ccf9f4adb
candidate_id: f7644c08-b105-472c-9e92-4e28224fa080
identity_provider: skill-coordinated
builder_execution_ref: skill-coordinated:builder:e3b4b544-7ef0-4d3f-bd5f-fb269d4455c2
iteration: 2
builder_execution_ref: skill-coordinated:builder:90d9bf58-287b-4ac9-9c39-e97c23b3bc86
iteration: 5
summary:
text: 按独立验收建议修正余额不足的中文提示映射,增加无扣款回归测试;其余已确认A1-A18实现不变。此前55项/最低23项/工作流检查及独立验收通过,本轮受影响检查由Runtime重验,未执行远端或真实宿主。
text: 恢复旧版用户信息底图、头像框、头像尺寸及昵称/经验/等级/币种字段;用户确认按原底图修正旧坐标错位。经验口径兼容旧版、点券为真实余额。补齐两张原素材,目标尺寸LRU、一次快照与异步限流均保留。15项定向绘图测试通过,已目视核对最新样图并构建preview.3。
完整检查发现一处81字符行宽违规,已拆行;3项打包检查通过,运行完整正式复查。
truncated: false
addressed_acceptance_ids:
- A1
@@ -261,14 +262,20 @@ builder_handoff:
- src/farm_render/layout.py
- src/farm_render/renderer.py
- tests/test_render.py
note: 新实现对应已确认规格,定向测试和离线样例可复核。
- tests/test_render.py::test_legacy_panel_assets_avatar_size_and_layer_order
- tests/test_render.py::test_legacy_panel_fields_progress_and_level_boundaries
- docs/render-panel-restored-benchmark.json
note: 恢复原版面板素材和信息,按用户确认校正旧坐标;15项渲染定向测试与样图核对通过,完整回归交Runtime。
- id: A11
status: implemented-with-evidence
evidence:
- src/farm_render/assets.py
- src/farm_render/renderer.py
- tests/test_render.py
note: 新实现对应已确认规格,定向测试和离线样例可复核。
- tests/test_render.py::test_legacy_panel_assets_avatar_size_and_layer_order
- tests/test_render.py::test_legacy_panel_fields_progress_and_level_boundaries
- docs/render-panel-restored-benchmark.json
note: 恢复原版面板素材和信息,按用户确认校正旧坐标;15项渲染定向测试与样图核对通过,完整回归交Runtime。
- id: A12
status: implemented-with-evidence
evidence:
@@ -281,7 +288,10 @@ builder_handoff:
- scripts/render_demo.py
- docs/10-rendering.md
- docs/render-benchmark.json
note: 新实现对应已确认规格,定向测试和离线样例可复核。
- tests/test_render.py::test_legacy_panel_assets_avatar_size_and_layer_order
- tests/test_render.py::test_legacy_panel_fields_progress_and_level_boundaries
- docs/render-panel-restored-benchmark.json
note: 恢复原版面板素材和信息,按用户确认校正旧坐标;15项渲染定向测试与样图核对通过,完整回归交Runtime。
- id: A14
status: implemented-with-evidence
evidence:
@@ -321,32 +331,39 @@ builder_handoff:
note: 按用户最终选择沿用原指令并保留独立测试数据;定向检查通过,完整与最低依赖检查纳入Runtime计划。
checks:
- name:
text: insufficient-funds-message
text: render-panel-focused
truncated: false
result: passed
note:
text: Observed failing test, fixed mapping, targeted test passed; balance
unchanged
text: 15 tests including original asset layering, avatar geometry, level
boundaries and experience cache invalidation.
truncated: false
- name:
text: visual-panel-and-package
truncated: false
result: passed
note:
text: Latest 1536 JPEG visually inspected; preview.3 built and package verified.
truncated: false
- name:
text: packaging-focused
truncated: false
result: passed
note:
text: 3 packaging tests passed after wrapping overlong renderer line; runtime
full first attempt failed only line-width gate.
truncated: false
checks_truncated: false
known_limits:
- text: 真实真寻/NoneBot依赖注入与平台发图尚未实际运行;模拟宿主不是线上验证。
- text: 真实聊天需重启后由用户测试;不自动重启,不访问真实玩家库。
truncated: false
- text: 本机Windows已测,Linux仅配置CI尚未执行。
- text: 菜单/网页不显示仍未解决;Linux/GitHub未实跑;旧缺图455项未补。
truncated: false
- text: 工作流与跨仓库API只离线检查/模拟,未推送未运行GitHub。
truncated: false
- text: 独立预览库不迁移旧数据;同名指令测试需用户手动停用旧版。
truncated: false
- text: 默认JPEG;WebP需要用户确认消息平台能力后配置。
truncated: false
- text: 缺失455个旧阶段素材引用以占位降级;字体及历史素材发布权需部署/发布前核实。
truncated: false
- text: 本地源码dirty故产物会标记dirty,发布脚本拒绝发布dirty产物。
- text: 恢复旧经验分母为下一等级累计门槛,未改变数值规则。
truncated: false
known_limits_truncated: false
review: null
submitted_at: 2026-10-15T09:52:39.181Z
submitted_at: 2026-10-16T02:27:25.960Z
blockers:
- owner: user
reason:
@@ -356,17 +373,17 @@ blockers:
acceptance_ids: []
resolution_action: await-user
verification:
candidate_id: 24c9df3f-4c07-4b34-a21a-8f2ccf9f4adb
candidate_id: f7644c08-b105-472c-9e92-4e28224fa080
identity_provider: skill-coordinated
verifier_execution_ref: skill-coordinated:verifier:d68f2636-d977-4a84-bc40-0dec8d89c753
iteration: 2
verifier_execution_ref: skill-coordinated:verifier:1c253cb5-527d-407b-9273-2e206149f47d
iteration: 5
attempt: 1
assurance: skill-coordinated
verdict: pass
checks:
- id: all-offline
name:
text: Core render and zhenxun regression
text: Full offline
truncated: false
argv_display:
- text: scripts/verify_foundation.py
@@ -375,10 +392,10 @@ verification:
cwd_ref: .
status: passed
exit_code: 0
duration_ms: 22011
duration_ms: 24375
- id: pillow-10-compat
name:
text: Pillow10.4 render and zhenxun
text: Pillow floor
truncated: false
argv_display:
- text: scripts/check_pillow_compat.py
@@ -391,10 +408,10 @@ verification:
cwd_ref: .
status: passed
exit_code: 0
duration_ms: 12697
duration_ms: 15112
- id: workflow-guards
name:
text: Workflow YAML and boundaries
text: Workflows
truncated: false
argv_display:
- text: scripts/check_workflows.py
@@ -409,17 +426,19 @@ verification:
exit_code: 0
duration_ms: 95
summary:
text: 独立只读核对完整brief、三份规格和18项,审阅核心/渲染/真寻接入、白名单构建/校验/安装/固定发布边界、测试工作流与文档。当前candidate绑定Runtime的56项完整回归、Pillow10.4下24项及工作流守卫均退出码0;日志前缀658580e0与当前cedb操作绑定已核实。额外只读确认最终ZIP30文件且runtime匹配修复源码,余额不足中文提示与无扣款回归通过。图索引过期/缺覆盖已直接源码补齐,未重复完整套件、修改实现或正式文件、远端操作、安装启动宿主或代用户接受。
text: 独立只读核对全部A1-A18、完整brief/三份Spec、相关实现与测试及本候选Runtime绑定。复用60项完整检查、Pillow10.4下28项及工作流守卫,均退出码0;未重跑完整套件。原面板底图/头像框/头像尺寸和信息已恢复,用户授权的槽位坐标校正经源码与1536样图核验;preview.3最终ZIP30文件与当前安装目录逐文件相同,renderer匹配源码。未修改实现/正式规格、操作远端、真实玩家库或启动宿主。
truncated: false
risks:
- text: 真实真寻依赖注入、登录及平台发图未运行;Linux与GitHub工作流/跨仓库API仅配置或模拟,未宣称上线。
- text: 真实聊天须用户重启后验证本轮面板,未自动启动机器人;菜单/网页不显示仍待独立排查。
truncated: false
- text: 沿用原指令需用户先停用旧插件;独立新库不迁移旧玩家数据。AUTO保守默认JPEG,WebP实际平台能力待用户测试。
- text: Linux和GitHub工作流/远端发布未实跑;455个旧作物阶段缺图仍按既定占位处理。
truncated: false
- text: 旧素材455个阶段引用缺图以占位降级;公开发布前需核实素材及字体使用权;当前dirty本地产物只用于测试,发布器拒绝dirty。
- text: 图索引为旧generation且新文件未跟踪;本轮以直接源读取与正式Runtime检查为准。
truncated: false
- text: 经验条沿用旧版当前级经验/下级累计门槛口径,仅校正坐标;不是重新设计升级规则。
truncated: false
risks_truncated: false
completed_at: 2026-10-15T09:58:23.989Z
completed_at: 2026-10-16T02:31:02.032Z
history:
- goal_cycle: 1
iteration: 1
@@ -503,6 +522,51 @@ history:
text: 独立只读核对完整brief、三份规格和18项,审阅核心/渲染/真寻接入、白名单构建/校验/安装/固定发布边界、测试工作流与文档。当前candidate绑定Runtime的56项完整回归、Pillow10.4下24项及工作流守卫均退出码0;日志前缀658580e0与当前cedb操作绑定已核实。额外只读确认最终ZIP30文件且runtime匹配修复源码,余额不足中文提示与无扣款回归通过。图索引过期/缺覆盖已直接源码补齐,未重复完整套件、修改实现或正式文件、远端操作、安装启动宿主或代用户接受。
truncated: false
completed_at: 2026-10-15T09:58:23.989Z
- goal_cycle: 5
iteration: 2
attempt: 1
outcome: recovery
unresolved_ids: []
summary:
text: 用户实际测试要求默认字体:在真寻适配层默认复用宿主字体目录,保留显式字体覆盖和缺失时清楚提示;修复预览版默认不可绘图的接入遗漏。
truncated: false
completed_at: 2026-10-16T02:06:48.036Z
- goal_cycle: 5
iteration: 3
attempt: 1
outcome: pass
unresolved_ids: []
summary:
text: 独立只读验收全部A1-A18:完整brief/三spec与当前字体实现、测试、文档已核对;复用此前未改变核心/渲染/发布的正式独立验收,并核实本候选绑定Runtime三检查exit0,实际58项完整与Pillow10.4下26项通过。真寻FONT_PATH为resources/font,接入层默认选宿主字体,坏默认跳过、显式覆盖优先,共享层未引入真寻路径;安装目录runtime/commands与主源SHA256一致。图索引不覆盖新文件或metadata_changed,已读源码补齐;未重跑完整测试、未修改项目文件、未启动宿主或访问远端。
truncated: false
completed_at: 2026-10-16T02:13:06.574Z
- goal_cycle: 5
iteration: 3
attempt: 1
outcome: recovery
unresolved_ids: []
summary:
text: 用户要求修复迁移遗漏:恢复旧版用户面板素材、布局与经验进度语义并保留性能优化。
truncated: false
completed_at: 2026-10-16T02:17:50.690Z
- goal_cycle: 5
iteration: 4
attempt: 0
outcome: recovery
unresolved_ids: []
summary:
text: "Builder handoff Runtime checks failed: all-offline"
truncated: false
completed_at: 2026-10-16T02:26:17.238Z
- goal_cycle: 5
iteration: 5
attempt: 1
outcome: pass
unresolved_ids: []
summary:
text: 独立只读核对全部A1-A18、完整brief/三份Spec、相关实现与测试及本候选Runtime绑定。复用60项完整检查、Pillow10.4下28项及工作流守卫,均退出码0;未重跑完整套件。原面板底图/头像框/头像尺寸和信息已恢复,用户授权的槽位坐标校正经源码与1536样图核验;preview.3最终ZIP30文件与当前安装目录逐文件相同,renderer匹配源码。未修改实现/正式规格、操作远端、真实玩家库或启动宿主。
truncated: false
completed_at: 2026-10-16T02:31:02.032Z
history_overflow:
dropped_entries: 0
first_dropped_at: null
@@ -1,5 +1,5 @@
---
generated_from_state_version: 26
generated_from_state_version: 36
---
# Verification
@@ -9,54 +9,52 @@ generated_from_state_version: 26
- Result: **Verification passed; your confirmation is required**
- Verification status: **Checks completed, but your confirmation is required**
- Goal cycle: 5
- Iteration: 2
- Iteration: 5
- Verifier attempt: 1
- Completed: 2026-10-15T09:58:23.989Z
- Summary: 独立只读核对完整brief、三份规格和18项,审阅核心/渲染/真寻接入、白名单构建/校验/安装/固定发布边界、测试工作流与文档。当前candidate绑定Runtime的56项完整回归、Pillow10.4下24项及工作流守卫均退出码0;日志前缀658580e0与当前cedb操作绑定已核实。额外只读确认最终ZIP30文件且runtime匹配修复源码,余额不足中文提示与无扣款回归通过。图索引过期/缺覆盖已直接源码补齐,未重复完整套件、修改实现或正式文件、远端操作、安装启动宿主或代用户接受。
- Completed: 2026-10-16T02:31:02.032Z
- Summary: 独立只读核对全部A1-A18、完整brief/三份Spec、相关实现与测试及本候选Runtime绑定。复用60项完整检查、Pillow10.4下28项及工作流守卫,均退出码0;未重跑完整套件。原面板底图/头像框/头像尺寸和信息已恢复,用户授权的槽位坐标校正经源码与1536样图核验;preview.3最终ZIP30文件与当前安装目录逐文件相同,renderer匹配源码。未修改实现/正式规格、操作远端、真实玩家库或启动宿主。
## Acceptance
| ID | Result | Source | Criterion | Reason |
| --- | --- | --- | --- | --- |
| A1 | passed | brief.md | A1: 旧基线 827 文件校验继续通过;新核心不导入三框架、无导入副作用, 可从安装包或源码独立运行,核心不通过路径引用 legacy。 | 827文件基线正式检查通过;核心源码仅相对导入,安装及导入副作用测试通过,不依赖legacy或框架。 |
| A2 | passed | brief.md | A2: 可复现导出 202 条作物配置,名称和必要数值对应源静态数据库; 本地加载支持格式校验,坏数据明确失败,不访问网络。 | 202条目录源值及导出复现、损坏目录拒绝测试通过;Catalogue本地读取且验证schema与重复对象。 |
| A3 | passed | brief.md | A3: 注册立即可查询 500 农场币、0 点券、0 经验、3 块空地; 重复注册不重复赠送;不同显式作用域不串号。 | repository.register在事务内发放500币和3地;重复注册与四段身份隔离正式测试通过。 |
| A4 | passed | brief.md | A4: 购买到播种全过程扣款、入库、耗种和地块改变正确;0、负数、 布尔值、超大数量、余额/库存不足、等级不足和不存在对象明确失败, 不留下部分写入。 | 购买播种均通过同一事务调用,整数/等级/资产/空地检查明确;失败无部分写入测试通过。 |
| A5 | passed | brief.md | A5: 未成熟不能收获;成熟后只增加本次产量/经验;历史经验 100、 本次获得20时为120;多地加成逐块计算且交换顺序不改变总和; 多季次数及枯萎/铲除遵守保存的规则与可注入时钟。 | 收获按各地块单独计算增量、保存多季状态;成熟边界、加成排序、冻结规则与枯萎测试通过。 |
| A6 | passed | brief.md | A6: 出售收益只增加一次,例如余额100、收益20后为120; 锁定同时约束指定与全部出售;返回结构化真实余额及安全文本, 不发生旧版模板参数缺失。 | 指定和全部出售均保护锁定状态,只加本次收入;文本及结构化回执返回真实账户,回归通过。 |
| A7 | passed | brief.md | A7: 模拟交易中途异常时余额、库存、地块及流水整体回滚; 同一操作标识重试返回原结果、参数冲突拒绝;并发写入不超卖、 不重复领取,不吞数据库故障伪装成功;重启后数据可读。 | BEGIN IMMEDIATE和操作指纹/持久结果覆盖原子回滚、幂等冲突、并发及取消重放;重启/模式拒绝测试通过。 |
| A8 | passed | brief.md | A8: 提供可执行的离线测试、运行入口和使用说明,保留真实宿主、 真实库迁移及远程发布未验证的说明;文档记录已实现范围和剩余项。 | 离线入口、完整56项回归及实现说明可复核;真实宿主、迁库及远程发布边界有说明。 |
| A9 | passed | brief.md | A9: 独立图片工具支持透明合成、缩放、裁剪、文本测量/省略和三格式编码; 渲染不导入框架、不联网,核心保持无 Pillow 依赖;安装包含所需素材。 | Canvas支持透明合成/复制/缩放/裁剪/文字/三格式编码;核心无Pillow运行依赖,wheel独立渲染测试通过。 |
| A10 | passed | brief.md | A10: 从一次快照绘制空地、生长、成熟、再生长、枯萎及锁定地块, 使用统一时间、旧布局和正确偏移;输出普通/高清可解码图片。 | 统一快照和now生成场景,阶段按首熟/再生长锚点映射,枯萎优先并使用实际偏移;普通高清解码及边界测试通过。 |
| A11 | passed | brief.md | A11: 小画布从开始按目标尺寸绘制;素材和结果缓存有内存上限, 共享素材不被污染;阶段/成熟边界、账户、头像及作用域变化不复用旧图。 | 底图直接为目标宽度;素材返回副本,LRU预算有界;身份、可见账户/地块阶段、头像和配置纳入键,正式缓存测试通过。 |
| A12 | passed | brief.md | A12: 合成和编码在后台执行且限制并发,相同请求合并;取消和异常 不提前释放运行名额、不泄漏后台任务;记录耗时、尺寸和缓存状态。 | RenderService整图to_thread,有限排队及并发、相同请求合并,shield取消和关闭排空;并发/取消/失败重试测试通过。 |
| A13 | passed | brief.md | A13: 离线生成农场样例、对比尺寸/编码与冷暖缓存,保存测量报告和 接入文档;验证旧基线及原有核心测试,明确尚未接入真实消息平台。 | 离线样例报告标注本机单次及未测上传;三格式冷暖数据、布局及文档保留,旧基线和原核心回归继续通过。 |
| A14 | passed | brief.md | A14: 真寻接入沿用原指令提供帮助、注册、我的农场、仓库、购买、 播种、收获、铲除、锁定/解锁、出售;稳定事件幂等标识、身份隔离, 独立测试数据库与启动/关闭生命周期;缺字体时给出配置提示。 | 沿用原中文指令及旧子命令,独立预览库、稳定事件哈希、完整身份、生命周期/字体/头像降级已核对;余额不足映射修正并通过无扣款新测试。 |
| A15 | passed | brief.md | A15: 白名单构建完整真寻插件ZIP,包含私有共享模块、静态素材、 依赖、许可证及来源/文件哈希;不含其他适配、legacy、测试或玩家数据, 源提交/脏工作区明确记录,相同输入可复现,构建不修改开发源码。 | 构建白名单包含私有模块、素材/许可证NOTICE及来源哈希,固定ZIP元数据,不修改开发导入;复现测试通过;最终修复包校验30文件且runtime匹配源码。 |
| A16 | passed | brief.md | A16: 离线校验ZIP内容、导入和命令路由;安装脚本拒绝路径穿越、 哈希错误和已有目标,不覆盖旧插件或玩家数据;不自动启动真实机器人。 | 校验器拒绝重复/额外/穿越/符号链接/哈希错误,先验再安装且独占创建不覆盖;正式边界测试通过。Windows临时目录实测尾点空格变体未复现逃逸。 |
| A17 | passed | brief.md | A17: 主仓库工作流完成检查/构建/上传测试附件;可选手动发布只面向 固定真寻仓库的专用测试分支,默认不发布、不改main、不force,凭据 由Secrets提供且不进入产物;发布仓库收到生成内容后可独立校验。 | CI默认只读/附件输出;同步需手动main触发与受保护环境Secret,脚本默认离线且固定仓库farm-preview、拒绝默认/非生成分支、无force并保护竞态;模拟/守卫通过。 |
| A18 | passed | brief.md | A18: 本机离线验证打包、边界与安装行为;CI覆盖Windows/Linux及 Pillow10.4和当前支持版本,记录真实宿主、GitHub运行未验证边界; 提供下载、字体/数据路径、测试命令、回退/卸载和Secrets配置说明。 | Windows本机56项及隔离Pillow10.4下24项均正式通过;CI矩阵明确Windows/Linux和10.4/12.3,文档含安装/字体/数据/原指令冲突/卸载/Secrets及未验证边界。 |
| A1 | passed | brief.md | A1: 旧基线 827 文件校验继续通过;新核心不导入三框架、无导入副作用, 可从安装包或源码独立运行,核心不通过路径引用 legacy。 | 正式all-offline基线校验827文件通过,独立导入/安装测试通过;源码分层无框架依赖且不经legacy运行。 |
| A2 | passed | brief.md | A2: 可复现导出 202 条作物配置,名称和必要数值对应源静态数据库; 本地加载支持格式校验,坏数据明确失败,不访问网络。 | 正式目录可复现校验与源202行对照、损坏输入拒绝测试通过。 |
| A3 | passed | brief.md | A3: 注册立即可查询 500 农场币、0 点券、0 经验、3 块空地; 重复注册不重复赠送;不同显式作用域不串号。 | 注册默认资产、三空地、重复领取和作用域隔离正式测试通过;repository.register只首次赠送。 |
| A4 | passed | brief.md | A4: 购买到播种全过程扣款、入库、耗种和地块改变正确;0、负数、 布尔值、超大数量、余额/库存不足、等级不足和不存在对象明确失败, 不留下部分写入。 | 购买/播种在单事务中完成;非法整数、资源/等级不足、对象不存在和失败无部分写入正式测试通过。 |
| A5 | passed | brief.md | A5: 未成熟不能收获;成熟后只增加本次产量/经验;历史经验 100、 本次获得20时为120;多地加成逐块计算且交换顺序不改变总和; 多季次数及枯萎/铲除遵守保存的规则与可注入时钟。 | 成熟边界、多季、逐地加成及100+20=120正式测试通过;application.harvest只累加本次经验。 |
| A6 | passed | brief.md | A6: 出售收益只增加一次,例如余额100、收益20后为120; 锁定同时约束指定与全部出售;返回结构化真实余额及安全文本, 不发生旧版模板参数缺失。 | 指定/全部出售保护锁定且收益只增加一次;正式回归覆盖真实余额和安全文本。 |
| A7 | passed | brief.md | A7: 模拟交易中途异常时余额、库存、地块及流水整体回滚; 同一操作标识重试返回原结果、参数冲突拒绝;并发写入不超卖、 不重复领取,不吞数据库故障伪装成功;重启后数据可读。 | storage显式事务与幂等指纹;故障回滚、并发超卖/重复领取、重启恢复和取消重放正式检查通过。 |
| A8 | passed | brief.md | A8: 提供可执行的离线测试、运行入口和使用说明,保留真实宿主、 真实库迁移及远程发布未验证的说明;文档记录已实现范围和剩余项。 | 完整离线入口与文档存在,真实宿主/旧库迁移/远端操作边界已记录;当前用户测试不扩大历史自动验证结论。 |
| A9 | passed | brief.md | A9: 独立图片工具支持透明合成、缩放、裁剪、文本测量/省略和三格式编码; 渲染不导入框架、不联网,核心保持无 Pillow 依赖;安装包含所需素材。 | canvas透明合成/裁剪/文本/三编码、wheel独立运行正式测试通过;新面板两素材离线导出并校验。 |
| A10 | passed | brief.md | A10: 从一次快照绘制空地、生长、成熟、再生长、枯萎及锁定地块, 使用统一时间、旧布局和正确偏移;输出普通/高清可解码图片。 | 一次快照与统一now绘图、各阶段/尺寸正式测试通过;源码与旧drawUserInfo对照恢复userInfo/frame、140x150头像和信息内容,按用户选择校正底图槽位;样图目视确认无框外货币。 |
| A11 | passed | brief.md | A11: 小画布从开始按目标尺寸绘制;素材和结果缓存有内存上限, 共享素材不被污染;阶段/成熟边界、账户、头像及作用域变化不复用旧图。 | 目标尺寸绘制、LRU预算/复制保护、阶段/账户/头像/身份缓存失效正式测试通过;新增经验边界和经验变化失效覆盖本轮面板。 |
| A12 | passed | brief.md | A12: 合成和编码在后台执行且限制并发,相同请求合并;取消和异常 不提前释放运行名额、不泄漏后台任务;记录耗时、尺寸和缓存状态。 | RenderService后台线程/信号量/单任务合并/取消保护/关闭排空实现与正式并发测试一致,日志记录时长尺寸缓存。 |
| A13 | passed | brief.md | A13: 离线生成农场样例、对比尺寸/编码与冷暖缓存,保存测量报告和 接入文档;验证旧基线及原有核心测试,明确尚未接入真实消息平台。 | 离线样例与本机性能报告完整;恢复面板报告675素材、三编码冷暖数据,明确未测低配上传;全回归与基线通过。 |
| A14 | passed | brief.md | A14: 真寻接入沿用原指令提供帮助、注册、我的农场、仓库、购买、 播种、收获、铲除、锁定/解锁、出售;稳定事件幂等标识、身份隔离, 独立测试数据库与启动/关闭生命周期;缺字体时给出配置提示。 | 真寻原指令、稳定事件ID、身份隔离与独立库生命周期模拟测试通过;默认FONT_PATH在适配层,显式覆盖与缺失提示有测试。 |
| A15 | passed | brief.md | A15: 白名单构建完整真寻插件ZIP,包含私有共享模块、静态素材、 依赖、许可证及来源/文件哈希;不含其他适配、legacy、测试或玩家数据, 源提交/脏工作区明确记录,相同输入可复现,构建不修改开发源码。 | 白名单构建私有模块/素材/许可证/来源哈希,固定ZIP元数据,正式可复现测试通过;最终preview.3的30文件校验且renderer与源码一致。 |
| A16 | passed | brief.md | A16: 离线校验ZIP内容、导入和命令路由;安装脚本拒绝路径穿越、 哈希错误和已有目标,不覆盖旧插件或玩家数据;不自动启动真实机器人。 | 安装先校验、已有目标拒绝、路径穿越/哈希/符号链接等正式边界测试通过;最终安装目录与ZIP逐文件一致,不启动宿主。 |
| A17 | passed | brief.md | A17: 主仓库工作流完成检查/构建/上传测试附件;可选手动发布只面向 固定真寻仓库的专用测试分支,默认不发布、不改main、不force,凭据 由Secrets提供且不进入产物;发布仓库收到生成内容后可独立校验。 | 工作流触发/只读权限/矩阵/附件与专用手动发布源码核对,正式守卫通过;固定farm-preview且非force,默认离线,冲突及默认分支拒绝模拟测试通过。 |
| A18 | passed | brief.md | A18: 本机离线验证打包、边界与安装行为;CI覆盖Windows/Linux及 Pillow10.4和当前支持版本,记录真实宿主、GitHub运行未验证边界; 提供下载、字体/数据路径、测试命令、回退/卸载和Secrets配置说明。 | 完整60项与Pillow10.4的28项本机正式检查通过,工作流包含Windows/Linux和10.4/12.3;说明记录字体/数据/安装/回退/Secrets及真实消息和远端运行限制。 |
## Checks
| Check | Command | Working directory | Status | Exit | Duration |
| --- | --- | --- | --- | ---: | ---: |
| Core render and zhenxun regression | scripts/verify_foundation.py | . | passed | 0 | 22011 ms |
| Pillow10.4 render and zhenxun | scripts/check_pillow_compat.py --dependency-path .release-cache/pillow10 | . | passed | 0 | 12697 ms |
| Workflow YAML and boundaries | scripts/check_workflows.py --dependency-path .release-cache/qa | . | passed | 0 | 95 ms |
| Full offline | scripts/verify_foundation.py | . | passed | 0 | 24375 ms |
| Pillow floor | scripts/check_pillow_compat.py --dependency-path .release-cache/pillow10 | . | passed | 0 | 15112 ms |
| Workflows | scripts/check_workflows.py --dependency-path .release-cache/qa | . | passed | 0 | 95 ms |
### Builder-reported evidence
These are Builder reports, not Runtime check receipts or independent verification results.
- insufficient-funds-message: passed — Observed failing test, fixed mapping, targeted test passed; balance unchanged
- Known limitation: 真实真寻/NoneBot依赖注入与平台发图尚未实际运行;模拟宿主不是线上验证。
- Known limitation: 本机Windows已测,Linux仅配置CI尚未执行。
- Known limitation: 工作流与跨仓库API只离线检查/模拟,未推送未运行GitHub。
- Known limitation: 独立预览库不迁移旧数据;同名指令测试需用户手动停用旧版。
- Known limitation: 默认JPEG;WebP需要用户确认消息平台能力后配置。
- Known limitation: 缺失455个旧阶段素材引用以占位降级;字体及历史素材发布权需部署/发布前核实。
- Known limitation: 本地源码dirty故产物会标记dirty,发布脚本拒绝发布dirty产物。
- render-panel-focused: passed — 15 tests including original asset layering, avatar geometry, level boundaries and experience cache invalidation.
- visual-panel-and-package: passed — Latest 1536 JPEG visually inspected; preview.3 built and package verified.
- packaging-focused: passed — 3 packaging tests passed after wrapping overlong renderer line; runtime full first attempt failed only line-width gate.
- Known limitation: 真实聊天需重启后由用户测试;不自动重启,不访问真实玩家库。
- Known limitation: 菜单/网页不显示仍未解决;Linux/GitHub未实跑;旧缺图455项未补。
- Known limitation: 恢复旧经验分母为下一等级累计门槛,未改变数值规则。
## Blockers
@@ -64,9 +62,10 @@ These are Builder reports, not Runtime check receipts or independent verificatio
## Risks and skipped work
- 真实真寻依赖注入、登录及平台发图未运行;Linux与GitHub工作流/跨仓库API仅配置或模拟,未宣称上线。
- 沿用原指令需用户先停用旧插件;独立新库不迁移旧玩家数据。AUTO保守默认JPEG,WebP实际平台能力待用户测试。
- 旧素材455个阶段引用缺图以占位降级;公开发布前需核实素材及字体使用权;当前dirty本地产物只用于测试,发布器拒绝dirty。
- 真实聊天须用户重启后验证本轮面板,未自动启动机器人;菜单/网页不显示仍待独立排查。
- Linux和GitHub工作流/远端发布未实跑;455个旧作物阶段缺图仍按既定占位处理。
- 图索引为旧generation且新文件未跟踪;本轮以直接源读取与正式Runtime检查为准。
- 经验条沿用旧版当前级经验/下级累计门槛口径,仅校正坐标;不是重新设计升级规则。
## Previous iterations
@@ -81,9 +80,14 @@ These are Builder reports, not Runtime check receipts or independent verificatio
| 5 | 1 | 1 | pass | — | 独立只读核对完整brief、三份规格及18项验收,审阅核心/渲染、真寻接入、白名单构建/校验/安装/固定发布边界、工作流和测试文档。复用本候选正式Runtime的55项全回归、Pillow10.4下23项兼容检查及工作流守卫,全部通过;未重复完整套件。图索引旧/新增缺覆盖,已直接源码补齐。未修改实现或正式规格,未访问远端、安装/启动机器人或代用户接受。 | 2026-10-15T09:51:26.860Z |
| 5 | 1 | 1 | recovery | — | 独立验收指出余额不足错误码映射缺少insufficient_funds;保持已确认范围,补中文提示及回归测试后重新交付。 | 2026-10-15T09:52:02.989Z |
| 5 | 2 | 1 | pass | — | 独立只读核对完整brief、三份规格和18项,审阅核心/渲染/真寻接入、白名单构建/校验/安装/固定发布边界、测试工作流与文档。当前candidate绑定Runtime的56项完整回归、Pillow10.4下24项及工作流守卫均退出码0;日志前缀658580e0与当前cedb操作绑定已核实。额外只读确认最终ZIP30文件且runtime匹配修复源码,余额不足中文提示与无扣款回归通过。图索引过期/缺覆盖已直接源码补齐,未重复完整套件、修改实现或正式文件、远端操作、安装启动宿主或代用户接受。 | 2026-10-15T09:58:23.989Z |
| 5 | 2 | 1 | recovery | — | 用户实际测试要求默认字体:在真寻适配层默认复用宿主字体目录,保留显式字体覆盖和缺失时清楚提示;修复预览版默认不可绘图的接入遗漏。 | 2026-10-16T02:06:48.036Z |
| 5 | 3 | 1 | pass | — | 独立只读验收全部A1-A18:完整brief/三spec与当前字体实现、测试、文档已核对;复用此前未改变核心/渲染/发布的正式独立验收,并核实本候选绑定Runtime三检查exit0,实际58项完整与Pillow10.4下26项通过。真寻FONT_PATH为resources/font,接入层默认选宿主字体,坏默认跳过、显式覆盖优先,共享层未引入真寻路径;安装目录runtime/commands与主源SHA256一致。图索引不覆盖新文件或metadata_changed,已读源码补齐;未重跑完整测试、未修改项目文件、未启动宿主或访问远端。 | 2026-10-16T02:13:06.574Z |
| 5 | 3 | 1 | recovery | — | 用户要求修复迁移遗漏:恢复旧版用户面板素材、布局与经验进度语义并保留性能优化。 | 2026-10-16T02:17:50.690Z |
| 5 | 4 | 0 | recovery | — | Builder handoff Runtime checks failed: all-offline | 2026-10-16T02:26:17.238Z |
| 5 | 5 | 1 | pass | — | 独立只读核对全部A1-A18、完整brief/三份Spec、相关实现与测试及本候选Runtime绑定。复用60项完整检查、Pillow10.4下28项及工作流守卫,均退出码0;未重跑完整套件。原面板底图/头像框/头像尺寸和信息已恢复,用户授权的槽位坐标校正经源码与1536样图核验;preview.3最终ZIP30文件与当前安装目录逐文件相同,renderer匹配源码。未修改实现/正式规格、操作远端、真实玩家库或启动宿主。 | 2026-10-16T02:31:02.032Z |
## Conclusion
独立只读核对完整brief、三份规格和18项,审阅核心/渲染/真寻接入、白名单构建/校验/安装/固定发布边界、测试工作流与文档。当前candidate绑定Runtime的56项完整回归、Pillow10.4下24项及工作流守卫均退出码0;日志前缀658580e0与当前cedb操作绑定已核实。额外只读确认最终ZIP30文件且runtime匹配修复源码,余额不足中文提示与无扣款回归通过。图索引过期/缺覆盖已直接源码补齐,未重复完整套件、修改实现或正式文件、远端操作、安装启动宿主或代用户接受。
独立只读核对全部A1-A18、完整brief/三份Spec、相关实现与测试及本候选Runtime绑定。复用60项完整检查、Pillow10.4下28项及工作流守卫,均退出码0;未重跑完整套件。原面板底图/头像框/头像尺寸和信息已恢复,用户授权的槽位坐标校正经源码与1536样图核验;preview.3最终ZIP30文件与当前安装目录逐文件相同,renderer匹配源码。未修改实现/正式规格、操作远端、真实玩家库或启动宿主。
+27
View File
@@ -1,5 +1,21 @@
# 执行记录
## 2026-10-16 原版信息面板恢复
- 用户要求恢复旧头像框和信息内容,并确认按原底图校正已有坐标错位。
- 对照旧drawUserInfo恢复userInfo.png/frame.png、头像尺寸与叠放顺序;
经验保留旧版本级已获/下一级累计门槛口径,点券读取真实余额。
- 素材导出补齐两张旧图(共675张),不修改legacy基线;按目标尺寸
缓存素材,保留一次快照、后台绘制、限流、合并与成图缓存。
- 15项绘图定向测试通过,包括像素叠放对照、等级边界、经验变化失效;
离线样图已目视检查。Runtime正式检查:完整60项、Pillow10.4下28项
和工作流守卫全部通过;首轮行宽失败已修正并完成正式复查。
- preview.3最终包在dist/zhenxun-preview-panel-restored-final;当前真寻
插件已同步六个生成文件并校验通过,原文件备份位于
runtime/panel-restore-backup-20261016,未重启机器人或修改玩家数据。
- 样例和本机性能见runtime/panel-restored与
docs/render-panel-restored-benchmark.json;实际聊天发送待用户验证。
## 2026-10-15
1. 定位空 farm 目录,核对旧项目分支与源提交。
@@ -73,3 +89,14 @@
包内runtime.py与修复源码一致。已生成dist/zhenxun-preview-ready交付。
- 最终大小/哈希和验证边界保存zhenxun-preview-checks.json。
- 当前等待用户接受验收;没有提交、归档、推送、发布或真实宿主安装。
## 2026-10-16 默认字体修复
- 用户实际测试提示FARM_PREVIEW_FONT,要求有默认配置。
- 真寻适配层使用宿主FONT_PATH,优先HYWenHei-85W.ttf,保留显式覆盖,
可跳过损坏的默认候选;不把此默认路径推广到其他框架或共享渲染层。
- 7项接入测试通过。已备份并同步已安装预览的runtime.py/commands.py
及清单;未改数据库、未重启宿主。
- 使用真寻实际虚拟环境及临时合成玩家库生成JPEG1024×624成功,
自动选择现有HYWenHei-85W.ttf。不是通过真实聊天消息的发图验证。
- 菜单/网页插件管理不显示问题尚未定位,不能报告为已解决。
+101
View File
@@ -0,0 +1,101 @@
{
"python": "3.12.14",
"os": "Windows",
"pillow": "12.3.0",
"synthetic_data": true,
"scope": "本机单次样例;非旧版对照,未测上传或低配服务器",
"asset_count": 675,
"legacy_missing_stage_references": 455,
"measurements": [
{
"width": 1024,
"height": 624,
"codec": "WEBP",
"quality": 75,
"method": 2,
"bytes": 86594,
"cold_ms": 204.684,
"compose_ms": 140.895,
"encode_ms": 63.156,
"warm_ms": 0.478,
"warm_cache_hit": true,
"asset_cache_bytes": 5343464,
"result_cache_bytes": 90690
},
{
"width": 1024,
"height": 624,
"codec": "JPEG",
"quality": 75,
"method": 2,
"bytes": 112862,
"cold_ms": 122.716,
"compose_ms": 117.766,
"encode_ms": 4.495,
"warm_ms": 0.24,
"warm_cache_hit": true,
"asset_cache_bytes": 5343464,
"result_cache_bytes": 116958
},
{
"width": 1024,
"height": 624,
"codec": "PNG",
"quality": 75,
"method": 2,
"bytes": 1123597,
"cold_ms": 163.744,
"compose_ms": 124.098,
"encode_ms": 39.237,
"warm_ms": 0.345,
"warm_cache_hit": true,
"asset_cache_bytes": 5343464,
"result_cache_bytes": 1127693
},
{
"width": 1536,
"height": 936,
"codec": "WEBP",
"quality": 85,
"method": 2,
"bytes": 234716,
"cold_ms": 222.895,
"compose_ms": 138.411,
"encode_ms": 83.824,
"warm_ms": 0.374,
"warm_cache_hit": true,
"asset_cache_bytes": 12022448,
"result_cache_bytes": 238812
},
{
"width": 1536,
"height": 936,
"codec": "JPEG",
"quality": 85,
"method": 2,
"bytes": 296080,
"cold_ms": 143.138,
"compose_ms": 132.595,
"encode_ms": 10.014,
"warm_ms": 0.21,
"warm_cache_hit": true,
"asset_cache_bytes": 12022448,
"result_cache_bytes": 300176
},
{
"width": 1536,
"height": 936,
"codec": "PNG",
"quality": 85,
"method": 2,
"bytes": 2243287,
"cold_ms": 235.929,
"compose_ms": 146.362,
"encode_ms": 89.006,
"warm_ms": 0.386,
"warm_cache_hit": true,
"asset_cache_bytes": 12022448,
"result_cache_bytes": 2247383
}
]
}