Too many little feature flags

Fede asked for this after saying we're building way too many small on/off switches. Short answer: it's a real pattern worth fixing, but the pile of switches is smaller than it feels — and none of the risky ones are even turned on anywhere yet.

Proposed — pending review · written 2026-09-29 · for Fede

On this page

  1. Wave 1 deletes (Oct 8)
  2. Wave 2: audit and recommendations (Oct 9)
  3. The problem
  4. What the settings are today
  5. The options
  6. What happens next, if we go with A
  7. Appendix: every switch
  8. Re-audit 2026-09-30: every switch, with a verdict

Wave 1 deletes (Oct 8, Fede: go)

Status: PRs in flight; tracker row 8 on /a/clara-platform-execution.

Fede said go on the cleanup. Wave 1 is the ten safest deletes: each switch is already on everywhere, or was never flipped, so no customer sees a change. Counts below use the code on main as of Oct 8; customer state is the Sep 30 reading.

The counts, the ten deletes, and wave 2
BucketCountMeaning
(a) Fix-shaped, delete117103 now, 14 after finishing the cutover. About 12 already gone.
(b) New capability, keep6862 from the audit plus 6 added since. Fede turns each on.
(c) Unclear18Mostly parked schedules and two env values that disagree.
#SwitchRead inOn / off todayRiskPR plan
1Four turn-integrity kill switchesturn-integrity-flags.ts, voice-review-gate.ts and 6 moreOn everywhereNone; rollback becomes a revertMake checks unconditional, about -250
2Ten AppFolio portfolio armspms-connection-health.ts, appfolio-sync handler and 12 moreOn for all three accountsNoneRemoval chain, 3 PRs, about -150 each
3TOUR_SCHEDULE_INLINE_CDCset-tour-schedule.ts, tour-schedule-stream-consumer.tsDefault on, unsetNoneDelete env read, about -25
4CLARA_TRACE_CAPTURE_PROMPTconversation-manager.ts, arms-registry.ts and 3 moreDefault on, unsetNoneCapture always, about -60
5APPFOLIO_FUTURE_ARRIVALS kill switchfuture-arrivals.tsDefault on, unsetNoneRemove early return, about -20
6SPINE_GSI_USE_SCAN / REPLICATOR_USE_SCANspine-gsi.tsUnset (index path)None; scan fallback goneDelete branch, about -20
7TEMPORAL_USE_VERSIONINGrenewal-worker.ts, executed-lease-fetch-workflow.tsUnset (off)None todayHardcode off path, about -20
8Ticker self-heal (env + property)ticker-self-heal-flag.ts, run-work-order-sync.ts and 3 moreOn at 70 of 70 Western Slope homes; absent at JP&Co, SitusLow; fixes missing tickers thereAlways run, about -150
9PMS_SYNC_DISPATCH rowpms-connection-health.ts and 3 morePer-connection since 09-10NoneKeep one mode, about -100
10D8_PIPELINE_ARM rowkill-switch.ts, settings.ts and 6 moreArmed since 08-23None; rollback is a revertRun unconditionally, about -200

Total: about 1,100 lines removed across 8 to 10 small PRs. Each says "fix/guard, no switch".

Wave 2 needs a replay first (a customer would see a change):

Where this disagrees with the Sep 30 audit

Wave 2: audit and recommendations (Oct 9)

Wave 2: audit and recommendations

<b>39 switches: 33 DELETE, 4 MERGE INTO, 2 KEEP AS SETTING.</b> Each change here is something a customer can see, so each needs its replay first. Audit and recommendations only; nothing has been changed.

Three deletions with the biggest customer effect: the dark-feature bench list (seven caller-audible voice features on for every caller), the flipped-addresses list (reroutes real calls and mail), and the tour time-window pair (every prospect gets windowed offers, off at all three customers today).

Counts use main as of Oct 9 (e171a3eee1). Customer state is the Sep 30 audit reading or code defaults; I did not read production, and "unknown" means the code does not say.

#SwitchLives inWhat it gatesState todayRecommendationRisk
1leasing.tourTimeRangesEnabled (company setting + registry key)src/lib/domain/leasing/tour-time-ranges-switch.tsTour offers come as windows ("mornings 9-12") in text, email, voice and availability checks; off, plain single slots.Off at JP&Co, Western Slope, Situs (Sep 30). Fede ruled it permanent 09-29.DELETE Windows become the only offer. Run first: the tour-time-windows eval and its mutation controls (marked MANUAL, so it must actually be run) plus the availability-windows test.Every prospect sees windowed offers; also removes the admin toggle and company field.
2tourWindowMatchingEnabled (property setting + arm + TOUR_WINDOW_MATCHING env)src/lib/domain/leasing/tour/tour-window-flag.tsWhen a prospect says "Tuesday mornings", Clara narrows the days and times she offers and names the closest real time.Off at all three customers (Sep 30); on at Willows test homes only. The old note "effectively on" is wrong.DELETE Always on. Run first: the tour-window replay script and the availability-windows test, together with the row above.Reply wording changes at every property ("No openings on X" becomes "Checking other times in the morning").
3tour.scheduleChokepoint (arm + env + property field)src/lib/domain/leasing/tour/tour-chokepoint-flag.tsEvery tour date/time change goes through one versioned write, so reminders re-anchor on reschedule and decline; off, the old scattered writes run.Off at every customer home (Sep 30: absent on all 124).DELETE Always on. Run first: the chokepoint flag test plus a reschedule/decline replay checking exactly one reminder survives.Tour rows gain a version number; stale reminders stop, but a bug here touches every booking.
4tour.deciderMode (arm + TOUR_DECIDER_MODE env)src/lib/domain/leasing/tour/tour-decider-flag.tsWhich code reads a prospect's reply to a tour proposal (confirm, decline, change): the old handler or the new decider.Old handler at all three customers (Sep 30); new decider only at Willows.DELETE New decider becomes the only path and the old handler goes. Fede rules on the cutover first (decision page exists). Run first: the decider gauntlet test and the tour-decider end-to-end replay.True cutover: how every tour reply is understood changes.
5tourRequestSmsEnabled (property setting)src/lib/domain/leasing/tour/send-tour-outcome-sms.tsReceipt text ("we asked for Tuesday 2pm, the team will confirm") when a call only REQUESTED a tour.Off everywhere (Sep 30).DELETE Do not just delete: replace it with a rule from the line type (request-only line sends the receipt; calendar-booking line does not). Run first: the tour-request-sms gate test and the post-call tour-request test, plus a replay showing no receipt at a calendar-booking property.New text to callers; plain deletion would text about slots nobody holds at calendar properties.
6SLOT_HOLD_PROPERTY_IDS (code list + config file)src/lib/domain/leasing/tour/slot-hold-flag.tsClaims a tour slot in the store before the calendar write, so two simultaneous bookings cannot both win.Sandbox building only (Sep 30); off at all customers.DELETE Always hold. Run first: the slot-hold replay script and the calendar-slot-hold ramp test.A prospect can hear "that time just got taken" where a double booking used to slip through; adds a store write per booking.
7lostTourSlotProspectMessage (property setting)src/lib/temporal/activities/tour.tsApology text to the prospect when their booked time is gone, offering another.Off everywhere (Sep 30). Ruled permanent 09-29.DELETE Always send. Run first: the slot-lost prospect-notice test and the slot-lost hold test.New send to prospects; must not fire for a company with Leasing off or a cancelled tour.
8tourBookingBlockedTeamEmail (property setting)src/lib/domain/leasing/tour/notify-team-of-tour-booking-blocked.tsEmail to the leasing team when Clara cannot book a tour (calendar down, hours unreadable).Off everywhere (Sep 30). Ruled permanent 09-29.DELETE Always send, at most once a day per cause. Run first: the tour-booking-refusal test and the company-live-gate test.New send to staff at every property.
9lostTourSlotTeamEmail (property setting)src/lib/domain/leasing/tour/notify-team-of-lost-tour-slot.tsEmail to the leasing team when a booked tour's invite vanishes or the time is taken.Off everywhere (Sep 30). Ruled permanent 09-29.DELETE Always send, one per lost slot. Run first: the slot-lost hold test and the internal-only notice test.New send to staff at every property.
10renewalLapseDigestEnabled (property setting)src/lib/domain/leasing/renewal-auto-start.tsDaily email to the renewal contact listing leases that have lapsed.Off at all three customers and Willows (Sep 30). Ruled permanent 09-29.DELETE Always send (nothing goes where no contact exists). Run first: the lapse-digest test and the renewal replay for the lapse digest.New recurring email into each property manager's inbox.
11leasing.preferenceCapture (arm + PREFERENCE_CAPTURE env + property field)src/lib/domain/leasing/preference-capture-flag.tsWhether the leasing prompt carries the preference-ask rule and first-touch emails mention stated preferences.Off at all three customers (Sep 30); on at Willows. The old note "effectively on" is wrong.DELETE Always on. Run first: the preference-capture gate test and the preference-vs-fact eval, plus the guest-card regression.Clara's asks and first-email wording change; low harm.
12voice.callback (arm + VOICE_CALLBACK env + property field)src/lib/domain/escalation/voice-callback-flag.tsClara phones a caller back after staff reply on an escalated voice matter; off, text only.Off at all three customers (Sep 30); on at one Willows home.DELETE Always on (quiet hours and once-per-matter limits stay). Run first: the voice-callback orchestration test and a real test-line callback.New outbound phone call to real callers at every property.
13leasing.staffContextTimeline (company field + registry key)src/lib/domain/leasing/staff-context-timeline-switch.tsImports AppFolio guest-card notes and activities and shows them as staff-only rows on each thread.Off at all three customers (Sep 30).DELETE Blocked on the per-company feed design the Oct 8 note already owes. End state: no row to press. Run first: guest-card timeline sync test and thread staff-rows test.Staff see card notes on every thread; the import runs on every new guest-card lead.
14pmsMessagingSync.enabled (property row)lambda/appfolio-sync/handler.tsWhether the sync pulls AppFolio guest-card message threads onto the conversation (one robot read per home per minute).On at Willows only; set by hand by a script. Others unknown (Sep 30 audit has no row).DELETE Blocked on the same design: one per-company feed at a sane cadence, no row. Run first: sync handler test, onboarding-import message-stage test, and a read-count estimate per customer.About 100,000 robot reads a day at 70 Western Slope homes; Situs has a 429 history.
15guestCardWriteFromCalls (property setting)src/lib/platform/settings-resolver.tsClara creates and notes the caller's AppFolio guest card after a call.Western Slope 70 of 70 on; off at JP&Co and Situs (Sep 30).DELETE On everywhere, org row merged in (see MERGE row). Run first: the guest-card regression skill over captured cards at all three customers, plus the guest-card create-intent test.AppFolio cards cannot be deleted, so a wrong write is permanent; Situs has a 429 history.
16guestCardWriteFromTexts (property setting)src/lib/domain/pms/guest-card-text-note.tsEach text Clara sends a carded prospect is also noted on the AppFolio card.Off on all Western Slope homes, JP&Co, Situs (Sep 30).DELETE Always note. Run first: the text-note test and the guest-card regression.Staff see a note per text; more AppFolio writes.
17vendor.transferFirst (arm + property field)src/app/api/voice/personalization/route.tsGreeting for recognized vendors calling in office hours: announces the connect to the office, then transfers.On at one of two JP&Co homes; off at Western Slope, Situs (Sep 30).DELETE Always on. Run first: the voice-agents context wiring test and a live listen-test through the real call path (text sims cannot judge feel).Vendors hear a different greeting in office hours; both greetings still end in a transfer.
18DARK_FEATURE_BENCH_IDS (code list)src/lib/platform/security/test-property-ids.tsSeven caller-audible dark voice features: language prior on ring, post-call guest-card contact capture, bedroom-range directive, hangup backstop, lead-outcome sweep, missed-call note, prospect lookup by phone.On for the Yale sandbox home only (Sep 30).DELETE Delete the condition, but one PR per feature, each with its own replay (call-integrity directive test, hangup-backstop test, and so on).Turns seven behaviors on for every caller at every customer.
19record_transferred_legs (registry key)src/lib/domain/maintenance/bridge-recording.tsWhether the far end of a transferred call (staff or call center) is recorded.On at one Willows home; absent at all three customers (Sep 30). Unset means OFF.DELETE Always record, covered by Fede's 09-19 "every call recorded" ruling. Run first: the bridge-recording test and one real transferred call.Turns recording on for every transferred leg; the voice URL re-push at Twilio is a Fede-gated write.
20external_forward.via_bridge (registry key)src/lib/domain/voice/external-forward-bridge.tsForwards to an outsourced call center go through Clara's hunt line, keeping the tenant's caller ID.Absent at all three customers (Sep 30). Unset means OFF.DELETE Always on (it fixes the center's "press 1 for text" texting Clara). Run first: the external-forward transfer and fallback tests and a real call to the center after forwarding is on.Calls route differently; skipped where a ring-list ticket exists on the same line, so reconcile those first.
21call_routing.v2 (registry key)src/lib/domain/escalation/call-routing-v2.tsThe V2 call-routing engine for emergency ring list, maintenance intake and bucket decisions.Off at all three customers; on at Willows and Fairhaven test homes (Sep 30).DELETE Fede rules whether V2 stands; either way the key goes. Run first: the V2 routing and emergency tests, then a real call per customer line.Rewrite of live phone routing at every customer.
22unmappedLineFleet staging refusal (code branch)src/app/api/voice/personalization/route.tsA call to a number that maps to no home: staging drops it, production adopts the caller's own home.Staging refuses, production fails open (Sep 30).DELETE Refuse everywhere. Run first: the unmapped-line fallback test and a real call to an unmapped test number to hear what the caller gets.Production callers to an unmapped number get a refusal; what they hear after it is unverified.
23flipped addresses (code list + config file)src/lib/domain/portfolio/address-flip.tsWhether an inbound call, mailbox delivery or outbound text finds its org and home from the address record or the old code map.Two test lines only; off at every customer line (Sep 30 audit has no row).DELETE Head-based routing everywhere, one line at a time with Camellia last. Run first: address-flip and dialed-number tests, then a real call and one real mail per line.Reroutes real calls and mail; outbound texts are refused if the head is unreadable.
24flipped dispatch orgs (code list + config file)src/lib/domain/vendors/dispatch-flip.tsWhich vendor picker chooses the vendor on a work order: the new one or the old auto-assign.Sandbox company only (Sep 30 audit has no row).DELETE New picker everywhere. Run first: the dispatch-flip read-out parity replay per customer, the config file's own rule.Changes WHICH VENDOR IS CALLED at Camellia, Western Slope and Situs.
25handoffMode (property enum, leasing rung)src/lib/domain/escalation/handoff-mode.tsWhen Clara cannot answer: hold the thread for a human (coworker) or say so in a sentence and move on (autonomous).Platform-wide 7 autonomous, 3 coworker, 224 unset; per customer unknown. Unset follows client stage (Sep 30).DELETE Toward one coworker core, per Fede's 10-08 "one mode for every customer" ruling. Run first: the handoff-mode and stage tests plus a replay of held threads.Changes whether staff get held threads or Clara answers alone.
26PROPFLOW_ROSTER_GATE + ROSTER_REFUSE_PROPERTY_IDS (env + config list)src/lib/platform/auth/require-in-roster.tsCross-company isolation: a user or home outside the org gets a 404.Web prod = refuse; worker env unknown (Sep 30). List holds 2 test homes.DELETE Always refuse. Run first: the in-roster armed and ramp tests, and confirm the renewal worker env first.No change on web; any worker with it unset would start refusing.
27WARM_CACHE_GATED_PROPERTY_IDS (code list) + paused availability refresh schedulesrc/lib/domain/leasing/tour/availability-cache-gate.tsWider tour-day horizon on the voice prompt, real day-times answers, and the background availability refresher.Willows only, marked TEMPORARY since 8/24; the refresh schedule has never run in production (Sep 30).DELETE On everywhere, schedule unpaused in the same step. Run first: the availability cache gate and warm-cache tests, plus a read-load estimate for Situs.Later tour days offered to every caller; adds AppFolio and calendar read load.
28SPAM_FILTER_ENABLED (env)agents/clara/lib/email/process-inbound-email.tsInbound email spam pre-filter and AI spam triage (lead-site and AppFolio relays exempt).Web prod = false (filter off), mail Lambda unset (on): they disagree (Sep 30).DELETE Always on. Run first: the spam detection tests and the Western Slope Zillow corpus replay, proving no lead is dropped.Spam on the web ingest path starts being dropped; a false positive loses a lead.
29ONBOARDING_IMPORT_ARM (config row per account)src/lib/data/dynamo/onboarding-import-arm.tsWhether connecting an AppFolio account runs the 5-stage import that creates units and leases, or only property skeletons.Western Slope armed; no row for JP&Co or Situs (Sep 30). Unset means OFF.DELETE Import runs at connect for every account. Run first: the onboarding-import runner test and a written Situs re-import plan; the sync pause row is then the brake.Situs would start importing (185 of 448 units loaded) with a 429 history.
30pmsSideEffectMode (company setting)src/lib/domain/pms/side-effects/dispatcher.tsWhether the new dispatcher actually writes the AppFolio assignment and outcome note after a reply, or only logs what it would write.Shadow at JP&Co, Western Slope, Situs; apply at Willows (Sep 30). Unset means SHADOW.DELETE Apply is the only path. Run first: compare a day of shadow logs to the inline write-back, and the dispatcher test.Staff see new AppFolio notes; check no double write of the same note.
31Paused recovery schedules: tour-cohort-walker, pm-action-reminder-backstop, onsite-pricing-daily, voice-injection-cache-refresh-daily, connection-health-sweep (code default)src/lib/temporal/tour-client.tsHourly or daily sweeps that restart dropped tour reminders and reminder cadences, refresh scraped prices and voice context, and check connection health.Unknown: live pause state is not in code (Sep 30 contract says four should be running).DELETE Remove the paused-by-default option so they are simply scheduled. Run first: read the live schedule list (Fede or Gera), the tour-cohort-walker test, and a dry run listing what the walker would restart.If paused today, unpausing may re-send reminders or texts for restarted tours.
32appfolio-sync vendors (schedule, DISABLED)lambda/appfolio-sync/schedules.jsonHourly sync of the AppFolio vendor directory into PropFlow.Disabled on main (Sep 30 and now). Audit rows for work_orders and renewals are stale: both are ENABLED on main.DELETE Delete the job, per the 09-11 ruling that the vendor list is an onboarding-time catalog. Run first: the sync-schedules drift test.None today (already off); reversing the ruling needs Gera and Fede.
33appfolio-sync vendor_contact (schedule, DISABLED)lambda/appfolio-sync/schedules.jsonFour-times-daily robot sweep refreshing stale vendor phone, email and owner.Disabled; manual button only (Sep 30 and now).DELETE Delete the job and keep the manual button, matching Gera's "for now manual only". Open question for Gera: does he want the sweep back? Run first: the sync-schedules drift test.Stale vendor phones stay stale; enabling instead adds robot load on AppFolio.
34GUEST_CARD_WRITE_FROM_CALLS (company config row)src/lib/domain/pms/guest-card-write-switch.tsThe company half of the same guest-card write switch (about ten callers).Western Slope enabled 09-18; JP&Co and Situs absent; test orgs have rows (Sep 30).MERGE INTO guestCardWriteFromCalls on the property (row above). Run first: the guest-card regression; this one has no test of its own.Two switches for one thing; AppFolio writes are permanent.
35autoDraftLeaseOnApprovalEnabled (property setting)src/lib/domain/leasing/new-lease/auto-draft-flag.tsOn approval in AppFolio, Clara drafts the lease there and emails the office.Off at all three customers; on at one Willows home (Sep 30).MERGE INTO newLease.pipeline: one new-lease mode. Run first: the auto-draft tests and the on-application-approved test.Two switches for one thing; nothing goes to the applicant.
36rentRollDataApiEnabled (property setting)src/lib/domain/properties/rent-roll-data-api-flag.tsSkips the emailed rent-roll attachments for a home because the PMS Data API is the source.On at one of two JP&Co homes; off at Western Slope, Situs (Sep 30).MERGE INTO The PMS connection record (the data source is a fact about the connection, not a switch). Run first: its flag test and a parse of one emailed rent roll.Plain deletion would stop parsing emailed rent rolls everywhere.
37OPERATING_MODE_ARM (config row + allowlist)src/lib/domain/properties/operating-mode.tsWhether Clara's autonomous pipeline works a real home's inbound lead emails; off, the email is received but not worked.Enabled, allowlist is one bench home (Sep 30). Unset means OFF.MERGE INTO The module mode / claraLive gatekeeper (prospects module). Not fix-shaped: deleting it turns Clara on at every real home. Run first: the operating-mode and SES lead pipeline tests.Deleting breaks the "dark until Fede turns it on" rule.
38newLease.autonomousSending (property setting)src/app/api/new-lease-package-reviews/[id]/decision/route.tsWhether approving a new-lease review sends the lease for e-signature and the congrats text, or saves a draft and holds the text.Off at all three customers (Sep 30).KEEP AS SETTING New customer-facing action (a binding send). Default off per property; page visibility not checked, so confirm it shows on the property page.Turn-on is Fede's call per property.
39human_handoff.text_on_ring (registry key)src/lib/domain/escalation/text-on-ring.tsThe "missed call" text to the staff person being rung.Absent at all three customers (Sep 30). Unset means OFF.KEEP AS SETTING New staff text; Fede ruled it unreliable until the callback it promises is built. Default off; page visibility not checked.Deleting turns on a text that promises a callback that does not work.

Already deleted, so the Sep 30 audit rows are stale: escalated tour booking, same-thread memory ack, stated-name-wins, missed-transfer outreach, auto-link co-applicants, guest-card first-email engine, email and SMS shadow modes, the work-order cancel env, reader shadow mode, handyman quiet hours env, the old Temporal live/shadow allowlists, the renewal ladder allowlist, and the four org-level send fields (the real kill switches are global). Also corrected: the work-order and renewal sync schedules are ENABLED on main, not parked.

Wave 1's tail (removing them changes nothing a customer sees): call_recording (recordings are always kept; the key only sets a label), APPFOLIO_ENABLED, PMS_OUTAGE_ALARM, human_handoff.acceptMode (default already in force), email NTV firm routing, pmNotificationMode (nobody uses it), the all-true renewal arms row, collections halt, pmsWritesAllowedWhileTest (a test-property safety rail), and the test-only Temporal schedules.

Suggested order

The first five to delete, lowest risk first, each with the replay that must be clean:

  1. PROPFLOW_ROSTER_GATE and its refuse list (row 26). Web already refuses, so customers see nothing. Replay: the in-roster armed and ramp tests; confirm the renewal worker's env first.
  2. SLOT_HOLD_PROPERTY_IDS (row 6). Replay: the slot-hold replay script and the calendar-slot-hold ramp test; correctness fix with a script that already exists.
  3. tourTimeRangesEnabled and tourWindowMatchingEnabled together (rows 1 and 2). Already ruled permanent. Replay: the tour-time-windows eval with its mutation controls (marked MANUAL, so someone must run it), plus the tour-window replay script.
  4. external_forward.via_bridge (row 20). Fixes the call center texting Clara instead of the tenant. Replay: the external-forward transfer tests, then one real call to the center once forwarding is on. Reconcile ring-list lines first.
  5. tour.scheduleChokepoint (row 3). Replay: the chokepoint flag test plus a reschedule and decline replay showing exactly one reminder survives.

Flipped addresses and flipped dispatch orgs go last: they change which line or vendor a real customer reaches. Nothing here has been changed or deleted.

The problem

Since late August, our rule has been: every behavior change ships turned off, as a switch someone can flip per company, and only Fede turns it on. That rule was meant to stop us from breaking a real client by accident. Instead it's quietly piling up small switches — each one harmless alone, but together they make it harder to tell which settings are real choices clients should control, and which ones are just leftover plumbing from how we shipped something.

What the settings are today

What the settings are today

We looked at every setting the app can store for a company or property. There are 99 of them. Most are exactly what they should be — real choices, like office hours or tour rules. A small group exist only so we could ship a change dark and flip it on later.

99
total settings keys
measured, from the settings list in the code
88
real client choices, identities & legal rules
measured
8
rollout switches
exist only to ship something dark
3
unclear
could go either way

Two more rollout switches were already added and then deleted within a few days once the feature behind them was proven — a sign the pattern usually does clean up after itself, just slowly and by hand.

The 8 rollout switches, and who has them on

We checked live production data for every company. Not one of these 8 switches is turned on at a single real customer today. We looked at 5 real companies (ConAm, JP&Co, PropFlow Staff, Situs Group, Western Slope); only 3 of those actually have live properties.

SwitchWhat it controls, in plain wordsOn anywhere?
New call-routing engineWhich system decides where a call goesOff everywhere
Show caller's number on transfersWhether a transferred call shows the caller's own number instead of Clara'sOff everywhere
Record transferred callsWhether we keep recording after a call is handed to a personOff everywhere
New vendor-dispatch flowA new way of assigning maintenance vendorsOff everywhere
Street & landmark facts for ClaraLets Clara mention nearby streets and landmarks to a prospectOff everywhere
Offer specific tour timesLets Clara offer tour time windows instead of just "does X time work"Off everywhere
Clara texts the application link herselfClara sends the apply-now link by text instead of a person doing itOff everywhere
Text staff while their phone is ringingSends staff a text at the same moment their phone rings for a transferOff everywhere

Measured by reading each company's live settings directly, read-only, 2026-09-29. Three more settings were unclear enough that we didn't force them into either bucket (a staff reminder email setting, one company's opt-in copy of client notices, and one setting for how a transfer counts as "answered") — details in the appendix.

How much of our recent work has shipped this way

~7.5%
of PRs merged since Aug 30 say they shipped dark or default-off
estimated — 405 of 5,392 merged PRs matched a text search; likely an undercount, since only the last two days required a standard label for this

The options

Three ways to handle this going forward.

OptionHow it worksTrade-off
A — Recommended
ship proven, not dark
A behavior change ships to everyone once it passes a quality check on Clara's real setup, including a planted mistake that the check must catch, plus a side-by-side replay of 20+ real past conversations showing it's actually better. If something's wrong after it ships, we undo it with GitHub's one-click revert, live again in minutes.We can't rely on "the unit tests passed" as proof anymore — every change needs real proof it works before it goes out. That's slower per change, but nothing sits half-shipped waiting on a flip.
B — Switches with an expiration dateKeep shipping dark behind a switch, but every switch gets removed automatically once it's on for every company, or once 30 days pass with nobody using it.Still creates a new switch for every change; just promises to clean them up. Depends on the cleanup actually running.
C — Keep today's ruleEvery behavior change keeps shipping dark, per-company, until Fede turns it on.This is the rule that caused the problem asked about in this report.
What happens next, and every switch

What happens next, if we go with A

If Fede picks A:

Re-audit, 2026-09-30: every switch, with a verdict

Fede, 2026-09-30: flags are for new experimental features we validate dark; anything that is a fix, a regression repair, a guard or an improvement to live behavior ships permanent, no switch. This re-audit counts every on/off switch in production (not just the settings registry the first pass covered) and gives each one a verdict. Inventory taken read-only against the code at commit 4f67ac92 and the production table on 2026-09-30.

44
Make permanent (it is a fix or guard)
59
Delete (dead switch or dead path)
14
Finish the cutover, then delete
18
Fede decides
62
Keep as a customer setting
197
switches found (the 09-29 page saw 99 registry keys)

What the numbers say

Note: a 198th switch, the onboarding import arm, was found after the audit closed (Situs Group, 2026-09-30) and is added to the make-permanent table below.

Recommended order of work

  1. Rate-limit protections (11 rows): removal PR in flight today.
  2. The 22 off-by-accident leasing improvements: one PR per switch, each proven by a replay, live everywhere. Start with the three from last night and tour time ranges (already ruled).
  3. Delete the 59 dead switches in two or three cleanup PRs by area (env vars, prototype per-property flags, registry leftovers, global rows).
  4. Lift the renewal and work-order sync schedules now that the protections exist (your yes).
  5. Collapse the twelve per-property autonomy flags into the module settings (design first, one page section, then build).

Make permanent (it is a fix or guard) (44)

SwitchKindWhat it gatesSinceLive stateWhy this verdict
arms:tour.scheduleChokepointarms-registryThe C′ tour-scheduling chokepoint path. Inverted global: the literal `off` KILLS it everywhere; anything else leaves the per-property flag (boolean true, fail-closed) in charge.2026-07-21 #4274 Aproperty flag tourScheduleChokepointEnabled: {'JP&Co': 'absent on all 2 properties', 'WesternSlope': 'absent on all 70 properties', 'Situs': 'absent on all 52 properties', 'TEST Willows/sandbox': 'absInverted env arms on leasing improvements; effectively on everywhere already. Env arms are banned by the constitution.
arms:leasing.preferenceCapturearms-registryClara's six-bucket ask taxonomy (RULE 7.2) rendering in the leasing prompt, and whether the first-touch email surfaces stated preferences. The `preferences` write on `update_prospect` itself is UNGATED as of 2026-09-21 (2026-08-31 #6703 fproperty flag preferenceCaptureEnabled: {'JP&Co': 'absent on all 2 properties', 'WesternSlope': 'absent on all 70 properties', 'Situs': 'absent on all 52 properties', 'TEST Willows/sandbox': '2 of 2 pInverted env arms on leasing improvements; effectively on everywhere already. Env arms are banned by the constitution.
arms:tour.windowMatchingarms-registryChange 3 of the Fabienne redesign — a prospect's stated tour window (which days, which part of those days) narrows the days AND times we offer, an impossible window names the closest real bookable time instead of recitin2026-08-31 #6713 Tproperty flag tourWindowMatchingEnabled: {'JP&Co': 'absent on all 2 properties', 'WesternSlope': 'absent on all 70 properties', 'Situs': 'absent on all 52 properties', 'TEST Willows/sandbox': 'absent Inverted env arms on leasing improvements; effectively on everywhere already. Env arms are banned by the constitution.
arms:voice.callbackarms-registryClara placing an outbound voice callback (vs. staying SMS-only relay). Inverted global: the literal `off` KILLS it everywhere; anything else leaves the per-property flag (boolean true, fail-closed) in charge.2026-08-19 #5904 Wproperty flag voiceCallbackEnabled: {'JP&Co': 'absent on all 2 properties', 'WesternSlope': 'absent on all 70 properties', 'Situs': 'absent on all 52 properties', 'TEST Willows/sandbox': '1 of 2 propeInverted env arms on leasing improvements; effectively on everywhere already. Env arms are banned by the constitution.
arms:tour.deciderModearms-registryWhich tour-decision code path a property runs: the legacy handler (handle-tour-confirmation.ts, default) or the v2 pipeline decider (tour-decider.ts, when Property.tourDeciderMode === 'v2'). Global kill switch `TOUR_DECI2026-08-16 #5801 fenv TOUR_DECIDER_MODE: Vercel: unset on Vercel prod; ECS/Lambda: not set (no lambda reads it)Inverted env arms on leasing improvements; effectively on everywhere already. Env arms are banned by the constitution.
arms:appfolio.accountBudgetEnforcearms-registryWhether `AppfolioClient.requestJson` actually WAITS on the shared per-account AppFolio request budget (`AppfolioAccountBudget`) before a request, versus only observing it. Disarmed (the default), nothing waits — the sync2026-09-12 #7924 Aenv APPFOLIO_BUDGET_ENFORCE: Vercel: unset on Vercel prod; ECS/Lambda: not set (no lambda reads it)Rate-limit protection is a guard, not a feature. Removal PR in flight (Fede 09-30).
arms:maintenance.tickerSelfHealarms-registryThe work-order sync deriving and PERSISTING a missing `Property.ticker` instead of failing the property. Disarmed (the default), a ticker-less property keeps failing every `work_orders` tick with "has no ticker — require2026-09-11 #7876 Henv WO_TICKER_SELF_HEAL: Vercel: unset on Vercel prod; ECS/Lambda: not set (no lambda reads it)Fix for the missing-ticker import bug; on at 70/70 Western Slope homes already.
registry:record_transferred_legscompany/property setting (portfolio registry key)registry key, writable at ['property']; type boolean2026-09-20 #10064 JP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: true (property The Willows attach row 2026-09-21); TEST Fairhaven: absentFede 09-19: every call recorded end to end, always. Not a setting.
registry:external_forward.via_bridgecompany/property setting (portfolio registry key)registry key, writable at ['org', 'group', 'property']; type boolean2026-09-22 #10784 JP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentTransfer-path fix (urgent, 09-22). Permanent.
registry:call_recordingcompany/property setting (portfolio registry key)registry key, writable at ['org']; type object2026-09-19 #10047 JP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentFede 09-19: every call recorded end to end, always. Not a setting.
registry:leasing.locationFactsEnabledcompany/property setting (portfolio registry key)registry key, writable at ['org']; type boolean2026-09-28 #13514 JP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentImprovements to what Clara knows/offers on live leasing. tourTimeRanges was already ruled permanent on the 09-29 page and is still a switch.
registry:leasing.tourTimeRangesEnabledcompany/property setting (portfolio registry key)registry key, writable at ['org']; type boolean2026-09-29 #13775 JP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentImprovements to what Clara knows/offers on live leasing. tourTimeRanges was already ruled permanent on the 09-29 page and is still a switch.
registry:leasing.staffContextTimelinecompany/property setting (portfolio registry key)registry key, writable at ['org']; type boolean2026-09-30 #14214 JP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentImprovements to what Clara knows/offers on live leasing. tourTimeRanges was already ruled permanent on the 09-29 page and is still a switch.
org field:locationFactsEnabled (org field; also registry key leasing.lcompany setting (Organization row field)Street & landmark facts for Claraunknown JP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentImprovements to what Clara knows/offers on live leasing. tourTimeRanges was already ruled permanent on the 09-29 page and is still a switch.
org field:tourTimeRangesEnabled (org field mirror)company setting (Organization row field)Tour time windowsunknown JP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentImprovements to what Clara knows/offers on live leasing. tourTimeRanges was already ruled permanent on the 09-29 page and is still a switch.
org field:staffContextTimeline (org field mirror)company setting (Organization row field)Guest-card timeline importer for staff contextunknown JP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentImprovements to what Clara knows/offers on live leasing. tourTimeRanges was already ruled permanent on the 09-29 page and is still a switch.
settings.cadenceEndMarksGuestCardInactivecompany setting (Organization.settings)Mark guest card inactive when follow-ups end2026-09-29 #13935 JP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentOvernight 09-29/30 improvements shipped behind company settings off everywhere. Removal PRs in flight (session 001).
settings.cadenceEndSendsCloseTextcompany setting (Organization.settings)Closing text after last follow-up2026-09-30 #14050 JP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentOvernight 09-29/30 improvements shipped behind company settings off everywhere. Removal PRs in flight (session 001).
settings.tourMessagesShortFormcompany setting (Organization.settings)Short-form tour reminders/confirmations2026-09-30 #14078 JP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentOvernight 09-29/30 improvements shipped behind company settings off everywhere. Removal PRs in flight (session 001).
property:escalatedTourBookingEnabledproperty setting (Property row boolean)per-property boolean gate (see name)2026-08-27 #6444 DJP&Co: 1 of 2 properties on (1 rows set); WesternSlope: 1 of 70 properties on (1 rows set); Situs: absent on all 52 properties; TEST Willows/sandbox: 1 of 2 properties on (1 rows set); TEST Fairhaven:Improvements to live tour/transfer behavior, on at one home each and off everywhere else by omission.
property:sameThreadMemoryAckEnabledproperty setting (Property row boolean)per-property boolean gate (see name)2026-08-31 #6710 CJP&Co: absent on all 2 properties; WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: 2 of 2 properties on (2 rows set); TEST Fairhaven: absent on allCorrectness rules for live behavior (2/2 on at JP&Co, or absent = off by accident).
property:statedNameWinsEnabledproperty setting (Property row boolean)per-property boolean gate (see name)2026-09-05 #7113 TJP&Co: absent on all 2 properties; WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: 1 of 2 properties on (1 rows set); TEST Fairhaven: absent on allCorrectness rules for live behavior (2/2 on at JP&Co, or absent = off by accident).
property:teamTourEmailAfterCallEnabledproperty setting (Property row boolean)per-property boolean gate (see name)2026-09-12 #8131 TJP&Co: absent on all 2 properties; WesternSlope: 1 of 70 properties on (1 rows set); Situs: absent on all 52 properties; TEST Willows/sandbox: absent on all 2 properties; TEST Fairhaven: 1 of 11 propeImprovements to live tour/transfer behavior, on at one home each and off everywhere else by omission.
property:tourPastDateTruthEnabledproperty setting (Property row boolean)per-property boolean gate (see name)2026-09-03 #6981 AJP&Co: 2 of 2 properties on (2 rows set); WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: 2 of 2 properties on (2 rows set); TEST Fairhaven: absentCorrectness rules for live behavior (2/2 on at JP&Co, or absent = off by accident).
property:tourRequestSmsEnabledproperty setting (Property row boolean)per-property boolean gate (see name)2026-09-05 #7135 WJP&Co: absent on all 2 properties; WesternSlope: 0 of 70 properties on (1 rows set); Situs: absent on all 52 properties; TEST Willows/sandbox: absent on all 2 properties; TEST Fairhaven: 0 of 11 propeImprovement to live tour flow, off everywhere by omission.
property:transferMissedOutreachEnabledproperty setting (Property row boolean)per-property boolean gate (see name)2026-08-30 #6652 MJP&Co: 1 of 2 properties on (1 rows set); WesternSlope: 1 of 70 properties on (1 rows set); Situs: absent on all 52 properties; TEST Willows/sandbox: absent on all 2 properties; TEST Fairhaven: 1 of 1Improvements to live tour/transfer behavior, on at one home each and off everywhere else by omission.
property leasing/maint settings:guestCardWriteFromCallsproperty setting (LEASING_SETTINGS / MAINTENANCE_SETTINGS row)per-property boolean/enum on the property settings row2026-09-17 #9155 pJP&Co: absent on all 2 properties; WesternSlope: 70 of 70 properties on (70 rows set); Situs: absent on all 52 properties; TEST Willows/sandbox: 1 of 2 properties on (1 rows set); TEST Fairhaven: 4 ofProven live at Western Slope 09-18 (70/70 homes). Two switches for one thing.
property leasing/maint settings:guestCardWriteFromTextsproperty setting (LEASING_SETTINGS / MAINTENANCE_SETTINGS row)per-property boolean/enum on the property settings row2026-09-24 #12083 JP&Co: absent on all 2 properties; WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: 1 of 2 properties on (1 rows set); TEST Fairhaven: absent on allProven live at Western Slope 09-18 (70/70 homes). Two switches for one thing.
property leasing/maint settings:autoLinkCoApplicantsproperty setting (LEASING_SETTINGS / MAINTENANCE_SETTINGS row)per-property boolean/enum on the property settings row2026-09-08 #7417 CJP&Co: absent on all 2 properties; WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: 1 of 2 properties on (1 rows set); TEST Fairhaven: absent on allCorrectness rules for live behavior (2/2 on at JP&Co, or absent = off by accident).
property leasing/maint settings:tourInviteV2Enabledproperty setting (LEASING_SETTINGS / MAINTENANCE_SETTINGS row)per-property boolean/enum on the property settings row2026-09-13 #8128 WJP&Co: absent on all 2 properties; WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: 1 of 2 properties on (1 rows set); TEST Fairhaven: absent on allImprovements to live tour/renewal flows, absent everywhere = off by accident. Prove by replay, then permanent.
property leasing/maint settings:tourWindowMatchingEnabledproperty setting (LEASING_SETTINGS / MAINTENANCE_SETTINGS row)per-property boolean/enum on the property settings row2026-08-31 #6713 TJP&Co: absent on all 2 properties; WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: 2 of 2 properties on (2 rows set); TEST Fairhaven: absent on allInverted env arms on leasing improvements; effectively on everywhere already. Env arms are banned by the constitution.
property leasing/maint settings:tickerSelfHealEnabledproperty setting (LEASING_SETTINGS / MAINTENANCE_SETTINGS row)per-property boolean/enum on the property settings row2026-09-11 #7876 HJP&Co: absent on all 2 properties; WesternSlope: 70 of 70 properties on (70 rows set); Situs: absent on all 52 properties; TEST Willows/sandbox: absent on all 2 properties; TEST Fairhaven: absent on aFix for the missing-ticker import bug; on at 70/70 Western Slope homes already.
property leasing/maint settings:tourBookingBlockedTeamEmailproperty setting (LEASING_SETTINGS / MAINTENANCE_SETTINGS row)per-property boolean/enum on the property settings row2026-09-29 #13602 JP&Co: absent on all 2 properties; WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: absent on all 2 properties; TEST Fairhaven: absent on all 11 proImprovements to live tour/renewal flows, absent everywhere = off by accident. Prove by replay, then permanent.
property leasing/maint settings:lostTourSlotTeamEmailproperty setting (LEASING_SETTINGS / MAINTENANCE_SETTINGS row)per-property boolean/enum on the property settings row2026-09-29 #13418 JP&Co: absent on all 2 properties; WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: absent on all 2 properties; TEST Fairhaven: absent on all 11 proImprovements to live tour/renewal flows, absent everywhere = off by accident. Prove by replay, then permanent.
property leasing/maint settings:lostTourSlotProspectMessageproperty setting (LEASING_SETTINGS / MAINTENANCE_SETTINGS row)per-property boolean/enum on the property settings row2026-09-29 #13654 JP&Co: absent on all 2 properties; WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: absent on all 2 properties; TEST Fairhaven: absent on all 11 proImprovements to live tour/renewal flows, absent everywhere = off by accident. Prove by replay, then permanent.
property leasing/maint settings:renewalLapseDigestEnabledproperty setting (LEASING_SETTINGS / MAINTENANCE_SETTINGS row)per-property boolean/enum on the property settings row2026-09-04 #7104 GJP&Co: absent on all 2 properties; WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: absent on all 2 properties; TEST Fairhaven: absent on all 11 proImprovements to live tour/renewal flows, absent everywhere = off by accident. Prove by replay, then permanent.
ddb-config:APPFOLIO_BUDGET_ENFORCE#<account>DDB config row (PK=CONFIG)enforce per-account AppFolio request budget2026-09-12 2026-09all customers: jpco true (2026-09-13); westernslopepm true (2026-09-13); situsgroup true (2026-09-30)Rate-limit protection is a guard, not a feature. Removal PR in flight (Fede 09-30).
ddb-config:*_PORTFOLIO#<account> (BALANCES, GUEST_CARDS, LEASE_STATES,DDB config row (PK=CONFIG)per-account switch: one portfolio-wide AppFolio report call instead of per-property calls2026-09-12 2026-09all customers: ALL 10 arms enabled=true for jpco, westernslopepm and situsgroup (Situs armed 2026-09-30; jpco/ws 09-13..09-18). Exceptions: jpco LEASE_STATES_HISTORY armed 09-16; PAYMENTS jpco+ws 09-1Rate-limit protection is a guard, not a feature. Removal PR in flight (Fede 09-30).
ddb-config:GUEST_CARD_WRITE_FROM_CALLS#<org>DDB config row (PK=CONFIG)org-level switch: write AppFolio guest card when a call ends2026-09-17 2026-09all customers: enabled=true for Western Slope (2026-09-18 Fede "now we are live"), org_sandbox (2026-09-18), Fairhaven (2026-09-22, dry-run scaffold row); JP&Co absent; Situs absentProven live at Western Slope 09-18 (70/70 homes). Two switches for one thing.
env:TOUR_SCHEDULE_INLINE_CDCenvInline CDC on tour schedule writes.2026-07-21 #4274 AVercel prod: unset on Vercel prod; Lambda/ECS: not set (no lambda reads it); per-customer: n/a (global)Inverted env arms on leasing improvements; effectively on everywhere already. Env arms are banned by the constitution.
env:PROPFLOW_ROSTER_GATEenvOrg roster check on property scope.2026-09-10 #7682 fVercel prod: 1 (refuse); Lambda/ECS: not set (no lambda reads it); per-customer: n/a (global)Cross-company isolation is a hard floor (Fede 09-07). Refuse everywhere, no gate, no bench list.
WARM_CACHE_GATED_PROPERTY_IDScode allowlistWidened tour-slot horizon in the voice prompt plus real get_day_tour_times answers, and the background availability warm-cache refresher2026-08-24 #6164hardcoded targets: appfolio-45 (Willows); effective: ON for Willows only; every other property offMarked TEMPORARY on 08-24, still Willows-only five weeks later. Permanent or delete.
SLOT_HOLD_PROPERTY_IDS / config/calendar-slot-hold-properties.jsoncode allowlistStore-backed tour slot hold at applyTourIntent (prevents double-booking); refusal is caller-audible2026-09-14 #8416hardcoded targets: yale-sandbox; effective: ON for yale-sandbox onlyDouble-booking prevention is correctness. Everywhere.
ROSTER_REFUSE_PROPERTY_IDS / config/roster-refuse-properties.jsoncode allowlistRoster gate: refuses cross-company reads with a 404 regardless of PROPFLOW_ROSTER_GATE env switch2026-09-13 #8374hardcoded targets: fairhaven-homes, appfolio-45; effective: Refuse ON for those 2 test properties; others follow env switch (unset = off)Cross-company isolation is a hard floor (Fede 09-07). Refuse everywhere, no gate, no bench list.
ddb-config:ONBOARDING_IMPORT_ARM#<org>#<account>DDB config row (PK=CONFIG)Connecting an AppFolio account creates property skeletons only; the 5-stage onboarding import that creates units and leases runs only when this row is armed by hand. Read by src/lib/data/dynamo/onboarding-import-arm.ts; default off; set only by scripts/run-onboarding-import-bench.ts.2026-09-30 (found after audit)Situs Group: 448 declared units, 185 unit records; Alton 55 / Lampliter 41 / Carr Street 34 with zeroFix-shaped switch, remove. The import runs on connect (or on Finish) with no arm.

Delete (dead switch or dead path) (59)

SwitchKindWhat it gatesSinceLive stateWhy this verdict
arms:maintenance.boundedPhotoDeferralarms-registryWhether a tenant's maintenance report is guaranteed to become a work order. DISARMED (today): when the intake classifier says a photo would help, filing is deferred so Clara can ask for one — and it is deferred AGAIN on 2026-08-31 #6714 fproperty flag boundedPhotoDeferralEnabled: {'JP&Co': 'absent on all 2 properties', 'WesternSlope': 'absent on all 70 properties', 'Situs': 'absent on all 52 properties', 'TEST Willows/sandbox': '2 of Per-property switches from the prototype era, off (or absent) at every real customer. Delete the switch and the path nobody runs.
arms:vendor.transferFirstarms-registryTriage's greeting for recognized INBOUND vendor calls during office hours: when ON, Clara's greeting pre-announces the connect to the office before transferring; when OFF there is no pre-announcement. In both settings a 2026-08-05 #5469 fproperty flag vendorTransferFirstEnabled: {'JP&Co': '1 of 2 properties on (1 rows set)', 'WesternSlope': 'absent on all 70 properties', 'Situs': 'absent on all 52 properties', 'TEST Willows/sandbox': Per-property switches from the prototype era, off (or absent) at every real customer. Delete the switch and the path nobody runs.
arms:compliance.voiceFairHousingAlertarms-registryWhether a RED from the after-the-fact fair-housing judge on a VOICE turn posts the existing hold/alert card to the property's leasing-activity channel (fallback `alerts`). OFF (the default, and every property today): the2026-09-20 #9985 Aproperty flag voiceFairHousingAlertEnabled: {'JP&Co': 'absent on all 2 properties', 'WesternSlope': 'absent on all 70 properties', 'Situs': 'absent on all 52 properties', 'TEST Willows/sandbox': 'absePer-property switches from the prototype era, off (or absent) at every real customer. Delete the switch and the path nobody runs.
arms:kill.turnIntegrityTypedToolResultsarms-registryOFF lets raw thrown tool errors reach the model instead of curated typed failures.2026-07-17 #4061 FAppSettings key turnIntegrityTypedToolResults: CONFIG/SETTINGS row lacks key -> default ON (all customers)Four default-on kill switches from July, never flipped anywhere. Dead escape hatches.
arms:kill.turnIntegritySingleWriterarms-registryOFF stops suppressing the ingestion-side confirmation send, so the agent is no longer the sole customer-facing writer per inbound (double-send risk).2026-07-17 #4061 FAppSettings key turnIntegritySingleWriter: CONFIG/SETTINGS row lacks key -> default ON (all customers)Four default-on kill switches from July, never flipped anywhere. Dead escape hatches.
arms:kill.turnIntegrityReviewGatearms-registryOFF disables the Anomaly Review Gate on agent turns.2026-07-17 #4061 FAppSettings key turnIntegrityReviewGate: CONFIG/SETTINGS row lacks key -> default ON (all customers)Four default-on kill switches from July, never flipped anywhere. Dead escape hatches.
arms:kill.turnIntegrityOutputGatearms-registryOFF silences the output-gate verdict logs. Observe-only — it never blocks a send.2026-07-17 #4061 FAppSettings key turnIntegrityOutputGate: CONFIG/SETTINGS row lacks key -> default ON (all customers)Four default-on kill switches from July, never flipped anywhere. Dead escape hatches.
arms:runtime.claraTraceCapturePromptarms-registryCapturing the exact system prompt on persisted agent_traces (~5-15KB per trace) so the trace viewer can show what Clara read. Ships ON; the only off token is the literal `false`.2026-06-06 #1983 fenv CLARA_TRACE_CAPTURE_PROMPT: Vercel: unset on Vercel prod; ECS/Lambda: not set (no lambda reads it)Infra env flags with one prod value. Make the prod value the code and delete the var.
registry:capability_stage.<function>company/property setting (portfolio registry key)registry key, writable at ['org', 'group', 'property']; type enum2026-09-10 #7660 fJP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentRegistry keys with no reader and no row anywhere (design leftovers).
registry:observe.smscompany/property setting (portfolio registry key)registry key, writable at ['org', 'group', 'property']; type enum2026-09-10 #7409 TJP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentRegistry keys with no reader and no row anywhere (design leftovers).
registry:observe.emailcompany/property setting (portfolio registry key)registry key, writable at ['org', 'group', 'property']; type enum2026-09-11 #7708 fJP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentRegistry keys with no reader and no row anywhere (design leftovers).
registry:cross_sell.same_owner_onlycompany/property setting (portfolio registry key)registry key, writable at ['org', 'group']; type boolean2026-09-10 #7409 TJP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentRegistry keys with no reader and no row anywhere (design leftovers).
registry:cross_sell.rulecompany/property setting (portfolio registry key)registry key, writable at ['org', 'group']; type object2026-09-10 #7409 TJP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentRegistry keys with no reader and no row anywhere (design leftovers).
registry:home_pickercompany/property setting (portfolio registry key)registry key, writable at ['org', 'group', 'property']; type enum2026-09-07 #7251 PJP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentRegistry keys with no reader and no row anywhere (design leftovers).
registry:pms_delivery_modecompany/property setting (portfolio registry key)registry key, writable at ['org', 'group', 'property']; type unknown2026-09-11 #7708 fJP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentRegistry keys with no reader and no row anywhere (design leftovers).
settings.smsEnabledcompany setting (Organization.settings)Outbound SMS for the company (per-org)2026-03-12 no PR# JP&Co: false; WesternSlope: false; Situs: absent; TEST Willows/sandbox: false; TEST Fairhaven: absentAll false at every live customer while Clara texts and emails daily. Nothing reads them as intended. Delete.
settings.emailsEnabledcompany setting (Organization.settings)Outbound email for the company2026-03-12 no PR# JP&Co: false; WesternSlope: false; Situs: absent; TEST Willows/sandbox: false; TEST Fairhaven: absentAll false at every live customer while Clara texts and emails daily. Nothing reads them as intended. Delete.
settings.emailShadowModecompany setting (Organization.settings)Company email shadow mode2026-03-31 no PR# JP&Co: false; WesternSlope: false; Situs: absent; TEST Willows/sandbox: false; TEST Fairhaven: absentPer-property switches from the prototype era, off (or absent) at every real customer. Delete the switch and the path nobody runs.
settings.vendorQuoteEmailscompany setting (Organization.settings)Vendor quote emails2026-02-22 no PR# JP&Co: false; WesternSlope: false; Situs: absent; TEST Willows/sandbox: false; TEST Fairhaven: absentAll false at every live customer while Clara texts and emails daily. Nothing reads them as intended. Delete.
settings.vendorDispatchEmailscompany setting (Organization.settings)Vendor dispatch emails2026-02-23 no PR# JP&Co: false; WesternSlope: false; Situs: absent; TEST Willows/sandbox: false; TEST Fairhaven: absentAll false at every live customer while Clara texts and emails daily. Nothing reads them as intended. Delete.
property:autoDraftLeaseOnApprovalEnabledproperty setting (Property row boolean)per-property boolean gate (see name)2026-09-06 #7178 NJP&Co: absent on all 2 properties; WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: 1 of 2 properties on (1 rows set); TEST Fairhaven: absent on allPer-property switches from the prototype era, off (or absent) at every real customer. Delete the switch and the path nobody runs.
property:autoSyncEnabledproperty setting (Property row boolean)per-property boolean gate (see name)2026-04-07 no PR# JP&Co: 1 of 2 properties on (1 rows set); WesternSlope: 0 of 70 properties on (1 rows set); Situs: absent on all 52 properties; TEST Willows/sandbox: absent on all 2 properties; TEST Fairhaven: 0 of 1Per-property switches from the prototype era, off (or absent) at every real customer. Delete the switch and the path nobody runs.
property:disableEmailRentRollBalanceSyncproperty setting (Property row boolean)per-property boolean gate (see name)2026-04-18 #187 feJP&Co: 1 of 2 properties on (1 rows set); WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: absent on all 2 properties; TEST Fairhaven: absent on allPer-property switches from the prototype era, off (or absent) at every real customer. Delete the switch and the path nobody runs.
property:emailShadowModeproperty setting (Property row boolean)per-property boolean gate (see name)2026-03-31 no PR# JP&Co: 0 of 2 properties on (2 rows set); WesternSlope: 1 of 70 properties on (1 rows set); Situs: absent on all 52 properties; TEST Willows/sandbox: 0 of 2 properties on (2 rows set); TEST Fairhaven:Per-property switches from the prototype era, off (or absent) at every real customer. Delete the switch and the path nobody runs.
property:escalationBakeApprovalRequiredproperty setting (Property row boolean)per-property boolean gate (see name)2026-08-30 #6654 ERemoved 2026-10-13 (PR #19357, #19366). JP&Co: 0 of 2 properties on (1 rows set); WesternSlope: 0 of 70 properties on (1 rows set); Situs: absent on all 52 properties; TEST Willows/sandbox: 0 of 2 properties on (1 rows set); TEST Fairhaven:Per-property switches from the prototype era, off (or absent) at every real customer. Delete the switch and the path nobody runs.
property:escalationCoworkerModeEnabledproperty setting (Property row boolean)per-property boolean gate (see name)2026-09-03 #6979 fJP&Co: absent on all 2 properties; WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: 1 of 2 properties on (1 rows set); TEST Fairhaven: absent on allPer-property switches from the prototype era, off (or absent) at every real customer. Delete the switch and the path nobody runs.
property:pmsWritesAllowedWhileTestproperty setting (Property row boolean)per-property boolean gate (see name)2026-09-17 #9325 fJP&Co: absent on all 2 properties; WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: 1 of 2 properties on (1 rows set); TEST Fairhaven: 3 of 11 propePer-property switches from the prototype era, off (or absent) at every real customer. Delete the switch and the path nobody runs.
property:promiseLedgerCallerOutboundEnabledproperty setting (Property row boolean)per-property boolean gate (see name)2026-08-29 #6564 CJP&Co: 0 of 2 properties on (1 rows set); WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: 0 of 2 properties on (1 rows set); TEST Fairhaven: 0 of 1Per-property switches from the prototype era, off (or absent) at every real customer. Delete the switch and the path nobody runs.
property:rentRollDataApiEnabledproperty setting (Property row boolean)per-property boolean gate (see name)2026-09-15 #8630 MJP&Co: 1 of 2 properties on (1 rows set); WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: absent on all 2 properties; TEST Fairhaven: absent on allPer-property switches from the prototype era, off (or absent) at every real customer. Delete the switch and the path nobody runs.
property:smsShadowModeproperty setting (Property row boolean)per-property boolean gate (see name)2026-08-24 #6215 PJP&Co: 0 of 2 properties on (1 rows set); WesternSlope: 0 of 70 properties on (1 rows set); Situs: absent on all 52 properties; TEST Willows/sandbox: 0 of 2 properties on (1 rows set); TEST Fairhaven:Per-property switches from the prototype era, off (or absent) at every real customer. Delete the switch and the path nobody runs.
property:useAgentTourProcessingproperty setting (Property row boolean)per-property boolean gate (see name)2026-04-01 no PR# JP&Co: 0 of 2 properties on (1 rows set); WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: absent on all 2 properties; TEST Fairhaven: absent on allPer-property switches from the prototype era, off (or absent) at every real customer. Delete the switch and the path nobody runs.
property:vendorVoiceCallingEnabledproperty setting (Property row boolean)per-property boolean gate (see name)2026-07-24 #4477 VJP&Co: absent on all 2 properties; WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: 1 of 2 properties on (1 rows set); TEST Fairhaven: absent on allPer-property switches from the prototype era, off (or absent) at every real customer. Delete the switch and the path nobody runs.
property leasing/maint settings:newLeaseExecutionNoticesEnabledproperty setting (LEASING_SETTINGS / MAINTENANCE_SETTINGS row)per-property boolean/enum on the property settings row2026-07-01 #2823 fJP&Co: 0 of 2 properties on (1 rows set); WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: 1 of 2 properties on (1 rows set); TEST Fairhaven: absentPer-property switches from the prototype era, off (or absent) at every real customer. Delete the switch and the path nobody runs.
property leasing/maint settings:renewalOutreachEnabledproperty setting (LEASING_SETTINGS / MAINTENANCE_SETTINGS row)per-property boolean/enum on the property settings row2026-03-18 no PR# JP&Co: 0 of 2 properties on (1 rows set); WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: 1 of 2 properties on (1 rows set); TEST Fairhaven: absentPer-property switches from the prototype era, off (or absent) at every real customer. Delete the switch and the path nobody runs.
property leasing/maint settings:turnIntegrityTypedToolResultsproperty setting (LEASING_SETTINGS / MAINTENANCE_SETTINGS row)per-property boolean/enum on the property settings row2026-07-17 #4061 FJP&Co: absent on all 2 properties; WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: absent on all 2 properties; TEST Fairhaven: absent on all 11 proFour default-on kill switches from July, never flipped anywhere. Dead escape hatches.
property leasing/maint settings:pmNotificationModeproperty setting (LEASING_SETTINGS / MAINTENANCE_SETTINGS row)per-property boolean/enum on the property settings row2026-08-27 #6441 OJP&Co: absent on all 2 properties; WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: absent on all 2 properties; TEST Fairhaven: absent on all 11 proPer-property switches from the prototype era, off (or absent) at every real customer. Delete the switch and the path nobody runs.
ddb-config:ONBOARDING_IMPORT_ARM#<org>#<account>DDB config row (PK=CONFIG)PMS onboarding import arm2026-09-12 2026-09all customers: Western Slope armed=true (2026-09-13); org_sandbox armed=falseInternal machinery arms already on (or one-property allowlists from Aug). Delete the row and the read.
ddb-config:PMS_SYNC_DISPATCHDDB config row (PK=CONFIG)how the sync tick dispatches (per-connection)2026-09-09 2026-09all customers: mode=per-connection (2026-09-10)Internal machinery arms already on (or one-property allowlists from Aug). Delete the row and the read.
ddb-config:OPERATING_MODE_ARMDDB config row (PK=CONFIG)PropFlow-owned inbox operating mode (D9)2026-08-27 2026-08all customers: enabled=true, propertyAllowlist=[1773625952029] (the Yale/bench property; updatedBy fede-yale-e2e 2026-08-31)Internal machinery arms already on (or one-property allowlists from Aug). Delete the row and the read.
ddb-config:D8_PIPELINE_ARMDDB config row (PK=CONFIG)thumbs-down auto-drafts a regression test2026-08-23 2026-08all customers: armed=true (2026-08-23)Internal machinery arms already on (or one-property allowlists from Aug). Delete the row and the read.
ddb-config:FEATURESDDB config row (PK=CONFIG)global enabledModules fallbackunknown unknownall customers: leasing.prospects/renewals true; maintenance.* and dashboard falseCamellia-era global rows. testMode=true is set GLOBALLY in prod today. Retire.
ddb-config:SETTINGSDDB config row (PK=CONFIG)legacy global AppSettings row (Camellia-era)2026-03-12 2026-03all customers: emailsEnabled=true, smsEnabled=true, testMode=true, tenantIdentityValidation=true, renewalOutreachEnabled=false, callerIdPassthrough=false, huntAcceptMode=press1, emailShadowMode=false,Camellia-era global rows. testMode=true is set GLOBALLY in prod today. Retire.
env:PMS_OUTAGE_ALARMenvPMS outage alarm.2026-09-11 #7796 fVercel prod: unset on Vercel prod; Lambda/ECS: not set (no lambda reads it); per-customer: n/a (global)Infra env flags with one prod value. Make the prod value the code and delete the var.
env:APPFOLIO_ENABLEDenvAppFolio data sync lambda runs.2026-04-17 #174 feVercel prod: unset on Vercel prod; Lambda/ECS: appfolio-sync-prod: true; per-customer: n/a (global)Infra env flags with one prod value. Make the prod value the code and delete the var.
env:APPFOLIO_WORK_ORDERS_MODE / BALANCES_MODE / OCCUPANCIES_MODEenvPer-job sync mode.unknown Vercel prod: unset on Vercel prod; Lambda/ECS: appfolio-sync-prod: all primary; per-customer: n/a (global)Infra env flags with one prod value. Make the prod value the code and delete the var.
env:WO_ENRICH_ENABLEDenvWork-order enrichment.2026-05-04 #630 feVercel prod: unset on Vercel prod; Lambda/ECS: appfolio-sync-prod: true; per-customer: n/a (global)Infra env flags with one prod value. Make the prod value the code and delete the var.
env:MAINTENANCE_HANDYMAN_QUIET_HOURSenvHandyman quiet-hours window.2026-06-09 #2077 fVercel prod: unset on Vercel prod; Lambda/ECS: appfolio-sync-prod: 22:00-22:01; per-customer: n/a (global)Infra env flags with one prod value. Make the prod value the code and delete the var.
env:TEMPORAL_USE_VERSIONINGenvTemporal worker versioning.2026-05-14 #927 PhVercel prod: unset on Vercel prod; Lambda/ECS: ECS renewal-worker-prod task def :4317: not set; per-customer: n/a (global)Infra env flags with one prod value. Make the prod value the code and delete the var.
env:TRAFFIC_CAPTUREenvTraffic capture.2026-07-25 #4535 fVercel prod: unset on Vercel prod; Lambda/ECS: not set (no lambda reads it); per-customer: n/a (global)Infra env flags with one prod value. Make the prod value the code and delete the var.
env:DATA_BACKENDenvStorage backend.unknown Vercel prod: dynamodb; Lambda/ECS: dynamodb on all; per-customer: n/a (global)Infra env flags with one prod value. Make the prod value the code and delete the var.
env:SPINE_GSI_USE_SCANenvEscape hatch forcing scans.2026-08-02 #5283 pVercel prod: unset on Vercel prod; Lambda/ECS: not set (no lambda reads it); per-customer: n/a (global)Infra env flags with one prod value. Make the prod value the code and delete the var.
env:CLOUDWATCH_METRICSenvEmit CloudWatch metrics.unknown Vercel prod: unset on Vercel prod; Lambda/ECS: not set (no lambda reads it); per-customer: n/a (global)Infra env flags with one prod value. Make the prod value the code and delete the var.
env:APPFOLIO_FUTURE_ARRIVALSenvFuture-arrivals writer.2026-07-28 #4774 fVercel prod: unset on Vercel prod; Lambda/ECS: not set (no lambda reads it); per-customer: n/a (global)Infra env flags with one prod value. Make the prod value the code and delete the var.
env:TEMPORAL_LIVE_PROPERTY_ALLOWLIST / TEMPORAL_SHADOW_ENABLED / TEMPOenvDead: set on Vercel prod but no code reads them.2026-05-16 #997 feVercel prod: LIVE_ALLOWLIST='*', SHADOW_ENABLED='true', LEASE_EXEC='armed', DIGEST='armed', others hidden; Lambda/ECS: n/a; per-customer: n/a (global)Six Vercel prod vars no code reads. Delete.
env:RENEWAL_ARM_CACHE_TTL_MS, RENEWAL_LADDER_ALLOWED_PROPERTY_IDS, RENenvtuning/allowlistunknown Vercel prod: unset on Vercel prod; Lambda/ECS: not set (no lambda reads it); per-customer: n/a (global)Infra env flags with one prod value. Make the prod value the code and delete the var.
DISARMEDcode constantRollback kill switch: true = Western Slope 970 line agent bound with no tools and call-start webhook off2026-09-07 #7297hardcoded targets: Western Slope 970 line agent (whole prototype); effective: false (armed: tools bound, webhook on)A code-constant rollback lever. Rollback is a revert, not a flag.
propflow-concession-watcher-prod EventBridge rulescheduleDaily concession-watcher Lambda trigger2026-09-27 #12898 hardcoded targets: global; effective: DISABLED (rule kept, Vercel cron /api/cron/concession-watcher at 0 13 * * * is the single daily trigger)Retired or informational; delete the rule/entry.
inspo-sweep (Smith LaunchAgent, manifest enabled=false)scheduleWeekly marketing-inspo sweep, Meta Ad Library vision taste-gate, digest to #marketing2026-09-21 unknownhardcoded targets: n/a; effective: enabled=false (parked 2026-09-21)Retired or informational; delete the rule/entry.
appfolio-sync per-class EventBridge rules (act_now/answer_live/bookkeescheduleClass cadence rules2026-09-12 #8136 (hardcoded targets: all; effective: ENABLED since cutover #8136 2026-09-13 (schedules.json header SUPERSEDED note); not disabledRetired or informational; delete the rule/entry.

Finish the cutover, then delete (14)

SwitchKindWhat it gatesSinceLive stateWhy this verdict
arms:newLease.autonomousSendingarms-registryWhether approving a new-lease review item drives the AppFolio executor all the way to send-for-signature, or stops at the save-a-draft step. FALSE/ABSENT (the safe default): approve creates the lease document in AppFolio2026-08-31 #6731 Aproperty flag autonomousLeaseSendingEnabled: {'JP&Co': 'absent on all 2 properties', 'WesternSlope': 'absent on all 70 properties', 'Situs': 'absent on all 52 properties', 'TEST Willows/sandbox': 'absNew engine or cutover switches: prove at the next customer, cut over, delete within the week.
arms:email.ntvFirmRoutingarms-registryTreating a high-confidence formal-notice EMAIL as a firm NTV: declines the renewal, starts turnover + move-out inspection, and drafts the AppFolio move-out. Fleet-wide — no per-property factor.2026-06-10 #2129 fenv EMAIL_NTV_FIRM_ROUTING_ENABLED: Vercel: armed; ECS/Lambda: not set (no lambda reads it)Superseded by the durable arms row (all true). Delete the env copies; then collapse the row into the module settings.
arms:newLease.pipelinearms-registryWhether an APPROVED rental application may create a "next-steps package" review item on /review at all. DISARMED = approvals never create an item, exactly as today. ARMED (plus the property opt-in) still sends nothing on2026-08-22 #6078 Nproperty flag newLeasePipelineEnabled: {'JP&Co': '1 of 2 properties on (1 rows set)', 'WesternSlope': 'absent on all 70 properties', 'Situs': 'absent on all 52 properties', 'TEST Willows/sandbox': '1 New engine or cutover switches: prove at the next customer, cut over, delete within the week.
registry:call_routing.v2company/property setting (portfolio registry key)registry key, writable at ['org']; type boolean2026-09-23 #10960 JP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: true; TEST Fairhaven: trueNew engine or cutover switches: prove at the next customer, cut over, delete within the week.
org field:guestCardFirstEmailEngineEnabledcompany setting (Organization row field)New engine composes the first email to a guest-card prospect (org field)2026-09-24 #11694 JP&Co: absent; WesternSlope: true (2026-09-26 "fede-relayed ws-autonomous"); Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentNew engine or cutover switches: prove at the next customer, cut over, delete within the week.
settings.pmsSideEffectModecompany setting (Organization.settings)shadow|apply for PMS writes2026-09-20 #10375 JP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: apply; TEST Fairhaven: absentNew engine or cutover switches: prove at the next customer, cut over, delete within the week.
property:guestCardFirstEmailEngineEnabledproperty setting (Property row boolean)per-property boolean gate (see name)2026-09-24 #11694 JP&Co: absent on all 2 properties; WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: 1 of 2 properties on (1 rows set); TEST Fairhaven: absent on allNew engine or cutover switches: prove at the next customer, cut over, delete within the week.
ddb-config:RENEWAL_ARMSDDB config row (PK=CONFIG)autoStart/autonomousSending/holdoverConversion/turnoverSending/newLeasePipelineSending/maintenanceSending/listingAutoPublish/etc. durable arms (one row, global)2026-06-09 2026-06all customers: all TRUE except walkerSpawn=false, holdoverInWorkflow=false; stableWorkflowIdentity + workflowOwnedDispatch allowlists = appfolio-45 (Willows) + 1773625953462; walkerSpawnPropertyGate/hSuperseded by the durable arms row (all true). Delete the env copies; then collapse the row into the module settings.
env:MAINTENANCE_AUTONOMOUS_SENDINGenvOnly read by pipeline-lab script in code; prod maintenance arm is durable row maintenanceSending.2026-05-26 #1496 fVercel prod: armed; Lambda/ECS: not set (no lambda reads it); per-customer: n/a (global)Superseded by the durable arms row (all true). Delete the env copies; then collapse the row into the module settings.
env:READER_SHADOW_MODEenvShadow-reads through new reader.2026-05-06 #680 feVercel prod: true; Lambda/ECS: inbound-processor-prod: true; appfolio-sync-prod: true; per-customer: n/a (global)Shadow reader has been "true" everywhere since May. Finish the cutover, delete the shim.
env:SHADOW_SHIM_TIMEOUT_MSenvTimeout for shadow shim.unknown Vercel prod: 20000; Lambda/ECS: 20000 on both; per-customer: n/a (global)Shadow reader has been "true" everywhere since May. Finish the cutover, delete the shim.
flipped dispatch orgs / config/flipped-dispatch-orgs.jsoncode allowlistWhich orgs pick work-order vendors through pickVendor instead of autoAssignVendor2026-09-13 #8351hardcoded targets: org_sandbox; effective: ON for org_sandbox (test company) onlyRollout ramps from 09-13 that never widened past the test company. Finish or delete.
flipped addresses / config/flipped-addresses.jsoncode allowlistWhich phone/mail addresses route on their address-head record (one address at a time)2026-09-13 #8253hardcoded targets: phones +18442853526 (appfolio-45 toll-free) and +17208071724 (fairhaven-homes bench line); effective: ON for those 2 test lines onlyRollout ramps from 09-13 that never widened past the test company. Finish or delete.
unmappedLineFleet staging refusalcode allowlistRefuses calls to a number that maps to no property, only on the staging fleet; production keeps fail-open2026-09-11 #7731hardcoded targets: fleet==staging (appfolio-45 / portfolio bench via AGENT_FLEETS_BY_PROPERTY); effective: Staging refuses; production fail-open unchangedRollout ramps from 09-13 that never widened past the test company. Finish or delete.

Fede decides (18)

SwitchKindWhat it gatesSinceLive stateWhy this verdict
env:PMS_CANCEL_ENABLEDenvPublishes AppFolio work-order cancel job on close.2026-05-06 #712 PiVercel prod: true; Lambda/ECS: inbound-processor-prod: false; per-customer: n/a (global)Vercel and the Lambda disagree (spam filter OFF on web, ON in the mail Lambda; cancel ON on web, OFF in Lambda). Pick one value, make it code, delete the env var.
env:SPAM_FILTER_ENABLEDenvInbound email spam filter.2026-04-09 no PR# Vercel prod: false (filter OFF); Lambda/ECS: not set on inbound-processor (default on); per-customer: n/a (global)Vercel and the Lambda disagree (spam filter OFF on web, ON in the mail Lambda; cancel ON on web, OFF in Lambda). Pick one value, make it code, delete the env var.
DARK_FEATURE_BENCH_IDS / isDarkFeatureBenchcode allowlistCaller-audible dark voice features: soft language prior on ring (personalization route:2706), post-call guest-card contact capture, bedroom-range directive, hangup mid-message backstop (hangupBackstopPropertyAllowed), ca2026-09-11 #7801 (hardcoded targets: yale-sandbox; effective: ON for yale-sandbox only (call-integrity also ON for portfolio-mode companies)Caller-audible voice improvements gated to one bench property; their own comments say turn-on = delete the condition. Fede: delete now?
appfolio-sync work_ordersscheduleEventBridge rule for work_orders: Syncs AppFolio work orders into PropFlow read model (PMS owns WO ids)2026-09-12 #7946 (hardcoded targets: all AppFolio accounts (jpco, situsgroup); global; effective: DISABLED (rule upserted but not firing; declared state survives deploys) cadence rate(1 minute)Parked 09-12 during the storm; the protections now exist. renewals off = stale lease end dates at every customer. Lift work_orders + renewals; vendors stays off by product ruling.
appfolio-sync renewalsscheduleEventBridge rule for renewals: Syncs AppFolio renewal rows (rent-roll poller seam)2026-09-12 #7946 (hardcoded targets: all AppFolio accounts (jpco, situsgroup); global; effective: DISABLED (rule upserted but not firing; declared state survives deploys) cadence rate(1 minute)Parked 09-12 during the storm; the protections now exist. renewals off = stale lease end dates at every customer. Lift work_orders + renewals; vendors stays off by product ruling.
appfolio-sync vendorsscheduleEventBridge rule for vendors: Mirrors the AppFolio vendor directory into the read model2026-09-12 #7946 (hardcoded targets: all AppFolio accounts (jpco, situsgroup); global; effective: DISABLED (rule upserted but not firing; declared state survives deploys) cadence rate(1 hour)Parked 09-12 during the storm; the protections now exist. renewals off = stale lease end dates at every customer. Lift work_orders + renewals; vendors stays off by product ruling.
appfolio-sync vendor_contactscheduleEventBridge rule for vendor_contact: L4 browser-robot sweep refreshing stale vendor phone/email/owner2026-09-12 #7946 (hardcoded targets: all AppFolio accounts (jpco, situsgroup); global; effective: DISABLED (rule upserted but not firing; declared state survives deploys) cadence cron(30 1,7,13,19 * * ? *)Parked 09-12 during the storm; the protections now exist. renewals off = stale lease end dates at every customer. Lift work_orders + renewals; vendors stays off by product ruling.
pm-action-reminder-backstoptemporal scheduleTemporal schedule pm-action-reminder-backstop (registered by upsertPmActionReminderBackstopSchedule)2026-07-21 #4243hardcoded targets: global; effective: Code default: paused unless opts.paused===false. LIVE prod pause state is unknown from code (scripts/temporal/upsert-*.ts set it at run time)Ten Temporal schedules ship paused by code default and nobody knows the live pause state. Each is either running (then remove the paused default) or dead (delete it).
tour-cohort-walkertemporal scheduleTemporal schedule tour-cohort-walker (registered by upsertTourCohortWalkerSchedule)2026-05-22 #1341hardcoded targets: global; effective: Code default: paused unless opts.paused===false. LIVE prod pause state is unknown from code (scripts/temporal/upsert-*.ts set it at run time)Ten Temporal schedules ship paused by code default and nobody knows the live pause state. Each is either running (then remove the paused default) or dead (delete it).
bench-borrow-expiry-dailytemporal scheduleTemporal schedule bench-borrow-expiry-daily (registered by upsertBenchBorrowExpirySchedule)2026-09-04 #7056hardcoded targets: global; effective: Code default: paused unless opts.paused===false. LIVE prod pause state is unknown from code (scripts/temporal/upsert-*.ts set it at run time)Ten Temporal schedules ship paused by code default and nobody knows the live pause state. Each is either running (then remove the paused default) or dead (delete it).
maintenance-eval-dailytemporal scheduleTemporal schedule maintenance-eval-daily (registered by upsertMaintenanceEvalSchedule)2026-05-29 #1717hardcoded targets: global; effective: Code default: paused by default (ship paused). LIVE prod pause state is unknown from code (scripts/temporal/upsert-*.ts set it at run time)Ten Temporal schedules ship paused by code default and nobody knows the live pause state. Each is either running (then remove the paused default) or dead (delete it).
pms-sync-eval-dailytemporal scheduleTemporal schedule pms-sync-eval-daily (registered by upsertPmsSyncEvalSchedule)2026-06-01 #1807hardcoded targets: global; effective: Code default: paused by default (ship paused). LIVE prod pause state is unknown from code (scripts/temporal/upsert-*.ts set it at run time)Ten Temporal schedules ship paused by code default and nobody knows the live pause state. Each is either running (then remove the paused default) or dead (delete it).
topic-label-sweep-nightlytemporal scheduleTemporal schedule topic-label-sweep-nightly (registered by upsertTopicLabelSweepSchedule)2026-08-19 #5902hardcoded targets: global; effective: Code default: paused unless armed:true. LIVE prod pause state is unknown from code (scripts/temporal/upsert-*.ts set it at run time)Ten Temporal schedules ship paused by code default and nobody knows the live pause state. Each is either running (then remove the paused default) or dead (delete it).
onsite-pricing-dailytemporal scheduleTemporal schedule onsite-pricing-daily (registered by upsertOnsitePricingSchedule)2026-07-06 #3170hardcoded targets: global; effective: Code default: paused unless armed:true. LIVE prod pause state is unknown from code (scripts/temporal/upsert-*.ts set it at run time)Ten Temporal schedules ship paused by code default and nobody knows the live pause state. Each is either running (then remove the paused default) or dead (delete it).
availability-warm-cache-refreshtemporal scheduleTemporal schedule availability-warm-cache-refresh (registered by upsertAvailabilityWarmCacheSchedule)2026-08-24 #6164hardcoded targets: global; effective: Code default: paused unless armed:true. LIVE prod pause state is unknown from code (scripts/temporal/upsert-*.ts set it at run time)Ten Temporal schedules ship paused by code default and nobody knows the live pause state. Each is either running (then remove the paused default) or dead (delete it).
connection-health-sweeptemporal scheduleTemporal schedule connection-health-sweep (registered by upsertConnectionHealthSweepSchedule)2026-09-29 #13585hardcoded targets: global; effective: Code default: paused unless armed:true. LIVE prod pause state is unknown from code (scripts/temporal/upsert-*.ts set it at run time)Ten Temporal schedules ship paused by code default and nobody knows the live pause state. Each is either running (then remove the paused default) or dead (delete it).
voice-injection-cache-refresh-dailytemporal scheduleTemporal schedule voice-injection-cache-refresh-daily (registered by upsertVoiceInjectionCacheSchedule)2026-07-07 #3237hardcoded targets: global; effective: Code default: paused unless armed:true. LIVE prod pause state is unknown from code (scripts/temporal/upsert-*.ts set it at run time)Ten Temporal schedules ship paused by code default and nobody knows the live pause state. Each is either running (then remove the paused default) or dead (delete it).
prep-namespace.ts registers ALL 12 schedules paused (target-namespace temporal scheduleCreates renewal-auto-start-daily, renewal-cohort-walker-daily, tour-cohort-walker, turnover-cohort-walker, collections-cohort-walker-daily, conversation-review-daily, pm-action-reminder-backstop, bench-borrow-expiry-dail2026-07-06 #3088hardcoded targets: new/target namespace only; effective: Paused in target namespace prepTen Temporal schedules ship paused by code default and nobody knows the live pause state. Each is either running (then remove the paused default) or dead (delete it).

Keep as a customer setting (62)

SwitchKindWhat it gatesSinceLive stateWhy this verdict
arms:renewal.sendingarms-registryClara sending renewal offers/nudges to real tenants.2026-05-24 #1376 rproperty flag autonomousRenewalEnabled: {'JP&Co': '1 of 2 properties on (1 rows set)', 'WesternSlope': '0 of 70 properties on (1 rows set)', 'Situs': 'absent on all 52 properties', 'TEST Willows/sandbReal autonomy choices (Clara sends to tenants/vendors). But 12 per property is the sprawl: collapse into the per-module settings above, one switch per module.
arms:renewal.holdoverarms-registryThe BILLING mutation when a lease lapses unsigned (flip to month-to-month + change recurring rent), and the D5 reminder copy promising it.2026-06-04 #1941 fproperty flag autonomousHoldoverEnabled: {'JP&Co': '1 of 2 properties on (1 rows set)', 'WesternSlope': 'absent on all 70 properties', 'Situs': 'absent on all 52 properties', 'TEST Willows/sandbox': 'Real autonomy choices (Clara sends to tenants/vendors). But 12 per property is the sprawl: collapse into the per-module settings above, one switch per module.
arms:renewal.autoStartarms-registryThe daily scanner that walks tenants and opens renewal sagas. Its env fallback was retired 2026-07-07 — a row-less environment is disarmed and cannot be armed by a stale env.2026-06-09 #2069 Ddurable CONFIG row field autoStart: {'RENEWAL_ARMS row': 'see DDB config rows'}Real autonomy choices (Clara sends to tenants/vendors). But 12 per property is the sprawl: collapse into the per-module settings above, one switch per module.
arms:collections.haltarms-registryHUMAN-APPROVED SENDS ONLY — the cadence itself texts nobody, whatever this row says. Every composed reminder lands on /review and a person approving it there is the only thing that sends it (ADR-0125). The tenant past-du2026-07-28 #4806 fdurable CONFIG row field collectionsHalt: {'RENEWAL_ARMS row': 'see DDB config rows'}Real autonomy choices (Clara sends to tenants/vendors). But 12 per property is the sprawl: collapse into the per-module settings above, one switch per module.
arms:turnover.sendingarms-registryTurnover-domain outbound sends.2026-05-25 #1426 fproperty flag autonomousTurnoverEnabled: {'JP&Co': '1 of 2 properties on (1 rows set)', 'WesternSlope': '0 of 70 properties on (1 rows set)', 'Situs': 'absent on all 52 properties', 'TEST Willows/sandReal autonomy choices (Clara sends to tenants/vendors). But 12 per property is the sprawl: collapse into the per-module settings above, one switch per module.
arms:listing.autoPublisharms-registryAuto-publishing a unit listing when notice-to-vacate lands (ADR-0105). The global arm was REMOVED 2026-08-07 — it shipped disarmed and was never armed, so the hook ran in shadow for every property and vacant units sat un2026-07-21 #4219 Aproperty flag autonomousListingPublishEnabled: {'JP&Co': '1 of 2 properties on (1 rows set)', 'WesternSlope': '0 of 70 properties on (1 rows set)', 'Situs': 'absent on all 52 properties', 'TEST WillowReal autonomy choices (Clara sends to tenants/vendors). But 12 per property is the sprawl: collapse into the per-module settings above, one switch per module.
arms:vendor.dispatcharms-registryAutonomous dispatch messages to vendors.2026-06-18 #2439 fproperty flag autonomousVendorDispatchEnabled: {'JP&Co': 'absent on all 2 properties', 'WesternSlope': 'absent on all 70 properties', 'Situs': 'absent on all 52 properties', 'TEST Willows/sandbox': '0Real autonomy choices (Clara sends to tenants/vendors). But 12 per property is the sprawl: collapse into the per-module settings above, one switch per module.
registry:notifications.staffObserverBcccompany/property setting (portfolio registry key)registry key, writable at ['org']; type boolean2026-09-18 #9520 fJP&Co: org settings.staffObserverBcc=true (legacy field); WesternSlope: org settings.staffObserverBcc=true (legacy field); Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
registry:notifications.observerBcccompany/property setting (portfolio registry key)registry key, writable at ['org', 'group', 'property']; type object2026-09-16 #9001 fJP&Co: absent; WesternSlope: legacy field settings.observerBcc {enabled:true, 1 email}; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
registry:pm_action_reminders.enabledcompany/property setting (portfolio registry key)registry key, writable at ['org', 'property']; type boolean2026-09-19 #9756 pJP&Co: org.pmActionReminders.enabled=true (legacy org field); Camellia property leasing settings enabled:true interval 24h max 3; WesternSlope: 70 of 70 property leasing-settings rows pmActionReminderA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
registry:dispatch.roster_walk.enabledcompany/property setting (portfolio registry key)registry key, writable at ['org']; type boolean2026-09-21 #10537 JP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
registry:human_handoff.text_on_ringcompany/property setting (portfolio registry key)registry key, writable at ['org', 'property']; type boolean2026-09-20 #10250 JP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
registry:human_handoff.acceptModecompany/property setting (portfolio registry key)registry key, writable at ['org']; type enum2026-09-21 #10567 JP&Co: registry row absent; CONFIG/SETTINGS huntAcceptMode=press1 (global legacy); WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
registry:building.in_propflowcompany/property setting (portfolio registry key)registry key, writable at ['property']; type object2026-09-29 #13913 JP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
registry:maintenance.modulecompany/property setting (portfolio registry key)registry key, writable at ['org', 'property']; type object2026-09-25 #12416 JP&Co: enabled:false at 1 property (Yale 25 Station, 2026-09-26); WesternSlope: enabled:false at company-line property (2026-09-29; property row); Situs: absent; TEST Willows/sandbox: absent; TEST FaiA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
registry:leasing.prospects.modulecompany/property setting (portfolio registry key)registry key, writable at ['org', 'property']; type object2026-09-26 #12465 JP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
registry:leasing.renewals.modulecompany/property setting (portfolio registry key)registry key, writable at ['org', 'property']; type object2026-09-26 #12465 JP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
registry:collections.modulecompany/property setting (portfolio registry key)registry key, writable at ['org', 'property']; type object2026-09-26 #12465 JP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
registry:lease_billing.modulecompany/property setting (portfolio registry key)registry key, writable at ['org']; type object2026-09-22 #10769 JP&Co: absent; WesternSlope: enabled:false (org row); Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
registry:leasing.guestCardReplyScopecompany/property setting (portfolio registry key)registry key, writable at ['org']; type enum2026-09-25 #12111 JP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
registry:leasing.applicationLinkModecompany/property setting (portfolio registry key)registry key, writable at ['org']; type enum2026-09-19 #9779 lJP&Co: absent; WesternSlope: legacy org field applicationLinkMode=pms_generated; Situs: absent; TEST Willows/sandbox: legacy org field pms_generated; TEST Fairhaven: absentA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
registry:leasing.applicationLinkClaraTextscompany/property setting (portfolio registry key)registry key, writable at ['org']; type boolean2026-09-29 #13626 JP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
registry:buildings.customer_controlcompany/property setting (portfolio registry key)registry key, writable at ['org']; type enum2026-09-30 #14130 JP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
org field:claraLivecompany setting (Organization row field)Clara answers/acts for the company at all (master live switch)2026-04-25 no PR# JP&Co: true (2026-09-11); WesternSlope: true (2026-09-20); Situs: false; TEST Willows/sandbox: true; TEST Fairhaven: false; ConAm: falseA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
org field:reviewOutboundEmailscompany setting (Organization row field)Holds Clara outbound emails for staff Slack review before send2026-09-19 #9948 RRemoved 2026-10-13 (PR #19357, #19366). JP&Co: absent; WesternSlope: false (set 2026-09-26); Situs: absent; TEST Willows/sandbox: false; TEST Fairhaven: absentA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
org field:pmsShowingSyncEnabledcompany setting (Organization row field)Writes booked showings into AppFolio2026-09-21 #10678 JP&Co: absent; WesternSlope: true (2026-09-22, "fede-relayed showing-sync go"); Situs: absent; TEST Willows/sandbox: true; TEST Fairhaven: absentWrites into the customer's AppFolio calendar; a customer can want that off.
org field:tourCheckinTextEnabledcompany setting (Organization row field)After-tour check-in text to prospects2026-09-26 #12672 JP&Co: false (2026-09-30); WesternSlope: true (2026-09-29); Situs: absent; TEST Willows/sandbox: true; TEST Fairhaven: trueA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
org field:staffTextLeasingEnabledcompany setting (Organization row field)Clara takes leasing instructions from staff by text2026-09-25 #12247 JP&Co: absent; WesternSlope: true (2026-09-27); Situs: absent; TEST Willows/sandbox: true; TEST Fairhaven: falseA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
org field:staffAskByTextEnabledcompany setting (Organization row field)Staff can ask Clara by text2026-09-27 #12673 JP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: true; TEST Fairhaven: absentA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
org field:vendorCalendarCapturecompany setting (Organization row field)Capture vendor calendar replies2026-09-16 #8835 fJP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
org field:reviewRenewalMessagescompany setting (Organization row field)Hold renewal texts for approve/reject2026-09-28 #12956 JP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
org field:selfGuidedToursEnabledcompany setting (Organization row field)Self-guided tour mode2026-09-29 #12855 JP&Co: absent; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
settings.enabledModulescompany setting (Organization.settings)Which product modules the company sees/usesunknown JP&Co: prospects, renewals, workorders, routine, turnovers, costs, dashboard = true; WesternSlope: prospects true; renewals, maintenance, collections false; Situs: all four false; TEST Willows/sandboxA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
settings.maintenance.ratingPromptEnabledcompany setting (Organization.settings)Repair rating texts2026-09-27 #12857 JP&Co: false; WesternSlope: absent; Situs: absent; TEST Willows/sandbox: absent; TEST Fairhaven: absentA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
settings.prospectRecordOwnercompany setting (Organization.settings)Which system owns prospect records (appfolio|propflow_crm)unknown JP&Co: propflow_crm; WesternSlope: appfolio; Situs: absent; TEST Willows/sandbox: appfolio; TEST Fairhaven: absentA capability a customer can reasonably want off (a channel, an outbound, a review hold, a module).
property:autonomousLeasingDigestEnabledproperty setting (Property row boolean)per-property boolean gate (see name)2026-06-16 #2397 WJP&Co: 1 of 2 properties on (1 rows set); WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: absent on all 2 properties; TEST Fairhaven: absent on allReal autonomy choices (Clara sends to tenants/vendors). But 12 per property is the sprawl: collapse into the per-module settings above, one switch per module.
property:autonomousLeasingReportingDigestEnabledproperty setting (Property row boolean)per-property boolean gate (see name)2026-07-08 #3313 fJP&Co: 1 of 2 properties on (1 rows set); WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: absent on all 2 properties; TEST Fairhaven: absent on allReal autonomy choices (Clara sends to tenants/vendors). But 12 per property is the sprawl: collapse into the per-module settings above, one switch per module.
property:autonomousMaintenanceEnabledproperty setting (Property row boolean)per-property boolean gate (see name)2026-05-26 #1496 fJP&Co: 0 of 2 properties on (2 rows set); WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: 1 of 2 properties on (2 rows set); TEST Fairhaven: absentReal autonomy choices (Clara sends to tenants/vendors). But 12 per property is the sprawl: collapse into the per-module settings above, one switch per module.
property:autonomousPostTourChaseEnabledproperty setting (Property row boolean)per-property boolean gate (see name)2026-07-26 #4667 fJP&Co: 1 of 2 properties on (1 rows set); WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: absent on all 2 properties; TEST Fairhaven: absent on allReal autonomy choices (Clara sends to tenants/vendors). But 12 per property is the sprawl: collapse into the per-module settings above, one switch per module.
property:autonomousProspectOutreachEnabledproperty setting (Property row boolean)per-property boolean gate (see name)2026-06-18 #2470 AJP&Co: 1 of 2 properties on (1 rows set); WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: 0 of 2 properties on (1 rows set); TEST Fairhaven: absentReal autonomy choices (Clara sends to tenants/vendors). But 12 per property is the sprawl: collapse into the per-module settings above, one switch per module.
property:autonomousSchedulingReengagementEnabledproperty setting (Property row boolean)per-property boolean gate (see name)2026-07-26 #4667 fJP&Co: 1 of 2 properties on (1 rows set); WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: absent on all 2 properties; TEST Fairhaven: absent on allReal autonomy choices (Clara sends to tenants/vendors). But 12 per property is the sprawl: collapse into the per-module settings above, one switch per module.
property:autonomousTourConfirmNudgeEnabledproperty setting (Property row boolean)per-property boolean gate (see name)2026-07-26 #4667 fJP&Co: 1 of 2 properties on (1 rows set); WesternSlope: absent on all 70 properties; Situs: absent on all 52 properties; TEST Willows/sandbox: absent on all 2 properties; TEST Fairhaven: absent on allReal autonomy choices (Clara sends to tenants/vendors). But 12 per property is the sprawl: collapse into the per-module settings above, one switch per module.
property:isTestproperty setting (Property row boolean)Marks a property as a test property (test-sender containment, SMS/email sinks)unknown JP&Co: absent on all 2 properties; WesternSlope: 0 of 70 properties on (1 rows set); Situs: absent on all 52 properties; TEST Willows/sandbox: 2 of 2 properties on (2 rows set); TEST Fairhaven: 10 of Test containment / dev-tool guards, not behavior flags.
ddb-config:PMS_SYNC_PAUSE#<org>DDB config row (PK=CONFIG)durable per-organization AppFolio sync pause2026-09-11 2026-09all customers: Situs paused (2026-09-29, Gera: locked off until founders turn on). No row for JP&Co, Western SlopeOperational hold or a cadence parameter, not a feature flag.
ddb-config:WO_ENRICHMENT_CADENCE#<org>DDB config row (PK=CONFIG)work-order enrichment cadence per org2026-09-19 2026-09all customers: Western Slope weekly (weekday 0) row; JP&Co absent -> daily defaultOperational hold or a cadence parameter, not a feature flag.
ddb-config:PMS_SYNC_CANARY_FIXTURES, PIPELINE_STATE, WO_COUNTER, STALEDDB config row (PK=CONFIG)not on/off gates (fixtures/state/counters)n/a n/aall customers: n/aOperational hold or a cadence parameter, not a feature flag.
env:MACHINE_SENDER_SUPPRESS_LISTenvList of machine senders to suppress.2026-06-13 #2341 fVercel prod: set (value hidden); Lambda/ECS: not set (no lambda reads it); per-customer: n/a (global)Test containment / dev-tool guards, not behavior flags.
env:RATE_LIMIT_EXEMPT_SENDERSenvSenders exempt from rate limit.2026-03-23 no PR# Vercel prod: unset on Vercel prod; Lambda/ECS: not set (no lambda reads it); per-customer: n/a (global)Test containment / dev-tool guards, not behavior flags.
env:VENDOR_DISPATCH_RECIPIENT_ALLOWLISTenvRestricts vendor dispatch recipients.2026-06-18 #2439 fRemoved 2026-10-13 (PR #19346). Vercel prod: unset on Vercel prod; Lambda/ECS: not set (no lambda reads it); per-customer: n/a (global)Test containment / dev-tool guards, not behavior flags.
env:MOCK_PMS_ENABLEDenvMock PMS.2026-07-02 #2736 fVercel prod: preview only; Lambda/ECS: not set (no lambda reads it); per-customer: n/a (global)Test containment / dev-tool guards, not behavior flags.
env:MAILPIT_DISABLEDenvLocal mail catcher.unknown Vercel prod: unset on Vercel prod; Lambda/ECS: not set (no lambda reads it); per-customer: n/a (global)Test containment / dev-tool guards, not behavior flags.
env:ANTHROPIC_FORCE_METEREDenvAllow metered key.unknown Vercel prod: unset on Vercel prod; Lambda/ECS: not set (no lambda reads it); per-customer: n/a (global)Test containment / dev-tool guards, not behavior flags.
env:HARNESS_SUPPRESS_OUTBOUNDenvHarness kill switch for outbound.unknown Vercel prod: unset on Vercel prod; Lambda/ECS: not set (no lambda reads it); per-customer: n/a (global)Test containment / dev-tool guards, not behavior flags.
AGENT_FLEETS_BY_PROPERTYcode allowlistWhich property gets a dedicated (staging) voice-agent fleet; also drives V4 refusal of unmapped-number calls on the staging fleet and dialed-number fleet lookup2026-08-24 #6164hardcoded targets: appfolio-45 (fleet staging); effective: appfolio-45 has dedicated staging fleet; every other property production (fail-closed default)Test containment / dev-tool guards, not behavior flags.
TEST_PROPERTY_IDScode constantWrite-side/safety gates: test-sender containment, email sinks, SMS shadow, collections send policy, prod-write guards, bench tooling (isTestProperty). Deliberately NOT a behaviour switch since 2026-09-11unknown (e #7447 (hardcoded targets: appfolio-45, fairhaven-homes; effective: Both treated as test propertiesTest containment / dev-tool guards, not behavior flags.
BENCH_PROPERTY_IDScode constantBench-only replay profile that runs history with hand-off gates off2026-09-04 #7102hardcoded targets: appfolio-45; effective: Bench property listTest containment / dev-tool guards, not behavior flags.
CANONICAL_TEST_PROPERTY_IDScode constantWhich property Pipeline Lab may reset2026-05-06 #712hardcoded targets: appfolio-45; effective: Test property onlyTest containment / dev-tool guards, not behavior flags.
ALLOWED_PROPERTIES (admin WO list)code constantPipeline Lab work-order list dev tool2026-05-08 #760hardcoded targets: appfolio-45; effective: Test property onlyTest containment / dev-tool guards, not behavior flags.
APPFOLIO_LIST_ALLOWED_PROPERTIEScode constantPipeline Lab live AppFolio WO browse2026-05-08 #765hardcoded targets: appfolio-45; effective: Test property onlyTest containment / dev-tool guards, not behavior flags.
ALLOWED_PROPERTIES (close-all-for-tenant)code constantBulk-close WOs tool2026-05-09 #772hardcoded targets: appfolio-45; effective: Test property onlyTest containment / dev-tool guards, not behavior flags.
Hardcoded number->property map (test lines)code constantWhich test phone numbers resolve to appfolio-45, yale-sandbox, fairhaven-homes (routing, not a behaviour gate)unknown unknownhardcoded targets: 3+ test numbers; effective: n/a routingTest containment / dev-tool guards, not behavior flags.
Scan result: no hardcoded customer org ids, shadow-mode defaults, or Ecode constantSearched org_jpco/org_sandbox/org_<uuid> literals, shadowMode, dryRun defaults, module-level *_ENABLED/DARK/KILL_SWITCH boolean consts, TODO-remove gatesn/a n/ahardcoded targets: none in production gate position (org_jpco/org_sandbox only in NEVER_DISPOSABLE_ORG_IDS is-test-organization.ts:59, SENTINEL org lists, and config/flipped-dispatch-orgs.json). Only Test containment / dev-tool guards, not behavior flags.

Addendum: settings in code (from the 001 session's inventory, main 2e5bed57)

A parallel read-only inventory of all 431 settings defined in code (copy kept at ~/agents/006/settings-code-inventory-2e5bed57-2026-09-30.md) adds these findings, not double-counted above:

Notes on the numbers (how they were measured)

Settings inventory: read from the app's single settings list in the code, as of 2026-09-29, cross-checked against the commit that introduced each one. 61 of the 88 client-choice settings were all added on the same day (2026-09-11), the day that list was first built; the rest were added individually since then as specific client needs came up (ring lists, recording, renewal terms, and similar).

Rollout-switch on/off status: read directly from the live production database (read-only lookups), one company at a time, on 2026-09-29. Test and sandbox companies were excluded from the count. The reader was checked against known-on settings elsewhere to confirm it wasn't silently failing.

PR count: a text search over merged pull requests since 2026-08-30 for wording like "default off," "ship dark," or "shipped dark." This will undercount, because a standard label for this was only required starting 2026-09-28 — before that, people described it in their own words or not at all.

Three settings were left "unclear" rather than forced into a bucket: a staff reminder-email setting, a setting that copies client notices to our own staff, and a setting for how a transferred call counts as picked up. Each behaves a little like a client choice and a little like leftover rollout plumbing; worth a quick read before the cleanup batches in option A.

Appendix: every switch, for reference

Setting (code name)ClassAdded
call_routing.v2Rollout switch2026-09-23
external_forward.via_bridgeRollout switch2026-09-23
record_transferred_legsRollout switch2026-09-20
dispatch.roster_walk.enabledRollout switch2026-09-21
leasing.locationFactsEnabledRollout switch2026-09-28
leasing.tourTimeRangesEnabledRollout switch2026-09-29
leasing.applicationLinkClaraTextsRollout switch2026-09-29
human_handoff.text_on_ringRollout switch2026-09-20
pm_action_reminders.enabledUnclear2026-09-19
human_handoff.acceptModeUnclear2026-09-21
notifications.staffObserverBccUnclear2026-09-24
(88 more)Client choice, identity, or legal rulemostly 2026-09-11, plus ongoing additions

Full list of the 88 client-choice settings is in the code's settings registry, not reproduced here — they cover things like office hours, tour rules, phone routing, fees, screening, fair-housing text, and per-company identity (property email, caller ID, brand name, and similar).

PropFlow Docs