这是 lumber-truck(小车伐木) playable 广告的完整开发会话数据集——一个真实案例:从 2026-05-26 到 07-08,开发者们在 9 个沙盒(Sandbox)里用自然语言驱动 AI Agent,把这个 3D 小游戏从早期试探做到上线打磨。287 个会话、1,317 次用户输入、417 个任务块,每一步的 thinking / 工具调用 / 代码 patch / repo 快照全部在案。
这个案例适合:① 研究「人+Agent 协作开发游戏」的真实过程;② 构造 post-training 数据(给定 repo snapshot 预测用户意图);③ 评估 Agent 在 3D 游戏开发任务上的行为模式。数据来自 Supabase agent_sessions 备份,沙盒识别依据为会话内 git remote = github.com/fps-playable/lumber-truck。
只想看看? 不用下载任何东西,直接打开在线页面:
🚜 lumber-truck 会话时间线 · 🔍 全量会话浏览器 · 📊 任务块内容分布
要做分析? 大多数人只需要这三个小文件(共 ~35MB):
要全量? 命令行整包拉取(装个 wget 或用 curl):
如果你想让另一个 Agent(Claude Code / Kimi / Codex 等)整体分析这个数据集,把下面这段 prompt 原样贴给它即可——里面包含了数据是什么、文件在哪、怎么下、分析什么的全部信息:
Agent 自助入口(机器可读):数据清单是一个 JSON,Agent 可以直接拉取后自主决定下载哪些文件:
manifest 结构:{base, snapshot_date, files: [{key, size, note}]}——完整下载地址 = base + "/" + key。
核心文件的字段 schema(Agent 解析前必读):
| 文件 | 关键字段 |
|---|---|
turns.jsonl(1 行 = 1 次用户输入) | sandbox_id, session_id, turn_index, user_text, editor_mode, agent_final_text, n_tool, n_patch, n_reasoning, patched_files, snapshot_start, snapshot_end, turn_started_at |
blocks.jsonl(1 行 = 1 个任务块) | sandbox_id, session_id, block_index, first_user_text, summary, turn_span, n_user_turns |
content_labels.jsonl | sandbox_id, session_id, block_index, content(12 大类), subtype, is_template, via_debug_panel;按 (sandbox_id, session_id, block_index) 与 blocks.jsonl 关联 |
session_index.jsonl | sandbox_id, session_id, title, time_created, time_updated, n_msgs, parent_id(子 agent 会话有 parent_id) |
root_sessions.tar 解开后的 *.json.gz | OpenCode 会话原始结构:messages[].role / parts[](text / reasoning / tool / patch 事件流) |
| 文件 / 目录 | 内容与用途 |
|---|---|
lumber-truck/turns.jsonl | 最推荐入口。1,317 个用户 turn,每行含:用户输入原文、agent 该轮行为统计(工具数/patch 数/thinking 数)、snapshot_start/end(repo 状态 SHA)、editor_mode。1 行 = 1 次用户输入。 |
lumber-truck/blocks.jsonl | 417 个「任务块」(连续的用户意图段),含块摘要、turn 跨度。意图分析的基本单元。 |
lumber-truck/content_labels.jsonl | 任务块的内容分类标签(12 大类 + subtype + 模板/调试面板旗标)。可快速筛选出 gameplay / vfx / 动效等类别的开发过程。 |
lumber-truck/session_index.jsonl | 346 条会话元数据:标题、起止时间、消息数、父子会话关系(含无内容的空会话)。 |
lumber-truck/lumber-truck-sessions-timeline.md | 人工整理的 302 会话时间线文档,按天分组、带在线浏览链接。读这个能快速建立全貌。 |
lumber-truck/root_sessions.tar | 原始层:336 个会话的完整 JSON 备份(每个 <sandbox>__<session>.json.gz),含全部 thinking/工具调用/patch 事件流。一切加工产物的真源。 |
lumber-truck/lumber-truck-main.zip | 最终 Git 源码归档。ZIP 文件名和顶层目录仍是 main;最新开发线为 codex,仓库中的实际分支名以 codex/ 开头。归档内不含 .git 元数据,分支信息以此说明为准。 |
lumber-truck/snapshot_stores/<沙盒>.tar | 8 个沙盒的 git 对象库(shadow snapshot)。turns.jsonl 里的 snapshot_start SHA 可在这里 git ls-tree/cat-file 还原任意时刻的完整 repo 文件树与内容。注意:沙盒 ic0utj3z(性能测试期)的快照已被平台回收,无法提供。 |
lumber-truck/viewer_sessions.tar.gz | 在线时间线页面用的 243 个会话数据文件(精简后的事件流)。比原始层轻,又保留了 thinking/工具/patch 结构。 |
import json # 每行一个用户 turn for line in open('turns.jsonl'): t = json.loads(line) print(t['turn_started_at'], t['user_text'][:80], '→ 工具调用', t['n_tool'], '次')
# 1. 解开对应沙盒的对象库 tar xf iqtphalyfu4ovpmekoutz.tar # 得到 git 对象库目录 REPO=$(find iqtphalyfu4ovpmekoutz -name objects -type d | head -1 | xargs dirname) # 2. 用 turns.jsonl 里的 snapshot_start SHA 查看那个时刻的文件树 git --git-dir=$REPO ls-tree -r --name-only 936ccd7a0c26af... # 查看具体文件内容 git --git-dir=$REPO show 936ccd7a0c26af...:src/gameplay.json
import gzip, json d = json.load(gzip.open('root_sessions/iqtphaly...__ses_14fa932f5....json.gz')) # d 是该会话的完整 message/part 结构:用户输入、thinking、工具调用、patch 全在
import json
labels = {} # (sandbox|session|block) → label
for line in open('blocks_content_labels.jsonl'):
l = json.loads(line)
labels[(l['sandbox_id'], l['session_id'], l['block_index'])] = l
# 例:所有 vfx_shader 类、非模板、非调试面板的真实用户意图
hits = [l for l in labels.values()
if l['content'] == 'vfx_shader' and not l['is_template']]
数据集由维护方不定期更新(新会话备份进来后重跑加工流水线并同步)。清单顶部的时间是本次快照时间;同名文件内容可能随更新变化,重要分析请记录清单里的快照日期。