Skip to main content
ClaudeWave
Skill82 repo starsupdated 10d ago

reflect-outcome

reflect-outcome detects when a user's stated outcome names a specific tool, product, or mechanism as a means to a broader goal they've also explicitly stated, signaling potential over-narrowing that could orphan alternatives. Fire only when both elements are present in the user's words with a clear serve-relationship between them; stay silent on bare concrete nouns without stated wider ends to avoid alarm-fatigue false positives.

Install in Claude Code
Copy
git clone --depth 1 https://github.com/DheerG/swarms /tmp/reflect-outcome && cp -r /tmp/reflect-outcome/skills/reflect-outcome ~/.claude/skills/reflect-outcome
Then start a new Claude Code session; the skill loads automatically.

SKILL.md

The user stated an outcome in their own words. Read it for ONE structural pattern — **a specific instance named as the way to reach a broader end the user's outcome also states** — which can silently collapse the team onto that one point and orphan the alternatives. Fire ONLY when BOTH are present: (1) a named mechanism, product, or instance, AND (2) a wider goal **stated anywhere in the user's outcome** — not necessarily in the same sentence as the named instance — that the named thing is merely one way to serve. The named thing being *narrower than that stated wider goal* is the discriminator. **Infer nothing:** if no wider end is stated, do not fire (a category you could infer from the name is not a stated end), and never predict that foreclosure will happen — detect only the divergence the user's own words make plain. A bare concrete noun, mechanism or product, with no stated wider end does NOT fire; that over-firing is the alarm-fatigue failure this exists to avoid. The cheap, incumbent-first dismiss is what makes firing on a real signal safe.

- **Mechanism-as-means:** "force a resume *so it can nudge* a forgotten prospect" → "nudge" is one way to reach the wider stated goal "resurface a forgotten prospect" → FIRE. Contrast "add a retry queue for failed webhooks" → "retry queue" IS the whole ask, no wider goal it under-serves → **stay SILENT**.
- **Proper-noun-specific-instance:** "integrate with Salesforce *so sales can see deals*" → the wider end "sales can see deals" is stated and Salesforce is one way to reach it → FIRE. Contrast bare "store it in S3," "send a Slack notification," "cache it in Redis," "deploy on Vercel" → the product IS the ask, no wider end stated → **stay SILENT**. Do NOT fire on the class you could infer from the product name — that inference is the alarm-fatigue over-fire; an existing-integration collision with no stated end drops to the Research-phase repo check instead.

Scan the whole input, not a single clause: if more than one pin is present, fork on the single most consequential one; if it is genuinely ambiguous which matters most, return `NO FORK`.

The same *infer nothing* applies to the LINK across sentences: couple a goal and an instance only when the serve-relationship is plain in the user's own words; a link you would have to infer is `NO FORK`. When the outcome names more than one instance, pair each only with the end it plainly serves — never fire an instance against an end that belongs to a different named thing.

Read the WORDING only. Do not read the codebase. Do not grade quality. Do not hunt for missing detail — over-specification is the failure here, not under-specification.

**Common case — nothing pinned:** return exactly `NO FORK`. The lead shows the user nothing and carries the outcome forward as-is. Do not hedge, apologize, or manufacture a concern; a clean pass is a first-class result. Fire only on a citable pinning word that is actually in the user's text — no citable word, no fork.

**A pinned instance is present (either shape):** return a ready-to-render AskUserQuestion object the lead shows verbatim and does not author. Build it to this grammar:
- **Subject** is the team or the reading, never the user — "the team would read this as…", never "you didn't specify…".
- **Forward-looking:** name the consequence the user can veto, not a deficiency they must defend.
- **Pivot on the user's OWN word**, quoted, as a means/ends substitution — introduce no noun they didn't write.
- **Only remedy is to pick a reading** — never to add more detail.

Shape (draft NO goal anywhere — not in the stem, not in either label; the open pole asserts only that other ways exist, naming none):
- `question`: *"'\<their word>' reads as the way to do this — the team builds only what the wording pins. Did you mean \<their word> specifically, or are you open to other ways to do this?"*
- `header`: "Outcome"
- `options` (exactly two — incumbent first, both first-person in the user's own voice):
  - *"Yes — \<their word> specifically is what I want."* — that specific one, exactly as worded
  - *"I'm open to other ways to do this — \<their word> was just how I put it."* — \<their word> was one example, not the requirement

**Neutrality bar — all four must hold, or return `NO FORK` instead:** (1) introduce no noun the user didn't write; (2) assert no quality grade; (3) the user's verbatim still briefs the team without your words leaking in; (4) the user keeps an unforced choice to leave the wording exactly as-is.

**Resolving the choice (the lead handles the answer — the skill stores nothing):**
- **Option A — keep the named instance:** nothing to record. The verbatim already contains the word and flows to the briefs unchanged.
- **Option B — open to other ways:** ask the user to restate the outcome in their own words with an OPEN prompt ("tell me what you'd like to happen") — never a drafted "did you mean X?", which would re-introduce the assembled-goal the fork exists to avoid. The restatement re-enters this reflection (a fresh outcome, usually `NO FORK`) and BECOMES the verbatim of record, flowing to the briefs unchanged. Store no separate supplement — the user's own revised words carry the signal that the original word was incidental.
- **If a re-authored outcome forks again,** give it the same two-option treatment — each pass is a fresh user-authored outcome, so the incumbent option (A) is the terminator; there is no separate loop counter.