Game Mower wiki

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)
The algorithm: the sources add up to today's expected calls, a seeded draw with the luck tally gives the calls, and each call gets a channel, a size and an urgency

How many calls a day

Calls a day depend on what you did: jobs done and how well, your ad, the weather.

SourceCalls a day it addsNotes
People who just find you0.2the floor: someone always calls eventually
Mrs. Higgins' friends1.0 on day 1, halving every 7 days (× her line, J2)the onboarding push; gone by week 3
Word of moutheach finished job: 0.2 × its talk (below), halving every 10 daysthe engine: your work makes your calls
Your ad in the paperJ4grandma's street and the suburbs
Weekday× Mon 1.2, Tue-Thu 1.0, Fri 1.1, Sat 0.7, Sun 0.3
Weather, seasonJ8
  • 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.
Three weeks of calls at 1.6 a day, with pure coin flips and with the luck tally: roll again and compare the empty days

What each call is

  1. 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.
  2. Size: each channel has a mix, then trust filters it (below).
SizeWhatTypical price (EC1)People who find youFriendsYour adWord of mouth
Sgrandma's street, small suburbs lawns$20-4550%70%30%the talker's size 75%, one size up 25%
Msuburbs gardens$55-18535%30%55%
Lleafy avenues$150-40012%013%
XLestates in the hills$400-7003%02%
  1. 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).
  2. Urgency % and the deadline (below).
  3. 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).
Drag trust and pick a channel: the size mix of the calls it brings, bigger gardens fading in as the record grows

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.

UrgencyDeadlineExample reasons (the client's words)Price roomHalf-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%)TalkWhat it means
100%1.5they tell everyone
98%1.37the chance bonus
92%0.97a good job
85%0.5met the minimum: a polite word
~78%0silence
70% or less−0.5 → −1they warn people off
missed deadline / no-show−1
came the same day they called+0.2"he came within the hour!" (J7)
Pick a score and the client's expectation: what they say, how much they talk, what their friends expect, the trust and the stars it's worth

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.

  1. Grandma's lawn (O1): the tutorial mow, the family job (TU5). Unpaid; no offers yet.
  2. 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").
  3. "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).
  4. 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: GenerateRequests makes nothing new until offersOn (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 offersOn from the next morning.
  • Old saves: offersOn already 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 OfferModel replaces the new-client part of GenerateRequests: λ, 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.
ExpectationThey sayOn 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.
Drag the urgency and pick when you'll come: the deadline, the price room, the chance they accept a markup and the chance a rival took your voicemail

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 stub Weather.Rain01 until 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.json next 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 OfferModel the 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.
35 days of calls: pick your ad, your work and how fast you return voicemails, then edit any tuning value and watch it re-run

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).

StageWhat it meansWhere you see it
Requestthey asked; nobody has answeredthe paper, the answering machine, mail, a knock at your door
Quotedyou named a price; they're deciding (haggle)the call / the door
Bookeda day + an arrival windowthe fridge board, the calendar
Todayin today's day planthe calendar's day view, the watch
On siteyou checked in (knock, or the gate for away clients)the sheet in your hand
Pausedyou had to stop (rain, breakdown, dark)a note on their door, back on the calendar
Signed offwalk-round done (or they came home and looked)
Paidcash at the door, an envelope, or an invoice paidthe ledger
Afterreview, rebooking, word of mouth, photosStarzly, 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 wordsForgets to mention
Fussy×1.2 ("dreadfully long")accuratenothing
Normal×0.9roughly rightsometimes the side strip
Relaxed×0.6 ("a bit long" = 15 cm)"smallish"the back garden, now and then
DIY×0.8 ("just a trim")accuratethe bits they "already did"
Show-off×1generous ("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.

ReasonDeadlinePaysAfterwards
Routine ("it's that time")the visit windowthe quotemay become a regular
Party / BBQ (show-offs love these)the day before the partyrush +25%; tips for stripesthe guests hear of you: awareness on nearby lots
Selling the house (open house Sunday)before the open housethe realtor pays, on timenew owners move in ~2 weeks later: a new household with no provider (a lead)
HOA / council letter (a fine on Friday)the fine's daterush +25%; relievedthe HOA wrote to the whole street: a burst of requests there
Back from holiday ("it's a jungle")noneheavy; change orders likely
A surprise ("for my wife's birthday, she's back at 5")a time on the daya big tip if she doesn't see youan away job with a hard end; a gag if you're still there at 5
Their mower broke / a bad back (DIY)soonthe quoteoften 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

  1. 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).
  2. 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).
  3. 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.
  4. Sign-off: the walk-round (below).
  5. 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).

DamageCost
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 windowthe 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:

TierWhat mowing isThe skill
1. Neighbours80-300 m², grandma's mower and a file, kids' toys, stones near the greenhouseclean lines, walk the lawn, glass on the left
2. Regularsweekly rounds in a new direction each week; stripes for show-offsspeed, rotation, a mower built for the round
3. Commercialservice levels, zero-turns, crews, inspectors, a fleet to serviceplanning, maintenance
4. Prestigethe pitch before kick-off, greens at 4-5 mmprecision 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.

  1. 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.
  2. 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.
  3. 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 reads MissionController.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.

NameValueIdeaWhat it does / why
base0.2 calls a dayJ1people who just find you: the floor
friendStart / friendHalfLife1.0 / 7 daysJ1Mrs. Higgins' friends: the onboarding push, gone by week 3
Friends seed by her line×1.0 / 0.7 / 0.4J2"Amazing, dear!" / "Very nice." / "You're learning, dear"
First algorithm dayat least 1 callJ2the start always rings
womPerJob / womHalfLife0.2 / 10 daysJ1each finished job adds 0.2 × talk calls a day, halving
Co-op sources×(1 + 0.5 per extra sibling)J1the sources other than word of mouth; to tune in EC5
weekday Mon..Sun1.2, 1.0, 1.0, 1.0, 1.1, 0.7, 0.3J1busy Mondays, quiet Sundays
tallyUp / tallyDown1.5 / −2.5 callsJ1an extra call when unlucky by more than 1.5; one held back when lucky by more than 2.5
Expectation S / M / L / XL80 / 85 / 90 / 94%J1grandma's street, suburbs, leafy avenues, the hills
talkAtExpectation / talkMin / talkMax0.5 / −1 / 1.5J1met = a polite word; the range of talk
missedDeadlineTalk−1J1a missed deadline or no-show warns people off
Trust per job met+1J1the track record
needM / needL / needXL5 / 20 / 50J1trust each size needs (S needs 0)
Size fade-infrom half the need to 1.5×J1bigger gardens come in gradually
trustShortfall / shortfallPoints−2 / 10 points underJ1a job well under the expectation
trustMissed−3J1a missed deadline or no-show
urgencyPow / callbackUrgencyPow1.6 / 2.5J1mostly relaxed calls; callbacks calmer still
windowDays5J1deadline = round(5 × (1 − urgency)) days at 17:00
Tomorrow / today deadlinesfrom 75% / from 95% urgencyJ1a time tomorrow, a time today
callbackMin-Max10-16 daysJ1when a client calls again
Callback chance met / under / well under85 / 50 / 10%J1
Finished latedelight −0.5J3started but not done by the deadline
Stars once registered1★ well under, 2★ under, 3★ met, 4★ delight ≥ 0.33, 5★ ≥ 0.66J3Starzly fills in at registration
Expectation bands≤ 80 / 81-87 / 88-92 / ≥ 93%J3easy-going / neat / particular / perfectionist
First haggle buttons+10% / +25%J3before 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 runningJ4readers get used to it
Dad's tipday 2 or 3J4
halfLifeMax / halfLifeUrgentFactor360 min / 0.125J6half-life = 6 h × 0.125^urgency
Rival timer hours8:00-19:00J6nobody takes a call at night
Voicemail lifeits deadline, or 19:00 the next dayJ6whichever comes first
ceilingBase / ceilingUrgency / ceilingSooner / ceilingReferral10% / 40% / 20% / 10%J7the price room (J3 uses the first two)
Sooner1 today, 0.5 the day after (deadline later), 0 on the deadline dayJ7availability pays
Counter-offerfair + half the ceilingJ7once, after a refusal
fastTalkBonus+0.2J7done the same day they called
belowFairTalk×1.25J7"such a nice young man"
barRises+5 points × delight (at most +5)J7referred clients expect more
Tipsup to 20% with delightJ7
secondChanceBar+5 pointsJ8
rainDay / afterRain / afterRainDays×0.6 / ×1.3 / 2 daysJ8the grass grew
season1.0 (late spring)J8e.g. early spring 1.3, high summer 0.8, autumn 0.6, winter 0.1
Arrival windowsMorning 8:00-12:00, Afternoon 12:00-17:00, Any time 8:00-17:00J10
Late15 min grace, then mood −0.05 per started 15 min (cap −0.3); phoning ahead halves itJ10
Very late2 h at a home client: "We had to go out"J10rebook, or a no-show if you never called
Earlyup to 30 min fineJ10earlier: the dressing gown and a small dip
One price below~90 work minutesJ11small jobs; bigger ones get a range
Estimate range±25%J11
Site visit15 min + the drive, freeJ11
Worse than describedreal par > 15% above the quoteJ11flags a change order
Rushup to +50% (reasons +25%)J12tight deadlines
New owners after a sale~2 weeksJ12a lead
Add-on ask30-60% of the way through, once per visitJ13
Add-on cap~half the job's sizeJ13a mow doesn't become a day
Away client home~17:30 (seeded)J13
Paused jobmood −0.1 (less with a reason, none for rain)J13
Photo pairwithin ~3 m and ~25°, lawn ≥ a third of the frameJ14
Website gallerybest 12 pairsJ14
Photo storage~15 KB each, best 24 + each client's latestJ14
Rival multipliersdistrict ×2 / 1 / 0.8 / 0.7 / 0.6; personality ×1.5 / 0.8 / 0.7; likes you ×2; difficulty ×1.5 / 1 / 0.75J20
Email timer10 hJ20
Poop bags$3 for 50J33
Green bin~1.5 bags (90 units), emptied on bin dayJ34
Garden sacks$8 for 3; 1 van cell each; $3 a sack at the siteJ34car boot 3×4 cells, small van 5×4
A jungle15+ sacksJ34several trips
Lawn tractor collector220 unitsJ36into a trailer

Co-op

  1. State: the offers (JobOffer, then Job with 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.
  2. 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.
  3. 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.
  4. Randomness: SimRandom(seed, day / request uid / household, salt) with named salts (Offers, OfferPick, Urgency, Haggle, RivalTake; later ClientWords, AddOn, AwayReturn, ReasonRoll; SD2). Nothing from UnityEngine.Random.
  5. Channel: offers travel as company updates (NetCompany); answering, calling back, quoting, change orders and add-ons are commands.
  6. Packets: job records are small; photos are ~15 KB once, sent in chunks.
  7. Late joiners: with the save.
  8. Secrets: takenAt lives on the host only (a guest can't peek).
  9. Cinematics: none.
  10. Save: see Tech.
  11. 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).
  12. 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), payFactor from haggling, status, booked day. Company.Clients.cs generates 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 the MissionResult. RespondToRequestCommand; UI in HubPaperPhone (paper, answering machine, calls) and HubComputer (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 calls GenerateRequests, 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.GrandmaGarden and 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/EditMode is the Sim-only test assembly (~336 tests).

Data

  • OfferTuning (J1): every number in Tuning.
  • JobOffer record: uid, day, call minute, channel, size, urgency, deadline (day + minute) and reason line, expectation, referrer's delight, household lot, fair price, takenAt, status. It replaces ClientRequest for new offers, and grows into the Job record 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; offersOn is 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 takenAt always 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).

DaysCalls a dayJobs a dayEarned a daySizes appearing
1-72.01.5$65S, first M
8-143.62.6$164M common, first L (~day 15)
15-216.63.3$234L regular; you start declining
22-359.03.4$227first 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. takenAt is 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.
Source docs/game/jobs.mdEdited 2026-10-03