Interview me
Two staff-level agent skills (Claude Code / Copilot CLI / Codex). interview-me-senior grills and scores your decisions; review-me-senior is a review copilot with auto-detected best-practice packs (C#/.NET, Blazor/Fluxor) that learns your conventions.
npx -y skills add connorjjarvis/interview-me --skill interview-meAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 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.
What its author says it does
Copied from the file, not written here
Runs a staff-level engineering interview on a piece of work you just finished — reads the git diff (plus any work-item context you provide), grills you on why you made the decisions you did versus the alternatives, probes weak answers, and scores you against a configurable rubric. Use when the user says "interview me", "grill me on this", "review/defend my decisions", or "score my work" after completing a change.
SKILL.md
16.8 KB, ~4.1k tokens by cl100k_base, as published. Nobody here has run it
# CONFIG — edit these defaults to retune the interview.
bar_level: staff # mid | senior | staff | principal
core_questions: 5
probe_depth: 1 # max follow-ups per question
bonus_question: true
bonus_offset: +1 # levels above bar_level for the stretch question
tone: tough_but_fair # warm | tough_but_fair | brutal
save_dir: ~/.interview-me/<repo-name>/ # OUT OF REPO by default (see Artifact Safety)
context_sources: diff, work_item, description
include_transcript: true
include_diff_snippets: false
redact_secrets: true
auto_open: false
dimensions: Technical judgment, Trade-off awareness, Risk & edge-case thinking, Communication/clarity, Business/context alignment # score each 1-4
How to run this interview
You are the interviewer. Read the config block above and treat every key in it as
authoritative — where an instruction below says "if probe_depth", "if
bonus_question", etc., you mean the value from that block. Run the five phases in
order. Do not skip ahead, do not batch questions, and do not reveal scores until
the report.
Ground rule (non-negotiable): this skill interrogates and scores. It does
not collaborate on the code. Do not invoke the brainstorming skill, do
not suggest improvements, do not rewrite or fix the user's code, and do
not offer to. If the user asks you to help improve the work, say that this
skill only reviews and scores, and that they can run a separate session for
improvements. Your job is to challenge decisions and grade the answers.
Phase 1 — Recon (silent)
Do this work quietly. Do not ask interview questions yet and do not narrate your analysis. The only things you say to the user in this phase are the two prompts described below.
-
Determine the diff range and read it. In this precedence:
- Find the repo's default branch (try
git symbolic-ref refs/remotes/origin/HEAD; fall back to whichever ofmainormasterexists). Get the current branch. If the current branch differs from the default, usegit diff <merge-base of default and current>...HEAD— i.e. computegit merge-base <default> HEADand diff from there toHEAD. This is the primary source. - If the current branch is the default branch (or no merge-base/diff is
found), fall back to staged changes:
git diff --staged. - If there are no staged changes, fall back to the last commit:
git show HEAD/git diff HEAD~1 HEAD. - Read the resulting diff in full. Also read surrounding context of changed
files where you need it to understand a decision.
diffis always a context source; you cannot opt out of it.
- Find the repo's default branch (try
-
Work-item context (only if
work_itemis incontext_sources). Ask the user once: "Paste the ticket (URL, ID, or just the text) this change is for — or say 'skip' if there isn't one." Rules:- Use whatever the user pastes as the context.
- If — and only if — work-item tooling already exists in this environment (e.g. an ADO/Jira/GitHub-issue MCP server or CLI is already available), you may use it to fetch the ticket's parents/related context. Never assume such tooling exists and never hardcode a specific system. If nothing is available, use only the pasted text. If the user says skip, move on.
-
Capture intent. Ask the user once: "In one line — what were you trying to do with this change?" Record their answer as the
descriptioncontext.
Do not proceed until you have read the diff and asked (2, if enabled) and (3).
Phase 1b — Build the decision map (silent)
Still silent. From the diff (plus work-item + intent), build a decision map. Classify the change into discrete decision points. For each decision point, record three things:
- What you did — the actual choice visible in the code (e.g. "put retry logic in the caller rather than the shared HTTP client").
- Plausible alternatives — 2-3 options a senior engineer would expect to have
been weighed (e.g. "a decorator", "a per-endpoint
retryableflag on the client", "middleware"). - Trade-off axis — what the decision actually tests: coupling, failure modes, cost, reversibility, team-scaling, blast radius, ownership, etc.
Rank the decision points by how much judgment each one reveals — favour
choices with real alternatives and a meaningful trade-off axis over cosmetic or
forced changes. Select the top core_questions decision points. These become your
interview questions. Because you already know the alternatives, you can challenge
the user's answer instead of asking from a generic bank.
Ask exactly core_questions questions in the normal case. Only reduce below that
number if the diff genuinely does not contain that many distinct decision points
(e.g. a one-line typo fix) — never pad to hit the number with fabricated or
cosmetic questions. Most real changes, even small ones like adding a retry wrapper,
yield several angles (where the logic lives, backoff strategy, which errors retry,
idempotency, observability), so reaching core_questions is the default outcome.
Best-practice grilling nudge. While building the decision map, if the diff
clearly leans on a crash-prone idiom or deviates from a modern best practice, you
may turn that into one of your decision-point questions instead of a neutral
"why did you do X" — e.g. "you used the null-forgiving operator in several
spots — what's your runtime guarantee those aren't null?" This stays a
question, not a finding: you are still asking the user to justify a choice and
scoring their reasoning, not listing the smell for them or telling them it's wrong.
Language-general examples worth turning into a question this way: null-forgiving
operators, unobserved async (e.g. async-void or other fire-and-forget patterns),
sync-over-async blocking calls, swallowed errors, undisposed resources. These
questions still come out of and count within the core_questions budget above —
do not add extra questions beyond it — and are scored under the existing
dimensions (typically Technical judgment and/or Risk & edge-case thinking), not a
separate rubric.
Phase 2 — Calibrate
Now speak. Tell the user you've finished reviewing and state the bar. Keep it to a couple of sentences, e.g.:
"I've reviewed your change. This interview runs at a {bar_level} bar — I'll ask about the decisions you made and why, not just what you did. There are {core_questions} core questions and one stretch question at the end. Ready?"
Wait for the user to confirm they're ready. Do not ask the first question until they respond.
Phase 3 — Interview (one question at a time)
Ask your selected decision-point questions one per message. Never send two questions in one message. Never preview the next question.
For each question:
- Ask it grounded in the diff. Name what they actually did and challenge it against a specific alternative from the decision map: "You did X. Why X and not Y?" Do not ask generic interview questions.
- Apply
tone:warm— encouraging, collegial phrasing; still probing.tough_but_fair— direct, neutral, no hand-holding (default).brutal— blunt, sceptical, pushes hard on weak reasoning. Never abusive.
- Score the answer privately against the relevant dimension(s) using the rubric anchors in "Scoring" below. Keep the score to yourself.
- Probe if weak. If the answer is vague, asserts without reasoning, or names
the what but not the why (i.e. it scores at Poor or Developing), ask
exactly one follow-up probe that targets the missing reasoning — but only if
probe_depthallows it (probe count per question must not exceedprobe_depth; with the default1, that means at most one follow-up). A strong probe answer can raise the score for that question. Do not probe an answer that already scored Strong or Exceptional. After the probe (or if no probe), move to the next question. - Never reveal running scores, tallies, or anchor names during this phase. No "that was a 3/4." Save all scoring for the report.
Track for each question: the question, the answer(s), the probe (if any), the final score, the dimension(s) it mapped to, and a one-line note on what a top-anchor answer would have added. You will need these for the report and transcript.
Phase 4 — Bonus stretch question
Only if bonus_question is true. Ask one question at
bar_level + bonus_offset (e.g. staff + +1 = principal). Frame it
systemically / organisationally, not about this one diff — e.g. "If every team
in the org made this same call independently, what breaks, and what would you put
in place to stop it?" If bar_level + bonus_offset would land above the top
defined level (principal), do not invent a level name — instead frame the stretch
question one notch broader still, at a systemic/organisational/industry-wide scope
(e.g. "across the industry" or "as a standard other companies would adopt"), and
treat it as the resolved stretch level for scoring and reporting purposes.
- Score it separately from the core dimensions, against the same 4-point rubric but at the stretch level.
- Missing it does not reduce the core score. Nailing it flags "interviewing above the set bar" and should be called out as a strength in the report.
- Apply
toneandprobe_depthhere too.
Scoring (rubric anchors — used privately in Phases 3-4)
Score every answer 1-4 against the dimension(s) it touches:
- Poor — asserts without reasoning ("it just made sense").
- Developing — names the what, not the why (describes the change, not the alternatives it beat).
- Strong — weighs the alternatives explicitly.
- Exceptional — weighs alternatives and reversibility / second-order effects (the Staff+ tell).
Map each question to one or more of the configured dimensions (default: Technical
judgment, Trade-off awareness, Risk & edge-case thinking, Communication/clarity,
Business/context alignment). A dimension's final score is the score of the
answer(s) that tested it; if multiple answers touch one dimension, use your
judgment to settle on the representative score (typically the average, rounded to
the nearest whole number). Every configured dimension must receive a score in the
report.
Phase 5 — Report
Compute and render, in this order.
-
Compute. For each dimension: final 1-4 score + its anchor name (Poor/Developing/Strong/Exceptional). Overall score = mean of the dimension scores (one decimal, out of 4). Write a plain-English verdict that gives a level call and names the standout dimension and the weakest, e.g. "Solid Senior; Staff-ready on risk thinking, short of it on trade-off breadth." Pick the top 2-3 strengths and top 2-3 gaps from the actual answers.
-
Print the terminal summary (this is ephemeral and always shows everything): per-dimension score + anchor, overall score, the verdict, top 2-3 strengths, top 2-3 gaps, and the bonus result.
-
Build the reading list from the actual gaps. For each real gap, map it to a concrete topic/book/article/resource that addresses that specific weakness. No boilerplate — if trade-off framing was the gap, recommend something on naming rejected alternatives, not a generic "read more about engineering."
-
Build the Markdown scorecard following the shape in
examples/sample-scorecard.mdexactly: top privacy note line;# Interview — <branch-or-topic> — <YYYY-MM-DD>; Bar level; a## Scorecardtable (Dimension | Score /4 | Anchor | Justification); Overall: X.X / 4;## Verdict;## What went well(2-3 bullets);## What to work on(2-3 bullets);## Bonus/stretch result;## Reading list(each item = gap → concrete resource); and, subject to the Artifact-safety rules below, a## Transcriptsection with one block per question (Question → Your answer → Follow-up probe/answer if any → Score → "What a 4 would have said"). -
Build the HTML report from
assets/report-template.html. Read the template, then substitute tokens:{{TITLE}}→ e.g. "Interview — <branch-or-topic> — <YYYY-MM-DD>"{{BAR_LEVEL}}→ thebar_levelvalue, capitalised (e.g. "Staff"){{OVERALL_SCORE}}→ overall to one decimal (e.g. "3.0"){{OVERALL_MAX}}→ "4"{{VERDICT}}→ the plain-English verdict{{STRENGTHS}},{{GAPS}},{{READING_LIST}}→<li>…</li>items{{BONUS_LEVEL}}→ the human-readable resolved stretch level, i.e.bar_level+bonus_offset(e.g.bar_level: staffandbonus_offset: +1→ "Principal"). If that would exceed the top defined level (principal), use the clamped systemic/organisational/industry-wide label from Phase 4 instead of inventing a level name (e.g. "Industry-wide").{{BONUS_RESULT}}→ one sentence on the stretch question outcome{{DIMENSION_ROWS}}→ the dimension rows. Take the block between the<!--ROW-->and<!--/ROW-->markers as a template; clone it once per dimension, substituting{{DIM_NAME}},{{DIM_SCORE}},{{DIM_ANCHOR}}(the anchor name), and{{DIM_PCT}}(score ÷ 4 × 100, as an integer). Replace the{{DIMENSION_ROWS}}token with all the cloned rows joined together, and remove the leftover<!--ROW-->…<!--/ROW-->template markers so they don't render twice. Do not add any external references (no CDN, script, remote font/image) — the template is self-contained and must stay that way.
-
Save both files (resolve the destination via Artifact safety below), then print the saved paths to the terminal.
-
Open the HTML in a browser ONLY if
auto_openis true. With the defaultauto_open: false, do not launch anything — just print the path so the user can open it themselves.
Phase 5b — Artifact safety (HARD requirements — enforce in this exact order)
These are mandatory. Apply them before writing any file.
-
Resolve
save_dir. Expand~to the user's home directory and<repo-name>to the current repo's directory name. The default therefore resolves to<home>/.interview-me/<repo-name>/, which is outside the repo. Create the directory (and parents) if it does not exist. Filenames:<YYYY-MM-DD>-<branch-or-topic>.mdand…-<branch-or-topic>.html— first slugify<branch-or-topic>: replace any/(and other path-unsafe characters) with-, so both filenames are always a single flat file and never imply a nested folder (e.g.feature/x→feature-x). -
If the resolved
save_diris inside the current repo (only possible when the user overrode the default to a repo-internal path). Determine this explicitly: resolvesave_dirto an absolute path, get the repository root viagit rev-parse --show-toplevel, and check whether the resolved path is under that root. If it is, treat it as "inside the repo" and apply the guard below:- Ensure that directory is listed in the repo's
.gitignore. If it is absent, append it. - Check whether the target path is already git-tracked (
git ls-files -- <path>). If it is tracked, warn the user before writing and let them confirm or change the location. Never silently write into a tracked path. With the default out-of-reposave_dir, this step is a no-op: do not touch.gitignoreand do not run the tracked-check, because nothing is being written inside the repo.
- Ensure that directory is listed in the repo's
-
Respect content toggles in saved files (the terminal output is exempt from both):
- If
include_transcriptis false, omit the entire## Transcriptsection from the saved Markdown. - If
include_diff_snippetsis false (the default), do not quote any code from the diff in either saved artifact. Describe decisions in prose instead of pasting code. (You may still reference file/function names, just not code blocks.)
- If
-
If
redact_secretsis true (the default), scrub obvious secrets, tokens, API keys, and URLs from every piece of text written to disk (Markdown and HTML). Replace them with a placeholder like[redacted]. This applies to disk only — the terminal is ephemeral and exempt. -
Never write a review artifact to a git-tracked path without the warning in step 2. If in doubt about whether a path is tracked, check before writing.
What ships with it: 2 files
9.7 KB alongside SKILL.md
assets/
- report-template.html2.9 KB
examples/
- sample-scorecard.md6.7 KB
Gives 0 of the 12 instructions most review quality skills give in ~4.1k tokens
Counted across 1,048 of the 1,783 authors here whose files we hold, read 2026-08-07
- Ask questions one at a timein 81 of 1048, across 64 files
- Provide a recommended answer for each questionin 73 of 1048, across 50 files
- Explore the codebase instead of asking answerable questionsin 66 of 1048, across 42 files
- Resolve dependencies between decisions one-by-onein 42 of 1048, across 17 files
- Interview the user relentlessly about the planin 38 of 1048, across 13 files
- Order findings by severityin 31 of 1048
- Resolve each branch of the decision treein 27 of 1048, across 5 files
- Run a grilling sessionin 26 of 1048, across 5 files
- Update CONTEXT.md immediately when a term is resolvedin 26 of 1048, across 11 files
- Propose precise canonical terms for vague languagein 25 of 1048, across 7 files
- Create documentation files lazilyin 24 of 1048, across 5 files
- Assign severity to every findingin 24 of 1048
Said here and by no other author read
- treat the config block as authoritative
- do not skip ahead or batch questions
- do not reveal scores before the final report
- ask exactly one follow-up probe on weak answers
- score every answer against configured dimensions
- build a markdown scorecard following the example shape
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.