Work-Product Gateway
Linear: RYR-234 — identity resolution; RYR-241 — per-step evidence map (2026-07-23 vault→Linear audit)
One-line description. A read-only verification layer. Every SOP completion (starting with offer processing) is logged to BigQuery with its evidence and a verification state, so an agent can confirm their admin's work in one place instead of hunting across Gmail, Drive, FUB, and vendor portals.
Why
The biggest pain point when an agent hires their first admin is trust: the agent can't cheaply confirm the work got done right, so they either micromanage, re-do it, or hope. That turns a $4–$5/hr admin into anxiety instead of leverage. The Work-Product Gateway makes verification cheap and trustworthy — the admin logs every completed SOP through a form, the system collects those completions in one place, auto-confirms the ones a third party can vouch for, and routes the agent straight to the evidence for the rest. Cheap verification is the thing that lets an agent actually delegate.
It started as a broader "gateway for everything coming into the business" idea and was deliberately narrowed: not a system of record, not an everything-bucket, not a notification firehose. It is a bulletin board / read model over work products, with one job it uniquely owns — the cross-source link tying events to the same deal/person. First instantiation is offer processing for Marissa Tah's Jr Operations Coordinator (admin); designed to generalize to all SOPs and eventually all agents.
Current state
Design canonized 2026-05-31 after a long brainstorming session. First concrete artifact shipped: a TRAINING copy of the live Offer Processing Tally form so admins can practice on real offers without polluting live data.
- Status: LIVE end-to-end — forms → scheduled Cloud Run ingest →
sop_events→ read-model views + per-agent Chat pings + offer-received draft automation (review page → approve → generated seller doc) + agent approval console //app(the canonical board + verdict surface) + admin "Your submissions" self-history (handbook). The legacy Google Sheets boards are being retired (see Last update) —/apprenders boards off a precomputed artifact and records verdicts via the web path. - Last update: 2026-07-11 — GOOGLE SHEETS BOARDS RETIRED + DEPLOYED. Verified live this turn: gateway revision
pos-work-product-gateway-00132-rnwserving image:d618ff94at 100% traffic (Ready=True, deployed 16:03Z); tfvars == live. Shipped via MR !1263 (code) + MR !1265 (tfvars bump7a7dc6b0→d618ff94,tf-auto-apply). The Sheets boards + their "Needs Your Eyes" write-back are superseded by/app(display via precomputed GCS artifact since 2026-07-06; verdicts viareview_events, which BQ showed is 100% web with 0 sheet-sourced verdicts ever). The dead refresh was still firing seven live view queries per 15-min ingest tick and per webhook submission — ~half the whole BQ project's query volume — to redraw boards nobody opens. Removes the threerefresh_board()call sites + asserting tests + README correction; leavesrefresh_sheet.py/sync_reviews.py/provision_agent_board.py/agent_boards.sql/WPG_BOARD_SHEET_IDdormant for a file-cleanup follow-up. Untouched: form ingest, the handbook completion KV sync, draft generation, the/boardprecompute artifact. Found via a BQ cost audit (cost driver = query COUNT / 10 MB floor, not data scanned). Detail in memoryproject_work_product_gateway.md. Prior: 2026-06-19 — ADMIN "YOUR SUBMISSIONS" SELF-HISTORY shipped + live-verified: each Jr Ops Coordinator now sees their own logged work products (practice + real) with approval status on their handbook admin home — the submitter's read-only history (distinct from the agent console, which is the reviewer's surface). New BQ viewv_admin_submissions→sub:<email>KV key (via the existing 15-min sync) → handbook Pages Function/api/submissions→ card painted bypersonalization.js. MR !654 + image bump !655; a follow-up fix (!656) decoupled the paint from/api/meafter a live authenticated-browser check caught it never rendering for an admin with no completion grid. Full detail in memoryproject_work_product_gateway.md; design~/bigbrainremote/Roadmap/plans/2026-06-19-handbook-admin-submissions-design.md. Prior: 2026-06-17 — agent console became the linked review surface (+4 fixes); 2026-06-11 — OFFER RECEIVED DRAFT AUTOMATION shipped + live end-to-end: admin logs an offer → agent reviews on the public review page (pos-wpg-review, signed-link, from the Chat ping) → Approve → the seller "Offer Received" Google Doc (+ "Offer Overview" comparison for multi-offer deals) is generated from Ry-styled master templates into the agent's folder in the WPG Offer Drafts shared drive, with an @-mention Chat ping. Plus follow-ups (reviewed-state + dup-generation fixes, KV read-and-diff, pos-monitoring false-page fix) and a handbook unified work-product review inbox design (not built; 6 open decisions). Full detail in memoryproject_work_product_gateway.md+~/bigbrainremote/Roadmap/plans/2026-06-1*. Prior: 2026-06-07 — per-agent "Your Work Board" one-pager (MR !362); 2026-06-04 — setter practice + per-agent isolated boards linked from the handbook. - Blocked on: Marissa's
SOP-Source-Intake.mdfor pillars 3 (FUB pipeline) + 4 (pre-home-sale checklist) — answers to questions 3 & 4 (the other pillars are covered). Not urgent (Ry 2026-05-31).
Session 2026-06-02 — practice reps made visible + chat-routed (plain-language)
The trigger was a simple question: an admin (Princess) submitted a test offer and we couldn't easily find it. It turned out practice submissions lived only inside Tally (the form tool) and were deliberately invisible everywhere else, so nobody but Ry could see them. We fixed that end to end:
- Gave practice reps a permanent home — they now save into BigQuery (
sop_events) with anis_trainingstamp that keeps them off the live board. - Made them readable — two Google Sheet "posters" lay out the whole submission in contract order (so you can check it line-by-line against the contract), led by the Tally submission id + record key for traceability. One on the Agent Board (your/Marissa's lens), one a separate Jr Ops sheet for the admins to self-review.
- Made it automatic — the 15-min Cloud Run robot now ingests practice reps and rewrites both sheets on its own (was hand-filled at first).
- Per-team chat pings — every new submission posts a summary into the right team's Google Chat (routed by which agent the submitter belongs to), ending with a clickable Review link to the right sheet.
- Caught + fixed a CI bug — the build job only watched
ingest_offer_form.py, so changes torefresh_sheet.py/notify_chat.pywere silently not rebuilding the image; widened to*.py.
Shipped via MRs !294–!300. Detail in the Shipped list below.
Session 2026-06-04 — setters added, boards isolated per pod, linked in the handbook (plain-language)
Started from a question — "the setters have been submitting work, where are the results?" — and walked it all the way to clean, isolated, linked surfaces:
- Setters were submitting into a black hole. They log practice call recordings to a separate Tally form ("Setter Practice Recording",
Pdky4P) that the gateway never knew about, so nothing reached BigQuery or any sheet — unlike the admin offer reps. Wired it in: setter reps now land insop_events(sop='setter_practice',is_training=true, the voca.ro/Drive recording link as the bucket-A artifact), routed setter→agent. Chat pings are off for setter reps (high volume — the sheet is the surface, not a firehose). Surfaced as a standalone Setter Practice Recordings sheet + a "Setter Practice" tab on the board, one row per recording, sorted oldest→newest so a setter's progress reads top-to-bottom. - Audit before sharing found cross-pod exposure. The combined board was already shared with both agents and showed both pods' data plus real past-deal client financials. Ry's calls: keep full detail, isolate per pod, keep the combined board as Ry's all-pods master.
- Per-agent isolated boards (replicable by design). Because Google Sheets shares per file, isolation = one board per agent. A new
work_product.agent_boardsregistry maps each agent → their board sheet; the refresh renders one board per row, every tab filtered to that agent. Adding an agent is one registry row (provision_agent_board.py) — no code change, no redeploy. Marissa + Brandon each got their own board; both removed from the combined master. - Linked in the handbook. Each agent's
_agent.yamlcarries aboard_url, surfaced as a "Your Board" chip on their dashboard + every level page. Per-agent, no cross-leak. Verified live (authenticated Playwright pass on Marissa's gated dashboard).
Shipped via MRs !331–!345. Detail in the Shipped list below.
Next 3 actions
- ✅ Done 2026-06-04 — per-agent isolated boards (Marissa + Brandon), agents removed from the combined master; each board linked in the handbook ("Your Board" chip). Supersedes the earlier shared-board approach.
- ✅ Done — Brandon Plummer is a handbook agent (dashboard + setters Samuel Padilla / Rafferty Ojeba).
- Pillars 3 + 4 (FUB pipeline, pre-home-sale checklist) once Marissa returns SOP-Questionnaire Q3/Q4. (Setter-side now also has a coaching surface via Setter Practice.)
Deferred (not needed for MVP, Ry 2026-05-31): offer-submission confirmation. There is no Orchard "watcher" / signal to auto-consume — that was a wrong premise. The real model when we build it: the admin screenshots the Orchard confirmation page (bucket A artifact) and the agent confirms by checking their Cash Offer Marketplace dashboard (manual). For now offers just log (claimed); MVP = offer processing + offer prep flowing end-to-end.
Shipped
- Offer Received draft automation LIVE end-to-end (2026-06-11) — the headline shipment. Admin logs an incoming offer (Tally, now with a required signed-offer-doc link) → 15-min ingest → a pre-rendered review page snapshot to GCS → Chat ping with a signed link → agent reviews intake vs the signed contract on the public shim
pos-wpg-review(/_health; HMAC token = auth; zero live deps at view time) → Approve (append-onlyreview_events, GCS-atomic dup-generation guard) → the gateway generates the seller "Offer Received" Google Doc — and, for 2+ offers on a deal, the "Offer Overview" comparison doc (column-deletion works inside the nested email-block, verified live) — from Ry-styled master templates (copy + placeholder fill + lint + residue scan + code-owned fallback) into the agent's folder in the "WPG Offer Drafts" shared drive, then an @-mention draft-ready Chat ping. Net sheet is an inline image, recommendation + send stay on the Google Doc (Gmail email-block). New:pos-wpg-reviewservice,review_tokens/field_map/review_page/review_state/draft_doc/comparison_doc/generate_drafts, BQreview_events+v_offer_review_state,agent_boards.drafts_folder_id. Key learning: SA has zero Drive storage → use a shared drive (SA = Content Manager). Gateway image1cff2511. MRs !466/!467/!468 + follow-ups !478/!480. Full detail in memory. - Agent one-pager "Your Work Board" LIVE (2026-06-07) — a handbook page at
/<agent>/system/that introduces an agent to their board and the daily check (watch team chat → "Needs Your Eyes" once a day → coach from the practice tabs), with a plain-English guide to all 7 tabs and a "who's on your board" roster. Data-driven per pod (admins/setters derived from the registry at build time; singular/plural and the admin-vs-setter sections render from real membership, so it stays correct as teams change). Built only for agents with aboard_url(ryan-colston correctly skipped). Surfaced by a "How your board works" chip paired with the existing "Your Board" chip in_render_always_strip.build_agent_system_guide+_system_guide_mdindomains/handbook-rycolston-com/build.py. Verified: Marissa = 2 Jr Ops + 1 setter, Brandon = 1 Jr Ops + 2 setters; one H1 each; all tabs + board links correct on staging (HTTP 200) then promoted to gated prod (302 → Access). 188 tests pass. MR !362, deployed to handbook.rycolston.com. - Handbook "Your Board" link LIVE (2026-06-04) — each agent's board is now linked from their handbook:
board_urlincontent/<agent>/_agent.yaml→ a conditional "Your Board" chip in the always-on strip on the dashboard + every level page (build._render_always_strip). Omitted for agents with no board (e.g. ryan-colston). Per-agent, verified no cross-leak; confirmed live on Marissa's gated dashboard via an authenticated Playwright pass. MR !345, deployed to handbook.rycolston.com. To link a future agent: addboard_url:+deploy.py. - Per-agent ISOLATED boards LIVE (2026-06-04) — resolves the cross-pod exposure surfaced in the pre-share audit (the combined board showed both pods + real past-deal client financials). Each agent gets their own board file showing only their pod (Sheets shares per file, not per tab). Registry-driven + replicable: new table
work_product.agent_boards(agent_id → sheet_id);refresh_sheetrenders the all-pods master + standalone Jr Ops/Setter sheets + one isolated board per registry row, every tab filteredWHERE agent=agent_id. Adding an agent = one row viaprovision_agent_board.py(create sheet → share agent commenter + SA writer → register) — no code change, no redeploy. Boards: Marissa1wCLmm7t-Jiy3emeJbnIvpGBvhc6zs7weJhMvPMtOQ0o, Brandon1ZE4q64TKrRcA3wiaaJXJ-IYhuP-OXLIPNUzeAfxSToc. Combined master1pbOJnESSvzhmle…+ combined setter sheet kept as Ry's all-pods view (agents removed).write_boardnow self-creates tabs so a fresh board renders on first cycle. Legend tab now writer-owned (lists all 7 tabs). Verified live: Setter Practice split 16 (Marissa/Viola) + 32 (Brandon/Samuel+Rafferty) = 48 master; zero cross-pod leakage in any tab. MRs !340 (code) / !342 (bump) / !343 (tab-create fix) / !344 (bump). Live imagec36f030e. - Setter practice recordings LIVE (2026-06-04) — setters submit call-practice recordings to a separate Tally form "Setter Practice Recording"
Pdky4P(record opener/script to a voca.ro/Drive voice link + self-score) that was never wired to the gateway. Now ingested:sop='setter_practice',is_training=true, recording link = bucket-A evidence, routed setter→agent; Chat pings off (high volume). Fenced from the admin practice surfaces (v_training_eventsexcludessetter_practice); own viewv_setter_practice. Rendered one row per recording, oldest→newest to a standalone Setter Practice Recordings sheet1p4ODv2AMOhCw_RJfNh3byzrg0JKqLCSwrYXpKxB1XTU(WPG_SETTER_SHEET_ID) and a "Setter Practice" tab on each board. 40+ historical reps backfilled, verified live. MRs !331 (code) / !332 (bump) / !333 (board tab) / !335 (sort) + bumps. - Practice-rep detail surfaces LIVE (2026-06-02) — practice/training reps now flow end-to-end instead of living only in Tally.
offer-trainingadded to the scheduled ingest (PRODUCTION_FORM_KEYS); reps land insop_eventsasis_training=true(excluded from every live board view → no pollution). Newv_training_eventsview +refresh_sheet.build_training_detailrender a contract-order (TREC §-ordered) field/value table, one column per submission, led by the Tally submission id (ArlgyGB) + record key (event_id). Written to two surfaces each cycle: Agent Board "Practice — Full Detail" tab + a separate Jr Ops Practice Reps sheet1lF_beztkSNtPGe6qKKhZqF6qMow4aPl_wfuuT1237Wo(Jr Ops Practice Reps,WPG_PRACTICE_SHEET_ID, shared commenter w/ Princess + James + Marissa). Verified live (the service wrote both on its own). MRs !294 (code) + !295 (image bumpf769e04d). - Per-agent Chat notification LIVE (2026-06-02) — each newly-logged event posts a summary into ITS agent's team Chat space, routed by
event.agentviaWPG_CHAT_WEBHOOKS(Secret-Manager JSON{agent_id: incoming_webhook_url}): marissa-tah → Team Marissa (spaces/AAQA4-X364s), brandon-plummer → Brandon's Team (spaces/AAQAaeO_Whw). Summary only (no financials); 🧪 practice vs 📋 real heading; ends with a🔗 Reviewlink routed by type (practice → Jr Ops sheet, real → Agent Board). Unresolved/unmapped agents skipped (never wrong-rooms); best-effort (a Chat failure never fails ingest).systems/work-product-gateway/notify_chat.py. Webhooks minted in-space (orchard.com permits incoming webhooks); both URLs verified to land in the correct room. MRs !296 (code) + !298 (Review link) + !300 (image bumpd87e1b37). - CI build-rule fix (2026-06-02) —
build-pos-work-product-gatewayrules:changeswatched onlyingest_offer_form.py, so a change touching onlyrefresh_sheet.py/notify_chat.pymerged to main without rebuilding the image (silent deploy lag; the !298 Review link hit it). Widened tosystems/work-product-gateway/*.py. MR !299. (Reminder: code merge still needs a manualauto-bump/manual-*tfvars image bump — no auto tfvars-bump in this monorepo.) - Agent Board LIVE (2026-05-31) — the read surface (design Decision 8). Google Sheet
1pbOJnESSvzhmle-jleeorDf79gY2icd7M0pA6yX1q6Q(Work-Product Gateway — Agent Board), 4 tabs: Needs Your Eyes (the 10-second glance) / By Person / By Deal / How to read this (+ "Practice — Full Detail" added 2026-06-02).refresh_sheet.pyrewrites the data tabs from the views; the service callsrefresh_board()after each ingest (15-min cron) +POST /refresh-agent-board. MR !270 (code) + manual tfvars bump !271 (monorepo has no auto-bump — image47a8bbbf). Verified end-to-end live. Superseded 2026-06-04: this combined board is now Ry's all-pods master only (Marissa + Brandon removed); each agent uses their own isolated board (see the per-agent boards entry above). Cross-pod visibility on the shared board was the problem the isolation fixed. - Test-row denylist (2026-05-31) —
work_product.excluded_events, anti-joined by all 3 views, hides the 6 pre-launch test submissions that re-ingest from Tally every cycle (deleting from sop_events doesn't stick). MR !272. Snapshot kept insop_events_test_archive_20260531. - Scheduled ingestion LIVE — Cloud Run service
pos-work-product-gateway(https://pos-work-product-gateway-uvqirrk5la-uc.a.run.app) + Cloud Schedulerpos-work-product-gateway-forms-ingestevery 15 min 7am–8pm CT →/ingest-work-product-formsingests all 4 production forms intosop_events. FastAPI wrapperinfra/cloud-run-services/pos-work-product-gateway/; terraforminfra/terraform/pos-work-product-gateway/; Tally token in Secret ManagerTALLY_API_TOKEN. MRs !266 (handler+wrapper), !267 (terraform/CI bootstrap), !268 (multi-word auto-apply fix). First deploy was a manualterraform apply(CI auto-apply refuses create plans by design — new services bootstrap manually, then CI handles in-place image bumps). -
Read-model views
v_needs_review(the 10-second glance),v_events_by_deal(per-deal timeline),v_events_by_admin(per-actor). Live + verified. DDL insystems/work-product-gateway/sql/. MR !269. -
BigQuery event-envelope table
pospj-480915.work_product.sop_events— 24-column atomic record (Decision 6 envelope + rawsubmitted_by_email/canonicaladmin_id/needs_identity_resolutionidentity trio +form_id/is_training). Created + verified live 2026-05-31. DDL:~/rylobasic/systems/work-product-gateway/sql/sop_events.sql. Monorepo MR !257. - Pre-Listing Update (Tally
7RM1VZ) + Listing Report Update (Tallyb5vK8L) forms + ingestion (--form pre-listing/--form listing-update, bucket A) — modeled on the live "Pre-Listing Report | Template" and "Listing Report Update | Template" Google Docs; log doc link + each report's section checklist; recommendation omitted (agent's job). Samedeal_keyso they stack on the property. Verified + visually confirmed 2026-05-31. Monorepo MR !263. - Offer Prep form (admin pillar 2) Tally
EkMv1r+ ingestion (--form prep) — modeled on the live "Offer Received | Template" Google Doc; logs the completed doc link (bucket A) + done-correctly checklist (net sheet / buyer doc / recommendation).sop='offer_prep', samedeal_keyas the offer so prep stacks on the deal. Verified end-to-end 2026-05-31. Monorepo MR !261. - Tally → BQ ingestion
ingest_offer_form.py(+load_roster.py) in~/rylobasic/systems/work-product-gateway/—FORMSconfig (offer / offer-training / prep), per-form sop + evidence bucket. Pulls submissions, extracts the envelope, resolvesemail → actor_id, inserts new rows intosop_events. Idempotent onevent_id. Verified end-to-end 2026-05-31 against a throwaway clone. Monorepo MR !260. - Actor roster
pospj-480915.work_product.actor_roster+ version-controlledroster.yaml— resolvessubmitted_by_email→ canonicalactor_id. Seeded across two pods (incoming hires start 2026-06-01, verified vs Hiring Pipeline + Gmail): Marissa Tah (agent) with admins Princess May Esogon + James Lin (the offer-form submitters) and setter Viola Hajdini; Brandon Plummer (agent) with setters Samuel Padilla + Rafferty Ojeba. Created + verified live 2026-05-31. Monorepo MR !258 (Marissa pod) + !259 (Brandon pod).
Decisions log
Decisions captured inline in the design doc (this project follows the "decisions in the design doc" pattern, like the admin-program-design):
- Work-Product Gateway — Design & Decisions — read model not system of record; BigQuery store; A/B/C/D evidence buckets; atomic event record; agent view deferred; never-show-a-green-light-you-can't-back.
Open issues
- BigQuery event-envelope table schema + creation —
work_product.sop_events, live 2026-05-31 (MR !257) - Known-actor roster (backs email → canonical
actor_id) —work_product.actor_roster+roster.yaml, Marissa + Brandon pods seeded, live 2026-05-31 (MR !258, !259) - Tally → BQ ingestion (offer form first) —
ingest_offer_form.py+load_roster.py, verified end-to-end vs a throwaway clone, 2026-05-31 (MR !260) - Schedule the ingestion (Cloud Run job + scheduler) —
pos-work-product-gateway+ 15-min scheduler, live 2026-05-31 - Practice-rep visibility (durable store + readable sheets + auto-refresh) — live 2026-06-02
- Per-agent Chat notification routed by pod, with Review link — live 2026-06-02
- Setter practice recordings ingested + surfaced (sheet + board tab, oldest→newest) — live 2026-06-04
- Per-agent isolated boards (registry-driven, replicable) + linked in the handbook — live 2026-06-04
- Super-admin / overseer mode — SHIPPED + LIVE 2026-06-23 (gateway image
6f2dc201).WPG_SUPER_ADMIN_EMAILSallowlist (ry@): view any agent's board / all-pods, any 50OS enrollee, verdict any item (recorded under the owning agent, audited). Fail-closed; non-super byte-identical. MRs !782-region. - All-pods "by type" filter — SHIPPED + VERIFIED LIVE 2026-06-24 (gateway image
51454e54, rev00070-98f, MR !782+!784). Type-picker dropdown filters both "Needs your eyes" + the recent feed by work-product type on the all-pods view (Appointments set / Offer intake / Offer prep / Pre-listing / Active listing report / Email drafts). Browser-verified each filter returns the right subset. - Appointment setter attribution (sister service
pos-appointment-scheduler, image54ed0d16, rev00014-qx8, MR !791+!793) — every booked appointment now writes one setter-attributedsop_eventsrow on the right agent's pod (was: only FUB-mismatch exceptions, blank submitter). Slug-routing bug fixed; clean bookings in the recent feed, mismatches in the review queue. Deploy verified; live end-to-end test on the next real booking. - Per-step evidence map from Marissa's SOP-Source-Intake (blocked on Marissa)
- Identity resolution (cross-source "same deal/person" linking) — the one thing the gateway owns
- Webhook fast path (real-time ingest) — SHIPPED + LIVE 2026-06-22 (image
969a675e). Isolated public shim (pos-wpg-webhook) verifies Tally's HMAC → publishes to Pub/Sub (wpg-form-submissions+ DLQ after 5 attempts) → OIDC push to/pubsub/form-submissionon the IAM-lockedpos-work-product-gateway(reuses the idempotent ingest). All 5 forms wired via the Tally API. Poll held at */15 (not yet relaxed to hourly) pending the first real webhook. DLQ + webhook-miss alarms live. Synthetic E2E verified idempotent. MR !725 (rebuild to the isolated-shim design) + !729 (manual bootstrap); rylobasic#35 closed.
References
- Active design + decisions: 2026-05-31-work-product-gateway-design
- SHIPPED upgrade — webhook fast path (design): 2026-06-03-wpg-webhook-fast-path-design
- SHIPPED upgrade — webhook fast path (impl plan, 17 tasks): 2026-06-04-wpg-webhook-fast-path-plan
- Pilot consumer: Marissa Tah Talent Program (the Jr Ops Coordinator admin)
- Dependency: Platform — BigQuery is the store
- Distinct from: Unified API Facade — that wraps vendor APIs outbound; this verifies work products inbound. Different direction, different failure modes.
- Code home:
~/rylobasic/systems/work-product-gateway/(ingestion, views insql/, sheet refresh, chat notify,provision_agent_board.py, tests, README). Cloud Run wrapper~/rylobasic/infra/cloud-run-services/pos-work-product-gateway/; terraform~/rylobasic/infra/terraform/pos-work-product-gateway/. Tally forms + builder live at~/rylobasic/domains/handbook-rycolston-com/tally/. Form ids: offer68MLMO, offer-trainingA7yWOe, prepEkMv1r, pre-listing7RM1VZ, listing-updateb5vK8L, setter-practicePdky4P. - Live surfaces: master board
1pbOJnESSvzhmle…(Ry, all-pods), Marissa board1wCLmm7t…, Brandon board1ZE4q64T…, Ryan-colston board16uMcgjangea…(provisioned 2026-06-07; ryan.colston@orchard commenter; empty until setter Anthony Lee logs gateway work — pod has 0 events as of 2026-06-07), Jr Ops Practice Reps1lF_beztk…, Setter Practice Recordings1p4ODv2A…. Per-agent board registry: BQ tablework_product.agent_boards(3 rows). Adding an agent: seesystems/work-product-gateway/README.md→ "Adding an agent".
2026-06-25 — Board: in-progress row + regeneration repoint. The web console (board.rycolston.com/board) now renders a "Requested · generating…" row from PENDING/PROCESSING cma_requests so a just-submitted CMA shows immediately (MR !845), and ingest_cma_requests re-points an UNREVIEWED board item to the fresh doc URL when a report is regenerated (events_to_repoint, MR !844; reviewed rows never overwritten).
- 2026-07-01 — Deployed tonight's WPG-resident hardening (image ba817009): 50OS idempotent ingest, payroll compare-and-set marks + banking warnings, coach per-agent play keys. Slot-claim/scheduler + watchdog fixes deployed to their own services same night.