重要前提
安装AI Skills的关键前提是:必须科学上网,且开启TUN模式,这一点至关重要,直接决定安装能否顺利完成,在此郑重提醒三遍:科学上网,科学上网,科学上网。查看完整安装教程 →
problem-statement by open-horizon-labs/skills
npx skills add https://github.com/open-horizon-labs/skills --skill problem-statement定义问题框架。改变陈述,改变解决方案空间。
问题陈述并非问题本身——它是你观察问题的视角。不同的框架会开启不同的解决方案空间。正确的框架让好的解决方案显而易见;错误的框架则使其隐形。
在以下情况调用 /problem-statement:
/aim 之后,/solution-space 之前 - 自然顺序:目标定义结果,问题陈述框定挑战不要使用的情况: 你已经有了清晰的问题陈述,并准备好探索解决方案。请转到 /solution-space。
在重新构建框架之前,先理解当前如何看待问题:
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
"当前问题被框定为:[它是如何被描述的]"
捕捉:
注意 X-Y 问题模式:某人要求 Y(他们尝试的解决方案),而他们实际需要的是 X(真正的问题)。
X-Y 不匹配的迹象:
如果检测到 X-Y 问题:
"你要求的是 [Y],但底层需求似乎是 [X]。对吗?如果是这样,我们应该围绕 [X] 重新构建框架。"
一个好的问题陈述阐明需要改变什么,而不是如何改变它。
错误: "我们需要添加缓存层来降低延迟" 正确: "页面加载需要 3 秒以上;用户在内容显示前就放弃了"
错误: "我们需要重构认证模块" 正确: "添加一个新的认证提供商需要 2 周时间并涉及 6 个文件"
测试你的陈述:
每个问题都存在于约束之中。明确地指出它们:
硬约束(实际上不可移动):
软约束(感觉固定但并非如此):
揭示灵活性的问题:
结构:[谁] 需要 [什么结果] 因为 [为什么重要],但目前 [什么阻碍了它]。
好的问题陈述是:
示例:
| 差的 | 好的 |
|---|---|
| "API 很慢" | "API 响应耗时 800 毫秒;我们的 SLA 要求是 200 毫秒" |
| "我们需要微服务" | "部署一个修复需要协调 4 个团队并耗时 2 周" |
| "用户不理解 UI" | "40% 的支持工单是'如何做 X',而 X 是一个核心功能" |
| "我们需要更好的测试" | "最近 3 次生产事故是由用户而非测试发现的" |
在确定问题陈述之前,测试它:
按此结构生成问题陈述:
## Problem Statement
**Current framing:** [How the problem is currently being described]
**Reframed as:** [Your crisp problem statement]
**The shift:** [What changed in how we see it]
### Constraints
- **Hard:** [Actually immovable constraints]
- **Soft:** [Constraints that feel fixed but might be flexible]
### What this framing enables
[What solution approaches become visible with this framing]
### What this framing excludes
[What approaches are off the table with this framing—and whether that's intentional]
用户提问:
"How do I parse this JSON and extract the user IDs into a separate array?"
X-Y 检测:
## Problem Statement
**Current framing:** Need to parse JSON and extract user IDs into an array.
**But wait—why?** This sounds like an attempted solution. What's the underlying need?
**Clarifying questions:**
- What will you do with the array of user IDs?
- Where does this JSON come from?
- How often does this need to happen?
**If the answer is:** "I need to check if the current user is in this list"
**Reframed as:** Need to determine if current user has permission to access this resource.
**The shift:** From data transformation to authorization check. This might be solvable without extracting IDs at all—a simple `includes()` check or a backend permission endpoint.
原始请求:
"We need to set up a message queue between services"
问题陈述工作:
## Problem Statement
**Current framing:** Set up message queue between services.
**That's a solution. What's the problem?**
After discussion: "When Service A updates, Service B doesn't know about it. Users see stale data."
**Reframed as:** Users see stale data after updates because services don't communicate changes in real-time.
**The shift:** From infrastructure request to user experience problem. Now we can evaluate: Does this need real-time? Is eventual consistency acceptable? Could we solve this with cache invalidation instead?
### Constraints
- **Hard:** Users must see accurate data within 5 seconds of update
- **Soft:** "We use message queues for this" (actually flexible—polling, webhooks, or even a shared cache might work)
### What this framing enables
- Evaluate real-time vs. eventual consistency needs
- Consider polling intervals as a simpler solution
- Question whether these should be separate services at all
### What this framing excludes
- Building complex event-driven architecture before validating the need
上下文:
Started as "add a dark mode toggle." Now touching 14 files and we realize there's no theme system.
问题陈述工作:
## Problem Statement
**Current framing:** Add dark mode toggle.
**What's actually happening:** We can't add the toggle because there's no theme infrastructure to toggle between.
**Reframed as:** The codebase has no theming system; colors are hardcoded across components.
**The shift:** This is two problems:
1. Build theming infrastructure (larger)
2. Add dark mode as first alternate theme (smaller, depends on #1)
The original ask revealed a missing capability, not a feature to add.
### Constraints
- **Hard:** None identified
- **Soft:** "Ship dark mode this sprint" (may not be realistic given scope)
### What this framing enables
- Properly scope the work (infrastructure then feature)
- Consider: is dark mode the most valuable first use of a theme system?
- Evaluate CSS-in-JS vs. CSS variables vs. other approaches
### What this framing excludes
- Hacking dark mode without addressing the underlying issue (band-aid)
此技能可以将上下文持久化到 .oh/<session>.md 中,供后续技能使用。
如果提供了会话名称 (/problem-statement auth-refactor):
.oh/auth-refactor.md如果未提供会话名称 (/problem-statement):
"Save to session? [suggested-name] [custom] [skip]"
读取: 检查现有的会话文件。如果找到,读取先前技能的输出——尤其是 Aim 部分——以获取上下文。目标信息告诉我们实际要解决的问题是什么。
写入: 生成输出后,将问题陈述写入会话文件:
## Problem Statement
**Updated:** <timestamp>
[problem statement content]
如果该部分已存在,则替换它。如果不存在,则将其附加在 Aim 部分之后。
随处可用。生成用于讨论的问题陈述。无持久性。
.oh/<session>.md 读取先前的上下文(特别是目标)紧随其后: /aim 和 /problem-space(知道你要去哪里以及你处于什么环境中)。
导向: /solution-space 以探索方法,或者如果框架感觉太容易,则导向 /dissent。
可以循环回到: /solution-space(如果探索发现问题框架错误)。
问题陈述之后,通常是:
/solution-space - 根据此框架探索候选解决方案/dissent - 在确定前挑战该框架/aim - 如果结果本身不明确(返回去澄清)记住: 问题陈述不仅仅是文档——它是杠杆点。不同的框架不仅描述问题的方式不同;它实际上改变了哪些解决方案成为可能。
每周安装次数
65
仓库
GitHub 星标数
1
首次出现
Jan 27, 2026
安全审计
安装于
claude-code49
opencode32
gemini-cli23
codex22
github-copilot18
cursor17
Define the framing. Change the statement, change the solution space.
A problem statement is not the problem itself—it's the lens through which you see the problem. Different framings open different solution spaces. The right framing makes good solutions obvious; the wrong framing makes them invisible.
Invoke /problem-statement when:
/aim but before /solution-space - The natural sequence: aim defines outcome, problem statement frames the challengeDo not use when: You already have a crisp problem statement and are ready to explore solutions. Move to /solution-space.
Before reframing, understand how the problem is currently being seen:
"The problem is currently framed as: [how it's being described]"
Capture:
Watch for the X-Y problem pattern: someone asks for Y (their attempted solution) when they actually need X (the real problem).
Signs of X-Y mismatch:
If X-Y problem detected:
"You're asking for [Y], but the underlying need seems to be [X]. Is that right? If so, we should reframe around [X]."
A good problem statement articulates WHAT needs to change, not HOW to change it.
Wrong: "We need to add a caching layer to reduce latency" Right: "Page loads take 3+ seconds; users abandon before content appears"
Wrong: "We need to refactor the auth module" Right: "Adding a new auth provider takes 2 weeks and touches 6 files"
Test your statement:
Every problem exists within constraints. Name them explicitly:
Hard constraints (actually immovable):
Soft constraints (feel fixed but aren't):
Questions to surface flexibility:
Structure: [Who] needs [what outcome] because [why it matters], but currently [what's blocking].
Good problem statements are:
Examples:
| Bad | Good |
|---|---|
| "The API is slow" | "API responses take 800ms; our SLA requires 200ms" |
| "We need microservices" | "Deploying a fix requires coordinating 4 teams and takes 2 weeks" |
| "Users don't understand the UI" | "40% of support tickets are 'how do I X' where X is a core feature" |
| "We need better tests" | "Last 3 production incidents were caught by users, not tests" |
Before committing to a problem statement, test it:
Produce a problem statement in this structure:
## Problem Statement
**Current framing:** [How the problem is currently being described]
**Reframed as:** [Your crisp problem statement]
**The shift:** [What changed in how we see it]
### Constraints
- **Hard:** [Actually immovable constraints]
- **Soft:** [Constraints that feel fixed but might be flexible]
### What this framing enables
[What solution approaches become visible with this framing]
### What this framing excludes
[What approaches are off the table with this framing—and whether that's intentional]
User asks:
"How do I parse this JSON and extract the user IDs into a separate array?"
X-Y detection:
## Problem Statement
**Current framing:** Need to parse JSON and extract user IDs into an array.
**But wait—why?** This sounds like an attempted solution. What's the underlying need?
**Clarifying questions:**
- What will you do with the array of user IDs?
- Where does this JSON come from?
- How often does this need to happen?
**If the answer is:** "I need to check if the current user is in this list"
**Reframed as:** Need to determine if current user has permission to access this resource.
**The shift:** From data transformation to authorization check. This might be solvable without extracting IDs at all—a simple `includes()` check or a backend permission endpoint.
Original request:
"We need to set up a message queue between services"
Problem statement work:
## Problem Statement
**Current framing:** Set up message queue between services.
**That's a solution. What's the problem?**
After discussion: "When Service A updates, Service B doesn't know about it. Users see stale data."
**Reframed as:** Users see stale data after updates because services don't communicate changes in real-time.
**The shift:** From infrastructure request to user experience problem. Now we can evaluate: Does this need real-time? Is eventual consistency acceptable? Could we solve this with cache invalidation instead?
### Constraints
- **Hard:** Users must see accurate data within 5 seconds of update
- **Soft:** "We use message queues for this" (actually flexible—polling, webhooks, or even a shared cache might work)
### What this framing enables
- Evaluate real-time vs. eventual consistency needs
- Consider polling intervals as a simpler solution
- Question whether these should be separate services at all
### What this framing excludes
- Building complex event-driven architecture before validating the need
Context:
Started as "add a dark mode toggle." Now touching 14 files and we realize there's no theme system.
Problem statement work:
## Problem Statement
**Current framing:** Add dark mode toggle.
**What's actually happening:** We can't add the toggle because there's no theme infrastructure to toggle between.
**Reframed as:** The codebase has no theming system; colors are hardcoded across components.
**The shift:** This is two problems:
1. Build theming infrastructure (larger)
2. Add dark mode as first alternate theme (smaller, depends on #1)
The original ask revealed a missing capability, not a feature to add.
### Constraints
- **Hard:** None identified
- **Soft:** "Ship dark mode this sprint" (may not be realistic given scope)
### What this framing enables
- Properly scope the work (infrastructure then feature)
- Consider: is dark mode the most valuable first use of a theme system?
- Evaluate CSS-in-JS vs. CSS variables vs. other approaches
### What this framing excludes
- Hacking dark mode without addressing the underlying issue (band-aid)
This skill can persist context to .oh/<session>.md for use by subsequent skills.
If session name provided (/problem-statement auth-refactor):
.oh/auth-refactor.md directlyIf no session name provided (/problem-statement):
"Save to session? [suggested-name] [custom] [skip]"
Reading: Check for existing session file. If found, read prior skill outputs—especially the Aim section—for context. The aim informs what problem we're actually trying to solve.
Writing: After producing output, write the problem statement to the session file:
## Problem Statement
**Updated:** <timestamp>
[problem statement content]
If the section exists, replace it. If not, append it after the Aim section.
Works anywhere. Produces problem statement for discussion. No persistence.
.oh/<session>.md for prior context (especially aim)Comes after: /aim and /problem-space (know where you're going and what terrain you're in). Leads to: /solution-space to explore approaches, or /dissent if the framing feels too easy. Can loop back from: /solution-space (if exploration reveals the problem is mis-framed).
After problem statement, typically:
/solution-space - Explore candidate solutions given this framing/dissent - Challenge the framing before committing/aim - If the outcome itself is unclear (go back to clarify)Remember: The problem statement isn't just documentation—it's the leverage point. A different framing doesn't just describe the problem differently; it literally changes what solutions become possible.
Weekly Installs
65
Repository
GitHub Stars
1
First Seen
Jan 27, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
claude-code49
opencode32
gemini-cli23
codex22
github-copilot18
cursor17
任务估算指南:敏捷开发故事点、计划扑克、T恤尺码法详解
10,500 周安装