- The live rail kept blinking mid-search, and a search that was working read as a stuck one. Three separate dips, each a beat where the rail said it had finished while it had not. A turn can END with ATLAS committing the change that enqueues the next refresh, so until the turn closes the cards on the shelf are provisional: the glance card now lights its working face for the whole turn under its own updating line, outranked by the searching line once a refresh actually runs and outranking the settled prose. The enqueue is deferred by an eight-second debounce window and the handler only published running once the job STARTED, so a turn that did trigger a search settled the rail and re-lit it eight seconds later, which reads as the search stopping midway; the trigger now announces the queued refresh the moment it enqueues it, and a false-positive trigger settles the announced face rather than stranding it lit. And the announce itself shipped after the stream loop, so the wire order was complete then announce and the client settled the face the instant complete folded, leaving a hundred to four hundred millisecond dip in between; it now fires at the complete event INSIDE the loop, before that event is emitted, so the announce always precedes it and the face never dips. The ordering is pinned as a test rather than left as a property of where the code happens to sit.
- A tester filed the talent search as stuck, twenty-six seconds before the shortlist landed. Nothing was broken. The run took two minutes twenty-four and showed no sign of life for two solid minutes of it, which from the client's seat is the same thing. The cause is where the progress events are: the hunt was bracketed by one event before it and one after it, with everything expensive in between, and on the measured run the grading ran a hundred and twelve seconds across roughly two hundred and fifty model calls and published nothing at all. The waiting checklist takes its position purely from those events, so it parked on one row, and that row's label carries the POOL size, a number that lands once and never moves again: headline, ticks and count were frozen together. Discovery now narrates its own fan-out and publishes how many it has reviewed of how many as each chunk of grades comes home. Three things keep that honest rather than decorative. It is throttled to one event a second, because about twenty-five chunks finish in a burst and the client needs a moving number, not twenty-five messages in three seconds. The denominator is the round's FIRST pass only, because the second pass grades the survivors' remaining tiers and nobody knows how many that is until the first pass answers, so a total covering both would grow mid-round and walk the bar backwards. And a deadline skip shrinks the denominator and forces a final emit, because work that will never be graded leaves a total the run can no longer reach, and a bar parked at eighty percent for the rest of a search is the same bug again in miniature.
- The rail used to go looking whenever a turn happened to write anything down, and that is how a logo brief bought a hunt for fantasy-game talent. The trigger was seven state-writing tools, on the theory that committing state IS the instruction to go look. That theory has a hole: a tool call records a FACT, and a fact is not the same as a change in who we should be hiring. It broke in the way that costs money. A returning client's industry, site, dossier and research report carry into every new project by design, so on a project whose client had said only that they were not sure where to start, the agent read the PREVIOUS project's research, tagged the industry off it, and seventeen seconds later a full discovery round was hunting fantasy-game talent on an empty brief and empty preferences. Both of those tool calls were correct; neither meant go look for people. So the trigger is a JUDGMENT now: a new tool the agent calls at the end of a turn that materially moved WHO we are looking for, with a one-line reason, writing no state at all, because the call itself is the signal. Nothing else refreshes the rail. The precondition is asserted where the spend actually crosses rather than only where the stream loop collects it, so what may start a search is legible at that boundary. Underneath it, and deliberately deterministic rather than a fifth prompt guard on the same stochastic loop, the rail declines outright unless the project carries a definition of its OWN, a brief section with real content or a committed search preference. Industry alone does not count, because that is precisely the field the previous project fills for free.
- A client asked for Spanish speakers, the search found eighteen of them, and every one was thrown away before it reached the screen. The rail is capped at eighteen cards and the merge was strictly append-only, so once the cap was full from earlier rounds the loop over the previous list returned before it ever looked at the new one, and every later round was discarded whole. Capture, filters and search had all done the right thing: the language was captured, the query legs went out in Spanish, and the pool came back as eighteen people who all declare Spanish. The client read a list where fourteen of eighteen spoke none. It was measured again the same day on a second, unrelated project, also on a language requirement. Every round now re-ranks the whole set: this round's ranked picks, grouped by the tier it gave each of them, and within a tier the people the client has already SEEN keep their previous relative order with this round's finds behind them, while anyone seen whom the round did not rank at all is retained below that, so a thin or degraded round cannot collapse an eighteen-card list into a three-card one. Stability stopped being a freeze and became a property of the ranking: sorting on this round's tier and the previous position makes an unchanged round identical to the one before it and moves somebody only when the tier they were given actually changed. It remembers nothing about the previous grade and absorbs the grader's between-round wobble for free. Also fixed: why nobody saw it. The full-from-history case returned ABOVE its own log line, so the one round that withheld EVERYTHING reported nothing while every partial case dutifully logged its withheld count.
- A brief that hires a PERSON was being distilled into their first task, and the check that should have caught it had been dead for three weeks. A twelve-month, thirteen-hundred-a-month front-end developer hire came back with a Shopify store at number two and a WordPress landing page at number three. Two earlier attempts at this went after the grader, and both were aimed a layer too low, because every stage downstream had behaved correctly. The extraction had produced a single sentence describing a website build, and that sentence is the one field every package is ranked against, so measure a WordPress studio against it and STRONG is the RIGHT answer: a WordPress studio does deliver a web app with a registration flow. A replay came back with Shopify, WordPress and Wix graded a tier HIGHER than the grade that got the bug filed, which is what finally made it obvious that the brief, not the grading, was wrong. The role was never missing either: the same extraction carried the summary, the twelve-month must-have and the ongoing shape. Only the one measured field collapsed the hire into the work. The distiller had no notion of a hire at all, since both its examples are project work, so a brief asking for a PERSON had nothing to pattern on. It is now told that a rate, a start date or a multi-month engagement yields the ROLE with the tasks as capabilities, and carries a worked example. Nothing downstream changed. The second half is the one nobody could see from outside: a deterministic discipline check was softened from a hard cap to an advisory line in July, that line lived on the agentic tool loop's evidence builder, the port that retired the loop in early August never carried it across, and so for three weeks the pipeline had neither a cap nor a nudge while the function sat in the tree, fully tested and unreachable. Nothing failed. Nothing could have told us. Its vocabulary was wrong too: it read the queries the search had just run, which are written from the deliverables and drift with them, so the off-discipline search terms were vouching for the off-discipline results they had returned, and a check whose vocabulary grows to include whatever the search happened to look for cannot fail. It reads the brief's stated craft now and nothing else, stays a refutable nudge rather than a verdict, and its rate is METERED, because the actual bug was a check that had quietly stopped firing and only a ratio pinned at zero could have said so.
- A talent can say what they will and will not be brought again, and can finally state the hours they work. The standing-preference feature was built, tested and switched off whole five days earlier behind one constant, because the talent-facing half being mute while enforcement stayed live means somebody already approved is dropped from every search with no way to see it, change it or raise the subject. It is back on, which is the state the seller-complaint card asks for, and the way it was switched off is why it came back in one line: every line left in place, the twelve live scenarios skipped with a reason rather than deleted. Both surfaces now pin BOTH states explicitly, because the dark side had only ever been what the constant said, and a future flip in either direction cannot quietly delete a state nobody is asserting. Shipped with it, the last mile nobody had built: a migration had made the columns for working hours a fortnight earlier and argued the design at length, and then nothing ever read or wrote them, so a talent who said they work ten to six got noted and nothing stored, or landed the sentence in their free-text rules, where the grader reads it as a statement about the KIND of work under an instruction ending treat anything unclear as a conflict, and can take them off every brief there is. The capture REFUSES rather than repairs a bad window, because this value ends up in a message the talent APPROVES and a window we quietly fixed is one they agreed to without ever being shown it, and it REPLACES rather than accumulates, because a person has one working day and a second window is a correction of the first. The load-bearing rule is that hours never remove anybody. Every other map on this rail drops somebody; this one must not, because a start date is a fact about the whole job while working hours are a fact about this minute, so filtering on them would delete the Americas from every afternoon search and Asia from every morning one, for the same client and the same brief, with the shortlist depending on when the client happened to press the button. Which is exactly why he is told never to offer them as a way to be sent less work: pointing somebody at the wrong lever leaves them believing they are protected by a boundary that protects nothing.
- Two retunes an hour later, and a reply that stopped saying the same thing in two voices. The default window opens at seven, not nine: these are the hours a message may land without waking somebody, and freelancers start before an office does, so at nine an early riser had their first message held for two hours and, once hours became a ranking signal, was scored unreachable while working. And hours now weigh five points rather than two, the same as being online. The two genuinely do double-count the same person, which is why hours were discounted in the first place, but the discount cut the wrong way: presence is a live flag the gateway supplies only sometimes, so a talent AT THEIR DESK whose presence we happen not to have was ranked below one we do, while hours come from a clock we always have. Equal weight makes the pair one availability signal that degrades gracefully instead of two tiers of confidence in the same fact, and it still cannot cross a fit tier: craft outranks availability, always. The reply got shorter the same afternoon. It was the restatement, then a here-is-what-I-would-save table naming every facet, then reply yes and I will save it. The table said in a second voice what the restatement above it already said, and the yes gated nothing, because a human approves a preference before it filters a single search and that gate is untouched. It is now the restatement plus two sentences, both of them fixed strings the system appends rather than lines the agent phrases, and the capture submits itself in the same turn, which is the only honest reading of I will update my memory with no reply yes to follow. Asking once also stopped being a property of the model remembering and became a property of state.
- The outreach agent stopped spending a line telling talents he had read them, and on a role he asks when you can start. Two rules, both in the voice block, because what he writes is a prompt and not a branch. ACKNOWLEDGE PARTIALLY became NO ACKNOWLEDGEMENT LINE: the old rule already banned re-summarising the project and re-explaining the fit, and it still spent an opening line reacting to what the talent had just written. They know what they wrote. The point, the question or the answer goes in the FIRST sentence now, and where reacting genuinely IS the substance it rides that same sentence rather than a warm-up in front of it. KEEP IT SHORT became MINIMUM LENGTH: short is advice a model can agree with while changing nothing, so the rule now names the actual test, could this sentence be deleted without the talent losing information, and says what to cut in what order, preamble first, then repetition, then the padding around the ask. Three short sentences is a long message here. The guard rail is written into both rules and it is the objection raised on the card: shorter must never mean dropping a fact the talent needs to answer, the client's name, the budget, the timeline, the actual question. Cut words, never substance. The opening message keeps its four-part shape for exactly that reason, and the decline and recommendation paths keep their acknowledgement, where landing warmly IS the job. Separately, every finalist card was reading availability to be confirmed while the chat showed talents confirming availability, because nothing ASKED for a start date and the one field that could carry it died on the way to the card. On an ongoing role the time question is always when can you start, never when will you finish, since a delivery estimate has no meaning for a role, and the availability slot now reads a ladder: their own answer from THIS negotiation, then their standing date, then the honest to be confirmed.
- Mira is now an app you can open inside Claude and inside ChatGPT. A day's workstream, from a plan at half past four to a live service on dev by seven, shipping the REAL Mira as a remote app on the MCP standard rather than a second product with the same name. The chat tool claims and enqueues the ordinary turn, with the same idempotent claim, the same spend budget and the same turn-slot gates the web route has, waits on the turn by bounded poll, and assembles the reply and the widget from the persisted events, so nothing about how a turn runs is duplicated. It is its own Cloud Run service off the shared image behind one new role, public at the edge with the authorisation done in the app, its own audience isolated from the admin connector that lent it its sign-in machinery, and for now the identity is Google employees only. The card is a single-file page that renders Mira's reply and all eight kinds of question with the host's own theme variables, one implementation for both hosts, and answering a question makes exactly the two writes the browser app makes. The approve-and-search lane rides on top: approving mirrors the intent classifier, starting a search mirrors the search route exactly, down to the in-flight guard and the funnel row, and the card polls a running search and renders the results as a real horizontal carousel of talent cards with a reveal-more button. Three findings came straight out of live testing: the status read a field the wire model never carries, so every search reported running forever and kept the spinner alive, and it is INFERRED now; a first-contact turn returned no project id, because the worker announces a created project only inside the complete event's embedded workspace, so hosts were minting a new project per message instead of threading the conversation; and one import ordering bug at boot, caught by an offline smoke that now proves the whole host-shaped flow, initialise, list, read and a wrong-audience refusal, with no network at all.
- The call we offer a big-budget client came back, as a card inside the conversation rather than a window over it. The client-facing half of the six-thousand-dollar handover was removed a week earlier with its vendor iframe and its takeover popup, and the engage went silent. It returns as a NATIVE scheduler card the chat's own question lane renders: a peek row of four times in the client's own timezone with the rest behind a more control, arm-then-confirm, an I-already-booked exit, and a link-mode fallback for today, because the vendor availability interfaces both need per-account credentials nobody has provisioned yet, so the slots field is the contract the adapter fills later. It took nine rounds of review to be safe, and the findings are the interesting part. The card append and the routing persist are best-effort and moved BELOW the export, because both run behind the engage's one-shot stamp inline on two routes whose contract is that the search always proceeds, so an append that raised would have failed the search AND consumed the one-shot, permanently starving the export row for that project. The deep link's date comes from the client's own zone rather than the server's, since the vendor renders in the visitor's zone and an evening slot west of Greenwich pointed the calendar at the next day. Tomorrow survives a daylight-saving shift, because a twenty-four-hour add is not tomorrow on a twenty-five-hour day. A booked claim only counts for the project whose card it came from. A card with nothing bookable on it degrades to plain prose rather than pinning an empty popover over the composer. And the last one is why the best-effort wrapping needed a meter: the message id was a readable slug where the column is a uuid, so the insert failed on every single engage and the wrapping this very review cycle had added turned that into a silent hundred-percent failure rate. The entire client-facing feature would have shipped dead while every other effect stayed green. It was proven against the real database, not the fakes that hid it, and the four best-effort drops are now metered so a systematic failure reads as a climbing rate rather than as no handoffs happening.
- A proposal cleared our review and was declined a hundred and ten seconds later, in front of the client. An ordinary reply between the two closing questions rewrites the thread's state column back to its default, so the wrap-up's re-registration of the SAME terms no longer looked post-acceptance: the judge re-scored terms that had already passed, a second stochastic verdict declined them, and the client never saw the offer. They saw it has cleared our review, then it is not the right fit this time. The gate keys on the banked offer row now rather than on thread state, because the row is durable and the state column is not, and a moved re-quote on a drifted thread takes the re-quote lane instead of the first-offer path whose pre-verdict write clobbered the passed row with the re-scored one. The plain-reply fallback refuses to write the default over a live offer-received mark, so the silence sweep cannot time out and replace a talent whose proposal the client is already holding. Red-first repros for all three. The follow-up an hour later is worth its own line: the first fix protected ANY offer-received mark and broke a test on main where a finished-run question gate re-parks a finalist thread with the mark and no row behind it, so the refusal now engages only when a real banked offer backs the mark, the same key the other gate uses. The incident class keeps its protection and a row-less mark stays free to move.
- And a run of repairs the client meets first, plus a composite manifest that took a deploy's reporting down for five days. The brief was sliding open after a single thing the client had said: the gate wanted two answers and counted anything ticked except the synthetic baseline row, so one OPTIONAL row was half the evidence that a foundation existed. An optional row is by definition not part of the foundation, so the auto-open reads a required-only count, and it also wants content in at least two sections, because has-any-content cannot tell a stub from a brief and the reviewer's other note was that it still looked very, very empty. A student's school project was tripping the regulated-industry compliance banner, because the industry detector matched bare substrings and school is inside school project; every bucket term matches as a whole word now, with five rounds of review restoring the closed compounds the tightening dropped, bookstore, homeschool, seafood, cafeteria, bartending, storefront, and pinning two old false positives as deliberate exclusions. A Fiverr sign-in often carries no display name and no email, so the new-project page greeted people as You, or U in the avatar; the handle was already ours at display time and now rides the wire read-only, off the profile patch surface and off the agent identity allowlist. A guest arriving from a Fiverr surface with a brief already typed landed on the empty welcome hero with their words dropped, because the redirect stashed the text and nothing in the app read the parameter; the app opens that turn itself now, through the same submit path a typed message uses, and it carries the measurement parameters the login path appends, without which a brief-carrying arrival read as Direct. A per-deliverable engagement rendered an offer as a bare figure with no unit, because the finalist cell has no note beside it and the client's own noun never reached that wire at all. And a composite action's manifest ended a description in a backticked phrase containing a colon: backticks are not quotes in YAML, so the runner opened a nested mapping where a string belonged, the manifest failed to LOAD, and no amount of in-action error handling can catch that, which is why the board sync and its whole reporting job had been failing on every deploy since the twenty-sixth. The never-red promise moved to the calling steps where it can actually hold, and every workflow and action manifest now gets parsed in ordinary CI, so this class reds a build instead of a ship.
A Monday of 44 commits, and the through-line is a search that explains itself, plus a Mira you can reach from somewhere other than our own browser tab. The live rail stopped blinking in three separate places, and the grading step that runs for two silent minutes now says how many it has reviewed of how many, throttled, on a denominator that cannot walk backwards. What starts a refresh became a judgment the agent makes rather than a side effect of writing anything down, over a floor that refuses to search a project carrying no definition of its own, after a returning client's old research bought a hunt for fantasy-game talent on a logo brief. The shortlist re-ranks every round instead of freezing at the cap, which is why a client who asked for Spanish speakers had been reading a list where fourteen of eighteen spoke none. A brief that hires a person distils to the ROLE now rather than to their first task, and the discipline check that should have caught it, dead and unreachable for three weeks, is back and metered. Talent standing preferences came back on with the hours somebody works, which weigh a little and never remove anybody, and the outreach agent stopped spending an opening line telling people he had read them. Mira shipped as a real app inside Claude and ChatGPT, on the same turn pipeline. The big-budget call returned as a scheduler card in the chat itself, through nine rounds of review that ended with the insert that had been failing on every engage. And a proposal that cleared review and was declined a hundred and ten seconds later turned out to be a durable row losing an argument with a state column.