八角 · 交付 ChecklistW3 · 勾选自动存本机
距内容锁定 本周 0/0 整体 0/0 已存

八角 · 交付 Checklist

罗马塔防手游 | 本周 W3:09-14 → 09-20,硬门是 09-17 内容锁定 | 读数按 2026-09-13 仓库实测main = 6c92c844,每条带文件路径 / 分支 / 提交号,可自己核)| 排期母文档 Docs/roadmap/2026-09-roadmap.md
本月唯一硬承诺:09-30 完成首次提审。 10-10 发布是预计不是承诺——它取决于苹果审核,别对外说「9 月底上线」。
天 → 内容锁定
09-17
天 → 发布候选
09-25
天 → 首次提审
09-30 承诺
天 → 发布上线
10-10 预计
🔴 本周唯一要紧的一句话:缺口不是「没做」,是「没合」。 09-30 提审的四块——IAP 全链 · 音频 · 合规 · 上架主体——大半已经做完了,但全部躺在没合并的分支上。 只读 main 的清单会把它们显示成「零实现」并据此派活,那是错的; 可反过来也成立:没合进 main 的东西在 09-17 内容锁定那天就是不存在
所以本周的动作不是开新活,是把在飞的四条合进来(下一节逐条列出,含负责人与拦路的那一件事)。

🚧 在飞的分支 · 提审关键路径 09-13 盘点 · 未合并分支 80 条,近 7 天有动作的 45 条,下表是其中卡着提审的

这一节存在的理由:清单读的是 main,而 main 读不出「已经做完但没合」。 09-06 那一版就带着这一节,它当时抓到的问题今天更严重——release 侧四条全在飞,其中两条从 09-10 起就没再动。
在飞的东西分支 / 最后动作已经做完的还差什么(09-17 前要落地的)
IAP 全链 + StoreKit
在飞
唐奕新 YiXin Tang
(09-13 Glenn 更正;
roadmap 2.4 写的 Glenn 已过期)
thread/tf-a60cb3
09-12
com.unity.purchasing 5.4.3 进 manifest · TDAppleStorePlatform.cs 真接 StoreKit(取商品 / 本地化价格 / 购买 / 恢复 / 启动读既有交易 / 先发权益再确认 pending order)· BillingMode.json · scripts/asc_create_iap.mjs · 机器门 webgl_td_paywall_gate.mjs 13 条断言跑在真实部署包上 · ASC 商品已建齐:$4.99 / 简中+英文文案 / 175 地区 / 审核截图 / 状态 READY_TO_SUBMIT · TestFlight 包 1.0.0 (20260908151403) 已过 Apple 处理(VALID ① 合进 main(这是 09-17 硬门里最大的一块)
② 真人拿沙盒账号在真机跑一次购买 + 一次恢复购买——分支文档自己写着「自动门不能替代真实 Apple ID 的付款弹窗」
build_ios.sh 还写死读 ~/.appstoreconnect,用椰岛新实体出包要加 config 目录开关(已知未做的口子)
音频全套
在飞
roadmap 3.3 · Wesley
thread/t-a0f9c3…1e9611
09-13
28 个命名音位(arrow / ballista / boss / build / button / coin / crowd / defeat / denied / early / final / fire / heavy / hold / hold_done / hold_loop / horn / ice / late / leak / menu / night / perk / rain / ship / victory / wavehorn / wipe)+ 81 个候选 wav · 每音位音量已调(Audio/Review/manifest.json)· StreamingAssets/audio-credits.json 逐条记来源 / 作者 / 许可 URL(正是判据要的「版权来源可追溯」)· 引擎已接线(TDAudio.Review.cs + TDSim/TDFlow/TDGame/TDUI/TDCampaignUI ① Wesley 把试听台这一轮审完(09-12 首轮寒冰与漏怪被全否,09-13 改「只用免费素材」+ 固定批次)
② 合进 main —— 音频是进包的东西,09-17 之后进不去
③ 目标写的是 BGM 2 + SFX 12,现在 28 个音位超了;口径要不要按实际改一下
年龄分级问卷
已完成(在 ASC 上)
不可降级 8 项之一
thread/app-store-age-
rating-questionnai-e3f7a6
09-10
已应用并回读验证(2026-09-10):全球 13+,巴西与韩国 12+,越南 16+。scripts/asc_age_rating.mjs 脚本填 + 回读,答案存 scripts/age_rating_rometd.json,内容变了重跑 plan 会 diff 出来 只差把记录合进 main(ASC 那边已经是真的了)。内容一改就要重跑 plan——这周还在加船、加登陆、加音频
Android / Google Play 线
在飞
thread/w-google-play-
ea7587
09-10
锁定 bundle id com.bajiao.rometd · 每次 Android 构建同时出 .aab.apk · play_publish.py / play_verify.py / release_preflight.py / build_android_td.sh Play 不是本月硬承诺(iOS 为主)。但它顺手改了 ProjectSettings 的 bundle id,而 main 上现在还是 idle 遗留的 com.bajiao.civ——这一处早晚要合,别让两条分支各改一遍
两批 UI 重做(05ec / 0070)
连分支都没推
仅本地工作区
09-10 / 09-12
选关页紧凑地标大道 / 等大金纹卡 / 原生上边栏 / 两颗圆润星 / 手指拖动与背景视差;基础 UI 按塔库程序框扩到主菜单、选关、关卡详情 这是最危险的一类:不在 main,也不在任何远端分支,只在某台机器的工作区里。 spec §1 自己写着「尚未提交」「当前为本地未提交实现」。09-17 之后合进来就算新功能,要 Wesley 单条批准
🔴 最该在例会上拍的一条:App Privacy 答案填的是「Data Not Collected」,而数数(ThinkingData)已经在真上报。 分支 thread/app-store-age-rating-questionnai-e3f7a6 上的 scripts/app_privacy_rometd.json 答案是 collectsData: false → 标签「Data Not Collected」, 理由里逐条写着「没有任何第三方 SDK」「Assets/Scripts/TD 里没有任何远端主机」。
main 上(09-09 客户端 / 09-10 接收端两条决策)数数已经接好并在上报StreamingAssets/thinkingdata_td.json 里 appid 与 serverUrl: https://ta2.cisgames.cn 都填好、disabled: falseTDAnalytics.cs 带匿名设备 id POST 出去。这就是 Apple 定义的「收集」。
答案自己已经宣判了自己——它的 invalidates_this_answer 第一条就是「Adding any analytics, ads, attribution, crash-reporting or remote-config SDK」。
⚠️ 而且它自带的机器门抓不到这件事。 我今天拿分支上的 scripts/app_privacy_check.py 跑当前 main, 五项全 ok、退出码 0、打印「'Data Not Collected' still holds」。 原因是那道门只扫 .cs 里的字面 URL(if "http://" not in line and "https://" not in line), 而数数的地址按本项目「数值外置到 JSON」的惯例放在 StreamingAssets 里。 门的盲区恰好是这个仓库自己的写法。
要拍的是二选一:(a) 改答案——声明标识符 / 使用数据,并同步写 PrivacyInfo.xcprivacy(b) 首发关掉数数——把 disabled 置真、答案保持不变。 虚假申报是会被下架的那一类问题,不是会被驳回重交的那一类。 顺带:那道门也该补一条扫 StreamingAssets/*.json
scripts/app_privacy_rometd.json(分支)· Assets/StreamingAssets/thinkingdata_td.json · Assets/Scripts/TD/Game/TDAnalytics.cs
🟡 合规里真正一行都没有的只剩两件,都不在任何分支上:PrivacyInfo.xcprivacy——全仓 0 个文件,而它是进包的,吃 09-17 死线。 分支上的答案文件自己记了该怎么做:PlayerPrefs 属于 required-reason API(NSPrivacyAccessedAPICategoryUserDefaults,理由 CA92.1), 并且要先看 Unity 6000.5 往生成的 Xcode 工程里写了什么再决定要不要手写。
隐私政策页 URL——「REQUIRED for every iOS app and not yet chosen. Blocks submission independently」,加上支持页。
归属(09-13 Glenn 更正):Privacy 整块归 Wesley + YQM,包含 xcprivacy 09-10 那条决策把 xcprivacy 划给了工程侧、只把问卷给 YQM——这条口径以 Glenn 09-13 的为准, 整块不再分家,因为 App Privacy 答案与 xcprivacy 必须列同一份数据类型,拆给两拨人正是它们会对不上的原因。

🎨 美术素材清点 · 都在了吗 09-13 按运行时实际加载路径逐项核 · Glenn 问的那一条

✅ 结论:成套的素材全部到位,不是 placeholder,是成品。numbers_td.json / TDCampaign.cs 里游戏真正会去加载的 id 逐个核文件,四类全齐: 12 关壁画 12/12UI/Campaign/Fresco/fresco_<id>.png)· 升级项配饰 18/18(9 个可放置物 × 2 项,Perks/perk_<tower>_<perk>.png,同塔两项不共用)· 对话立绘 14/14StreamingAssets/portraits/,实测是真 PNG、420×524、带 alpha,不是 LFS 指针)· 9 个可放置物本体全部有画。运行时 PNG 合计 316 张。
但有两个洞,而且都不会报错——它们不是「缺文件」,是「缺一段动画」。
狂战士 berserker 没有走路动画。 另外 7 种陆地敌人每种 33 帧 8fps (GruntWalk8fps / RunnerRun8fps / ArmoredWalk8fps / DrummerMarch8fps / DruidWalk8fps / ChariotRide8fps / BossWalk8fps),运兵船另有 TransportRow6fps + TransportSink6fpsTDSpriteMap 的循环登记表里只有 7 条,没有 berserker——它有一张画得好好的静态图, 所以不缺文件、不报错、截图里完全正常,但它在场上是滑行的
下雨是显式声明的占位实现。 现在的雨是程序画的(TDRainSceneEffect + RomanTDRainOverlay.shader), TDData.cs:1212 直接写着「PLACEHOLDER —— 黛尔's version wins if she ships one」。 09-11 已有决策:黛尔一提交就整层替换,不合并、不留 fallback,换的只是一个 component 加一个 shader,规则/波次/徽条全不动。 这条的风险是它看起来还行——决策原文就说,下一个人会默认它是既成事实。
另外两件是按设计不需要画的,不算洞:泥潭 mudpit 的本体是程序画的地面斑块(MirePatchSprite); 民房只留 tower_house_1 是 09-10 作者主动砍掉 2/3/4 款的结果。
核法:numbers_td.json towers/enemies + TDCampaign 12 关 id → 对 Assets/Resources 与 StreamingAssets 逐个查文件 · TDSpriteMap.cs:29-35 循环登记表 · TDData.cs:1212

📝 游戏文本谁审阅 Glenn 问的第二条 · 09-13 仓库里的答案

🔴 名义上是 Wesley,实际上没有人,而且判据本身管不到内容。 roadmap 3.4「本地化 EN / ZH」负责人写的是 Wesley,工时表也写着他「另接下音频与本地化」。 但那条的验收判据是「全字符串外置,两语言无溢出无缺字」——这是三条机器判据(外置 ✓、键对齐 ✓、渲染不溢出), 没有任何一条是「有人读过这些话写得对不对」。全仓也找不到一条关于游戏内文本审阅的决策或指派。
而 W2 新写的文本量不小:字符串从 444 条涨到 522 条,净增 78,实际新增键 107、删除 29。 这 107 条里有 14 个说话人的剧情对话、第 1–3 关的教学对话、状态规则页、荣冠 / 塔库 / 无尽 / 桥梁 / 运兵船的新 UI 文案—— 基本都是 AI 写的,且没有指定的人类读过一遍。
要 Glenn 拍的是:谁读这 522 条、读哪一版为准(EN 主 ZH 次)、什么时候读完。 时间上它比看起来紧——文本是进包的,吃 09-17 内容锁定;而且改文案会改字宽, 改字宽就要重跑溢出实测,所以「先锁文案再验排版」比反过来省一轮。
✅ 两条可以从例会议程上划掉了。Cloudflare 25 MiB 单文件上限:09-07 Glenn 拍板默认发布平台换成 minigrove.games(面板会话走 publish_web_build,Cloudflare 只做回退), 实测单个 data 35.8 MiB 可发,那条上限不再卡看包通道。 ② 年龄分级:09-10 已在 ASC 上应用并回读验证,13+。 Docs/decisions/2026-09-07-minigrove-default-delivery-for-panel-sessions.md · scripts/age_rating_rometd.json(分支)
📏 三处口径更正,例会别沿用旧读数:
「8 座可建塔 + 2 陷阱」是错的。 numbers_td.jsontowers 实有 9 条不是 10 条,且不能全叫「塔」——按 attackKind 分: 5 座开火塔(arrow/cannon/ice/ballista/greekfire)· 1 个经济建筑(house,yield)· 1 个辅助(brazier,beacon,0 伤害)· 2 个陷阱(spikes trap / mudpit mire)。 对判据是好消息:目标 6 塔,实有 9 个可放置物。
TestFlight 那个构建号对不上。 仓库里有记录的是 1.0.0 (20260908151403)(09-08,VALID; 口头传的 20260912170939 全仓 grep 不到——分支 09-12 还在动,很可能是那天又传了一个但没落记录。请上传的人确认一句是哪个,它决定 09-25 的 L2 会不会落下。
main 上的内购产品 id 是作废的那个。 TDPaywall.ProductId 在 main 上还是 com.bajiao.romantd.fullcampaign, 而分支上已改成 com.bajiao.rometd.fullunlock 并注明「旧占位 id 作废」。ASC 上建的是新的那个。合并前别拿 main 上这个 id 去对 ASC。

📈 W2 这一周(09-06 → 09-13):904 个提交、约 90 篇决策,而这份清单整整 10 天没跟上

  • 可放置物 7 → 9:民房改为经济主轴(09-07)+ 火盆 beacon 塔(09-08)。目标 6,已超
  • 敌人 8 → 9:新增运兵船 transport,配套海上航道 / 桥梁 / 登陆点(09-07 桥梁、09-13 船 04 网格航道、09-13 后期分段登陆)。目标 8 含 boss,已超
  • 战役敌人数值固定 + 新增无尽模式(09-07):战役里敌人不再随波成长,成长搬进无尽。 代价已登记——参考打法满星关卡 2/12 → 8/12,星级失去区分度,波表重配是独立的作者 pass,仍未做
  • 三星 → 两级罗马荣冠(09-08,MaxStars = 2):把上面那条的区分度问题又压了一档
  • 波次定时开始(09-07,waveGapSeconds = 5.0):堵住「清得慢 = 挣得多」的经济漏洞;波表未随之重配
  • 教程从零到有:第一关一次性教学(09-08)+ 第 2 / 3 关无伤保障路线(09-09 / 09-10)+ 出征准备屏引导
  • 升级项穿在身上(09-08):9 个可放置物 × 2 项 = 16 件配饰,删掉塔脚白点
  • 场外四屏 Retro Print 视差背景 + 塔库 AI 重做(09-10);字体规范被作者明确推到「全界面重做完再统一」
  • 数数埋点接入(09-09 客户端 / 09-10 接收端)——就是上面那条合规矛盾的来源
  • IAP 真接上了 StoreKit、ASC 商品建齐、TestFlight 包过了 Apple 处理(09-08,分支 thread/tf-a60cb3
  • 年龄分级 13+ 已应用并回读验证(09-10)· App Privacy 答案已写(同日,但与数数冲突)
  • 音频从零到 28 个音位 + 逐条版权来源(分支),09-12 首轮全否 → 09-13 改「只用免费素材」+ 固定批次试听台 + 长按三阶段与转场音乐规则
  • 市场运营 YQM 入组(09-10):接走 Wesley 手上不写代码的发行活;新增游戏名买量赛马,09-15 起盘、09-19/20 收盘、09-21 前名字必须定死
  • 最小支持屏定为 iPhone 13 mini(09-11)· 罗马奇幻世界观前提(09-11)· web 舞台固定 720×1280(09-09)
为什么停更了 10 天:上一次落库是 09-03 的例会结果(c6f30686),页面 lede 一直写着「本周 08-31 → 09-06」,整个 W2 没进过这里。 线上那一版还带着 09-06 的收官读数,但它从没被提交进仓库——所以连「上次写了什么」都得去线上扒。这一版起:本周区块 = W3,每条带可核对的证据,并且这份 HTML 就在 main 上。

📣 市场计划从什么时候开始 Glenn 问的第三条 · 09-10 拍板的序列 + 倒推死线

已经开始了,就是这周——但开始的是「发行手续」,不是「投放」。 09-10 Wesley 带新成员 YQM 入组时拍了五件任务的优先级,第一价值不是开始做营销,是把 Wesley 手上不需要写代码的发行活接走本周明确不给他的:不开投放盘花钱(素材未定版、赛马工具链还是 idle 时代的)· 不碰上架图形素材本身(W4 归 Daier)· 不碰提审操作(roadmap 5.1 写死 Wesley 本人)。 参照:Marketing/ 里最后一次真实活动是 08-20 的 idle 赛马,RomanTD 的投放侧到今天是零。
时间做什么为什么是这个时间
09-13 → 09-15
本周
App Store 商店页文案与元数据草案(EN 主 ZH 次)+ ASO 关键词池YQM 已从 W3 尾提前到这里——名字赛马 09-15 起盘要用它的素材,不提前链条会断
09-15
起盘
游戏名买量赛马:每个名字一个 campaign / CA / LINK_CLICKS / 1d 点击 + 0 浏览 / 双帽 / Day1 $20 阶梯 / meta_guard 白名单 / race_report.py manifestYQM 倒推来的:名字 09-21 前必须定死 → 09-19/20 收盘 → 09-15 起盘。两个前置:候选名先过 App Store 重名/近似名与商标检索;素材必须单变量(只换名字、其余逐字一致),否则测的是素材不是名字。花钱授权是人类门
09-17 Day-0 数据口径 + 埋点清单YQM 市场侧唯一吃内容锁定死线的一条——要进包的埋点,09-17 之后进不去。和 App Privacy 那个决定是同一枚硬币的两面
09-19 → 09-20赛马收盘 + 出报告YQM 收盘走现成脚本 race_report.py <manifest>,不新造流水线
09-21
硬死线
游戏名定死Wesley 拍板 图标、5 张截图、关键词表全挂在名字上,W4 上架素材 09-21 开工
W4 · 09-21 →上架素材:图标 / 5 张竖版截图 / 30 秒预览视频(脚本与分镜 YQM 出,执行 Daier)Daier + YQM 09-03 例会把 marketing materials 推到 W4;旧图标 A 与假门素材作废重出
W5 · 09-28 →发布前投放素材准备 · Day-0 看板就位Wesley roadmap 4.4 / 5.4
三件仍等 Wesley 拍的(09-10 就登记了,还没回):落地目的地形态 · 候选名来源与数量 · 预算上限。 已提示的风险:CTR 测名字的信号弱于测题材,候选过多会让每盘样本不足,建议先用便宜的定性轮砍到 3 个以内再买量。
还有一件本周就该动的:重写 Docs/ai-context/marketing.md——它现在还停在 idle / Romanpunk 框架(最后复核 08-26), 任何 AI 接市场任务都会先读到这份过期的东西。

降级阶梯 · 到触发日自动执行,不需要人点头 roadmap §3

触发日级别砍什么按 09-13 实测会不会触发
09-17
内容未锁
L1 12 关 → 9 关 · 3 图 → 2 图 · 6 塔 → 5 塔 · 8 敌 → 6 敌 内容量这一侧不会触发。 12 关(TDCampaign.cs 12 个 TDLevelDef)· 9 个可放置物 · 9 种敌人,三项全部超过阶梯目标。 「3 图」这个口径已作废——现在是 12 关各自一张地图,不是 3 图 × 4 关。
真正的 L1 风险不在内容量,在「锁」这个动作:在飞的四条 + 两批本地 UI 没合进来,锁了也是锁了个残缺包。
09-25
未出 TestFlight
L2 砍中文(纯英文首发)· 音频只留核心 SFX · 教程降为一张静态图 中文与教程这两刀已经没有意义:双语 522/522 键完全对齐、教程覆盖第 1–3 关都已在 main。 音频那一刀也不必了——分支上是 28 个音位不是 12 个。
TestFlight 09-08 已有 VALID,若 09-25 前能把在飞的合进来再出一个,L2 触发条件解除。

本周 W3 · 09-14 → 09-20 09-17 内容锁定 · roadmap 3.1–3.5

产品整体 · 到 10-10 上线要齐的东西 · 蓝色左边框 = 在飞(分支上有,main 上没有)