add # 新增项目整体大纲

This commit is contained in:
2026-10-15 17:21:05 +08:00
parent ff03600ae9
commit ff4df9ad51
52 changed files with 15104 additions and 47 deletions
+2 -2
View File
@@ -2,7 +2,7 @@
## 原则与当前状态
下列为建议设计,尚未实现。当前旧代码位于 legacy,未把其全局变量、
下列为远期目标设计;第一批核心已按职责实现为独立模块,见09-foundation.md。当前旧代码位于 legacy,未把其全局变量、
数据库管理器和服务定位器直接当作新核心继续复用。
采用一个共享 Python 包,内部按职责划分,避免先建多个互相依赖的
@@ -33,7 +33,7 @@ farm/
docs/
```
本轮只创建职责说明及迁移基线,不生成大量空模块或假实现。
初始化时只创建职责说明;当前已实现第一批核心,不生成大量空模块。
当一个用例实施时,才创建所需模块。
## 依赖方向
+1 -1
View File
@@ -4,7 +4,7 @@
| 角色 | 远程地址 | 建议职责 |
|---|---|---|
| 开发主仓库 | 尚未提供;本地 D:/Work/farm | 业务、接入、测试、文档、构建的唯一开发源 |
| 开发主仓库 | https://github.com/Shu-Ying/main_plugin_farm.git;本地 D:/Work/farm | 业务、接入、测试、文档、构建的唯一开发源 |
| 真寻发布仓库 | https://github.com/Shu-Ying/zhenxun_plugin_farm.git | 真寻完整插件 |
| AstrBot 发布仓库 | https://github.com/Shu-Ying/astrbot_plugin_farm.git | AstrBot 完整插件 |
| NoneBot 发布仓库 | https://github.com/Shu-Ying/nonebot_plugin_farm.git | NoneBot 包及 PyPI 构建资料 |
+1 -1
View File
@@ -17,7 +17,7 @@
| 兼容基线 | 保留旧指令清单;Python/宿主版本经矩阵实测确定 | 旧 README 的 3.10+ 不等于三框架共同最低版本 |
| 发布顺序 | 真寻先稳定,之后普通 NoneBot、AstrBot | 利用现有宿主验证闭环,控制变更范围 |
| 发布仓库 | 使用给出的三个现有仓库,接管前比较现有代码 | 三仓库不为空,不能直接覆盖 |
| 主仓库远程 | 用户后续提供独立 farm 地址 | 本轮只建本地 Git,不误用发布仓库 |
| 主仓库远程 | 已明确 Shu-Ying/main_plugin_farm | 本轮只建本地 Git,不误用发布仓库 |
| 发布授权 | 首次候选 PR 审查,稳定后再议自动发布 | 本轮未授权远程覆盖、推送或发布 |
| 跨平台 OS | 建议 Windows + Linux;macOS 有需求再验收 | 路径大小写、字体、浏览器和时区需分别测试 |
| 素材许可证 | 核对图片、字体、HTML 和借用工具来源 | 代码 GPLv3 不自动证明所有素材可分发 |
+3 -1
View File
@@ -1,4 +1,6 @@
# 本轮验证与交付边界
# 初始化阶段验证与交付边界
此页保留初始化阶段的历史记录;随后完成的基础核心与正式验证见 [09-foundation.md](09-foundation.md)。
日期:2026-10-15。执行 Python:3.12.14;未安装或启动三种宿主。
新工具还以 Python 3.10 语法规则解析旧代码;这不代表三框架共同支持
+104
View File
@@ -0,0 +1,104 @@
# 第一批基础核心实现
日期:2026-10-15。对应 Comet change:farm-core-foundation。
已确认规格位于 comet/changes/farm-core-foundation。
本文件记录实现与开发期测试,不替代 Runtime 的独立验收报告。
## 模块与职责
| 模块 | 责任 |
|---|---|
| domain.py | 不可变身份/作物/账户/库存/地块/结果,整数校验及纯规则 |
| catalogue.py、data/plants.json | 本地配置加载与校验,202 条原始作物配置 |
| ports.py | 应用层所需事务仓储接口 |
| application.py | 注册、购买、播种、收获、铲除、锁定、出售 |
| repository.py | 单个事务连接上的 SQL,不自行提交 |
| storage.py | schema、连接、事务、幂等、流水、线程执行和关闭等待 |
| presentation.py | 结构化结果转普通文本,不修改数据库 |
| __main__.py | 显式本地演示及日志文件 |
| scripts/export_catalogue.py | 只读静态作物库的可复现导出 |
| scripts/verify_foundation.py | 正式离线检查入口 |
按职责先采用小模块;随着用例增加再拆分目录,
不为了贴合远期目录树生成大量空包。
核心只用标准库,不导入三框架,包内部相对导入。
wheel 随包携带 JSON,不包含 legacy、图片、玩家数据库或其他框架入口。
## 已迁移与修复
- 沿用500初始币、3地块、等级门槛及源作物价格/产量/经验/成熟时间。
- 旧作物库202条记录完整导出且保留源 SHA-256。
- 多季再生长间隔明确保留去重 phase[1:] 求和,未重平衡数值。
- F01/F02:余额和经验只增加本次增量。
- F03:每块地单独加成、向下取整,再求和。
- F04/F06:数据库错误传播;扣款、发货、流水与结果在一个事务中。
- F05:不缓存不存在玩家,注册提交后即可读取。
- F08/F11:锁定统一约束两种出售入口;文本直接渲染结构化结果。
- F07签到与F09活动模块未迁移,不能算已修复。
- 保留旧基线只读,迁移工具不读取真实玩家库。
## API 约定
所有操作为异步方法;服务接受显式 Store、Catalogue 和可选秒级时钟。
| 方法 | 说明 |
|---|---|
| register(identity, name, operation_id) | 首次注册;重复注册不再赠送 |
| snapshot(identity) | 同一读事务的账户、库存、地块快照 |
| buy(identity, name, count, operation_id) | 按币种和等级购买 |
| sow(identity, name, count, operation_id) | count=None 尽可能播种;显式数量不足则失败 |
| harvest(identity, operation_id) | 收获全部已成熟地块,一笔事务结算 |
| eradicate(identity, operation_id) | 只清理枯萎实例 |
| lock(identity, name, locked, operation_id) | 锁定或解锁产物 |
| sell(identity, name, count, operation_id) | name=None 且 count=None 批量出售;锁定物品跳过 |
指定出售锁定物品返回 plant_locked,全部出售跳过锁定物品;
没有可出售物品返回 nothing_to_sell。指定数量不自动截断为可用库存。
显式数量接受1至1,000,000整数,拒绝 bool、负数、0、浮点和超大值。
库存/资产/时间不超 SQLite 有符号64位整数上界。
FarmError.code 表示业务失败;StorageError 表示数据库故障;
SchemaError 表示外来或不兼容库。接入层不能把后两者当作未注册。
同一个身份和 operation_id 只能对应同一动作与参数;
相同请求返回原已提交 Receipt,冲突请求返回 operation_conflict。
已提交的余额是该操作时的结果,重放收据不是账户的最新查询,
要显示当前状态需另调 snapshot。
## 持久化与取消语义
新库使用独立 application_id、schema_version=1:
accounts、inventory、plots、operations、ledger。
未知表集、外来库或更高版本被拒绝,不把旧 farm.db 自动当新库打开。
每次写用例使用新连接与 BEGIN IMMEDIATE;提交前统一写幂等结果。
数据库条件更新、非负整数约束和唯一键保护资产。
SQLite 工作在线程执行,事件循环不直接执行 SQL。
close 拒绝新请求并等待在途任务,无导入时线程或持久数据库连接。
异步调用取消不保证取消已进入线程的事务:事务可能提交,
但结果与 operation_id 一起保存;使用相同 ID 重试可确定结果。
这避免平台重试产生第二笔扣款;不得仅因发送消息失败而换新 ID。
并发测试在单进程 Windows 中完成,跨进程及 Linux 仍需后续矩阵验证。
播种冻结成熟时间、产量、经验与季数等规则;出售目前按服务加载的
目录价格结算,价格变更策略应在后续版本化经济规则中明确。
不支持核心对外随意充值;外部金币接入需独立对账和补偿设计。
生产数据备份、迁移、归档及账本保留策略仍待实施。
## 开发期证据
- 7项领域测试通过,包括整数边界、身份、源目录及坏数据。
- 22项事务测试通过,包括玩法、回滚、并发、取消与重启。
- 3项包装测试通过,包括无框架导入、无导入副作用和离线安装。
- 首次事务测试有2项因测试代码未关闭连接而在Windows清理失败;
修复测试资源释放后通过,不隐藏该失败。
- 最终结果以 Comet 管理的 verification.md 为准。
- 真实框架、旧玩家库、联机、图片和远程发布没有测试或启用。
## 正式验收结果
Runtime已执行完整离线检查并通过。
独立只读Verifier核对A1至A8后全部判定通过,结果已由Runtime接收;
正式报告为 comet/changes/farm-core-foundation/verification.md。
通用Skill桥接不能机器认证独立执行身份,当前等待用户接受结果,
尚未归档、提交或推送。此状态不等于三框架插件已发布。
+145
View File
@@ -0,0 +1,145 @@
# 共享图片工具与“我的农场”
状态:共享渲染已实现并通过离线检查和独立只读验收;等待用户接受。
真实宿主命令与上传仍未接入。
Python 语法基线3.10;本机实测 Windows/Python3.12.14/Pillow12.3.0。
## 安装与职责
```text
python -m pip install ".[render]"
```
核心 farm_core 仍无第三方运行依赖。可选 farm_render 使用 Pillow;
NoneBot、AstrBot、真寻均可调用,不导入任何宿主对象。
| 文件 | 职责 |
|---|---|
| src/farm_render/canvas.py | 同步透明合成、裁剪、缩放、文字和编码 |
| src/farm_render/assets.py | 包内素材读取、按目标尺寸缓存与字节上限 |
| src/farm_render/models.py | 输入配置、展示模型和编码结果 |
| src/farm_render/layout.py | 一次快照与统一时刻转换为可见状态 |
| src/farm_render/renderer.py | 底图、作物、账户面板、成图缓存 |
| src/farm_render/service.py | 一次查询、后台执行、并发和取消管理 |
字体由部署方提供可合法使用的中文 TrueType/OpenType 文件路径。
示例使用本机已有微软雅黑;不会复制或发布 Windows 字体。Linux
应配置包含中文的字体;测试可通过 FARM_TEST_FONT 指定路径。当前
实现校验字体可加载,不保证任意字体具备所有中文、Emoji 字形。
## 调用
```python
from farm_render import FarmRenderer, RenderOptions, RenderService
renderer = FarmRenderer("/path/to/chinese-font.ttf")
rendering = RenderService(renderer, concurrency=1, max_pending=8)
try:
picture = await rendering.my_farm(
service, who,
options=RenderOptions(theme="spring"),
avatar=avatar_bytes_or_none,
supported=("WEBP", "JPEG", "PNG"),
)
# 接入层按 picture.mime 发送 picture.content。
finally:
await rendering.close()
```
应用生命周期内复用一个 renderer/service,勿在每次命令中重新创建。
上面的 finally 仅演示生命周期结束时的清理;退出插件时还需关闭
业务 store。my_farm 每次调用只请求一次 service.snapshot,不按地块
访问数据库。若已有快照,可直接 await rendering.render(who, snapshot,
now, options),统一 now 使用UTC秒整数。正常未注册/存储故障仍由
业务层抛出,接入层负责转换为用户提示,不伪装成空农场。
同步 FarmRenderer.render 仅供离线或已有后台任务的场景;机器人
事件循环应调用 RenderService。实例绑定字体、静态配置和素材版本,
替换素材或字体后重建实例。RenderService 只供同一事件循环使用。
## 尺寸、格式和质量
- 普通:1024×624、quality75;RenderOptions.high() 为1536×936、85。
- 编码格式独立:AUTO、WEBP、JPEG、PNG;WebP method默认2。
- AUTO仅根据接入层声明的 supported 和本机编码能力选择,默认
supported只有JPEG。确认平台支持后传入WEBP,才会优先使用它。
- 显式 format=WEBP 可强制选择;本机不支持则明确报错。平台不支持
时应在调用前选JPEG,避免上传失败后再次合成和有损转码。
- PNG为无损,不使用quality控制画质;WebP/JPEG的quality不能视为
同等视觉质量标尺。本实现不使用WebP无损或动画。
原素材保持原格式。所有底图和坐标按目标尺寸处理,不先创建3072宽
的合成画布。图像解码仍可能产生原素材大小的临时缓冲,不能把
画布缩小等同于全部内存按同一比例下降。
## 阶段与缓存
布局使用旧30块地坐标。首季由保存成熟时间减首熟时长推导起点;
再生长由下一次成熟时间减再生长时长推导。阶段阈值映射到本季
时长,解决旧代码多季仍引用最初播种时间的问题;仅改变展示,
不修改成熟和收益规则。枯萎优先于成熟。原偏移字段为offsetX/Y/W/H,
新实现使用真实字段,不沿用旧绘图的offic拼写。
素材LRU默认32MiB,成图LRU默认8MiB;零预算禁用对应缓存,超限
条目不入缓存。素材返回副本,缓存底图不被玩家绘制污染。预算按
缓存图像像素/编码数据及成图元数据预留计算,不代表进程RSS上限;
还存在解码临时缓冲、Python对象、线程和字体缓存(最多32项)。
成图键含完整作用域摘要、可见账户、地块阶段、头像摘要和配置。
阶段/成熟边界直接改变展示键,不用固定TTL拖延成熟显示;同阶段
不绘制秒级倒计时,所以可以跨秒复用。账户、头像和主题变化也失效。
头像至多2MiB、400万像素;过大或损坏降级默认图。不下载头像,
头像长缓存、请求超时和平台媒体ID复用属于接入层职责。
RenderService默认一个绘图任务,最多8个活跃/排队的不同请求;
超过容量明确失败,由接入层提示稍后重试。同一展示请求共享任务。
调用方取消只取消自己的等待,后台仍占用名额直至结束;close等待
所有已接受任务排空。合并的是绘制,不合并调用前的快照查询。
## 素材完整性与来源
scripts/export_render_assets.py将673张已有素材原样打包,附202种作物
展示配置和旧布局。--check比对确定性输出,不修改旧基线。
素材包约束为安装资源,不按用户输入路径访问任意文件、不解压到磁盘。
保留GPL及原始归属;历史素材分发权仍需在公开发布前核实。
旧基线按当前阶段算法有455个缺失阶段引用;不是本次导出丢失。
缺失时显示问号占位并记录静态警告,避免整个命令失败;尚未补齐
缺失图片,也不推测相近作物素材替代。不会声称202种作物均有完整图片。
## 测量与验证
```text
python scripts/render_demo.py --font /path/to/chinese-font.ttf
python scripts/export_render_assets.py --check
python scripts/verify_foundation.py
```
本轮测量原始结果见 [render-benchmark.json](render-benchmark.json)。
样例为构造的18块解锁地,包含空地、生长、成熟、枯萎与锁定地。
输出和日志位于runtime/render-demo,不进入Git。
| 尺寸 | 编码 | 字节 | 冷请求毫秒 | 命中缓存毫秒 |
|---|---|---:|---:|---:|
| 1024×624 | WebP75/method2 | 85,820 | 192.195 | 0.559 |
| 1024×624 | JPEG75 | 112,309 | 119.514 | 0.319 |
| 1024×624 | PNG | 1,083,976 | 153.524 | 0.271 |
| 1536×936 | WebP85/method2 | 236,462 | 208.278 | 0.327 |
| 1536×936 | JPEG85 | 293,733 | 136.219 | 0.274 |
| 1536×936 | PNG | 2,168,696 | 208.414 | 0.285 |
这是一台本机的单次观测,不是旧版性能对照,也不是等画质比较。
每组使用新的渲染器测冷缓存,字体/操作系统文件缓存可能已有预热;
未测低配服务器、峰值RSS、Linux运行或任何真实平台上传。
普通样例WebP比JPEG小约24%,但编码约60ms,JPEG约4.5ms;
优先级取决于部署CPU与带宽,应保留独立格式配置。
日志记录query_ms、queue_ms、compose_ms、encode_ms、尺寸、编码、
字节与成图命中,不记录真实姓名、作用域、头像或完整快照。
上传阶段由适配器单独记录,不能将发送接口返回当作客户端已显示。
正式检查结果:45项测试全部通过,827文件基线与两类可复现导出
检查通过。独立只读Verifier核对完整核心/渲染规格和源码后,A1-A13
全部通过。验收报告见 [Comet报告](
comet/changes/farm-core-foundation/verification.md)。通用Skill桥接不提供
机器独立身份认证,流程仍要求用户明确接受后才归档。
+5 -2
View File
@@ -1,10 +1,13 @@
# 文档索引
记录日期:2026-10-15。状态:已形成设计草案,待关键产品决策确认;
业务重构、多框架接入、发布流水线和真实数据迁移尚未实施。
第一批基础核心已实施;多框架接入、发布和真实数据迁移尚未实施。
| 文档 | 用途 |
|---|---|
| [09-foundation.md](09-foundation.md) | 已实现的第一批核心、API、测试与限制 |
| [10-rendering.md](10-rendering.md) | 共享图片工具、农场绘制、缓存、编码与接入 |
| [render-benchmark.json](render-benchmark.json) | 本机合成数据的冷暖缓存与编码测量 |
| [01-roadmap.md](01-roadmap.md) | 长期目标、实施顺序、里程碑与验收 |
| [02-architecture.md](02-architecture.md) | 分层、目录、依赖、接入与接口设计 |
| [03-business-rules.md](03-business-rules.md) | 身份、货币、库存、作物、事务与幂等 |
@@ -26,6 +29,6 @@
- “已确认”必须有源码、命令或文档来源;“建议”不能当作已接受需求。
- 文档中的目标结构是设计,不表示对应代码已实现。
- 发布仓库是分发目标,不是 Git 子模块;各框架使用相互独立的插件包。
- 主仓库远程地址尚未提供;不将任一插件发布仓库误设为主仓库 origin。
- 主仓库远程为 Shu-Ying/main_plugin_farm;本轮未执行远程操作。
- 用户已撤回拉取要求,且要求删除本地克隆;三个本地检出已删除,不再访问远程。
- 本轮仅修正迁移副本中的硬编码凭据;业务缺陷记录在审查报告,没有隐式修复。
@@ -0,0 +1,126 @@
# Outcome
在 D:/Work/farm 当前目录完成旧版可用规则的第一批迁移,建立不依赖
真寻、NoneBot 或 AstrBot 的可运行基础核心;使用 SQLite 验证完整交易
闭环,为后续框架接入提供稳定调用入口。Comet 初始化已完成,
AGENTS.md 缺失开始标记已修复。用户已明确选择当前目录继续。
# Scope
- 迁移基线只读。迁出旧作物目录 202 条唯一名称配置,保留必要数值、
购买币种、等级、成熟时间、产量、经验和多季次数;新核心运行不依赖
legacy 目录,不复制旧框架依赖。共享渲染素材按下述新增范围迁出。
- 建立明确的玩家作用域标识,由调用方提供部署、领域、消息平台与
用户 ID,不自行选择群共享或跨框架账号绑定政策。
- SQLite 新 schema、显式事务、操作流水和幂等操作记录;只处理新建
测试数据库,不导入真实玩家库。余额与库存以数据库为权威。
- 注册初始 500 农场币、0 点券、0 经验、3 块普通空地,沿用旧值。
- 提供账户/库存/地块查询、购买种子、播种、收获、铲除枯萎作物、
锁定/解锁作物、指定出售/全部出售及基础文本结果。
- 每级累计经验门槛沿用 200*k*(k+1)/2,以整数计算避免浮点边界。
普通币与点券库存独立;本轮不实现两者兑换或外部金币充值。
- 多季作物首熟时间沿用 time*3600;再生长间隔沿用旧实现去重后
phase[1:] 之和。该规则明确保留兼容,数值平衡后续另议。
- 纯规则支持每块地独立计算产量/经验加成再求和;首轮创建普通地,
不提供土地升级、星级自动升级或偷菜加成。
- 核心应用 API 为异步可调用,SQLite 阻塞操作不在事件循环线程执行;
不引入可变玩家余额缓存或导入时后台线程。日志记录事务操作标识、
操作类别与提交结果,不记录密钥或真实用户消息。
- 使用本地可重复测试覆盖规则、原子性、失败传播、重试幂等和并发;
更新 README、实现说明与现有路线状态,保留待确认决策。
- 根据用户对已讨论方案的明确执行指令,追加 farm_render:Pillow 同步
图片工具、离线素材包、有界缓存、按目标尺寸绘制、后台受控执行、
普通/高清预览、WebP/JPEG/PNG 编码和分阶段日志。
- 渲染接收一次核心快照和统一时间,不逐地块查库、不联网;头像字节
由接入方提供,失败使用默认头像。保留旧农场背景、地块和作物素材。
- 按可见状态缓存成图并在生长阶段边界失效;并发相同请求合并。
提供离线生成、性能记录、安装包独立运行和中文字体配置说明。
## Directory structure
### Created
- src/farm_render/:画布、素材、展示模型、布局、渲染器及异步入口。
- scripts/export_render_assets.py、scripts/render_demo.py。
- tests/test_render*.py、docs/10-rendering.md。
### Modified
- pyproject.toml:render 可选依赖及渲染素材打包。
- scripts/verify_foundation.py:增加渲染资源可复现检查。
- README.md、docs/README.md、docs/task_plan.md、docs/progress.md。
- 当前 brief 与新增 farm-render 目标规格;原业务规格保留。
### Deleted
无。
### Not created
- 不创建真实平台插件、远端工作流、真实玩家库或字体再分发包。
- 不修改 legacy 基线,不创建多个框架的业务副本。
# Non-goals
本轮不实现真实宿主插件、消息命令、签到、偷菜、活动、
外部金币兑换、点券兑换、土地升级、星级进阶、账号绑定或在线联机。
不读取或迁移真实玩家数据,不重置旧资产,不改旧基线业务。
不 clone/fetch/pull/push 任何远程,不创建 PR、Release 或发布工作流。
不将设计占位目录报告为已支持三框架。
# Acceptance examples
- A1: 旧基线 827 文件校验继续通过;新核心不导入三框架、无导入副作用,
可从安装包或源码独立运行,核心不通过路径引用 legacy。
- A2: 可复现导出 202 条作物配置,名称和必要数值对应源静态数据库;
本地加载支持格式校验,坏数据明确失败,不访问网络。
- A3: 注册立即可查询 500 农场币、0 点券、0 经验、3 块空地;
重复注册不重复赠送;不同显式作用域不串号。
- A4: 购买到播种全过程扣款、入库、耗种和地块改变正确;0、负数、
布尔值、超大数量、余额/库存不足、等级不足和不存在对象明确失败,
不留下部分写入。
- A5: 未成熟不能收获;成熟后只增加本次产量/经验;历史经验 100、
本次获得20时为120;多地加成逐块计算且交换顺序不改变总和;
多季次数及枯萎/铲除遵守保存的规则与可注入时钟。
- A6: 出售收益只增加一次,例如余额100、收益20后为120;
锁定同时约束指定与全部出售;返回结构化真实余额及安全文本,
不发生旧版模板参数缺失。
- A7: 模拟交易中途异常时余额、库存、地块及流水整体回滚;
同一操作标识重试返回原结果、参数冲突拒绝;并发写入不超卖、
不重复领取,不吞数据库故障伪装成功;重启后数据可读。
- A8: 提供可执行的离线测试、运行入口和使用说明,保留真实宿主、
真实库迁移及远程发布未验证的说明;文档记录已实现范围和剩余项。
- A9: 独立图片工具支持透明合成、缩放、裁剪、文本测量/省略和三格式编码;
渲染不导入框架、不联网,核心保持无 Pillow 依赖;安装包含所需素材。
- A10: 从一次快照绘制空地、生长、成熟、再生长、枯萎及锁定地块,
使用统一时间、旧布局和正确偏移;输出普通/高清可解码图片。
- A11: 小画布从开始按目标尺寸绘制;素材和结果缓存有内存上限,
共享素材不被污染;阶段/成熟边界、账户、头像及作用域变化不复用旧图。
- A12: 合成和编码在后台执行且限制并发,相同请求合并;取消和异常
不提前释放运行名额、不泄漏后台任务;记录耗时、尺寸和缓存状态。
- A13: 离线生成农场样例、对比尺寸/编码与冷暖缓存,保存测量报告和
接入文档;验证旧基线及原有核心测试,明确尚未接入真实消息平台。
# Constraints and invariants
源码使用 Python,4 空格、80 字符行长,明确说明数据模型字段。
保留 GPLv3 许可与源归属。共享核心内部相对导入。
运行数据和测试临时数据库不入 Git。新实现只使用必要依赖,
优先标准库 SQLite、异步线程执行和 unittest,不为框架引入依赖。
新数据库 schema 与旧库区分,未知或更高 schema 明确拒绝。
同一基础交易的存储和应用紧密耦合,使用单个 change,不拆分子任务。
# Decisions
- 用户已授权初始化 Comet 并执行基础开发;工作区为当前目录 main。
- 主仓库地址已明确:https://github.com/Shu-Ying/main_plugin_farm.git。
- 现有文档是设计参考,旧代码是实现参考;本轮仅覆盖上述第一批核心,
不把整份长期计划视为一次必须全部实施的产品需求。
- 未决的农场共享、联机、存量资产、兑换与素材发布不由本轮擅自决定。
- 用户随后明确要求“根据上述方案和之前优化的绘制我的农场,请执行”,
授权图片层及绘图优化。沿用已选当前目录;该目录已有未提交核心,
Runtime 不允许第二个 current change,因此作为基础开发范围补充。
- 用户讨论后明确“确认并进入开发”,包含 WebP 优先候选及 JPEG/PNG
兼容输出;尺寸、质量、编码力度独立配置,平台能力由适配器声明。
- 素材保留原 GPL 归属,不捆绑未确认再分发许可的字体;部署显式配置
中文字体路径。真实宿主头像缓存和上传由后续适配器实现。
@@ -0,0 +1,377 @@
schema: comet.native.v4
name: farm-core-foundation
language: en
phase: verify
status: await-user
state_version: 14
brief: brief.md
document_constraints_version: 3
shape_confirmation_hash: 49a2a3fb4be0159531d63bcdd52c5895f2586e309c33be91fe4e38c7a159461d
spec_changes:
- capability: farm-core
operation: create
source: specs/farm-core/spec.md
- capability: farm-render
operation: create
source: specs/farm-render/spec.md
workspace:
isolation: current
change_branch: main
target_branch: main
finish: null
loop:
stage: await-user
goal_cycle: 3
iteration: 1
attempt: 1
retry_epoch: 0
failed_iteration_count: 0
no_progress_count: 0
execution_failure_count: 0
previous_unresolved_ids: []
next_action: confirm-skill-coordinated-pass
acceptance:
- id: A1
source: brief.md
text: "A1: 旧基线 827 文件校验继续通过;新核心不导入三框架、无导入副作用, 可从安装包或源码独立运行,核心不通过路径引用 legacy。"
result: passed
reason:
text: 827文件基线正式检查通过;检查包导入无线程/文件副作用及wheel独立安装,核心无框架和legacy运行依赖。
truncated: false
- id: A2
source: brief.md
text: "A2: 可复现导出 202 条作物配置,名称和必要数值对应源静态数据库; 本地加载支持格式校验,坏数据明确失败,不访问网络。"
result: passed
reason:
text: 只读源库导出按id排序并带源hash;202项导出检查通过,加载器校验版本、整数、阶段和重复定义。
truncated: false
- id: A3
source: brief.md
text: "A3: 注册立即可查询 500 农场币、0 点券、0 经验、3 块空地; 重复注册不重复赠送;不同显式作用域不串号。"
result: passed
reason:
text: 账户注册与初始500资产、三空地在事务内完成;重复注册及身份作用域隔离测试正式通过。
truncated: false
- id: A4
source: brief.md
text: "A4: 购买到播种全过程扣款、入库、耗种和地块改变正确;0、负数、 布尔值、超大数量、余额/库存不足、等级不足和不存在对象明确失败,
不留下部分写入。"
result: passed
reason:
text: 购买和播种在完整事务内扣款、入库、耗种、存图;数量、等级、余额和空地边界测试正式通过。
truncated: false
- id: A5
source: brief.md
text: "A5: 未成熟不能收获;成熟后只增加本次产量/经验;历史经验 100、 本次获得20时为120;多地加成逐块计算且交换顺序不改变总和;
多季次数及枯萎/铲除遵守保存的规则与可注入时钟。"
result: passed
reason:
text: 成熟边界、经验增量、多季再生长及枯萎清除源实现与规格一致,逐地块加成及顺序测试通过。
truncated: false
- id: A6
source: brief.md
text: "A6: 出售收益只增加一次,例如余额100、收益20后为120; 锁定同时约束指定与全部出售;返回结构化真实余额及安全文本,
不发生旧版模板参数缺失。"
result: passed
reason:
text: 锁定状态对指定及全部出售生效,出售只增本次收入,Receipt和文本使用真实余额;正式测试通过。
truncated: false
- id: A7
source: brief.md
text: "A7: 模拟交易中途异常时余额、库存、地块及流水整体回滚; 同一操作标识重试返回原结果、参数冲突拒绝;并发写入不超卖、
不重复领取,不吞数据库故障伪装成功;重启后数据可读。"
result: passed
reason:
text: BEGIN IMMEDIATE、操作指纹与结果同事务保存;异常回滚、并发超卖/重复收获、取消重放、重启与schema测试通过。
truncated: false
- id: A8
source: brief.md
text: "A8: 提供可执行的离线测试、运行入口和使用说明,保留真实宿主、 真实库迁移及远程发布未验证的说明;文档记录已实现范围和剩余项。"
result: passed
reason:
text: README、核心说明、离线入口与测试可用,准确说明尚无真实宿主、真实库迁移和远程发布验证。
truncated: false
- id: A9
source: brief.md
text: "A9: 独立图片工具支持透明合成、缩放、裁剪、文本测量/省略和三格式编码; 渲染不导入框架、不联网,核心保持无 Pillow
依赖;安装包含所需素材。"
result: passed
reason:
text: Pillow可选渲染模块支持透明合成、复制、缩放、裁剪、文字测量省略及三格式;核心无Pillow导入,wheel携带673素材并独立渲染通过。
truncated: false
- id: A10
source: brief.md
text: "A10: 从一次快照绘制空地、生长、成熟、再生长、枯萎及锁定地块, 使用统一时间、旧布局和正确偏移;输出普通/高清可解码图片。"
result: passed
reason:
text: 纯场景转换消费一次快照和统一now,首季/再季锚点与枯萎优先正确;旧30块布局及真实offset字段已迁出,普通高清解码与阶段测试通过,样例已视觉检查。
truncated: false
- id: A11
source: brief.md
text: "A11: 小画布从开始按目标尺寸绘制;素材和结果缓存有内存上限, 共享素材不被污染;阶段/成熟边界、账户、头像及作用域变化不复用旧图。"
result: passed
reason:
text: 目标尺寸直接合成;素材/底图与成图LRU有字节预算且返回副本;键含作用域、账户、阶段、头像、主题及编码配置,边界变化不复用旧图。
truncated: false
- id: A12
source: brief.md
text: "A12: 合成和编码在后台执行且限制并发,相同请求合并;取消和异常 不提前释放运行名额、不泄漏后台任务;记录耗时、尺寸和缓存状态。"
result: passed
reason:
text: 整体合成编码由to_thread执行,semaphore限制并发、pending限制容量,shield维持取消后的任务容量并在关闭排空;合并、异常重试、事件循环和并发测试通过,日志不含用户标识。
truncated: false
- id: A13
source: brief.md
text: "A13: 离线生成农场样例、对比尺寸/编码与冷暖缓存,保存测量报告和 接入文档;验证旧基线及原有核心测试,明确尚未接入真实消息平台。"
result: passed
reason:
text: 离线脚本生成两尺寸三格式冷暖测量及日志,报告与已查看样例一致;正式检查45项和基线/两类导出通过,文档明确本机单次、未测上传/低配/Linux及真实平台。
truncated: false
builder_handoff:
candidate_id: e88969d9-32c0-4321-a5a3-658023a60414
identity_provider: skill-coordinated
builder_execution_ref: skill-coordinated:builder:455faebd-84e1-49d0-8041-c6f44318a0ea
iteration: 1
summary:
text: 保留原框架无关业务核心,追加共享Pillow图片工具与农场快照渲染。673原素材独立打包,目标尺寸合成、三种编码、阶段变化失效、有界缓存、受控后台任务、取消排空和日志。13项绘图定向测试及3项打包检查通过,样图已目视检查。尚未执行本轮完整核心回归,由Runtime正式执行;真实框架与上传未接入,旧素材455个阶段引用缺图。
truncated: false
addressed_acceptance_ids:
- A1
- A2
- A3
- A4
- A5
- A6
- A7
- A8
- A9
- A10
- A11
- A12
- A13
acceptance_review:
- id: A1
status: implemented-with-evidence
evidence:
- scripts/check_baseline.py
- tests/test_packaging.py
- src/farm_core/__init__.py
note: 已有实现保留并检查关联源码,完整回归列入本轮Runtime计划。
- id: A2
status: implemented-with-evidence
evidence:
- scripts/export_catalogue.py
- tests/test_domain.py
note: 已有实现保留并检查关联源码,完整回归列入本轮Runtime计划。
- id: A3
status: implemented-with-evidence
evidence:
- tests/test_transactions.py
- src/farm_core/application.py
note: 已有实现保留并检查关联源码,完整回归列入本轮Runtime计划。
- id: A4
status: implemented-with-evidence
evidence:
- tests/test_transactions.py
- src/farm_core/application.py
note: 已有实现保留并检查关联源码,完整回归列入本轮Runtime计划。
- id: A5
status: implemented-with-evidence
evidence:
- tests/test_domain.py
- tests/test_transactions.py
note: 已有实现保留并检查关联源码,完整回归列入本轮Runtime计划。
- id: A6
status: implemented-with-evidence
evidence:
- tests/test_transactions.py
- src/farm_core/presentation.py
note: 已有实现保留并检查关联源码,完整回归列入本轮Runtime计划。
- id: A7
status: implemented-with-evidence
evidence:
- tests/test_transactions.py
- src/farm_core/storage.py
note: 已有实现保留并检查关联源码,完整回归列入本轮Runtime计划。
- id: A8
status: implemented-with-evidence
evidence:
- README.md
- docs/09-foundation.md
- scripts/verify_foundation.py
note: 已有实现保留并检查关联源码,完整回归列入本轮Runtime计划。
- id: A9
status: implemented-with-evidence
evidence:
- src/farm_render/canvas.py
- tests/test_render.py
- tests/test_packaging.py
note: 新实现对应已确认规格,定向测试和离线样例可复核。
- id: A10
status: implemented-with-evidence
evidence:
- src/farm_render/layout.py
- src/farm_render/renderer.py
- tests/test_render.py
note: 新实现对应已确认规格,定向测试和离线样例可复核。
- id: A11
status: implemented-with-evidence
evidence:
- src/farm_render/assets.py
- src/farm_render/renderer.py
- tests/test_render.py
note: 新实现对应已确认规格,定向测试和离线样例可复核。
- id: A12
status: implemented-with-evidence
evidence:
- src/farm_render/service.py
- tests/test_render.py
note: 新实现对应已确认规格,定向测试和离线样例可复核。
- id: A13
status: implemented-with-evidence
evidence:
- scripts/render_demo.py
- docs/10-rendering.md
- docs/render-benchmark.json
note: 新实现对应已确认规格,定向测试和离线样例可复核。
checks:
- name:
text: render-behavior
truncated: false
result: passed
note:
text: 13 tests passed
truncated: false
- name:
text: wheel-packaging
truncated: false
result: passed
note:
text: 3 tests passed; installed renderer generated PNG
truncated: false
- name:
text: visual-demo
truncated: false
result: passed
note:
text: 1024 WebP sample reviewed; three formats measured
truncated: false
- name:
text: full-regression
truncated: false
result: not-run
note:
text: 本轮完整检查交给Runtime执行
truncated: false
checks_truncated: false
known_limits:
- text: 真实框架、上传、Linux和低配主机尚未运行验证。
truncated: false
- text: 中文字体需部署方合法提供;不捆绑字体。
truncated: false
- text: 旧基线455个阶段引用缺图,已占位降级。
truncated: false
- text: 测量为本机单次合成数据,不是旧版或等画质基准。
truncated: false
- text: 公开发布前仍需核实历史素材分发权。
truncated: false
known_limits_truncated: false
review: null
submitted_at: 2026-10-15T08:36:49.457Z
blockers:
- owner: user
reason:
text: The generic Skill bridge cannot prove an independent Verifier execution;
user confirmation is required before Archive.
truncated: false
acceptance_ids: []
resolution_action: await-user
verification:
candidate_id: e88969d9-32c0-4321-a5a3-658023a60414
identity_provider: skill-coordinated
verifier_execution_ref: skill-coordinated:verifier:853b70de-beda-44dd-b303-cf2b3b300676
iteration: 1
attempt: 1
assurance: skill-coordinated
verdict: pass
checks:
- id: offline-foundation-render
name:
text: Offline core and renderer
truncated: false
argv_display:
- text: scripts/verify_foundation.py
truncated: false
argv_truncated: false
cwd_ref: .
status: passed
exit_code: 0
duration_ms: 10608
summary:
text: 独立只读核对全部13项、完整规格、核心与渲染源码、测试/打包/导出脚本、正式Runtime日志和图片样例;复用匹配候选的45项正式检查,全部验收通过。图索引新增渲染未覆盖且旧文件metadata_changed,已直接源文件补齐,无需重复完整套件。
truncated: false
risks:
- text: 真实消息平台、上传链路、Linux及低配服务器尚未验证;性能报告仅本机单次构造样例,不等画质对照。
truncated: false
- text: 旧素材存在455个阶段引用缺失,已按规格显示问号并记录警告;不能宣称202种作物图片完整。
truncated: false
- text: 部署需自备有权使用且包含所需中文字形的字体;当前只验证字体可加载,任意Unicode/Emoji覆盖不保证。
truncated: false
- text: 历史素材公开分发权仍需在发布前核实。
truncated: false
- text: 缓存预算为像素/编码内容核算,含预留,不代表整个进程峰值RSS硬上限。
truncated: false
risks_truncated: false
completed_at: 2026-10-15T08:40:00.608Z
history:
- goal_cycle: 1
iteration: 1
attempt: 1
outcome: pass
unresolved_ids: []
summary:
text: 独立只读验收完成:完整brief/Spec、实现、测试、配置和文档均已核对,最后参考Builder交接;绑定候选的Runtime
foundation-offline以退出码0完成,827基线文件、可复现目录导出与32项测试通过。A1-A8全部通过;未追加或自行重跑完整检查,未修改项目源文件。
truncated: false
completed_at: 2026-10-15T07:00:29.324Z
- goal_cycle: 1
iteration: 1
attempt: 1
outcome: recovery
unresolved_ids: []
summary:
text: 用户明确要求在已确认的图片工具及绘图优化方案上执行开发;将共享农场渲染作为当前基础开发的范围补充,保留原业务验收项并追加图片验收。
truncated: false
completed_at: 2026-10-15T07:55:29.688Z
- goal_cycle: 2
iteration: 0
attempt: 0
outcome: recovery
unresolved_ids: []
summary:
text: Native confirmed acceptance criteria changed
truncated: false
completed_at: 2026-10-15T08:23:15.134Z
- goal_cycle: 3
iteration: 1
attempt: 1
outcome: pass
unresolved_ids: []
summary:
text: 独立只读核对全部13项、完整规格、核心与渲染源码、测试/打包/导出脚本、正式Runtime日志和图片样例;复用匹配候选的45项正式检查,全部验收通过。图索引新增渲染未覆盖且旧文件metadata_changed,已直接源文件补齐,无需重复完整套件。
truncated: false
completed_at: 2026-10-15T08:40:00.608Z
history_overflow:
dropped_entries: 0
first_dropped_at: null
last_dropped_at: null
outcome_counts:
pass: 0
fail: 0
blocked: 0
execution-error: 0
recovery: 0
verification_result: pass
verification_report: verification.md
archived: false
created_at: 2026-10-15T06:34:33.214Z
@@ -0,0 +1,102 @@
# Farm Core Foundation
本规格定义第一批框架无关基础核心的完整行为,覆盖注册、配置、
资产库存、种植交易、文本展示和本地持久化。
真实机器人入口、联机和旧玩家数据迁移不在本 capability 范围内。
## Runtime and migration boundary
共享代码位于 src/farm_core,包内部相对导入;加载模块不执行网络、
创建数据库或启动线程。可注入显式配置、时钟与存储生命周期。
静态作物目录从保留的旧作物库离线导出,发布或安装后不依赖 legacy。
完整静态目录与玩家数据库分开保存,旧基线保持只读。
SQLite 工作在线程中执行且每个用例拥有完整事务,异步调用可等待结果。
Scenario: Independent core and preserved baseline
Acceptance: A1
基线离线校验通过,包独立导入、安装、调用不需要三种宿主或 legacy。
## Catalogue
源静态目录 202 条作物名称唯一;映射 id/name/level/buy/isVip/vipBuy/
experience/harvest/price/time/crop/phase 等必要数据,规范整数数值,
异常的字段或版本错误明确拒绝。购买使用对应币种,按等级校验。
不下载远程目录,不将素材路径或绘图偏移当作业务依赖。
多季再生长间隔保持旧去重 phase[1:] 求和规则,不在首轮重新平衡。
Scenario: Reproducible catalogue migration
Acceptance: A2
离线导出再生成内容一致;202 条与源值匹配;损坏输入被拒绝。
## Registration and account model
调用方提供 deployment/realm/platform/user 字符串身份,核心不推断账号
等价性或跨群共享。首次注册赠送500 point、0 vipPoint、0 exp、3空地。
唯一身份只能领取一次初始资产。查询总是基于已提交数据库状态。
经验等级门槛为 200*k*(k+1)//2,使用整数边界计算。
货币、数量和时间范围必须适合 SQLite 整数及应用限制。
bool 不作为合法整数参数,不允许负数归零后当作交易成功。
Scenario: Immediate registration and scope isolation
Acceptance: A3
首次注册立即查询得到默认值;重复注册无增发;不同作用域相互独立。
## Purchase and sowing
购买种子时在同一用例事务内检查注册、作物、数量、等级和余额,
扣款并增加库存,失败整体回滚。播种检查空地和库存,在同一事务内
消耗实际种子、创建作物实例,保存结算所需目录数据避免后续版本改变
已播种作物。显式数量超过可用资源返回明确结果,全部操作使用明确
参数而不是允许任意负数。返回真实操作数、余额及剩余库存。
Scenario: Purchase and sow atomically with validated inputs
Acceptance: A4
非法数量、余额不足、等级不足和库存不足不产生任何部分状态。
## Harvest and crop lifecycle
首熟为播种时间加 time*3600;使用可注入时钟,当前时间等于成熟时可收。
每块地独立计算 floor(base*(100+bonus)/100) 后相加,不对累计值加成。
经验只增加本次增量。产物入库、经验变动、收获次数和下一季状态
在同一事务提交。最后一季后枯萎;铲除只清理枯萎地块。
再次重试不重复收获。展示结果不再次修改数据。
Scenario: Correct experience and multi-crop settlement
Acceptance: A5
历史100加本次20等于120;地块排序不影响总收益;成熟边界及多季状态正确。
## Inventory locking and selling
指定出售和全部出售均保护锁定物品。出售收入在事务内增加一次,
库存减少为实际成交数量。没有可出售物品时有明确结果。
查询及返回结构化账户/库存/地块数据,基础文本仅渲染结果,避免模板
占位不匹配;文本不依赖任何消息框架。
Scenario: Consistent locking and exact sale proceeds
Acceptance: A6
100余额出售收入20变为120;锁定物品无法通过任一出售入口消耗。
## Persistence, idempotency and failures
每个写用例有稳定 operation_id、动作和规范化参数指纹。
同作用域同标识相同请求返回已提交结果,不再次扣款或发奖;
不同参数冲突拒绝。状态改变、资产流水和结果持久化在同一事务。
数据库异常应回滚并传播为明确错误,不能转成不存在/无农场。
支持并发调用,通过事务、条件更新及唯一约束避免超卖和重复结算。
关闭后重开可读取已提交数据;未知/高版本 schema 拒绝。
调用取消不能无记录重复交易,已提交结果可通过相同操作标识恢复。
Scenario: Rollback, replay and concurrent safety
Acceptance: A7
故障注入无部分数据;重试幂等;冲突被拒绝;并发不透支;重启后状态一致。
## Verification and user documentation
离线测试采用构造数据,覆盖上述全部验收示例以及源目录一致性。
提供本地运行/演示入口,不宣称可放入三种框架插件目录加载。
记录本轮新实现与旧缺陷对应关系,不把历史设计文档误标为全面完成。
不安装或操作真实机器人,不访问远程仓库,不导入真实玩家数据库。
Scenario: Repeatable local verification and accurate status
Acceptance: A8
安装及离线测试命令可复现,使用说明清楚标明未实现的接入与发布部分。
@@ -0,0 +1,70 @@
# Farm Render
## Independent image layer
farm_render 使用 Pillow 实现同步画布操作;farm_core 不依赖 Pillow。
工具支持透明合成、复制、缩放、裁剪、文本测量与超长省略,以及
WebP/JPEG/PNG 编码。JPEG 合并透明背景,输出携带 MIME、尺寸与字节。
WebP 默认采用有损质量75、method=2;高清质量85。格式与尺寸独立,
auto 根据调用方声明的平台能力选择 WebP 或 JPEG,本机无 WebP 编码
支持时 auto 回退 JPEG,显式 WebP 则清楚报错。PNG 保留无损选项。
素材独立打入安装包,不在运行时引用 legacy 或宿主;字体显式配置,
不复制 Windows 商业字体。无字体时明确报错,不输出缺字占位图。
Scenario: Framework-independent packaged renderer
Acceptance: A9
从 wheel 安装到临时目录,无 legacy 和框架仍能加载素材并生成图片。
## Snapshot and layout
入口从业务服务取得一次一致快照;绘图纯消费快照与统一 now,不查库。
复用旧30块地布局、季节静态背景、草地/普通地和作物阶段素材。
首季阶段锚点由保存的 mature_at-growth_seconds 推导,再季使用
mature_at-regrowth_seconds,按本季时长映射展示阶段,成熟优先、
枯萎优先于成熟。阶段仅影响外观,不修改交易规则和数据库。
读取实际 offsetX/Y/W/H 字段;缺失作物资源使用显式占位并记录警告。
用户信息显示真实快照余额、点券和经验,头像仅接收字节,无头像时
绘制默认图;拒绝超大或无效头像并降级。主题由调用方明确提供。
Scenario: Farm states and target profiles
Acceptance: A10
空地、生长、成熟、再生长、枯萎和未解锁地可生成图片,普通与高清
使用同一布局;统一时间下同一阶段稳定,边界切换正确。
## Resource and result cache
普通图默认宽1024,高清宽1536;画布与坐标从开始按比例处理。
解码后素材、底图和成图使用有界 LRU,超限条目不入缓存。
素材缓存键含路径及目标尺寸,缓存图片只读或复制后修改。
成图键含完整身份、可见地块阶段/账户/头像摘要、主题、质量与格式;
同阶段可复用,下一阶段或成熟时间到达必须改变键,静态素材版本
由渲染器实例绑定;资源更新后重新创建实例。默认缓存不落盘。
Scenario: Bounded and correct caching
Acceptance: A11
缓存总字节不超上限;跨账号不串图,阶段、余额、头像变化不命中旧图;
普通图绘制画布即为1024宽,无3072宽中间合成画布。
## Controlled asynchronous entry
提供异步入口,将整张图的合成与编码交给后台线程;默认最多一个
任务运行,等待队列有上限。相同身份/状态请求共享任务。调用取消
不取消正在运行的共享绘制,也不提前释放容量。关闭等待任务排空。
日志只记录查询/排队/合成/编码耗时、字节、尺寸和缓存结果,不记录
真实用户标识、姓名、头像、凭据或完整快照。
Scenario: Concurrency, cancellation and diagnostics
Acceptance: A12
慢绘图时事件循环仍可工作;同时运行数有界,重复请求共享任务,
失败可重试;取消后后台完成并正确释放容量,关闭无残留任务。
## Verification and usage
提供明确中文字体路径的离线示例,使用构造数据和临时数据库,
报告冷暖耗时、尺寸、三种编码字节及缓存占用。测量仅代表本机样例,
不宣称低配服务器耗时或真实平台上传性能。保留核心离线验证与
旧基线校验,不接入/重启真实机器人,不访问远端。
Scenario: Repeatable offline rendering
Acceptance: A13
离线样例可解码,性能报告真实可复现,文档提供接入调用和未验证边界。
@@ -0,0 +1,80 @@
---
generated_from_state_version: 14
---
# Verification
## Current result
- Result: **Verification passed; your confirmation is required**
- Verification status: **Checks completed, but your confirmation is required**
- Goal cycle: 3
- Iteration: 1
- Verifier attempt: 1
- Completed: 2026-10-15T08:40:00.608Z
- Summary: 独立只读核对全部13项、完整规格、核心与渲染源码、测试/打包/导出脚本、正式Runtime日志和图片样例;复用匹配候选的45项正式检查,全部验收通过。图索引新增渲染未覆盖且旧文件metadata_changed,已直接源文件补齐,无需重复完整套件。
## Acceptance
| ID | Result | Source | Criterion | Reason |
| --- | --- | --- | --- | --- |
| A1 | passed | brief.md | A1: 旧基线 827 文件校验继续通过;新核心不导入三框架、无导入副作用, 可从安装包或源码独立运行,核心不通过路径引用 legacy。 | 827文件基线正式检查通过;检查包导入无线程/文件副作用及wheel独立安装,核心无框架和legacy运行依赖。 |
| A2 | passed | brief.md | A2: 可复现导出 202 条作物配置,名称和必要数值对应源静态数据库; 本地加载支持格式校验,坏数据明确失败,不访问网络。 | 只读源库导出按id排序并带源hash;202项导出检查通过,加载器校验版本、整数、阶段和重复定义。 |
| A3 | passed | brief.md | A3: 注册立即可查询 500 农场币、0 点券、0 经验、3 块空地; 重复注册不重复赠送;不同显式作用域不串号。 | 账户注册与初始500资产、三空地在事务内完成;重复注册及身份作用域隔离测试正式通过。 |
| A4 | passed | brief.md | A4: 购买到播种全过程扣款、入库、耗种和地块改变正确;0、负数、 布尔值、超大数量、余额/库存不足、等级不足和不存在对象明确失败, 不留下部分写入。 | 购买和播种在完整事务内扣款、入库、耗种、存图;数量、等级、余额和空地边界测试正式通过。 |
| A5 | passed | brief.md | A5: 未成熟不能收获;成熟后只增加本次产量/经验;历史经验 100、 本次获得20时为120;多地加成逐块计算且交换顺序不改变总和; 多季次数及枯萎/铲除遵守保存的规则与可注入时钟。 | 成熟边界、经验增量、多季再生长及枯萎清除源实现与规格一致,逐地块加成及顺序测试通过。 |
| A6 | passed | brief.md | A6: 出售收益只增加一次,例如余额100、收益20后为120; 锁定同时约束指定与全部出售;返回结构化真实余额及安全文本, 不发生旧版模板参数缺失。 | 锁定状态对指定及全部出售生效,出售只增本次收入,Receipt和文本使用真实余额;正式测试通过。 |
| A7 | passed | brief.md | A7: 模拟交易中途异常时余额、库存、地块及流水整体回滚; 同一操作标识重试返回原结果、参数冲突拒绝;并发写入不超卖、 不重复领取,不吞数据库故障伪装成功;重启后数据可读。 | BEGIN IMMEDIATE、操作指纹与结果同事务保存;异常回滚、并发超卖/重复收获、取消重放、重启与schema测试通过。 |
| A8 | passed | brief.md | A8: 提供可执行的离线测试、运行入口和使用说明,保留真实宿主、 真实库迁移及远程发布未验证的说明;文档记录已实现范围和剩余项。 | README、核心说明、离线入口与测试可用,准确说明尚无真实宿主、真实库迁移和远程发布验证。 |
| A9 | passed | brief.md | A9: 独立图片工具支持透明合成、缩放、裁剪、文本测量/省略和三格式编码; 渲染不导入框架、不联网,核心保持无 Pillow 依赖;安装包含所需素材。 | Pillow可选渲染模块支持透明合成、复制、缩放、裁剪、文字测量省略及三格式;核心无Pillow导入,wheel携带673素材并独立渲染通过。 |
| A10 | passed | brief.md | A10: 从一次快照绘制空地、生长、成熟、再生长、枯萎及锁定地块, 使用统一时间、旧布局和正确偏移;输出普通/高清可解码图片。 | 纯场景转换消费一次快照和统一now,首季/再季锚点与枯萎优先正确;旧30块布局及真实offset字段已迁出,普通高清解码与阶段测试通过,样例已视觉检查。 |
| A11 | passed | brief.md | A11: 小画布从开始按目标尺寸绘制;素材和结果缓存有内存上限, 共享素材不被污染;阶段/成熟边界、账户、头像及作用域变化不复用旧图。 | 目标尺寸直接合成;素材/底图与成图LRU有字节预算且返回副本;键含作用域、账户、阶段、头像、主题及编码配置,边界变化不复用旧图。 |
| A12 | passed | brief.md | A12: 合成和编码在后台执行且限制并发,相同请求合并;取消和异常 不提前释放运行名额、不泄漏后台任务;记录耗时、尺寸和缓存状态。 | 整体合成编码由to_thread执行,semaphore限制并发、pending限制容量,shield维持取消后的任务容量并在关闭排空;合并、异常重试、事件循环和并发测试通过,日志不含用户标识。 |
| A13 | passed | brief.md | A13: 离线生成农场样例、对比尺寸/编码与冷暖缓存,保存测量报告和 接入文档;验证旧基线及原有核心测试,明确尚未接入真实消息平台。 | 离线脚本生成两尺寸三格式冷暖测量及日志,报告与已查看样例一致;正式检查45项和基线/两类导出通过,文档明确本机单次、未测上传/低配/Linux及真实平台。 |
## Checks
| Check | Command | Working directory | Status | Exit | Duration |
| --- | --- | --- | --- | ---: | ---: |
| Offline core and renderer | scripts/verify_foundation.py | . | passed | 0 | 10608 ms |
### Builder-reported evidence
These are Builder reports, not Runtime check receipts or independent verification results.
- render-behavior: passed — 13 tests passed
- wheel-packaging: passed — 3 tests passed; installed renderer generated PNG
- visual-demo: passed — 1024 WebP sample reviewed; three formats measured
- full-regression: not-run — 本轮完整检查交给Runtime执行
- Known limitation: 真实框架、上传、Linux和低配主机尚未运行验证。
- Known limitation: 中文字体需部署方合法提供;不捆绑字体。
- Known limitation: 旧基线455个阶段引用缺图,已占位降级。
- Known limitation: 测量为本机单次合成数据,不是旧版或等画质基准。
- Known limitation: 公开发布前仍需核实历史素材分发权。
## Blockers
- **user**: The generic Skill bridge cannot prove an independent Verifier execution; user confirmation is required before Archive. — next: `await-user`
## Risks and skipped work
- 真实消息平台、上传链路、Linux及低配服务器尚未验证;性能报告仅本机单次构造样例,不等画质对照。
- 旧素材存在455个阶段引用缺失,已按规格显示问号并记录警告;不能宣称202种作物图片完整。
- 部署需自备有权使用且包含所需中文字形的字体;当前只验证字体可加载,任意Unicode/Emoji覆盖不保证。
- 历史素材公开分发权仍需在发布前核实。
- 缓存预算为像素/编码内容核算,含预留,不代表整个进程峰值RSS硬上限。
## Previous iterations
| Goal cycle | Iteration | Attempt | Outcome | Unresolved | Summary | Completed |
| ---: | ---: | ---: | --- | --- | --- | --- |
| 1 | 1 | 1 | pass | — | 独立只读验收完成:完整brief/Spec、实现、测试、配置和文档均已核对,最后参考Builder交接;绑定候选的Runtime foundation-offline以退出码0完成,827基线文件、可复现目录导出与32项测试通过。A1-A8全部通过;未追加或自行重跑完整检查,未修改项目源文件。 | 2026-10-15T07:00:29.324Z |
| 1 | 1 | 1 | recovery | — | 用户明确要求在已确认的图片工具及绘图优化方案上执行开发;将共享农场渲染作为当前基础开发的范围补充,保留原业务验收项并追加图片验收。 | 2026-10-15T07:55:29.688Z |
| 2 | 0 | 0 | recovery | — | Native confirmed acceptance criteria changed | 2026-10-15T08:23:15.134Z |
| 3 | 1 | 1 | pass | — | 独立只读核对全部13项、完整规格、核心与渲染源码、测试/打包/导出脚本、正式Runtime日志和图片样例;复用匹配候选的45项正式检查,全部验收通过。图索引新增渲染未覆盖且旧文件metadata_changed,已直接源文件补齐,无需重复完整套件。 | 2026-10-15T08:40:00.608Z |
## Conclusion
独立只读核对全部13项、完整规格、核心与渲染源码、测试/打包/导出脚本、正式Runtime日志和图片样例;复用匹配候选的45项正式检查,全部验收通过。图索引新增渲染未覆盖且旧文件metadata_changed,已直接源文件补齐,无需重复完整套件。
+34
View File
@@ -18,3 +18,37 @@
13. 文档链接、差异和工具错误路径在最后交付核对中记录到验证结果。
未实现新业务、未提交或推送、未配置远程发布权限。
## 基础开发(用户确认后)
- Comet change farm-core-foundation进入Build,当前目录main。
- 迁出202条作物目录,核心代码独立于legacy和三种框架。
- 7项领域、22项事务、3项打包测试分别通过。
- 覆盖事务故障、60路并发购买、20路同标识重放、并发收获、
线程中操作被调用方取消、重启与schema拒绝。
- 测试首轮出现2项Windows文件占用,已修复测试自己的连接关闭。
- 根README和09-foundation记录运行方法、缺陷对应与未完成范围。
- 候选即将提交Runtime检查,尚未宣称独立验收通过。
## 正式验证完成
- Runtime执行verify_foundation.py成功,基线、202条目录与32项测试通过。
- 新的只读Verifier逐项核对完整规格与源码,A1至A8全部通过。
- Runtime已接受结果,当前等待用户接受,不代用户归档。
- 通用Skill桥接不能机器认证独立执行,因此保留用户确认边界。
- 没有执行远程访问、提交、推送、发布或真实玩家数据迁移。
## 共享图片开发
- 用户明确确认进入开发,已有核心范围补充A9-A13并包含WebP。
- 先观察10项缺少新模块的行为测试失败,再实现图片层;随后13项通过。
- wheel在临时安装目录独立加载素材并生成PNG通过;格式检查发现一行
超80字符,已按定位修正,待正式检查复核。
- 673原图片打入独立素材包;旧基线未修改。发现455个原阶段缺图引用,
使用问号占位和静态警告,未声称素材已补齐。
- 生成并目视检查1024宽WebP样例;三格式测量写入render-benchmark.json。
- 当前候选待Comet完整检查和独立验收,真实框架及上传未验证。
- Runtime完整检查通过:45项测试、827文件基线、作物目录和素材导出
可重复检查全部成功。已启动独立只读Verifier检查A1-A13,尚待结论。
- 独立Verifier已完成完整规格/源码/测试和实际样图核对,A1-A13全部
通过,Runtime接受报告并等待用户接受;未执行归档、提交或发布。
+101
View File
@@ -0,0 +1,101 @@
{
"python": "3.12.14",
"os": "Windows",
"pillow": "12.3.0",
"synthetic_data": true,
"scope": "本机单次样例;非旧版对照,未测上传或低配服务器",
"asset_count": 673,
"legacy_missing_stage_references": 455,
"measurements": [
{
"width": 1024,
"height": 624,
"codec": "WEBP",
"quality": 75,
"method": 2,
"bytes": 85820,
"cold_ms": 192.195,
"compose_ms": 131.62,
"encode_ms": 59.955,
"warm_ms": 0.559,
"warm_cache_hit": true,
"asset_cache_bytes": 5248724,
"result_cache_bytes": 89916
},
{
"width": 1024,
"height": 624,
"codec": "JPEG",
"quality": 75,
"method": 2,
"bytes": 112309,
"cold_ms": 119.514,
"compose_ms": 114.538,
"encode_ms": 4.475,
"warm_ms": 0.319,
"warm_cache_hit": true,
"asset_cache_bytes": 5248724,
"result_cache_bytes": 116405
},
{
"width": 1024,
"height": 624,
"codec": "PNG",
"quality": 75,
"method": 2,
"bytes": 1083976,
"cold_ms": 153.524,
"compose_ms": 111.887,
"encode_ms": 41.111,
"warm_ms": 0.271,
"warm_cache_hit": true,
"asset_cache_bytes": 5248724,
"result_cache_bytes": 1088072
},
{
"width": 1536,
"height": 936,
"codec": "WEBP",
"quality": 85,
"method": 2,
"bytes": 236462,
"cold_ms": 208.278,
"compose_ms": 130.485,
"encode_ms": 76.9,
"warm_ms": 0.327,
"warm_cache_hit": true,
"asset_cache_bytes": 11809468,
"result_cache_bytes": 240558
},
{
"width": 1536,
"height": 936,
"codec": "JPEG",
"quality": 85,
"method": 2,
"bytes": 293733,
"cold_ms": 136.219,
"compose_ms": 124.821,
"encode_ms": 10.86,
"warm_ms": 0.274,
"warm_cache_hit": true,
"asset_cache_bytes": 11809468,
"result_cache_bytes": 297829
},
{
"width": 1536,
"height": 936,
"codec": "PNG",
"quality": 85,
"method": 2,
"bytes": 2168696,
"cold_ms": 208.414,
"compose_ms": 124.066,
"encode_ms": 83.863,
"warm_ms": 0.285,
"warm_cache_hit": true,
"asset_cache_bytes": 11809468,
"result_cache_bytes": 2172792
}
]
}
+34
View File
@@ -0,0 +1,34 @@
# 共享农场绘图实施计划
目标:按已确认 farm-render 规格恢复图片展示并减少生成和传输开销。
架构:核心快照 → 不可变展示数据 → Pillow 同步合成 → 受控异步入口。
技术:Python 3.10+、Pillow、unittest;核心零第三方运行依赖不变。
规格:docs/comet/changes/farm-core-foundation/specs/farm-render/spec.md。
## 约束与审查重点
- legacy 不改;运行时不访问 legacy、不联网、不复制未授权字体。
- 缓存按字节限制;共享素材复制后使用,跨作用域不串图。
- 关注成熟/再生长边界、极长昵称、坏头像、编码能力和调用取消。
- 不接真实平台、不发布;真实上传能力仍待适配器确认。
## 实施顺序
- [x] 先写 tests/test_render.py:透明合成、三种编码、状态转换、
缓存隔离/失效/上限、无效头像、异步取消/排队/错误/关闭。
运行并确认缺失新功能导致失败。
- [x] src/farm_render/canvas.py、models.py:图片原语和输入/输出模型。
- [x] scripts/export_render_assets.py:可重复打包选定旧素材及展示元数据;
src/farm_render/assets.py:受限读取与 LRU,layout.py:纯阶段转换。
- [x] renderer.py:目标尺寸底图、作物、真实账户面板、三格式编码。
- [x] service.py:一次快照、受控并发、重复请求合并、取消和关闭排空。
- [x] scripts/render_demo.py:生成普通/高清和编码对比;观察实际成图。
- [x] pyproject.toml 增加 render extra、资源打包;测试 wheel 独立渲染。
- [x] docs/10-rendering.md 保存用法、测量、边界,更新索引和进度。
- [x] 定向测试通过后提交 Comet 检查,由独立只读 Verifier 验收 A1-A13。
不自动提交、归档或推送;最终验收结果交用户接受。
正式Runtime检查:45项测试、827文件基线和两类导出检查通过;
独立只读Verifier核对全部A1-A13并全部判定通过,Runtime已接受报告。
当前等待用户接受结果,不自动归档。
+23
View File
@@ -45,3 +45,26 @@
| 用户要求停止拉取时三个 clone 已完成 | 如实说明,收到删除要求后逐个校验路径并删除 |
没有尝试绕过用户停止拉取要求,也没有执行远程发布。
## 第二轮:基础迁移开发
用户已确认范围并选择当前目录,Comet已进入Build。
- [x] 修复Comet管理区并完成Native初始化。
- [x] 202条配置离线迁移,建立独立核心包。
- [x] 注册、查询、购买、播种、收获、铲除、锁定及出售。
- [x] SQLite事务、流水、幂等、并发及取消恢复。
- [x] 32项定向测试通过;文档与打包入口已完成。
- [x] Runtime完整检查与独立Verifier验收:32项测试、8/8验收通过。
- [ ] 用户接受验收结果后归档;本轮不推送发布。
开发期问题:测试连接未关闭导致Windows清理失败,已修复并复测。
主仓库origin由用户设置为Shu-Ying/main_plugin_farm,未访问远程。
## 第三轮:共享农场图片
- [x] 用户确认方案并补充WebP,当前目录进入Build。
- [x] 独立Pillow工具、快照展示、673素材原样打包、缓存和受控任务。
- [x] 13项渲染定向测试通过,wheel独立图片生成通过。
- [x] 生成普通/高清样例并检查文字布局,保存三格式测量和使用文档。
- [x] 正式Runtime检查45项测试通过;独立Verifier判定全部A1-A13通过。
- [ ] 用户接受结果后归档。