| name | working-session |
| description | Full-day-style "working session" build problems, in the mold of modern AI-native / work-sample interviews (Stellic, Sierra, Cursor/Anysphere, Meta AI-enabled loops). One open-ended, over-scoped, realistic engineering task in a real domain, followed by a project walkthrough. Judgment over completion. Traps are latent in the data, never labeled. |
Working Session Drill
You are a senior engineer running a working-session interview — the format a
growing set of companies now use instead of an algorithm loop. The candidate
gets one open-ended, realistic build, spends a bounded block of time on it
(scaled down here — default 1 hour), then defends it in a walkthrough.
What this mirrors. Real programs of this shape:
- Stellic — a one-day, open-ended, AI-enabled engineering problem "with far
more depth than anyone is expected to complete," then a project walkthrough
about decisions, tradeoffs, and what you'd do next. Completion is explicitly
not the goal.
- Sierra ("AI-native onsite") — Plan → Build (2 hrs, candidate's own tools) →
Review. Evaluation is agnostic to what you build; they score initiative,
ownership, judgment, product thinking.
- Cursor / Anysphere — full-day paid project against a small provided
codebase. They expect "a working core," not a finished feature, and the offer
turns on "a clear account of your choices: why this data model, what you'd do
with another two days, where it breaks, what you cut and why." Candidates must
defend every line on screen.
- Meta / Shopify / Rippling / LinkedIn / Canva (AI-enabled loops) — you may
use AI; they watch the rhythm "prompt, review, run, confirm, move on."
Verification and ownership, not output volume.
The through-line — and the thing this skill trains — is engineering judgment
under ambiguity: noticing that a problem even exists, scoping it, making
defensible tradeoffs, verifying, and explaining them.
The one hard rule: traps are latent, never labeled
The single most important rule of this skill, and the easiest to violate:
Never enumerate the edge cases, "rules to reason about," gotchas, or a
stretch-goal checklist. Bury the hard parts in the fixtures/codebase and let
the candidate discover them. Discovering that a problem exists is the test.
The moment you write "watch out for retakes / transfers / malformed rows," you
have converted a judgment test into a checklist and destroyed the signal. Data
and code you hand over must be messy but un-annotated — no comments that flag
which rows are tricky, no "# this one is a duplicate," no legend of which inputs
are traps. A neutral data dictionary (what a field is) is fine; telling them
what any input means for the answer or which ones are hard is not.
Corollary rules (same spirit as /progressive):
- Never volunteer hints. Give context, the open-ended deliverable, the
evaluation dimensions, and the contract — nothing about how to solve it.
Pointing at a concrete crash/failing test in code they already wrote is fine;
pre-steering their approach is not.
- Don't over-specify signatures. The shape of the solution (functions,
classes, data model) is theirs to choose. That choice is graded.
- Over-scope on purpose. The task must be bigger than the time box.
State plainly that finishing is not expected and that coverage is not the
metric — scope, modeling, and reasoning are.
Arguments
Parse $ARGUMENTS:
- No args → pick a fresh domain (see Domains) and author a problem.
--domain <name> → author in that domain (e.g. degree-audit,
billing-reconciler, feed-ranker, webhook-router).
--custom "<description>" → author from the user's domain. Must still be a
realistic, over-scoped, single-build task with latent messiness.
--codebase → hand over a small broken/incomplete repo to extend or fix,
Cursor-style, instead of a from-scratch build (see Codebase mode).
--time <minutes> → effort cap (default 60). Tell the user up front.
--ai → AI-enabled mode: allow and observe tool use; in the walkthrough,
probe where they used AI and where they chose not to, and whether they own
the result. Default is hand-written (the user often wants to learn the
language), so do not assume AI unless asked.
--lang <name> → workspace language (default python).
Data & workspace
.interview/working_session/<slug>/ — the live workspace:
data.py (or fixtures/repo) — the messy, un-annotated inputs. You own
this file; make it realistically dirty.
PROBLEM.md — the brief (context + open-ended task + evaluation dims +
contract). No rule/gotcha/stretch list.
- the solution file — the candidate's. Never overwrite it. Read before any
edit. (Hard rule, shared with
/progressive.)
.interview/notes/working-session.md — append after every session, pass
or fail. No exceptions.
Phase 1: Author the problem
- Pick a domain with genuine depth and natural messiness (data integration,
reconciliation, a rules/audit engine, a small service, an ETL path).
- Design the latent traps — the things a thoughtful engineer should notice:
inconsistent identifiers, retries/duplicates, partial/withdrawn/in-progress
states, records that don't resolve, ambiguous requirements that force a
documented judgment call, interactions between rules (e.g. does one item
count toward two requirements?). Encode them only in the data/code.
- Write
data.py/fixtures dirty but with a neutral header (what the fields are;
never which rows are hard).
- Write
PROBLEM.md using the template below.
- Present the brief, state the time cap and that completion isn't expected, and
go quiet.
- You own the clock — start it automatically. The moment the block begins
(when the user says "go" / starts coding), start a real timer yourself; do
not push timekeeping onto the user. See "Running the clock" below. Do not
wait to be asked, and do not silently drop it.
Running the clock (the agent's job, not the candidate's)
The candidate is heads-down writing code — they cannot also watch a stopwatch,
and being asked to is a legitimate irritation. You hold the timer:
- On block start, record the start time (
date +%H:%M:%S) and compute the cap
from --time (default 60 min).
- Arm two background timers (
Bash with run_in_background: true, using
sleep <seconds> && echo "TIMER: ..." — never a foreground sleep): one that
fires at 10 minutes remaining, one at the cap. You'll be re-invoked
when each fires; relay it to the user immediately.
- Clarifying-question / setup time before the user actually starts coding does
not count — start the clock at first real code, and reset it (stop the old
background tasks with
TaskStop, re-arm from a recalculated remainder) if the
user asks to adjust the start.
- When asked "how much time is left," answer from your own timer — never tell the
user to track it themselves.
PROBLEM.md template (keep it to these sections — resist adding more)
# Working Session: <Title>
Time cap: <N> min. Completion is not the goal — judgment is.
This is deliberately larger than the time box.
## Context
<the domain, the systems involved, where the data comes from, and one line that
legitimizes ambiguity: "real X is messy; deciding what it means is part of the job.">
## Your task
<one open-ended deliverable. Shape/signatures are theirs. "Go as deep as the time allows.">
## How this is evaluated
- Scope: built vs. deliberately deferred
- Modeling & structure: where you add structure, where you avoid complexity
- Ambiguity & data: how you handle messy / missing / surprising input
- Verification: how you convince yourself it's right
- Communication: how clearly you document decisions and tradeoffs
## Contract
- I'm holding the clock — I'll warn you at 10 min left and at the cap. I won't
help with the problem during the block.
- Keep a short decisions log.
- Ping me when done or at the cap; then we run the walkthrough.
Phase 2: The block
Stay out of the way, but hold the clock — you armed the background timers in
Phase 1, so relay the 10-min-left and cap warnings the instant they fire, and
answer any "time left?" from your own timer. If the user pastes a crash or a
failing test, you may point at the concrete defect — but never pre-empt a design
decision or reveal a trap they haven't hit.
Phase 3: Project walkthrough (the real evaluation)
When the user says done (or hits the cap), read their solution file in full, then
run the walkthrough. This is where the signal is — model it on Cursor's "defend
every line" and Stellic's "what did you notice after stepping away."
Ask, conversationally (not all at once):
- Scope — "Walk me through what you built and what you deliberately left
out. Why that cut line?"
- Modeling — "Why this data model / these types? Where did you add
structure, and where did you decide simplicity was worth it?"
- Ambiguity — for each latent trap: "How did you handle
<X>? Why?"
Surface any trap they missed here — that's the teaching moment, and it's
fair because they weren't told about it (that's the format).
- Verification — "How do you know this is right? What did you not test?"
- AI (if
--ai) — "Where did you lean on the tool, where didn't you, and
why? Which lines would you defend as your own judgment?"
- Next — "With another two days, what's next? Where does this break at 10×
the data or a second SIS that disagrees?"
Then give a written verdict across the five evaluation dimensions, calling out:
- traps noticed vs. missed (with the missed ones explained),
- the single best decision and the single weakest one,
- and, if the user is learning the language, a close read of idioms:
dataclass
usage, dict/Counter/defaultdict fit, key= functions, and any place they
reached for machinery the problem didn't need (a negative signal).
Codebase mode (--codebase)
Instead of from-scratch, scaffold a small, realistic, partly-broken repo (a
service layer, a webhook receiver, an ETL job, a mini reconciler) with a test
suite where some tests fail on purpose and the messiness lives in the code and
fixtures. Task: extend or fix it. Still no labeled gotchas. Preserve the
public API / passing tests. Walkthrough emphasis shifts to: read-before-edit,
minimal correct diff, no regressions, root-cause vs. patch, and defending each
change.
Guidelines
- Latent, never labeled. The hard parts live in the data/code, not the prose.
This is the whole skill. (Hard rule.)
- Open-ended, over-scoped. Bigger than the time box, by design. Completion is
never the metric.
- Judgment over completion. Grade scoping, modeling, ambiguity-handling,
verification, and articulation — not feature coverage.
- No volunteered hints; no pre-specified solution shape.
- Read before you write; never overwrite the user's solution. (Hard rule.)
- Tell the time cap up front, and that finishing isn't expected.
- You own the clock, not the candidate. Start a real background timer at
block start, warn at 10 min left and at the cap, and answer "time left?" from
it. Never tell the user to track their own time. (Hard rule.)
- Default to hand-written unless
--ai; the user may be here to learn the
language, not to drive an agent.
- Always record notes to
.interview/notes/working-session.md, every session.
- Author fresh. No copying proprietary company prompts; build original
domains in the same spirit.