| name | swot |
| description | Use when the user says /swot, "landscape analysis", "SWOT analysis", "strengths and weaknesses", or wants to capture, review, or challenge organizational observations.
|
| disable-model-invocation | true |
SWOT Landscape Analysis
Structured SWOT for onboarding. Accumulates observations across sessions via the
knowledge graph. Supports conversational capture, artifact-pointed capture, challenge,
review, and multi-format export.
Announce: "I'm using the swot skill to help you build your landscape analysis."
Reference files (read on demand, not upfront):
Prerequisites
Verify memory MCP: mcp__memory__read_graph. If unavailable, warn and route writes
to pending-sync. Check for existing pending-sync files.
Invocation
/swot <org-name> [--mode=add|review|challenge] [--read <path-or-url>] [--from=1on1-prep] [--sync]
--sync drains pending-sync files (see pending-sync.md).
--read triggers artifact-pointed capture.
--from=1on1-prep ["names"] drafts SWOT observations from captured 1:1 discovery notes;
optional comma-separated person names narrow the source (see "Discovery Handoff").
Confidentiality Refusal
When the caller passes --read <path> AND the path is local (not a URL), MUST
run the refusal guard before reading the file:
bun run "$CLAUDE_PROJECT_DIR/skills/onboard/scripts/onboard-guard.ts" refuse-raw <path>
The guard is a no-op for URLs and paths outside any /onboard workspace —
exits 0, /swot proceeds normally.
Exit codes, repo-root resolution, and override policy: see
../onboard/refusal-contract.md.
Org Lookup
mcp__memory__search_nodes({ query: "<org-name>" }) — exact match (with " SWOT"
suffix) → use it, one substring → use it, multiple → ask, not found → Bootstrap,
tool error → stop.
Bootstrap (New Org)
Requires memory MCP. Confirm name. Check collision. Create entity:
name: "<Org Name> SWOT", entityType: "SWOT".
Mode Routing
Default add. Empty entity with review/challenge → redirect to add.
Add Mode (Capture)
Read capture-form.md for the form, parsing rules, and confirm flow.
Capture is observation-first. The user reports what they observed and against what
baseline; the skill proposes the SWOT tag at the confirm step. The user never picks a
SWOT bucket at input time — this removes the bucketing bias the challenge checks would
otherwise have to clean up.
Conversational (default): 6 neutral prompts (what observed, how known, compared to
what, what's missing, so-what, anything else) — none name a quadrant. Parse to draft
observations, then propose [strength]/[weakness]/[opportunity]/[threat]/[context]
plus a landscape tag at the confirm step, each with a one-line rationale. Confirm /
Retag / Edit / Cancel → write one-at-a-time, fully tagged only (never persist an
untagged observation, so the stored format matches prior entries). Failed writes →
pending-sync. After write, offer challenge pass.
Artifact-pointed (--read): read file/URL, extract signals as draft observations,
present in the same auto-tag confirm flow. Never writes unconfirmed observations.
Discovery handoff (--from=1on1-prep): see "Discovery Handoff" below.
Review Mode
Read entity. Render sections (omit empty): Header, Internal (strengths/weaknesses
by landscape tag), External (opportunities/threats by landscape tag), Context, Coverage
Gaps (4x4 SWOT × landscape matrix, flag cells <2 entries). Then offer export
(see export-formats.md).
Challenge Mode
Read entity, run 4 checks (see challenge-checks.md). Present
flagged items with Edit/Remove/Keep/Recategorize actions.
Discovery Handoff (--from=1on1-prep)
/1on1-prep is the discovery instrument; /swot is the sorter. This handoff carries
captured 1:1 notes into a SWOT capture session so the strong, non-leading discovery
questions reach the analysis without re-typing. Both skills write to the same knowledge
graph, so this is a graph read — not a parser.
Scoping note: the graph has no Person→org relation (1on1-prep's only relation is
reports_to, Person→Person — see ../1on1-prep/graph-schema.md).
So the handoff cannot query "people at this org" directly. In an onboarding ramp the
SWOT and the 1:1s belong to the same org, so the default is to pull from all Person
entities; the user prunes at the confirm step. Accept optional person names to narrow it:
--from=1on1-prep "Sarah Chen,Mike Lee".
- Read 1:1 notes.
mcp__memory__search_nodes to find Person entities (named ones,
else all), then read their [1on1] observations — strategic-tagged entries especially
([opportunity], [concern], [relationship]), since those map most directly to
SWOT signal.
- Draft, don't write. Map each into a draft observation: the 1:1 text → observation
body. 1on1-prep observations carry no provenance parenthetical, so synthesize
(1:1 with <person>) from the source Person entity. Answers about the biggest risk,
the most debt, or what's missing often seed the comparative / absence framing.
- Confirm. Present the drafts in the same auto-tag confirm flow as conversational
capture (proposed tag + one-line rationale). Nothing is written until the user
confirms — same confirm-then-write invariant.
If there are no [1on1] observations yet, say so and fall back to conversational capture.
Integration Points (Stubbed)
--from=architecture-overview and --from=stakeholder-map are planned but unbuilt —
those skills produce artifacts SWOT would have to interpret, unlike 1on1-prep which
already writes tagged graph observations. If a user passes one of these --from values,
return:
"The / skill isn't built yet. You can manually add insights using
the conversational capture, or use --from=1on1-prep if you have 1:1 notes."
Where this skill persists state
Per ADR #0020, per-leaf data class assignment against the six-leaf decision tree:
memory MCP knowledge graph (mcp__memory__* from @modelcontextprotocol/server-memory):
- SWOT entities, relations, observations keyed on
<Org Name> SWOT — cross-session structured graph state.
User working repo (ramp workspace):
docs/swot/ markdown exports — committed deliverables.
Not used by this skill: auto-memory MD, ruflo MCP, scheduled-tasks MCP, plugin-internal memory (decisions.md / patterns.md).
Out-of-scope local files (not memory layers): pending-sync/ (transient fallback drained by --sync), Excalidraw / Slidev exports (rendering sinks, not persistence).
Common Mistakes
- Asking the user to pre-sort into SWOT buckets at capture time — capture is observation-first; gather what was observed and the baseline, then propose the tag at confirm. Naming quadrants in the capture prompts biases the answer.
- Persisting an untagged observation — tagging is deferred in the conversation only; every observation written to the graph carries its full
[swot][landscape] shape, so review and challenge read new and old entries identically.
- Writing observations without provenance — every observation should carry its source (conversation, artifact, meeting); unattributed entries can't be audited or challenged later.
- Mis-tagging internal vs. external at confirm — strengths/weaknesses are internal to the org; opportunities/threats are external forces. The auto-tag proposal can get this wrong; the one-line rationale exists so the user catches it with Retag before writing.
- Writing observations without user confirmation — capture is confirm-then-write; never persist draft observations from artifact extraction or
--from handoff until the user approves them.
- Reaching for challenge or review mode on an empty entity — redirect to
add when the entity has no observations yet; there's nothing to review.
- Skipping coverage gaps in review — the 4x4 SWOT × landscape matrix is where missing analysis becomes visible; always surface cells with fewer than two entries.
Composition
- Reads:
/1on1-prep (--from=1on1-prep, built), /architecture-overview, /stakeholder-map (future --from)
- Writes: knowledge graph,
docs/swot/, excalidraw canvas, Slidev
- Feeds:
/strategy-doc (#42), /okr (#36)
- Downstream review: this skill's Challenge Mode checks SWOT coverage; substance is stress-tested one level up — once these observations are synthesized into a strategy via
/strategy-doc, that strategy gets the independent strategy-adversary pass. No adversary on raw observations.