Foothold · Boise Apartments · internal

Twenty decisions, answered.

Every call that was waiting on you, answered on 13 August. Each card keeps the question, the options, and what I'd do, with your answer boxed beneath it for the record. The design is locked; the nine build specs come next.

As of 13 Aug 2026
All twenty answered by Brent, 13 Aug
Design locked · build specs next
Design locked · 13 Aug 2026

All twenty answered. The design is locked.

Brent answered every decision on this page on 13 August 2026. Each card below keeps its question, options and recommendation for the record, with the answer in a green box underneath. Locked is not buildable: the nine build-spec areas at the bottom of this page get written next, before any code. And Constitution rule 2 stands untouched: nothing answered here authorizes a write today. Answers are filed in DECISIONS.md, reference/foothold-design-scope.md and system-design.html.

The count

It's twenty, and four of them were never on any list

Nobody's number was right, because the corpus runs two colliding numbering systems and several decisions live outside both. This is the deduplicated set, counted once each.

20
decisions, deduplicated. All answered 13 Aug
15
design decisions
5
a budget, a scope call, and three sends
4
appear in no numbered list anywhere
9
build-readiness gaps, not decisions

How the twenty were derived. Start from the design-scope open questions (Tiers 1 to 3, items 1 through 22), drop the eleven already answered, and eleven survive. Add the four that appear in no numbered list at all: how the Welcome Profile reaches a resident, what Liberty's visibility actually is, the gift budget, and the manual-availability contingency. Add three Liberty sends that are tracked as asks rather than as questions. Add the scope of the first write sign-off and the maintenance-responsiveness target, both of which the corpus records as "answered in principle, residue open." That's twenty. The design map says two, which is right for what the map tracks and wrong as a total. The design scope's own numbering makes it worse: open-question #17, #18 and #19 and Liberty-ask #17, #18 and #19 are six different things, cross-referenced in adjacent sentences.

One honest caveat: this page lists decisions, not readiness

Answering all twenty locks the design. It does not make the thing buildable. Nine areas are specified nowhere in the corpus and get written after these answers, not before: the outbox and replay mechanics, the Supabase schema, retry and backoff, data retention, secrets rotation, the write-allowlist config format, the resident-verification mechanics on the ticket path, the agent's escalation trigger, and maintenance-window behavior.

They're deliberately not on this list. Every one of them is a build spec that depends on answers above it, and writing them first is how you end up rewriting them. Don't read a locked design as a green light to start typing.

How it was triaged

The five that mattered most, kept for the record (all answered now)

Picked on what each answer releases the same day, not on how big the question sounds. The two heaviest questions in the whole set (the write sign-off and FlightDeck's tenancy model) are deliberately not here: one can't be executed until Aspen lands on the key, and the other reshapes a product without unblocking a line of code.

1
Releases the only PM-visibility path that will ever exist at Owyhee, and the interim one everywhere else. Buildable the day you answer it, no permission, no Liberty involvement. Right now zero touches reach them. Not some. Zero.
2
Releases the hinge the entire front end hangs on: guest-card creation, the agent's routing, what mirrors into Entrata and what stays in GHL. Nothing downstream of the dividing line can be built until this is a written test.
3
Releases the recognition engine as a complete design instead of one that covers two thirds of the building. 31 of 88 current residents have no Entrata birthday and never will. The Welcome Profile stopped being a fallback on 5 Aug and became a required component.
4
Releases the recognition engine and the pet gift to run live. Every trigger, every data source and every mockup is finished. The only thing missing is a number.
5
Releases the payload shape of every intent the outbox queues between now and go-live. Get it wrong and the whole queue gets rewritten before it can replay. This one was recorded as permanently impossible and it isn't: the write method exists.
Band A

Decides the architecture

Five calls that change the shape of the system, not a setting inside it. Answer these wrong and something gets rebuilt rather than reconfigured.

Band A · five decisions

Shape of the system

Ordered by what each one releases. A1 through A3 are buildable the day they're answered. A4 reshapes a product. A5 sets the payload every queued intent carries.

A1

How does Liberty actually see what Foothold says and does to their renters: a digest email, or a read-only Foothold view they can open?

Answered 13 Aug In no numbered list Nothing blocks it design-scope §1.4, §2.6 · touchpoints §6.3
Why it matters Constitution rule 4 promises the PM sees every 1:1 touch. Today zero touches reach Liberty. Everything queues to an outbox and they see nothing at all. Three facts make this permanent rather than temporary: at Owyhee the write rule never lifts (it isn't NPI's building), lead-level chat can never be logged into Entrata anywhere, and even at Aspen the writes don't turn on until go-live. So whatever gets built here is the permanent answer on the lead side everywhere, and the permanent answer for everything at Owyhee. It is currently described as "interim" in four places, which is wrong.
The options
  • A scheduled digest email to the property inbox. Fastest to build, and email is what Alex confirmed they actually watch. But a daily digest of every touch is exactly the extra inbox volume the sendLeaseActivities ask was framed to avoid, and it's push-only: they can't go look something up.
  • A read-only Foothold view, one gated page per property. They open it when they want depth, it carries the full thread, and it never adds mail. Costs more to build, and a page nobody opens is worse than an email nobody asked for.
  • Both, view first. The view is the artifact that survives; the digest becomes a short weekly nudge that links into it.
What I'd do

I'd build the view first and add the digest on top of it, because the view is the thing that has to exist either way and the digest is an afternoon of work once it does. One page per property, link-gated, every Foothold touch with a timestamp and the thread underneath it. Then a weekly email that's five lines and a link, not a transcript. That respects the thing you already told Liberty this would do, put our touches in their system instead of their inbox, and it degrades gracefully: if they never open the page, the weekly email still carries the headline.

Brent's answer · 13 Aug 2026

Live inside Liberty's ecosystem; never make them open another system. Locked together with A5: Liberty's surfaces are Entrata itself (every Foothold AI conversation logged onto the lead's own record, so an agent who pulls up the guest card sees the history right there) plus a five-line weekly digest email: touches made, leads worked, tenants missing a DOB, anything needing their action. No standalone Liberty-facing Foothold page. Resident-side touches log to Foothold's own store and surface in the digest until sendLeaseActivities is granted (E2, tabled). One note on the framing above: the "lead-level chat can never be logged" line predates the 10 Aug correction; updateLeads r2 carries the events array, and logging onto the lead record is exactly what got locked here.

Filed: design-scope §1.4 GAP 1, §2.6, entrata-touchpoints.md §6.3 · design-map "Decision 01," second paragraph.  Gate: none. No permission, no Liberty dependency, buildable today.
A2

Which property and which methods does the first write sign-off actually name, and does it go out at go-live or after a burn-in?

Answered 13 Aug Answer now, can't execute until Aspen is on the key design-scope §4.4 · Tier 1 #1
Why it matters This is the single signature the entire mirror-into-Entrata half of Modules 1 and 2 sits behind: guest-card creation, all communication logging, tour booking, the escalation note, recognition-touch notes. The design map counts twelve capabilities behind it. You decided the shape on 5 Aug (NPI-owned, Foothold live on it, signed in writing naming the property and the methods). What's left is the scope of the first one, and that answer changes code today even though it authorizes nothing: it tells the client which methods the per-property allowlist has to be able to name.
The options
  • Narrow first. Sign off sendLeads and updateLeads only, on Aspen, at go-live. Add sendWorkOrders and sendLeaseActivities in a second signature once they're actually granted. Two documents instead of one.
  • One signature covering everything on the key. Cleaner paperwork, but it authorizes methods that aren't granted yet and bundles a guest card with a work order that dispatches a real technician to a real occupied unit. Different blast radii, same signature.
  • Supervised burn-in. Writes on, but every outbound write held for your review for the first two weeks. Safest, and it means somebody has to sit in the loop during exactly the week you're busiest.
What I'd do

Narrow first. sendLeads and updateLeads are the two that unblock the most and they're the only writes on the key today, so they're the only ones you can actually sign off on. Filing a work order is a different kind of act from creating a guest card, it sends a person to somebody's apartment, and it isn't granted yet anyway. Two signatures in that order costs you ten minutes and keeps the blast radius honest.

Brent's answer · 13 Aug 2026

sendLeads + updateLeads at go-live. Work orders and lease activities ride a second signature later, once actually granted. Note: lead-event and transcript logging rides on updateLeads, so logging all lead interactions sits inside the same go-live signature; no third grant needed. The gate survives whole: nothing executes until Aspen is on the key, Foothold is live on it, and the written sign-off names the property and the methods. Nothing is authorized today.

Filed: design-scope §4.4, open questions Tier 1 #1 · design-map "Decision 01."  Gate: blocked from execution. Aspen has to be on Liberty's key and Foothold live on it. Answering today shapes the build; it authorizes nothing.
A3

What machine-checkable test means a prospect "expressed interest in a particular property"?

Answered 13 Aug Nothing blocks it design-scope §1.2, §4.1 · Tier 2 #6
Why it matters It's the hinge the whole dividing line turns on. Before it fires, a person exists only in GHL. The moment it fires, a guest card is created and every 1:1 message from then on mirrors into Entrata. The agent can't route, the outbox can't queue, and attribution can't reconcile until the test is written down. It's narrower than the Constitution's minimum-info gate (first name plus one contact method), which is a separate and additional condition, and the two get confused.
The options
  • Explicit form submit only. They pick a property on the site. Unambiguous and auditable, and it misses most real interest, because people ask in chat long before they fill anything out.
  • Agent-judged intent. The AI decides whether the conversation named a property. Catches everything, and it makes a soft AI judgment the trigger for a permanent record in someone else's PMS. When it's wrong, it's wrong in Liberty's system.
  • A named list of hard signals, whichever fires first. Form submit, or a unit / floor-plan page view with a contact already on file, or the property named in chat, text or email. Auditable, extensible, and you can add a signal later without changing the rule.
What I'd do

The named list of hard signals, ANDed with the minimum-info gate. Write the signals down as a list you can point at, because when Liberty asks why a guest card exists you need an answer that isn't "the model thought so." Start with three signals, add more when you see what people actually do. Keep the property name as a required field on the card either way, since a card without a property is worse than no card.

Brent's answer · 13 Aug 2026

AI judgment is fine. But the minimum-info gate is hard: (phone OR email) AND at least a first name. No guest card without a way to follow up.

Filed: design-scope §1.2 GAP 2, §4.1, open questions Tier 2 #6 · design-map, Module 1 "The property-interest trigger."  Gate: none. It's our logic, entirely on our side of the line.
A4

What is FlightDeck's tenancy model, given there is no NPI org and there never will be?

Answered 13 Aug Nothing blocks it design-scope §3.4, §3.5 · Tier 1 #2
Why it matters The key is scoped to Liberty Asset Group, org 19530. Aspen and Summerset will live inside Liberty's Entrata next to 98 other buildings. Access is org-scoped with per-property grants, so "the NPI org" is really a property-ID subset of a property manager's org. Three consequences: onboarding is per-PM, not per-asset-manager; a third party with no contract with NPI sits in the middle of every sale; and the property-ID allowlist becomes a security boundary, not a safety rail, because a bug there leaks another owner's building to a customer. This blocks Module 3's product thesis, not its wiring: the data half already reads clean today.
The options
  • Internal only. FlightDeck stays NPI's asset-management cockpit and there's no product. Zero onboarding friction, zero revenue, and the Entrata work still pays for itself on your own buildings.
  • Done-for-you service. "We integrate your PM's Entrata for you," priced as onboarding plus subscription. Matches what you've actually built and what the friction actually is. It's a services business with a software margin, not the other way around.
  • Self-serve software. The customer's PM does the grant themselves. Best economics, and it asks a stranger's property manager to complete the exact step that took Liberty two rounds, a group grant, and an explicit method list because their vendor told them the defaults were fine.
This one's yours, and here's why I won't pick

It's a business-model call, not a technical one, and it turns on whether you want a services business. What I can say plainly: self-serve doesn't work today, because the onboarding step you'd hand a customer is the step that just took Liberty two rounds of email. And done-for-you is the honest shape of what exists. To have a real opinion I'd need one thing from you: would you still sell this if it never got past per-PM onboarding? If yes, it's a service. If no, it's internal and the question closes.

Brent's answer · 13 Aug 2026

Internal-only today; building it toward self-serve software long-term. Not a done-for-you services business.

Filed: design-scope §3.4 "The NPI org problem," §3.5, open questions Tier 1 #2 · design-map "Decision 02."  Gate: none technically. Blocks the thesis, not the code.
A5

How do texts and chat messages get logged as lead events, given the r2 event enum has no text or chat type?

Answered 13 Aug Corrected 10 Aug: live again, not moot design-scope §1.4 · Tier 3 #8
Why it matters, and the correction that put it back on the list The corpus recorded that no lead-event write method exists anywhere in the 128-method spec, which made this question moot and made a digest the permanent answer on the lead side. Direct spec inspection on 10 Aug disproved that. updateLeads-r2-request-schema carries an events array with typeId, date, type, and a free-text comments field labelled "Event comments." So the method exists and the question is live. Two things still bind it: it's a banned write under rule 2, and the r2 type enum has no native text or chat value (it carries only CallFromProspect, CallToProspect, Appointment, Tour, EmailToProspect, EmailFromProspect), so logging a text needs a numeric typeId out of getLeadPickLists that cannot be verified without issuing a write. This matters now because it's the payload shape of every intent the outbox queues between now and go-live.
The options
  • Numeric typeId from getLeadPickLists. 155 real event types are readable today. Most likely correct, and unverifiable without a live write, so the first replay is where you find out.
  • sendLeads r1 for events instead of updateLeads r2. r1 carries no enum constraint at all, so the vocabulary problem disappears. Different method, different time format, and it's the create path being used as an append path.
  • Map onto the nearest r2 enum value and carry the truth in comments. A text becomes EmailFromProspect with "SMS:" in the comment. Imprecise in Entrata's own reporting, and it never fails.
What I'd do

Build the outbox payload against the numeric typeId path, and pull the 155 real IDs out of getLeadPickLists now while reads are the only thing allowed. Then write the true channel into the comments field regardless of which typeId lands, because it's free text and it's the only place the truth survives if the ID turns out wrong. Keep the enum-mapping option as the runtime fallback the first live write degrades to. And do not learn this by issuing a test write. There is no test company and every call lands on an occupied building.

Brent's answer · 13 Aug 2026 (confirmed with A1)

The recommendation as written, targeting the lead's Entrata event timeline: numeric typeId off getLeadPickLists (pull the 155 IDs now, while reads are all that's allowed), a one-line summary on top, the full transcript and true channel in the free-text comments, enum-mapping as the runtime fallback, and never learned by issuing a test write. One unknown rides into build: comments has no documented length cap, so if a full transcript bounces at go-live, fall back to summary-only.

Filed: design-scope §1.4 GAP 2 and GAP 4, open questions Tier 3 #8. The "no lead-event write method exists" line is being corrected across the corpus as of 10 Aug.  Gate: nothing blocks answering. Execution waits on A2.
Band B

Decides how an engine behaves

Six calls where the engine exists, the data source is verified, and the only thing missing is a rule about what it does.

Band B · six decisions

Engine behavior

Recognition, the service follow-up, the review ask, after-hours, tours, consent. None of these blocks another decision; each one blocks its own engine shipping.

B1

How does the Welcome Profile get in front of a resident, and what does the recognition engine do for someone whose birthday we never learn?

Answered 13 Aug In no numbered list Nothing blocks answering design-scope §2.2 GAP 3
Why it matters Birthdays got a real Entrata source on 5 Aug (getLeads, joined to the resident on customer ID, proven on 70 of 88) and then got measured: 57 of 88 current residents, 65%. The other 31 are unreachable permanently, 18 because they never appear in getLeads at all and 13 because the field is blank. No permission and no wider sweep closes that. So the Welcome Profile was promoted from optional fallback to required component of the recognition engine, and it currently has no delivery path, no nudge cadence, and no coverage number to watch. It's on the Gantt for weeks 4 to 6 with nobody having decided what it is.
The options, delivery
  • An insert in the move-in packet with a QR code. Lands in their hands, and paper conversion on a form nobody has to fill out is poor.
  • A link in the welcome text a few days after move-in. You're already texting at move-in, it's one tap, and it only reaches people who gave you a number and consented.
  • The resident portal. Half the building already uses it for maintenance, and it's Liberty's surface, not ours, so it's a favor to ask rather than a thing to build.
  • Any of the above plus a small incentive (a $10 card, or an entry in the monthly drawing). Lifts response, costs money, and ties into C1.
The options, the no-birthday case
  • Fall back to the move-in anniversary. Computes for 100% of residents today off getLeases moveInDate. No capture needed at all.
  • Send nothing. A third of the building silently gets less.
  • Nudge them for the date. Highest ceiling, and asking someone for their birthday so you can mail them something reads like a data grab.
What I'd do

Welcome text with a link, plus a small incentive, and the move-in anniversary as the silent fallback. The text converts better than paper and you're sending one anyway. The anniversary is the right fallback because it needs no capture, it computes for everyone, and it's a warmer touch than an email asking somebody for their date of birth. Then track one number: what share of current residents have a birthday from either source. That's the coverage metric the engine has been missing.

Brent's answer · 13 Aug 2026

Handwrytten integration is on; the Welcome Profile goes out as a mailed Handwrytten welcome packet (packet in hand, and Brent intends to use Handwrytten personally for business-networking cards too). No-birthday fallback: a Thanksgiving "thankful you're here" card, keeping the annual touch count. Two backfill levers so the 35% shrinks over time: the property business plan asks Liberty to enter DOBs at move-in, and the weekly digest flags new tenants missing a DOB.

Filed: design-scope §2.2 GAP 3 · project-plan Gantt, "Welcome Profile form + GHL field mapping," weeks 4 to 6.  Gate: answerable now, but it can't run against real residents until an NPI-owned property is on the key. Owyhee is Liberty's building.
B2

What triggers the resident follow-up after a completed work order, and how long after?

Answered 13 Aug Nothing blocks answering design-scope §3.2 · Tier 3 #21
Why it matters You decided on 10 Aug what the message is: an AI-generated personal message about the resident's own issue ("did your back door get fixed?"), rendered off maintenanceProblem, maintenanceLocation and maintenanceDescription, never inventing detail. What fires it is still open, and it has three parts: poll or webhook, which status values count as done, and how long you wait. Nothing ships until all three are set.
The options
  • Poll getWorkOrders. Works today with no provisioning, and the availability poll already exists to hang it off. Rate limit is generous (25,000 a day). Latency is whatever the poll interval is.
  • The workorder.status.update webhook. Cleaner and near-instant, and it needs two-party provisioning (an email to Entrata support plus Liberty ticking a box). It carries only an ID and a status, so it has to hydrate off getWorkOrders anyway.
  • On status: string-match "Completed," or resolve against Liberty's real StatusTypes from getWorkOrderPickLists. Statuses are client-defined, so the pick list is a lookup, not a guess.
What I'd do

Poll now, webhook later, and treat the webhook as a latency upgrade rather than a dependency. Resolve status against Liberty's real StatusTypes and name the qualifying values explicitly in config, so a status rename on their side doesn't silently stop the engine. On timing I'd say next business morning, not same day. A text an hour after the tech leaves reads automated. The next morning reads like somebody checked. And it keeps the touch inside hours, which matters because 76% of the week has nobody on site if the reply needs a human.

Brent's answer · 13 Aug 2026

Poll. Qualifying statuses named in config against Liberty's real StatusTypes, and next-business-morning timing stands. Plus an AI-judgment gate on which work orders deserve a follow-up at all: not every ticket gets one, no spam. The gate's rules get worked out against real Owyhee work-order examples during build-spec. The gate in the footer survives: NPI-owned properties only, once live, never Owyhee.

Filed: design-scope §3.2 DECIDED block, open questions Tier 3 #21 · system-design §14 · lead-comms-spec §5. Inherits the locked filters: skip Entrata PaaS, collapse parent and child, clear consent on both lenses.  Gate: NPI-owned properties only, once live. Never Owyhee.
B3

Are the resident follow-up and the review ask one touch or two, and in what order?

Answered 13 Aug Raised 10 Aug, nothing in the corpus addresses it design-scope §2.5, §3.2 · Tier 3 #22
Why it matters They fire off the same event, at the same resident, through the same channel. Two unspaced messages read like a campaign, which is the exact objection that killed the post-service survey. One merged message risks turning the follow-up into a sentiment filter in front of the review ask, and Constitution rule 7 forbids that outright: trigger on events, ask everyone at that event, no sentiment gating, ever. That isn't a style preference, it's FTC, Google and Apartments.com.
The options
  • One message that checks in and asks. Fewest touches, and the check-in half inevitably starts influencing whether the ask goes out. That's the rule 7 violation, and it happens by accident rather than by design.
  • Two, follow-up first, review ask spaced a few days later, sent regardless of the reply. Rule-7 clean and reads like a person. Two messages for one repair.
  • Two, review ask first. Gets the review while the fix is fresh, and asks for a favor before checking whether the favor is deserved.
What I'd do

Two, follow-up first, review ask a few days behind it, and the review ask fires on the event, never on the answer to the follow-up. That's the only shape that satisfies rule 7 and the don't-spam rule at once. Put it plainly in the spec so a future build can't quietly wire them together: the follow-up earns the right to ask, it never gets to decide whether to ask.

Brent's answer · 13 Aug 2026

Two messages: follow-up first, review ask a few days behind, fired on the event, never on the reply. Brent deferred to best practice and accepted the recommendation as written.

Filed: design-scope §2.5 GAP 3, §3.2, open questions Tier 3 #22 · lead-comms-spec §5 and §6.  Gate: none. Both triggers read clean today.
B4

After hours, does the agent hold the conversation, or does the handoff go into an explicit business-hours queue?

Answered 13 Aug Nothing blocks it system-design §14 · design-scope §1.5 · Tier 3 #12
Why it matters Constitution rule 10 hands off at tour-booked or application-submitted. Office hours are M-F 9 to 5, no weekend coverage, so roughly 76% of the week a handoff hands off to nobody. A Friday 10 PM lead gets handed to an inbox that opens Monday. This is the fork the entire after-hours speed-to-lead claim rests on, and it's been flagged as undecided in two documents since 31 July.
The options
  • The agent holds. It keeps working the lead through the weekend and hands off Monday. Best conversion, and a prospect who explicitly asks for a person gets a bot instead.
  • Explicit business-hours queue. The agent says plainly that a person reaches out Monday morning, and the escalation email fires then rather than into a dead Friday inbox. Honest, and it stalls a hot lead for 60 hours.
  • Hybrid. Agent holds by default; a genuine emergency or an explicit "I want a person now" fires the email immediately with the hours stated plainly.
What I'd do

Hybrid. It's the only one that neither strands a Friday-night lead nor sends an email nobody reads while the prospect believes somebody's coming. And you now have something concrete to offer that lead: the 5 Aug probe showed self-guided touring is configured all seven days, 6 AM to 6 PM, one at a time. So the Friday-night answer isn't "wait till Monday," it's "you can walk it tomorrow morning." Separately and non-negotiably: a genuine maintenance emergency gets a phone number, never a chat handoff and never an email.

Brent's answer · 13 Aug 2026

Hybrid, per the recommendation, with the escalation shape pinned: on an emergency the agent steps out of the loop immediately and hands over the phone number ("please call this number now"). Never a queued callback.

Filed: system-design §14 (office-hours row) · design-scope §1.5 gap 4, open questions Tier 3 #12.  Gate: none. The out-of-band escalation leg has no Entrata dependency and is buildable today.
B5

Who owns double-booking prevention for tours, and where does that state live?

Answered 13 Aug Answerable now design-scope §1.6 · Tier 3 #9
Why it matters The calendar reads real: 30-minute appointments, 120-minute lead time, agent-guided M-F 8 to 4, self-guided all seven days 6 to 6 at a limit of 1. But nothing in the spec says writing an Appointment consumes a slot, and Alex confirmed Liberty's agents book manually around their own drive time, so a booked tour may never appear in Entrata at all. If the agent offers slots, it's offering against a calendar that can be silently wrong, and the failure mode is a prospect standing outside an apartment somebody else is already in.
The options
  • Never book, only propose. The agent surfaces availability and a human confirms out of band. Zero double-booking risk, and it's a slower experience and one more thing on Liberty's plate.
  • Foothold owns booking state in Supabase and reconciles against Entrata on every read. A real booking experience, and you're maintaining a shadow calendar against a system that doesn't tell you when it changes.
  • Self-guided only. Commit only where the limit is real and no human has to drive anywhere.
What I'd do

Propose for agent-guided, commit for self-guided. Show agent-guided availability as availability and never as a promise, and hand the confirmation to a person. Self-guided is where you can actually commit, because the configuration is real, the limit is 1, and nobody's drive time is involved. That gets you a bookable Saturday tour without owning a scheduling system, and it's the same lock-box mechanic Liberty already runs.

Brent's answer · 13 Aug 2026

Propose for agent-guided, commit for self-guided. Recommendation accepted as written. Committing is a write, so it still waits on A2's gates.

Filed: design-scope §1.6 gaps 2 and 4, open questions Tier 3 #9 · Liberty asks #16 (answered 3 Aug).  Gate: proposing is free. Committing anything is a write, so it waits on A2.
B6

Do we sync Entrata-side opt-outs into GHL, or only check consent live on the send path?

Answered 13 Aug Nothing blocks it design-scope §1.3, §1.8 · Tier 3 #10
Why it matters getMarketingPreferences reads clean as of 5 Aug and returns optIn per consent type per channel, with the customer IDs coming off getMitsLeases. One person can hold both a LEAD and a RESIDENT preference set at once, so a check has to name which relationship it's testing. If someone opts out through Liberty, GHL doesn't know unless we read it and sync, and emailing somebody who opted out with the property manager is a real problem regardless of which system holds the list. There is no updateMarketingPreferences, so this is one-way forever: Entrata tells us who opted out, it will never let us record who opted in.
The options
  • Live check on the send path only. Correct at the moment it matters, and a GHL broadcast built off a stale list still goes out to somebody who opted out.
  • Scheduled one-way sync into GHL. Keeps the marketing list clean, and it's stale between runs, so it can't be the only gate.
  • Both. Sync for hygiene, live check as the gate.
What I'd do

Both, and be clear which one is load-bearing: the live check on the send path is the gate and is non-negotiable, the nightly sync is hygiene so a GHL broadcast doesn't hit somebody who opted out with Liberty. Two build notes that come with it: cache the pick list, it holds the tightest hourly bucket on the whole key at 60 an hour and 10 a minute, and a missing preference means do not send, not "assume yes."

Brent's answer · 13 Aug 2026

Both. The live check on the send path is the load-bearing gate; the nightly sync is hygiene. A missing preference means do not send.

Filed: design-scope §1.3, §1.8, open questions Tier 3 #10.  Gate: none. Both reads are on the key and verified.
Band C

Decides a number, a budget, or a posture

Four calls that aren't about how the system works. Two of them are yours in a way I can't help with, and I say so rather than inventing a recommendation.

Band C · four decisions

Numbers and posture

C1 is the one that actually stops an engine going live. C2 and C3 shape how the operation reports on itself. C4 is a scope call tied to the 8/31 close.

C1

What's the gift, perk and merch budget?

Answered 13 Aug In no numbered list Blocks the recognition engine going live project-plan, dependencies
Why it matters The recognition engine and the pet gift are finished on every axis except this one. Triggers verified, data sources verified, mockups drawn, fulfillment vendors chosen. Handwrytten runs roughly $32 to $34 for a mailed handwritten card with a $25 gift card enclosed, about $4 card-only for sympathy; Tremendous handles digital cards by text. Neither touches Entrata, so nothing about this is gated on Liberty or on a permission. It's gated on a number.
What it costs, at Owyhee's shape Owyhee is the only building we can measure: 52 households, 57 residents with a known birthday, 30 pet households. A full recognition year (a move-in or tenure card, a pre-renewal card, a birthday card where we know the date, and a pet gift where there's a pet), with a $25 gift card in every mailed piece, lands around $9,000 to $10,000, call it $175 to $195 a door. Strip the enclosed gift cards and keep the handwritten card, and the same program runs closer to $2,000, about $40 a door. Aspen and Summerset scale off unit count, not off this.
This one's yours, and here's what I'd need

I can't recommend a number. It's a spend decision against a brand-premium thesis you own, and the right answer depends on how much of the +6% NOI lift you're willing to pre-spend. Give me two things and the engine gets built to them: a dollars-per-door-per-year ceiling, and whether it's flat across residents or weighted toward renewal-year households. If it helps, the cheapest version that still reads like a landlord who knows you is a handwritten card with no gift card enclosed, and that's about a fifth of the cost.

Brent's answer · 13 Aug 2026

About $75 a door a year. The shape: Handwrytten welcome packet at move-in; birthday card with a $25 gift card (Amazon, or a local Boise merchant for a more thoughtful touch), with the Thanksgiving card as the no-DOB fallback; $25 Chewy gift card on the pre-renewal pet card, or a plain pre-renewal card with $25 for petless households. Roughly $30 to $32 all-in per mailed touch ($3 to $4 Handwrytten card + $25 card + fee). Cheap if the KPIs hit.

Filed: project-plan, "Dependencies that gate the date" · lead-comms-spec §4 (fulfillment) · pet-gift.html.  Gate: nothing blocks setting the number. Nothing can mail until an NPI-owned property is on the key.
C2

What's the maintenance-responsiveness target, and does the number live on the Overview or stay a feeder line?

Answered 13 Aug Answerable now design-scope §3.1 · Tier 3 #20 · project-plan #targets
Why it matters You decided on 10 Aug that the metric gets built and that it's an aggregate. Two things were left open on purpose: no target or threshold is set, and whether it joins the six hero KPIs on the Overview or stays a feeder line on the project plan. The reason it can't drift is your own framing: good numbers are marketing proof, bad numbers are Liberty's accountability metric. A number used in both directions can't be redefined when it's inconvenient, so the definition and its home get written once.
The trap to avoid first The 24 hour / 4 hour number already on the scorecard is a FIRST CONTACT target, parked at Phase 2 pending Liberty's commitment. It is not a resolution target. Don't set this one by borrowing that one.
The options
  • Set a target now and put it on the Overview. Commits publicly to a number before you know what Liberty actually does, on a building you don't own.
  • Measure for three months, then set the target, and keep it a feeder line until it's baselined. Slower to a headline, honest, and reversible.
  • Never promote it. Internal accountability only, no marketing use, which throws away the upside you named yourself.
What I'd do

Measure first, target later, feeder line until it's baselined. You said the number is proof when it's good and an accountability metric when it's bad, and right now you don't know which it is. Putting an unbaselined number on the partner-facing Overview commits you before you know. Three months of Owyhee data tells you where the bar actually sits. One build gate before any of it: createdOn is in the vendor spec and has never been seen in a live response. One read-only call settles it, and if it comes back empty the metric needs a different clock and the design changes. Check it before you build, not after.

Brent's answer · 13 Aug 2026

No target. Track it for a while and display it on the scoreboard; that's it. No SLA negotiation with Liberty unless the data eventually says there should be one.

Filed: design-scope §3.1, open questions Tier 3 #20 · system-design §14 · project-plan #targets · lead-comms-spec §5.  Gate: none. Read-only, no permission, nothing to ask Liberty for.
C3

Does "watch the scoreboard, not the plays" get promoted into the Constitution, or stay design intent?

Answered 13 Aug Nothing blocks it design-scope Tier 3 #19 · lead-comms-spec §5
Why it matters As design intent it doesn't carry the Constitution's force, which is "a build that violates this is wrong even if it works." It is now load-bearing in five places: the escalation step in the comms spec, its own why-the-restraint callout, the resolution that the per-ticket resident follow-up doesn't cross the line, the permanent exclusion of updateWorkOrders from the Liberty ask, and the aggregate-only shape of the responsiveness metric. It was miscited as "Constitution rule 5" three times before somebody caught it, which is what a rule-shaped thing that isn't a rule does.
The options
  • Promote it. A future build can't cross it without you. Also means a future you can't cross it without amending the Constitution.
  • Leave it as intent and just cite it correctly. Keeps flexibility, and it stays a line anyone can quietly step over with a good-sounding reason.
What I'd do

Promote it. You affirmed it with a real decision on 10 Aug, and four other things now rest on it, including a permanent exclusion from a Liberty ask. Anything load-bearing in five places that gets miscited three times is already behaving like a rule; write it down as one. The only cost is that crossing it later takes a deliberate amendment, and that's the point.

Brent's answer · 13 Aug 2026

Yes. Promote it into the Constitution.

Filed: design-scope open questions Tier 3 #19 · lead-comms-spec §5 escalation step 3 · system-design §2 Constitution.  Gate: none. It's a documentation act.
C4

Do we spec the manual availability contingency, now that its trigger has changed from API risk to property scope?

Answered 13 Aug In no numbered list Tied to the 8/31 close project-plan, dependencies
Why it matters The original condition ("spec this if the Entrata timeline looks threatened by late July") has passed, and the API landed on time, so the API is no longer the risk. The same contingency now hangs on property scope. If Aspen isn't on Liberty's key by go-live, the site and the agent have no live availability feed for it, and a simple admin input Liberty keys availability into is what keeps them quoting fresh numbers instead of stale ones. It's recorded in the project plan as "Brent's call whether to spec it," and nobody has made that call.
The options
  • Spec and build it now. A form, a KV write, a staleness badge. Maybe a week. May never run.
  • Don't, and accept a manual page edit if Aspen is late. Free, and it means somebody hand-editing a rentals page during launch week.
  • Spec it, don't build it, and give it a named trigger date. Costs an afternoon of writing and buys a two-day build you can start on a known date.
What I'd do

Spec it, don't build it, and put a date on the trigger: if Aspen isn't on the key two weeks before go-live, build it. That date comes straight out of E1, so ask Liberty for the lead time in the same email and you'll know when to pull the trigger. It's cheap to spec and expensive to be surprised by, and building it now spends a week on something that has a real chance of never running.

Brent's answer · 13 Aug 2026

Spec it, don't build it. The named trigger stands: if Aspen isn't on the key two weeks before go-live, build it. Liberty's onboarding of Aspen and Summerset is already underway (E1), which shrinks the window this covers but doesn't remove it.

Filed: project-plan, "Dependencies that gate the date," last row.  Gate: the trigger depends on E1, the Aspen and Summerset ask, which hasn't been sent.
Band D

Low stakes, decide in a minute

Two that are genuinely open and genuinely small. Answer them so they stop showing up on lists.

Band D · two decisions

Small and open

Neither one blocks anything. Both have a lean already; they just need you to say yes.

D1

Do we provision webhooks now, or stay on the poll?

Answered 13 Aug Answerable now design-scope §4.6 · Tier 3 #13 · system-design §4.5
Why it matters Five events exist and none of them is availability or pricing, so the 12-minute availability poll stays either way. What webhooks buy is latency on the three lease events, the application event, and work-order status. Provisioning is a two-party job: an email to apisupport@entrata.com plus Liberty ticking boxes on the Web Service Permission tab. The receiver is a Cloudflare Worker, so the VPS stays outbound-only.
The options
  • Provision now. Two round trips with two parties, for a latency improvement on things the poll already covers.
  • Stay on the poll and revisit after go-live. Zero coordination cost, and you leave a free question unasked.
What I'd do

Provision now, but for a reason that isn't latency: there's a question worth bundling with it that nobody has asked. Does anything fire on lead or guest-card creation? It isn't on the published list of five, but Entrata models a lead and an application as the same object, and the lease events carry application stage IDs, so lease.started may fire at guest-card stage. If it does, the speed-to-lead clock starts on a push instead of a poll, which is the single biggest thing webhooks could buy this build. Worth one email to find out. Also get the signature answer while you're there: the vendor doc's prose and its own sample code disagree on what string is signed.

Brent's answer · 13 Aug 2026

Provision, bundled into the Aspen/Summerset setup already in motion. Liberty ticks the webhook boxes on the same Web Service Permission screen they use for API grants (Manage → Web Service Permission tab → bottom of page → select webhooks → Save); we stand up a receiver URL on the VPS and observe what arrives during normal Owyhee activity: read-only, zero risk. Observation answers the fires-on-guest-card question; the signature discrepancy goes to Entrata support. The 12-minute poll stays the design either way (five published events, none is availability).

Filed: design-scope §4.6, open questions Tier 3 #13, Entrata asks #1 to #5 · system-design §4.5 and §14.  Gate: needs Liberty's checkbox too, so it's two-party provisioning, not a code change.
D2

Do we use Entrata's testimonial object at all, or only Google and Apartments.com?

Answered 13 Aug: cut Answerable now design-scope §2.5 · Tier 3 #11
Why it matters Entrata has a testimonial object (getCustomerTestimonials, sendCustomerTestimonials, updatePropertyResponse), which is more than expected. None of the three is on the key, and the two writes would be barred by rule 2 regardless. It presumably surfaces on Liberty's own property site. Foothold's review targets are Google and Apartments.com, which drive ILS rank and the site funnel.
The options
  • Ignore it. Costs nothing, loses a surface you don't measure.
  • Mirror captured testimonials into it so Liberty's site benefits too. Needs a new Liberty ask plus a write sign-off, for a surface that moves no KPI you track.
What I'd do

Ignore it. It's an Entrata-internal surface on Liberty's website, it would cost a new permission ask and a write authorization, and it moves nothing you're measured on. Revisit only if Liberty asks for it, which would make it a relationship gesture rather than a marketing decision, and a cheap one at that point.

Brent's answer · 13 Aug 2026

Skip it. Google and Apartments.com only.

Filed: design-scope §2.5 GAP 1, open questions Tier 3 #11, §4.3 (deliberately not asked).  Gate: not on the key. Using it would need a new ask and a write sign-off.
Band E

Not decisions. Three things nobody has sent

These are on the list because they're tracked as open asks rather than as questions, so they never show up when you go looking for what's waiting on you. Two of them can ride in one email.

Band E · three sends

Waiting on an email, not on a decision

E1 is the largest unowned dependency before the 8/31 close. E2 and E3 go out together. None of them is answered by thinking harder.

E1

Ask Liberty what it takes to put Aspen and Summerset on the key, and what the lead time is

Closed 13 Aug: overtaken by events The largest unowned dependency before 8/31 design-scope asks #7 · Tier 2 #5
What it unblocks Every engine that needs an NPI-owned building. Only Owyhee Park (1311115) is on the key today and it's Liberty's building, not yours, so Module 2 has nothing legitimate to run against, and since the rule 2 lift applies to owned properties only, this now gates the entire write half of the design, not just the cards and gifts. It also sets the trigger date for C4. Nobody owns this item today, and it hasn't been asked.
What to send

Two questions, not one: what does adding a property to an existing API user require on your side, and how long does it typically take? The lead time is the half that actually matters, because it's what tells you whether to build the manual availability fallback. Add North River when it moves onto Entrata. Note in the same breath that Aspen doesn't inherit writes on arrival, so nobody on their side assumes the read-only posture changed.

Brent's answer · 13 Aug 2026

Overtaken by events: Liberty is already working on setting up Aspen and Summerset. No email needed; it'll be a minute, monitor progress. Aspen still doesn't inherit writes on arrival; A2's signature governs.

Filed: design-scope asks #7, open questions Tier 2 #5 · project-plan, "Dependencies that gate the date" · system-design §14.  Gate: none. Send it.
E2

Send the one email asking for sendWorkOrders and sendLeaseActivities

Answered 13 Aug: tabled Never asked in any form design-scope asks #18, #19
What it unblocks sendWorkOrders is the whole resident service-ticket path on properties you own: without it the agent can never file a ticket itself. sendLeaseActivities is the only method in all 128 that appends an activity to a record, so it's the only way a Foothold touch lands on the Entrata record instead of in Liberty's inbox. The maintenance group arrived on 3 August with two reads and neither write, so this is a deliberate per-method state, not an oversight, and neither has ever been requested.
How to send it

One email, two named methods, not two emails. sendWorkOrders is the larger and more consequential grant, so the low-blast-radius activity note costs one round trip instead of two. Frame the second one the way it actually helps them: our touches land in their system instead of their inbox, so it's less mail for them, not more. Scope both to owned properties, don't ask for Owyhee, and don't include updateWorkOrders: filing a ticket is the decided capability, editing or closing Liberty's tickets is not. A grant authorizes nothing. Rule 2 still needs the per-property lift plus your signature, and at Owyhee the activity note stays unused even if they say yes.

Brent's answer · 13 Aug 2026

Tabled for now. Not sent. Consequence while tabled: resident-side touches can't land in Entrata (sendLeaseActivities is the only lease-record appender), so they log to Foothold's own store and surface in the weekly digest.

Filed: design-scope asks #18 and #19, §2.6, §3.2, §4.3, §4.4 · system-design §14 (5).  Gate: none on sending. Everything downstream waits on A2.
E3

Ask Liberty to add a "Foothold" lead source to the property pick list

Answered 13 Aug: rides with E2 Never asked design-scope asks #6 · system-design §14
What it unblocks Attribution, and the demand-side thesis being measurable at all. The 17 lead sources on the property are Liberty's own (Zillow, Apartments.com, ApartmentGuide, Facebook, Drive By, Referrer, and so on), and leadSourceId 67822 "Website" is Liberty's site, not ours. So a Foothold-originated lead has nowhere correct to land. The Owyhee before-picture says 80% of July's leads came from Zillow and 10% direct: without a Foothold source, the number that's supposed to move has nowhere to be recorded.
What to send, and what to build regardless

It's a one-line config change on their side, so bundle it into the E2 email rather than spending a separate round trip on it. And build the reconciler either way: tag in GHL, match against getLeads by email and phone. It's needed until the source exists, and it stays useful afterward as the audit path that proves attribution is right.

Brent's answer · 13 Aug 2026

Bundle it into the E2 email whenever that goes; nothing sent now. Build the GHL-to-getLeads reconciler regardless.

Filed: design-scope asks #6, §1.2 GAP 3, §4.5 · system-design §14 (no Foothold lead source row).  Gate: none. Rides in the E2 email.
What's not on the list

Things that look open and aren't

Each of these still reads as an open question somewhere in the corpus. Each one is already decided, already sent, or isn't a decision. Listed so nobody re-opens them and so the count of twenty is checkable.

Looks openWhy it isn't on this page
Self-service tour scheduling, build it or not (Tier 3 #17)You decided this on 3 Aug and the decision was to defer. Explicitly not critical and not a blocker, worth exploring later. A deferral is a decision. It stays recorded as an idea so it isn't lost, and it isn't waiting on you.
The per-property application link (Tier 3 #16, Liberty asks #17)Already sent to Alex on 3 Aug and unanswered. It's the only thing actually in flight with Liberty. The corpus is explicit: don't chase it with a second email. Waiting on a reply, not on a decision.
What the resident follow-up actually is (Tier 3 #7)Answered 10 Aug. An AI-generated personal message about the resident's specific issue, not the survey, and the survey stays cut. What's left of it is B2 and B3.
Where resident birthdays come from (Tier 2 #4)Answered and measured 5 Aug. getLeads, joined on customer ID, 65% of current residents. What's left of it is B1, the other 35%.
Whether Liberty enables getWorkOrders (Tier 2 #3)Granted 3 Aug and verified against production. The successor question, which tickets qualify, is inside B2.
Escalation channel (Tier 3 #14) and how Liberty books tours (Tier 3 #15)Both answered by Alex on 3 Aug. Email to the leasing team; tours are booked manually. The residue from the tour answer is B5.
Asking Liberty to uncheck sendLeads and updateLeads (asks #5)Declined by you on 31 July and closed permanently. The email was drafted, never sent, and deleted. Do not recreate it. The consequence stands: there will never be a vendor-side guard, so the code-side allowlist is the only control.
Whether the agent should ever file a resident's service ticketDecided 5 Aug. Yes, on owned properties, once live, after verifying the resident. What's left is a permission (E2) and a build spec (verification mechanics, in the build-readiness list).
Whether to capture the full pet record or just the nameDecided 5 Aug. Capture the whole record. Assistance animals are a hard fair-housing exclude.
Outbox transport, Cloudflare Queues versus a D1 tableNot a design decision, a build spec. It's part of "outbox and replay" in the build-readiness list below, and it depends on A2 and A5 landing first.
Whether call transcripts could personalize the move-in packetNot a decision. It depends on whether Liberty's phone system exposes transcripts, which nobody has checked. It's a discovery item, and a sensitive one.
After the twenty

The nine things that get written next

Not decisions, and not on the list above. These are specified nowhere in the corpus and each one depends on answers from this page. Locking the design is step one; this is step two.

Outbox and replay

Transport, ordering, dedupe, and what replay does when a payload was built against an ID that turned out wrong. Depends on A2 and A5.

Supabase schema

Agent state, conversations, resident facts, the recognition ledger, and the booking state B5 may or may not create.

Retry and backoff

Per method, against a serial gate (one call at a time, whole account) and two vocabularies with tight buckets.

Data retention

How long conversations, resident facts and GL PII are held, on top of the two standing rules (month and day only, never an SSN).

Secrets rotation

The Entrata key, the GHL key, Twilio, Handwrytten, Tremendous. No rotation policy exists anywhere.

Write-allowlist config format

Per-property from the first line of code. A missing or unparseable property config has to mean read-only, which is a format question before it's a code question.

Resident verification mechanics

The policy is decided (phone first, unit plus a factor, never DOB alone, fail closed). How a match scores, how long a session lasts, and what re-verification looks like is not.

The agent's escalation trigger

The channel is answered and the two legs are settled. What actually makes the agent decide to escalate is not written down.

Maintenance-window behavior

What the client does when Entrata is in a maintenance window: queue, degrade, or fail. Nothing specifies it.