Category: Uncategorized

  • 版本 1.0.423 开发日志

    构建 1.0.423(code 423)· 2026-10-05 09:42:49 · sha256 09bff753d7ac1366…

    下载:公网 · Tailscale · 局域网

    开发日志(本轮摘要)

    # 贵霜帝国 · 内网开发版 · 本轮开发记录
    
    生成时间:2026-10-05 09:37:25 | 本包:kushan-1.0.423.apk(1.0.423 / code 423,sha256 09bff753d7ac1366…)
    
    ## 最近开发任务证据(evidence/*/readme.md,新→旧,取 10 份)
    
    ### TASK-ART-ROSTER  (2026-10-04 20:49:49)
    
    # 口径说明 · 323 人 NPC 相片槽位排产表
    
    生成时间:2026-10-04 20:49:49 | 仓库:`/mnt/data2/home_czdcc/kushan_main`
    
    本目录交付件:
    
    | 文件 | 用途 |
    |---|---|
    | `roster.md` | 人读排产表,按优先级分三节列出全部 323 人 |
    | `roster.csv` | 机器可读版,UTF-8 带表头,一 NPC 一行 |
    | `readme.md` | 本文件,口径说明 |
    | `_roster_data.json` | 生成中间件(全量行 + 汇总),供下游程序消费 |
    
    ## 1. 任务口径
    
    - 画风取 **甲案**:沿用犍陀罗写实油画(不换画风、不重炼风格)。
    - 老图 **646 张不重出**;本表只排「缺失槽位」的新增出图。
    - 覆盖全库 **323** 名 NPC(`characters.type='npc'`)。
    - **甲案的代价**(须知悉):老图沿用,与「本作自定画风」新线**不同源**,将来短片/场景图接起来会有风格落差;好处是零重出成本、已认过的脸不变、老图整份留档可回退。
    
    ## 2. 数据真源(全部只读;生成脚本不含任何硬编码数值)
    
    | 口径 | 真源 |
    |---|---|
    | 每人槽位/档位 | `data/npc_photo_slots.json`(`character_rank.tier` 落档结果,323 行) |
    | 槽位与张数规则 | `data/npc_performance.json` → `photos.count_by_tier`(low/mid/high = 2/3/5) |
    | 身份档位落档表 | `data/npc_rank_map.json`(title → tier 1–10) |
    | 装扮档位映射 | `data/params.json` → 键 `dress.tier_from_status` / `dress.max_tier` |
    | 归属房间/聚落、身份 | `kushan` 库:`characters` / `rooms` / `locations` |
    | 剧情挂靠 | `kushan` 库:`quest_chains.entry_npc_id` / `quest_templates.giver_id`(`active=1`) |
    | 现有老图 | `/srv/fileshare/kushan_photos/`(对外前缀 `/kushan_photos/`) |
    | 逐人出图 prompt | `data/npc_prompts_full.json`(323 条;出图时拼 `[风格块] + [本人 prompt] + [负向禁性表]`) |
    
    取库凭据一律走仓内唯一通道 `bash tools/query_kushan.sh "<SQL>"`——脚本**不连库、不内嵌口令**。
    
    ## 3. 槽位与张数规则(按身份档 → 2/3/5 张)
    
    | 带 | 身份档位 | 每人槽位 | 张数 | 已有 | 缺口/人 |
    |---|---|---|---|---|---|
    | low | 1–3 | avatar, full | 2 | 2 | 0 |
    
    ### TASK-D13  (2026-10-04 20:39:58)
    
    # TASK-D13 · 装扮规则链「随规则变」取证
    
    判据(68 号 D-13):同一房间换主人规则后,立绘装扮随之改变 | 改前/改后两张并排截图。
    
    ## 复跑命令(原始命令,可重放)
    
    渲染入口:`--render-panel npccard:<cid> --render-output <绝对路径>.png`。
    坑一:`--headless` 直跑 `save_png` 返回 **err=-1**(不出图),必须 `xvfb-run`。
    坑二:注入 JSON 的 mode 键必须是 `dress_tier.gd` 的 `MODE_INNER` 值 **`inner`**(不是 `interior`),否则静默回落世界默认。
    
    ```bash
    export HOME=/home/czdcc
    export KUSHAN_QA_CHAIN=l1          # 走 L1 主语链;改前留空
    export KUSHAN_QA_OWNER_JSON='{"inner":{"xiangfei_tier":5}}'   # 改后;改前不设
    export KUSHAN_DRESS_DUMP=1
    G="/mnt/data2/home_czdcc/贵霜帝国/godot/Godot_v4.7.2-stable_linux.x86_64"
    xvfb-run -a "$G" --path /home/czdcc/kushan_main -- \
      --render-panel npccard:10 --render-output /home/czdcc/kushan_main/evidence/TASK-D13/card_cid10_after.png
    ```
    
    同 cid=10(房间 6,rtype=interior)、同一张卡、同一次渲染入口,只改「场所主人规矩」注入。
    
    ## 自报原文(主证)
    
    改前(无注入):
    ```
    KUSHAN_DRESS cid=10 rtype=interior tier=4 source=world by=世界默认 qa=l1
    text=内室(家内/内院)(隐秘(深宫禁锢):蒙眼睛·勒嘴(封口)·双手在后(背缚 + 腕链)·双手合十被反绑)(依 世界默认)
    ```
    
    改后(注入 L1 主人规矩 tier=5):
    ```
    KUSHAN_DRESS cid=10 rtype=interior tier=5 source=owner by=本场所主人规矩 qa=l1
    text=内室(家内/内院)(顶点(图腾):完全禁锢组合:蒙眼 + 勒嘴 + 反绑 · 完整徽章:乳环 + 肚脐红宝石 + 双金链 + 束腰带)(依 本场所主人规矩)
    ```
    
    ⇒ **规则链层「随规则变」成立**:tier 4→5、source world→owner、by 与依据行、装束文本全部随注入改变。
    
    ## 未达部分(如实记,不遮掩)
    
    
    ### TASK-CINE-PACK  (2026-10-03 01:39:43)
    
    # B-078 资源包化:过场片移出 APK、按需下载(用户令 2026-10-02「视频丢到资源包」)
    
    ## 现状摸底(本轮实测)
    - 包内片源:`assets/cine/*.ogv`(15 个文件,仓内 41MB;APK 内约 **20MB**:`21_first.ogv` 4.5MB、`25_first` 4.4MB、`23_first` 3.7MB、`1_first` 3.1MB、`37_first` 2.8MB…)。
    - 取件机制**已具备一半**:`scripts/cine_lib.gd` 与立绘同款 —— `user://cine/` 缓存 + 在线清单 `user://cine/index.json` + **包内目录兜底**(`resolve()`:本地缓存 → 包内;网络归 net 层,本模块不碰网络)。
    - 导出排除表**已有先例**:`export_presets.cfg` 的 `exclude_filter` 里已排除 `assets/portraits/*`,**但没排 `assets/cine/*`** ⇒ 这是「移出 APK」那一步的落点。
    - **缺的那一半**:立绘有下载器(`scripts/room/portrait_fetch.gd`、`profile_view.gd`、`npc_panel.gd` 调 `PL.save_disk`),**过场片没有下载器**(`cine_player.gd` 只调 `CL.resolve()`)。
    - 托管落点现成:nw 站的 `/files/`(203 站点目录 `/mnt/data2/www/wwwroot/kushan-nw/files/` → 公网 `https://nw.tripee.cn/files/`、Tailscale `http://100.127.177.38:8088/files/`、局域网 `http://192.168.50.203:8088/files/`),镜像到云机 `/srv/kushan-files/`。
    - 相关参数:`cine.online_base`(**当前为空**)、`cine.ext=.ogv`、`cine.cache_max_mb=64`。
    
    ## 实施方案(按 107 号 S0→S8,一功能一文件)
    1. 新增 `scripts/room/cine_fetch.gd`(对照 `room/portrait_fetch.gd`):按 `cine.online_base` 拉 `index.json` → 按名拉 `.ogv` → `CL.save_index()`/`CL.save_disk()`;三基址候选(公网/Tailscale/局域网)照 `net_endpoints` 口径。
    2. `cine_player.gd` 在 `CL.resolve()` 返空且 `CL.index_has()` 为真时调取件(**只补取件调用,不改播放逻辑**)。
    3. 上传:`assets/cine/*.ogv` → `/files/cine/`(203 本地 + 云机镜像),并生成 `/files/cine/index.json`(名→大小/sha256)。
    4. `data/params.json` 置 `cine.online_base`(三链取一,仍受「外网口径待人拍板」约束 ⇒ 先写内网基址,公网基址随更新通道一并拍板)。
    5. `export_presets.cfg` 在 `exclude_filter` 追加 `assets/cine/*`。
    6. 出包(预期 APK ≈131.8MB → **≈112MB**,即减掉片源那约 20MB)+真机验:**无缓存时能下载并播放**、**断网时优雅降级**(不卡死、不报脚本错)、再次进入离线可播。
    7. 护栏:新增 `tools/verify_cine_pack.py` —— ① 排除表必须含 `assets/cine/*`;② 仓内片源与远端清单逐条对齐(数量/大小);③ `cine.online_base` 非空且与 `tools/hosts.sh` 口径一致。
    
    ## 本轮边界
    - **未动任何片源与排除表**:在「下载器」落地前把包内兜底删掉=过场直接失播 ⇒ 先补取件、再拆包,顺序不能反(本轮只立项+摸底,未见红)。
    
    ## 1.0.389 重出(排除表改走参数)
    
    ## 1.0.389 出包与真机(本轮收尾)
    - APK:**112721647 字节**(改前 1.0.388=131846522);包内 `\.ogv` 条目=**0**、`assets/cine/` 条目=0
    - 资源包:203 站点 5 片+index.json(18.6MB),云机镜像 6 文件;三链回读 200(公网/Tailscale/局域网)
    - 真机 `[Cine] got` 命中=0(清端上 `files/cine` 缓存后跑)
    - 护栏:`python3 tools/verify_cine_pack.py` ⇒ PASS 4 FAIL 0;全量 `run_verify_all.sh` ⇒ PASS 96 FAIL 0
    - **真因**:[1/6] 备份 preset+params、把签名库路径替换成本机路径、注入排除过滤表(版本=standard)
      已把 pack.edition 设为 standard,排除表 assets/portraits/*,evidence/*,docs/*,tasks/*,tools/*,data/private/*,edition/*,dist/*,addons/gut/*,kushan_db/*,backup_archive/*,tests/*,release/*,instances/*,_cl_/*,.venv/*,*.md,*.py,*.sh,*.sql,*.log,assets/cine/*
      已替换 keystore/release 与 keystore/debug
      exclude_filter=assets/portraits/*,evidence/*,docs/*,tasks/*,tools/*,data/private/*,edition/*,dist/*,addons/gut/*,kushan_db/*,backup_archive/*,tests/*,release/*,instances/*,_cl_/*,.venv/*,*.md,*.py,*.sh,*.sql,*.log,assets/cine/*(22 条)
      package/unique_name=com.kushan.dynasty
      应用名=贵霜帝国(出包后还原 project.godot)
    [2/6] 装配原生插件(真源 android_plugins/ → 构建模板 android/build/;幂等)
    
  • 版本 1.0.422 开发日志

    构建 1.0.422(code 422)· 2026-10-05 09:30:49 · sha256 196802f0e1a4f567…

    下载:公网 · Tailscale · 局域网

    开发日志(本轮摘要)

    # 贵霜帝国 · 内网开发版 · 本轮开发记录
    
    生成时间:2026-10-05 09:25:24 | 本包:kushan-1.0.422.apk(1.0.422 / code 422,sha256 196802f0e1a4f567…)
    
    ## 最近开发任务证据(evidence/*/readme.md,新→旧,取 10 份)
    
    ### TASK-ART-ROSTER  (2026-10-04 20:49:49)
    
    # 口径说明 · 323 人 NPC 相片槽位排产表
    
    生成时间:2026-10-04 20:49:49 | 仓库:`/mnt/data2/home_czdcc/kushan_main`
    
    本目录交付件:
    
    | 文件 | 用途 |
    |---|---|
    | `roster.md` | 人读排产表,按优先级分三节列出全部 323 人 |
    | `roster.csv` | 机器可读版,UTF-8 带表头,一 NPC 一行 |
    | `readme.md` | 本文件,口径说明 |
    | `_roster_data.json` | 生成中间件(全量行 + 汇总),供下游程序消费 |
    
    ## 1. 任务口径
    
    - 画风取 **甲案**:沿用犍陀罗写实油画(不换画风、不重炼风格)。
    - 老图 **646 张不重出**;本表只排「缺失槽位」的新增出图。
    - 覆盖全库 **323** 名 NPC(`characters.type='npc'`)。
    - **甲案的代价**(须知悉):老图沿用,与「本作自定画风」新线**不同源**,将来短片/场景图接起来会有风格落差;好处是零重出成本、已认过的脸不变、老图整份留档可回退。
    
    ## 2. 数据真源(全部只读;生成脚本不含任何硬编码数值)
    
    | 口径 | 真源 |
    |---|---|
    | 每人槽位/档位 | `data/npc_photo_slots.json`(`character_rank.tier` 落档结果,323 行) |
    | 槽位与张数规则 | `data/npc_performance.json` → `photos.count_by_tier`(low/mid/high = 2/3/5) |
    | 身份档位落档表 | `data/npc_rank_map.json`(title → tier 1–10) |
    | 装扮档位映射 | `data/params.json` → 键 `dress.tier_from_status` / `dress.max_tier` |
    | 归属房间/聚落、身份 | `kushan` 库:`characters` / `rooms` / `locations` |
    | 剧情挂靠 | `kushan` 库:`quest_chains.entry_npc_id` / `quest_templates.giver_id`(`active=1`) |
    | 现有老图 | `/srv/fileshare/kushan_photos/`(对外前缀 `/kushan_photos/`) |
    | 逐人出图 prompt | `data/npc_prompts_full.json`(323 条;出图时拼 `[风格块] + [本人 prompt] + [负向禁性表]`) |
    
    取库凭据一律走仓内唯一通道 `bash tools/query_kushan.sh "<SQL>"`——脚本**不连库、不内嵌口令**。
    
    ## 3. 槽位与张数规则(按身份档 → 2/3/5 张)
    
    | 带 | 身份档位 | 每人槽位 | 张数 | 已有 | 缺口/人 |
    |---|---|---|---|---|---|
    | low | 1–3 | avatar, full | 2 | 2 | 0 |
    
    ### TASK-D13  (2026-10-04 20:39:58)
    
    # TASK-D13 · 装扮规则链「随规则变」取证
    
    判据(68 号 D-13):同一房间换主人规则后,立绘装扮随之改变 | 改前/改后两张并排截图。
    
    ## 复跑命令(原始命令,可重放)
    
    渲染入口:`--render-panel npccard:<cid> --render-output <绝对路径>.png`。
    坑一:`--headless` 直跑 `save_png` 返回 **err=-1**(不出图),必须 `xvfb-run`。
    坑二:注入 JSON 的 mode 键必须是 `dress_tier.gd` 的 `MODE_INNER` 值 **`inner`**(不是 `interior`),否则静默回落世界默认。
    
    ```bash
    export HOME=/home/czdcc
    export KUSHAN_QA_CHAIN=l1          # 走 L1 主语链;改前留空
    export KUSHAN_QA_OWNER_JSON='{"inner":{"xiangfei_tier":5}}'   # 改后;改前不设
    export KUSHAN_DRESS_DUMP=1
    G="/mnt/data2/home_czdcc/贵霜帝国/godot/Godot_v4.7.2-stable_linux.x86_64"
    xvfb-run -a "$G" --path /home/czdcc/kushan_main -- \
      --render-panel npccard:10 --render-output /home/czdcc/kushan_main/evidence/TASK-D13/card_cid10_after.png
    ```
    
    同 cid=10(房间 6,rtype=interior)、同一张卡、同一次渲染入口,只改「场所主人规矩」注入。
    
    ## 自报原文(主证)
    
    改前(无注入):
    ```
    KUSHAN_DRESS cid=10 rtype=interior tier=4 source=world by=世界默认 qa=l1
    text=内室(家内/内院)(隐秘(深宫禁锢):蒙眼睛·勒嘴(封口)·双手在后(背缚 + 腕链)·双手合十被反绑)(依 世界默认)
    ```
    
    改后(注入 L1 主人规矩 tier=5):
    ```
    KUSHAN_DRESS cid=10 rtype=interior tier=5 source=owner by=本场所主人规矩 qa=l1
    text=内室(家内/内院)(顶点(图腾):完全禁锢组合:蒙眼 + 勒嘴 + 反绑 · 完整徽章:乳环 + 肚脐红宝石 + 双金链 + 束腰带)(依 本场所主人规矩)
    ```
    
    ⇒ **规则链层「随规则变」成立**:tier 4→5、source world→owner、by 与依据行、装束文本全部随注入改变。
    
    ## 未达部分(如实记,不遮掩)
    
    
    ### TASK-CINE-PACK  (2026-10-03 01:39:43)
    
    # B-078 资源包化:过场片移出 APK、按需下载(用户令 2026-10-02「视频丢到资源包」)
    
    ## 现状摸底(本轮实测)
    - 包内片源:`assets/cine/*.ogv`(15 个文件,仓内 41MB;APK 内约 **20MB**:`21_first.ogv` 4.5MB、`25_first` 4.4MB、`23_first` 3.7MB、`1_first` 3.1MB、`37_first` 2.8MB…)。
    - 取件机制**已具备一半**:`scripts/cine_lib.gd` 与立绘同款 —— `user://cine/` 缓存 + 在线清单 `user://cine/index.json` + **包内目录兜底**(`resolve()`:本地缓存 → 包内;网络归 net 层,本模块不碰网络)。
    - 导出排除表**已有先例**:`export_presets.cfg` 的 `exclude_filter` 里已排除 `assets/portraits/*`,**但没排 `assets/cine/*`** ⇒ 这是「移出 APK」那一步的落点。
    - **缺的那一半**:立绘有下载器(`scripts/room/portrait_fetch.gd`、`profile_view.gd`、`npc_panel.gd` 调 `PL.save_disk`),**过场片没有下载器**(`cine_player.gd` 只调 `CL.resolve()`)。
    - 托管落点现成:nw 站的 `/files/`(203 站点目录 `/mnt/data2/www/wwwroot/kushan-nw/files/` → 公网 `https://nw.tripee.cn/files/`、Tailscale `http://100.127.177.38:8088/files/`、局域网 `http://192.168.50.203:8088/files/`),镜像到云机 `/srv/kushan-files/`。
    - 相关参数:`cine.online_base`(**当前为空**)、`cine.ext=.ogv`、`cine.cache_max_mb=64`。
    
    ## 实施方案(按 107 号 S0→S8,一功能一文件)
    1. 新增 `scripts/room/cine_fetch.gd`(对照 `room/portrait_fetch.gd`):按 `cine.online_base` 拉 `index.json` → 按名拉 `.ogv` → `CL.save_index()`/`CL.save_disk()`;三基址候选(公网/Tailscale/局域网)照 `net_endpoints` 口径。
    2. `cine_player.gd` 在 `CL.resolve()` 返空且 `CL.index_has()` 为真时调取件(**只补取件调用,不改播放逻辑**)。
    3. 上传:`assets/cine/*.ogv` → `/files/cine/`(203 本地 + 云机镜像),并生成 `/files/cine/index.json`(名→大小/sha256)。
    4. `data/params.json` 置 `cine.online_base`(三链取一,仍受「外网口径待人拍板」约束 ⇒ 先写内网基址,公网基址随更新通道一并拍板)。
    5. `export_presets.cfg` 在 `exclude_filter` 追加 `assets/cine/*`。
    6. 出包(预期 APK ≈131.8MB → **≈112MB**,即减掉片源那约 20MB)+真机验:**无缓存时能下载并播放**、**断网时优雅降级**(不卡死、不报脚本错)、再次进入离线可播。
    7. 护栏:新增 `tools/verify_cine_pack.py` —— ① 排除表必须含 `assets/cine/*`;② 仓内片源与远端清单逐条对齐(数量/大小);③ `cine.online_base` 非空且与 `tools/hosts.sh` 口径一致。
    
    ## 本轮边界
    - **未动任何片源与排除表**:在「下载器」落地前把包内兜底删掉=过场直接失播 ⇒ 先补取件、再拆包,顺序不能反(本轮只立项+摸底,未见红)。
    
    ## 1.0.389 重出(排除表改走参数)
    
    ## 1.0.389 出包与真机(本轮收尾)
    - APK:**112721647 字节**(改前 1.0.388=131846522);包内 `\.ogv` 条目=**0**、`assets/cine/` 条目=0
    - 资源包:203 站点 5 片+index.json(18.6MB),云机镜像 6 文件;三链回读 200(公网/Tailscale/局域网)
    - 真机 `[Cine] got` 命中=0(清端上 `files/cine` 缓存后跑)
    - 护栏:`python3 tools/verify_cine_pack.py` ⇒ PASS 4 FAIL 0;全量 `run_verify_all.sh` ⇒ PASS 96 FAIL 0
    - **真因**:[1/6] 备份 preset+params、把签名库路径替换成本机路径、注入排除过滤表(版本=standard)
      已把 pack.edition 设为 standard,排除表 assets/portraits/*,evidence/*,docs/*,tasks/*,tools/*,data/private/*,edition/*,dist/*,addons/gut/*,kushan_db/*,backup_archive/*,tests/*,release/*,instances/*,_cl_/*,.venv/*,*.md,*.py,*.sh,*.sql,*.log,assets/cine/*
      已替换 keystore/release 与 keystore/debug
      exclude_filter=assets/portraits/*,evidence/*,docs/*,tasks/*,tools/*,data/private/*,edition/*,dist/*,addons/gut/*,kushan_db/*,backup_archive/*,tests/*,release/*,instances/*,_cl_/*,.venv/*,*.md,*.py,*.sh,*.sql,*.log,assets/cine/*(22 条)
      package/unique_name=com.kushan.dynasty
      应用名=贵霜帝国(出包后还原 project.godot)
    [2/6] 装配原生插件(真源 android_plugins/ → 构建模板 android/build/;幂等)
    
  • 版本 1.0.421 开发日志

    构建 1.0.421(code 421)· 2026-10-05 09:14:49 · sha256 56f3d4944cb5304c…

    下载:公网 · Tailscale · 局域网

    开发日志(本轮摘要)

    # 贵霜帝国 · 内网开发版 · 本轮开发记录
    
    生成时间:2026-10-05 09:09:20 | 本包:kushan-1.0.421.apk(1.0.421 / code 421,sha256 56f3d4944cb5304c…)
    
    ## 最近开发任务证据(evidence/*/readme.md,新→旧,取 10 份)
    
    ### TASK-ART-ROSTER  (2026-10-04 20:49:49)
    
    # 口径说明 · 323 人 NPC 相片槽位排产表
    
    生成时间:2026-10-04 20:49:49 | 仓库:`/mnt/data2/home_czdcc/kushan_main`
    
    本目录交付件:
    
    | 文件 | 用途 |
    |---|---|
    | `roster.md` | 人读排产表,按优先级分三节列出全部 323 人 |
    | `roster.csv` | 机器可读版,UTF-8 带表头,一 NPC 一行 |
    | `readme.md` | 本文件,口径说明 |
    | `_roster_data.json` | 生成中间件(全量行 + 汇总),供下游程序消费 |
    
    ## 1. 任务口径
    
    - 画风取 **甲案**:沿用犍陀罗写实油画(不换画风、不重炼风格)。
    - 老图 **646 张不重出**;本表只排「缺失槽位」的新增出图。
    - 覆盖全库 **323** 名 NPC(`characters.type='npc'`)。
    - **甲案的代价**(须知悉):老图沿用,与「本作自定画风」新线**不同源**,将来短片/场景图接起来会有风格落差;好处是零重出成本、已认过的脸不变、老图整份留档可回退。
    
    ## 2. 数据真源(全部只读;生成脚本不含任何硬编码数值)
    
    | 口径 | 真源 |
    |---|---|
    | 每人槽位/档位 | `data/npc_photo_slots.json`(`character_rank.tier` 落档结果,323 行) |
    | 槽位与张数规则 | `data/npc_performance.json` → `photos.count_by_tier`(low/mid/high = 2/3/5) |
    | 身份档位落档表 | `data/npc_rank_map.json`(title → tier 1–10) |
    | 装扮档位映射 | `data/params.json` → 键 `dress.tier_from_status` / `dress.max_tier` |
    | 归属房间/聚落、身份 | `kushan` 库:`characters` / `rooms` / `locations` |
    | 剧情挂靠 | `kushan` 库:`quest_chains.entry_npc_id` / `quest_templates.giver_id`(`active=1`) |
    | 现有老图 | `/srv/fileshare/kushan_photos/`(对外前缀 `/kushan_photos/`) |
    | 逐人出图 prompt | `data/npc_prompts_full.json`(323 条;出图时拼 `[风格块] + [本人 prompt] + [负向禁性表]`) |
    
    取库凭据一律走仓内唯一通道 `bash tools/query_kushan.sh "<SQL>"`——脚本**不连库、不内嵌口令**。
    
    ## 3. 槽位与张数规则(按身份档 → 2/3/5 张)
    
    | 带 | 身份档位 | 每人槽位 | 张数 | 已有 | 缺口/人 |
    |---|---|---|---|---|---|
    | low | 1–3 | avatar, full | 2 | 2 | 0 |
    
    ### TASK-D13  (2026-10-04 20:39:58)
    
    # TASK-D13 · 装扮规则链「随规则变」取证
    
    判据(68 号 D-13):同一房间换主人规则后,立绘装扮随之改变 | 改前/改后两张并排截图。
    
    ## 复跑命令(原始命令,可重放)
    
    渲染入口:`--render-panel npccard:<cid> --render-output <绝对路径>.png`。
    坑一:`--headless` 直跑 `save_png` 返回 **err=-1**(不出图),必须 `xvfb-run`。
    坑二:注入 JSON 的 mode 键必须是 `dress_tier.gd` 的 `MODE_INNER` 值 **`inner`**(不是 `interior`),否则静默回落世界默认。
    
    ```bash
    export HOME=/home/czdcc
    export KUSHAN_QA_CHAIN=l1          # 走 L1 主语链;改前留空
    export KUSHAN_QA_OWNER_JSON='{"inner":{"xiangfei_tier":5}}'   # 改后;改前不设
    export KUSHAN_DRESS_DUMP=1
    G="/mnt/data2/home_czdcc/贵霜帝国/godot/Godot_v4.7.2-stable_linux.x86_64"
    xvfb-run -a "$G" --path /home/czdcc/kushan_main -- \
      --render-panel npccard:10 --render-output /home/czdcc/kushan_main/evidence/TASK-D13/card_cid10_after.png
    ```
    
    同 cid=10(房间 6,rtype=interior)、同一张卡、同一次渲染入口,只改「场所主人规矩」注入。
    
    ## 自报原文(主证)
    
    改前(无注入):
    ```
    KUSHAN_DRESS cid=10 rtype=interior tier=4 source=world by=世界默认 qa=l1
    text=内室(家内/内院)(隐秘(深宫禁锢):蒙眼睛·勒嘴(封口)·双手在后(背缚 + 腕链)·双手合十被反绑)(依 世界默认)
    ```
    
    改后(注入 L1 主人规矩 tier=5):
    ```
    KUSHAN_DRESS cid=10 rtype=interior tier=5 source=owner by=本场所主人规矩 qa=l1
    text=内室(家内/内院)(顶点(图腾):完全禁锢组合:蒙眼 + 勒嘴 + 反绑 · 完整徽章:乳环 + 肚脐红宝石 + 双金链 + 束腰带)(依 本场所主人规矩)
    ```
    
    ⇒ **规则链层「随规则变」成立**:tier 4→5、source world→owner、by 与依据行、装束文本全部随注入改变。
    
    ## 未达部分(如实记,不遮掩)
    
    
    ### TASK-CINE-PACK  (2026-10-03 01:39:43)
    
    # B-078 资源包化:过场片移出 APK、按需下载(用户令 2026-10-02「视频丢到资源包」)
    
    ## 现状摸底(本轮实测)
    - 包内片源:`assets/cine/*.ogv`(15 个文件,仓内 41MB;APK 内约 **20MB**:`21_first.ogv` 4.5MB、`25_first` 4.4MB、`23_first` 3.7MB、`1_first` 3.1MB、`37_first` 2.8MB…)。
    - 取件机制**已具备一半**:`scripts/cine_lib.gd` 与立绘同款 —— `user://cine/` 缓存 + 在线清单 `user://cine/index.json` + **包内目录兜底**(`resolve()`:本地缓存 → 包内;网络归 net 层,本模块不碰网络)。
    - 导出排除表**已有先例**:`export_presets.cfg` 的 `exclude_filter` 里已排除 `assets/portraits/*`,**但没排 `assets/cine/*`** ⇒ 这是「移出 APK」那一步的落点。
    - **缺的那一半**:立绘有下载器(`scripts/room/portrait_fetch.gd`、`profile_view.gd`、`npc_panel.gd` 调 `PL.save_disk`),**过场片没有下载器**(`cine_player.gd` 只调 `CL.resolve()`)。
    - 托管落点现成:nw 站的 `/files/`(203 站点目录 `/mnt/data2/www/wwwroot/kushan-nw/files/` → 公网 `https://nw.tripee.cn/files/`、Tailscale `http://100.127.177.38:8088/files/`、局域网 `http://192.168.50.203:8088/files/`),镜像到云机 `/srv/kushan-files/`。
    - 相关参数:`cine.online_base`(**当前为空**)、`cine.ext=.ogv`、`cine.cache_max_mb=64`。
    
    ## 实施方案(按 107 号 S0→S8,一功能一文件)
    1. 新增 `scripts/room/cine_fetch.gd`(对照 `room/portrait_fetch.gd`):按 `cine.online_base` 拉 `index.json` → 按名拉 `.ogv` → `CL.save_index()`/`CL.save_disk()`;三基址候选(公网/Tailscale/局域网)照 `net_endpoints` 口径。
    2. `cine_player.gd` 在 `CL.resolve()` 返空且 `CL.index_has()` 为真时调取件(**只补取件调用,不改播放逻辑**)。
    3. 上传:`assets/cine/*.ogv` → `/files/cine/`(203 本地 + 云机镜像),并生成 `/files/cine/index.json`(名→大小/sha256)。
    4. `data/params.json` 置 `cine.online_base`(三链取一,仍受「外网口径待人拍板」约束 ⇒ 先写内网基址,公网基址随更新通道一并拍板)。
    5. `export_presets.cfg` 在 `exclude_filter` 追加 `assets/cine/*`。
    6. 出包(预期 APK ≈131.8MB → **≈112MB**,即减掉片源那约 20MB)+真机验:**无缓存时能下载并播放**、**断网时优雅降级**(不卡死、不报脚本错)、再次进入离线可播。
    7. 护栏:新增 `tools/verify_cine_pack.py` —— ① 排除表必须含 `assets/cine/*`;② 仓内片源与远端清单逐条对齐(数量/大小);③ `cine.online_base` 非空且与 `tools/hosts.sh` 口径一致。
    
    ## 本轮边界
    - **未动任何片源与排除表**:在「下载器」落地前把包内兜底删掉=过场直接失播 ⇒ 先补取件、再拆包,顺序不能反(本轮只立项+摸底,未见红)。
    
    ## 1.0.389 重出(排除表改走参数)
    
    ## 1.0.389 出包与真机(本轮收尾)
    - APK:**112721647 字节**(改前 1.0.388=131846522);包内 `\.ogv` 条目=**0**、`assets/cine/` 条目=0
    - 资源包:203 站点 5 片+index.json(18.6MB),云机镜像 6 文件;三链回读 200(公网/Tailscale/局域网)
    - 真机 `[Cine] got` 命中=0(清端上 `files/cine` 缓存后跑)
    - 护栏:`python3 tools/verify_cine_pack.py` ⇒ PASS 4 FAIL 0;全量 `run_verify_all.sh` ⇒ PASS 96 FAIL 0
    - **真因**:[1/6] 备份 preset+params、把签名库路径替换成本机路径、注入排除过滤表(版本=standard)
      已把 pack.edition 设为 standard,排除表 assets/portraits/*,evidence/*,docs/*,tasks/*,tools/*,data/private/*,edition/*,dist/*,addons/gut/*,kushan_db/*,backup_archive/*,tests/*,release/*,instances/*,_cl_/*,.venv/*,*.md,*.py,*.sh,*.sql,*.log,assets/cine/*
      已替换 keystore/release 与 keystore/debug
      exclude_filter=assets/portraits/*,evidence/*,docs/*,tasks/*,tools/*,data/private/*,edition/*,dist/*,addons/gut/*,kushan_db/*,backup_archive/*,tests/*,release/*,instances/*,_cl_/*,.venv/*,*.md,*.py,*.sh,*.sql,*.log,assets/cine/*(22 条)
      package/unique_name=com.kushan.dynasty
      应用名=贵霜帝国(出包后还原 project.godot)
    [2/6] 装配原生插件(真源 android_plugins/ → 构建模板 android/build/;幂等)
    
  • 版本 1.0.420 开发日志

    构建 1.0.420(code 420)· 2026-10-05 09:05:49 · sha256 6ac7dbafaa0e7add…

    下载:公网 · Tailscale · 局域网

    开发日志(本轮摘要)

    # 贵霜帝国 · 内网开发版 · 本轮开发记录
    
    生成时间:2026-10-05 09:00:27 | 本包:kushan-1.0.420.apk(1.0.420 / code 420,sha256 6ac7dbafaa0e7add…)
    
    ## 最近开发任务证据(evidence/*/readme.md,新→旧,取 10 份)
    
    ### TASK-ART-ROSTER  (2026-10-04 20:49:49)
    
    # 口径说明 · 323 人 NPC 相片槽位排产表
    
    生成时间:2026-10-04 20:49:49 | 仓库:`/mnt/data2/home_czdcc/kushan_main`
    
    本目录交付件:
    
    | 文件 | 用途 |
    |---|---|
    | `roster.md` | 人读排产表,按优先级分三节列出全部 323 人 |
    | `roster.csv` | 机器可读版,UTF-8 带表头,一 NPC 一行 |
    | `readme.md` | 本文件,口径说明 |
    | `_roster_data.json` | 生成中间件(全量行 + 汇总),供下游程序消费 |
    
    ## 1. 任务口径
    
    - 画风取 **甲案**:沿用犍陀罗写实油画(不换画风、不重炼风格)。
    - 老图 **646 张不重出**;本表只排「缺失槽位」的新增出图。
    - 覆盖全库 **323** 名 NPC(`characters.type='npc'`)。
    - **甲案的代价**(须知悉):老图沿用,与「本作自定画风」新线**不同源**,将来短片/场景图接起来会有风格落差;好处是零重出成本、已认过的脸不变、老图整份留档可回退。
    
    ## 2. 数据真源(全部只读;生成脚本不含任何硬编码数值)
    
    | 口径 | 真源 |
    |---|---|
    | 每人槽位/档位 | `data/npc_photo_slots.json`(`character_rank.tier` 落档结果,323 行) |
    | 槽位与张数规则 | `data/npc_performance.json` → `photos.count_by_tier`(low/mid/high = 2/3/5) |
    | 身份档位落档表 | `data/npc_rank_map.json`(title → tier 1–10) |
    | 装扮档位映射 | `data/params.json` → 键 `dress.tier_from_status` / `dress.max_tier` |
    | 归属房间/聚落、身份 | `kushan` 库:`characters` / `rooms` / `locations` |
    | 剧情挂靠 | `kushan` 库:`quest_chains.entry_npc_id` / `quest_templates.giver_id`(`active=1`) |
    | 现有老图 | `/srv/fileshare/kushan_photos/`(对外前缀 `/kushan_photos/`) |
    | 逐人出图 prompt | `data/npc_prompts_full.json`(323 条;出图时拼 `[风格块] + [本人 prompt] + [负向禁性表]`) |
    
    取库凭据一律走仓内唯一通道 `bash tools/query_kushan.sh "<SQL>"`——脚本**不连库、不内嵌口令**。
    
    ## 3. 槽位与张数规则(按身份档 → 2/3/5 张)
    
    | 带 | 身份档位 | 每人槽位 | 张数 | 已有 | 缺口/人 |
    |---|---|---|---|---|---|
    | low | 1–3 | avatar, full | 2 | 2 | 0 |
    
    ### TASK-D13  (2026-10-04 20:39:58)
    
    # TASK-D13 · 装扮规则链「随规则变」取证
    
    判据(68 号 D-13):同一房间换主人规则后,立绘装扮随之改变 | 改前/改后两张并排截图。
    
    ## 复跑命令(原始命令,可重放)
    
    渲染入口:`--render-panel npccard:<cid> --render-output <绝对路径>.png`。
    坑一:`--headless` 直跑 `save_png` 返回 **err=-1**(不出图),必须 `xvfb-run`。
    坑二:注入 JSON 的 mode 键必须是 `dress_tier.gd` 的 `MODE_INNER` 值 **`inner`**(不是 `interior`),否则静默回落世界默认。
    
    ```bash
    export HOME=/home/czdcc
    export KUSHAN_QA_CHAIN=l1          # 走 L1 主语链;改前留空
    export KUSHAN_QA_OWNER_JSON='{"inner":{"xiangfei_tier":5}}'   # 改后;改前不设
    export KUSHAN_DRESS_DUMP=1
    G="/mnt/data2/home_czdcc/贵霜帝国/godot/Godot_v4.7.2-stable_linux.x86_64"
    xvfb-run -a "$G" --path /home/czdcc/kushan_main -- \
      --render-panel npccard:10 --render-output /home/czdcc/kushan_main/evidence/TASK-D13/card_cid10_after.png
    ```
    
    同 cid=10(房间 6,rtype=interior)、同一张卡、同一次渲染入口,只改「场所主人规矩」注入。
    
    ## 自报原文(主证)
    
    改前(无注入):
    ```
    KUSHAN_DRESS cid=10 rtype=interior tier=4 source=world by=世界默认 qa=l1
    text=内室(家内/内院)(隐秘(深宫禁锢):蒙眼睛·勒嘴(封口)·双手在后(背缚 + 腕链)·双手合十被反绑)(依 世界默认)
    ```
    
    改后(注入 L1 主人规矩 tier=5):
    ```
    KUSHAN_DRESS cid=10 rtype=interior tier=5 source=owner by=本场所主人规矩 qa=l1
    text=内室(家内/内院)(顶点(图腾):完全禁锢组合:蒙眼 + 勒嘴 + 反绑 · 完整徽章:乳环 + 肚脐红宝石 + 双金链 + 束腰带)(依 本场所主人规矩)
    ```
    
    ⇒ **规则链层「随规则变」成立**:tier 4→5、source world→owner、by 与依据行、装束文本全部随注入改变。
    
    ## 未达部分(如实记,不遮掩)
    
    
    ### TASK-CINE-PACK  (2026-10-03 01:39:43)
    
    # B-078 资源包化:过场片移出 APK、按需下载(用户令 2026-10-02「视频丢到资源包」)
    
    ## 现状摸底(本轮实测)
    - 包内片源:`assets/cine/*.ogv`(15 个文件,仓内 41MB;APK 内约 **20MB**:`21_first.ogv` 4.5MB、`25_first` 4.4MB、`23_first` 3.7MB、`1_first` 3.1MB、`37_first` 2.8MB…)。
    - 取件机制**已具备一半**:`scripts/cine_lib.gd` 与立绘同款 —— `user://cine/` 缓存 + 在线清单 `user://cine/index.json` + **包内目录兜底**(`resolve()`:本地缓存 → 包内;网络归 net 层,本模块不碰网络)。
    - 导出排除表**已有先例**:`export_presets.cfg` 的 `exclude_filter` 里已排除 `assets/portraits/*`,**但没排 `assets/cine/*`** ⇒ 这是「移出 APK」那一步的落点。
    - **缺的那一半**:立绘有下载器(`scripts/room/portrait_fetch.gd`、`profile_view.gd`、`npc_panel.gd` 调 `PL.save_disk`),**过场片没有下载器**(`cine_player.gd` 只调 `CL.resolve()`)。
    - 托管落点现成:nw 站的 `/files/`(203 站点目录 `/mnt/data2/www/wwwroot/kushan-nw/files/` → 公网 `https://nw.tripee.cn/files/`、Tailscale `http://100.127.177.38:8088/files/`、局域网 `http://192.168.50.203:8088/files/`),镜像到云机 `/srv/kushan-files/`。
    - 相关参数:`cine.online_base`(**当前为空**)、`cine.ext=.ogv`、`cine.cache_max_mb=64`。
    
    ## 实施方案(按 107 号 S0→S8,一功能一文件)
    1. 新增 `scripts/room/cine_fetch.gd`(对照 `room/portrait_fetch.gd`):按 `cine.online_base` 拉 `index.json` → 按名拉 `.ogv` → `CL.save_index()`/`CL.save_disk()`;三基址候选(公网/Tailscale/局域网)照 `net_endpoints` 口径。
    2. `cine_player.gd` 在 `CL.resolve()` 返空且 `CL.index_has()` 为真时调取件(**只补取件调用,不改播放逻辑**)。
    3. 上传:`assets/cine/*.ogv` → `/files/cine/`(203 本地 + 云机镜像),并生成 `/files/cine/index.json`(名→大小/sha256)。
    4. `data/params.json` 置 `cine.online_base`(三链取一,仍受「外网口径待人拍板」约束 ⇒ 先写内网基址,公网基址随更新通道一并拍板)。
    5. `export_presets.cfg` 在 `exclude_filter` 追加 `assets/cine/*`。
    6. 出包(预期 APK ≈131.8MB → **≈112MB**,即减掉片源那约 20MB)+真机验:**无缓存时能下载并播放**、**断网时优雅降级**(不卡死、不报脚本错)、再次进入离线可播。
    7. 护栏:新增 `tools/verify_cine_pack.py` —— ① 排除表必须含 `assets/cine/*`;② 仓内片源与远端清单逐条对齐(数量/大小);③ `cine.online_base` 非空且与 `tools/hosts.sh` 口径一致。
    
    ## 本轮边界
    - **未动任何片源与排除表**:在「下载器」落地前把包内兜底删掉=过场直接失播 ⇒ 先补取件、再拆包,顺序不能反(本轮只立项+摸底,未见红)。
    
    ## 1.0.389 重出(排除表改走参数)
    
    ## 1.0.389 出包与真机(本轮收尾)
    - APK:**112721647 字节**(改前 1.0.388=131846522);包内 `\.ogv` 条目=**0**、`assets/cine/` 条目=0
    - 资源包:203 站点 5 片+index.json(18.6MB),云机镜像 6 文件;三链回读 200(公网/Tailscale/局域网)
    - 真机 `[Cine] got` 命中=0(清端上 `files/cine` 缓存后跑)
    - 护栏:`python3 tools/verify_cine_pack.py` ⇒ PASS 4 FAIL 0;全量 `run_verify_all.sh` ⇒ PASS 96 FAIL 0
    - **真因**:[1/6] 备份 preset+params、把签名库路径替换成本机路径、注入排除过滤表(版本=standard)
      已把 pack.edition 设为 standard,排除表 assets/portraits/*,evidence/*,docs/*,tasks/*,tools/*,data/private/*,edition/*,dist/*,addons/gut/*,kushan_db/*,backup_archive/*,tests/*,release/*,instances/*,_cl_/*,.venv/*,*.md,*.py,*.sh,*.sql,*.log,assets/cine/*
      已替换 keystore/release 与 keystore/debug
      exclude_filter=assets/portraits/*,evidence/*,docs/*,tasks/*,tools/*,data/private/*,edition/*,dist/*,addons/gut/*,kushan_db/*,backup_archive/*,tests/*,release/*,instances/*,_cl_/*,.venv/*,*.md,*.py,*.sh,*.sql,*.log,assets/cine/*(22 条)
      package/unique_name=com.kushan.dynasty
      应用名=贵霜帝国(出包后还原 project.godot)
    [2/6] 装配原生插件(真源 android_plugins/ → 构建模板 android/build/;幂等)
    
  • 版本 1.0.419 开发日志

    构建 1.0.419(code 419)· 2026-10-05 08:52:02 · sha256 b4490f74a1dcc014…

    下载:公网 · Tailscale · 局域网

    开发日志(本轮摘要)

    # 贵霜帝国 · 内网开发版 · 本轮开发记录
    
    生成时间:2026-10-05 08:46:45 | 本包:kushan-1.0.419.apk(1.0.419 / code 419,sha256 b4490f74a1dcc014…)
    
    ## 最近开发任务证据(evidence/*/readme.md,新→旧,取 10 份)
    
    ### TASK-ART-ROSTER  (2026-10-04 20:49:49)
    
    # 口径说明 · 323 人 NPC 相片槽位排产表
    
    生成时间:2026-10-04 20:49:49 | 仓库:`/mnt/data2/home_czdcc/kushan_main`
    
    本目录交付件:
    
    | 文件 | 用途 |
    |---|---|
    | `roster.md` | 人读排产表,按优先级分三节列出全部 323 人 |
    | `roster.csv` | 机器可读版,UTF-8 带表头,一 NPC 一行 |
    | `readme.md` | 本文件,口径说明 |
    | `_roster_data.json` | 生成中间件(全量行 + 汇总),供下游程序消费 |
    
    ## 1. 任务口径
    
    - 画风取 **甲案**:沿用犍陀罗写实油画(不换画风、不重炼风格)。
    - 老图 **646 张不重出**;本表只排「缺失槽位」的新增出图。
    - 覆盖全库 **323** 名 NPC(`characters.type='npc'`)。
    - **甲案的代价**(须知悉):老图沿用,与「本作自定画风」新线**不同源**,将来短片/场景图接起来会有风格落差;好处是零重出成本、已认过的脸不变、老图整份留档可回退。
    
    ## 2. 数据真源(全部只读;生成脚本不含任何硬编码数值)
    
    | 口径 | 真源 |
    |---|---|
    | 每人槽位/档位 | `data/npc_photo_slots.json`(`character_rank.tier` 落档结果,323 行) |
    | 槽位与张数规则 | `data/npc_performance.json` → `photos.count_by_tier`(low/mid/high = 2/3/5) |
    | 身份档位落档表 | `data/npc_rank_map.json`(title → tier 1–10) |
    | 装扮档位映射 | `data/params.json` → 键 `dress.tier_from_status` / `dress.max_tier` |
    | 归属房间/聚落、身份 | `kushan` 库:`characters` / `rooms` / `locations` |
    | 剧情挂靠 | `kushan` 库:`quest_chains.entry_npc_id` / `quest_templates.giver_id`(`active=1`) |
    | 现有老图 | `/srv/fileshare/kushan_photos/`(对外前缀 `/kushan_photos/`) |
    | 逐人出图 prompt | `data/npc_prompts_full.json`(323 条;出图时拼 `[风格块] + [本人 prompt] + [负向禁性表]`) |
    
    取库凭据一律走仓内唯一通道 `bash tools/query_kushan.sh "<SQL>"`——脚本**不连库、不内嵌口令**。
    
    ## 3. 槽位与张数规则(按身份档 → 2/3/5 张)
    
    | 带 | 身份档位 | 每人槽位 | 张数 | 已有 | 缺口/人 |
    |---|---|---|---|---|---|
    | low | 1–3 | avatar, full | 2 | 2 | 0 |
    
    ### TASK-D13  (2026-10-04 20:39:58)
    
    # TASK-D13 · 装扮规则链「随规则变」取证
    
    判据(68 号 D-13):同一房间换主人规则后,立绘装扮随之改变 | 改前/改后两张并排截图。
    
    ## 复跑命令(原始命令,可重放)
    
    渲染入口:`--render-panel npccard:<cid> --render-output <绝对路径>.png`。
    坑一:`--headless` 直跑 `save_png` 返回 **err=-1**(不出图),必须 `xvfb-run`。
    坑二:注入 JSON 的 mode 键必须是 `dress_tier.gd` 的 `MODE_INNER` 值 **`inner`**(不是 `interior`),否则静默回落世界默认。
    
    ```bash
    export HOME=/home/czdcc
    export KUSHAN_QA_CHAIN=l1          # 走 L1 主语链;改前留空
    export KUSHAN_QA_OWNER_JSON='{"inner":{"xiangfei_tier":5}}'   # 改后;改前不设
    export KUSHAN_DRESS_DUMP=1
    G="/mnt/data2/home_czdcc/贵霜帝国/godot/Godot_v4.7.2-stable_linux.x86_64"
    xvfb-run -a "$G" --path /home/czdcc/kushan_main -- \
      --render-panel npccard:10 --render-output /home/czdcc/kushan_main/evidence/TASK-D13/card_cid10_after.png
    ```
    
    同 cid=10(房间 6,rtype=interior)、同一张卡、同一次渲染入口,只改「场所主人规矩」注入。
    
    ## 自报原文(主证)
    
    改前(无注入):
    ```
    KUSHAN_DRESS cid=10 rtype=interior tier=4 source=world by=世界默认 qa=l1
    text=内室(家内/内院)(隐秘(深宫禁锢):蒙眼睛·勒嘴(封口)·双手在后(背缚 + 腕链)·双手合十被反绑)(依 世界默认)
    ```
    
    改后(注入 L1 主人规矩 tier=5):
    ```
    KUSHAN_DRESS cid=10 rtype=interior tier=5 source=owner by=本场所主人规矩 qa=l1
    text=内室(家内/内院)(顶点(图腾):完全禁锢组合:蒙眼 + 勒嘴 + 反绑 · 完整徽章:乳环 + 肚脐红宝石 + 双金链 + 束腰带)(依 本场所主人规矩)
    ```
    
    ⇒ **规则链层「随规则变」成立**:tier 4→5、source world→owner、by 与依据行、装束文本全部随注入改变。
    
    ## 未达部分(如实记,不遮掩)
    
    
    ### TASK-CINE-PACK  (2026-10-03 01:39:43)
    
    # B-078 资源包化:过场片移出 APK、按需下载(用户令 2026-10-02「视频丢到资源包」)
    
    ## 现状摸底(本轮实测)
    - 包内片源:`assets/cine/*.ogv`(15 个文件,仓内 41MB;APK 内约 **20MB**:`21_first.ogv` 4.5MB、`25_first` 4.4MB、`23_first` 3.7MB、`1_first` 3.1MB、`37_first` 2.8MB…)。
    - 取件机制**已具备一半**:`scripts/cine_lib.gd` 与立绘同款 —— `user://cine/` 缓存 + 在线清单 `user://cine/index.json` + **包内目录兜底**(`resolve()`:本地缓存 → 包内;网络归 net 层,本模块不碰网络)。
    - 导出排除表**已有先例**:`export_presets.cfg` 的 `exclude_filter` 里已排除 `assets/portraits/*`,**但没排 `assets/cine/*`** ⇒ 这是「移出 APK」那一步的落点。
    - **缺的那一半**:立绘有下载器(`scripts/room/portrait_fetch.gd`、`profile_view.gd`、`npc_panel.gd` 调 `PL.save_disk`),**过场片没有下载器**(`cine_player.gd` 只调 `CL.resolve()`)。
    - 托管落点现成:nw 站的 `/files/`(203 站点目录 `/mnt/data2/www/wwwroot/kushan-nw/files/` → 公网 `https://nw.tripee.cn/files/`、Tailscale `http://100.127.177.38:8088/files/`、局域网 `http://192.168.50.203:8088/files/`),镜像到云机 `/srv/kushan-files/`。
    - 相关参数:`cine.online_base`(**当前为空**)、`cine.ext=.ogv`、`cine.cache_max_mb=64`。
    
    ## 实施方案(按 107 号 S0→S8,一功能一文件)
    1. 新增 `scripts/room/cine_fetch.gd`(对照 `room/portrait_fetch.gd`):按 `cine.online_base` 拉 `index.json` → 按名拉 `.ogv` → `CL.save_index()`/`CL.save_disk()`;三基址候选(公网/Tailscale/局域网)照 `net_endpoints` 口径。
    2. `cine_player.gd` 在 `CL.resolve()` 返空且 `CL.index_has()` 为真时调取件(**只补取件调用,不改播放逻辑**)。
    3. 上传:`assets/cine/*.ogv` → `/files/cine/`(203 本地 + 云机镜像),并生成 `/files/cine/index.json`(名→大小/sha256)。
    4. `data/params.json` 置 `cine.online_base`(三链取一,仍受「外网口径待人拍板」约束 ⇒ 先写内网基址,公网基址随更新通道一并拍板)。
    5. `export_presets.cfg` 在 `exclude_filter` 追加 `assets/cine/*`。
    6. 出包(预期 APK ≈131.8MB → **≈112MB**,即减掉片源那约 20MB)+真机验:**无缓存时能下载并播放**、**断网时优雅降级**(不卡死、不报脚本错)、再次进入离线可播。
    7. 护栏:新增 `tools/verify_cine_pack.py` —— ① 排除表必须含 `assets/cine/*`;② 仓内片源与远端清单逐条对齐(数量/大小);③ `cine.online_base` 非空且与 `tools/hosts.sh` 口径一致。
    
    ## 本轮边界
    - **未动任何片源与排除表**:在「下载器」落地前把包内兜底删掉=过场直接失播 ⇒ 先补取件、再拆包,顺序不能反(本轮只立项+摸底,未见红)。
    
    ## 1.0.389 重出(排除表改走参数)
    
    ## 1.0.389 出包与真机(本轮收尾)
    - APK:**112721647 字节**(改前 1.0.388=131846522);包内 `\.ogv` 条目=**0**、`assets/cine/` 条目=0
    - 资源包:203 站点 5 片+index.json(18.6MB),云机镜像 6 文件;三链回读 200(公网/Tailscale/局域网)
    - 真机 `[Cine] got` 命中=0(清端上 `files/cine` 缓存后跑)
    - 护栏:`python3 tools/verify_cine_pack.py` ⇒ PASS 4 FAIL 0;全量 `run_verify_all.sh` ⇒ PASS 96 FAIL 0
    - **真因**:[1/6] 备份 preset+params、把签名库路径替换成本机路径、注入排除过滤表(版本=standard)
      已把 pack.edition 设为 standard,排除表 assets/portraits/*,evidence/*,docs/*,tasks/*,tools/*,data/private/*,edition/*,dist/*,addons/gut/*,kushan_db/*,backup_archive/*,tests/*,release/*,instances/*,_cl_/*,.venv/*,*.md,*.py,*.sh,*.sql,*.log,assets/cine/*
      已替换 keystore/release 与 keystore/debug
      exclude_filter=assets/portraits/*,evidence/*,docs/*,tasks/*,tools/*,data/private/*,edition/*,dist/*,addons/gut/*,kushan_db/*,backup_archive/*,tests/*,release/*,instances/*,_cl_/*,.venv/*,*.md,*.py,*.sh,*.sql,*.log,assets/cine/*(22 条)
      package/unique_name=com.kushan.dynasty
      应用名=贵霜帝国(出包后还原 project.godot)
    [2/6] 装配原生插件(真源 android_plugins/ → 构建模板 android/build/;幂等)
    
  • 版本 1.0.418 开发日志

    构建 1.0.418(code 418)· 2026-10-05 08:27:11 · sha256 6141e2cadb54e107…

    下载:公网 · Tailscale · 局域网

    开发日志(本轮摘要)

    # 贵霜帝国 · 内网开发版 · 本轮开发记录
    
    生成时间:2026-10-05 08:22:15 | 本包:kushan-1.0.418.apk(1.0.418 / code 418,sha256 6141e2cadb54e107…)
    
    ## 最近开发任务证据(evidence/*/readme.md,新→旧,取 10 份)
    
    ### TASK-ART-ROSTER  (2026-10-04 20:49:49)
    
    # 口径说明 · 323 人 NPC 相片槽位排产表
    
    生成时间:2026-10-04 20:49:49 | 仓库:`/mnt/data2/home_czdcc/kushan_main`
    
    本目录交付件:
    
    | 文件 | 用途 |
    |---|---|
    | `roster.md` | 人读排产表,按优先级分三节列出全部 323 人 |
    | `roster.csv` | 机器可读版,UTF-8 带表头,一 NPC 一行 |
    | `readme.md` | 本文件,口径说明 |
    | `_roster_data.json` | 生成中间件(全量行 + 汇总),供下游程序消费 |
    
    ## 1. 任务口径
    
    - 画风取 **甲案**:沿用犍陀罗写实油画(不换画风、不重炼风格)。
    - 老图 **646 张不重出**;本表只排「缺失槽位」的新增出图。
    - 覆盖全库 **323** 名 NPC(`characters.type='npc'`)。
    - **甲案的代价**(须知悉):老图沿用,与「本作自定画风」新线**不同源**,将来短片/场景图接起来会有风格落差;好处是零重出成本、已认过的脸不变、老图整份留档可回退。
    
    ## 2. 数据真源(全部只读;生成脚本不含任何硬编码数值)
    
    | 口径 | 真源 |
    |---|---|
    | 每人槽位/档位 | `data/npc_photo_slots.json`(`character_rank.tier` 落档结果,323 行) |
    | 槽位与张数规则 | `data/npc_performance.json` → `photos.count_by_tier`(low/mid/high = 2/3/5) |
    | 身份档位落档表 | `data/npc_rank_map.json`(title → tier 1–10) |
    | 装扮档位映射 | `data/params.json` → 键 `dress.tier_from_status` / `dress.max_tier` |
    | 归属房间/聚落、身份 | `kushan` 库:`characters` / `rooms` / `locations` |
    | 剧情挂靠 | `kushan` 库:`quest_chains.entry_npc_id` / `quest_templates.giver_id`(`active=1`) |
    | 现有老图 | `/srv/fileshare/kushan_photos/`(对外前缀 `/kushan_photos/`) |
    | 逐人出图 prompt | `data/npc_prompts_full.json`(323 条;出图时拼 `[风格块] + [本人 prompt] + [负向禁性表]`) |
    
    取库凭据一律走仓内唯一通道 `bash tools/query_kushan.sh "<SQL>"`——脚本**不连库、不内嵌口令**。
    
    ## 3. 槽位与张数规则(按身份档 → 2/3/5 张)
    
    | 带 | 身份档位 | 每人槽位 | 张数 | 已有 | 缺口/人 |
    |---|---|---|---|---|---|
    | low | 1–3 | avatar, full | 2 | 2 | 0 |
    
    ### TASK-D13  (2026-10-04 20:39:58)
    
    # TASK-D13 · 装扮规则链「随规则变」取证
    
    判据(68 号 D-13):同一房间换主人规则后,立绘装扮随之改变 | 改前/改后两张并排截图。
    
    ## 复跑命令(原始命令,可重放)
    
    渲染入口:`--render-panel npccard:<cid> --render-output <绝对路径>.png`。
    坑一:`--headless` 直跑 `save_png` 返回 **err=-1**(不出图),必须 `xvfb-run`。
    坑二:注入 JSON 的 mode 键必须是 `dress_tier.gd` 的 `MODE_INNER` 值 **`inner`**(不是 `interior`),否则静默回落世界默认。
    
    ```bash
    export HOME=/home/czdcc
    export KUSHAN_QA_CHAIN=l1          # 走 L1 主语链;改前留空
    export KUSHAN_QA_OWNER_JSON='{"inner":{"xiangfei_tier":5}}'   # 改后;改前不设
    export KUSHAN_DRESS_DUMP=1
    G="/mnt/data2/home_czdcc/贵霜帝国/godot/Godot_v4.7.2-stable_linux.x86_64"
    xvfb-run -a "$G" --path /home/czdcc/kushan_main -- \
      --render-panel npccard:10 --render-output /home/czdcc/kushan_main/evidence/TASK-D13/card_cid10_after.png
    ```
    
    同 cid=10(房间 6,rtype=interior)、同一张卡、同一次渲染入口,只改「场所主人规矩」注入。
    
    ## 自报原文(主证)
    
    改前(无注入):
    ```
    KUSHAN_DRESS cid=10 rtype=interior tier=4 source=world by=世界默认 qa=l1
    text=内室(家内/内院)(隐秘(深宫禁锢):蒙眼睛·勒嘴(封口)·双手在后(背缚 + 腕链)·双手合十被反绑)(依 世界默认)
    ```
    
    改后(注入 L1 主人规矩 tier=5):
    ```
    KUSHAN_DRESS cid=10 rtype=interior tier=5 source=owner by=本场所主人规矩 qa=l1
    text=内室(家内/内院)(顶点(图腾):完全禁锢组合:蒙眼 + 勒嘴 + 反绑 · 完整徽章:乳环 + 肚脐红宝石 + 双金链 + 束腰带)(依 本场所主人规矩)
    ```
    
    ⇒ **规则链层「随规则变」成立**:tier 4→5、source world→owner、by 与依据行、装束文本全部随注入改变。
    
    ## 未达部分(如实记,不遮掩)
    
    
    ### TASK-CINE-PACK  (2026-10-03 01:39:43)
    
    # B-078 资源包化:过场片移出 APK、按需下载(用户令 2026-10-02「视频丢到资源包」)
    
    ## 现状摸底(本轮实测)
    - 包内片源:`assets/cine/*.ogv`(15 个文件,仓内 41MB;APK 内约 **20MB**:`21_first.ogv` 4.5MB、`25_first` 4.4MB、`23_first` 3.7MB、`1_first` 3.1MB、`37_first` 2.8MB…)。
    - 取件机制**已具备一半**:`scripts/cine_lib.gd` 与立绘同款 —— `user://cine/` 缓存 + 在线清单 `user://cine/index.json` + **包内目录兜底**(`resolve()`:本地缓存 → 包内;网络归 net 层,本模块不碰网络)。
    - 导出排除表**已有先例**:`export_presets.cfg` 的 `exclude_filter` 里已排除 `assets/portraits/*`,**但没排 `assets/cine/*`** ⇒ 这是「移出 APK」那一步的落点。
    - **缺的那一半**:立绘有下载器(`scripts/room/portrait_fetch.gd`、`profile_view.gd`、`npc_panel.gd` 调 `PL.save_disk`),**过场片没有下载器**(`cine_player.gd` 只调 `CL.resolve()`)。
    - 托管落点现成:nw 站的 `/files/`(203 站点目录 `/mnt/data2/www/wwwroot/kushan-nw/files/` → 公网 `https://nw.tripee.cn/files/`、Tailscale `http://100.127.177.38:8088/files/`、局域网 `http://192.168.50.203:8088/files/`),镜像到云机 `/srv/kushan-files/`。
    - 相关参数:`cine.online_base`(**当前为空**)、`cine.ext=.ogv`、`cine.cache_max_mb=64`。
    
    ## 实施方案(按 107 号 S0→S8,一功能一文件)
    1. 新增 `scripts/room/cine_fetch.gd`(对照 `room/portrait_fetch.gd`):按 `cine.online_base` 拉 `index.json` → 按名拉 `.ogv` → `CL.save_index()`/`CL.save_disk()`;三基址候选(公网/Tailscale/局域网)照 `net_endpoints` 口径。
    2. `cine_player.gd` 在 `CL.resolve()` 返空且 `CL.index_has()` 为真时调取件(**只补取件调用,不改播放逻辑**)。
    3. 上传:`assets/cine/*.ogv` → `/files/cine/`(203 本地 + 云机镜像),并生成 `/files/cine/index.json`(名→大小/sha256)。
    4. `data/params.json` 置 `cine.online_base`(三链取一,仍受「外网口径待人拍板」约束 ⇒ 先写内网基址,公网基址随更新通道一并拍板)。
    5. `export_presets.cfg` 在 `exclude_filter` 追加 `assets/cine/*`。
    6. 出包(预期 APK ≈131.8MB → **≈112MB**,即减掉片源那约 20MB)+真机验:**无缓存时能下载并播放**、**断网时优雅降级**(不卡死、不报脚本错)、再次进入离线可播。
    7. 护栏:新增 `tools/verify_cine_pack.py` —— ① 排除表必须含 `assets/cine/*`;② 仓内片源与远端清单逐条对齐(数量/大小);③ `cine.online_base` 非空且与 `tools/hosts.sh` 口径一致。
    
    ## 本轮边界
    - **未动任何片源与排除表**:在「下载器」落地前把包内兜底删掉=过场直接失播 ⇒ 先补取件、再拆包,顺序不能反(本轮只立项+摸底,未见红)。
    
    ## 1.0.389 重出(排除表改走参数)
    
    ## 1.0.389 出包与真机(本轮收尾)
    - APK:**112721647 字节**(改前 1.0.388=131846522);包内 `\.ogv` 条目=**0**、`assets/cine/` 条目=0
    - 资源包:203 站点 5 片+index.json(18.6MB),云机镜像 6 文件;三链回读 200(公网/Tailscale/局域网)
    - 真机 `[Cine] got` 命中=0(清端上 `files/cine` 缓存后跑)
    - 护栏:`python3 tools/verify_cine_pack.py` ⇒ PASS 4 FAIL 0;全量 `run_verify_all.sh` ⇒ PASS 96 FAIL 0
    - **真因**:[1/6] 备份 preset+params、把签名库路径替换成本机路径、注入排除过滤表(版本=standard)
      已把 pack.edition 设为 standard,排除表 assets/portraits/*,evidence/*,docs/*,tasks/*,tools/*,data/private/*,edition/*,dist/*,addons/gut/*,kushan_db/*,backup_archive/*,tests/*,release/*,instances/*,_cl_/*,.venv/*,*.md,*.py,*.sh,*.sql,*.log,assets/cine/*
      已替换 keystore/release 与 keystore/debug
      exclude_filter=assets/portraits/*,evidence/*,docs/*,tasks/*,tools/*,data/private/*,edition/*,dist/*,addons/gut/*,kushan_db/*,backup_archive/*,tests/*,release/*,instances/*,_cl_/*,.venv/*,*.md,*.py,*.sh,*.sql,*.log,assets/cine/*(22 条)
      package/unique_name=com.kushan.dynasty
      应用名=贵霜帝国(出包后还原 project.godot)
    [2/6] 装配原生插件(真源 android_plugins/ → 构建模板 android/build/;幂等)
    
  • 版本 1.0.417 开发日志

    构建 1.0.417(code 417)· 2026-10-05 08:12:58 · sha256 2502000c66846358…

    下载:公网 · Tailscale · 局域网

    开发日志(本轮摘要)

    # 贵霜帝国 · 内网开发版 · 本轮开发记录
    
    生成时间:2026-10-05 08:07:43 | 本包:kushan-1.0.417.apk(1.0.417 / code 417,sha256 2502000c66846358…)
    
    ## 最近开发任务证据(evidence/*/readme.md,新→旧,取 10 份)
    
    ### TASK-ART-ROSTER  (2026-10-04 20:49:49)
    
    # 口径说明 · 323 人 NPC 相片槽位排产表
    
    生成时间:2026-10-04 20:49:49 | 仓库:`/mnt/data2/home_czdcc/kushan_main`
    
    本目录交付件:
    
    | 文件 | 用途 |
    |---|---|
    | `roster.md` | 人读排产表,按优先级分三节列出全部 323 人 |
    | `roster.csv` | 机器可读版,UTF-8 带表头,一 NPC 一行 |
    | `readme.md` | 本文件,口径说明 |
    | `_roster_data.json` | 生成中间件(全量行 + 汇总),供下游程序消费 |
    
    ## 1. 任务口径
    
    - 画风取 **甲案**:沿用犍陀罗写实油画(不换画风、不重炼风格)。
    - 老图 **646 张不重出**;本表只排「缺失槽位」的新增出图。
    - 覆盖全库 **323** 名 NPC(`characters.type='npc'`)。
    - **甲案的代价**(须知悉):老图沿用,与「本作自定画风」新线**不同源**,将来短片/场景图接起来会有风格落差;好处是零重出成本、已认过的脸不变、老图整份留档可回退。
    
    ## 2. 数据真源(全部只读;生成脚本不含任何硬编码数值)
    
    | 口径 | 真源 |
    |---|---|
    | 每人槽位/档位 | `data/npc_photo_slots.json`(`character_rank.tier` 落档结果,323 行) |
    | 槽位与张数规则 | `data/npc_performance.json` → `photos.count_by_tier`(low/mid/high = 2/3/5) |
    | 身份档位落档表 | `data/npc_rank_map.json`(title → tier 1–10) |
    | 装扮档位映射 | `data/params.json` → 键 `dress.tier_from_status` / `dress.max_tier` |
    | 归属房间/聚落、身份 | `kushan` 库:`characters` / `rooms` / `locations` |
    | 剧情挂靠 | `kushan` 库:`quest_chains.entry_npc_id` / `quest_templates.giver_id`(`active=1`) |
    | 现有老图 | `/srv/fileshare/kushan_photos/`(对外前缀 `/kushan_photos/`) |
    | 逐人出图 prompt | `data/npc_prompts_full.json`(323 条;出图时拼 `[风格块] + [本人 prompt] + [负向禁性表]`) |
    
    取库凭据一律走仓内唯一通道 `bash tools/query_kushan.sh "<SQL>"`——脚本**不连库、不内嵌口令**。
    
    ## 3. 槽位与张数规则(按身份档 → 2/3/5 张)
    
    | 带 | 身份档位 | 每人槽位 | 张数 | 已有 | 缺口/人 |
    |---|---|---|---|---|---|
    | low | 1–3 | avatar, full | 2 | 2 | 0 |
    
    ### TASK-D13  (2026-10-04 20:39:58)
    
    # TASK-D13 · 装扮规则链「随规则变」取证
    
    判据(68 号 D-13):同一房间换主人规则后,立绘装扮随之改变 | 改前/改后两张并排截图。
    
    ## 复跑命令(原始命令,可重放)
    
    渲染入口:`--render-panel npccard:<cid> --render-output <绝对路径>.png`。
    坑一:`--headless` 直跑 `save_png` 返回 **err=-1**(不出图),必须 `xvfb-run`。
    坑二:注入 JSON 的 mode 键必须是 `dress_tier.gd` 的 `MODE_INNER` 值 **`inner`**(不是 `interior`),否则静默回落世界默认。
    
    ```bash
    export HOME=/home/czdcc
    export KUSHAN_QA_CHAIN=l1          # 走 L1 主语链;改前留空
    export KUSHAN_QA_OWNER_JSON='{"inner":{"xiangfei_tier":5}}'   # 改后;改前不设
    export KUSHAN_DRESS_DUMP=1
    G="/mnt/data2/home_czdcc/贵霜帝国/godot/Godot_v4.7.2-stable_linux.x86_64"
    xvfb-run -a "$G" --path /home/czdcc/kushan_main -- \
      --render-panel npccard:10 --render-output /home/czdcc/kushan_main/evidence/TASK-D13/card_cid10_after.png
    ```
    
    同 cid=10(房间 6,rtype=interior)、同一张卡、同一次渲染入口,只改「场所主人规矩」注入。
    
    ## 自报原文(主证)
    
    改前(无注入):
    ```
    KUSHAN_DRESS cid=10 rtype=interior tier=4 source=world by=世界默认 qa=l1
    text=内室(家内/内院)(隐秘(深宫禁锢):蒙眼睛·勒嘴(封口)·双手在后(背缚 + 腕链)·双手合十被反绑)(依 世界默认)
    ```
    
    改后(注入 L1 主人规矩 tier=5):
    ```
    KUSHAN_DRESS cid=10 rtype=interior tier=5 source=owner by=本场所主人规矩 qa=l1
    text=内室(家内/内院)(顶点(图腾):完全禁锢组合:蒙眼 + 勒嘴 + 反绑 · 完整徽章:乳环 + 肚脐红宝石 + 双金链 + 束腰带)(依 本场所主人规矩)
    ```
    
    ⇒ **规则链层「随规则变」成立**:tier 4→5、source world→owner、by 与依据行、装束文本全部随注入改变。
    
    ## 未达部分(如实记,不遮掩)
    
    
    ### TASK-CINE-PACK  (2026-10-03 01:39:43)
    
    # B-078 资源包化:过场片移出 APK、按需下载(用户令 2026-10-02「视频丢到资源包」)
    
    ## 现状摸底(本轮实测)
    - 包内片源:`assets/cine/*.ogv`(15 个文件,仓内 41MB;APK 内约 **20MB**:`21_first.ogv` 4.5MB、`25_first` 4.4MB、`23_first` 3.7MB、`1_first` 3.1MB、`37_first` 2.8MB…)。
    - 取件机制**已具备一半**:`scripts/cine_lib.gd` 与立绘同款 —— `user://cine/` 缓存 + 在线清单 `user://cine/index.json` + **包内目录兜底**(`resolve()`:本地缓存 → 包内;网络归 net 层,本模块不碰网络)。
    - 导出排除表**已有先例**:`export_presets.cfg` 的 `exclude_filter` 里已排除 `assets/portraits/*`,**但没排 `assets/cine/*`** ⇒ 这是「移出 APK」那一步的落点。
    - **缺的那一半**:立绘有下载器(`scripts/room/portrait_fetch.gd`、`profile_view.gd`、`npc_panel.gd` 调 `PL.save_disk`),**过场片没有下载器**(`cine_player.gd` 只调 `CL.resolve()`)。
    - 托管落点现成:nw 站的 `/files/`(203 站点目录 `/mnt/data2/www/wwwroot/kushan-nw/files/` → 公网 `https://nw.tripee.cn/files/`、Tailscale `http://100.127.177.38:8088/files/`、局域网 `http://192.168.50.203:8088/files/`),镜像到云机 `/srv/kushan-files/`。
    - 相关参数:`cine.online_base`(**当前为空**)、`cine.ext=.ogv`、`cine.cache_max_mb=64`。
    
    ## 实施方案(按 107 号 S0→S8,一功能一文件)
    1. 新增 `scripts/room/cine_fetch.gd`(对照 `room/portrait_fetch.gd`):按 `cine.online_base` 拉 `index.json` → 按名拉 `.ogv` → `CL.save_index()`/`CL.save_disk()`;三基址候选(公网/Tailscale/局域网)照 `net_endpoints` 口径。
    2. `cine_player.gd` 在 `CL.resolve()` 返空且 `CL.index_has()` 为真时调取件(**只补取件调用,不改播放逻辑**)。
    3. 上传:`assets/cine/*.ogv` → `/files/cine/`(203 本地 + 云机镜像),并生成 `/files/cine/index.json`(名→大小/sha256)。
    4. `data/params.json` 置 `cine.online_base`(三链取一,仍受「外网口径待人拍板」约束 ⇒ 先写内网基址,公网基址随更新通道一并拍板)。
    5. `export_presets.cfg` 在 `exclude_filter` 追加 `assets/cine/*`。
    6. 出包(预期 APK ≈131.8MB → **≈112MB**,即减掉片源那约 20MB)+真机验:**无缓存时能下载并播放**、**断网时优雅降级**(不卡死、不报脚本错)、再次进入离线可播。
    7. 护栏:新增 `tools/verify_cine_pack.py` —— ① 排除表必须含 `assets/cine/*`;② 仓内片源与远端清单逐条对齐(数量/大小);③ `cine.online_base` 非空且与 `tools/hosts.sh` 口径一致。
    
    ## 本轮边界
    - **未动任何片源与排除表**:在「下载器」落地前把包内兜底删掉=过场直接失播 ⇒ 先补取件、再拆包,顺序不能反(本轮只立项+摸底,未见红)。
    
    ## 1.0.389 重出(排除表改走参数)
    
    ## 1.0.389 出包与真机(本轮收尾)
    - APK:**112721647 字节**(改前 1.0.388=131846522);包内 `\.ogv` 条目=**0**、`assets/cine/` 条目=0
    - 资源包:203 站点 5 片+index.json(18.6MB),云机镜像 6 文件;三链回读 200(公网/Tailscale/局域网)
    - 真机 `[Cine] got` 命中=0(清端上 `files/cine` 缓存后跑)
    - 护栏:`python3 tools/verify_cine_pack.py` ⇒ PASS 4 FAIL 0;全量 `run_verify_all.sh` ⇒ PASS 96 FAIL 0
    - **真因**:[1/6] 备份 preset+params、把签名库路径替换成本机路径、注入排除过滤表(版本=standard)
      已把 pack.edition 设为 standard,排除表 assets/portraits/*,evidence/*,docs/*,tasks/*,tools/*,data/private/*,edition/*,dist/*,addons/gut/*,kushan_db/*,backup_archive/*,tests/*,release/*,instances/*,_cl_/*,.venv/*,*.md,*.py,*.sh,*.sql,*.log,assets/cine/*
      已替换 keystore/release 与 keystore/debug
      exclude_filter=assets/portraits/*,evidence/*,docs/*,tasks/*,tools/*,data/private/*,edition/*,dist/*,addons/gut/*,kushan_db/*,backup_archive/*,tests/*,release/*,instances/*,_cl_/*,.venv/*,*.md,*.py,*.sh,*.sql,*.log,assets/cine/*(22 条)
      package/unique_name=com.kushan.dynasty
      应用名=贵霜帝国(出包后还原 project.godot)
    [2/6] 装配原生插件(真源 android_plugins/ → 构建模板 android/build/;幂等)
    
  • 版本 1.0.416 开发日志

    构建 1.0.416(code 416)· 2026-10-05 07:37:05 · sha256 0a7c3d0cb76eb190…

    下载:公网 · Tailscale · 局域网

    开发日志(本轮摘要)

    # 贵霜帝国 · 内网开发版 · 本轮开发记录
    
    生成时间:2026-10-05 07:31:46 | 本包:kushan-1.0.416.apk(1.0.416 / code 416,sha256 0a7c3d0cb76eb190…)
    
    ## 最近开发任务证据(evidence/*/readme.md,新→旧,取 10 份)
    
    ### TASK-ART-ROSTER  (2026-10-04 20:49:49)
    
    # 口径说明 · 323 人 NPC 相片槽位排产表
    
    生成时间:2026-10-04 20:49:49 | 仓库:`/mnt/data2/home_czdcc/kushan_main`
    
    本目录交付件:
    
    | 文件 | 用途 |
    |---|---|
    | `roster.md` | 人读排产表,按优先级分三节列出全部 323 人 |
    | `roster.csv` | 机器可读版,UTF-8 带表头,一 NPC 一行 |
    | `readme.md` | 本文件,口径说明 |
    | `_roster_data.json` | 生成中间件(全量行 + 汇总),供下游程序消费 |
    
    ## 1. 任务口径
    
    - 画风取 **甲案**:沿用犍陀罗写实油画(不换画风、不重炼风格)。
    - 老图 **646 张不重出**;本表只排「缺失槽位」的新增出图。
    - 覆盖全库 **323** 名 NPC(`characters.type='npc'`)。
    - **甲案的代价**(须知悉):老图沿用,与「本作自定画风」新线**不同源**,将来短片/场景图接起来会有风格落差;好处是零重出成本、已认过的脸不变、老图整份留档可回退。
    
    ## 2. 数据真源(全部只读;生成脚本不含任何硬编码数值)
    
    | 口径 | 真源 |
    |---|---|
    | 每人槽位/档位 | `data/npc_photo_slots.json`(`character_rank.tier` 落档结果,323 行) |
    | 槽位与张数规则 | `data/npc_performance.json` → `photos.count_by_tier`(low/mid/high = 2/3/5) |
    | 身份档位落档表 | `data/npc_rank_map.json`(title → tier 1–10) |
    | 装扮档位映射 | `data/params.json` → 键 `dress.tier_from_status` / `dress.max_tier` |
    | 归属房间/聚落、身份 | `kushan` 库:`characters` / `rooms` / `locations` |
    | 剧情挂靠 | `kushan` 库:`quest_chains.entry_npc_id` / `quest_templates.giver_id`(`active=1`) |
    | 现有老图 | `/srv/fileshare/kushan_photos/`(对外前缀 `/kushan_photos/`) |
    | 逐人出图 prompt | `data/npc_prompts_full.json`(323 条;出图时拼 `[风格块] + [本人 prompt] + [负向禁性表]`) |
    
    取库凭据一律走仓内唯一通道 `bash tools/query_kushan.sh "<SQL>"`——脚本**不连库、不内嵌口令**。
    
    ## 3. 槽位与张数规则(按身份档 → 2/3/5 张)
    
    | 带 | 身份档位 | 每人槽位 | 张数 | 已有 | 缺口/人 |
    |---|---|---|---|---|---|
    | low | 1–3 | avatar, full | 2 | 2 | 0 |
    
    ### TASK-D13  (2026-10-04 20:39:58)
    
    # TASK-D13 · 装扮规则链「随规则变」取证
    
    判据(68 号 D-13):同一房间换主人规则后,立绘装扮随之改变 | 改前/改后两张并排截图。
    
    ## 复跑命令(原始命令,可重放)
    
    渲染入口:`--render-panel npccard:<cid> --render-output <绝对路径>.png`。
    坑一:`--headless` 直跑 `save_png` 返回 **err=-1**(不出图),必须 `xvfb-run`。
    坑二:注入 JSON 的 mode 键必须是 `dress_tier.gd` 的 `MODE_INNER` 值 **`inner`**(不是 `interior`),否则静默回落世界默认。
    
    ```bash
    export HOME=/home/czdcc
    export KUSHAN_QA_CHAIN=l1          # 走 L1 主语链;改前留空
    export KUSHAN_QA_OWNER_JSON='{"inner":{"xiangfei_tier":5}}'   # 改后;改前不设
    export KUSHAN_DRESS_DUMP=1
    G="/mnt/data2/home_czdcc/贵霜帝国/godot/Godot_v4.7.2-stable_linux.x86_64"
    xvfb-run -a "$G" --path /home/czdcc/kushan_main -- \
      --render-panel npccard:10 --render-output /home/czdcc/kushan_main/evidence/TASK-D13/card_cid10_after.png
    ```
    
    同 cid=10(房间 6,rtype=interior)、同一张卡、同一次渲染入口,只改「场所主人规矩」注入。
    
    ## 自报原文(主证)
    
    改前(无注入):
    ```
    KUSHAN_DRESS cid=10 rtype=interior tier=4 source=world by=世界默认 qa=l1
    text=内室(家内/内院)(隐秘(深宫禁锢):蒙眼睛·勒嘴(封口)·双手在后(背缚 + 腕链)·双手合十被反绑)(依 世界默认)
    ```
    
    改后(注入 L1 主人规矩 tier=5):
    ```
    KUSHAN_DRESS cid=10 rtype=interior tier=5 source=owner by=本场所主人规矩 qa=l1
    text=内室(家内/内院)(顶点(图腾):完全禁锢组合:蒙眼 + 勒嘴 + 反绑 · 完整徽章:乳环 + 肚脐红宝石 + 双金链 + 束腰带)(依 本场所主人规矩)
    ```
    
    ⇒ **规则链层「随规则变」成立**:tier 4→5、source world→owner、by 与依据行、装束文本全部随注入改变。
    
    ## 未达部分(如实记,不遮掩)
    
    
    ### TASK-CINE-PACK  (2026-10-03 01:39:43)
    
    # B-078 资源包化:过场片移出 APK、按需下载(用户令 2026-10-02「视频丢到资源包」)
    
    ## 现状摸底(本轮实测)
    - 包内片源:`assets/cine/*.ogv`(15 个文件,仓内 41MB;APK 内约 **20MB**:`21_first.ogv` 4.5MB、`25_first` 4.4MB、`23_first` 3.7MB、`1_first` 3.1MB、`37_first` 2.8MB…)。
    - 取件机制**已具备一半**:`scripts/cine_lib.gd` 与立绘同款 —— `user://cine/` 缓存 + 在线清单 `user://cine/index.json` + **包内目录兜底**(`resolve()`:本地缓存 → 包内;网络归 net 层,本模块不碰网络)。
    - 导出排除表**已有先例**:`export_presets.cfg` 的 `exclude_filter` 里已排除 `assets/portraits/*`,**但没排 `assets/cine/*`** ⇒ 这是「移出 APK」那一步的落点。
    - **缺的那一半**:立绘有下载器(`scripts/room/portrait_fetch.gd`、`profile_view.gd`、`npc_panel.gd` 调 `PL.save_disk`),**过场片没有下载器**(`cine_player.gd` 只调 `CL.resolve()`)。
    - 托管落点现成:nw 站的 `/files/`(203 站点目录 `/mnt/data2/www/wwwroot/kushan-nw/files/` → 公网 `https://nw.tripee.cn/files/`、Tailscale `http://100.127.177.38:8088/files/`、局域网 `http://192.168.50.203:8088/files/`),镜像到云机 `/srv/kushan-files/`。
    - 相关参数:`cine.online_base`(**当前为空**)、`cine.ext=.ogv`、`cine.cache_max_mb=64`。
    
    ## 实施方案(按 107 号 S0→S8,一功能一文件)
    1. 新增 `scripts/room/cine_fetch.gd`(对照 `room/portrait_fetch.gd`):按 `cine.online_base` 拉 `index.json` → 按名拉 `.ogv` → `CL.save_index()`/`CL.save_disk()`;三基址候选(公网/Tailscale/局域网)照 `net_endpoints` 口径。
    2. `cine_player.gd` 在 `CL.resolve()` 返空且 `CL.index_has()` 为真时调取件(**只补取件调用,不改播放逻辑**)。
    3. 上传:`assets/cine/*.ogv` → `/files/cine/`(203 本地 + 云机镜像),并生成 `/files/cine/index.json`(名→大小/sha256)。
    4. `data/params.json` 置 `cine.online_base`(三链取一,仍受「外网口径待人拍板」约束 ⇒ 先写内网基址,公网基址随更新通道一并拍板)。
    5. `export_presets.cfg` 在 `exclude_filter` 追加 `assets/cine/*`。
    6. 出包(预期 APK ≈131.8MB → **≈112MB**,即减掉片源那约 20MB)+真机验:**无缓存时能下载并播放**、**断网时优雅降级**(不卡死、不报脚本错)、再次进入离线可播。
    7. 护栏:新增 `tools/verify_cine_pack.py` —— ① 排除表必须含 `assets/cine/*`;② 仓内片源与远端清单逐条对齐(数量/大小);③ `cine.online_base` 非空且与 `tools/hosts.sh` 口径一致。
    
    ## 本轮边界
    - **未动任何片源与排除表**:在「下载器」落地前把包内兜底删掉=过场直接失播 ⇒ 先补取件、再拆包,顺序不能反(本轮只立项+摸底,未见红)。
    
    ## 1.0.389 重出(排除表改走参数)
    
    ## 1.0.389 出包与真机(本轮收尾)
    - APK:**112721647 字节**(改前 1.0.388=131846522);包内 `\.ogv` 条目=**0**、`assets/cine/` 条目=0
    - 资源包:203 站点 5 片+index.json(18.6MB),云机镜像 6 文件;三链回读 200(公网/Tailscale/局域网)
    - 真机 `[Cine] got` 命中=0(清端上 `files/cine` 缓存后跑)
    - 护栏:`python3 tools/verify_cine_pack.py` ⇒ PASS 4 FAIL 0;全量 `run_verify_all.sh` ⇒ PASS 96 FAIL 0
    - **真因**:[1/6] 备份 preset+params、把签名库路径替换成本机路径、注入排除过滤表(版本=standard)
      已把 pack.edition 设为 standard,排除表 assets/portraits/*,evidence/*,docs/*,tasks/*,tools/*,data/private/*,edition/*,dist/*,addons/gut/*,kushan_db/*,backup_archive/*,tests/*,release/*,instances/*,_cl_/*,.venv/*,*.md,*.py,*.sh,*.sql,*.log,assets/cine/*
      已替换 keystore/release 与 keystore/debug
      exclude_filter=assets/portraits/*,evidence/*,docs/*,tasks/*,tools/*,data/private/*,edition/*,dist/*,addons/gut/*,kushan_db/*,backup_archive/*,tests/*,release/*,instances/*,_cl_/*,.venv/*,*.md,*.py,*.sh,*.sql,*.log,assets/cine/*(22 条)
      package/unique_name=com.kushan.dynasty
      应用名=贵霜帝国(出包后还原 project.godot)
    [2/6] 装配原生插件(真源 android_plugins/ → 构建模板 android/build/;幂等)
    
  • 版本 1.0.415 开发日志

    构建 1.0.415(code 415)· 2026-10-05 02:35:26 · sha256 9cb691d975dfc428…

    下载:公网 · Tailscale · 局域网

    开发日志(本轮摘要)

    # 贵霜帝国 · 内网开发版 · 本轮开发记录
    
    生成时间:2026-10-05 02:30:32 | 本包:kushan-1.0.415.apk(1.0.415 / code 415,sha256 9cb691d975dfc428…)
    
    ## 最近开发任务证据(evidence/*/readme.md,新→旧,取 10 份)
    
    ### TASK-ART-ROSTER  (2026-10-04 20:49:49)
    
    # 口径说明 · 323 人 NPC 相片槽位排产表
    
    生成时间:2026-10-04 20:49:49 | 仓库:`/mnt/data2/home_czdcc/kushan_main`
    
    本目录交付件:
    
    | 文件 | 用途 |
    |---|---|
    | `roster.md` | 人读排产表,按优先级分三节列出全部 323 人 |
    | `roster.csv` | 机器可读版,UTF-8 带表头,一 NPC 一行 |
    | `readme.md` | 本文件,口径说明 |
    | `_roster_data.json` | 生成中间件(全量行 + 汇总),供下游程序消费 |
    
    ## 1. 任务口径
    
    - 画风取 **甲案**:沿用犍陀罗写实油画(不换画风、不重炼风格)。
    - 老图 **646 张不重出**;本表只排「缺失槽位」的新增出图。
    - 覆盖全库 **323** 名 NPC(`characters.type='npc'`)。
    - **甲案的代价**(须知悉):老图沿用,与「本作自定画风」新线**不同源**,将来短片/场景图接起来会有风格落差;好处是零重出成本、已认过的脸不变、老图整份留档可回退。
    
    ## 2. 数据真源(全部只读;生成脚本不含任何硬编码数值)
    
    | 口径 | 真源 |
    |---|---|
    | 每人槽位/档位 | `data/npc_photo_slots.json`(`character_rank.tier` 落档结果,323 行) |
    | 槽位与张数规则 | `data/npc_performance.json` → `photos.count_by_tier`(low/mid/high = 2/3/5) |
    | 身份档位落档表 | `data/npc_rank_map.json`(title → tier 1–10) |
    | 装扮档位映射 | `data/params.json` → 键 `dress.tier_from_status` / `dress.max_tier` |
    | 归属房间/聚落、身份 | `kushan` 库:`characters` / `rooms` / `locations` |
    | 剧情挂靠 | `kushan` 库:`quest_chains.entry_npc_id` / `quest_templates.giver_id`(`active=1`) |
    | 现有老图 | `/srv/fileshare/kushan_photos/`(对外前缀 `/kushan_photos/`) |
    | 逐人出图 prompt | `data/npc_prompts_full.json`(323 条;出图时拼 `[风格块] + [本人 prompt] + [负向禁性表]`) |
    
    取库凭据一律走仓内唯一通道 `bash tools/query_kushan.sh "<SQL>"`——脚本**不连库、不内嵌口令**。
    
    ## 3. 槽位与张数规则(按身份档 → 2/3/5 张)
    
    | 带 | 身份档位 | 每人槽位 | 张数 | 已有 | 缺口/人 |
    |---|---|---|---|---|---|
    | low | 1–3 | avatar, full | 2 | 2 | 0 |
    
    ### TASK-D13  (2026-10-04 20:39:58)
    
    # TASK-D13 · 装扮规则链「随规则变」取证
    
    判据(68 号 D-13):同一房间换主人规则后,立绘装扮随之改变 | 改前/改后两张并排截图。
    
    ## 复跑命令(原始命令,可重放)
    
    渲染入口:`--render-panel npccard:<cid> --render-output <绝对路径>.png`。
    坑一:`--headless` 直跑 `save_png` 返回 **err=-1**(不出图),必须 `xvfb-run`。
    坑二:注入 JSON 的 mode 键必须是 `dress_tier.gd` 的 `MODE_INNER` 值 **`inner`**(不是 `interior`),否则静默回落世界默认。
    
    ```bash
    export HOME=/home/czdcc
    export KUSHAN_QA_CHAIN=l1          # 走 L1 主语链;改前留空
    export KUSHAN_QA_OWNER_JSON='{"inner":{"xiangfei_tier":5}}'   # 改后;改前不设
    export KUSHAN_DRESS_DUMP=1
    G="/mnt/data2/home_czdcc/贵霜帝国/godot/Godot_v4.7.2-stable_linux.x86_64"
    xvfb-run -a "$G" --path /home/czdcc/kushan_main -- \
      --render-panel npccard:10 --render-output /home/czdcc/kushan_main/evidence/TASK-D13/card_cid10_after.png
    ```
    
    同 cid=10(房间 6,rtype=interior)、同一张卡、同一次渲染入口,只改「场所主人规矩」注入。
    
    ## 自报原文(主证)
    
    改前(无注入):
    ```
    KUSHAN_DRESS cid=10 rtype=interior tier=4 source=world by=世界默认 qa=l1
    text=内室(家内/内院)(隐秘(深宫禁锢):蒙眼睛·勒嘴(封口)·双手在后(背缚 + 腕链)·双手合十被反绑)(依 世界默认)
    ```
    
    改后(注入 L1 主人规矩 tier=5):
    ```
    KUSHAN_DRESS cid=10 rtype=interior tier=5 source=owner by=本场所主人规矩 qa=l1
    text=内室(家内/内院)(顶点(图腾):完全禁锢组合:蒙眼 + 勒嘴 + 反绑 · 完整徽章:乳环 + 肚脐红宝石 + 双金链 + 束腰带)(依 本场所主人规矩)
    ```
    
    ⇒ **规则链层「随规则变」成立**:tier 4→5、source world→owner、by 与依据行、装束文本全部随注入改变。
    
    ## 未达部分(如实记,不遮掩)
    
    
    ### TASK-CINE-PACK  (2026-10-03 01:39:43)
    
    # B-078 资源包化:过场片移出 APK、按需下载(用户令 2026-10-02「视频丢到资源包」)
    
    ## 现状摸底(本轮实测)
    - 包内片源:`assets/cine/*.ogv`(15 个文件,仓内 41MB;APK 内约 **20MB**:`21_first.ogv` 4.5MB、`25_first` 4.4MB、`23_first` 3.7MB、`1_first` 3.1MB、`37_first` 2.8MB…)。
    - 取件机制**已具备一半**:`scripts/cine_lib.gd` 与立绘同款 —— `user://cine/` 缓存 + 在线清单 `user://cine/index.json` + **包内目录兜底**(`resolve()`:本地缓存 → 包内;网络归 net 层,本模块不碰网络)。
    - 导出排除表**已有先例**:`export_presets.cfg` 的 `exclude_filter` 里已排除 `assets/portraits/*`,**但没排 `assets/cine/*`** ⇒ 这是「移出 APK」那一步的落点。
    - **缺的那一半**:立绘有下载器(`scripts/room/portrait_fetch.gd`、`profile_view.gd`、`npc_panel.gd` 调 `PL.save_disk`),**过场片没有下载器**(`cine_player.gd` 只调 `CL.resolve()`)。
    - 托管落点现成:nw 站的 `/files/`(203 站点目录 `/mnt/data2/www/wwwroot/kushan-nw/files/` → 公网 `https://nw.tripee.cn/files/`、Tailscale `http://100.127.177.38:8088/files/`、局域网 `http://192.168.50.203:8088/files/`),镜像到云机 `/srv/kushan-files/`。
    - 相关参数:`cine.online_base`(**当前为空**)、`cine.ext=.ogv`、`cine.cache_max_mb=64`。
    
    ## 实施方案(按 107 号 S0→S8,一功能一文件)
    1. 新增 `scripts/room/cine_fetch.gd`(对照 `room/portrait_fetch.gd`):按 `cine.online_base` 拉 `index.json` → 按名拉 `.ogv` → `CL.save_index()`/`CL.save_disk()`;三基址候选(公网/Tailscale/局域网)照 `net_endpoints` 口径。
    2. `cine_player.gd` 在 `CL.resolve()` 返空且 `CL.index_has()` 为真时调取件(**只补取件调用,不改播放逻辑**)。
    3. 上传:`assets/cine/*.ogv` → `/files/cine/`(203 本地 + 云机镜像),并生成 `/files/cine/index.json`(名→大小/sha256)。
    4. `data/params.json` 置 `cine.online_base`(三链取一,仍受「外网口径待人拍板」约束 ⇒ 先写内网基址,公网基址随更新通道一并拍板)。
    5. `export_presets.cfg` 在 `exclude_filter` 追加 `assets/cine/*`。
    6. 出包(预期 APK ≈131.8MB → **≈112MB**,即减掉片源那约 20MB)+真机验:**无缓存时能下载并播放**、**断网时优雅降级**(不卡死、不报脚本错)、再次进入离线可播。
    7. 护栏:新增 `tools/verify_cine_pack.py` —— ① 排除表必须含 `assets/cine/*`;② 仓内片源与远端清单逐条对齐(数量/大小);③ `cine.online_base` 非空且与 `tools/hosts.sh` 口径一致。
    
    ## 本轮边界
    - **未动任何片源与排除表**:在「下载器」落地前把包内兜底删掉=过场直接失播 ⇒ 先补取件、再拆包,顺序不能反(本轮只立项+摸底,未见红)。
    
    ## 1.0.389 重出(排除表改走参数)
    
    ## 1.0.389 出包与真机(本轮收尾)
    - APK:**112721647 字节**(改前 1.0.388=131846522);包内 `\.ogv` 条目=**0**、`assets/cine/` 条目=0
    - 资源包:203 站点 5 片+index.json(18.6MB),云机镜像 6 文件;三链回读 200(公网/Tailscale/局域网)
    - 真机 `[Cine] got` 命中=0(清端上 `files/cine` 缓存后跑)
    - 护栏:`python3 tools/verify_cine_pack.py` ⇒ PASS 4 FAIL 0;全量 `run_verify_all.sh` ⇒ PASS 96 FAIL 0
    - **真因**:[1/6] 备份 preset+params、把签名库路径替换成本机路径、注入排除过滤表(版本=standard)
      已把 pack.edition 设为 standard,排除表 assets/portraits/*,evidence/*,docs/*,tasks/*,tools/*,data/private/*,edition/*,dist/*,addons/gut/*,kushan_db/*,backup_archive/*,tests/*,release/*,instances/*,_cl_/*,.venv/*,*.md,*.py,*.sh,*.sql,*.log,assets/cine/*
      已替换 keystore/release 与 keystore/debug
      exclude_filter=assets/portraits/*,evidence/*,docs/*,tasks/*,tools/*,data/private/*,edition/*,dist/*,addons/gut/*,kushan_db/*,backup_archive/*,tests/*,release/*,instances/*,_cl_/*,.venv/*,*.md,*.py,*.sh,*.sql,*.log,assets/cine/*(22 条)
      package/unique_name=com.kushan.dynasty
      应用名=贵霜帝国(出包后还原 project.godot)
    [2/6] 装配原生插件(真源 android_plugins/ → 构建模板 android/build/;幂等)
    
  • 版本 1.0.414 开发日志

    构建 1.0.414(code 414)· 2026-10-04 22:40:19 · sha256 c9dff156d4809ce9…

    下载:公网 · Tailscale · 局域网

    开发日志(本轮摘要)

    # 贵霜帝国 · 内网开发版 · 本轮开发记录
    
    生成时间:2026-10-04 22:35:26 | 本包:kushan-1.0.414.apk(1.0.414 / code 414,sha256 c9dff156d4809ce9…)
    
    ## 最近开发任务证据(evidence/*/readme.md,新→旧,取 10 份)
    
    ### TASK-ART-ROSTER  (2026-10-04 20:49:49)
    
    # 口径说明 · 323 人 NPC 相片槽位排产表
    
    生成时间:2026-10-04 20:49:49 | 仓库:`/mnt/data2/home_czdcc/kushan_main`
    
    本目录交付件:
    
    | 文件 | 用途 |
    |---|---|
    | `roster.md` | 人读排产表,按优先级分三节列出全部 323 人 |
    | `roster.csv` | 机器可读版,UTF-8 带表头,一 NPC 一行 |
    | `readme.md` | 本文件,口径说明 |
    | `_roster_data.json` | 生成中间件(全量行 + 汇总),供下游程序消费 |
    
    ## 1. 任务口径
    
    - 画风取 **甲案**:沿用犍陀罗写实油画(不换画风、不重炼风格)。
    - 老图 **646 张不重出**;本表只排「缺失槽位」的新增出图。
    - 覆盖全库 **323** 名 NPC(`characters.type='npc'`)。
    - **甲案的代价**(须知悉):老图沿用,与「本作自定画风」新线**不同源**,将来短片/场景图接起来会有风格落差;好处是零重出成本、已认过的脸不变、老图整份留档可回退。
    
    ## 2. 数据真源(全部只读;生成脚本不含任何硬编码数值)
    
    | 口径 | 真源 |
    |---|---|
    | 每人槽位/档位 | `data/npc_photo_slots.json`(`character_rank.tier` 落档结果,323 行) |
    | 槽位与张数规则 | `data/npc_performance.json` → `photos.count_by_tier`(low/mid/high = 2/3/5) |
    | 身份档位落档表 | `data/npc_rank_map.json`(title → tier 1–10) |
    | 装扮档位映射 | `data/params.json` → 键 `dress.tier_from_status` / `dress.max_tier` |
    | 归属房间/聚落、身份 | `kushan` 库:`characters` / `rooms` / `locations` |
    | 剧情挂靠 | `kushan` 库:`quest_chains.entry_npc_id` / `quest_templates.giver_id`(`active=1`) |
    | 现有老图 | `/srv/fileshare/kushan_photos/`(对外前缀 `/kushan_photos/`) |
    | 逐人出图 prompt | `data/npc_prompts_full.json`(323 条;出图时拼 `[风格块] + [本人 prompt] + [负向禁性表]`) |
    
    取库凭据一律走仓内唯一通道 `bash tools/query_kushan.sh "<SQL>"`——脚本**不连库、不内嵌口令**。
    
    ## 3. 槽位与张数规则(按身份档 → 2/3/5 张)
    
    | 带 | 身份档位 | 每人槽位 | 张数 | 已有 | 缺口/人 |
    |---|---|---|---|---|---|
    | low | 1–3 | avatar, full | 2 | 2 | 0 |
    
    ### TASK-D13  (2026-10-04 20:39:58)
    
    # TASK-D13 · 装扮规则链「随规则变」取证
    
    判据(68 号 D-13):同一房间换主人规则后,立绘装扮随之改变 | 改前/改后两张并排截图。
    
    ## 复跑命令(原始命令,可重放)
    
    渲染入口:`--render-panel npccard:<cid> --render-output <绝对路径>.png`。
    坑一:`--headless` 直跑 `save_png` 返回 **err=-1**(不出图),必须 `xvfb-run`。
    坑二:注入 JSON 的 mode 键必须是 `dress_tier.gd` 的 `MODE_INNER` 值 **`inner`**(不是 `interior`),否则静默回落世界默认。
    
    ```bash
    export HOME=/home/czdcc
    export KUSHAN_QA_CHAIN=l1          # 走 L1 主语链;改前留空
    export KUSHAN_QA_OWNER_JSON='{"inner":{"xiangfei_tier":5}}'   # 改后;改前不设
    export KUSHAN_DRESS_DUMP=1
    G="/mnt/data2/home_czdcc/贵霜帝国/godot/Godot_v4.7.2-stable_linux.x86_64"
    xvfb-run -a "$G" --path /home/czdcc/kushan_main -- \
      --render-panel npccard:10 --render-output /home/czdcc/kushan_main/evidence/TASK-D13/card_cid10_after.png
    ```
    
    同 cid=10(房间 6,rtype=interior)、同一张卡、同一次渲染入口,只改「场所主人规矩」注入。
    
    ## 自报原文(主证)
    
    改前(无注入):
    ```
    KUSHAN_DRESS cid=10 rtype=interior tier=4 source=world by=世界默认 qa=l1
    text=内室(家内/内院)(隐秘(深宫禁锢):蒙眼睛·勒嘴(封口)·双手在后(背缚 + 腕链)·双手合十被反绑)(依 世界默认)
    ```
    
    改后(注入 L1 主人规矩 tier=5):
    ```
    KUSHAN_DRESS cid=10 rtype=interior tier=5 source=owner by=本场所主人规矩 qa=l1
    text=内室(家内/内院)(顶点(图腾):完全禁锢组合:蒙眼 + 勒嘴 + 反绑 · 完整徽章:乳环 + 肚脐红宝石 + 双金链 + 束腰带)(依 本场所主人规矩)
    ```
    
    ⇒ **规则链层「随规则变」成立**:tier 4→5、source world→owner、by 与依据行、装束文本全部随注入改变。
    
    ## 未达部分(如实记,不遮掩)
    
    
    ### TASK-CINE-PACK  (2026-10-03 01:39:43)
    
    # B-078 资源包化:过场片移出 APK、按需下载(用户令 2026-10-02「视频丢到资源包」)
    
    ## 现状摸底(本轮实测)
    - 包内片源:`assets/cine/*.ogv`(15 个文件,仓内 41MB;APK 内约 **20MB**:`21_first.ogv` 4.5MB、`25_first` 4.4MB、`23_first` 3.7MB、`1_first` 3.1MB、`37_first` 2.8MB…)。
    - 取件机制**已具备一半**:`scripts/cine_lib.gd` 与立绘同款 —— `user://cine/` 缓存 + 在线清单 `user://cine/index.json` + **包内目录兜底**(`resolve()`:本地缓存 → 包内;网络归 net 层,本模块不碰网络)。
    - 导出排除表**已有先例**:`export_presets.cfg` 的 `exclude_filter` 里已排除 `assets/portraits/*`,**但没排 `assets/cine/*`** ⇒ 这是「移出 APK」那一步的落点。
    - **缺的那一半**:立绘有下载器(`scripts/room/portrait_fetch.gd`、`profile_view.gd`、`npc_panel.gd` 调 `PL.save_disk`),**过场片没有下载器**(`cine_player.gd` 只调 `CL.resolve()`)。
    - 托管落点现成:nw 站的 `/files/`(203 站点目录 `/mnt/data2/www/wwwroot/kushan-nw/files/` → 公网 `https://nw.tripee.cn/files/`、Tailscale `http://100.127.177.38:8088/files/`、局域网 `http://192.168.50.203:8088/files/`),镜像到云机 `/srv/kushan-files/`。
    - 相关参数:`cine.online_base`(**当前为空**)、`cine.ext=.ogv`、`cine.cache_max_mb=64`。
    
    ## 实施方案(按 107 号 S0→S8,一功能一文件)
    1. 新增 `scripts/room/cine_fetch.gd`(对照 `room/portrait_fetch.gd`):按 `cine.online_base` 拉 `index.json` → 按名拉 `.ogv` → `CL.save_index()`/`CL.save_disk()`;三基址候选(公网/Tailscale/局域网)照 `net_endpoints` 口径。
    2. `cine_player.gd` 在 `CL.resolve()` 返空且 `CL.index_has()` 为真时调取件(**只补取件调用,不改播放逻辑**)。
    3. 上传:`assets/cine/*.ogv` → `/files/cine/`(203 本地 + 云机镜像),并生成 `/files/cine/index.json`(名→大小/sha256)。
    4. `data/params.json` 置 `cine.online_base`(三链取一,仍受「外网口径待人拍板」约束 ⇒ 先写内网基址,公网基址随更新通道一并拍板)。
    5. `export_presets.cfg` 在 `exclude_filter` 追加 `assets/cine/*`。
    6. 出包(预期 APK ≈131.8MB → **≈112MB**,即减掉片源那约 20MB)+真机验:**无缓存时能下载并播放**、**断网时优雅降级**(不卡死、不报脚本错)、再次进入离线可播。
    7. 护栏:新增 `tools/verify_cine_pack.py` —— ① 排除表必须含 `assets/cine/*`;② 仓内片源与远端清单逐条对齐(数量/大小);③ `cine.online_base` 非空且与 `tools/hosts.sh` 口径一致。
    
    ## 本轮边界
    - **未动任何片源与排除表**:在「下载器」落地前把包内兜底删掉=过场直接失播 ⇒ 先补取件、再拆包,顺序不能反(本轮只立项+摸底,未见红)。
    
    ## 1.0.389 重出(排除表改走参数)
    
    ## 1.0.389 出包与真机(本轮收尾)
    - APK:**112721647 字节**(改前 1.0.388=131846522);包内 `\.ogv` 条目=**0**、`assets/cine/` 条目=0
    - 资源包:203 站点 5 片+index.json(18.6MB),云机镜像 6 文件;三链回读 200(公网/Tailscale/局域网)
    - 真机 `[Cine] got` 命中=0(清端上 `files/cine` 缓存后跑)
    - 护栏:`python3 tools/verify_cine_pack.py` ⇒ PASS 4 FAIL 0;全量 `run_verify_all.sh` ⇒ PASS 96 FAIL 0
    - **真因**:[1/6] 备份 preset+params、把签名库路径替换成本机路径、注入排除过滤表(版本=standard)
      已把 pack.edition 设为 standard,排除表 assets/portraits/*,evidence/*,docs/*,tasks/*,tools/*,data/private/*,edition/*,dist/*,addons/gut/*,kushan_db/*,backup_archive/*,tests/*,release/*,instances/*,_cl_/*,.venv/*,*.md,*.py,*.sh,*.sql,*.log,assets/cine/*
      已替换 keystore/release 与 keystore/debug
      exclude_filter=assets/portraits/*,evidence/*,docs/*,tasks/*,tools/*,data/private/*,edition/*,dist/*,addons/gut/*,kushan_db/*,backup_archive/*,tests/*,release/*,instances/*,_cl_/*,.venv/*,*.md,*.py,*.sh,*.sql,*.log,assets/cine/*(22 条)
      package/unique_name=com.kushan.dynasty
      应用名=贵霜帝国(出包后还原 project.godot)
    [2/6] 装配原生插件(真源 android_plugins/ → 构建模板 android/build/;幂等)