| name | strategy-doc |
| description | Use when the user says /strategy-doc <org>, "draft my 90-day plan", "review the 90-day plan", or "challenge the 90-day plan" during a senior eng leader ramp. Phase 1 supports the 90-day-plan mode only โ collates /swot + /stakeholder-map + /architecture-overview + free-form notes/*.md into a 7-section markdown artifact under ~/repos/onboard-<org>/decisions/. Cross-org RFC mode is Phase 2 (separate spec). |
| disable-model-invocation | true |
| status | experimental |
| version | 0.1.0 |
/strategy-doc โ 90-Day Plan Authoring
Personal note-collator for the 90-day-plan deliverable of a senior eng leader ramp. User is the primary reader; the skill is the synthesizer + critic, not an author of opinions.
Announce: "I'm using the strategy-doc skill to help you build your 90-day plan."
Reference files (read on demand):
Invocation
/strategy-doc <org> [--mode=draft|review|challenge] [--workspace <path>] [--continue]
<org> is required. Default mode is draft.
Flags:
--mode=draft|review|challenge โ see Mode routing.
--workspace <path> โ override the default ~/repos/onboard-<org>/ resolution. Supports eval fixtures and custom locations.
--continue โ only meaningful with --mode=challenge. After a Layer 2 quality failure, re-run with this flag to advance to the Layer 3 (consistency, advisory) pass anyway. Skipping Layer 2 fixes is a deliberate choice; the user takes ownership.
Workspace resolution order:
--workspace <path> if provided โ use that path directly.
- Otherwise,
~/repos/onboard-<org>/.
Prerequisites (refuse if missing)
- Resolved workspace directory exists. If absent, refuse with:
"Workspace not found at <resolved-path>. Run /onboard <org> first." (omit /onboard hint when --workspace was passed, since those are typically eval or custom paths.)
decisions/ subdirectory exists or is creatable. If workspace exists but decisions/ does not, create it (matches /onboard Phase 1 contract).
Do not check upstream skill state (SWOT / stakeholder / arch availability) here โ those are graceful-degradation cases handled inside --mode=draft.
Mode routing
| Mode | Effect |
|---|
draft (default) | Read existing doc (or scaffold from template), pull upstream evidence per synthesis.md, populate inside-fence content. Preserve outside-fence user prose. After writing, output the complete file content verbatim to the terminal (read the file back and print every line including user prose between and below fences) so the user can review it. Do NOT substitute a summary or status message for the full content. |
review | Use the Read tool to open the doc (not Bash(cat) โ eval structural assertions on Read.file_path rely on this); render section-by-section to terminal (print the full markdown content). No mutation. No checks. |
challenge | Run layered checks per challenge-checks.md. Layer 1 fail skips 2-3. Layer 2 fail gates Layer 3 behind --continue. All clean โ offer independent substance review via strategy-adversary, then the /present handoff per export-present.md. |
Doc location
Single artifact per ramp at <workspace>/decisions/<creation-date>-90-day-plan.md.
Glob outcome routing โ every --mode=draft run starts with glob <workspace>/decisions/*-90-day-plan.md:
| Glob result | Action |
|---|
| 0 files | First-run path. Create <workspace>/decisions/<today>-90-day-plan.md from template. (Create decisions/ if it doesn't exist โ matches /onboard Phase 1 contract.) |
| 1 file | Mutate that file in place. Do NOT create a new dated file even if today differs from the file's date. |
| 2+ files | Refuse mutation. Emit a list with each filename + mtime (sorted newest first) and ask the user to consolidate. One artifact per ramp is invariant. The refusal must be idempotent โ re-running after another ambiguous state must produce the same list, not silently mutate the newest. |
Atomic write semantics โ for the 0-file and 1-file cases, perform every mutation as a write-temp-then-rename:
- Render the new doc content to
<workspace>/decisions/.<final-filename>.tmp.
- Validate the rendered content's section-fences before rename.
rename(.tmp, <final-filename>) only if validation passes; the rename is atomic on POSIX, so the original file is never observed in a partially-written state.
- On any failure between step 1 and step 3 (validation fail, write error, signal interrupt): delete the
.tmp file, leave the original untouched, surface the failure cause to the user.
This forbids partial writes, prevents data loss on interrupted runs, and means a malformed-fence damage report from --mode=draft is always paired with a fully-preserved original file.
Confidentiality
Before reading any path inside the workspace, run:
bun run "$CLAUDE_PROJECT_DIR/skills/onboard/scripts/onboard-guard.ts" refuse-raw <path>
The guard refuses paths under notes/raw/ (non-zero exit). Skill MUST honor the refusal โ do not read the file. Exit-code contract and override policy: see ../onboard/refusal-contract.md.
Upstream-input degradation (graceful)
| Missing input | Behavior |
|---|
| Memory MCP unavailable | Warn once. Continue with filesystem-only inputs. |
<Org> SWOT entity missing/empty | Inside-fence [TODO: no SWOT data โ run /swot <org> --mode=add or write notes/] markers in ยง1-3. |
<Org> Stakeholders entity missing | Similar [TODO] in ยง1, ยง7. |
arch/ directory absent or empty | Skip arch synthesis. [TODO] in ยง1. |
notes/*.md empty / dir absent | Skip notes pass. No error. |
Rule: missing input never aborts draft. Skill emits whatever skeleton it can; [TODO] markers signal gaps for the user (and trigger challenge layer 1 fail later).
Section-fence sentinels
Auto-populated content lives inside <!-- strategy-doc:auto --> ... <!-- /strategy-doc:auto --> pairs. Outside-fence content is user-owned. Malformed fences refuse mutation; emit damage report. See 90-day-plan-template.md for the canonical pattern.
Fence pre-check (--mode=draft only): When an existing doc is found, validate fences IMMEDIATELY โ before loading memory MCP, arch, or notes. If any fence is malformed (unclosed, nested, or mismatched), emit the damage report and stop. Do NOT proceed to upstream-input loading. Fence validation is a 2-second read of the existing file; doing it first avoids 3โ4 minutes of unnecessary upstream-input work.
Where this skill persists state
Per ADR #0020, per-leaf data class assignment against the six-leaf decision tree:
User working repo (~/repos/onboard-<org>/):
- 90-day-plan artifact (
decisions/<creation-date>-90-day-plan.md) โ project deliverable, committed alongside ramp notes.
memory MCP knowledge graph (mcp__memory__*):
- Reads only โ
<Org> SWOT and <Org> Stakeholders entities pulled for synthesis (graceful-degradation on miss). No writes from this skill; /swot and /stakeholder-map own those entities respectively.
Not used by this skill: auto-memory MD, ruflo MCP, scheduled-tasks MCP, plugin-internal memory (decisions.md / patterns.md).
If a future Phase 2 mode (cross-org RFC, dedicated strategy entity) introduces a new save target, it must route through the ADR's decision tree before landing.
Out of scope (Phase 1)
--mode=rfc cross-org strategy / RFC authoring (Phase 2).
- Multi-variant audience export (manager / peers / reports views with redaction) โ Phase 2.
- Memory entity for strategy doc โ filesystem-only Phase 1.
- Multi-org concurrent workspace handling.
- Interactive
--capture flag โ user writes notes/*.md directly Phase 1.