Your client: Halden · the residency · ten weeks · one repository

Ten weeks at Halden. Something happens every Monday.

A real engagement is month four: the schema changes, the champion leaves, the pager goes off on the busiest night. The residency makes you live with one system you built. One customer, one repository you own from discovery to handover, and ten weeks in which something happens each Monday.

Halden Freight, its desks, its people and its data are invented. The US customs rule in week 9 is a real regulation as Halden's desk applies it, as of October 2026; nothing here is legal advice.

Your residency

How a Halden week works

Each week opens on a Monday at Halden. Open the week's workspace and everything happens here, in your browser: no install and no terminal.

  1. Inbox. Read the week's emails; their attachments open beside them.
  2. Task. What happened, your tasks, and what done looks like.
  3. Files. One repository for the whole residency. Edit any file; Python and JSON are checked as you type.
  4. Run. Run pipeline rebuilds out/ from the latest pack (from week 2), Run a script runs one of your own modules, and Run tests runs tests/.
  5. Grade week. Runs this week's checks. When every required check passes, Start week N+1 opens the next one.

Week 1 is free and starts with seed 2026. Your repository stays in this browser; download it from the workspace whenever you want a copy. Keeping a copy at the end of each week is a good habit: the history is part of what you hand over.

How grading works

Graded here, in your browser, by the same checks Halden’s simulator runs. Your files stay in this browser; your result is saved to your account when you’re signed in. Want your files elsewhere? Download your repository any time.

Weeks 2 to 10: the grader regenerates the answers on your device when you grade; they’re never shown.

  • Deterministic. The grader regenerates the estate from your seed, in memory, and compares your output with its truth. The truth is never written to your repository. Grading twice gives the same result; only measured latency varies.
  • Hidden sets. Weeks 4 to 7 score 300 cases per desk that you never see. Each report says how many were right, wrong and routed, with a few example IDs; it doesn't list the answers.
  • Required and stretch. A week passes when every required check passes. Stretch checks are for the Certified and Lead columns of the rubric. You can start a later week before this one passes; it is recorded as started anyway, and every later summary says so.
  • Structure, not judgement. The grader can count rows, sections, sources and thresholds. It can't tell whether your memo is wise. Each brief's rubric is for that: the grader gets you to Associate; Certified and Lead need a reviewer (a mentor, a peer, or you, honestly) to read the documents against the rubric.
  • Configuration weeks. Opening weeks 9 and 10 records a fingerprint of every Python file in halden_app/, pipelines/ and evals/. Changing any of them fails that week.

Where your results live

Graded here, in your browser, by the same checks Halden's simulator runs. Your files stay in this browser; your result is saved to your account when you're signed in. Each grade's full report is also in .residency/grade-week-NN.json in your repository. Anyone can change the code and grade again: the residency is practice for the work, and the only person a forged grade fools is you.

Work on your own machine

About the residency

  • The starter is a repository with an interface, some given code and TODOs.

    PathGivenYours
    pipelines/clean.pya pass-through that accounts for every rowthe cleaning (week 2), schema versions (week 5)
    halden_app/model.pythe store: values with their source and historybuild() (week 3)
    halden_app/actions.pythe users and skillssubmit() and the four actions (week 3)
    halden_app/api.pyload(), model(), and the contract in the docstringclassify(), draft() (week 4), handle() (week 8)
    halden_app/sites.pythe product's site logic, completenothing: from week 9 you configure it, you don't change it
    evals/an empty golden set and a judge stubboth (week 4)
    config/users, the Santos site, the v1 mappingmappings, routing, Long Beach (weeks 5, 9, 10)
    docs/templates for week 1, and an indexevery document
    tests/a few shape checksyour tests

    The interface the grader calls:

    CallReturnsFrom
    api.load(out_dir)the cleaned tables your pipeline wroteweek 3
    api.model(tables)the operational model; the grader reads it through m.val(key, prop)week 3
    actions.submit(m, name, args, actor, key, now, approvers){"status": "applied" | "refused" | "pending_approval", ...}, auditedweek 3
    api.classify(m, exception_id){"type", "cause", "action", "flags", "usd"}week 4
    api.draft(m, exception_id){"to", "language", "subject", "body", "needs_approval", "usd"}, or Noneweek 4
    judge(draft, case) in evals/judge.py"pass" or "fail"week 4
    api.handle(m, exception_id, portal, now){"outcome": "drafted" | "routed", "reason", "key", "eta"}week 8
    sites.load(name), sites.decide(case, cfg)the product's; the grader feeds your configuration through themweek 9

    A deterministic path passes every check. The sandbox has no network, so your code makes no model calls here.

  • PersonRoleFirst writes
    VP of operationsHalden's sponsor; decides what goes liveweek 1
    Rafaela SouzaSão Paulo desk lead; moves to Rotterdam on 11 Mayweek 1
    Halden IT service deskyour access requestsweek 1
    SI account leadHalden's systems integrator; sends the dataweek 2
    Priya, central operationsreports to the COO; owns right-first-timeweek 3
    FinOpsthe budgetweek 4
    Chief Information Security Officersecurity findings, and what may leave the buildingweek 6
    Camila Rochaacting São Paulo desk lead from 11 Mayweek 7
    Dewi LestariJakarta desk leadweek 7
    Halden on-call alertingthe exception desk's SLO alert, not a personweek 8
    Maria DelgadoLong Beach desk leadweek 9
    Product lead, your companyowns sites.py and the productweek 9
    Priya Menonthe SI's delivery lead; takes over on 12 June (not Priya in central operations)week 10