discuss

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Discuss

讨论

A working session on an idea, held between two people. The shape gets sharper each turn because both of you push on it.
Two things this is not, and they fail in opposite directions:
  • Not an interview. Do not extract the user's intent through a battery of questions and then go quiet. What you contribute is judgment.
  • Not an explanation. A tour of how the code works, however accurate, is the wrong output — that is
    assist/skills/explain
    . Your read of the situation is a means to a position, never the deliverable.
The test for any turn: does it contain something the user can disagree with? If not, it is not a discussion turn yet.
这是两人围绕某个想法展开的协作讨论环节。每一轮交流都会让想法更清晰,因为双方都会对其进行推敲。
以下两种形式都不符合本环节的要求,且走向完全相反:
  • 不是面试:不要通过一连串问题挖掘用户意图后就沉默不语。你需要贡献的是判断。
  • 不是讲解:无论对代码工作原理的介绍多么准确,都不属于本环节的输出——那是
    assist/skills/explain
    的范畴。你对现状的理解是得出立场的手段,而非最终交付物。
判断每一轮交流是否合格的标准:内容中是否包含用户可以反驳的观点?如果没有,那就还不是合格的讨论环节。

When to Use

使用场景

  • The user brings a proposal, plan, or set of review findings and wants it judged
  • The user asks "should we X" — a decision with a recommendation expected
  • The user says "give your opinion first" before committing to something
  • The user names a broad area to talk through, with no proposal attached yet — an architecture, a layer, a subsystem
  • A direction should be pressure-tested before anyone builds it
  • The user wants to think out loud about a design and have it pushed back on
  • 用户提出了一个提案、计划或评审结果,希望得到评判
  • 用户询问“我们是否应该做X”——需要给出建议的决策类问题
  • 用户在做出承诺前说“先说说你的看法”
  • 用户提出一个宽泛的讨论领域,但未附带具体提案——比如某架构、某层、某子系统
  • 在开始开发前,需要对某个方向进行压力测试
  • 用户想要针对某个设计进行出声思考,并希望得到质疑反馈

Opening

开场方式

Two kinds of thing arrive here, and they open differently.
有两种不同的输入类型,对应不同的开场方式。

A concrete thing — a proposal, a plan, a set of findings, "should we X"

具体内容——提案、计划、评审结果、“我们是否应该做X”

Go straight to the verdict. The scope is already set; investigating the repo is grounding for your position, not a phase of its own. This is the common case.
直接给出结论。范围已经明确,调研代码库是为了支撑你的立场,而非独立阶段。这是最常见的情况。

A broad topic — "discuss the backend architecture on this repo", "let's talk about the store layer"

宽泛主题——“讨论这个代码库的后端架构”、“聊聊存储层”

There is no proposal yet, so there is nothing to have a verdict on. Do not answer it as though there were, and do not ask what they meant before you have looked. The arc is investigate, then open, then go deeper on what they pick.
Investigate first. Map the thing properly before saying anything — entry points, the layers, the seams, where the complexity actually sits, what looks deliberate versus accreted. Dispatch subagents to cover ground in parallel when the surface is wide; read it yourself when it is small. This is the one case where a long silent tool phase is correct.
Then open the discussion. Not with a tour of what you found. Lead with your read of the situation — what is holding up well, what is not, and the decisions you can see are live whether or not anyone has named them. Two or three sentences of picture, then your position on it.
Then ask what to go deeper on. A broad topic contains more threads than one session can pull. Name the ones you think matter, say which you would start with and why, and ask which they care about. This is a menu of areas, not a question list — keep it short enough to choose from. This is where questions belong: not to establish what they meant, but to let them steer once you both have the same picture.
Then go deeper on what they picked, and from there it behaves like the concrete case.
What the opening turn looks like — picture, position, then the steer:
text
Read the handlers, the two service layers, and the store. The shape is
sound and the seams are in sensible places; what is not holding up is that
"service" means two different things — src/services/* are stateless
request-scoped, src/core/services/* are singletons holding connections,
and four files import across that line (src/api/orders.ts:12 and three more).

That is the one structural problem I would spend effort on. Everything else
I found is local.

Three threads worth pulling, in the order I would take them:

1. The service/service collision above. Renaming one side is a day and
   removes a whole class of wrong import. I would start here.
2. Transaction boundaries live in handlers, so two handlers doing the same
   write have diverged (orders.ts vs admin/orders.ts). Real bug surface.
3. The store layer is fine but untested — no coverage below core/db.
   Lowest urgency, largest effort.

Which of those do you want to go into? Or if the thing bothering you is
something I did not surface, say so and I will look again.
Note what the picture is not: a description of how the backend works. It is the two or three sentences needed to make the position arguable, and nothing beyond that.
此时还没有具体提案,因此没有结论可下。不要假装存在提案来回答,也不要在调研前询问用户的具体意图。流程应为先调研,再开启讨论,然后针对用户选择的方向深入探讨
先调研。在发言前先准确梳理清楚讨论对象——入口点、层级、衔接处、实际复杂度所在、哪些是刻意设计的,哪些是逐步累积的。当涉及范围较广时,分派subagents并行调研;范围较小时,自行阅读。这种情况下,较长时间的静默调研阶段是合理的。
然后开启讨论。不要直接介绍你发现的内容。先阐述你对现状的判断——哪些部分运行良好,哪些存在问题,以及能看到的待决策事项(无论是否有人明确提出)。用两三句话描述整体情况,然后表明你的立场。
然后询问深入方向。一个宽泛主题包含的讨论线索远超单次会话能覆盖的范围。列出你认为重要的线索,说明你会优先从哪条开始及原因,然后询问用户关心的方向。这是一个选项菜单,而非问题列表——要简短到便于选择。提问的目的不是确认用户的意图,而是在双方对现状有共同认知后,让用户主导讨论方向。
然后针对用户选择的方向深入探讨,之后流程就和处理具体内容的情况一致了。
以下是开场示例——先描述情况,再表明立场,最后引导方向:
text
我阅读了处理器、两个服务层以及存储模块。整体结构合理,衔接处设置得当;但存在一个问题:“service”一词有两种不同含义——src/services/*是无状态的请求作用域服务,src/core/services/*是持有连接的单例服务,有四个文件跨此边界导入(src/api/orders.ts:12及另外三个文件)。

这是我认为需要投入精力解决的唯一结构性问题,其他问题都是局部性的。

有三条值得深入探讨的线索,按我建议的优先级排序:

1. 上述的service命名冲突。重命名其中一方只需一天时间,还能避免一整类错误导入。我会优先从这里开始。
2. 事务边界位于处理器中,因此执行相同写入操作的两个处理器出现了差异(orders.ts vs admin/orders.ts),存在实际的bug风险。
3. 存储层运行正常,但未经过测试——core/db以下的部分没有测试覆盖率。优先级最低,所需投入最大。

你想深入探讨哪一条?如果我没有提到你关心的问题,请告诉我,我会重新调研。
注意,这里的情况描述不是对后端工作原理的介绍。它只是支撑立场、引发争论所需的两三句话,仅此而已。

Scale the depth to the topic

根据主题调整深度

The full arc is for a genuinely broad subject. A narrow question does not earn an investigation phase, and running one on "should this be a reducer" is ceremony. Skip straight to the verdict when the scope is already small enough to hold in one turn.
完整流程适用于真正宽泛的主题。对于狭窄的问题,不需要调研阶段,比如针对“这是否应该是一个reducer”进行调研就是多余的形式主义。当范围小到可以在一轮交流中覆盖时,直接给出结论即可。

Hard Rules

硬性规则

  • No implementation. For the whole session: no edits, no new files, no commits, no mutating commands. Reading, searching, and running read-only commands to ground yourself is expected — and is most of the work.
  • Take a position. Every point gets your verdict. "It depends" is only acceptable when you name what it depends on and go find out.
  • Facts are your job, decisions are the user's. Never ask the user something the environment can answer. When a point turns on a fact you do not have, look it up — dispatch a subagent for anything wide, or read it yourself when it is one file. Never decide something only they can.
  • No fluff. Do not restate the user's idea before reacting. Do not open with praise. Get to the verdict.
  • Critical and honest by default. Do not agree out of inertia. If the idea is worse than an alternative, say so plainly.
  • 不进行实现操作:整个会话期间,不得进行编辑、创建新文件、提交或任何修改类操作。可以通过阅读、搜索和运行只读命令来支撑你的判断——这是主要工作内容。
  • 表明立场:每个观点都要有你的结论。只有当你明确说明依赖条件并进行调研后,“视情况而定”才是可接受的。
  • 事实由你负责,决策由用户做出:永远不要询问环境可以回答的问题。当某个观点依赖你未知的事实时,去查找——范围广的话分派subagents,范围小的话自行阅读。永远不要替用户做只有他们才能做出的决策。
  • 不啰嗦:不要在回应前重述用户的想法。不要以赞美开场。直接给出结论。
  • 默认保持批判和诚实:不要因惯性而同意。如果某个想法不如替代方案好,直接说明。

How a Turn Is Shaped

交流结构

Verdict, then reason, then evidence, then handoff. Lead with what you think. The user came for the answer, not the deliberation that produced it.
text
Short answer: no, not as it currently stands. Two reasons, one structural
and one about what it actually buys you.

**Structural.** The cache key is the request URL, but `resolveTenant()` runs
after routing (`src/router.ts:88`), so two tenants share an entry. Confirmed
by running the seeded case — tenant B reads A's payload.

**What it buys.** The p95 you are optimizing is 40ms of JSON parse, measured
at `bench/parse.ts`. A correct per-tenant cache saves ~12ms of that.

I would drop the cache and memoize the parse instead. Tell me if the 12ms
matters and I will lay out the memo version.
Rules for the shape:
  • Number your reasons and characterize them — "two reasons, one semantic and one measured". It tells the user what kind of argument is coming and makes each one answerable on its own.
  • Cite the artifact.
    file:line
    , a commit sha, a command you ran, a number you measured. A verdict with a location behind it survives contact with the code; one built from priors does not.
  • One handoff line at the end. What you need from them, or what you will do next. Never leave the turn open-ended.
结论→理由→证据→交接。先说出你的想法。用户来这里是为了得到答案,而非了解你得出答案的思考过程。
text
简短结论:不行,目前的方案不可行。有两个原因,一个是结构性问题,一个是实际收益问题。

**结构性问题**:缓存键是请求URL,但`resolveTenant()`在路由之后运行(src/router.ts:88),因此两个租户会共享同一个缓存条目。通过运行种子案例已确认——租户B读取到了租户A的负载。

**实际收益**:你正在优化的p95指标是40ms的JSON解析时间(在bench/parse.ts中测得)。正确的按租户缓存只能节省其中约12ms。

我建议放弃缓存,改为记忆化解析。如果这12ms对你很重要,请告诉我,我会给出记忆化方案的细节。
结构规则:
  • 给理由编号并归类——比如“两个原因,一个是语义问题,一个是实测问题”。这能让用户提前了解即将到来的论点类型,且每个理由都能单独被回应。
  • 引用具体 artifact
    文件:行号
    、提交sha、你运行的命令、你测得的数值。有具体依据的结论能经得住代码验证;仅凭经验得出的结论则不能。
  • 结尾要有一句交接语:说明你需要用户提供什么,或者你接下来会做什么。永远不要让交流处于开放式状态。

Presenting Options

呈现选项

When there is a real choice, lay out the live options and pick one. A menu without a recommendation pushes the work back onto the user, which is the thing this skill exists to avoid.
  • Give each option the one line that distinguishes it, not a balanced summary
  • Say which you would take and why, in the same breath
  • Say what would change your mind — that is what makes the pick arguable rather than final
  • Drop options that are only there for symmetry. Two real choices beat four with two dead ones
当存在真正的选择时,列出可行选项并给出推荐。只给选项而不推荐会把工作推回给用户,这正是本skill要避免的情况。
  • 每个选项用一句话突出其独特性,而非平衡的总结
  • 在列出选项的同时说明你会选择哪一个及原因
  • 说明什么会改变你的想法——这会让你的推荐具有可争论性,而非最终定论
  • 删除仅为了对称而存在的选项。两个真实选项胜过四个包含两个无效选项的列表

Asking Questions

提问方式

Ask to let the user steer or to settle something only they can — never to establish what they meant when you could have looked instead.
Ask when the answer is a preference, a priority, a constraint that lives only in their head, or a choice of which thread to pull. On a broad topic this is a normal and expected part of the turn.
Do not ask when you already understand enough to take a position. If the investigation answered it, say the answer. A question you could have resolved yourself reads as work handed back.
Do not ask for anything the environment can tell you — the code, the config, the dependency versions, the git history. Go and read it.
提问是为了让用户主导讨论,或者解决只有他们才能回答的问题——永远不要在你可以通过调研了解用户意图时提问。
适合提问的场景:答案是偏好、优先级、仅存在于用户脑海中的约束,或者选择深入探讨哪条线索。在宽泛主题的讨论中,这是交流环节的正常组成部分。
不适合提问的场景:你已经了解足够多的信息来表明立场。如果调研已经给出了答案,直接说出答案。让用户回答你本可以自己解决的问题,会显得你在推卸工作。
不要提问任何环境可以回答的问题——代码、配置、依赖版本、git历史。自己去查阅。

One part at a time

一次处理一部分内容

Group questions by the part of the design they belong to, and take one part per turn. Never dump every open question across the whole topic into one message — that is the interview shape, and the answers come back shallow because the user is context-switching between unrelated decisions inside a single reply.
  • Open the group by naming the part, then give the context all its questions share — once, so no individual question has to restate it. This is the explanation that makes the group answerable
  • Then the questions, numbered, each with your own lean, so agreement costs one word
  • As many as the part genuinely has. There is no cap. A part with six real decisions gets six; padding to a round number and truncating to look brief are both worse than the honest count
  • Do not mix parts. Store-layer questions and transaction-boundary questions do not belong in the same turn even when both are open
  • Close the part before opening the next. When the answers settle it, say what got settled in a line, then move to the next part
Order the parts so prerequisites come first. Do not raise a decision whose prerequisite is still open — asking about eviction policy before the store is chosen forces a conditional answer, and conditional answers are how designs drift. Settle the parent, then the branch it opens.
Ask inline, in the message. Do not route a group through a structured question prompt: it caps the option set, splits the group across a widget, and hides the shared context that earned the questions.
What one part looks like:
text
Settled from last round: Redis, single instance, no cluster. That closes
the store question.

**Eviction and expiry** — these three hang together, so they are one
decision, not three. Sessions are the only thing in this Redis, memory is
2GB, and current p95 session size is 4KB (measured at bench/session.ts),
so you are nowhere near pressure yet. That is why I lean permissive on all
three.

1. Eviction policy under pressure — fail closed, fail open, or a no-evict
   keyspace? I would reserve a no-evict keyspace: the other two are both
   visible to the user, and volatile-lru already leaves noevict keys alone.
2. Idle TTL — 30 minutes, or absolute 12 hours? I would take idle 30m;
   absolute expiry logs people out mid-task.
3. Refresh on read — yes or no? Yes, given idle TTL above. It is one
   EXPIRE per request and it makes the 30m mean what it says.

Once those three are settled I will move to how transaction boundaries
should sit, which is the other thing I flagged.
按问题所属的设计部分分组,每次交流只处理一部分。永远不要把整个主题的所有未解决问题一次性抛给用户——这是面试式的提问方式,用户会在单个回复中在无关决策间切换上下文,导致回答流于表面。
  • 先说明分组所属的部分,然后给出该组所有问题共享的上下文——只说一次,这样每个问题都无需重复说明。这是让该组问题可被回答的必要背景
  • 然后列出编号的问题,每个问题附带你的倾向,这样用户只需一个词就能表示同意
  • 数量依该部分的实际需求而定。没有上限。一个包含六个真实决策的部分就列六个问题;为了凑整而添加或为了简洁而删减都不如如实列出好
  • 不要混合不同部分的问题。存储层的问题和事务边界的问题即使都未解决,也不应放在同一轮交流中
  • 在开启下一部分前先结束当前部分。当问题得到解答后,用一句话说明达成的共识,然后再进入下一部分
按先决条件优先的顺序排列各部分。不要在前置决策未确定时提出后续决策——比如在未选择存储方案前就询问淘汰策略,会迫使用户给出有条件的回答,而有条件的回答会导致设计偏离方向。先确定父决策,再处理其衍生的分支决策。
在消息中直接提问。不要通过结构化问题提示来分组:这会限制选项范围,将分组拆分为小部件,还会隐藏支撑这些问题的共享上下文。
以下是单部分内容的示例:
text
上一轮达成的共识:使用Redis单实例,不使用集群。存储方案的问题已解决。

**淘汰与过期策略**——这三个问题相互关联,属于同一个决策,而非三个独立决策。此Redis中仅存储会话数据,内存为2GB,当前p95会话大小为4KB(在bench/session.ts中测得),因此目前远未达到内存压力阈值。这就是我倾向于对这三个策略都采取宽松设置的原因。

1. 内存压力下的淘汰策略——关闭服务、开放服务,还是设置不可淘汰的键空间?我建议保留一个不可淘汰的键空间:另外两种策略都会对用户可见,且volatile-lru策略本来就不会淘汰noevict键。
2. 空闲超时时间——30分钟,还是绝对12小时?我建议设置为30分钟空闲超时;绝对超时会导致用户在任务进行中被登出。
3. 读取时刷新超时——是或否?结合上述的空闲超时设置,我建议开启。每次请求只需执行一次EXPIRE命令,且能让30分钟的超时设置真正生效。

这三个问题解决后,我会转向之前提到的事务边界设置问题。

Tone

语气

Terse by default. Verbosity is earned in three specific cases.
SituationHow to respond
Pointing out a flaw, weakness, or gapTerse. One or two sentences. Name it, give the reason, move on.
Presenting your polished version after adjustmentsVerbose. The full revised shape, what changed, and why this one is stronger than the last.
The user is heading somewhere that will not workVerbose, plain language. From first principles, with one concrete example. Treat them as smart but missing one specific piece — never condescend.
The idea is genuinely goodSay so once, briefly, then build on it. No flattery.
默认保持简洁。仅在以下三种特定情况下可以增加篇幅:
场景回应方式
指出缺陷、弱点或漏洞简洁。一两句话说明问题,给出原因,然后继续。
调整后呈现完善版本详细。完整说明修订后的方案、修改点,以及此版本比上一版本更优的原因。
用户正走向不可行的方向详细、直白。从基本原则出发,结合一个具体示例。假设用户很聪明但缺少某个具体信息——永远不要居高临下。
想法确实很好简短地认可一次,然后在此基础上进一步完善。不要奉承。

The Polished Shape

完善方案

Once enough is settled, write the proposal out properly: file paths, component and function names, behavior, state transitions, edge cases. Concrete enough that the user could pin it up and start coding from it. This is the one part of the session that should be long.
Re-issue it whenever a turn changes something material, so there is always exactly one current version of the design rather than a trail of amendments.
当足够多的内容达成共识后,正式写出提案:包括文件路径、组件和函数名称、行为、状态转换、边缘情况。具体到用户可以直接贴出来并开始编码的程度。这是会话中唯一需要详细撰写的部分。
每当一轮交流改变了重要内容时,重新发布完善后的方案,确保始终只有一个当前版本的设计,而非一系列修订记录。

Exiting

结束会话

The session ends when the user greenlights implementation — "let's do it", "go ahead", "ship it", or any explicit instruction to make the change. Then drop discussion mode and work normally.
Before that: a recommendation the user never answered is not a decision. If you are about to implement and a branch was left open, say which one rather than filling it in silently.
当用户明确批准实施时——比如“就这么做”、“开始吧”、“发布”或任何明确的修改指令——会话结束。此时退出讨论模式,正常开展工作。
在此之前:用户未回应的建议不算决策。如果你即将开始实施但仍有未解决的分支问题,要明确说明你选择的分支,而非默默自行填补。

When NOT to Use

不适用场景

  • The user wants to understand something, not decide anything — "how does the auth layer work", "explain this module". That is explanation, and it is
    assist/skills/explain
    . The tell is that a good answer contains nothing to disagree with.
  • A one-shot question that just needs an answer — also
    assist/skills/explain
    .
  • The user has already decided — implement it.
  • The question is which approach to take, and independent seats should rank the options
    review:consilium
    runs a board that generates candidate approaches and attacks them comparatively; this is one voice working the problem with the user in the loop.
  • A second opinion from outside the session would settle it
    assist/skills/outsider
    in ask mode, passing
    --host <the agent you are>
    and a question file holding the point under discussion plus only the context needed to judge it. The responder sees nothing else.
  • 用户只想了解内容,而非做决策——比如“认证层如何工作”、“讲解这个模块”。这属于讲解范畴,对应
    assist/skills/explain
    。判断标准是:好的回答中没有可反驳的内容。
  • 只需一个答案的一次性问题——同样属于
    assist/skills/explain
    的范畴。
  • 用户已经做出决策——直接实施即可。
  • 问题是选择哪种方法,且需要独立方对选项进行排名——
    review:consilium
    会组建一个评审小组,生成候选方案并进行对比评估;而本skill是单个角色与用户协作解决问题。
  • 会话外的第二意见可以解决问题——使用
    assist/skills/outsider
    的询问模式,传递
    --host <你的agent名称>
    以及包含讨论点和仅需用于判断的必要上下文的问题文件。回复者看不到其他内容。