一句话 · One-line

中文:一个面向高考志愿填报(选学校/选专业)的反思游戏变体:当一个学生在好学校差专业差学校好专业之间纠结时,卡点不是信息,而是对一个自己还无法切身感受的未来所做的判断。让他们在每个选项下亲历一段模拟的多年人生轨迹,然后从这段亲历经验所揭示的、关于他们自己价值观的东西出发,回溯推理当下的选择。依照反思游戏的核心原则,它浮现他们的偏好——而不做推荐。

EN: A reflection-game variant for 高考志愿填报 (major/school choice): when a student is torn between 好学校差专业 vs 差学校好专业, the blocker isn’t information, it’s judgment about a future they can’t yet feel. Let them live a simulated multi-year trajectory under each option, then backward-reason the present choice from what the lived experience revealed about their own values. Per the reflection-game core principle, it surfaces their preference — it does not recommend.

构建状态 — MVP 已建成(2026-06-11,自主运行)· Build status — MVP BUILT (2026-06-11, autonomous run)

端到端可玩 · Playable end-to-end. Branch gaokao-variant in meno-sh/reflection-game (not yet merged).

中文:整个闭环的可运行 MVP 已存在并能实时运行:录入 → 实时跑出两种未来 → 回溯推理之镜。

EN: A working MVP of the full loop exists and runs live: intake → live BOTH futures → backward-reasoning mirror.

中文已建成的内容gaokao/ 包,复用涌现式世界引擎作为人生底座):

  • trajectory.py —— 人生阶段底座:一个「回合」= 一个关键人生阶段(大一→毕业→求职→回望);模型为每个阶段生成场景 + 2–3 个带价值标签的选项;StateManager 让人生跨阶段保持连贯(已验证:室友、GPA、专业挣扎这条线索都会延续)。遇 API 错误会带退避重试。
  • profile.py —— PersonalityFile(问卷 + 自由文本 + 所选维度向量的滑动均值),注入是为了相关性,而非肯定(防回音室护栏)。
  • compare.py —— 确定性的跨人生信号(一个价值在两个选项世界里都被往同一方向推 = 揭示出一项核心价值;翻转的那种 = 依情境而定)+ 一个 LLM 镜子,把这些价值作为待检验的假设反射回去,绝不推荐任何一个选项。
  • demo.py —— run_pipeline:两个选项世界都跑一遍,结尾 = 对两条维度轨迹做镜像反思。
  • web.py —— 可玩的异步网页应用(录入表单 + 8 个价值滑块 → 流式跑出两段人生 → 镜子)。Live demo: https://easy-justify-implementation-piece.trycloudflare.com(临时隧道;目前未加门禁)。
  • school_tier.py + real_data/school_index_sample.json —— 真实录取数据(来自公开的 labolado/gaokao_2016-2020):约 490 所学校,带 985/211/双一流 标记 + 分数线;build_gaokao_seed 用学校的真实层级给每段人生打地基,而不是靠猜。

EN: What’s built (gaokao/ package, reusing the emergent world-engine as the life substrate):

  • trajectory.py — life-stage substrate: a “turn” = a pivotal life stage (大一→毕业→求职→回望); the model invents each scene + 2–3 value-tagged options; the StateManager keeps the life coherent across stages (verified: roommate, GPA, the major-struggle thread persist). Retries API errors w/ backoff.
  • profile.pyPersonalityFile (questionnaire + free-text + running mean of chosen dimension vectors), injected for relevance, not affirmation (echo-chamber guardrail).
  • compare.pydeterministic cross-life signal (a value pushed the same way in both option-worlds = a revealed core value; one that flips = context-dependent) + an LLM mirror that reflects those values back as a hypothesis to check, never recommending an option.
  • demo.pyrun_pipeline: both option-worlds run, ending = the mirror over both dim-traces.
  • web.pyplayable async web app (intake form + 8 value sliders → streams both lives → mirror). Live demo: https://easy-justify-implementation-piece.trycloudflare.com (ephemeral tunnel; un-gated for now).
  • school_tier.py + real_data/school_index_sample.jsonreal admission data (from public labolado/gaokao_2016-2020): ~490 schools with 985/211/双一流 flags + cutoffs; build_gaokao_seed grounds each life in the school’s real tier instead of guessing.

中文关键发现:

  • 单回合质量很强,且「没有标准答案」原则成立(镜子点出跨人生的模式,把它框定为假设,什么都不推荐)。
  • 延迟是产品的墙: V4-Pro 约 50 秒/阶段;把两段人生并行几乎没帮上忙(在一个 key 上,供应商对并发的推理调用做了限流)。DeepSeek-V3(非推理)约 19 秒/阶段 = 在可比质量下快 2.5–3 倍 → 现已成为轨迹生成的默认(镜子继续用 V4-Pro)。
  • 共享的 OpenRouter key 在负载下会 429 → 真要上线的产品需要更高档位 / 多个 key。

EN: Key findings:

  • Single-turn quality is strong and the no-right-answer principle holds (the mirror names the cross-life pattern, frames it as a hypothesis, recommends nothing).
  • Latency is the product wall: V4-Pro ~50s/stage; parallelizing the two lives barely helped (provider throttles concurrent reasoning calls on one key). DeepSeek-V3 (non-reasoning) ~19s/stage = 2.5–3× faster at comparable quality → now the default for trajectory gen (the mirror keeps V4-Pro).
  • The shared OpenRouter key 429s under load → a launched product needs a higher tier / multiple keys.

中文待定的分叉(等决策): MVP 会按用户陈述的滑块倾向自动选定每个阶段(一路直跑到底)。下一个大动作要么是 缓存原型路径(近乎即时),要么是 交互式逐阶段 v2(揭示 > 陈述的偏好)。

EN: Open fork (awaiting decision): the MVP auto-picks each stage from the user’s stated slider-leaning (runs straight through). Next big build is either the cached-archetype path (near-instant) or the interactive per-stage v2 (revealed > stated preference).

为什么它契合这套工具 · Why this fits the instrument

中文:反思游戏是一台偏好引出仪器,不是推荐器:它通过让你亲历选择、而非抽象地排序选择,来浮现你心之所向,并且不泄露任何「标准答案」。志愿填报决策恰恰是这样一类情形——陈述出来的偏好不可靠(名校偏见、父母压力、同辈噪声),真正要紧的是亲历出来的偏好。模拟轨迹把一个 18 岁的抽象猜测,变成一个有过经历的判断。

EN: The reflection game is a preference-elicitation instrument, not a recommender: it surfaces what’s close to your heart by making you live choices rather than rank them abstractly, and it leaks no “right answer.” A 志愿填报 decision is exactly a case where stated preferences are unreliable (prestige bias, parental pressure, peer noise) and lived preference is what matters. Simulating the trajectory turns an abstract 18-year-old guess into an experienced one.

功能 · Features

中文

  1. 录入 / 个性化。 学生输入他们的两个真实选项(学校 A + 专业 X 对 学校 B + 专业 Y)、兴趣、约束(城市、家庭、预算、风险承受度)。这给两条轨迹打种子——泛泛的原型不会让人投入。
  2. 两条并行的人生轨迹,每个选项一条,作为一段压缩的多年弧线来演(本科 → 实习 → 第一份工作 → ~5–10 年视野)。每条不是固定故事,而是由涌现式世界引擎从一颗薄薄的种子(画像 + 选项 + 真实结果统计)实时生成,在真正要紧的时刻有分叉。
  3. 引出价值的分叉,映射到一条(隐形的)偏好脊柱,由既有的 8 维模型改写到人生决策轴——例如激情 ↔ 务实、安全 ↔ 成长、声望 ↔ 契合、靠近家人 ↔ 独立、深度 ↔ 广度、金钱 ↔ 意义。每个生成的选项都带一个经过验证的维度标签(跨玩家研究的效度挂钩)。
  4. 亲历后果的质感(对称)。 两条路都获得同等丰富的好处与坏处:好学校差专业 → 强人脉/品牌,但多年学着自己厌恶的东西 → 分叉(转专业 / 熬过去 / 借品牌转行);差学校好专业 → 你热爱这个领域,但人脉更薄 → 分叉(出类拔萃脱颖而出 / 感到资源不足 / 转学)。学生从两边都感受到这个取舍。
  5. 回溯推理的反思结尾。 亲历两段之后,仪器把轨迹所揭示的反射回去——哪段亲历经验有共鸣,哪些价值在压力下占了上风——并把它映射到当下的选择,作为镜子、而非神谕(「你的选择一直偏向契合而非品牌」,而不是「选 B」)。
  6. 比较模式(相对单弧游戏的新东西):玩两条轨迹,然后做一步比较/反思。可选一个「互换」——把某个分叉换个方向重玩——来测试揭示出的偏好有多稳定。
  7. 中文优先。 双语基建(?lang)已经把中文作为主界面支持;弧线/种子以中文撰写。

EN:

  1. Intake / personalization. The student enters their two real options (school A + major X vs school B + major Y), interests, constraints (city, family, budget, risk tolerance). This seeds both trajectories — generic archetypes won’t engage.
  2. Two parallel life-trajectories, one per option, played as a compressed multi-year arc (undergrad → internships → first job → ~5–10 yr horizon). Each is not a fixed story but generated live from a thin seed (profile + option + real outcome stats) by the emergent world-engine, with branching forks at the moments that actually matter.
  3. Value-eliciting forks, mapped to an (invisible) preference spine adapted from the existing 8-dim model to life-decision axes — e.g. passion ↔ pragmatism, security ↔ growth, prestige ↔ fit, proximity-to-family ↔ independence, depth ↔ breadth, money ↔ meaning. Every generated option carries a validated dimension tag (the cross-player research validity hook).
  4. Lived-consequence texture (symmetric). Both paths get equally rich upside and downside: 好学校差专业 → strong network/brand but years studying something you resent → forks (switch major / endure / pivot career via the brand); 差学校好专业 → you love the field but a thinner network → forks (excel and stand out / feel under-resourced / transfer). The student feels the trade-off both ways.
  5. Backward-reasoning reflection ending. After living both, the instrument mirrors back what the trajectories revealed — which lived experience resonated, which values dominated under pressure — and maps that to the present choice as a mirror, not an oracle (“your choices kept favouring fit over brand,” not “pick B”).
  6. Comparative mode (new vs the single-arc game): play both trajectories, then a compare/reflect step. Optionally a “swap” — replay a fork the other way — to test how stable the revealed preference is.
  7. Chinese-first. The bilingual infra (?lang) already supports 中文 as the primary surface; arcs/seeds authored in Chinese.

数据从哪来 · Where to get the data

中文

  • 录取/可行性数据(哪个选项才现实):院校/专业录取分数线、招生计划、选科要求 —— 公开的阳光高考 / 各省考试院数据集,或一次性爬取成一张查找表,录入时用它来校验。
  • 给轨迹打地基的结果数据(让模拟不是空想):毕业生就业质量报告(多数高校都会发布)、专业就业率/对口率/薪资(麦可思/MyCOS 式报告),以及亲历经验语料(知乎/小红书/贴吧上关于「好学校差专业 vs 差学校好专业」的帖子、转行故事)—— 作为生成器的检索地基,而非逐字照搬。
  • 轨迹生成: 涌现式引擎(Track B)从一颗薄种子 + 画像生成出可信的人生路径,上面的结果数据为条件(RAG 式),让分叉和后果是真实的、而非编造的。数据约束,LLM 演绎。
  • 价值/分叉内容: 改写既有弧线的分叉语法 + 8 维脊柱;撰写 3–5 个志愿填报种子骨架(原型决策形状)来锚定生成器。

EN:

  • Admission/feasibility data (which option is even realistic): 院校/专业录取分数线, 招生计划, 选科要求 — public 阳光高考 / 各省考试院 datasets, or a one-time scrape into a lookup the intake validates against.
  • Outcome data to ground trajectories (so simulations aren’t fantasy): 毕业生就业质量报告 (most universities publish these), 专业就业率/对口率/薪资 (麦可思/MyCOS-style reports), and lived-experience corpora (知乎/小红书/贴吧 threads on “好学校差专业 vs 差学校好专业”, career-switch stories) — used as retrieval grounding for the generator, not verbatim.
  • Trajectory generation: the emergent engine (Track B) generates the plausible life path from a thin seed + the profile, conditioned on the outcome data above (RAG-style) so forks and consequences are realistic, not invented. The data constrains; the LLM dramatizes.
  • Value/fork content: adapt the existing arcs’ branching grammar + the 8-dim spine; author 3–5 志愿填报 seed-scaffolds (archetypal decision shapes) to anchor the generator.

相对当前游戏改了什么 · What changes from the current game

中文

  • 时间尺度: 当前的弧线是一个瞬间(约 1 小时,一个场景→决策);这个需要多年弧线。→ 使用/扩展涌现式世界引擎(Track B)——它的世界状态账本 + 开放式回合生成正是一套人生轨迹底座;emergent_turn_cap(=12)给长度封顶。
  • 生产环境上真实 LLM: 轨迹生成要求走 LLM 路径,所以被搁置的 Track-B 阻塞项——Render 环境上的 OPENROUTER_API_KEY——成了硬性前置条件(生产环境目前无 key → 今天用 Mock)。
  • 偏好脊柱: 把 8 个维度重新映射到人生决策轴(见上);保持它们隐形(研究效度的脊柱),但验证每个生成的选项都带标签。
  • 新界面: 录入表单;比较型双轨迹流程;与当下选择挂钩的回溯推理结尾(当前的结尾只给玩家画像)。
  • 地基层: 一步检索(结果数据 → 生成器上下文),这是已撰写的弧线所没有的。
  • 存档/续玩(刚上线)在这里更要紧——多年轨迹很长,所以续玩是必需的。

EN:

  • Time-scale: current arcs are one moment (~1h, one scene→decision); this needs a multi-year arc. → use/extend the emergent world-engine (Track B) — its world-state ledger + open-ended turn generation is exactly a life-trajectory substrate; the emergent_turn_cap (=12) bounds length.
  • Real LLM on prod: trajectory generation requires the LLM path, so the parked Track-B blocker — OPENROUTER_API_KEY on the Render env — becomes a hard prerequisite (prod is keyless → Mock today).
  • Preference spine: re-map the 8 dims to life-decision axes (above); keep them invisible (the research-validity spine) but validate every generated option carries a tag.
  • New surfaces: intake form; comparative two-trajectory flow; backward-reasoning ending that ties to the present choice (the current ending only profiles the player).
  • Grounding layer: a retrieval step (outcome data → generator context) that the authored arcs don’t have.
  • Save/resume (just shipped) matters more here — multi-year trajectories are long, so resuming is essential.

问题以及我们怎么解决 · Problems & how we solve them

中文

  1. 编造 / 假精确。 一条生成的轨迹可能读起来像预言。→ 把每个分叉/后果都锚定在结果语料里(RAG);在涌现式效度检查里加一道真实性闸门;把整件事明确框定为一场为了感受取舍的模拟而非预测——浮现不确定性,绝不给数字。
  2. 没有标准答案的完整性(核心原则)。 仪器绝不能倾向某一个选项(尤其是「好专业」的陈词滥调)。→ 对称生成(两条路获得同等丰富的好处/坏处);维度标签的中立纪律(没有分叉泄露一个「开明」的选择);反思是对他们揭示出的价值的一面镜子,绝非推荐。
  3. 效度——模拟的经验真能揭示真实偏好吗? → 保留隐形的 8 维脊柱以支持跨玩家可比性;用既有仪器验证这个变体(它能否复原同一个人的画像?);把回溯推理的输出当作学生拿来对照自己检验的假设,而非判决。
  4. 长度 / 投入度。 两条多年弧线可能拖沓。→ emergent_turn_cap + 压缩(跳到要紧的分叉);存档/续玩;让学生在某个分叉解决后跳过一条路。
  5. 无真值的质量评估(悬而未决的 Track-B 问题)。 这里同样适用。→ MVP:在几个种子形状上做人工抽查,看真实性 + 中立性;更长期靠悬而未决的 Track-B 质量评估工作。
  6. 中文情境的冷启动数据。 → MVP 不需要详尽数据:3–5 个手写种子骨架(常见的 好/差 × 学校/专业 原型)锚定在一个的精选结果集上,再加生成器做个性化。等第一个可用版本之后再扩展数据层。

EN:

  1. Fabrication / false precision. A generated trajectory could read like prophecy. → Ground every fork/consequence in the outcome corpus (RAG); add a realism gate in the emergent validity check; frame the whole thing explicitly as a simulation to feel the trade-off, not a prediction — surface uncertainty, never a number.
  2. No-right-answer integrity (the core principle). The instrument must not tilt toward one option (esp. the “good major” cliché). → Symmetric generation (both paths get equal upside/downside richness); the dimension-tag neutrality discipline (no fork leaks an “enlightened” choice); the reflection is a mirror of their revealed values, never a recommendation.
  3. Validity — does simulated experience reveal real preference? → keep the invisible 8-dim spine for cross-player comparability; validate the variant against the existing instrument (does it recover the same person’s profile?); treat the backward-reasoning output as a hypothesis the student checks against themselves, not a verdict.
  4. Length / engagement. Two multi-year arcs could drag. → emergent_turn_cap + compression (jump to the forks that matter); save/resume; let the student skip a path once a fork resolves.
  5. Quality eval without ground truth (the open Track-B problem). Applies here too. → MVP: human spot-checks for realism + neutrality on a few seed shapes; longer-term, the open Track-B quality-eval work.
  6. Cold-start data for the Chinese context. → MVP doesn’t need exhaustive data: 3–5 hand-authored seed-scaffolds (the common 好/差 × 学校/专业 archetypes) grounded in a small curated outcome set, + the generator for personalization. Expand the data layer after the first usable build.

MVP 切片(最小的真东西)· MVP cut (smallest thing that’s real)

中文

  • 录入(学生的两个真实选项 + 几个画像字段)→ 种子。
  • 涌现式引擎(带 key)从一个精选种子骨架 + 一个小的有地基的结果集,给每个选项生成一条轨迹,带价值标签的分叉。
  • 一个比较 + 回溯推理的中文结尾。
  • 前置条件:Render 上的 OpenRouter key。建在既有仓库之上(core/emergent.py、世界状态账本、8 维脊柱、存档/续玩)。

EN:

  • Intake (the student’s two real options + a few profile fields) → seeds.
  • The emergent engine (keyed) generating one trajectory per option from a curated seed-scaffold + a small grounded outcome set, with value-tagged forks.
  • A compare + backward-reasoning ending in 中文.
  • Prereq: OpenRouter key on Render. Built on the existing repo (core/emergent.py, the world-state ledger, the 8-dim spine, save/resume).

悬而未决的设计抉择(需要人)· Open design calls (need a human)

中文

  • 把 8 个维度重新映射到人生决策轴(哪 8 个?)。
  • 回溯推理要多直白(「你的选择偏向契合而非品牌」——直白到什么程度它就不再是镜子了?)。
  • 在允许生成器演绎之前,要求多少真实数据(地基/真实性阈值)。

EN:

  • Re-mapping the 8 dims to life-decision axes (which 8?).
  • How explicit to make the backward-reasoning (“your choices favoured fit over brand” — how directive before it stops being a mirror?).
  • How much real data to require before the generator is allowed to dramatize (the grounding/realism threshold).