A compact audit trail for ReplyBox pull requests that changed the wiki. Start with the bullets, then use the metadata only when you need to trace the source PR or merge SHA.
development main page updates PR history
Read first
The bullet list explains what changed in the wiki.
Trace if needed
The metadata strip keeps the PR, branch, repo, wiki branch, and merge SHA.
PR #1218 merged into development: chore: sync main into development (alembic 0193 + 0194 merge head). (https://github.com/utopiabuilder/replybox-dev/pull/1218)
development
¶PR #1202feat: manage member access from the admin portal (#1120)
PR #1214 merged into development: feat(workspaces): hide Personal workspaces from platform admins' switcher (#1192). (https://github.com/utopiabuilder/replybox-dev/pull/1214)
development
¶PR #1196feat(admin): Module access tab — per-workspace access for each sales module and calendar (#1185)
PR #1196 merged into development: feat(admin): Module access tab — per-workspace access for each sales module and calendar (#1185). (https://github.com/utopiabuilder/replybox-dev/pull/1196)
development
¶PR #1190feat(web): manage access for several members at once (#1120)
PR #1190 merged into development: feat(web): manage access for several members at once (#1120). (https://github.com/utopiabuilder/replybox-dev/pull/1190)
development
¶PR #1189feat(web): workspace filter on Members — roles and access across workspaces (#1120)
PR #1189 merged into development: feat(web): workspace filter on Members — roles and access across workspaces (#1120). (https://github.com/utopiabuilder/replybox-dev/pull/1189)
development
¶PR #1155Revert #1063: Scaffolding and Lorry Crane order creation
PR #1148 merged into development: feat(flows): import a tag-only ChatDaddy step as blank Start -> Add Tag (#1114). (https://github.com/utopiabuilder/replybox-dev/pull/1148)
development
¶PR #1063Add Scaffolding and Lorry Crane order creation
PR #1121 merged into development: feat(sales-orders): Create Order phase 1 — open to everyone, matches Encik Beku's wizard. (https://github.com/utopiabuilder/replybox-dev/pull/1121)
development
¶PR #1122feat(flows): blank message step runs its tags without sending (#1114)
PR #1137 merged into development: fix(access): Edit sent messages toggle on Manage Access + backfill for custom access. (https://github.com/utopiabuilder/replybox-dev/pull/1137)
PR #1116 merged into development: feat(mcp): batch send — one prepared message to up to 10 numbers, one approval (#1112). (https://github.com/utopiabuilder/replybox-dev/pull/1116)
development
¶PR #1134fix(inbox): a malformed conversation page no longer crashes the inbox
PR #1134 merged into development: fix(inbox): a malformed conversation page no longer crashes the inbox. (https://github.com/utopiabuilder/replybox-dev/pull/1134)
development
¶PR #1125ci: Promote Web (external) workflow (same file as main #1124)
PR #1125 merged into development: ci: Promote Web (external) workflow (same file as main #1124). (https://github.com/utopiabuilder/replybox-dev/pull/1125)
development
¶PR #1098fix(api): type the member presence payload as dict[str, Any]
PR #1098 merged into development: fix(api): type the member presence payload as dict[str, Any]. (https://github.com/utopiabuilder/replybox-dev/pull/1098)
development
¶PR #1097feat(web): stop and catch "Page Unresponsive" freezes: observer write cap, hang detector (#1094)
PR #1077 merged into development: feat: Create Order for Encik Beku follows the Sales Module wizard. (https://github.com/utopiabuilder/replybox-dev/pull/1077)
development
¶PR #1065Add sender avatars and live presence, and fix sidebar controls
PR #1065 merged into development: Add sender avatars and live presence, and fix sidebar controls. (https://github.com/utopiabuilder/replybox-dev/pull/1065)
development
¶PR #1041fix(api): channel merge keeps a shell an outside table still names (#584)
PR #1041 merged into development: fix(api): channel merge keeps a shell an outside table still names (#584). (https://github.com/utopiabuilder/replybox-dev/pull/1041)
development
¶PR #1036chore: sync main into development, one alembic head (0180)
PR #1036 merged into development: chore: sync main into development, one alembic head (0180). (https://github.com/utopiabuilder/replybox-dev/pull/1036)
PR #1031 merged into development: feat(web): bug reports record PC memory, heap, inbox tabs and cache size. (https://github.com/utopiabuilder/replybox-dev/pull/1031)
development
¶PR #1032feat(inbox): Create Order wizard pop-up, any business unit (#637)
PR #1032 merged into development: feat(inbox): Create Order wizard pop-up, any business unit (#637). (https://github.com/utopiabuilder/replybox-dev/pull/1032)
development
¶PR #619feat(api): duplicate-channel merge tool — fold a dead channel into the live one (ADR 054, #584)
PR #619 merged into development: feat(api): duplicate-channel merge tool — fold a dead channel into the live one (ADR 054, #584). (https://github.com/utopiabuilder/replybox-dev/pull/619)
development
¶PR #891feat: Create Order from a chat into Encik Beku, phase 1 (#637)
PR #891 merged into development: feat: Create Order from a chat into Encik Beku, phase 1 (#637). (https://github.com/utopiabuilder/replybox-dev/pull/891)
development
¶PR #1016fix(ai): OpenAI out-of-credit answer rests as quota
PR #977 merged into development: feat(mcp): prepare a WhatsApp message with a file (PDF or image). (https://github.com/utopiabuilder/replybox-dev/pull/977)
development
¶PR #968feat(tickets): live status tracker, Current/Completed tabs, clear closed state
PR #968 merged into development: feat(tickets): live status tracker, Current/Completed tabs, clear closed state. (https://github.com/utopiabuilder/replybox-dev/pull/968)
development
¶PR #962feat(watchdog): alert on API 5xx bursts, name the likely cause, keep a JSON log
PR #962 merged into development: feat(watchdog): alert on API 5xx bursts, name the likely cause, keep a JSON log. (https://github.com/utopiabuilder/replybox-dev/pull/962)
development
¶PR #961fix(web): Channels shows every ticked workspace; at most 3 shown together (#957)
PR #961 merged into development: fix(web): Channels shows every ticked workspace; at most 3 shown together (#957). (https://github.com/utopiabuilder/replybox-dev/pull/961)
development
¶PR #960feat: "Created via ChatGPT" badge on AI-made flows and keyword replies (#951, part 2)
PR #960 merged into development: feat: "Created via ChatGPT" badge on AI-made flows and keyword replies (#951, part 2). (https://github.com/utopiabuilder/replybox-dev/pull/960)
development
¶PR #959feat(web): honest Trigger card status in Flow Builder (#951, part 1)
PR #959 merged into development: feat(web): honest Trigger card status in Flow Builder (#951, part 1). (https://github.com/utopiabuilder/replybox-dev/pull/959)
PR #973 merged into development: Ask Toppie: open to everyone with My day + record every question + CY/Charlie review list. (https://github.com/utopiabuilder/replybox-dev/pull/973)
development
¶PR #970Technicians: Archive only where it works (can_archive)
PR #965 merged into development: My day technicians by workspace: three clock looks, archive (CY 1 Oct). (https://github.com/utopiabuilder/replybox-dev/pull/965)
development
¶PR #953Improve Quick Look phone and note controls
PR #952 merged into development: feat: bug reports become tickets with a reporter↔team conversation. (https://github.com/utopiabuilder/replybox-dev/pull/952)
PR #918 merged into development: Ask Toppie: a WhatsApp-style sales chat on My day (CY + Charlie trial). (https://github.com/utopiabuilder/replybox-dev/pull/918)
development
¶PR #935Phone = WhatsApp iOS: icon tab bar with Chats in the middle, one-row header and composer, touch picker for Reply IQ
PR #935 merged into development: Phone = WhatsApp iOS: icon tab bar with Chats in the middle, one-row header and composer, touch picker for Reply IQ. (https://github.com/utopiabuilder/replybox-dev/pull/935)
development
¶PR #936fix(avatars): re-ask pictureless chats, stop the own-line picture loop, show sender pictures on group messages
PR #936 merged into development: fix(avatars): re-ask pictureless chats, stop the own-line picture loop, show sender pictures on group messages. (https://github.com/utopiabuilder/replybox-dev/pull/936)
development
¶PR #934Badges v3 polish: drawer descriptions, 44px info + skip link, confetti gone by 2.5 s
PR #886 merged into development: feat(admin): every workspace's bug reports in the operator portal. (https://github.com/utopiabuilder/replybox-dev/pull/886)
PR #851 merged into development: feat(mcp): prepare a message to a phone number with no chat yet (#803). (https://github.com/utopiabuilder/replybox-dev/pull/851)
development
¶PR #893feat(admin): customer detail page; table leads with the account name
PR #853 merged into development: Web: lazy emoji data and dialogs, IQ split, fix page freeze after Delete chat → Cancel. (https://github.com/utopiabuilder/replybox-dev/pull/853)
development
¶PR #856sync: main → development (29 Sep, SHIPPED.md both lines)
PR #832 merged into development: feat(connector): stall profiler — name the JS hogging the main thread during lag (#728 follow-up). (https://github.com/utopiabuilder/replybox-dev/pull/832)
development
¶PR #846docs(shipped): multi-select inbox + Productivity Time release (#842)
PR #844 merged into development: Inbox: tick several workspaces and several WhatsApp numbers — one chat list, remembered at sign-in. (https://github.com/utopiabuilder/replybox-dev/pull/844)
development
¶PR #843fix(web): Expand-on-hover rail shrinks back once the pointer leaves
PR #843 merged into development: fix(web): Expand-on-hover rail shrinks back once the pointer leaves. (https://github.com/utopiabuilder/replybox-dev/pull/843)
development
¶PR #840feat(my-day): group line = a top-quarter consultant's usual day; Day view shows progress to it
PR #840 merged into development: feat(my-day): group line = a top-quarter consultant's usual day; Day view shows progress to it. (https://github.com/utopiabuilder/replybox-dev/pull/840)
PR #835 merged into development: feat(web): new-message sound is WhatsApp's own notification sound. (https://github.com/utopiabuilder/replybox-dev/pull/835)
PR #827 merged into development: Rankings: art behind the whole page, Call performance in the boards' frame, board-named URLs, CRM hidden. (https://github.com/utopiabuilder/replybox-dev/pull/827)
development
¶PR #826fix(inbox): stop the chat list re-downloading the whole inbox (#813)
PR #826 merged into development: fix(inbox): stop the chat list re-downloading the whole inbox (#813). (https://github.com/utopiabuilder/replybox-dev/pull/826)
development
¶PR #825fix(inbox): only the active chat tab asks the API for its chat (#814)
PR #825 merged into development: fix(inbox): only the active chat tab asks the API for its chat (#814). (https://github.com/utopiabuilder/replybox-dev/pull/825)
development
¶PR #818docs: run the customer stack locally, beside internal
PR #817 merged into development: fix(accounts): a deleted account lets go of Google and cannot be let back in. (https://github.com/utopiabuilder/replybox-dev/pull/817)
development
¶PR #815feat(connector): freeze recorder — capture thread evidence before the liveness restart (#728)
PR #808 merged into development: feat(mcp): connect ChatGPT to several workspaces in one approval (#759). (https://github.com/utopiabuilder/replybox-dev/pull/808)
development
¶PR #805feat: My Bug Reports — let every member track the reports they filed (#802)
PR #805 merged into development: feat: My Bug Reports — let every member track the reports they filed (#802). (https://github.com/utopiabuilder/replybox-dev/pull/805)
development
¶PR #824docs(shipped): Hub staff photos switched on
PR #820 merged into development: View as a staff member (read only) + continuous dusk rail corner. (https://github.com/utopiabuilder/replybox-dev/pull/820)
PR #812 merged into development: My day polish: no load jumps on Home + dead r11 writer, backfill help, one switch read. (https://github.com/utopiabuilder/replybox-dev/pull/812)
development
¶PR #806Create a customer outright, with no sign-up
PR #797 merged into development: My day go live: rounds 10–12 + development merge + 40/day sales roster. (https://github.com/utopiabuilder/replybox-dev/pull/797)
PR #784 merged into development: fix(api): clear orphaned job records before a deduped re-enqueue (avatar sweep stall). (https://github.com/utopiabuilder/replybox-dev/pull/784)
development
¶PR #792docs: record verified landing motion release
PR #789 merged into development: sync: main -> development (rankings line companies #786, shipped #787). (https://github.com/utopiabuilder/replybox-dev/pull/789)
development
¶PR #783docs: SHIPPED.md — ReplyBox wow round 1 web (#746)
PR #746 merged into development: ReplyBox wow round 1: Emerald Dusk rail, new sign-in, faster chat open, one home per feature, ⌘K actions. (https://github.com/utopiabuilder/replybox-dev/pull/746)
development
¶PR #761feat(dialog): enhance SaveViewDialog with tag selection and improved layout
PR #761 merged into development: feat(dialog): enhance SaveViewDialog with tag selection and improved layout. (https://github.com/utopiabuilder/replybox-dev/pull/761)
development
¶PR #769fix(inbox): show channel choices above transfer dialog
PR #780 merged into development: Terms acceptance, link feature defaults, and no dead ends on the way in. (https://github.com/utopiabuilder/replybox-dev/pull/780)
development
¶PR #777Tell someone their sign-up link is closed before they fill in a form
PR #777 merged into development: Tell someone their sign-up link is closed before they fill in a form. (https://github.com/utopiabuilder/replybox-dev/pull/777)
development
¶PR #774Every locked feature looks locked, including the ones that didn't
PR #774 merged into development: Every locked feature looks locked, including the ones that didn't. (https://github.com/utopiabuilder/replybox-dev/pull/774)
PR #771 merged into development: Portal: feature unlocks, access periods, and a lock screen that explains. (https://github.com/utopiabuilder/replybox-dev/pull/771)
development
¶PR #764fix(web): the ChatGPT setup names the Add app step
PR #762 merged into development: Admin portal: tabs, and the power to pause or delete an account. (https://github.com/utopiabuilder/replybox-dev/pull/762)
development
¶PR #758Operator portal that reads at a glance, and a sign-up a customer can walk through
PR #758 merged into development: Operator portal that reads at a glance, and a sign-up a customer can walk through. (https://github.com/utopiabuilder/replybox-dev/pull/758)
development
¶PR #756feat(admin): make the portal readable at a glance
PR #753 merged into development: fix(admin): don't offer a QR for a link that cannot admit anyone. (https://github.com/utopiabuilder/replybox-dev/pull/753)
development
¶PR #754fix(mcp): reach the endpoint from a browser, return to consent after SSO, and
set ChatGPT up with a prompt
PR #754 merged into development: fix(mcp): reach the endpoint from a browser, return to consent after SSO, and set ChatGPT up with a prompt. (https://github.com/utopiabuilder/replybox-dev/pull/754)
development
¶PR #743fix(inbox): show filter pickers above save dialog
PR #744 merged into development: Operator portal: customers, limits and an audit trail (#613). (https://github.com/utopiabuilder/replybox-dev/pull/744)
Adds an opt-in IQ rules feed: copilot fetches per-line declared rules and places them in the SYSTEM prompt.
Feed requests are HMAC-SHA256-signed (canonical path+query); the signature is an interop contract with Reply IQ.
Fail-open: any fetch failure returns no rules and does not block suggestions; successes cached per-line (default 60s), failures cached for a shorter window.
The rules revision applied is recorded as rules_hash on suggestion snapshots for later audit.
development
¶PR #655docs(SHIPPED): 21 Sep round 17 + API + CI lines
Add manual GitHub Action promote-web.yml to promote staged Vercel production deployments via workflow_dispatch.
Workflow requires deployment_id and optional expected_sha; uses VERCEL_TOKEN, VERCEL_PROJECT_ID, VERCEL_ORG_ID from secrets.
Validates project ownership, READY state, production build target, and commit SHA before calling promote; then polls until aliases and production target serve the deployment.
Fails loudly on validation or confirmation errors; run timeout is 10 minutes and alias confirmation window is ~4 minutes.
development
¶PR #639UI/UX round 16 web release: header name opens the profile sheet (D4) + honest filter-chip counts (D3 web half)
Frontend-only change: all edits confined to apps/web; apps/api and apps/connector unchanged.
CI/build green on commit 9e7f6d1b: tsc 0 · lint 0 · vitest 974 passed · next build 0.
Showcase live-verified at https://showcase-production-6fa3.up.railway.app; diff reports at /Volumes/ExternalData/replybox-uiux-20260913/reports/phase9-diff-review.html.
Release branch development already contains today's origin/main; API/connector drafts are intentionally held for a later window.
development
¶PR #625docs: SHIPPED line for the IQ line firewall release
API may start an optional in-process periodic drain when IQ_FEEDBACK_V2_DRAIN_ENABLED=1 and hub source drain is allowed.
IQ_FEEDBACK_V2_DRAIN_INTERVAL_SECONDS is textual, accepts only ASCII digits 5–300; invalid values disable the loop and emit iq_feedback_v2_drain_interval_invalid.
Multiple API workers are safe: drain uses DB row claiming (skip_locked) to prevent double delivery.
The drain task is not imported or started when the flag is off; shutdown cancels the task cleanly.
development
¶PR #589Scope reply copilot knowledge to the conversation's channel (issue #581, flag-gated)
Frontend renews an open pairing's lease every 20s; API lease allows ~90s so two renewals can be missed safely.
Closing a queued pairing modal sends DELETE pairing-queue, immediately freeing the slot for the next waiting channel.
Channels list polls every 15s while any channel has pairing_queued_at so positions update when others finish.
Realtime channel.status events may include pairing_queued_at and pairing_promoted; handlers patch queue fields without stamping connect/disconnect clocks.
development
¶PR #615feat(connector): end history imports on a quiet period, bound the backlog, stop deleted channels (#612)
History imports now end after HISTORY_IMPORT_QUIET_MS quiet period and backlog upload; HISTORY_IMPORT_MAX_MS is a 60m ceiling (logs & alerts).
Imports are keyed per channel with per-channel FIFO chunking; socket reconnects do not finalize an import and decoded batches free after their last chunk posts.
Deleted channels produce ChannelGoneError (410/404), cancel the import and evict the channel; 410 logs out, 404 is confirmed via /exists first.
Heartbeat exposes importing and import_capacity; MAX_CONCURRENT_IMPORTS controls concurrent first-time imports and IMPORT_HEAP_PAUSE_PCT/RESUME_PCT pause admission on heap pressure.
development
¶PR #616feat(api): queue first pairings before the QR code and hold import slots until history stops (#612)
The connector now sends WhatsApp @lid to phone-number matches it learns back to ReplyBox, so the app can remember them after a connector restart.
ReplyBox stores those matches as identity evidence only. It does not merge contacts automatically; operators still control merges with app.cli merge-username-contacts --apply.
The report path is rollout-safe: it is behind LID_MAPPING_REPORT_ENABLED, uses the internal POST /channels/{cid}/lid-mappings endpoint, and treats temporary API misses as warnings.
Tests were added around the new evidence recording behavior against Postgres.
development
¶PR #499fix: workflow deployment be original process
PR #499 (e398036): Change frontend workflow to create a staged Vercel production deployment using --skip-domain; update deployment docs to explain staging, rationale, and manual promotion procedure.
development
¶PR #497fix: make Message Flow sends reach WhatsApp in builder order
PR #1216 merged into main: fix(alembic): merge the two migration heads that block every API deploy. (https://github.com/utopiabuilder/replybox-dev/pull/1216)
main
¶PR #1210Reply copilot: spare saved-reply slots go to high-use replies (D6)
PR #1205 merged into main: Send product: show IQ's finished captions; one server price guard. (https://github.com/utopiabuilder/replybox-dev/pull/1205)
PR #1182 merged into main: feat(iq-room): every staff member who sends replies may open IQ Center. (https://github.com/utopiabuilder/replybox-dev/pull/1182)
main
¶PR #1184SHIPPED: read media before the bot drafts (#1129)
PR #1181 merged into main: feat(reply-plan): the planner uses a meaning lesson, off by default (#1140 part B). (https://github.com/utopiabuilder/replybox-dev/pull/1181)
main
¶PR #1174Voice typing: tell the Studio who spoke and which dictation it is (ids only)
PR #1174 merged into main: Voice typing: tell the Studio who spoke and which dictation it is (ids only). (https://github.com/utopiabuilder/replybox-dev/pull/1174)
main
¶PR #1070fix(reply decision report): count rank 1 sent as a later message as unchanged
PR #1070 merged into main: fix(reply decision report): count rank 1 sent as a later message as unchanged. (https://github.com/utopiabuilder/replybox-dev/pull/1070)
main
¶PR #1129Read every photo, voice note, PDF and video before the bot drafts (auto-reading workspaces only)
PR #1129 merged into main: Read every photo, voice note, PDF and video before the bot drafts (auto-reading workspaces only). (https://github.com/utopiabuilder/replybox-dev/pull/1129)
main
¶PR #1180docs(shipped): #1144 reply origin tag (off), #1153 meaning lesson record
PR #1153 merged into main: Check answers: save "the meaning is wrong" as a lesson for that kind of chat (#1140 part A, API only). (https://github.com/utopiabuilder/replybox-dev/pull/1153)
PR #1144 merged into main: feat(api): record how each sent reply was made, and every customer message (off by default). (https://github.com/utopiabuilder/replybox-dev/pull/1144)
main
¶PR #1173fix(contact-card): keep the layout of an unreadable card with the message (#1048)
PR #1173 merged into main: fix(contact-card): keep the layout of an unreadable card with the message (#1048). (https://github.com/utopiabuilder/replybox-dev/pull/1173)
main
¶PR #1177feat(recap): the recap call also reads the intention (off by default; shadow / on)
PR #1177 merged into main: feat(recap): the recap call also reads the intention (off by default; shadow / on). (https://github.com/utopiabuilder/replybox-dev/pull/1177)
PR #1152 merged into main: Ask Toppie: room in the corner, drag to fixed places, a "Toppie" tab (#1136). (https://github.com/utopiabuilder/replybox-dev/pull/1152)
main
¶PR #1172Release 2 (CY fix round, 8 Oct): Toppie button, pins on the photo corner, suggested replies Hide remembered on phone, empty-screen animation
PR #1170 merged into main: docs(shipped): #1161 + #1168 intention level only on real open requests. (https://github.com/utopiabuilder/replybox-dev/pull/1170)
main
¶PR #1168fix(inbox): intention level off for crew saved as Tech/Subcon; whole-message never-mind-thanks is a no
PR #1168 merged into main: fix(inbox): intention level off for crew saved as Tech/Subcon; whole-message never-mind-thanks is a no. (https://github.com/utopiabuilder/replybox-dev/pull/1168)
main
¶PR #1163docs(shipped): #1160 pins, Forward search, saved-reply menu
PR #1161 merged into main: fix(inbox): intention level only on real open requests; badge clear of the ring. (https://github.com/utopiabuilder/replybox-dev/pull/1161)
main
¶PR #1145Forward: search every chat, not only the 50 newest
PR #1160 merged into main: Release: pins, Forward search across all chats, saved-reply "/" menu (CY fix round). (https://github.com/utopiabuilder/replybox-dev/pull/1160)
PR #1149 merged into main: Landing V3: AI-first Intelligent Reply System, characters, far fewer words on phones. (https://github.com/utopiabuilder/replybox-dev/pull/1149)
main
¶PR #1146docs(shipped): ring in blues + intention-level icon (#1132)
PR #1132 merged into main: feat(inbox): buying-history ring in blues + intention-level icon on the photo. (https://github.com/utopiabuilder/replybox-dev/pull/1132)
PR #1128 merged into main: fix(contacts): username-only contact cards keep their WhatsApp ID, open the chat, and can be forwarded (#1048). (https://github.com/utopiabuilder/replybox-dev/pull/1128)
PR #1126 merged into main: fix(calendar): technician calendar only where Encik Beku answers the login. (https://github.com/utopiabuilder/replybox-dev/pull/1126)
main
¶PR #1104feat(calendar): technician calendar from Encik Beku — Day/Week columns, free slots, range search (#1101)
PR #1106 merged into main: Ask Toppie: one floating top-right spot on every page, tuck to corner, reply count badge. (https://github.com/utopiabuilder/replybox-dev/pull/1106)
main
¶PR #1108docs(shipped): 6 Oct meeting wave 1 (#1105)
PR #1091 merged into main: feat(contacts): share username-only contacts, save a callable number (#1083). (https://github.com/utopiabuilder/replybox-dev/pull/1091)
main
¶PR #1089fix(web): each tab keeps its own workspace; filters and search cover every ticked workspace (#1081)
PR #1089 merged into main: fix(web): each tab keeps its own workspace; filters and search cover every ticked workspace (#1081). (https://github.com/utopiabuilder/replybox-dev/pull/1089)
main
¶PR #1095fix(reply): let the Studio accept an extra key inside a reply slot
PR #1095 merged into main: fix(reply): let the Studio accept an extra key inside a reply slot. (https://github.com/utopiabuilder/replybox-dev/pull/1095)
main
¶PR #1099Promote: Development --> Main (2026-10-07)
PR #1080 merged into main: fix(tags): remember every staff tag removal; time budget for the location tagger (#1049). (https://github.com/utopiabuilder/replybox-dev/pull/1080)
main
¶PR #1079docs(shipped): #1062 self-serve location auto-tag, ISCB on
PR #1078 merged into main: fix(reply-copilot): stop waiting for a stored set once the writer gives up. (https://github.com/utopiabuilder/replybox-dev/pull/1078)
main
¶PR #1062feat(tags): self-serve location tagging by state (#1049), off by default
PR #1062 merged into main: feat(tags): self-serve location tagging by state (#1049), off by default. (https://github.com/utopiabuilder/replybox-dev/pull/1062)
main
¶PR #1076docs(shipped): landing v2 live at / and /pricing (#1074)
PR #1074 merged into main: Landing v2 live at / and /pricing (signed-out visitors); staff sign-in unchanged. (https://github.com/utopiabuilder/replybox-dev/pull/1074)
main
¶PR #1073fix(web): tab title loop froze chats with double-spaced names (#1045)
PR #1071 merged into main: fix(reply-copilot): honest suggestion-failure counts, one retry for dropped auto requests, no same-second false 409. (https://github.com/utopiabuilder/replybox-dev/pull/1071)
main
¶PR #1069feat(inbox): freeze recorder — capture what real PCs run during "Page Unresponsive" (#1045)
PR #1069 merged into main: feat(inbox): freeze recorder — capture what real PCs run during "Page Unresponsive" (#1045). (https://github.com/utopiabuilder/replybox-dev/pull/1069)
main
¶PR #1060fix(contacts): shared contact card keeps its number so staff can open the chat (#1048)
PR #1060 merged into main: fix(contacts): shared contact card keeps its number so staff can open the chat (#1048). (https://github.com/utopiabuilder/replybox-dev/pull/1060)
main
¶PR #1055fix(inbox): stop background chat tabs rescanning the whole cache on every change (#1045)
PR #1055 merged into main: fix(inbox): stop background chat tabs rescanning the whole cache on every change (#1045). (https://github.com/utopiabuilder/replybox-dev/pull/1055)
main
¶PR #1061Move the floating Ask Toppie button to the top right (#1054)
PR #1052 merged into main: fix(inbox): show the sending channel on each Forward picker row (#1047). (https://github.com/utopiabuilder/replybox-dev/pull/1052)
PR #1058 merged into main: Reply decision + code-computed confidence, recorded in shadow (off by default). (https://github.com/utopiabuilder/replybox-dev/pull/1058)
main
¶PR #1059docs(shipped): saved-reply use counter (#1040, #1056)
PR #1040 merged into main: Saved replies: count every use, most-used first in '/', picture on the right, IQ edit lane (flag off). (https://github.com/utopiabuilder/replybox-dev/pull/1040)
main
¶PR #1038Open IQ Center link for managers on Check answers: one-time sign-in handoff (flag off)
PR #1038 merged into main: Open IQ Center link for managers on Check answers: one-time sign-in handoff (flag off). (https://github.com/utopiabuilder/replybox-dev/pull/1038)
main
¶PR #1039AI usage: exact MiniMax tokens, measured plan size, fees confirmed by CY
PR #1039 merged into main: AI usage: exact MiniMax tokens, measured plan size, fees confirmed by CY. (https://github.com/utopiabuilder/replybox-dev/pull/1039)
main
¶PR #1043feat(calendar): add fulfilment calendar page and API integration for …
PR #1043 merged into main: feat(calendar): add fulfilment calendar page and API integration for …. (https://github.com/utopiabuilder/replybox-dev/pull/1043)
PR #1011 merged into main: Public API: POST /public/ai/interpret — Studio subscription JSON job for Hera (off unless workspace AND token allowlisted). (https://github.com/utopiabuilder/replybox-dev/pull/1011)
main
¶PR #1027Teach a concept: a taught rule can change which reply is suggested first (reply engine v2.6)
PR #1027 merged into main: Teach a concept: a taught rule can change which reply is suggested first (reply engine v2.6). (https://github.com/utopiabuilder/replybox-dev/pull/1027)
main
¶PR #1034Ask Toppie: floating on every page, one continuous saved chat, per-person answer language
PR #1034 merged into main: Ask Toppie: floating on every page, one continuous saved chat, per-person answer language. (https://github.com/utopiabuilder/replybox-dev/pull/1034)
main
¶PR #997Launch day: Reply IQ multi-bubble replies + What's new launch notes with videos
PR #997 merged into main: Launch day: Reply IQ multi-bubble replies + What's new launch notes with videos. (https://github.com/utopiabuilder/replybox-dev/pull/997)
main
¶PR #1026AI usage counter: tokens, API price vs subscription cost, for CY and Charlie only
PR #1026 merged into main: AI usage counter: tokens, API price vs subscription cost, for CY and Charlie only. (https://github.com/utopiabuilder/replybox-dev/pull/1026)
main
¶PR #1024fix(drafts): one slow Studio job no longer moves the next drafts off the Studio
PR #1024 merged into main: fix(drafts): one slow Studio job no longer moves the next drafts off the Studio. (https://github.com/utopiabuilder/replybox-dev/pull/1024)
main
¶PR #1018Recap bar + interest level L1/L2/L3/Cold, off by default (#1015)
PR #1013 merged into main: Reply engine v2.5.1: no welcome/thank-you flow at rank 1, confirm only after a yes, flows' own asks count (P2 round 3). (https://github.com/utopiabuilder/replybox-dev/pull/1013)
main
¶PR #1010Reply engine v2.5 (P1): v2 offers the flows staff run next on the line; voice-note transcripts reach drafts
PR #1010 merged into main: Reply engine v2.5 (P1): v2 offers the flows staff run next on the line; voice-note transcripts reach drafts. (https://github.com/utopiabuilder/replybox-dev/pull/1010)
main
¶PR #1012Reply engine v2.5: FLOW-vs-TYPE step, flow priors from real-choice sends only (P2)
PR #1005 merged into main: Public API: fetch a message's media with the org token (GET /public/messages/{id}/media). (https://github.com/utopiabuilder/replybox-dev/pull/1005)
main
¶PR #1006Check answers page: one suggested reply at a time, teach a rule, weekly card
PR #1006 merged into main: Check answers page: one suggested reply at a time, teach a rule, weekly card. (https://github.com/utopiabuilder/replybox-dev/pull/1006)
PR #1004 merged into main: Public API: react to a message (POST /public/messages/{id}/reaction). (https://github.com/utopiabuilder/replybox-dev/pull/1004)
main
¶PR #999feat(reply-iq): drafts by line kind (sales / customer service / collections) + 30-day catch-up
PR #999 merged into main: feat(reply-iq): drafts by line kind (sales / customer service / collections) + 30-day catch-up. (https://github.com/utopiabuilder/replybox-dev/pull/999)
main
¶PR #996Promote: Development --> Main (2026-10-03)
PR #988 merged into main: Reply IQ: Tab loops through saved replies, strip open by default with feedback on every draft, refresh prompt on. (https://github.com/utopiabuilder/replybox-dev/pull/988)
main
¶PR #987fix(reply-pregen): no 500 after waiting for a set that never came
PR #985 merged into main: fix(reply-pregen): sweep retries chats whose first try came back empty. (https://github.com/utopiabuilder/replybox-dev/pull/985)
main
¶PR #984fix(inbox): phone Back keeps Not replied and other list filters
PR #982 merged into main: Reply IQ: pre-written drafts for 14 days of unanswered chats + pinned chats. (https://github.com/utopiabuilder/replybox-dev/pull/982)
main
¶PR #980Message Flows: drag attachments to reorder them
PR #979 merged into main: Reply IQ: drafts written the moment a customer message lands — chats open with suggestions ready. (https://github.com/utopiabuilder/replybox-dev/pull/979)
main
¶PR #974My day: Technicians today by the work people logged (jobs/trips), not job titles
PR #974 merged into main: My day: Technicians today by the work people logged (jobs/trips), not job titles. (https://github.com/utopiabuilder/replybox-dev/pull/974)
main
¶PR #971Voice typing: click/tap to start and finish (no hold) + chat context for the engine
PR #971 merged into main: Voice typing: click/tap to start and finish (no hold) + chat context for the engine. (https://github.com/utopiabuilder/replybox-dev/pull/971)
main
¶PR #969Reply IQ: suggestions only in the strip with 👍/👎 feedback; Needs-to-know line under the chat header
PR #969 merged into main: Reply IQ: suggestions only in the strip with 👍/👎 feedback; Needs-to-know line under the chat header. (https://github.com/utopiabuilder/replybox-dev/pull/969)
PR #950 merged into main: fix(connector): one AsyncLocalStorage for all Baileys sockets — stops the daily stall/restart (#728). (https://github.com/utopiabuilder/replybox-dev/pull/950)
PR #937 merged into main: Voice typing: hold ⌘⌥ / Ctrl+Alt to dictate into the draft (ships dark). (https://github.com/utopiabuilder/replybox-dev/pull/937)
main
¶PR #933feat(api): voice typing — POST /organizations/{org}/dictation (Studio contract v2.2)
PR #920 merged into main: Inbox: Tab loops the reply suggestions, with a ⇥ Tab key in the chat box. (https://github.com/utopiabuilder/replybox-dev/pull/920)
main
¶PR #898fix(db): merge the two 0166 alembic heads (unblocks deploy)
PR #890 merged into main: feat(connector): CONNECTOR_NODE_FLAGS — run the --single-threaded-gc freeze experiment from settings. (https://github.com/utopiabuilder/replybox-dev/pull/890)
PR #875 merged into main: fix(my-day): the Studio's late note is never hidden behind a template copy. (https://github.com/utopiabuilder/replybox-dev/pull/875)
main
¶PR #868fix(my-day): the note never says "waiting", so the Studio's answer is kept
PR #868 merged into main: fix(my-day): the note never says "waiting", so the Studio's answer is kept. (https://github.com/utopiabuilder/replybox-dev/pull/868)
main
¶PR #858fix(ai-gateway): claim acknowledgement so a dead Studio long-poll never loses a job (#849)
PR #858 merged into main: fix(ai-gateway): claim acknowledgement so a dead Studio long-poll never loses a job (#849). (https://github.com/utopiabuilder/replybox-dev/pull/858)
main
¶PR #857SHIPPED: all AI on the Mac Studio, Google off (#854)
PR #854 merged into main: Every ReplyBox AI feature on the Studio: v2 media jobs + My day background note. (https://github.com/utopiabuilder/replybox-dev/pull/854)
PR #845 merged into main: Gemini key in header + copy-numbers-exactly (follow-up to AI failover #841) — HOLD for CY key OK. (https://github.com/utopiabuilder/replybox-dev/pull/845)
main
¶PR #848AI: ask CY's Mac Studio first (studio link), Gemini stays the fallback
PR #848 merged into main: AI: ask CY's Mac Studio first (studio link), Gemini stays the fallback. (https://github.com/utopiabuilder/replybox-dev/pull/848)
main
¶PR #842Release: multi-select workspaces + numbers (#844), Productivity Time (#840), rail hover (#843), AI provider chain inert (#841)
PR #822 merged into main: Release: View as a staff member (read-only) + continuous dusk corner. (https://github.com/utopiabuilder/replybox-dev/pull/822)
PR #800 merged into main: Release: My day go live (rounds 10–12) + avatar orphan fix (#797, #784). (https://github.com/utopiabuilder/replybox-dev/pull/800)
main
¶PR #798test(rankings): pin the member route test to its fixture's week
PR #794 merged into main: Rankings: leave lines in a Personal workspace off the missed-call board. (https://github.com/utopiabuilder/replybox-dev/pull/794)
main
¶PR #793docs: sync landing motion production receipt
PR #786 merged into main: Rankings: confirmed company per line from the call tracker; personal lines left out (#736). (https://github.com/utopiabuilder/replybox-dev/pull/786)
main
¶PR #782Promote: Development --> Main (ReplyBox wow round 1, #746)
PR #772 merged into main: feat(admin): feature unlocks, an access period, and a lock screen tha…. (https://github.com/utopiabuilder/replybox-dev/pull/772)
PR #760 merged into main: feat(signup): a registration space that asks about you, not a workspace. (https://github.com/utopiabuilder/replybox-dev/pull/760)
main
¶PR #757feat(admin): make the portal readable at a glance
Add a DigitalOcean post-deploy-check job that records connected-WhatsApp-lines baseline and fails if API /healthz is down or fewer lines are connected afterward.
New inbox LIST fields: has_note (bool) and notes_count (int). has_note comes from a correlated EXISTS; notes_count is a correlated scalar count.
LIST endpoint accepts ?has_note=1|0 filter. Correlated subqueries preserve ordering/pagination and avoid N+1 queries.
The "Not replied"/unanswered rule now excludes group chats so badge counts and list contents remain consistent.
main
¶PR #646docs(SHIPPED) → main: 21 Sep live release lines
Alembic migration 0149_message_flow_channels adds message_flow_channels (one new table). It is strictly additive with no backfill.
New env REPLY_COPILOT_CHANNEL_FIREWALL (default false). When true, copilot scopes saved replies/tone/flows to the conversation's channel and fails closed if unknown.
IQ feedback v2 drain loop runs in-process only when the IQ drain flags are enabled; new IQ_FEEDBACK_V2_DRAIN_INTERVAL_SECONDS controls the tick (5–300s, default 30).
Added conversations.last_message_status column with one-shot backfill; rollups and receipt sync keep it current for inbox tick rendering.
Added conversations.first_message_at column with one-shot backfill; only inbound ingest and contact-merge rollups update it to reflect customer's first message.
Media endpoint now supports byte-range (Range) and HEAD; responses include Accept-Ranges and Content-Range to enable seekable voice notes.
main
¶PR #523Preserve saved Message Flow order in IQ reply previews
New API endpoints to list and preview saved flows: GET /saved-flows and POST /saved-flows/preview (preview is read-only).
IQ v4 approvals may include a flow_reference; server verifies revision, ordered nodes, draft segment ids and approved media hashes before send authorization.
Preview operations create zero outbound rows or jobs — safe for UI previews and automated checks.
Transport enforcement: max 8 items per sequence; delays/branches/variables/extra-media nodes remain unsupported by preview/approval.
main
¶PR #525Preview saved flows and bind native quotes for IQ replies
Adds read-only IQ endpoints: GET /saved-flows, POST /saved-flows/preview, GET /quote-targets, POST /quote-preview for staff flow and quote preview.
Bundle v4 schema extended with flow_reference and reply_to; server verifies referenced flow proof at approval and rejects mismatches with 503/409 as appropriate.
Quote resolution now acquires the target Message row with FOR UPDATE NOWAIT; lock contention surfaces as 503 (iq_bundle_quote_temporarily_unavailable) instead of deadlocking.
main
¶PR #516IQ Center integration + reply assistance (N01–N05), all IQ flags default off
PR #516: Merge IQ Center successor branch (c458d98 → main). Adds Reply Copilot auto-assist (N01), interaction telemetry + outbox (N02/N04), snapshot + feedback tables and migrations, IQ auth bridge and outbox recovery (12 alembic revisions 0133–0144), picture-flow grounding and flow-backed suggestions (N05). CI/workflow additions for IQ QA, .env.example additions for new Copilot/IQ flags (IQ_* flags default OFF). Fixes: ruff/mypy cleanups, legacy copilot snapshot write safety, gating UI on ai_reply_copilot when flags are off, and a DB pytest hang root-caused by an unbound REDIS_URL in conftest. Deploy note: touches baileys-connector queue files — rebuild connector image and restart WhatsApp sessions in a quiet window. Known open item left separate: pre-existing unbounded BullMQ enqueue can hang on a black-holed Redis.
Vercel frontend deploys are now staged by default in the CI (vercel deploy --skip-domain) so domains are assigned only when an operator promotes the staged build; the workflow adds verification of the staged deployment to ensure it belongs to this project/commit and is READY before promotion.
Connector/media/avatars: added an avatar probe 'deferred' status and server-side handling (inbox_service.defer_contact_avatar) so a failed probe stamps a TTL/backoff instead of clearing stored avatars; media recovery windows adjusted and MEDIA_EXPIRED_AFTER_DAYS set to 90 with a new MEDIA_SWEEP_QUIET_HOURS_UTC-aware predicate to avoid running heavy sweeps during morning reconnect storms.
New internal evidence-only API: POST /channels/{cid}/lid-mappings to record connector-observed lid↔phone pairs (HMAC-protected, forgiving, best-effort, no auto-merge).
Message flow ordering: outbound status/receipt handlers now call advance_runs_on_send_settled to release the awaiting_send gate so flow runs progress when the connector confirms sends (with exceptions swallowed so webhook/write semantics stay idempotent).
Internal router now includes lid_mappings. Small other CI/workflow docs/comments added. See the merged PR for code-level diffs and exact implementation locations.
Add workflow to notify the replybox-wiki repo on merged PRs (.github/workflows/notify-wiki.yml) to trigger docs synces.
Introduce envelope-aware media handling: storage reads object metadata (MEDIA_ENVELOPE_META_KEY) and components use decrypt_media_envelope; ensure copy operations preserve metadata to avoid auth-tag failures.
Replace a global aggregate subquery over message_flow_run_steps with a correlated lateral/limit query to avoid full-table aggregation across tenants and dramatically reduce DB work for common dashboard calls.
main
¶PR #481fix the workflow dispatch url to match the replybox wiki repo
Corrected the notify-wiki dispatch URL so docs sync events target utopiabuilder/replybox-wiki.
Restored automatic documentation dispatches to the canonical wiki repository.
¶ 2026-09-16 - main PR #582: Add Telegram ops watchdog
Adds a production watchdog that detects WhatsApp sending delays, connection drops, API /healthz failures, and DigitalOcean restarts and alerts operators via Telegram.
Operator notes: run python -m app.cli watchdog (or use scripts/watchdog.ps1), requires DATABASE_URL, REDIS_URL, TELEGRAM_BOT_TOKEN, and TELEGRAM_CHAT_ID set; the watchdog is read-only.
¶ 2026-09-17 - development PR #615: connector: end history imports on quiet period, bound backlog, stop deleted channels (#612)
History imports now end after HISTORY_IMPORT_QUIET_MS quiet period and when backlog is uploaded; HISTORY_IMPORT_MAX_MS is a 60m ceiling (logs & alert).
Imports are keyed per channel and use per-channel FIFO chunking; transient socket reconnects no longer finalize imports; batches freed as chunks post.
Deleted channels cause ChannelGoneError (410/404), cancel imports and evict channels; 410 triggers logout, 404 is confirmed via /exists first.
Heartbeat adds importing and import_capacity; MAX_CONCURRENT_IMPORTS and IMPORT_HEAP_PAUSE_PCT/IMPORT_HEAP_RESUME_PCT control admission and are reported each beat.
¶ 2026-09-18 - feat/message-source-and-sent-via PR #606: feat(messaging): record broadcast/scheduled mechanism on flow-started messages
Wiki update summary: Add nullable message_flow_runs.mechanism column via Alembic migration 0151 (no backfill); start_run(..., mechanism=...) stores mechanism; broadcast and scheduled workers pass broadcast/scheduled; Workers read mechanism from the run row for message origins so the mechanism survives retries.
Promoted development -> main: web-only UI/UX round 15. No API/connector changes; connector and WhatsApp lines were not rebuilt.
Visual and UX fixes: consistent page scaffolding to avoid heading jumps, onChange form validation for Save, permission scope labels, and smoother open-chat sliding highlight.
¶ 2026-09-21 - development PR #658: UI/UX round 18 web chat-list spacing pass (S77)
UI-only spacing pass: number pill no longer overlaps the Chats|Calls toggle across common breakpoints.
Search well, chip row, and list-row text stacks adjusted to 12px edges and increased row breathing; row height and font sizes unchanged.
Added a dedicated stylesheet shard (s77.css) so width-band media queries and scoped rules avoid global/Tailwind ordering collisions.
Build/tests: tsc 0, lint 0, build 0, vitest 992/992. Changes are presentational; no API or data-model changes.