1 of 19

How we worked with AI

Bahn Control Room

Aaltoes Prompt Operations Hackathon · 24–25 Oct 2026

Team: [names]

+ Add photo

Team photo

2 of 19

The short version

2

AI built and checked the tool. Bahn and the judges told us what was true and what mattered.

5

feedback rounds

2 in-person Q&As with Bahn, 2 video demos, 1 online Q&A

14

questions to Bahn

their answers rewrote our risk rules

13

commits in 24 h

each one tested in the running app first

2

AI roles

Claude Code builds it; Claude runs inside it

Every step, including what we threw away, is logged in PROCESS.md in the repo.

Bahn Control Room · How we worked with AI

3 of 19

Our loop: ask, build, check, show, change

3

1

Ask Bahn

What fails in real dispatch? What would a dispatcher act on?

→

2

Brief Claude Code

Read the brief and the data first, then build the smallest version

→

3

Check against the data

Read the agent's traces and every proposal, not "done"

→

4

Show it

Q&A, video demo, live link for judges

→

5

Change the rules

Fix the data or the tool, not just the prompt; log it

…then back to 1. Five times in 24 hours, once per feedback round.

Bahn Control Room · How we worked with AI

4 of 19

Who did what: people and AI

4

+ Add photo

Photo

[Name]

[Role, e.g. questions for Bahn, demo video, testing]

+ Add photo

Photo

[Name]

[Role, e.g. questions for Bahn, demo video, testing]

+ Add photo

Photo

[Name]

[Role, e.g. questions for Bahn, demo video, testing]

AI on the team

Claude Code (Opus 5.5)

Our builder: read the brief and dataset, wrote and reviewed the code, tested in the browser

Claude Opus 5.5 in the app

Investigates flagged orders and proposes one decision for a person

Claude for Finnish

Translated ~690 interface strings once; cached in the repo

Groq gpt-oss

Our first agent; replaced after rate limits and weak Finnish

Bahn Control Room · How we worked with AI

5 of 19

Five rounds of feedback

01

What we heard each time, and what we changed with AI before the next round

6 of 19

Five rounds, five changes

6

1

Q&A with Bahn 1

in person

Only abnormal orders should reach a person

Retuned: 31 % of orders → 10 orders + 1 banner

2

Q&A with Bahn 2

in person

14 questions answered

Rules rewritten: silent driver first, no car-value tiers

3

Video demo 1

judges

"Still visually heavy"

One action per order, with a deadline countdown

4

Online Q&A

remote

[What we heard]

[What we changed]

5

Video demo 2

judges

"Good improvement"

Score your own file, MCP server, filters

Heard

Changed

Bahn Control Room · How we worked with AI

7 of 19

1 · First Q&A with Bahn: what a dispatcher must not see

7

What we heard

"A person must not be distracted by every decision."

"Start with Finland."

"Judges must be able to clone it and run it."

"Don't clutter it like the sample board."

What we did with AI

  • Claude Code read the brief, the operations notes and the dataset before writing code
  • Chose a zero-dependency Node app: npm install, npm start
  • Rejected the first tuning: 17 of 54 orders (31 %) went to a person
  • Now 10 orders plus 1 grouped strike banner; the rest go to the agent
  • Threw away the starter's board of lanes

Bahn Control Room · How we worked with AI

8 of 19

2 · Second Q&A: 14 questions that rewrote our rules

8

What we heard

"A silent driver who has the car is the worst failure."

"The latest arrival time is soft; repeat lateness matters."

"Every driver is trained for every car."

"Travemünde and winter tyres cause trouble."

"We have no EV winter range data."

"We want to see what we caught and what we missed, weekly."

What we did with AI

  • Removed every car-value rule we had invented
  • Silent driver: agent asks at 6 h, a person decides at 12 h
  • First late car goes to the agent; repeat-late customers to a person
  • Added Travemünde and a seasonal winter-tyre rule
  • Labelled EV range as an estimate
  • Built the weekly caught-vs-missed report
  • Re-ran Claude on every proposal the old rules had shaped

+ Add photo

Asking Bahn our 14 questions

Bahn Control Room · How we worked with AI

9 of 19

3 · Video demo 1: "still visually heavy"

9

What we heard

"Still quite heavy visually. We want tighter signal to noise."

"The incident rate is around 10–15 %."

What we did with AI

  • Rebuilt the order page around one action panel: deadline countdown, the reason, one decision
  • Queue sorted by real deadline; the most urgent order is called out
  • Everything else folds into sections
  • Back-tested on Bahn's data: 13 of 87 orders (15 %) had a problem, matching their rate

Bahn Control Room · How we worked with AI

10 of 19

4 · Online Q&A

10

What we heard

[What we asked]

[What we heard]

What we did with AI

  • [What we changed]

Also changed around this time (move if it came from elsewhere)

  • Removed made-up ferry lines and quotes from the data
  • Evidence explained in plain words instead of record IDs
  • Agent answers cut to four short bullet points
  • Deployed to Vercel; also runs with npm start

+ Add photo

Screenshot of the online Q&A

Bahn Control Room · How we worked with AI

11 of 19

5 · Video demo 2: "good improvement"

11

What we heard

"Good improvement! Looking forward to the final submission."

Polite but vague. So we asked ourselves: what would a dispatcher need on Monday?

What we did with AI

  • Score your own file: upload a CSV or JSON export, get lanes and sourced reasons
  • Wrote synthetic files to break it; a messy export caught 2 bugs
  • Missing or unknown data now goes to "check the data", never a made-up score
  • MCP server: Bahn's own AI assistants can call the same scoring
  • Filter and sort on the order list

Bahn Control Room · How we worked with AI

12 of 19

Checking the AI's work

02

Where we didn't take the first answer, and the habits that caught it

13 of 19

Six times we didn't take the first answer

13

1

31 % of orders to a person

First tuning flooded the queue. Retuned to 10 orders + 1 grouped banner.

2

A €113 "ferry" was a train

Our tool dropped a field. We fixed the tool, not the prompt.

3

"12:30" for a 15:30 sailing

The agent got UTC times. Every tool now speaks Helsinki time.

4

"Vela Coast Lines"

A made-up ferry company in the sample data. All invented operators removed.

5

Too many early catches

The back-test used today's clock. Honest result: 2 early, 8 on time, 3 missed.

6

Tampere → Helsinki via Germany

A messy test file exposed it. Missing data now goes to "check the data".

Bahn Control Room · How we worked with AI

14 of 19

How we checked what the AI did

14

1

Read the traces, not "Agent finished"

The first runs "finished" while failing on rate limits and malformed tool calls.

2

Reviewed every proposal against the data

By hand, order by order, before showing anyone.

3

Tested every live source before building on it

Weather, Finnish and German road feeds; Denmark marked "not connected", not faked.

4

Ran it the way judges will

Clean clone, npm start, and a local Vercel simulation before deploying.

5

Merged parallel AI sessions by reading them

Checked each file for both sets of changes, then re-tested.

6

Scanned for secrets before every commit

API keys stay in .env, never in the repo.

Bahn Control Room · How we worked with AI

15 of 19

What the agent may do, and what only a person may

15

The agent may

  • Read the order, messages and driver record
  • Check live weather, roads and ferry timetables
  • Ask the driver or the pickup site
  • Propose one decision, every fact with its source
  • Close an order only if no rule needs a person

Only a person may

  • Book or change a ferry, train or hotel
  • Move a date or accept a cost
  • Swap the driver
  • Contact the customer
  • Overrule a rule that asked for a person

Answers to a person: at most four bullet points, every fact with its source.

Bahn Control Room · How we worked with AI

16 of 19

The team in pictures

03

Planning, building and asking Bahn

17 of 19

Planning

17

+ Add photo

Planning wall or whiteboard

Bahn Control Room · How we worked with AI

18 of 19

What we learned about working with AI

18

1

Ask the company, not the model

Fourteen answers from Bahn changed more of our rules than any prompt did.

2

Fix the tool, not the prompt

Wrong or missing data makes the AI confidently wrong. We fixed the input.

3

Read what the AI did

Traces, proposals and diffs, every time. "Done" is not a test.

Bahn Control Room · How we worked with AI

19 of 19

Thank you

Live: bahndesk.vercel.app

Code: github.com/tommy2006/bahndesk

Full log: PROCESS.md