Game
Jobs: from the phone call to the reviewJ
A job from the phone call to the review. Where offers come from and how many, what each one is (size, urgency, price room), answering before a rival does, agreeing a price and a day, the visit, and what the job leaves behind.
Your work makes your calls. A call comes in, you answer (fast, or a rival takes it), you agree a price and a day, do the work, get paid, and the job echoes afterwards: word of mouth, a callback, a bigger garden next time. One balanced, seeded algorithm decides how many people ring and who they are, and every number in it sits in one table that's easy to tweak.
The player's view
The first week. You mow grandma's lawn for nothing. The next morning she rings the house: her friend Mrs. Higgins next door can't manage her lawn any more. Nothing else comes in until it's done. Mrs. Higgins haggles like a pro ("Your grandmother charged me $20, dear"), watches you work, and at the door, with a slice of cake, says "Amazing, dear! I'll give your number to my friends." The next morning the phone rings: "Edna gave me your number." A day or two later dad leaves a voicemail: "Put an ad in the Clipping, kiddo. That's how I sold the boat." You ring the paper, and the next morning you can read your own ad.
There are no stars yet. You can't see a score. You feel how well you did through the client's line at the door, the tip, grandma's gossip and Mrs. Higgins at the fence. But clients tell you how picky they are: "Just keep it tidy, nothing fancy" is an easy job; "Immaculate, please. Like a golf course." is a target. Beat it and they tell everyone, and the people they send you accept a higher price but expect a bit more. When you register the company, Starzly opens and your earlier jobs' reviews fill in at once.
Out on a job. You come home and the answering machine blinks: "Message received at 10:42." BBQ tomorrow, lunch! You call back: "Sorry, I found someone this morning." The relaxed ones wait; the urgent ones don't. When you do catch an urgent one live, you offer to come right now and name a higher price, and the client, who is honestly desperate, says yes. Miss a deadline and the guests are HERE: no pay, and they warn people off.
Word gets round. "Everyone says you're the best on Elm Road." Good work brings more calls and, after a while, bigger gardens on the leafy avenues and the estates in the hills. A sloppy job slows the phone right down; a client you let down may ring once more for a second chance: "One more go. And this time the edges." Rain days are quiet, and the two days after are busy because the grass grew. By week three there are more calls than one pair of hands can take, which is when crews start to make sense.
Later, the whole visit. The job sheet is pinned on the fridge with the client's words and an arrival window. At the knock the lawn is twice as long as they said: "Another $30?" An away client's gate has a keypad, their dog follows you round, and an envelope waits under the mat. Halfway through, a home client comes out: "While you're here, could you do the hedge?" At the end they walk the lawn with you and point at a tuft you missed. You break a window, and grandma's street forgives you once: "My Harold broke that window twice, dear." You snap a before and an after for your website.
Ideas
J1: the offer model and its tuning
Every morning (host only, from the seed) the game works out how many calls you'll get today, and for each call who it is, how big the job is, how urgent and by when. The calls then ring through the day. Early offers come by phone; email and the other channels come later (WK3).
calls expected today (λ) = (word of mouth + friends + your ad + people who just find you) × weekday × weather × season
calls today = a seeded draw around λ, kept honest by the luck tally
each call: channel (by share of λ) → size (channel's mix × trust gate) → expectation → urgency % → deadline
→ price room (urgency + coming sooner + who sent them)
How many calls a day
Calls a day depend on what you did: jobs done and how well, your ad, the weather.
| Source | Calls a day it adds | Notes |
|---|---|---|
| People who just find you | 0.2 | the floor: someone always calls eventually |
| Mrs. Higgins' friends | 1.0 on day 1, halving every 7 days (× her line, J2) | the onboarding push; gone by week 3 |
| Word of mouth | each finished job: 0.2 × its talk (below), halving every 10 days | the engine: your work makes your calls |
| Your ad in the paper | J4 | grandma's street and the suburbs |
| Weekday | × Mon 1.2, Tue-Thu 1.0, Fri 1.1, Sat 0.7, Sun 0.3 | |
| Weather, season | J8 |
- Callbacks are separate (your clients, not new offers): 10-16 days after a visit the client calls again (85% if you met their expectation, 50% if you were a bit under, 10% if well under). Never taken by a rival. Callbacks are calmer than new calls (urgency r^2.5). After a job under expectation, that call is a second chance (J8).
- Co-op: word of mouth already grows with the work the siblings finish together; the other sources × (1 + 0.5 per extra sibling), to tune in EC5.
Chances, not coin flips
- Picks are percentages: which channel, what size, the urgency, whether the client accepts your price, whether a rival took a missed call. Players understand them, and they tune in one table.
- The count uses a rate and a tally. Independent coin flips give streaks: at 1.5 calls a day, two empty days in a row happen to almost every player in week one, and it feels broken. So: draw today's calls around λ (a Poisson draw, seeded), then keep a luck tally (expected minus received). If you've been unlucky by more than 1.5 calls, an extra call comes today; if you've been lucky by more than 2.5, one is held back. Random day to day, fair over a week. In the simulator this cuts two-day droughts in the first two weeks from ~1.3 per player to almost none.
- Everything is seeded (
SimRandom(seed, day, Salts.Offers / OfferPick / Urgency / Haggle / RivalTake)): the same save gives the same calls on every machine and every reload, and the simulator can replay a save.
What each call is
- Channel: picked in proportion to each source's share of today's λ. The client says it ("Edna gave me your number", "I saw your ad"), and the ledger counts calls per channel.
- Size: each channel has a mix, then trust filters it (below).
| Size | What | Typical price (EC1) | People who find you | Friends | Your ad | Word of mouth |
|---|---|---|---|---|---|---|
| S | grandma's street, small suburbs lawns | $20-45 | 50% | 70% | 30% | the talker's size 75%, one size up 25% |
| M | suburbs gardens | $55-185 | 35% | 30% | 55% | |
| L | leafy avenues | $150-400 | 12% | 0 | 13% | |
| XL | estates in the hills | $400-700 | 3% | 0 | 2% |
- Expectation: by district (grandma's street 80%, suburbs 85%, leafy avenues 90%, the hills 94%), plus the bar rising for word of mouth (J7). The client's Picky trait moves it (CH7).
- Urgency % and the deadline (below).
- The household: a lot in the right district and its seeded garden (J5).
Trust: better jobs come with experience
- Trust (hidden, a track record): +1 per job that met the expectation, −2 per job more than 10 points under, −3 per missed deadline or no-show (never below 0).
- Each size needs some trust: S 0, M 5, L 20, XL 50. Below the need, that size fades in gradually (from half the need to 1.5× the need) and the weight goes to smaller sizes: the call still comes, the garden is smaller.
- Sloppy work and missed deadlines close doors again.
- The player feels it: clients say why they called ("Everyone says you're the best on Elm Road"); after registering, My Company shows the track record with a hint at the next door ("Bigger gardens want about 20 good jobs").
- A size only comes if its district exists in the build (L and XL wait for those districts).
Urgency % and the deadline
Every offer gets an urgency from 0 to 100%, mostly low: urgency = r^1.6 with a seeded r (about 42% relaxed, 23% this week, 18% soon, 16% urgent). Callbacks are calmer (r^2.5). Urgency sets a deadline with a time and a reason, how far you can push the price (J7) and how long the offer stays on the market before a rival takes it (J6). The reason is the client's words; reasons with follow-ups come with J12.
| Urgency | Deadline | Example reasons (the client's words) | Price room | Half-life on the machine |
|---|---|---|---|---|
| 0-25% | in 4-5 days, 17:00 | "Whenever suits", "It's that time again" | +10-20% | 6 h → 3 h 35 |
| 25-50% | in 2-3 days, or Saturday 10:00 | "We have guests at the weekend" | +20-30% | → 2 h 8 |
| 50-75% | in 1-2 days, 17:00 | "The HOA sent a letter, the fine's on Friday" | +30-40% | → 1 h 16 |
| 75-95% | tomorrow, at a time | "BBQ tomorrow, lunch!" (12:00), "Open house tomorrow at 10" | +40-48% | → 50 min |
| 95-100% | today, at a time | "Party tonight at seven!" (18:00) | +50% | 45 min |
- Formulas: deadline = round(5 × (1 − urgency)) days at 17:00, a time tomorrow from 75%, a time today from 95%; ceiling = 10% + 40% × urgency (+ sooner, + referral: J7); half-life = 6 h × 0.125^urgency.
Talk: the score against the expectation
Beating expectations brings more calls: a 98% job talks far more than an 85% one.
- Every job has a score % (J3) and the client an expectation % (above).
- Delight = (score − expectation) ÷ (100 − expectation), at most 1. 98% against 85% → 0.87. 85% → 0. 75% → −0.67.
- Talk (how much the job feeds word of mouth) = 0.5 + delight, between −1 and 1.5. Over its life a job brings about 0.2 × talk × 10 ÷ ln 2 ≈ 2.9 × talk calls in total.
| Score (expectation 85%) | Talk | What it means |
|---|---|---|
| 100% | 1.5 | they tell everyone |
| 98% | 1.37 | the chance bonus |
| 92% | 0.97 | a good job |
| 85% | 0.5 | met the minimum: a polite word |
| ~78% | 0 | silence |
| 70% or less | −0.5 → −1 | they warn people off |
| missed deadline / no-show | −1 | |
| came the same day they called | +0.2 | "he came within the hour!" (J7) |
Easy to tweak: one tuning asset
The algorithm is meant to be adjusted often, so every number lives in one tuning asset, and nothing is buried in code.
OfferTuning(ScriptableObject): every number on this page, each a labelled field with its unit and a tooltip that says what it does ("womHalfLife: days for a job's word of mouth to halve"). Sections: sources, quality, trust, urgency and deadlines, price room, rivals, ads, weekday and weather, tally. Sizes and their mixes are a small table in the same asset. The values are in the Tuning table below.OfferModel: pure functions over the tuning: λ and its parts, the seeded draw and the luck tally, the channel pick, the size pick with the trust gate, urgency, the deadline, talk from score vs expectation, the trust update.- Difficulty presets are multipliers on top (difficulty.md), never second copies of the numbers.
- J1's sources are people who find you, Mrs. Higgins' friends, word of mouth and the weekday; the ad, weather and season fields exist at 0 / ×1 until J4 and J8 turn them on.
- A 35-day dry run in the test assembly (the same policy as the simulator figure in J9) and two balance tests: week 1 good play = 1-3 jobs a day; no 3 empty weekdays in 1,000 seeds while λ ≥ 1.
Needs: nothing · Done when: the tests pass and the dry run matches the balance check's numbers (Tech) within ~10%.
J2: the opening path
Three scripted steps, then the algorithm. Nothing random happens before it starts.
- Grandma's lawn (O1): the tutorial mow, the family job (TU5). Unpaid; no offers yet.
- Grandma's call (O2): the next morning grandma rings the house: "My friend Mrs. Higgins next door can't manage her lawn any more..." A scripted offer: Mrs. Higgins, a small lawn, $20, no deadline, never expires, no rival; the algorithm stays off until it's done. The haggling tutorial lives here ("Your grandmother charged me $20, dear").
- "I'll give your number to my friends" (O3): at the door, when she pays (and the cake). Her line follows your hidden score ("Amazing, dear!" / "Very nice." / "You're learning, dear"); it seeds the friends source (×1.0 / 0.7 / 0.4). Back on the sidewalk, Chad's scene (ST9).
- The algorithm starts the next morning, and that first day always brings at least one call.
- Story offers (Chad's booking later, ST11; the hand-made clients m01-m14) are placed by story rules on top of the algorithm and don't count in it.
- The algorithm is off on a new game:
GenerateRequestsmakes nothing new untiloffersOn(known clients' revisits keep working for old saves). Day 1 has grandma's lawn only. - Mrs. Higgins becomes a client: a hand-made mission on lot 26 of grandma's street (grandma's other side; small lawn, S, $20, she watches her own job), and m00's watcher line stays hers. She needs voice clips.
- Grandma's verdict call (after the first m00) ends with the ask and posts Mrs. Higgins' request: no deadline, never expires, no rival. The haggle on it is the tutorial.
- Her line at the door is picked from the job's score (J3), sets the friends seed and
offersOnfrom the next morning. - Old saves:
offersOnalready true, trust and word of mouth seeded from their job records.
Needs: J1 · Done when: on a new game, solo and on two instances: grandma's lawn → her call about Mrs. Higgins → nothing else comes in → Mrs. Higgins' job → her line → the next morning a call from the algorithm.
J3: the first calls
The model drives the phone, the job gets a score, and the stars go into hiding.
- Each morning
OfferModelreplaces the new-client part ofGenerateRequests: λ, the draw, the tally; each offer picks a channel ("Edna gave me your number"), a size, then a client from the hand-made pool (unknown clients of that size first, else the offer goes to a known client whose lawn has grown, else it's dropped and counted). All offers come as voicemails on the house phone (the paper keeps its news, no client ads). - Urgency % → the deadline in days (times wait for the clock, J6) and the request's expiry; the reason line by band (J1's table).
- Haggling from urgency: the two existing buttons (+10%, +25%) use accept = 1 − markup ÷ (2 × ceiling) with ceiling = 10% + 40% × urgency; refused = they hang up (J7 adds the counter-offer and the day).
- The deadline: the job must be finished by it. Started but finished late: delight −0.5. Not done: the client cancels ("The guests are HERE."): no pay, talk −1, trust −3. The sheet and the calendar show the deadline, with a red mark when today's plan can't make it.
The job score
- Every job has a score % from the job's result: coverage, finish, damage, missed tasks. The formula belongs to the
tool pages and
MissionResult; the first one uses what the result has (required tasks done, coverage, incidents, the client's mood) and the tool pages refine it. It is compared with the client's expectation (J1) and feeds talk (word of mouth), trust and callbacks. - Hidden before the company exists: before registration there are no stars and no Starzly page. You feel the score through the client's line at the door, the tip, grandma's gossip and Mrs. Higgins at the fence. No stars on the receipt (EC8), the hub toast, job cards or the company page; Starzly says "Register your company to get listed". Reviews are still written and appear when you register, 1-5 stars from the score vs the expectation: well under = 1★, under = 2★, met = 3★, delight ≥ 0.33 = 4★, delight ≥ 0.66 = 5★.
- The client's line at the door follows delight: "Absolutely wonderful. I'm telling everyone." (≥ 0.66), "Lovely job, thank you!" (≥ 0.33), "That'll do nicely." (met), "Hm. Thanks, I suppose." (a bit under), "Well. I won't be recommending you." (more than 10 points under).
Expectations in words
The score stays hidden, but the expectation doesn't: the client tells you how picky they are, so beating it is a target, not a guess.
- In the call and on the jobs list (the fridge board, the calendar): one line by expectation band.
| Expectation | They say | On the job list |
|---|---|---|
| ≤ 80% | "Just keep it tidy, nothing fancy." | Easy-going |
| 81-87% | "A nice neat job, please." | Neat |
| 88-92% | "I like it just right. I'll be checking." | Particular |
| ≥ 93% | "Immaculate, please. Like a golf course." | Perfectionist |
- A second chance says so: "One more go. And this time the edges." (J8)
- On the job, the client's reactions (today's
ClientReactions) lean on their band: a perfectionist frowns at a missed strip a perfectionist would see, an easy-going client only at damage. - How picky they are is their Picky trait (CH7). What exactly they care about (edges, stripes, clippings...) is still open (below); here, the level only.
- The Relaxed preset (Gauges setting) can show a needle: the job's score so far against their expectation.
A dev readout
Dev builds, on the company page: today's λ and its parts, the tally, trust, word of mouth.
Needs: J1, J2 · Done when: a new game reaches the algorithm and the next 7 days bring calls at the J1 dry run's rate; a sloppy job visibly slows the calls; the same seed gives the same calls on two instances.
J4: your ad in the paper
Word of mouth first; then your ad raises the chance of calls.
- Ring the ad desk of The Daily Clipping (the number is in the paper) or, later, use the computer: a line ad ($5 a day, +0.6 calls a day) or a boxed ad ($10 a day, +1.0); pick the days, paid at once. It reaches grandma's street and the suburbs.
- It shows in the next morning's paper (you can read your own ad) and adds its calls from that day.
- It fades: ×0.9 each day it keeps running, with a floor (line 0.3, boxed 0.5): readers get used to it. It works best in bursts when you need work, and when rain has just passed.
- Dad's tip: his voicemail on day 2 or 3: "Put an ad in the Clipping, kiddo. That's how I sold the boat."
- Flyers, the website and email are work.md's channels (WK3).
Needs: J3 · Done when: ringing the paper for a line ad on days 3-10 takes $5 a day, the ad is readable in the next morning's paper, it adds 0.6 calls a day from that day fading to 0.3, and dad's voicemail suggests it on day 2 or 3.
J5: generated households
Street lots become clients from the seed, so the pool never runs dry: each household is a lot in the right district
with its seeded garden (from LawnPlan + the lot), the first slice of WK1 (lots and gardens only, no personalities).
Sizes map to districts (S grandma's street and small suburbs lawns, M the suburbs, L the leafy avenues, XL the hills).
Jobs resolve by id through Db.missions today, so this needs a runtime mission registry.
Needs: J3, WK1 · Done when: a new game played past the hand-made pool keeps getting calls from street lots, each with its seeded garden, the same on two instances, and L and XL calls come only once their districts exist.
J6: calls through the day, and rivals
Answer fast, or a rival takes it.
- Calls ring at their minute. They ring the house phone: at home you answer live, the client is yours to talk to, no rival risk.
- Out on a job, the call goes to the answering machine ("Message received at 10:42"). From then on a rival may take
it: chance taken = 1 − ½^(waited ÷ half-life), where the half-life comes from the urgency (J1). The moment a rival
takes it is rolled once when the call arrives (
takenAt), so calling back twice or reloading gives the same answer. The timer only runs 8:00-19:00. - Calling back in time: "Oh, thanks for calling back!"; just in time: "I was about to ring someone else"; too late: "Sorry, I found someone this morning." A taken job loses nothing but the job.
- A voicemail is dead at its deadline, or at 19:00 the next day, whichever comes first.
- Example: an urgent call at 10:00 that you return at 12:00 is ~70-85% gone; a relaxed one is ~20% gone.
- Deadlines get their times ("tomorrow 12:00").
- Answering on the go is J25 (the car phone, a phone of your own).
Needs: J3, DY1 · Done when: a call that rings while you're out lands on the answering machine with its time; a
voicemail returned before its takenAt always gets the job and one returned after hears "Sorry, I found someone this
morning"; reloading never changes the answer; deadlines show times.
J7: negotiating a price and a day
In the call you offer a price and when you'll come. The old haggle (+25% / +10% / hang up) becomes one rule.
- Fair price = par × the district rate (EC1). It never changes with quality: better work buys price room, not a price. Raising your prices outright is the rate card's job after registering (economy.md).
- Ceiling = 10% + 40% × urgency + 20% × urgency × sooner + 10% × the referrer's delight.
- Sooner (availability pays): 1 if you come today (the call's day), 0.5 if you come the day after and the deadline is later, 0 if you come on the deadline day. Offering "right now" on an urgent job is worth up to +20%.
- The referrer's delight: people sent by a delighted client trust your price (+10% × delight on the ceiling).
- Chance they accept a markup = 1 − markup ÷ (2 × ceiling). At the ceiling it's 50/50; at twice the ceiling, no. A relaxed client (+10%): +10% → 50%. An urgent one you can do today (+70%): +35% → 75%.
- Refused: they counter once at fair + half the ceiling; take it or they hang up.
- Below fair is always accepted, and that job's talk counts ×1.25 ("such a nice young man").
- Coming today also gives +0.2 talk when the job is done that day.
- Tips grow with delight (up to 20%, as today).
- The bar rises: a client sent by word of mouth expects the talker's expectation + 5 × the talker's delight (at most +5): a 98% job in the suburbs sends people who expect ~89%.
- The buttons show prices and days, not percentages; the client's tone hints at the room ("I'm desperate, honestly"). The Relaxed preset can show the odds.
Needs: J3 · Done when: offering "today" on an urgent call raises the markup it accepts; a refused markup brings one counter at fair + half the ceiling; a price below fair is always accepted and its job talks ×1.25; a client sent by a delighted one accepts more and expects more (85% → ~89% after a 98% job).
J8: second chances, weather and season
- Second chances: when a client you let down calls again (J1's callback: "I'll give you one more go, but I expect better"), their expectation is 5 points higher (85% → 90%). Meet it and the old job's damage is erased: its word of mouth goes back to a polite word (talk 0.5) and the trust it cost comes back. Miss it and it counts as a new disappointment. Not a second chance after a missed deadline or a no-show (they don't call again).
- Weather drives calls: × 0.6 on a rain day, × 1.3 the two dry days after (the grass grew). It reads the day's
rain from
Calendar.WeatherOn(weather.md; a stubWeather.Rain01until WE1). - Season: × 1.0 in the endless late spring. A number ready for seasons, e.g. early spring 1.3, high summer 0.8 (dry, slow growth), autumn 0.6 + leaves, winter 0.1 (WK8). One field, no code.
Needs: J3 · Done when: a client let down once calls back asking for 5 points more, and meeting it puts the old job's talk back to 0.5 and returns its trust; a rain day brings ~0.6× the calls and the two dry days after ~1.3×; changing the season field scales every source.
J9: tuning tools
- JSON override: dev builds read
offer_tuning.jsonnext to the save if it exists and reload it on change, so a playtester can tweak without a rebuild. The F1 panel can export the current values to it. - The F1 "Jobs" tab: live sliders for the main numbers and a 35-day dry run graph that redraws as you drag (calls,
jobs, sizes, money), for three styles of play (perfect / good / sloppy). The same
OfferModelthe game uses. It needs a hub-side debug panel (the F1 sandbox is garden-scene only today). - The full balance-test set (EditMode, 200 seeds each) holds the pace, so a tweak that breaks it fails loudly:
- week 1, good play: 1-3 jobs a day, at most 0.1 two-day droughts per player;
- week 3: more calls than one player can take;
- perfect play earns 10-30% more than minimum play over 35 days; sloppy play earns less than half;
- first L call between days 10 and 20 for good play.
- The simulator below runs the same model with an editable tuning panel, so a change can be tried in the browser before it goes in the asset.
Needs: J1 · Done when: editing offer_tuning.json in a dev build changes the next morning's numbers without a
rebuild, the F1 "Jobs" tab redraws the 35-day graph as a slider moves, and the full balance-test set passes.
J10: the job and its sheet
One record per job, from the first call to the last echo: J1's JobOffer grows into the Job record with stages. It
replaces ClientRequest (a booked visit on a round is the same record, created by the round).
| Stage | What it means | Where you see it |
|---|---|---|
| Request | they asked; nobody has answered | the paper, the answering machine, mail, a knock at your door |
| Quoted | you named a price; they're deciding (haggle) | the call / the door |
| Booked | a day + an arrival window | the fridge board, the calendar |
| Today | in today's day plan | the calendar's day view, the watch |
| On site | you checked in (knock, or the gate for away clients) | the sheet in your hand |
| Paused | you had to stop (rain, breakdown, dark) | a note on their door, back on the calendar |
| Signed off | walk-round done (or they came home and looked) | |
| Paid | cash at the door, an envelope, or an invoice paid | the ledger |
| After | review, rebooking, word of mouth, photos | Starzly, the calendar, your website |
- Off-ramps: Taken (a rival got there first, J6), Declined (by you, politely), Expired (they gave up), Cancelled. They cancel: EC1's fee rules (a late cancellation fee; weather is free). You cancel: the day before = a small dip; on the day with a call = bigger; no call = a no-show (client lost, −1 reputation, as today).
The job sheet
The job made visible: grandma's notepad page at first (Patrick Hand), a printed work order with your logo once you're registered. The same sheet is pinned on the fridge board, opens from the calendar, sits in your hand on site (stand still, UI4) and is what a crew gets (EC4). It carries:
- client, address and house number, district, how they heard of you (work.md);
- what they said, in their words, and the reason ("BBQ on Saturday");
- seen or not seen (stamp), and what you noted when you looked (J11);
- the quote lines (EC1), change orders added below;
- day + arrival window, or the deadline;
- home or away; access (gate code, key under the pot); warnings ("mind the sprinklers", "the dog bites shoes");
- on site: the walk-round points, damage, extras; then paid (how, by whom) and the review.
Booking: a day and an arrival window
- You book a day + window: Morning (8:00-12:00), Afternoon (12:00-17:00), Any time (8:00-17:00, away clients and relaxed ones), or a deadline from a reason ("before Saturday 14:00").
- Late = you check in after the window: 15 minutes of grace, then mood −0.05 per started 15 minutes (cap −0.3). Phone ahead (from home, the car, or when you have one, your phone) before the window ends: half the drop. Two hours late at a home client: "We had to go out" → rebook, or it's a no-show if you never called.
- Early: up to 30 minutes is fine ("Oh! Early bird"), earlier gets the dressing gown and a small dip. An engine before 8:00 is a quiet-hours complaint (SN3).
- The day plan: the calendar's day view shows today's jobs in order on a time line: windows as bands, work minutes (par at your speed), the drive between them (DY2 travel minutes, economy.md fuel), and a red mark where a window will be missed. Drag to reorder. Crews get the same plan later (EC4).
- Rain moves are free both ways (weather.md); the window moves with the day.
Needs: J3, DY1, WK2 · Done when: one job's sheet shows the same on the fridge board, the calendar and in hand; checking in 40 minutes late costs −0.15 mood (−0.075 if you phoned ahead); the day plan flags a window it can't make.
J11: estimates and change orders
What they said, and what's really there.
- What they said: the request describes the job in the client's words, generated from the household's real needs (WK1) seen through their personality:
| Personality | "How long is it?" (real × bias) | Size words | Forgets to mention |
|---|---|---|---|
| Fussy | ×1.2 ("dreadfully long") | accurate | nothing |
| Normal | ×0.9 | roughly right | sometimes the side strip |
| Relaxed | ×0.6 ("a bit long" = 15 cm) | "smallish" | the back garden, now and then |
| DIY | ×0.8 ("just a trim") | accurate | the bits they "already did" |
| Show-off | ×1 | generous ("our grounds") | nothing; adds wishes (stripes) |
- The estimate: par from what they said × the district rate (economy.md). Small jobs (under ~90 work minutes, grandma's street, most suburbs) get one price, and the descriptions there are close to the truth. Bigger jobs show a range (±25%) and you pick your quote (haggling as J7).
- Email clients attach a photo: a small render of the lot from the street at request time. Size becomes exact; the height is still their word.
- Seeing it: looking at the lot (walking past, a ride past it on DY2, or a short site visit you book: 15 minutes plus the drive, free to the client) stamps the sheet seen with the real numbers. Leads you noted (WK6) are already seen.
- On site, at the knock: if the real par is more than 15% above what you quoted, the sheet flags worse than described and you can ask for a change order ("It's twice as long as you said. Another $30?") through the negotiation model (J7). True claims get accepted more (fussy and fair clients nod; stingy ones say "A deal's a deal"). Ask before you start: once you've mowed, they refuse more ("You should have said before"). Or eat it.
- Lighter than described: keep the money, or be honest ("Less work than we thought: $10 off") → mood up, a bigger tip, better word of mouth. Honesty pays slowly.
- The quote is a fixed price (hourly work: J28).
Needs: J10, WK1 · Done when: a relaxed client's "a bit long" under-reports the real height, a seen stamp replaces their words with the real numbers, a lawn more than 15% worse than quoted is flagged at the knock, and a change order asked after mowing is refused more often than one asked before.
J12: reasons with follow-ups
Every request has a reason (J1 gives each a deadline and a reason line). Most are routine; the rest set a deadline, a mood, what a rush is worth, and what happens after.
| Reason | Deadline | Pays | Afterwards |
|---|---|---|---|
| Routine ("it's that time") | the visit window | the quote | may become a regular |
| Party / BBQ (show-offs love these) | the day before the party | rush +25%; tips for stripes | the guests hear of you: awareness on nearby lots |
| Selling the house (open house Sunday) | before the open house | the realtor pays, on time | new owners move in ~2 weeks later: a new household with no provider (a lead) |
| HOA / council letter (a fine on Friday) | the fine's date | rush +25%; relieved | the HOA wrote to the whole street: a burst of requests there |
| Back from holiday ("it's a jungle") | none | heavy; change orders likely | |
| A surprise ("for my wife's birthday, she's back at 5") | a time on the day | a big tip if she doesn't see you | an away job with a hard end; a gag if you're still there at 5 |
| Their mower broke / a bad back (DIY) | soon | the quote | often a one-off; sometimes "can you just keep coming?" |
| New baby ("quiet tools only") | battery tools only (SN3); a quiet-tools regular |
- Rush pricing: for a tight deadline you can quote up to +50%, and they accept rush prices more easily.
- Missing a reason's deadline is worse than a normal no-show: the party happened on a jungle (−reputation, a 1-star review, the street hears).
- Reasons come from the household (seeded events: parties, sales, holidays) so they're the same on every machine; WK9 (the wedding in the hills, the storm) builds on them.
Needs: J5, J10 · Done when: a household's seeded party books a deadline the day before it, a house sale brings new owners as a lead about two weeks later, and an HOA letter brings a burst of requests on that street, all the same on two instances.
J13: on site
Home or away, from the gate to the money.
The visit
- Arrive and unload (TU7: the curb, the car's boot). Look at the lawn before you knock if you like. A home client may warn you at the gate ("Mind the sprinklers, dear") or not (chattiness).
- Check in: knock (home) or open the gate (away). The job's stage becomes on site; this is when a change order is asked (J11).
- Walk the lawn (pick up what's on it, J33), fuel and start, work the tasks (the tool pages; the trimmer is optional polish), take the add-ons you accept.
- Sign-off: the walk-round (below).
- Pay: the quote (economy.md), minus damage at cost, plus a tip. At the door (EC8 for who collects), an envelope, or an invoice (economy.md).
Home clients
- They answer the door, warn you or not (chattiness); the sheet keeps what they said.
- They watch, react, chat (today's
ClientReactions), come out once with an add-on (below). - The walk-round: press F to call them out; they point at 0-4 things by personality (fussy: tufts, ragged ends, fringes, clippings, torn tips, scuffs; normal: missed strips, clippings, scalps, damage; relaxed: damage only; DIY: technique and the direction streak; show-off: stripes). Fix it now (the clock runs) or leave it (satisfaction: tip, review, round, word of mouth). The host picks the points; any sibling can fix one; crews get a written summary.
Damage
Billed at cost by the client (economy.md); insurance comes later (insurance.md).
| Damage | Cost |
|---|---|
| Gnome | $25 |
| Garden light / pot | $20-25 |
| Greenhouse pane / shed window | $60 |
| Car paint chip | $150 |
| Car window / wing mirror | $90-300 |
| House window | $180-350 |
| Conservatory / glass door | $600-1,200 |
| The neighbour's window | the neighbour bills you, and awareness drops on that lot |
| Hose | $25 |
| Sprinkler head | $18 |
| Toys | $5-20 |
| A phone | (handing a found phone back = a tip) |
- Never game over: instalments (taken off the next visits) or work it off (a free visit).
- Grandma's street forgives the first window, once per save ("My Harold broke that window twice, dear").
- The household remembers (the glued gnome).
Away clients
- Many households are out on weekdays (work.md, and the neighbours' schedules); they book any time and say so.
- Access is on the sheet: a gate code (you type it on the keypad), the key under the flower pot, the side gate open, "keep the gate shut: the dog's in the yard".
- No knock: the gate starts the job. Nobody watches, nobody comes out.
- They come home at a seeded time (~17:30) and look: the same walk-round points, judged without you, from the lawn as it is then (lawn memory). Their verdict arrives as an evening text or voicemail, then the review.
- Pay: an envelope under the mat (cash; the sibling who picks it up holds it; a relaxed client's envelope may be short with a note: "rest next time!"), or an invoice once registered.
- Change orders and add-ons go by note or text; no answer by the evening = the original price.
- The dog home alone: it follows you, barks at the engine, leaves poop (mowing.md). Leave the gate open and it gets out: the client's evening call is not a happy one (finding it: J32).
- An after photo sent to an away client lifts their mood before they get home (J14).
"While you're here..."
- Their ask: once per visit, with a chance by chattiness, a home client comes out 30-60% of the way through with an extra taken from the household's real needs: the hedge, the edges, the back lawn, the weedy bed, the green pool, the verge in front of the neighbour's house. Away clients leave it as a note on the door.
- Priced on the spot (par × rate, a new line on the sheet). Yes, now (more money; the day plan updates and may show you'll be late for the next window), next visit (books it), or no thanks (no penalty; a fussy client minds a little). If the tool isn't in the car, only "next visit".
- Capped at about half the job's size, so a mow doesn't become a day.
- Your pitch: at check-in or when collecting pay, pitch something you noticed on their lot (a lead, WK6; economy.md cross-selling), through the negotiation model.
When you can't finish
Rain, a breakdown, nightfall, out of fuel: pause the job. A note goes on their door (or a text); the lawn memory keeps what's done; the job goes back on the calendar inside its window (or the next one); you're paid when it's finished. Mood −0.1 (less if you said why; none for rain). An away client who comes home to a half lawn without a note writes the review.
Needs: J10, J11, J12, TU7, EC8 · Done when: on two instances, an away job is let in by the gate code, the dog follows, the add-on note is taken, the client's evening verdict arrives on both.
J14: before/after photos
- Your phone's camera (a key; holding the phone shows a viewfinder). Photos are taken in the world, of anything.
- A before is taken on a client's lot before you check in or start; an after after sign-off from about the same spot (within ~3 m and ~25°) with the lawn filling at least a third of the frame. A matching pair is a before/after.
- The pair gets a score: how much changed (height, coverage), the finish (stripes, missed spots), the light (sun behind you, golden hour), a bonus for a photobomb (the client's dog, a sibling posing).
- What good pairs do:
- Your website shows a gallery (best 12): each good pair raises the website channel's reach (WK3).
- Starzly: a review with your photo carries more weight with leafy-avenue and hills households.
- Flyers: a "before & after" flyer design (needs one good pair) converts better.
- Away clients: send the after photo (mood up).
- Grandma and mom ask for photos now and then (they're proud; dad isn't, yet).
- Stored as small JPEGs next to the save (~15 KB each), the best 24 plus each client's latest; in co-op a photo travels once to the host (it's company property).
Needs: J13 · Done when: a before and an after taken from about the same spot make a scored pair, a good pair shows in the website gallery and raises its reach, and a guest's after photo reaches the host's website.
J15: grandma keeps recommending you
A small friends top-up each time you visit or call her at the retirement home, as long as her own lawn looks good ("I told the bridge club about you, dear").
J16: Mrs. Higgins, the voice of the street
Mrs. Higgins becomes your first regular and the street's gossip: she tells you who's looking ("The Kowalskis' lawn is a disgrace, go and knock") until you have an ad.
J17: who told whom
The first few algorithm calls name who sent them, so you can see your word of mouth spreading from house to house; later, a little map of who-told-whom on the computer.
J18: explaining the calls
The end-of-day report says where today's calls came from: "Calls today: 3: 2 word of mouth, 1 your ad".
J19: a finite market
Fewer new calls in a district where you already serve most households, so growth means moving to new streets (WK4's market share).
J20: rivals on every channel
J6's answer timer, extended to the other sources: paper wanted-ads, email (a 10 h timer), face to face. Multipliers on the time before a rival takes a request: by district (grandma's street ×2: only Kyle; suburbs ×1; leafy ×0.8; hills ×0.7; GreenCorp ×0.6), by personality (relaxed ×1.5, fussy ×0.8, bargain hunter ×0.7), a client who already likes you ×2, and by difficulty (×1.5 / ×1 / ×0.75, DF5).
J21: competitive quotes
From the suburbs up, some clients "get a few quotes"; you see who else quoted and why you won or lost ("Kyle said $10", "GreenCorp can come tomorrow", "your reviews"). Needs rivals with a price level and capacity.
J22: rivals in town
Their vans parked on lots, yard signs ("Another lawn by GreenCorp"), flyers in letterboxes ahead of yours, their stripes to judge; a lawn Kyle botched is a lead. Cheap once work.md tracks each lot's provider.
J23: rival arcs
Old Walt sells his round when he retires (buy his client list, or fight for it); Kyle becomes your first hire; GreenCorp starts a price war in your best district.
J24: referrals
Pass a job you can't fit to Walt for a finder's fee; late game, GreenCorp's overflow comes to you.
J25: a phone of your own
Answer on the go: the car phone (DY2) on the road, then a phone of your own (an item + a monthly plan) that answers voicemails and ads anywhere, mid-job, so you lose fewer requests while you work. A natural partner to J6's timer.
J26: the wrong lot
House numbers are on the sheet and the mailboxes; mow No. 23 instead of 25 and the neighbour is delighted (pays half) or furious, while your client still waits.
J27: deposits for big jobs
A deposit up front on the biggest jobs, so a cancellation doesn't leave you with nothing.
J28: hourly quotes
Hourly work instead of a fixed price, for commercial sites.
J29: disputes over unpaid work
A client who won't pay, and what you can do about it.
J30: landlords with several lots
One client, many gardens.
J31: more uses for photos
Before/after pairs (J14) on van wraps and in the paper's "local business" column.
J32: the dog gets out
An away client's dog that got out through the gate you left open is a little event of its own: find it before the client gets home.
J33: walk the lawn: hazards per household
Before you mow you can walk the lawn and pick up what's lying on it. It's optional; skipping it is a gamble. What is on a lawn is seeded per household from its lot and personality (work.md): families leave toys, dog owners poop, leafy avenues and the hills have pop-up sprinklers, rough lawns stones; a lost phone is rare. A chatty client tells you at the gate, and the job sheet keeps what they said. Poop bags are a supply ($3 for 50). What the mower does with each hazard is the mower page's (docs/game/mowing.md).
J34: clippings: bins, sacks and the green waste site
- The client's green bin holds ~1.5 bags (90 units) and is emptied on the district's bin day (a seeded weekday).
- Then reusable garden sacks ($8 for 3), one van cell each (car boot 3×4, small van 5×4), taken to the green waste site in town, $3 a sack.
- A jungle is a logistics job (15+ sacks, several trips); mulching skips it.
- Higher up the ladder: trailers, on-site compost, crews.
J35: par from the lawn
A job's par comes from its lawn grid, with a stock Classic 46 as the reference (MO1), × the district rate (EC1): that is the fair price J7 negotiates around. Bag runs and walking the lawn count in the par.
J36: mowing up the ladder
What a mowing job is, and the skill it asks, at each tier of GA1's ladder:
| Tier | What mowing is | The skill |
|---|---|---|
| 1. Neighbours | 80-300 m², grandma's mower and a file, kids' toys, stones near the greenhouse | clean lines, walk the lawn, glass on the left |
| 2. Regulars | weekly rounds in a new direction each week; stripes for show-offs | speed, rotation, a mower built for the round |
| 3. Commercial | service levels, zero-turns, crews, inspectors, a fleet to service | planning, maintenance |
| 4. Prestige | the pitch before kick-off, greens at 4-5 mm | precision under a deadline |
Ride-on controls (for GA7's ride-ons on the job):
- Lawn tractor: a seat, hands on the wheel; mouse X / left stick steers, W/S or the triggers = the pedal, the mouse wheel = the deck lever, click = blades. Its collector holds 220 units, emptied into a trailer.
- Zero-turn: two lap bars; assisted by default, true lap bars on gamepad / as an option; spinning on wet grass tears the turf.
J37: the mower goes anywhere
The mower lives in grandma's garage and goes wherever you push it; lawns live in the world, not in a separate job scene. Designed with the user on 2026-10-02, to be proven by a prototype (J37a) before it's scheduled. It is the first step towards an open world later: everything rests except where a sibling is working.
- RestingEvery lawn starts as the cheap decorative grass (
YardGrass). It grows and shows what you left (GR6), but it can't be mowed. The whole town can rest at almost no cost. - PreviewKnock on the door and the lawn loads for real. You walk the garden and see its true state (height, weeds, hazards, the dog's toys) while the client names a price; you negotiate there, face to face, with the same negotiation model as the phone. This is where the client's words meet reality (J11, J13). Other jobs (hedges, a pool) join the preview when their trades come.
- ActiveA booked job's lawn is ready on its day, loaded and drawn by distance for performance. Arrive any time that day, push the mower on and mow; the job's clock, tasks and score run; you get paid at the door when you're done (EC8). A deal at the door can be "can you do it now?": the preview turns active on the spot.
- Grandma's lawn is always allowed: no booking, no knock; push the mower onto it and it turns active.
- Leaving writes the lawn's memory (MO1) and the lawn goes back to resting, showing what you left (GR6).
- The swap is invisible: resting and active share the same tufts (GR3), so nothing pops.
- Back gardens sit behind a side gate: opening it loads the garden, the gate hiding the moment it appears (a closed portal). Front lawns are open and simply swap.
- Unasked mowing: a resting lawn can't be mowed, so you knock and ask (J37b). No griefing.
- Co-op: each sibling can work a different lawn at the same time, so siblings split up on the street without separate scenes; at most one active lawn per sibling. A job accepted by anyone appears on grandma's calendar for everyone, and any sibling can do it. The sibling who knocks handles the conversation from start to finish; the result goes through the host as a command so every machine agrees, but nobody asks the host player anything.
- Far districts: their lawns load as you arrive after the drive; the same lawn site as on grandma's street.
- In the MVP booked jobs need no knock (TU7 becomes arrive and unload); knocking for new work (J37b) joins the MVP if the prototype (J37a) succeeds.
- People: each client's five traits (CH7, CH9) and grandma's contact book (CH12) live in Characters: the family, the street, the clients; J37b-J37e use them.
J37a: the lawn site prototype
The first slice, kept if it works: the job logic (clock, tasks, score, the client watching, results) leaves the Garden scene and becomes a lawn site that can live anywhere. Grandma's front lawn in the hub swaps from resting to active when you push the mower onto it and back when you leave; Mrs. Higgins' lawn is a booked job, active on its day. One active lawn at a time here; two at once is J37f, the next item.
- The street is open, the town later (the user, 2026-10-03): every lawn on grandma's street can be a lawn site in the hub. Far districts stay a trip the whole company takes together (CO6): the Garden scene becomes a far place hosting one lawn site with the same code, so driven jobs keep working. The whole town as one world (no loading, siblings in different districts) comes after the MVP, with J37.
- No single-lawn assumptions, so J37f and the town can follow without a rewrite: every lawn site has an id;
CellSync, garden events and garden object ids carry it; the stripe map and its shader values are per lawn, not globals; nothing new readsMissionController.Instance,FindAnyObjectByType<Lawn>or the static object lists as "the" lawn; the host owns and simulates every active lawn, wherever it is. - Co-op "where": a lawn site turning active in the hub is a host command and a state flag, not a scene change; the scene-name "where" message stays for far places.
- Mrs. Higgins' lawn comes from her lot: built from the hub's planned lot next door (lot 26: her house, path and beds as the town draws them, seeded), not from the generator's own house at the world origin.
- Grandma's lawn: pushing the mower onto it starts the family job; the gnome start goes (its note's text follows).
- The swap may show a small pop between the hub's grass and the real lawn (the user, 2026-10-03); the invisible swap is J37g.
- Cases: walking off a lawn writes its memory (MO1) and rests it; a client's job left without knocking is paid next morning (EC8); quitting mid-job loses that visit (saves are at MN2's save points); a late joiner gets the active lawn's snapshot; a sibling who drops out leaves their cut cells; throws land in the hub (the street, parked cars, neighbours' windows) under MO3's rules.
- The frame rate, measured in a macOS dev build at 1080p (the editor is too noisy): first the hub's baseline on Low and Medium before any change, then with the active lawn.
- Build in verified steps, each committed: (1) the baseline; (2) grandma's lawn active in the hub, solo, then both siblings on it; (3) Mrs. Higgins' lawn from her lot, active on its booked day; (4) a far job through the same lawn site in the Garden scene. A later attempt picks up from the last committed step.
- The fallback: if step 2 or 3 can't hold (the frame rate, the co-op check, or the move doesn't fit in the session), revert the move, move J37a, J37f and J37g after the MVP with a roadmap history line, write what was found here, and build TU7, J1 and EC8 on job scenes made seamless (a short blink at the lot, the same knock-to-finish and receipt). Decide early: by half the session, not at its end.
- It's the natural place to swap the result screen for EC8's verdict and receipt, since both touch how a job ends.
- Built without a stop (the user, 2026-10-03): the build judges the measurable half itself and the user gives the feel verdict when they test the finished MVP. J37b (knocking for new work) stays out of the MVP until that verdict.
Needs: MO1, GR3 · Done when: in a macOS dev build at 1080p with grandma's lawn active, 2-3 neighbour lawns in view and traffic, the hub runs at 60 fps or more on Low and no more than 10% below its baseline; both siblings mow grandma's lawn in the hub with guest mismatches 0; Mrs. Higgins' booked lawn turns active on its day on her own lot; a far job still plays through the same lawn site; and the size of the move is written down here (what left the Garden scene). The user's verdict (does pushing the mower out of the garage feel better than the gnome start?) comes at the MVP test; then J37 gets a version.
J37b: knocking on doors
Unscheduled work: knock on a door and ask if they need anything (lawns in the MVP, the other trades as they come).
- Yes or no depends on the household's real need and the person: a jungle lawn means a likely yes, a striped one a likely no, so reading the street is a skill. The answer is worked out from the seed (the same on every machine).
- Yes loads the preview (J37): walk the garden, hear the client's price, then accept it or negotiate, with the same negotiation model as the phone. "Can you do it now?" makes it active at once; otherwise it's booked for a day. "First one's free" is one of the offers (once per household).
- Pacing: each household answers at most once every few days, so knocking can't bypass the offer model (J1).
- A failed negotiation costs: push too hard and the door shuts; that household won't hear from you for a while and remembers the price you asked.
- Regulars skip the preview: you already know their garden.
- One sibling handles the whole talk; a sibling nearby hears it.
Needs: J37a · Done when: knocking on three doors of grandma's street gives answers that follow each lawn's state and each person, a yes leads to a preview and a negotiated job, a hard bargain shuts the door for days, and both machines see the same answers.
J37c: time windows and temperament
- A booked job has a time window as a property ("the afternoon suits me"). The expectation is said (on the phone, at the door, on the job sheet); the reaction is hidden: arrive early and, depending on the person, they're happy, annoyed for a reason, or not at home.
- Learnable, not random: the same person always reacts the same way, so regulars become known; tells hint at it (a grumpy voice, a "No soliciting" sign, curtains drawn); what you learn goes into the contact book (CH12; the tells are CH11). Reactions come from the seed, the same on both machines.
- The job sheet shows what the client said (window, deadline, reason), never their temperament.
- The wrong day: go to a client booked for tomorrow and they say so ("You're booked for tomorrow, dear"); ask "Can I do it now?" and a flexible client moves the booking, a rigid one says "Tomorrow, as agreed."
- The start signal: on a booked lawn with no knock, the client comes out or waves from the window with one line ("Oh good, you're here!"): that voice says the job has started. No popup.
Needs: J37a, DY1 · Done when: two clients with different temperaments react differently, and each the same way every time, to the same early arrival; the wrong-day visit offers to move the booking; the job sheet never shows a temperament.
J37d: strict hours
Rarer, better-paid jobs with a hard constraint and its reason ("my daughter's wedding!"):
- An appointment: "be there at 14:00, I'm leaving at 15:00 to let you in"; late breaks it.
- A deadline: "done before the party at 16:00"; arriving early is the way, which is a planning decision.
- Sized from the job's par time: one game hour is 2 real minutes (DY1) and a job takes several, so a deadline is only offered when it's reachable by arriving on time and working well.
Needs: J37c · Done when: strict jobs are rarer and pay more than soft-window ones, every offered deadline is reachable at par, and missing one is felt.
J37e: rain and bookings
- Rain on a booked day: depending on their temperament the client calls to postpone, otherwise you call them. Postponing is always accepted and free: rain is nobody's fault.
- A strict deadline can't move: the client asks you to come anyway (wet grass is heavier, clumps and ruts, WE3), with a bonus if you go, or cancels without blame.
Needs: J37c, WE4 · Done when: a rainy booked day brings a call or lets you call to postpone at no cost, and a deadline job in the rain offers the come-anyway bonus or a blameless cancel.
J37f: two lawns at once
Siblings split up on grandma's street: each works a different lawn at the same time (at most one active lawn per sibling), for example one at Mrs. Higgins' while the other mows grandma's. It stands on J37a's per-lawn ids; this is where they're proven. If it fails, J37a's one lawn at a time stays (siblings mow together, as co-op works today) and the build writes down what broke.
Needs: J37a · Done when: two siblings mow two different lawns on grandma's street at once, each lawn ends
with its own memory, stripes and score, guest logs show mismatches=0, and the frame rate still meets J37a's bar.
J37g: the invisible swap
The hub's resting grass (YardGrass, 0.42 m tufts) and the active lawn (0.3 m cells) share the same tufts and
placement, so a lawn turning active or resting never pops (J37's "the swap is invisible"). Polish for after J37a.
Tuning
Starting numbers, all fields of OfferTuning (J1) unless the idea is later. The size mix (J1), talk by score (J1),
urgency bands (J1), expectation words (J3), personality bias (J11), reasons (J12) and damage costs (J13) are their own
tables.
| Name | Value | Idea | What it does / why |
|---|---|---|---|
base | 0.2 calls a day | J1 | people who just find you: the floor |
friendStart / friendHalfLife | 1.0 / 7 days | J1 | Mrs. Higgins' friends: the onboarding push, gone by week 3 |
| Friends seed by her line | ×1.0 / 0.7 / 0.4 | J2 | "Amazing, dear!" / "Very nice." / "You're learning, dear" |
| First algorithm day | at least 1 call | J2 | the start always rings |
womPerJob / womHalfLife | 0.2 / 10 days | J1 | each finished job adds 0.2 × talk calls a day, halving |
| Co-op sources | ×(1 + 0.5 per extra sibling) | J1 | the sources other than word of mouth; to tune in EC5 |
weekday Mon..Sun | 1.2, 1.0, 1.0, 1.0, 1.1, 0.7, 0.3 | J1 | busy Mondays, quiet Sundays |
tallyUp / tallyDown | 1.5 / −2.5 calls | J1 | an extra call when unlucky by more than 1.5; one held back when lucky by more than 2.5 |
| Expectation S / M / L / XL | 80 / 85 / 90 / 94% | J1 | grandma's street, suburbs, leafy avenues, the hills |
talkAtExpectation / talkMin / talkMax | 0.5 / −1 / 1.5 | J1 | met = a polite word; the range of talk |
missedDeadlineTalk | −1 | J1 | a missed deadline or no-show warns people off |
| Trust per job met | +1 | J1 | the track record |
needM / needL / needXL | 5 / 20 / 50 | J1 | trust each size needs (S needs 0) |
| Size fade-in | from half the need to 1.5× | J1 | bigger gardens come in gradually |
trustShortfall / shortfallPoints | −2 / 10 points under | J1 | a job well under the expectation |
trustMissed | −3 | J1 | a missed deadline or no-show |
urgencyPow / callbackUrgencyPow | 1.6 / 2.5 | J1 | mostly relaxed calls; callbacks calmer still |
windowDays | 5 | J1 | deadline = round(5 × (1 − urgency)) days at 17:00 |
| Tomorrow / today deadlines | from 75% / from 95% urgency | J1 | a time tomorrow, a time today |
callbackMin-Max | 10-16 days | J1 | when a client calls again |
| Callback chance met / under / well under | 85 / 50 / 10% | J1 | |
| Finished late | delight −0.5 | J3 | started but not done by the deadline |
| Stars once registered | 1★ well under, 2★ under, 3★ met, 4★ delight ≥ 0.33, 5★ ≥ 0.66 | J3 | Starzly fills in at registration |
| Expectation bands | ≤ 80 / 81-87 / 88-92 / ≥ 93% | J3 | easy-going / neat / particular / perfectionist |
| First haggle buttons | +10% / +25% | J3 | before J7's price and day |
adLine (cost, floor) | 0.6 calls a day ($5 a day, floor 0.3) | J4 | |
adBoxed (cost, floor) | 1.0 calls a day ($10 a day, floor 0.5) | J4 | |
adFatigue | ×0.9 a day it keeps running | J4 | readers get used to it |
| Dad's tip | day 2 or 3 | J4 | |
halfLifeMax / halfLifeUrgentFactor | 360 min / 0.125 | J6 | half-life = 6 h × 0.125^urgency |
| Rival timer hours | 8:00-19:00 | J6 | nobody takes a call at night |
| Voicemail life | its deadline, or 19:00 the next day | J6 | whichever comes first |
ceilingBase / ceilingUrgency / ceilingSooner / ceilingReferral | 10% / 40% / 20% / 10% | J7 | the price room (J3 uses the first two) |
| Sooner | 1 today, 0.5 the day after (deadline later), 0 on the deadline day | J7 | availability pays |
| Counter-offer | fair + half the ceiling | J7 | once, after a refusal |
fastTalkBonus | +0.2 | J7 | done the same day they called |
belowFairTalk | ×1.25 | J7 | "such a nice young man" |
barRises | +5 points × delight (at most +5) | J7 | referred clients expect more |
| Tips | up to 20% with delight | J7 | |
secondChanceBar | +5 points | J8 | |
rainDay / afterRain / afterRainDays | ×0.6 / ×1.3 / 2 days | J8 | the grass grew |
season | 1.0 (late spring) | J8 | e.g. early spring 1.3, high summer 0.8, autumn 0.6, winter 0.1 |
| Arrival windows | Morning 8:00-12:00, Afternoon 12:00-17:00, Any time 8:00-17:00 | J10 | |
| Late | 15 min grace, then mood −0.05 per started 15 min (cap −0.3); phoning ahead halves it | J10 | |
| Very late | 2 h at a home client: "We had to go out" | J10 | rebook, or a no-show if you never called |
| Early | up to 30 min fine | J10 | earlier: the dressing gown and a small dip |
| One price below | ~90 work minutes | J11 | small jobs; bigger ones get a range |
| Estimate range | ±25% | J11 | |
| Site visit | 15 min + the drive, free | J11 | |
| Worse than described | real par > 15% above the quote | J11 | flags a change order |
| Rush | up to +50% (reasons +25%) | J12 | tight deadlines |
| New owners after a sale | ~2 weeks | J12 | a lead |
| Add-on ask | 30-60% of the way through, once per visit | J13 | |
| Add-on cap | ~half the job's size | J13 | a mow doesn't become a day |
| Away client home | ~17:30 (seeded) | J13 | |
| Paused job | mood −0.1 (less with a reason, none for rain) | J13 | |
| Photo pair | within ~3 m and ~25°, lawn ≥ a third of the frame | J14 | |
| Website gallery | best 12 pairs | J14 | |
| Photo storage | ~15 KB each, best 24 + each client's latest | J14 | |
| Rival multipliers | district ×2 / 1 / 0.8 / 0.7 / 0.6; personality ×1.5 / 0.8 / 0.7; likes you ×2; difficulty ×1.5 / 1 / 0.75 | J20 | |
| Email timer | 10 h | J20 | |
| Poop bags | $3 for 50 | J33 | |
| Green bin | ~1.5 bags (90 units), emptied on bin day | J34 | |
| Garden sacks | $8 for 3; 1 van cell each; $3 a sack at the site | J34 | car boot 3×4 cells, small van 5×4 |
| A jungle | 15+ sacks | J34 | several trips |
| Lawn tractor collector | 220 units | J36 | into a trailer |
Co-op
- State: the offers (
JobOffer, thenJobwith its stage, sheet fields, quote and change orders, window,takenAt, home/away, add-ons, paused progress), the luck tally, trust, the friends seed, ad days, finished jobs' word of mouth, the photos index: all in company state. - Ownership: the company (host-owned). Any sibling answers the phone or calls back; the sibling who checked in is the visit's lead; anyone can quote, take add-ons and fix walk-round points.
- Host-only: the morning roll (offers, reasons,
takenAt), answering checks (by the host's clock), change-order and add-on rolls, away clients' verdicts, the walk-round points. - Randomness:
SimRandom(seed, day / request uid / household, salt)with named salts (Offers,OfferPick,Urgency,Haggle,RivalTake; laterClientWords,AddOn,AwayReturn,ReasonRoll; SD2). Nothing fromUnityEngine.Random. - Channel: offers travel as company updates (
NetCompany); answering, calling back, quoting, change orders and add-ons are commands. - Packets: job records are small; photos are ~15 KB once, sent in chunks.
- Late joiners: with the save.
- Secrets:
takenAtlives on the host only (a guest can't peek). - Cinematics: none.
- Save: see Tech.
- Voices: Mrs. Higgins (J2); first lines per personality (quick / close / taken), change-order replies, add-on asks, away clients' evening verdicts, late-arrival lines (voiced and subtitled, UI7).
- Checks: the same seed gives the same calls on two instances; a guest answers an ad in time and the job shows on the host; the same late call is taken on both; a guest takes the after photo and the host's website shows it. Co-op balance: J1's sibling multiplier.
Tech
Who owns what
This page owns the job: the opening path, where offers come from and how many, what each offer is (size, urgency, price room), answering, negotiating, and the visit itself (walk-round, damage billing, hazards, clippings logistics).
- work.md owns the full market (households on lots, all channels, market share, regulars, leads); J1-J9 are its first slice.
- economy.md owns prices, rates and money (EC1 the fair price, EC4 crews, EC5 the balance pass).
- day.md owns the clock (DY1) and travel (DY2); weather.md the rain.
- The tool pages (docs/game/mowing.md, grass.md) own the tasks inside a job and what the mower does with each hazard; sound.md owns quiet hours (SN3); difficulty.md the presets; garden.md the ladder (GA1) and ride-ons (GA7).
- Client behaviour (personalities, humour, how they talk, what they complain about) gets its own page; until then there is one neutral client.
What the code has today
- Requests:
ClientRequest(CompanyRecords.cs): mission id, source (paper / voicemail / email), posted day,expiresDay, a visit window in days (fromDay..toDay),payFactorfrom haggling, status, booked day.Company.Clients.csgenerates requests per day (GenerateRequests: known clients revisit, paper ads, big clients by mail), books them, rolls haggling (HaggleOdds/HaggleRoll: ×1.25 / ×1.1 / refused, deterministic) and writes reviews from theMissionResult.RespondToRequestCommand; UI inHubPaperPhone(paper, answering machine, calls) andHubComputer(shared reply buttons). - Missing: nothing competes for a request (it just expires); the price is exact before you've seen anything; no time of day; every request is the same "my grass is long"; nothing happens on site between arrival and the result.
- New game:
NormalizeV4(Company.Day.cs) auto-books grandma's lawn (m00) for day 1 with dad's welcome voicemail, then callsGenerateRequests, which always puts a first paper ad on day 1 (J2 turns that off). - Grandma's lawn: the gnome station starts m00; the first completion sets
StoryIds.GrandmaGardenand posts grandma's verdict call (ClientTexts.GrandmaGardenVerdict, by stars): where she asks about Mrs. Higgins (J2). - Mrs. Higgins: text only (m00's
watcher, door notes, lines in grandma's and mom's calls). No mission, no lot, no voice clips. Lots on grandma's street: 22 Hendersons, 23 Kowalski, 24 grandma, 25 Parker; No. 26 is free. - Gardens: only the 15 hand-made missions (m00-m14) can be mowed; nothing turns a street lot into a job yet. A job is done on its booked day, any time; the scene starts on arrival (street jobs at the gate, TU6).
- Par: MO1 works out par from the grid (stock Classic 46), shown in the sandbox only; jobs keep their own par (J35).
- Score: no 0-100 job score; the result has coverage, task progress, incidents,
clientMood, 0-3 stars. The result screen shows pay, tip, stars, reputation. - Stars show on the result screen, the hub toast, job cards, Starzly and the company page; registration
(
SaveData.registered,RegisterCompanyCommand) gates none of them yet. - Clock: day-based with stepped minutes (DY1 isn't built); messages carry fixed morning timestamps.
- Weather:
Calendar.WeatherOn(day)(sunny / cloudy / rain) exists in the Sim. - Tests:
Assets/_Game/Tests/EditModeis the Sim-only test assembly (~336 tests).
Data
OfferTuning(J1): every number in Tuning.JobOfferrecord: uid, day, call minute, channel, size, urgency, deadline (day + minute) and reason line, expectation, referrer's delight, household lot, fair price,takenAt, status. It replacesClientRequestfor new offers, and grows into theJobrecord with stages (J10).- Company state gains the luck tally, trust, the friends seed,
offersOn, ad days, and finished jobs' word of mouth (day, talk, size, delight). - Photos (J14): small JPEGs in a folder next to the save.
Save
- J1-J9: a version bump; open requests become offers (urgency 0%, a 5-day deadline, a fresh timer); finished clients
seed word of mouth and trust from their history;
offersOnis true for old saves; stars already shown stay visible for old saves. - J10+: a version bump (jobs replace requests; the photos folder). Open requests become jobs at stage Request with a fresh timer; booked ones become Booked with "any time".
Sandbox pieces (docs/dev/sandbox.md)
The F1 "Jobs" tab: post a request (source, urgency, personality), skip the clock, force home/away, force an add-on,
show takenAt; J9's sliders, dry-run graph and JSON export.
Tests and checks
- J1-J9: same seed → same calls on two instances; the balance tests (J1, J9); the trust gate (no L offer below
trust 10); accept chance at the ceiling ≈ 50% over 1,000 seeds; a missed deadline cancels and costs trust; nothing
from the algorithm before Mrs. Higgins is done; a voicemail returned before
takenAtalways wins; no stars visible before registration; a second chance met restores the old job's talk and trust. - J10: late by 40 min = −0.15 (−0.075 if called); the day plan flags a missed window.
- J11: a relaxed client's "a bit long" under-reports; a change order asked after mowing is refused more often.
- Two instances: the Co-op checks.
Balance check (simulator)
The model above (with second chances and the season at 1.0), 200 runs per strategy for 35 days: solo, 8 working hours a day, 30 minutes per job for unloading and getting paid, voicemails returned within 90 minutes, 15% rain days, offers accepted only if they fit before their deadline, earliest deadline first. Money is gross (before fuel, supplies and bills). The simulator (J9's figure) assumes per size: S 60 work minutes, no drive, $30; M 120 minutes, 30 minutes' drive, $85; L 240 and 40, $260; XL 420 and 50, $560; a price of fair × (1 + half the ceiling); 70% of calls arriving while you're out (voicemails); scores of 98 ± 2 (perfect), 92 ± 4 (good), 86 ± 4 (minimum), 75 ± 8 (sloppy).
| Days | Calls a day | Jobs a day | Earned a day | Sizes appearing |
|---|---|---|---|---|
| 1-7 | 2.0 | 1.5 | $65 | S, first M |
| 8-14 | 3.6 | 2.6 | $164 | M common, first L (~day 15) |
| 15-21 | 6.6 | 3.3 | $234 | L regular; you start declining |
| 22-35 | 9.0 | 3.4 | $227 | first XL (~day 27); ~3 declined a day |
| Strategy (35 days, line ad days 3-10 unless said) | Earned |
|---|---|
| Perfect work (98%) | $6,990 (first L ~day 13, XL in 6 of 10 runs; good work: 3 in 10) |
| Good work (92%) | $6,370 |
| Minimum (86%) | $5,760 (first L ~day 19, XL rarely) |
| Sloppy (75%) | $1,610 (word of mouth stalls, never past S/M; second chances at a higher bar fail again) |
| Good, no ad | $5,970 (slow first week: $47 a day) |
| Good, boxed ad every day | $6,500 |
| Good, voicemails returned after 5 h | $4,630 (rivals take the urgent ones) |
This matches economy.md's pace (1-3 small jobs in week one, suburbs by week two) and work.md's arc (more calls than one pair of hands can take from week three, which is when crews make sense). Solo income plateaus around $230 a day: the next step up is crews (EC4), not more calls. The EC5 simulator tunes it for real.
Open questions
- What each client cares about: Characters: the family, the street, the clients says how picky, haggly, chatty and touchy a client is (CH7, CH9); what they look at and complain about (edges, stripes, clippings) for the walk-round (J13) is still open.
- The exact half-lives and multipliers: the EC5 simulator.
- Does a solo player hear voicemails during a job (the car, DY2) or only at home until they own a phone (J25)?
- How many away clients per district (schedules from WK1)?
- Rivals as real firms (J21-J24) are still to discuss; the suggestion is rivals in town first (cheap, visible), then Walt's round sale (one story beat), then competitive quotes with GreenCorp.
Rejected
- Independent coin flips for the number of calls: they give streaks (two empty days in week one for almost every player). A seeded Poisson draw with the luck tally instead (J1).
- Better work raising the fair price: the fair price never moves (EC1); quality buys calls and price room, and raising prices is the rate card's job after registering.
- Stars from the first job: quality stays hidden until the company is registered, felt through words, tips and gossip; the stars fill in at registration (J3).
- Rolling the rival when you call back: calling back twice or reloading could change the answer.
takenAtis rolled once when the call arrives (J6). - Fixed haggle odds (+25% / +10% / hang up): replaced by one rule from the urgency and how soon you come (J3, J7).
- Difficulty presets as second copies of the numbers: presets are multipliers on top of
OfferTuning.