What shipped
Newest first. Short entries — what you can now do, and whether it fully works yet. The longer stories about how any of it went live on the blog, and the how-does-this-work pages are in help.
-
The backup bar only speaks when it has something to say
A thin line above the tab bar used to report "64 changes saved here, waiting to back up" — which is to say, nothing is wrong and the queue has not gone yet. It said that almost all the time, and because it floats above the page, whatever you scrolled past sat underneath it for a moment. On one screen it printed straight across a heading. We spent longer than we would like trying to make that overlap readable — padding, a different kind of sticking, a lighter tint — before measuring it properly and finding the text underneath was already perfectly legible. The problem was never that you could not read it. It was two sentences in the same place, and no amount of shading fixes that. So the line is gone in the one case where it was only ever reassurance. It still appears when it has news: backing up now, waiting on a signal, or a backup that did not go through. If nobody tells you there is a problem, there is no problem — and the count is still on your profile whenever you want to look.
-
The chat knows what a hardening day is, not just which one you are on
Tell the chat "I took my plants out yesterday and today and brought them back in yesterday" and about one time in three it argued: that would be before you took them out, can you walk me through the order? What you described is two completely ordinary days — out in the morning, in that evening, out again the next day. The cause was oddly specific. The chat is handed your hardening schedule, so it already knew which day you were on and how long the step was. Nobody had ever told it what a hardening DAY is: that the tray goes out and comes back in on the same day. Without that one fact, a routine reads as a contradiction. It has the sentence now, so you can describe two days in one breath and it follows you. Worth saying how this was found, because it is the part that changes what we ship next: our own testing caught it, not a second report. We keep a set of real questions and run each of them against the live chat several times over, because it does not answer identically every time — and a fault that appears on one try in three is invisible to anyone who asks once.
-
The chat stops ignoring the variety you picked
Ask when a tomato will be ready and the chat answered with the range for tomatoes — 52 to 90 days — while the plant's own page answered with the figure for the variety you actually chose: Cherokee Purple, 80 days. Same plant, same afternoon, two answers, and the chat's was the one throwing away the choice you took trouble over. That is the second time in a week we have lost that same piece of information; the first was a sync bug that never carried your variety off the phone at all. Both screens read the variety now, and both fall back to the crop range when we hold no figure for it. The gap this closes is not small: across the catalog the middling difference between varieties of one crop is about 30 days, and at the extreme it is Purple Sprouting broccoli at 220 days against Melody at 24, from the same crop record. One thing it still refuses to do is convert between the two ways a figure can be counted — from sowing, or from planting out. Those differ by the whole time a plant spends indoors, six to eight weeks on a tomato, so where a variety records the one its crop does not, the honest crop range stands instead of a converted guess.
-
The orange tree stops getting tomato advice
Somebody with a potted orange told us its tasks were vague and generic. One of them was worse than generic — it was wrong. "Pinch out suckers where branches meet the main stem" is what a sucker means on a tomato. On a grafted citrus, the shoots that matter come from below the graft union, and doing what that sentence said would have had somebody cutting the tree's own branches off. The right instruction already existed. Whoever researched the orange had written it down — rub or snap off the shoots below the graft union, because those are rootstock, not your orange — in a notes field nothing on screen ever read. So a crop can now carry its own wording for any task, and the general sentence becomes the fallback rather than the winner. The same tree was also being told to give it "about an inch of water at the base", from a figure our own data marks as a guess, for a plant that can stand thirty feet tall. Citrus is soaked deeply and occasionally, not watered by the inch — the sources say so, which is exactly why none of them state an inch figure. Trees and bushes no longer print a weekly inch when the number is ours rather than a source\u2019s; they get the honest instruction to feel the soil instead. Thirteen crops are affected, all of them woody. A sweep of the other 151 crops found around 60 more places where somebody wrote a specific instruction that a generic one is currently talking over. Checking a sample by hand suggests roughly a third are genuinely wrong rather than merely less detailed. Those are next.
-
The hardening page said "ready for the ground" and "add eight more days" about the same plant
Both sentences were true and neither should have been on the screen alone. One was counting the calendar — ten days have passed and the last night is behind you. The other was counting the log — how many of those ten days the tray actually spent outside. A run really can be both finished and thin, because the days pass whether or not you are home for them. The page just had two halves that each knew one of those things. It now says it in one breath: "the 10 days are up, but it was outside on 3 of them", and the recommendation underneath agrees with it. Fixing that turned up a worse one underneath. The last step of the week is the overnight — you leave the tray out, so there is no bringing-in to record — which meant that day had no hours on it and got filed as a day we could not read. So a gardener who did all ten days exactly right finished on nine out of ten and was advised to do an eleventh. Every correct run was being penalised for being correct. "We could not read it" is gone too. It described our processing rather than the garden; it now says what it means, which is that the day has no time coming back in. Two smaller things. The way into the hardening page was a line of gray text that happened to be a link, and it is the only way in — it is a real control now. And "planted it out" is "transplanted" everywhere, which is the word an American gardener uses and the one our own records have always used underneath.
-
The plant page stops promising a harvest after the frost
Add a tomato in the middle of August and its plant page laid out ripening on 1 November and harvest on 6 November — while the home screen of the same app, in the same session, said 69 days to frost. That is 21 October. Sixteen days before the harvest we had just promised. Both numbers were already on screen and nothing had ever compared them. Now, where a plant reaches a date past your first frost and it is a plant a frost genuinely ends, the plant page says so on the first date it applies to: "Your first frost is usually around Oct 21 — before this." The dates stay. It is a comparison, not a forecast — we are not saying the plant will die, because a tomato under fleece in a warm autumn does fine and you know things about your ground we do not. The chat answers "when will things be ready?" from the same rule and the same sentence, so the two cannot drift apart. Hardy crops are deliberately left alone: a kale harvest after the first frost is ordinary and often better, and those are measured against your first hard freeze, which is a different and later date. And if you have not pinned your garden the sentence says it is comparing against a typical zone 6b rather than your own — because a warning built on a guess should not read like one built on your garden.
-
The same damage is not the same problem on every plant
A leafminer tunnels between the two surfaces of a leaf, which is why nothing you spray on the outside reaches it. On spinach or lettuce that is your crop ruined — you cannot cut around a tunnel and serve the rest. On a sunflower or a tomato it is a few marked leaves on a plant carrying hundreds, and it changes nothing about what you pick. Same insect, and only one of those is a problem you need to do something about. Photo answers now judge it that way: damage to the part you are growing the plant for gets told to you as a problem, and the same damage anywhere else gets mentioned plainly as something worth knowing, with no alarm and nothing to do. It is a rule rather than a leafminer rule, so it covers a chewed leaf on a carrot, a blemish on tomato foliage, and a spotted outer cabbage leaf you were going to trim anyway. Being straight about how well it works: on our own test photographs it lands about one time in three so far. We know why — the answer is never actually told which part of a plant it is grown for, so it has to infer that a sunflower is not a leaf crop, and sometimes it does not. That is the next thing to fix, and it is a plumbing job rather than a wording one.
-
The sign-in button could stick on "Sending…" for ever
Tap "Email me a code" at a moment your phone could not reach us and the button went to "Sending…", switched itself off, and stayed there — no message, nothing left to tap, and no way out but closing the app. On the one screen whose whole job is letting you in. It comes back now and says which thing happened: "You are offline" when your phone knows it has no connection, and "Could not reach us just now" when it thinks it does — a phone on café wifi reports itself online while nothing gets through, and blaming your signal for our outage would send you looking for a better place to stand. The cause was not the sign-in screen. The file that talks to our server promises it will never crash a screen, and three of its calls quietly broke that promise, so we fixed the promise rather than the one screen — which turned out to also fix "Sign out on this device", which had been silently doing nothing at all with no signal. Your garden was never at risk in either case: it is written to the phone first, always.
-
The two suggested questions now promise a shape, not just an answer
Tap "What should I do this week?" and you get one line per job, most overdue first, and then it stops. Before this it named the right jobs and wrapped them in four paragraphs — correct, and far longer than the answer. Because we know what those two buttons are asking, each one now carries its own instructions about how to answer: how long, what order, what to leave out. A question you type yourself gets none of that on purpose, since forcing a list onto "why are my tomato leaves curling" would be worse than letting it answer properly. Editing the words before you send makes it your question again. Fixing this also caught something worse: asked what to do this week, the app would sometimes offer to set four reminders for the four jobs it had just listed — reading them off your own list and treating them as new requests. Asking what to do is not asking to be reminded.
-
The week screen lost four things that were not earning their place
The row of bars across the top is gone. It answered "which days are busy", and six of its seven columns were empty — not on a quiet week, but on most weeks, because most of what a garden asks for has no date at all. A watering check is due when the soil dries out, not on Tuesday, so it lands on today along with nearly everything else. A chart with one column of data is a number in a costume, and the number was already printed next to the word Today. The second season chart is gone too. Its own caption said what was wrong with it — "established plants, this is their usual year, not a countdown" — a picture of a normal year for plants that are not racing anything, in the same shape and colors as the chart above it and carrying a second copy of the same color key. The part of a perennial's year you can act on was already just below, with dates on it. The chart for this year's crops stays, because it is the only place the app tells you a plant you already own will not finish in time. That warning used to be a collapsed orange box further down with a Hide button on it. It is now a line under the chart that draws the same plants, which is where you are already looking. And the Start button at the foot is gone, which began as a bug: it read "Start all 6" and one of the six was a winter pruning job dated 30 December. We built the fixed version and every honest count disagreed with the word on the button, because this screen's Today column is not a list of things to do today — it is everything without a date. Every row is still one tap into that job, and the Start that means something is on your daily list. Two smaller things while we were in there: the chart no longer hides a single row behind a "+1 more" button taller than the row, and a job due today no longer sits under a label reading Today four points below a heading reading Today.
-
"Transplant on Wednesday" — the card now reads the weather
The hardening card ends with one line telling you what to do, and it changes with where the run actually is. Mid-week it counts what is left: three more days of hardening off. If the ten days ran but you only managed a few of them, it says what we would add first — in our words, as a suggestion you can decline, because nobody has published a rule for missed days. Once the week is genuinely done it looks at your forecast against the crop's own cold floor. Tomatoes should not sit out below 50°F, and that figure is sourced per crop. Cold tonight and warmer on Wednesday, and it says transplant on Wednesday. Cold all week and it says so rather than naming a day it cannot see. The rule we would not bend: if there is no forecast, or ours is more than twelve hours old, it will not clear you to plant. It tells you the plant is ready and hands the cold question back. "Transplant now" with a frost coming is the worst sentence this card could produce, so the weather is allowed to stop it and never to assume on its behalf.
-
Ask when something will be ready and you get dates, not "a couple of weeks"
We hold a sourced days-to-maturity window for 111 of our 152 crops, and none of it was reaching the chat — so when you asked when your tomatoes would be ready, the AI was guessing with nothing to guess from. It now gets your own planting date plus that window, already worked out into real dates: "typically ready 5 September to 13 October". The sums are done by the app rather than the AI on purpose. Adding fifty-two days to a July date is something a language model gets right most of the time, and most of the time is not good enough for a date you plan around. It also carries what the window is counted from, because fifty-two days from sowing and fifty-two from transplanting are weeks apart. Forty-one crops have no window, and a plant with no planting date cannot be worked out — it says so instead of estimating.
-
You can turn alerts off
There was no way to turn notifications off from inside the app. Not a hidden one — none. The code that unsubscribes a phone had been sitting there since alerts were built, under a comment reading "Turning it off must never fail", and nothing had ever called it. Your only route was your browser or phone settings. Profile now has it, under Alerts. It says "this phone" on purpose: it unsubscribes the device you are holding and tells our server to forget that device, so if you also have the app on a tablet, that one keeps its own setting. Wiring it up found a second problem worth naming. The unsubscribe function waited on the app\u2019s background worker being active — and on a phone where it is not, that wait never ends. So the first time anyone pressed the new button, nothing happened at all, silently, with no error. It now asks whether a worker exists rather than waiting for one, and the app forgets locally before it talks to the server, so the switch always does something you can see even if the network does not answer.
-
Your frost date, against the ones five miles away
Setup already told you your last frost. It now shows you what that same date is five miles north, south, east and west of you, with the difference in days — your own figure in the middle, the neighbors around it. On the address we tested, five miles west is eleven days earlier and five miles east is thirty-four days later. That is a month and a half of spread inside a ten-mile box, and a ZIP code would have handed every one of those gardeners the same date. We have been saying that in a sentence since the beginning; this is the first time anyone can see it. It refuses to perform where it would be dishonest. We built the obvious version first — your own square and the eight touching it — and threw it away after measuring: neighboring squares give the identical date in four of five places we tried. The difference lives at miles, not yards. And in genuinely flat country the screen says so plainly rather than inventing a difference, because everything nearby giving the same week is worth knowing too.
-
Your own messages were hard to read, in both themes
Everything you type in the chat sits in a colored bubble. For a few hours today that bubble was filled with a pale lavender that was never meant to be a background — it is the color we use for text on a dark page — and the white words on top of it measured 2.4 to 1, well under the readable standard. It is fixed. The cause is one we have now hit three times in a single day, and it is worth explaining because it is the least obvious kind of bug. A line of styling can name a color that does not exist yet, and carry a spare instruction to fall back on. For as long as the color has no name, the spare applies and everything looks right. This week we started naming our colors properly, so that the app could offer a light theme as well as a dark one. Each name we defined switched off the spare in every line that had been quietly relying on it. Nobody edited the chat. Nobody edited the panel of past conversations. They changed because something else went right somewhere else. We have now found and fixed three, and there are nine more lines in the app naming colors that still do not exist. They all look correct today. Each one will change the day its name is defined, with nothing in the change that made it happen to say so, which is why they are being dealt with now rather than when somebody reports one.
-
The app can warn you about a hot night for eggplant now — and we found only one crop we could add
A hot night is the failure you never see coming. The plant looks fine, the flowers open, and then nothing sets fruit — because pollen goes sterile overnight when the plant never gets to cool down. Until now the app could only warn about eggplant on a hot day, which is half the problem. Minnesota Extension says eggplant flowers poorly when nights go above 70°F, so that is what we now watch, the same as we already did for tomato, pepper and the squash family.
The honest half is what we did not find. We went looking at thirteen crops and came back with one number. Extension services publish daytime temperatures and then describe the nights in words — beans get "over 95°F" for dropping their flowers and no night figure at all, on the same pages that hand tomatoes a day and a night figure in the same sentence. Peas get flower loss described with no number anywhere. So for those crops we have written down that we looked and there was nothing to find, which is more useful than leaving it blank — nobody has to go and read those same pages again.
Nine crops are now watched for hot nights. Thirty-six that we watch on a hot day still have no night figure, and we would rather tell you that than let you assume the app is watching something it cannot see.
-
A plant whose bed disappeared is no longer counted and hidden
If a bed vanished — usually because it was deleted on another device and the change came down mid-way — the plants that lived in it stayed in your garden but stopped appearing on the screen. The heading still counted them. You would read "20 plants", scroll the whole page, and find fifteen, with nothing to tell you the other five existed or where they went. They now appear under "Bed missing", with the count matching what you can actually see, and each one opens where you can give it a new spot.
-
A variety name you typed yourself now follows you to another device
Pick a variety from our list and it has always traveled with your garden. Type one in — because the thing you are growing is not in our catalog — and it stayed on the phone you typed it on, forever. It saved correctly, it went up with the rest of the plant, and our side had nowhere to put it, so it was quietly dropped on arrival. On one device this looked perfect; the name was there, the plant was named, nothing was wrong. It only showed up the first time somebody opened the same garden on a second device and found the name missing. That is now stored and sent back like everything else. Nothing you typed was ever lost from the device you typed it on, and it will go up the next time that phone syncs. We also added a check that fails our build if any future field is saved on a phone and never read on our side, because this one was invisible to three checks we already had.
-
A hardening day you already logged can be corrected — including its date
Tap the times on any day in the run and you can change them, and change which day it was. Logging a day late is at least as common as logging it short, and until now the app could only fix the clock. If you move a day onto one that already has an entry it refuses and names the day in the way, instead of merging the two into a day that never happened.
-
Entries logged before you pinned your garden now get a stage — and say they were placed later
Every journal entry records roughly where the plant should have been on that date. That is worked out from your frost dates, so an entry written before you pinned your garden had nothing to work it out from and was left blank — permanently, because we never recalculate a stage once it is recorded. That rule is there to stop us second-guessing something you observed, and it was never meant to protect a blank. So when you add your location, those blank entries get filled in. Each one says it was worked out later, and that wording is deliberate: a stage recorded on the day is better evidence than one placed afterwards from dates alone, and we are not going to let the second quietly pass for the first. We only fill in the ones that were genuinely blank. An entry we already placed is never touched, and one for a crop we hold no stage model for stays exactly as it is.
-
We called a strawberry a woody plant. Every number on the page was correct.
**Our fruit-tree care page counted 26 crops and called all of them woody.** One of them is a strawberry, which is a soft plant about eight inches tall and not woody by any definition. **And the same page said the four crops with no pruning job were "the brambles and grape" — which is three.** The fourth was the strawberry, and we did not name it. **What makes this worth writing down is that we checked every number on that page and all six were exactly right.** 26 crops, 22 with a pruning window, 19 with a feeding date, the seven without named correctly, 25 with a first-harvest range, one spray window. Not one was off by so much as a single crop. **The counting was right and the word attached to it was wrong**, which no check we own can catch — a number can be tested against the data, and "woody" cannot. **Fixed:** the page now says fruit crops rather than woody fruit crops, names all four that have no pruning job, and says plainly that the strawberry is in the group because it is a fruit, not because it is a bush. **If you grow strawberries, nothing about your jobs changes** — they never had a pruning job and still do not. This was our description being wrong, not your plants.
-
You can fill in a hardening day you forgot to tap
The line counting your week is now a button. Tap it and every day of the run is a row with its date; a day nothing was logged on shows in orange and offers "I did this day". Say roughly when it went out and came in and it is recorded on that day, not today — with the times starting on the step’s own window, so a day that wanted eight hours does not quietly get logged as three. Until now a day you did but did not tap stayed missing for good, and the app went on recommending extra days to make up for a gap that never happened.
-
When the app does not know what time something happened, it now asks instead of guessing
Two places on the hardening card were quietly writing down the current time and presenting it as fact. Correcting what time a tray went out: type eleven at night by mistake at midday and it silently recorded midday, with the label agreeing and nothing saying it had changed your answer. It now tells you that time is still to come and leaves your record alone. Same underlying problem as the bring-in question fixed earlier today — the app could not say when, so it substituted now.
-
Photos and their answers now come back on a new phone
Sign in on a second device and your photos appear, along with what we told you about them. Until today they did not, and the reason is an odd one: nothing was ever lost. The pictures were safely on our side, the plant came back, the journal entry came back, and the entry even knew a photo was attached — but nothing in the app ever asked for the picture itself, so a new phone showed a garden with no photographs in it. The answers were worse off: every diagnosis was saved on our side and read back by nothing at all, so the one thing in the app that takes real work to produce was the one thing a replaced phone lost entirely. Both now arrive. Photos load as you look at them rather than all at once when you sign in, because pulling a season of pictures down on a phone plan is not a restore, it is a bill.
-
Telling the chat you put the trays out now counts as the day
Say "I took the trays out this morning and brought them in at four" and it records that day of hardening off, the same as tapping the button. The row on the card says "Hardening off" now instead of "Written down", so you can tell it is going to count before you tap. The gap it closes was a strange one: those sentences were already being understood correctly and filed with the right date — they were landing on no plant. "All my plants" and "the trays" name no crop, so nothing was attached, and a day you genuinely did came out as missed. When you describe putting them out or bringing them in without naming a plant, it now means the trays that are actually on a run. Only then: "watered all my plants" still means all of your plants, because watering is not part of the run. Name a plant and the plant wins.
-
The app had no way in on a device you had not used before
Open GardenTrack on a new phone or a laptop and there was no sign-in anywhere on the front page. Not hidden, not hard to find — not there. Every place that offered you an account only appeared once you already had plants saved on that device, so the app looked complete to anyone who had used it before and had no visible way in for anyone who had not. The front page now says it plainly, under the button for adding your first plant: "Sign in or start an account — so your garden survives a new phone." It sits below the main button rather than in front of it, because you do not need an account to use this — adding plants works with none — and it disappears the moment you add your first plant. Profile also now says "sign in" rather than only "back up my garden": our own help page had claimed that was already true, and it was not.
-
The chat can see which day of hardening off you are on
It could not, and it asked. Somebody told it they had taken their plants out and brought them back in, and got back that it could not look up the hardening-off schedule — followed by "which day are you on?" The app was running a ten-day schedule for those exact trays and keeping count. The chat simply had no way to see the count. It is handed the same thing the Harden screen shows now: which day of how many, what today's step is, how long they have been outside, and how cold is too cold for that particular crop. It comes off your phone rather than being worked out again on our side, which is why the two cannot disagree — there is one count, and the chat is reading it instead of guessing. Asking a gardener for something the app already wrote down is the one thing this app is supposed to never do.
-
Our download said a plant was “tender”. It knew the actual temperature and did not tell you.
**The free plant database now carries the frost numbers themselves** — the temperature a crop takes damage at, and the one that kills it. 1,447 records have the first and 739 have the second. Until today the file only said `frost_sensitivity: tender`, which is a category, not a number. **We had the number the whole time.** **And the notes explaining the gaps now ship with them.** When we cannot find a frost figure we write down which extension pages we read and what they actually said. Forty-two of those notes existed and reached nobody — the field they hang off was not in the file, so neither was the explanation. **A gardener saw no number and no reason there was no number**, which looks exactly like not having checked. **We had decided to hold these back. We changed our mind — here is the argument.** Our own export code carries a list, field by field, of what we keep out of the free download and why. Frost temperatures were on it: *a number that only does work against a forecast*, with the plain word — tender, hardy — as the version a person acts on. **That was wrong in one specific way: it assumes we hold the only forecast.** You have a weather app open on the same phone. Reading *tonight, 30 degrees* against *peppers die at 32* is not a computer joining two inputs. **That is you, deciding whether to go out and cover them.** **And "tender" is a label, not a number.** It does not tell you whether to cover at 33 or at 29. A label is only useful to somebody who already knows the translation, which is not the person asking. **What settled it:** we published a piece called *Nobody publishes the temperature your vegetables die at*, and it told you the whole database was free and that the 124 crops with no kill temperature would say so rather than show a blank. **That was not true when we wrote it.** It is true now — 124 crops, exactly, each one carrying the note of which pages we read. Writing a story about nobody publishing a number and then not publishing it is not a position we wanted to defend. **And we got here badly, which is worth saying.** We first shipped this calling it an oversight, on the grounds that no decision existed. One did, in the same file, 350 lines below where we looked. **We missed a considered decision and called it a mistake** — then argued the point properly and reversed it on purpose. Written up as decision D-113. **Also fixed, in the same pass:** forty-two British spellings that had been riding into the download inside those notes — *judgement*, *behaviour*, *colour*. Our spelling check covers that folder and had never once read the file, because it did not open `.json`. It reported a clean pass every time. **Three separate layers of the same check were skipping it**, and each one looked green.
-
The mic stops when you pause — now it says so, and you can carry on
Dictation ends after a break in talking, and until today nothing told you that or told you what to do about it: the box just went quiet and it looked like a fault. Now the heading says "Tap the mic to keep talking", a line under the box tells you your words are saved, and the button itself says "Keep talking" instead of being a small icon next to a large Send. What you say next is added to the end rather than replacing what is there. We cannot make it wait longer — the browser has no setting for how patient it is during a pause, and on Android the one that looks like it would is documented as having no effect. We could have made it restart itself, and did not: Android beeps every time the microphone opens and a website cannot turn that off, so pausing to think would mean being beeped at for thinking.
-
Two different facts about a tomato were sharing one box. One of them kept getting thrown away.
**Our plant records had a field for a plant’s shape** — bush, vining, upright — the thing that tells you whether to build a trellis. **And 133 varieties were using it to store something else entirely:** whether the fruit arrives all at once or keeps coming until frost. **Those are two different questions, and there was one box.** So a variety whose seed catalog answered both lost one of the answers. **Three tomatoes show exactly what that cost.** Husky Cherry Red, Patio and Tiny Tim each have a note quoting the catalog on both counts — *"dwarf indeterminate habit"*, *"dwarf determinate"* — and in every case the fruiting half was dropped, because there was nowhere to put it. **That is the fact our variety pages use to tell you whether you get one big harvest or a steady trickle**, so those three showed you nothing. **Fixed by giving fruiting its own field.** All 133 moved across carrying their original source, so nothing was re-researched and nothing invented. The three got their lost answer back from notes we already had. **The download now has both, and a variety can finally say it is a dwarf plant that fruits until frost**, which was impossible to record yesterday. **What we did not do is guess.** Those 133 varieties now have no shape recorded, because we never actually had one — the box held the other fact. **We would rather show you a blank than a number we made up**, and working the shape out from a plant’s height is exactly the kind of guess our own rules forbid. **And the bug had grown a feature on top of it.** Our variety picker groups tomatoes under "Vining" and "Bush" — shape words — but the note under each one reads *"keeps growing and fruiting until frost"*, which is about fruiting. **It had been reading the fruiting fact and labeling it as shape for as long as it has existed.** A test caught it the moment we separated the two. Nothing changed on screen; the same tomatoes sit under the same headings, and now the app is reading the field that actually holds the answer.