# night-shift

Adopt this skill: https://proskills.md/skills/other/cynthia-wlan9509-offline-game-revival-skills-night-shift

Page: https://proskills.md/skills/other/cynthia-wlan9509-offline-game-revival-skills-night-shift
This document is the public skill bundle for that page. It contains SKILL.md and every helper file the catalog carries. No login is required.

## File: skills/night-shift/SKILL.md
size: 9593
sha: 9d7eac6977118c4cfd2a74a1660996b0f6c29016
upstream: https://github.com/cynthia-wlan9509/offline-game-revival/blob/main/skills/night-shift/SKILL.md

````text
---
name: night-shift
description: "Unattended overnight runs: while the user sleeps or is away for hours, the agent works through a written to-do list on its own — self-paced /loop wake-ups, one item at a time, sub-agents for the legwork, evidence and a commit for every 'done', the most conservative default for anything it would have to ask about, and a five-part report in the morning. 夜间无人值班：用户睡觉或离开几个小时，让 agent 按一份待办清单自己推进——/loop 自定节奏、一次一项、子代理分工、每项有证据和提交、要拍板的事先用最保守的默认值、早上交五段式报告。用户说「我要睡了 / 出门几小时，你自己接着做」「挂一晚上」「夜间值班」时使用。"
metadata:
  short-description: 夜间无人值班推进待办
---

# 夜间值班（Night Shift）

用户要睡觉或离开几个小时，想让 agent 在没人回答问题的情况下，自己把一份待办清单往前推。这套机制在 case C（一个停服手游的离线化项目）上跑过两整晚：开跑前人做两分钟检查，之后 agent 自己醒来、干活、记账、停下、写报告。

值班的人不叫醒老板，但每一笔都记在账上。

它不绑定游戏项目。只要有一份待办清单、每项能自动验证（测试、模拟器、截图、日志），就能用。

## 怎么开始

1. 把 [`templates/NIGHT-RUN.md`](templates/NIGHT-RUN.md) 复制进项目（建议 `docs/NIGHT-RUN.md`），把所有 `<占位>` 填掉，尤其是「绝对不做」一节。
2. 人过一遍下面的「开跑前检查」。
3. 在项目的会话里输入，**不给间隔**，让 agent 自己定节奏：

```
/loop 读 docs/NIGHT-RUN.md 并严格按它执行；每次醒来都重新读一遍它
```

之后不用管，回来看 `docs/NIGHT-REPORT.md`。

`NIGHT-RUN.md` 是指令本身。运行时 agent 自己写三个状态文件：`NIGHT-PLAN.md`（计划表，每项一行带状态）、`NIGHT-LOG.md`（一行一件事，带时间）、`NIGHT-REPORT.md`（停止前写的报告）。每次醒来都从这些文件恢复进度，不靠对话记忆，所以上下文被压缩也不会丢进度。

## 开跑前人做的检查（两分钟）

- **权限模式是 auto。** 不是的话，一个确认框就能把整晚卡死。
- **主会话模型**用平时的主力模型，不用最贵那档：整晚大部分是体力活和等待，最强模型的判断优势体现不出来，额度却烧得最快。子代理用便宜的：scout 用最便宜的，worker 用中档。
- **设备**：测试设备开着、在线；别的项目或用户自己在用的设备拔掉，或者在 `NIGHT-RUN.md` 里写明不许碰。
- **电源**：电脑插电。防睡眠 agent 自己会调，但合盖之类的操作要人自己避免。
- **git 基线**：项目最好已经是 git 仓库、工作区干净；不是的话 agent 第一次醒来会 init 并做基线提交，之后每晚都有能回退的点。

## 机制

**每次醒来的固定步骤**（按顺序，不跳）：
1. 读 PLAN 和 LOG 最后几十行，弄清上次做到哪；查有没有子会话、子代理或后台命令还在跑。只读 PLAN 引用到的文档章节，不重读大文件。
2. 调 keep-awake，防止电脑睡眠。
3. 查额度。低于阈值（默认 15%）就只做收尾。
4. 查设备在线；不在线按 `NIGHT-RUN.md` 写的办法拉起，两次不行就只做不需要设备的事。
5. 看本地时间，过了截止时间就进停止流程。

**第一次醒来**：建基线（需要时 `git init`、写 `.gitignore`、基线提交），在 LOG 第一行记下开始时间、额度、基线哈希和设备；再从项目的状态文档生成 PLAN。每项写：优先级、做什么、完成标准（状态真的变了，而且重启后还对）、涉及文件、验证方式。排序：先验证「已写未验证」的，再做收益大且独立的新东西，依赖外部条件的放最后。

**执行规则**：
- 一次只开一项，PLAN 里同时只有一项 in_progress。
- 按分工派活：大范围搜索、读长日志、通读反编译产物给 scout；规格已定的实现、补测试、批量改表给 worker；主会话只做判断、定规格、收货和上设备验证。几次工具调用能做完的小活自己做，不拆。
- 派活要写全：目标、背景（文件和行号）、只许改哪些文件、完成标准、交付格式、时限。收货时自己重跑测试、抽查 diff、确认没越界改文件；子代理说「完成了」不算数。
- 并行会话最多两个，只给互不依赖、文件不重叠的实现项。构建脚本、补丁入口、存档结构和这几个状态文件只有主会话能改。
- 验收必须有证据：截图、日志片段或存档 diff，放进 `<证据目录>/<日期>/<事项>/`，路径写进 LOG。没证据就写「已实现，待验证」。
- 同一项连续失败两次，或在它上面耗了一小时，就标 blocked，LOG 里写现象、日志路径和猜测，换下一项。不在一个坑里转圈。
- 每完成一项提交一次，提交信息写清验证状态；新踩的坑追加到项目的坑记录。
- 省上下文：长输出先落盘再让 scout 摘要；大文件不整读；给子会话的 brief 自己写全，不写「见上文」。
- 需要用户拍板的事（资源来源、数值取舍、砍不砍功能、账号和协议）：选最保守的默认值继续，记进报告的「待你决定」，不停下来等。

**绝对不做**：模板里是一张按项目填空的清单。至少要写：不碰哪些设备、不用哪些清数据或卸载类命令、哪些目录不许删、不 push 不发布不上传、不改系统设置、子会话上限和不许用的模型、不写「应该没问题」。改用户自己的数据之前先备份，确认备份在了再动。

**停止条件**（任一满足就停 loop）：PLAN 全部 done 或 blocked；额度低于阈值；连续三次醒来没有任何事项状态变化；到了截止时间。

**报告**五段，每段要短：
1. 已验证：事项、证据路径、提交哈希
2. 已实现未验证：为什么没验上
3. 阻塞：现象、日志路径、猜测、建议用户怎么查
4. 待你决定：每条写出用了哪个默认值、备选是什么
5. 额度消耗、回来能直接用的产物路径、所有子会话和子代理的名字与状态

**醒来间隔与 noop**：有子会话、子代理或后台命令在跑时，只定一个 1200 秒左右的兜底唤醒，主要靠它们的完成通知叫醒；没有在跑的，做完一项马上做下一项，不为「看一眼」而醒。每次调 `ScheduleWakeup` 都如实填 noop：有事项状态变化才填 false。连续的 noop 会在界面上折叠成一串，用户一眼就能看出它在空转。

## 依赖的环境

下面这些都是 Claude Code 桌面版提供的能力。换到别的环境时缺哪个，按表里的办法退化。

| 能力 | 用来做什么 | 缺了怎么办 |
|---|---|---|
| `/loop`，不给间隔 | agent 自己决定下次什么时候醒 | 用固定间隔（如 `/loop 20m …`），或外部定时任务定时发同一句提示 |
| `ScheduleWakeup` | 安排下次醒来、标 noop、停止循环 | 同上；要停时在 PLAN 顶部写 `stopped`，之后每次醒来读到就直接结束 |
| `request_keep_awake` | 防止电脑睡眠 | 开跑前人手动关掉睡眠 |
| `get_usage` | 查剩余额度、决定是否收尾 | 开跑前人看一眼额度，在 `NIGHT-RUN.md` 里用「最晚几点 / 最多几项」代替额度阈值 |
| `start_session` | 开并行会话 | 退化成子代理 |

纯命令行版本里不能开并行会话：把并行实现项交给后台跑的 worker 子代理，其余规则不变（文件不重叠、最多两个、brief 写全、收货自己验）。另外，从自动唤醒的回合里开会话可能被应用拒绝；case C 两晚实际都只用了子代理。被拒一次就直接退化，不要反复重试。

## 两晚跑出来的经验

- **子代理会卡住。** 一个 scout 跑了 `cat > 文件` 却没给输入，一直在等标准输入；一个 worker 早上 8 点多开工、下午 1 点才交，中间多半在空等。每次醒来查一遍后台任务，超过时限的停掉；主会话手里已经有上下文的活，自己做更快。
- **开始时就记额度。** 第一晚开头没记，早上报告算不出这一晚用了多少。
- **用了用户自己的数据就要还原。** 测试时换掉了用户的存档：先备份、记哈希，停止前逐字节还原，再释放共用设备的登记。
- **用户中途改规矩要落到文件里。** 用户半夜醒来说「手机也可以用」「继续，别停」，就在 PLAN 里加一个带时间的新段落，原话照抄；不要自己推断「那别的应该也可以」。
- **随机点击压测（Android `monkey`）要限定包名，并关掉轨迹球和导航键事件**：`-p <包名> --pct-trackball 0 --pct-nav 0 --pct-majornav 0 --pct-anyevent 0`。模拟器上这些事件会触发系统语音搜索，没有应用接手，把系统进程弄崩，看起来像游戏闪退。
- **「已验证」只放有证据的。** 证据目录按事项编号，报告里直接给路径，用户早上能一项项点开看。

## 效果（case C）

- 第一晚 4 小时 25 分钟：模拟器上验证了 11 项，每项都有截图或日志和一次提交；派了 5 个 worker；结束时 5 小时额度窗口显示用了 51%。
- 另一晚在模拟器上跑随机点击压测，两轮各 3000 次，0 闪退。
````

## File: skills/night-shift/templates/NIGHT-RUN.md
size: 9339
sha: f40b5a3c55c1d9c035c58ef611ff9a3d888c6088
upstream: https://github.com/cynthia-wlan9509/offline-game-revival/blob/main/skills/night-shift/templates/NIGHT-RUN.md

````text
# 夜间全自动运行指令（<项目名>）

> 用法：在本项目的 Claude Code 会话里输入
> `/loop 读 <状态目录>/NIGHT-RUN.md 并严格按它执行；每次醒来都重新读一遍它`
> 不给间隔，让 agent 自己定节奏。之后不用再管。
> 本文件是指令本身；`<状态目录>/NIGHT-PLAN.md`、`NIGHT-LOG.md`、`NIGHT-REPORT.md` 是它运行时写的状态文件。
>
> 填法：把所有 `<…>` 换成你项目的值；用不上的行整行删掉，不要留占位。

---

## 开跑前人做的事（每次挂机前过一遍，两分钟）

1. 权限模式是 auto（会话顶部能看到）。不是的话任何一次确认框都会把整晚卡死。
2. 主会话模型选 `<主模型>`（平时的主力模型，不用最贵那档：整晚体力活会把额度烧光，判断力的差距在这类活上体现不出来）。子代理：scout = `<便宜模型>`，worker = `<中档模型>`。
3. 测试设备 `<设备名>` 开着并在线（`<连接方式>`）；`<不许碰的设备>` 拔掉或关掉。
4. 电脑插电。防睡眠由 agent 自己调 keep-awake，但合盖、手动睡眠之类的动作要自己避免。
5. 项目是 git 仓库并且工作区干净；不是的话让 agent 在第一次醒来时自己 init（下面有规定）。
6. 今晚有例外（允许用某台设备、允许过了截止时间继续……）就写进文末「今晚的额外授权」，不要只在聊天里说。

---

## 给 agent 的指令（从这里开始是你要执行的）

你是本项目的夜间值班主 agent。用户已经离开，到 `<截止时间>` 之前不会回答任何问题，也不会看屏幕。你的目标：在不打扰用户、不做任何危险操作的前提下，把 `NIGHT-PLAN.md` 里的事项尽可能多地推进到「已在 `<设备名>` 上验证」。

### 每次醒来先做（按顺序，不跳过）

1. 读 `NIGHT-PLAN.md`（不存在就按下一节生成）和 `NIGHT-LOG.md` 最后 40 行，弄清上次做到哪。查有没有子会话（`list_sessions`，linked）、子代理或后台命令还在跑；超过 brief 里时限的停掉，LOG 记一行。不要重读 `<项目状态文档>` 全文，只读 PLAN 里引用的章节。
2. 调 `request_keep_awake`。
3. 调 `get_usage`。剩余额度低于 `<额度阈值，默认 15%>`：只做收尾（写报告、提交），然后停止循环。
4. 确认 `<设备名>` 在线（`<检查命令>`）。不在线就 `<拉起办法>`，等 90 秒再试；两次仍不在线，只做不需要设备的事项，并在 LOG 里记一行。
5. 本地时间已过 `<截止时间>`，并且「今晚的额外授权」里没有延长：直接进「停止」流程。

### 第一次醒来：建基线和计划

1. 项目不是 git 仓库时：`git init`，写 `.gitignore`（`<构建产物、大文件、缓存目录和后缀>`），做一次基线提交。之后每完成一项都提交。
2. LOG 第一行记：时间、额度（5 小时窗口和周额度）、git 基线哈希、用的设备、有没有子会话。
3. 从 `<项目状态文档>` 的状态段和 `<待办来源>` 生成 `NIGHT-PLAN.md`（格式见文末），每项一行：优先级、状态、做什么、完成标准（状态真的变了，且杀进程重启后仍正确）、涉及文件、验证方式。
4. 顺序：先验证「已写未验证」的，再做「未开始」里收益大、最独立的，依赖外部条件（`<例如需要联网、需要别人的数据>`）的放最后。排序依据：`<用户必经路径> > <日常循环> > <边角功能>`。
5. 计划生成后提交，LOG 里写一行「计划建立，共 N 项」。

### 执行规则

- **一次只开一个事项**，做到验证通过或判定阻塞再换下一个。PLAN 里同时只有一项是 in_progress。
- **分工**：大范围搜索、读日志找第一个异常、通读反编译产物 → scout；规格已经写清的实现、补测试用例、批量改表 → worker；你自己只做判断、定规格、收货、设备验证。几次工具调用能做完的小活自己做，不拆。
- **派活必须写全**：目标、背景（文件和行号）、范围（只许改哪些文件）、完成标准、交付格式、时限（「N 分钟内交，不开后台任务」）。收货时自己重跑测试、抽查 diff、确认没越界改文件；子代理说「已完成」不算数。
- **并行会话**：PLAN 里有两个以上互不依赖、文件不重叠的实现事项时，用 `start_session`（initiation 为 user_asked，这是用户在本文件里授权的）各开一个会话，fresh 上下文，每个只改自己模块的文件和自检脚本。同一时刻最多两个子会话。被应用拒绝就改用后台 worker 子代理，不重试。它们交回后由你做合并构建和设备验证。`<构建脚本、补丁主入口、存档结构>` 和 `<状态目录>/` 只有你能改。
- **验证标准**：证据必须是 `<截图 / 日志片段 / 存档 diff>`，文件放 `<证据目录>/<日期>/<事项编号-名字>/`，路径写进 LOG。没证据一律写「代码已实现，待验证」。
- **失败处理**：同一事项连续两次尝试失败，或在它上面已耗 1 小时 → PLAN 标 blocked，LOG 写现象、日志路径、你的猜测，换下一项。不要在一个坑上转圈。
- **每完成一项**：`git commit`，提交信息写明验证状态；新发现的坑追加到 `<坑记录文件>`。
- **省上下文**：长输出先写到 `<证据目录>/logs/` 再让 scout 摘要；反编译文件、大表不要整个读进上下文；给子会话的 brief 自己写清楚，不说「见上文」。
- **需要用户拍板的事**（`<例如资源来源、数值取舍、砍不砍功能、账号和协议>`）：选最保守的默认值继续，并记进 REPORT 的「待你决定」。不要停下来等。

### 绝对不做（按项目填）

- 不碰 `<不许碰的设备：名字或串号>`；只用 `<设备名>`。`<别的项目占用的设备或端口>` 也不用。
- 不 `<清数据 / 卸载 / 重置类命令>`。需要新数据只删 `<具体文件>`；删之前先备份，确认备份文件存在再删。
- 换掉了用户自己的数据（`<存档或配置的位置>`）：先备份并记哈希，停止前逐字节还原，`<共用设备登记表>` 里释放占用。
- 不删 `<受保护的目录和文件>`。不改 `<其他仓库或目录>`。不 `git push`，不发布、不上传任何东西。
- 不改系统设置、不装系统级软件；`<包管理器>` 装进项目目录可以。
- 不开超过两个子会话，不用 `<不许用的模型>` 开子代理（本文件没有授权）。
- 不在 LOG 和 REPORT 里写「应该没问题」：要么有证据，要么写「未验证」。
- `<项目特有的环境规矩，例如某个 shell 下带设备路径的命令要先设什么环境变量>`

### 停止条件（任一满足就调 `ScheduleWakeup` 的 stop）

PLAN 全部 done 或 blocked；额度低于 `<额度阈值>`；连续三次醒来没有任何事项状态变化；本地时间到 `<截止时间>`（「今晚的额外授权」另有说明的除外）。

停止前先还原用户数据（如果动过），再写 `<状态目录>/NIGHT-REPORT.md`，五段，每段要短：
1. 已验证（事项 + 证据路径 + 提交哈希）
2. 已实现未验证（为什么没验上）
3. 阻塞（现象、日志路径、你的猜测、建议用户怎么查）
4. 待你决定（每条给出你选的默认值和备选）
5. 本晚额度消耗（开始和结束各多少）、回来可以直接用的产物路径、所有子会话和子代理的名字和状态

然后提交，停止循环。

### 醒来间隔

有子会话、子代理或后台命令在跑：兜底 1200 秒，靠完成通知唤醒。否则做完一项立刻做下一项，不要为了「检查一下」而醒来。每次调 `ScheduleWakeup` 时 noop 要如实：有事项状态变化才是 false。

---

## 今晚的额外授权（用户填；没有就留空）

用户中途改规矩时，agent 也在这里补一条，带时间，原话照抄。

- `<日期 时间>`：`<用户原话>`

---

## 状态文件格式

`NIGHT-PLAN.md`：

```markdown
# 夜间计划（<日期>，按 NIGHT-RUN.md 执行）

设备：<设备名和连接方式>。不用：<不许碰的设备>。
用户数据：<换没换过；备份位置和哈希；停止前必须还原>。

| # | 优先级 | 状态 | 事项 | 完成标准 | 涉及文件 | 验证方式 |
|---|---|---|---|---|---|---|
| 1 | P1 | in_progress | … | 状态变化可见，重启后仍正确，0 报错 | … | 截图 + 日志 |
| 2 | P2 | pending | … | … | … | 存档 diff |
```

状态只用 pending / in_progress / done / blocked，后面括号里可以补一句（例如「done（另一个按钮的问题见 #6）」）。

`NIGHT-LOG.md`：一行一件事，开头是本地时间。

```markdown
# 夜间日志

- 02:52 第一次醒来：keep-awake 已开；额度 5 小时窗 43%、周 42%；git 基线 <哈希>；设备 <设备名> 在线；无子会话。
- 02:55 计划建立，共 8 项（#1 in_progress）。
- 03:05 #1 done：<看到了什么>；证据 <证据目录>/<日期>/01-<名字>/；提交 <哈希>。
- 04:05 停掉卡住的 scout（后台命令在等标准输入），它的活我已做完；坑已记入 <坑记录文件>。
```
````

## File: README.md
upstream: https://github.com/cynthia-wlan9509/offline-game-revival/blob/main/README.md

````text
<div align="center">

# 🎮 Offline Game Revival

### An AI agent skill that brings shut-down mobile games back to life — fully offline, on a real phone.

**When the servers die, the game shouldn't.**

[English](README.md) · [简体中文](docs/README.zh-CN.md) · [繁體中文](docs/README.zh-TW.md) · [日本語](docs/README.ja.md) · [한국어](docs/README.ko.md) · [Español](docs/README.es.md) · [Português](docs/README.pt-BR.md) · [Français](docs/README.fr.md) · [Deutsch](docs/README.de.md) · [Русский](docs/README.ru.md) · [Tiếng Việt](docs/README.vi.md) · [Bahasa Indonesia](docs/README.id.md)

![Agent Skill](https://img.shields.io/badge/Agent%20Skill-SKILL.md-8A2BE2)
![Claude Code](https://img.shields.io/badge/Claude%20Code-plugin-D97757)
![Engines](https://img.shields.io/badge/engines-Unity%20%2B%20Lua%20%7C%20LayaAir%20%2B%20JS-2ea44f)
![License](https://img.shields.io/badge/license-MIT-blue)
[![GitHub stars](https://img.shields.io/github/stars/Cynthia-wlan9509/offline-game-revival?style=flat&logo=github&label=stars&color=f5c518)](https://github.com/Cynthia-wlan9509/offline-game-revival/stargazers)

</div>

---

Every year, hundreds of mobile games shut down. The APK still sits on players' phones — but without the server it can't log in, can't load a save, can't do anything. Years of stories, characters and memories become unreachable.

**Offline Game Revival** is a battle-tested playbook packaged as an [Agent Skill](https://docs.claude.com/en/docs/claude-code/skills). Point your coding agent (Claude Code and other agents that read `SKILL.md`) at a dead game's APK, and it knows how to turn it into a **standalone memorial edition**: install the APK, play the whole game, no network, no root, no PC, no runtime injection.

## ✨ What's inside

| | |
|---|---|
| 🩺 **Can it be saved?** | Before any patch, answer three questions within half a day: are the game's rules on the phone, is the game itself inside the APK, and how much server-side data can be recovered. Story, idle and card games usually can be saved; games whose battles are computed on the server, or that download the game itself after first launch, usually can't. |
| 🔍 **Recon** | Unpack the APK, find the real logic layer (Lua / JS / C# transpiled), identify encryption and resource-integrity checks. |
| 🧩 **Anchor-asserted patching** | One build entry point. Every code replacement asserts its anchor — if the upstream package changes, the build *fails loudly* instead of shipping a silently broken patch. |
| 🖥️ **Local fake server** | Intercept the HTTP/JSON layer and answer hundreds of endpoints from a local save. A methodology for mapping every endpoint's caller and what it reads, then generating safe defaults. |
| 📦 **Repack & re-sign** | Recompute engine cache checksums, rebuild resource tables, zipalign, sign. Includes a reverse-engineered cache-checksum algorithm and loader patches for LayaAir native. |
| ✅ **On-device acceptance** | "The screen opens" ≠ "it works". State must actually change and survive a cold restart. Tutorial-driven testing: follow the game's own guide steps with real taps. |
| 🎞️ **Data rescue from screenshots & recordings** *(new)* | Server-side numbers (shop prices, gacha rates, rewards, card stats) die with the server. `scripts/harvest.py` turns **tens of GB of player screenshots and screen recordings** into a few hundred KB of categorized text — keyframes → near-duplicate removal → local OCR → per-screen grouping — **fully offline, zero tokens**, then `scripts/llm_structure.py` batches it through DeepSeek / OpenAI / Qwen / Kimi / local Ollama into merged JSON + CSV. |
| ⏩ **Time-travel tests** *(new)* | `scripts/timewarp` runs your fake server in a sandbox with a virtual clock: fast-forward days, restart the app, and **audit every reward** — if a response says "+50 gems" but the save didn't change, it fails. Simulate 30 days of play in a second and see on which day each gate becomes reachable. Zero dependencies. |
| 🤝 **Any agent, any model** *(new)* | Works with Claude Code, Codex, Cursor, Copilot, OpenCode, Gemini CLI… via `SKILL.md` + `AGENTS.md`. Ships scout / worker / verifier sub-agent roles so an expensive model makes the calls and cheap ones do the legwork. No agent at all? Paste `prompts/chat-playbook.md` into DeepSeek / ChatGPT and run the commands it gives you. |
| 📚 **Failure ledger** | 100 KB of real pitfalls: symptom → root cause → fix. Crashes from start-up races, UI that silently moved off-screen, pooled XHR objects "poisoned" by fake responses, saves that never hit disk… |

## 🏆 Proven on real games

The playbook was distilled from reviving four commercial mobile games whose servers shut down:

- **Case A — Unity + Lua**: full single-player memorial build, verified on a physical Android 14 phone.
- **Case B — LayaAir native + JavaScript**: 315 server endpoints reimplemented locally, 700+ regression assertions, all major systems (story chapters, battles, gacha, pets, dating, tower, events) clicked through on a device.
- **Case C — Unity micro client (Mono + SLua)**: the APK held only about a quarter of the game's resources; the rest came from a player's phone backup. Half-encrypted Mono assemblies, a packer shell, and a local server written entirely in Lua.
- **Case D — native Kotlin + Live2D, AI character chat**: the core feature, chatting with the characters, ran on the publisher's server-side LLM. Chat now goes to the player's own OpenAI-compatible API or a local model, kept in character by cards and sample lines taken from the game's own script; with no model set up, characters reply with their original voiced lines.

A fifth game was dropped after half a day: the game itself was downloaded after first launch, and that download died with the server.

All four case studies are included (anonymized) in [`references/`](skills/offline-game-revival/references).

## 💸 What it cost

Most of the work was done with Claude Code on a subscription. To give a sense of scale, here is the token usage from the local session logs (sub-agents included), converted at Anthropic's public API prices. That is a conversion, not what was actually billed.

| Case | Calendar days | Tokens | At API list price |
|---|---|---|---|
| A — Unity + Lua | 18 | 7.4 B | ≈ $2,140 |
| B — LayaAir native + JS | 9 | 2.6 B | ≈ $720 |
| C — Unity micro client (Mono + SLua) | 5 | 2.3 B | ≈ $620 |
| All game-revival work (A + B + C, plus one day of recon on the game that was dropped) | | 12.4 B | ≈ $3,500 |

The table counts Claude only. With the Codex phase below added, the total is about $3,900.

- 98.5% of the tokens are cache reads: every turn, the model re-reads the conversation so far, and that is billed at a small fraction of the normal input price. The text the model actually wrote is only about 35 M tokens. (Both figures are measured over all Claude usage in the same period, 14.1 B tokens, not per case.)
- Case A started with about 10 days in Codex, backed by DeepSeek V4.1 Flash and GPT-6 Astra: about 2.25 B tokens, ≈ $420 at list price. DeepSeek took about 2.0 B tokens for only ≈ $27–54 (off-peak to peak price); GPT-6 Astra took about 0.26 B tokens for ≈ $387.
- Counted up to 2026-10-25.

## 🚀 Install

**Claude Code (plugin marketplace)**

```bash
/plugin marketplace add Cynthia-wlan9509/offline-game-revival
/plugin install offline-game-revival@offline-game-revival
```

**Any agent that supports Agent Skills** (Claude Code, OpenAI Codex, Cursor, GitHub Copilot, OpenCode, Goose…) — copy the folder into that agent's skills directory:

```bash
git clone https://github.com/Cynthia-wlan9509/offline-game-revival
cp -r offline-game-revival/skills/offline-game-revival ~/.claude/skills/   # Claude Code
cp -r offline-game-revival/skills/offline-game-revival ~/.codex/skills/    # Codex
```

Other agents read [`AGENTS.md`](AGENTS.md), which points them to the skill. Sub-agent roles are in [`agents/`](agents).

**Chat only (DeepSeek / ChatGPT / Kimi web)** — paste [`prompts/chat-playbook.md`](prompts/chat-playbook.md) 
````
