More memory cannot tell an agent what a system is supposed to do. This essay starts with the rules of the place the agent is entering, the people affected, and the ways its actions can be corrected, escalated, or stopped.
Problems are designed
These are examples of my projects, from games to tools and system demos. They show how I use multi-agent orchestration and my own models to bring ideas to life.
- VarsityApexA prototype that turns the files schools already produce into portable, attributable records.

- CoalitionAn escape game in one HTML file, where allies work in parallel and dice force you to plan around the people who fail to deliver.

- Cap BuffetLets a league try a salary cap system before adopting it, with 18 mechanics as swappable modules.

- Oregon HS Tennis Power RankingsIndependent ratings for every Oregon high school team from four years of results, like the computer rankings in college football and basketball.

- Occupant IndicesDaily price and activity indices for the AI economy, built from public data.

- MalloThe first advanced stats for pesäpallo.

- Play To ClinchTeam tennis on one rating scale, played point by point.

- ViperballAn invented gridiron sport with a probability engine and a 280 team universe.

- SuperInningsBaseball as one continuous 27 out half, documented in 140+ decision records.

- You Go FirstA matching model for dating apps built on game mechanics.

- BeachwaveLive audio rooms on ATProto. Fork it and run your own.

- Pensulo CardsA deck of 46 cards for getting past creative block.
Drag the marker along the techniques, or use the arrow keys.
Under the hood
Marginal Player Line
I wrote a blog post, How Do You Evaluate a (Baseball) Hall of Famer, after reading Michael Mountain’s idea of the marginal player. Count the Hall of Famers at a position, rank everyone there, and the marginal player is the one who would fill the last slot. I was curious what happens when the people the Hall recognizes don’t resemble the people our existing measures say had careers of comparable quality. This chart ranks every retired player at each position by and draws a line where the Hall’s own count runs out.
JAWS is the Jaffe WAR Score system, made by the baseball writer Jay Jaffe to measure Hall of Fame cases.
WAR, or wins above replacement, estimates how many wins a player added. The comparison is a fill-in his team could have signed for close to nothing.
JAWS = (career WAR + WAR in his 7 best seasons) ÷ 2
Lou Whitaker had 75.1 career WAR and 37.9 in his seven best seasons, so his JAWS is 56.5.
Career Index = JAWS ÷ Hall standard at the position × 100
the line = the Nth player, where N = Hall of Famers at the position
You Go First match score
Scores are asymmetric. What you want, 10 chips across five traits, is scored against what they are, a behavioral quiz: 0.7 × + 0.3 × . Move the chips and both scores change.
Everyone takes a 10-question behavioral quiz that gives them a Relay score from 0 to 80 degrees. Temperature compares two people’s scores, and the closer they are, the higher it goes.
Alignment is how well someone’s traits fit what you want. Each chip you put on a trait is worth a tenth of the other person’s score on it, so the total comes out of 100.
alignment = Σ (your chips on a trait ÷ 10 × their score on it)
score = 0.7 × alignment + 0.3 × temperature
temperature = max(0, 100 − 2 × |quiz gap|)
You Go First: a week of matching
Swiping makes attention free, so a like tells you nothing and a few profiles get most of them. Everyone gets 15 picks a week in , and the other person sees the tier.
Picks work like a draft, sorted into Firsts, Seconds, and Thirds. The simulator gives everyone 3 Firsts, 5 Seconds, and 7 Thirds.
These are the app’s 14 test profiles in its simulator. Click a person to see who they picked.
The textbook algorithm pairs all 14, but only by assuming everyone knows everyone and can propose without limit. Fifteen picks a week matched 12 by week 2.
Stable matching pairs people so that no two of them would both rather be with each other than with the person they got.
Source: heypbj/src/lib/stableMatchingSimulator.ts and src/data/mockSimulation.ts, default seed.
Play To Clinch point engine
College tennis is a team sport: three doubles matches make one point, six singles matches are a point each, and the first team to four wins. My engine plays every point, so a small edge per point adds up over a match.
P(server wins rally) = logistic(0.9·Δrally + 0.36 first | 0.10 second + …)
Drag to change the skill gap, on the game’s 20-80 scale.
A dual is one team-against-team meet. A team that reaches four points has clinched it.
Play To Clinch high school careers
The first high school model put seniors in 85.7% of spots. I compared that with six seasons of Oregon boys tennis, then rebuilt development around starting ability, career peak, annual growth, and actual playing time. JV matches count for half the of varsity, so five freshmen with the same ceiling can end up with very different careers.
Exposure is how much of a year’s growth a player gets to use, and it comes from playing matches. JV, or junior varsity, is the level below varsity.
A high school team ranks its singles players. The best plays No. 1 against the other team’s best, the next best plays No. 2, and so on down the lineup.
gain = year's budget × playing time
playing time: bench 0.55 · full JV 0.81 · varsity 1.00
Five freshmen from one generated roster, all with the same ceiling. Dashes mark each career peak. Change their playing time.
Who plays No. 1 singles, by grade: Oregon boys over six seasons, and my sim before and after the change.
Viperball kick decisions
Viperball has six downs to gain 20 yards, and the ball moves by running, , and . A live-play is worth 5 and a place kick 3. Every rule creates a strategy, so on a late down the coach weighs both kicks against going for it.
A drop kick is dropped, bounced once, and kicked through the uprights while the play is live. A place kick is a field goal kicked off a holder.
A kick pass is a kick to a teammate downfield, and it does the job a forward pass does in football. If nobody catches it, the offense keeps the ball and loses the down.
Viperball has no forward pass, so players toss the ball to a teammate beside or behind them. A chain is several laterals on one play, sometimes five, and every toss risks a fumble.
distance = (100 − field position) + 10
drop kick EV = 5 × P(drop) place kick EV = 3 × P(place)
Drag the marker to change the kick distance. Highlighted line: drop kick. Plain line: place kick.
The call: GO FOR IT
O27 college prospects
In , a prospect’s box-score grade and actual ceiling are different things. Each player has a hidden ceiling and a fixed lens on it, so the grade you see is ceiling times lens. Two scouting reports estimate that ceiling with their own errors. I kept the lens fixed through college: a hidden gem can still look ordinary when draft day arrives. The decision is whether to trust the box score or two imperfect scouting reports. I explain the model in the development write-up.
O27 is baseball with one structural change: each side bats until they record 27 outs. There are no innings. It’s a computer sport, like Viperball.
shown = round(ceiling × lens) lens 0.40–0.95
growth = min(rate × ceiling, cap) cap 15 → 4
scout = ceiling ± fog fog 7–31
Pick the one you’d draft, then sign them and the lens drops. The plain bar is the box score. The highlighted bar is the real grade.
Oregon high school tennis rankings
Win-loss records ignore who you played and count every the same, so a coach could stack a lineup to look better. My flight-weighted score weights the eight flights from 1.00 down to 0.10, so depth counts and stacking stops paying. The blends it with an -style strength of schedule.
RPI, the rating percentage index, scores a team on its own winning percentage and on its schedule. Its opponents’ record counts twice as much as its own.
RPI = 25% own win % + 50% opponents’ win % + 25% opponents’ opponents’ win %
The Power Index is what the rankings sort by. APR, the biggest part, is a team’s record adjusted for schedule strength. FQI is the flight-weighted score, adjusted for each opponent, and oGS is the share of games won, adjusted the same way.
A high school tennis dual has eight flights: four singles matches and four doubles matches, numbered from 1, the strongest, to 4. Each flight is one match.
PI = 0.65·APR + 0.25·FQI + 0.10·oGS
FQI = (Σ flight_score·opp_strength + 5×0.5) / (duals + 5)
Drag a bar to change a flight’s weight. All 121 ranked 2026 boys teams re-rank.
Top 12 by Power Index, with each team’s change from the real weights.
Context-Aware Agents: Designing for Alignment in AX
February 23, 2025
Agents operate within existing systems of rules, responsibilities, and decisions. When those relationships are missing from their context, agents can complete a task while misunderstanding its purpose. I examine how context, authority, and oversight shape agent behavior, and why judging task completion alone misses important consequences.
Building Coalition with AI agents exposed a recurring problem: game rules, interface copy, and narrative kept getting mixed together. I developed a content schema that gives each a defined place, so agents can work on dialogue, game mechanics, or interface language while preserving the relationships between them. The schema is available as a standalone package.
When an agent should ask you
January 15, 2026
I adapted Judgment Routing for the person giving an agent a task. Uncertainty, stakes, authority, and novelty help route an action to execute, verify, approve, or refer. The person sets the limits, and each action leaves a receipt showing which permission allowed it.
What counts as proof that an agent did its job?
July 23, 2026
A tool call proves an attempt, and a provider response establishes only what that provider confirmed. I separate the request, approval, attempted action, acknowledgment, and observed result so a missing confirmation stays visible rather than turning into a generic success message.