cash-discuss
SkillDev toolsHave a focused discussion about a topic and reach a conclusion. Use when requirements or design choices need a focused decision before implementation.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the cash-discuss skill
What this skill tells your AI
The instructions your AI receives, as published by cashwu/iphonelocationmove in .agents/skills/cash-discuss/SKILL.md and read by ahel’s review.
Project-local Cash CLI bootstrap
執行任何 Cash artifact command 前,MUST 先從目前目錄解析並驗證 Git root,再使用該 root 下的 absolute launcher;不得依賴 PATH 或外部 runtime:
cash_root="$(git rev-parse --show-toplevel)" || exit 1
cash_cli="$cash_root/.cash-skills/bin/cash"
test -x "$cash_cli" || exit 1
同一段 workflow 後續每個 artifact command MUST 使用 "$cash_cli"。
Have a focused discussion about a topic and reach a conclusion.
IMPORTANT: Discuss mode is for thinking, not implementing. You may read files, search code, and investigate the codebase, but you must NEVER write code or implement features. If the user asks you to implement something, remind them to exit discuss mode first (e.g., start a change with $cash-propose). You MAY create Cash artifacts (proposals, designs, specs) if the user asks—that's capturing thinking, not implementing.
This is a task-oriented discussion. Every discussion has a topic, works toward a goal, and ends with a clear conclusion. Unlike open-ended exploration, discuss mode converges.
Input: The argument after $cash-discuss is the topic. Could be:
- A design question: "should we use WebSockets or SSE?"
- A problem to solve: "the auth system is getting unwieldy"
- A change name: "add-dark-mode" (discuss in context of that change)
- An architecture decision: "how to structure the plugin system"
- A vague idea that needs sharpening: "real-time collaboration"
Response language: All user-facing responses in this workflow MUST be written in Traditional Chinese unless the user explicitly requests another language. Keep shell commands, file paths, code identifiers, schema field names, and quoted source text verbatim.
Before You Speak
Before asking anything, load the shared vocabulary, then do a quick codebase scout to decide how to run this discussion.
Step 0: Load shared vocabulary
Try to read openspec/LANGUAGE.md. This file is the project's canonical vocabulary — terms with definition, avoid, and why notes, plus principles for when legacy terminology may remain.
- If the file exists: scan the canonical terms and their avoided synonyms. Prefer the canonical term when you summarize, capture conclusions, or update artifacts. If you notice a relevant
avoidsynonym in the user's topic or in the artifacts you read, plan to surface that as vocabulary drift in the conclusion. - If the file does not exist: continue silently with the normal flow. A missing vocabulary file is not an error; do not announce it, do not block, and do not stop to ask the user to create it.
This step runs before the codebase scout, the assumptions list, the interview questions, and the conclusion capture.
Step 1: Extract search terms
Pull 2-5 keywords from the user's topic. For "search should support fuzzy matching", that's search, fuzzy, match. For "should we add a plugin system", that's plugin, extension, module.
Step 2: Scout the codebase
For code or requirement topics, first use "$cash_cli" search "<query>" --limit 10 --json; after a valid zero-result, fall back to Grep/Glob over specs and source. Include relevant documentation, tests, configuration, and conversation decisions as evidence, not only source code. Keep the scout focused and read the most relevant files; a specific change name selects its artifacts directly. Report command errors rather than treating them as zero results.
Step 3: Pick a mode
- Evidence supports a concrete recommendation → Assumptions mode: state the recommendation and only the assumptions that materially affect it. Existing explicit decisions are established context, not questions to ask again.
- A material decision lacks evidence or user intent → Interview mode: ask the one question whose answer changes the recommendation. File count and file type do not determine the mode; a document-only or single-file project may already provide sufficient context.
Announce which mode you picked and the evidence or missing decision behind it, for example: "The spec and your confirmed constraints support a recommendation" or "The required retention period is still unknown and changes the storage choice — I'll ask about that first."
Assumptions mode
When you enter assumptions mode, present only material unconfirmed assumptions, if any. Each one MUST include:
- Approach: what you'd do and why
- Evidence: relevant file path(s) or confirmed conversation context that informed this assumption
- If wrong: concrete consequence of getting this wrong
Example:
### My assumptions
1. **New IPC command goes in `commands/search.rs`**
Evidence: existing search commands are in `src-tauri/src/commands/search.rs`
If wrong: we'd need to create a new module and register it
2. **Use the existing `SearchStore` for state**
Evidence: `src/lib/stores/search-store.ts` already manages search state
If wrong: parallel state would cause sync bugs
3. **Fuzzy matching runs in Rust, not frontend**
Evidence: current search scoring is in `search.rs:calculate_score()`
If wrong: moving to frontend means rewriting the scoring logic in TypeScript
If unconfirmed assumptions remain, ask: "Which of these are wrong?" Otherwise proceed directly to Convergence without an extra confirmation.
- If the user says all are fine → proceed to Convergence with these as established context.
- If the user flags corrections → for each one, ask ONE focused follow-up question to understand their intent, then proceed to Convergence with the corrected understanding.
Mode switching
The user can switch modes at any time during the discussion:
- "Ask me questions instead" / "one at a time" → switch to interview mode (the "How to Discuss" section below)
- "Just list your assumptions" / "what do you think?" → run the codebase scout if not done yet, then switch to assumptions mode
Step 4: Interface depth check (conditional)
After the codebase scout, evaluate whether the topic introduces a new architectural seam. Run this check only when the topic involves at least one of:
- A new module (a new Rust crate, file under
src-tauri/src/commands/, or a new top-level Svelte module). - A new IPC command (a new
#[tauri::command]exposed to the frontend, or a new front-to-back message shape). - A cross-layer Rust ↔ Tauri ↔ Svelte flow that did not exist before.
- A new storage abstraction (new on-disk format, new database table, new file-system layout, new adapter over existing storage).
If none of those conditions apply, skip this check. Topics that only change static UI copy, visual styling, documentation wording, or other non-architectural surfaces SHALL skip the depth check entirely. The vocabulary load from Step 0 still happens; nothing else from this step runs.
When the check is triggered, work through these four questions before you finalize assumptions or interview answers:
- Seam location — where does the boundary belong? Name the module, file, or store that owns the new contract.
- Adapter count — is there exactly one adapter on this path, or are several thin wrappers stacked on each other?
- Depth — what behaviour is hidden behind the interface? If the answer is "nothing — it just forwards calls", the seam is too shallow.
- Deletion test — if you deleted this module today, what would break? If nothing meaningful breaks, the module is a pass-through and probably should not exist.
Surface the answers in the conclusion (or the assumptions list, if you are in assumptions mode) so the depth question is part of the captured decision, not an internal note.
How to Discuss
This section applies to interview mode — either chosen because a material decision lacks evidence or intent, or switched to manually by the user.
One question at a time. Don't dump a list of 10 questions. Ask the most important one, listen, then follow up. Let the conversation breathe. If the user's initial description or previous answers already cover a question, skip it — don't ask what you already know.
Propose concrete options. When exploring approaches, present 2-3 specific options with trade-offs — not abstract possibilities. Use comparison tables when helpful:
| Approach | Pros | Cons |
|---------------|-------------------|-------------------|
| WebSockets | Real-time, bidir | Complex, stateful |
| SSE | Simple, HTTP | One-way only |
| Polling | Simplest | Latency, waste |
Ground in reality. Investigate the actual codebase when relevant. Map existing architecture, find integration points, surface hidden complexity. Don't just theorize.
Visualize freely. Use ASCII diagrams when they clarify thinking:
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Client │────▶│ Server │────▶│ DB │
└──────────┘ └──────────┘ └──────────┘
System diagrams, state machines, data flows, dependency graphs — whatever helps.
Challenge assumptions. Including the user's and your own. Ask "do we actually need this?" Apply YAGNI — the simplest solution that works is often the best.
Be direct. If you have a recommendation, say it. Don't hedge endlessly. "I'd go with option B because..." is more useful than "all options have merit."
No empty validation. Never pad responses with hollow affirmations. These add nothing and erode trust:
"That's an interesting approach"→ State what specifically is interesting and why"There are many ways to think about this"→ Name the 2-3 concrete ways and their trade-offs"That could work"→ Explain why it would or wouldn't work, and under what conditions"Great question"→ Just answer the question"You raise a good point"→ Engage with the point directly
If you agree, say why. If you disagree, say why. Empty agreement is worse than honest pushback.
Push for specifics. When the user gives a vague answer, don't accept it — dig deeper. The goal is to reach decisions concrete enough to implement.
Bad vs. good:
User: "We should make it more modular"
Bad: "That sounds good. How would you like to proceed?"
Good: "What would you split out? Are we talking separate crates,
feature flags, or a plugin interface? Each has very different
cost."
User: "Performance might be an issue"
Bad: "Good point, we should keep performance in mind."
Good: "What's the threshold? Are we talking sub-100ms response time,
handling 1000 concurrent users, or keeping memory under a
budget? The answer changes the architecture."
User: "We need better error handling"
Bad: "Agreed, error handling is important."
Good: "Which errors are causing problems now? Are users seeing
crashes, silent failures, or unhelpful messages? Let's look
at the actual error paths."
Convergence
Discussions must converge. As the conversation progresses:
- Narrow the options — eliminate approaches that don't fit
- Surface the key trade-off — most decisions come down to one fundamental tension
- Make a recommendation — or help the user make one
- State the conclusion clearly — what was decided, and why
The conclusion should be one of:
- Design decision: "We'll use SSE because one-way is sufficient and it's simpler"
- Direction consensus: "The auth refactor should split into gateway + provider"
- Next-step recommendation: "We need to spike the plugin API first to validate the approach"
- Explicit deferral: "We don't have enough info yet. Specifically, we need to know X before deciding"
Example elicitation: When the discussion converges on a specific requirement or behavior, propose a concrete example before capturing the decision. Instead of concluding "search should sort by relevance", propose: "So if we have items scored 0.9, 0.3, 0.7, the result order would be 0.9, 0.7, 0.3 — is that right?" This naturally produces ##### Example: content for the spec and confirms shared understanding with real values.
If the user wants to move faster. Sometimes the user signals impatience — "let's just go with X", "I don't want to overthink this", "can we move on?". Respect their pace:
- First time: Briefly flag if there's an important unresolved question — one sentence, not a lecture. "Before we commit to X, worth noting that Y could affect Z. Want to address it or move forward?"
- If they push again: Respect it. Skip remaining questions, go straight to convergence with the best conclusion you can form from what's been discussed. Don't push back a second time.
The goal is thoroughness, not interrogation. One nudge maximum.
Cash Awareness
You have full context of the Cash system. Use it naturally.
Check for context
At the start, quickly check what exists:
"$cash_cli" list --json
If the user mentioned a specific change name, read its artifacts for context.
Capture decisions
When the discussion converges, proactively present a conclusion summary. A discussion alone authorizes a summary, not artifact writes. Existing explicit authorization to record the conclusion remains valid; do not ask for it again.
Summary format:
## Conclusion
**Decision**: [What was decided]
**Rationale**: [Why — the key trade-off that drove this]
**Capture to**: [Where this should be recorded]
Where to capture:
| Insight Type | Where to Capture |
|---|---|
| New requirement discovered | specs/<capability>/spec.md |
| Design decision made | design.md |
| Scope changed | proposal.md |
| New work identified | tasks.md |
| Vocabulary drift | openspec/LANGUAGE.md |
Vocabulary drift means the discussion surfaced a recurring concept that is missing, ambiguous, or pulling away from the shared vocabulary loaded in Step 0. Examples: the topic uses a term that the vocabulary lists as an avoid synonym, or the discussion repeatedly names a concept that has no entry yet. When this happens, name it as vocabulary drift in the conclusion summary and direct the capture to openspec/LANGUAGE.md. The conclusion summary SHALL preserve this contract — do not silently rewrite the term in the artifacts without recording the drift.
Present the summary and the proposed capture location. Without recording authorization, end with the summary and suggested next workflow; silence or failure to opt out is not consent. With authorization, record a discussion note that does not change an existing change's contract directly. If the conclusion changes an existing change's requirements, scope, design, or tasks, hand the selected change and agreed decisions to $cash-ingest so it synchronizes the affected artifacts; do not edit only design.md or a master spec in discuss. If no change exists, recommend $cash-propose to formalize new work. Invoke a handoff only when the user has authorized that artifact update or workflow; otherwise recommend it. Do not implement code in discuss.
Transition to action
When the discussion converges on building something:
- "Ready to formalize this?
$cash-propose" - For an authorized update to an existing change, hand off to
$cash-ingestwith the selected change and the agreed decisions
Guardrails
Intent preservation and evidence traceability
Before asking an interview or correction follow-up, handle an explicit comprehension signal: when the user says the explanation is hard to understand, first restate the same content more simply in plain Traditional Chinese; only then decide whether a question is needed. Never replace that restatement with a new question. When the user rejects the problem definition, discard the rejected agent restatement and rebuild the requirement from the user's original words before continuing.
Before presenting a recommendation, separate confirmed user intent, codebase evidence and assumptions. If the user corrects a premise, first restate the corrected requirement in plain Traditional Chinese and preserve the restated requirement, identify which conclusion changes, and preserve the user's trade-off in the conclusion and proposed capture location. Do not silently translate a correction into a different scope or design.
For each alternative, retain the evidence that supports it, the concrete consequence if its premise is wrong, and the verification needed before implementation. A conclusion that changes an existing change's contract or task dependencies goes through $cash-ingest <change-name> so all affected artifacts stay synchronized; discuss mode does not implement code. End with one consolidated conclusion containing the decision, rationale, unresolved risk or explicit deferral, and next action.
- Don't implement — Never write code or implement features. Creating Cash artifacts is fine, writing application code is not.
- Don't leave without a conclusion — If the user tries to end without a conclusion, summarize where things stand and state what's unresolved.
- Don't fake understanding — If something is unclear, dig deeper.
- Don't overwhelm — One question at a time, not a barrage.
- Don't over-engineer — Challenge complexity. Prefer simpler solutions.
- Do visualize — A good diagram is worth many paragraphs.
- Do explore the codebase — Ground discussions in reality.
- Do be opinionated — Have a recommendation. The user can disagree.
Signals
- GitHub stars
- 62
- Forks
- 10
- Last commit
- Sep 2026
Others that do the same job
Advanced
- Catalog kind
- skill
- Gateway key
cash-discuss- Source
- github.com/cashwu/iphonelocationmove