Mock interview
Starts a mock interview session with configurable mode (guided, random, adaptive), stage (recruiter, hiring manager, technical, panel, executive, final), and vibe (supportive through bored). If mode or vibe are omitted, the system selects defaults and announces them. Delegates to interview-coach; optional mcp-voice MCP TTS/STT when tools are present. Also invocable via /career-navigator:mock-interview.From its SKILL.md
npx -y skills add tmargolis/career-navigator --skill mock-interviewAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 14 stars14 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
4.5 KB, as published. Nobody here has run it
Workflow
1. Resolve {user_dir} and gate
Application data uses the split layout defined in references/tracker-schema.md — read it before any read or write.
Same as prep-interview: require CareerNavigator/profile.md, ExperienceLibrary.json, and tracker.json unless the user only wants a generic mock with pasted JD (then still need profile + EL minimum; create minimal context note if tracker empty).
2. Parameters (ask once if missing)
| Parameter | Values |
|---|---|
| mock_mode | guided | random | adaptive |
| interview_stage | recruiter | hiring_manager | technical | panel | executive | final |
| vibe | supportive | neutral | challenging | antagonistic | bored |
| target | application_id or company + role (optional for generic practice) |
2.1 When mode or vibe are not specified — system selection
The model must choose a concrete mock_mode and vibe before starting—never leave them implicit in the opening line.
mock_mode(if user omitted): useadaptive(default for learning and feedback). If the user asked for “surprise me,” “mix it up,” or equivalent, pickrandomat random and state that you did.vibe(if user omitted): useneutral. If the user asked for “surprise” / “mix it up,” pick one vibe at random from the five allowed values and state it.interview_stage(if user omitted): infer from thetracker.jsonsummary row for the active application — itsstatus,latest_stage, andlatest_stage_dategive the next likely stage without opening anything (e.g.phone_screen/latest_stage: "recruiter"→recruiter; otherwisehiring_manager). Read the row'sdetail_file(applications/<application_id>.json) only when the user asks to practice against the actual interview history, and only for that one application. If no application context, defaulthiring_manager.- Announce in one line before the first question, e.g.:
Selected: mode=adaptive, vibe=neutral, stage=hiring_manager (defaults — say if you want different).
Recruiter practice: When the user asks to practice for a recruiter or phone screen, set interview_stage to recruiter.
3. Audio (mcp-voice Extension)
Discover session tools: if speak (TTS) or listen (STT) from the mcp-voice extension are present, prefer them for mock practice per agents/interview-coach/AGENT.md. Otherwise text-only. Never require audio.
4. Invoke interview-coach
Read and follow agents/interview-coach/AGENT.md with:
mode:mockmock_mode,vibe,interview_stage- Target context (application id, company, role, JD if any)
Run the mock turn-by-turn in chat until the user ends or you reach a natural wrap-up per the agent.
5. Optional tracker note
Only when the user asks for a log (or it clearly aids follow-up), write the multi-file transaction for appending a note, per references/tracker-schema.md — never edit one file and skip the other:
- Find the application's summary row in
tracker.json(match onid; checkprevious_idsif the id came from an older brief) and take itsdetail_file. - Append to that file's
notes[]— never overwrite or reorder existing entries:{ "date": "YYYY-MM-DD", "text": "[mock] {interview_stage} mock — {mode}/{vibe}, {one-line takeaway}" } - Set the summary row's
notes_countto the new array length.
A mock is not a real interview: do not append to stage_history[], and do not touch
status, latest_stage, or latest_stage_date.
Load and re-dump both files programmatically (json.load / json.dump with indent=2,
ensure_ascii=False) and reload to validate — hand-editing this JSON has corrupted files before.