- The page a client stares at while we hunt for them stopped being a progress bar and became a field they can watch people move across. This is the designer's prototype rebuilt one to one, and it is the biggest single thing on the day: an open band with six columns that are the hunt itself, Searched, Reviewed, Shortlisted, Contacted, In conversation, Top matches, and every talent is a face that travels left to right as something real happens to them. The counts are milestones reached rather than a live headcount, so the numbers only ever go up. The first two columns read the search's own tally, so Searched fills first and is never sitting at zero while grading is already climbing behind it; the reviewed crowd is drawn as anonymous silhouettes, because we genuinely do not know those people yet; the shortlist wears real faces and real names. Underneath it, nothing new is being invented: every figure on the field is derived from the same anonymised progress snapshots the old page already had, so this is a different way of showing what we knew rather than a new pipe of data. The whole previous look went with it, four components and their leftovers deleted rather than left to rot.
- And on that field the search plays by the client's clock instead of a timer, which meant changing what is true on the talent's side too. This is the honest half of the experiment. There is no collection window and no last call, so the search never reveals itself on a countdown: the client ends it, by comparing what they have or by wrapping it up. Every estimate that arrives is shown to them the moment it lands, including one that sits outside the brief, which is MARKED as a partial fit rather than declined and pushed back for a re-quote. That is a promise the talent's side has to be able to keep, so the agent who talks to talents was given a block saying so in as many words: never tell somebody their estimate will be held back or re-reviewed before the client sees it, because on this arm it will not be. The same day it stopped warning talents about a door they had already walked through, since "waiting for a response may affect your chances of making their shortlist" was reaching people whose estimate was already in front of the client. And a wrapped-up search now reopens on its own settled field, read only, showing where every person actually got to instead of parking all eighteen of them in one pile.
- Then it went to QA twice in one afternoon, and both rounds came back with everything. Ten findings in the first, all fixed: notes meant to stack that sat exactly on top of one another, a header whose third element quietly broke the layout, a card that appeared centred over the very thing it was describing, a button that had lost the single line that makes it clickable, and a refresh that flashed the previous question before the real one loaded. The second round is the one worth naming, because two of its three items are about a screen that will not hold still. An open card was following the tiny breathing animation of the avatar it was anchored to, so it visibly shivered; it now moves only when the anchor genuinely moves. And the stacked notes fan like a pile of paper, each leaf peeking out above and to the side, which is what they were meant to do all along. Plus a product decision: comparing your matches happens in place now, over the proposals already on the wire, without ending the search, and the early-reveal machinery that used to sit behind that button was deleted rather than left dormant.
- Two admin pages were timing out in production, and the reason paging had not fixed them in August is now a rule with a number behind it. Two alerts fired on Sunday. The people list had been paged a month ago and was still taking up to fourteen seconds, because paging bounds the rows you RETURN and not the rows the database READS: its sort order was an expression nothing could index, so all 158,000 people were evaluated before the top two hundred could be picked. Measured on a production-shaped copy, the first page took 71 seconds. Rewritten as two steps, pick the page by an indexed column first, then work out the extras for the two hundred that survived, it takes 220 milliseconds, and what it hands back is byte for byte what it handed back before. The project bundle export had a different shape of the same problem, up to a thousand attached records fetched over the network inside a ten-second budget, so it became a background job with a download at the end, exactly as the brief PDF did months ago. Three more whole-table scans turned up in the same audit, one of them a four-and-a-half-second page that is now a third of a second. The lasting part is the rule, written into the repo's doctrine: a query on a request is bounded by the page, never by the table, and a LIMIT proves nothing.
- A permissions page had been failing for four in every ten operators since Sunday afternoon, over a step nobody had written down. Retiring an area of the admin console is three steps, not two: take it out of the code, leave the old value legal in the database so the previous release survives the rollout, and then DELETE the leftover rows. That endpoint deliberately checks every stored row against the list of real areas, because an audit that quietly skips a row gives a confident wrong answer about who can reach what, so one surviving row is a hard failure rather than a missing line. Two retirements had skipped the third step, one of them since August. Both are cleaned up, and the three-step rule is now a test that fails the build instead of a paragraph somebody has to remember.
- One production machine in ten went sick, twice in the same day, and kept serving customers for an hour each time because nothing was checking whether it was alive. It was four to ten times slower on everything and froze outright for up to a minute and a half at a stretch, so every request that landed on it timed out, while its nine siblings were perfectly healthy. There is no way to kill a single machine by hand on this platform. There was also, it turns out, no liveness check on the web service at all, only a check that it had started. It now answers a health question every ten seconds and is pulled out of the fleet after three failures, roughly half a minute. The care is in what that check does NOT do: it reports a slow database or a slow cache as a degraded success, so a shared outage can never restart the whole fleet in lockstep, and its two probes now run at the same time rather than one after the other, so two hung dependencies cost one timeout instead of two.
- A maintenance job that has been shipping and logging politely for days had never once run, because a letter was being compared against a picture of a letter. The gate in front of it asked the database whether a table had been split into partitions yet, and that answer comes back as a raw byte rather than as text, so the comparison was between the letter p and a byte containing the letter p, and it was false for every table in existence, partitioned or not. So the tick fired on schedule, wrote a calm line saying it was waiting for partitioning, and did nothing at all: no archiving, no new partitions, nothing dropped. Caught on staging at the first tick after the migration landed. The fix is one word wide, and the test now guarding it is the first thing ever to exercise that check for real, because every existing test had replaced it with a stand-in.
- A talent who turned a project down over money was being filed as merely annoyed, so we said nothing and learned nothing. "This budget is too low for me", "below the price I would do it for", "ten dollars a video is well under my rate": every underpriced report since the third of the month turns out to be that one sentence, and the fix a few days earlier only covered the version phrased without a refusal. Now a price decline with no figure in it gets ONE short question, what is the lowest budget worth bringing you, and nothing is saved until an actual number comes back, because "underpriced" as a stored rule filters nobody. If they do not answer, we drop it for good. Beside it, two smaller manners fixes from real threads: a talent who set a floor, read it back and said "thank you" was having the whole boundary saved a second time, with both confirmation sentences printed again under a three-word reply; and somebody writing into a closed conversation was being told it was closed on every single turn. A courtesy line gets a courtesy line now, and the closure note is said once.
- And a floor stated in euros was being stored as the same number of dollars. Fifteen hundred euros saved as fifteen hundred dollars, because the only field that existed had "usd" in its name. The tool takes a currency now, the agent is told to pass the figure exactly as the talent said it and never to convert it himself, and the system converts at today's reference rate before saving. The part worth keeping: where no rate is available the figures are DROPPED and counted, not treated as a rate of one, because a wrong number shown back as saved is worse than nothing saved at all.
- A talent search put a woman's studio at the top of a brief that needed a male voice, off a gig title. The gig was called "record american male voice over". The sibling gig in the same catalogue read "record female voice over", and the seller's own name was "Grace Studio". Both facts were sitting in the record and neither reached the grader, because the card it reads carried the handle and one title, and a title is what a seller CALLS the work rather than who does it. The card now carries the display name and a line of the seller's other gig titles, and the rule says what to do with them: a catalogue selling both voices has confirmed that it sells both, which is a question to confirm at best, a failure where the name says otherwise, and never a pass on the title alone. Yesterday the same shape was a country standing in for a place; today it is a title standing in for a person.
- Every number a client states can be a range now, not only their budget. "Sixty to a hundred hours a month" used to be saved as a hundred. The delivery window, the workload, the rate, how long it runs, how many people, and the same on every phase of a multi-phase plan: each one keeps both ends. The existing value stays the high end, so nothing that filters, gates or sums changes at all and a single stated figure behaves exactly as it always did, while the low end is there for display and for what the agents read. The estimator proposes a delivery window and a rate band rather than one figure of each, an inverted pair is refused rather than quietly reordered, and the range prints wherever the brief is shown, including the version the talent reads.
- The card that puts Mira inside Claude looked wrong in both themes, was clipped at the top, and never told the model anything it had found. Four bugs behind one complaint. It was stamped light or dark once when it connected and never again, so switching theme left a dark card sitting in a white chat, and a host that sends no theme at all always got the light one. It never reported its own height, so the host laid it out on a guess and cut the top off. The third is the interesting one: the card polls and the model does not, so the assistant kept saying "still running, ask me to check" while the card beside it was already showing eighteen finished matches. It quietly hands the model what it has found now, which costs nothing until the next message, and on a genuine finish, matches ready, finalists revealed, a talent waiting on an answer, it speaks up on its own instead of waiting to be poked. Each of those wake-ups fires at most once, deliberately, and never for mere progress.
- Phones and small screens got a round of their own, mostly second passes on cards QA had sent back. The header shrinks rather than hides on short landscape screens, the same move iOS makes, because blocking rotation or hiding the chrome fails an accessibility rule outright. The docked message box collapses to one row on a phone, the attach control becoming the plus circle every other chat app puts there. The title finally gets the room an empty desktop column had been holding. The calendar card no longer vanishes on a refresh and leaves its buttons stranded in the transcript. Tapping an option no longer pops the NEXT question into the dock before Mira has even replied, which read as the app talking over itself. And a client can now choose how long the shortlist takes, two, four or eight hours, as a second step on the start card that morphs in place rather than cutting.
- The rest is instrumentation and housekeeping, and there is a lot of it. Our model provider raised the rate limits on this exact day and granted them per model with three ceilings each, so the readiness board stopped drawing one account-wide pair and gauges each model against its own three, amber at seventy per cent and red at eighty-five. The per-identity rate limiter, switched on for production last week, had been metered and charted nowhere: it has its own board now, including the one line that matters, how often it failed OPEN, because a sustained failure there means the limits are simply not in force. Where a project came from is one column and one grouping, so the four names Fiverr's own surfaces send are accepted verbatim and a hand-over keeps its identifier all the way through sign-in. The budget at which a client is handed to a human desk stopped being an environment constant and became a value the console sets, with a mandatory reason kept as history. And the debug screenshots testers keep losing now name their own failure: a real browser proved that a zero-sized box with a gradient aborts the entire capture, so the copy of the page is made renderable before it is drawn, and the next miss reports the exact error rather than leaving it in the tester's console.
A Tuesday of 27 commits, and the through-line is things that were quietly not happening. A maintenance job had been logging politely and doing nothing for days, because a letter was being compared to a picture of a letter. A production machine froze twice and served customers for an hour each time, because nothing had ever asked it whether it was alive. Two admin pages kept timing out a month after being paged, because paging bounds what you return and not what the database reads, which is now a rule with a 71-seconds-to-220-milliseconds measurement behind it. A permissions audit had been failing four calls in ten since Sunday, over rows a retirement forgot to delete. The card inside Claude knew the search had finished and never told the model, so the assistant kept saying "still running" beside eighteen finished matches. A talent turning a project down over money was filed as merely annoyed, so we said nothing; another said "thank you" and got the whole thing saved all over again. And the largest piece of the day is the opposite of all that: the waiting page became a field where a client watches real people move across six columns, shipped, sent to QA twice in one afternoon, and fixed both times before the day was out.