Interview Prep

Published by dominiquevienne in claude-job-hunt

No known issues1 installs

What this skill does

Prepare a booked interview from an application already in the ledger, then debrief it afterwards. Builds a briefing sheet from what the employer actually received — the tailored resume and letter, the archived ad, the scoring gaps, the red lines — and after the meeting records what was answered, what was not, the next step and its date. Use when the user says "prepare my interview", "j'ai un entretien pour X", "fiche de préparation", "I have a call with <company> tomorrow", or reports back on a

Add Interview Prep to your agent

Review the source and files first. When you are ready, copy the prompt instruction or use the CLI command supported by your environment.

Install with a prompt

Paste this into a compatible coding agent:

add this skill "interview-prep" from https://github.com/dominiquevienne/claude-job-hunt

Install with the CLI

Run this command in a controlled environment after reviewing the repository:

npx skills add https://github.com/dominiquevienne/claude-job-hunt --skill interview-prep

Skill instructions

Interview: prepare, then debrief

One skill, two phases, and they are one object on purpose. The questions are written before the meeting and answered after it, and the most useful column of a debrief is which prepared questions came back unanswered — which exists only if the same object holds both halves. Two skills sharing state are one skill. Issues #50 and #69.

Shared references:

FileWhen
shared/never-fail-silently.mdAlways. Nothing skipped, partial or guessed goes unsaid
shared/workspace.mdPhase 1 step 0 — locating the user's data
shared/interview-debrief.mdPhase 2 in full — the format, and the rule that the candidate's read is collected and never inferred
shared/pipeline-format.mdThe IV: and FU: markers, and the statuses this skill never touches
shared/plausible-and-false.mdBefore quoting any figure from the file back to the user

Phase 1 — before the meeting

0 — Load the workspace

JOB_HUNT_HOME="${JOB_HUNT_HOME:-$HOME/Documents/job_applications}"
S="${CLAUDE_PLUGIN_ROOT:-.}/skills/job-scan/scripts"
test -f "$JOB_HUNT_HOME/config.yml" && cat "$JOB_HUNT_HOME/config.yml"
python3 "${CLAUDE_PLUGIN_ROOT:-.}/bin/version-check.py"
python3 "$S/ledger.py" index --excluded-only

Then make the record searchable, once — phase 1 cannot do its job without it:

test -d "$JOB_HUNT_HOME/profile/.text" || \
  "${CLAUDE_PLUGIN_ROOT}/skills/cover-letter/sync-sources.sh" "<Full Name>"

1 — Which application, and what to do when there is none

Match the company, the pipeline id or the ad URL against the ledger. The application folder is <YYYYMMDD>_<Company>-<Role>/ and holds what the employer actually received — that is what they will ask about.

No application in the ledger is not a refusal. Build the sheet from the ad URL and candidate.md, and say at the top that it is thinner: no tailored resume, no archived ad, no scoring rationale. A user who has an interview tomorrow for something they applied to by hand still needs the sheet. What they must not get is a thin sheet presented as a full one.

2 — Ask about the meeting, in one batch

One AskUserQuestion call, with sensible defaults — never one question per turn. These are not the point of the skill; they are what it needs to stop guessing:

Default
Whenthe next working day, to be corrected
How long30–45 min
Formatphone / video / on-site
Who is in the room, and in what roleunknown, and the sheet says so
Which roundfirst

Where the employer is an agency or a consultancy, add one question and only one: is the end client named? It is the most valuable unknown in that configuration — it decides what the work actually is, where it happens, and who the candidate would be reporting to.

3 — Build the sheet

From the folder: the tailored resume and letter (what they received), the archived ad with its must-haves and its pay estimate and reserves, the ledger Note with the scoring rationale, and candidate.md for availability, mobility, language levels and the things that must not be said.

3a — Every gap is proven against profile/ before it reaches the sheet

This is the hardest requirement here and the one that has already cost something. A sheet told a candidate that Confluence was "not documented in the file" and handed them a sentence to deflect it with. It is in profile/skills.pdf with eight experiences behind it, and the ad named it. The sheet took the strongest tool match in the whole ad and turned it into something to apologise for.

grep -ril "confluence" "$JOB_HUNT_HOME/profile/.text/"
  • No gap reaches the sheet on the Note's authority alone. A Note is a scoring artefact written at one moment by one run, possibly against sources that did not include the inventory. It is a lead, not a proof.
  • Not found is not not there. Where a requirement is unattested, the honest output is a question to the candidate — "not attested in profile/; do you have it?" — never an assertion of absence.
  • A Note gap that turns out to be attested becomes an evidence line, and the sheet says so rather than quietly dropping it. The candidate needs to know they can answer that question well.
  • Where the search cannot be run at all — no pdftotext, no profile/ — say so and assert nothing.

Why this matters more here than anywhere else. A wrong positive claim is caught in the room, by the interviewer. A wrong negative claim is never caught: the candidate has no reason to doubt their own file, concedes a requirement they meet, and spends on an apology the answer that would have landed. The plugin's promise is that it never invents a skill the user lacks; the mirror of that promise is never denying one they have.

3b — What the candidate should ask

Turn the ad's own reserves into questions. On the case that produced this skill: the ad was not on the employer's own careers site, which listed 49 other posts, and the end client was not named — both are first questions, not curiosities.

Every prepared question is written down as a question, because phase 2 will report which ones came back unanswered, and that column cannot exist otherwise.

3c — Pay, and the red lines

The archived ad carries the estimate with its tier and its reserves — an agency's advertised range is the agency's, not the client's budget. Quote it with the reserve attached, per shared/plausible-and-false.md.

And candidate.md's red lines are reproduced as red lines: what must not be mentioned, and what must not be overstated.

4 — The calendar event: proposed, confirmed, never silent

Offer to add it. Never add it silently, and never fail silently. The user may have no calendar connected; a skill that quietly does nothing is worse than one that says it cannot. If it cannot be created, say so and give the details so the user can add it in five seconds.


Phase 2 — after the meeting

Follow shared/interview-debrief.md in full. It is the format, and two of its rules outrank convenience:

  • The candidate's own read is collected, never inferred. Do not read a tone of voice into a summary, do not soften a bad impression into a balanced one, and do not talk somebody out of a good one. Asked in three parts kept separate — the work, the people, their apparent interest.
  • An interview question the candidate could not answer is not a gap in their profile. Prove it against profile/.text/ before recording it as one — the same rule as 3a, arriving from the other direction.

And the column that justifies one object rather than two: the prepared questions from step 3b, against what came back, with the unanswered ones named. They are the agenda for the next conversation and the first thing to vanish from memory.

Writing to the ledger, and what this skill never does

Only markers in the Note, never the Status:

`IV:2026-09-02 phone` `FU:2026-09-11` réponse promise · présentation interne, sans date

IV: records that the meeting happened, FU: what was promised. shared/pipeline-format.md has both, and neither changes the status — a row that reached an interview must never stop counting as an application sent.

And the free text after the markers goes through ledger.py escape before it is written — an e-mail subject copied in, "Antaes | Meeting confirmation", is how #200 put a tenth cell on a row. It fell after Status; the next one need not.

python3 "$S/ledger.py" escape "<the sentence, as imported>"

And the plugin does not lift a decision it did not take. If a debrief reveals that a row marked no-go or discarded is in fact open, say so and leave the re-opening to the candidate. Those statuses record their decision, not ours.

This skill never: writes a claim about the candidate that profile/ does not support, invents an interviewer's name, files a calendar event without confirmation, or reports a sheet built in degraded mode as a full one.

Files included

  • SKILL.md

More skills

Interview Prep: Install, Source and Security | FunnelSlayer