Company brain

One place for everything Clara knows about a customer, with every piece labeled by who may hear it.

Proposed — pending review. Design only; not scheduled for build.  Fede's vision, 2026-10-02. Revised that evening into a general framework for every kind of company information. Names and patterns are copied from shipped products, each cited (Fede: "follow industry best practices"). Renewals is worked example 1. Revised again after Fede's review: two levels for v1 (Public and Internal), and connectors added to the long-term vision.

Removed 2026-11-03 (Fede): the email notes intake (staff emailing meeting notes to clara@) is deleted in #24977. Fede: "delete". The meeting bot now captures meetings directly, nobody used the email path, and the Nov 3 isolation audit found it was the one door through which meeting words could reach a prospect. The setting, the Customers-page card, the writer and its tests are gone; notes already saved by email stay. The meeting bot is gated on "Clara joins meetings" (clara.meetingInviteJoin) alone.

The idea. Clara is one assistant working with many teammates at a customer. Everything she knows carries an audience, in the industry's own words: Public (anyone she talks to) or Internal (that company's staff). Tenant- and prospect-facing Clara cannot reach Internal at all: not in her prompt, not in her tools, not in any search. Over time, connectors feed in what the customer already keeps in Notion, Google Drive, SharePoint and similar tools.

Fede's most important rule: "if a tenant calls, we should never reveal any of the internal notes."

Contents

  1. Western Slope pilot plan (Oct 3)
  2. Learning from staff replies: context (Oct 4)
  3. The framework
  4. Two audiences
  5. How information gets in
  6. Long-term vision: connectors
  7. The wall
  8. How Clara finds things
  9. Fit with Gera's organization model
  10. What others do
  11. Open-source memory frameworks
  12. UI prototype · Where notes live in the product (UX concepts, Oct 4)
  13. Worked examples
  14. What is ours to build, and the first slice
  15. Decisions for Fede
  16. Isolation and retention · Packaging · Risks · What exists today
Western Slope pilot plan (Oct 3)

Approved Oct 3 night: notes store (proven at Willows with an end-to-end test), email intake (removed 2026-11-03, Fede), and meeting transcripts → notes. Building overnight. Nothing turns on at Western Slope until Fede says so.

Fede, 2026-10-03: "the whole point of this program is to actually deploy it in that customer… renewals… capture the notes in their company brain… nothing will be shown to prospects… make a plan first."

Goal: Western Slope's meeting notes land in their Internal brain, staff can ask Clara about them, and renewals use them. Prospects and residents never see any of it.

Meeting or call notes Email to notes address (first)Clara joins the meeting (later) Western Slope brainInternal only Staff ask ClaraRenewal pricing →→→
Prospects and residents are not on this path. A test plants a note and proves it never reaches a prospect or resident prompt.

Two tracks

TrackWhatBlocked on
A. Renewals on, current rulesTurn renewals on at Western Slope with today's engine, Supervised mode for week one.(1) Where to record one real AppFolio renewal offer, so the robot can create Western Slope's offers (175 of 179 leases had none on 09-28) — Fede's call. (2) Company renewal policy: term, month-to-month fee, rent strategy (their AppFolio default is "$0 change"; 10 of 19 recent renewals stayed flat). (3) One clean run of the nightly eligibility job. (4) Renewal switches on about 70 buildings. From the 09-28 renewals page; not re-checked in production today.
B. Notes → brain → renewalsThe phases below.Fede's scope confirmation; Gera's acceptance of a new note row on the company record (via Smith).

Track B phases

PhaseWhat Western Slope getsSizeTurn-on
1. Internal notes storeA place for notes on Western Slope's company record: text, source, date, and an optional property, unit, lease or tenant. One reader module; a lint rule stops prospect/resident prompts from importing it; planted-leak test.1 PRNothing visible
2. Email intake (removed 2026-11-03, Fede)Staff email notes to clara@propflowai.co. Clara knows the company from the sender's email domain (Western Slope already emails Clara), checks the mail is authenticated, and saves the body and text/PDF attachments as a note. Each company lists its own domains; free-mail domains (Gmail, Outlook…) never count, and a domain belongs to one company only.2 PRsNew capability: company setting, default off; Fede turns it on
3. Staff can ask"What did we decide on Maple St?" answered on the staff text desk and Ask Clara, from notes only.1 PRSame setting
4. Renewals use notesA meeting decision ("hold unit 12 flat", "+3% on Maple St", "move unit 4 to month-to-month") becomes a per-lease or per-building override the pricing step reads before the rent is frozen.2 PRsSame setting
Later: meeting joinClara joins their Zoom and listens; the transcript becomes notes.4–5 PRsBuilding now: the transcript-drop fix and transcript → note. Proven on Fede's next Zoom test.

How the renewal engine evolves

Today it's all fixed rules, no AI on the money: renewal switches, a 90-day window, eligibility (balance over 2 months of rent or more than 2 late payments → a person), gates (declined, notice given, opted out, transfer, signer email), rent strategy (market, current + %, current + $), terms and month-to-month fee, Supervised mode. The rent is frozen on the renewal and the AppFolio robot writes that number. Nobody can override rent on a single lease today — that per-lease override is the one new piece.

StageHow notes count
1 (pilot)Clara reads the note, quotes the line, and turns it into a structured override using the strategies that already exist ("flat" = current + $0, "+3%" = current + 3%). Design to be confirmed after notes are flowing; no auto-apply step.
2Notes become context Clara can use in tenant negotiations, never quoted to the tenant.
3Patterns across notes suggest policy changes ("7 of 9 Maple St calls were flat"); a person says yes.

When a note and a rule disagree: gates win (a declined or noticed tenant is never offered), then the meeting note, then building policy, then company policy. A note that asks for rent below current, or that can't be matched to one lease, goes to a person.

Proof of concept: Camellia renewals with and without notes (Oct 3 night)

We ran today's renewal engine on Camellia's 27 leases ending Jul 31 – Sep 30. Then we ran it again with notes pulled from five team meetings where the property manager went through renewals lease by lease. Both runs were graded against what actually happened. Local test only, nothing merged, nothing written to production.

Today's engineWith notes known at the timeWith all notes, incl. later ones
Called it right192023
Wrong663
Sent to a person100
Decision changed—911

What it means: notes barely move the final outcome. The real gain is in how leases get handled. A lease going to a lawyer is held, a tenant moving out isn't chased, and a paper renewal isn't texted and auto-switched to month-to-month. One note made things worse: a casual "he'll just go month to month" was read as a decision, and that tenant renewed.

Where it breaks:

  1. No way to change one lease's offer once it's sent. Rent and term are locked at that point. Clara's text offer also recomputes rent and assumes 12 months, so a note-based change would be ignored there.
  2. No "paper renewal" state. The engine keeps texting, then switches the tenant to month-to-month at +$100.
  3. About 1 in 6 notes (19 of 119) couldn't be tied to one lease. Causes: group statements, shared first names, and offhand remarks. A name cross-check stopped one wrong match.

Eight labeled synthetic notes (wrong unit, conflicting rent, below-current rent, a note against a notice to vacate) were all handled by the rules. One rule changed during the run: a notice to vacate always beats a meeting note.

Fixes that ship regardless

  • Clara's text-offer quotes a recomputed rent (ignores policy, hard-codes 12 months) instead of the frozen number, in three places. A correctness fix, no switch; needed before notes touch rent.
  • Video end-of-call drops the transcript when the end event arrives first. Needed before meeting join can make notes.

Decisions (Fede, Oct 3 night)

  1. Where notes go: clara@propflowai.co; the company comes from the sender's domain.
  2. Auto-applying notes to renewals: no — not building an auto-apply step.
  3. Order: email first, then meeting transcripts.
  4. Western Slope renewal policy: a company setting; set it, don't ask.
  5. The knowledge base is Public (2026-10-07, Fede): private information (personal phone numbers, emails, anything a staff member marks do-not-share) is never saved there, and a staff-only label on a shared row is not separation. The knowledge writer now refuses such items in code (branch fede/kb-no-private-info). This answers the open question “does a staff answer become public knowledge, an internal-only item, or get classified per answer?”: an answer saves only if it is Public; otherwise it is not saved.

Sources: renewal engine and intake paths read from the propflowai repo on 2026-10-03 (renewal-auto-start.ts, renewal-rent.ts, eligibility/engine.ts, process-inbound-email.ts, calls/ended/handler.ts); Western Slope renewals state from the 09-28 renewals page.

Learning from staff replies: context (Oct 4)

Context only, no decision yet

What exists, what Fede has said, and what is open, before any design for where Clara stores what she learns from staff replies.

Fede's words, newest first

WhenWords
Oct 3, nightA staff reply to one of Clara's emails or texts should save to the right place in the knowledge base; the six-month-lease case is a common example; use the company brain architecture; he is unsure paragraphs scale.
Oct 3, eveningA note is saved to the sender's company brain; nothing in it is ever shown to prospects.
Oct 3In the middle of three outcomes for a team reply, the reply gets saved to the knowledge base / company brain — and he doubts the reply loop works at all.
Oct 2, eveningWants one general framework for every kind of company information; a tenant caller must never hear an internal note.
Oct 2, middayCompany brain spans the knowledge base, listings, fees, rules and notes; "we're not going to build any of this" yet.
Sep 29The knowledge base is the authority; company-wide rules live at the company level, a property holds only its own exceptions.
Sep 28A policy question goes to staff, then the answer is saved to the knowledge base.
Aug 20 / Aug 13A one-off answer is not a policy; a staff reply IS policy, live immediately, in the same store Clara reads, with no review step.

Where he changed his mind

  • Company brain. A design on Oct 2, then a pilot approved on Oct 3.
  • Saving an answer. No gate, then a confirmation prompt, then save immediately and tell the staffer in the same thread.
  • Which rule wins. Portfolio wins, then property wins on a title match, then newest at the narrowest scope wins.
  • Knowledge shape. Fixed fields, then split into facts, then free-form text with structure chosen later, now doubt that paragraphs scale.

Two lanes today, only one saves

Coworker laneAutonomous lane
TriggerReply on the matter's email threadReply to the team note
Relay to renterYesYes
Saved to the knowledge baseYes — cleaned, checked for invented numbers, written at the property level; an exact repeat corrects the old entry, "no longer true" retires itNo — the reply is relayed to the renter but never saved

Western Slope runs on the autonomous lane, so its staff answers (including the six-month-lease case) take the path that does not save today.

What's built

  • Storage is typed fields plus free-form paragraphs on the same record.
  • Read path. The whole knowledge block is injected on every turn — there is no retrieval step that pulls just the relevant piece.
  • Real staff have never closed the loop. 0 of 26 cases in one test and 0 of 16 in another were answered by a real staff member; Western Slope staff is the example — only Fede's own test answers were ever saved.

Five open conflicts

  • Four different rules exist for which scope wins when rules disagree, never reconciled into one.
  • Whether a taught answer applies to one property or the whole company is unresolved — one path defaults to property-only, another to company-wide.
  • Where an internal-only (staff-facing) answer should live is unresolved — one proposal tags it inside the public store, another design says a label on a shared row is not enough separation.
  • Earlier plans for a human review queue on a taught answer are overtaken by the standing rule against manual-decision UI for routine data work.
  • One design page's description of how the save is written does not match what the code actually writes.

Ten open questions

  1. Does a staff answer become public knowledge, an internal-only item, or get classified per answer? Answered 2026-10-07: saves only if Public; see the Oct 7 decision above.
  2. If something starts internal-only, how does it ever become public?
  3. Is the default scope company-wide or property-only, and who decides that?
  4. Which precedence rule applies when scopes disagree?
  5. Is a time-bound answer (tied to a running promotion) knowledge with an expiry, a concession, or a one-off that shouldn't be saved as policy at all?
  6. Should answers stay as paragraphs, or become atomic items with their own validity period?
  7. When an answer is corrected later, does the new answer replace the old one or do both stay on record?
  8. Does today's knowledge read path work as-is with whatever is decided here, or does it need to change too?
  9. Is building the save for the autonomous lane a fix (ships for everyone, no switch) or a new capability (ships default-off until a customer is turned on)?
  10. What counts as proof this works: a simulated test, or a real staff reply at a live customer?
1. The framework
SOURCES · KEPT RAW ITEMS · AUDIENCE PICKS THE STORE WHO READS Onboarding answers AppFolio listings, fees Meeting transcripts Emails to Clara AppFolio notes Computed signals 1:1 chat with a teammate future connectors Public by rule Internal by default Internal (v1) Public what Clara may tell anyone already exists: company and building knowledge, AppFolio tables, renewal rules THE WALL Internal all staff of the company facts, signals, judgments, decisions each cites its source Private: reserved not built until a customer asks explicit act only Knowledge block every turn: prospects, tenants, staff Tenant-facing artifact e.g. the offer letter; no reason field Staff tools verified staff turns only Workflows renewal, leasing, maintenance read Internal, apply effects typed effect only
Audience picks the store. Tenant- and prospect-facing Clara reads only Public. The one automatic thing that crosses the wall is a typed effect a workflow writes, such as "offer 12 months at +3%"; the reason never crosses, because the tenant-facing artifact has no field for it. Making an Internal item Public takes an explicit act by a person; no product researched promotes automatically. The dashed Private box is reserved: the field allows it, nothing builds it yet.

One shape for every item

Evidence (kept raw, never edited)

Renewals meeting, Tue 2026-09-29, notes forwarded to Clara by Maria (invented).
"14:32 — Twelve, let's just do month-to-month, he's selling in the spring."
→

Item

source
pointer to that evidence, plus the quote
scope
lease: Pine Court 12 (company, property, unit, lease or person)
audience
Internal  the only attribute that picks the store. v1 values: Public, Internal. A third value, Private, is reserved and not built until a customer asks.
effect
renewal.term = month_to_month (optional; from the consuming workflow's fixed list)
validity
valid from / valid until / superseded by
verified
who said it, matched to their staff record
  • Pages per entity, copied from GBrain. Each tenant, unit, lease, property and company gets a short current summary on top of an append-only, cited timeline of items. GBrain calls these "compiled truth" over "timeline" (GBrain schema).
  • Facts that change carry valid-from and valid-until, the way Graphiti stores them (Graphiti).
  • Knowledge stays apart from procedures. Items are knowledge; what a workflow may do with them (its effect list) is procedure. Intercom Fin (Guidance, Procedures), Decagon (agent operating procedures) and Maven (Charters) all split them this way (Intercom, Decagon, Maven).
  • Only items with an effect drive actions. A decision is an item with an effect. A signal is an item computed by a job. A judgment ("disputes every charge") is an Internal item like any other: in v1 every staff member sees every Internal item.

Every kind of company information, one table

InputSourceScopeAudienceEffect
Public policyonboarding answerscompany, propertyPublic–
Listing, feeAppFolio syncunit, propertyPublic–
Meeting contenttranscriptlease, personInternalonly when a decision
Emaila mailbox Clara is copied onpersonInternal–
PMS noteAppFolio noteperson, unitInternal–
System signal ("3 late payments")computed jobleaseInternal–
Staff judgment ("problem tenant")staff messagepersonInternal–
Decision ("12 is month-to-month only")transcript or emailleaseInternalrenewal.term = mtm
A teammate's chat with Clarastaff text desk, Ask Claraperson, lease, unitInternal–
Outside tool (Notion page, Drive doc)a connector (section 4)company, propertyInternal–
  • Not a migration. The item shape is a contract. Today's stores (company knowledge sections, AppFolio sync tables, renewal rules) are read through it as they are. New sources write to it natively. Zero rows move.
  • Who wins, for every consumer: law and safety rails, then the newest item at the narrowest scope (person, lease, unit, property, company), then defaults. It extends the knowledge base's existing "the building wins over the company" rule.
2. Two audiences

Fede: "it is a very different mental model from the knowledge base that's meant to be public facing." And for v1: "Start with only two levels… Everything is internal, to simplify, because there's no privacy right now in the system, so everyone should see all the conversations." The two words are the ones shipped products use (research).

PublicInternal
Who can hear itAnyone Clara talks to: prospects, tenants, staffEvery staff member of that company. Never tenants, prospects or another company
ExamplesPet policy, fees, parking, listings, office hoursRenewal terms the team agreed, a concession for one tenant, late-payment history, "owner selling in spring", a teammate's chat with Clara
Default forOnboarding answers, the AppFolio syncEverything else: meetings, emails, AppFolio notes, signals, staff chats with Clara, connectors
How Clara uses itQuotes itDecides with it; tells staff; never quotes it to a tenant
Becomes Public by–A person publishing it to Knowledge & policies
Shipped precedent"Public" articles (Intercom), public comment (Zendesk)"Internal" articles and notes (Intercom, Zendesk, Salesforce, Front)

Private is reserved, not built. The audience field has room for a third value, Private (one teammate only, as in Notion, Claude Projects and Help Scout). Nothing writes it until a customer asks for it.

Invented example: Maria texts Clara "Unit 9 is on a payment plan" or forwards meeting notes; both land as Internal and every teammate's Clara sees them. "Pet deposit is $400 everywhere now" reaches prospects only once someone publishes it to Knowledge & policies; the quote stays Internal.

3. How information gets in

Also proposed: Clara reads the notes managers already keep on each property and home record, on the same 6-hour pull. Numbers and decisions: onboarding playbook, section 4b.

CONNECTORS THE EDGE EVIDENCE EXTRACT ITEMS (a) cc or forward to Claraemail · first slice (b) Listen-only meeting joinaudio only, no avatar (c) Video joinTavus, what we have (d) Paste or uploadin the app Existing connectorsonboarding, AppFolio sync and notes Company pinned from the mailbox, the meeting starter or the signed-in user; never from the content email: the sender must be active staff there Raw evidence never edited company prefix Extractor items, scope, quote, effect Internal by default
Every connector lands raw evidence first, then the extractor writes items. Meeting and email content defaults to Internal; it becomes Public only when a person publishes it. Copied from GBrain: a meeting is "not fully ingested until every attendee's page has a new timeline entry" (GBrain meeting ingestion).
PathCostWhat it needsWhen
(a) cc or forward ClaraNothing new for the customerClara's mailbox per company (exists); a sender check; the extractorFirst slice
(b) Listen-only joinBot vendors charge flat, e.g. Recall.ai $0.50 per recording hour, no audio-only discount (Recall.ai). Audio saves mostly when we capture it ourselves: Zoom puts its no-bot feed at about $0.012/h to run versus $0.042–0.090 for a bot (Zoom).A bot vendor or Zoom's feed; a consent notice when Clara joinsDecision 3
(c) Video joinTavus video minutes (video Clara page)Keep the end-of-call transcript instead of dropping itWhen staff want to ask Clara things live
(d) Paste or uploadNothingAn upload box on the Internal pageRight after (a); same extractor

From evidence to items

  1. Store raw. As received, with speakers and timestamps. Never edited.
  2. Extract. A model reads the whole thing and writes items, each with a verbatim quote. Questions, what-ifs and brainstorming are skipped.
  3. Match the scope. "Twelve", "the Garcias", "Pine Court" are matched against that company's own leases, people and buildings only. No match, or more than one: the item is kept unmatched and never drives an action.
  4. Live at once, no approval queue (Fede, 2026-09-08). After a meeting Clara sends attendees a short "here's what I took away" note. Anyone corrects it by replying in plain words; Clara replaces the item. Silence means it stands.
  5. Re-runnable. The extractor is versioned; re-running it on the evidence rebuilds the items.
4. Long-term vision: connectors

Fede: "We serve small and medium businesses that already have their tools: Notion, Monday, Google Drive/Docs, Microsoft SharePoint/OneDrive… Connectors feed data into the company brain at the right privacy level." A connector is one more source in the framework above: it writes items, stamped with where they came from and an audience.

SOURCE TOOLS CONNECTOR FRAMEWORK AUDIENCE STAMP BRAIN STORES WHO READS Notion Monday Google Drive, Docs SharePoint, OneDrive AppFolio, email (today) In our AWS one connection per company, attached at the org Sync scheduled, copies in Live lookup MCP, later Stamp each item source + link company (from the connection, never content) audience: Internal person publishes Public THE WALL Internal Knowledge block anyone Staff tool, workflows verified staff only
A connector never decides who sees what. It writes items stamped Internal under the one company that owns the connection; a person can publish an item to Public. One company's connection never feeds another's.

How others present connectors

ProductWord in the UIWho connectsSync or liveAudience
GleanConnectors (docs)Admin, company-wideIndexedCopies source permissions; a connector can be hidden from groups
Intercom FinKnowledge sources (docs)AdminSynced; some read liveAudience per source: internal vs the customer-facing agent
Microsoft 365 CopilotConnectors, formerly Graph connectors (docs)AdminScheduled crawls"Only people with access" or "everyone in the organization"
DustConnections, placed in Spaces (docs)AdminSyncedOpen or restricted space
ClaudeConnectors, built on MCP (docs)Org owner adds; users enableLiveWhole-connector access
Notion AIConnectors (Slack, Google Drive, SharePoint and more)WorkspaceSyncedUnverified (secondary source only)

Common pattern: an admin connects a tool once for the whole company; most products sync and index, while MCP-based ones read live; the customer-facing bot only sees sources an admin marks for it. Sierra and Decagon document "integrations" but not their permission model (unverified). Our app already has Settings → Connections (AppFolio today); outside tools go on that same page.

Open-source frameworks we could build on

FrameworkLicense, languageNotion / Monday / Drive / SharePoint / OneDriveKeeps permissionsSelf-hosted in our AWS
Airbyte connectorsConnectors MIT, platform ELv2; Python (low-code YAML)All five (Monday, SharePoint, OneDrive, Notion, Drive); 600+ in allGoogle Drive syncs file permissions and users and groups; SharePoint docs don't say (unverified)Yes. Each connector is a container; the full platform needs Kubernetes and Postgres; connectors also run without it via PyAirbyte
NangoELv2; TypeScriptOAuth for 1,000+ APIs; you write each syncNoFree self-hosting covers sign-in and proxy only; syncs need the paid Enterprise plan (docs)
Onyx (formerly Danswer)MIT core plus paid Enterprise; PythonNotion, Drive, SharePoint and OneDrive; no Monday; 51 in all (docs)Enterprise only: "Permission-syncing connectors are an Enterprise Edition feature"Yes, but it brings its own search stack (Postgres, Redis, OpenSearch)
LlamaIndex readersMIT; PythonNotion and Drive; others communityNoLibrary only; no scheduling or sign-in
UnstructuredApache-2.0; PythonFour of five, no MondayNoYes; best as a document parser
MCP serversMostly MIT; mixedOfficial Monday and Notion servers; Microsoft's are in its catalog; Drive is community-builtReads as the signed-in accountLive reads only, not a sync

Recommendation: Airbyte's open-source connectors, run in our AWS, for sync. MCP later for live lookups. They are the only option that covers all five tools Fede named under an open license, run entirely on our infrastructure, and already sync Google Drive permissions, which a future Private level could use. Nango is TypeScript, but self-hosted syncs need its paid plan, so we would still write every sync. Onyx lacks Monday and charges for permission sync. We run the connectors as containers from a Temporal job, not the whole Airbyte platform, and translate their output into items. That last step is ours to write.

Two modes

  • Sync (first): a scheduled job copies what an admin points it at (a Notion teamspace, a Drive folder, a SharePoint site) into evidence and items. Fast to read, works when the tool is down, and the planted-leak test covers it.
  • Live lookup (later): a staff-only tool calls the tool's MCP server at question time, for things too big or fast-changing to copy. It sits behind the same staff check as get_internal_context.

Each connection belongs to one company, under its org node, like lines, calendars and mailboxes in Gera's model. Turning a connector on at a customer is a new capability: a company setting, off by default, that Fede turns on.

5. The wall

The wall is structural, not a prompt instruction. Three layers, each enough on its own to stop a leak.

WHO IS ASKING ② ROLE CHECK DOORS = TOOLS COMPOSED ① STORES Tenant or prospect text, email, phone, web Tool composition no staff role found public tools only knowledge block, property details, fees internal-context tool: not composed ③ Send check on every tenant-bound reply THE WALL Staff of this company text desk, Ask Clara, video Clara with the team Staff check staff person resolved, own company's line, staff tier knowledge block, property details, fees get_internal_context(scope) role re-checked on every call Public feeds the knowledge block Internal own key space, own reader module
Tools are the only doorways. ① Audience picks the store, and the knowledge block reads only Public. ② The internal-context tool is composed only when the caller is verified staff of that company; for a tenant or prospect the door does not exist. ③ An independent check on every tenant-bound send, because labels and filters can fail together.
LayerShipped precedent
① Separate store"A namespace per tenant avoids query-layer leaks; metadata filters are application-side only" (AWS); one namespace per tenant (Pinecone); cross-tenant leakage is OWASP's LLM08 (OWASP).
② The customer-facing AI only gets the public audienceIntercom: an internal article has "Share with Fin" off, so Fin cannot answer with it (Intercom). Salesforce Agentforce grounds only on the channels it is allowed (Salesforce). Filter on the server from the verified caller, never the model (Cerbos, Auth0).
③ Send checkFrom late January to mid-February 2026, one Copilot Chat bug summarized emails that sensitivity labels and data-loss rules should have blocked: one bug beat all three (The Register).
  • Shapes, never quoted. Workflows read Internal and write a typed effect, such as an offer at +3%. The renewal letter, text and call script have no reason field, so the note cannot reach the tenant even by mistake. The reason is absent, not hidden.
  • Derived things inherit the audience. Summaries, counts and links built from Internal items are Internal. GBrain's private filter once leaked through graph links and backlink counts, not page text (fix), and its remember command defaulted to shared regardless of settings (issue).
  • A planted-leak test. Plant a unique Internal sentence, replay tenant and prospect conversations, expect it nowhere. A check is only trusted once it goes red on a planted violation.
  • Access: every staff member of that company sees every Internal item in v1 (Fede: "everyone should see all the conversations"). Property owners are not staff, so owner access needs its own grant (section 7).

Where the wall sits in today's code

Read from propflowai origin/main at 6ed1cbe8cf, 2026-10-02. Fede thought role-gated staff tools already exist: they do.

LayerTodayChange
① StoreCompany knowledge (knowledge.section.<id> on the org node) loads through loadOrgKnowledgeSectionsSafe → buildLeasingKnowledgeBlock into email and SMS (conversation-manager.ts, clara-unified.ts), voice (property_policies in api/voice/personalization/route.ts) and the get_property_details tool. No audience filter on any of these paths.Internal items never become knowledge sections. They get their own key space and reader module, and an import boundary (a lint rule) stops the three knowledge paths from importing that reader. This is why a label on a knowledge row is not enough.
② DoorcomposeCapabilities (agents/clara/lib/agent/capabilities/index.ts) composes tools from the caller. Staff capabilities exist: STAFF_METRICS (any staff sender), STAFF_LEASING_DESK and STAFF_PORTFOLIO (when deskGranted: staff line of the sender's own company plus a desk tier), MASS_COMMS (manager tier). Staff are verified in src/lib/domain/staff/inbound-resolution.ts. The dispatcher (tools/index.ts) refuses staff tool names without that context; handleStaffPortfolioTool re-checks the role on every call. Tenant and prospect turns never compose these.A new capability with one tool, get_internal_context(scope), composed under the same staff check, added to the dispatcher's staff-only list, re-checking the role on every call.
③ SendNo send-side check for knowledge. Data-layer precedent: isInternalAudienceRow strips internal rows (such as imported AppFolio guest-card notes) from Clara's conversation context (context-message-filter.ts, buildClaudeMessages).Before any tenant- or prospect-bound send, compare the text against the Internal items for that scope (quote overlap); on a match, hold and alert.
Staff surfacesAsk Clara: src/app/api/dashboard/chat/route.ts, scoped by getUserOrgScope and getUserPropertyScope. Staff text desk: staffLeasingDesk.Both get get_internal_context.
Gap: staff → Publicescalation/teaching-capture.ts writes staff replies into knowledge.section.*, which is Public.A staff reply about a named person or lease becomes an Internal item. Publishing stays an explicit act.
Gap: email from staffA known staff email sender (senderIsKnownStaff) only suppresses leasing; it unlocks no staff tool.The forwarding connector accepts a write only from an active staff sender of that company; otherwise anyone who learns the address could write Internal items.
Isolation audit, Nov 3
What reads or copies the notesWho sees the resultWhat keeps it inVerdict
Notes store readersNobody in production (one sandbox test script)Lint wall + planted-leak testSAFE
Tenant, prospect and vendor prompts (email, text, voice, AppFolio relay, knowledge loaders)OutsidersNo code reads notes or meeting transcripts; the planted-leak test goes red if the reader is wired inSAFE
Digests, call list, team notices, reportsCustomer staffNone of them read notesSAFE
Where notes are stored (company record; no search index holds them; no page or API returns them)–Only the platform-admin delete tool reads the whole company recordSAFE
Clara's staff turn on the same email (it runs right after the note saves)Prospects (texts, application links, tour changes), renters, staffSender must be verified staff; the “was Clara asked?” check is skipped when only Clara is on the emailRISK: transcript words can reach a prospect, and only Clara's own judgment stops them. Closed 2026-11-03: Fede said "delete"; the email intake is removed, so no email saves a note
Staff answer saved as public knowledgeProspects laterThe private-info check catches phones, emails and “confidential” only, not names, rents or court recordsRISK (narrow)
Renewal decision from a staff replyTenant offer textThe concession is free text with no length cap. This route is fed by a staff reply, not by notesRISK
Stage copy of productionAnyone with stage or preview accessOnly known names, phones and emails were scrubbedRISK → fixed in #24964; rows already on stage need a one-time purge
Video call thread, Langfuse traces, TavusStaff inbox; Propflow; vendorsCompany only; vendor retention not checkedRISK, internal or vendor only
Clara speaking in an outside meetingAnyone in the callOnly the organizer is checked; she can read company records out loud (records, not notes)RISK (adjacent)
Lint wall–Caught plain imports only; a planted dynamic import and require() went throughGap → fixed in #24961
6. How Clara finds things

Anthropic's guidance: "If your knowledge base is smaller than 200,000 tokens (about 500 pages of material), you can just include the entire knowledge base in the prompt" (Anthropic). Cached prompt reads cost a tenth of normal input (prompt caching). A company's Public knowledge is roughly 10k tokens (our estimate), so it stays in the prompt.

WhenPublicInternalPMS records
NowWhole, in the prompt, cachedKeyed lookup by scope through get_internal_context; the audience rule is in the tool layer, which tenant-facing Clara cannot bypassBehind tools, never embedded
Next: meetings and emails pile upSameA staff-only search over free text: one index per company, never shared with any Public index, in our AWS account (S3 Vectors or Bedrock Knowledge Bases). Keyword plus meaning search with context added to each chunk if recall is weak; Anthropic measured a 67% drop in retrieval failures from that combination. Measured with Ragas-style recall plus the planted-leak test before it ships.Behind tools
At 10k unitsSameMove to OpenSearch only if measured volume needs it; add reranking only if measured recall is lowBehind tools

On a live call, free-text search stays off the critical path: the caller's own facts load at call start, as video Clara's snapshot already does (our inference, not a cited figure).

7. Fit with Gera's organization model

Checked against Gera's design. No conflict, with one gap.

  • The company is the wall. Every item and its evidence live under the company's org node; scope links point only to its own properties, units, leases and people. GBrain draws the same line: "if the data owner changes, it's a brain boundary" (GBrain).
  • Scope uses his nodes, and "newest at the narrowest scope wins" is the same chain walk as his resolver.
  • Roles: a staff job is an org-level role with an optional building subset. Internal follows that subset.
  • Gap: owner visibility. A property owner is a relationship row with no rung in the role ladder, so owner-visible items need a new grant key, default off.
  • Connectors attach at the org, like lines, calendars and mailboxes in his model; a connector's items land only under that company.
  • PMS credential holder (Property.ownerId) grants no read access. Matches.
8. What others do

Web research, 2026-10-02, two passes. Vendor docs linked inline; anything not confirmed from a primary page is marked unverified.

Public vs Internal: the customer-service products

Same pattern everywhere: one library, an audience on each item, and the customer-facing AI limited to the public audience. Nobody says "staff only"; they say "internal".

ProductWordsHow it shows
Intercom Fin"internal articles" vs "public articles"; a separate "Fin audience"; toggle "Share with Fin" (docs)Audience setting per article
Zendesk"internal note" vs "public comment"; article segment "Agents and managers" (docs, docs)Internal notes on a yellow background; cannot be made private again once public
SalesforcePublish channels: Internal, Customer, Partner, Public (docs)Channel checkboxes per article
Front"public" vs "internal" knowledge base (docs)Internal needs a Front login
Help Scout"Private" collections; Notes vs Replies (docs)Lock icon on private collections

Private vs shared: one person's memory vs the team's

Kept for when Private is built. v1 has no Private level.

ProductPersonalSharedBecomes shared by
ChatGPTSaved memoriesProjects, with project-only memoryPutting it in a shared project (docs)
ClaudeMemory summary; "Private" projectsProjects visible to "Everyone at your organization"Adding it to a shared project (docs, memory)
NotionPrivate pagesTeamspaces: Open, Closed, PrivateMoving the page to a teamspace (docs)
GleanMemory, per user onlyCompany knowledge, permissions copied from each sourceNever: memory does not cross users (docs)
Microsoft 365 CopilotSaved memoryCopilot Pages and NotebooksSaving to a page (docs)
DustUnpublished agentSpaces, open or restricted; "Company Data"Publishing, or placing it in a space (docs)
GBrainprivateworld; team brains mounted beside a personal oneWriting to the team brain or marking it world (docs)

GBrain (Garry Tan's open-source brain)

One database per data owner, holding typed pages (person, company, meeting, email, deal and more). Each page has a rewritable "compiled truth" over an append-only timeline where "every claim cites its source". Pages and facts are world or private; remote agents get read, write or admin scopes; derived pages are treated as private by default (issue). Its people pages include an "Assessment" section, the same kind of staff judgment we keep Internal (schema). Young (April 2026), single author, active leak fixes.

Meetings, property management, consumer memory

  • New meeting notes are private by default at Notion, Glean, Granola and Fathom; Microsoft shares recaps with invitees; Slack huddle notes go to the channel (Notion, Glean, Fathom, Microsoft). We default meetings Clara is given to Internal instead, because a customer forwards them to Clara precisely so the team's assistant knows.
  • No property-management vendor documents a wall between staff notes and the resident-facing AI. AppFolio Realm-X (2026-09-29) has a per-user "Memory" and a "Knowledge Base" under "customer-set permissions"; any staff/resident split is unverified (announcement). EliseAI's "Knowledge" is what its AI tells prospects and residents; renewals start when the PMS marks one Approved (docs, docs). Entrata using staff notes in renewals: unverified.
  • Consumer memory is single-person. Dot shut down on 2025-10-05 (TechCrunch). Meta's Muse agent (announced 2026-09-08) learns one person's memory, which they can edit, tell it to forget, or import; no "brain" feature was found (Meta, help). Grok's per-memory "Forget" is reported secondhand only (unverified).
  • Every product lets people see, edit and forget their memory (ChatGPT "Manage memories", Claude "Memory summary", Muse "Forget"). We copy that screen.

Patterns we copy

  1. An audience on every item, with the customer-facing AI restricted to Public (Intercom, Zendesk, Salesforce).
  2. Physically separate stores for the hard wall; filters only as a second layer (AWS, Pinecone).
  3. An independent check at the send layer (the 2026 Copilot bug).
  4. Shared only through a named shared place, never by automatic promotion (ChatGPT, Claude, Notion, Copilot, Dust). For us that is publishing Internal to Public; per-person Private waits until a customer asks.
  5. Inbound content is untrusted: one email with hidden instructions pulled Microsoft 365 Copilot data out with no click (EchoLeak, CVE-2025-32711). Only verified staff write Internal items, and items are data, never instructions.
  6. Decisions get their own record apart from the transcript. Competitors keep only transcripts and summaries, and their renewal decisions live in the PMS: that gap is our renewals example.

Rent recommendations: RealPage's rent-pricing settlement (Federal Register, 2026-01-21) makes pooled rent advice sensitive. Here every increase comes from that client's own team, and the per-company wall means one client's decisions never inform another's rent.

9. Open-source memory frameworks: borrow, don't adopt

Recommendation: copy patterns; adopt no framework now. None gives an audience wall or hard per-company isolation; most are Python, while we run TypeScript on DynamoDB, S3 and Temporal; and Zep needs its own cloud, so customer data would leave our infrastructure.

ProjectRuns on our infra?Audience wall?What we borrow
GBrainYes (Postgres); the Supabase option is a third partyPer-page private flag; has leaked through links and countsPages per entity, compiled truth over a cited timeline, private-by-default derived pages
GraphitiYes, with a graph database we don't runNoneValid-from / valid-until on facts. Optional later layer if supersession gets hard
ZepNo: needs Zep CloudUnverifiedNothing
mem0Yes as a library; hosted by defaultNone (user/agent ids only)Nothing beyond scope ids
OnyxYesPermission-aware connectors (paid tier)Considered for connectors in section 4
GraphRAG, LightRAGYesNoneNothing: built for themes across a whole corpus, not "what did we decide about 4B"

Letta, Cognee, Supermemory, Basic Memory and Memori were also reviewed; none adds an audience wall. Letta's details are unverified.

10. UI prototype
Where notes live in the product (UX concepts, Oct 4)

Rejected (Fede, Oct 4): "I didn't like the options… I don't want to build a UI yet." No notes screen for now; notes are checked by the team on request. Kept below for the record.

Design only; no UI is built. Fede, Oct 4: "give me a prototype doc of where these notes would fit in and how they will look." The mockups copy real screens on origin/main: Gera's Settings area (left menu, the Company | Property header row, Knowledge & policies), the tenant page and the renewal page.

What exists today

  • One note so far: our test company, from Fede's Willows Zoom test, Sun Oct 4, 8:50 AM. Source: Meeting. The whole transcript is the body. No building or unit attached.
  • The store keeps one optional building, unit, lease or tenant per note. It has no title and no summary.
  • The only screen that mentioned notes was the on/off card "Staff can email meeting notes to Clara" on the Customers page. Removed 2026-11-03 (Fede) with the email intake.

One note, the same look everywhere

The transcript keeps speech-to-text slips ("you need" for "unit", "release" for "lease"), so the collapsed view shows Clara's own recap. Who sees it: everyone on the company's team (Settings › Team) in v1. Property owners are not staff and need their own grant (section 7). Prospects and residents never. Notes sit on the company's own record, the wall in Gera's model. Remove works like on the Company knowledge cards (a note is never rewritten); nothing to approve.

Option A — inside Knowledge & policies

For: one page for everything Clara knows. Against: breaks this page's own rule, "a screen shows one audience." A Public entry and an Internal note one scroll apart invites pasting into the wrong one.

Option B — its own row under Settings › Company

For: one audience per screen; sits in Gera's menu, where the customer's team already looks; works with today's one-piece notes. Property tab hidden, as Gera does on Company-only pages. Against: one more menu row, and notes are records, not settings (Knowledge & policies already sets that precedent).

Option C — in context, next to the lease

The same card fits the tenant page's right column, under "Also on file." For: staff see it where they act. Against: it needs each meeting split into one line per lease. Today's note is one piece with no unit, and the Camellia test could not tie 1 in 6 notes to one lease. So C is a later view on top of A or B, not a home.

Recommendation

B now, C later. One audience per screen, in the menu the customer's team already uses, and it works with notes as they are stored today.

Decisions for Fede

  1. Where notes live: (a) inside Knowledge & policies; (b) own row under Settings › Company (recommended); (c) only next to leases and tenants.
  2. The row's name: (a) "Internal" (recommended: this page names sections by who hears them, never by medium); (b) "Internal notes"; (c) "Notes". Either way the Customers-page card's "private notes" becomes "internal notes," since Private is reserved for one person's memory.
  3. For the in-context view: (a) Clara splits a meeting into one note per lease when she saves it, keeping the transcript as the source (recommended: uses the store's existing unit and lease fields); (b) keep one note and match lines when the page opens; (c) not yet.

Static mockups, modeled on the app's real Settings screens and labels. The chips copy Intercom's internal-vs-public audience. People see and edit what Clara knows; there is nothing to approve (Fede, 2026-09-08: the engine decides, humans fix the engine).

A. Settings: one place per audience

"Knowledge & policies", "Connections", the subtitle and the menu order are today's real ones.

B. Internal, company view: every source in one list

C. A tenant's page: the Internal panel and one item

The panel's summary line over the item list is GBrain's compiled truth over its timeline. Today's AppFolio note row in conversations says "Only your team sees this; Clara never does." Under this design staff-facing Clara does read it, so that line becomes the Internal chip: "Internal · Clara uses it to decide, never shares it with tenants."

D. Renewal view for one tenant: what Clara will do, and why

UX principles

  • Two names, each saying who hears it, both from shipped products: Public, Internal. None names a medium ("notes", "meetings").
  • One visibility chip, everywhere, same words and color: green globe Public; violet lock Internal.
  • A "used by" line on every item: "Quoted in replies" vs "Used by renewals, never quoted".
  • No mixed lists. A screen shows one audience. On a tenant, unit or property page, Internal is its own panel, never interleaved.
  • Source one click away. Every Internal item shows its quote and opens its evidence. You edit or forget an item; you never approve it.
  • Moving up is visible and deliberate: "published to Knowledge & policies by Luis".
11. Worked examples

Fede's pilot (2026-10-02): basic leasing questions plus renewals. Basic leasing questions are answered from Public, as today. Renewals are the first workflow that reads Internal.

Example 1: renewals

Today (invented example)

Dana pays on time, so both renewal checks pass and Clara sends the standard 12-month offer. On Tuesday the team had agreed: "Pine Court 12, the owner is selling in spring, month-to-month only." Nobody told Clara. Staff walk the offer back.

With the brain

Before the first letter, the renewal workflow reads the Internal items on Dana's lease, home and building. It finds Maria's decision from Tuesday, with the quote and minute, and offers month-to-month instead. The letter says nothing about why. Had the note been unclear, Clara would hold that one step and ask Maria.

In client meetings Clara gathers which tenants to renew, how much to increase, whether to offer a renewal at all, and who moves to month-to-month. Each becomes an Internal item with a renewal effect.

A renewal item, field by field
FieldExample (invented)
What was decidedOffer Pine Court 12 month-to-month only this cycle; the owner is selling in spring.
Effectrenewal.term = month_to_month, from the renewal workflow's fixed list (below).
ScopeLease: Pine Court 12, current lease.
AudienceInternal.
Who decidedMaria, property manager, matched to her staff record at that company.
SourceRenewals meeting notes, Tue 2026-09-29, 14:32. Quote: "Twelve, let's just do month-to-month, he's selling in the spring."
ValidityEnds with this renewal cycle. A later item on the same lease and topic replaces it; the old one is marked superseded and kept for audit.
ConfidenceHigh: stated as a decision, not a question; scope matched exactly one lease.

Renewal effects (v1)

  • Change the offer: term, rent within the building's policy, month-to-month only.
  • Hold this renewal for the team (it parks, the way a renewal that fails a check parks today).
  • Renew even though a check failed ("he's on a payment plan, renew him").
  • Don't contact before a date.

An item whose effect is not on the list is still context, but at that step Clara asks the team instead of improvising. Every other workflow declares its own list the same way.

When the renewal workflow reads

A keyed lookup, not a search. At a check point the workflow asks for active items on this lease, the people on it, the unit, the building and the company. A handful of items, one or two database reads. Each workflow declares its own check points; these are the renewal workflow's.

  1. When the renewal is first evaluated (today's two checks: balance and late payments).
  2. Right before the first letter (pre_first_contact, already a declared check point). The first slice reads only here.
  3. When the tenant says yes (at_offer_acceptance).
WhereLatency budget
Background work (renewals)Up to 1 s added per check. Nobody is waiting.
Live staff call or textLoaded once when the conversation starts; under 50 ms per turn after that.

Each check writes down which items it used, so a later replay shows why Clara did what she did. When unsure (two items contradict, an effect not on the list, a scope that didn't match), Clara holds that one step and asks the person who made the decision, with both quotes. Everything else keeps moving.

Example 2: a leasing rule, published

Luis pastes owner call notes: "No new pets at Willow Row from November." It lands as an Internal item on the building, and Clara uses it at once with staff. Prospects hear it only once Luis publishes it to Knowledge & policies (Intercom's audience toggle is the model). Until then, if it contradicts a Public entry, Clara tells Luis the public policy is out of date.

Example 3: a maintenance signal

A nightly job sees four leak work orders on Unit 7 in 60 days and writes an Internal signal on the unit. The next time the tenant reports a leak, maintenance triage reads it and routes the call to the property manager instead of booking another routine visit. The tenant hears "I'm getting your manager involved today," never the count.

12. What is ours to build, and the first slice

What nobody ships for us (everything else has a product or pattern to copy):

  • The Public / Internal audience on property-management data, Internal by default for everything but onboarding answers and listings.
  • The planted-leak test that proves Internal never reaches a tenant.
  • The property-management item schema: scopes, effects, lifetimes.
  • The see, edit and forget pages (the screens are copied; the data behind them is ours).

First slice (Fede: "I'm not saying go build the whole thing"):

  • The item contract and the Internal store (its own key space, its own reader).
  • One connector: notes forwarded to Clara's mailbox, accepted only from active staff of that company.
  • One consumer: the renewal workflow at pre_first_contact, with the effect list above.
  • One staff tool: get_internal_context(scope) on the staff text desk and Ask Clara.
  • A company setting, default off: a new capability, so Fede turns it on per customer, after a proof at the Willows test property.

Emails, AppFolio notes, signals, meetings and outside-tool connectors come later as new connectors, not a redesign.

13. Decisions for Fede

TL;DR: a person publishes Internal to Public (recommended); connectors run on Airbyte's open-source connectors in our AWS (recommended); listen-only joining waits for v2 (recommended); raw evidence lives 13 months (recommended).

1. How does an Internal item become Public?

A) Only when a person publishes it to Knowledge & policies, as Intercom, Zendesk and Salesforce do. B) Clara publishes it herself when a staff member states a company-wide rule ("pet deposit is $400 everywhere"). No shipped product does this.

Recommend A. Nothing reaches tenants by accident. It needs no approval buttons: publishing is one plain request to Clara or one toggle on the item.

2. Which connector framework?

A) Airbyte's open-source connectors (MIT), run as containers in our AWS from a Temporal job; MCP later for live lookups. B) Nango (TypeScript), but self-hosted syncs need its paid Enterprise plan. C) Onyx, which brings its own search stack, has no Monday connector and charges for permission sync. D) Write each connector ourselves.

Recommend A. It covers Notion, Monday, Google Drive, SharePoint and OneDrive today, customer data never leaves our AWS, and Drive permissions come with it for a later Private level.

3. Listen-only meeting join: v1 or v2?

A) v1, alongside forwarded notes. B) v2, after forwarded notes prove the extractor. C) Skip it; use video join only.

Recommend B. Forwarded notes cost nothing and prove extraction first. Bot vendors charge the same for audio as for video, so listen-only saves money only if we capture audio ourselves.

4. How long does raw evidence live?

A) 90 days. B) 13 months. C) As long as the customer is with us.

Recommend B. It covers a full lease cycle, so a renewal item can be traced to its quote. Items keep their quote after the evidence is gone.

Already settled

  • Two levels in v1: Public and Internal. Every staff member sees every Internal item, including all conversations (Fede, 2026-10-02). Private is reserved in the field and built only when a customer asks.
  • Names: Public and Internal, the most common words in shipped products (Fede: follow industry examples).
  • Where items live: a separate store with its own reader and tools, never in the knowledge block.
  • Approval: none. Items are live at once; a recap to attendees, and a plain reply corrects them (Fede, 2026-09-08). The video Clara page's renewal section still proposes an approval step and should be updated to match.
  • Pilot: basic leasing questions plus renewals (Fede, 2026-10-02). First source: notes forwarded to Clara.
  • Default lifetimes: lease items end with the cycle; building and company items lapse after 6 months unless restated.
Isolation, privacy and retention

One company, always

  • Every item and its evidence live under the company's own node, the wall in Gera's organization model. Scope links point down to its own buildings, people and leases only.
  • The company comes from the edge only: the signed-in start of the meeting, or the mailbox or number that belongs to one company. Never from what is said or written.
  • Matching names to records sees only that company's records, so "the Garcias" can never resolve to another customer's tenant.
  • Every read carries the company the workflow already pinned (the renewal workflow pins company and building at start).
  • When a customer leaves, the purge takes their items and evidence with it.

Never stored, never acted on

  • Meeting audio and video. Tavus recording and memory stay off; we keep text only.
  • Card, bank and Social Security numbers: redacted before evidence is stored.
  • Decisions resting on a protected class (family status, disability, race, religion, national origin, sex and the rest of fair housing). "Don't renew them, too many kids" is dropped, never acted on, and the meeting organizer is told why.
  • Health details and assistance-animal specifics never go into an item.

Retention

Proposed: raw evidence for 13 months; items while valid plus 13 months for audit. A customer can delete a source, and its items go with it. See decision 4.

Packaging: an add-on
  • The model is always there. Public knowledge works for every customer, as today.
  • The setting gates new connectors, such as forwarded notes and meeting capture, not the model. It is a new capability, so it ships as a company setting, off by default, visible on the customer page, and Fede turns it on per customer.
  • Off means today's behavior exactly: nothing new is captured and no Internal reads happen.
  • Proof before any customer: staged meetings and forwarded notes at the Willows test property.
  • Price is not designed here.
Risks
RiskAnswer
An Internal item reaching a tenantThree layers: separate store, no tool on tenant turns, a send check. Plus the planted-leak test. No prompt rule carries weight.
Leaks through derived things (summaries, counts, links)Derived things inherit the most restricted audience of their inputs (GBrain's lesson).
Staff replies becoming Public (today's teaching capture)Person- and lease-specific replies become Internal items; publishing stays an explicit act.
Acting on a misheard or half-made decisionQuote required; questions and what-ifs skipped; scope must match exactly one record; recap to attendees; hold and ask when unsure.
Fair housingA reason resting on a protected class never becomes an action. That screen is code, not a prompt instruction.
Colorado non-renewal lawNot renewing needs cause (HB 24-1098). The statute floor already computed on every renewal stays in charge; "don't renew" holds the renewal for the team rather than sending a notice.
Rent advice across clientsIncreases come from each client's own team; nothing is pooled across companies.
One company's items reaching anotherA P0 leak. Prevented by the company wall in storage and at the edge, not by instructions to the model.
Someone emailing Clara's mailbox to plant itemsOnly active staff senders of that company can write; items are data, never instructions; effects come from a fixed list and rent stays within policy.
Stale itemsDefault lifetimes; superseded items kept for audit but never read as active.
Recording consentSome states require everyone's consent. Clara says she is taking notes when she joins. Meetings with outsiders are out of scope in v1.
Sliding back into a review queueThe recap is meeting notes, not an inbox. No buttons.
What exists today (engineering detail)

Read from propflowai origin/main at 3887385435 and 6ed1cbe8cf, 2026-10-02. The wall's code locations are in section 5.

PieceTodayBrain impact
Company knowledgeOrg-node settings knowledge.section.<id>, composed with the property's sections (property wins by title) through loadOrgKnowledgeSectionsSafe into the leasing knowledge block every turn.Public, read through the item contract.
Building factsPropertyKnowledge.pricingDetails rendered by property-knowledge-block.ts.Public, unchanged.
Listings and availabilityAppFolio vacancy report by id; listing price for prospects.Public, unchanged.
Renewal rulesRenewalPolicy rows per property, append-only: thresholds (maxBalanceMonths 2.0, maxLatePayments 2, lateGraceDays 10 by default) and facts (rent strategy, term options, month-to-month premium).Items override offer facts per lease and cycle; thresholds untouched.
Renewal decisionevaluateRenewalPolicy: pure, two gates, AUTO_RENEW or HITL_REVIEW. Colorado statute floor computed alongside.Engine stays pure. Effects become inputs: "hold" maps to held_review; "renew anyway" is an explicit input with its item id, recorded on the verdict.
Renewal workflow (Temporal)Pins {organizationId, propertyId} at start; declared check points pre_first_contact and at_offer_acceptance.The first slice reads at pre_first_contact.
Notes on leasesNo notes field on Tenant, Lease, Renewal, RenewalSaga or RenewalSnapshot.Lease-scoped Internal items fill this.
AppFolio guest-card notesImported as internal conversation rows; filtered out of Clara's context by isInternalAudienceRow.A later connector: imported as Internal items.
Tavus end of call/api/video-clara/calls/ended treats application.transcription_ready as an end signal only; the body is never stored.With the setting on, keep the transcript as evidence under the call's company.
Ask Clara and the staff text deskDashboard chat tools scoped by org and property; staff desk tools gated by deskGranted.Both get get_internal_context.

Proposed storage, for review: PK = ORGINT#<orgId>, SK = ITEM#<scopeLevel>#<scopeId>#<validFrom>#<itemId>, plus a lookup by (orgId, scopeId). The audience attribute leaves room for a reserved Private value keyed by person id; not built. Raw evidence in S3 under a company prefix, referenced by id from each item.

PropFlow Docs