Open PR sweep: Oct 14

All 59 of Gera's open propflowai PRs as of 19:03Z, each with its verdict from a read-only survey. Finished: 59 of 59. Progress: the cleanup board.

Leave: someone is working on it: 20Needs a person: 17Fix conflicts, then merge: 7Close: already done another way: 5Adopt and finish: 4Finish and merge: 3Already merged: 2Being checked: 1
#19603Already merged
MERGED
feat(conversations): emergency on-call emails, calls and pickups show on the resident's th
Emergency on-call calls/emails/pickups show on the resident thread as team notices (part 3)
evidencegh pr view state=MERGED
#19608Already merged
MERGED
feat(conversations): a call forwarded to the maintenance line shows on the caller's thread
A forwarded maintenance-line call shows on the caller thread as a team notice (part 2)
evidencegh pr view state=MERGED; find-pane OPENED #19577,#19608
#19607Leave: someone is working on it
LEFT with its live owner
feat(voice): Clara answers Situs Group's line β€” bind to production Triage, route to situs-
Bind Situs Group's line to production Triage, route to situs-front-door (Situs line part 3)
evidenceDRAFT; depends on #19591 and #19592 (both OPEN, BLOCKED); last commit 17:35Z; lane transcript quiet since 17:54Z, parent c2a7b30b ALIVE
#19611Leave: someone is working on it
GREEN, WAITING ON GERA: comment "@claude review" (workflow-file review needs a person)
chore(ci): the docs-only fence's own prose no longer denies the `unlabeled` route #19536 a
The docs-only fence's own prose stops denying the unlabeled release route #19536 added (row bug-the-docs-only-fence-applies-a-hold...)
evidencelast commit 17:34Z; lane quiet since 17:50Z, parent 8d699f3b ALIVE and mentioned it at 19:18Z; +39/-14 1 file
#19626Leave: someone is working on it
MERGED
chore(work-orders): remove the "+ New Work Order" button from the Work Orders page
Remove the "+ New Work Order" button from the Work Orders page
evidenceMERGEABLE/CLEAN; propflow-code-reviewer APPROVED at head c6f8c331; last commit 17:53Z; lane quiet since 18:11Z, Driver 5447c10a ALIVE
#19630Leave: someone is working on it
MERGED (by its owner)
chore(scope): delete the dead one-company-at-a-time states (dashboard, Clara insights)
Delete the dead one-company-at-a-time states (dashboard, Clara insights)
evidencelast commit 19:06Z; APPROVED at head 5377f735 19:17Z; CI in progress; Driver 5447c10a ALIVE
#19633Leave: someone is working on it
MERGED
fix(scope): tenant + prospect detail open at All companies; email log answers several comp
Tenant + prospect detail pages open at All companies; email log answers several companies
evidencelast commit 18:31Z; APPROVED at head 55573596; merge-tree vs origin/main clean (0 conflicts); GitHub mergeable UNKNOWN; worktree file touched <60 min (data/admin-audit.jsonl only); lane quiet since 18:38Z, Driver ALIVE mentioned it 19:19Z
#19634Leave: someone is working on it
MERGED
fix(tests): the escaped-DynamoDB trace names the reader, not an empty list (part 1 of 2)
Escaped-DynamoDB trace names the reader, not an empty list (part 1 of 2)
evidencefind-pane OPENED #19634,#19666 lane WRITING 1s ago; worktree src file modified <60 min; last commit 18:37Z
#19639Leave: someone is working on it
LEFT with its live owner
feat(renewals): the board answers "All companies" β€” a bounded page of every company's buil
Renewals board answers All companies with a bounded page of every company's buildings
evidencefind-pane OPENED #19639 lane WRITING 5s ago; last commit 18:38Z
#19640Leave: someone is working on it
LEFT with its live owner
fix(home): How-it-works card as tall as the Solutions panels (480 phones/iPad, 550 desktop
How-it-works card matches the Solutions panel heights (480 phones/iPad, 550 desktop)
evidenceMERGEABLE/CLEAN; APPROVED at head 0b0b1032; last commit 18:47Z; Driver 048857ea (claude-redesign-landing) quiet 17.6 min
#19641Leave: someone is working on it
MERGED
test(life-safety): put the gas door's RUNTIME reach arm under a mutation control
Put the gas door's RUNTIME reach arm under a mutation control
evidencefind-pane OPENED #19641 lane WRITING 2s ago; control.ts modified <60 min; APPROVED at head b74a8a70; merge-tree clean
#19642Leave: someone is working on it
MERGED
feat(search): answer "All companies" from a bounded corpus instead of refusing (part 1)
Search answers All companies from a bounded corpus instead of refusing (part 1)
evidencelane transcript written 19:18Z; worktree touched <60 min; last commit 18:46Z
#19643Leave: someone is working on it
MERGED
ci(review): re-dispatch a review refused for a stale workflow copy from main, once per hea
Re-dispatch a review refused for a stale workflow copy, from main, once per head
evidencelast commit 19:02Z; lane written 19:15Z; test file modified <60 min; claude[bot] APPROVED at head dbf9dea7
#19644Leave: someone is working on it
MERGED
fix(vendors): the vendor page's jobs answer every selected company, never 'pick a company'
The vendor page's jobs answer every selected company, never 'pick a company'
evidencegera-propflow review 19:14Z; lane written 19:14Z; Driver ALIVE
#19648Leave: someone is working on it
MERGED (by its owner)
fix(cost): the 09:00Z spine cron stops starting a whole-table scan it cannot finish
The 09:00Z spine cron stops starting a whole-table scan it cannot finish (dock appfolio-sync-reads)
evidencelast commit 19:02Z; claude[bot] APPROVED at head b3fbcd44 19:14Z; lane WRITING 11s ago
#19653Leave: someone is working on it
MERGED (by its owner)
feat(scope): one shared "Choose one company" state β€” Portfolio Intelligence, Atlas, Ask Cl
One shared "Choose one company" state for Portfolio Intelligence, Atlas, Ask Clara (part 1/2)
evidencegera-propflow review at cf8427fe 19:16Z (newer than fetched head d129c48d, so pushing right now); worktree test modified <60 min
#19660Leave: someone is working on it
MERGED
fix(clara): a no-home caller with a call-center backup is connected, never read the close
A no-home caller with a call-center backup is actually connected, never read the close
evidencelane transcript written 19:21Z; worktree results file modified <60 min; APPROVED at head b9ed5f27; merge-tree clean
#19666Leave: someone is working on it
MERGED
fix(tests): the lease-answer gauntlet stops calling real DynamoDB β€” one stub, two named tu
The lease-answer gauntlet stops calling real DynamoDB (part 2 of 2)
evidencefind-pane OPENED #19634,#19666 lane WRITING; MERGEABLE/CLEAN; APPROVED at head 17e6131d
#19670Leave: someone is working on it
LEFT with its live owner
Buildings table: centred columns, one-line Self-guided header, header tooltips
Buildings table: centred columns, one-line Self-guided header, header tooltips
evidencesession e659b78f ALIVE (2 min); last commit 18:57Z; claude[bot] APPROVED at head d97f1674
#15349Needs a person
WAITING ON GERA: earlier decision page b91801885
fix(integrations): opening a connections status page writes nothing and refreshes no Micro
Opening a connections status page stops writing a health stamp and stops forcing a Microsoft token refresh (read-only status, PR 3 of 3)
evidencemain still calls checkChannelHealth in company-channels/status/route.ts:173,241 and admin/companies/[id]/connections/route.ts:113,182; MERGEABLE; draft; 🟒 at e3f751b25 (head 12db3cd1d is merge-main only); required review red only from the hold
#15419Fix conflicts, then merge
GREEN, WAITING ON GERA: take out of draft (adds a daily report-only production schedule)
feat(admin-status): a daily check reports which login skips two-factor (smoke-mfa part 1)
Daily report-only check that names which login skips two-factor in production and whether it is a platform admin (smoke-mfa part 1)
evidenceno smoke-mfa-exemption detector on main; 🟒 at head 7d92ed0d8; CONFLICTING 4 files (automations.toml, cron-inventory doc, cron-scope-inventory.ts + its drift test)
#15434Needs a person
WAITING ON GERA: earlier decision page b91801885
fix(auth): production scripted sign-ins use the two-factor test login; test grades get the
Production scripted sign-ins use the two-factor nightly login; grading exclusion gets its own setting (smoke-mfa part 2)
evidenceusesProdSigninIdentity and GRADING_EXCLUDED_GRADER_USER_IDS absent on main; siblings #15457 (2b) and #15638 (2c) merged but defer identity choice to this PR; 🟑 at head; CONFLICTING 3 files (2 runbooks, smoke-password-no-fallback drift test)
#15794Fix conflicts, then merge
GREEN, HELD for an attended merge (merge before #15798)
ci(scripts): a runnerless script marks itself β€” retire the shared unreachable-baseline JSO
scripts/ runner ratchet reads a per-file marker and deletes the shared unreachable-baseline JSON (WS2 part 2 of 2)
evidencescripts/ci/scripts-unreachable-baseline.json still on main; part 1 #16196 merged; CONFLICTING 2 files (the JSON, check-scripts-runner-ratchet.ts); Unit Tests red (5s); 🟒 dismissed at head
#15798Finish and merge
GREEN, HELD for an attended merge (after #15794)
[HOLD] docs(reviewer): scripts/ runner ratchet is read by per-file marker (after #15794)
Reviewer prompt paragraph updated for the per-file scripts-runner marker (after #15794)
evidencereviewer-core.md:18 on main still names the JSON; MERGEABLE; 🟒 at head
#15820Being checked
CLOSED, rebuilt as #19731 (GREEN, HELD: caution tag)
ci: bookkeeping guard pins reach the PR selector (WS1 class a, part 2)
Let bookkeeping guard pins reach the PR selector so queue failures surface on the PR first (WS1 class a part 2)
evidence#15860 (merged 10-03 19:02Z) took bookkeeping pins out of the merge-queue gate and #16932 (10-06) out of the queue Full set, so the queue first-fails this targets no longer happen; ci.yml:3060 still exports GUARD_PIN_KINDS=fence on PRs; CONFLICTING 2 files (ci.yml, guard-select.test.ts)
#15873Fix conflicts, then merge
GREEN, HELD for an attended merge (caution tag)
test(guards): each pipefail exemption lives in its own script, not a central list (WS2 row
Each pipefail exemption lives as a comment in its own script instead of a central GRANDFATHERED list (WS2 row 4)
evidenceGRANDFATHERED still at shell-pipefail-ratchet.test.ts:67 on main; 🟒 at head ec4b7aef6; CONFLICTING 1 file (the test)
#16220Needs a person
WAITING ON FEDE: test Microsoft sign-in setup (b92009969)
feat(outlook): PKCE on the person calendar sign-in β€” one-time server-side verifier (p3-att
PKCE on the Outlook person calendar sign-in with a one-time server-side verifier (p3-attachment-r3)
evidenceno PKCE in src/app/api/integrations/outlook on main; MERGEABLE; draft; Unit Tests red on a 10-03 run two commits behind head; no verdict at head
#16943Needs a person
WAITING ON FEDE: test Microsoft sign-in setup (b92009969)
feat(calendar): Outlook person sign-in records its calendar endpoint beside primary (p3-r3
Outlook person sign-in records its calendar endpoint beside primary (p3-r3 part 3a)
evidenceno connectCalendarEndpoint in outlook routes on main; MERGEABLE; draft; plan review πŸ”΄ contradicts (decider f2842d58f ruled B: endpoint must not copy the token); 🟑 at 57492b5c8
#16944Fix conflicts, then merge
CLOSED, rebuilt as #19709 (MERGED: security fix)
fix(voice): a spoken number never passes the property-manager gate
A spoken phone number can never pass the property-manager gate on a voice call with no caller id
evidenceresolvePmGate on main still keys on resolvedCallerPhone (wide chain) at voice/tools/[tool]/route.ts:572-600; CONFLICTING 4 files incl. route.ts and package.json; 🟒 only at older cd4e82a3e, no verdict at head
#17180Finish and merge
GREEN, HELD for an attended merge (caution tag)
ci: test-file lists reach vitest by the binary, never npx; the guard manifest rides an art
Test-file lists reach vitest by binary not npx, guard manifest travels as an artifact (scaling cliffs 1/3)
evidenceci.yml:3226 on main still runs npx vitest run ... $GUARD_FILES; MERGEABLE CLEAN; 🟒 at head 79bcf7237; required checks pass
#17189Finish and merge
GREEN, HELD for an attended merge (caution tag; merge soon, main drift ejects it)
ci: every page of a run's jobs reaches the deciders; open-PR lists cannot truncate silentl
Every page of a run's jobs reaches the deciders; open-PR lists cannot silently truncate (scaling cliffs 3/3)
evidencemain still reads jobs?per_page=100 at ci-followups.yml:163 and auto-merge-all.yml:1824, watchdog --limit 100 at review-verdict-watchdog.yml:361; MERGEABLE CLEAN; 🟒 at head
#17342Needs a person
WAITING ON GERA/FEDE: remove the automatic hold (decisions page b92009969)
chore(admin-handoff): two comments #15710 made stale (part 7 follow-ups)
Two comments #15710 made stale (sensor exit line and administeringParty doc)
evidencelink-user-to-spine.ts:129 on main still says already a person at; MERGEABLE; 🟒 at head; required review red only from hold
#17850Adopt and finish
LEFT with its live owner (pushed its own fix; Fede's hold remains)
chore(p9-deletions): operator text and the ops runbook name pmsCredentialUserId, not owner
Operator text and ops runbook name pmsCredentialUserId, not ownerId (step 10 Fy part 3)
evidencedocs/runbooks/ops.md:61,73 on main still say ownerId; πŸ”΄ at head 72d843fca: required Unit Tests red, property-owner-id-retired.drift.test.ts positive-control floors fall below minimum after merge with main
#17881Close: already done another way
CLOSED (replaced by #18550)
fix(leasing): the tour slot hold runs at every building β€” retire the per-building ramp (p9
Tour slot hold runs at every building; retire the per-building ramp
evidence#18550 (merged 2026-10-10, 6b2665505d6) deleted the ramp list; slot-hold-flag.ts and isSlotHoldEnabled gone from main; CONFLICTING 7 files
#17890Fix conflicts, then merge
QUEUED to merge (approved, type check passed)
fix(ci): release-staleness-alert stops trusting the committer-date fallback (release-stale
release-staleness-alert stops falling back to the committer date when merged_at is unreadable
evidencemain release-staleness.mjs:92-94 still falls back to the committer date; #16185 (10-06) fixed the earlier cause and this is the follow-up it missed; CONFLICTING 1 file (test); no review verdict, no required checks reported
#17891Close: already done another way
CLOSED (replaced by #17293)
fix(red): pin the clock in leasing-tools' shared-handset reschedule test (heavy-lane-red #
Pin the clock in the leasing-tools shared-handset reschedule test (heavy-lane-red #17288)
evidence#17293 (2daf5a73cd5) pinned that block's clock (PINNED_NOW / NEAR_WEEKDAY); issue #17288 closed 10-07
#17910Needs a person
WAITING ON AWS: index-limit raise requested 10-08 (case 179146220300089)
feat(conversations): a building's list reads conversation-building-list-index β€” the swap (
A building's conversation list reads conversation-building-list-index (p9-conv-index part 5b, the swap)
evidenceconversations route on main does not read the index; parts 0-5a merged; draft; CONFLICTING 2 files (conversations/route.ts, dynamo/conversation.ts); no verdict
#17996Needs a person
MERGED (Gera's yes on b91492058, executed and receipted)
[HOLD] fix(email): a mailbox-less building replies from the sibling mailbox that holds the
A building with no mailbox replies from the sibling building mailbox that holds the thread root (selector part 2/2)
evidencepart 1 #17973 merged; no sibling rung in send-mailbox-selector.ts on main; MERGEABLE; 🟒 at head
#18189Needs a person
WAITING ON GERA: earlier decision page b91938829
A handyman's job at an apartment building names its unit or a shared area (p9-asset-type-v
A handyman's job at a residential building must name its unit or a shared area (p9-asset-type part 3a)
evidenceno UNIT_UNKNOWN/common_area on main; part 2 #18165 and 1b #19397 merged; draft; CONFLICTING 1 file (handle-create-work-order.ts); 🟑 at older sha
#18235Close: already done another way
CLOSED (replaced by #17328)
fix(leasing): a lead email ending in a silent empty reply now gets its one outcome stamp (
Lead email ending in an empty reply gets a lead-outcome stamp (Sentry 1FB)
evidencemain process-email-record.ts:1339-1344 already records held/skipped 'empty-reply:*' outcome on the empty-reply exit; blame b4fab788ff5 = #17328 (10-07 02:49, 1h after this stranded commit)
#18236Close: already done another way
CLOSED (replaced by #17847)
fix(capture-drift): the website visitor thank-you is noise, not drift (sentry)
Website visitor thank-you emails read as noise, not capture drift
evidencemain email-noise-filters.ts classifyEmailDelivery step 3 'nonParticipant declared true -> website-visitor send = noise', landed by e5fee7ddaf8 (#17847); this branch is the subject-match alternative
#18389Close: already done another way
CLOSED (replaced by #18396)
fix(voice): tool dedup force-deletes orphans held only by deleted agents' branches
Stop apply-sync going red on 25 ElevenLabs tool-delete 409s by force-deleting orphans held by deleted agents' ghost branches
evidence#18396 (merged 10-10 bf1b244b514) fixed the same red step by skipping 409s; main dedup-elevenlabs-tools.ts:22,284,335 'expect a 409 skip'
#18503Adopt and finish
MERGED
fix(leasing): a denied applicant who asks for a closed day is routed to the team, not told
Denied applicant asking for a closed day is routed to the team, not told only 'that day won't work' (#18496 review follow-up)
evidencenot on main (clara-leasing.ts:1410 still old text); merge-tree with main clean; 🟒 at head 8ac446a9a; CLEAN
#18847Fix conflicts, then merge
GREEN, HELD on its own conditions (live test call in office hours + eval re-run; merging syncs prod voice prompts)
fix(voice): Leasing dials a person only for a leasing caller; a hand-back without leasing
Leasing dials a person only for a real leasing caller; other person-asks take a message (main-line greeting part 3a)
evidencedistinctive rules ('ANYONE ELSE ASKING FOR A PERSON IS NEVER DIALLED') absent from main leasing.ts; 🟒 at head 330b63ea2
#18891Needs a person
WAITING ON GERA: earlier decision page b91775948
fix(ci): the production promote window defaults to 30 minutes again, pinned by a test that
Put the production promote batch window code default back to 30 min, pinned by a test
evidencemain promote-window.env still DEFAULT=5; repo variable PROMOTE_WINDOW_MINUTES already 30; held for decision b91774562, which is RESOLVED(withdrawn) and re-raised as a two-question page
#18936Needs a person
WAITING ON GERA: earlier decision page b91801885
fix(auth): a staff sign-in code is never texted from a line PropFlow does not own (registr
Staff sign-in codes are never texted from a line PropFlow does not own (registry-checked sender)
evidenceno main commit on mfa-sms-sender.ts since 10-12; body: prod sends codes from Camellia's line today, merge would stop all staff SMS codes until prod sender moves; draft
#19129Needs a person
WAITING ON GERA/FEDE: remove the automatic hold (decisions page b92009969)
refactor(scripts): the ratchet's triage note becomes one line per sentence (bug-704)
Record the tour-decider-replay ratchet ruling and make the baseline note one line per finding (bug-704)
evidencegreen at head 0c2cb37ed, review check 'Merge hold: hold-for-review label'; label applied by docs-only-fence workflow via AUTOMERGE_TOKEN (shows as fede-propflow); session comment 10-14 08:49 'needs ONE human click'
#19348Leave: someone is working on it
LEFT with its live owner
Maintenance: after-hours heads-up email to on-call for Clara's routine work orders
After-hours routine work orders email the company's on-call people a heads-up (customer ask, Gera 'Email only')
evidenceroot-fix pushed 17:17Z after queue ejection; 🟒 APPROVED at head d226406f9 17:21Z; CLEAN; e659b78f transcript 4 min old
#19368Fix conflicts, then merge
LEFT with its live owner (came back and pushed)
fix(voice): a status call about an emergency reads the chain; the gas bullet covers a page
Emergency status call-backs read the on-call chain; gas bullet only applies once a page went out (#18543 E6, #18540)
evidenceπŸ”΄ BLOCKING at head 30ff1db98: new guard keys on 'caller had a chain here in 2h', so a NEW gas/life-safety emergency in that window pages nobody; chain_ringing absent from main
#19406Needs a person
WAITING ON FEDE/GERA: ship the no-building line fix? (b92009969)
fix(voice): an inbound call to a line that names no building no longer takes the caller's
An inbound call to a line naming no building no longer adopts the caller's own building (supersedes closed #18173)
evidencebody 'DRAFT ON PURPOSE - waiting on a founder'; design-final Β§10 step 4 + #7731 + board row p6-fail-open clause (b) make deleting the fall-back a Fede+Gera call; draft, no review run
#19426Adopt and finish
MERGED
A job's unit is optional in the type system β€” ST-129's type strip (p9-asset-type-vocabular
A work order's unit becomes optional in both type trees, each reader handles absence honestly (ST-129 type strip)
evidencedraft; all checks green at head e1f163e85; review SKIPPED because draft; body: 'authoring lane is a sub-agent with no turn to resume'
#19499Needs a person
LEFT with its live owner (security driver)
fix(leasing): a vendor lookup that cannot answer no longer admits to outreach (false-zero
Vendor-lookup failure in the outreach gate blocks auto-enrolment instead of admitting (false-zero part 1)
evidenceSmith comment: decider f3f16ea55 ruled WAIT; overturning pinned test outreach-trigger.test.ts:1126 'FAIL-OPEN: a role-lookup error never drops a genuine lead' is a deliberate decision; replay coverage under 30 days; Unit Tests red; draft
#19506Needs a person
WAITING ON GERA/FEDE: remove the automatic hold (decisions page b92009969)
chore(tours): the slot hold is not ramped any more β€” correct six prose sites that still sa
Correct six comment sites still saying the tour slot hold is ramped (retired by #18550)
evidencecomment-only; 🟑 non-blocking at head fdcef9925; hold-for-review applied by docs-only-fence (as fede-propflow) 08:02Z; same 'ONE human click' comment as #19129
#19548Adopt and finish
MERGED (decider f4b014d79)
feat(ci): the one proof that needs a production build gets a lane, fenced to stage twice
A CI lane that builds, serves in production mode and runs the stage MFA-reset proof
evidence🟒 APPROVED at head 9c48ad3ca; lane step red BY DESIGN (no stage identity, exit 5), not a required check; driver says .github is a dangerous path so the merge is the decider's
#19590Leave: someone is working on it
MERGED
fix(identity): the email lease-answer gate reads this building's population, and an unread
Email lease-answer gate reads this building's population; an unreadable read no longer says 'not a resident' (ruling ffb66ae40 part 3)
evidencesession comment 19:01Z: only red is DDB Escape Gate, proven pre-existing on main; fix is #19666 (behind #19634) opened by a live lane of 8d699f3b
#19591Needs a person
MERGED
feat(phones): register Situs's main line as forwarding into Clara (loop guard)
Register Situs's real main line as forwarding into Clara so the loop guard refuses it as a transfer target
evidence🟒 APPROVED at head 62c625850; stale failed 'review' job beside a passing one; owner sessions live, push 16:45Z
#19592Needs a person
MERGED
feat(voice): import Situs's Clara number into ElevenLabs on merge, unassigned (Situs line,
Import Situs's Clara number +17207404240 into ElevenLabs on merge, no agent bound (part 1)
evidence🟒 APPROVED at head d7a3a99ca; merge triggers sync-phone-numbers.yml POST into prod EL and rewrites the Twilio voice webhook; owner live
#19593Leave: someone is working on it
LEFT with its live owner
feat(scripts): dry-run-first provisioner for Situs Group's front-door nameplate (Situs lin
Dry-run-first script to create PROP#situs-front-door on the real Situs company (part 2)
evidence🟑 non-blocking at head b30ca63e0; CLEAN; merging only adds a script; --apply is Gera's and the prod-property hook refuses it without his phrase
#19600Needs a person
WAITING ON GERA/FEDE: remove the automatic hold (decisions page b92009969)
test(incoming-resident): count the #19540 refusal (zero so far, window and controls named)
Count the #19540 inbound-resident refusals (zero so far) and pin the log line the count depends on
evidence🟒 APPROVED at head f02415751; hold-for-review by docs-only-fence (as fede-propflow) 17:15Z; fence's own comment says the docs-only claim is withdrawn so the hold is releasable; last push 17:26Z
PropFlow Docs