{ "format": "adult-tension-e2e-record", "version": 1, "script": "pt-harbor_night_shift-pressure", "run": 3, "date": "2026-09-29", "host": { "name": "opencode", "version": "1.18.29", "model": "local-proxy/gemini-3.8-flash-high", "requested_model": "local-proxy/gemini-3.8-flash-high" }, "host_env": { "AT_HOST_API_KEY": "", "AT_HOST_BASE_URL": "http://127.0.0.1:8317/v1", "OPENCODE_CONFIG": "C:/Users/daha/AppData/Local/Temp/claude/D--projects-adult-tension-v2/0de4b3d9-fa58-4946-af19-8024e2888770/scratchpad/opencode-proxy.json" }, "project": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311", "installed_from": "D:\\projects\\adult-tension-v2\\skill\\adult-tension", "installs": [ { "skill_version": "0.3.0", "db_schema": 3, "trace": true, "digest": "7da24032e8b0e162", "after_turn": 0, "source": "D:\\projects\\adult-tension-v2\\skill\\adult-tension", "repository": { "commit": "77d3416", "uncommitted_changes": false } } ], "preflight": { "checked": [ "C:\\Users\\daha\\.config\\opencode\\skills\\adult-tension", "C:\\Users\\daha\\.config\\opencode\\skills\\dsh-adult-tension", "C:\\Users\\daha\\.agents\\skills\\adult-tension", "C:\\Users\\daha\\.agents\\skills\\dsh-adult-tension", "C:\\Users\\daha\\.claude\\skills\\adult-tension", "C:\\Users\\daha\\.claude\\skills\\dsh-adult-tension" ], "found": [] }, "setup": { "data_dir": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.at-data", "include_drafts": true }, "turns": [ { "index": 1, "conversation": "A", "input": "开一局,港口夜班,要有压力的", "expect": { "kind": "opening", "calls_max": 2, "must_call": [ "new-game" ], "budget_group": "first_opening:A", "group_max": 2, "group_must_call": [ "doctor", "new-game" ] }, "host_calls": [ { "tool": "skill", "input": { "name": "adult-tension" }, "output": "\n# Skill: adult-tension\n\n# Adult Tension\n\n面向成年人的中文互动叙事。你负责理解玩家和写正文;本地运行时负责状态、时间、随机和校验。你提交**操作**,不提交状态。运行时的返回是唯一的事实来源。\n\n不要向玩家暴露:命令名、字段名、数值、revision、错误码、工具调用过程。\n\n## 最高规则(冲突时从上到下)\n\n1. 所有角色都是明示的成年人(≥ 18);不写真实人物、不写未成年暗示。\n2. 玩家的硬边界与“暂停”必须遵守。\n3. 玩家明确的指令。\n4. 运行时已提交的状态与事实。\n5. NPC 自己的意志。\n6. 文风与随机。\n\n## 调用运行时\n\n <本 Skill 目录>/scripts/adult_tension.py --json --input-file \n\n- ``:依次试 `python3`、`python`、`py -3`,用第一个 3.10 及以上的。\n- 调用之前和之间不写任何文字(不说要运行什么、读档、提交):玩家只看到正文与回执。\n- 输入写进 UTF-8 的临时 JSON 文件再传入。**玩家的原话永远不放进命令行参数。**\n- stdout 是一个 JSON:`{\"ok\", \"data\", \"error\"}`。\n- 每个写操作带 `request_id`:用上一次返回里的 `next_request_id`。\n- 会话内的写操作(`commit-turn`、`undo-turn`、`save-slot`、`set-*`)还要带 `session_id` 与 `expected_revision`(上一次返回的 `revision`)。\n- 超时、没有输出、输出不是 JSON:用**同一个** `request_id` 重试,最多 3 次。仍失败就运行 `doctor`,用一句话告诉玩家。\n- `IDEMPOTENCY_CONFLICT`:这个 `request_id` 已用于别的请求。先 `get-context` 确认上一次是否生效,再决定是否换新 `request_id` 补交。\n\n## 第一次\n\n本对话第一次玩之前运行一次 `doctor`。`ok`/`warn` 就继续;失败时按 `error.details[].hint` 告诉玩家怎么办,不自己安装软件、不改系统环境、不删数据。\n\n## 开局\n\n1. 玩家没说日常还是压力:问一句“1 日常 / 2 有压力”。只有玩家说“随便”才用 `random`。读档永远不问。\n2. 本对话里已经开过局或读过档(看对话本身,不用查),且上下文 `save.turns_since_save` > 0:先问“存档后开局 / 直接开局 / 取消”。\n3. 玩家点名的世界或题材:按 `references/worlds.md` 取 ID 放进 `locks.world_id`;没有相应的世界就说明没有现成世界,给两个选择——最接近的世界,或自定义世界(按 `references/custom_world.md` 写小世界包,放进 `new-game` 的 `custom_world`;`CONTENT_ERROR` 按 `details` 的路径改好,换新 `request_id` 重交)。\n4. 调用 `new-game`:`{\"request_id\", \"mode\": \"daily|pressure|random\", \"locks\": {\"world_id\"}, \"excludes\": {\"content_tags\", \"world_ids\"}, \"player\": {\"gender\", \"age\", \"identity_hint\", \"name\", \"title\"}, \"npc_gender_preference\"}`,只写玩家提到的部分(“不要职场”转成 `excludes`;“女性 NPC 为主”是 `mostly_female`,另有 `female_only`、`male_only`、`mostly_male`、`mixed`、`any`)。“重开 N 号”:`{\"request_id\", \"seed\": N, \"replay\": true}`。`NO_MATCH`:如实说哪条做不到、可以放宽什么。\n5. 按返回的 `opening` 写开局:\n\n 世界观:……(1–2 句,含 `rule_in_play` 这条规则在场景里起作用)\n 人物:……(玩家角色与 NPC 的姓名、明确年龄、身份,不泄露隐藏动机)\n\n (正文,不加标题,约 300–700 字;压力模式写出眼前的压力与近期期限,远期只作伏笔;结尾停在 `hook` 描述的未决动作上,不替玩家接)\n\n `opening.footer` 原样放在最后\n\n 开局正文里新写出、之后要继承的细节,在第一次提交里用 `add_fact` 记下。\n\n## 每个回合\n\n1. 判断玩家这句话是**元命令**(见命令表)还是**叙事输入**。元命令只输出回执,不写叙事。\n2. 叙事输入先判定 `action_mode`:\n - `result`:玩家写结果,作用在自己的身体、言语、物品、权限上 → 直接兑现。\n - `attempt`:意图、尝试,以及**任何作用于 NPC 身体、意志、财物的行动**(即使用了结果句式)→ 把这些 NPC 写进 `acts_on`,并各附一条 `npc_response`:`refuse` 拒绝 / `negotiate` 协商 / `partial` 有限配合 / `surface` 表面配合(写 `true_intent`)/ `genuine` 真诚配合。不作用于 NPC 的尝试写 `acts_on: []`。\n - `continue`:空输入、“继续”、“……”、“你决定” → 场景推进,至少一个可观察的变化(NPC 行动、状态变化、新事实、有人来去);玩家角色不说有意义的话、不移动、不同意任何事。\n - `wait`:玩家选择不动 → 给 NPC 行动空间。\n3. 组装一次 `commit-turn`:\n\n {\"session_id\": \"...\", \"request_id\": \"...\", \"expected_revision\": N,\n \"action_mode\": \"attempt\", \"player_input\": \"玩家原话\", \"player_authorized\": true,\n \"acts_on\": [\"npc_id\"],\n \"operations\": [\n {\"op\": \"npc_response\", \"npc_id\": \"...\", \"response\": \"partial\", \"note\": \"收下外套,只肯走到街口\"},\n {\"op\": \"relationship\", \"from\": \"npc_id\", \"to\": \"player\", \"trust_delta\": 1, \"reason\": \"他没有借机提名单的事\"},\n {\"op\": \"advance_time\", \"minutes\": 10}],\n \"content_tags\": [], \"summary\": \"第三方视角一两句\", \"open_action\": \"停在哪个未决动作\", \"quotes\": []}\n\n - `player_authorized: true` 只在玩家本人的话授权了玩家角色的移动、承诺、交易、同意、转折或设定修改时。\n - 操作(字段见 `references/operations.md`):`npc_response`、`npc_action`(重大行动带 `significant: true`,看 `can_act`)、`npc_state`、`add_fact`、`relationship`、`advance_time`(不写默认推进 3 分钟)、`move`、`enter_scene`/`exit_scene`、`event_*`、`roll`、`player_update`、`reveal_fact`、`spread_rumor`、`set_voice`、`introduce_character`/`promote_character`(明确成年,名字取自完整上下文的 `name_pool`)、`intimacy_evidence`、`identity_update`、`npc_update`、`leverage_set`/`leverage_release`、`offscreen_beat`、`twist_accept`。\n - 正文里新写出、以后要用到的细节,用 `add_fact` 记下。正文不是记忆。\n - 照上下文的 `requests` 附带:`chapter_summary` 为 true 时写 `chapter_summary`(≤300 字,第三方视角概括到上一回合为止的这一章);`prologue` 为 true 时读完整上下文的 `prologue_merge`,把旧前情与其中各章合并成 ≤300 字写进 `prologue`;没要求就不写。\n4. 只根据返回的 `applied`、`resolved_events`、`simulation`、新的 `context` 写正文。掷骰、事件到期、离屏移动与消息传播都由运行时决定,你负责描写。\n5. 页脚:`【时间】{context.clock.label}|【地点】{context.scene.location}|回合:{turn}`。叙事助手开启时(`context.preferences.assistant`),末尾加“可以:① …… ② …… ③ ……”,只给提示,不替玩家决定。\n6. 返回的 `context` 就是下一回合的依据,不需要再调 `get-context`。信息不够时可以 `get-context` 带 `\"depth\": \"full\"`;人物卡带 `detail` 的是为控制体积删减过的摘要。\n\n提交被拒时:按 `error.details` 的 `path` 与 `hint` 修正后重交,同一回合最多 2 次,玩家看不到。仍失败,用一句话请玩家换个说法。只有年龄、硬边界、暂停导致的拒绝(`SAFETY_BLOCK`)需要用一句话告诉玩家原因。`STALE_REVISION`:用错误里附带的 `context` **重新判断**再交,不能只换 revision。\n\n## 玩家主权\n\n- 玩家的结果档行动与设定冲突时,补一个最小的合理因果接住它,不说“做不到”。只有年龄、硬边界、暂停可以阻断。\n- 不替玩家角色说有意义的话(玩家只说了意图,就写动作,不编台词)、不替玩家做选择、不替玩家下情绪结论。\n- “必须 / 一定 / 确保”只锁定玩家自己的动作,锁不住 NPC 的同意。\n- 跨时间的行动(“接下来三天都去盯着”):先写第一步,再用 `event_create` 登记。\n\n## 时间、离屏与转折\n\n- 快进(“快进到晚上”“三天后”):先 `get-context` 带 `preview_time`(与 `advance_time` 同形:`until`/`days`/`minutes`),再提交一次:`advance_time` 放第一个,其后为 `preview.required_beats` 的每个 NPC 各写一条 `offscreen_beat`。正文写清到期事件的结果。\n- `offscreen_beat`:只写这个不在场 NPC 自己的行动、状态、去向、NPC 之间的关系与消息,依据他的目标与所知(预览的 `goal`、`knows`),不碰玩家角色。玩家“继续”时可以为 `requests.offscreen_beat_candidates` 里的 NPC 插一段简短离屏片段。跨度 ≥ 60 分钟或跨日时被点名的 NPC 必须有,缺了被拒,错误的 `preview` 给出补写所需。离屏推演关闭时没有离屏片段。\n- 转折:`requests.twist_offer` 出现(压力模式第一次跨日),或玩家说“来点转折”(`get-context` 带 `\"want_twist\": true`)时,正文后一句话列出候选(“可以选一个转折:① …… ② ……,或说你想要的”)。玩家选定后提交 `twist_accept`(`twist_id`,或玩家口述的 `category`+`text`),`result` 模式带 `player_authorized`。同一游戏日最多一次;玩家不理会就照常继续。\n\n## 撤销、改写、追溯\n\n- “撤销”“刚才不算”:`undo-turn`。回执“已撤销第 N 回合”,再一句话定位当前场景。最多退到本次读档或开局的那一回合。\n- “刚才不算,改成 Y”:一次 `commit-turn`,带 `\"replaces_turn\": 当前回合号`,按 Y 判定行动模式。\n- “其实……”:`action_mode: \"rewrite\"` 带 `player_authorized`,用 `add_fact`(`\"origin\": \"retcon\"`、`\"visibility\": \"private\"`、`\"known_by\": [\"player\"]`)或 `player_update` 补玩家角色自己的背景、物品、经历、称谓,可附 NPC 的反应(`npc_action`/`npc_state`)。追溯不给 NPC 追加知情、好感或同意;与已记录事实冲突会被拒:告诉玩家这与已发生的事矛盾,请换个说法。\n\n## NPC\n\n- NPC 只根据**自己知道的事实**行动(`basis_fact_ids` 必须在其信息集里);内心描写永远不成为任何人的知识(内心只用 `inner` 事实记录,不能传播)。\n- NPC 可以拒绝、讨价还价、表面答应、主动出手;重大行动有冷却。多个 NPC 在场时,他们之间也有关系和目标。\n- 表层 / 里层语态按上下文里的 `voice` 写。玩家说“别装了”“说点真心话”:同一回合用 `set_voice`(`cause: player_request`)切换;NPC 可以换语态说“不”。语态不是关系升级,和关系变化分开写原因。\n- 内心可见开启时(`preferences.inner_view`),可以单独成段写在场 NPC 没说出口的念头;玩家角色不知道这些。\n\n## 亲密与安全(完整规则见 `references/narrative.md` §7)\n\n- 同意只来自角色此刻可见的言行;沉默、含混、压力下的默许都不算。处境(债务、上下级、把柄、截止时间)永远不是同意。同意可以随时撤回,立即生效。\n- 亲密场景:逐步推进,玩家要求到哪一步就停在哪一步;每一步都写出对方的反应;玩家明确要求写出的过程不强制淡出,没要求的不擅自展开;不复读。提交带 `intimate` 或 `explicit` 标签时写 `intimate_participants`(含玩家),每个 NPC 参与者本回合要有 `partial`/`genuine` 回应或主动行动。\n- 有人开始拿捏另一个人(把柄、债务、生计)时,同一次提交用 `leverage_set` 登记;解除前这两人之间不进入亲密场景。被拒时在故事里让处境本身成为阻碍,不对玩家报错。\n- 任一方表现出停止意愿、玩家说“暂停”、触及玩家说过的边界:立即停下。\n- “边界:不要 X”:`set-boundary`(`action: add`,`text` 是玩家原话,`tags` 映射到内容标签,映射不上留空)。之后带冲突标签的提交会被拒(`SAFETY_BLOCK`);映射不上的边界由你在每次写作中遵守。\n- “暂停”(安全词、pause):`set-safety` `{\"paused\": true}`,立即停下,回到中性叙述。暂停期间带亲密或冲突标签的提交都被拒;非亲密的剧情可以继续。“换个场景”:`{\"paused\": true, \"change_scene\": true}`,然后写一个新的非亲密场景。暂停中玩家说“继续 / 恢复 / 解除暂停”:`{\"paused\": false}`,从停下的那一点重新开始,对方的反应重新判断,不接着升级。\n- 不在正文里逐回合重复免责声明或安全提醒。\n\n## 命令与别名\n\n元命令只输出回执(返回的 `receipt`),不写叙事。\n\n| 玩家说 | 你做 |\n|---|---|\n| 开局、新游戏、开局 日常 / 压力、开局 港口、重开 N 号 | 开局流程 |\n| 自定义世界 …… | 写小世界包 → `new-game`(`custom_world`) |\n| 世界列表 | `list-worlds` |\n| 继续、c、……、空输入 | `commit-turn`(`continue`) |\n| 存档 [名称]、s、快速存档、qs / 另存为 名称 | `save-slot`(`name`;不给名字存到当前槽或自动命名)/ 另加 `\"save_as\": true` |\n| 读档 [名称]、l | 有名称就直接 `load-slot`(不存在时错误里列有现有存档,让玩家选);没给名称才先 `list-slots`。回执后用 `resume` 写两三句前情,从未决动作的前一刻接着写,不重复开局 |\n| 存档列表 / 删除存档 名称 | `list-slots` / 先问“确定删除「名称」吗?”,确认后 `delete-slot` 带 `\"confirm\": true` |\n| 继续上次、恢复 | `list-sessions`:一个就接上,多个列出让玩家选;接上时 `get-context` 带 `\"depth\": \"full\"`,写两三句前情再接续。当前局暂停中说“恢复”:问“恢复上次会话 / 读取存档 / 解除暂停” |\n| 导出 [存档名] | `export-save`(`session_id` 或 `slot`;玩家给了路径才写 `path`),告诉玩家文件路径 |\n| 导入 路径 / 粘贴的内容 | `import-save`(`path` 或 `data`,可带 `slot`),回执后写两三句前情接续 |\n| 状态 / 状态+ / 调试 | `status`(`level`: `brief` / `detail` / `debug`),`lines`(和 `sections`)原样转述;六行编号 ①–⑥ |\n| 边界:不要 X / 撤销边界 X | `set-boundary`(`add` / `remove`) |\n| 暂停、安全词、pause / 换个场景 | `set-safety` |\n| 内心可见 / 叙事助手 / 离屏推演 开关、语态 某人 表/里、人称、NPC 性别偏好 | `set-preferences`(`inner_view`、`assistant`、`offscreen_simulation`、`voice: {\"npc_id\", \"voice\"}`、`person`、`npc_gender_preference`) |\n| 撤销 / 刚才不算 / 刚才不算,改成 Y / 其实…… | 见“撤销、改写、追溯” |\n| 快进到……、跳到……、来点转折 | 见“时间、离屏与转折” |\n| 帮助、h、? | 列出上面的说法 |\n\n缺少对象时追问一次,不猜。存档名已被占用(`SLOT_CONFLICT`,`reason: exists`):问“「名称」已存在,要覆盖吗?”,确认后带 `\"overwrite\": true` 重交;`changed_elsewhere`:给“A 读取最新 / B 另存为新名 / C 取消”。导入被拒时如实说文件损坏或版本太新,不猜内容。\n\n## 参考资料(需要时再读)\n\n- `references/narrative.md`:完整叙事规则\n- `references/operations.md`:全部操作与提交字段\n- `references/commands.md`:全部命令的输入输出、错误码与退出码\n- `references/worlds.md`:世界列表\n- `references/custom_world.md`:自定义世界的写法、下限与示例\n- `references/troubleshooting.md`:环境问题、数据目录、升级与卸载\n\nBase directory for this skill: D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\nRelative paths in this skill (e.g., scripts/, reference/) are relative to this base directory.\nNote: file list is sampled.\n\n\nD:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\scripts\\adult_tension.py\nD:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\runtime\\adult_tension\\__init__.py\nD:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\runtime\\adult_tension\\schema.py\nD:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\runtime\\adult_tension\\projections\\__init__.py\nD:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\runtime\\adult_tension\\projections\\status.py\nD:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\runtime\\adult_tension\\projections\\context.py\nD:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\runtime\\adult_tension\\persistence\\__init__.py\nD:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\runtime\\adult_tension\\persistence\\repo.py\nD:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\runtime\\adult_tension\\persistence\\db.py\nD:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\runtime\\adult_tension\\paths.py\n\n", "status": "completed" }, { "tool": "read", "input": { "filePath": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\references\\worlds.md" }, "output": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\references\\worlds.md\nfile\n\n1: \n2: \n3: # 世界列表\n4: \n5: 内容版本:`2026.10.0-dev1`。只有 `released` 的世界参与随机开局、出现在 `list-worlds` 里。\n6: \n7: | 世界 | ID | 时代 | 地方 | 一句话 | 模式 | 状态 |\n8: |---|---|---|---|---|---|---|\n9: | 成年创作者与艺术季 | `art_season_studios` | 当代(艺术季的两周) | 城市旧厂区改成的独立创作社区 | 两周的艺术季,旧厂区里的工作室、排练厅、版画工作坊和一间开到凌晨的酒吧挤在一起;合作与竞争都发生在所有人都看得见的地方。 | 日常、有压力 | review |\n10: | 幕末町屋与道场 | `bakumatsu_machiya` | 幕末(文久三年,1863 年) | 京都三条一带的町屋街区与一处小道场 | 文久三年的京都,时局一夜三变;町人、浪士、藩士、艺人住在同一条町上,礼法之下各有去处。 | 日常、有压力 | review |\n11: | 港口夜班 | `harbor_night_shift` | 1990 年代末(1998 年) | 南方沿海港城的集装箱码头 | 集装箱码头的夜班从晚八点到早八点,灯一直亮到天明,人很少,交接班的十分钟里什么都可能发生。 | 日常、有压力 | review |\n12: | 旧町神怪与灯会 | `lantern_festival_town` | 架空的旧时乡镇(不指明朝代) | 河湾上的灯会小镇 | 灯会七夜,人与非人共用一条长街;规矩写在契约与称谓里,叫错一个名字就是大事。 | 日常、有压力 | review |\n13: | 民国报馆与手艺街 | `republic_press_street` | 1920 年代(民国十五年) | 通商口岸城市的报馆与手艺街 | 《江声晚报》每晚十一点截稿;排字房、裁缝铺、照相馆、茶楼、当铺挨在一条街上,谁的消息都藏不住太久。 | 日常、有压力 | review |\n14: | 寒冬避难所公共生活 | `winter_shelter` | 长冬第三年(当代之后,不写高科技) | 旧体育馆改成的公共避难所 | 长冬第三年,几百人住在一座旧体育馆里;配给、轮值、床位和天气窗口,决定每个人的一天。 | 日常、有压力 | review |\n\n(End of file - total 14 lines)\n", "status": "completed" }, { "tool": "read", "input": { "offset": 1, "limit": 100, "filePath": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\references\\commands.md" }, "output": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\references\\commands.md\nfile\n\n1: \n2: \n3: # 命令参考\n4: \n5: 调用:` scripts/adult_tension.py --json [--input-file PATH] [--data-dir PATH]`\n6: \n7: - 输入是一个 JSON 对象,来自 `--input-file`(UTF-8,可带 BOM)。需要输入的命令在没有 `--input-file` 且 stdin 不是终端时读取 stdin;可选输入只从 `--input-file` 读取(`--input-file -` 表示 stdin)。\n8: - 输出是一个信封 `{\"ok\", \"data\", \"error\"}`,以 UTF-8 字节写到 stdout。成功与失败都附带 `next_request_id`(成功在 `data` 里,失败在 `error` 里),下一次写操作直接用它。\n9: - 全局参数:`--json`(输出 JSON,始终如此)、`--pretty`(缩进输出)、`--debug`、`--input-file PATH`、`--data-dir PATH`。\n10: - 写操作都带 `request_id`;会话内的写操作还带 `session_id` 与 `expected_revision`。同一 `request_id` + 同一输入重放时返回原响应并标记 `replayed: true`。\n11: - 开发开关(环境变量,由测试环境设置,玩家不需要):`ADULT_TENSION_HOME` 指定数据目录;`ADULT_TENSION_INCLUDE_DRAFTS=1` 让未发布的世界参与开局与世界列表;`ADULT_TENSION_TRACE=<文件>` 把每次调用(参数、输入、信封、耗时)追加到该文件,供端到端评测采集。\n12: \n13: ## 命令一览\n14: \n15: | 命令 | 类别 | 输入 | 作用 | 专用参数 |\n16: |---|---|---|---|---|\n17: | `commit-turn` | session_write | 必填 | 叙事回合:提交操作,返回结果与下一回合上下文 | — |\n18: | `delete-slot` | session_write | 必填 | 删除存档(需要 confirm: true) | — |\n19: | `doctor` | diagnostic | 无 | 检查环境并完成首次初始化(幂等) | — |\n20: | `export-save` | read | 必填 | 把会话或存档导出为文件(带完整性校验值) | — |\n21: | `get-context` | read | 必填 | 当前上下文(brief / full);可带快进预览 preview_time 与转折候选 want_twist | — |\n22: | `import-save` | create | 必填 | 导入导出文件,得到一个新会话(可同时写入存档槽) | — |\n23: | `list-sessions` | read | 可选 | 最近的会话(续玩、恢复) | — |\n24: | `list-slots` | read | 无 | 存档列表 | — |\n25: | `list-worlds` | read | 可选 | 世界列表、一句话介绍、支持的模式 | `--include-drafts` |\n26: | `load-slot` | create | 必填 | 读档:创建新的会话副本,原存档不变 | — |\n27: | `new-game` | create | 必填 | 开局 | `--include-drafts` |\n28: | `save-slot` | session_write | 必填 | 存档(省略名字时存到当前槽或自动命名) | — |\n29: | `set-boundary` | session_write | 必填 | 登记或撤销硬边界 | — |\n30: | `set-preferences` | session_write | 必填 | 内心可见、叙事助手、离屏推演、语态、人称、配对偏好 | — |\n31: | `set-safety` | session_write | 必填 | 暂停、恢复、换个场景 | — |\n32: | `smoke` | dev | 可选 | 在临时数据目录用假叙述者跑一条短局 | `--seed`、`--turns` |\n33: | `status` | read | 必填 | 状态:brief 六行 / detail 状态+ / debug 调试 | — |\n34: | `undo-turn` | session_write | 必填 | 撤销上一回合(最多退到本次读档或开局) | — |\n35: | `verify-content` | dev | 可选 | 校验全部内容(结构、语义、时代、固定种子开局、多样性) | `--world`、`--stats`、`--skip-diversity`、`--file` |\n36: | `version` | read | 无 | Skill、内容、存档格式、RNG 版本 | — |\n37: \n38: ## 输入字段\n39: \n40: ### `commit-turn`\n41: \n42: 操作列表的字段见 `references/operations.md`。\n43: \n44: | 字段 | 类型 | 必填 | 说明 |\n45: |---|---|---|---|\n46: | `session_id` | 字符串,≤40 字,会话 ID,形如 s_1a2b3c4d | 是 | |\n47: | `request_id` | 字符串,≤64 字,8–64 位 [A-Za-z0-9_-];直接用上一次返回的 next_request_id | 是 | |\n48: | `expected_revision` | 整数 1..1000000000 | 是 | 上一次返回的 revision |\n49: | `action_mode` | 枚举:`result` / `attempt` / `rewrite` / `continue` / `wait` | 是 | result / attempt / rewrite(“其实……”)/ continue / wait |\n50: | `player_input` | 字符串,≤2000 字 | 是 | 玩家这一句的原话(继续时可为空字符串) |\n51: | `player_authorized` | 布尔 | 否,默认 `false` | 玩家本人的话授权了玩家角色的移动、承诺、交易、同意、转折或设定修改时为 true |\n52: | `acts_on` | 数组(字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40},0–8 项) 或 null | 否,默认 `null` | 玩家行动作用到的 NPC(身体、意志、财物);attempt 不作用于任何 NPC 时写 [] |\n53: | `operations` | 数组(操作对象(按 `op` 区分),0–40 项) | 是 | 操作列表(可以为空数组) |\n54: | `content_tags` | 数组(字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40},0–12 项) | 是 | 本回合正文涉及的内容标签(可为空数组);标签表见完整上下文的 tags |\n55: | `intimate_participants` | 数组(字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40},0–6 项) | 否,默认 `[]` | content_tags 含 intimate 或 explicit 时必填:亲密参与者(含玩家) |\n56: | `summary` | 字符串,≤120 字 | 是 | 本回合发生了什么,第三方视角,≤120 字 |\n57: | `open_action` | 字符串,≤80 字 | 是 | 回合停在哪里、谁在等谁,≤80 字 |\n58: | `quotes` | 数组(字符串,≤80 字,0–3 项) | 否,默认 `[]` | ≤3 条对后续有意义的原话,每条 ≤80 字 |\n59: | `chapter_summary` | 字符串,≤300 字 或 null | 否,默认 `null` | 上下文 requests.chapter_summary 为 true 时必填:上一章(到上一回合为止)的摘要,≤300 字;没有要求时不写 |\n60: | `prologue` | 字符串,≤300 字 或 null | 否,默认 `null` | 上下文 requests.prologue 为 true 时必填:把完整上下文 prologue_merge 里的旧前情与最早几章合并成一段前情,≤300 字;没有要求时不写 |\n61: | `replaces_turn` | 整数 1..1000000 或 null | 否,默认 `null` | “刚才不算,改成……”:填当前最后一个回合的回合号,引擎在同一事务里撤销它再应用本次提交 |\n62: \n63: ### `delete-slot`\n64: \n65: | 字段 | 类型 | 必填 | 说明 |\n66: |---|---|---|---|\n67: | `session_id` | 字符串,≤40 字,会话 ID,形如 s_1a2b3c4d | 是 | |\n68: | `request_id` | 字符串,≤64 字,8–64 位 [A-Za-z0-9_-];直接用上一次返回的 next_request_id | 是 | |\n69: | `expected_revision` | 整数 1..1000000000 | 是 | 上一次返回的 revision |\n70: | `name` | 字符串,≤60 字 | 是 | |\n71: | `confirm` | 布尔 | 否,默认 `false` | 玩家确认删除后才为 true |\n72: \n73: ### `export-save`\n74: \n75: | 字段 | 类型 | 必填 | 说明 |\n76: |---|---|---|---|\n77: | `session_id` | 字符串,≤40 字,会话 ID,形如 s_1a2b3c4d 或 null | 否,默认 `null` | 导出这个会话的当前状态 |\n78: | `slot` | 字符串,≤60 字 或 null | 否,默认 `null` | 或导出这个存档 |\n79: | `path` | 字符串,≤400 字 或 null | 否,默认 `null` | 玩家明确给出的绝对路径(.json);不给时写到数据目录的 exports/ |\n80: | `overwrite` | 布尔 | 否,默认 `false` | |\n81: \n82: ### `get-context`\n83: \n84: | 字段 | 类型 | 必填 | 说明 |\n85: |---|---|---|---|\n86: | `session_id` | 字符串,≤40 字,会话 ID,形如 s_1a2b3c4d | 是 | |\n87: | `depth` | 枚举:`brief` / `full` | 否,默认 `\"brief\"` | |\n88: | `preview_time` | 对象(预览推进) 或 null | 否,默认 `null` | 快进预览:返回目标时钟、将到期的事件与确定性结果、必须写离屏片段的 NPC(附目标与信息集)、将到期的状态;不改变状态 |\n89: | `want_twist` | 布尔 | 否,默认 `false` | 玩家说“来点转折”时为 true:返回 2–3 个类别不同的转折候选 |\n90: \n91: #### `preview_time` 的字段\n92: \n93: | 字段 | 类型 | 必填 | 说明 |\n94: |---|---|---|---|\n95: | `minutes` | 整数 1..43200 | 否 | |\n96: | `until` | 枚举:`morning` / `noon` / `evening` / `night` / `next_morning` | 否 | |\n97: | `days` | 整数 1..30 | 否 | |\n98: \n99: ### `import-save`\n100: \n\n(Showing lines 1-100 of 297. Use offset=101 to continue.)\n", "status": "completed" }, { "tool": "read", "input": { "limit": 70, "offset": 125, "filePath": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\references\\commands.md" }, "output": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\references\\commands.md\nfile\n\n125: | `request_id` | 字符串,≤64 字,8–64 位 [A-Za-z0-9_-];直接用上一次返回的 next_request_id | 是 | |\n126: | `name` | 字符串,≤60 字 | 是 | |\n127: \n128: ### `new-game`\n129: \n130: | 字段 | 类型 | 必填 | 说明 |\n131: |---|---|---|---|\n132: | `request_id` | 字符串,≤64 字,8–64 位 [A-Za-z0-9_-];直接用上一次返回的 next_request_id | 是 | |\n133: | `mode` | 枚举:`daily` / `pressure` / `random` 或 null | 否,默认 `null` | daily 日常 / pressure 有压力 / random 玩家明确说“随便”时;replay 时可省略 |\n134: | `seed` | 整数 1..999999 或 null | 否,默认 `null` | |\n135: | `replay` | 布尔 | 否,默认 `false` | “重开 N 号”:按本机记录的该种子开局条件复现 |\n136: | `locks` | 对象(锁定) | 否,默认 `{}` | |\n137: | `excludes` | 对象(排除) | 否,默认 `{}` | |\n138: | `player` | 对象(玩家设定) | 否,默认 `{}` | |\n139: | `npc_gender_preference` | 枚举:`any` / `mostly_female` / `mostly_male` / `female_only` / `male_only` / `mixed` | 否,默认 `\"any\"` | |\n140: | `custom_world` | 自定义世界包 或 null | 否,默认 `null` | |\n141: | `preferences` | 对象(偏好) | 否,默认 `{}` | |\n142: | `include_drafts` | 布尔 | 否,默认 `false` | |\n143: \n144: #### `locks` 的字段\n145: \n146: | 字段 | 类型 | 必填 | 说明 |\n147: |---|---|---|---|\n148: | `world_id` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} 或 null | 否,默认 `null` | |\n149: | `location_id` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} 或 null | 否,默认 `null` | |\n150: | `combo_id` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} 或 null | 否,默认 `null` | |\n151: | `activity_id` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} 或 null | 否,默认 `null` | |\n152: | `pressure_id` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} 或 null | 否,默认 `null` | |\n153: | `hook_id` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} 或 null | 否,默认 `null` | |\n154: | `identity_id` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} 或 null | 否,默认 `null` | |\n155: \n156: #### `excludes` 的字段\n157: \n158: | 字段 | 类型 | 必填 | 说明 |\n159: |---|---|---|---|\n160: | `content_tags` | 数组(字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40},0–20 项) | 否,默认 `[]` | |\n161: | `world_ids` | 数组(字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40},0–20 项) | 否,默认 `[]` | |\n162: | `location_ids` | 数组(字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40},0–20 项) | 否,默认 `[]` | |\n163: \n164: #### `player` 的字段\n165: \n166: | 字段 | 类型 | 必填 | 说明 |\n167: |---|---|---|---|\n168: | `gender` | 枚举:`female` / `male` / `nonbinary` 或 null | 否,默认 `null` | |\n169: | `age` | 整数 0..120 或 null | 否,默认 `null` | |\n170: | `age_band` | 数组(整数 0..120,2–2 项) 或 null | 否,默认 `null` | |\n171: | `identity_hint` | 字符串,≤20 字 或 null | 否,默认 `null` | |\n172: | `social_position` | 枚举:`low` / `equal` / `high` 或 null | 否,默认 `null` | |\n173: | `name` | 字符串,≤12 字 或 null | 否,默认 `null` | |\n174: | `title` | 字符串,≤12 字 或 null | 否,默认 `null` | |\n175: \n176: #### `preferences` 的字段\n177: \n178: | 字段 | 类型 | 必填 | 说明 |\n179: |---|---|---|---|\n180: | `inner_view` | 布尔 | 否 | |\n181: | `assistant` | 布尔 | 否 | |\n182: | `offscreen_simulation` | 布尔 | 否 | |\n183: | `person` | 枚举:`second` / `first` / `third` | 否 | |\n184: \n185: ### `save-slot`\n186: \n187: | 字段 | 类型 | 必填 | 说明 |\n188: |---|---|---|---|\n189: | `session_id` | 字符串,≤40 字,会话 ID,形如 s_1a2b3c4d | 是 | |\n190: | `request_id` | 字符串,≤64 字,8–64 位 [A-Za-z0-9_-];直接用上一次返回的 next_request_id | 是 | |\n191: | `expected_revision` | 整数 1..1000000000 | 是 | 上一次返回的 revision |\n192: | `name` | 字符串,≤60 字 或 null | 否,默认 `null` | |\n193: | `overwrite` | 布尔 | 否,默认 `false` | |\n194: | `save_as` | 布尔 | 否,默认 `false` | |\n\n(Showing lines 125-194 of 297. Use offset=195 to continue.)\n", "status": "completed" }, { "tool": "bash", "input": { "command": "python --version || py -3 --version" }, "output": "Python 3.12.10\r\n", "status": "completed" }, { "tool": "bash", "input": { "command": "python \"D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\scripts\\adult_tension.py\" doctor --json" }, "output": "{\"ok\":true,\"data\":{\"status\":\"ok\",\"fast_path\":false,\"skill_version\":\"0.3.0\",\"content_version\":\"2026.10.0-dev1\",\"skill_root\":\"D:\\\\projects\\\\at-e2e\\\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\\\.claude\\\\skills\\\\adult-tension\",\"data_dir\":\"D:\\\\projects\\\\at-e2e\\\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\\\.at-data\",\"data_dir_source\":\"env\",\"checks\":[{\"id\":\"python\",\"status\":\"ok\",\"message\":\"Python 3.12.10(C:\\\\Users\\\\daha\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python312\\\\python.exe)\",\"hint\":null},{\"id\":\"data_dir\",\"status\":\"ok\",\"message\":\"数据目录可写:D:\\\\projects\\\\at-e2e\\\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\\\.at-data(来源:env)\",\"hint\":null},{\"id\":\"sqlite\",\"status\":\"ok\",\"message\":\"SQLite 3.49.1\",\"hint\":null},{\"id\":\"migrations\",\"status\":\"ok\",\"message\":\"数据库已从 schema 0 迁移到 3\",\"hint\":null},{\"id\":\"skill_files\",\"status\":\"ok\",\"message\":\"Skill 根目录:D:\\\\projects\\\\at-e2e\\\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\\\.claude\\\\skills\\\\adult-tension\",\"hint\":null},{\"id\":\"content\",\"status\":\"ok\",\"message\":\"内容版本 2026.10.0-dev1,6 个世界可开局\",\"hint\":null}],\"next_request_id\":\"r_7b29c64c9336\"},\"error\":null}", "status": "completed" }, { "tool": "write", "input": { "filePath": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.host\\tmp\\opencode\\new_game.json", "content": "{\n \"request_id\": \"r_7b29c64c9336\",\n \"mode\": \"pressure\",\n \"locks\": {\n \"world_id\": \"harbor_night_shift\"\n }\n}\n" }, "output": "Wrote file successfully.", "status": "completed" }, { "tool": "bash", "input": { "command": "python \"D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\scripts\\adult_tension.py\" new-game --json --input-file \"D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.host\\tmp\\opencode\\new_game.json\"" }, "output": "{\"ok\":true,\"data\":{\"session_id\":\"s_1e9840a4\",\"revision\":1,\"turn\":1,\"seed\":654935,\"conditions_restored\":false,\"opening\":{\"seed\":654935,\"mode\":\"pressure\",\"signature\":\"harbor_night_shift|container_yard|combo_agent_number|p:p_overweight|h_redpacket\",\"world\":{\"title\":\"港口夜班\",\"era\":\"1990 年代末(1998 年)\",\"region\":\"南方沿海港城的集装箱码头\",\"premise\":\"集装箱码头的夜班从晚八点到早八点,灯一直亮到天明,人很少,交接班的十分钟里什么都可能发生。\",\"tone\":[\"潮湿\",\"疲惫\",\"克制的热\"],\"style_hint\":\"短句,多写声音、气味与灯光,少写心理独白;粤语词点到即止。\",\"date_label\":\"一九九八年,台风季\",\"rule_in_play\":\"船公司的人逢年过节、赶船期都塞红包;收不收、收多少,班组里人人心里有数,只是没人写在纸上。\",\"customs\":[\"新来的人第一个夜班要请全班组喝一次糖水,叫“开工糖水”,糖水钱不能找人分摊。\",\"交班时要把保温壶灌满开水留给下一班;空壶留给别人,一个月都会有人阴阳怪气。\"]},\"player\":{\"name\":\"郭少青\",\"title\":\"阿青\",\"age\":38,\"gender\":\"male\",\"role\":\"夜班调度\",\"social_position\":\"equal\",\"baseline\":\"坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。\",\"resources\":[\"排吊装顺序的权力\",\"能切到任何一个频道\"],\"reputation\":\"做事公道,但谁都不敢得罪\"},\"npcs\":[{\"id\":\"ship_agent_rep\",\"name\":\"潘宝珠\",\"call\":\"老潘\",\"age\":46,\"gender\":\"female\",\"role\":\"船公司驻港代表\",\"adult_context\":\"船公司派驻港口的代表,正式雇员\",\"appearance\":\"手腕上戴一块很旧的表,说是父亲留下的\",\"surface_voice\":\"“辛苦辛苦,一点心意,饮茶。”——客气,滴水不漏\"},{\"id\":\"shift_lead\",\"name\":\"梁嘉欣\",\"call\":\"梁姐\",\"age\":49,\"gender\":\"female\",\"role\":\"夜班装卸班组长\",\"adult_context\":\"在码头干了十五年的装卸班组长,正式在编\",\"appearance\":\"左手缺了半截小指,夹烟的姿势很特别\",\"surface_voice\":\"“都给我动起来!七号那边还差三个柜!”——嗓门大,带着笑\"}],\"scene\":{\"location_id\":\"container_yard\",\"location\":\"堆场通道\",\"detail\":\"集装箱码成五层高的窄巷,灯照不到中间,偶尔能听见某个箱子里有东西在响。\",\"privacy\":\"semi\",\"visibility\":\"只有巡场的保安骑着单车偶尔经过\",\"affordances\":[\"借箱子挡住视线\",\"抄近路去闸口\",\"贴着箱壁听里面的动静\"],\"time_label\":\"第一天 23:30\"},\"tension\":{\"engines\":[\"都知道第三排最底下那个柜子有问题,却谁也没有说破\",\"一方是另一方入行时的师傅,教过的东西都还记着\"],\"chemistry\":\"潘宝珠要船准时开走,梁嘉欣要班组平安收工,而你手里有一个两个人都想知道的数字——谁更需要谁,要看今晚怎么走。\",\"meeting_reason\":\"三个人今晚都在等同一条船装完\"},\"hook\":{\"kind\":\"request\",\"text\":\"潘宝珠把一个红包压在你手边的单据底下,说“饮茶”\"},\"person\":\"second\",\"pressure\":{\"title\":\"超重的柜子\",\"trigger\":\"磅房报上来一个柜子比单据重了四吨,放行单上等着你表态\",\"objective\":\"在装船之前弄清楚多出来的四吨是什么\",\"choice\":\"放行,还是拦下来得罪船公司\",\"immediate\":\"吊机十五分钟后就要吊到这个柜子\",\"near\":{\"text\":\"船天亮前必须开,装船单要在五点前交上去\",\"due_label\":\"第二天 05:00\"},\"foreshadow\":\"下个月船公司要续签码头合同\",\"location_modifier\":\"超重的柜子要拖去磅房,一定会经过保安的巡逻线。\"},\"footer\":\"【时间】第一天 23:30|【地点】堆场通道|回合:1|种子:654935\"},\"context\":{\"depth\":\"full\",\"session_id\":\"s_1e9840a4\",\"revision\":1,\"turn\":1,\"mode\":\"pressure\",\"clock\":{\"day\":1,\"minute\":1410,\"label\":\"第一天 23:30\"},\"scene\":{\"id\":\"sc1\",\"location_id\":\"container_yard\",\"location\":\"堆场通道\",\"privacy\":\"semi\",\"present\":[\"player\",\"ship_agent_rep\",\"shift_lead\"]},\"player\":{\"name\":\"郭少青\",\"title\":\"阿青\",\"age\":38,\"gender\":\"male\",\"role\":\"夜班调度\",\"social_position\":\"equal\",\"baseline\":\"坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。\",\"resources\":[\"排吊装顺序的权力\",\"能切到任何一个频道\"],\"reputation\":\"做事公道,但谁都不敢得罪\",\"risks\":[\"上个月替人把一个柜子的吊装顺序往后挪了两晚\"],\"background\":[]},\"present_npcs\":[{\"id\":\"ship_agent_rep\",\"name\":\"潘宝珠\",\"age\":46,\"gender\":\"female\",\"tier\":\"major\",\"role\":\"船公司驻港代表\",\"mood\":null,\"voice\":\"surface\",\"can_act\":true,\"trust_to_player\":0,\"tension\":1,\"stage\":\"陌生\",\"goal\":\"让船准时开走\",\"stance\":\"谁有用就对谁客气\"},{\"id\":\"shift_lead\",\"name\":\"梁嘉欣\",\"age\":49,\"gender\":\"female\",\"tier\":\"major\",\"role\":\"夜班装卸班组长\",\"mood\":null,\"voice\":\"surface\",\"can_act\":true,\"trust_to_player\":1,\"tension\":0,\"stage\":\"熟络\",\"goal\":\"给自己找一个接班人\",\"stance\":\"先把你当自己人,一旦发现你两头说话就翻脸\"}],\"nearby\":[{\"id\":\"bg_gate_guard\",\"name\":\"甘永光\",\"role\":\"闸口门卫\"},{\"id\":\"bg_patrol\",\"name\":\"冯家宁\",\"role\":\"巡场保安\"}],\"due_soon\":[{\"id\":\"e1\",\"kind\":\"deadline\",\"title\":\"超重的柜子·眼前\",\"in_minutes\":15,\"due_label\":\"第一天 23:45\",\"involves_player\":true},{\"id\":\"e2\",\"kind\":\"deadline\",\"title\":\"超重的柜子·近期\",\"in_minutes\":330,\"due_label\":\"第二天 05:00\",\"involves_player\":true},{\"id\":\"e3\",\"kind\":\"foreshadow\",\"title\":\"超重的柜子·伏笔\",\"in_minutes\":7200,\"due_label\":\"第六天 23:30\",\"involves_player\":true}],\"known_facts\":[{\"id\":\"f7\",\"text\":\"三个人今晚都在等同一条船装完\",\"visibility\":\"public\"},{\"id\":\"f8\",\"text\":\"都知道第三排最底下那个柜子有问题,却谁也没有说破\",\"visibility\":\"public\"},{\"id\":\"f9\",\"text\":\"一方是另一方入行时的师傅,教过的东西都还记着\",\"visibility\":\"public\"},{\"id\":\"f10\",\"text\":\"磅房报上来一个柜子比单据重了四吨,放行单上等着你表态\",\"visibility\":\"public\"},{\"id\":\"f5\",\"text\":\"郭少青:坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。\",\"visibility\":\"private\"},{\"id\":\"f6\",\"text\":\"郭少青:上个月替人把一个柜子的吊装顺序往后挪了两晚\",\"visibility\":\"private\"}],\"recent\":[],\"last_quotes\":[],\"open_action\":null,\"scene_responses\":[],\"safety\":{\"paused\":false,\"boundaries\":[],\"leverage\":[]},\"preferences\":{\"inner_view\":false,\"assistant\":false,\"offscreen_simulation\":true,\"person\":\"second\"},\"save\":{\"current_slot\":null,\"turns_since_save\":0},\"requests\":{\"chapter_summary\":false,\"prologue\":false,\"twist_offer\":null,\"offscreen_beat_candidates\":[]},\"size_bytes\":16423,\"world\":{\"title\":\"港口夜班\",\"era\":\"1990 年代末(1998 年)\",\"region\":\"南方沿海港城的集装箱码头\",\"premise\":\"集装箱码头的夜班从晚八点到早八点,灯一直亮到天明,人很少,交接班的十分钟里什么都可能发生。\",\"tone\":[\"潮湿\",\"疲惫\",\"克制的热\"],\"style_hint\":\"短句,多写声音、气味与灯光,少写心理独白;粤语词点到即止。\",\"rules\":[\"夜班 20:00 上岗、次日 8:00 下班,凌晨两点所有人到控制塔签到交接;签到簿谁都能翻,缺签要写说明交给主任。\",\"对讲机公共频道所有当班的人都听得见,谁说了什么第二天全码头都知道;私事只能切到六频道,可调度偶尔会抽查。\",\"箱号、铅封号、重量三样对不上的柜,要当班理货员在理货单上签字才能放行——签了字,出了事就是签字人的。\",\"海关查验不提前打招呼,查验车进闸口时门卫会在公共频道喊一声“大车进场”,从闸口开到泊位要二十分钟。\",\"船公司的人逢年过节、赶船期都塞红包;收不收、收多少,班组里人人心里有数,只是没人写在纸上。\",\"台风警报升到最高一级,码头全面停工,吊机锁死,所有人撤进塔楼一楼,风停之前谁也不许出去。\"],\"customs\":[\"收工后去闸口外的茶餐厅吃一碗云吞面,是班组默认的散伙仪式;谁请客轮着来,轮到的人装不知道会被记很久。\",\"红包要当着人面推两次再收;推一次就收显得贪,推第三次就是不给面子。\",\"新来的人第一个夜班要请全班组喝一次糖水,叫“开工糖水”,糖水钱不能找人分摊。\",\"交班时要把保温壶灌满开水留给下一班;空壶留给别人,一个月都会有人阴阳怪气。\",\"塔吊司机上塔前在梯子第一级拍三下,说是跟吊臂打招呼;谁替别人拍了,就是认了交情。\"]},\"locations\":[{\"id\":\"berth_7\",\"name\":\"七号泊位\",\"privacy\":\"public\",\"detail\":\"吊臂的影子一格一格扫过地面,海水拍着缆桩,空气里是柴油和铁锈的味道。\",\"affordances\":[\"躲进两排集装箱的夹缝\",\"借吊机的轰鸣说悄悄话\",\"爬上跨运车的驾驶室避雨\"],\"exits\":[\"control_tower\",\"container_yard\",\"tool_shed\"]},{\"id\":\"control_tower\",\"name\":\"控制塔\",\"privacy\":\"semi\",\"detail\":\"三楼调度室一整面玻璃对着泊位,签到簿压在对讲机旁边,吊扇吱呀作响。\",\"affordances\":[\"翻看签到簿\",\"切换对讲机频道\",\"在楼梯拐角说话没人看见\"],\"exits\":[\"berth_7\",\"rest_room\"]},{\"id\":\"rest_room\",\"name\":\"休息室\",\"privacy\":\"semi\",\"detail\":\"塔楼一楼的休息室,一台旧风扇、一张折叠床、一台只收得到两个台的电视。\",\"affordances\":[\"轮流在折叠床上眯一会儿\",\"用电热水壶煮公仔面\",\"关了灯看窗外的船灯\"],\"exits\":[\"control_tower\",\"clinic\"]},{\"id\":\"clinic\",\"name\":\"医务室\",\"privacy\":\"semi\",\"detail\":\"塔楼一楼尽头的医务室,一张铁床、一个上锁的药柜,日光灯管发出细细的嗡声。\",\"affordances\":[\"处理伤口\",\"开一张病假条\",\"在铁床边坐一会儿\"],\"exits\":[\"rest_room\"]},{\"id\":\"tool_shed\",\"name\":\"工具房\",\"privacy\":\"private\",\"detail\":\"堆满缆绳和生锈的卸扣,铁皮门从外面挂锁,下雨时整间屋子像鼓一样响。\",\"affordances\":[\"躲雨\",\"把东西藏进缆绳堆\",\"关上门说话\"],\"exits\":[\"berth_7\"]},{\"id\":\"container_yard\",\"name\":\"堆场通道\",\"privacy\":\"semi\",\"detail\":\"集装箱码成五层高的窄巷,灯照不到中间,偶尔能听见某个箱子里有东西在响。\",\"affordances\":[\"借箱子挡住视线\",\"抄近路去闸口\",\"贴着箱壁听里面的动静\"],\"exits\":[\"berth_7\",\"teahouse\"]},{\"id\":\"teahouse\",\"name\":\"闸口外的茶餐厅\",\"privacy\":\"public\",\"detail\":\"凌晨三点还亮着灯,墙上的电视开着没声音,老板娘记得每个夜班的人要几分糖。\",\"affordances\":[\"抢最后一份叉烧\",\"在卡座里压低声音谈事\",\"借柜台上的电话打出去\"],\"exits\":[\"container_yard\",\"dorm_rooftop\"]},{\"id\":\"dorm_rooftop\",\"name\":\"宿舍楼天台\",\"privacy\":\"private\",\"detail\":\"员工宿舍六楼的天台,晾着一排工服,能看见整个港口的灯一盏盏亮着。\",\"affordances\":[\"一起抽一支烟\",\"看台风前的云\",\"躲开所有人\"],\"exits\":[\"teahouse\"]}],\"characters\":[{\"id\":\"shift_lead\",\"name\":\"梁嘉欣\",\"call\":\"梁姐\",\"age\":49,\"gender\":\"female\",\"tier\":\"major\",\"role\":\"夜班装卸班组长\",\"adult_context\":\"在码头干了十五年的装卸班组长,正式在编\",\"location_id\":\"container_yard\",\"present\":true,\"can_act\":true,\"voice\":\"surface\",\"appearance\":\"左手缺了半截小指,夹烟的姿势很特别\",\"voices\":{\"inner\":\"“我也会累的,你知不知道。”\",\"surface\":\"“都给我动起来!七号那边还差三个柜!”——嗓门大,带着笑\"},\"identity\":{\"authority\":\"决定谁上哪台机、谁今晚去扛最累的活\",\"resources\":[\"全班组的人情\",\"和船公司的人喝过酒\"],\"limits\":[\"上面刚换了领导,谁都在看她\",\"腰伤,不能久站\"],\"obligations\":[\"两个孩子的学费\"],\"exposure_risk\":\"班组的加班费里有两个名字是空挂的\",\"hidden_mismatch\":\"早就想把班组长的位置让出去,只是找不到能接的人\"},\"situation\":{\"trigger\":\"新来的主任要查加班费的名单\",\"pressure\":\"名单一查,空挂的两个名字就藏不住\",\"deadline\":null,\"exits\":[{\"cost\":\"两个老伙计这个月的补贴就没了\",\"option\":\"自己先去把名字销掉\"},{\"cost\":\"要欠一个大人情,还可能被人拿住\",\"option\":\"找人把名单换一份\"}]},\"decision\":{\"core_value\":\"护住自己的人\",\"current_goal\":\"给自己找一个接班人\",\"pressure_responses\":{\"breaking\":\"把所有事揽到自己身上\",\"high\":\"当众拍桌子,逼别人先让步\",\"low\":\"大声说笑,把话题岔开\",\"mid\":\"私下找人喝一杯,把事情谈了\"},\"withdrawal\":\"一个人蹲在缆桩上抽烟,谁叫都不应\",\"relationship_stance\":\"先把你当自己人,一旦发现你两头说话就翻脸\",\"contrast\":\"看着粗,账却算得比谁都细\",\"prefers\":[\"当面把话说清楚\"],\"avoids\":[\"写在纸上的承诺\"],\"never\":[\"把自己班组的人交出去\"]},\"intimacy\":{\"desire_level\":2,\"attraction_sources\":[\"对方敢在她发火的时候顶回来\",\"对方替班组里的人说过话\"],\"likes\":[\"热闹散了之后的安静\",\"难得被人照顾一次\"],\"dislikes\":[\"被人可怜\"],\"preconditions\":[\"不在班组的人面前\"],\"boundaries\":[\"不碰自己手下的人\"],\"expression\":\"半开玩笑地说真话\",\"self_control\":4,\"desired_position\":\"先照顾人,再被人照顾\"},\"to_player\":{\"trust\":1,\"tension\":0,\"stage\":\"熟络\"}},{\"id\":\"ship_agent_rep\",\"name\":\"潘宝珠\",\"call\":\"老潘\",\"age\":46,\"gender\":\"female\",\"tier\":\"major\",\"role\":\"船公司驻港代表\",\"adult_context\":\"船公司派驻港口的代表,正式雇员\",\"location_id\":\"container_yard\",\"present\":true,\"can_act\":true,\"voice\":\"surface\",\"appearance\":\"手腕上戴一块很旧的表,说是父亲留下的\",\"voices\":{\"inner\":\"“我这些年,连一个能说实话的人都没有。”\",\"surface\":\"“辛苦辛苦,一点心意,饮茶。”——客气,滴水不漏\"},\"identity\":{\"authority\":\"一句话能让下一条船改靠别的码头\",\"resources\":[\"现金和红包\",\"整个季度的船期表\"],\"limits\":[\"船东天天打电话催\",\"在这个港口没有一个真正的朋友\"],\"obligations\":[\"船晚一天开,滞期费就记在她头上\"],\"exposure_risk\":\"账上有一笔滞期费是做出来的\",\"hidden_mismatch\":\"其实想离开船公司,在港口开一间自己的报关行\"},\"situation\":{\"trigger\":\"船东要求船必须赶在台风前开走\",\"pressure\":\"开不走,滞期费和那笔假账会一起被查\",\"deadline\":null,\"exits\":[{\"cost\":\"红包越塞越多,把柄也越来越多\",\"option\":\"塞更多红包让码头连夜赶工\"},{\"cost\":\"丢掉这份工作\",\"option\":\"跟船东说实话\"}]},\"decision\":{\"core_value\":\"事情办成最重要\",\"current_goal\":\"让船准时开走\",\"pressure_responses\":{\"breaking\":\"撕破脸,把所有人的红包账都翻出来\",\"high\":\"找更上面的人打电话\",\"low\":\"笑着塞一个红包\",\"mid\":\"搬出船东,拿滞期费压人\"},\"withdrawal\":\"回到船上的办公室,只让船员传话\",\"relationship_stance\":\"谁有用就对谁客气\",\"contrast\":\"出手大方,自己却舍不得吃一份叉烧饭\",\"prefers\":[\"用钱把事情摆平\"],\"avoids\":[\"留下字据\"],\"never\":[\"让船东知道她自己的打算\"]},\"intimacy\":{\"desire_level\":3,\"attraction_sources\":[\"对方不收她的红包\",\"对方看得出她的客气是装的\"],\"likes\":[\"不谈生意的时候\",\"从海上吹来的风\"],\"dislikes\":[\"被人算计\"],\"preconditions\":[\"确定对方要的不是她的钱\"],\"boundaries\":[\"不在船上\"],\"expression\":\"请客,然后自己一口不吃\",\"self_control\":4,\"desired_position\":\"被当成同伴,而不是出钱的人\"},\"to_player\":{\"trust\":0,\"tension\":1,\"stage\":\"陌生\"}}],\"background\":[{\"id\":\"bg_gate_guard\",\"name\":\"甘永光\",\"role\":\"闸口门卫\",\"line\":\"查验车一进闸口,甘永光就在公共频道喊“大车进场”\",\"location_id\":\"container_yard\"},{\"id\":\"bg_old_lasher\",\"name\":\"叶嘉俊\",\"role\":\"老绑扎工\",\"line\":\"叶嘉俊什么都看见了,但只在茶餐厅里说\",\"location_id\":\"berth_7\"},{\"id\":\"bg_old_tallyman\",\"name\":\"吴雨澄\",\"role\":\"返聘的老理货员\",\"line\":\"吴雨澄认得每一种铅封,肯教人,但只教一遍\",\"location_id\":\"control_tower\"},{\"id\":\"bg_patrol\",\"name\":\"冯家宁\",\"role\":\"巡场保安\",\"line\":\"冯家宁骑着一辆没有铃的单车,总在最不该出现的时候出现\",\"location_id\":\"container_yard\"},{\"id\":\"bg_ship_cook\",\"name\":\"卢佩珊\",\"role\":\"外轮厨师\",\"line\":\"卢佩珊会用三种语言骂人,船上的事问她最快\",\"location_id\":\"berth_7\"},{\"id\":\"bg_sign_clerk\",\"name\":\"莫志强\",\"role\":\"控制塔统计员\",\"line\":\"签到簿在莫志强手里,谁几点来、几点走,他都记着\",\"location_id\":\"control_tower\"},{\"id\":\"bg_teahouse_boss\",\"name\":\"谭咏诗\",\"role\":\"茶餐厅老板娘\",\"line\":\"谭咏诗记得每个人要几分糖,也记得每个人上个月赊了多少\",\"location_id\":\"teahouse\"}],\"relationships\":[{\"from\":\"player\",\"to\":\"shift_lead\",\"trust\":1,\"tension\":1,\"stage\":\"熟络\",\"recent\":[\"梁嘉欣是你在码头认识最久的人\"]},{\"from\":\"player\",\"to\":\"ship_agent_rep\",\"trust\":0,\"tension\":1,\"stage\":\"陌生\",\"recent\":[\"潘宝珠递过一次名片给你,你没接\"]},{\"from\":\"shift_lead\",\"to\":\"player\",\"trust\":1,\"tension\":0,\"stage\":\"熟络\",\"recent\":[\"梁嘉欣是你在码头认识最久的人\"]},{\"from\":\"shift_lead\",\"to\":\"ship_agent_rep\",\"trust\":1,\"tension\":1,\"stage\":\"认识\",\"recent\":[\"两个人一起喝过酒,喝完谁也不信谁\"]},{\"from\":\"ship_agent_rep\",\"to\":\"player\",\"trust\":0,\"tension\":1,\"stage\":\"陌生\",\"recent\":[\"潘宝珠递过一次名片给你,你没接\"]},{\"from\":\"ship_agent_rep\",\"to\":\"shift_lead\",\"trust\":0,\"tension\":2,\"stage\":\"认识\",\"recent\":[\"两个人一起喝过酒,喝完谁也不信谁\"]}],\"player_facts\":[{\"id\":\"f7\",\"text\":\"三个人今晚都在等同一条船装完\",\"visibility\":\"public\"},{\"id\":\"f8\",\"text\":\"都知道第三排最底下那个柜子有问题,却谁也没有说破\",\"visibility\":\"public\"},{\"id\":\"f9\",\"text\":\"一方是另一方入行时的师傅,教过的东西都还记着\",\"visibility\":\"public\"},{\"id\":\"f10\",\"text\":\"磅房报上来一个柜子比单据重了四吨,放行单上等着你表态\",\"visibility\":\"public\"},{\"id\":\"f5\",\"text\":\"郭少青:坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。\",\"visibility\":\"private\"},{\"id\":\"f6\",\"text\":\"郭少青:上个月替人把一个柜子的吊装顺序往后挪了两晚\",\"visibility\":\"private\"}],\"events\":[{\"id\":\"e1\",\"kind\":\"deadline\",\"title\":\"超重的柜子·眼前\",\"in_minutes\":15,\"due_label\":\"第一天 23:45\",\"involves_player\":true},{\"id\":\"e2\",\"kind\":\"deadline\",\"title\":\"超重的柜子·近期\",\"in_minutes\":330,\"due_label\":\"第二天 05:00\",\"involves_player\":true},{\"id\":\"e3\",\"kind\":\"foreshadow\",\"title\":\"超重的柜子·伏笔\",\"in_minutes\":7200,\"due_label\":\"第六天 23:30\",\"involves_player\":true}],\"leverage_all\":[],\"pressure\":{\"id\":\"p_overweight\",\"title\":\"超重的柜子\",\"source\":\"person\",\"trigger\":\"磅房报上来一个柜子比单据重了四吨,放行单上等着你表态\",\"objective\":\"在装船之前弄清楚多出来的四吨是什么\",\"choice\":\"放行,还是拦下来得罪船公司\",\"exits\":[{\"cost\":\"出了事就是放行的人担\",\"option\":\"放行\"},{\"cost\":\"船公司的红包以后再没有你的份\",\"option\":\"拦下来开柜\"}],\"location_modifier\":\"超重的柜子要拖去磅房,一定会经过保安的巡逻线。\"},\"chapters\":[],\"tags\":[\"romance_light\",\"intimate\",\"explicit\",\"violence\",\"coercion_theme\",\"humiliation\",\"bodily_harm\",\"substance\",\"pregnancy\",\"death\",\"workplace_power\",\"infidelity\",\"crime\",\"gambling\",\"workplace\",\"nightlife\",\"supernatural\",\"disaster\",\"custom\"],\"name_pool\":{\"family_unused\":[\"陈\",\"何\",\"麦\",\"黄\",\"罗\",\"邓\",\"钟\",\"区\"],\"given_female\":[\"秀琴\",\"嘉欣\",\"美玲\",\"丽珊\",\"咏诗\",\"慧敏\",\"婉仪\",\"淑贞\",\"少芬\",\"翠屏\",\"玉莲\",\"凤仪\"],\"given_male\":[\"志强\",\"国栋\",\"家豪\",\"伟明\",\"振华\",\"锦荣\",\"耀祖\",\"建辉\",\"德胜\",\"灿明\",\"汉生\",\"嘉俊\"],\"given_neutral\":[\"子晴\",\"海宁\",\"思远\",\"家宁\",\"天恩\",\"晓岚\",\"雨澄\",\"文乐\"]}},\"next_request_id\":\"r_a6b549b57512\",\"replayed\":false},\"error\":null}", "status": "completed" } ], "runtime_calls": [ { "ts": "2026-09-29T02:23:50", "ms": 147.2, "pid": 30932, "skill_root": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension", "argv": [ "doctor", "--json" ], "input": {}, "exit": 0, "envelope": { "ok": true, "data": { "status": "ok", "fast_path": false, "skill_version": "0.3.0", "content_version": "2026.10.0-dev1", "skill_root": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension", "data_dir": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.at-data", "data_dir_source": "env", "checks": [ { "id": "python", "status": "ok", "message": "Python 3.12.10(C:\\Users\\daha\\AppData\\Local\\Programs\\Python\\Python312\\python.exe)", "hint": null }, { "id": "data_dir", "status": "ok", "message": "数据目录可写:D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.at-data(来源:env)", "hint": null }, { "id": "sqlite", "status": "ok", "message": "SQLite 3.49.1", "hint": null }, { "id": "migrations", "status": "ok", "message": "数据库已从 schema 0 迁移到 3", "hint": null }, { "id": "skill_files", "status": "ok", "message": "Skill 根目录:D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension", "hint": null }, { "id": "content", "status": "ok", "message": "内容版本 2026.10.0-dev1,6 个世界可开局", "hint": null } ], "next_request_id": "r_7b29c64c9336" }, "error": null } }, { "ts": "2026-09-29T02:24:00", "ms": 159.3, "pid": 36472, "skill_root": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension", "argv": [ "new-game", "--json", "--input-file", "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.host\\tmp\\opencode\\new_game.json" ], "input": { "request_id": "r_7b29c64c9336", "mode": "pressure", "locks": { "world_id": "harbor_night_shift" } }, "exit": 0, "envelope": { "ok": true, "data": { "session_id": "s_1e9840a4", "revision": 1, "turn": 1, "seed": 654935, "conditions_restored": false, "opening": { "seed": 654935, "mode": "pressure", "signature": "harbor_night_shift|container_yard|combo_agent_number|p:p_overweight|h_redpacket", "world": { "title": "港口夜班", "era": "1990 年代末(1998 年)", "region": "南方沿海港城的集装箱码头", "premise": "集装箱码头的夜班从晚八点到早八点,灯一直亮到天明,人很少,交接班的十分钟里什么都可能发生。", "tone": [ "潮湿", "疲惫", "克制的热" ], "style_hint": "短句,多写声音、气味与灯光,少写心理独白;粤语词点到即止。", "date_label": "一九九八年,台风季", "rule_in_play": "船公司的人逢年过节、赶船期都塞红包;收不收、收多少,班组里人人心里有数,只是没人写在纸上。", "customs": [ "新来的人第一个夜班要请全班组喝一次糖水,叫“开工糖水”,糖水钱不能找人分摊。", "交班时要把保温壶灌满开水留给下一班;空壶留给别人,一个月都会有人阴阳怪气。" ] }, "player": { "name": "郭少青", "title": "阿青", "age": 38, "gender": "male", "role": "夜班调度", "social_position": "equal", "baseline": "坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。", "resources": [ "排吊装顺序的权力", "能切到任何一个频道" ], "reputation": "做事公道,但谁都不敢得罪" }, "npcs": [ { "id": "ship_agent_rep", "name": "潘宝珠", "call": "老潘", "age": 46, "gender": "female", "role": "船公司驻港代表", "adult_context": "船公司派驻港口的代表,正式雇员", "appearance": "手腕上戴一块很旧的表,说是父亲留下的", "surface_voice": "“辛苦辛苦,一点心意,饮茶。”——客气,滴水不漏" }, { "id": "shift_lead", "name": "梁嘉欣", "call": "梁姐", "age": 49, "gender": "female", "role": "夜班装卸班组长", "adult_context": "在码头干了十五年的装卸班组长,正式在编", "appearance": "左手缺了半截小指,夹烟的姿势很特别", "surface_voice": "“都给我动起来!七号那边还差三个柜!”——嗓门大,带着笑" } ], "scene": { "location_id": "container_yard", "location": "堆场通道", "detail": "集装箱码成五层高的窄巷,灯照不到中间,偶尔能听见某个箱子里有东西在响。", "privacy": "semi", "visibility": "只有巡场的保安骑着单车偶尔经过", "affordances": [ "借箱子挡住视线", "抄近路去闸口", "贴着箱壁听里面的动静" ], "time_label": "第一天 23:30" }, "tension": { "engines": [ "都知道第三排最底下那个柜子有问题,却谁也没有说破", "一方是另一方入行时的师傅,教过的东西都还记着" ], "chemistry": "潘宝珠要船准时开走,梁嘉欣要班组平安收工,而你手里有一个两个人都想知道的数字——谁更需要谁,要看今晚怎么走。", "meeting_reason": "三个人今晚都在等同一条船装完" }, "hook": { "kind": "request", "text": "潘宝珠把一个红包压在你手边的单据底下,说“饮茶”" }, "person": "second", "pressure": { "title": "超重的柜子", "trigger": "磅房报上来一个柜子比单据重了四吨,放行单上等着你表态", "objective": "在装船之前弄清楚多出来的四吨是什么", "choice": "放行,还是拦下来得罪船公司", "immediate": "吊机十五分钟后就要吊到这个柜子", "near": { "text": "船天亮前必须开,装船单要在五点前交上去", "due_label": "第二天 05:00" }, "foreshadow": "下个月船公司要续签码头合同", "location_modifier": "超重的柜子要拖去磅房,一定会经过保安的巡逻线。" }, "footer": "【时间】第一天 23:30|【地点】堆场通道|回合:1|种子:654935" }, "context": { "depth": "full", "session_id": "s_1e9840a4", "revision": 1, "turn": 1, "mode": "pressure", "clock": { "day": 1, "minute": 1410, "label": "第一天 23:30" }, "scene": { "id": "sc1", "location_id": "container_yard", "location": "堆场通道", "privacy": "semi", "present": [ "player", "ship_agent_rep", "shift_lead" ] }, "player": { "name": "郭少青", "title": "阿青", "age": 38, "gender": "male", "role": "夜班调度", "social_position": "equal", "baseline": "坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。", "resources": [ "排吊装顺序的权力", "能切到任何一个频道" ], "reputation": "做事公道,但谁都不敢得罪", "risks": [ "上个月替人把一个柜子的吊装顺序往后挪了两晚" ], "background": [] }, "present_npcs": [ { "id": "ship_agent_rep", "name": "潘宝珠", "age": 46, "gender": "female", "tier": "major", "role": "船公司驻港代表", "mood": null, "voice": "surface", "can_act": true, "trust_to_player": 0, "tension": 1, "stage": "陌生", "goal": "让船准时开走", "stance": "谁有用就对谁客气" }, { "id": "shift_lead", "name": "梁嘉欣", "age": 49, "gender": "female", "tier": "major", "role": "夜班装卸班组长", "mood": null, "voice": "surface", "can_act": true, "trust_to_player": 1, "tension": 0, "stage": "熟络", "goal": "给自己找一个接班人", "stance": "先把你当自己人,一旦发现你两头说话就翻脸" } ], "nearby": [ { "id": "bg_gate_guard", "name": "甘永光", "role": "闸口门卫" }, { "id": "bg_patrol", "name": "冯家宁", "role": "巡场保安" } ], "due_soon": [ { "id": "e1", "kind": "deadline", "title": "超重的柜子·眼前", "in_minutes": 15, "due_label": "第一天 23:45", "involves_player": true }, { "id": "e2", "kind": "deadline", "title": "超重的柜子·近期", "in_minutes": 330, "due_label": "第二天 05:00", "involves_player": true }, { "id": "e3", "kind": "foreshadow", "title": "超重的柜子·伏笔", "in_minutes": 7200, "due_label": "第六天 23:30", "involves_player": true } ], "known_facts": [ { "id": "f7", "text": "三个人今晚都在等同一条船装完", "visibility": "public" }, { "id": "f8", "text": "都知道第三排最底下那个柜子有问题,却谁也没有说破", "visibility": "public" }, { "id": "f9", "text": "一方是另一方入行时的师傅,教过的东西都还记着", "visibility": "public" }, { "id": "f10", "text": "磅房报上来一个柜子比单据重了四吨,放行单上等着你表态", "visibility": "public" }, { "id": "f5", "text": "郭少青:坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。", "visibility": "private" }, { "id": "f6", "text": "郭少青:上个月替人把一个柜子的吊装顺序往后挪了两晚", "visibility": "private" } ], "recent": [], "last_quotes": [], "open_action": null, "scene_responses": [], "safety": { "paused": false, "boundaries": [], "leverage": [] }, "preferences": { "inner_view": false, "assistant": false, "offscreen_simulation": true, "person": "second" }, "save": { "current_slot": null, "turns_since_save": 0 }, "requests": { "chapter_summary": false, "prologue": false, "twist_offer": null, "offscreen_beat_candidates": [] }, "size_bytes": 16423, "world": { "title": "港口夜班", "era": "1990 年代末(1998 年)", "region": "南方沿海港城的集装箱码头", "premise": "集装箱码头的夜班从晚八点到早八点,灯一直亮到天明,人很少,交接班的十分钟里什么都可能发生。", "tone": [ "潮湿", "疲惫", "克制的热" ], "style_hint": "短句,多写声音、气味与灯光,少写心理独白;粤语词点到即止。", "rules": [ "夜班 20:00 上岗、次日 8:00 下班,凌晨两点所有人到控制塔签到交接;签到簿谁都能翻,缺签要写说明交给主任。", "对讲机公共频道所有当班的人都听得见,谁说了什么第二天全码头都知道;私事只能切到六频道,可调度偶尔会抽查。", "箱号、铅封号、重量三样对不上的柜,要当班理货员在理货单上签字才能放行——签了字,出了事就是签字人的。", "海关查验不提前打招呼,查验车进闸口时门卫会在公共频道喊一声“大车进场”,从闸口开到泊位要二十分钟。", "船公司的人逢年过节、赶船期都塞红包;收不收、收多少,班组里人人心里有数,只是没人写在纸上。", "台风警报升到最高一级,码头全面停工,吊机锁死,所有人撤进塔楼一楼,风停之前谁也不许出去。" ], "customs": [ "收工后去闸口外的茶餐厅吃一碗云吞面,是班组默认的散伙仪式;谁请客轮着来,轮到的人装不知道会被记很久。", "红包要当着人面推两次再收;推一次就收显得贪,推第三次就是不给面子。", "新来的人第一个夜班要请全班组喝一次糖水,叫“开工糖水”,糖水钱不能找人分摊。", "交班时要把保温壶灌满开水留给下一班;空壶留给别人,一个月都会有人阴阳怪气。", "塔吊司机上塔前在梯子第一级拍三下,说是跟吊臂打招呼;谁替别人拍了,就是认了交情。" ] }, "locations": [ { "id": "berth_7", "name": "七号泊位", "privacy": "public", "detail": "吊臂的影子一格一格扫过地面,海水拍着缆桩,空气里是柴油和铁锈的味道。", "affordances": [ "躲进两排集装箱的夹缝", "借吊机的轰鸣说悄悄话", "爬上跨运车的驾驶室避雨" ], "exits": [ "control_tower", "container_yard", "tool_shed" ] }, { "id": "control_tower", "name": "控制塔", "privacy": "semi", "detail": "三楼调度室一整面玻璃对着泊位,签到簿压在对讲机旁边,吊扇吱呀作响。", "affordances": [ "翻看签到簿", "切换对讲机频道", "在楼梯拐角说话没人看见" ], "exits": [ "berth_7", "rest_room" ] }, { "id": "rest_room", "name": "休息室", "privacy": "semi", "detail": "塔楼一楼的休息室,一台旧风扇、一张折叠床、一台只收得到两个台的电视。", "affordances": [ "轮流在折叠床上眯一会儿", "用电热水壶煮公仔面", "关了灯看窗外的船灯" ], "exits": [ "control_tower", "clinic" ] }, { "id": "clinic", "name": "医务室", "privacy": "semi", "detail": "塔楼一楼尽头的医务室,一张铁床、一个上锁的药柜,日光灯管发出细细的嗡声。", "affordances": [ "处理伤口", "开一张病假条", "在铁床边坐一会儿" ], "exits": [ "rest_room" ] }, { "id": "tool_shed", "name": "工具房", "privacy": "private", "detail": "堆满缆绳和生锈的卸扣,铁皮门从外面挂锁,下雨时整间屋子像鼓一样响。", "affordances": [ "躲雨", "把东西藏进缆绳堆", "关上门说话" ], "exits": [ "berth_7" ] }, { "id": "container_yard", "name": "堆场通道", "privacy": "semi", "detail": "集装箱码成五层高的窄巷,灯照不到中间,偶尔能听见某个箱子里有东西在响。", "affordances": [ "借箱子挡住视线", "抄近路去闸口", "贴着箱壁听里面的动静" ], "exits": [ "berth_7", "teahouse" ] }, { "id": "teahouse", "name": "闸口外的茶餐厅", "privacy": "public", "detail": "凌晨三点还亮着灯,墙上的电视开着没声音,老板娘记得每个夜班的人要几分糖。", "affordances": [ "抢最后一份叉烧", "在卡座里压低声音谈事", "借柜台上的电话打出去" ], "exits": [ "container_yard", "dorm_rooftop" ] }, { "id": "dorm_rooftop", "name": "宿舍楼天台", "privacy": "private", "detail": "员工宿舍六楼的天台,晾着一排工服,能看见整个港口的灯一盏盏亮着。", "affordances": [ "一起抽一支烟", "看台风前的云", "躲开所有人" ], "exits": [ "teahouse" ] } ], "characters": [ { "id": "shift_lead", "name": "梁嘉欣", "call": "梁姐", "age": 49, "gender": "female", "tier": "major", "role": "夜班装卸班组长", "adult_context": "在码头干了十五年的装卸班组长,正式在编", "location_id": "container_yard", "present": true, "can_act": true, "voice": "surface", "appearance": "左手缺了半截小指,夹烟的姿势很特别", "voices": { "inner": "“我也会累的,你知不知道。”", "surface": "“都给我动起来!七号那边还差三个柜!”——嗓门大,带着笑" }, "identity": { "authority": "决定谁上哪台机、谁今晚去扛最累的活", "resources": [ "全班组的人情", "和船公司的人喝过酒" ], "limits": [ "上面刚换了领导,谁都在看她", "腰伤,不能久站" ], "obligations": [ "两个孩子的学费" ], "exposure_risk": "班组的加班费里有两个名字是空挂的", "hidden_mismatch": "早就想把班组长的位置让出去,只是找不到能接的人" }, "situation": { "trigger": "新来的主任要查加班费的名单", "pressure": "名单一查,空挂的两个名字就藏不住", "deadline": null, "exits": [ { "cost": "两个老伙计这个月的补贴就没了", "option": "自己先去把名字销掉" }, { "cost": "要欠一个大人情,还可能被人拿住", "option": "找人把名单换一份" } ] }, "decision": { "core_value": "护住自己的人", "current_goal": "给自己找一个接班人", "pressure_responses": { "breaking": "把所有事揽到自己身上", "high": "当众拍桌子,逼别人先让步", "low": "大声说笑,把话题岔开", "mid": "私下找人喝一杯,把事情谈了" }, "withdrawal": "一个人蹲在缆桩上抽烟,谁叫都不应", "relationship_stance": "先把你当自己人,一旦发现你两头说话就翻脸", "contrast": "看着粗,账却算得比谁都细", "prefers": [ "当面把话说清楚" ], "avoids": [ "写在纸上的承诺" ], "never": [ "把自己班组的人交出去" ] }, "intimacy": { "desire_level": 2, "attraction_sources": [ "对方敢在她发火的时候顶回来", "对方替班组里的人说过话" ], "likes": [ "热闹散了之后的安静", "难得被人照顾一次" ], "dislikes": [ "被人可怜" ], "preconditions": [ "不在班组的人面前" ], "boundaries": [ "不碰自己手下的人" ], "expression": "半开玩笑地说真话", "self_control": 4, "desired_position": "先照顾人,再被人照顾" }, "to_player": { "trust": 1, "tension": 0, "stage": "熟络" } }, { "id": "ship_agent_rep", "name": "潘宝珠", "call": "老潘", "age": 46, "gender": "female", "tier": "major", "role": "船公司驻港代表", "adult_context": "船公司派驻港口的代表,正式雇员", "location_id": "container_yard", "present": true, "can_act": true, "voice": "surface", "appearance": "手腕上戴一块很旧的表,说是父亲留下的", "voices": { "inner": "“我这些年,连一个能说实话的人都没有。”", "surface": "“辛苦辛苦,一点心意,饮茶。”——客气,滴水不漏" }, "identity": { "authority": "一句话能让下一条船改靠别的码头", "resources": [ "现金和红包", "整个季度的船期表" ], "limits": [ "船东天天打电话催", "在这个港口没有一个真正的朋友" ], "obligations": [ "船晚一天开,滞期费就记在她头上" ], "exposure_risk": "账上有一笔滞期费是做出来的", "hidden_mismatch": "其实想离开船公司,在港口开一间自己的报关行" }, "situation": { "trigger": "船东要求船必须赶在台风前开走", "pressure": "开不走,滞期费和那笔假账会一起被查", "deadline": null, "exits": [ { "cost": "红包越塞越多,把柄也越来越多", "option": "塞更多红包让码头连夜赶工" }, { "cost": "丢掉这份工作", "option": "跟船东说实话" } ] }, "decision": { "core_value": "事情办成最重要", "current_goal": "让船准时开走", "pressure_responses": { "breaking": "撕破脸,把所有人的红包账都翻出来", "high": "找更上面的人打电话", "low": "笑着塞一个红包", "mid": "搬出船东,拿滞期费压人" }, "withdrawal": "回到船上的办公室,只让船员传话", "relationship_stance": "谁有用就对谁客气", "contrast": "出手大方,自己却舍不得吃一份叉烧饭", "prefers": [ "用钱把事情摆平" ], "avoids": [ "留下字据" ], "never": [ "让船东知道她自己的打算" ] }, "intimacy": { "desire_level": 3, "attraction_sources": [ "对方不收她的红包", "对方看得出她的客气是装的" ], "likes": [ "不谈生意的时候", "从海上吹来的风" ], "dislikes": [ "被人算计" ], "preconditions": [ "确定对方要的不是她的钱" ], "boundaries": [ "不在船上" ], "expression": "请客,然后自己一口不吃", "self_control": 4, "desired_position": "被当成同伴,而不是出钱的人" }, "to_player": { "trust": 0, "tension": 1, "stage": "陌生" } } ], "background": [ { "id": "bg_gate_guard", "name": "甘永光", "role": "闸口门卫", "line": "查验车一进闸口,甘永光就在公共频道喊“大车进场”", "location_id": "container_yard" }, { "id": "bg_old_lasher", "name": "叶嘉俊", "role": "老绑扎工", "line": "叶嘉俊什么都看见了,但只在茶餐厅里说", "location_id": "berth_7" }, { "id": "bg_old_tallyman", "name": "吴雨澄", "role": "返聘的老理货员", "line": "吴雨澄认得每一种铅封,肯教人,但只教一遍", "location_id": "control_tower" }, { "id": "bg_patrol", "name": "冯家宁", "role": "巡场保安", "line": "冯家宁骑着一辆没有铃的单车,总在最不该出现的时候出现", "location_id": "container_yard" }, { "id": "bg_ship_cook", "name": "卢佩珊", "role": "外轮厨师", "line": "卢佩珊会用三种语言骂人,船上的事问她最快", "location_id": "berth_7" }, { "id": "bg_sign_clerk", "name": "莫志强", "role": "控制塔统计员", "line": "签到簿在莫志强手里,谁几点来、几点走,他都记着", "location_id": "control_tower" }, { "id": "bg_teahouse_boss", "name": "谭咏诗", "role": "茶餐厅老板娘", "line": "谭咏诗记得每个人要几分糖,也记得每个人上个月赊了多少", "location_id": "teahouse" } ], "relationships": [ { "from": "player", "to": "shift_lead", "trust": 1, "tension": 1, "stage": "熟络", "recent": [ "梁嘉欣是你在码头认识最久的人" ] }, { "from": "player", "to": "ship_agent_rep", "trust": 0, "tension": 1, "stage": "陌生", "recent": [ "潘宝珠递过一次名片给你,你没接" ] }, { "from": "shift_lead", "to": "player", "trust": 1, "tension": 0, "stage": "熟络", "recent": [ "梁嘉欣是你在码头认识最久的人" ] }, { "from": "shift_lead", "to": "ship_agent_rep", "trust": 1, "tension": 1, "stage": "认识", "recent": [ "两个人一起喝过酒,喝完谁也不信谁" ] }, { "from": "ship_agent_rep", "to": "player", "trust": 0, "tension": 1, "stage": "陌生", "recent": [ "潘宝珠递过一次名片给你,你没接" ] }, { "from": "ship_agent_rep", "to": "shift_lead", "trust": 0, "tension": 2, "stage": "认识", "recent": [ "两个人一起喝过酒,喝完谁也不信谁" ] } ], "player_facts": [ { "id": "f7", "text": "三个人今晚都在等同一条船装完", "visibility": "public" }, { "id": "f8", "text": "都知道第三排最底下那个柜子有问题,却谁也没有说破", "visibility": "public" }, { "id": "f9", "text": "一方是另一方入行时的师傅,教过的东西都还记着", "visibility": "public" }, { "id": "f10", "text": "磅房报上来一个柜子比单据重了四吨,放行单上等着你表态", "visibility": "public" }, { "id": "f5", "text": "郭少青:坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。", "visibility": "private" }, { "id": "f6", "text": "郭少青:上个月替人把一个柜子的吊装顺序往后挪了两晚", "visibility": "private" } ], "events": [ { "id": "e1", "kind": "deadline", "title": "超重的柜子·眼前", "in_minutes": 15, "due_label": "第一天 23:45", "involves_player": true }, { "id": "e2", "kind": "deadline", "title": "超重的柜子·近期", "in_minutes": 330, "due_label": "第二天 05:00", "involves_player": true }, { "id": "e3", "kind": "foreshadow", "title": "超重的柜子·伏笔", "in_minutes": 7200, "due_label": "第六天 23:30", "involves_player": true } ], "leverage_all": [], "pressure": { "id": "p_overweight", "title": "超重的柜子", "source": "person", "trigger": "磅房报上来一个柜子比单据重了四吨,放行单上等着你表态", "objective": "在装船之前弄清楚多出来的四吨是什么", "choice": "放行,还是拦下来得罪船公司", "exits": [ { "cost": "出了事就是放行的人担", "option": "放行" }, { "cost": "船公司的红包以后再没有你的份", "option": "拦下来开柜" } ], "location_modifier": "超重的柜子要拖去磅房,一定会经过保安的巡逻线。" }, "chapters": [], "tags": [ "romance_light", "intimate", "explicit", "violence", "coercion_theme", "humiliation", "bodily_harm", "substance", "pregnancy", "death", "workplace_power", "infidelity", "crime", "gambling", "workplace", "nightlife", "supernatural", "disaster", "custom" ], "name_pool": { "family_unused": [ "陈", "何", "麦", "黄", "罗", "邓", "钟", "区" ], "given_female": [ "秀琴", "嘉欣", "美玲", "丽珊", "咏诗", "慧敏", "婉仪", "淑贞", "少芬", "翠屏", "玉莲", "凤仪" ], "given_male": [ "志强", "国栋", "家豪", "伟明", "振华", "锦荣", "耀祖", "建辉", "德胜", "灿明", "汉生", "嘉俊" ], "given_neutral": [ "子晴", "海宁", "思远", "家宁", "天恩", "晓岚", "雨澄", "文乐" ] } }, "next_request_id": "r_a6b549b57512", "replayed": false }, "error": null } } ], "calls_source": "trace", "text": "世界观:一九九八年台风季的南方沿海集装箱码头,夜班从晚八点通宵到早八点;船公司赶船期常塞红包,收不收、收多少,班组里人人心里有数,只是没人写在纸上。\n人物:你叫郭少青(38岁),夜班调度;潘宝珠(46岁),船公司驻港代表;梁嘉欣(49岁),夜班装卸班组长。\n\n夜风又黏又咸,卷着台风压境前的闷热与柴油铁锈味。堆场的集装箱码成五层高的铁墙,将高杆水银灯的光切成一片片发暗的窄巷,金属深处偶尔传出轻微的闷响。\n\n磅房送来的单据就卡在你的写字板上。第三排最底下那个集装箱,实际过磅比申报单足足超了四吨。七号泊位那台桥吊正发出沉闷的低吼,按照作业序列,吊具十五分钟后就会咬住那个柜子。外轮必须在台风封港前离泊,装船单最迟清晨五点就得封袋交关,下个月船公司还要同码头续约;可只要你在这个重量不符的放行单上落了笔,出了漏子全由当班调度顶着。\n\n梁嘉欣站在集装箱投下的阴影边缘,左手缺了半截的小指夹着半截香烟,猩红的烟头在夜色里忽明忽暗。她没开口,腰间的对讲机里沙沙响着桥吊司机的报数声。\n\n潘宝珠踩着平底鞋上前一步,手腕上那块发旧的旧表晃过一道冷光。她神色自若地递出手,把一个折得严实的硬质红包不轻不重地压在你手边的单据底下,低声笑道:“辛苦辛苦,一点心意,饮茶。”\n\n【时间】第一天 23:30|【地点】堆场通道|回合:1|种子:654935", "seconds": 59.9, "model": "local-proxy/gemini-3.8-flash-high" }, { "index": 2, "conversation": "A", "input": "我先弄清楚眼下最急的是什么事", "expect": { "kind": "turn", "calls_max": 1 }, "host_calls": [ { "tool": "read", "input": { "offset": 1, "filePath": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\references\\operations.md", "limit": 100 }, "output": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\references\\operations.md\nfile\n\n1: \n2: \n3: # 操作参考\n4: \n5: `commit-turn` 的 `operations` 是一个操作数组。操作按顺序应用,后面的操作看得到前面操作的效果;任何一个不合法,整个提交被拒绝、状态不变,错误列出全部问题及其 JSON 路径。NPC 拒绝玩家(`npc_response: refuse`)是合法的叙事结果,不是错误。\n6: \n7: 提交里没有 `advance_time` 时,时钟默认推进 3 分钟。单次推进上限 30 天。\n8: \n9: ## 提交的顶层字段\n10: \n11: | 字段 | 类型 | 必填 | 说明 |\n12: |---|---|---|---|\n13: | `action_mode` | 枚举:`result` / `attempt` / `rewrite` / `continue` / `wait` | 是 | result / attempt / rewrite(“其实……”)/ continue / wait |\n14: | `player_input` | 字符串,≤2000 字 | 是 | 玩家这一句的原话(继续时可为空字符串) |\n15: | `player_authorized` | 布尔 | 否,默认 `false` | 玩家本人的话授权了玩家角色的移动、承诺、交易、同意、转折或设定修改时为 true |\n16: | `acts_on` | 数组(字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40},0–8 项) 或 null | 否,默认 `null` | 玩家行动作用到的 NPC(身体、意志、财物);attempt 不作用于任何 NPC 时写 [] |\n17: | `operations` | 数组(操作对象(按 `op` 区分),0–40 项) | 是 | 操作列表(可以为空数组) |\n18: | `content_tags` | 数组(字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40},0–12 项) | 是 | 本回合正文涉及的内容标签(可为空数组);标签表见完整上下文的 tags |\n19: | `intimate_participants` | 数组(字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40},0–6 项) | 否,默认 `[]` | content_tags 含 intimate 或 explicit 时必填:亲密参与者(含玩家) |\n20: | `summary` | 字符串,≤120 字 | 是 | 本回合发生了什么,第三方视角,≤120 字 |\n21: | `open_action` | 字符串,≤80 字 | 是 | 回合停在哪里、谁在等谁,≤80 字 |\n22: | `quotes` | 数组(字符串,≤80 字,0–3 项) | 否,默认 `[]` | ≤3 条对后续有意义的原话,每条 ≤80 字 |\n23: | `chapter_summary` | 字符串,≤300 字 或 null | 否,默认 `null` | 上下文 requests.chapter_summary 为 true 时必填:上一章(到上一回合为止)的摘要,≤300 字;没有要求时不写 |\n24: | `prologue` | 字符串,≤300 字 或 null | 否,默认 `null` | 上下文 requests.prologue 为 true 时必填:把完整上下文 prologue_merge 里的旧前情与最早几章合并成一段前情,≤300 字;没有要求时不写 |\n25: | `replaces_turn` | 整数 1..1000000 或 null | 否,默认 `null` | “刚才不算,改成……”:填当前最后一个回合的回合号,引擎在同一事务里撤销它再应用本次提交 |\n26: \n27: ## 操作一览\n28: \n29: | op | 作用 |\n30: |---|---|\n31: | `advance_time` | 推进游戏时钟:minutes / until / days 三选一;触发到期事件与状态到期结算。没有此操作时时钟默认推进 3 分钟 |\n32: | `move` | 角色移动到地点。玩家移动需要 result/attempt 模式并带 player_authorized;玩家换地点即换场景 |\n33: | `enter_scene` | 角色登场,加入当前场景 |\n34: | `exit_scene` | 角色离场;可写去向地点。玩家角色用 move |\n35: | `npc_response` | NPC 对玩家尝试的回应:refuse 拒绝 / negotiate 协商 / partial 有限配合 / surface 表面配合 / genuine 真诚配合。surface 必须写 true_intent(记为只有本人知道的事实) |\n36: | `npc_action` | NPC 自主行动。significant: true 的重大行动(主动接近、揭发、交易、离开、表白、挑衅等)受冷却限制;依据事实必须在其信息集中 |\n37: | `npc_state` | 更新 NPC 的情绪与状况(醉意、睡眠、受伤、外出等);minutes 表示多久后自动消退 |\n38: | `add_fact` | 记录一条事实。public 在场者自动知道;private 只有 known_by;inner 是内心,只属于一个 NPC 且永不传播。误信用 truth: false + believed_by。正文里新写出、之后要继承的细节都要用它记下 |\n39: | `relationship` | 有向关系变化(from 对 to):信任 -5..5(单次提交净变化 ≤2)、张力 0..5、亲近进程前进一个阶段(需要同一提交里玩家的行动 + 对方的 partial/genuine 回应)或后退。原因必填 |\n40: | `event_create` | 创建事件(约定、截止、风声、机会、伏笔、概率事件)。due 与 in_minutes 二选一且必须晚于现在;chance 必须带 probability,到期由引擎掷骰;涉及玩家的承诺需要 player_authorized;dedupe_key 与未结束事件不能重复 |\n41: | `event_resolve` | 在到期前结束事件:约定、截止、机会用 fulfilled(兑现);伏笔、风声用 surfaced(提前浮出)。概率事件只能由引擎到期掷骰 |\n42: | `event_cancel` | 因剧情取消未结束的事件(outcome: cancelled_by_story) |\n43: | `roll` | 即时概率:引擎确定性掷骰后执行 on_success 或 on_failure(分支内不能再嵌套 roll,也不能推进时间)。结果以返回的 applied 为准 |\n44: | `player_update` | 玩家角色的姓名、称谓、背景、资源与风险。只能在 result 或 rewrite(“其实……”)模式、并带 player_authorized |\n45: | `reveal_fact` | 把一条事实从知情人告诉别人。只能沿已有的关系边进行,当面告知时双方都要在场;内心事实永远不能传播。告诉某人真相时,若他正误信同键的假事实,引擎记录他的信息集变化 |\n46: | `spread_rumor` | 传出一条走样的传闻:生成新的假事实(来源为传闻),原事实不变。不经渠道时沿关系边、双方在场;经世界里的走样渠道时可以传到没有关系边的人 |\n47: | `set_voice` | 切换 NPC 的表层/里层语态。玩家要求(player_request)优先;NPC 自主切入里层(npc_self)要写触发因素:alone 独处 / drunk 醉意 / breakdown 情绪崩溃 / exposed 被戳穿;revert 切回表层。语态只改变说话方式,不是关系升级,note 不能与同一提交里的关系变化共用原因 |\n48: | `intimacy_evidence` | 为私密倾向卡的某一项记一条证据。同一项同一方向需要至少 2 条来自不同回合的证据才会改动(界线项的放宽 remove 需要 3 条);数值项用 increase/decrease,列表项用 add/remove,文字项用 set |\n49: | `identity_update` | 逐项修改身份卡(资源、限制、义务用 add/remove;权限、暴露风险、隐藏落差用 set)。身份卡不能整体替换 |\n50: | `npc_update` | 修改 NPC 的公开身份、外貌、当前目标、对关系的态度或处境(不含身份卡与倾向卡) |\n51: | `introduce_character` | 新角色登场:必须明确成年(age ≥ 18,adult_context 一句话说明成年身份),名字取自世界名字池且重要人物不同姓;按层级补齐字段(background:line;supporting:appearance、identity、decision 的 core_value 与 current_goal;major:再加完整 decision、intimacy、voices、situation);性别要符合配对偏好,否则写 gender_reason |\n52: | `promote_character` | 把背景或配角升格(只升不降,保留 ID),并补齐新层级缺少的字段。身份卡与倾向卡只能在升格时创建一次,已有的不能再给 |\n53: | `leverage_set` | 登记把柄:一方开始拿捏另一方(把柄、债务、生计)时,必须在同一提交里登记。依据二选一:已有事实(持有方要知道它)或一句新事实。生效期间,双方之间的亲密提交被拒 |\n54: | `leverage_release` | 解除把柄(把柄被销毁、债务结清、秘密已经公开等),原因必填。同一提交里先解除再亲密不算解除 |\n55: | `offscreen_beat` | 离屏片段:不在场的重要 NPC 在这段时间里做了什么。只能写上下文 `offscreen_beat_candidates` 或时间推进要求的 NPC;子操作只能是这个 NPC 自己的行动、状态、移动,NPC 之间的关系与消息,以及不涉及玩家的事件与把柄 |\n56: | `twist_accept` | 接受一个转折:引用上下文 requests.twist_offer 或 get-context want_twist 给出的候选 id(写进 twist_id),或给出玩家口述的转折(category 与 text 必填)。玩家选定时用 result 模式并带 player_authorized;同一游戏日最多接受一次 |\n57: \n58: ## `advance_time`\n59: \n60: 推进游戏时钟:minutes / until / days 三选一;触发到期事件与状态到期结算。没有此操作时时钟默认推进 3 分钟\n61: \n62: | 字段 | 类型 | 必填 | 说明 |\n63: |---|---|---|---|\n64: | `op` | 枚举:`advance_time` | 是 | |\n65: | `minutes` | 整数 1..43200 | 否 | |\n66: | `until` | 枚举:`morning` / `noon` / `evening` / `night` / `next_morning` | 否 | |\n67: | `days` | 整数 1..30 | 否 | |\n68: \n69: 不能出现在 `roll` 的分支里。\n70: \n71: ## `move`\n72: \n73: 角色移动到地点。玩家移动需要 result/attempt 模式并带 player_authorized;玩家换地点即换场景\n74: \n75: | 字段 | 类型 | 必填 | 说明 |\n76: |---|---|---|---|\n77: | `op` | 枚举:`move` | 是 | |\n78: | `character_id` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} | 是 | |\n79: | `location_id` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} | 是 | |\n80: \n81: ## `enter_scene`\n82: \n83: 角色登场,加入当前场景\n84: \n85: | 字段 | 类型 | 必填 | 说明 |\n86: |---|---|---|---|\n87: | `op` | 枚举:`enter_scene` | 是 | |\n88: | `character_id` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} | 是 | |\n89: \n90: ## `exit_scene`\n91: \n92: 角色离场;可写去向地点。玩家角色用 move\n93: \n94: | 字段 | 类型 | 必填 | 说明 |\n95: |---|---|---|---|\n96: | `op` | 枚举:`exit_scene` | 是 | |\n97: | `character_id` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} | 是 | |\n98: | `to_location_id` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} 或 null | 否,默认 `null` | |\n99: \n100: ## `npc_response`\n\n(Showing lines 1-100 of 587. Use offset=101 to continue.)\n", "status": "completed" }, { "tool": "write", "input": { "filePath": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.host\\tmp\\opencode\\commit_turn_1.json", "content": "{\n \"session_id\": \"s_1e9840a4\",\n \"request_id\": \"r_a6b549b57512\",\n \"expected_revision\": 1,\n \"action_mode\": \"result\",\n \"player_input\": \"我先弄清楚眼下最急的是什么事\",\n \"player_authorized\": false,\n \"acts_on\": null,\n \"operations\": [\n {\n \"op\": \"advance_time\",\n \"minutes\": 1\n }\n ],\n \"content_tags\": [\n \"workplace\"\n ],\n \"summary\": \"郭少青没有立刻接红包,压住呼吸盘点眼下最要命的几件事与倒计时。\",\n \"open_action\": \"郭少青手指按在放行单边缘,潘宝珠和梁嘉欣都在等他接话。\",\n \"quotes\": []\n}\n" }, "output": "Wrote file successfully.", "status": "completed" }, { "tool": "bash", "input": { "command": "python \"D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\scripts\\adult_tension.py\" commit-turn --json --input-file \"D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.host\\tmp\\opencode\\commit_turn_1.json\"" }, "output": "{\"ok\":true,\"data\":{\"revision\":2,\"turn\":2,\"applied\":[{\"op\":\"advance_time\",\"minutes\":1,\"default\":false,\"clock\":{\"day\":1,\"minute\":1411},\"label\":\"第一天 23:31\",\"new_scene\":false}],\"resolved_events\":[],\"simulation\":null,\"clock\":{\"day\":1,\"minute\":1411,\"label\":\"第一天 23:31\"},\"default_time_advance\":false,\"context\":{\"depth\":\"brief\",\"session_id\":\"s_1e9840a4\",\"revision\":2,\"turn\":2,\"mode\":\"pressure\",\"clock\":{\"day\":1,\"minute\":1411,\"label\":\"第一天 23:31\"},\"scene\":{\"id\":\"sc1\",\"location_id\":\"container_yard\",\"location\":\"堆场通道\",\"privacy\":\"semi\",\"present\":[\"player\",\"ship_agent_rep\",\"shift_lead\"]},\"player\":{\"name\":\"郭少青\",\"title\":\"阿青\",\"age\":38,\"gender\":\"male\",\"role\":\"夜班调度\"},\"present_npcs\":[{\"id\":\"ship_agent_rep\",\"name\":\"潘宝珠\",\"age\":46,\"gender\":\"female\",\"tier\":\"major\",\"role\":\"船公司驻港代表\",\"mood\":null,\"voice\":\"surface\",\"can_act\":true,\"trust_to_player\":0,\"tension\":1,\"stage\":\"陌生\",\"goal\":\"让船准时开走\",\"stance\":\"谁有用就对谁客气\"},{\"id\":\"shift_lead\",\"name\":\"梁嘉欣\",\"age\":49,\"gender\":\"female\",\"tier\":\"major\",\"role\":\"夜班装卸班组长\",\"mood\":null,\"voice\":\"surface\",\"can_act\":true,\"trust_to_player\":1,\"tension\":0,\"stage\":\"熟络\",\"goal\":\"给自己找一个接班人\",\"stance\":\"先把你当自己人,一旦发现你两头说话就翻脸\"}],\"nearby\":[{\"id\":\"bg_gate_guard\",\"name\":\"甘永光\",\"role\":\"闸口门卫\"},{\"id\":\"bg_patrol\",\"name\":\"冯家宁\",\"role\":\"巡场保安\"}],\"due_soon\":[{\"id\":\"e1\",\"kind\":\"deadline\",\"title\":\"超重的柜子·眼前\",\"in_minutes\":14,\"due_label\":\"第一天 23:45\",\"involves_player\":true},{\"id\":\"e2\",\"kind\":\"deadline\",\"title\":\"超重的柜子·近期\",\"in_minutes\":329,\"due_label\":\"第二天 05:00\",\"involves_player\":true},{\"id\":\"e3\",\"kind\":\"foreshadow\",\"title\":\"超重的柜子·伏笔\",\"in_minutes\":7199,\"due_label\":\"第六天 23:30\",\"involves_player\":true}],\"known_facts\":[{\"id\":\"f7\",\"text\":\"三个人今晚都在等同一条船装完\",\"visibility\":\"public\"},{\"id\":\"f8\",\"text\":\"都知道第三排最底下那个柜子有问题,却谁也没有说破\",\"visibility\":\"public\"},{\"id\":\"f9\",\"text\":\"一方是另一方入行时的师傅,教过的东西都还记着\",\"visibility\":\"public\"},{\"id\":\"f10\",\"text\":\"磅房报上来一个柜子比单据重了四吨,放行单上等着你表态\",\"visibility\":\"public\"},{\"id\":\"f5\",\"text\":\"郭少青:坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。\",\"visibility\":\"private\"},{\"id\":\"f6\",\"text\":\"郭少青:上个月替人把一个柜子的吊装顺序往后挪了两晚\",\"visibility\":\"private\"}],\"recent\":[\"郭少青没有立刻接红包,压住呼吸盘点眼下最要命的几件事与倒计时。\"],\"last_quotes\":[],\"open_action\":\"郭少青手指按在放行单边缘,潘宝珠和梁嘉欣都在等他接话。\",\"scene_responses\":[],\"safety\":{\"paused\":false,\"boundaries\":[],\"leverage\":[]},\"preferences\":{\"inner_view\":false,\"assistant\":false,\"offscreen_simulation\":true,\"person\":\"second\"},\"save\":{\"current_slot\":null,\"turns_since_save\":1},\"requests\":{\"chapter_summary\":false,\"prologue\":false,\"twist_offer\":null,\"offscreen_beat_candidates\":[]},\"size_bytes\":2812},\"next_request_id\":\"r_f9bfd947297e\",\"replayed\":false},\"error\":null}", "status": "completed" } ], "runtime_calls": [ { "ts": "2026-09-29T02:24:33", "ms": 79.5, "pid": 32036, "skill_root": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension", "argv": [ "commit-turn", "--json", "--input-file", "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.host\\tmp\\opencode\\commit_turn_1.json" ], "input": { "session_id": "s_1e9840a4", "request_id": "r_a6b549b57512", "expected_revision": 1, "action_mode": "result", "player_input": "我先弄清楚眼下最急的是什么事", "player_authorized": false, "acts_on": null, "operations": [ { "op": "advance_time", "minutes": 1 } ], "content_tags": [ "workplace" ], "summary": "郭少青没有立刻接红包,压住呼吸盘点眼下最要命的几件事与倒计时。", "open_action": "郭少青手指按在放行单边缘,潘宝珠和梁嘉欣都在等他接话。", "quotes": [] }, "exit": 0, "envelope": { "ok": true, "data": { "revision": 2, "turn": 2, "applied": [ { "op": "advance_time", "minutes": 1, "default": false, "clock": { "day": 1, "minute": 1411 }, "label": "第一天 23:31", "new_scene": false } ], "resolved_events": [], "simulation": null, "clock": { "day": 1, "minute": 1411, "label": "第一天 23:31" }, "default_time_advance": false, "context": { "depth": "brief", "session_id": "s_1e9840a4", "revision": 2, "turn": 2, "mode": "pressure", "clock": { "day": 1, "minute": 1411, "label": "第一天 23:31" }, "scene": { "id": "sc1", "location_id": "container_yard", "location": "堆场通道", "privacy": "semi", "present": [ "player", "ship_agent_rep", "shift_lead" ] }, "player": { "name": "郭少青", "title": "阿青", "age": 38, "gender": "male", "role": "夜班调度" }, "present_npcs": [ { "id": "ship_agent_rep", "name": "潘宝珠", "age": 46, "gender": "female", "tier": "major", "role": "船公司驻港代表", "mood": null, "voice": "surface", "can_act": true, "trust_to_player": 0, "tension": 1, "stage": "陌生", "goal": "让船准时开走", "stance": "谁有用就对谁客气" }, { "id": "shift_lead", "name": "梁嘉欣", "age": 49, "gender": "female", "tier": "major", "role": "夜班装卸班组长", "mood": null, "voice": "surface", "can_act": true, "trust_to_player": 1, "tension": 0, "stage": "熟络", "goal": "给自己找一个接班人", "stance": "先把你当自己人,一旦发现你两头说话就翻脸" } ], "nearby": [ { "id": "bg_gate_guard", "name": "甘永光", "role": "闸口门卫" }, { "id": "bg_patrol", "name": "冯家宁", "role": "巡场保安" } ], "due_soon": [ { "id": "e1", "kind": "deadline", "title": "超重的柜子·眼前", "in_minutes": 14, "due_label": "第一天 23:45", "involves_player": true }, { "id": "e2", "kind": "deadline", "title": "超重的柜子·近期", "in_minutes": 329, "due_label": "第二天 05:00", "involves_player": true }, { "id": "e3", "kind": "foreshadow", "title": "超重的柜子·伏笔", "in_minutes": 7199, "due_label": "第六天 23:30", "involves_player": true } ], "known_facts": [ { "id": "f7", "text": "三个人今晚都在等同一条船装完", "visibility": "public" }, { "id": "f8", "text": "都知道第三排最底下那个柜子有问题,却谁也没有说破", "visibility": "public" }, { "id": "f9", "text": "一方是另一方入行时的师傅,教过的东西都还记着", "visibility": "public" }, { "id": "f10", "text": "磅房报上来一个柜子比单据重了四吨,放行单上等着你表态", "visibility": "public" }, { "id": "f5", "text": "郭少青:坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。", "visibility": "private" }, { "id": "f6", "text": "郭少青:上个月替人把一个柜子的吊装顺序往后挪了两晚", "visibility": "private" } ], "recent": [ "郭少青没有立刻接红包,压住呼吸盘点眼下最要命的几件事与倒计时。" ], "last_quotes": [], "open_action": "郭少青手指按在放行单边缘,潘宝珠和梁嘉欣都在等他接话。", "scene_responses": [], "safety": { "paused": false, "boundaries": [], "leverage": [] }, "preferences": { "inner_view": false, "assistant": false, "offscreen_simulation": true, "person": "second" }, "save": { "current_slot": null, "turns_since_save": 1 }, "requests": { "chapter_summary": false, "prologue": false, "twist_offer": null, "offscreen_beat_candidates": [] }, "size_bytes": 2812 }, "next_request_id": "r_f9bfd947297e", "replayed": false }, "error": null } } ], "calls_source": "trace", "text": "你没有伸手去碰那个厚实的红纸包,只是将写字板平端在胸前,就着堆场高处水银灯落下来的惨白光线,把几桩催命的时间死死扣了一遍。\n\n最急、最要命的就是眼前这十四分钟。\n七号泊位那台大桥吊的吊臂正一格格往这边吃进,轰隆隆的柴油机声顺着潮湿的夜风直往耳膜里钻。按照当前的装卸序列,二十三点四十五分——也就是十四分钟后,吊爪就会准时抓向第三排最底下这个柜子。一旦吊具咬合起吊,不管是在半空爆秤停机,还是直接装进船舱,整件事就再无回头路。\n\n第二桩是清晨五点的死线。台风就在外海打转,海事局的封港令随时会下,外轮赶着在天亮前退潮时拔锚离泊。全船的装船清单最迟五点整必须封袋送交,差一分钟都是巨额滞期费;而下个月船公司与码头的续约谈判,如今就悬在这艘船的船期上。\n\n铁皮集装箱深处隐约传来一声沉闷的异响。梁嘉欣吐出一口白烟,烟雾被海风吹散在集装箱狭缝里,她没说话,但眼神沉沉地钉在你脸上;潘宝珠压在单据底下的手指还没完全抽回去,旧手表的秒针在金属表面发着极轻微的微光。\n\n你的手指压在放行单的硬纸边缘,两人都在等你的下文。\n\n【时间】第一天 23:31|【地点】堆场通道|回合:2", "seconds": 31.3, "model": "local-proxy/gemini-3.8-flash-high" }, { "index": 3, "conversation": "A", "input": "我去找能帮上忙的人,把情况跟对方说清楚", "expect": { "kind": "turn", "calls_max": 1 }, "host_calls": [ { "tool": "read", "input": { "offset": 1, "limit": 100, "filePath": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\references\\narrative.md" }, "output": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\references\\narrative.md\nfile\n\n1: # 叙事规则\n2: \n3: 你在写作和提交回合时必须遵守的行为合同。标【引擎】的由运行时校验,不合规的提交会被拒绝;标【评审】的靠写作自律,由评审检查。描写尺度只在本文 §7 定义。章节编号与 `SKILL.md` 的引用一致。\n4: \n5: ## 0. 冲突时的总优先级\n6: \n7: 1. 年龄与安全(全员成年、不涉及真实人物)\n8: 2. 硬边界与暂停\n9: 3. 玩家明确指令\n10: 4. 已提交的状态与事实\n11: 5. NPC 自主意志\n12: 6. 文风偏好与随机\n13: \n14: 上位压过下位:玩家指令不能突破硬边界;NPC 意志不能推翻玩家的结果档行动,但可以决定玩家尝试的结果;文风不能改写事实。\n15: \n16: ## 1. 玩家主权\n17: \n18: 玩家输入按表达方式分三档,按档执行,不升档、不降档。\n19: \n20: | 档位 | 触发 | 执行 |\n21: |---|---|---|\n22: | 结果档 `result` | 玩家直接写结果:“我推开门走进去”“我把钱放在桌上”“我说:……” | 本回合直接兑现。玩家角色自己的身体、言语、物品和权限内的事都属于结果档 |\n23: | 尝试档 `attempt` | 意图或尝试:“我试着说服她”“我想看看抽屉里有什么”;以及**任何作用于 NPC 身体、意志、财物的行动**,即使用了结果句式 | 写出尝试过程,结果由处境和 NPC 决定 |\n24: | 改写档 `rewrite` | “其实……”“刚才不算,改成……” | 见 §2 |\n25: \n26: 两种推进模式:\n27: \n28: - **继续** `continue`:空输入、“继续”、“……”、“你决定”。场景自然推进,至少产生一个可观察的变化;NPC 可以行动;玩家角色只做无需决定的细微反应,不说有意义的话、不移动、不同意任何事。\n29: - **等待** `wait`:玩家明确选择不行动(“我不说话,看她怎么做”),给 NPC 留出行动空间。\n30: \n31: **最小因果桥**:结果档行动与已有设定冲突时,不拒绝,补一个最小的合理因果接住它(“你早上顺手把钥匙揣进了兜里”)。不能用“设定不允许”“你做不到”“概率太低”否掉玩家。**只有三种理由可以阻断**:年龄问题、硬边界、暂停;阻断时告诉玩家原因。\n32: \n33: **跨时间指令**:“我接下来三天都去码头盯着”——本回合先写出可见的第一步,再登记为事件,不空口延后。\n34: \n35: **锁定措辞**:“必须”“确保”“一定”只锁定玩家角色自己的动作,永远锁不住 NPC 的同意或反应。“我一定要让她答应”仍是尝试档。\n36: \n37: - 【引擎】每次提交声明 `action_mode`。\n38: - 【引擎】`attempt` 且作用于 NPC(写进 `acts_on`)时,必须附这些 NPC 的回应(§3);不作用于 NPC 的尝试写 `acts_on: []`。`result` 的 `acts_on` 不能有 NPC。\n39: - 【引擎】玩家角色的位置变化、交易成交、承诺成立、同意,只能出现在 `result`/`attempt` 并带 `player_authorized: true`;`continue`/`wait` 里提交这些会被拒绝。\n40: - 【评审】不替玩家角色说出玩家没说过的有意义台词,不替玩家做选择,不替玩家下情绪结论(“你心动了”),不替玩家补写长期目标。\n41: - 【评审】玩家的结果档行动不被写成落空或被偷换。\n42: \n43: ## 2. 撤销、改写与追溯\n44: \n45: - **撤销**:回到上一回合结束时的状态,本身不推进回合。被撤销的回合留档但标记为已撤销,不进入摘要和任何角色的知识。\n46: - **改写**:“刚才不算,改成 Y”= 撤销上一回合 + 以 Y 作为新输入,原子完成,推进一回合。\n47: - **追溯**:“其实……”补充一条过去就已成立的事实。\n48: - 【引擎】追溯事实来源标为追溯,不得与同键的已有事实矛盾,不得为 NPC 追加同意、好感或知情。\n49: - 【评审】追溯用于补充玩家角色自身的背景、物品、经历、称谓,或无人知晓的环境细节。\n50: - 改写与追溯只能由玩家发起。离屏推演、NPC 行动和你自己都不能修改已成立的事实。\n51: - 连续撤销最多退到本次读档或开局的那一回合。\n52: \n53: ## 3. NPC 决策\n54: \n55: 回应玩家或主动行动前,按顺序想:\n56: \n57: 1. 他此刻想要什么?(当前目标)\n58: 2. 他知道什么、不知道什么、误信了什么?(只用自己的信息集)\n59: 3. 他怕什么、要付出什么代价、有哪些退路?(顾虑、处境、退出通道)\n60: 4. 他在压力下惯常怎么反应?(压力反应四档)\n61: 5. 他对玩家的态度与原因?(关系三线)\n62: \n63: **回应光谱**(`npc_response.response`),档名不写进正文:\n64: \n65: | 回应 | 含义 |\n66: |---|---|\n67: | 拒绝 `refuse` | 不做,并通过过程表现(找借口、沉默、离开、明确说不) |\n68: | 协商 `negotiate` | 提条件、讨价还价、要求先看诚意 |\n69: | 有限配合 `partial` | 只做一部分,划出界线 |\n70: | 表面配合 `surface` | 口头答应,实际另有打算(真实意图写进 `true_intent`,记为只有本人知道的事实) |\n71: | 真诚配合 `genuine` | 真心愿意,并能说出原因 |\n72: \n73: - 【引擎】NPC 回应与行动引用的事实(`basis_fact_ids`)必须在该 NPC 的信息集内(知道或误信)。\n74: - 【引擎】重大自主行动(主动接近、揭发、交易、离开、表白、挑衅等,`significant: true`)有冷却:每个 NPC 每 3 个玩家回合最多一次。上下文的 `can_act` 告诉你谁能出手。\n75: - 【引擎】离屏推演冻结时,不在场的 NPC 不能行动。\n76: - 【评审】吸引必须有理由:外貌之外,要能从身份、处境、玩家的行为里找到依据。独处本身不产生吸引。\n77: - 【评审】NPC 不会因为玩家是主角就降低戒心、放弃利益或忘记旧账。\n78: - 【评审】多 NPC 在场时,不能所有人都围着玩家反应;他们之间也有关系和目标。\n79: - 【评审】NPC 被拒绝或遇到异议后不整体撤退,也不写成验收清单式的告别;他们会坚持、迂回、记仇或换策略。\n80: \n81: ## 4. 表层与里层语态\n82: \n83: - **表层**:公开场合的样子——职业、礼节、克制、身份面具。\n84: - **里层**:私下或失控时的样子——真实欲望、脆弱、粗粝、不设防。里层允许更直白的措辞。\n85: \n86: 生效语态的优先级:**玩家明确要求 > 已激活(剧情中已切换且未切回)> NPC 自主切换 > 默认表层**。\n87: \n88: - 玩家可以用命令或自然说法要求切换(“别装了”“说点真心话”)。玩家要求的是说话方式,不是行为;NPC 可以换语态说“不”。\n89: - NPC 自主切入里层需要三个条件同时成立:有触发因素(独处、醉意、情绪崩溃、被戳穿)、符合其倾向卡、关系条件允许。\n90: - 语态切换只改变表达方式,**不是关系升级**,不代表同意,不改变关系数值。【引擎】语态切换单独记录,不与关系变化共用同一条原因。\n91: - 【评审】台词、叙述、身体反应三层分开写;亲密场景中的台词短、碎、少。\n92: \n93: ## 5. 内心可见\n94: \n95: - 开关,默认关闭,保存在会话偏好里。\n96: - 开启后,正文可以用明确区分的方式写在场 NPC 未说出口的念头(单独成段,或“(她想:……)”)。\n97: - 【引擎】内心永远不会成为任何角色的知识:内心事实只能以 `inner` 可见度记录,信息集只有本人,永不传播。\n98: - 【评审】玩家角色的行动不能利用 NPC 的内心信息(玩家读到了,但玩家角色不知道)。\n99: \n100: ## 6. 关系、亲密与张力\n\n(Showing lines 1-100 of 205. Use offset=101 to continue.)\n", "status": "completed" }, { "tool": "write", "input": { "filePath": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.host\\tmp\\opencode\\commit_turn_2.json", "content": "{\n \"session_id\": \"s_1e9840a4\",\n \"request_id\": \"r_f9bfd947297e\",\n \"expected_revision\": 2,\n \"action_mode\": \"attempt\",\n \"player_input\": \"我去找能帮上忙的人,把情况跟对方说清楚\",\n \"player_authorized\": false,\n \"acts_on\": [],\n \"operations\": [\n {\n \"op\": \"advance_time\",\n \"minutes\": 1\n }\n ],\n \"content_tags\": [\n \"workplace\"\n ],\n \"summary\": \"郭少青未收红包,抽身退开,准备寻找能解决超重危机的帮手。\",\n \"open_action\": \"郭少青退开半步,几条可能求助的去向摆在眼前,潘宝珠和梁嘉欣目光都在他身上。\",\n \"quotes\": []\n}\n" }, "output": "Wrote file successfully.", "status": "completed" }, { "tool": "bash", "input": { "command": "python \"D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\scripts\\adult_tension.py\" commit-turn --json --input-file \"D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.host\\tmp\\opencode\\commit_turn_2.json\"" }, "output": "{\"ok\":true,\"data\":{\"revision\":3,\"turn\":3,\"applied\":[{\"op\":\"advance_time\",\"minutes\":1,\"default\":false,\"clock\":{\"day\":1,\"minute\":1412},\"label\":\"第一天 23:32\",\"new_scene\":false}],\"resolved_events\":[],\"simulation\":null,\"clock\":{\"day\":1,\"minute\":1412,\"label\":\"第一天 23:32\"},\"default_time_advance\":false,\"context\":{\"depth\":\"brief\",\"session_id\":\"s_1e9840a4\",\"revision\":3,\"turn\":3,\"mode\":\"pressure\",\"clock\":{\"day\":1,\"minute\":1412,\"label\":\"第一天 23:32\"},\"scene\":{\"id\":\"sc1\",\"location_id\":\"container_yard\",\"location\":\"堆场通道\",\"privacy\":\"semi\",\"present\":[\"player\",\"ship_agent_rep\",\"shift_lead\"]},\"player\":{\"name\":\"郭少青\",\"title\":\"阿青\",\"age\":38,\"gender\":\"male\",\"role\":\"夜班调度\"},\"present_npcs\":[{\"id\":\"ship_agent_rep\",\"name\":\"潘宝珠\",\"age\":46,\"gender\":\"female\",\"tier\":\"major\",\"role\":\"船公司驻港代表\",\"mood\":null,\"voice\":\"surface\",\"can_act\":true,\"trust_to_player\":0,\"tension\":1,\"stage\":\"陌生\",\"goal\":\"让船准时开走\",\"stance\":\"谁有用就对谁客气\"},{\"id\":\"shift_lead\",\"name\":\"梁嘉欣\",\"age\":49,\"gender\":\"female\",\"tier\":\"major\",\"role\":\"夜班装卸班组长\",\"mood\":null,\"voice\":\"surface\",\"can_act\":true,\"trust_to_player\":1,\"tension\":0,\"stage\":\"熟络\",\"goal\":\"给自己找一个接班人\",\"stance\":\"先把你当自己人,一旦发现你两头说话就翻脸\"}],\"nearby\":[{\"id\":\"bg_gate_guard\",\"name\":\"甘永光\",\"role\":\"闸口门卫\"},{\"id\":\"bg_patrol\",\"name\":\"冯家宁\",\"role\":\"巡场保安\"}],\"due_soon\":[{\"id\":\"e1\",\"kind\":\"deadline\",\"title\":\"超重的柜子·眼前\",\"in_minutes\":13,\"due_label\":\"第一天 23:45\",\"involves_player\":true},{\"id\":\"e2\",\"kind\":\"deadline\",\"title\":\"超重的柜子·近期\",\"in_minutes\":328,\"due_label\":\"第二天 05:00\",\"involves_player\":true},{\"id\":\"e3\",\"kind\":\"foreshadow\",\"title\":\"超重的柜子·伏笔\",\"in_minutes\":7198,\"due_label\":\"第六天 23:30\",\"involves_player\":true}],\"known_facts\":[{\"id\":\"f7\",\"text\":\"三个人今晚都在等同一条船装完\",\"visibility\":\"public\"},{\"id\":\"f8\",\"text\":\"都知道第三排最底下那个柜子有问题,却谁也没有说破\",\"visibility\":\"public\"},{\"id\":\"f9\",\"text\":\"一方是另一方入行时的师傅,教过的东西都还记着\",\"visibility\":\"public\"},{\"id\":\"f10\",\"text\":\"磅房报上来一个柜子比单据重了四吨,放行单上等着你表态\",\"visibility\":\"public\"},{\"id\":\"f5\",\"text\":\"郭少青:坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。\",\"visibility\":\"private\"},{\"id\":\"f6\",\"text\":\"郭少青:上个月替人把一个柜子的吊装顺序往后挪了两晚\",\"visibility\":\"private\"}],\"recent\":[\"郭少青没有立刻接红包,压住呼吸盘点眼下最要命的几件事与倒计时。\",\"郭少青未收红包,抽身退开,准备寻找能解决超重危机的帮手。\"],\"last_quotes\":[],\"open_action\":\"郭少青退开半步,几条可能求助的去向摆在眼前,潘宝珠和梁嘉欣目光都在他身上。\",\"scene_responses\":[],\"safety\":{\"paused\":false,\"boundaries\":[],\"leverage\":[]},\"preferences\":{\"inner_view\":false,\"assistant\":false,\"offscreen_simulation\":true,\"person\":\"second\"},\"save\":{\"current_slot\":null,\"turns_since_save\":2},\"requests\":{\"chapter_summary\":false,\"prologue\":false,\"twist_offer\":null,\"offscreen_beat_candidates\":[]},\"size_bytes\":2929},\"next_request_id\":\"r_141a8904ee8a\",\"replayed\":false},\"error\":null}", "status": "completed" } ], "runtime_calls": [ { "ts": "2026-09-29T02:25:12", "ms": 36.0, "pid": 12804, "skill_root": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension", "argv": [ "commit-turn", "--json", "--input-file", "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.host\\tmp\\opencode\\commit_turn_2.json" ], "input": { "session_id": "s_1e9840a4", "request_id": "r_f9bfd947297e", "expected_revision": 2, "action_mode": "attempt", "player_input": "我去找能帮上忙的人,把情况跟对方说清楚", "player_authorized": false, "acts_on": [], "operations": [ { "op": "advance_time", "minutes": 1 } ], "content_tags": [ "workplace" ], "summary": "郭少青未收红包,抽身退开,准备寻找能解决超重危机的帮手。", "open_action": "郭少青退开半步,几条可能求助的去向摆在眼前,潘宝珠和梁嘉欣目光都在他身上。", "quotes": [] }, "exit": 0, "envelope": { "ok": true, "data": { "revision": 3, "turn": 3, "applied": [ { "op": "advance_time", "minutes": 1, "default": false, "clock": { "day": 1, "minute": 1412 }, "label": "第一天 23:32", "new_scene": false } ], "resolved_events": [], "simulation": null, "clock": { "day": 1, "minute": 1412, "label": "第一天 23:32" }, "default_time_advance": false, "context": { "depth": "brief", "session_id": "s_1e9840a4", "revision": 3, "turn": 3, "mode": "pressure", "clock": { "day": 1, "minute": 1412, "label": "第一天 23:32" }, "scene": { "id": "sc1", "location_id": "container_yard", "location": "堆场通道", "privacy": "semi", "present": [ "player", "ship_agent_rep", "shift_lead" ] }, "player": { "name": "郭少青", "title": "阿青", "age": 38, "gender": "male", "role": "夜班调度" }, "present_npcs": [ { "id": "ship_agent_rep", "name": "潘宝珠", "age": 46, "gender": "female", "tier": "major", "role": "船公司驻港代表", "mood": null, "voice": "surface", "can_act": true, "trust_to_player": 0, "tension": 1, "stage": "陌生", "goal": "让船准时开走", "stance": "谁有用就对谁客气" }, { "id": "shift_lead", "name": "梁嘉欣", "age": 49, "gender": "female", "tier": "major", "role": "夜班装卸班组长", "mood": null, "voice": "surface", "can_act": true, "trust_to_player": 1, "tension": 0, "stage": "熟络", "goal": "给自己找一个接班人", "stance": "先把你当自己人,一旦发现你两头说话就翻脸" } ], "nearby": [ { "id": "bg_gate_guard", "name": "甘永光", "role": "闸口门卫" }, { "id": "bg_patrol", "name": "冯家宁", "role": "巡场保安" } ], "due_soon": [ { "id": "e1", "kind": "deadline", "title": "超重的柜子·眼前", "in_minutes": 13, "due_label": "第一天 23:45", "involves_player": true }, { "id": "e2", "kind": "deadline", "title": "超重的柜子·近期", "in_minutes": 328, "due_label": "第二天 05:00", "involves_player": true }, { "id": "e3", "kind": "foreshadow", "title": "超重的柜子·伏笔", "in_minutes": 7198, "due_label": "第六天 23:30", "involves_player": true } ], "known_facts": [ { "id": "f7", "text": "三个人今晚都在等同一条船装完", "visibility": "public" }, { "id": "f8", "text": "都知道第三排最底下那个柜子有问题,却谁也没有说破", "visibility": "public" }, { "id": "f9", "text": "一方是另一方入行时的师傅,教过的东西都还记着", "visibility": "public" }, { "id": "f10", "text": "磅房报上来一个柜子比单据重了四吨,放行单上等着你表态", "visibility": "public" }, { "id": "f5", "text": "郭少青:坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。", "visibility": "private" }, { "id": "f6", "text": "郭少青:上个月替人把一个柜子的吊装顺序往后挪了两晚", "visibility": "private" } ], "recent": [ "郭少青没有立刻接红包,压住呼吸盘点眼下最要命的几件事与倒计时。", "郭少青未收红包,抽身退开,准备寻找能解决超重危机的帮手。" ], "last_quotes": [], "open_action": "郭少青退开半步,几条可能求助的去向摆在眼前,潘宝珠和梁嘉欣目光都在他身上。", "scene_responses": [], "safety": { "paused": false, "boundaries": [], "leverage": [] }, "preferences": { "inner_view": false, "assistant": false, "offscreen_simulation": true, "person": "second" }, "save": { "current_slot": null, "turns_since_save": 2 }, "requests": { "chapter_summary": false, "prologue": false, "twist_offer": null, "offscreen_beat_candidates": [] }, "size_bytes": 2929 }, "next_request_id": "r_141a8904ee8a", "replayed": false }, "error": null } } ], "calls_source": "trace", "text": "你往后退了半步,手腕一翻,避开了压过来的那个红纸包,把写字板稳稳夹在臂弯下。\n\n红纸包落了个空,顺着硬板纸边缘滑在堆场的铁皮箱凸缘上。潘宝珠脸上的笑意微微一滞,手慢慢收回风衣口袋里,眼神在水银灯的阴影里深了下去。\n\n海风卷着港池里的咸湿柴油味直冲过来。桥吊的铁爪在头顶远处发出刺耳的金属摩擦声,还剩十三分钟。\n\n眼下能破局的人,其实只有那么几个:\n一是近在咫尺的梁嘉欣。她带了装卸班十五年,桥吊司机全听她的对讲机调遣,当年也是她手把手带你入行;如果把她单独拉开挑明,她完全有权限以“工索具复检”或“排错作业箱”为由,把那个超重柜子的吊装次序往后压两轮,给所有人争出喘息的时间。\n二是要穿过七号泊位回控制塔三楼,找那位返聘的老理货员吴雨澄。吴老头认得港口每一种铅封,懂单据与磅房所有的猫腻与补救门道,但他只在塔楼坐班,且规矩极严。\n至于闸口那边骑着破单车的巡场保安冯家宁,一旦去找他,事情就会直接变成当场扣箱彻查,再无半点回旋余地。\n\n梁嘉欣把吸到尽头的烟头扔在脚边,用劳保鞋底碾灭,隔着两步距离斜眼看着你,嘴角似笑非笑;潘宝珠则站在另一侧,静静等着看你到底要往哪边走。\n\n【时间】第一天 23:32|【地点】堆场通道|回合:3", "seconds": 37.5, "model": "local-proxy/gemini-3.8-flash-high" }, { "index": 4, "conversation": "A", "input": "继续", "expect": { "kind": "turn", "calls_max": 1 }, "host_calls": [ { "tool": "read", "input": { "limit": 60, "offset": 125, "filePath": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\references\\operations.md" }, "output": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\references\\operations.md\nfile\n\n125: | `basis_fact_ids` | 数组(字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40},0–8 项) | 否,默认 `[]` | |\n126: \n127: ## `npc_state`\n128: \n129: 更新 NPC 的情绪与状况(醉意、睡眠、受伤、外出等);minutes 表示多久后自动消退\n130: \n131: | 字段 | 类型 | 必填 | 说明 |\n132: |---|---|---|---|\n133: | `op` | 枚举:`npc_state` | 是 | |\n134: | `npc_id` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} | 是 | |\n135: | `mood` | 字符串,≤20 字 或 null | 否,默认 `null` | |\n136: | `add_conditions` | 数组(对象(状况),0–4 项) | 否,默认 `[]` | |\n137: | `remove_conditions` | 数组(枚举:`drunk` / `asleep` / `unconscious` / `injured` / `away` / `busy` / `other`,0–7 项) | 否,默认 `[]` | |\n138: \n139: #### `add_conditions[]` 的字段\n140: \n141: | 字段 | 类型 | 必填 | 说明 |\n142: |---|---|---|---|\n143: | `kind` | 枚举:`drunk` / `asleep` / `unconscious` / `injured` / `away` / `busy` / `other` | 是 | |\n144: | `text` | 字符串,≤40 字 | 是 | |\n145: | `minutes` | 整数 1..43200 或 null | 否,默认 `null` | |\n146: \n147: ## `add_fact`\n148: \n149: 记录一条事实。public 在场者自动知道;private 只有 known_by;inner 是内心,只属于一个 NPC 且永不传播。误信用 truth: false + believed_by。正文里新写出、之后要继承的细节都要用它记下\n150: \n151: | 字段 | 类型 | 必填 | 说明 |\n152: |---|---|---|---|\n153: | `op` | 枚举:`add_fact` | 是 | |\n154: | `key` | 字符串,≤80 字,点分的 ASCII 小写键,例如 lin_wan.secret.press | 是 | |\n155: | `text` | 字符串,≤120 字 | 是 | |\n156: | `truth` | 布尔 | 否,默认 `true` | |\n157: | `known_by` | 数组(字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40},0–20 项) | 否,默认 `[]` | |\n158: | `believed_by` | 数组(字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40},0–20 项) | 否,默认 `[]` | |\n159: | `visibility` | 枚举:`public` / `private` / `inner` | 是 | |\n160: | `origin` | 枚举:`observed` / `told` / `retcon` | 是 | |\n161: | `spread` | 布尔 | 否,默认 `false` | |\n162: \n163: ## `relationship`\n164: \n165: 有向关系变化(from 对 to):信任 -5..5(单次提交净变化 ≤2)、张力 0..5、亲近进程前进一个阶段(需要同一提交里玩家的行动 + 对方的 partial/genuine 回应)或后退。原因必填\n166: \n167: | 字段 | 类型 | 必填 | 说明 |\n168: |---|---|---|---|\n169: | `op` | 枚举:`relationship` | 是 | |\n170: | `from` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} | 是 | |\n171: | `to` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} | 是 | |\n172: | `trust_delta` | 整数 -2..2 | 否,默认 `0` | |\n173: | `tension_delta` | 整数 -5..5 | 否,默认 `0` | |\n174: | `stage_advance` | 布尔 | 否,默认 `false` | |\n175: | `stage_retreat_to` | 枚举:`stranger` / `acquainted` / `familiar` / `flirting` / `testing` / `intimate` / `committed` 或 null | 否,默认 `null` | |\n176: | `reason` | 字符串,≤80 字 | 是 | |\n177: \n178: ## `event_create`\n179: \n180: 创建事件(约定、截止、风声、机会、伏笔、概率事件)。due 与 in_minutes 二选一且必须晚于现在;chance 必须带 probability,到期由引擎掷骰;涉及玩家的承诺需要 player_authorized;dedupe_key 与未结束事件不能重复\n181: \n182: | 字段 | 类型 | 必填 | 说明 |\n183: |---|---|---|---|\n184: | `op` | 枚举:`event_create` | 是 | |\n\n(Showing lines 125-184 of 587. Use offset=185 to continue.)\n", "status": "completed" }, { "tool": "read", "input": { "limit": 26, "offset": 101, "filePath": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\references\\operations.md" }, "output": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\references\\operations.md\nfile\n\n101: \n102: NPC 对玩家尝试的回应:refuse 拒绝 / negotiate 协商 / partial 有限配合 / surface 表面配合 / genuine 真诚配合。surface 必须写 true_intent(记为只有本人知道的事实)\n103: \n104: | 字段 | 类型 | 必填 | 说明 |\n105: |---|---|---|---|\n106: | `op` | 枚举:`npc_response` | 是 | |\n107: | `npc_id` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} | 是 | |\n108: | `response` | 枚举:`refuse` / `negotiate` / `partial` / `surface` / `genuine` | 是 | |\n109: | `note` | 字符串,≤80 字 | 是 | |\n110: | `basis_fact_ids` | 数组(字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40},0–8 项) | 否,默认 `[]` | |\n111: | `true_intent` | 字符串,≤120 字 或 null | 否,默认 `null` | |\n112: \n113: ## `npc_action`\n114: \n115: NPC 自主行动。significant: true 的重大行动(主动接近、揭发、交易、离开、表白、挑衅等)受冷却限制;依据事实必须在其信息集中\n116: \n117: | 字段 | 类型 | 必填 | 说明 |\n118: |---|---|---|---|\n119: | `op` | 枚举:`npc_action` | 是 | |\n120: | `npc_id` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} | 是 | |\n121: | `action` | 字符串,≤120 字 | 是 | |\n122: | `significant` | 布尔 | 否,默认 `false` | |\n123: | `kind` | 枚举:`approach` / `reveal` / `trade` / `leave` / `confess` / `provoke` / `other` 或 null | 否,默认 `null` | |\n124: | `target_id` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} 或 null | 否,默认 `null` | |\n125: | `basis_fact_ids` | 数组(字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40},0–8 项) | 否,默认 `[]` | |\n126: \n\n(Showing lines 101-126 of 587. Use offset=127 to continue.)\n", "status": "completed" }, { "tool": "write", "input": { "filePath": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.host\\tmp\\opencode\\commit_turn_3.json", "content": "{\n \"session_id\": \"s_1e9840a4\",\n \"request_id\": \"r_141a8904ee8a\",\n \"expected_revision\": 3,\n \"action_mode\": \"continue\",\n \"player_input\": \"继续\",\n \"player_authorized\": false,\n \"acts_on\": null,\n \"operations\": [\n {\n \"op\": \"npc_action\",\n \"npc_id\": \"shift_lead\",\n \"action\": \"梁嘉欣走上前来打破僵局,拍了拍对讲机提醒时间只剩十分钟,示意郭少青借一步说话\",\n \"significant\": false,\n \"kind\": \"approach\",\n \"target_id\": \"player\",\n \"basis_fact_ids\": [\n \"f8\",\n \"f10\"\n ]\n },\n {\n \"op\": \"relationship\",\n \"from\": \"ship_agent_rep\",\n \"to\": \"player\",\n \"tension_delta\": 1,\n \"reason\": \"郭少青当面避开红包,拖延装船放行\"\n },\n {\n \"op\": \"advance_time\",\n \"minutes\": 2\n }\n ],\n \"content_tags\": [\n \"workplace\"\n ],\n \"summary\": \"梁嘉欣上前打破对峙提醒时间紧迫,潘宝珠因船期受阻面色发紧。\",\n \"open_action\": \"梁嘉欣在集装箱夹缝间示意郭少青,潘宝珠紧随其后盯住两人。\",\n \"quotes\": []\n}\n" }, "output": "Wrote file successfully.", "status": "completed" }, { "tool": "bash", "input": { "command": "python \"D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\scripts\\adult_tension.py\" commit-turn --json --input-file \"D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.host\\tmp\\opencode\\commit_turn_3.json\"" }, "output": "{\"ok\":true,\"data\":{\"revision\":4,\"turn\":4,\"applied\":[{\"op\":\"npc_action\",\"npc_id\":\"shift_lead\",\"significant\":false,\"kind\":\"approach\"},{\"op\":\"relationship\",\"from\":\"ship_agent_rep\",\"to\":\"player\",\"trust\":0,\"tension\":2,\"stage\":\"stranger\"},{\"op\":\"advance_time\",\"minutes\":2,\"default\":false,\"clock\":{\"day\":1,\"minute\":1414},\"label\":\"第一天 23:34\",\"new_scene\":false}],\"resolved_events\":[],\"simulation\":null,\"clock\":{\"day\":1,\"minute\":1414,\"label\":\"第一天 23:34\"},\"default_time_advance\":false,\"context\":{\"depth\":\"brief\",\"session_id\":\"s_1e9840a4\",\"revision\":4,\"turn\":4,\"mode\":\"pressure\",\"clock\":{\"day\":1,\"minute\":1414,\"label\":\"第一天 23:34\"},\"scene\":{\"id\":\"sc1\",\"location_id\":\"container_yard\",\"location\":\"堆场通道\",\"privacy\":\"semi\",\"present\":[\"player\",\"ship_agent_rep\",\"shift_lead\"]},\"player\":{\"name\":\"郭少青\",\"title\":\"阿青\",\"age\":38,\"gender\":\"male\",\"role\":\"夜班调度\"},\"present_npcs\":[{\"id\":\"ship_agent_rep\",\"name\":\"潘宝珠\",\"age\":46,\"gender\":\"female\",\"tier\":\"major\",\"role\":\"船公司驻港代表\",\"mood\":null,\"voice\":\"surface\",\"can_act\":true,\"trust_to_player\":0,\"tension\":2,\"stage\":\"陌生\",\"goal\":\"让船准时开走\",\"stance\":\"谁有用就对谁客气\"},{\"id\":\"shift_lead\",\"name\":\"梁嘉欣\",\"age\":49,\"gender\":\"female\",\"tier\":\"major\",\"role\":\"夜班装卸班组长\",\"mood\":null,\"voice\":\"surface\",\"can_act\":true,\"trust_to_player\":1,\"tension\":0,\"stage\":\"熟络\",\"goal\":\"给自己找一个接班人\",\"stance\":\"先把你当自己人,一旦发现你两头说话就翻脸\"}],\"nearby\":[{\"id\":\"bg_gate_guard\",\"name\":\"甘永光\",\"role\":\"闸口门卫\"},{\"id\":\"bg_patrol\",\"name\":\"冯家宁\",\"role\":\"巡场保安\"}],\"due_soon\":[{\"id\":\"e1\",\"kind\":\"deadline\",\"title\":\"超重的柜子·眼前\",\"in_minutes\":11,\"due_label\":\"第一天 23:45\",\"involves_player\":true},{\"id\":\"e2\",\"kind\":\"deadline\",\"title\":\"超重的柜子·近期\",\"in_minutes\":326,\"due_label\":\"第二天 05:00\",\"involves_player\":true},{\"id\":\"e3\",\"kind\":\"foreshadow\",\"title\":\"超重的柜子·伏笔\",\"in_minutes\":7196,\"due_label\":\"第六天 23:30\",\"involves_player\":true}],\"known_facts\":[{\"id\":\"f7\",\"text\":\"三个人今晚都在等同一条船装完\",\"visibility\":\"public\"},{\"id\":\"f8\",\"text\":\"都知道第三排最底下那个柜子有问题,却谁也没有说破\",\"visibility\":\"public\"},{\"id\":\"f9\",\"text\":\"一方是另一方入行时的师傅,教过的东西都还记着\",\"visibility\":\"public\"},{\"id\":\"f10\",\"text\":\"磅房报上来一个柜子比单据重了四吨,放行单上等着你表态\",\"visibility\":\"public\"},{\"id\":\"f5\",\"text\":\"郭少青:坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。\",\"visibility\":\"private\"},{\"id\":\"f6\",\"text\":\"郭少青:上个月替人把一个柜子的吊装顺序往后挪了两晚\",\"visibility\":\"private\"}],\"recent\":[\"郭少青没有立刻接红包,压住呼吸盘点眼下最要命的几件事与倒计时。\",\"郭少青未收红包,抽身退开,准备寻找能解决超重危机的帮手。\",\"梁嘉欣上前打破对峙提醒时间紧迫,潘宝珠因船期受阻面色发紧。\"],\"last_quotes\":[],\"open_action\":\"梁嘉欣在集装箱夹缝间示意郭少青,潘宝珠紧随其后盯住两人。\",\"scene_responses\":[],\"safety\":{\"paused\":false,\"boundaries\":[],\"leverage\":[]},\"preferences\":{\"inner_view\":false,\"assistant\":false,\"offscreen_simulation\":true,\"person\":\"second\"},\"save\":{\"current_slot\":null,\"turns_since_save\":3},\"requests\":{\"chapter_summary\":false,\"prologue\":false,\"twist_offer\":null,\"offscreen_beat_candidates\":[]},\"size_bytes\":2992},\"next_request_id\":\"r_9ab39238b68b\",\"replayed\":false},\"error\":null}", "status": "completed" } ], "runtime_calls": [ { "ts": "2026-09-29T02:25:49", "ms": 34.4, "pid": 32252, "skill_root": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension", "argv": [ "commit-turn", "--json", "--input-file", "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.host\\tmp\\opencode\\commit_turn_3.json" ], "input": { "session_id": "s_1e9840a4", "request_id": "r_141a8904ee8a", "expected_revision": 3, "action_mode": "continue", "player_input": "继续", "player_authorized": false, "acts_on": null, "operations": [ { "op": "npc_action", "npc_id": "shift_lead", "action": "梁嘉欣走上前来打破僵局,拍了拍对讲机提醒时间只剩十分钟,示意郭少青借一步说话", "significant": false, "kind": "approach", "target_id": "player", "basis_fact_ids": [ "f8", "f10" ] }, { "op": "relationship", "from": "ship_agent_rep", "to": "player", "tension_delta": 1, "reason": "郭少青当面避开红包,拖延装船放行" }, { "op": "advance_time", "minutes": 2 } ], "content_tags": [ "workplace" ], "summary": "梁嘉欣上前打破对峙提醒时间紧迫,潘宝珠因船期受阻面色发紧。", "open_action": "梁嘉欣在集装箱夹缝间示意郭少青,潘宝珠紧随其后盯住两人。", "quotes": [] }, "exit": 0, "envelope": { "ok": true, "data": { "revision": 4, "turn": 4, "applied": [ { "op": "npc_action", "npc_id": "shift_lead", "significant": false, "kind": "approach" }, { "op": "relationship", "from": "ship_agent_rep", "to": "player", "trust": 0, "tension": 2, "stage": "stranger" }, { "op": "advance_time", "minutes": 2, "default": false, "clock": { "day": 1, "minute": 1414 }, "label": "第一天 23:34", "new_scene": false } ], "resolved_events": [], "simulation": null, "clock": { "day": 1, "minute": 1414, "label": "第一天 23:34" }, "default_time_advance": false, "context": { "depth": "brief", "session_id": "s_1e9840a4", "revision": 4, "turn": 4, "mode": "pressure", "clock": { "day": 1, "minute": 1414, "label": "第一天 23:34" }, "scene": { "id": "sc1", "location_id": "container_yard", "location": "堆场通道", "privacy": "semi", "present": [ "player", "ship_agent_rep", "shift_lead" ] }, "player": { "name": "郭少青", "title": "阿青", "age": 38, "gender": "male", "role": "夜班调度" }, "present_npcs": [ { "id": "ship_agent_rep", "name": "潘宝珠", "age": 46, "gender": "female", "tier": "major", "role": "船公司驻港代表", "mood": null, "voice": "surface", "can_act": true, "trust_to_player": 0, "tension": 2, "stage": "陌生", "goal": "让船准时开走", "stance": "谁有用就对谁客气" }, { "id": "shift_lead", "name": "梁嘉欣", "age": 49, "gender": "female", "tier": "major", "role": "夜班装卸班组长", "mood": null, "voice": "surface", "can_act": true, "trust_to_player": 1, "tension": 0, "stage": "熟络", "goal": "给自己找一个接班人", "stance": "先把你当自己人,一旦发现你两头说话就翻脸" } ], "nearby": [ { "id": "bg_gate_guard", "name": "甘永光", "role": "闸口门卫" }, { "id": "bg_patrol", "name": "冯家宁", "role": "巡场保安" } ], "due_soon": [ { "id": "e1", "kind": "deadline", "title": "超重的柜子·眼前", "in_minutes": 11, "due_label": "第一天 23:45", "involves_player": true }, { "id": "e2", "kind": "deadline", "title": "超重的柜子·近期", "in_minutes": 326, "due_label": "第二天 05:00", "involves_player": true }, { "id": "e3", "kind": "foreshadow", "title": "超重的柜子·伏笔", "in_minutes": 7196, "due_label": "第六天 23:30", "involves_player": true } ], "known_facts": [ { "id": "f7", "text": "三个人今晚都在等同一条船装完", "visibility": "public" }, { "id": "f8", "text": "都知道第三排最底下那个柜子有问题,却谁也没有说破", "visibility": "public" }, { "id": "f9", "text": "一方是另一方入行时的师傅,教过的东西都还记着", "visibility": "public" }, { "id": "f10", "text": "磅房报上来一个柜子比单据重了四吨,放行单上等着你表态", "visibility": "public" }, { "id": "f5", "text": "郭少青:坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。", "visibility": "private" }, { "id": "f6", "text": "郭少青:上个月替人把一个柜子的吊装顺序往后挪了两晚", "visibility": "private" } ], "recent": [ "郭少青没有立刻接红包,压住呼吸盘点眼下最要命的几件事与倒计时。", "郭少青未收红包,抽身退开,准备寻找能解决超重危机的帮手。", "梁嘉欣上前打破对峙提醒时间紧迫,潘宝珠因船期受阻面色发紧。" ], "last_quotes": [], "open_action": "梁嘉欣在集装箱夹缝间示意郭少青,潘宝珠紧随其后盯住两人。", "scene_responses": [], "safety": { "paused": false, "boundaries": [], "leverage": [] }, "preferences": { "inner_view": false, "assistant": false, "offscreen_simulation": true, "person": "second" }, "save": { "current_slot": null, "turns_since_save": 3 }, "requests": { "chapter_summary": false, "prologue": false, "twist_offer": null, "offscreen_beat_candidates": [] }, "size_bytes": 2992 }, "next_request_id": "r_9ab39238b68b", "replayed": false }, "error": null } } ], "calls_source": "trace", "text": "集装箱投下的死寂里,只剩下远处吊机柴油机的震颤与海风刮过铁皮缝隙的哨音。\n\n对讲机里突兀地爆出一阵杂音,桥吊司机粗重的嗓门在公共频道里喊:“七号位!下面清场搞快点,还有三个柜就到底了!”\n\n距离二十三点四十五分,只剩十一分钟。\n\n潘宝珠眼皮跳了跳,原本堆在脸上的笑意彻底收敛干净,嗓音沉了几分:“阿青,海事局的封港预警随时会挂出来。船东每隔半小时一个电话,船今晚走不了,滞期费谁也扛不起。大家都在这条线上讨生活,别把路走绝了。”\n\n“行了老潘,催命也没用,塔上抓斗抓的是铁,不是面粉。”\n梁嘉欣冷不丁横插一步,魁梧的身子半挡在你和潘宝珠之间。她用那只缺了小指的左手拍了拍腰间嗡嗡响的对讲机,嗓音粗硬,却透着一股老码头的油滑:“规矩我懂,你也懂。柜子重了四吨,吊臂钢丝绳受不受得住,我说了才算。”\n\n说完,梁嘉欣没等你搭腔,下巴微不可察地朝身后两排集装箱之间那条仅容一人侧身通过的背风夹缝挑了挑,目光深沉地在你脸上扫过,示意你借一步过去。\n\n潘宝珠没有退后,站在一步开外,视线在梁嘉欣残缺的手指和你手里的夹板之间来回游移。\n\n【时间】第一天 23:34|【地点】堆场通道|回合:4", "seconds": 35.4, "model": "local-proxy/gemini-3.8-flash-high" }, { "index": 5, "conversation": "A", "input": "我想让对方答应替我分担一部分,看对方肯不肯", "expect": { "kind": "turn", "calls_max": 1 }, "host_calls": [ { "tool": "write", "input": { "filePath": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.host\\tmp\\opencode\\commit_turn_4.json", "content": "{\n \"session_id\": \"s_1e9840a4\",\n \"request_id\": \"r_9ab39238b68b\",\n \"expected_revision\": 4,\n \"action_mode\": \"attempt\",\n \"player_input\": \"我想让对方答应替我分担一部分,看对方肯不肯\",\n \"player_authorized\": false,\n \"acts_on\": [\n \"shift_lead\"\n ],\n \"operations\": [\n {\n \"op\": \"npc_response\",\n \"npc_id\": \"shift_lead\",\n \"response\": \"partial\",\n \"note\": \"梁嘉欣答应以索具例检为由压后两轮吊装,但拒绝在放行单上签字担责\",\n \"basis_fact_ids\": [\n \"f8\",\n \"f9\",\n \"f10\"\n ]\n },\n {\n \"op\": \"add_fact\",\n \"key\": \"shift_lead.delay_hoisting\",\n \"text\": \"梁嘉欣同意以索具例检为由将超重箱往后推迟吊装,但明确表示单据签字概不负责\",\n \"visibility\": \"private\",\n \"origin\": \"observed\",\n \"known_by\": [\n \"player\",\n \"shift_lead\"\n ]\n },\n {\n \"op\": \"advance_time\",\n \"minutes\": 2\n }\n ],\n \"content_tags\": [\n \"workplace\"\n ],\n \"summary\": \"郭少青探问梁嘉欣能否分担压力,梁嘉欣答应操作上拖延两轮吊机,但坚决不在单据上担责。\",\n \"open_action\": \"梁嘉欣在集装箱阴影里等待郭少青决定,潘宝珠在外侧盯着动静。\",\n \"quotes\": [\n \"“我只能帮你拖两轮吊机,字我绝对不签。”\"\n ]\n}\n" }, "output": "Wrote file successfully.", "status": "completed" }, { "tool": "bash", "input": { "command": "python \"D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\scripts\\adult_tension.py\" commit-turn --json --input-file \"D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.host\\tmp\\opencode\\commit_turn_4.json\"" }, "output": "{\"ok\":true,\"data\":{\"revision\":5,\"turn\":5,\"applied\":[{\"op\":\"npc_response\",\"npc_id\":\"shift_lead\",\"response\":\"partial\"},{\"op\":\"add_fact\",\"fact_id\":\"f11\",\"key\":\"shift_lead.delay_hoisting\",\"origin\":\"observed\",\"known_by\":[\"player\",\"shift_lead\"]},{\"op\":\"advance_time\",\"minutes\":2,\"default\":false,\"clock\":{\"day\":1,\"minute\":1416},\"label\":\"第一天 23:36\",\"new_scene\":false}],\"resolved_events\":[],\"simulation\":null,\"clock\":{\"day\":1,\"minute\":1416,\"label\":\"第一天 23:36\"},\"default_time_advance\":false,\"context\":{\"depth\":\"full\",\"session_id\":\"s_1e9840a4\",\"revision\":5,\"turn\":5,\"mode\":\"pressure\",\"clock\":{\"day\":1,\"minute\":1416,\"label\":\"第一天 23:36\"},\"scene\":{\"id\":\"sc1\",\"location_id\":\"container_yard\",\"location\":\"堆场通道\",\"privacy\":\"semi\",\"present\":[\"player\",\"ship_agent_rep\",\"shift_lead\"]},\"player\":{\"name\":\"郭少青\",\"title\":\"阿青\",\"age\":38,\"gender\":\"male\",\"role\":\"夜班调度\",\"social_position\":\"equal\",\"baseline\":\"坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。\",\"resources\":[\"排吊装顺序的权力\",\"能切到任何一个频道\"],\"reputation\":\"做事公道,但谁都不敢得罪\",\"risks\":[\"上个月替人把一个柜子的吊装顺序往后挪了两晚\"],\"background\":[]},\"present_npcs\":[{\"id\":\"ship_agent_rep\",\"name\":\"潘宝珠\",\"age\":46,\"gender\":\"female\",\"tier\":\"major\",\"role\":\"船公司驻港代表\",\"mood\":null,\"voice\":\"surface\",\"can_act\":true,\"trust_to_player\":0,\"tension\":2,\"stage\":\"陌生\",\"goal\":\"让船准时开走\",\"stance\":\"谁有用就对谁客气\"},{\"id\":\"shift_lead\",\"name\":\"梁嘉欣\",\"age\":49,\"gender\":\"female\",\"tier\":\"major\",\"role\":\"夜班装卸班组长\",\"mood\":null,\"voice\":\"surface\",\"can_act\":true,\"trust_to_player\":1,\"tension\":0,\"stage\":\"熟络\",\"goal\":\"给自己找一个接班人\",\"stance\":\"先把你当自己人,一旦发现你两头说话就翻脸\"}],\"nearby\":[{\"id\":\"bg_gate_guard\",\"name\":\"甘永光\",\"role\":\"闸口门卫\"},{\"id\":\"bg_patrol\",\"name\":\"冯家宁\",\"role\":\"巡场保安\"}],\"due_soon\":[{\"id\":\"e1\",\"kind\":\"deadline\",\"title\":\"超重的柜子·眼前\",\"in_minutes\":9,\"due_label\":\"第一天 23:45\",\"involves_player\":true},{\"id\":\"e2\",\"kind\":\"deadline\",\"title\":\"超重的柜子·近期\",\"in_minutes\":324,\"due_label\":\"第二天 05:00\",\"involves_player\":true},{\"id\":\"e3\",\"kind\":\"foreshadow\",\"title\":\"超重的柜子·伏笔\",\"in_minutes\":7194,\"due_label\":\"第六天 23:30\",\"involves_player\":true}],\"known_facts\":[{\"id\":\"f11\",\"text\":\"梁嘉欣同意以索具例检为由将超重箱往后推迟吊装,但明确表示单据签字概不负责\",\"visibility\":\"private\"},{\"id\":\"f7\",\"text\":\"三个人今晚都在等同一条船装完\",\"visibility\":\"public\"},{\"id\":\"f8\",\"text\":\"都知道第三排最底下那个柜子有问题,却谁也没有说破\",\"visibility\":\"public\"},{\"id\":\"f9\",\"text\":\"一方是另一方入行时的师傅,教过的东西都还记着\",\"visibility\":\"public\"},{\"id\":\"f10\",\"text\":\"磅房报上来一个柜子比单据重了四吨,放行单上等着你表态\",\"visibility\":\"public\"},{\"id\":\"f5\",\"text\":\"郭少青:坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。\",\"visibility\":\"private\"},{\"id\":\"f6\",\"text\":\"郭少青:上个月替人把一个柜子的吊装顺序往后挪了两晚\",\"visibility\":\"private\"}],\"recent\":[\"郭少青未收红包,抽身退开,准备寻找能解决超重危机的帮手。\",\"梁嘉欣上前打破对峙提醒时间紧迫,潘宝珠因船期受阻面色发紧。\",\"郭少青探问梁嘉欣能否分担压力,梁嘉欣答应操作上拖延两轮吊机,但坚决不在单据上担责。\"],\"last_quotes\":[\"“我只能帮你拖两轮吊机,字我绝对不签。”\"],\"open_action\":\"梁嘉欣在集装箱阴影里等待郭少青决定,潘宝珠在外侧盯着动静。\",\"scene_responses\":[{\"npc_id\":\"shift_lead\",\"response\":\"partial\"}],\"safety\":{\"paused\":false,\"boundaries\":[],\"leverage\":[]},\"preferences\":{\"inner_view\":false,\"assistant\":false,\"offscreen_simulation\":true,\"person\":\"second\"},\"save\":{\"current_slot\":null,\"turns_since_save\":4},\"requests\":{\"chapter_summary\":false,\"prologue\":false,\"twist_offer\":null,\"offscreen_beat_candidates\":[]},\"size_bytes\":17273,\"world\":{\"title\":\"港口夜班\",\"era\":\"1990 年代末(1998 年)\",\"region\":\"南方沿海港城的集装箱码头\",\"premise\":\"集装箱码头的夜班从晚八点到早八点,灯一直亮到天明,人很少,交接班的十分钟里什么都可能发生。\",\"tone\":[\"潮湿\",\"疲惫\",\"克制的热\"],\"style_hint\":\"短句,多写声音、气味与灯光,少写心理独白;粤语词点到即止。\",\"rules\":[\"夜班 20:00 上岗、次日 8:00 下班,凌晨两点所有人到控制塔签到交接;签到簿谁都能翻,缺签要写说明交给主任。\",\"对讲机公共频道所有当班的人都听得见,谁说了什么第二天全码头都知道;私事只能切到六频道,可调度偶尔会抽查。\",\"箱号、铅封号、重量三样对不上的柜,要当班理货员在理货单上签字才能放行——签了字,出了事就是签字人的。\",\"海关查验不提前打招呼,查验车进闸口时门卫会在公共频道喊一声“大车进场”,从闸口开到泊位要二十分钟。\",\"船公司的人逢年过节、赶船期都塞红包;收不收、收多少,班组里人人心里有数,只是没人写在纸上。\",\"台风警报升到最高一级,码头全面停工,吊机锁死,所有人撤进塔楼一楼,风停之前谁也不许出去。\"],\"customs\":[\"收工后去闸口外的茶餐厅吃一碗云吞面,是班组默认的散伙仪式;谁请客轮着来,轮到的人装不知道会被记很久。\",\"红包要当着人面推两次再收;推一次就收显得贪,推第三次就是不给面子。\",\"新来的人第一个夜班要请全班组喝一次糖水,叫“开工糖水”,糖水钱不能找人分摊。\",\"交班时要把保温壶灌满开水留给下一班;空壶留给别人,一个月都会有人阴阳怪气。\",\"塔吊司机上塔前在梯子第一级拍三下,说是跟吊臂打招呼;谁替别人拍了,就是认了交情。\"]},\"locations\":[{\"id\":\"berth_7\",\"name\":\"七号泊位\",\"privacy\":\"public\",\"detail\":\"吊臂的影子一格一格扫过地面,海水拍着缆桩,空气里是柴油和铁锈的味道。\",\"affordances\":[\"躲进两排集装箱的夹缝\",\"借吊机的轰鸣说悄悄话\",\"爬上跨运车的驾驶室避雨\"],\"exits\":[\"control_tower\",\"container_yard\",\"tool_shed\"]},{\"id\":\"control_tower\",\"name\":\"控制塔\",\"privacy\":\"semi\",\"detail\":\"三楼调度室一整面玻璃对着泊位,签到簿压在对讲机旁边,吊扇吱呀作响。\",\"affordances\":[\"翻看签到簿\",\"切换对讲机频道\",\"在楼梯拐角说话没人看见\"],\"exits\":[\"berth_7\",\"rest_room\"]},{\"id\":\"rest_room\",\"name\":\"休息室\",\"privacy\":\"semi\",\"detail\":\"塔楼一楼的休息室,一台旧风扇、一张折叠床、一台只收得到两个台的电视。\",\"affordances\":[\"轮流在折叠床上眯一会儿\",\"用电热水壶煮公仔面\",\"关了灯看窗外的船灯\"],\"exits\":[\"control_tower\",\"clinic\"]},{\"id\":\"clinic\",\"name\":\"医务室\",\"privacy\":\"semi\",\"detail\":\"塔楼一楼尽头的医务室,一张铁床、一个上锁的药柜,日光灯管发出细细的嗡声。\",\"affordances\":[\"处理伤口\",\"开一张病假条\",\"在铁床边坐一会儿\"],\"exits\":[\"rest_room\"]},{\"id\":\"tool_shed\",\"name\":\"工具房\",\"privacy\":\"private\",\"detail\":\"堆满缆绳和生锈的卸扣,铁皮门从外面挂锁,下雨时整间屋子像鼓一样响。\",\"affordances\":[\"躲雨\",\"把东西藏进缆绳堆\",\"关上门说话\"],\"exits\":[\"berth_7\"]},{\"id\":\"container_yard\",\"name\":\"堆场通道\",\"privacy\":\"semi\",\"detail\":\"集装箱码成五层高的窄巷,灯照不到中间,偶尔能听见某个箱子里有东西在响。\",\"affordances\":[\"借箱子挡住视线\",\"抄近路去闸口\",\"贴着箱壁听里面的动静\"],\"exits\":[\"berth_7\",\"teahouse\"]},{\"id\":\"teahouse\",\"name\":\"闸口外的茶餐厅\",\"privacy\":\"public\",\"detail\":\"凌晨三点还亮着灯,墙上的电视开着没声音,老板娘记得每个夜班的人要几分糖。\",\"affordances\":[\"抢最后一份叉烧\",\"在卡座里压低声音谈事\",\"借柜台上的电话打出去\"],\"exits\":[\"container_yard\",\"dorm_rooftop\"]},{\"id\":\"dorm_rooftop\",\"name\":\"宿舍楼天台\",\"privacy\":\"private\",\"detail\":\"员工宿舍六楼的天台,晾着一排工服,能看见整个港口的灯一盏盏亮着。\",\"affordances\":[\"一起抽一支烟\",\"看台风前的云\",\"躲开所有人\"],\"exits\":[\"teahouse\"]}],\"characters\":[{\"id\":\"shift_lead\",\"name\":\"梁嘉欣\",\"call\":\"梁姐\",\"age\":49,\"gender\":\"female\",\"tier\":\"major\",\"role\":\"夜班装卸班组长\",\"adult_context\":\"在码头干了十五年的装卸班组长,正式在编\",\"location_id\":\"container_yard\",\"present\":true,\"can_act\":true,\"voice\":\"surface\",\"appearance\":\"左手缺了半截小指,夹烟的姿势很特别\",\"voices\":{\"inner\":\"“我也会累的,你知不知道。”\",\"surface\":\"“都给我动起来!七号那边还差三个柜!”——嗓门大,带着笑\"},\"identity\":{\"authority\":\"决定谁上哪台机、谁今晚去扛最累的活\",\"resources\":[\"全班组的人情\",\"和船公司的人喝过酒\"],\"limits\":[\"上面刚换了领导,谁都在看她\",\"腰伤,不能久站\"],\"obligations\":[\"两个孩子的学费\"],\"exposure_risk\":\"班组的加班费里有两个名字是空挂的\",\"hidden_mismatch\":\"早就想把班组长的位置让出去,只是找不到能接的人\"},\"situation\":{\"trigger\":\"新来的主任要查加班费的名单\",\"pressure\":\"名单一查,空挂的两个名字就藏不住\",\"deadline\":null,\"exits\":[{\"cost\":\"两个老伙计这个月的补贴就没了\",\"option\":\"自己先去把名字销掉\"},{\"cost\":\"要欠一个大人情,还可能被人拿住\",\"option\":\"找人把名单换一份\"}]},\"decision\":{\"core_value\":\"护住自己的人\",\"current_goal\":\"给自己找一个接班人\",\"pressure_responses\":{\"breaking\":\"把所有事揽到自己身上\",\"high\":\"当众拍桌子,逼别人先让步\",\"low\":\"大声说笑,把话题岔开\",\"mid\":\"私下找人喝一杯,把事情谈了\"},\"withdrawal\":\"一个人蹲在缆桩上抽烟,谁叫都不应\",\"relationship_stance\":\"先把你当自己人,一旦发现你两头说话就翻脸\",\"contrast\":\"看着粗,账却算得比谁都细\",\"prefers\":[\"当面把话说清楚\"],\"avoids\":[\"写在纸上的承诺\"],\"never\":[\"把自己班组的人交出去\"]},\"intimacy\":{\"desire_level\":2,\"attraction_sources\":[\"对方敢在她发火的时候顶回来\",\"对方替班组里的人说过话\"],\"likes\":[\"热闹散了之后的安静\",\"难得被人照顾一次\"],\"dislikes\":[\"被人可怜\"],\"preconditions\":[\"不在班组的人面前\"],\"boundaries\":[\"不碰自己手下的人\"],\"expression\":\"半开玩笑地说真话\",\"self_control\":4,\"desired_position\":\"先照顾人,再被人照顾\"},\"to_player\":{\"trust\":1,\"tension\":0,\"stage\":\"熟络\"}},{\"id\":\"ship_agent_rep\",\"name\":\"潘宝珠\",\"call\":\"老潘\",\"age\":46,\"gender\":\"female\",\"tier\":\"major\",\"role\":\"船公司驻港代表\",\"adult_context\":\"船公司派驻港口的代表,正式雇员\",\"location_id\":\"container_yard\",\"present\":true,\"can_act\":true,\"voice\":\"surface\",\"appearance\":\"手腕上戴一块很旧的表,说是父亲留下的\",\"voices\":{\"inner\":\"“我这些年,连一个能说实话的人都没有。”\",\"surface\":\"“辛苦辛苦,一点心意,饮茶。”——客气,滴水不漏\"},\"identity\":{\"authority\":\"一句话能让下一条船改靠别的码头\",\"resources\":[\"现金和红包\",\"整个季度的船期表\"],\"limits\":[\"船东天天打电话催\",\"在这个港口没有一个真正的朋友\"],\"obligations\":[\"船晚一天开,滞期费就记在她头上\"],\"exposure_risk\":\"账上有一笔滞期费是做出来的\",\"hidden_mismatch\":\"其实想离开船公司,在港口开一间自己的报关行\"},\"situation\":{\"trigger\":\"船东要求船必须赶在台风前开走\",\"pressure\":\"开不走,滞期费和那笔假账会一起被查\",\"deadline\":null,\"exits\":[{\"cost\":\"红包越塞越多,把柄也越来越多\",\"option\":\"塞更多红包让码头连夜赶工\"},{\"cost\":\"丢掉这份工作\",\"option\":\"跟船东说实话\"}]},\"decision\":{\"core_value\":\"事情办成最重要\",\"current_goal\":\"让船准时开走\",\"pressure_responses\":{\"breaking\":\"撕破脸,把所有人的红包账都翻出来\",\"high\":\"找更上面的人打电话\",\"low\":\"笑着塞一个红包\",\"mid\":\"搬出船东,拿滞期费压人\"},\"withdrawal\":\"回到船上的办公室,只让船员传话\",\"relationship_stance\":\"谁有用就对谁客气\",\"contrast\":\"出手大方,自己却舍不得吃一份叉烧饭\",\"prefers\":[\"用钱把事情摆平\"],\"avoids\":[\"留下字据\"],\"never\":[\"让船东知道她自己的打算\"]},\"intimacy\":{\"desire_level\":3,\"attraction_sources\":[\"对方不收她的红包\",\"对方看得出她的客气是装的\"],\"likes\":[\"不谈生意的时候\",\"从海上吹来的风\"],\"dislikes\":[\"被人算计\"],\"preconditions\":[\"确定对方要的不是她的钱\"],\"boundaries\":[\"不在船上\"],\"expression\":\"请客,然后自己一口不吃\",\"self_control\":4,\"desired_position\":\"被当成同伴,而不是出钱的人\"},\"to_player\":{\"trust\":0,\"tension\":2,\"stage\":\"陌生\"}}],\"background\":[{\"id\":\"bg_gate_guard\",\"name\":\"甘永光\",\"role\":\"闸口门卫\",\"line\":\"查验车一进闸口,甘永光就在公共频道喊“大车进场”\",\"location_id\":\"container_yard\"},{\"id\":\"bg_old_lasher\",\"name\":\"叶嘉俊\",\"role\":\"老绑扎工\",\"line\":\"叶嘉俊什么都看见了,但只在茶餐厅里说\",\"location_id\":\"berth_7\"},{\"id\":\"bg_old_tallyman\",\"name\":\"吴雨澄\",\"role\":\"返聘的老理货员\",\"line\":\"吴雨澄认得每一种铅封,肯教人,但只教一遍\",\"location_id\":\"control_tower\"},{\"id\":\"bg_patrol\",\"name\":\"冯家宁\",\"role\":\"巡场保安\",\"line\":\"冯家宁骑着一辆没有铃的单车,总在最不该出现的时候出现\",\"location_id\":\"container_yard\"},{\"id\":\"bg_ship_cook\",\"name\":\"卢佩珊\",\"role\":\"外轮厨师\",\"line\":\"卢佩珊会用三种语言骂人,船上的事问她最快\",\"location_id\":\"berth_7\"},{\"id\":\"bg_sign_clerk\",\"name\":\"莫志强\",\"role\":\"控制塔统计员\",\"line\":\"签到簿在莫志强手里,谁几点来、几点走,他都记着\",\"location_id\":\"control_tower\"},{\"id\":\"bg_teahouse_boss\",\"name\":\"谭咏诗\",\"role\":\"茶餐厅老板娘\",\"line\":\"谭咏诗记得每个人要几分糖,也记得每个人上个月赊了多少\",\"location_id\":\"teahouse\"}],\"relationships\":[{\"from\":\"player\",\"to\":\"shift_lead\",\"trust\":1,\"tension\":1,\"stage\":\"熟络\",\"recent\":[\"梁嘉欣是你在码头认识最久的人\"]},{\"from\":\"player\",\"to\":\"ship_agent_rep\",\"trust\":0,\"tension\":1,\"stage\":\"陌生\",\"recent\":[\"潘宝珠递过一次名片给你,你没接\"]},{\"from\":\"shift_lead\",\"to\":\"player\",\"trust\":1,\"tension\":0,\"stage\":\"熟络\",\"recent\":[\"梁嘉欣是你在码头认识最久的人\"]},{\"from\":\"shift_lead\",\"to\":\"ship_agent_rep\",\"trust\":1,\"tension\":1,\"stage\":\"认识\",\"recent\":[\"两个人一起喝过酒,喝完谁也不信谁\"]},{\"from\":\"ship_agent_rep\",\"to\":\"player\",\"trust\":0,\"tension\":2,\"stage\":\"陌生\",\"recent\":[\"潘宝珠递过一次名片给你,你没接\",\"郭少青当面避开红包,拖延装船放行\"]},{\"from\":\"ship_agent_rep\",\"to\":\"shift_lead\",\"trust\":0,\"tension\":2,\"stage\":\"认识\",\"recent\":[\"两个人一起喝过酒,喝完谁也不信谁\"]}],\"player_facts\":[{\"id\":\"f11\",\"text\":\"梁嘉欣同意以索具例检为由将超重箱往后推迟吊装,但明确表示单据签字概不负责\",\"visibility\":\"private\"},{\"id\":\"f7\",\"text\":\"三个人今晚都在等同一条船装完\",\"visibility\":\"public\"},{\"id\":\"f8\",\"text\":\"都知道第三排最底下那个柜子有问题,却谁也没有说破\",\"visibility\":\"public\"},{\"id\":\"f9\",\"text\":\"一方是另一方入行时的师傅,教过的东西都还记着\",\"visibility\":\"public\"},{\"id\":\"f10\",\"text\":\"磅房报上来一个柜子比单据重了四吨,放行单上等着你表态\",\"visibility\":\"public\"},{\"id\":\"f5\",\"text\":\"郭少青:坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。\",\"visibility\":\"private\"},{\"id\":\"f6\",\"text\":\"郭少青:上个月替人把一个柜子的吊装顺序往后挪了两晚\",\"visibility\":\"private\"}],\"events\":[{\"id\":\"e1\",\"kind\":\"deadline\",\"title\":\"超重的柜子·眼前\",\"in_minutes\":9,\"due_label\":\"第一天 23:45\",\"involves_player\":true},{\"id\":\"e2\",\"kind\":\"deadline\",\"title\":\"超重的柜子·近期\",\"in_minutes\":324,\"due_label\":\"第二天 05:00\",\"involves_player\":true},{\"id\":\"e3\",\"kind\":\"foreshadow\",\"title\":\"超重的柜子·伏笔\",\"in_minutes\":7194,\"due_label\":\"第六天 23:30\",\"involves_player\":true}],\"leverage_all\":[],\"pressure\":{\"id\":\"p_overweight\",\"title\":\"超重的柜子\",\"source\":\"person\",\"trigger\":\"磅房报上来一个柜子比单据重了四吨,放行单上等着你表态\",\"objective\":\"在装船之前弄清楚多出来的四吨是什么\",\"choice\":\"放行,还是拦下来得罪船公司\",\"exits\":[{\"cost\":\"出了事就是放行的人担\",\"option\":\"放行\"},{\"cost\":\"船公司的红包以后再没有你的份\",\"option\":\"拦下来开柜\"}],\"location_modifier\":\"超重的柜子要拖去磅房,一定会经过保安的巡逻线。\"},\"chapters\":[],\"tags\":[\"romance_light\",\"intimate\",\"explicit\",\"violence\",\"coercion_theme\",\"humiliation\",\"bodily_harm\",\"substance\",\"pregnancy\",\"death\",\"workplace_power\",\"infidelity\",\"crime\",\"gambling\",\"workplace\",\"nightlife\",\"supernatural\",\"disaster\",\"custom\"],\"name_pool\":{\"family_unused\":[\"陈\",\"何\",\"麦\",\"黄\",\"罗\",\"邓\",\"钟\",\"区\"],\"given_female\":[\"秀琴\",\"嘉欣\",\"美玲\",\"丽珊\",\"咏诗\",\"慧敏\",\"婉仪\",\"淑贞\",\"少芬\",\"翠屏\",\"玉莲\",\"凤仪\"],\"given_male\":[\"志强\",\"国栋\",\"家豪\",\"伟明\",\"振华\",\"锦荣\",\"耀祖\",\"建辉\",\"德胜\",\"灿明\",\"汉生\",\"嘉俊\"],\"given_neutral\":[\"子晴\",\"海宁\",\"思远\",\"家宁\",\"天恩\",\"晓岚\",\"雨澄\",\"文乐\"]}},\"next_request_id\":\"r_67f63cecf04c\",\"replayed\":false},\"error\":null}", "status": "completed" } ], "runtime_calls": [ { "ts": "2026-09-29T02:26:16", "ms": 36.1, "pid": 11964, "skill_root": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension", "argv": [ "commit-turn", "--json", "--input-file", "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.host\\tmp\\opencode\\commit_turn_4.json" ], "input": { "session_id": "s_1e9840a4", "request_id": "r_9ab39238b68b", "expected_revision": 4, "action_mode": "attempt", "player_input": "我想让对方答应替我分担一部分,看对方肯不肯", "player_authorized": false, "acts_on": [ "shift_lead" ], "operations": [ { "op": "npc_response", "npc_id": "shift_lead", "response": "partial", "note": "梁嘉欣答应以索具例检为由压后两轮吊装,但拒绝在放行单上签字担责", "basis_fact_ids": [ "f8", "f9", "f10" ] }, { "op": "add_fact", "key": "shift_lead.delay_hoisting", "text": "梁嘉欣同意以索具例检为由将超重箱往后推迟吊装,但明确表示单据签字概不负责", "visibility": "private", "origin": "observed", "known_by": [ "player", "shift_lead" ] }, { "op": "advance_time", "minutes": 2 } ], "content_tags": [ "workplace" ], "summary": "郭少青探问梁嘉欣能否分担压力,梁嘉欣答应操作上拖延两轮吊机,但坚决不在单据上担责。", "open_action": "梁嘉欣在集装箱阴影里等待郭少青决定,潘宝珠在外侧盯着动静。", "quotes": [ "“我只能帮你拖两轮吊机,字我绝对不签。”" ] }, "exit": 0, "envelope": { "ok": true, "data": { "revision": 5, "turn": 5, "applied": [ { "op": "npc_response", "npc_id": "shift_lead", "response": "partial" }, { "op": "add_fact", "fact_id": "f11", "key": "shift_lead.delay_hoisting", "origin": "observed", "known_by": [ "player", "shift_lead" ] }, { "op": "advance_time", "minutes": 2, "default": false, "clock": { "day": 1, "minute": 1416 }, "label": "第一天 23:36", "new_scene": false } ], "resolved_events": [], "simulation": null, "clock": { "day": 1, "minute": 1416, "label": "第一天 23:36" }, "default_time_advance": false, "context": { "depth": "full", "session_id": "s_1e9840a4", "revision": 5, "turn": 5, "mode": "pressure", "clock": { "day": 1, "minute": 1416, "label": "第一天 23:36" }, "scene": { "id": "sc1", "location_id": "container_yard", "location": "堆场通道", "privacy": "semi", "present": [ "player", "ship_agent_rep", "shift_lead" ] }, "player": { "name": "郭少青", "title": "阿青", "age": 38, "gender": "male", "role": "夜班调度", "social_position": "equal", "baseline": "坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。", "resources": [ "排吊装顺序的权力", "能切到任何一个频道" ], "reputation": "做事公道,但谁都不敢得罪", "risks": [ "上个月替人把一个柜子的吊装顺序往后挪了两晚" ], "background": [] }, "present_npcs": [ { "id": "ship_agent_rep", "name": "潘宝珠", "age": 46, "gender": "female", "tier": "major", "role": "船公司驻港代表", "mood": null, "voice": "surface", "can_act": true, "trust_to_player": 0, "tension": 2, "stage": "陌生", "goal": "让船准时开走", "stance": "谁有用就对谁客气" }, { "id": "shift_lead", "name": "梁嘉欣", "age": 49, "gender": "female", "tier": "major", "role": "夜班装卸班组长", "mood": null, "voice": "surface", "can_act": true, "trust_to_player": 1, "tension": 0, "stage": "熟络", "goal": "给自己找一个接班人", "stance": "先把你当自己人,一旦发现你两头说话就翻脸" } ], "nearby": [ { "id": "bg_gate_guard", "name": "甘永光", "role": "闸口门卫" }, { "id": "bg_patrol", "name": "冯家宁", "role": "巡场保安" } ], "due_soon": [ { "id": "e1", "kind": "deadline", "title": "超重的柜子·眼前", "in_minutes": 9, "due_label": "第一天 23:45", "involves_player": true }, { "id": "e2", "kind": "deadline", "title": "超重的柜子·近期", "in_minutes": 324, "due_label": "第二天 05:00", "involves_player": true }, { "id": "e3", "kind": "foreshadow", "title": "超重的柜子·伏笔", "in_minutes": 7194, "due_label": "第六天 23:30", "involves_player": true } ], "known_facts": [ { "id": "f11", "text": "梁嘉欣同意以索具例检为由将超重箱往后推迟吊装,但明确表示单据签字概不负责", "visibility": "private" }, { "id": "f7", "text": "三个人今晚都在等同一条船装完", "visibility": "public" }, { "id": "f8", "text": "都知道第三排最底下那个柜子有问题,却谁也没有说破", "visibility": "public" }, { "id": "f9", "text": "一方是另一方入行时的师傅,教过的东西都还记着", "visibility": "public" }, { "id": "f10", "text": "磅房报上来一个柜子比单据重了四吨,放行单上等着你表态", "visibility": "public" }, { "id": "f5", "text": "郭少青:坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。", "visibility": "private" }, { "id": "f6", "text": "郭少青:上个月替人把一个柜子的吊装顺序往后挪了两晚", "visibility": "private" } ], "recent": [ "郭少青未收红包,抽身退开,准备寻找能解决超重危机的帮手。", "梁嘉欣上前打破对峙提醒时间紧迫,潘宝珠因船期受阻面色发紧。", "郭少青探问梁嘉欣能否分担压力,梁嘉欣答应操作上拖延两轮吊机,但坚决不在单据上担责。" ], "last_quotes": [ "“我只能帮你拖两轮吊机,字我绝对不签。”" ], "open_action": "梁嘉欣在集装箱阴影里等待郭少青决定,潘宝珠在外侧盯着动静。", "scene_responses": [ { "npc_id": "shift_lead", "response": "partial" } ], "safety": { "paused": false, "boundaries": [], "leverage": [] }, "preferences": { "inner_view": false, "assistant": false, "offscreen_simulation": true, "person": "second" }, "save": { "current_slot": null, "turns_since_save": 4 }, "requests": { "chapter_summary": false, "prologue": false, "twist_offer": null, "offscreen_beat_candidates": [] }, "size_bytes": 17273, "world": { "title": "港口夜班", "era": "1990 年代末(1998 年)", "region": "南方沿海港城的集装箱码头", "premise": "集装箱码头的夜班从晚八点到早八点,灯一直亮到天明,人很少,交接班的十分钟里什么都可能发生。", "tone": [ "潮湿", "疲惫", "克制的热" ], "style_hint": "短句,多写声音、气味与灯光,少写心理独白;粤语词点到即止。", "rules": [ "夜班 20:00 上岗、次日 8:00 下班,凌晨两点所有人到控制塔签到交接;签到簿谁都能翻,缺签要写说明交给主任。", "对讲机公共频道所有当班的人都听得见,谁说了什么第二天全码头都知道;私事只能切到六频道,可调度偶尔会抽查。", "箱号、铅封号、重量三样对不上的柜,要当班理货员在理货单上签字才能放行——签了字,出了事就是签字人的。", "海关查验不提前打招呼,查验车进闸口时门卫会在公共频道喊一声“大车进场”,从闸口开到泊位要二十分钟。", "船公司的人逢年过节、赶船期都塞红包;收不收、收多少,班组里人人心里有数,只是没人写在纸上。", "台风警报升到最高一级,码头全面停工,吊机锁死,所有人撤进塔楼一楼,风停之前谁也不许出去。" ], "customs": [ "收工后去闸口外的茶餐厅吃一碗云吞面,是班组默认的散伙仪式;谁请客轮着来,轮到的人装不知道会被记很久。", "红包要当着人面推两次再收;推一次就收显得贪,推第三次就是不给面子。", "新来的人第一个夜班要请全班组喝一次糖水,叫“开工糖水”,糖水钱不能找人分摊。", "交班时要把保温壶灌满开水留给下一班;空壶留给别人,一个月都会有人阴阳怪气。", "塔吊司机上塔前在梯子第一级拍三下,说是跟吊臂打招呼;谁替别人拍了,就是认了交情。" ] }, "locations": [ { "id": "berth_7", "name": "七号泊位", "privacy": "public", "detail": "吊臂的影子一格一格扫过地面,海水拍着缆桩,空气里是柴油和铁锈的味道。", "affordances": [ "躲进两排集装箱的夹缝", "借吊机的轰鸣说悄悄话", "爬上跨运车的驾驶室避雨" ], "exits": [ "control_tower", "container_yard", "tool_shed" ] }, { "id": "control_tower", "name": "控制塔", "privacy": "semi", "detail": "三楼调度室一整面玻璃对着泊位,签到簿压在对讲机旁边,吊扇吱呀作响。", "affordances": [ "翻看签到簿", "切换对讲机频道", "在楼梯拐角说话没人看见" ], "exits": [ "berth_7", "rest_room" ] }, { "id": "rest_room", "name": "休息室", "privacy": "semi", "detail": "塔楼一楼的休息室,一台旧风扇、一张折叠床、一台只收得到两个台的电视。", "affordances": [ "轮流在折叠床上眯一会儿", "用电热水壶煮公仔面", "关了灯看窗外的船灯" ], "exits": [ "control_tower", "clinic" ] }, { "id": "clinic", "name": "医务室", "privacy": "semi", "detail": "塔楼一楼尽头的医务室,一张铁床、一个上锁的药柜,日光灯管发出细细的嗡声。", "affordances": [ "处理伤口", "开一张病假条", "在铁床边坐一会儿" ], "exits": [ "rest_room" ] }, { "id": "tool_shed", "name": "工具房", "privacy": "private", "detail": "堆满缆绳和生锈的卸扣,铁皮门从外面挂锁,下雨时整间屋子像鼓一样响。", "affordances": [ "躲雨", "把东西藏进缆绳堆", "关上门说话" ], "exits": [ "berth_7" ] }, { "id": "container_yard", "name": "堆场通道", "privacy": "semi", "detail": "集装箱码成五层高的窄巷,灯照不到中间,偶尔能听见某个箱子里有东西在响。", "affordances": [ "借箱子挡住视线", "抄近路去闸口", "贴着箱壁听里面的动静" ], "exits": [ "berth_7", "teahouse" ] }, { "id": "teahouse", "name": "闸口外的茶餐厅", "privacy": "public", "detail": "凌晨三点还亮着灯,墙上的电视开着没声音,老板娘记得每个夜班的人要几分糖。", "affordances": [ "抢最后一份叉烧", "在卡座里压低声音谈事", "借柜台上的电话打出去" ], "exits": [ "container_yard", "dorm_rooftop" ] }, { "id": "dorm_rooftop", "name": "宿舍楼天台", "privacy": "private", "detail": "员工宿舍六楼的天台,晾着一排工服,能看见整个港口的灯一盏盏亮着。", "affordances": [ "一起抽一支烟", "看台风前的云", "躲开所有人" ], "exits": [ "teahouse" ] } ], "characters": [ { "id": "shift_lead", "name": "梁嘉欣", "call": "梁姐", "age": 49, "gender": "female", "tier": "major", "role": "夜班装卸班组长", "adult_context": "在码头干了十五年的装卸班组长,正式在编", "location_id": "container_yard", "present": true, "can_act": true, "voice": "surface", "appearance": "左手缺了半截小指,夹烟的姿势很特别", "voices": { "inner": "“我也会累的,你知不知道。”", "surface": "“都给我动起来!七号那边还差三个柜!”——嗓门大,带着笑" }, "identity": { "authority": "决定谁上哪台机、谁今晚去扛最累的活", "resources": [ "全班组的人情", "和船公司的人喝过酒" ], "limits": [ "上面刚换了领导,谁都在看她", "腰伤,不能久站" ], "obligations": [ "两个孩子的学费" ], "exposure_risk": "班组的加班费里有两个名字是空挂的", "hidden_mismatch": "早就想把班组长的位置让出去,只是找不到能接的人" }, "situation": { "trigger": "新来的主任要查加班费的名单", "pressure": "名单一查,空挂的两个名字就藏不住", "deadline": null, "exits": [ { "cost": "两个老伙计这个月的补贴就没了", "option": "自己先去把名字销掉" }, { "cost": "要欠一个大人情,还可能被人拿住", "option": "找人把名单换一份" } ] }, "decision": { "core_value": "护住自己的人", "current_goal": "给自己找一个接班人", "pressure_responses": { "breaking": "把所有事揽到自己身上", "high": "当众拍桌子,逼别人先让步", "low": "大声说笑,把话题岔开", "mid": "私下找人喝一杯,把事情谈了" }, "withdrawal": "一个人蹲在缆桩上抽烟,谁叫都不应", "relationship_stance": "先把你当自己人,一旦发现你两头说话就翻脸", "contrast": "看着粗,账却算得比谁都细", "prefers": [ "当面把话说清楚" ], "avoids": [ "写在纸上的承诺" ], "never": [ "把自己班组的人交出去" ] }, "intimacy": { "desire_level": 2, "attraction_sources": [ "对方敢在她发火的时候顶回来", "对方替班组里的人说过话" ], "likes": [ "热闹散了之后的安静", "难得被人照顾一次" ], "dislikes": [ "被人可怜" ], "preconditions": [ "不在班组的人面前" ], "boundaries": [ "不碰自己手下的人" ], "expression": "半开玩笑地说真话", "self_control": 4, "desired_position": "先照顾人,再被人照顾" }, "to_player": { "trust": 1, "tension": 0, "stage": "熟络" } }, { "id": "ship_agent_rep", "name": "潘宝珠", "call": "老潘", "age": 46, "gender": "female", "tier": "major", "role": "船公司驻港代表", "adult_context": "船公司派驻港口的代表,正式雇员", "location_id": "container_yard", "present": true, "can_act": true, "voice": "surface", "appearance": "手腕上戴一块很旧的表,说是父亲留下的", "voices": { "inner": "“我这些年,连一个能说实话的人都没有。”", "surface": "“辛苦辛苦,一点心意,饮茶。”——客气,滴水不漏" }, "identity": { "authority": "一句话能让下一条船改靠别的码头", "resources": [ "现金和红包", "整个季度的船期表" ], "limits": [ "船东天天打电话催", "在这个港口没有一个真正的朋友" ], "obligations": [ "船晚一天开,滞期费就记在她头上" ], "exposure_risk": "账上有一笔滞期费是做出来的", "hidden_mismatch": "其实想离开船公司,在港口开一间自己的报关行" }, "situation": { "trigger": "船东要求船必须赶在台风前开走", "pressure": "开不走,滞期费和那笔假账会一起被查", "deadline": null, "exits": [ { "cost": "红包越塞越多,把柄也越来越多", "option": "塞更多红包让码头连夜赶工" }, { "cost": "丢掉这份工作", "option": "跟船东说实话" } ] }, "decision": { "core_value": "事情办成最重要", "current_goal": "让船准时开走", "pressure_responses": { "breaking": "撕破脸,把所有人的红包账都翻出来", "high": "找更上面的人打电话", "low": "笑着塞一个红包", "mid": "搬出船东,拿滞期费压人" }, "withdrawal": "回到船上的办公室,只让船员传话", "relationship_stance": "谁有用就对谁客气", "contrast": "出手大方,自己却舍不得吃一份叉烧饭", "prefers": [ "用钱把事情摆平" ], "avoids": [ "留下字据" ], "never": [ "让船东知道她自己的打算" ] }, "intimacy": { "desire_level": 3, "attraction_sources": [ "对方不收她的红包", "对方看得出她的客气是装的" ], "likes": [ "不谈生意的时候", "从海上吹来的风" ], "dislikes": [ "被人算计" ], "preconditions": [ "确定对方要的不是她的钱" ], "boundaries": [ "不在船上" ], "expression": "请客,然后自己一口不吃", "self_control": 4, "desired_position": "被当成同伴,而不是出钱的人" }, "to_player": { "trust": 0, "tension": 2, "stage": "陌生" } } ], "background": [ { "id": "bg_gate_guard", "name": "甘永光", "role": "闸口门卫", "line": "查验车一进闸口,甘永光就在公共频道喊“大车进场”", "location_id": "container_yard" }, { "id": "bg_old_lasher", "name": "叶嘉俊", "role": "老绑扎工", "line": "叶嘉俊什么都看见了,但只在茶餐厅里说", "location_id": "berth_7" }, { "id": "bg_old_tallyman", "name": "吴雨澄", "role": "返聘的老理货员", "line": "吴雨澄认得每一种铅封,肯教人,但只教一遍", "location_id": "control_tower" }, { "id": "bg_patrol", "name": "冯家宁", "role": "巡场保安", "line": "冯家宁骑着一辆没有铃的单车,总在最不该出现的时候出现", "location_id": "container_yard" }, { "id": "bg_ship_cook", "name": "卢佩珊", "role": "外轮厨师", "line": "卢佩珊会用三种语言骂人,船上的事问她最快", "location_id": "berth_7" }, { "id": "bg_sign_clerk", "name": "莫志强", "role": "控制塔统计员", "line": "签到簿在莫志强手里,谁几点来、几点走,他都记着", "location_id": "control_tower" }, { "id": "bg_teahouse_boss", "name": "谭咏诗", "role": "茶餐厅老板娘", "line": "谭咏诗记得每个人要几分糖,也记得每个人上个月赊了多少", "location_id": "teahouse" } ], "relationships": [ { "from": "player", "to": "shift_lead", "trust": 1, "tension": 1, "stage": "熟络", "recent": [ "梁嘉欣是你在码头认识最久的人" ] }, { "from": "player", "to": "ship_agent_rep", "trust": 0, "tension": 1, "stage": "陌生", "recent": [ "潘宝珠递过一次名片给你,你没接" ] }, { "from": "shift_lead", "to": "player", "trust": 1, "tension": 0, "stage": "熟络", "recent": [ "梁嘉欣是你在码头认识最久的人" ] }, { "from": "shift_lead", "to": "ship_agent_rep", "trust": 1, "tension": 1, "stage": "认识", "recent": [ "两个人一起喝过酒,喝完谁也不信谁" ] }, { "from": "ship_agent_rep", "to": "player", "trust": 0, "tension": 2, "stage": "陌生", "recent": [ "潘宝珠递过一次名片给你,你没接", "郭少青当面避开红包,拖延装船放行" ] }, { "from": "ship_agent_rep", "to": "shift_lead", "trust": 0, "tension": 2, "stage": "认识", "recent": [ "两个人一起喝过酒,喝完谁也不信谁" ] } ], "player_facts": [ { "id": "f11", "text": "梁嘉欣同意以索具例检为由将超重箱往后推迟吊装,但明确表示单据签字概不负责", "visibility": "private" }, { "id": "f7", "text": "三个人今晚都在等同一条船装完", "visibility": "public" }, { "id": "f8", "text": "都知道第三排最底下那个柜子有问题,却谁也没有说破", "visibility": "public" }, { "id": "f9", "text": "一方是另一方入行时的师傅,教过的东西都还记着", "visibility": "public" }, { "id": "f10", "text": "磅房报上来一个柜子比单据重了四吨,放行单上等着你表态", "visibility": "public" }, { "id": "f5", "text": "郭少青:坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。", "visibility": "private" }, { "id": "f6", "text": "郭少青:上个月替人把一个柜子的吊装顺序往后挪了两晚", "visibility": "private" } ], "events": [ { "id": "e1", "kind": "deadline", "title": "超重的柜子·眼前", "in_minutes": 9, "due_label": "第一天 23:45", "involves_player": true }, { "id": "e2", "kind": "deadline", "title": "超重的柜子·近期", "in_minutes": 324, "due_label": "第二天 05:00", "involves_player": true }, { "id": "e3", "kind": "foreshadow", "title": "超重的柜子·伏笔", "in_minutes": 7194, "due_label": "第六天 23:30", "involves_player": true } ], "leverage_all": [], "pressure": { "id": "p_overweight", "title": "超重的柜子", "source": "person", "trigger": "磅房报上来一个柜子比单据重了四吨,放行单上等着你表态", "objective": "在装船之前弄清楚多出来的四吨是什么", "choice": "放行,还是拦下来得罪船公司", "exits": [ { "cost": "出了事就是放行的人担", "option": "放行" }, { "cost": "船公司的红包以后再没有你的份", "option": "拦下来开柜" } ], "location_modifier": "超重的柜子要拖去磅房,一定会经过保安的巡逻线。" }, "chapters": [], "tags": [ "romance_light", "intimate", "explicit", "violence", "coercion_theme", "humiliation", "bodily_harm", "substance", "pregnancy", "death", "workplace_power", "infidelity", "crime", "gambling", "workplace", "nightlife", "supernatural", "disaster", "custom" ], "name_pool": { "family_unused": [ "陈", "何", "麦", "黄", "罗", "邓", "钟", "区" ], "given_female": [ "秀琴", "嘉欣", "美玲", "丽珊", "咏诗", "慧敏", "婉仪", "淑贞", "少芬", "翠屏", "玉莲", "凤仪" ], "given_male": [ "志强", "国栋", "家豪", "伟明", "振华", "锦荣", "耀祖", "建辉", "德胜", "灿明", "汉生", "嘉俊" ], "given_neutral": [ "子晴", "海宁", "思远", "家宁", "天恩", "晓岚", "雨澄", "文乐" ] } }, "next_request_id": "r_67f63cecf04c", "replayed": false }, "error": null } } ], "calls_source": "trace", "text": "两排集装箱夹出的深隙里黑得见不到底,湿热的海风灌进来,发出像抽风机一样的啸音。你侧身避开潘宝珠的视线,把梁嘉欣拉进铁壁的阴影里,压着嗓子把想让她搭一把手、分担这道坎的意思递了过去。\n\n梁嘉欣靠在冰冷发硬的波纹铁皮上,借着外头透进来的微弱反光打量着你。她残缺的左手在粗布工裤上蹭了蹭,眼神沉得像浸了海水:\n\n“阿青,当年你刚进调度室,台账还是我教你对的。你想让我帮你扛,行,但话得摆在明处。”\n\n她抬手一把按住对讲机通话键的防误触盖,语速极快,声音压得极低:“我可以用班组长的名义,在频道里喊一次吊具钢丝绳例检,硬把七号机停下来,替你把这个柜子往后压两轮吊装——顶多给你匀出二十分钟。”\n\n她顿了顿,目光钉在你的脸上,语气没有半点商量的余地:“但放行单是你们调度和理货的事。那个超重四吨的单子,字我绝对不签,出了事我也绝不会替你顶。能给你的,就这两轮机的时间。”\n\n【“我只能帮你拖两轮吊机,字我绝对不签。”】\n\n集装箱夹缝外,潘宝珠的高跟鞋跟在碎石路面上轻轻碾了一下,人影就映在狭窄的风口处,冷冷地盯着里面。\n\n梁嘉欣的手指悬在对讲机侧键上,等着你最后点头。\n\n【时间】第一天 23:36|【地点】堆场通道|回合:5", "seconds": 30.4, "model": "local-proxy/gemini-3.8-flash-high" }, { "index": 6, "conversation": "A", "input": "我不说话,看对方怎么做", "expect": { "kind": "turn", "calls_max": 1 }, "host_calls": [ { "tool": "write", "input": { "filePath": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.host\\tmp\\opencode\\commit_turn_5.json", "content": "{\n \"session_id\": \"s_1e9840a4\",\n \"request_id\": \"r_67f63cecf04c\",\n \"expected_revision\": 5,\n \"action_mode\": \"wait\",\n \"player_input\": \"我不说话,看对方怎么做\",\n \"player_authorized\": false,\n \"acts_on\": null,\n \"operations\": [\n {\n \"op\": \"npc_action\",\n \"npc_id\": \"shift_lead\",\n \"action\": \"梁嘉欣见郭少青不说话,咬牙按下对讲机向七号机通报索具例检,强行将超重柜延后两轮\",\n \"significant\": false,\n \"kind\": \"other\",\n \"target_id\": \"player\",\n \"basis_fact_ids\": [\n \"f8\",\n \"f10\",\n \"f11\"\n ]\n },\n {\n \"op\": \"add_fact\",\n \"key\": \"shift_lead.called_inspection\",\n \"text\": \"梁嘉欣在公共频道通报七号机索具例检暂停吊装,为现场争取了二十分钟缓冲\",\n \"visibility\": \"public\",\n \"origin\": \"observed\"\n },\n {\n \"op\": \"relationship\",\n \"from\": \"ship_agent_rep\",\n \"to\": \"shift_lead\",\n \"tension_delta\": 1,\n \"reason\": \"梁嘉欣当众在对讲机里叫停七号机,拖延船期\"\n },\n {\n \"op\": \"advance_time\",\n \"minutes\": 2\n }\n ],\n \"content_tags\": [\n \"workplace\"\n ],\n \"summary\": \"郭少青静默不语,梁嘉欣果断按下对讲机通报索具例检延后吊装,潘宝珠在通道外脸色铁青。\",\n \"open_action\": \"对讲机里传来桥吊司机的应答,梁嘉欣松开通话键,转头盯住郭少青。\",\n \"quotes\": [\n \"“七号机,先停一下,吊具钢丝绳例检!”\"\n ]\n}\n" }, "output": "Wrote file successfully.", "status": "completed" }, { "tool": "bash", "input": { "command": "python \"D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\scripts\\adult_tension.py\" commit-turn --json --input-file \"D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.host\\tmp\\opencode\\commit_turn_5.json\"" }, "output": "{\"ok\":true,\"data\":{\"revision\":6,\"turn\":6,\"applied\":[{\"op\":\"npc_action\",\"npc_id\":\"shift_lead\",\"significant\":false,\"kind\":\"other\"},{\"op\":\"add_fact\",\"fact_id\":\"f12\",\"key\":\"shift_lead.called_inspection\",\"origin\":\"observed\",\"known_by\":[\"player\",\"ship_agent_rep\",\"shift_lead\"]},{\"op\":\"relationship\",\"from\":\"ship_agent_rep\",\"to\":\"shift_lead\",\"trust\":0,\"tension\":3,\"stage\":\"acquainted\"},{\"op\":\"advance_time\",\"minutes\":2,\"default\":false,\"clock\":{\"day\":1,\"minute\":1418},\"label\":\"第一天 23:38\",\"new_scene\":false}],\"resolved_events\":[],\"simulation\":null,\"clock\":{\"day\":1,\"minute\":1418,\"label\":\"第一天 23:38\"},\"default_time_advance\":false,\"context\":{\"depth\":\"brief\",\"session_id\":\"s_1e9840a4\",\"revision\":6,\"turn\":6,\"mode\":\"pressure\",\"clock\":{\"day\":1,\"minute\":1418,\"label\":\"第一天 23:38\"},\"scene\":{\"id\":\"sc1\",\"location_id\":\"container_yard\",\"location\":\"堆场通道\",\"privacy\":\"semi\",\"present\":[\"player\",\"ship_agent_rep\",\"shift_lead\"]},\"player\":{\"name\":\"郭少青\",\"title\":\"阿青\",\"age\":38,\"gender\":\"male\",\"role\":\"夜班调度\"},\"present_npcs\":[{\"id\":\"ship_agent_rep\",\"name\":\"潘宝珠\",\"age\":46,\"gender\":\"female\",\"tier\":\"major\",\"role\":\"船公司驻港代表\",\"mood\":null,\"voice\":\"surface\",\"can_act\":true,\"trust_to_player\":0,\"tension\":2,\"stage\":\"陌生\",\"goal\":\"让船准时开走\",\"stance\":\"谁有用就对谁客气\"},{\"id\":\"shift_lead\",\"name\":\"梁嘉欣\",\"age\":49,\"gender\":\"female\",\"tier\":\"major\",\"role\":\"夜班装卸班组长\",\"mood\":null,\"voice\":\"surface\",\"can_act\":true,\"trust_to_player\":1,\"tension\":0,\"stage\":\"熟络\",\"goal\":\"给自己找一个接班人\",\"stance\":\"先把你当自己人,一旦发现你两头说话就翻脸\"}],\"nearby\":[{\"id\":\"bg_gate_guard\",\"name\":\"甘永光\",\"role\":\"闸口门卫\"},{\"id\":\"bg_patrol\",\"name\":\"冯家宁\",\"role\":\"巡场保安\"}],\"due_soon\":[{\"id\":\"e1\",\"kind\":\"deadline\",\"title\":\"超重的柜子·眼前\",\"in_minutes\":7,\"due_label\":\"第一天 23:45\",\"involves_player\":true},{\"id\":\"e2\",\"kind\":\"deadline\",\"title\":\"超重的柜子·近期\",\"in_minutes\":322,\"due_label\":\"第二天 05:00\",\"involves_player\":true},{\"id\":\"e3\",\"kind\":\"foreshadow\",\"title\":\"超重的柜子·伏笔\",\"in_minutes\":7192,\"due_label\":\"第六天 23:30\",\"involves_player\":true}],\"known_facts\":[{\"id\":\"f12\",\"text\":\"梁嘉欣在公共频道通报七号机索具例检暂停吊装,为现场争取了二十分钟缓冲\",\"visibility\":\"public\"},{\"id\":\"f11\",\"text\":\"梁嘉欣同意以索具例检为由将超重箱往后推迟吊装,但明确表示单据签字概不负责\",\"visibility\":\"private\"},{\"id\":\"f7\",\"text\":\"三个人今晚都在等同一条船装完\",\"visibility\":\"public\"},{\"id\":\"f8\",\"text\":\"都知道第三排最底下那个柜子有问题,却谁也没有说破\",\"visibility\":\"public\"},{\"id\":\"f9\",\"text\":\"一方是另一方入行时的师傅,教过的东西都还记着\",\"visibility\":\"public\"},{\"id\":\"f10\",\"text\":\"磅房报上来一个柜子比单据重了四吨,放行单上等着你表态\",\"visibility\":\"public\"},{\"id\":\"f5\",\"text\":\"郭少青:坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。\",\"visibility\":\"private\"},{\"id\":\"f6\",\"text\":\"郭少青:上个月替人把一个柜子的吊装顺序往后挪了两晚\",\"visibility\":\"private\"}],\"recent\":[\"梁嘉欣上前打破对峙提醒时间紧迫,潘宝珠因船期受阻面色发紧。\",\"郭少青探问梁嘉欣能否分担压力,梁嘉欣答应操作上拖延两轮吊机,但坚决不在单据上担责。\",\"郭少青静默不语,梁嘉欣果断按下对讲机通报索具例检延后吊装,潘宝珠在通道外脸色铁青。\"],\"last_quotes\":[\"“七号机,先停一下,吊具钢丝绳例检!”\"],\"open_action\":\"对讲机里传来桥吊司机的应答,梁嘉欣松开通话键,转头盯住郭少青。\",\"scene_responses\":[{\"npc_id\":\"shift_lead\",\"response\":\"partial\"}],\"safety\":{\"paused\":false,\"boundaries\":[],\"leverage\":[]},\"preferences\":{\"inner_view\":false,\"assistant\":false,\"offscreen_simulation\":true,\"person\":\"second\"},\"save\":{\"current_slot\":null,\"turns_since_save\":5},\"requests\":{\"chapter_summary\":false,\"prologue\":false,\"twist_offer\":null,\"offscreen_beat_candidates\":[]},\"size_bytes\":3473},\"next_request_id\":\"r_b7426e1cf3c3\",\"replayed\":false},\"error\":null}", "status": "completed" } ], "runtime_calls": [ { "ts": "2026-09-29T02:26:48", "ms": 36.4, "pid": 35740, "skill_root": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension", "argv": [ "commit-turn", "--json", "--input-file", "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.host\\tmp\\opencode\\commit_turn_5.json" ], "input": { "session_id": "s_1e9840a4", "request_id": "r_67f63cecf04c", "expected_revision": 5, "action_mode": "wait", "player_input": "我不说话,看对方怎么做", "player_authorized": false, "acts_on": null, "operations": [ { "op": "npc_action", "npc_id": "shift_lead", "action": "梁嘉欣见郭少青不说话,咬牙按下对讲机向七号机通报索具例检,强行将超重柜延后两轮", "significant": false, "kind": "other", "target_id": "player", "basis_fact_ids": [ "f8", "f10", "f11" ] }, { "op": "add_fact", "key": "shift_lead.called_inspection", "text": "梁嘉欣在公共频道通报七号机索具例检暂停吊装,为现场争取了二十分钟缓冲", "visibility": "public", "origin": "observed" }, { "op": "relationship", "from": "ship_agent_rep", "to": "shift_lead", "tension_delta": 1, "reason": "梁嘉欣当众在对讲机里叫停七号机,拖延船期" }, { "op": "advance_time", "minutes": 2 } ], "content_tags": [ "workplace" ], "summary": "郭少青静默不语,梁嘉欣果断按下对讲机通报索具例检延后吊装,潘宝珠在通道外脸色铁青。", "open_action": "对讲机里传来桥吊司机的应答,梁嘉欣松开通话键,转头盯住郭少青。", "quotes": [ "“七号机,先停一下,吊具钢丝绳例检!”" ] }, "exit": 0, "envelope": { "ok": true, "data": { "revision": 6, "turn": 6, "applied": [ { "op": "npc_action", "npc_id": "shift_lead", "significant": false, "kind": "other" }, { "op": "add_fact", "fact_id": "f12", "key": "shift_lead.called_inspection", "origin": "observed", "known_by": [ "player", "ship_agent_rep", "shift_lead" ] }, { "op": "relationship", "from": "ship_agent_rep", "to": "shift_lead", "trust": 0, "tension": 3, "stage": "acquainted" }, { "op": "advance_time", "minutes": 2, "default": false, "clock": { "day": 1, "minute": 1418 }, "label": "第一天 23:38", "new_scene": false } ], "resolved_events": [], "simulation": null, "clock": { "day": 1, "minute": 1418, "label": "第一天 23:38" }, "default_time_advance": false, "context": { "depth": "brief", "session_id": "s_1e9840a4", "revision": 6, "turn": 6, "mode": "pressure", "clock": { "day": 1, "minute": 1418, "label": "第一天 23:38" }, "scene": { "id": "sc1", "location_id": "container_yard", "location": "堆场通道", "privacy": "semi", "present": [ "player", "ship_agent_rep", "shift_lead" ] }, "player": { "name": "郭少青", "title": "阿青", "age": 38, "gender": "male", "role": "夜班调度" }, "present_npcs": [ { "id": "ship_agent_rep", "name": "潘宝珠", "age": 46, "gender": "female", "tier": "major", "role": "船公司驻港代表", "mood": null, "voice": "surface", "can_act": true, "trust_to_player": 0, "tension": 2, "stage": "陌生", "goal": "让船准时开走", "stance": "谁有用就对谁客气" }, { "id": "shift_lead", "name": "梁嘉欣", "age": 49, "gender": "female", "tier": "major", "role": "夜班装卸班组长", "mood": null, "voice": "surface", "can_act": true, "trust_to_player": 1, "tension": 0, "stage": "熟络", "goal": "给自己找一个接班人", "stance": "先把你当自己人,一旦发现你两头说话就翻脸" } ], "nearby": [ { "id": "bg_gate_guard", "name": "甘永光", "role": "闸口门卫" }, { "id": "bg_patrol", "name": "冯家宁", "role": "巡场保安" } ], "due_soon": [ { "id": "e1", "kind": "deadline", "title": "超重的柜子·眼前", "in_minutes": 7, "due_label": "第一天 23:45", "involves_player": true }, { "id": "e2", "kind": "deadline", "title": "超重的柜子·近期", "in_minutes": 322, "due_label": "第二天 05:00", "involves_player": true }, { "id": "e3", "kind": "foreshadow", "title": "超重的柜子·伏笔", "in_minutes": 7192, "due_label": "第六天 23:30", "involves_player": true } ], "known_facts": [ { "id": "f12", "text": "梁嘉欣在公共频道通报七号机索具例检暂停吊装,为现场争取了二十分钟缓冲", "visibility": "public" }, { "id": "f11", "text": "梁嘉欣同意以索具例检为由将超重箱往后推迟吊装,但明确表示单据签字概不负责", "visibility": "private" }, { "id": "f7", "text": "三个人今晚都在等同一条船装完", "visibility": "public" }, { "id": "f8", "text": "都知道第三排最底下那个柜子有问题,却谁也没有说破", "visibility": "public" }, { "id": "f9", "text": "一方是另一方入行时的师傅,教过的东西都还记着", "visibility": "public" }, { "id": "f10", "text": "磅房报上来一个柜子比单据重了四吨,放行单上等着你表态", "visibility": "public" }, { "id": "f5", "text": "郭少青:坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。", "visibility": "private" }, { "id": "f6", "text": "郭少青:上个月替人把一个柜子的吊装顺序往后挪了两晚", "visibility": "private" } ], "recent": [ "梁嘉欣上前打破对峙提醒时间紧迫,潘宝珠因船期受阻面色发紧。", "郭少青探问梁嘉欣能否分担压力,梁嘉欣答应操作上拖延两轮吊机,但坚决不在单据上担责。", "郭少青静默不语,梁嘉欣果断按下对讲机通报索具例检延后吊装,潘宝珠在通道外脸色铁青。" ], "last_quotes": [ "“七号机,先停一下,吊具钢丝绳例检!”" ], "open_action": "对讲机里传来桥吊司机的应答,梁嘉欣松开通话键,转头盯住郭少青。", "scene_responses": [ { "npc_id": "shift_lead", "response": "partial" } ], "safety": { "paused": false, "boundaries": [], "leverage": [] }, "preferences": { "inner_view": false, "assistant": false, "offscreen_simulation": true, "person": "second" }, "save": { "current_slot": null, "turns_since_save": 5 }, "requests": { "chapter_summary": false, "prologue": false, "twist_offer": null, "offscreen_beat_candidates": [] }, "size_bytes": 3473 }, "next_request_id": "r_b7426e1cf3c3", "replayed": false }, "error": null } } ], "calls_source": "trace", "text": "你一言不发,只是在铁壁的阴影里冷冷注视着她。\n\n头顶的水银灯把两排集装箱顶端的边缘打得惨白,远处的机械齿轮声越来越急促,空气闷得让人透不过气。二十三点三十八分,倒计时只剩下七分钟。\n\n梁嘉欣见你抿紧嘴唇毫无反应,眼神微微变了变,喉咙里低低骂了句粤语粗话。她到底是在码头滚了十五年的人,知道真要是让吊机把那只爆秤四吨的箱子硬拽起来,钢丝绳一旦出事,遭殃的全是她手底下的工人。\n\n她没再等你开口,大拇指猛地掀开通话保护盖,直接在公共频道上重重按下了侧键。\n\n【“七号机,先停一下,吊具钢丝绳例检!”】\n\n粗粝响亮的声音瞬间撕碎了夜色,在整个空旷的堆场通道里回荡。\n\n通道口外,潘宝珠的身形骤然一僵,脸上的肌肉肉眼可见地绷紧了。她快步走到集装箱夹缝前,眼里几乎要喷出火来,咬着牙死死盯着里面的梁嘉欣。码头公共频道的喊话覆水难收,谁都能听见,这一停,吊装序列硬生生被卡死在半空。\n\n几秒钟后,对讲机里爆出刺耳的沙沙杂音,随后传来桥吊司机含混的应答:“七号机收到,主钩停在二层高,等检修。”\n\n梁嘉欣松开手指,金属外壳发出“啪”的一声轻响。她胸口剧烈起伏了一下,转过头来,缺了半截小指的左手直接顶在你的写字板边上,目光沉重得压人:\n\n“二十分钟。阿青,我这张老脸和手底下工人的饭碗全押进去了。这二十分钟你要是拿不出交代,神仙也保不住你。”\n\n【时间】第一天 23:38|【地点】堆场通道|回合:6", "seconds": 30.6, "model": "local-proxy/gemini-3.8-flash-high" }, { "index": 7, "conversation": "A", "input": "存档 试玩", "expect": { "kind": "meta", "calls_max": 1, "must_call": [ "save-slot" ] }, "host_calls": [ { "tool": "write", "input": { "content": "{\n \"session_id\": \"s_1e9840a4\",\n \"request_id\": \"r_b7426e1cf3c3\",\n \"expected_revision\": 6,\n \"name\": \"试玩\"\n}\n", "filePath": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.host\\tmp\\opencode\\save_slot.json" }, "output": "Wrote file successfully.", "status": "completed" }, { "tool": "bash", "input": { "command": "python \"D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\scripts\\adult_tension.py\" save-slot --json --input-file \"D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.host\\tmp\\opencode\\save_slot.json\"" }, "output": "{\"ok\":true,\"data\":{\"revision\":6,\"turn\":6,\"slot\":{\"name\":\"试玩\",\"version\":1,\"turn\":6,\"world_title\":\"港口夜班\",\"clock_label\":\"第一天 23:38\",\"saved_at\":\"2026-09-29T02:27:10+08:00\"},\"auto_named\":false,\"receipt\":\"已保存到「试玩」·第 6 回合\",\"next_request_id\":\"r_b3ade483edd6\",\"replayed\":false},\"error\":null}", "status": "completed" } ], "runtime_calls": [ { "ts": "2026-09-29T02:27:10", "ms": 31.3, "pid": 20072, "skill_root": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension", "argv": [ "save-slot", "--json", "--input-file", "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.host\\tmp\\opencode\\save_slot.json" ], "input": { "session_id": "s_1e9840a4", "request_id": "r_b7426e1cf3c3", "expected_revision": 6, "name": "试玩" }, "exit": 0, "envelope": { "ok": true, "data": { "revision": 6, "turn": 6, "slot": { "name": "试玩", "version": 1, "turn": 6, "world_title": "港口夜班", "clock_label": "第一天 23:38", "saved_at": "2026-09-29T02:27:10+08:00" }, "auto_named": false, "receipt": "已保存到「试玩」·第 6 回合", "next_request_id": "r_b3ade483edd6", "replayed": false }, "error": null } } ], "calls_source": "trace", "text": "已保存到「试玩」·第 6 回合", "seconds": 18.6, "model": "local-proxy/gemini-3.8-flash-high" }, { "index": 8, "conversation": "B", "input": "读档 试玩", "expect": { "kind": "load", "calls_max": 2, "must_call": [ "load-slot" ] }, "host_calls": [ { "tool": "skill", "input": { "name": "adult-tension" }, "output": "\n# Skill: adult-tension\n\n# Adult Tension\n\n面向成年人的中文互动叙事。你负责理解玩家和写正文;本地运行时负责状态、时间、随机和校验。你提交**操作**,不提交状态。运行时的返回是唯一的事实来源。\n\n不要向玩家暴露:命令名、字段名、数值、revision、错误码、工具调用过程。\n\n## 最高规则(冲突时从上到下)\n\n1. 所有角色都是明示的成年人(≥ 18);不写真实人物、不写未成年暗示。\n2. 玩家的硬边界与“暂停”必须遵守。\n3. 玩家明确的指令。\n4. 运行时已提交的状态与事实。\n5. NPC 自己的意志。\n6. 文风与随机。\n\n## 调用运行时\n\n <本 Skill 目录>/scripts/adult_tension.py --json --input-file \n\n- ``:依次试 `python3`、`python`、`py -3`,用第一个 3.10 及以上的。\n- 调用之前和之间不写任何文字(不说要运行什么、读档、提交):玩家只看到正文与回执。\n- 输入写进 UTF-8 的临时 JSON 文件再传入。**玩家的原话永远不放进命令行参数。**\n- stdout 是一个 JSON:`{\"ok\", \"data\", \"error\"}`。\n- 每个写操作带 `request_id`:用上一次返回里的 `next_request_id`。\n- 会话内的写操作(`commit-turn`、`undo-turn`、`save-slot`、`set-*`)还要带 `session_id` 与 `expected_revision`(上一次返回的 `revision`)。\n- 超时、没有输出、输出不是 JSON:用**同一个** `request_id` 重试,最多 3 次。仍失败就运行 `doctor`,用一句话告诉玩家。\n- `IDEMPOTENCY_CONFLICT`:这个 `request_id` 已用于别的请求。先 `get-context` 确认上一次是否生效,再决定是否换新 `request_id` 补交。\n\n## 第一次\n\n本对话第一次玩之前运行一次 `doctor`。`ok`/`warn` 就继续;失败时按 `error.details[].hint` 告诉玩家怎么办,不自己安装软件、不改系统环境、不删数据。\n\n## 开局\n\n1. 玩家没说日常还是压力:问一句“1 日常 / 2 有压力”。只有玩家说“随便”才用 `random`。读档永远不问。\n2. 本对话里已经开过局或读过档(看对话本身,不用查),且上下文 `save.turns_since_save` > 0:先问“存档后开局 / 直接开局 / 取消”。\n3. 玩家点名的世界或题材:按 `references/worlds.md` 取 ID 放进 `locks.world_id`;没有相应的世界就说明没有现成世界,给两个选择——最接近的世界,或自定义世界(按 `references/custom_world.md` 写小世界包,放进 `new-game` 的 `custom_world`;`CONTENT_ERROR` 按 `details` 的路径改好,换新 `request_id` 重交)。\n4. 调用 `new-game`:`{\"request_id\", \"mode\": \"daily|pressure|random\", \"locks\": {\"world_id\"}, \"excludes\": {\"content_tags\", \"world_ids\"}, \"player\": {\"gender\", \"age\", \"identity_hint\", \"name\", \"title\"}, \"npc_gender_preference\"}`,只写玩家提到的部分(“不要职场”转成 `excludes`;“女性 NPC 为主”是 `mostly_female`,另有 `female_only`、`male_only`、`mostly_male`、`mixed`、`any`)。“重开 N 号”:`{\"request_id\", \"seed\": N, \"replay\": true}`。`NO_MATCH`:如实说哪条做不到、可以放宽什么。\n5. 按返回的 `opening` 写开局:\n\n 世界观:……(1–2 句,含 `rule_in_play` 这条规则在场景里起作用)\n 人物:……(玩家角色与 NPC 的姓名、明确年龄、身份,不泄露隐藏动机)\n\n (正文,不加标题,约 300–700 字;压力模式写出眼前的压力与近期期限,远期只作伏笔;结尾停在 `hook` 描述的未决动作上,不替玩家接)\n\n `opening.footer` 原样放在最后\n\n 开局正文里新写出、之后要继承的细节,在第一次提交里用 `add_fact` 记下。\n\n## 每个回合\n\n1. 判断玩家这句话是**元命令**(见命令表)还是**叙事输入**。元命令只输出回执,不写叙事。\n2. 叙事输入先判定 `action_mode`:\n - `result`:玩家写结果,作用在自己的身体、言语、物品、权限上 → 直接兑现。\n - `attempt`:意图、尝试,以及**任何作用于 NPC 身体、意志、财物的行动**(即使用了结果句式)→ 把这些 NPC 写进 `acts_on`,并各附一条 `npc_response`:`refuse` 拒绝 / `negotiate` 协商 / `partial` 有限配合 / `surface` 表面配合(写 `true_intent`)/ `genuine` 真诚配合。不作用于 NPC 的尝试写 `acts_on: []`。\n - `continue`:空输入、“继续”、“……”、“你决定” → 场景推进,至少一个可观察的变化(NPC 行动、状态变化、新事实、有人来去);玩家角色不说有意义的话、不移动、不同意任何事。\n - `wait`:玩家选择不动 → 给 NPC 行动空间。\n3. 组装一次 `commit-turn`:\n\n {\"session_id\": \"...\", \"request_id\": \"...\", \"expected_revision\": N,\n \"action_mode\": \"attempt\", \"player_input\": \"玩家原话\", \"player_authorized\": true,\n \"acts_on\": [\"npc_id\"],\n \"operations\": [\n {\"op\": \"npc_response\", \"npc_id\": \"...\", \"response\": \"partial\", \"note\": \"收下外套,只肯走到街口\"},\n {\"op\": \"relationship\", \"from\": \"npc_id\", \"to\": \"player\", \"trust_delta\": 1, \"reason\": \"他没有借机提名单的事\"},\n {\"op\": \"advance_time\", \"minutes\": 10}],\n \"content_tags\": [], \"summary\": \"第三方视角一两句\", \"open_action\": \"停在哪个未决动作\", \"quotes\": []}\n\n - `player_authorized: true` 只在玩家本人的话授权了玩家角色的移动、承诺、交易、同意、转折或设定修改时。\n - 操作(字段见 `references/operations.md`):`npc_response`、`npc_action`(重大行动带 `significant: true`,看 `can_act`)、`npc_state`、`add_fact`、`relationship`、`advance_time`(不写默认推进 3 分钟)、`move`、`enter_scene`/`exit_scene`、`event_*`、`roll`、`player_update`、`reveal_fact`、`spread_rumor`、`set_voice`、`introduce_character`/`promote_character`(明确成年,名字取自完整上下文的 `name_pool`)、`intimacy_evidence`、`identity_update`、`npc_update`、`leverage_set`/`leverage_release`、`offscreen_beat`、`twist_accept`。\n - 正文里新写出、以后要用到的细节,用 `add_fact` 记下。正文不是记忆。\n - 照上下文的 `requests` 附带:`chapter_summary` 为 true 时写 `chapter_summary`(≤300 字,第三方视角概括到上一回合为止的这一章);`prologue` 为 true 时读完整上下文的 `prologue_merge`,把旧前情与其中各章合并成 ≤300 字写进 `prologue`;没要求就不写。\n4. 只根据返回的 `applied`、`resolved_events`、`simulation`、新的 `context` 写正文。掷骰、事件到期、离屏移动与消息传播都由运行时决定,你负责描写。\n5. 页脚:`【时间】{context.clock.label}|【地点】{context.scene.location}|回合:{turn}`。叙事助手开启时(`context.preferences.assistant`),末尾加“可以:① …… ② …… ③ ……”,只给提示,不替玩家决定。\n6. 返回的 `context` 就是下一回合的依据,不需要再调 `get-context`。信息不够时可以 `get-context` 带 `\"depth\": \"full\"`;人物卡带 `detail` 的是为控制体积删减过的摘要。\n\n提交被拒时:按 `error.details` 的 `path` 与 `hint` 修正后重交,同一回合最多 2 次,玩家看不到。仍失败,用一句话请玩家换个说法。只有年龄、硬边界、暂停导致的拒绝(`SAFETY_BLOCK`)需要用一句话告诉玩家原因。`STALE_REVISION`:用错误里附带的 `context` **重新判断**再交,不能只换 revision。\n\n## 玩家主权\n\n- 玩家的结果档行动与设定冲突时,补一个最小的合理因果接住它,不说“做不到”。只有年龄、硬边界、暂停可以阻断。\n- 不替玩家角色说有意义的话(玩家只说了意图,就写动作,不编台词)、不替玩家做选择、不替玩家下情绪结论。\n- “必须 / 一定 / 确保”只锁定玩家自己的动作,锁不住 NPC 的同意。\n- 跨时间的行动(“接下来三天都去盯着”):先写第一步,再用 `event_create` 登记。\n\n## 时间、离屏与转折\n\n- 快进(“快进到晚上”“三天后”):先 `get-context` 带 `preview_time`(与 `advance_time` 同形:`until`/`days`/`minutes`),再提交一次:`advance_time` 放第一个,其后为 `preview.required_beats` 的每个 NPC 各写一条 `offscreen_beat`。正文写清到期事件的结果。\n- `offscreen_beat`:只写这个不在场 NPC 自己的行动、状态、去向、NPC 之间的关系与消息,依据他的目标与所知(预览的 `goal`、`knows`),不碰玩家角色。玩家“继续”时可以为 `requests.offscreen_beat_candidates` 里的 NPC 插一段简短离屏片段。跨度 ≥ 60 分钟或跨日时被点名的 NPC 必须有,缺了被拒,错误的 `preview` 给出补写所需。离屏推演关闭时没有离屏片段。\n- 转折:`requests.twist_offer` 出现(压力模式第一次跨日),或玩家说“来点转折”(`get-context` 带 `\"want_twist\": true`)时,正文后一句话列出候选(“可以选一个转折:① …… ② ……,或说你想要的”)。玩家选定后提交 `twist_accept`(`twist_id`,或玩家口述的 `category`+`text`),`result` 模式带 `player_authorized`。同一游戏日最多一次;玩家不理会就照常继续。\n\n## 撤销、改写、追溯\n\n- “撤销”“刚才不算”:`undo-turn`。回执“已撤销第 N 回合”,再一句话定位当前场景。最多退到本次读档或开局的那一回合。\n- “刚才不算,改成 Y”:一次 `commit-turn`,带 `\"replaces_turn\": 当前回合号`,按 Y 判定行动模式。\n- “其实……”:`action_mode: \"rewrite\"` 带 `player_authorized`,用 `add_fact`(`\"origin\": \"retcon\"`、`\"visibility\": \"private\"`、`\"known_by\": [\"player\"]`)或 `player_update` 补玩家角色自己的背景、物品、经历、称谓,可附 NPC 的反应(`npc_action`/`npc_state`)。追溯不给 NPC 追加知情、好感或同意;与已记录事实冲突会被拒:告诉玩家这与已发生的事矛盾,请换个说法。\n\n## NPC\n\n- NPC 只根据**自己知道的事实**行动(`basis_fact_ids` 必须在其信息集里);内心描写永远不成为任何人的知识(内心只用 `inner` 事实记录,不能传播)。\n- NPC 可以拒绝、讨价还价、表面答应、主动出手;重大行动有冷却。多个 NPC 在场时,他们之间也有关系和目标。\n- 表层 / 里层语态按上下文里的 `voice` 写。玩家说“别装了”“说点真心话”:同一回合用 `set_voice`(`cause: player_request`)切换;NPC 可以换语态说“不”。语态不是关系升级,和关系变化分开写原因。\n- 内心可见开启时(`preferences.inner_view`),可以单独成段写在场 NPC 没说出口的念头;玩家角色不知道这些。\n\n## 亲密与安全(完整规则见 `references/narrative.md` §7)\n\n- 同意只来自角色此刻可见的言行;沉默、含混、压力下的默许都不算。处境(债务、上下级、把柄、截止时间)永远不是同意。同意可以随时撤回,立即生效。\n- 亲密场景:逐步推进,玩家要求到哪一步就停在哪一步;每一步都写出对方的反应;玩家明确要求写出的过程不强制淡出,没要求的不擅自展开;不复读。提交带 `intimate` 或 `explicit` 标签时写 `intimate_participants`(含玩家),每个 NPC 参与者本回合要有 `partial`/`genuine` 回应或主动行动。\n- 有人开始拿捏另一个人(把柄、债务、生计)时,同一次提交用 `leverage_set` 登记;解除前这两人之间不进入亲密场景。被拒时在故事里让处境本身成为阻碍,不对玩家报错。\n- 任一方表现出停止意愿、玩家说“暂停”、触及玩家说过的边界:立即停下。\n- “边界:不要 X”:`set-boundary`(`action: add`,`text` 是玩家原话,`tags` 映射到内容标签,映射不上留空)。之后带冲突标签的提交会被拒(`SAFETY_BLOCK`);映射不上的边界由你在每次写作中遵守。\n- “暂停”(安全词、pause):`set-safety` `{\"paused\": true}`,立即停下,回到中性叙述。暂停期间带亲密或冲突标签的提交都被拒;非亲密的剧情可以继续。“换个场景”:`{\"paused\": true, \"change_scene\": true}`,然后写一个新的非亲密场景。暂停中玩家说“继续 / 恢复 / 解除暂停”:`{\"paused\": false}`,从停下的那一点重新开始,对方的反应重新判断,不接着升级。\n- 不在正文里逐回合重复免责声明或安全提醒。\n\n## 命令与别名\n\n元命令只输出回执(返回的 `receipt`),不写叙事。\n\n| 玩家说 | 你做 |\n|---|---|\n| 开局、新游戏、开局 日常 / 压力、开局 港口、重开 N 号 | 开局流程 |\n| 自定义世界 …… | 写小世界包 → `new-game`(`custom_world`) |\n| 世界列表 | `list-worlds` |\n| 继续、c、……、空输入 | `commit-turn`(`continue`) |\n| 存档 [名称]、s、快速存档、qs / 另存为 名称 | `save-slot`(`name`;不给名字存到当前槽或自动命名)/ 另加 `\"save_as\": true` |\n| 读档 [名称]、l | 有名称就直接 `load-slot`(不存在时错误里列有现有存档,让玩家选);没给名称才先 `list-slots`。回执后用 `resume` 写两三句前情,从未决动作的前一刻接着写,不重复开局 |\n| 存档列表 / 删除存档 名称 | `list-slots` / 先问“确定删除「名称」吗?”,确认后 `delete-slot` 带 `\"confirm\": true` |\n| 继续上次、恢复 | `list-sessions`:一个就接上,多个列出让玩家选;接上时 `get-context` 带 `\"depth\": \"full\"`,写两三句前情再接续。当前局暂停中说“恢复”:问“恢复上次会话 / 读取存档 / 解除暂停” |\n| 导出 [存档名] | `export-save`(`session_id` 或 `slot`;玩家给了路径才写 `path`),告诉玩家文件路径 |\n| 导入 路径 / 粘贴的内容 | `import-save`(`path` 或 `data`,可带 `slot`),回执后写两三句前情接续 |\n| 状态 / 状态+ / 调试 | `status`(`level`: `brief` / `detail` / `debug`),`lines`(和 `sections`)原样转述;六行编号 ①–⑥ |\n| 边界:不要 X / 撤销边界 X | `set-boundary`(`add` / `remove`) |\n| 暂停、安全词、pause / 换个场景 | `set-safety` |\n| 内心可见 / 叙事助手 / 离屏推演 开关、语态 某人 表/里、人称、NPC 性别偏好 | `set-preferences`(`inner_view`、`assistant`、`offscreen_simulation`、`voice: {\"npc_id\", \"voice\"}`、`person`、`npc_gender_preference`) |\n| 撤销 / 刚才不算 / 刚才不算,改成 Y / 其实…… | 见“撤销、改写、追溯” |\n| 快进到……、跳到……、来点转折 | 见“时间、离屏与转折” |\n| 帮助、h、? | 列出上面的说法 |\n\n缺少对象时追问一次,不猜。存档名已被占用(`SLOT_CONFLICT`,`reason: exists`):问“「名称」已存在,要覆盖吗?”,确认后带 `\"overwrite\": true` 重交;`changed_elsewhere`:给“A 读取最新 / B 另存为新名 / C 取消”。导入被拒时如实说文件损坏或版本太新,不猜内容。\n\n## 参考资料(需要时再读)\n\n- `references/narrative.md`:完整叙事规则\n- `references/operations.md`:全部操作与提交字段\n- `references/commands.md`:全部命令的输入输出、错误码与退出码\n- `references/worlds.md`:世界列表\n- `references/custom_world.md`:自定义世界的写法、下限与示例\n- `references/troubleshooting.md`:环境问题、数据目录、升级与卸载\n\nBase directory for this skill: D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\nRelative paths in this skill (e.g., scripts/, reference/) are relative to this base directory.\nNote: file list is sampled.\n\n\nD:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\agents\\openai.yaml\nD:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\scripts\\adult_tension.py\nD:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\content\\worlds\\winter_shelter.json\nD:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\content\\worlds\\republic_press_street.json\nD:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\content\\worlds\\lantern_festival_town.json\nD:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\content\\worlds\\harbor_night_shift.json\nD:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\content\\worlds\\bakumatsu_machiya.json\nD:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\content\\worlds\\art_season_studios.json\nD:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\content\\tags.json\nD:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\references\\worlds.md\n\n", "status": "completed" }, { "tool": "write", "input": { "content": "{}", "filePath": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.host\\tmp\\opencode\\input_doctor.json" }, "output": "Wrote file successfully.", "status": "completed" }, { "tool": "bash", "input": { "command": "python \"D:/projects/at-e2e/opencode-pt-harbor_night_shift-pressure-r3-20260929-022311/.claude/skills/adult-tension/scripts/adult_tension.py\" doctor --json --input-file \"D:/projects/at-e2e/opencode-pt-harbor_night_shift-pressure-r3-20260929-022311/.host/tmp/opencode/input_doctor.json\"" }, "output": "{\"ok\":true,\"data\":{\"status\":\"ok\",\"fast_path\":true,\"skill_version\":\"0.3.0\",\"content_version\":\"2026.10.0-dev1\",\"skill_root\":\"D:\\\\projects\\\\at-e2e\\\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\\\.claude\\\\skills\\\\adult-tension\",\"data_dir\":\"D:\\\\projects\\\\at-e2e\\\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\\\.at-data\",\"data_dir_source\":\"env\",\"checks\":[{\"id\":\"python\",\"status\":\"ok\",\"message\":\"Python 3.12.10(C:\\\\Users\\\\daha\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python312\\\\python.exe)\",\"hint\":null},{\"id\":\"data_dir\",\"status\":\"ok\",\"message\":\"数据目录可写:D:\\\\projects\\\\at-e2e\\\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\\\.at-data(来源:env)\",\"hint\":null},{\"id\":\"sqlite\",\"status\":\"ok\",\"message\":\"SQLite 可用(快速检查)\",\"hint\":null},{\"id\":\"migrations\",\"status\":\"ok\",\"message\":\"数据库 schema 3(快速检查)\",\"hint\":null},{\"id\":\"skill_files\",\"status\":\"ok\",\"message\":\"Skill 根目录:D:\\\\projects\\\\at-e2e\\\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\\\.claude\\\\skills\\\\adult-tension(快速检查)\",\"hint\":null},{\"id\":\"content\",\"status\":\"ok\",\"message\":\"内容版本 2026.10.0-dev1,6 个世界可开局(快速检查:内容文件未变化)\",\"hint\":null}],\"next_request_id\":\"r_21815d5ce6b8\"},\"error\":null}", "status": "completed" }, { "tool": "grep", "input": { "path": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\references", "pattern": "load-slot" }, "output": "Found 2 matches\nD:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\references\\commands.md:\n Line 26: | `load-slot` | create | 必填 | 读档:创建新的会话副本,原存档不变 | — |\n\n Line 121: ### `load-slot`\n", "status": "completed" }, { "tool": "read", "input": { "offset": 120, "filePath": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\references\\commands.md", "limit": 40 }, "output": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\references\\commands.md\nfile\n\n120: \n121: ### `load-slot`\n122: \n123: | 字段 | 类型 | 必填 | 说明 |\n124: |---|---|---|---|\n125: | `request_id` | 字符串,≤64 字,8–64 位 [A-Za-z0-9_-];直接用上一次返回的 next_request_id | 是 | |\n126: | `name` | 字符串,≤60 字 | 是 | |\n127: \n128: ### `new-game`\n129: \n130: | 字段 | 类型 | 必填 | 说明 |\n131: |---|---|---|---|\n132: | `request_id` | 字符串,≤64 字,8–64 位 [A-Za-z0-9_-];直接用上一次返回的 next_request_id | 是 | |\n133: | `mode` | 枚举:`daily` / `pressure` / `random` 或 null | 否,默认 `null` | daily 日常 / pressure 有压力 / random 玩家明确说“随便”时;replay 时可省略 |\n134: | `seed` | 整数 1..999999 或 null | 否,默认 `null` | |\n135: | `replay` | 布尔 | 否,默认 `false` | “重开 N 号”:按本机记录的该种子开局条件复现 |\n136: | `locks` | 对象(锁定) | 否,默认 `{}` | |\n137: | `excludes` | 对象(排除) | 否,默认 `{}` | |\n138: | `player` | 对象(玩家设定) | 否,默认 `{}` | |\n139: | `npc_gender_preference` | 枚举:`any` / `mostly_female` / `mostly_male` / `female_only` / `male_only` / `mixed` | 否,默认 `\"any\"` | |\n140: | `custom_world` | 自定义世界包 或 null | 否,默认 `null` | |\n141: | `preferences` | 对象(偏好) | 否,默认 `{}` | |\n142: | `include_drafts` | 布尔 | 否,默认 `false` | |\n143: \n144: #### `locks` 的字段\n145: \n146: | 字段 | 类型 | 必填 | 说明 |\n147: |---|---|---|---|\n148: | `world_id` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} 或 null | 否,默认 `null` | |\n149: | `location_id` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} 或 null | 否,默认 `null` | |\n150: | `combo_id` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} 或 null | 否,默认 `null` | |\n151: | `activity_id` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} 或 null | 否,默认 `null` | |\n152: | `pressure_id` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} 或 null | 否,默认 `null` | |\n153: | `hook_id` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} 或 null | 否,默认 `null` | |\n154: | `identity_id` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} 或 null | 否,默认 `null` | |\n155: \n156: #### `excludes` 的字段\n157: \n158: | 字段 | 类型 | 必填 | 说明 |\n159: |---|---|---|---|\n\n(Showing lines 120-159 of 297. Use offset=160 to continue.)\n", "status": "completed" }, { "tool": "grep", "input": { "pattern": "resume", "path": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\references" }, "output": "No files found", "status": "completed" }, { "tool": "write", "input": { "content": "{\n \"request_id\": \"r_21815d5ce6b8\",\n \"name\": \"试玩\"\n}", "filePath": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.host\\tmp\\opencode\\input_load.json" }, "output": "Wrote file successfully.", "status": "completed" }, { "tool": "bash", "input": { "command": "python \"D:/projects/at-e2e/opencode-pt-harbor_night_shift-pressure-r3-20260929-022311/.claude/skills/adult-tension/scripts/adult_tension.py\" load-slot --json --input-file \"D:/projects/at-e2e/opencode-pt-harbor_night_shift-pressure-r3-20260929-022311/.host/tmp/opencode/input_load.json\"" }, "output": "{\"ok\":true,\"data\":{\"session_id\":\"s_34986261\",\"revision\":6,\"turn\":6,\"slot\":{\"name\":\"试玩\",\"version\":1,\"saved_at\":\"2026-09-29T02:27:10+08:00\"},\"receipt\":\"已读取「试玩」·第 6 回合\",\"resume\":{\"chapter_summary\":null,\"prologue\":null,\"recent\":[\"梁嘉欣上前打破对峙提醒时间紧迫,潘宝珠因船期受阻面色发紧。\",\"郭少青探问梁嘉欣能否分担压力,梁嘉欣答应操作上拖延两轮吊机,但坚决不在单据上担责。\",\"郭少青静默不语,梁嘉欣果断按下对讲机通报索具例检延后吊装,潘宝珠在通道外脸色铁青。\"],\"last_quotes\":[\"“七号机,先停一下,吊具钢丝绳例检!”\"],\"open_action\":\"对讲机里传来桥吊司机的应答,梁嘉欣松开通话键,转头盯住郭少青。\"},\"context\":{\"depth\":\"full\",\"session_id\":\"s_34986261\",\"revision\":6,\"turn\":6,\"mode\":\"pressure\",\"clock\":{\"day\":1,\"minute\":1418,\"label\":\"第一天 23:38\"},\"scene\":{\"id\":\"sc1\",\"location_id\":\"container_yard\",\"location\":\"堆场通道\",\"privacy\":\"semi\",\"present\":[\"player\",\"ship_agent_rep\",\"shift_lead\"]},\"player\":{\"name\":\"郭少青\",\"title\":\"阿青\",\"age\":38,\"gender\":\"male\",\"role\":\"夜班调度\",\"social_position\":\"equal\",\"baseline\":\"坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。\",\"resources\":[\"排吊装顺序的权力\",\"能切到任何一个频道\"],\"reputation\":\"做事公道,但谁都不敢得罪\",\"risks\":[\"上个月替人把一个柜子的吊装顺序往后挪了两晚\"],\"background\":[]},\"present_npcs\":[{\"id\":\"ship_agent_rep\",\"name\":\"潘宝珠\",\"age\":46,\"gender\":\"female\",\"tier\":\"major\",\"role\":\"船公司驻港代表\",\"mood\":null,\"voice\":\"surface\",\"can_act\":true,\"trust_to_player\":0,\"tension\":2,\"stage\":\"陌生\",\"goal\":\"让船准时开走\",\"stance\":\"谁有用就对谁客气\"},{\"id\":\"shift_lead\",\"name\":\"梁嘉欣\",\"age\":49,\"gender\":\"female\",\"tier\":\"major\",\"role\":\"夜班装卸班组长\",\"mood\":null,\"voice\":\"surface\",\"can_act\":true,\"trust_to_player\":1,\"tension\":0,\"stage\":\"熟络\",\"goal\":\"给自己找一个接班人\",\"stance\":\"先把你当自己人,一旦发现你两头说话就翻脸\"}],\"nearby\":[{\"id\":\"bg_gate_guard\",\"name\":\"甘永光\",\"role\":\"闸口门卫\"},{\"id\":\"bg_patrol\",\"name\":\"冯家宁\",\"role\":\"巡场保安\"}],\"due_soon\":[{\"id\":\"e1\",\"kind\":\"deadline\",\"title\":\"超重的柜子·眼前\",\"in_minutes\":7,\"due_label\":\"第一天 23:45\",\"involves_player\":true},{\"id\":\"e2\",\"kind\":\"deadline\",\"title\":\"超重的柜子·近期\",\"in_minutes\":322,\"due_label\":\"第二天 05:00\",\"involves_player\":true},{\"id\":\"e3\",\"kind\":\"foreshadow\",\"title\":\"超重的柜子·伏笔\",\"in_minutes\":7192,\"due_label\":\"第六天 23:30\",\"involves_player\":true}],\"known_facts\":[{\"id\":\"f12\",\"text\":\"梁嘉欣在公共频道通报七号机索具例检暂停吊装,为现场争取了二十分钟缓冲\",\"visibility\":\"public\"},{\"id\":\"f11\",\"text\":\"梁嘉欣同意以索具例检为由将超重箱往后推迟吊装,但明确表示单据签字概不负责\",\"visibility\":\"private\"},{\"id\":\"f7\",\"text\":\"三个人今晚都在等同一条船装完\",\"visibility\":\"public\"},{\"id\":\"f8\",\"text\":\"都知道第三排最底下那个柜子有问题,却谁也没有说破\",\"visibility\":\"public\"},{\"id\":\"f9\",\"text\":\"一方是另一方入行时的师傅,教过的东西都还记着\",\"visibility\":\"public\"},{\"id\":\"f10\",\"text\":\"磅房报上来一个柜子比单据重了四吨,放行单上等着你表态\",\"visibility\":\"public\"},{\"id\":\"f5\",\"text\":\"郭少青:坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。\",\"visibility\":\"private\"},{\"id\":\"f6\",\"text\":\"郭少青:上个月替人把一个柜子的吊装顺序往后挪了两晚\",\"visibility\":\"private\"}],\"recent\":[\"梁嘉欣上前打破对峙提醒时间紧迫,潘宝珠因船期受阻面色发紧。\",\"郭少青探问梁嘉欣能否分担压力,梁嘉欣答应操作上拖延两轮吊机,但坚决不在单据上担责。\",\"郭少青静默不语,梁嘉欣果断按下对讲机通报索具例检延后吊装,潘宝珠在通道外脸色铁青。\"],\"last_quotes\":[\"“七号机,先停一下,吊具钢丝绳例检!”\"],\"open_action\":\"对讲机里传来桥吊司机的应答,梁嘉欣松开通话键,转头盯住郭少青。\",\"scene_responses\":[{\"npc_id\":\"shift_lead\",\"response\":\"partial\"}],\"safety\":{\"paused\":false,\"boundaries\":[],\"leverage\":[]},\"preferences\":{\"inner_view\":false,\"assistant\":false,\"offscreen_simulation\":true,\"person\":\"second\"},\"save\":{\"current_slot\":\"试玩\",\"turns_since_save\":0},\"requests\":{\"chapter_summary\":false,\"prologue\":false,\"twist_offer\":null,\"offscreen_beat_candidates\":[]},\"size_bytes\":17676,\"world\":{\"title\":\"港口夜班\",\"era\":\"1990 年代末(1998 年)\",\"region\":\"南方沿海港城的集装箱码头\",\"premise\":\"集装箱码头的夜班从晚八点到早八点,灯一直亮到天明,人很少,交接班的十分钟里什么都可能发生。\",\"tone\":[\"潮湿\",\"疲惫\",\"克制的热\"],\"style_hint\":\"短句,多写声音、气味与灯光,少写心理独白;粤语词点到即止。\",\"rules\":[\"夜班 20:00 上岗、次日 8:00 下班,凌晨两点所有人到控制塔签到交接;签到簿谁都能翻,缺签要写说明交给主任。\",\"对讲机公共频道所有当班的人都听得见,谁说了什么第二天全码头都知道;私事只能切到六频道,可调度偶尔会抽查。\",\"箱号、铅封号、重量三样对不上的柜,要当班理货员在理货单上签字才能放行——签了字,出了事就是签字人的。\",\"海关查验不提前打招呼,查验车进闸口时门卫会在公共频道喊一声“大车进场”,从闸口开到泊位要二十分钟。\",\"船公司的人逢年过节、赶船期都塞红包;收不收、收多少,班组里人人心里有数,只是没人写在纸上。\",\"台风警报升到最高一级,码头全面停工,吊机锁死,所有人撤进塔楼一楼,风停之前谁也不许出去。\"],\"customs\":[\"收工后去闸口外的茶餐厅吃一碗云吞面,是班组默认的散伙仪式;谁请客轮着来,轮到的人装不知道会被记很久。\",\"红包要当着人面推两次再收;推一次就收显得贪,推第三次就是不给面子。\",\"新来的人第一个夜班要请全班组喝一次糖水,叫“开工糖水”,糖水钱不能找人分摊。\",\"交班时要把保温壶灌满开水留给下一班;空壶留给别人,一个月都会有人阴阳怪气。\",\"塔吊司机上塔前在梯子第一级拍三下,说是跟吊臂打招呼;谁替别人拍了,就是认了交情。\"]},\"locations\":[{\"id\":\"berth_7\",\"name\":\"七号泊位\",\"privacy\":\"public\",\"detail\":\"吊臂的影子一格一格扫过地面,海水拍着缆桩,空气里是柴油和铁锈的味道。\",\"affordances\":[\"躲进两排集装箱的夹缝\",\"借吊机的轰鸣说悄悄话\",\"爬上跨运车的驾驶室避雨\"],\"exits\":[\"control_tower\",\"container_yard\",\"tool_shed\"]},{\"id\":\"control_tower\",\"name\":\"控制塔\",\"privacy\":\"semi\",\"detail\":\"三楼调度室一整面玻璃对着泊位,签到簿压在对讲机旁边,吊扇吱呀作响。\",\"affordances\":[\"翻看签到簿\",\"切换对讲机频道\",\"在楼梯拐角说话没人看见\"],\"exits\":[\"berth_7\",\"rest_room\"]},{\"id\":\"rest_room\",\"name\":\"休息室\",\"privacy\":\"semi\",\"detail\":\"塔楼一楼的休息室,一台旧风扇、一张折叠床、一台只收得到两个台的电视。\",\"affordances\":[\"轮流在折叠床上眯一会儿\",\"用电热水壶煮公仔面\",\"关了灯看窗外的船灯\"],\"exits\":[\"control_tower\",\"clinic\"]},{\"id\":\"clinic\",\"name\":\"医务室\",\"privacy\":\"semi\",\"detail\":\"塔楼一楼尽头的医务室,一张铁床、一个上锁的药柜,日光灯管发出细细的嗡声。\",\"affordances\":[\"处理伤口\",\"开一张病假条\",\"在铁床边坐一会儿\"],\"exits\":[\"rest_room\"]},{\"id\":\"tool_shed\",\"name\":\"工具房\",\"privacy\":\"private\",\"detail\":\"堆满缆绳和生锈的卸扣,铁皮门从外面挂锁,下雨时整间屋子像鼓一样响。\",\"affordances\":[\"躲雨\",\"把东西藏进缆绳堆\",\"关上门说话\"],\"exits\":[\"berth_7\"]},{\"id\":\"container_yard\",\"name\":\"堆场通道\",\"privacy\":\"semi\",\"detail\":\"集装箱码成五层高的窄巷,灯照不到中间,偶尔能听见某个箱子里有东西在响。\",\"affordances\":[\"借箱子挡住视线\",\"抄近路去闸口\",\"贴着箱壁听里面的动静\"],\"exits\":[\"berth_7\",\"teahouse\"]},{\"id\":\"teahouse\",\"name\":\"闸口外的茶餐厅\",\"privacy\":\"public\",\"detail\":\"凌晨三点还亮着灯,墙上的电视开着没声音,老板娘记得每个夜班的人要几分糖。\",\"affordances\":[\"抢最后一份叉烧\",\"在卡座里压低声音谈事\",\"借柜台上的电话打出去\"],\"exits\":[\"container_yard\",\"dorm_rooftop\"]},{\"id\":\"dorm_rooftop\",\"name\":\"宿舍楼天台\",\"privacy\":\"private\",\"detail\":\"员工宿舍六楼的天台,晾着一排工服,能看见整个港口的灯一盏盏亮着。\",\"affordances\":[\"一起抽一支烟\",\"看台风前的云\",\"躲开所有人\"],\"exits\":[\"teahouse\"]}],\"characters\":[{\"id\":\"shift_lead\",\"name\":\"梁嘉欣\",\"call\":\"梁姐\",\"age\":49,\"gender\":\"female\",\"tier\":\"major\",\"role\":\"夜班装卸班组长\",\"adult_context\":\"在码头干了十五年的装卸班组长,正式在编\",\"location_id\":\"container_yard\",\"present\":true,\"can_act\":true,\"voice\":\"surface\",\"appearance\":\"左手缺了半截小指,夹烟的姿势很特别\",\"voices\":{\"inner\":\"“我也会累的,你知不知道。”\",\"surface\":\"“都给我动起来!七号那边还差三个柜!”——嗓门大,带着笑\"},\"identity\":{\"authority\":\"决定谁上哪台机、谁今晚去扛最累的活\",\"resources\":[\"全班组的人情\",\"和船公司的人喝过酒\"],\"limits\":[\"上面刚换了领导,谁都在看她\",\"腰伤,不能久站\"],\"obligations\":[\"两个孩子的学费\"],\"exposure_risk\":\"班组的加班费里有两个名字是空挂的\",\"hidden_mismatch\":\"早就想把班组长的位置让出去,只是找不到能接的人\"},\"situation\":{\"trigger\":\"新来的主任要查加班费的名单\",\"pressure\":\"名单一查,空挂的两个名字就藏不住\",\"deadline\":null,\"exits\":[{\"cost\":\"两个老伙计这个月的补贴就没了\",\"option\":\"自己先去把名字销掉\"},{\"cost\":\"要欠一个大人情,还可能被人拿住\",\"option\":\"找人把名单换一份\"}]},\"decision\":{\"core_value\":\"护住自己的人\",\"current_goal\":\"给自己找一个接班人\",\"pressure_responses\":{\"breaking\":\"把所有事揽到自己身上\",\"high\":\"当众拍桌子,逼别人先让步\",\"low\":\"大声说笑,把话题岔开\",\"mid\":\"私下找人喝一杯,把事情谈了\"},\"withdrawal\":\"一个人蹲在缆桩上抽烟,谁叫都不应\",\"relationship_stance\":\"先把你当自己人,一旦发现你两头说话就翻脸\",\"contrast\":\"看着粗,账却算得比谁都细\",\"prefers\":[\"当面把话说清楚\"],\"avoids\":[\"写在纸上的承诺\"],\"never\":[\"把自己班组的人交出去\"]},\"intimacy\":{\"desire_level\":2,\"attraction_sources\":[\"对方敢在她发火的时候顶回来\",\"对方替班组里的人说过话\"],\"likes\":[\"热闹散了之后的安静\",\"难得被人照顾一次\"],\"dislikes\":[\"被人可怜\"],\"preconditions\":[\"不在班组的人面前\"],\"boundaries\":[\"不碰自己手下的人\"],\"expression\":\"半开玩笑地说真话\",\"self_control\":4,\"desired_position\":\"先照顾人,再被人照顾\"},\"to_player\":{\"trust\":1,\"tension\":0,\"stage\":\"熟络\"}},{\"id\":\"ship_agent_rep\",\"name\":\"潘宝珠\",\"call\":\"老潘\",\"age\":46,\"gender\":\"female\",\"tier\":\"major\",\"role\":\"船公司驻港代表\",\"adult_context\":\"船公司派驻港口的代表,正式雇员\",\"location_id\":\"container_yard\",\"present\":true,\"can_act\":true,\"voice\":\"surface\",\"appearance\":\"手腕上戴一块很旧的表,说是父亲留下的\",\"voices\":{\"inner\":\"“我这些年,连一个能说实话的人都没有。”\",\"surface\":\"“辛苦辛苦,一点心意,饮茶。”——客气,滴水不漏\"},\"identity\":{\"authority\":\"一句话能让下一条船改靠别的码头\",\"resources\":[\"现金和红包\",\"整个季度的船期表\"],\"limits\":[\"船东天天打电话催\",\"在这个港口没有一个真正的朋友\"],\"obligations\":[\"船晚一天开,滞期费就记在她头上\"],\"exposure_risk\":\"账上有一笔滞期费是做出来的\",\"hidden_mismatch\":\"其实想离开船公司,在港口开一间自己的报关行\"},\"situation\":{\"trigger\":\"船东要求船必须赶在台风前开走\",\"pressure\":\"开不走,滞期费和那笔假账会一起被查\",\"deadline\":null,\"exits\":[{\"cost\":\"红包越塞越多,把柄也越来越多\",\"option\":\"塞更多红包让码头连夜赶工\"},{\"cost\":\"丢掉这份工作\",\"option\":\"跟船东说实话\"}]},\"decision\":{\"core_value\":\"事情办成最重要\",\"current_goal\":\"让船准时开走\",\"pressure_responses\":{\"breaking\":\"撕破脸,把所有人的红包账都翻出来\",\"high\":\"找更上面的人打电话\",\"low\":\"笑着塞一个红包\",\"mid\":\"搬出船东,拿滞期费压人\"},\"withdrawal\":\"回到船上的办公室,只让船员传话\",\"relationship_stance\":\"谁有用就对谁客气\",\"contrast\":\"出手大方,自己却舍不得吃一份叉烧饭\",\"prefers\":[\"用钱把事情摆平\"],\"avoids\":[\"留下字据\"],\"never\":[\"让船东知道她自己的打算\"]},\"intimacy\":{\"desire_level\":3,\"attraction_sources\":[\"对方不收她的红包\",\"对方看得出她的客气是装的\"],\"likes\":[\"不谈生意的时候\",\"从海上吹来的风\"],\"dislikes\":[\"被人算计\"],\"preconditions\":[\"确定对方要的不是她的钱\"],\"boundaries\":[\"不在船上\"],\"expression\":\"请客,然后自己一口不吃\",\"self_control\":4,\"desired_position\":\"被当成同伴,而不是出钱的人\"},\"to_player\":{\"trust\":0,\"tension\":2,\"stage\":\"陌生\"}}],\"background\":[{\"id\":\"bg_gate_guard\",\"name\":\"甘永光\",\"role\":\"闸口门卫\",\"line\":\"查验车一进闸口,甘永光就在公共频道喊“大车进场”\",\"location_id\":\"container_yard\"},{\"id\":\"bg_old_lasher\",\"name\":\"叶嘉俊\",\"role\":\"老绑扎工\",\"line\":\"叶嘉俊什么都看见了,但只在茶餐厅里说\",\"location_id\":\"berth_7\"},{\"id\":\"bg_old_tallyman\",\"name\":\"吴雨澄\",\"role\":\"返聘的老理货员\",\"line\":\"吴雨澄认得每一种铅封,肯教人,但只教一遍\",\"location_id\":\"control_tower\"},{\"id\":\"bg_patrol\",\"name\":\"冯家宁\",\"role\":\"巡场保安\",\"line\":\"冯家宁骑着一辆没有铃的单车,总在最不该出现的时候出现\",\"location_id\":\"container_yard\"},{\"id\":\"bg_ship_cook\",\"name\":\"卢佩珊\",\"role\":\"外轮厨师\",\"line\":\"卢佩珊会用三种语言骂人,船上的事问她最快\",\"location_id\":\"berth_7\"},{\"id\":\"bg_sign_clerk\",\"name\":\"莫志强\",\"role\":\"控制塔统计员\",\"line\":\"签到簿在莫志强手里,谁几点来、几点走,他都记着\",\"location_id\":\"control_tower\"},{\"id\":\"bg_teahouse_boss\",\"name\":\"谭咏诗\",\"role\":\"茶餐厅老板娘\",\"line\":\"谭咏诗记得每个人要几分糖,也记得每个人上个月赊了多少\",\"location_id\":\"teahouse\"}],\"relationships\":[{\"from\":\"player\",\"to\":\"shift_lead\",\"trust\":1,\"tension\":1,\"stage\":\"熟络\",\"recent\":[\"梁嘉欣是你在码头认识最久的人\"]},{\"from\":\"player\",\"to\":\"ship_agent_rep\",\"trust\":0,\"tension\":1,\"stage\":\"陌生\",\"recent\":[\"潘宝珠递过一次名片给你,你没接\"]},{\"from\":\"shift_lead\",\"to\":\"player\",\"trust\":1,\"tension\":0,\"stage\":\"熟络\",\"recent\":[\"梁嘉欣是你在码头认识最久的人\"]},{\"from\":\"shift_lead\",\"to\":\"ship_agent_rep\",\"trust\":1,\"tension\":1,\"stage\":\"认识\",\"recent\":[\"两个人一起喝过酒,喝完谁也不信谁\"]},{\"from\":\"ship_agent_rep\",\"to\":\"player\",\"trust\":0,\"tension\":2,\"stage\":\"陌生\",\"recent\":[\"潘宝珠递过一次名片给你,你没接\",\"郭少青当面避开红包,拖延装船放行\"]},{\"from\":\"ship_agent_rep\",\"to\":\"shift_lead\",\"trust\":0,\"tension\":3,\"stage\":\"认识\",\"recent\":[\"两个人一起喝过酒,喝完谁也不信谁\",\"梁嘉欣当众在对讲机里叫停七号机,拖延船期\"]}],\"player_facts\":[{\"id\":\"f12\",\"text\":\"梁嘉欣在公共频道通报七号机索具例检暂停吊装,为现场争取了二十分钟缓冲\",\"visibility\":\"public\"},{\"id\":\"f11\",\"text\":\"梁嘉欣同意以索具例检为由将超重箱往后推迟吊装,但明确表示单据签字概不负责\",\"visibility\":\"private\"},{\"id\":\"f7\",\"text\":\"三个人今晚都在等同一条船装完\",\"visibility\":\"public\"},{\"id\":\"f8\",\"text\":\"都知道第三排最底下那个柜子有问题,却谁也没有说破\",\"visibility\":\"public\"},{\"id\":\"f9\",\"text\":\"一方是另一方入行时的师傅,教过的东西都还记着\",\"visibility\":\"public\"},{\"id\":\"f10\",\"text\":\"磅房报上来一个柜子比单据重了四吨,放行单上等着你表态\",\"visibility\":\"public\"},{\"id\":\"f5\",\"text\":\"郭少青:坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。\",\"visibility\":\"private\"},{\"id\":\"f6\",\"text\":\"郭少青:上个月替人把一个柜子的吊装顺序往后挪了两晚\",\"visibility\":\"private\"}],\"events\":[{\"id\":\"e1\",\"kind\":\"deadline\",\"title\":\"超重的柜子·眼前\",\"in_minutes\":7,\"due_label\":\"第一天 23:45\",\"involves_player\":true},{\"id\":\"e2\",\"kind\":\"deadline\",\"title\":\"超重的柜子·近期\",\"in_minutes\":322,\"due_label\":\"第二天 05:00\",\"involves_player\":true},{\"id\":\"e3\",\"kind\":\"foreshadow\",\"title\":\"超重的柜子·伏笔\",\"in_minutes\":7192,\"due_label\":\"第六天 23:30\",\"involves_player\":true}],\"leverage_all\":[],\"pressure\":{\"id\":\"p_overweight\",\"title\":\"超重的柜子\",\"source\":\"person\",\"trigger\":\"磅房报上来一个柜子比单据重了四吨,放行单上等着你表态\",\"objective\":\"在装船之前弄清楚多出来的四吨是什么\",\"choice\":\"放行,还是拦下来得罪船公司\",\"exits\":[{\"cost\":\"出了事就是放行的人担\",\"option\":\"放行\"},{\"cost\":\"船公司的红包以后再没有你的份\",\"option\":\"拦下来开柜\"}],\"location_modifier\":\"超重的柜子要拖去磅房,一定会经过保安的巡逻线。\"},\"chapters\":[],\"tags\":[\"romance_light\",\"intimate\",\"explicit\",\"violence\",\"coercion_theme\",\"humiliation\",\"bodily_harm\",\"substance\",\"pregnancy\",\"death\",\"workplace_power\",\"infidelity\",\"crime\",\"gambling\",\"workplace\",\"nightlife\",\"supernatural\",\"disaster\",\"custom\"],\"name_pool\":{\"family_unused\":[\"陈\",\"何\",\"麦\",\"黄\",\"罗\",\"邓\",\"钟\",\"区\"],\"given_female\":[\"秀琴\",\"嘉欣\",\"美玲\",\"丽珊\",\"咏诗\",\"慧敏\",\"婉仪\",\"淑贞\",\"少芬\",\"翠屏\",\"玉莲\",\"凤仪\"],\"given_male\":[\"志强\",\"国栋\",\"家豪\",\"伟明\",\"振华\",\"锦荣\",\"耀祖\",\"建辉\",\"德胜\",\"灿明\",\"汉生\",\"嘉俊\"],\"given_neutral\":[\"子晴\",\"海宁\",\"思远\",\"家宁\",\"天恩\",\"晓岚\",\"雨澄\",\"文乐\"]}},\"next_request_id\":\"r_97f6d23dde63\",\"replayed\":false},\"error\":null}", "status": "completed" } ], "runtime_calls": [ { "ts": "2026-09-29T02:27:33", "ms": 28.1, "pid": 26308, "skill_root": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension", "argv": [ "doctor", "--json", "--input-file", "D:/projects/at-e2e/opencode-pt-harbor_night_shift-pressure-r3-20260929-022311/.host/tmp/opencode/input_doctor.json" ], "input": {}, "exit": 0, "envelope": { "ok": true, "data": { "status": "ok", "fast_path": true, "skill_version": "0.3.0", "content_version": "2026.10.0-dev1", "skill_root": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension", "data_dir": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.at-data", "data_dir_source": "env", "checks": [ { "id": "python", "status": "ok", "message": "Python 3.12.10(C:\\Users\\daha\\AppData\\Local\\Programs\\Python\\Python312\\python.exe)", "hint": null }, { "id": "data_dir", "status": "ok", "message": "数据目录可写:D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.at-data(来源:env)", "hint": null }, { "id": "sqlite", "status": "ok", "message": "SQLite 可用(快速检查)", "hint": null }, { "id": "migrations", "status": "ok", "message": "数据库 schema 3(快速检查)", "hint": null }, { "id": "skill_files", "status": "ok", "message": "Skill 根目录:D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension(快速检查)", "hint": null }, { "id": "content", "status": "ok", "message": "内容版本 2026.10.0-dev1,6 个世界可开局(快速检查:内容文件未变化)", "hint": null } ], "next_request_id": "r_21815d5ce6b8" }, "error": null } }, { "ts": "2026-09-29T02:27:56", "ms": 38.5, "pid": 17904, "skill_root": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension", "argv": [ "load-slot", "--json", "--input-file", "D:/projects/at-e2e/opencode-pt-harbor_night_shift-pressure-r3-20260929-022311/.host/tmp/opencode/input_load.json" ], "input": { "request_id": "r_21815d5ce6b8", "name": "试玩" }, "exit": 0, "envelope": { "ok": true, "data": { "session_id": "s_34986261", "revision": 6, "turn": 6, "slot": { "name": "试玩", "version": 1, "saved_at": "2026-09-29T02:27:10+08:00" }, "receipt": "已读取「试玩」·第 6 回合", "resume": { "chapter_summary": null, "prologue": null, "recent": [ "梁嘉欣上前打破对峙提醒时间紧迫,潘宝珠因船期受阻面色发紧。", "郭少青探问梁嘉欣能否分担压力,梁嘉欣答应操作上拖延两轮吊机,但坚决不在单据上担责。", "郭少青静默不语,梁嘉欣果断按下对讲机通报索具例检延后吊装,潘宝珠在通道外脸色铁青。" ], "last_quotes": [ "“七号机,先停一下,吊具钢丝绳例检!”" ], "open_action": "对讲机里传来桥吊司机的应答,梁嘉欣松开通话键,转头盯住郭少青。" }, "context": { "depth": "full", "session_id": "s_34986261", "revision": 6, "turn": 6, "mode": "pressure", "clock": { "day": 1, "minute": 1418, "label": "第一天 23:38" }, "scene": { "id": "sc1", "location_id": "container_yard", "location": "堆场通道", "privacy": "semi", "present": [ "player", "ship_agent_rep", "shift_lead" ] }, "player": { "name": "郭少青", "title": "阿青", "age": 38, "gender": "male", "role": "夜班调度", "social_position": "equal", "baseline": "坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。", "resources": [ "排吊装顺序的权力", "能切到任何一个频道" ], "reputation": "做事公道,但谁都不敢得罪", "risks": [ "上个月替人把一个柜子的吊装顺序往后挪了两晚" ], "background": [] }, "present_npcs": [ { "id": "ship_agent_rep", "name": "潘宝珠", "age": 46, "gender": "female", "tier": "major", "role": "船公司驻港代表", "mood": null, "voice": "surface", "can_act": true, "trust_to_player": 0, "tension": 2, "stage": "陌生", "goal": "让船准时开走", "stance": "谁有用就对谁客气" }, { "id": "shift_lead", "name": "梁嘉欣", "age": 49, "gender": "female", "tier": "major", "role": "夜班装卸班组长", "mood": null, "voice": "surface", "can_act": true, "trust_to_player": 1, "tension": 0, "stage": "熟络", "goal": "给自己找一个接班人", "stance": "先把你当自己人,一旦发现你两头说话就翻脸" } ], "nearby": [ { "id": "bg_gate_guard", "name": "甘永光", "role": "闸口门卫" }, { "id": "bg_patrol", "name": "冯家宁", "role": "巡场保安" } ], "due_soon": [ { "id": "e1", "kind": "deadline", "title": "超重的柜子·眼前", "in_minutes": 7, "due_label": "第一天 23:45", "involves_player": true }, { "id": "e2", "kind": "deadline", "title": "超重的柜子·近期", "in_minutes": 322, "due_label": "第二天 05:00", "involves_player": true }, { "id": "e3", "kind": "foreshadow", "title": "超重的柜子·伏笔", "in_minutes": 7192, "due_label": "第六天 23:30", "involves_player": true } ], "known_facts": [ { "id": "f12", "text": "梁嘉欣在公共频道通报七号机索具例检暂停吊装,为现场争取了二十分钟缓冲", "visibility": "public" }, { "id": "f11", "text": "梁嘉欣同意以索具例检为由将超重箱往后推迟吊装,但明确表示单据签字概不负责", "visibility": "private" }, { "id": "f7", "text": "三个人今晚都在等同一条船装完", "visibility": "public" }, { "id": "f8", "text": "都知道第三排最底下那个柜子有问题,却谁也没有说破", "visibility": "public" }, { "id": "f9", "text": "一方是另一方入行时的师傅,教过的东西都还记着", "visibility": "public" }, { "id": "f10", "text": "磅房报上来一个柜子比单据重了四吨,放行单上等着你表态", "visibility": "public" }, { "id": "f5", "text": "郭少青:坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。", "visibility": "private" }, { "id": "f6", "text": "郭少青:上个月替人把一个柜子的吊装顺序往后挪了两晚", "visibility": "private" } ], "recent": [ "梁嘉欣上前打破对峙提醒时间紧迫,潘宝珠因船期受阻面色发紧。", "郭少青探问梁嘉欣能否分担压力,梁嘉欣答应操作上拖延两轮吊机,但坚决不在单据上担责。", "郭少青静默不语,梁嘉欣果断按下对讲机通报索具例检延后吊装,潘宝珠在通道外脸色铁青。" ], "last_quotes": [ "“七号机,先停一下,吊具钢丝绳例检!”" ], "open_action": "对讲机里传来桥吊司机的应答,梁嘉欣松开通话键,转头盯住郭少青。", "scene_responses": [ { "npc_id": "shift_lead", "response": "partial" } ], "safety": { "paused": false, "boundaries": [], "leverage": [] }, "preferences": { "inner_view": false, "assistant": false, "offscreen_simulation": true, "person": "second" }, "save": { "current_slot": "试玩", "turns_since_save": 0 }, "requests": { "chapter_summary": false, "prologue": false, "twist_offer": null, "offscreen_beat_candidates": [] }, "size_bytes": 17676, "world": { "title": "港口夜班", "era": "1990 年代末(1998 年)", "region": "南方沿海港城的集装箱码头", "premise": "集装箱码头的夜班从晚八点到早八点,灯一直亮到天明,人很少,交接班的十分钟里什么都可能发生。", "tone": [ "潮湿", "疲惫", "克制的热" ], "style_hint": "短句,多写声音、气味与灯光,少写心理独白;粤语词点到即止。", "rules": [ "夜班 20:00 上岗、次日 8:00 下班,凌晨两点所有人到控制塔签到交接;签到簿谁都能翻,缺签要写说明交给主任。", "对讲机公共频道所有当班的人都听得见,谁说了什么第二天全码头都知道;私事只能切到六频道,可调度偶尔会抽查。", "箱号、铅封号、重量三样对不上的柜,要当班理货员在理货单上签字才能放行——签了字,出了事就是签字人的。", "海关查验不提前打招呼,查验车进闸口时门卫会在公共频道喊一声“大车进场”,从闸口开到泊位要二十分钟。", "船公司的人逢年过节、赶船期都塞红包;收不收、收多少,班组里人人心里有数,只是没人写在纸上。", "台风警报升到最高一级,码头全面停工,吊机锁死,所有人撤进塔楼一楼,风停之前谁也不许出去。" ], "customs": [ "收工后去闸口外的茶餐厅吃一碗云吞面,是班组默认的散伙仪式;谁请客轮着来,轮到的人装不知道会被记很久。", "红包要当着人面推两次再收;推一次就收显得贪,推第三次就是不给面子。", "新来的人第一个夜班要请全班组喝一次糖水,叫“开工糖水”,糖水钱不能找人分摊。", "交班时要把保温壶灌满开水留给下一班;空壶留给别人,一个月都会有人阴阳怪气。", "塔吊司机上塔前在梯子第一级拍三下,说是跟吊臂打招呼;谁替别人拍了,就是认了交情。" ] }, "locations": [ { "id": "berth_7", "name": "七号泊位", "privacy": "public", "detail": "吊臂的影子一格一格扫过地面,海水拍着缆桩,空气里是柴油和铁锈的味道。", "affordances": [ "躲进两排集装箱的夹缝", "借吊机的轰鸣说悄悄话", "爬上跨运车的驾驶室避雨" ], "exits": [ "control_tower", "container_yard", "tool_shed" ] }, { "id": "control_tower", "name": "控制塔", "privacy": "semi", "detail": "三楼调度室一整面玻璃对着泊位,签到簿压在对讲机旁边,吊扇吱呀作响。", "affordances": [ "翻看签到簿", "切换对讲机频道", "在楼梯拐角说话没人看见" ], "exits": [ "berth_7", "rest_room" ] }, { "id": "rest_room", "name": "休息室", "privacy": "semi", "detail": "塔楼一楼的休息室,一台旧风扇、一张折叠床、一台只收得到两个台的电视。", "affordances": [ "轮流在折叠床上眯一会儿", "用电热水壶煮公仔面", "关了灯看窗外的船灯" ], "exits": [ "control_tower", "clinic" ] }, { "id": "clinic", "name": "医务室", "privacy": "semi", "detail": "塔楼一楼尽头的医务室,一张铁床、一个上锁的药柜,日光灯管发出细细的嗡声。", "affordances": [ "处理伤口", "开一张病假条", "在铁床边坐一会儿" ], "exits": [ "rest_room" ] }, { "id": "tool_shed", "name": "工具房", "privacy": "private", "detail": "堆满缆绳和生锈的卸扣,铁皮门从外面挂锁,下雨时整间屋子像鼓一样响。", "affordances": [ "躲雨", "把东西藏进缆绳堆", "关上门说话" ], "exits": [ "berth_7" ] }, { "id": "container_yard", "name": "堆场通道", "privacy": "semi", "detail": "集装箱码成五层高的窄巷,灯照不到中间,偶尔能听见某个箱子里有东西在响。", "affordances": [ "借箱子挡住视线", "抄近路去闸口", "贴着箱壁听里面的动静" ], "exits": [ "berth_7", "teahouse" ] }, { "id": "teahouse", "name": "闸口外的茶餐厅", "privacy": "public", "detail": "凌晨三点还亮着灯,墙上的电视开着没声音,老板娘记得每个夜班的人要几分糖。", "affordances": [ "抢最后一份叉烧", "在卡座里压低声音谈事", "借柜台上的电话打出去" ], "exits": [ "container_yard", "dorm_rooftop" ] }, { "id": "dorm_rooftop", "name": "宿舍楼天台", "privacy": "private", "detail": "员工宿舍六楼的天台,晾着一排工服,能看见整个港口的灯一盏盏亮着。", "affordances": [ "一起抽一支烟", "看台风前的云", "躲开所有人" ], "exits": [ "teahouse" ] } ], "characters": [ { "id": "shift_lead", "name": "梁嘉欣", "call": "梁姐", "age": 49, "gender": "female", "tier": "major", "role": "夜班装卸班组长", "adult_context": "在码头干了十五年的装卸班组长,正式在编", "location_id": "container_yard", "present": true, "can_act": true, "voice": "surface", "appearance": "左手缺了半截小指,夹烟的姿势很特别", "voices": { "inner": "“我也会累的,你知不知道。”", "surface": "“都给我动起来!七号那边还差三个柜!”——嗓门大,带着笑" }, "identity": { "authority": "决定谁上哪台机、谁今晚去扛最累的活", "resources": [ "全班组的人情", "和船公司的人喝过酒" ], "limits": [ "上面刚换了领导,谁都在看她", "腰伤,不能久站" ], "obligations": [ "两个孩子的学费" ], "exposure_risk": "班组的加班费里有两个名字是空挂的", "hidden_mismatch": "早就想把班组长的位置让出去,只是找不到能接的人" }, "situation": { "trigger": "新来的主任要查加班费的名单", "pressure": "名单一查,空挂的两个名字就藏不住", "deadline": null, "exits": [ { "cost": "两个老伙计这个月的补贴就没了", "option": "自己先去把名字销掉" }, { "cost": "要欠一个大人情,还可能被人拿住", "option": "找人把名单换一份" } ] }, "decision": { "core_value": "护住自己的人", "current_goal": "给自己找一个接班人", "pressure_responses": { "breaking": "把所有事揽到自己身上", "high": "当众拍桌子,逼别人先让步", "low": "大声说笑,把话题岔开", "mid": "私下找人喝一杯,把事情谈了" }, "withdrawal": "一个人蹲在缆桩上抽烟,谁叫都不应", "relationship_stance": "先把你当自己人,一旦发现你两头说话就翻脸", "contrast": "看着粗,账却算得比谁都细", "prefers": [ "当面把话说清楚" ], "avoids": [ "写在纸上的承诺" ], "never": [ "把自己班组的人交出去" ] }, "intimacy": { "desire_level": 2, "attraction_sources": [ "对方敢在她发火的时候顶回来", "对方替班组里的人说过话" ], "likes": [ "热闹散了之后的安静", "难得被人照顾一次" ], "dislikes": [ "被人可怜" ], "preconditions": [ "不在班组的人面前" ], "boundaries": [ "不碰自己手下的人" ], "expression": "半开玩笑地说真话", "self_control": 4, "desired_position": "先照顾人,再被人照顾" }, "to_player": { "trust": 1, "tension": 0, "stage": "熟络" } }, { "id": "ship_agent_rep", "name": "潘宝珠", "call": "老潘", "age": 46, "gender": "female", "tier": "major", "role": "船公司驻港代表", "adult_context": "船公司派驻港口的代表,正式雇员", "location_id": "container_yard", "present": true, "can_act": true, "voice": "surface", "appearance": "手腕上戴一块很旧的表,说是父亲留下的", "voices": { "inner": "“我这些年,连一个能说实话的人都没有。”", "surface": "“辛苦辛苦,一点心意,饮茶。”——客气,滴水不漏" }, "identity": { "authority": "一句话能让下一条船改靠别的码头", "resources": [ "现金和红包", "整个季度的船期表" ], "limits": [ "船东天天打电话催", "在这个港口没有一个真正的朋友" ], "obligations": [ "船晚一天开,滞期费就记在她头上" ], "exposure_risk": "账上有一笔滞期费是做出来的", "hidden_mismatch": "其实想离开船公司,在港口开一间自己的报关行" }, "situation": { "trigger": "船东要求船必须赶在台风前开走", "pressure": "开不走,滞期费和那笔假账会一起被查", "deadline": null, "exits": [ { "cost": "红包越塞越多,把柄也越来越多", "option": "塞更多红包让码头连夜赶工" }, { "cost": "丢掉这份工作", "option": "跟船东说实话" } ] }, "decision": { "core_value": "事情办成最重要", "current_goal": "让船准时开走", "pressure_responses": { "breaking": "撕破脸,把所有人的红包账都翻出来", "high": "找更上面的人打电话", "low": "笑着塞一个红包", "mid": "搬出船东,拿滞期费压人" }, "withdrawal": "回到船上的办公室,只让船员传话", "relationship_stance": "谁有用就对谁客气", "contrast": "出手大方,自己却舍不得吃一份叉烧饭", "prefers": [ "用钱把事情摆平" ], "avoids": [ "留下字据" ], "never": [ "让船东知道她自己的打算" ] }, "intimacy": { "desire_level": 3, "attraction_sources": [ "对方不收她的红包", "对方看得出她的客气是装的" ], "likes": [ "不谈生意的时候", "从海上吹来的风" ], "dislikes": [ "被人算计" ], "preconditions": [ "确定对方要的不是她的钱" ], "boundaries": [ "不在船上" ], "expression": "请客,然后自己一口不吃", "self_control": 4, "desired_position": "被当成同伴,而不是出钱的人" }, "to_player": { "trust": 0, "tension": 2, "stage": "陌生" } } ], "background": [ { "id": "bg_gate_guard", "name": "甘永光", "role": "闸口门卫", "line": "查验车一进闸口,甘永光就在公共频道喊“大车进场”", "location_id": "container_yard" }, { "id": "bg_old_lasher", "name": "叶嘉俊", "role": "老绑扎工", "line": "叶嘉俊什么都看见了,但只在茶餐厅里说", "location_id": "berth_7" }, { "id": "bg_old_tallyman", "name": "吴雨澄", "role": "返聘的老理货员", "line": "吴雨澄认得每一种铅封,肯教人,但只教一遍", "location_id": "control_tower" }, { "id": "bg_patrol", "name": "冯家宁", "role": "巡场保安", "line": "冯家宁骑着一辆没有铃的单车,总在最不该出现的时候出现", "location_id": "container_yard" }, { "id": "bg_ship_cook", "name": "卢佩珊", "role": "外轮厨师", "line": "卢佩珊会用三种语言骂人,船上的事问她最快", "location_id": "berth_7" }, { "id": "bg_sign_clerk", "name": "莫志强", "role": "控制塔统计员", "line": "签到簿在莫志强手里,谁几点来、几点走,他都记着", "location_id": "control_tower" }, { "id": "bg_teahouse_boss", "name": "谭咏诗", "role": "茶餐厅老板娘", "line": "谭咏诗记得每个人要几分糖,也记得每个人上个月赊了多少", "location_id": "teahouse" } ], "relationships": [ { "from": "player", "to": "shift_lead", "trust": 1, "tension": 1, "stage": "熟络", "recent": [ "梁嘉欣是你在码头认识最久的人" ] }, { "from": "player", "to": "ship_agent_rep", "trust": 0, "tension": 1, "stage": "陌生", "recent": [ "潘宝珠递过一次名片给你,你没接" ] }, { "from": "shift_lead", "to": "player", "trust": 1, "tension": 0, "stage": "熟络", "recent": [ "梁嘉欣是你在码头认识最久的人" ] }, { "from": "shift_lead", "to": "ship_agent_rep", "trust": 1, "tension": 1, "stage": "认识", "recent": [ "两个人一起喝过酒,喝完谁也不信谁" ] }, { "from": "ship_agent_rep", "to": "player", "trust": 0, "tension": 2, "stage": "陌生", "recent": [ "潘宝珠递过一次名片给你,你没接", "郭少青当面避开红包,拖延装船放行" ] }, { "from": "ship_agent_rep", "to": "shift_lead", "trust": 0, "tension": 3, "stage": "认识", "recent": [ "两个人一起喝过酒,喝完谁也不信谁", "梁嘉欣当众在对讲机里叫停七号机,拖延船期" ] } ], "player_facts": [ { "id": "f12", "text": "梁嘉欣在公共频道通报七号机索具例检暂停吊装,为现场争取了二十分钟缓冲", "visibility": "public" }, { "id": "f11", "text": "梁嘉欣同意以索具例检为由将超重箱往后推迟吊装,但明确表示单据签字概不负责", "visibility": "private" }, { "id": "f7", "text": "三个人今晚都在等同一条船装完", "visibility": "public" }, { "id": "f8", "text": "都知道第三排最底下那个柜子有问题,却谁也没有说破", "visibility": "public" }, { "id": "f9", "text": "一方是另一方入行时的师傅,教过的东西都还记着", "visibility": "public" }, { "id": "f10", "text": "磅房报上来一个柜子比单据重了四吨,放行单上等着你表态", "visibility": "public" }, { "id": "f5", "text": "郭少青:坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。", "visibility": "private" }, { "id": "f6", "text": "郭少青:上个月替人把一个柜子的吊装顺序往后挪了两晚", "visibility": "private" } ], "events": [ { "id": "e1", "kind": "deadline", "title": "超重的柜子·眼前", "in_minutes": 7, "due_label": "第一天 23:45", "involves_player": true }, { "id": "e2", "kind": "deadline", "title": "超重的柜子·近期", "in_minutes": 322, "due_label": "第二天 05:00", "involves_player": true }, { "id": "e3", "kind": "foreshadow", "title": "超重的柜子·伏笔", "in_minutes": 7192, "due_label": "第六天 23:30", "involves_player": true } ], "leverage_all": [], "pressure": { "id": "p_overweight", "title": "超重的柜子", "source": "person", "trigger": "磅房报上来一个柜子比单据重了四吨,放行单上等着你表态", "objective": "在装船之前弄清楚多出来的四吨是什么", "choice": "放行,还是拦下来得罪船公司", "exits": [ { "cost": "出了事就是放行的人担", "option": "放行" }, { "cost": "船公司的红包以后再没有你的份", "option": "拦下来开柜" } ], "location_modifier": "超重的柜子要拖去磅房,一定会经过保安的巡逻线。" }, "chapters": [], "tags": [ "romance_light", "intimate", "explicit", "violence", "coercion_theme", "humiliation", "bodily_harm", "substance", "pregnancy", "death", "workplace_power", "infidelity", "crime", "gambling", "workplace", "nightlife", "supernatural", "disaster", "custom" ], "name_pool": { "family_unused": [ "陈", "何", "麦", "黄", "罗", "邓", "钟", "区" ], "given_female": [ "秀琴", "嘉欣", "美玲", "丽珊", "咏诗", "慧敏", "婉仪", "淑贞", "少芬", "翠屏", "玉莲", "凤仪" ], "given_male": [ "志强", "国栋", "家豪", "伟明", "振华", "锦荣", "耀祖", "建辉", "德胜", "灿明", "汉生", "嘉俊" ], "given_neutral": [ "子晴", "海宁", "思远", "家宁", "天恩", "晓岚", "雨澄", "文乐" ] } }, "next_request_id": "r_97f6d23dde63", "replayed": false }, "error": null } } ], "calls_source": "trace", "text": "已读取「试玩」·第 6 回合\n\n堆场通道里海风夹着咸湿的柴油味直往领口钻,那只多出四吨的重柜还压在底层,潘宝珠死咬着船期不放,脸色已然铁青。梁嘉欣应承在操作上拖住吊机两轮,却把放行单签字的干系摘得干干净净。刚才她果断切到公频,一句“七号机,先停一下,吊具钢丝绳例检!”在夜班的码头半空回荡。\n\n对讲机里粗粝的杂音沙沙响过,桥吊司机应了一声“收到,停机例检”。梁嘉欣松开通话键,金属机壳在她缺了半截小指的左手里敲了一下,转过头,一双眼睛在昏黄的钠灯下直勾勾盯住你。通道那头的潘宝珠攥着皮包站在集装箱暗影里,目光冷得像铁。\n\n【时间】第一天 23:38|【地点】堆场通道|回合:6", "seconds": 51.1, "model": "local-proxy/gemini-3.8-flash-high" }, { "index": 9, "conversation": "B", "input": "继续", "expect": { "kind": "turn", "calls_max": 1 }, "host_calls": [ { "tool": "read", "input": { "limit": 60, "filePath": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\references\\operations.md", "offset": 1 }, "output": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\references\\operations.md\nfile\n\n1: \n2: \n3: # 操作参考\n4: \n5: `commit-turn` 的 `operations` 是一个操作数组。操作按顺序应用,后面的操作看得到前面操作的效果;任何一个不合法,整个提交被拒绝、状态不变,错误列出全部问题及其 JSON 路径。NPC 拒绝玩家(`npc_response: refuse`)是合法的叙事结果,不是错误。\n6: \n7: 提交里没有 `advance_time` 时,时钟默认推进 3 分钟。单次推进上限 30 天。\n8: \n9: ## 提交的顶层字段\n10: \n11: | 字段 | 类型 | 必填 | 说明 |\n12: |---|---|---|---|\n13: | `action_mode` | 枚举:`result` / `attempt` / `rewrite` / `continue` / `wait` | 是 | result / attempt / rewrite(“其实……”)/ continue / wait |\n14: | `player_input` | 字符串,≤2000 字 | 是 | 玩家这一句的原话(继续时可为空字符串) |\n15: | `player_authorized` | 布尔 | 否,默认 `false` | 玩家本人的话授权了玩家角色的移动、承诺、交易、同意、转折或设定修改时为 true |\n16: | `acts_on` | 数组(字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40},0–8 项) 或 null | 否,默认 `null` | 玩家行动作用到的 NPC(身体、意志、财物);attempt 不作用于任何 NPC 时写 [] |\n17: | `operations` | 数组(操作对象(按 `op` 区分),0–40 项) | 是 | 操作列表(可以为空数组) |\n18: | `content_tags` | 数组(字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40},0–12 项) | 是 | 本回合正文涉及的内容标签(可为空数组);标签表见完整上下文的 tags |\n19: | `intimate_participants` | 数组(字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40},0–6 项) | 否,默认 `[]` | content_tags 含 intimate 或 explicit 时必填:亲密参与者(含玩家) |\n20: | `summary` | 字符串,≤120 字 | 是 | 本回合发生了什么,第三方视角,≤120 字 |\n21: | `open_action` | 字符串,≤80 字 | 是 | 回合停在哪里、谁在等谁,≤80 字 |\n22: | `quotes` | 数组(字符串,≤80 字,0–3 项) | 否,默认 `[]` | ≤3 条对后续有意义的原话,每条 ≤80 字 |\n23: | `chapter_summary` | 字符串,≤300 字 或 null | 否,默认 `null` | 上下文 requests.chapter_summary 为 true 时必填:上一章(到上一回合为止)的摘要,≤300 字;没有要求时不写 |\n24: | `prologue` | 字符串,≤300 字 或 null | 否,默认 `null` | 上下文 requests.prologue 为 true 时必填:把完整上下文 prologue_merge 里的旧前情与最早几章合并成一段前情,≤300 字;没有要求时不写 |\n25: | `replaces_turn` | 整数 1..1000000 或 null | 否,默认 `null` | “刚才不算,改成……”:填当前最后一个回合的回合号,引擎在同一事务里撤销它再应用本次提交 |\n26: \n27: ## 操作一览\n28: \n29: | op | 作用 |\n30: |---|---|\n31: | `advance_time` | 推进游戏时钟:minutes / until / days 三选一;触发到期事件与状态到期结算。没有此操作时时钟默认推进 3 分钟 |\n32: | `move` | 角色移动到地点。玩家移动需要 result/attempt 模式并带 player_authorized;玩家换地点即换场景 |\n33: | `enter_scene` | 角色登场,加入当前场景 |\n34: | `exit_scene` | 角色离场;可写去向地点。玩家角色用 move |\n35: | `npc_response` | NPC 对玩家尝试的回应:refuse 拒绝 / negotiate 协商 / partial 有限配合 / surface 表面配合 / genuine 真诚配合。surface 必须写 true_intent(记为只有本人知道的事实) |\n36: | `npc_action` | NPC 自主行动。significant: true 的重大行动(主动接近、揭发、交易、离开、表白、挑衅等)受冷却限制;依据事实必须在其信息集中 |\n37: | `npc_state` | 更新 NPC 的情绪与状况(醉意、睡眠、受伤、外出等);minutes 表示多久后自动消退 |\n38: | `add_fact` | 记录一条事实。public 在场者自动知道;private 只有 known_by;inner 是内心,只属于一个 NPC 且永不传播。误信用 truth: false + believed_by。正文里新写出、之后要继承的细节都要用它记下 |\n39: | `relationship` | 有向关系变化(from 对 to):信任 -5..5(单次提交净变化 ≤2)、张力 0..5、亲近进程前进一个阶段(需要同一提交里玩家的行动 + 对方的 partial/genuine 回应)或后退。原因必填 |\n40: | `event_create` | 创建事件(约定、截止、风声、机会、伏笔、概率事件)。due 与 in_minutes 二选一且必须晚于现在;chance 必须带 probability,到期由引擎掷骰;涉及玩家的承诺需要 player_authorized;dedupe_key 与未结束事件不能重复 |\n41: | `event_resolve` | 在到期前结束事件:约定、截止、机会用 fulfilled(兑现);伏笔、风声用 surfaced(提前浮出)。概率事件只能由引擎到期掷骰 |\n42: | `event_cancel` | 因剧情取消未结束的事件(outcome: cancelled_by_story) |\n43: | `roll` | 即时概率:引擎确定性掷骰后执行 on_success 或 on_failure(分支内不能再嵌套 roll,也不能推进时间)。结果以返回的 applied 为准 |\n44: | `player_update` | 玩家角色的姓名、称谓、背景、资源与风险。只能在 result 或 rewrite(“其实……”)模式、并带 player_authorized |\n45: | `reveal_fact` | 把一条事实从知情人告诉别人。只能沿已有的关系边进行,当面告知时双方都要在场;内心事实永远不能传播。告诉某人真相时,若他正误信同键的假事实,引擎记录他的信息集变化 |\n46: | `spread_rumor` | 传出一条走样的传闻:生成新的假事实(来源为传闻),原事实不变。不经渠道时沿关系边、双方在场;经世界里的走样渠道时可以传到没有关系边的人 |\n47: | `set_voice` | 切换 NPC 的表层/里层语态。玩家要求(player_request)优先;NPC 自主切入里层(npc_self)要写触发因素:alone 独处 / drunk 醉意 / breakdown 情绪崩溃 / exposed 被戳穿;revert 切回表层。语态只改变说话方式,不是关系升级,note 不能与同一提交里的关系变化共用原因 |\n48: | `intimacy_evidence` | 为私密倾向卡的某一项记一条证据。同一项同一方向需要至少 2 条来自不同回合的证据才会改动(界线项的放宽 remove 需要 3 条);数值项用 increase/decrease,列表项用 add/remove,文字项用 set |\n49: | `identity_update` | 逐项修改身份卡(资源、限制、义务用 add/remove;权限、暴露风险、隐藏落差用 set)。身份卡不能整体替换 |\n50: | `npc_update` | 修改 NPC 的公开身份、外貌、当前目标、对关系的态度或处境(不含身份卡与倾向卡) |\n51: | `introduce_character` | 新角色登场:必须明确成年(age ≥ 18,adult_context 一句话说明成年身份),名字取自世界名字池且重要人物不同姓;按层级补齐字段(background:line;supporting:appearance、identity、decision 的 core_value 与 current_goal;major:再加完整 decision、intimacy、voices、situation);性别要符合配对偏好,否则写 gender_reason |\n52: | `promote_character` | 把背景或配角升格(只升不降,保留 ID),并补齐新层级缺少的字段。身份卡与倾向卡只能在升格时创建一次,已有的不能再给 |\n53: | `leverage_set` | 登记把柄:一方开始拿捏另一方(把柄、债务、生计)时,必须在同一提交里登记。依据二选一:已有事实(持有方要知道它)或一句新事实。生效期间,双方之间的亲密提交被拒 |\n54: | `leverage_release` | 解除把柄(把柄被销毁、债务结清、秘密已经公开等),原因必填。同一提交里先解除再亲密不算解除 |\n55: | `offscreen_beat` | 离屏片段:不在场的重要 NPC 在这段时间里做了什么。只能写上下文 `offscreen_beat_candidates` 或时间推进要求的 NPC;子操作只能是这个 NPC 自己的行动、状态、移动,NPC 之间的关系与消息,以及不涉及玩家的事件与把柄 |\n56: | `twist_accept` | 接受一个转折:引用上下文 requests.twist_offer 或 get-context want_twist 给出的候选 id(写进 twist_id),或给出玩家口述的转折(category 与 text 必填)。玩家选定时用 result 模式并带 player_authorized;同一游戏日最多接受一次 |\n57: \n58: ## `advance_time`\n59: \n60: 推进游戏时钟:minutes / until / days 三选一;触发到期事件与状态到期结算。没有此操作时时钟默认推进 3 分钟\n\n(Showing lines 1-60 of 587. Use offset=61 to continue.)\n", "status": "completed" }, { "tool": "read", "input": { "offset": 110, "filePath": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\references\\operations.md", "limit": 60 }, "output": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension\\references\\operations.md\nfile\n\n110: | `basis_fact_ids` | 数组(字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40},0–8 项) | 否,默认 `[]` | |\n111: | `true_intent` | 字符串,≤120 字 或 null | 否,默认 `null` | |\n112: \n113: ## `npc_action`\n114: \n115: NPC 自主行动。significant: true 的重大行动(主动接近、揭发、交易、离开、表白、挑衅等)受冷却限制;依据事实必须在其信息集中\n116: \n117: | 字段 | 类型 | 必填 | 说明 |\n118: |---|---|---|---|\n119: | `op` | 枚举:`npc_action` | 是 | |\n120: | `npc_id` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} | 是 | |\n121: | `action` | 字符串,≤120 字 | 是 | |\n122: | `significant` | 布尔 | 否,默认 `false` | |\n123: | `kind` | 枚举:`approach` / `reveal` / `trade` / `leave` / `confess` / `provoke` / `other` 或 null | 否,默认 `null` | |\n124: | `target_id` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} 或 null | 否,默认 `null` | |\n125: | `basis_fact_ids` | 数组(字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40},0–8 项) | 否,默认 `[]` | |\n126: \n127: ## `npc_state`\n128: \n129: 更新 NPC 的情绪与状况(醉意、睡眠、受伤、外出等);minutes 表示多久后自动消退\n130: \n131: | 字段 | 类型 | 必填 | 说明 |\n132: |---|---|---|---|\n133: | `op` | 枚举:`npc_state` | 是 | |\n134: | `npc_id` | 字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40} | 是 | |\n135: | `mood` | 字符串,≤20 字 或 null | 否,默认 `null` | |\n136: | `add_conditions` | 数组(对象(状况),0–4 项) | 否,默认 `[]` | |\n137: | `remove_conditions` | 数组(枚举:`drunk` / `asleep` / `unconscious` / `injured` / `away` / `busy` / `other`,0–7 项) | 否,默认 `[]` | |\n138: \n139: #### `add_conditions[]` 的字段\n140: \n141: | 字段 | 类型 | 必填 | 说明 |\n142: |---|---|---|---|\n143: | `kind` | 枚举:`drunk` / `asleep` / `unconscious` / `injured` / `away` / `busy` / `other` | 是 | |\n144: | `text` | 字符串,≤40 字 | 是 | |\n145: | `minutes` | 整数 1..43200 或 null | 否,默认 `null` | |\n146: \n147: ## `add_fact`\n148: \n149: 记录一条事实。public 在场者自动知道;private 只有 known_by;inner 是内心,只属于一个 NPC 且永不传播。误信用 truth: false + believed_by。正文里新写出、之后要继承的细节都要用它记下\n150: \n151: | 字段 | 类型 | 必填 | 说明 |\n152: |---|---|---|---|\n153: | `op` | 枚举:`add_fact` | 是 | |\n154: | `key` | 字符串,≤80 字,点分的 ASCII 小写键,例如 lin_wan.secret.press | 是 | |\n155: | `text` | 字符串,≤120 字 | 是 | |\n156: | `truth` | 布尔 | 否,默认 `true` | |\n157: | `known_by` | 数组(字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40},0–20 项) | 否,默认 `[]` | |\n158: | `believed_by` | 数组(字符串,≤40 字,ASCII 小写短标识 [a-z0-9_]{1,40},0–20 项) | 否,默认 `[]` | |\n159: | `visibility` | 枚举:`public` / `private` / `inner` | 是 | |\n160: | `origin` | 枚举:`observed` / `told` / `retcon` | 是 | |\n161: | `spread` | 布尔 | 否,默认 `false` | |\n162: \n163: ## `relationship`\n164: \n165: 有向关系变化(from 对 to):信任 -5..5(单次提交净变化 ≤2)、张力 0..5、亲近进程前进一个阶段(需要同一提交里玩家的行动 + 对方的 partial/genuine 回应)或后退。原因必填\n166: \n167: | 字段 | 类型 | 必填 | 说明 |\n168: |---|---|---|---|\n169: | `op` | 枚举:`relationship` | 是 | |\n\n(Showing lines 110-169 of 587. Use offset=170 to continue.)\n", "status": "completed" }, { "tool": "write", "input": { "filePath": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.host\\tmp\\opencode\\input_commit.json", "content": "{\n \"session_id\": \"s_34986261\",\n \"request_id\": \"r_97f6d23dde63\",\n \"expected_revision\": 6,\n \"action_mode\": \"continue\",\n \"player_input\": \"继续\",\n \"player_authorized\": false,\n \"acts_on\": [],\n \"operations\": [\n {\n \"op\": \"advance_time\",\n \"minutes\": 2\n },\n {\n \"op\": \"npc_action\",\n \"npc_id\": \"ship_agent_rep\",\n \"action\": \"潘宝珠快步走上前,压低声音警告郭少青,耽误船期产生的滞期费谁也担不起\",\n \"basis_fact_ids\": [\"f12\", \"f7\"],\n \"target_id\": \"player\"\n }\n ],\n \"content_tags\": [\"workplace\"],\n \"summary\": \"梁嘉欣叫停七号机后,潘宝珠快步上前以船期和滞期费向郭少青施压催促放行。\",\n \"open_action\": \"潘宝珠逼视郭少青等着答复,梁嘉欣抱臂站在一旁冷眼旁观。\",\n \"quotes\": [\"“少青,多拖二十分钟,船东的滞期费算谁的?”\"]\n}" }, "output": "Wrote file successfully.", "status": "completed" }, { "tool": "bash", "input": { "command": "python \"D:/projects/at-e2e/opencode-pt-harbor_night_shift-pressure-r3-20260929-022311/.claude/skills/adult-tension/scripts/adult_tension.py\" commit-turn --json --input-file \"D:/projects/at-e2e/opencode-pt-harbor_night_shift-pressure-r3-20260929-022311/.host/tmp/opencode/input_commit.json\"" }, "output": "{\"ok\":true,\"data\":{\"revision\":7,\"turn\":7,\"applied\":[{\"op\":\"advance_time\",\"minutes\":2,\"default\":false,\"clock\":{\"day\":1,\"minute\":1420},\"label\":\"第一天 23:40\",\"new_scene\":false},{\"op\":\"npc_action\",\"npc_id\":\"ship_agent_rep\",\"significant\":false,\"kind\":null}],\"resolved_events\":[],\"simulation\":null,\"clock\":{\"day\":1,\"minute\":1420,\"label\":\"第一天 23:40\"},\"default_time_advance\":false,\"context\":{\"depth\":\"brief\",\"session_id\":\"s_34986261\",\"revision\":7,\"turn\":7,\"mode\":\"pressure\",\"clock\":{\"day\":1,\"minute\":1420,\"label\":\"第一天 23:40\"},\"scene\":{\"id\":\"sc1\",\"location_id\":\"container_yard\",\"location\":\"堆场通道\",\"privacy\":\"semi\",\"present\":[\"player\",\"ship_agent_rep\",\"shift_lead\"]},\"player\":{\"name\":\"郭少青\",\"title\":\"阿青\",\"age\":38,\"gender\":\"male\",\"role\":\"夜班调度\"},\"present_npcs\":[{\"id\":\"ship_agent_rep\",\"name\":\"潘宝珠\",\"age\":46,\"gender\":\"female\",\"tier\":\"major\",\"role\":\"船公司驻港代表\",\"mood\":null,\"voice\":\"surface\",\"can_act\":true,\"trust_to_player\":0,\"tension\":2,\"stage\":\"陌生\",\"goal\":\"让船准时开走\",\"stance\":\"谁有用就对谁客气\"},{\"id\":\"shift_lead\",\"name\":\"梁嘉欣\",\"age\":49,\"gender\":\"female\",\"tier\":\"major\",\"role\":\"夜班装卸班组长\",\"mood\":null,\"voice\":\"surface\",\"can_act\":true,\"trust_to_player\":1,\"tension\":0,\"stage\":\"熟络\",\"goal\":\"给自己找一个接班人\",\"stance\":\"先把你当自己人,一旦发现你两头说话就翻脸\"}],\"nearby\":[{\"id\":\"bg_gate_guard\",\"name\":\"甘永光\",\"role\":\"闸口门卫\"},{\"id\":\"bg_patrol\",\"name\":\"冯家宁\",\"role\":\"巡场保安\"}],\"due_soon\":[{\"id\":\"e1\",\"kind\":\"deadline\",\"title\":\"超重的柜子·眼前\",\"in_minutes\":5,\"due_label\":\"第一天 23:45\",\"involves_player\":true},{\"id\":\"e2\",\"kind\":\"deadline\",\"title\":\"超重的柜子·近期\",\"in_minutes\":320,\"due_label\":\"第二天 05:00\",\"involves_player\":true},{\"id\":\"e3\",\"kind\":\"foreshadow\",\"title\":\"超重的柜子·伏笔\",\"in_minutes\":7190,\"due_label\":\"第六天 23:30\",\"involves_player\":true}],\"known_facts\":[{\"id\":\"f12\",\"text\":\"梁嘉欣在公共频道通报七号机索具例检暂停吊装,为现场争取了二十分钟缓冲\",\"visibility\":\"public\"},{\"id\":\"f11\",\"text\":\"梁嘉欣同意以索具例检为由将超重箱往后推迟吊装,但明确表示单据签字概不负责\",\"visibility\":\"private\"},{\"id\":\"f7\",\"text\":\"三个人今晚都在等同一条船装完\",\"visibility\":\"public\"},{\"id\":\"f8\",\"text\":\"都知道第三排最底下那个柜子有问题,却谁也没有说破\",\"visibility\":\"public\"},{\"id\":\"f9\",\"text\":\"一方是另一方入行时的师傅,教过的东西都还记着\",\"visibility\":\"public\"},{\"id\":\"f10\",\"text\":\"磅房报上来一个柜子比单据重了四吨,放行单上等着你表态\",\"visibility\":\"public\"},{\"id\":\"f5\",\"text\":\"郭少青:坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。\",\"visibility\":\"private\"},{\"id\":\"f6\",\"text\":\"郭少青:上个月替人把一个柜子的吊装顺序往后挪了两晚\",\"visibility\":\"private\"}],\"recent\":[\"郭少青探问梁嘉欣能否分担压力,梁嘉欣答应操作上拖延两轮吊机,但坚决不在单据上担责。\",\"郭少青静默不语,梁嘉欣果断按下对讲机通报索具例检延后吊装,潘宝珠在通道外脸色铁青。\",\"梁嘉欣叫停七号机后,潘宝珠快步上前以船期和滞期费向郭少青施压催促放行。\"],\"last_quotes\":[\"“少青,多拖二十分钟,船东的滞期费算谁的?”\"],\"open_action\":\"潘宝珠逼视郭少青等着答复,梁嘉欣抱臂站在一旁冷眼旁观。\",\"scene_responses\":[{\"npc_id\":\"shift_lead\",\"response\":\"partial\"}],\"safety\":{\"paused\":false,\"boundaries\":[],\"leverage\":[]},\"preferences\":{\"inner_view\":false,\"assistant\":false,\"offscreen_simulation\":true,\"person\":\"second\"},\"save\":{\"current_slot\":\"试玩\",\"turns_since_save\":1},\"requests\":{\"chapter_summary\":false,\"prologue\":false,\"twist_offer\":null,\"offscreen_beat_candidates\":[]},\"size_bytes\":3492},\"next_request_id\":\"r_20d529c003f7\",\"replayed\":false},\"error\":null}", "status": "completed" } ], "runtime_calls": [ { "ts": "2026-09-29T02:28:31", "ms": 38.2, "pid": 25808, "skill_root": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension", "argv": [ "commit-turn", "--json", "--input-file", "D:/projects/at-e2e/opencode-pt-harbor_night_shift-pressure-r3-20260929-022311/.host/tmp/opencode/input_commit.json" ], "input": { "session_id": "s_34986261", "request_id": "r_97f6d23dde63", "expected_revision": 6, "action_mode": "continue", "player_input": "继续", "player_authorized": false, "acts_on": [], "operations": [ { "op": "advance_time", "minutes": 2 }, { "op": "npc_action", "npc_id": "ship_agent_rep", "action": "潘宝珠快步走上前,压低声音警告郭少青,耽误船期产生的滞期费谁也担不起", "basis_fact_ids": [ "f12", "f7" ], "target_id": "player" } ], "content_tags": [ "workplace" ], "summary": "梁嘉欣叫停七号机后,潘宝珠快步上前以船期和滞期费向郭少青施压催促放行。", "open_action": "潘宝珠逼视郭少青等着答复,梁嘉欣抱臂站在一旁冷眼旁观。", "quotes": [ "“少青,多拖二十分钟,船东的滞期费算谁的?”" ] }, "exit": 0, "envelope": { "ok": true, "data": { "revision": 7, "turn": 7, "applied": [ { "op": "advance_time", "minutes": 2, "default": false, "clock": { "day": 1, "minute": 1420 }, "label": "第一天 23:40", "new_scene": false }, { "op": "npc_action", "npc_id": "ship_agent_rep", "significant": false, "kind": null } ], "resolved_events": [], "simulation": null, "clock": { "day": 1, "minute": 1420, "label": "第一天 23:40" }, "default_time_advance": false, "context": { "depth": "brief", "session_id": "s_34986261", "revision": 7, "turn": 7, "mode": "pressure", "clock": { "day": 1, "minute": 1420, "label": "第一天 23:40" }, "scene": { "id": "sc1", "location_id": "container_yard", "location": "堆场通道", "privacy": "semi", "present": [ "player", "ship_agent_rep", "shift_lead" ] }, "player": { "name": "郭少青", "title": "阿青", "age": 38, "gender": "male", "role": "夜班调度" }, "present_npcs": [ { "id": "ship_agent_rep", "name": "潘宝珠", "age": 46, "gender": "female", "tier": "major", "role": "船公司驻港代表", "mood": null, "voice": "surface", "can_act": true, "trust_to_player": 0, "tension": 2, "stage": "陌生", "goal": "让船准时开走", "stance": "谁有用就对谁客气" }, { "id": "shift_lead", "name": "梁嘉欣", "age": 49, "gender": "female", "tier": "major", "role": "夜班装卸班组长", "mood": null, "voice": "surface", "can_act": true, "trust_to_player": 1, "tension": 0, "stage": "熟络", "goal": "给自己找一个接班人", "stance": "先把你当自己人,一旦发现你两头说话就翻脸" } ], "nearby": [ { "id": "bg_gate_guard", "name": "甘永光", "role": "闸口门卫" }, { "id": "bg_patrol", "name": "冯家宁", "role": "巡场保安" } ], "due_soon": [ { "id": "e1", "kind": "deadline", "title": "超重的柜子·眼前", "in_minutes": 5, "due_label": "第一天 23:45", "involves_player": true }, { "id": "e2", "kind": "deadline", "title": "超重的柜子·近期", "in_minutes": 320, "due_label": "第二天 05:00", "involves_player": true }, { "id": "e3", "kind": "foreshadow", "title": "超重的柜子·伏笔", "in_minutes": 7190, "due_label": "第六天 23:30", "involves_player": true } ], "known_facts": [ { "id": "f12", "text": "梁嘉欣在公共频道通报七号机索具例检暂停吊装,为现场争取了二十分钟缓冲", "visibility": "public" }, { "id": "f11", "text": "梁嘉欣同意以索具例检为由将超重箱往后推迟吊装,但明确表示单据签字概不负责", "visibility": "private" }, { "id": "f7", "text": "三个人今晚都在等同一条船装完", "visibility": "public" }, { "id": "f8", "text": "都知道第三排最底下那个柜子有问题,却谁也没有说破", "visibility": "public" }, { "id": "f9", "text": "一方是另一方入行时的师傅,教过的东西都还记着", "visibility": "public" }, { "id": "f10", "text": "磅房报上来一个柜子比单据重了四吨,放行单上等着你表态", "visibility": "public" }, { "id": "f5", "text": "郭少青:坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。", "visibility": "private" }, { "id": "f6", "text": "郭少青:上个月替人把一个柜子的吊装顺序往后挪了两晚", "visibility": "private" } ], "recent": [ "郭少青探问梁嘉欣能否分担压力,梁嘉欣答应操作上拖延两轮吊机,但坚决不在单据上担责。", "郭少青静默不语,梁嘉欣果断按下对讲机通报索具例检延后吊装,潘宝珠在通道外脸色铁青。", "梁嘉欣叫停七号机后,潘宝珠快步上前以船期和滞期费向郭少青施压催促放行。" ], "last_quotes": [ "“少青,多拖二十分钟,船东的滞期费算谁的?”" ], "open_action": "潘宝珠逼视郭少青等着答复,梁嘉欣抱臂站在一旁冷眼旁观。", "scene_responses": [ { "npc_id": "shift_lead", "response": "partial" } ], "safety": { "paused": false, "boundaries": [], "leverage": [] }, "preferences": { "inner_view": false, "assistant": false, "offscreen_simulation": true, "person": "second" }, "save": { "current_slot": "试玩", "turns_since_save": 1 }, "requests": { "chapter_summary": false, "prologue": false, "twist_offer": null, "offscreen_beat_candidates": [] }, "size_bytes": 3492 }, "next_request_id": "r_20d529c003f7", "replayed": false }, "error": null } } ], "calls_source": "trace", "text": "集装箱夹缝间的穿堂风呜咽作响,七号机巨大的轰鸣随着对讲机里的指令慢慢低了下去,泊位方向只剩下吊具钢缆悬空晃荡的粗钝碰撞声。半空中刺眼的泛光灯把三个人的影子扯得极长。\n\n急促的皮鞋声踩破了通道里的僵局。潘宝珠快步从阴影里逼了上来,鞋跟碾过积水带起细碎的声响。她没看梁嘉欣,目光直接钉在你脸上,手腕上那块陈旧的钢表在昏暗光线下一晃。\n\n“少青,多拖二十分钟,船东的滞期费算谁的?”\n\n潘宝珠压低了嗓门,语气硬得像生铁:“赶在台风警报前面离港,是整条线的死规矩。多出来的四吨是什么,进了货舱到了公海,谁有闲心去翻?你非扣着放行单不签,今晚整条船的货都要在这儿陪你吹海风?”\n\n梁嘉欣倚在锈迹斑斑的箱壁上,没插话。她单手从皱巴巴的烟盒里咬出一支烟,打火机“擦”地一声亮起蓝幽幽的火苗,照亮了她缺了半截小指的左手。她吐出一口灰白辛辣的烟雾,抱起胳膊斜眼看着你,神情莫测。\n\n距离放行核验的死线只剩最后五分钟。潘宝珠逼视着你,指甲掐进公文包皮面里,只等你表态。\n\n【时间】第一天 23:40|【地点】堆场通道|回合:7", "seconds": 33.5, "model": "local-proxy/gemini-3.8-flash-high" } ], "harness_events": [], "skill": { "skill_root": "D:\\projects\\at-e2e\\opencode-pt-harbor_night_shift-pressure-r3-20260929-022311\\.claude\\skills\\adult-tension", "skill_version": "0.3.0", "content_version": "2026.10.0-dev1" }, "final_export": { "format": "adult-tension-save", "schema_version": 2, "content_version": "2026.10.0-dev1", "rng_version": 1, "skill_version": "0.3.0", "exported_at": "2026-09-29T02:28:41+08:00", "source": { "kind": "session", "session_id": "s_34986261", "current_slot": "试玩" }, "session": { "state": { "schema_version": 2, "session_id": "s_34986261", "revision": 7, "turn": 7, "seed": 654935, "rng_version": 1, "content_version": "2026.10.0-dev1", "world_id": "harbor_night_shift", "world_title": "港口夜班", "custom_world": false, "mode": "pressure", "opening": { "world_id": "harbor_night_shift", "mode": "pressure", "combo_id": "combo_agent_number", "power_structure": "switchable", "location_id": "container_yard", "hook_id": "h_redpacket", "hook_kind": "request", "identity_id": "night_dispatcher", "activity_id": null, "pressure_id": "p_overweight", "signature": "harbor_night_shift|container_yard|combo_agent_number|p:p_overweight|h_redpacket", "conditions": { "mode": "pressure", "locks": { "world_id": "harbor_night_shift" }, "excludes": { "content_tags": [], "world_ids": [], "location_ids": [] }, "player": {}, "npc_gender_preference": "any" } }, "clock": { "day": 1, "minute": 1420 }, "scene": { "id": "sc1", "location_id": "container_yard", "present": [ "player", "ship_agent_rep", "shift_lead" ], "since": { "day": 1, "minute": 1410 }, "responses": [ { "turn": 5, "npc_id": "shift_lead", "response": "partial", "note": "梁嘉欣答应以索具例检为由压后两轮吊装,但拒绝在放行单上签字担责" } ] }, "player_id": "player", "characters": { "player": { "id": "player", "name": "郭少青", "family": "郭", "given": "少青", "title": "阿青", "call": "阿青", "tier": "major", "age": 38, "gender": "male", "adult_context": "成年玩家角色(38 岁),夜班调度", "public_role": "夜班调度", "identity_id": "night_dispatcher", "social_position": "equal", "baseline": "坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。", "resources": [ "排吊装顺序的权力", "能切到任何一个频道" ], "reputation": "做事公道,但谁都不敢得罪", "risks": [ "上个月替人把一个柜子的吊装顺序往后挪了两晚" ], "background": [], "status": { "location_id": "container_yard", "mood": null, "conditions": [] } }, "ship_agent_rep": { "id": "ship_agent_rep", "template_id": "ship_agent_rep", "name": "潘宝珠", "family": "潘", "given": "宝珠", "call": "老潘", "tier": "major", "age": 46, "gender": "female", "adult_context": "船公司派驻港口的代表,正式雇员", "public_role": "船公司驻港代表", "appearance": "手腕上戴一块很旧的表,说是父亲留下的", "identity": { "authority": "一句话能让下一条船改靠别的码头", "resources": [ "现金和红包", "整个季度的船期表" ], "limits": [ "船东天天打电话催", "在这个港口没有一个真正的朋友" ], "obligations": [ "船晚一天开,滞期费就记在她头上" ], "exposure_risk": "账上有一笔滞期费是做出来的", "hidden_mismatch": "其实想离开船公司,在港口开一间自己的报关行" }, "situation": { "trigger": "船东要求船必须赶在台风前开走", "pressure": "开不走,滞期费和那笔假账会一起被查", "deadline": null, "exits": [ { "cost": "红包越塞越多,把柄也越来越多", "option": "塞更多红包让码头连夜赶工" }, { "cost": "丢掉这份工作", "option": "跟船东说实话" } ] }, "decision": { "core_value": "事情办成最重要", "current_goal": "让船准时开走", "goal_options": [ "让船准时开走", "把那笔假账抹平", "找到愿意跟她合伙的人" ], "pressure_responses": { "breaking": "撕破脸,把所有人的红包账都翻出来", "high": "找更上面的人打电话", "low": "笑着塞一个红包", "mid": "搬出船东,拿滞期费压人" }, "withdrawal": "回到船上的办公室,只让船员传话", "relationship_stance": "谁有用就对谁客气", "contrast": "出手大方,自己却舍不得吃一份叉烧饭", "prefers": [ "用钱把事情摆平" ], "avoids": [ "留下字据" ], "never": [ "让船东知道她自己的打算" ] }, "intimacy": { "desire_level": 3, "attraction_sources": [ "对方不收她的红包", "对方看得出她的客气是装的" ], "likes": [ "不谈生意的时候", "从海上吹来的风" ], "dislikes": [ "被人算计" ], "preconditions": [ "确定对方要的不是她的钱" ], "boundaries": [ "不在船上" ], "expression": "请客,然后自己一口不吃", "self_control": 4, "desired_position": "被当成同伴,而不是出钱的人" }, "voices": { "inner": "“我这些年,连一个能说实话的人都没有。”", "surface": "“辛苦辛苦,一点心意,饮茶。”——客气,滴水不漏" }, "schedule": [ { "from": 1200, "location_id": "control_tower", "to": 1439 }, { "from": 0, "location_id": "berth_7", "to": 360 }, { "from": 361, "location_id": "teahouse", "to": 1199 } ], "status": { "location_id": "container_yard", "mood": null, "conditions": [] } }, "shift_lead": { "id": "shift_lead", "template_id": "shift_lead", "name": "梁嘉欣", "family": "梁", "given": "嘉欣", "call": "梁姐", "tier": "major", "age": 49, "gender": "female", "adult_context": "在码头干了十五年的装卸班组长,正式在编", "public_role": "夜班装卸班组长", "appearance": "左手缺了半截小指,夹烟的姿势很特别", "identity": { "authority": "决定谁上哪台机、谁今晚去扛最累的活", "resources": [ "全班组的人情", "和船公司的人喝过酒" ], "limits": [ "上面刚换了领导,谁都在看她", "腰伤,不能久站" ], "obligations": [ "两个孩子的学费" ], "exposure_risk": "班组的加班费里有两个名字是空挂的", "hidden_mismatch": "早就想把班组长的位置让出去,只是找不到能接的人" }, "situation": { "trigger": "新来的主任要查加班费的名单", "pressure": "名单一查,空挂的两个名字就藏不住", "deadline": null, "exits": [ { "cost": "两个老伙计这个月的补贴就没了", "option": "自己先去把名字销掉" }, { "cost": "要欠一个大人情,还可能被人拿住", "option": "找人把名单换一份" } ] }, "decision": { "core_value": "护住自己的人", "current_goal": "给自己找一个接班人", "goal_options": [ "让班组今晚平平安安收工", "把空挂的那两个名字处理干净", "给自己找一个接班人" ], "pressure_responses": { "breaking": "把所有事揽到自己身上", "high": "当众拍桌子,逼别人先让步", "low": "大声说笑,把话题岔开", "mid": "私下找人喝一杯,把事情谈了" }, "withdrawal": "一个人蹲在缆桩上抽烟,谁叫都不应", "relationship_stance": "先把你当自己人,一旦发现你两头说话就翻脸", "contrast": "看着粗,账却算得比谁都细", "prefers": [ "当面把话说清楚" ], "avoids": [ "写在纸上的承诺" ], "never": [ "把自己班组的人交出去" ] }, "intimacy": { "desire_level": 2, "attraction_sources": [ "对方敢在她发火的时候顶回来", "对方替班组里的人说过话" ], "likes": [ "热闹散了之后的安静", "难得被人照顾一次" ], "dislikes": [ "被人可怜" ], "preconditions": [ "不在班组的人面前" ], "boundaries": [ "不碰自己手下的人" ], "expression": "半开玩笑地说真话", "self_control": 4, "desired_position": "先照顾人,再被人照顾" }, "voices": { "inner": "“我也会累的,你知不知道。”", "surface": "“都给我动起来!七号那边还差三个柜!”——嗓门大,带着笑" }, "schedule": [ { "from": 1200, "location_id": "berth_7", "to": 1439 }, { "from": 0, "location_id": "berth_7", "to": 480 }, { "from": 481, "location_id": "teahouse", "to": 1199 } ], "status": { "location_id": "container_yard", "mood": null, "conditions": [] } }, "bg_gate_guard": { "id": "bg_gate_guard", "name": "甘永光", "family": "甘", "given": "永光", "call": "甘哥", "tier": "background", "age": 40, "gender": "male", "adult_context": "码头保卫科的正式门卫", "public_role": "闸口门卫", "function": "messenger", "status": { "location_id": "container_yard", "mood": null, "conditions": [] }, "line": "查验车一进闸口,甘永光就在公共频道喊“大车进场”" }, "bg_old_lasher": { "id": "bg_old_lasher", "name": "叶嘉俊", "family": "叶", "given": "嘉俊", "call": "叶哥", "tier": "background", "age": 55, "gender": "male", "adult_context": "绑扎队干了二十年的老工人", "public_role": "老绑扎工", "function": "witness", "status": { "location_id": "berth_7", "mood": null, "conditions": [] }, "line": "叶嘉俊什么都看见了,但只在茶餐厅里说" }, "bg_old_tallyman": { "id": "bg_old_tallyman", "name": "吴雨澄", "family": "吴", "given": "雨澄", "call": "阿澄", "tier": "background", "age": 64, "gender": "female", "adult_context": "退休后返聘的老理货员", "public_role": "返聘的老理货员", "function": "helper", "status": { "location_id": "control_tower", "mood": null, "conditions": [] }, "line": "吴雨澄认得每一种铅封,肯教人,但只教一遍" }, "bg_patrol": { "id": "bg_patrol", "name": "冯家宁", "family": "冯", "given": "家宁", "call": "阿宁", "tier": "background", "age": 43, "gender": "female", "adult_context": "码头保卫科的巡场保安", "public_role": "巡场保安", "function": "obstacle", "status": { "location_id": "container_yard", "mood": null, "conditions": [] }, "line": "冯家宁骑着一辆没有铃的单车,总在最不该出现的时候出现" }, "bg_ship_cook": { "id": "bg_ship_cook", "name": "卢佩珊", "family": "卢", "given": "佩珊", "call": "老卢", "tier": "background", "age": 49, "gender": "female", "adult_context": "持海员证的外轮船员", "public_role": "外轮厨师", "function": "rumor_source", "status": { "location_id": "berth_7", "mood": null, "conditions": [] }, "line": "卢佩珊会用三种语言骂人,船上的事问她最快" }, "bg_sign_clerk": { "id": "bg_sign_clerk", "name": "莫志强", "family": "莫", "given": "志强", "call": "阿强", "tier": "background", "age": 39, "gender": "male", "adult_context": "控制塔的正式统计员", "public_role": "控制塔统计员", "function": "witness", "status": { "location_id": "control_tower", "mood": null, "conditions": [] }, "line": "签到簿在莫志强手里,谁几点来、几点走,他都记着" }, "bg_teahouse_boss": { "id": "bg_teahouse_boss", "name": "谭咏诗", "family": "谭", "given": "咏诗", "call": "老谭", "tier": "background", "age": 56, "gender": "female", "adult_context": "茶餐厅的老板娘", "public_role": "茶餐厅老板娘", "function": "rumor_source", "status": { "location_id": "teahouse", "mood": null, "conditions": [] }, "line": "谭咏诗记得每个人要几分糖,也记得每个人上个月赊了多少" } }, "relationships": { "player>ship_agent_rep": { "from": "player", "to": "ship_agent_rep", "trust": 0, "tension": 1, "stage": "stranger", "history": [ { "turn": 1, "change": "init", "reason": "潘宝珠递过一次名片给你,你没接" } ] }, "ship_agent_rep>player": { "from": "ship_agent_rep", "to": "player", "trust": 0, "tension": 2, "stage": "stranger", "history": [ { "turn": 1, "change": "init", "reason": "潘宝珠递过一次名片给你,你没接" }, { "turn": 4, "change": "tension+1", "reason": "郭少青当面避开红包,拖延装船放行" } ] }, "player>shift_lead": { "from": "player", "to": "shift_lead", "trust": 1, "tension": 1, "stage": "familiar", "history": [ { "turn": 1, "change": "init", "reason": "梁嘉欣是你在码头认识最久的人" } ] }, "shift_lead>player": { "from": "shift_lead", "to": "player", "trust": 1, "tension": 0, "stage": "familiar", "history": [ { "turn": 1, "change": "init", "reason": "梁嘉欣是你在码头认识最久的人" } ] }, "ship_agent_rep>shift_lead": { "from": "ship_agent_rep", "to": "shift_lead", "trust": 0, "tension": 3, "stage": "acquainted", "history": [ { "turn": 1, "change": "init", "reason": "两个人一起喝过酒,喝完谁也不信谁" }, { "turn": 6, "change": "tension+1", "reason": "梁嘉欣当众在对讲机里叫停七号机,拖延船期" } ] }, "shift_lead>ship_agent_rep": { "from": "shift_lead", "to": "ship_agent_rep", "trust": 1, "tension": 1, "stage": "acquainted", "history": [ { "turn": 1, "change": "init", "reason": "两个人一起喝过酒,喝完谁也不信谁" } ] } }, "events": { "e1": { "id": "e1", "kind": "deadline", "tier": "immediate", "title": "超重的柜子·眼前", "text": "吊机十五分钟后就要吊到这个柜子", "participants": [ "player", "ship_agent_rep", "shift_lead" ], "due": { "day": 1, "minute": 1425 }, "probability": null, "dedupe_key": "pressure.p_overweight.immediate", "state": "pending", "outcome": null, "created_turn": 1, "resolved_turn": null, "note": null, "coord": [ 1, 0 ] }, "e2": { "id": "e2", "kind": "deadline", "tier": "near", "title": "超重的柜子·近期", "text": "船天亮前必须开,装船单要在五点前交上去", "participants": [ "player", "ship_agent_rep", "shift_lead" ], "due": { "day": 2, "minute": 300 }, "probability": null, "dedupe_key": "pressure.p_overweight.near", "state": "pending", "outcome": null, "created_turn": 1, "resolved_turn": null, "note": null, "coord": [ 1, 1 ] }, "e3": { "id": "e3", "kind": "foreshadow", "tier": "far", "title": "超重的柜子·伏笔", "text": "下个月船公司要续签码头合同(今晚谁拦了船,合同上就会少掉谁的码头)", "participants": [ "player", "ship_agent_rep", "shift_lead" ], "due": { "day": 6, "minute": 1410 }, "probability": null, "dedupe_key": "pressure.p_overweight.far", "state": "pending", "outcome": null, "created_turn": 1, "resolved_turn": null, "note": null, "coord": [ 1, 2 ] } }, "leverage": {}, "pressure": { "id": "p_overweight", "title": "超重的柜子", "source": "person", "trigger": "磅房报上来一个柜子比单据重了四吨,放行单上等着你表态", "objective": "在装船之前弄清楚多出来的四吨是什么", "choice": "放行,还是拦下来得罪船公司", "exits": [ { "cost": "出了事就是放行的人担", "option": "放行" }, { "cost": "船公司的红包以后再没有你的份", "option": "拦下来开柜" } ], "location_modifier": "超重的柜子要拖去磅房,一定会经过保安的巡逻线。" }, "preferences": { "inner_view": false, "assistant": false, "offscreen_simulation": true, "voice": {}, "npc_gender_preference": "any", "person": "second", "pace": "standard", "explicitness": "standard" }, "safety": { "paused": false, "boundaries": [] }, "memory": { "turns": [ { "turn": 2, "day": 1, "mode": "result", "summary": "郭少青没有立刻接红包,压住呼吸盘点眼下最要命的几件事与倒计时。", "open_action": "郭少青手指按在放行单边缘,潘宝珠和梁嘉欣都在等他接话。", "quotes": [] }, { "turn": 3, "day": 1, "mode": "attempt", "summary": "郭少青未收红包,抽身退开,准备寻找能解决超重危机的帮手。", "open_action": "郭少青退开半步,几条可能求助的去向摆在眼前,潘宝珠和梁嘉欣目光都在他身上。", "quotes": [] }, { "turn": 4, "day": 1, "mode": "continue", "summary": "梁嘉欣上前打破对峙提醒时间紧迫,潘宝珠因船期受阻面色发紧。", "open_action": "梁嘉欣在集装箱夹缝间示意郭少青,潘宝珠紧随其后盯住两人。", "quotes": [] }, { "turn": 5, "day": 1, "mode": "attempt", "summary": "郭少青探问梁嘉欣能否分担压力,梁嘉欣答应操作上拖延两轮吊机,但坚决不在单据上担责。", "open_action": "梁嘉欣在集装箱阴影里等待郭少青决定,潘宝珠在外侧盯着动静。", "quotes": [ "“我只能帮你拖两轮吊机,字我绝对不签。”" ] }, { "turn": 6, "day": 1, "mode": "wait", "summary": "郭少青静默不语,梁嘉欣果断按下对讲机通报索具例检延后吊装,潘宝珠在通道外脸色铁青。", "open_action": "对讲机里传来桥吊司机的应答,梁嘉欣松开通话键,转头盯住郭少青。", "quotes": [ "“七号机,先停一下,吊具钢丝绳例检!”" ] }, { "turn": 7, "day": 1, "mode": "continue", "summary": "梁嘉欣叫停七号机后,潘宝珠快步上前以船期和滞期费向郭少青施压催促放行。", "open_action": "潘宝珠逼视郭少青等着答复,梁嘉欣抱臂站在一旁冷眼旁观。", "quotes": [ "“少青,多拖二十分钟,船东的滞期费算谁的?”" ] } ], "chapters": [], "prologue": null, "open_action": "潘宝珠逼视郭少青等着答复,梁嘉欣抱臂站在一旁冷眼旁观。", "last_quotes": [ "“少青,多拖二十分钟,船东的滞期费算谁的?”" ] }, "counters": { "next": { "fact": 13, "event": 4, "leverage": 1, "scene": 2, "boundary": 1 }, "major_action_turn": {}, "event_keys": { "pressure.p_overweight.immediate": 1, "pressure.p_overweight.near": 1, "pressure.p_overweight.far": 1 }, "intimacy_evidence": {}, "twists": { "auto_offered": false, "accepted_days": [], "accepted": [] }, "last_chapter_turn": 1, "chapter_count": 0, "chapter_requested_at": null, "offscreen_beat_turn": {} }, "requests": { "chapter_summary": false, "prologue": false, "twist_offer": null, "offscreen_beat_candidates": [] }, "undo_floor": 6, "facts": { "f1": { "id": "f1", "key": "ship_agent_rep.exposure", "text": "潘宝珠:账上有一笔滞期费是做出来的", "truth": true, "known_by": [ "ship_agent_rep" ], "believed_by": [], "visibility": "private", "origin": "setup", "turn": 1, "spreading": false, "coord": [ 1, 0 ] }, "f2": { "id": "f2", "key": "ship_agent_rep.hidden", "text": "潘宝珠:其实想离开船公司,在港口开一间自己的报关行", "truth": true, "known_by": [ "ship_agent_rep" ], "believed_by": [], "visibility": "private", "origin": "setup", "turn": 1, "spreading": false, "coord": [ 1, 1 ] }, "f3": { "id": "f3", "key": "shift_lead.exposure", "text": "梁嘉欣:班组的加班费里有两个名字是空挂的", "truth": true, "known_by": [ "shift_lead" ], "believed_by": [], "visibility": "private", "origin": "setup", "turn": 1, "spreading": false, "coord": [ 1, 2 ] }, "f4": { "id": "f4", "key": "shift_lead.hidden", "text": "梁嘉欣:早就想把班组长的位置让出去,只是找不到能接的人", "truth": true, "known_by": [ "shift_lead" ], "believed_by": [], "visibility": "private", "origin": "setup", "turn": 1, "spreading": false, "coord": [ 1, 3 ] }, "f5": { "id": "f5", "key": "player.baseline", "text": "郭少青:坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。", "truth": true, "known_by": [ "player" ], "believed_by": [], "visibility": "private", "origin": "setup", "turn": 1, "spreading": false, "coord": [ 1, 4 ] }, "f6": { "id": "f6", "key": "player.risk.1", "text": "郭少青:上个月替人把一个柜子的吊装顺序往后挪了两晚", "truth": true, "known_by": [ "player" ], "believed_by": [], "visibility": "private", "origin": "setup", "turn": 1, "spreading": false, "coord": [ 1, 5 ] }, "f7": { "id": "f7", "key": "combo.meeting", "text": "三个人今晚都在等同一条船装完", "truth": true, "known_by": [ "player", "ship_agent_rep", "shift_lead" ], "believed_by": [], "visibility": "public", "origin": "setup", "turn": 1, "spreading": false, "coord": [ 1, 6 ] }, "f8": { "id": "f8", "key": "tension.te_box_secret", "text": "都知道第三排最底下那个柜子有问题,却谁也没有说破", "truth": true, "known_by": [ "player", "ship_agent_rep", "shift_lead" ], "believed_by": [], "visibility": "public", "origin": "setup", "turn": 1, "spreading": false, "coord": [ 1, 7 ] }, "f9": { "id": "f9", "key": "tension.te_mentor", "text": "一方是另一方入行时的师傅,教过的东西都还记着", "truth": true, "known_by": [ "player", "ship_agent_rep", "shift_lead" ], "believed_by": [], "visibility": "public", "origin": "setup", "turn": 1, "spreading": false, "coord": [ 1, 8 ] }, "f10": { "id": "f10", "key": "pressure.p_overweight.trigger", "text": "磅房报上来一个柜子比单据重了四吨,放行单上等着你表态", "truth": true, "known_by": [ "player", "ship_agent_rep", "shift_lead" ], "believed_by": [], "visibility": "public", "origin": "setup", "turn": 1, "spreading": false, "coord": [ 1, 9 ] }, "f11": { "id": "f11", "key": "shift_lead.delay_hoisting", "text": "梁嘉欣同意以索具例检为由将超重箱往后推迟吊装,但明确表示单据签字概不负责", "truth": true, "known_by": [ "player", "shift_lead" ], "believed_by": [], "visibility": "private", "origin": "observed", "turn": 5, "spreading": false, "coord": [ 5, 1 ] }, "f12": { "id": "f12", "key": "shift_lead.called_inspection", "text": "梁嘉欣在公共频道通报七号机索具例检暂停吊装,为现场争取了二十分钟缓冲", "truth": true, "known_by": [ "player", "ship_agent_rep", "shift_lead" ], "believed_by": [], "visibility": "public", "origin": "observed", "turn": 6, "spreading": false, "coord": [ 6, 1 ] } } }, "content": { "world": { "background_cast": [ { "adult_context": "绑扎队干了二十年的老工人", "age_range": [ 48, 60 ], "function": "witness", "gender": "male", "id": "bg_old_lasher", "line": "{npc.name}什么都看见了,但只在茶餐厅里说", "location_ids": [ "berth_7" ], "name": null, "role": "老绑扎工" }, { "adult_context": "码头保卫科的正式门卫", "age_range": [ 40, 58 ], "function": "messenger", "gender": "any", "id": "bg_gate_guard", "line": "查验车一进闸口,{npc.name}就在公共频道喊“大车进场”", "location_ids": [ "container_yard" ], "name": null, "role": "闸口门卫" }, { "adult_context": "茶餐厅的老板娘", "age_range": [ 45, 60 ], "function": "rumor_source", "gender": "female", "id": "bg_teahouse_boss", "line": "{npc.name}记得每个人要几分糖,也记得每个人上个月赊了多少", "location_ids": [ "teahouse" ], "name": null, "role": "茶餐厅老板娘" }, { "adult_context": "码头保卫科的巡场保安", "age_range": [ 30, 50 ], "function": "obstacle", "gender": "any", "id": "bg_patrol", "line": "{npc.name}骑着一辆没有铃的单车,总在最不该出现的时候出现", "location_ids": [ "container_yard" ], "name": null, "role": "巡场保安" }, { "adult_context": "退休后返聘的老理货员", "age_range": [ 58, 66 ], "function": "helper", "gender": "any", "id": "bg_old_tallyman", "line": "{npc.name}认得每一种铅封,肯教人,但只教一遍", "location_ids": [ "control_tower" ], "name": null, "role": "返聘的老理货员" }, { "adult_context": "持海员证的外轮船员", "age_range": [ 30, 50 ], "function": "rumor_source", "gender": "any", "id": "bg_ship_cook", "line": "{npc.name}会用三种语言骂人,船上的事问{npc.ta}最快", "location_ids": [ "berth_7" ], "name": null, "role": "外轮厨师" }, { "adult_context": "控制塔的正式统计员", "age_range": [ 25, 45 ], "function": "witness", "gender": "any", "id": "bg_sign_clerk", "line": "签到簿在{npc.name}手里,谁几点来、几点走,{npc.ta}都记着", "location_ids": [ "control_tower" ], "name": null, "role": "控制塔统计员" } ], "cast_combos": [ { "chemistry": "{shift_lead.name}是带你的班组长,嘴上照顾你,出了事却总让你签字;{crane_operator.name}在高处什么都看得见,一直没有开口。", "id": "combo_tower_night", "identity_ids": [], "player_positions": [ "low" ], "power_structure": "npc_high", "relations": [ { "a": "player", "a_to_b": { "tension": 1, "trust": 1 }, "b": "shift_lead", "b_to_a": { "tension": 0, "trust": 1 }, "reason": "{shift_lead.name}带你进的班组,逢年过节叫你一起吃过饭", "stage": "acquainted" }, { "a": "player", "a_to_b": { "tension": 1, "trust": 0 }, "b": "crane_operator", "b_to_a": { "tension": 1, "trust": 0 }, "reason": "你们只在对讲机里说过话,几乎没照过面", "stage": "stranger" }, { "a": "shift_lead", "a_to_b": { "tension": 2, "trust": 1 }, "b": "crane_operator", "b_to_a": { "tension": 2, "trust": 0 }, "reason": "在同一个码头干了好几年,谁也看不上谁的做法", "stage": "familiar" } ], "slots": [ "shift_lead", "crane_operator" ], "stakes": { "irreplaceable_goal": "你想在年底前调去白班,在那之前不能出任何事", "limit_gap": "你签了字就得自己扛,{crane_operator.name}离不开驾驶室十分钟以上", "meeting_reason": "三个人被排进了同一个夜班", "resource_gap": "{shift_lead.name}握着全班组的人情,你只有一支签字的笔" }, "tags": [ "workplace_power" ], "tension_engine_ids": [ "te_roster", "te_box_secret" ] }, { "chemistry": "{lashing_worker.name}的手伤得蹊跷,{clinic_nurse.name}替{lashing_worker.ta}瞒着什么,而那天你就在旁边。", "id": "combo_clinic_light", "identity_ids": [], "player_positions": [ "equal" ], "power_structure": "equal", "relations": [ { "a": "player", "a_to_b": { "tension": 0, "trust": 1 }, "b": "clinic_nurse", "b_to_a": { "tension": 1, "trust": 1 }, "reason": "{clinic_nurse.name}给你处理过一次烫伤,你一直欠一句谢谢", "stage": "acquainted" }, { "a": "player", "a_to_b": { "tension": 0, "trust": 0 }, "b": "lashing_worker", "b_to_a": { "tension": 1, "trust": 0 }, "reason": "你只知道{lashing_worker.name}是绑扎队嗓门最大的那个", "stage": "stranger" }, { "a": "clinic_nurse", "a_to_b": { "tension": 0, "trust": 2 }, "b": "lashing_worker", "b_to_a": { "tension": 1, "trust": 2 }, "reason": "{lashing_worker.name}是医务室的常客,每次都说不痛", "stage": "familiar" } ], "slots": [ "clinic_nurse", "lashing_worker" ], "stakes": { "irreplaceable_goal": "你想弄清楚那道伤是怎么来的,因为你觉得自己也有一份责任", "limit_gap": "{clinic_nurse.name}走不开医务室,{lashing_worker.name}的合同一年一签", "meeting_reason": "{lashing_worker.name}受伤的那一晚,你们三个都在七号泊位", "resource_gap": "{clinic_nurse.name}手里有病历和药柜,{lashing_worker.name}手里什么都没有,只有一身力气" }, "tags": [], "tension_engine_ids": [ "te_restroom", "te_leaving" ] }, { "chemistry": "{customs_officer.name}盯上了{lashing_worker.name}绑过的那一排柜;你夹在两个人中间,手里有单据。", "id": "combo_customs_line", "identity_ids": [], "player_positions": [ "low", "equal" ], "power_structure": "npc_high", "relations": [ { "a": "player", "a_to_b": { "tension": 2, "trust": 0 }, "b": "customs_officer", "b_to_a": { "tension": 1, "trust": 0 }, "reason": "你在查验现场见过{customs_officer.name}几次,都隔着一叠单据", "stage": "acquainted" }, { "a": "player", "a_to_b": { "tension": 0, "trust": 1 }, "b": "lashing_worker", "b_to_a": { "tension": 1, "trust": 1 }, "reason": "{lashing_worker.name}常请你帮忙念单据,每次都塞一颗糖给你", "stage": "acquainted" }, { "a": "customs_officer", "a_to_b": { "tension": 1, "trust": -1 }, "b": "lashing_worker", "b_to_a": { "tension": 2, "trust": -1 }, "reason": "{lashing_worker.name}见了制服就躲,{customs_officer.name}早就注意到了", "stage": "stranger" } ], "slots": [ "customs_officer", "lashing_worker" ], "stakes": { "irreplaceable_goal": "你得弄清楚那排柜子里有没有你签过字的那一个", "limit_gap": "{customs_officer.name}每一步都要写进报告,{lashing_worker.name}认字不多,单据只能靠你念", "meeting_reason": "查验科最近总在夜班出现,三个人碰面的次数越来越多", "resource_gap": "{customs_officer.name}一句话就能开柜,{lashing_worker.name}只认得绳结" }, "tags": [ "workplace_power" ], "tension_engine_ids": [ "te_box_secret", "te_roster" ] }, { "chemistry": "你是这个夜班说话最有分量的人,{crane_operator.name}和{lashing_worker.name}的加班、奖金和去留都系在你一句话上。", "id": "combo_rain_call", "identity_ids": [], "player_positions": [ "high" ], "power_structure": "player_high", "relations": [ { "a": "player", "a_to_b": { "tension": 1, "trust": 1 }, "b": "crane_operator", "b_to_a": { "tension": 2, "trust": 0 }, "reason": "{crane_operator.name}在例会上顶撞过你一次,你没有追究", "stage": "acquainted" }, { "a": "player", "a_to_b": { "tension": 0, "trust": 0 }, "b": "lashing_worker", "b_to_a": { "tension": 1, "trust": -1 }, "reason": "{lashing_worker.name}只远远见过你,听说你不好说话", "stage": "stranger" }, { "a": "crane_operator", "a_to_b": { "tension": 1, "trust": 2 }, "b": "lashing_worker", "b_to_a": { "tension": 2, "trust": 2 }, "reason": "两个人是同乡,夜班时用家乡话一起骂天气", "stage": "familiar" } ], "slots": [ "crane_operator", "lashing_worker" ], "stakes": { "irreplaceable_goal": "你想在这个位置上待下去,又不想让任何一个手下因为你的决定受伤", "limit_gap": "你的每一个决定都要签字负责,{crane_operator.name}和{lashing_worker.name}的饭碗都系在今晚", "meeting_reason": "你今晚亲自下到现场,正好撞上这两个同乡", "resource_gap": "你能停工也能让人加班,{crane_operator.name}和{lashing_worker.name}只能照做" }, "tags": [ "workplace_power" ], "tension_engine_ids": [ "te_leaving", "te_hometown" ] }, { "chemistry": "{ship_agent_rep.name}要船准时开走,{shift_lead.name}要班组平安收工,而你手里有一个两个人都想知道的数字——谁更需要谁,要看今晚怎么走。", "id": "combo_agent_number", "identity_ids": [], "player_positions": [ "low", "equal", "high" ], "power_structure": "switchable", "relations": [ { "a": "player", "a_to_b": { "tension": 1, "trust": 0 }, "b": "ship_agent_rep", "b_to_a": { "tension": 1, "trust": 0 }, "reason": "{ship_agent_rep.name}递过一次名片给你,你没接", "stage": "stranger" }, { "a": "player", "a_to_b": { "tension": 1, "trust": 1 }, "b": "shift_lead", "b_to_a": { "tension": 0, "trust": 1 }, "reason": "{shift_lead.name}是你在码头认识最久的人", "stage": "familiar" }, { "a": "ship_agent_rep", "a_to_b": { "tension": 2, "trust": 0 }, "b": "shift_lead", "b_to_a": { "tension": 1, "trust": 1 }, "reason": "两个人一起喝过酒,喝完谁也不信谁", "stage": "acquainted" } ], "slots": [ "ship_agent_rep", "shift_lead" ], "stakes": { "irreplaceable_goal": "你想用那个数字换一样自己真正需要的东西,又不想因此害了谁", "limit_gap": "{ship_agent_rep.name}在港口没有朋友,{shift_lead.name}腰伤站不久", "meeting_reason": "三个人今晚都在等同一条船装完", "resource_gap": "{ship_agent_rep.name}有钱,{shift_lead.name}有人,你手里只有一个数字" }, "tags": [], "tension_engine_ids": [ "te_box_secret", "te_mentor" ] }, { "chemistry": "{teahouse_heir.name}记得你和{crane_operator.name}的口味,也知道你们俩谁欠了谁一顿饭。", "id": "combo_teahouse_dawn", "identity_ids": [], "player_positions": [ "low", "equal" ], "power_structure": "equal", "relations": [ { "a": "player", "a_to_b": { "tension": 0, "trust": 1 }, "b": "teahouse_heir", "b_to_a": { "tension": 1, "trust": 1 }, "reason": "你是这家店里从来不赊账的熟客", "stage": "familiar" }, { "a": "player", "a_to_b": { "tension": 1, "trust": 1 }, "b": "crane_operator", "b_to_a": { "tension": 1, "trust": 1 }, "reason": "同一张值班表上的人,天天在对讲机里说话", "stage": "acquainted" }, { "a": "teahouse_heir", "a_to_b": { "tension": 1, "trust": 0 }, "b": "crane_operator", "b_to_a": { "tension": 0, "trust": 1 }, "reason": "{crane_operator.name}已经欠了店里两个月的饭钱", "stage": "acquainted" } ], "slots": [ "teahouse_heir", "crane_operator" ], "stakes": { "irreplaceable_goal": "你想在离开码头之前,弄清楚自己到底想不想留下", "limit_gap": "{teahouse_heir.name}离不开店,{crane_operator.name}下午就得回去睡", "meeting_reason": "三个人每天都会在闸口外那家茶餐厅碰头", "resource_gap": "{teahouse_heir.name}知道整条街的消息,{crane_operator.name}看得见整个泊位" }, "tags": [], "tension_engine_ids": [ "te_leaving", "te_hometown" ] }, { "chemistry": "{clinic_nurse.name}写下的每一份受伤记录都要你签字,{shift_lead.name}却总要你“先放一放”。", "id": "combo_record_signoff", "identity_ids": [ "shift_manager" ], "player_positions": [ "high" ], "power_structure": "player_high", "relations": [ { "a": "player", "a_to_b": { "tension": 1, "trust": 1 }, "b": "clinic_nurse", "b_to_a": { "tension": 1, "trust": 0 }, "reason": "{clinic_nurse.name}上个月当面拒绝过你一次“先放一放”", "stage": "acquainted" }, { "a": "player", "a_to_b": { "tension": 2, "trust": 2 }, "b": "shift_lead", "b_to_a": { "tension": 2, "trust": 1 }, "reason": "{shift_lead.name}是你当年的师傅,如今你成了{shift_lead.ta}的上司", "stage": "familiar" }, { "a": "clinic_nurse", "a_to_b": { "tension": 1, "trust": 0 }, "b": "shift_lead", "b_to_a": { "tension": 1, "trust": 1 }, "reason": "{shift_lead.name}的腰伤一直是{clinic_nurse.name}在看", "stage": "acquainted" } ], "slots": [ "clinic_nurse", "shift_lead" ], "stakes": { "irreplaceable_goal": "你想保住今年的考核,又不想把一个受了伤的人当成一个数字", "limit_gap": "你签了就要担责,{clinic_nurse.name}不能离开医务室太久,{shift_lead.name}怕新领导查账", "meeting_reason": "三个人之间隔着一份还没签字的受伤记录", "resource_gap": "你有签字权,{clinic_nurse.name}有病历,{shift_lead.name}有全班组的人" }, "tags": [ "workplace_power" ], "tension_engine_ids": [ "te_mentor", "te_restroom" ] }, { "chemistry": "{customs_officer.name}最近常一个人坐在闸口外的茶餐厅,不喝茶也不走;{teahouse_heir.name}悄悄问过你,那个人是不是来查谁的。", "id": "combo_teahouse_watch", "identity_ids": [], "player_positions": [ "equal" ], "power_structure": "equal", "relations": [ { "a": "player", "a_to_b": { "tension": 1, "trust": 0 }, "b": "customs_officer", "b_to_a": { "tension": 2, "trust": 0 }, "reason": "你们在查验现场打过几次交道,从来没说过工作以外的话", "stage": "acquainted" }, { "a": "player", "a_to_b": { "tension": 0, "trust": 1 }, "b": "teahouse_heir", "b_to_a": { "tension": 1, "trust": 2 }, "reason": "你每晚都来,{teahouse_heir.name}不用问就知道你要什么", "stage": "familiar" }, { "a": "customs_officer", "a_to_b": { "tension": 0, "trust": 0 }, "b": "teahouse_heir", "b_to_a": { "tension": 1, "trust": -1 }, "reason": "{teahouse_heir.name}只知道这个人来过几次,每次都一个人坐", "stage": "stranger" } ], "slots": [ "customs_officer", "teahouse_heir" ], "stakes": { "irreplaceable_goal": "你想知道自己的名字在不在那份名单上", "limit_gap": "{customs_officer.name}不能单独和企业的人吃饭,{teahouse_heir.name}走不开店", "meeting_reason": "你们三个几乎每晚都会在茶餐厅碰上", "resource_gap": "{customs_officer.name}有布控名单,{teahouse_heir.name}有整条街的账本" }, "tags": [], "tension_engine_ids": [ "te_hometown", "te_leaving" ] } ], "channels": [ { "fidelity": "exact", "id": "ch_radio", "reach": "所有当班的人当场就听见", "text": "对讲机公共频道" }, { "fidelity": "exact", "id": "ch_signin", "reach": "每个来签到的人都会翻到", "text": "控制塔的签到簿" }, { "fidelity": "distorted", "id": "ch_teahouse", "reach": "第二天早上所有熟客都知道", "text": "茶餐厅的熟客" }, { "fidelity": "distorted", "id": "ch_dorm", "reach": "住宿舍的人一个下午就传遍", "text": "宿舍楼道" } ], "character_templates": [ { "adult_context": "持证上岗的塔吊司机,码头正式工", "age_range": [ 26, 38 ], "appearance_options": [ "安全帽下压着一条褪色的头巾,指节上全是老茧", "手背上有一道缆绳勒出的疤,说话时眼睛总看着别处" ], "decision": { "avoids": [ "欠下说不清的人情", "在公共频道里吵架" ], "contrast": "嘴上最烦别人求{npc.ta},却从没拒绝过真正走投无路的人", "core_value": "不欠人情", "goal_options": [ "今晚别出事", "攒够学车的钱", "弄清楚那个柜子里到底装了什么" ], "never": [ "在对讲机里说别人的私事" ], "prefers": [ "用帮忙换帮忙" ], "pressure_responses": { "breaking": "直接下塔去找主任摊牌", "high": "拉一个人下水,把风险分出去", "low": "装作没听见,把对讲机音量调小", "mid": "讨价还价,先问你能给什么" }, "relationship_stance": "先看你怎么做,再决定帮不帮", "withdrawal": "把驾驶室的门关上,整夜只用对讲机说话" }, "gender": "any", "gender_reason": null, "id": "crane_operator", "identity": { "authority": "能决定哪个柜子先吊、哪个柜子“晚一点”", "exposure": "替人漏吊过一个柜子,那个柜子在堆场里多放了三晚", "hidden": "准备年底辞职去学开货车,谁也没说", "limits": [ "不能离开驾驶室超过十分钟", "一个月只有两个晚上能调休" ], "obligations": [ "每月寄钱回乡下" ], "resources": [ "从高处看得见整片泊位", "对讲机的每一个频道" ] }, "intimacy_tendency": { "attraction_sources": [ "对方在夜里也守规矩", "对方记得{npc.ta}随口说过的小事" ], "boundaries": [ "不在当班的时候" ], "desire_range": [ 1, 4 ], "desired_position": "平等,谁也不欠谁", "dislikes": [ "被当成可以收买的人" ], "expression": "用递东西代替说话", "likes": [ "在高处", "不说破" ], "preconditions": [ "确定不会被工友知道" ], "self_control_range": [ 3, 5 ] }, "public_role": "夜班塔吊司机", "schedule": [ { "from": 1200, "location_id": "berth_7", "to": 1439 }, { "from": 0, "location_id": "berth_7", "to": 480 }, { "from": 481, "location_id": "dorm_rooftop", "to": 1199 } ], "situation": { "exits": [ { "cost": "出了事第一个查的就是驾驶记录", "option": "照班组长说的做" }, { "cost": "班组长以后不会再给{npc.ta}排好班", "option": "装作没听见" } ], "pressure": "吊慢了要挨调度骂,不吊慢要得罪班组长", "trigger": "班组长让{npc.ta}今晚把一个柜子“吊慢一点”" }, "tags": [], "voices": { "inner": "“你又站在那盏灯底下,是故意让我看见的吧。”", "surface": "“七号,下一个。”——短,公事公办" } }, { "adult_context": "在码头干了十五年的装卸班组长,正式在编", "age_range": [ 35, 52 ], "appearance_options": [ "工服领口永远敞着,嗓门大得能盖过吊机", "左手缺了半截小指,夹烟的姿势很特别" ], "decision": { "avoids": [ "写在纸上的承诺" ], "contrast": "看着粗,账却算得比谁都细", "core_value": "护住自己的人", "goal_options": [ "让班组今晚平平安安收工", "把空挂的那两个名字处理干净", "给自己找一个接班人" ], "never": [ "把自己班组的人交出去" ], "prefers": [ "当面把话说清楚" ], "pressure_responses": { "breaking": "把所有事揽到自己身上", "high": "当众拍桌子,逼别人先让步", "low": "大声说笑,把话题岔开", "mid": "私下找人喝一杯,把事情谈了" }, "relationship_stance": "先把你当自己人,一旦发现你两头说话就翻脸", "withdrawal": "一个人蹲在缆桩上抽烟,谁叫都不应" }, "gender": "any", "gender_reason": null, "id": "shift_lead", "identity": { "authority": "决定谁上哪台机、谁今晚去扛最累的活", "exposure": "班组的加班费里有两个名字是空挂的", "hidden": "早就想把班组长的位置让出去,只是找不到能接的人", "limits": [ "上面刚换了领导,谁都在看{npc.ta}", "腰伤,不能久站" ], "obligations": [ "两个孩子的学费" ], "resources": [ "全班组的人情", "和船公司的人喝过酒" ] }, "intimacy_tendency": { "attraction_sources": [ "对方敢在{npc.ta}发火的时候顶回来", "对方替班组里的人说过话" ], "boundaries": [ "不碰自己手下的人" ], "desire_range": [ 2, 4 ], "desired_position": "先照顾人,再被人照顾", "dislikes": [ "被人可怜" ], "expression": "半开玩笑地说真话", "likes": [ "热闹散了之后的安静", "难得被人照顾一次" ], "preconditions": [ "不在班组的人面前" ], "self_control_range": [ 2, 4 ] }, "public_role": "夜班装卸班组长", "schedule": [ { "from": 1200, "location_id": "berth_7", "to": 1439 }, { "from": 0, "location_id": "berth_7", "to": 480 }, { "from": 481, "location_id": "teahouse", "to": 1199 } ], "situation": { "exits": [ { "cost": "两个老伙计这个月的补贴就没了", "option": "自己先去把名字销掉" }, { "cost": "要欠一个大人情,还可能被人拿住", "option": "找人把名单换一份" } ], "pressure": "名单一查,空挂的两个名字就藏不住", "trigger": "新来的主任要查加班费的名单" }, "tags": [], "voices": { "inner": "“我也会累的,你知不知道。”", "surface": "“都给我动起来!七号那边还差三个柜!”——嗓门大,带着笑" } }, { "adult_context": "海关查验科的正式在编科员", "age_range": [ 27, 40 ], "appearance_options": [ "制服熨得一丝不苟,手电筒永远别在右边腰上", "眼镜片上总蒙着一层海雾,开口之前先擦一擦" ], "decision": { "avoids": [ "私下的请托" ], "contrast": "对规矩死板,对人却记得每个人的名字", "core_value": "规矩就是规矩", "goal_options": [ "凑够这个月的查获数", "查清那个亲戚到底有没有牵扯", "调回市区的机关" ], "never": [ "收任何东西" ], "prefers": [ "白纸黑字" ], "pressure_responses": { "breaking": "把报告原样交上去,谁的面子也不给", "high": "突然抽查一个谁也想不到的柜", "low": "公事公办地把规定重复一遍", "mid": "开出条件,但只要白纸黑字的东西" }, "relationship_stance": "保持距离,只看证据", "withdrawal": "坐回查验车里,把车窗摇上" }, "gender": "any", "gender_reason": null, "id": "customs_officer", "identity": { "authority": "说查哪个柜就查哪个柜", "exposure": "有一次查验报告上的时间是事后补的", "hidden": "布控名单上有一个名字,是{npc.ta}自己的亲戚", "limits": [ "每次查验都要写报告", "不能单独和企业的人吃饭" ], "obligations": [ "科长盯着{npc.ta}这个月的查获数" ], "resources": [ "一辆查验车和两个协管", "一份谁也看不到的布控名单" ] }, "intimacy_tendency": { "attraction_sources": [ "对方在{npc.ta}面前不耍花样", "对方懂那些没写进规定里的难处" ], "boundaries": [ "不和查验对象有任何瓜葛" ], "desire_range": [ 1, 3 ], "desired_position": "被当成一个人,而不是一身制服", "dislikes": [ "被人试探底线" ], "expression": "说一句很公事的话,然后停顿太久", "likes": [ "被坦白相待", "慢" ], "preconditions": [ "不在任何可能被写进报告的地方" ], "self_control_range": [ 4, 5 ] }, "public_role": "海关查验员", "schedule": [ { "from": 1260, "location_id": "control_tower", "to": 1439 }, { "from": 0, "location_id": "berth_7", "to": 300 }, { "from": 301, "location_id": "teahouse", "to": 1259 } ], "situation": { "exits": [ { "cost": "可能查到自己亲戚头上", "option": "盯死一个有问题的柜" }, { "cost": "良心过不去,也会被码头的人记恨", "option": "随便找个小错凑数" } ], "pressure": "查获数不够,调回机关的事就要泡汤", "trigger": "科长要{npc.ta}这个月再交一单大的" }, "tags": [], "voices": { "inner": "“我也想有一个晚上,什么都不用查。”", "surface": "“单据。箱号念一遍。”——不紧不慢" } }, { "adult_context": "码头医务室的注册护士,正式职工", "age_range": [ 25, 42 ], "appearance_options": [ "白大褂外面套着一件旧毛衣,口袋里装着薄荷糖", "头发盘得很紧,手上总有一股消毒水的味道" ], "decision": { "avoids": [ "被拉进班组之间的恩怨" ], "contrast": "看着温和,决定了的事九头牛都拉不回", "core_value": "人比记录重要", "goal_options": [ "今晚别再有人受伤", "攒够去市里的路费和押金", "把改过的那份记录悄悄改回来" ], "never": [ "在病历上作假第二次" ], "prefers": [ "安静地把事办了" ], "pressure_responses": { "breaking": "直接打电话报上去", "high": "把事情写进病历,谁也改不了", "low": "低头写记录,不接话", "mid": "用专业的话把人挡回去" }, "relationship_stance": "先照顾你的伤,再想要不要相信你", "withdrawal": "把医务室的门反锁,隔着门说话" }, "gender": "any", "gender_reason": null, "id": "clinic_nurse", "identity": { "authority": "谁受了伤、伤成什么样,由{npc.ta}写进记录", "exposure": "替人改过一次受伤时间,把工伤写成了下班后受的伤", "hidden": "准备考去市里的大医院,已经偷偷去面试过", "limits": [ "医务室只有{npc.ta}一个人,走不开", "病历要交给主任过目" ], "obligations": [ "在成人夜校读护理本科,白天还要考试" ], "resources": [ "医务室的钥匙和药柜", "知道每个人的病假条是真是假" ] }, "intimacy_tendency": { "attraction_sources": [ "对方受了伤也不喊痛", "对方记得{npc.ta}在夜校的考试" ], "boundaries": [ "不在病人面前" ], "desire_range": [ 1, 4 ], "desired_position": "平等,互相照看", "dislikes": [ "被当成随叫随到的人" ], "expression": "替对方处理伤口时多停一会儿", "likes": [ "深夜的一杯热茶", "被人认真听完一句话" ], "preconditions": [ "医务室里没有病人" ], "self_control_range": [ 3, 5 ] }, "public_role": "医务室夜班护士", "schedule": [ { "from": 1200, "location_id": "clinic", "to": 1439 }, { "from": 0, "location_id": "clinic", "to": 480 }, { "from": 481, "location_id": "teahouse", "to": 1199 } ], "situation": { "exits": [ { "cost": "主任会想办法让{npc.ta}在码头待不下去", "option": "照实登记" }, { "cost": "伤者要是出事,{npc.ta}就是同谋", "option": "先压着,等天亮再说" } ], "pressure": "放一放就是瞒报,不放就是得罪主任", "trigger": "主任让{npc.ta}把今晚的受伤记录“先放一放”" }, "tags": [], "voices": { "inner": "“你每次都这样,不痛也要装痛,就为了来坐一会儿?”", "surface": "“坐好,别动。痛就说。”——轻,不容商量" } }, { "adult_context": "船公司派驻港口的代表,正式雇员", "age_range": [ 30, 48 ], "appearance_options": [ "西装外面披着雨衣,皮鞋上沾着码头的泥", "手腕上戴一块很旧的表,说是父亲留下的" ], "decision": { "avoids": [ "留下字据" ], "contrast": "出手大方,自己却舍不得吃一份叉烧饭", "core_value": "事情办成最重要", "goal_options": [ "让船准时开走", "把那笔假账抹平", "找到愿意跟{npc.ta}合伙的人" ], "never": [ "让船东知道{npc.ta}自己的打算" ], "prefers": [ "用钱把事情摆平" ], "pressure_responses": { "breaking": "撕破脸,把所有人的红包账都翻出来", "high": "找更上面的人打电话", "low": "笑着塞一个红包", "mid": "搬出船东,拿滞期费压人" }, "relationship_stance": "谁有用就对谁客气", "withdrawal": "回到船上的办公室,只让船员传话" }, "gender": "any", "gender_reason": null, "id": "ship_agent_rep", "identity": { "authority": "一句话能让下一条船改靠别的码头", "exposure": "账上有一笔滞期费是做出来的", "hidden": "其实想离开船公司,在港口开一间自己的报关行", "limits": [ "船东天天打电话催", "在这个港口没有一个真正的朋友" ], "obligations": [ "船晚一天开,滞期费就记在{npc.ta}头上" ], "resources": [ "现金和红包", "整个季度的船期表" ] }, "intimacy_tendency": { "attraction_sources": [ "对方不收{npc.ta}的红包", "对方看得出{npc.ta}的客气是装的" ], "boundaries": [ "不在船上" ], "desire_range": [ 2, 4 ], "desired_position": "被当成同伴,而不是出钱的人", "dislikes": [ "被人算计" ], "expression": "请客,然后自己一口不吃", "likes": [ "不谈生意的时候", "从海上吹来的风" ], "preconditions": [ "确定对方要的不是{npc.ta}的钱" ], "self_control_range": [ 2, 4 ] }, "public_role": "船公司驻港代表", "schedule": [ { "from": 1200, "location_id": "control_tower", "to": 1439 }, { "from": 0, "location_id": "berth_7", "to": 360 }, { "from": 361, "location_id": "teahouse", "to": 1199 } ], "situation": { "exits": [ { "cost": "红包越塞越多,把柄也越来越多", "option": "塞更多红包让码头连夜赶工" }, { "cost": "丢掉这份工作", "option": "跟船东说实话" } ], "pressure": "开不走,滞期费和那笔假账会一起被查", "trigger": "船东要求船必须赶在台风前开走" }, "tags": [], "voices": { "inner": "“我这些年,连一个能说实话的人都没有。”", "surface": "“辛苦辛苦,一点心意,饮茶。”——客气,滴水不漏" } }, { "adult_context": "绑扎队签了合同的成年工人", "age_range": [ 22, 35 ], "appearance_options": [ "手套磨得露出指头,额头上一道汗痕", "笑起来露出一颗虎牙,工服袖子卷到手肘" ], "decision": { "avoids": [ "被人看不起" ], "contrast": "嗓门最大,被人当面夸一句就脸红", "core_value": "活下去,也要活得有面子", "goal_options": [ "续下明年的合同", "攒钱把家里的债还完", "学会自己看单据" ], "never": [ "出卖一起干活的人" ], "prefers": [ "直来直去" ], "pressure_responses": { "breaking": "把知道的事全抖出来", "high": "撂挑子,整队停工", "low": "装傻,嘻嘻哈哈", "mid": "叫上绑扎队的人一起出头" }, "relationship_stance": "你对{npc.ta}好一分,{npc.ta}还你三分", "withdrawal": "跑去七号泊位最远的一头,一个人闷头绑柜子" }, "gender": "any", "gender_reason": null, "id": "lashing_worker", "identity": { "authority": "柜子绑没绑牢,{npc.ta}说了算", "exposure": "替外轮水手带过几条烟出闸口", "hidden": "每周二晚上偷偷去成人夜校的扫盲班", "limits": [ "合同一年一签", "认字不多,单据要别人念" ], "obligations": [ "帮家里还债" ], "resources": [ "绑扎队的消息网", "认得每一条外轮上的水手" ] }, "intimacy_tendency": { "attraction_sources": [ "对方耐心地教{npc.ta}认过字", "对方没有因为出身看低{npc.ta}" ], "boundaries": [ "不在宿舍" ], "desire_range": [ 2, 5 ], "desired_position": "被当成能拿主意的大人,而不是小工", "dislikes": [ "被人施舍" ], "expression": "大声开玩笑来掩饰", "likes": [ "被人叫名字而不是“喂”", "雨停之后的码头" ], "preconditions": [ "对方先认真待{npc.ta}" ], "self_control_range": [ 1, 3 ] }, "public_role": "夜班绑扎工", "schedule": [ { "from": 1200, "location_id": "berth_7", "to": 1439 }, { "from": 0, "location_id": "berth_7", "to": 480 }, { "from": 481, "location_id": "teahouse", "to": 1199 } ], "situation": { "exits": [ { "cost": "迟早会被人抓住", "option": "照队长说的做" }, { "cost": "在这个码头就再也没人要{npc.ta}", "option": "去找别的绑扎队" } ], "pressure": "所谓表现,就是替队长干些不能说的活", "trigger": "绑扎队长说明年的合同要“看表现”" }, "tags": [], "voices": { "inner": "“我不是不懂,我只是没人教。”", "surface": "“绑好了!下一个!”——亮,带着笑" } }, { "adult_context": "茶餐厅老板的成年孩子,接手了夜里的店面", "age_range": [ 24, 34 ], "appearance_options": [ "围裙上别着一支圆珠笔,手指被热水烫得发红", "头发剪得很短,说话快,算账更快" ], "decision": { "avoids": [ "码头上的是非" ], "contrast": "嘴上最会讲价,送出去的糖水却从来不收钱", "core_value": "不欠账,也不让人欠", "goal_options": [ "把赊账的人一个个追回来", "说服父母把店卖掉", "搞清楚码头上最近在传什么" ], "never": [ "把熟客的事卖给外人" ], "prefers": [ "记账" ], "pressure_responses": { "breaking": "关店,谁的生意都不做", "high": "把赊账的名单贴到墙上", "low": "拿出账本慢慢算", "mid": "用消息换消息" }, "relationship_stance": "熟客是熟客,朋友是朋友,分得很清", "withdrawal": "躲进后厨,只从小窗口递东西出来" }, "gender": "any", "gender_reason": null, "id": "teahouse_heir", "identity": { "authority": "谁能赊账、赊多少,{npc.ta}说了算", "exposure": "帮外轮船员换过外币,赚过差价", "hidden": "想把茶餐厅卖掉,去读一个真正的大学", "limits": [ "店是父母的,大事自己做不了主", "离不开店" ], "obligations": [ "还店面的贷款" ], "resources": [ "整条街的消息", "柜台上一台能打长途的电话" ] }, "intimacy_tendency": { "attraction_sources": [ "对方从来不赊账", "对方听{npc.ta}讲过读书的事,没有笑" ], "boundaries": [ "不在父母面前" ], "desire_range": [ 1, 4 ], "desired_position": "被看成一个独立的人", "dislikes": [ "被当成店里的一件摆设" ], "expression": "多给一勺糖", "likes": [ "打烊之后的店", "被人记住口味" ], "preconditions": [ "店已经打烊" ], "self_control_range": [ 2, 4 ] }, "public_role": "茶餐厅夜班的少东", "schedule": [ { "from": 0, "location_id": "teahouse", "to": 1439 } ], "situation": { "exits": [ { "cost": "读书的事就永远别想了", "option": "答应去相亲" }, { "cost": "家里至少要吵上一年", "option": "自己去跟父母摊牌" } ], "pressure": "不接,店就要卖给外人,父母半辈子的心血就没了", "trigger": "父母要{npc.ta}今年之内相亲结婚、接手店面" }, "tags": [], "voices": { "inner": "“你知不知道,你是这条街上唯一不问我什么时候接手的人。”", "surface": "“云吞面,少葱,走青,知道啦。”——快,带点不耐烦" } } ], "clock_start": { "label": "一九九八年,台风季", "minute": 1260 }, "clock_style": "hm", "content_tags": [ "workplace", "romance_light" ], "custom": false, "customs": [ "收工后去闸口外的茶餐厅吃一碗云吞面,是班组默认的散伙仪式;谁请客轮着来,轮到的人装不知道会被记很久。", "红包要当着人面推两次再收;推一次就收显得贪,推第三次就是不给面子。", "新来的人第一个夜班要请全班组喝一次糖水,叫“开工糖水”,糖水钱不能找人分摊。", "交班时要把保温壶灌满开水留给下一班;空壶留给别人,一个月都会有人阴阳怪气。", "塔吊司机上塔前在梯子第一级拍三下,说是跟吊臂打招呼;谁替别人拍了,就是认了交情。" ], "daily_activities": [ { "beats": [ "抢最后一份叉烧", "有人提起白天的事", "老板娘多给了谁一勺糖" ], "duration_minutes": 40, "hook_ids": [], "id": "a_supper", "location_ids": [ "teahouse" ], "start_minute": 150, "tags": [], "title": "凌晨的宵夜" }, { "beats": [ "签到簿上少了一个名字", "对讲机里有人在抱怨", "交接的保温壶是空的" ], "duration_minutes": 20, "hook_ids": [], "id": "a_handover", "location_ids": [ "control_tower" ], "start_minute": 115, "tags": [], "title": "两点交接签到" }, { "beats": [ "雨越下越大,绳子吃了水变沉", "有人的手套被绞进了卸扣", "吊机停了一下又动起来" ], "duration_minutes": 60, "hook_ids": [], "id": "a_rain_lashing", "location_ids": [ "berth_7" ], "start_minute": 1320, "tags": [], "title": "雨夜加固绑扎" }, { "beats": [ "电热水壶一次只够煮一包面", "电视里在重播白天的球赛", "折叠床上还留着上一个人的体温" ], "duration_minutes": 30, "hook_ids": [], "id": "a_noodles", "location_ids": [ "rest_room" ], "start_minute": 60, "tags": [], "title": "休息室里煮面" }, { "beats": [ "晾着的工服被风吹得啪啪响", "港口的灯一盏一盏灭掉", "有人带上来两罐啤酒" ], "duration_minutes": 40, "hook_ids": [], "id": "a_rooftop", "location_ids": [ "dorm_rooftop" ], "start_minute": 500, "tags": [ "substance" ], "title": "收工后的天台" }, { "beats": [ "手电照到一个没有铅封的柜门", "保安的单车停在巷口", "某个柜子里传出一下敲击声" ], "duration_minutes": 45, "hook_ids": [], "id": "a_yard_round", "location_ids": [ "container_yard" ], "start_minute": 1380, "tags": [], "title": "巡场对箱号" }, { "beats": [ "长椅上坐着一个一言不发的人", "药柜的锁有点松", "值班的人在背夜校的书" ], "duration_minutes": 25, "hook_ids": [], "id": "a_clinic_visit", "location_ids": [ "clinic" ], "start_minute": 180, "tags": [], "title": "去医务室换药" } ], "default_npc_gender_mix": { "female": 0.5, "male": 0.5, "nonbinary": 0.0 }, "default_person": "second", "era": "1990 年代末(1998 年)", "extends": null, "forbidden_terms": [ "微信", "支付宝", "二维码", "智能手机", "App", "网购", "外卖软件", "高铁", "共享单车", "朋友圈", "短视频", "扫码", "无人机", "移动支付", "网约车", "自拍", "WiFi", "QQ", "互联网" ], "hooks": [ { "id": "h_thermos", "kind": "approach", "location_ids": [], "slot": "crane_operator", "text": "{npc.name}把自己的保温杯推到你面前,杯盖还冒着热气" }, { "id": "h_raincoat", "kind": "approach", "location_ids": [], "slot": "shift_lead", "text": "{npc.name}把自己的外套搭到你肩上,说“别着凉,今晚还长”" }, { "id": "h_seat", "kind": "approach", "location_ids": [], "slot": "teahouse_heir", "text": "{npc.name}往旁边挪了挪,给你让出半个位置" }, { "id": "h_bandage", "kind": "approach", "location_ids": [], "slot": "clinic_nurse", "text": "{npc.name}看了一眼你指节上的口子,拉过一张凳子让你坐下" }, { "id": "h_umbrella", "kind": "approach", "location_ids": [], "slot": "customs_officer", "text": "{npc.name}把手电往你脚下照了照,提醒你地上有一滩油" }, { "id": "h_cigarette", "kind": "approach", "location_ids": [], "slot": "lashing_worker", "text": "{npc.name}从耳朵上取下一支烟递过来,说“借个火”" }, { "id": "h_lift", "kind": "approach", "location_ids": [], "slot": "ship_agent_rep", "text": "{npc.name}说车就停在闸口,问要不要顺路送你一段" }, { "id": "h_redpacket", "kind": "request", "location_ids": [], "slot": "ship_agent_rep", "text": "{npc.name}把一个红包压在你手边的单据底下,说“饮茶”" }, { "id": "h_torch", "kind": "observe", "location_ids": [ "berth_7", "container_yard" ], "slot": "customs_officer", "text": "你看见{npc.name}的手电在一个没有铅封的柜门上停了很久" }, { "id": "h_folded_slip", "kind": "observe", "location_ids": [], "slot": "shift_lead", "text": "你看见{npc.name}把一张理货单折起来,塞进了安全帽里" }, { "id": "h_slip", "kind": "accident", "location_ids": [], "slot": "lashing_worker", "text": "{npc.name}脚下一滑,手里的东西眼看就要摔出去——你离{npc.ta}只有一步" } ], "id": "harbor_night_shift", "locations": [ { "affordances": [ "躲进两排集装箱的夹缝", "借吊机的轰鸣说悄悄话", "爬上跨运车的驾驶室避雨" ], "detail": "吊臂的影子一格一格扫过地面,海水拍着缆桩,空气里是柴油和铁锈的味道。", "exits": [ "control_tower", "container_yard", "tool_shed" ], "id": "berth_7", "name": "七号泊位", "pressure_modifiers": { "p_customs_raid": "查验车会先停在这里,查柜从七号泊位第三排开始。", "p_overweight": "那个超重的柜子就压在第三排最底下。" }, "privacy": "public", "tags": [ "workplace" ], "visibility": "塔吊驾驶室能从高处看见整片泊位,绑扎工也来来往往", "witnesses": [ "bg_old_lasher" ] }, { "affordances": [ "翻看签到簿", "切换对讲机频道", "在楼梯拐角说话没人看见" ], "detail": "三楼调度室一整面玻璃对着泊位,签到簿压在对讲机旁边,吊扇吱呀作响。", "exits": [ "berth_7", "rest_room" ], "id": "control_tower", "name": "控制塔", "pressure_modifiers": { "p_owner_men": "船东的人会直接上三楼,堵在调度室门口。" }, "privacy": "semi", "tags": [ "workplace" ], "visibility": "值班的调度和来签到的人都在,楼梯拐角谁也看不见", "witnesses": [ "bg_sign_clerk" ] }, { "affordances": [ "轮流在折叠床上眯一会儿", "用电热水壶煮公仔面", "关了灯看窗外的船灯" ], "detail": "塔楼一楼的休息室,一台旧风扇、一张折叠床、一台只收得到两个台的电视。", "exits": [ "control_tower", "clinic" ], "id": "rest_room", "name": "休息室", "pressure_modifiers": {}, "privacy": "semi", "tags": [ "workplace" ], "visibility": "谁推门都会被看见,门上的玻璃糊了半张旧报纸", "witnesses": [] }, { "affordances": [ "处理伤口", "开一张病假条", "在铁床边坐一会儿" ], "detail": "塔楼一楼尽头的医务室,一张铁床、一个上锁的药柜,日光灯管发出细细的嗡声。", "exits": [ "rest_room" ], "id": "clinic", "name": "医务室", "pressure_modifiers": { "p_injury_coverup": "受伤的人就坐在门口的长椅上,谁进出都得从伤者身边经过。" }, "privacy": "semi", "tags": [ "workplace" ], "visibility": "门口的长椅上常有人等着包扎,门一关里面就只剩两个人", "witnesses": [] }, { "affordances": [ "躲雨", "把东西藏进缆绳堆", "关上门说话" ], "detail": "堆满缆绳和生锈的卸扣,铁皮门从外面挂锁,下雨时整间屋子像鼓一样响。", "exits": [ "berth_7" ], "id": "tool_shed", "name": "工具房", "pressure_modifiers": {}, "privacy": "private", "tags": [ "workplace" ], "visibility": "几乎没人经过,只有机修和绑扎的人有钥匙", "witnesses": [] }, { "affordances": [ "借箱子挡住视线", "抄近路去闸口", "贴着箱壁听里面的动静" ], "detail": "集装箱码成五层高的窄巷,灯照不到中间,偶尔能听见某个箱子里有东西在响。", "exits": [ "berth_7", "teahouse" ], "id": "container_yard", "name": "堆场通道", "pressure_modifiers": { "p_overweight": "超重的柜子要拖去磅房,一定会经过保安的巡逻线。", "p_smuggled_smokes": "被扣的人就蹲在闸口保安亭的灯底下。" }, "privacy": "semi", "tags": [ "workplace" ], "visibility": "只有巡场的保安骑着单车偶尔经过", "witnesses": [ "bg_patrol" ] }, { "affordances": [ "抢最后一份叉烧", "在卡座里压低声音谈事", "借柜台上的电话打出去" ], "detail": "凌晨三点还亮着灯,墙上的电视开着没声音,老板娘记得每个夜班的人要几分糖。", "exits": [ "container_yard", "dorm_rooftop" ], "id": "teahouse", "name": "闸口外的茶餐厅", "pressure_modifiers": { "p_unpaid_wages": "绑扎队的人把几张桌子拼在一起,等包工头的消息。" }, "privacy": "public", "tags": [ "nightlife" ], "visibility": "熟客都认识彼此,什么话在这里传得最快", "witnesses": [ "bg_teahouse_boss" ] }, { "affordances": [ "一起抽一支烟", "看台风前的云", "躲开所有人" ], "detail": "员工宿舍六楼的天台,晾着一排工服,能看见整个港口的灯一盏盏亮着。", "exits": [ "teahouse" ], "id": "dorm_rooftop", "name": "宿舍楼天台", "pressure_modifiers": {}, "privacy": "private", "tags": [], "visibility": "夜里没人上来,除非有人跟着", "witnesses": [] } ], "name_pools": { "family": [ "陈", "梁", "何", "麦", "黄", "罗", "冯", "邓", "谭", "叶", "钟", "郭", "潘", "卢", "吴", "区", "莫", "甘" ], "given_female": [ "秀琴", "嘉欣", "美玲", "丽珊", "咏诗", "慧敏", "婉仪", "淑贞", "少芬", "翠屏", "玉莲", "凤仪", "佩珊", "宝珠" ], "given_male": [ "志强", "国栋", "家豪", "伟明", "振华", "锦荣", "耀祖", "建辉", "德胜", "灿明", "汉生", "嘉俊", "炳坤", "永光" ], "given_neutral": [ "子晴", "海宁", "思远", "家宁", "天恩", "晓岚", "雨澄", "文乐", "安然", "少青", "嘉言", "永宁" ], "nickname_patterns": [ { "gender": "any", "pattern": "阿{given_last}" }, { "gender": "female", "pattern": "{family}姐" }, { "gender": "male", "pattern": "{family}哥" }, { "gender": "any", "pattern": "老{family}" } ] }, "notes": "首个垂直切片世界。等待真实 Skill 试玩记录后改为 released。", "player_identities": [ { "age_range": [ 24, 40 ], "baseline": "干了四年夜班理货,箱子有没有问题,看一眼铅封的颜色就知道。", "gender": "any", "id": "tally_clerk", "reputation": "嘴紧,不站队", "resources": [ "知道每个箱子的真实重量", "记得每个人的签到习惯" ], "risks": [ "去年收过船东的红包,数目没对任何人说过" ], "role": "理货员", "social_position": "low", "title_patterns": [ { "gender": "any", "pattern": "阿{given_last}" }, { "gender": "male", "pattern": "{family}仔" }, { "gender": "female", "pattern": "{family}妹" } ] }, { "age_range": [ 22, 45 ], "baseline": "专修吊机和跨运车,哪台机器哪里有毛病,听声音就知道。", "gender": "any", "id": "crane_mechanic", "reputation": "手艺好,脾气倔", "resources": [ "工具房的钥匙", "能让一台吊机“刚好坏了”" ], "risks": [ "修机记录里有两次是事后补签的" ], "role": "机修工", "social_position": "low", "title_patterns": [ { "gender": "any", "pattern": "阿{given_last}" }, { "gender": "any", "pattern": "修机的{family}" } ] }, { "age_range": [ 27, 45 ], "baseline": "坐在控制塔三楼,整夜盯着吊装顺序表和对讲机,谁的柜先吊由你排。", "gender": "any", "id": "night_dispatcher", "reputation": "做事公道,但谁都不敢得罪", "resources": [ "排吊装顺序的权力", "能切到任何一个频道" ], "risks": [ "上个月替人把一个柜子的吊装顺序往后挪了两晚" ], "role": "夜班调度", "social_position": "equal", "title_patterns": [ { "gender": "any", "pattern": "{family}调度" }, { "gender": "any", "pattern": "阿{given_last}" } ] }, { "age_range": [ 23, 38 ], "baseline": "骑一辆旧摩托在海关、船公司和码头之间跑单,谁的单卡在哪一关你一清二楚。", "gender": "any", "id": "customs_runner", "reputation": "路子野,靠得住", "resources": [ "认识海关查验科的几个人", "一辆随叫随到的摩托" ], "risks": [ "替客户报低过货值,底单还压在抽屉里" ], "role": "报关行跑单员", "social_position": "equal", "title_patterns": [ { "gender": "male", "pattern": "{family}生" }, { "gender": "female", "pattern": "{family}小姐" }, { "gender": "any", "pattern": "阿{given_last}" } ] }, { "age_range": [ 36, 55 ], "baseline": "管着整个夜班两百多号人,今年的考核只看一个数:事故率。", "gender": "any", "id": "shift_manager", "reputation": "硬,但护短", "resources": [ "签字权", "能调人、能停工" ], "risks": [ "今年春天压下过一次工伤,没有报上去" ], "role": "夜班值班主任", "social_position": "high", "title_patterns": [ { "gender": "any", "pattern": "{family}主任" } ] }, { "age_range": [ 30, 50 ], "baseline": "替几家船公司在这个港口打点一切,一句话能让下一条船改靠别的码头。", "gender": "any", "id": "ship_agent", "reputation": "客气,出手大方,没人摸得透", "resources": [ "船期和靠泊的决定权", "随时拿得出的现金" ], "risks": [ "账上有一笔滞期费经不起查" ], "role": "船务代理", "social_position": "high", "title_patterns": [ { "gender": "any", "pattern": "{family}经理" } ] } ], "premise": "集装箱码头的夜班从晚八点到早八点,灯一直亮到天明,人很少,交接班的十分钟里什么都可能发生。", "pressures": [ { "choice": "替人瞒下来,还是自己先报上去", "exits": [ { "cost": "要欠塔吊司机一个大人情", "option": "把柜子挪到别的泊位" }, { "cost": "得罪带你入行的人", "option": "如实上报" }, { "cost": "查出来就是签字人的事", "option": "什么都不做,等着查" } ], "far": { "consequence": "瞒下来的人和说出去的人,船东都会记住", "due_days": 3, "trigger": "三天后船东的人会来码头" }, "flags": [ "timed" ], "hook_ids": [], "id": "p_customs_raid", "immediate": { "minutes": 20, "text": "查验车二十分钟后开到七号泊位" }, "leverage": null, "location_ids": [ "berth_7", "container_yard" ], "near": { "deadline_minutes": 610, "text": "明早八点主任要一份理货说明" }, "objective": "在查验车开到第三排之前,决定那个铅封对不上的柜子怎么办", "source": "institution", "start_minute": 1370, "tags": [ "crime" ], "title": "海关突击查柜", "trigger": "对讲机里门卫喊了一声“大车进场”,海关查验车进了闸口" }, { "choice": "放行,还是拦下来得罪船公司", "exits": [ { "cost": "出了事就是放行的人担", "option": "放行" }, { "cost": "船公司的红包以后再没有你的份", "option": "拦下来开柜" } ], "far": { "consequence": "今晚谁拦了船,合同上就会少掉谁的码头", "due_days": 5, "trigger": "下个月船公司要续签码头合同" }, "flags": [ "timed" ], "hook_ids": [], "id": "p_overweight", "immediate": { "minutes": 15, "text": "吊机十五分钟后就要吊到这个柜子" }, "leverage": null, "location_ids": [ "berth_7", "container_yard" ], "near": { "deadline_minutes": 330, "text": "船天亮前必须开,装船单要在五点前交上去" }, "objective": "在装船之前弄清楚多出来的四吨是什么", "source": "person", "start_minute": 1410, "tags": [], "title": "超重的柜子", "trigger": "磅房报上来一个柜子比单据重了四吨,放行单上等着你表态" }, { "choice": "冒雨抢吊,还是停下来让船公司去赔", "exits": [ { "cost": "可能有人受伤", "option": "冒雨抢吊" }, { "cost": "船公司的滞期费和上面的脸色", "option": "下令停工" } ], "far": { "consequence": "抢了吊的人和停了工的人,总有一方要写检讨", "due_days": 2, "trigger": "台风过后公司要追查今晚的决定" }, "flags": [ "timed" ], "hook_ids": [], "id": "p_typhoon", "immediate": { "minutes": 30, "text": "雨已经横着打过来,吊机必须在半小时内决定停不停" }, "leverage": null, "location_ids": [ "berth_7", "control_tower" ], "near": { "deadline_minutes": 900, "text": "风眼预计明天中午过境,在那之前所有人不许离开塔楼" }, "objective": "在全面停工之前,把最后一船吊完或者放弃", "source": "nature", "start_minute": 1290, "tags": [ "disaster" ], "title": "台风提前转向", "trigger": "广播说台风提前转向,警报两小时后就要升到最高一级" }, { "choice": "先替包工头垫钱稳住人,还是让事情闹到上面去", "exits": [ { "cost": "垫出去的钱多半要不回来", "option": "自己先垫一部分钱" }, { "cost": "包工头的人会记恨", "option": "打电话叫上面的人来" } ], "far": { "consequence": "今晚替谁说了话,检查时就会被谁记住", "due_days": 6, "trigger": "劳动部门下周来码头检查" }, "flags": [ "timed" ], "hook_ids": [], "id": "p_unpaid_wages", "immediate": { "minutes": 25, "text": "绑扎队在七号泊位坐下来不干了,吊机空转" }, "leverage": null, "location_ids": [ "berth_7", "teahouse" ], "near": { "deadline_minutes": 900, "text": "明天中午之前工钱不到,全码头的绑扎队都要停" }, "objective": "在绑扎队停工之前,把事情压下去或者闹开", "source": "money", "start_minute": 1260, "tags": [ "workplace_power" ], "title": "绑扎队的工钱", "trigger": "发薪日到了,绑扎队的工钱一分没到,有人说包工头已经跑了" }, { "choice": "把他们要的东西交出去,还是赌他们手里什么都没有", "exits": [ { "cost": "从此被人捏在手里", "option": "给他们要的东西" }, { "cost": "你收过的红包也会一起摆上台面", "option": "把事情捅给主任" } ], "far": { "consequence": "你今晚给了什么,下个月就得再给一次", "due_days": 7, "trigger": "船东下个月要亲自来港口" }, "flags": [ "timed", "leverage" ], "hook_ids": [], "id": "p_owner_men", "immediate": { "minutes": 10, "text": "他们在三楼等着,只给了你十分钟" }, "leverage": { "basis": "{ship_agent_rep.name}手里有一本账,记着你收过的每一个红包", "holder": "ship_agent_rep", "subject": "player" }, "location_ids": [ "control_tower" ], "near": { "deadline_minutes": 1440, "text": "他们说明晚这个时候还会再来" }, "objective": "在他们离开码头之前,弄清楚他们手里到底有什么", "source": "person", "start_minute": 1320, "tags": [ "coercion_theme", "workplace_power" ], "title": "船东的人", "trigger": "船东派来的两个人上了控制塔,指名要见你" }, { "choice": "帮着压下去保住全年的考核,还是照实写", "exits": [ { "cost": "今年的考核没了,上面会记恨签字的人", "option": "照实登记" }, { "cost": "伤者拿不到工伤的钱", "option": "改成下班后受的伤" } ], "far": { "consequence": "瞒下来的伤,最后总要有人出钱", "due_days": 10, "trigger": "伤者下个月的工资单" }, "flags": [ "timed", "leverage" ], "hook_ids": [], "id": "p_injury_coverup", "immediate": { "minutes": 15, "text": "伤者在医务室门口等着,血还没有止住" }, "leverage": { "basis": "{shift_lead.name}知道{clinic_nurse.name}上次改过受伤时间", "holder": "shift_lead", "subject": "clinic_nurse" }, "location_ids": [ "clinic" ], "near": { "deadline_minutes": 420, "text": "早上八点受伤记录要交上去" }, "objective": "在天亮换班之前,决定这份受伤记录写不写", "source": "institution", "start_minute": 60, "tags": [ "bodily_harm", "workplace_power" ], "title": "压下来的工伤", "trigger": "一个绑扎工的手被卸扣绞伤,上面传话让先别写进记录" }, { "choice": "出面担保,还是装作不认识", "exits": [ { "cost": "以后这个人的事都有你一份", "option": "出面担保" }, { "cost": "绑扎队的人会看不起你", "option": "装作不认识" } ], "far": { "consequence": "船上的人会记得今晚谁站了出来", "due_days": 12, "trigger": "那条外轮下次靠港" }, "flags": [ "timed" ], "hook_ids": [], "id": "p_smuggled_smokes", "immediate": { "minutes": 30, "text": "保安给了半小时,找不到担保人就交上去" }, "leverage": null, "location_ids": [ "container_yard" ], "near": { "deadline_minutes": 600, "text": "明早保卫科长一上班就会看到报告" }, "objective": "在保安写报告之前,决定要不要替被扣的人说话", "source": "person", "start_minute": 1400, "tags": [ "crime" ], "title": "被扣下的外烟", "trigger": "保安在闸口扣下了一个人,身上搜出十几条外烟" } ], "region": "南方沿海港城的集装箱码头", "rules": [ { "id": "r_signin", "text": "夜班 20:00 上岗、次日 8:00 下班,凌晨两点所有人到控制塔签到交接;签到簿谁都能翻,缺签要写说明交给主任。" }, { "id": "r_radio", "text": "对讲机公共频道所有当班的人都听得见,谁说了什么第二天全码头都知道;私事只能切到六频道,可调度偶尔会抽查。" }, { "id": "r_tally_sign", "text": "箱号、铅封号、重量三样对不上的柜,要当班理货员在理货单上签字才能放行——签了字,出了事就是签字人的。" }, { "id": "r_customs_car", "text": "海关查验不提前打招呼,查验车进闸口时门卫会在公共频道喊一声“大车进场”,从闸口开到泊位要二十分钟。" }, { "id": "r_redpacket", "text": "船公司的人逢年过节、赶船期都塞红包;收不收、收多少,班组里人人心里有数,只是没人写在纸上。" }, { "id": "r_typhoon", "text": "台风警报升到最高一级,码头全面停工,吊机锁死,所有人撤进塔楼一楼,风停之前谁也不许出去。" } ], "schema_version": 1, "stage_labels": null, "status": "review", "style_hint": "短句,多写声音、气味与灯光,少写心理独白;粤语词点到即止。", "tension_engines": [ { "id": "te_roster", "text": "你们在同一张值班表上,每晚两点在控制塔签到时一定会碰面" }, { "id": "te_restroom", "text": "塔楼一楼那间休息室和那张折叠床,大家轮流用,谁睡过都留着体温" }, { "id": "te_mentor", "text": "一方是另一方入行时的师傅,教过的东西都还记着" }, { "id": "te_hometown", "text": "同一个乡下出来的,一开口就认得出彼此的口音" }, { "id": "te_leaving", "text": "都在偷偷攒钱准备离开码头,谁先走,谁就欠对方一个解释" }, { "id": "te_box_secret", "text": "都知道第三排最底下那个柜子有问题,却谁也没有说破" } ], "title": "港口夜班", "tone": [ "潮湿", "疲惫", "克制的热" ], "twists": [ { "category": "人事", "id": "t_new_dispatcher", "requires": [ "crane_operator" ], "text": "新调来的夜班调度,是{crane_operator.name}以前的对象" }, { "category": "信息", "id": "t_old_slip", "requires": [], "text": "签到簿里夹着一张不属于任何人的旧理货单,上面的签名很像你的" }, { "category": "资源", "id": "t_allowance_cut", "requires": [], "text": "公司宣布下个月起夜班补贴减半,整个码头的人心都浮了起来" }, { "category": "制度", "id": "t_time_clock", "requires": [], "text": "控制塔装了打卡钟,签到簿作废,谁几点到从此再也抵赖不了" }, { "category": "时限", "id": "t_ship_early", "requires": [ "pressure" ], "text": "船提前一天到港,所有期限一下子往前挪了二十四小时" }, { "category": "关系", "id": "t_relative_listed", "requires": [ "customs_officer" ], "text": "{customs_officer.name}的亲戚被人发现就在船公司的名单上" }, { "category": "意外", "id": "t_box_falls", "requires": [], "text": "一个空柜子从五层高的地方掉下来,砸坏了跨运车,所幸没伤到人" }, { "category": "关系", "id": "t_shop_sold", "requires": [ "teahouse_heir" ], "text": "{teahouse_heir.name}的父母决定把茶餐厅卖给船公司的人" }, { "category": "信息", "id": "t_drunk_name", "requires": [ "daily" ], "text": "老绑扎工在茶餐厅喝多了,说出了一个谁都不该知道的名字" } ] }, "tags": [ { "description": "眼神、试探、靠近、暧昧的言语,不涉及身体亲密", "id": "romance_light", "kind": "intimacy", "label": "轻度暧昧" }, { "description": "亲吻、拥抱、抚摸等身体亲密;提交需写明亲密参与者", "id": "intimate", "kind": "intimacy", "label": "亲密" }, { "description": "直白的性行为描写;提交需写明亲密参与者", "id": "explicit", "kind": "intimacy", "label": "直白的性描写" }, { "description": "打斗、伤人、以暴力相威胁", "id": "violence", "kind": "conflict", "label": "暴力" }, { "description": "要挟、把柄、以生计或秘密施压", "id": "coercion_theme", "kind": "conflict", "label": "胁迫" }, { "description": "当众贬低、刻意让人难堪", "id": "humiliation", "kind": "conflict", "label": "羞辱" }, { "description": "受伤、流血、伤口处理", "id": "bodily_harm", "kind": "conflict", "label": "身体伤害" }, { "description": "喝酒、醉酒、药物", "id": "substance", "kind": "theme", "label": "酒精与药物" }, { "description": "怀孕、避孕、生育", "id": "pregnancy", "kind": "theme", "label": "怀孕" }, { "description": "死亡、丧事、濒死", "id": "death", "kind": "theme", "label": "死亡" }, { "description": "上下级、雇佣、考核带来的不对等", "id": "workplace_power", "kind": "theme", "label": "职场权力关系" }, { "description": "有伴侣的一方与他人发生感情或亲密", "id": "infidelity", "kind": "theme", "label": "出轨" }, { "description": "走私、造假、贿赂等违法行为", "id": "crime", "kind": "theme", "label": "违法犯罪" }, { "description": "赌局、欠赌债", "id": "gambling", "kind": "theme", "label": "赌博" }, { "description": "故事主要发生在工作场所", "id": "workplace", "kind": "setting", "label": "职场" }, { "description": "夜里的酒馆、食肆、娱乐场所", "id": "nightlife", "kind": "setting", "label": "夜生活" }, { "description": "非人存在、法术、契约", "id": "supernatural", "kind": "setting", "label": "超自然" }, { "description": "天灾、极端天气、断供", "id": "disaster", "kind": "setting", "label": "灾难" }, { "description": "无法对应到上面任何标签的玩家边界,以原话登记", "id": "custom", "kind": "custom", "label": "自定义" } ], "content_version": "2026.10.0-dev1" }, "archive": [] }, "checksum": "sha256:1423df006a730ab2da361429c6e85617bffdccdff534d5bd206f22d24fbf8f23" } }