|
| 1 | +--- |
| 2 | +date_created: 2026-07-25 |
| 3 | +date_modified: 2026-07-25 |
| 4 | +title: "The Queue's First Live Evening — Five Operator Findings, Five Same-Night Fixes" |
| 5 | +lede: "The search-results rail shipped at dinner and got used in anger by ten. Every rough edge the operator hit — dismissal, concurrency, overflow, a broken drag, an open API-credit tab — was fixed and merged before midnight." |
| 6 | +publish: true |
| 7 | +authors: |
| 8 | + - Michael Staton |
| 9 | +augmented_with: |
| 10 | + - Claude Code on Claude Fable 5 |
| 11 | +files_changed: |
| 12 | + - apps/search-results/src/SearchCard.svelte |
| 13 | + - apps/search-results/src/app.css |
| 14 | + - services/prompt-runner/src/crawl.ts |
| 15 | + - services/prompt-runner/src/request.ts |
| 16 | + - shell/src/App.svelte |
| 17 | + - apps/org-workbench/src/app.css |
| 18 | +tags: |
| 19 | + - Search-Results |
| 20 | + - Didi-Crawl |
| 21 | + - Concurrency |
| 22 | + - Cost-Control |
| 23 | + - Shell |
| 24 | +--- |
| 25 | + |
| 26 | +# The Queue's First Live Evening |
| 27 | + |
| 28 | +## Why Care? |
| 29 | + |
| 30 | +Shipping a feature and *operating* it are different sports. The |
| 31 | +search-results queue landed earlier tonight ([[2026-07-24_07_Searches-Become-Async-Jobs-The-Queue-Rail-Lands-Fire-Many-Walk-Away-Triage-On-Arrival|ship note]]), |
| 32 | +and within the hour the operator was firing real concurrent searches at |
| 33 | +real orgs — which surfaced five things no browser drive had: a missing |
| 34 | +per-card dismiss, crawls secretly running single-file, result rows |
| 35 | +overflowing the rail, a resize drag that fought its own hover states, |
| 36 | +and an API credit balance that kept emptying itself. All five were |
| 37 | +diagnosed, fixed, verified live, and merged to `rebuild/turbo-rsbuild` |
| 38 | +the same night. This entry is the record of that sweep. |
| 39 | + |
| 40 | +## What's New? |
| 41 | + |
| 42 | +- **Per-card × dismiss.** The header's "clear done" cleared the whole |
| 43 | + queue; dismissing ONE search meant expanding it first. Every card now |
| 44 | + carries a tiny × above its expand caret — one tap. A done card with |
| 45 | + unreviewed candidates flips the × to a `✓?` for four seconds instead |
| 46 | + (the same conscience as the expanded confirm, compressed). |
| 47 | +- **Crawls run three wide.** The crawl consumer awaited each NATS |
| 48 | + message inside its loop, so concurrent submissions — the queue's whole |
| 49 | + premise — ran single-file: a batch of five put the last two past the |
| 50 | + caller's 600s ceiling ("timeout", masquerading as a billing error). |
| 51 | + The loop now spawns per message under a slot cap |
| 52 | + (`MAX_CONCURRENT_CRAWLS`, default 3). Measured: an NYT links crawl |
| 53 | + that took 4:35–6:39 serialized landed in 1:14 parallel. |
| 54 | +- **Rows fit the rail.** Grid children default to `min-width: auto` and |
| 55 | + refuse to shrink below their content, so one long nowrap title pushed |
| 56 | + cards wider than the rail — cutting off the ➕ entirely. Zeroed down |
| 57 | + the chains; the same disease was then found and cured in the org |
| 58 | + card's people list. |
| 59 | +- **The flow resize-drag actually resizes.** The focused-panel edge drag |
| 60 | + computed width as distance-from-stage-centre × 2 — correct only when |
| 61 | + the panel is centred, so first/last flow steps jumped on grab and |
| 62 | + tracked 2× per pixel; mid-drag, the peek overlay's hover-expand fought |
| 63 | + the geometry. Now the edge position maps per-arrangement, the edge |
| 64 | + takes pointer capture, hover is suppressed while resizing, and edges |
| 65 | + only render on sides that border a peek. Verified: pointer at 50/65/80% |
| 66 | + of the stage → panel at exactly 50/65/80%. |
| 67 | +- **The burn-rate hole is capped.** The crawl's server-side `web_search` |
| 68 | + tool carried no `max_uses` — a crawl of a huge publisher (NYT) searched |
| 69 | + open-endedly, which is how a same-evening credit top-up drained back to |
| 70 | + "balance too low" within the hour. Crawls now carry |
| 71 | + `CRAWL_MAX_WEB_SEARCHES` (default 8); chat/enrichment calls keep their |
| 72 | + existing behavior. |
| 73 | + |
| 74 | +## Under the Hood |
| 75 | + |
| 76 | +The evening also proved the queue's failure honesty end-to-end: billing |
| 77 | +400s landed on cards verbatim with Retry; a workspace restart marked its |
| 78 | +stranded search failed-with-retry instead of spinning; a dismissed |
| 79 | +running card kept the crawl billing in the background — which is now |
| 80 | +[[https://github.com/lossless-group/augment-it/issues/46|gh #46]] |
| 81 | +(crawls should get the `prompt.run.cancel` abort treatment so × means |
| 82 | +what the operator thinks it means). |
| 83 | + |
| 84 | +Merge trail: PR #43 (queue + hardening) merged clean; stacked PR #45 |
| 85 | +was auto-closed by GitHub when its base branch merged and was deleted — |
| 86 | +reopened as its named successor #47 and merged. Issues #42 and #44 |
| 87 | +closed by the merges; #46 and #35 (progress traces) are the queue's |
| 88 | +open roadmap. |
| 89 | + |
| 90 | +One operating lesson worth keeping: the relevance brief steers crawls |
| 91 | +well for entities that fit its frame (funders and operators), but gives |
| 92 | +weak purchase on giant general publishers — for those, hand-adding the |
| 93 | +two or three known streams beats a model turn. A media-publisher clause |
| 94 | +in the brief is the cheap improvement. |
0 commit comments