A week of porting an app and teaching it to negotiate.
Two arcs across eleven days: a final push of feature & reliability work on Ocean11, the whole app ported into recruiter on a stricter event-driven architecture — then a live seller-negotiation platform whose runs now close themselves end-to-end.
01 At a glance
The week ran in two halves. Through Sunday–Tuesday you closed out a dense run of work on Ocean11 (the original app): a full observability foundation, the "About You" identity file with branded PDF export, a deep-research image pipeline, a major agent-architecture overhaul (MASON becomes the sole brief author, deciding from the conversation), and a brief-as-drag-in-dock redesign.
Then on Tuesday–Wednesday you ported the entire app into recruiter — re-homing every subsystem onto a stricter doctrine: no slow work on the web request, Pusher instead of SSE/streaming, fully-typed contracts with generated wire types. By Thursday you'd swapped in live Fiverr discovery, and by Sunday shipped the headline: a live seller platform with STERLING, a conversational negotiator, plus full-system cost & I/O telemetry.
Week two (7–10 Jun) closed the loop the platform opened: concierge runs now finish themselves end-to-end — auto-finalize when every seller resolves, an animated reveal into the finalist carousel, offer cards built from real seller data, and a finished fiverr_handoff page. Underneath it, IRIS became a per-turn planner lane (the identity twin of MASON) feeding a unified tagged notes-to-Mira channel, and an employee-only agent debug dashboard now records every LLM call with an "ask why" chat over the traces. In parallel, the Atelier web redesign landed via teammate PRs — tracked separately below.
Commits per day
Stacked by repository · your commits only · both weekends' Fri–Sat stayed quiet.
02 Day by day
Only the load-bearing work — UI micro-iterations, doc-only and chore commits are folded in.
- Observability foundation. One
llm_calltelemetry choke point (tokens / latency / model per call), Cloud Logging severity + trace mapping, and PII redaction (hash emails & tokens; stop logging transcripts and buyer URLs). - "About You" identity file. Section tagging + one-click LLM-designed branded PDF export; two-column layout; an
edit_identityreconciler so research stops piling up duplicate blocks; backfill of Basics (company / industry) from deep research. - Deep-research imagery pipeline. Harvest buyer images → a vision placement agent that sees thumbnails → apply them as references / brief images, and render them in the PDF.
- Agent reliability (prod fixes). Stop Mira re-asking answered questions; make ARCHITECT converge brief blocks instead of appending near-duplicates; guard non-UUID block ids; stop the "yank back to chat" on turn complete.
- Results UX. Real continuous swipe coverflow carousels; a planet-themed loader; quick-reply chips under every Mira message.
- Agent architecture overhaul. MASON (the architect) becomes the sole brief author and decides what to build straight from the conversation — the keyword/signal gate and
propose_initial_briefare gone. The sub-agents get crew names (REED / IRIS / SAGE / HUE / SCOUT / STERLING / MASON). - Shared activity log. Every agent records what it's doing so Mira stops contradicting or re-asking in-flight work.
- No more double-ask. The conversational lane (Mira) is now the sole questioner; Atlas hands its needs to her.
- Per-industry "what to gather". Mined 10k evaluated briefs into per-category gap profiles, surfacing the highest-leverage missing fields to the agent (+
set_service_category). - Search simplified. Removed the funnel stage — search is the user button only; server-side cancel of the discovery stream.
- Prod bug. Removed MASON's token cap that was truncating and overwriting real briefs with empty sections. New number / short-text / file input widgets.
Ocean11 — the last feature day
- Brief becomes a drag-in dock on the chat home (replaces the Chat/Brief toggle); the brief-progress checklist re-homes into the support rail.
- Checklist is agent-decided. MASON returns per-item done / not-done verdicts by meaning, replacing keyword matching — one source of truth for the gate, the rail and Mira's next question.
- Mira voice & UX. Pain-first opening, "finding talent" not "hiring", suggestion chips docked above the composer; a date-picker widget + a currency-leak guard.
- Brief export → real server-side PDF (headless Chrome) with an HTML preview tab — killed the print-dialog freeze.
- Files persisted to GCS instead of Cloud Run's ephemeral disk (fixes vanishing uploads & research images).
recruiter — the big port begins
- Ported the entire Ocean11 app into
recruiterin staged phases, adapting to the doctrine: 23 migrations (pgvector), the data layer, a direct-OpenAI LLM seam, the full agent core (dual-lane, 67 tools, every sub-agent), the agent-turn worker (SSE→Pusher), core API routes, the 6-layer search funnel + items, concierge (runner / store / approval-gate / anonymity-wall), and the web + admin SPAs (Next→Vite). - Voice ported but left inactive (incompatible with the no-streaming doctrine).
- Runtime-verified against a real embedded Postgres — caught & fixed a jsonb double-encoding bug; added search-funnel + pgvector retrieval tests.
- Finished the port. Phase-13 integration tests (real DB, mocked LLM), a real-key embedding-dimension fix (1536 vs 3072), merged
origin/main(per-PR previews, JSON queue serializer) into the port, and retired the dead echo-skeleton surface. - Infra reconciliation (from a real
terraform plan): stopped Terraform reverting CI-deployed images, stopped CI wiping service env (Pusher config), wiredOPENAI_API_KEYinto Cloud Run, brought cloudtrace + monitoring under IaC. - Buyer SPA. Ported the Profile + Legal pages and wired the user menu; project rename / delete / picker; per-browser guest identity; a cookie-consent banner; recover from a stale
project_idinstead of dooming the turn.
- Live Fiverr search (SCOUT) for the guest flow — replaced the pgvector funnel with the Fiverr-backed engine; perf: enrich only the top 8 survivors (~4× fewer scrapes).
- Narrated discovery over Pusher for both guest search and concierge (real SCOUT phases), including the no-shortlist concierge start; fixed an events FK crash and a discover 409.
- Pusher 10 KB-cap resilience. A failed publish no longer sinks an agent turn; oversized workspace events are slimmed and the client resyncs over REST, so the brief always updates live.
- Identity "Design & export PDF" via a worker job (HUE) notified over Pusher; baked Chromium into the backend image for server-side PDF on dev.
- Concierge. An Extend-shortlist action; a dev-only skip-to-offers fast-forward. Wired DataForSEO credentials for SAGE research.
- Live seller platform + STERLING, the conversational negotiator (the headline — 82 files). A separate seller SPA where a tester role-plays sellers chatting with STERLING, who holds the full brief + client context, answers what he can, escalates the rest to the buyer, relays answers back, and drives toward a concrete offer — with the buyer dashboard rendering the real escalated Q&A and offers. Follow-ups landed the same day: STERLING's real function-calling tools + a live KPI dashboard, a seller picker, auto-dispatch on discover, and STERLING attaching HUE-styled brief + IRIS client docs.
- Full-system observability. Log full input / output plus dollar cost on every OpenAI call (hand-maintained pricing table); a
log_callsdecorator on every API route, the Pusher publisher and every worker job; IRIS / LENS / SCOUT / STERLING added to the activity board. - Agent cleanup. Deleted REED (folded brief-editing into MASON), retired the inert STYLO per-turn lane, removed the vestigial keyword-matching field.
Addendum — added 10 Jun. Everything committed after the report was first generated, from the evening of 7 Jun through 10 Jun. Ocean11 saw no new commits; this is all recruiter. Teammate work landed in parallel and is listed separately at the end.
- Fiverr 403 mitigation. Fiverr IP-blocked the worker's scrape egress after ~2h of sustained discovery, surfacing to buyers as a misleading "refine your brief". Landed a dormant proxy seam (
FIVERR_MCP_PROXY_URL) reaching both the subprocess and the in-process scraper, slower pacing (4s + jitter), and honest degrade — "temporarily unavailable" vs a genuine zero-result. - Agent debug dashboard (admin). Every agent LLM call is persisted to a new
agent_tracetable (migration 0027) and surfaced in an employee-only dashboard — a tab per agent with input / output / tools per turn — plus a floatinggpt-5.4-mini"ask why" chat that reasons over a turn's traces to explain an agent's answer. Dark-theme readability fixed the same evening. - Prompt pass. Consultative Mira (trusted-guide framing, no AI-isms, replies in the client's language for chat only); everything the client never reads — partner notes, the brief, dossiers, seller messages — locked to English. A "sanitized-only" privacy rule shipped and was deliberately reverted the same evening.
- IRIS becomes a per-turn planner lane — the identity twin of MASON. It reads the full, uncapped conversation + the current dossier every turn and emits a structured add/update plan (fuzzy-dedup backstop, user blocks protected); Atlas's
edit_identitytool is gone, and a shared conversation projector replaces the old 40-message / 600-char caps. - One tagged notes-to-Mira channel. Atlas + MASON + IRIS hand Mira end-of-turn notes through a single tagged channel (
[ATLAS NOTE]/[MASON NOTE]/[IRIS NOTE]), and her prompt was rewritten around the full ten-agent map — including the rule that teammates are invisible to the buyer, so only Mira can ask. - STERLING offers stop vanishing. Offers phrased in words the strict regex missed ("USD 2k", "a couple of weeks") silently recorded nothing; an LLM-extraction fallback now lands them — never fabricating: still none when neither parser finds a concrete price + timeline.
- Composer polish. A rotating typewriter placeholder in the entry composer (a pure, unit-tested state machine; reduced-motion aware), then slowed to read calmly; suggestion chips now prefill the composer instead of firing a turn.
- Mojibake repair. 15 agent prompt files carried a UTF-8→cp1252 round-trip that garbled every dash, quote and bullet; reversed and normalized to clean ASCII so the LLMs read clean text.
- The concierge run closes itself.
finalize_if_completeauto-reveals once every seller thread is terminal and at least one offer exists (idempotent, replay-safe) — fixing a real deadlock where a fully-resolved run sat frozen behind a CTA that never appeared. The dashboard plays a one-time animated reveal into the finalist carousel; all-declined runs get a calm "no offers" state instead of a frozen view. - Fiverr handoff built. Picking a finalist now lands on the
fiverr_handoffstage: it captures the brief PDF before deleting the project (unit-tested ordering), explains the conversation continues in the buyer's Fiverr inbox, and links out. Onlyoffer_reviewremains deferred. - STERLING never re-asks. Client answers are now run-wide context for every seller thread, and each buyer answer is ingested by MASON + IRIS into the brief + About You via a keyed worker job — answers that add nothing write nothing.
- Real offers on the cards. Finalist cards render the seller's own scope / inclusions / risks straight off the offer row; the hardcoded mock variants are deleted.
- Brief locked during a run. The brief + Mira chat freeze read-only while sellers negotiate against them, lifting only when the buyer stops the run or it dies.
- Live-change visibility. Transient "Brief" / "Profile" chips under Mira's latest answer show what MASON / IRIS just changed — made reliable by generalizing the Pusher 10 KB slimming (the oversized
architect-appliedevent was being silently dropped). Plus a brief-pill first-run reveal with a completion bar, and a project-first seller picker with per-project counts.
- No cross-project leak. The persisted concierge run id is now keyed per project — switching projects no longer inherits another project's live dashboard, and sign-out sweeps every pointer. (More work is in flight today, not yet committed.)
- Avishay Gal — the Atelier web redesign (PRs #34–36; ~100 branch commits merged 8–10 Jun): a light-first, warm design-token foundation with serif type, the new welcome hero + header, shared Button / Input / Composer primitives adopted across web + admin, the brief-ready "Find my match" floating CTA, and hero starter pills.
- Tzafrir Rehan — dev-origin hardening (#30 / #31 / #33): an HTTP Basic-Auth edge gate on the buyer + admin dev origins, the edge-gate SPA served via the GCS client on gen1, and a Cloud-Run drift-churn fix.
- Automation follow-ups: agent display names attached to OTel traces,
agent_identitydocumented, agoogle.cloudimport-resolution hardening.
03 Threads that ran through the week
The day-by-day work clustered into five throughlines.
AThe crew got smarter & simpler
MASON became the sole brief author, deciding from the whole conversation; the crew got names and a shared activity log; REED and the inert STYLO lane were retired; the checklist moved from keyword-matching to MASON's verdicts.
BThe big port
Ocean11 was re-homed into recruiter on a stricter doctrine: no slow work on the web request, Pusher instead of SSE / streaming, fully-typed contracts with generated wire types — verified against a real database.
CResilience under Pusher's 10 KB cap
A recurring porting hazard: events that embedded full workspace state blew Pusher's per-message limit. The fix — degrade-not-crash publishes, slim the payload, and have the client resync over REST.
DFrom mock to live
Scripted mocks gave way to real third parties: live Fiverr discovery (SCOUT), narrated discovery feeds, and a live seller-negotiation loop (STERLING) wired end to end.
EYou can see everything now
LLM cost + I/O telemetry, a per-call logging decorator across routes / publisher / jobs, activity-board coverage for every project-scoped agent — capped by the agent debug dashboard with its "ask why" trace chat.
FThe loop closes
Concierge runs now finish themselves: auto-finalize once every seller resolves, an animated reveal into the finalist carousel, offer cards built from real seller data, and a finished Fiverr handoff — with the brief locked read-only while sellers negotiate against it.
04 What's next
Open threads explicitly flagged in this week's commit messages.
- Unblock live Fiverr discovery. Fiverr IP-blocked the worker's egress (HTTP 403) on 7 Jun; the proxy seam (
FIVERR_MCP_PROXY_URL) is wired and dormant — ops picks a proxy provider and sets the secret to flip it on. - Build the
offer_reviewstage. Withfiverr_handofffinished on 9 Jun, it is the last deferred stage in the buyer journey. - Reconcile the remaining infra drift.
terraform importthe out-of-bandopenai-api-key, and resolve the preview-IAM drift before the next apply. - Provision the seller origin. Run the Terraform apply + set
GCP_SELLER_BUCKETso the seller SPA actually deploys (the CI sync is currently conditional). - Purge the retired pgvector / items path. The dead search engine is gone; the items dataset + its migrations can be dropped once the dataset itself is retired.
05 Sources
How this was produced
- Git history of two local repositories: PycharmProjects/recruiter and PycharmProjects/Ocean11.
- Filtered to commits authored by shilo@f-labs.io: the original week via --since="2026-05-31", the addendum from the report tip onward (0894039..e1031aa). Commits by other authors are excluded from every count.
- Counts via git log --author=… --pretty=format:%ad | sort | uniq -c: recruiter 113 (23/18/28/23/8/12/1 over 2–10 Jun), Ocean11 75 (23/28/24).
- Representative commits — cce4f0c agent-core port (+22.9k), 9a6ce01 web SPA port (+28.6k), 35b5039 admin SPA (+18.0k), de4c1d1 seller platform / STERLING (82 files), 7f59185 LLM cost telemetry, b9bc88b observability foundation (Ocean11); addendum: 160c52b IRIS planner lane (+1.4k), 4b60bb9 agent debug dashboard (+3.1k), 77eabcd/a35a1b2 auto-reveal, a365ade fiverr_handoff.
- Teammate work shown separately and uncounted: Avishay Gal's Atelier redesign (PRs #34–36), Tzafrir Rehan's dev edge gate (#30/#31/#33), automation follow-ups.
- Decorative imagery generated with OpenAI gpt-image-2.