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
@@ -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,已直接源文件补齐,无需重复完整套件。