Week 1.
Orientation, setup, and
understanding the system.

FEAST Student Developer Onboarding | Data Science Institute | v0.5.0
Before we start

Quick check: where is everyone starting from?

No wrong answers. This helps us calibrate pairing and pacing.

🔀

Git / version control

Have you used git before? Branches? Pull requests?

🐍

Python / web dev

Comfortable with Python? Ever built or worked on a web app?

🤖

LLMs / AI tools

Used ChatGPT, Copilot, Claude? For coding specifically?

👥

Team codebases

Ever worked on code someone else wrote? Reviewed a PR?

Raise your hand for each: never used it / used it a little / use it regularly

Week one

What the project does,
why it matters,
how it's built.

90 minutes · group session · pair junior with senior
How every week works

Three parts. Every week. For six weeks.

  1. 01
    Group session — about two hours
    Short lesson plus a demo of a new LLM workflow pattern, then guided work on assigned issues with scaffolded guides.
  2. 02
    Solo work — async, later in the week
    You apply the week's pattern independently. This is where the real learning happens. We give you a hunting ground; you choose what to work on.
  3. 03
    PR (pull request) review and issue creation — async
    Review each other's pull requests. File issues for anything you discover. Issues are the heartbeat of this team — and starting today, you own the backlog.
Before we go deeper

This is FEAST. Let's look at it live.

fassfrontstage.pods.icicleai.tapis.io
Open in new tab →

What you're seeing

A map of Brown County, WI (Green Bay area). Each colored dot is a household. Each shape is a store. Colors show food access scores.

Try it right now

Open the URL on your laptop. Click a household to see its data. Click "Step" to run one simulation tick. Watch the colors change.

What you'll build locally

By the end of today's setup, you'll have this same app running on your machine, connected to your own database.

Why we're here

Improve FEAST to make it more usable, flexible, and performant — using modern tooling.

The tool has rough edges
Hardcoded geography, missing tests, no CI (continuous integration), inconsistent data handling, mixed frontend patterns.
Your job: ship improvements
Concrete changes that make it better for real users. Every PR moves the product forward.
Using agentic coding tools
CLI agents, Copilot, and modern dev workflows. Learn to work with AI, not just use it.
First hour · four parts

Understanding
the system.

Part 1
Food access: the problem
Part 2
Agent-based modeling: the approach
Part 3
How the three layers fit together
Part 4
Project management artifacts
Part one

Food access:
the problem.

10 minutes · what we're solving and for whom
What is food access?

Not just “is there a store nearby.”

Food access is the ability of a household to regularly obtain adequate, affordable, nutritious food. Four factors determine whether they can.

Distance

How far to a store?

Supermarkets and convenience stores count very differently — proximity to the right kind of store is what matters.

Transportation

How do they get there?

A vehicle, a bus route, or just walking distance — each one expands or restricts the set of reachable stores.

Income

Can they afford the trip?

Lower-income households make fewer trips, and tend to use the closest store regardless of what it stocks.

Store quality

What's actually for sale?

A supermarket with fresh produce isn't the same as a convenience store with packaged food. Quality drives the score.

Why it matters
19M
Americans live in food deserts
USDA estimate

Low food access correlates with poor diet, higher rates of obesity and diabetes, and other health outcomes.

It disproportionately affects low-income communities and communities of color. Better tools for measuring access make it easier for cities, public health researchers, and community organizations to do their work.

What FEAST is built to answer

Real questions, asked by real cities, every year.

Should we subsidize a new grocery store in this neighborhood?

Tax break, zoning change, public-private partnership — what's the modeled lift in access scores?

What happens if this Walmart closes?

A chain pulls out of a low-income area. Which households are most affected, and where should a replacement go?

Where should we add public transit?

A bus route connecting one neighborhood to a distant supermarket — does it close the access gap for carless households?

How does a farmers' market change the area?

A seasonal store, smaller footprint, different shopping patterns — what's the modeled effect on its surroundings?

Who actually uses this

Five audiences. One tool.

Planners

Urban planners

Evaluating proposed grocery store locations or transit improvements.

Researchers

Public health

Studying the link between food access and health outcomes across demographics.

Analysts

Policy analysts

Modeling the impact of store closures and policy interventions.

Community

Community orgs

Advocating for food access improvements with data-driven arguments.

Academia

Students & researchers

Learning about spatial modeling, food systems, and agent-based simulation.

Part two

Agent-based
modeling: the
approach.

15 minutes · how FEAST simulates a county
Agent-based modeling, briefly

Many simple agents → complex emergent behavior.

Instead of one big equation describing food access for a whole city, we create thousands of household agents that each independently figure out where to shop. Four properties define an ABM:

Heterogeneous

Every agent is different

Each household has its own income, location, vehicles, workers — captures real-world diversity instead of an average.

Local

Agents only see what's near them

No agent has a global view. Global patterns emerge from many local decisions made independently.

Stepwise

Time advances in discrete ticks

Every step, each agent re-evaluates its situation. You can model change over six months, a year, a decade.

What-if

Worlds are easy to swap

Add or remove a store, re-run from the same state, compare outcomes. The whole point of the technique.

FEAST, specifically

Two kinds of agents. That's it.

Household agent

From Census data

Income, household size, vehicles, number of workers, geographic location inside a census tract. Pulled from the US Census API.

income household_size vehicles workers location
Store agent

From OpenStreetMap

A food store — supermarket, convenience, grocery, butcher. Each has a type, name, and location. Pulled from OSM via the Overpass API.

store_id name shop_type geometry
Inside one simulation tick

What every household does, every step.

  1. 01
    Calculate distance to every store
    A distance map keyed by store ID, computed once per step.
  2. 02
    Identify the closest supermarket and the closest non-supermarket
    Two reference stores — one for "best quality nearby," one for "easiest stop."
  3. 03
    Decide where to shop this month
    Trip count depends on has_resources(): 7 with income+vehicle, 8 with income but no vehicle, 6 without resources. Income thresholds vary by household size ($10k/single, $15k/2-person, $25k/3+).
  4. 04
    Compute MFAI score and pick a color
    Average of the trip scores. Red if low, green if high — that's what the map renders next.
Monthly Food Access Index

MFAI: a weighted average of monthly trips.

From Koh et al., 2019. The arithmetic is intentionally simple — most of the interesting behavior is upstream, in which store the household actually picks.

MFAI = mean( trip_scores )
Supermarket trip
95

Fresh produce, broad selection, full grocery — high food availability.

Convenience trip
55

Smaller footprint, more packaged food — limited food availability.

Food pantry trip
25

Minimal selection, emergency use. Low-income households may prioritize these. bc_pantries branch only.

Trip count / month
6 – 8

Varies by resources: 7 with car & income, 8 without car, 6 with low income.

One household, one month

Same neighborhood. Different access.

With vehicle median income
W1a
SPM
95
W1b
SPM
95
W2a
CSPM
55
W2b
SPM
95
W3a
SPM
95
W3b
CSPM
55
W4
SPM
95
MFAI = 83.6 (green)
No vehicle same address, same income
W1a
CSPM
55
W1b
CSPM
55
W2a
SPM
95
W2b
CSPM
55
W3a
CSPM
55
W3b
CSPM
55
W4
CSPM
55
MFAI = 60.7 (amber/red)
The framework

Mesa: Python's ABM library.

You don't need deep Mesa knowledge to contribute. The key idea: when GeoModel.step() runs, it calls Household.step() on every household — that's where all the food access math happens.

Model

Holds the agents, runs steps

FEAST extends this as GeoModel.

Agent

Defines per-agent behavior

Household and Store both extend Mesa's GeoAgent.

GeoSpace

Spatial operations

From mesa-geo. Distance calculations between agents on a map.

RandomActivation

Scheduler

Calls step() on every agent in random order each tick.

From abstract to literal

This is what the agents look like, on a map.

fassfrontstage.pods.icicleai.tapis.io
Open in new tab →
Green household

High access score. Reaching supermarkets often.

Amber household

Mid-range. Mixed trips, partial supermarket access.

Red household

Low access. Mostly convenience stops; few supermarket trips.

Store marker

Click to inspect. Drag in new ones to test what-if.

Where this came from

An ICICLE project, built for any US county.

FEAST originated through the NSF-funded ICICLE AI Institute (OAC 2112606).

The current implementation is focused on Brown County, Wisconsin as a proof of concept. The goal is to make it work for any US county — that generalization is one of the larger arcs in the backlog you'll be working from.

Sponsor
NSF / ICICLE
Award
OAC 2112606
Pilot county
Brown County, WI
FIPS 55009
Goal
Any US county
Part three

How the three
layers fit
together.

15 minutes · frontend, backend, database
The picture to keep in your head

Frontend → Backend → Database.

Frontend

React · Vite
  • Leaflet map
  • User controls
  • Score visualization
  • Add / remove stores
HTTP / JSON
responses

Backend

FastAPI · Mesa
  • API routes
  • Mesa ABM model
  • MFAI calculation
  • Census + OSM pipeline
SQL
rows

Database

PostgreSQL
  • simulation_instances
  • households
  • food_stores
  • one row per step

When you're debugging, ask first: which layer? Map not rendering — frontend. Score wrong — backend. Data missing — database. That single question cuts debugging time in half.

Layer 1

Frontend — React app, Leaflet map.

What it does

  • Renders household markers, colored by access score (clustered at low zoom, individual at zoom 17+)
  • Renders store markers — hexagons for supermarkets, triangles for convenience stores
  • Add stores (click map), multi-select and remove (Ctrl/Cmd+click)
  • API base URL hardcoded in src/shared/client.js — not an env var
  • Deployed via Docker (multi-stage Node build + Nginx) separately from backend

Where it lives

  • ICICLE-ai/FASS-Frontend / fass-react/
  • Branch: Brown-County-Frontend
  • React 19 · Vite · Leaflet · Axios · Bootstrap + Tailwind (legacy mix)
  • State: React Context API + window globals (anti-pattern, on backlog)
  • MapComponent.js (526 lines) — raw DOM, not declarative react-leaflet
Layer 2

Backend — FastAPI plus Mesa.

What it does

  • Serves the REST API under /api/
  • Holds the Mesa GeoModel and runs simulation steps via multiprocessing
  • Preprocessing pipeline pulls Census data + OSM store locations
  • Currently hardcoded to Brown County, FIPS 55009
  • A default_simulation instance is protected from deletion — base dataset for new runs

Where it lives

  • ICICLE-ai/Food-Access-Model/, branch minimum_viable_product
  • Entry: food_access_model/main.py via run_local.py
  • Three entry points exist — use run_local.py only. api_server.py and server.py are legacy.
  • abm/household.py · abm/geo_model.py · preprocessing/get_data.py
  • FastAPI · Mesa + mesa-geo 0.8.0 · asyncpg · shapely · osmnx
Layer 3

PostgreSQL — three tables, one row per step.

simulation_instances

One row per run

Name, ID, timestamps. The "outer container" for everything else.

households

One row per household per step

Location, income, household_size, vehicles, workers, transit/walk/bike/drive times, food_score, stores_within_1_mile, closest_store_miles.

food_stores

One row per store per step

store_id, name, shop type, geometry (WKT), simulation_instance, simulation_step.

!

Coordinate gotcha — mixed CRS across tables

Household coordinates are stored in EPSG:4326 (lat/lon). Store geometries are in EPSG:3857 (Web Mercator, meters). This inconsistency means different coordinate handling per table, and the frontend uses proj4 to reproject stores for display. On the backlog as #67.

The most important slide in this section

When a user clicks "Step" — what actually happens.

1
Frontend
User clicks Step. POST /api/…/advance
2
Backend → DB
Read all households and stores at the current step.
3
Backend
Split households into chunks (one per CPU core) for parallel processing.
4
Mesa (per chunk)
Build GeoModel, scheduler calls Household.step() in random order.
5
Per household
Distances → closest stores → trips → MFAI → color.
6
Backend → DB
Write results back as a new simulation_step.
7
Frontend
Re-fetch households. Re-render the map. Colors change.

That whole loop, end to end, is the product. Student D will trace this in detail. Every PR you write touches some piece of it.

Part four · how we manage the work

Three files that keep a project on track.

CLAUDE.md / GEMINI.md

Project context

What the project is, how to work in it, what conventions to follow. Read by humans and AI agents.

You'll create one this week.
ROADMAP.md

What's done, what's next

A living document. Milestones, dependencies, critical path. Updated after each milestone, not written once and forgotten.

Maintained by the team.
DECISIONS.md

Why we chose what we chose

Architecture Decision Records. Document the reasoning, not just the result. You'll start writing these in Week 2.

One ADR per design choice.

This curriculum repo (FEAST_edu) uses all three. We practice what we teach.

Second half · tools, setup, and assignments

How we
work.

You understand the system. Now: agentic coding tools, the rules for working with them, getting the app running, and your first assignments.

Part five

Agentic coding
tools: the
landscape.

20 minutes · tools, rules, and live demo
Two rules that never change
Rule 1

You must be able to explain every line in your PR without looking at your chat history.

Rule 2

Write code for future you.

Every function, variable name, and structural choice should be readable six months from now. “Working” is not enough. When you use an AI tool, your job is to shape the output until it meets this standard.
Before we look at tools

What makes a tool an agent?

1
One LLM
The brain. Reads text, produces text.
2
Stable identity
Persists across a session. Remembers what it saw and tried.
3
A job
A defined goal: fix a bug, add type hints, plan a feature.
4
A toolbox
Read files, run commands, search, edit. Verify instead of guess.
5
The harness
Puts it all together. Connects LLM to toolbox, manages context, enforces safety. Your project context file configures the harness.
Assembled, they work in a loop: ObserveThinkAct → repeat until the job is done.
Conversational
Answer questions, explain code. Short loop. Week 1.
Task
Multi-step work: plan, edit, test, fix. Many iterations. Weeks 3+.
Orchestrator
Coordinate multiple agents. Multi-issue planning is a taste. Week 4.
Why agentic engineering changes your role

Your focus shifts.

Without agents

Figure out syntax
Write boilerplate
Look up API docs
Debug typos and imports
Manage dependencies

With agentic engineering

Plan the architecture
Write specs and ADRs
Design testing strategy
Review code critically
Document decisions

The agent handles syntax. You handle engineering. This curriculum teaches the right column.

Three categories of AI coding tools

Know the landscape, not just one tool.

Primary

CLI agents

Run in your terminal, read the whole codebase, execute commands. Conversational interface.

Claude Code - recommended
Gemini CLI - free, open source
Alternatives

AI-native IDEs

Full editors with AI in every interaction. Code completion, inline chat, multi-file editing.

Cursor
Windsurf
Alternatives

Inline assistants

Plugins for VS Code, JetBrains. Autocomplete and inline suggestions. Lightest-weight.

GitHub Copilot
Codeium

We recommend a CLI agent because its conversational interface matches how we want you to work: asking questions, not accepting autocomplete. Claude Code is our first choice if access is available; Gemini CLI is a free alternative. Both use project context files that double as documentation.

The file that shapes agent behavior

One file,
two
audiences.

1
A new developer
What is this, how do I work in it?
2
An AI agent
What are the conventions, what should I pay attention to?
CLAUDE.md / GEMINI.md
# Project Overview
FEAST is a food access simulation
tool. Backend: FastAPI + Mesa ABM.
Frontend: React + Leaflet.

# Code Style
- Always use type hints
- Use flake8, ignore E501
- Use descriptive names

# Git Workflow
- main is stable; dev is integration
- Feature branches off dev

Demo: same question, with and without a context file

What these rules look like in practice

Reading first.
Generating
later.

A freshman who learns to generate code in week 1 will never learn to read code. We build the muscle of reading and thinking first. Generation comes later, when you can spot when the tool is wrong.

Bad pattern

"Write me a function that does X."

Skips learning. You ship code you don't understand. Review fails.

Good pattern

"Walk me through what this function does and why."

Accelerates learning. You understand what you ship. Review passes.

Also good

"Is this the simplest way? What could I remove?"

Use the tool to push toward clarity. Simpler code is almost always better code.

For week 1, specifically

Your tools are installed. Use them to ask questions.

Allowed this week
  • "What does this function do and why?"
  • "Walk me through this control flow."
  • "What does this error message mean?"
  • "Why is this written with async?"
  • "Explain this Mesa concept to me."
  • Compare responses across tools
Not yet
  • Code generation of any kind
  • Writing tests for you
  • "Fix this bug for me"
  • Generating commit messages
  • Writing your endpoint trace

We unlock more capability week by week. By week 6 you'll have full access. The restriction is the point: you're building the skill of reading code first. The tool will still be there when you're ready.

Part six

Setup —
get it running.

30 minutes · pair J with S · whatever it takes
Before we clone

Git: your time machine for code.

Git tracks every change to every file. You can always go back. When multiple people work on the same project, git keeps everyone's changes organized.

Concept

Repository

Your project folder, tracked by git. Contains every file and the full history of changes. You have a local copy; GitHub holds the remote copy.

Concept

Commit

A snapshot of your files at a moment in time. Each commit has a message describing what changed. Like a save point you can return to.

Concept

Branch

A named line of development. FEAST uses main (stable), dev (integration), and feature branches (your work). You work on your branch without affecting anyone else.

Your toolkit

Five commands. That's all you need today.

git clone

Download a repo from GitHub to your machine.

Once, during setup.

git checkout

Switch to a different branch.

When moving between branches.

git add + commit

Stage your changes, then save a snapshot with a message.

After you make changes.

git push

Upload your commits to GitHub so the team can see them.

After committing.

git status

Your "where am I?" command. Shows branch, changed files, staged files.

Constantly. When in doubt, git status.

Before you start

Six things on your machine.

Required

Python

3.11 or later.

python --version
Required

Node + npm

Node 18 or later.

node --version
Required

PostgreSQL

Local instance, or shared.

psql --version
Required

Git + GitHub

SSH key set up, repo access granted.

git --version
Install today

uv

Python package manager.

pip install uv
Install today

CLI agent

Claude Code (preferred), Gemini CLI (free), or Copilot as baseline.

npm i -g @anthropic-ai/claude-code
Six steps to a running app

Don't sweat order. Get one machine working per pair.

Step 01

Clone both repos

git clone ICICLE-ai/Food-Access-Model
git clone ICICLE-ai/FASS-Frontend
Step 02

Backend env

cd Food-Access-Model
git checkout minimum_viable_product
cp .env.example .env
uv sync
Step 03

Agentic tool

npm i -g @anthropic-ai/claude-code
# or install Gemini CLI / Copilot
# verify it works, then exit
Step 04

Run backend

uv run python run_local.py
# port 8000, NOT api_server.py
Step 05

Frontend env

cd FASS-Frontend/fass-react
git checkout Brown-County-Frontend
npm install
# edit src/shared/client.js:3
# baseURL → localhost:8000/api
Step 06

Run frontend

npm run dev
# open localhost:5173

Senior students: if you solve something non-obvious during setup, write it down. Those notes become part of CONTRIBUTING.md in a couple of weeks.

What "working" looks like

A Leaflet map. Colored households. Clickable stores.

fassfrontstage.pods.icicleai.tapis.io
Open in new tab →
Backend up

curl localhost:8000/api/simulation-instances returns a JSON list. Health: /api/health

Frontend up

Map loads at localhost:5173 centered on Brown County (Green Bay area).

Loop runs

Click a household — popup with income, vehicles, score. Click Step — colors change. Add a store — Step again — nearby scores improve.

Three things that go wrong constantly

Common problems, and what they actually mean.

Backend

Connection refused

Is PostgreSQL running? Are your .env credentials correct? Is backend on port 8000 (run_local.py)? Make sure client.js matches.

Empty map

No data in the DB

You may need to run the preprocessing pipeline or restore a database dump. Use insert_stores.py with a CSV for stores.

CORS error

Wrong entry point

food_access_model/main.py allows localhost:5173. If you used api_server.py by accident, it only allows a Tapis staging URL.

Import errors

Wrong branch

Make sure you're on minimum_viable_product (backend) and Brown-County-Frontend (frontend). The main branch has different code.

Part six

Today's work,
and what you
do solo.

use the app · trace one endpoint · file issues
Step 1 · about 10 minutes

Use the app before you read the code.

Understanding what the tool does is a prerequisite to understanding how it works. Don't skip this.

  1. 01
    Create a simulation instance
    Through the UI if it supports it, or via curl. Look at the request and response.
  2. 02
    Click on households. Read the popup data.
    Income, vehicles, MFAI score, stores within 1 mile, closest store distance. Match it to the concepts we just covered.
  3. 03
    Click "Step" — watch the colors change
    The full lifecycle runs behind that button: frontend to backend to Mesa to DB and back.
  4. 04
    Add a store near red households. Step. Scores improve?
    Then remove a store. Step. What happens? This is the what-if loop in action.
Open in new tab →
Step 2 · the rest of the session + async

Each of you traces one endpoint through the full stack.

Student Endpoint What to focus on
Student AJ GET /simulation-instances Simplest endpoint. How does a request become a SQL query become a JSON response?
Student BJ GET /households How is household data structured? What do the column names mean?
Student CJ/S POST /stores How does a lat/lon become a polygon? What's the coordinate transform doing?
Student DS POST /sim-instances/{id}/advance The core simulation loop. How does one "Step" actually work end to end?
Student ES POST /simulation-instances What happens when you create a new simulation? Where does the data come from?
Your deliverable this week

Two deliverables. One PR.

1
Endpoint trace
A markdown file in docs/traces/. Three to five paragraphs in your own words.
2
Context file
In the FEAST repo root. Your first project management artifact. Use the template; name it for your tool.

Reviewed by a peer before the Week 2 session. Write for future you.

Beyond this project: Writing down what you learned, in your own words, is how professionals transfer knowledge. The people who write things down become go-to resources; the people who keep knowledge in their heads become bottlenecks.
docs/traces/student-a.md
# GET /simulation-instances

When the frontend calls this endpoint,
routes.py:98 handles the request. It
opens a connection from the asyncpg
pool and runs the query defined in...

[3-5 paragraphs total]
Async this week

Explore. Create.
File issues.
Build the backlog.

three parts · self-paced · pair up if helpful
Solo Part 1

Explore the parts you didn't trace.

Junior students

Read the frontend

Match what you see in the browser to what's in the code.

  • — Which component renders the map?
  • — Which one handles "Add Store"?
  • — Where do household colors come from?
  • — Start with App.jsx, follow the imports.
Senior students

Read household.py carefully

Especially get_mfai(), has_resources(), step().

  • — What do 95, 55, 0.8 mean?
  • — What about 10000, 15000, 25000?
  • — Then read get_data.py.
  • — How does Census data become synthetic households?

Use the LLM to explain things you don't understand — but verify against the actual code. The LLM can be confidently wrong.

Solo Part 2

Create a project context file in your FEAST repo.

Use the template in FEAST_edu/templates/CLAUDE.md as a starting point. Name it for your tool: CLAUDE.md, GEMINI.md, or .cursorrules. Customize it based on what you learned from the architecture overview and your endpoint trace.

Keep it under 50 lines. You'll update it as you learn more. This is your first project management artifact.

Open a PR for it alongside your endpoint trace.

Your context file should answer
  • What does this project do?
  • How do I run it locally?
  • What conventions should I follow?
  • What are the key files to know about?
Solo Part 3 · the structured bridge

What should an improved FEAST look like?

Not a redesign from scratch. The same app, built the way a professional team would build it today. Then work backwards: what are the biggest gaps, and in what order should a team close them?

Investigation areas (pick by tier):

J Frontend state management, Frontend consistency, Backend entry points
J/S Database access patterns
S Simulation core, Data pipeline, Testing and reliability
J students: 2 areas · S students: 3+ areas
Use the template: templates/vision-plan-template.md

Your plan covers:

  • The end state: what does good look like?
  • Gaps: current state vs. target, per area
  • Sequence: what to fix first and why
  • Open questions: what you couldn't figure out
Agent rule: Use the agent to explain code and identify patterns. The vision and prioritization must be your thinking.
Solo Part 4 · the part that matters most

Turn everything you noticed into a GitHub issue.

This is not busywork. This is how the team builds a real backlog. By week 3 you'll be triaging it. By week 5 you'll be shaping it.

A good issue includes:

  • — A clear, specific title
  • — What you observed (quote the code)
  • — Where it is (file + line number)
  • — Why it's a problem
  • — Optionally: what the fix might be
  • — A type label: bug, enhancement, or refactor
  • — An area label: area:frontend-state, area:backend-entry-points, etc.
Goal: at least 3 issues per student.
Beyond this project: The structure of a good issue (what you observed, where, why it matters, proposed fix) is the same structure you'd use to describe a problem to a manager or scope a project request.
Inconsistent imports between api_server.py and routes.py refactor
Observed:
api_server.py:
  from repository.db_repository ...
routes.py:
  from food_access_model.repository...
Where: api_server.py:14, routes.py:22
Why: Confuses tooling, breaks under different working dirs.
Proposed: Pick the package-relative form everywhere.
A non-exhaustive list, all real, all in there right now

Things you'll probably find. File them.

refactor

Inconsistent imports

Package-relative in one file, shorthand in another.

bug

CORS hardcoded

Tapis URL, not relevant locally. Should be env-driven.

refactor

Python version drift

pyproject.toml says 3.11.11. Dockerfile says 3.12.

bug

profiling import missing

Imported in api_server.py but the module doesn't exist.

enhancement

print() instead of logging

Multiple files. Should use the standard logging module.

enhancement

Magic numbers in household.py

95, 55, 0.8, income thresholds. No constants, no docstring.

refactor

Deprecated on_event

FastAPI moved to lifespan handlers. routes.py still uses startup events.

refactor

Raw DOM in MapComponent

Bypasses React, hard to debug, fights re-render cycle.

refactor

Bootstrap + Tailwind

Two CSS frameworks. Pick one. (Probably Tailwind.)

Two more notes for solo time

Stretch goals, and how seniors help juniors.

For seniors · stretch

Find it. File it. Fix it.

Found something fixable in 30 minutes — the CORS hardcoding, a print-to-logging conversion?

Open a PR. Link it to the issue. That's your first taste of the full cycle.

For seniors · pairing

Walk a junior through one file.

If a J student is struggling to spot issues, sit with them over chat or a call.

Point things out. The junior files the issue — they need the practice. You help them see what to look for.

How week 2 starts

Next session, we compare your vision plans.

  1. 01
    Silent read (5 min)
    Read one other student's plan. Mark: something you also identified, something you missed, something you'd sequence differently.
  2. 02
    Round-robin (8 min)
    Each student shares: #1 priority, one thing from the reviewed plan you missed, one sequencing disagreement.
  3. 03
    Converge (2 min)
    "Everyone noticed" items anchor the team's shared priorities.
Everyone noticed
Must-fix candidates. These drive the team's priorities.
Multiple people noticed
Should-fix. Real problems, not just one person's opinion.
One person noticed
Worth tracking. Might become important later.
Then: encode the board in your CLAUDE.md so your agent can help organize issues going forward.
By end of week 6, this team will have shipped

What success looks like — six weeks from now.

#24

Linting + CI pipeline

#18 #19 #20

Type hints across

tests

First test suite

review

3-layer review pipeline

#47

Store-counting bug fix

#74

Optimized step function

#91

Better MFAI algorithm

#94 #79

Reporting API + metrics

#50

Cleaner logging

security

Input validation + CORS

ADRs

Documented decisions

+ yours

Issues you'll file this week

That's a lot. We get there one week at a time. The foundation is what we build today.

Now

Questions —
then setup.

Bring laptops to the front so we can debug together. Anything that's confusing now will come up later — better to ask now.