Skip to content
>_ StartupJobList_

Assess the work

Python backend interview scorecard and worked scenario

Assess how a candidate protects tenant data, handles retries and explains trade-offs in a realistic job-processing service. Use the same core scenario and evidence criteria for candidates applying to the same role, then discuss the evidence before making a human hiring decision.

Run a consistent 60-minute interview

This is a structured discussion. It does not demonstrate implementation, debugging or testing ability. If those are essential, schedule a separate bounded work sample with the same instructions and support for each candidate.

This original practice scorecard assesses how a Python backend engineer reasons about a customer job-processing service. It is a structured discussion, not a coding test, company question bank or validated predictor of job performance. Adapt it with people who know the role before using it with candidates.

Keep the same core prompt, order, time and rating anchors for each candidate in the same hiring round.
TimeStageInterviewer actionEvidence to note
0–3 minSet the frameExplain the role connection, format, timebox, notes and that no code is required. Ask whether the candidate needs the prompt in another format or a brief pause.Do not score comfort with the format. Record any agreed adjustment only if needed to interpret the process, not as candidate evidence.
3–8 minRead and clarifyGive the candidate prompt below. Allow up to two clarifying questions before the design discussion.Which unknowns they identify and whether they separate product policy from technical choice.
8–18 minCore system designAsk how an authenticated request becomes durable work and how a customer learns its outcome. Keep to the core architecture prompts below.Request boundary, durable state, status and the main publication/recovery gap.
18–23 minPython execution probeAsk the two fixed Python questions below, using the async or synchronous variant selected for the role.In-process versus durable work, and what blocks concurrent requests.
23–33 minProbe tenant isolationIntroduce the cross-tenant read defect. Ask where authorization belongs and how it could be tested.Trust boundary, query/data constraints, defense in depth and negative tests.
33–44 minProbe retries and crashesIntroduce duplicate delivery and the database-commit/queue-ack crash window. Ask what can be guaranteed and what remains at-least-once.Idempotency key scope, transaction boundary, deduplication and recovery.
44–51 minOperate and hand offAsk for one useful signal, one runbook step and one rollout safeguard. Invite the candidate to summarize the largest remaining risk.Whether monitoring answers an operator question and the candidate communicates limits.
51–57 minRecord independent evidenceInterviewers finish notes and ratings before comparing evidence. A solo interviewer records the initial view before any group discussion.Specific evidence, rating anchor and any dimension not observed.
57–60 minCandidate questionsAnswer briefly, or name an owner and follow up later. Stop on time.Do not score the topics the candidate chooses to ask about.

Dry-run checklist before the first round

  • Start a timer and stop each stage at its scheduled boundary: 3, 5, 10, 5, 10, 11, 7, 6 and 3 minutes.
  • Confirm the candidate prompt prints by itself, without interviewer clarifications, sample answers or rating anchors.
  • Check that the interviewer can capture one concrete observation per competency before the six-minute independent-rating block.
  • If a stage does not fit, revise the timing or prompt before the round and keep the revised version consistent for every candidate.
  • This timing is a proposed plan. It has not been dry-run with a human interviewer or candidate.

Use one interviewer to lead and one to take notes where possible. Both should rate the evidence independently before discussing it. If one interviewer attends alone, record the initial evidence and rating before checking with the hiring group.

OPM's structured-interview guidance ties questions to job-related competencies and recommends consistent questions and rating standards. That is the design basis here. It does not establish that this specific, unpiloted scorecard predicts performance. Before relying on it, have subject-matter experts map each criterion to actual work, pilot the timing and clarity, and revise uniformly.

Source: U.S. Office of Personnel Management, Structured Interviews; Structured Interview Guide (PDF).

↑ Back to sections

Candidate prompt

Python backend job-processing discussion

Instructions: Talk through the scenario and explain your assumptions. You have five minutes to read and clarify it, then the interviewer will ask the same follow-ups used for each candidate.

You are joining a small product team that runs a Python API and PostgreSQL database. Customers submit report-generation jobs. The report can take several minutes, so the API should return before processing finishes. A background worker performs the work. Each customer account can have multiple users.

Talk through a design for request submission, job status and result access. Explain where you would store job state, how the worker receives work, and what a user sees when work succeeds or fails.

Then consider two incidents: a client retries after its request times out and the same job may be delivered twice; and a worker commits a result but crashes before it acknowledges the queue message. Finally, an engineer finds that a user from account A can request a job ID belonging to account B.

State assumptions as needed. You may draw or describe the flow. You do not need to write code, name a particular queue provider, or assume a specific deployment environment. We will ask the same follow-up questions of each candidate.

Interviewer-only setup: The prompt intentionally leaves message durability, queue behavior, authentication details, report duration and data sensitivity unspecified. Do not silently select a product policy for the candidate. If they ask, use the fixed clarification responses below; otherwise note the assumption and proceed.

Give these same clarifications when asked. Do not add new requirements for one candidate.
Candidate asks…Reply
How many jobs or how long?Assume ordinary product traffic with occasional bursts. Exact capacity is not specified, so explain what you would measure before sizing.
Can messages be delivered twice?Yes. Delivery can repeat after a worker crash or acknowledgement timeout.
Can the queue lose a message?Assume the queue is configured for durable delivery, but you should explain how the database and worker make accepted work discoverable. We are not testing knowledge of a vendor.
Who authenticates the user?The API has authenticated user and account identity available. The request body is not an authority for account ownership.
Can work be cancelled?Cancellation policy is undecided. Point out what design decision would change if cancellation is required.
How long are results kept?Retention is a product and policy decision not supplied in this exercise. Say where the boundary matters and who must decide it.

Keep candidate instructions separate from interviewer notes. If a candidate asks for a clarification not listed here, answer only what is necessary, then record the answer and give it consistently to the rest of the round. The print button contains only the title, instructions and scenario above; the clarifications and interviewer notes are outside its print target.

↑ Back to sections

Stage 1: design the Python job-processing flow

Core question: “Walk me through one request from the API receiving it to the customer reading a finished report. Where is each state change recorded, and what happens if each step fails?”

Fixed follow-ups: “What does the API return before processing finishes?” “How does a worker learn about work?” “How would support distinguish queued, running, complete and failed?” “Which state is authoritative if a queue message and a database row disagree?”

Listen for a coherent chain, not a preferred architecture. A strong explanation often separates a short request transaction from longer processing; records a durable job identity and state; describes how work is published or discovered; and acknowledges the gap between database commit and message publication. A transactional outbox, a database-backed queue or another design can be reasonable when its failure and operational costs are explained.

Evidence example

Stronger evidence: “I would create the job in a transaction with the tenant and request identity, then make publication durable. If I publish directly after committing, the process can die in between, so I need an outbox or a recovery scan. The API can return the job ID and accepted state; status reads check the authenticated tenant. I would define which states can transition and make terminal errors visible without exposing sensitive report contents.”

Incomplete evidence: “Put it on Celery and return 202.” This names one possible tool and HTTP behavior but says nothing about durable acceptance, duplicate work, state ownership or user-visible failure. Ask the fixed follow-ups before rating.

Python execution probe, 18–23 minute stage

Use this probe when Python asyncio is part of the job. If the role is synchronous and does not use asyncio, choose the alternative before the round and give that version to every candidate.

Illustrative flawed excerpt, not production code
async def submit(payload):
    asyncio.create_task(process_report(payload))
    return {"status": "accepted"}

async def process_report(payload):
    report = render_large_report(payload)  # synchronous, CPU-heavy
    await save_report(report)

This short excerpt omits imports, framework details, persistence and error handling. It is deliberately flawed and has not been executed.

Two fixed questions, ask both: “What can this endpoint promise if it returns after create_task, and what happens to the work and its error if the process exits?” “What happens to other requests while render_large_report runs, and how could you test that impact?”

Expected reasoning: create_task schedules a coroutine on the current event loop; it does not persist the job. The excerpt retains no strong task reference or completion/error owner, so it cannot support a durable acceptance promise. The synchronous CPU-heavy call runs on the event-loop thread until it returns, delaying other tasks and I/O. A candidate may move durable work to a recoverable queue/worker and isolate CPU-bound work in an appropriate bounded executor or process; credit the explanation of which boundary guarantees recovery, not a specific library name.

Optional follow-up outside the 60-minute score: If cancellation, graceful shutdown and resource cleanup are job-critical, schedule the same extra follow-up for every candidate in the round. Ask how shutdown stops intake, drains or returns work, closes owned resources, and propagates cancellation after cleanup. Record this optional extension separately as an unscored note. If it was not asked, leave the core Python rating based on the two fixed questions; mark the extension “not asked.” Where the role does not need this execution model, do not use the async probe.

Alternative when the role is not async

Before the round, replace the excerpt with this prompt for a synchronous Python service: “A synchronous request handler calls a slow CPU-heavy report function before returning. What happens to other requests under the server's concurrency model, and how could you test that impact? What must change if the work must survive a process restart?” Use this same five-minute variant for every candidate in that round.

Do not require the candidate to propose an outbox by name. Credit another design if they explain how it avoids an untracked gap, or openly bound the risk and describe the recovery path. An exact vendor or framework answer is not the competency.

Technical references: Python task creation covers task scheduling and retaining task references; Python guidance on blocking code explains why blocking work should not run on the event loop; Python asyncio queues describe in-process queue accounting, not durable work across process loss. PostgreSQL transaction tutorial explains transaction boundaries and commit behavior.

↑ Back to sections

Stage 2: isolate tenant data

Fixed scenario change: “A user authenticated for account A changes a job ID in the URL and receives account B's report status. What would you change, and how would you test that it stays fixed?”

Ask the candidate to trace the identity used at each boundary: authenticated principal, account membership, request handler, database query, worker message and result download. A strong answer treats the authenticated account as trusted context, checks membership and authorization on every relevant read/write, and avoids relying on an unguessable job ID as access control. It may describe tenant-scoped queries, foreign-key or uniqueness design, defense-in-depth checks and negative tests that attempt cross-account access.

Follow-up: “The worker receives only a job ID. What would you want it to load before processing?” Look for a deliberate source of tenant identity and validation that the job, result and requesting account remain linked. Do not prescribe row-level security or a particular schema; ask why the chosen control fits the system and how it is verified.

Evidence example

Stronger evidence: “The URL ID is a locator, not permission. The API derives the account from the authenticated session, verifies membership, and fetches the job under that account. I'd add a test with two accounts and assert both status and result endpoints deny the other account. The worker reloads the job and uses its stored tenant relationship, not a tenant value supplied by a message without validation.”

Incomplete evidence: “Make the IDs UUIDs.” Random identifiers can reduce guessing but do not prove authorization. If the candidate mentions them, ask what still happens when a valid ID is disclosed.

Score the reasoning and evidence, not familiarity with one access-control product. A design that puts the check only in the UI, checks only job creation, or trusts a caller-supplied tenant without binding it to the authenticated identity leaves a concrete gap.

Technical reference: PostgreSQL row security policies are one possible database-level control. They require deliberate policy and role setup; their presence alone does not establish that application access is safe.

↑ Back to sections

Stage 3: recover safely from retries

Fixed scenario change: “A client sends a request, times out before seeing the response, and retries. Later, a worker commits the completed result but crashes before acknowledging its queue message. The message is delivered again. What should happen?”

Separate the two duplicate paths. The client retry needs a stable request identity scoped to the caller or account, with a defined rule for reusing a key with different input. The worker retry needs idempotent processing or deduplication so repeated delivery does not produce conflicting side effects. A database uniqueness constraint or recorded processing state can help, but the answer must explain the transaction and the side effect boundary.

Fixed follow-ups: “When is it safe to acknowledge?” “What if a downstream report generator has an effect outside PostgreSQL?” “What state would an operator inspect after repeated failure?” Credit candidates who say that exactly-once effects across independent systems are not obtained merely by choosing a queue flag. They may use idempotency, an outbox/inbox, reconciliation or compensation, with explicit limits.

Evidence example

Stronger evidence: “The API stores an idempotency key and request fingerprint under the tenant. A retry with the same key and same request returns the existing job; a changed request is rejected by policy. The worker can receive a message twice, so it checks a durable job state and makes result writes idempotent under a unique job identity. If it crashes after commit but before ack, redelivery observes completion and does not repeat a non-idempotent external action. For an external effect, I need a partner idempotency key or a reconciliation strategy.”

Incomplete evidence: “Retry three times and then dead-letter it.” A retry limit can bound repeated attempts, but it does not make the operation safe to repeat or explain what happens to accepted work afterward.

Also listen for bounded retries with delay, a terminal or reviewable failure state, poison-message handling and alerting based on age or repeated attempts. These are useful only when connected to the service's recovery policy; naming a dead-letter queue alone is not an end-to-end answer.

Technical references: Python task cancellation describes cooperative cancellation and cleanup in in-process tasks. PostgreSQL transaction isolation documents serialization failures and the need to retry the complete transaction in applicable cases. Neither reference guarantees exactly-once behavior across an external queue and database.

↑ Back to sections

Score evidence against anchored criteria

Rate each competency separately on the same four-point evidence scale. Write the observed statement or decision before choosing a level. A rating describes evidence in this interview; it is not a label for the candidate's ability or potential.

Worked calibration: a partial answer and a supported answer

Hypothetical partial evidence: “I use a tenant-scoped idempotency key and return the existing job on retry, but I have not decided what to do when the same key has a different payload.” After the fixed question, the candidate still cannot state that policy or a test. For failure and retry reasoning, level2 fits: a useful boundary is present, but a stated conflict remains unresolved. Record the gap rather than rounding up because “idempotency” was mentioned.

Hypothetical level3 evidence: The candidate explains that the key is unique under the tenant, a request fingerprint detects changed input, the original job is returned for an identical retry, and a test runs simultaneous attempts against that uniqueness rule. This meets the core request-retry bar; worker redelivery evidence must still be recorded separately. A confident explanation of just one path does not prove every path works.

Two reviewers may disagree whether an unasked payload policy was a gap. Check which fixed clarification was actually given before rating. If evidence is missing because the interviewer skipped the question, use NO for that missing competency and plan the same follow-up for the round.

Shared anchors for each competency. Use “Not observed” only when the interview produced too little evidence to rate.
RatingAnchor
1 · Gap evidentThe response misses a stated job boundary or proposes an approach that leaves a material failure, authorization or data-integrity risk unaddressed, even after the fixed follow-up.
2 · Partial evidenceIdentifies part of the problem and a plausible next step, but leaves a significant gap or needs substantial prompting to connect the decision to its consequences.
3 · Meets this role's barGives a workable, job-relevant approach; explains the key trade-off; identifies the main failure or security boundary; and can describe how to test or observe it.
4 · Strong, independent evidenceMeets level 3 and also identifies a non-obvious interaction, bounds an assumption, compares viable options, and explains how another person can verify or operate the result.
NO · Not observedThere is not enough evidence to make a fair rating because of time, an interviewer interruption, an unclear prompt or an agreed adjustment. Record why. Do not convert this to 1 or silently omit it.

Worked example: connect a statement to a rating

Hypothetical observation: “I call create_task and return accepted; asyncio will retry it if the server restarts.” After the fixed durability follow-up, the candidate still treats the in-process task as restart-safe.

Dimension and rating: Python execution and resource ownership, 1 for this evidence. The specific claim about restart recovery is wrong and leaves accepted work at risk. This is a rating of the observed answer against the anchor, not a verdict about the person.

Not observed example: If the interview ends before the Python probe is asked, mark that dimension NO and record “not asked, time ended.” Do not infer weak Python ability or convert missing evidence to 1.

Competencies for this sample role. Remove or replace any that are not required by the actual job.
CompetencyRelevant evidenceLevel 1 signalLevel 3 signalLevel 4 signal
Service and data reasoningExplains request, durable state, status and transaction boundaries.Treats a successful HTTP response as proof that the long-running job completed.Separates acceptance from completion and names a durable source of job state.Traces the commit/publication gap and presents a recovery-compatible design with clear state transitions.
Python execution and resource ownershipDistinguishes coroutine scheduling from durable work; reasons about blocking calls and task/error ownership.Assumes create_task survives process exit, or runs synchronous CPU-heavy work in an async handler without accounting for event-loop blocking.Identifies that the task is process-local, assigns an owner to completion/failure, and explains how blocking work and required durability are handled.Meets level3, compares a bounded execution approach with a recoverable worker, and explains a concrete test showing other requests remain responsive while accepted work stays recoverable.
Tenant authorizationUses authenticated identity and traces it to status and result access.Relies on an unguessable ID or a UI check as the only barrier.Scopes reads by authenticated tenant and proposes a cross-tenant negative test.Checks the boundary across API and worker; explains defense in depth and a test that would catch regression.
Failure and retry reasoningDistinguishes client retries from worker redelivery and explains side-effect safety.Assumes a message is processed once or retries are inherently safe.Uses stable request identity and idempotent/duplicate-safe work with a bounded failure path.Identifies a specific crash window and explains how the system reconciles or contains an external side effect.
Communication and operational ownershipStates assumptions, explains trade-offs and names a useful signal or recovery action.Uses unexplained tool names, hides uncertainty or cannot say how failure is found.Explains a choice in plain terms and gives an actionable status, alert or runbook idea.Separates known facts from policy decisions, proposes a signal tied to operator action and revises the design when a constraint changes.

For an early-career role, a level 2 answer may be appropriate where the team can teach the missing step and the job does not require independent ownership. For a senior role, expect broader decisions only when the job grants that responsibility. Calibrate anchors before interviews by mapping them to the actual work; do not change the bar after seeing a candidate.

Do not add an automatic total or hire/no-hire cutoff. Interviewers should discuss the evidence, unresolved gaps, other job-relevant assessments and the support the role provides. If the team later chooses weights or a decision rule, document its job basis, apply it consistently and review its consequences with qualified HR/legal support.

OPM guidance recommends common standards for scoring; it also advises equal weights absent a clear, documented rationale for different weights: OPM scoring FAQ.

↑ Back to sections

Printable evidence sheet

Complete notes independently before the debrief. Record job-related statements, decisions and examples. Avoid appearance, accent, family status, age assumptions, perceived similarity or other personal impressions. If an adjustment affects the format, note only enough to explain the evidence gap or what follow-up is needed.

You can also use your browser's Print command to print this sheet.

Interviewer packet: fixed core and timing

Keep the same core prompt, order, time and rating anchors for each candidate in the same hiring round.
TimeStageInterviewer actionEvidence to note
0–3 minSet the frameExplain the role connection, format, timebox, notes and that no code is required. Ask whether the candidate needs the prompt in another format or a brief pause.Do not score comfort with the format. Record any agreed adjustment only if needed to interpret the process, not as candidate evidence.
3–8 minRead and clarifyGive the candidate prompt below. Allow up to two clarifying questions before the design discussion.Which unknowns they identify and whether they separate product policy from technical choice.
8–18 minCore system designAsk how an authenticated request becomes durable work and how a customer learns its outcome. Keep to the core architecture prompts below.Request boundary, durable state, status and the main publication/recovery gap.
18–23 minPython execution probeAsk the two fixed Python questions below, using the async or synchronous variant selected for the role.In-process versus durable work, and what blocks concurrent requests.
23–33 minProbe tenant isolationIntroduce the cross-tenant read defect. Ask where authorization belongs and how it could be tested.Trust boundary, query/data constraints, defense in depth and negative tests.
33–44 minProbe retries and crashesIntroduce duplicate delivery and the database-commit/queue-ack crash window. Ask what can be guaranteed and what remains at-least-once.Idempotency key scope, transaction boundary, deduplication and recovery.
44–51 minOperate and hand offAsk for one useful signal, one runbook step and one rollout safeguard. Invite the candidate to summarize the largest remaining risk.Whether monitoring answers an operator question and the candidate communicates limits.
51–57 minRecord independent evidenceInterviewers finish notes and ratings before comparing evidence. A solo interviewer records the initial view before any group discussion.Specific evidence, rating anchor and any dimension not observed.
57–60 minCandidate questionsAnswer briefly, or name an owner and follow up later. Stop on time.Do not score the topics the candidate chooses to ask about.
  1. Durability: “When may the API say accepted? What if commit succeeds but publication fails?” Core evidence: a recoverable source of accepted job state, not just a queue name.
  2. Python: “What survives process exit after create_task? What happens to other requests during the synchronous CPU-heavy call?” Core evidence: in-process lifetime and event-loop blocking, with a bounded alternative and a responsiveness test.
  3. Authorization: “Account A can read account B's job ID. Where must authorization occur and what negative test catches it?” Core evidence: authenticated tenant binding on status and result access.
  4. Retries: “Client times out and retries; worker commits then crashes before acknowledgment. What happens next?” Core evidence: separate request identity and redelivery safety, including external side effects.
  5. Operations: “What signal shows accepted work is stuck, and who owns the recovery step?” Core evidence: a signal tied to an action, a safe recovery boundary and a named owner.

Python execution probe, 18–23 minute stage

Use this probe when Python asyncio is part of the job. If the role is synchronous and does not use asyncio, choose the alternative before the round and give that version to every candidate.

Illustrative flawed excerpt, not production code
async def submit(payload):
    asyncio.create_task(process_report(payload))
    return {"status": "accepted"}

async def process_report(payload):
    report = render_large_report(payload)  # synchronous, CPU-heavy
    await save_report(report)

This short excerpt omits imports, framework details, persistence and error handling. It is deliberately flawed and has not been executed.

Two fixed questions, ask both: “What can this endpoint promise if it returns after create_task, and what happens to the work and its error if the process exits?” “What happens to other requests while render_large_report runs, and how could you test that impact?”

Expected reasoning: create_task schedules a coroutine on the current event loop; it does not persist the job. The excerpt retains no strong task reference or completion/error owner, so it cannot support a durable acceptance promise. The synchronous CPU-heavy call runs on the event-loop thread until it returns, delaying other tasks and I/O. A candidate may move durable work to a recoverable queue/worker and isolate CPU-bound work in an appropriate bounded executor or process; credit the explanation of which boundary guarantees recovery, not a specific library name.

Optional follow-up outside the 60-minute score: If cancellation, graceful shutdown and resource cleanup are job-critical, schedule the same extra follow-up for every candidate in the round. Ask how shutdown stops intake, drains or returns work, closes owned resources, and propagates cancellation after cleanup. Record this optional extension separately as an unscored note. If it was not asked, leave the core Python rating based on the two fixed questions; mark the extension “not asked.” Where the role does not need this execution model, do not use the async probe.

Alternative when the role is not async

Before the round, replace the excerpt with this prompt for a synchronous Python service: “A synchronous request handler calls a slow CPU-heavy report function before returning. What happens to other requests under the server's concurrency model, and how could you test that impact? What must change if the work must survive a process restart?” Use this same five-minute variant for every candidate in that round.

Do not require the candidate to propose an outbox by name. Credit another design if they explain how it avoids an untracked gap, or openly bound the risk and describe the recovery path. An exact vendor or framework answer is not the competency.

Competencies for this sample role. Remove or replace any that are not required by the actual job.
CompetencyRelevant evidenceLevel 1 signalLevel 3 signalLevel 4 signal
Service and data reasoningExplains request, durable state, status and transaction boundaries.Treats a successful HTTP response as proof that the long-running job completed.Separates acceptance from completion and names a durable source of job state.Traces the commit/publication gap and presents a recovery-compatible design with clear state transitions.
Python execution and resource ownershipDistinguishes coroutine scheduling from durable work; reasons about blocking calls and task/error ownership.Assumes create_task survives process exit, or runs synchronous CPU-heavy work in an async handler without accounting for event-loop blocking.Identifies that the task is process-local, assigns an owner to completion/failure, and explains how blocking work and required durability are handled.Meets level3, compares a bounded execution approach with a recoverable worker, and explains a concrete test showing other requests remain responsive while accepted work stays recoverable.
Tenant authorizationUses authenticated identity and traces it to status and result access.Relies on an unguessable ID or a UI check as the only barrier.Scopes reads by authenticated tenant and proposes a cross-tenant negative test.Checks the boundary across API and worker; explains defense in depth and a test that would catch regression.
Failure and retry reasoningDistinguishes client retries from worker redelivery and explains side-effect safety.Assumes a message is processed once or retries are inherently safe.Uses stable request identity and idempotent/duplicate-safe work with a bounded failure path.Identifies a specific crash window and explains how the system reconciles or contains an external side effect.
Communication and operational ownershipStates assumptions, explains trade-offs and names a useful signal or recovery action.Uses unexplained tool names, hides uncertainty or cannot say how failure is found.Explains a choice in plain terms and gives an actionable status, alert or runbook idea.Separates known facts from policy decisions, proposes a signal tied to operator action and revises the design when a constraint changes.

Optional cleanup and cancellation discussion is a separately scheduled, unscored extension. Rate only evidence elicited by the fixed core prompts.

Role / level: ____________________________________________

Candidate identifier: __________________ Date: ______________

Interviewer: ______________________________________________

Agreed format adjustment, if any: ______________________________

Rating key: 1 = material gap after the fixed follow-up; 2 = partial evidence; 3 = workable at this role's bar; 4 = independent reasoning beyond the core; NO = insufficient evidence. Record why NO applies. Never score NO as 1.

Evidence by competency

Write observations before ratings. Select 1, 2, 3, 4 or NO and cite the evidence.
CompetencyObserved words, choices or trade-offsRatingEvidence still missing / follow-up
Service and data reasoning


1 / 2 / 3 / 4 / NO

Python execution and resource ownership


1 / 2 / 3 / 4 / NO

Tenant authorization


1 / 2 / 3 / 4 / NO

Failure and retry reasoning


1 / 2 / 3 / 4 / NO

Communication and operational ownership


1 / 2 / 3 / 4 / NO

Debrief after independent ratings

Evidence both interviewers agree on:

____________________________________________________________________________

____________________________________________________________________________

Different readings of evidence and the job anchor:

____________________________________________________________________________

____________________________________________________________________________

What is not observed, and how will the team resolve it consistently?

____________________________________________________________________________

____________________________________________________________________________

Role-relevant strengths and support needs to discuss:

____________________________________________________________________________

____________________________________________________________________________

Before using this scorecard

  • Confirm every competency is required for this role and level.
  • Have technical subject-matter reviewers check the scenario and anchors.
  • Pilot the prompt with someone who is not being evaluated; revise unclear wording before the round.
  • Share the format and duration in advance, and offer a way to request an adjustment.
  • Keep records only under the organization's candidate-data retention and access rules.

This page provides a structured starting point. It is not legal advice, a validated assessment instrument or an automated recommendation. The organization remains responsible for job analysis, consistent administration, accommodations, record handling and the final human decision.

↑ Back to sections

Choose your next step