feat(compass): career discovery mode for users who don't know their target roles#643
feat(compass): career discovery mode for users who don't know their target roles#643sfayka wants to merge 7 commits into
Conversation
Spec for /career-ops compass — a career discovery mode that helps users who don't know their target roles figure out what they want through adaptive questioning, silent CV analysis, and an ikigai-style reveal before drafting profile.yml + _profile.md for approval.
|
Welcome to career-ops, @sfayka! Thanks for your first PR. A few things to know:
We'll review your PR soon. Join our Discord if you have questions. |
📝 WalkthroughWalkthroughThis PR introduces ChangesCareer Discovery Compass Mode
🎯 3 (Moderate) | ⏱️ ~25 minutes 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Tip 💬 Introducing Slack Agent: The best way for teams to turn conversations into code.Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.
Built for teams:
One agent for your entire SDLC. Right inside Slack. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 7
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/superpowers/specs/2026-05-13-compass-mode-design.md`:
- Around line 62-65: Update the "Phase 1 — Silent CV Analysis" contract to
explicitly handle a missing cv.md by detecting absence of cv.md and routing the
flow into onboarding/setup guidance instead of proceeding; in the Phase 1
description (referencing "cv.md" and "Silent CV Analysis") add a clear branch
that triggers onboarding mode and lists the step-by-step onboarding sequence: CV
(required), Profile (required), Portals (recommended), Tracker, Get to know the
user, Ready, so first-run flows never hit a dead-end when cv.md is not present.
- Line 5: The doc references use the wrong skill file token: replace every
occurrence of ".claude/skills/career-ops/career-ops.md" with the PR's canonical
skill token ".agents/skills/career-ops/SKILL.md" in the affected docs (the
compass mode spec and AGENTS/skill mentions) so all three reference points are
consistent; search for the outdated token and update it to the PR canonical
token, then run a quick pass to ensure the same replacement was applied at each
place flagged in the review.
- Around line 172-179: Replace the unlabeled fenced code blocks around the table
row "`| `compass` | `compass` |`" and the router example "/career-ops compass →
Career discovery: figure out what you want + set up your profile" with
language-tagged fences (e.g., ```md) and ensure there is a blank line before and
after each fenced block; update both occurrences of the triple-backtick fences
shown in the diff so they become "```md" and are separated from surrounding text
by an empty line.
In `@modes/compass.md`:
- Around line 122-145: Part 3's current copy assumes both CV-derived and
discovery-derived archetypes exist; update the flow around "Part 3: Where they
overlap — and where they don't" to first check for the presence of cv.md and
branch: if cv.md exists, keep the overlap/gap framing (lead with overlap as
primary, show gaps and ask the question), otherwise skip "overlap/gap" language
and present discovery-derived archetype(s) directly as primary/secondary
recommendations, then still ask "Does this feel right..." and pause for
confirmation before Phase 4; make sure to reference the cv.md existence check so
rendering logic and text vary accordingly.
- Around line 160-164: The candidate block currently assumes Populate from
`cv.md` but Phase 1 permits running without cv.md, so update the Block 1:
candidate logic to detect a missing or unreadable cv.md and gracefully fallback:
when `cv.md` is absent, populate name, email, phone, location, LinkedIn, GitHub
with empty strings or sensible placeholders and render the YAML preview with
those placeholders (or display a short "cv.md not found — please add" message in
the preview). Ensure the code/path that reads `cv.md` (the logic referenced by
"Populate from `cv.md`" in Block 1: candidate) returns the fallback object
instead of failing so downstream rendering of the YAML preview continues without
errors.
- Around line 102-114: Part 1 of Phase 3 currently unconditionally instructs
presenting CV-derived archetypes even when cv.md is missing; update the logic so
Part 1 checks for the presence of cv.md (the Phase 1 cv.md flag/marker) and, if
absent, emits the alternate text "discovery findings only, without a CV-derived
baseline" instead of listing CV-derived archetypes; modify the conditional
branch that builds Part 1's output (the section that "List the 2–3 CV-derived
archetype candidates") to reference the cv.md existence flag from Phase 1 and
render the CV-derived list only when that flag is true.
- Around line 214-225: Clarify that "skipping" is distinct from "approval":
update the passage so it states that files (config/profile.yml then
modes/_profile.md) are written only after the user has either approved or
explicitly skipped each section, and make clear that an explicit skip does not
count as approval but will cause the corresponding section in the written files
to remain as the template placeholder; also explicitly preserve the write
sequence and include the confirmation text "Profile saved. You're ready to start
evaluating roles — paste a job description or URL to run the full pipeline." so
the user sees the final state.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
Run ID: beebde78-a5e8-42ed-82bd-6726932a5aec
📒 Files selected for processing (5)
.agents/skills/career-ops/SKILL.mdAGENTS.mddocs/superpowers/specs/2026-05-13-compass-mode-design.mdmodes/compass.mdtest-all.mjs
…arity, spec accuracy - Part 1 and Part 3 of ikigai reveal now branch on cv.md presence - Block 1 candidate has fallback placeholders when cv.md is absent - Write gate distinguishes approved vs explicitly skipped sections - Spec doc: fix skill file token (.agents/SKILL.md), add cv.md fallback note, language-tag fenced blocks
There was a problem hiding this comment.
Actionable comments posted: 6
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/superpowers/specs/2026-05-13-compass-mode-design.md`:
- Around line 138-143: Update the Phase 4 block specs and the implementation in
modes/compass.md to define explicit fallbacks when cv.md is absent: for the
candidate block (Block 1) ensure contact fields fall back to discovery data and,
if missing, to an explicit "unknown" placeholder and a prompt to collect
email/phone; for the narrative block (Block 3) specify that headline,
superpowers, and proof points must be synthesized from discovery notes alone (or
else mark as "needs CV" and surface questions to elicit missing proof points),
and implement that synthesis logic in modes/compass.md; for the location block
(Block 5) state it should come from discovery constraints or a default of
"remote/unknown" plus a prompt to confirm location constraints, and update
modes/compass.md to populate location from discovery or emit the confirmation
prompt when absent.
In `@modes/compass.md`:
- Around line 177-187: The fenced YAML code block in modes/compass.md is missing
blank lines before and after (MD031); add a blank line immediately above the
opening "```yaml" and another blank line immediately below the closing "```" so
the surrounding text ("the user to fill..." and "Show as a YAML preview.") are
separated from the fenced block — this preserves Markdown formatting conventions
for the YAML snippet shown.
- Around line 218-221: Section 2 ("Adaptive framing table") currently claims
content is "Derived from Phase 1 functions and Phase 2 answers" but offers no
fallback when Phase 1 is skipped (i.e., when cv.md is absent); update the
compass.md text for "Section 2: Adaptive framing table" to detect or document
the fallback: if Phase 1 artifacts (cv.md / Phase 1 functions) are missing,
derive the framing table solely from Phase 2 answers and/or add a short note
that defaults will be used and which fields are populated from Phase 2; mention
the condition explicitly (cv.md absent) and the fallback behavior so readers and
implementers know to use Phase 2-only derivation.
- Around line 207-208: Block 5 ("location") currently assumes cv.md exists;
update the compass mode logic that populates Block 5 to detect when cv.md is
missing (Phase 1 allows running without it) and provide a fallback—e.g., leave
location blank with a clear placeholder, use a sourced default/location from
Phase 2 constraints, or prompt for user input—so the code path that builds
"Block 5: location" handles the absence of cv.md gracefully; modify the Block 5
population routine (the code that references cv.md for location) to branch on
cv.md presence and use the chosen fallback.
- Around line 223-225: Section 3: Exit narrative currently assumes a CV summary
exists; add conditional fallback so when cv.md is absent (per Phase 1 rules) the
"Exit narrative" generation uses Phase 2 discovery content or a short generic
CV-summary template instead; update the logic that composes "Section 3: Exit
narrative" to check for the presence of cv.md and, if missing, pull key points
from the Phase 2 discovery data or insert a 2–3 sentence placeholder linking
past experience to target direction.
- Around line 194-200: Block 3 ("narrative") assumes cv.md exists but Phase 1
permits running without it, so add explicit fallback logic: when cv.md is absent
populate headline from Phase 2 discovery/summary (or prompt user for a one-line
professional identity), derive superpowers from Phase 1/Phase 2
function/energizes answers as before, and build proof_points from Phase 2
notable projects or user-entered achievement bullets (or mark proof_points as
optional with a clear "no CV provided" placeholder). Update the Block 3
documentation to state these conditional behaviors and reference the fields
headline, superpowers, proof_points and the source cv.md so implementers follow
the fallback flow.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
Run ID: d0753bf3-dc33-4b17-b5be-326fbf43a3f6
📒 Files selected for processing (2)
docs/superpowers/specs/2026-05-13-compass-mode-design.mdmodes/compass.md
| 1. `candidate` block — populate from CV (name, email, phone, location, LinkedIn, GitHub) | ||
| 2. `target_roles` block — populate from Phase 3 archetype recommendations | ||
| 3. `narrative` block — headline, superpowers, and proof points derived from CV + discovery | ||
| 4. `compensation` block — ask directly if not surfaced in discovery: *"What's your target comp range and your walk-away number?"* | ||
| 5. `location` block — populate from CV + any constraints surfaced in discovery | ||
|
|
There was a problem hiding this comment.
Specify fallback behavior for Blocks 1, 3, and 5 when cv.md is absent.
Phase 1 (Line 66) establishes that cv.md can be absent, but the Phase 4 block descriptions assume CV data is available. When cv.md is missing:
- Block 1 (candidate): needs fallback for contact details
- Block 3 (narrative): "derived from CV + discovery" has no CV to derive from
- Block 5 (location): "populate from CV" has no CV to populate from
This specification gap propagates to the implementation file (modes/compass.md), where Block 1 has been addressed but Blocks 3 and 5 have not.
📋 Proposed specification update
**`config/profile.yml` sections (presented in order):**
-1. `candidate` block — populate from CV (name, email, phone, location, LinkedIn, GitHub)
+1. `candidate` block — if `cv.md` exists, populate from CV; otherwise prompt user for contact details
2. `target_roles` block — populate from Phase 3 archetype recommendations
-3. `narrative` block — headline, superpowers, and proof points derived from CV + discovery
+3. `narrative` block — headline, superpowers, and proof points derived from discovery; include CV-based proof points if `cv.md` exists
4. `compensation` block — ask directly if not surfaced in discovery: *"What's your target comp range and your walk-away number?"*
-5. `location` block — populate from CV + any constraints surfaced in discovery
+5. `location` block — populate from any constraints surfaced in discovery; include CV location if `cv.md` exists🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/superpowers/specs/2026-05-13-compass-mode-design.md` around lines 138 -
143, Update the Phase 4 block specs and the implementation in modes/compass.md
to define explicit fallbacks when cv.md is absent: for the candidate block
(Block 1) ensure contact fields fall back to discovery data and, if missing, to
an explicit "unknown" placeholder and a prompt to collect email/phone; for the
narrative block (Block 3) specify that headline, superpowers, and proof points
must be synthesized from discovery notes alone (or else mark as "needs CV" and
surface questions to elicit missing proof points), and implement that synthesis
logic in modes/compass.md; for the location block (Block 5) state it should come
from discovery constraints or a default of "remote/unknown" plus a prompt to
confirm location constraints, and update modes/compass.md to populate location
from discovery or emit the confirmation prompt when absent.
| the user to fill in any blank fields before approving: | ||
| ```yaml | ||
| candidate: | ||
| full_name: "" | ||
| email: "" | ||
| phone: "" | ||
| location: "" | ||
| linkedin: "" | ||
| github: "" | ||
| ``` | ||
| Show as a YAML preview. |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial | 💤 Low value
Add blank lines around the YAML code block.
The fenced code block at Lines 178-186 is missing blank lines before and after per Markdown formatting conventions (MD031).
📝 Proposed formatting fix
If `cv.md` is absent, show the block with empty string placeholders and ask
the user to fill in any blank fields before approving:
+
```yaml
candidate:
full_name: ""
email: ""
phone: ""
location: ""
linkedin: ""
github: ""Show as a YAML preview.
</details>
<!-- suggestion_start -->
<details>
<summary>📝 Committable suggestion</summary>
> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
```suggestion
the user to fill in any blank fields before approving:
🧰 Tools
🪛 markdownlint-cli2 (0.22.1)
[warning] 178-178: Fenced code blocks should be surrounded by blank lines
(MD031, blanks-around-fences)
[warning] 186-186: Fenced code blocks should be surrounded by blank lines
(MD031, blanks-around-fences)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@modes/compass.md` around lines 177 - 187, The fenced YAML code block in
modes/compass.md is missing blank lines before and after (MD031); add a blank
line immediately above the opening "```yaml" and another blank line immediately
below the closing "```" so the surrounding text ("the user to fill..." and "Show
as a YAML preview.") are separated from the fenced block — this preserves
Markdown formatting conventions for the YAML snippet shown.
| **Block 3: narrative** | ||
| - `headline`: one-line professional identity, drafted from CV summary | ||
| and Phase 2 discovery | ||
| - `superpowers`: 3–5 bullets derived from the functions identified in | ||
| Phase 1 and the "energizes you" answers from Phase 2 | ||
| - `proof_points`: notable projects or achievements from `cv.md`, each | ||
| with a `hero_metric` if one can be derived |
There was a problem hiding this comment.
Add fallback handling for Block 3 when cv.md is absent.
Block 3 narrative references "CV summary" (Line 195) and "from cv.md" (Line 199), but Phase 1 (Lines 36-38) allows compass to run without cv.md. When cv.md is absent:
- "drafted from CV summary" has no CV to draft from
- "proof_points...from
cv.md" has no source data
Without explicit fallback guidance, implementers won't know how to populate this block in the no-CV scenario.
📋 Proposed fix with conditional fallback
**Block 3: narrative**
-- `headline`: one-line professional identity, drafted from CV summary
- and Phase 2 discovery
+- `headline`: one-line professional identity, drafted from Phase 2
+ discovery; if `cv.md` exists, incorporate CV summary
- `superpowers`: 3–5 bullets derived from the functions identified in
- Phase 1 and the "energizes you" answers from Phase 2
+ Phase 1 (if cv.md present) and the "energizes you" answers from Phase 2
- `proof_points`: notable projects or achievements from `cv.md`, each
- with a `hero_metric` if one can be derived
+ with a `hero_metric` if one can be derived; if `cv.md` is absent,
+ leave as empty array or prompt user for 1-2 key achievements🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@modes/compass.md` around lines 194 - 200, Block 3 ("narrative") assumes cv.md
exists but Phase 1 permits running without it, so add explicit fallback logic:
when cv.md is absent populate headline from Phase 2 discovery/summary (or prompt
user for a one-line professional identity), derive superpowers from Phase
1/Phase 2 function/energizes answers as before, and build proof_points from
Phase 2 notable projects or user-entered achievement bullets (or mark
proof_points as optional with a clear "no CV provided" placeholder). Update the
Block 3 documentation to state these conditional behaviors and reference the
fields headline, superpowers, proof_points and the source cv.md so implementers
follow the fallback flow.
| **Block 5: location** | ||
| Populate from `cv.md` location and any constraints surfaced in Phase 2. |
There was a problem hiding this comment.
Add fallback handling for Block 5 when cv.md is absent.
Block 5 location states "Populate from cv.md location" (Line 208), but Phase 1 (Lines 36-38) allows compass to run without cv.md. When cv.md is absent, there is no CV location to populate from.
📋 Proposed fix with conditional fallback
**Block 5: location**
-Populate from `cv.md` location and any constraints surfaced in Phase 2.
+Populate from any constraints surfaced in Phase 2; if `cv.md` exists,
+include CV location. If no location data from either source, prompt user:
+> *"What's your current location and any location/remote preferences?"*🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@modes/compass.md` around lines 207 - 208, Block 5 ("location") currently
assumes cv.md exists; update the compass mode logic that populates Block 5 to
detect when cv.md is missing (Phase 1 allows running without it) and provide a
fallback—e.g., leave location blank with a clear placeholder, use a sourced
default/location from Phase 2 constraints, or prompt for user input—so the code
path that builds "Block 5: location" handles the absence of cv.md gracefully;
modify the Block 5 population routine (the code that references cv.md for
location) to branch on cv.md presence and use the chosen fallback.
| **Section 2: Adaptive framing table** | ||
| For each archetype, a brief note on which parts of the candidate's | ||
| background to emphasize. Derived from Phase 1 functions and Phase 2 | ||
| answers. |
There was a problem hiding this comment.
Add fallback handling for Section 2 when Phase 1 is skipped.
Section 2 states "Derived from Phase 1 functions and Phase 2 answers" (Line 220), but Phase 1 is skipped when cv.md is absent (Lines 36-38). In that scenario, "Phase 1 functions" don't exist.
📋 Proposed fix with conditional fallback
**Section 2: Adaptive framing table**
For each archetype, a brief note on which parts of the candidate's
-background to emphasize. Derived from Phase 1 functions and Phase 2
-answers.
+background to emphasize. Derived from Phase 2 answers; if Phase 1 ran
+(cv.md present), also incorporate function signals from CV analysis.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@modes/compass.md` around lines 218 - 221, Section 2 ("Adaptive framing
table") currently claims content is "Derived from Phase 1 functions and Phase 2
answers" but offers no fallback when Phase 1 is skipped (i.e., when cv.md is
absent); update the compass.md text for "Section 2: Adaptive framing table" to
detect or document the fallback: if Phase 1 artifacts (cv.md / Phase 1
functions) are missing, derive the framing table solely from Phase 2 answers
and/or add a short note that defaults will be used and which fields are
populated from Phase 2; mention the condition explicitly (cv.md absent) and the
fallback behavior so readers and implementers know to use Phase 2-only
derivation.
| **Section 3: Exit narrative** | ||
| A 2–3 sentence professional narrative bridging past experience to | ||
| target direction. Draws from CV summary + Phase 2 discovery. |
There was a problem hiding this comment.
Add fallback handling for Section 3 when cv.md is absent.
Section 3 states "Draws from CV summary + Phase 2 discovery" (Line 225), but cv.md can be absent per Phase 1 (Lines 36-38). When cv.md is absent, there is no CV summary to draw from.
📋 Proposed fix with conditional fallback
**Section 3: Exit narrative**
A 2–3 sentence professional narrative bridging past experience to
-target direction. Draws from CV summary + Phase 2 discovery.
+target direction. Draws from Phase 2 discovery; if `cv.md` exists,
+incorporate CV summary to bridge past experience.📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| **Section 3: Exit narrative** | |
| A 2–3 sentence professional narrative bridging past experience to | |
| target direction. Draws from CV summary + Phase 2 discovery. | |
| **Section 3: Exit narrative** | |
| A 2–3 sentence professional narrative bridging past experience to | |
| target direction. Draws from Phase 2 discovery; if `cv.md` exists, | |
| incorporate CV summary to bridge past experience. |
🧰 Tools
🪛 LanguageTool
[style] ~224-~224: Consider using “experience”.
Context: ...entence professional narrative bridging past experience to target direction. Draws from CV summ...
(PAST_EXPERIENCE_MEMORY)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@modes/compass.md` around lines 223 - 225, Section 3: Exit narrative currently
assumes a CV summary exists; add conditional fallback so when cv.md is absent
(per Phase 1 rules) the "Exit narrative" generation uses Phase 2 discovery
content or a short generic CV-summary template instead; update the logic that
composes "Section 3: Exit narrative" to check for the presence of cv.md and, if
missing, pull key points from the Phase 2 discovery data or insert a 2–3
sentence placeholder linking past experience to target direction.
|
All 7 findings from the CodeRabbit review have been addressed in commit
|
What this adds
A new
/career-ops compassmode that helps users who don't know what roles to target figure out their direction — and ends with a fully draftedprofile.yml+_profile.mdready for their approval.The current onboarding flow (AGENTS.md Step 2) assumes users already know their target roles. Users who don't have no guided path. Compass fills that gap.
How it works
Phase 0 — Profile check
Detects whether a real profile exists. If so, asks "revisit your direction or start fresh?" before proceeding.
Phase 1 — Silent CV analysis
Reads
cv.mdinternally and derives domains, functions, seniority signals, and 2–3 candidate archetypes. Nothing is shown to the user yet.Phase 2 — Adaptive discovery questions
Asks 3 core questions (what energizes you, what you want more of, what's a hard no). Follows up adaptively based on signals of uncertainty — 3 questions minimum, 10 maximum. Stops early when the picture is clear.
Phase 3 — Ikigai-style reveal
This is the heart of the mode. Shows the CV-derived archetype suggestions ("here's what I would have pointed you toward before you told me anything"), then the discovery synthesis, then where they overlap and diverge. Surfaces insights the user may not have considered. Confirms before moving on.
Phase 4 — Interactive profile drafting
Presents draft
profile.ymland_profile.mdsection by section. User approves, edits, or skips each block. Files are written only after full approval.Changes
modes/compass.md— new mode (225 lines)AGENTS.md— Step 2 onboarding offramp + Skill Modes table entry.agents/skills/career-ops/SKILL.md— routing table, argument-hint, discovery menu, context loadingtest-all.mjs— compass added to expected modes listTest plan
node test-all.mjspasses (66 passed, 0 failed)/career-ops compasswith no profile set up — should proceed directly to CV analysis + questions/career-ops compasswith existing profile — should ask "revisit or start fresh?"/career-opswith no args — compass should appear first in the discovery menuFollow-on
/career-ops polish— CV enhancement for target archetypes — is the natural next PR once this lands.Summary by CodeRabbit
New Features
Documentation
Tests