agentsclimarketplace

Interview me

Skill connorjjarvis/interview-me/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.

Install
npx -y skills add connorjjarvis/interview-me --skill interview-me

Assembled 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.

  1. 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 of main or master exists). Get the current branch. If the current branch differs from the default, use git diff <merge-base of default and current>...HEAD — i.e. compute git merge-base <default> HEAD and diff from there to HEAD. 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. diff is always a context source; you cannot opt out of it.
  2. Work-item context (only if work_item is in context_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.
  3. Capture intent. Ask the user once: "In one line — what were you trying to do with this change?" Record their answer as the description context.

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 retryable flag 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:

  1. 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.
  2. 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.
  3. Score the answer privately against the relevant dimension(s) using the rubric anchors in "Scoring" below. Keep the score to yourself.
  4. 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_depth allows it (probe count per question must not exceed probe_depth; with the default 1, 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.
  5. 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 tone and probe_depth here too.

Scoring (rubric anchors — used privately in Phases 3-4)

Score every answer 1-4 against the dimension(s) it touches:

  1. Poor — asserts without reasoning ("it just made sense").
  2. Developing — names the what, not the why (describes the change, not the alternatives it beat).
  3. Strong — weighs the alternatives explicitly.
  4. 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.

  1. 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.

  2. 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.

  3. 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."

  4. Build the Markdown scorecard following the shape in examples/sample-scorecard.md exactly: top privacy note line; # Interview — <branch-or-topic> — <YYYY-MM-DD>; Bar level; a ## Scorecard table (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 ## Transcript section with one block per question (Question → Your answer → Follow-up probe/answer if any → Score → "What a 4 would have said").

  5. 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}} → the bar_level value, 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: staff and bonus_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.
  6. Save both files (resolve the destination via Artifact safety below), then print the saved paths to the terminal.

  7. Open the HTML in a browser ONLY if auto_open is true. With the default auto_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.

  1. 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>.md and …-<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/xfeature-x).

  2. If the resolved save_dir is inside the current repo (only possible when the user overrode the default to a repo-internal path). Determine this explicitly: resolve save_dir to an absolute path, get the repository root via git 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-repo save_dir, this step is a no-op: do not touch .gitignore and do not run the tracked-check, because nothing is being written inside the repo.
  3. Respect content toggles in saved files (the terminal output is exempt from both):

    • If include_transcript is false, omit the entire ## Transcript section from the saved Markdown.
    • If include_diff_snippets is 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.)
  4. If redact_secrets is 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.

  5. 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

examples/

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.

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.