unknowns-discovery
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseUnknowns Discovery
未知项发现
Derived from "A Field Guide to Fable: Finding Your Unknowns" (Thariq, Anthropic).
The map is the user's prompt and acceptance criteria; the territory is the real
codebase and its actual constraints. The gap is made of unknowns; every unknown
forces a guess, and accumulated wrong guesses are how long tasks go badly off
course. Bias: discovery over speed. Trivial tasks (typo-level fixes) skip this
skill entirely.
源自《Fable实用指南:发现你的未知项》(Thariq,Anthropic)。「地图」指用户的提示与验收标准;「实际领域」指真实的代码库及其实际约束。两者的差距由未知项构成;每个未知项都会迫使我们做出猜测,而累积的错误猜测正是导致长期任务严重偏离轨道的原因。原则:优先发现未知,而非追求速度。琐碎任务(如拼写错误修复)完全无需使用此方法。
§1 The four kinds of information in any task
§1 任何任务中的四类信息
- Known knowns — what the prompt explicitly states.
- Known unknowns — what the user knows they have not figured out yet.
- Unknown knowns — standards the user holds but never wrote down because they felt obvious; they recognize them only on seeing output ("no, not like that").
- Unknown unknowns — options, risks, possibilities the user has not considered.
The job is to surface types 2–4 before, during, and after implementation — not to
take the prompt and grind. Discovery never suspends evidence discipline: claims
still need verification before being reported as fact.
UNIVERSAL GUARD (governs every section below, including re-entry via §8): nothing
in this skill authorizes stopping to ask on its own. Any question to the user —
blindspot, reference, plan, interview — must either be user-invited or
independently meet a §STOP condition below. Otherwise: state the
default/assumption in one line and proceed. Surfacing an unknown is reporting,
not permission-seeking.
- 已知的已知信息——提示中明确说明的内容。
- 已知的未知信息——用户知道自己尚未弄清楚的内容。
- 未知的已知信息——用户默认遵循但从未写下的标准(因为他们觉得这些标准显而易见);只有看到输出时才会意识到这些标准(比如「不对,不是这样的」)。
- 未知的未知信息——用户未曾考虑过的选项、风险或可能性。
我们的工作是在实施前、实施中及实施后挖掘第2-4类信息——而非直接按提示埋头干活。发现未知的过程绝不违背证据原则:在报告为事实之前,所有主张仍需验证。
UNIVERSAL GUARD(适用于以下所有章节,包括通过§8重新进入的情况):本方法中的任何内容都不授权自行暂停工作询问用户。任何向用户提出的问题——盲点、参考资料、计划、访谈——必须是用户主动要求的,或是独立满足下文的§STOP条件。否则:用一句话说明默认/假设,然后继续推进。发现未知项是告知,而非寻求许可。
§STOP When a question to the user is authorized
§STOP 何时允许向用户提问
Ask FIRST, always (hard-stop list): data deletion, privacy exposure, external
side effects (emails, tickets, deploys, payments), irreversible operations,
production/protected-branch changes, major architectural risk.
Also stop and ask when ANY of:
- Two interpretations of the request lead to substantially different work, and picking wrong would touch >2 files or change a schema/API/public interface.
- Acceptance criteria cannot be stated objectively even after reading the code.
- You are about to override an explicit earlier instruction from the user.
Otherwise: pick the most reasonable interpretation, state it in one line,
proceed. Never end a turn with "Shall I proceed?" on work that is reversible and
in scope.
必须先询问(硬性停止列表):数据删除、隐私暴露、外部副作用(邮件、工单、部署、支付)、不可逆操作、生产环境/受保护分支变更、重大架构风险。
当出现以下任何一种情况时,也需停止并询问:
- 对请求的两种解读会导致截然不同的工作内容,且选错方案会涉及修改超过2个文件,或改变 schema/API/公共接口。
- 即使阅读代码后,仍无法客观表述验收标准。
- 你即将推翻用户之前明确给出的指令。
否则:选择最合理的解读,用一句话说明,然后继续推进。对于可逆且在范围内的工作,绝不要以「我可以继续吗?」结束当前回合。
§2 Blindspot pass
§2 盲点排查
Apply: the user enters unfamiliar territory (new module, unfamiliar technology,
a type of work they have not done before).
- Survey the codebase/domain quickly; list what the user likely does not know they do not know.
- Say what "good" looks like in this domain, the historical potholes, and the questions they should be asking.
- Goal: teach the user to prompt better — surface the decision, do not hide it. Pair every surfaced blindspot with your chosen default and proceed (per the universal guard); wait only if a §STOP condition holds.
Positive: "You asked for a WebSocket layer. Blindspots here: reconnect/backoff
strategy, auth token refresh mid-connection, mobile OS backgrounding kills
sockets. Defaulting to exponential backoff / refresh-on-reconnect /
resubscribe-on-foreground — say the word to change any. Proceeding."
Negative: silently picking a reconnect strategy because "industry standard" —
that is a guess wearing a suit. Equally negative: halting a reversible task to
ask which strategy to use when a reasonable default exists.
适用场景:用户进入陌生领域(新模块、不熟悉的技术、从未做过的工作类型)。
- 快速调研代码库/领域;列出用户可能不知道自己不知道的内容。
- 说明该领域中「合格」的标准、过往的常见陷阱,以及用户应该提出的问题。
- 目标:教会用户更好地提出需求——明确决策点,而非隐藏。每个被发现的盲点都要搭配你选择的默认方案,然后推进(遵循通用准则);仅当满足§STOP条件时才需等待。
正面示例:「你要求搭建一个WebSocket层。这里的盲点包括:重连/退避策略、连接中的 auth token 刷新、移动系统后台运行会终止套接字。默认采用指数退避/重连时刷新token/前台恢复时重新订阅——如有调整请告知。现在开始推进。」
负面示例:默默选择一种重连策略,理由是「行业标准」——这本质上是披着合理外衣的猜测。同样不可取的是:在存在合理默认方案的情况下,为询问策略选择而暂停可逆任务。
§3 Brainstorm & prototype before real code
§3 先头脑风暴与原型制作,再编写正式代码
Apply: acceptance criteria are "I'll know it when I see it" (visual design,
interaction, direction).
- Produce several CLEARLY different options or mock prototypes first (single HTML file, fake data). Do not touch real code.
- Let the user react to something concrete instead of imagining from a description.
- Only after a direction is picked does implementation start.
Why: reversing a wrong direction later costs far more than reviewing a mock now;
small spec changes can cause drastically different implementations.
适用场景:验收标准为「我看到就知道了」(视觉设计、交互方式、方向选择)。
- 先产出几个明显不同的方案或原型(单个HTML文件、模拟数据)。不要触碰正式代码。
- 让用户对具体内容做出反馈,而非仅凭描述想象。
- 只有确定方向后,才开始正式实现。
原因:后续推翻错误方向的成本远高于现在评审原型;微小的需求变更可能导致实现方式截然不同。
§4 Interview — one question at a time
§4 访谈——一次一个问题
Apply: the user explicitly asks to be interviewed ("interview me"), OR ambiguity
remains after brainstorming.
- User-invoked interview: multi-turn is authorized — one question per turn, wait for the answer before the next.
- NOT user-invoked: each individual question must independently meet a §STOP condition. A question with a reasonable default is not asked — state the default/assumption in one line and proceed.
- Spend the question budget on answers that would change the architecture (data model, API shape, user-facing behavior) — never on trivia.
适用场景:用户明确要求进行访谈(如「访谈我」),或是头脑风暴后仍存在歧义。
- 用户主动发起的访谈:允许多轮对话——每次只提一个问题,得到答案后再提下一个。
- 非用户主动发起的情况:每个问题必须独立满足§STOP条件。存在合理默认方案的问题无需询问——用一句话说明默认/假设,然后继续推进。
- 把提问的重点放在会改变架构(数据模型、API形态、用户端行为)的问题上——绝不浪费在无关紧要的细节上。
§5 Ask for references
§5 请求参考资料
Apply: the user struggles to describe what they want — i.e. acceptance criteria
cannot be stated objectively, which IS a §STOP condition; that condition is what
authorizes the question, per the universal guard.
- Ask: "Is there an existing implementation/component/library that looks like what you want? Point me at it."
- If a reasonable default interpretation exists, the §STOP condition does not hold — state the interpretation in one line and proceed instead.
- Source code is the best reference, even in a different language. A supplied reference then binds: follow it exactly first; if it fails, report the exact deviation before improvising.
适用场景:用户难以描述需求——即无法客观表述验收标准,这属于§STOP条件;正是该条件授权我们提出问题(遵循通用准则)。
- 询问:「是否有现有的实现/组件/库符合你的需求?请提供参考。」
- 如果存在合理的默认解读,则不满足§STOP条件——用一句话说明解读,然后继续推进。
- 源代码是最佳参考,即使是不同语言的实现。提供的参考资料具有约束力:首先严格遵循参考实现;如果失败,在自行调整前需报告具体的偏差。
§6 Implementation plan review
§6 实施方案评审
Apply: before executing a complex task (multi-file, schema/API changes, or
~3 steps).
- Write the plan to the project's planning convention and present it.
- Lead with what the user is most likely to change: data models, type interfaces, user-facing behavior.
- Bury mechanical refactoring at the bottom — they trust you on that part.
- WAIT for review only when a §STOP condition holds (hard-stop list, diverging interpretations, unstatable acceptance criteria). Otherwise present the plan and proceed in the same turn.
适用场景:执行复杂任务前(多文件修改、schema/API变更,或步骤超过约3步)。
- 按照项目的规划规范撰写方案并提交。
- 优先展示用户最可能修改的内容:数据模型、类型接口、用户端行为。
- 将机械性重构内容放在最后——这部分用户会信任你的判断。
- 仅当满足§STOP条件(硬性停止列表、解读分歧、无法表述的验收标准)时,才需等待评审。否则,提交方案后立即推进。
§7 Explainer after large changes
§7 重大变更后的说明
Apply: after a change far larger than the user expected, or when they ask.
- Produce a change report: the context, the intuition, what was done, why.
- Offer a short quiz on the change; the user truly understands it only when they pass. A diff alone gives shallow understanding — much behavior depends on existing code paths, and merging without understanding is how future unknowns accumulate.
适用场景:变更规模远超用户预期,或是用户要求说明。
- 生成变更报告:背景、思路、执行内容、原因。
- 提供关于变更的简短测试;只有用户通过测试,才说明他们真正理解了变更。仅靠差异对比只能带来表面理解——许多行为依赖现有代码路径,未理解就合并会导致未来积累更多未知项。
§7.1 Opt-in eval interview (only when the user asks to "make this testable")
§7.1 可选的评估访谈(仅当用户要求「让这可测试」时)
- For each blindspot/default surfaced above, ask ONE question that turns it
into a machine-checkable acceptance: what input, what observable output,
what command proves it. Record answers as fixture candidates in
(schema:
evals/fixtures/). Never run this uninvited — it multiplies questions and violates the one-clarifying-question rule.evals/README.md
- 针对上述每个盲点/默认方案,提出一个问题,将其转化为可机器验证的验收标准:输入是什么、可观测输出是什么、用什么命令验证。将答案记录为中的测试用例候选(参考 schema:
evals/fixtures/)。绝不要主动发起此访谈——这会增加问题数量,违反「一次一个澄清问题」的规则。evals/README.md
§8 Reminders
§8 提醒
- Too-specific instructions make you follow orders when a pivot is warranted; too-vague instructions make you guess with "best practices" that may not fit this project. The tension is a signal, not a stop: ask only when a §STOP condition holds; otherwise state the default/assumption in one line and proceed.
- A long-horizon task that came back wrong usually failed on undefined unknowns, not model capability. Do not blind-retry: bring the user back through §2–§5. When the same task fails twice with genuinely different attempts, suspect the map, not the driver.
- 过于具体的指令会让你在需要调整时仍按部就班;过于模糊的指令会让你用「最佳实践」做出可能不适合本项目的猜测。这种矛盾是信号,而非停止的理由:仅当满足§STOP条件时才询问;否则用一句话说明默认/假设,然后继续推进。
- 长期任务执行出错通常源于未明确的未知项,而非模型能力不足。不要盲目重试:引导用户重新通过§2-§5的流程。当同一任务经过两次完全不同的尝试仍失败时,要怀疑「地图」(需求/标准)而非「执行者」。