重要前提
安装AI Skills的关键前提是:必须科学上网,且开启TUN模式,这一点至关重要,直接决定安装能否顺利完成,在此郑重提醒三遍:科学上网,科学上网,科学上网。查看完整安装教程 →
npx skills add https://github.com/open-horizon-labs/skills --skill solution-space在投入实施前探索候选解决方案。陷阱在于固守第一个可行的想法。
解决方案空间位于问题陈述和实施之间。你已经明确了问题;现在在选择一个方案之前,先规划各种方法。
在以下情况下调用 /solution-space:
不要在以下情况下使用: 你仍在澄清问题。先使用 /problem-statement。解决方案空间假定问题已明确。
"设计中最难的部分从来不是想出想法。而是放弃第一个可行的想法去寻找更好的。"
探索是廉价的。失败模式在于固守第一个可行的解决方案。
你陷入局部最优的迹象:
并非所有问题都需要重新设计。这个阶梯帮助你找到合适的高度。
修补症状。
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
示例:添加空值检查。捕获异常。硬编码边缘情况。
更好,但有局限。 在当前假设内进行优化。
示例:提取方法。添加参数。为可读性重构。
现在你开始思考了。 质疑问题陈述。
示例:"我们需要更快的缓存失效" 变成 "我们为什么要缓存这个?"
这才是目标。 改变系统,使问题不复存在。
示例:与其修复同步冲突,不如让数据流单向流动。
在探索解决方案之前,确认问题陈述:
"我们要解决的问题是:[陈述]。关键约束是:[约束]。成功看起来像:[结果]。"
如果你不能清晰地陈述这一点,请返回 /problem-statement。
在评估任何方案之前,列出至少 3-4 个候选方法:
## 候选解决方案
### 选项 A:[名称]
- 方法:[简要描述]
- 级别:[Band-Aid / Local Optimum / Reframe / Redesign]
- 权衡:[主要成本]
### 选项 B:[名称]
...
此步骤的规则:
针对每个候选方案,评估:
提出建议并说明原因:
## 推荐
**方法:** [选定的选项]
**级别:** [Band-Aid / Local Optimum / Reframe / Redesign]
**选择此方案的原因:**
- [原因 1]
- [原因 2]
**不选择其他方案的原因:**
- 选项 A:[拒绝原因]
- 选项 B:[拒绝原因]
**我们已知并接受的权衡:**
- [权衡 1]
- [权衡 2]
在投入之前,自问:
如果你进行了真正的探索,最终仍然选择了第一个想法,那也没关系。危险在于从未审视过其他可能。
## 解决方案空间分析
**问题:** [一句话]
**关键约束:** [绑定约束]
### 考虑的候选方案
| 选项 | 级别 | 方法 | 权衡 |
|--------|-------|----------|-----------|
| A | [级别] | [简述] | [成本] |
| B | [级别] | [简述] | [成本] |
| C | [级别] | [简述] | [成本] |
### 评估
**选项 A:[名称]**
- 解决所述问题:[是/部分/否]
- 实施成本:[低/中/高]
- 维护负担:[低/中/高]
- 二阶效应:[描述]
[为每个选项重复]
### 推荐
**选定:** 选项 [X] - [名称]
**级别:** [Band-Aid / Local Optimum / Reframe / Redesign]
**理由:** [为什么这种方法符合约束条件]
**接受的权衡:**
- [权衡 1]
- [权衡 2]
### 实施说明
[针对选定方法的具体考虑事项]
/solution-space
Users report the dashboard is slow. Loading takes 8 seconds.
输出:
## 解决方案空间分析
**问题:** 仪表板加载需要 8 秒;用户期望 <2 秒
**关键约束:** 本季度无法重写整个前端
### 考虑的候选方案
| 选项 | 级别 | 方法 | 权衡 |
|--------|-------|----------|-----------|
| A | Band-Aid | 添加加载指示器 | 不解决速度慢的问题 |
| B | Local Optimum | 添加缓存层 | 缓存失效的复杂性 |
| C | Reframe | 懒加载仪表板部分 | 轻微改变用户体验 |
| D | Redesign | 流式传输数据,增量渲染 | 改动较大 |
### 评估
**选项 A:加载指示器**
- 解决所述问题:否(仅改变感知)
- 实施成本:低
- 二阶效应:用户仍需等待 8 秒
**选项 B:缓存层**
- 解决所述问题:部分(有助于重复访问)
- 实施成本:中
- 二阶效应:数据过时风险,失效复杂性
**选项 C:懒加载**
- 解决所述问题:是(感知速度)
- 实施成本:中
- 二阶效应:轻微的用户体验变化,内容会移位
**选项 D:流式渲染**
- 解决所述问题:是(实际 + 感知)
- 实施成本:高
- 二阶效应:为未来改进铺路,改动较大
### 推荐
**选定:** 选项 C - 懒加载
**级别:** Reframe
**理由:** 问题不是"仪表板慢",而是"用户在看到任何有用内容前需要等待"。懒加载能在 <1 秒内显示有用内容,同时加载其余部分。成本低于流式传输,优于缓存。
**接受的权衡:**
- 内容在部分加载时会移位
- 需要确定哪些部分优先加载
/solution-space
We have a bug where notifications fire twice. This is the third
config flag we're adding to work around notification timing issues.
输出:
## 解决方案空间分析
**问题:** 通知触发两次;提议添加第三个配置标志
**关键约束:** 创可贴模式暗示存在系统性问题
### 考虑的候选方案
| 选项 | 级别 | 方法 | 权衡 |
|--------|-------|----------|-----------|
| A | Band-Aid | 添加防抖标志 | 第四个标志即将到来 |
| B | Local Optimum | 整合通知逻辑 | 仍是反应式模型 |
| C | Reframe | 我们为什么在这个事件上通知? | 可能简化 |
| D | Redesign | 通知的事件溯源 | 改动较大 |
### 评估
**选项 A:防抖标志**
- 解决所述问题:暂时
- 二阶效应:维护噩梦,标志间相互影响
**选项 B:整合逻辑**
- 解决所述问题:可能
- 二阶效应:仍在处理症状
**选项 C:质疑触发器**
- 解决所述问题:可能消解问题
- 二阶效应:可能揭示不必要的复杂性
**选项 D:事件溯源**
- 解决所述问题:是,通过设计防止重复
- 二阶效应:重大重构
### 推荐
**选定:** 选项 C - 重新定义,然后可能是 D
**级别:** Reframe(调查)
**理由:** 三个配置标志是代码异味。在添加第四个之前,先理解为什么通知会从多个路径触发。重复很可能表明通知关注点的所有权不明确。
**下一步:** 映射所有通知触发点。如果 >3 条路径触发同一个通知,问题就不是时机问题,而是架构问题。
此技能可以将上下文持久化到 .oh/<session>.md 中,供后续技能使用。
如果提供了会话名称 (/solution-space auth-refactor):
.oh/auth-refactor.md如果未提供会话名称 (/solution-space):
"保存到会话?[建议名称] [自定义] [跳过]"
读取: 检查现有的会话文件。读取先前技能的输出——目标、问题陈述、问题空间——以了解我们正在解决的问题和约束。
写入: 生成输出后,将解决方案空间分析写入会话文件:
## 解决方案空间
**更新于:** <时间戳>
[解决方案空间分析和推荐]
随处可用。生成用于讨论的解决方案空间分析。无持久化。
.oh/<session>.md 读取先前上下文(目标、问题陈述、约束)/execute 可以读取选定的方法当 RNA MCP 服务器可用(存在 oh_search_context 工具)时,在解决方案空间流程的两个时刻呈现仓库本地的情境知识。
步骤 2 之前(生成候选方案): 使用问题陈述 + 活动目标 + phase: "solution-space" 调用 oh_search_context。呈现相关的 metis——先前的解决方案评估、尝试过的方法及其结果、反复出现的模式。作为候选方案呈现:
**来自此仓库的相关 metis:**
- [metis 标题] (来源:.oh/metis/filename.md) — [一行相关性说明]
→ 保留 / 忽略?
在生成候选方案列表之前,由人类选择。选定的 metis 为候选列表提供信息(可能揭示要包含的选项、要明确命名的反模式,或限制空间的先前尝试)。
步骤 3 之前(评估权衡): 使用活动目标调用 oh_search_context。呈现适用的护栏。这些不是要评估的权衡——它们是在评估开始前就排除某些选项的约束。将确认的护栏作为硬约束纳入评估。
这可以防止:
阶段标签: 严格传递 phase: "solution-space"。问题空间的 metis 和实施说明在此阶段是噪音。护栏始终相关,无论阶段标签如何。
需要人类判断: 不要自动将选定的 metis 作为约束应用。呈现它;让人类决定它在特定上下文中的权重。
在之后: /problem-statement(你需要一个明确的问题来评估解决方案)。导向: /execute 以实施,或 /dissent 以质疑推荐。可以循环回到: /problem-statement(如果探索揭示问题定义有误)。
解决方案空间之后,通常:
/execute - 实施选定的方法/dissent - 如果推荐感觉太容易/problem-statement - 如果探索揭示问题定义有误记住: 目标并非总是选择 Redesign。而是在投入之前知道你已经探索过。深思熟虑的 Band-Aid 胜过意外的 Band-Aid。
每周安装
62
仓库
GitHub Stars
1
首次出现
Jan 27, 2026
安全审计
安装于
claude-code46
opencode29
gemini-cli21
codex19
github-copilot16
cursor16
Explore candidate solutions before committing to implementation. The trap is defending the first workable idea.
Solution Space sits between Problem Statement and Implementation. You have the problem framed; now map the approaches before picking one.
Invoke /solution-space when:
Do not use when: You're still clarifying the problem. Use /problem-statement first. Solution Space assumes the problem is framed.
"The hardest part of design has never been coming up with ideas. It is letting go of the first workable idea to look for better ones."
Exploration is cheap. The failure mode is defending the first solution that works.
Signs you're stuck on a local maximum:
Not all problems need redesigns. The ladder helps you find the right altitude.
Don't default to this. Patch the symptom.
Example: Add a null check. Catch the exception. Hardcode the edge case.
Better, but limited. Optimize within current assumptions.
Example: Extract a method. Add a parameter. Refactor for readability.
Now you're thinking. Question the problem statement.
Example: "We need faster cache invalidation" becomes "Why do we cache this at all?"
This is the goal. Change the system so the problem doesn't exist.
Example: Instead of fixing sync conflicts, make the data flow unidirectional.
Before exploring solutions, confirm the problem statement:
"The problem we're solving is: [statement]. The key constraint is: [constraint]. Success looks like: [outcome]."
If you can't state this clearly, go back to /problem-statement.
List at least 3-4 candidate approaches before evaluating any:
## Candidate Solutions
### Option A: [Name]
- Approach: [Brief description]
- Level: [Band-Aid / Local Optimum / Reframe / Redesign]
- Trade-off: [Main cost]
### Option B: [Name]
...
Rules for this step:
For each candidate, assess:
Make a recommendation and state why:
## Recommendation
**Approach:** [Selected option]
**Level:** [Band-Aid / Local Optimum / Reframe / Redesign]
**Why this one:**
- [Reason 1]
- [Reason 2]
**Why not the others:**
- Option A: [Reason rejected]
- Option B: [Reason rejected]
**Known trade-offs we're accepting:**
- [Trade-off 1]
- [Trade-off 2]
Before committing, ask:
If you explored genuinely and still landed on the first idea, that's fine. The danger is never looking.
## Solution Space Analysis
**Problem:** [One sentence]
**Key Constraint:** [The binding constraint]
### Candidates Considered
| Option | Level | Approach | Trade-off |
|--------|-------|----------|-----------|
| A | [Level] | [Brief] | [Cost] |
| B | [Level] | [Brief] | [Cost] |
| C | [Level] | [Brief] | [Cost] |
### Evaluation
**Option A: [Name]**
- Solves stated problem: [Yes/Partially/No]
- Implementation cost: [Low/Medium/High]
- Maintenance burden: [Low/Medium/High]
- Second-order effects: [Description]
[Repeat for each option]
### Recommendation
**Selected:** Option [X] - [Name]
**Level:** [Band-Aid / Local Optimum / Reframe / Redesign]
**Rationale:** [Why this approach fits the constraints]
**Accepted trade-offs:**
- [Trade-off 1]
- [Trade-off 2]
### Implementation Notes
[Any specific considerations for the selected approach]
/solution-space
Users report the dashboard is slow. Loading takes 8 seconds.
Output:
## Solution Space Analysis
**Problem:** Dashboard loads in 8 seconds; users expect <2 seconds
**Key Constraint:** Can't rewrite the entire frontend this quarter
### Candidates Considered
| Option | Level | Approach | Trade-off |
|--------|-------|----------|-----------|
| A | Band-Aid | Add loading spinner | Doesn't fix slowness |
| B | Local Optimum | Add caching layer | Cache invalidation complexity |
| C | Reframe | Lazy-load dashboard sections | Changes UX slightly |
| D | Redesign | Stream data, render incrementally | Larger change |
### Evaluation
**Option A: Loading Spinner**
- Solves stated problem: No (perception only)
- Implementation cost: Low
- Second-order: Users still wait 8 seconds
**Option B: Caching Layer**
- Solves stated problem: Partially (helps repeat visits)
- Implementation cost: Medium
- Second-order: Stale data risk, invalidation complexity
**Option C: Lazy Loading**
- Solves stated problem: Yes (perceived speed)
- Implementation cost: Medium
- Second-order: Slight UX change, content shifts
**Option D: Streaming Render**
- Solves stated problem: Yes (actual + perceived)
- Implementation cost: High
- Second-order: Enables future improvements, larger change
### Recommendation
**Selected:** Option C - Lazy Loading
**Level:** Reframe
**Rationale:** The problem isn't "dashboard is slow" - it's "users wait before seeing anything useful." Lazy loading shows useful content in <1s while loading the rest. Lower cost than streaming, better than caching.
**Accepted trade-offs:**
- Content will shift as sections load
- Need to prioritize which sections load first
/solution-space
We have a bug where notifications fire twice. This is the third
config flag we're adding to work around notification timing issues.
Output:
## Solution Space Analysis
**Problem:** Notifications fire twice; third config flag proposed
**Key Constraint:** Pattern of band-aids suggests systemic issue
### Candidates Considered
| Option | Level | Approach | Trade-off |
|--------|-------|----------|-----------|
| A | Band-Aid | Add debounce flag | 4th flag incoming |
| B | Local Optimum | Consolidate notification logic | Still reactive model |
| C | Reframe | Why do we notify on this event? | May simplify |
| D | Redesign | Event sourcing for notifications | Larger change |
### Evaluation
**Option A: Debounce Flag**
- Solves stated problem: Temporarily
- Second-order: Maintenance nightmare, flags interact
**Option B: Consolidate Logic**
- Solves stated problem: Probably
- Second-order: Still treating symptoms
**Option C: Question the Trigger**
- Solves stated problem: Possibly dissolves it
- Second-order: May reveal unnecessary complexity
**Option D: Event Sourcing**
- Solves stated problem: Yes, prevents duplicates by design
- Second-order: Significant refactor
### Recommendation
**Selected:** Option C - Reframe, then possibly D
**Level:** Reframe (investigation)
**Rationale:** Three config flags is a code smell. Before adding a fourth, understand why notifications are triggered from multiple paths. The duplication likely indicates unclear ownership of the notification concern.
**Next step:** Map all notification trigger points. If >3 paths trigger the same notification, the problem isn't timing - it's architecture.
This skill can persist context to .oh/<session>.md for use by subsequent skills.
If session name provided (/solution-space auth-refactor):
.oh/auth-refactor.md directlyIf no session name provided (/solution-space):
"Save to session? [suggested-name] [custom] [skip]"
Reading: Check for existing session file. Read prior skill outputs—Aim , Problem Statement , Problem Space —to understand what we're solving and the constraints.
Writing: After producing output, write the solution space analysis to the session file:
## Solution Space
**Updated:** <timestamp>
[solution space analysis and recommendation]
Works anywhere. Produces solution space analysis for discussion. No persistence.
.oh/<session>.md for prior context (aim, problem statement, constraints)/execute can read the selected approachWhen the RNA MCP server is available (oh_search_context tool present), surface repo-local situated knowledge at two moments in the solution space process.
Before Step 2 (Generate Candidates): Call oh_search_context with the problem statement + active outcome + phase: "solution-space". Surface relevant metis — prior solution evaluations, approaches tried and their outcomes, patterns that recurred. Present as candidates:
**Relevant metis from this repo:**
- [metis title] (source: .oh/metis/filename.md) — [one-line relevance note]
→ Keep / Dismiss?
Human selects before candidates are generated. Selected metis informs the candidate list (may reveal options to include, anti-patterns to name explicitly, or prior attempts that constrain the space).
Before Step 3 (Evaluate Trade-offs): Call oh_search_context with the active outcome. Surface applicable guardrails. These are not trade-offs to evaluate — they are constraints that rule options out before evaluation begins. Fold confirmed guardrails into the evaluation as hard constraints.
What this prevents:
Phase tag: Pass phase: "solution-space" strictly. Problem-space metis and implementation notes are noise at this stage. Guardrails are always relevant regardless of phase tag.
Human judgment is required: Do not auto-apply selected metis as constraints. Surface it; let the human decide how much weight it carries in this specific context.
Comes after: /problem-statement (you need a framed problem to evaluate solutions against). Leads to: /execute to implement, or /dissent to challenge the recommendation. Can loop back to: /problem-statement (if exploration reveals the problem is mis-framed).
After solution-space, typically:
/execute - Implement the selected approach/dissent - If the recommendation feels too easy/problem-statement - If exploration revealed the problem is mis-framedRemember: The goal isn't to always pick Redesign. It's to know you explored before committing. A deliberate Band-Aid beats an accidental one.
Weekly Installs
62
Repository
GitHub Stars
1
First Seen
Jan 27, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
claude-code46
opencode29
gemini-cli21
codex19
github-copilot16
cursor16
任务估算指南:敏捷开发故事点、计划扑克、T恤尺码法详解
10,500 周安装