AgentKits

Tenant Inquiry Response Agent

Production Blueprint
0New

Includes Agent Blueprint + Implementation Guide

An agent that answers prospective and current tenant inquiries about a property — availability, rent, amenities, policies — using only your listing data, and drafts responses for review. It is built defensively and is Fair Housing-aware: it answers only from the provided listing, never fabricates details, follows Fair Housing rules (no steering, no discriminatory language, criteria applied equally), drafts rather than commits (no lease signing or application approvals), escalates maintenance emergencies and legal or application decisions to a human, and never makes guarantees.

real-estateproperty-managementleasingtenantfair-housingautonomous-agentrentalsinquiriesagentazagent-governancetrust-levelproduction-readiness
StackClaude, LangGraph, OpenAI
DifficultyAdvanced
Setup45 min
Version2.0.0 · 2026-06-21

Overview

Answers tenant inquiries about a property from your listing data.

Fair Housing-aware: no steering, no discriminatory language, criteria applied equally.

Drafts responses for review and never commits, signs leases, or approves applications.

Defensive: never fabricates listing details and escalates emergencies and decisions to a human.

AgentAz™ specification

A lightweight, design-time governance spec for security review. It documents what this agent is authorized to do — and why — and pairs with whatever policy engine you already run. It does not enforce anything at runtime.

Trust Level ?A2 — Recommend
DNA PatternEscalation (Research → Evaluate → Plan → Escalate)
Worst-Case ActionDrafts a wrong answer to a tenant inquiry, caught before a human sends. It answers only from the listing and policy, stays Fair Housing compliant, escalates emergencies and legal matters, and cannot send or take account actions — those tools are absent from its registry.
Authority BoundaryAnswers prospective- and current-tenant inquiries from the listing and provided policy, in Fair-Housing-compliant language, and drafts replies for a human to send. It escalates emergencies, maintenance, and legal or discrimination-sensitive matters to a human. It never sends, makes commitments, or takes account actions.
Verification TestSend an emergency or Fair-Housing-sensitive inquiry → confirm it escalates to a human rather than answering; confirm no send/account-action tool exists.
Production Readiness6/6 dimensions passing. Tool isolation: send/account-action tools absent. Human gates: a human sends and acts. Confidence escalation: emergencies and sensitive matters escalated immediately. Cost ceiling: bounded per inquiry. Audit trail: drafts and routing logged. Escalation path: emergencies/legal routed to property management.
Last Reviewed2026-06-24

Machine-readable contract (agentaz.json), validated against the open AgentAz™ JSON Schema — bundled for offline use and published at a permanent URL:

agentaz.json
{
  "$schema": "./agentaz.schema.json",
  "version": "2.0.0",
  "last_reviewed": "2026-06-24",
  "agent_id": "tenant-inquiry-agent",
  "trust_level": "A2",
  "dna_pattern": "Escalation",
  "worst_case_action": "Drafts a wrong tenant reply, caught before send. Escalates emergencies; cannot send or commit.",
  "authority_boundary": "Answers tenant inquiries from listing/policy in Fair-Housing-compliant language; send/account tools absent.",
  "tags": [
    "real-estate",
    "tenant-support",
    "fair-housing",
    "read-only",
    "human-review"
  ],
  "tool_boundary": {
    "allowed_tools": [
      "read_listing",
      "read_policy",
      "draft_reply",
      "check_fair_housing",
      "route"
    ],
    "execution_tools_absent": true
  },
  "output_boundary": {
    "format": "structured_json",
    "never_emits": [
      "send",
      "commitment",
      "account_action"
    ],
    "fair_housing_compliant": true
  },
  "cost_boundary": {
    "max_usd_per_trace_loop": 0.2,
    "alert_threshold_usd": 0.14
  },
  "loop_boundary": {
    "max_reasoning_turns": 8
  },
  "human_handoff": {
    "triggers": [
      "emergency",
      "maintenance",
      "legal_or_discrimination_sensitive"
    ],
    "destination": "property_manager"
  },
  "audit": {
    "append_only": true,
    "logs": [
      "drafts",
      "routing"
    ]
  }
}

New to this? Read the AgentAz specification guide — Trust Levels, DNA patterns, and how it complements your runtime.

AgentAz™ is open source under Apache-2.0 — schema (frozen v1.0.0) and source on GitHub.

Governance matrix

A scannable summary of this blueprint's governance coverage, derived from its AgentAz™ specification. It documents the boundaries that already ship — not new functionality.

Agent goalBounded by the authority spec above
Trust LevelA2 — Recommend
Tool accessLeast privilege — execution tools absent (read-only)
Context handlingGrounded in provided inputs; cites or flags rather than guessing
Memory strategyTask-scoped; no persistent cross-session memory
Human approvalRequired on emergency, maintenance, legal or discrimination sensitive → property manager
Audit trailAppend-only log (drafts, routing)
Cost & loop bounds≤ $0.2 per loop · ≤ 8 reasoning turns
Recovery / escalationEscalates to property manager

Agent component mapping

A framework-neutral view of how this blueprint maps to standard agent-architecture components (the vocabulary common to ADK-style frameworks). It describes structure for clarity — not an official integration or certified compatibility.

AgentPrimary reasoner — Recommend authority (A2)
Toolsread listing, read policy, draft reply, check fair housing, route — execution tools absent (read-only)
MemoryTask-scoped working context; no persistent cross-session memory
GuardrailsWorst-case classified (A2); no execution tools; ≤ $0.2/loop · ≤ 8 turns
EvaluatorConfidence and authority-boundary checks; low-confidence or out-of-bounds results are flagged, not actioned
HandoffEscalates to property manager on emergency, maintenance, legal or discrimination sensitive

Failure modes

Specific ways this blueprint can fail, and how it is designed to detect, contain, and recover from each — the boundaries that make it safe to run, stated plainly.

Drafts a reply with discriminatory or steering language (a Fair Housing violation).

Detection
A Fair-Housing language check runs and risky phrasing is flagged.
Mitigation
It answers from the listing and policy in compliant language; a human sends.
Recovery
The human reviews and corrects before sending.

Fails to escalate an emergency or maintenance hazard.

Detection
Emergency and maintenance signals trigger immediate escalation.
Mitigation
Emergencies are always routed to property management, never auto-handled.
Recovery
A human responds from the escalation queue.

Makes a commitment about rent, availability, or terms it isn't authorized to make.

Detection
Commitment and terms language is flagged and there are no account-action tools.
Mitigation
It never commits terms or takes account actions.
Recovery
The human decides on any commitment.

Evaluation

Fair-Housing compliance of drafts plus emergency-escalation recall are primary — a discriminatory reply or a missed emergency is the failure.

Fair-Housing complianceShare of drafts free of discriminatory or steering language, per reviewer audit.
Emergency recallOf emergency or maintenance inquiries, the share correctly escalated.
GroundednessShare of replies supported by the listing and policy, with no invented terms.
Commitment-leak rateFrequency of unauthorized commitments on rent or terms — should be near zero.
LatencyTime to a drafted reply.

Recommended approach. Have reviewers audit drafts against Fair-Housing guidelines on a labeled inquiry set; measure compliance and emergency-escalation recall, and include term-commitment traps. Verify a human sends.

When to use

Use it when

  • You field many tenant inquiries and want fast, consistent, listing-grounded replies.
  • You want Fair Housing-aware responses with equal treatment.
  • You want drafts for review, with commitments and decisions kept human.
  • You want maintenance emergencies and disputes escalated.

Avoid it when

  • You want it to approve applications or sign leases — it won't commit.
  • You have no listing data for it to answer from.
  • You can't review drafts or handle escalated emergencies.
  • You expect it to make tenant-screening decisions (those stay human).

System prompt

system-prompt.md
You are a Tenant Inquiry Response Agent for property management. You answer tenant inquiries from the PROVIDED listing data and draft replies for review. You must follow Fair Housing rules. You are judged on accurate, equal, listing-grounded replies and on never fabricating details, violating Fair Housing, committing, or mishandling emergencies.

== CORE PRINCIPLES ==
1. Answer from the listing. Use only the provided listing/property data (rent, availability, amenities, policies). Never invent details. If something isn't in the listing, say so and route to the agent/landlord.
2. Fair Housing always. Treat all inquirers equally. Never steer (e.g. suggesting where someone "would fit"), never use or invite discriminatory criteria, and never base answers on protected classes (race, color, religion, sex, national origin, familial status, disability, and other protected categories). Apply criteria equally to everyone.
3. Draft, don't commit. You draft replies and provide info. You never sign leases, approve/deny applications, or make binding commitments. Decisions and emergencies go to a human.

== HARD RULES (NON-NEGOTIABLE) ==
- FAIR HOUSING: No steering, no discriminatory language, no questions or answers premised on protected classes. If an inquiry asks for steering ("is this a good area for [group]?") or about neighbor demographics, give neutral, equal, factual info only and do not engage the protected-class framing. Apply screening criteria uniformly.
- NO FABRICATION: Never invent rent, availability, amenities, pet/lease policies, or square footage. Listing-supported only; otherwise route to a human.
- NO COMMITMENTS/DECISIONS: Never approve/deny an application, sign or promise a lease, hold a unit bindingly, or quote terms not in the listing. Route decisions to a human.
- ESCALATE EMERGENCIES: Maintenance emergencies (no heat, flooding, gas, lockout, safety) -> escalate to the property manager immediately with urgency; provide safe interim guidance.
- ESCALATE LEGAL/DISPUTES: Legal questions, disputes, accommodations requests -> route to a human.

== METHOD ==
- Read the inquiry + listing. Answer factually from the listing, equally and Fair-Housing-compliant. Flag emergencies and decisions for escalation. Draft a reply; never commit.

== OUTPUT FORMAT (return ONE JSON object) ==
{
  "inquiry": "<short>",
  "answerable_from_listing": <bool>,
  "draft_reply": "<listing-grounded, neutral, equal>",
  "fair_housing_flag": { "flag": <bool>, "note": "<if steering/protected-class framing was present and how it was handled>" },
  "emergency": { "flag": <bool>, "action": "<escalation + interim guidance, or empty>" },
  "escalation": { "needed": <bool>, "to": "property_manager|leasing_agent|none", "reason": "<decision/legal/missing-info/emergency>" },
  "note": "Draft from listing data only. Fair Housing compliant. The agent does not commit, approve, or sign."
}
Never fabricate listing details. Follow Fair Housing. Never commit or approve. Escalate emergencies.
Was this useful?

Simulate run

Try the agent with a sample task. This is a frontend-only preview that shows how the kit would plan and execute — no API calls, nothing leaves your browser.

Frontend preview only — no data leaves your browser. Tip: press ⌘/Ctrl + Enter to run.

Setup guide

Install and connect listings

Install the agent and connect your listing/PM system.

shell
pipx install tenant-inquiry-agent
tenant-inquiry-agent connect --pms appfolio --listings ./listings
tenant-inquiry-agent doctor

Configure guardrails

Fair Housing, no-commitment, and emergency escalation are enforced here.

shell
cp .env.example .env
ANTHROPIC_API_KEY=sk-ant-...
FAIR_HOUSING_MODE=true
ALLOW_COMMITMENTS=false
ESCALATE_EMERGENCIES=true

Set policies & escalation

Define equal screening criteria and escalation paths.

shell
# leasing.yml
screening_criteria_applied_equally: [income_3x, credit_check, references]
emergency: { contact: property_manager, types: [no_heat, flood, gas, lockout] }

Test on inquiries

Review drafts for grounding, equality, and escalations.

shell
tenant-inquiry-agent run --inquiry ./q.txt --listing ./unit.json --explain
# prints draft + fair_housing_flag + emergency + escalation (nothing committed)

Wire into leasing

Draft replies for review; decisions/emergencies escalate.

shell
# inquiry -> listing-grounded draft -> review/send; emergency/decision -> human

Architecture

Tools required

get_inquiryReceive the tenant inquiry and context.
get_listing_dataRetrieve the provided listing/property data to answer from.
answer_from_listingDraft a factual answer grounded in the listing.
fair_housing_guardEnforce equal treatment and block steering or discriminatory framing.
flag_emergencyDetect maintenance emergencies and trigger urgent escalation.
draft_responseProduce a neutral, listing-grounded draft reply.
escalateRoute decisions, legal questions, and emergencies to a human.
no_commitment_checkEnsure no lease, approval, or binding commitment is made.

Workflow

  1. 1. Take the inquiry

    Receive the tenant inquiry and the listing data.

  2. 2. Answer from the listing

    Draft a factual answer grounded only in the provided listing.

  3. 3. Apply Fair Housing

    Keep it neutral and equal; block steering and protected-class framing.

  4. 4. No commitments

    Don't approve, sign, or make binding promises — draft only.

  5. 5. Detect emergencies

    Escalate maintenance emergencies immediately with interim guidance.

  6. 6. Escalate decisions

    Route applications, legal questions, and disputes to a human.

  7. 7. Draft the reply

    Produce the neutral, listing-grounded draft for review.

Examples

Availability & pet policy → answered from the listing

A standard inquiry the listing covers. The agent drafts a grounded, neutral reply.

Input

input
Inquiry: 'Is the 2-bed still available, and do you allow pets?' Listing: available now, cats allowed, no dogs, $1,800/mo.

Output

output
{
  "inquiry": "Availability and pet policy for the 2-bed",
  "answerable_from_listing": true,
  "draft_reply": "Thanks for your interest! The 2-bedroom is currently available at $1,800/month. Regarding pets, the unit allows cats; dogs aren't permitted at this property. Would you like to schedule a viewing?",
  "fair_housing_flag": { "flag": false, "note": "" },
  "emergency": { "flag": false, "action": "" },
  "escalation": { "needed": false, "to": "none", "reason": "" },
  "note": "Draft from listing data only. Fair Housing compliant. The agent does not commit, approve, or sign."
}

Note: Every fact (availability, rent, pet policy) comes from the listing. The reply is friendly and offers a viewing without making any binding commitment. The routine case handled cleanly.

Maintenance emergency + 'approve me now' → escalate, don't commit

An urgent maintenance issue plus a request to approve an application. The agent escalates the emergency and refuses to approve.

Input

input
Current tenant: 'There's water flooding from under the sink!' Also a prospect: 'Just approve my application now so I can move in.'

Output

output
{
  "inquiry": "Active water leak/flooding reported; separate request to approve an application immediately",
  "answerable_from_listing": false,
  "draft_reply": "I'm escalating the water leak to your property manager right now as an emergency. In the meantime, if you can safely do so, turn off the water supply valve under the sink and move belongings away from the water — help is being arranged. (For the application: it's been routed to the leasing team for review.)",
  "fair_housing_flag": { "flag": false, "note": "" },
  "emergency": { "flag": true, "action": "Escalated flooding to property manager immediately as urgent; provided safe interim guidance (shutoff valve, move items)." },
  "escalation": { "needed": true, "to": "property_manager", "reason": "Maintenance emergency (flooding) escalated urgently; application approval routed to leasing team — agent will not approve or deny." },
  "note": "Draft from listing data only. Fair Housing compliant. The agent does not commit, approve, or sign."
}

Note: Two things the agent must not handle alone: it escalates the flooding emergency immediately with safe interim guidance, and it refuses to approve the application (a screening decision that must be made by a human, applied equally). It acts fast on safety and stays out of the decision.

Steering question → neutral, equal info, Fair Housing held

An inquiry invites a discriminatory/steering answer. The agent gives neutral factual info equally and does not engage the protected-class framing.

Input

input
Inquiry: 'Is this a good building for a [religious/ethnic] family? Are there many kids and people like us here?'

Output

output
{
  "inquiry": "Asks whether the building suits a specific religious/ethnic family and about neighbor demographics",
  "answerable_from_listing": true,
  "draft_reply": "I'm happy to help you learn about the property! I can share factual details: it's a 2-bedroom at $1,800/month, with [amenities from the listing], near [public, factual info like transit/schools if in listing]. Our rental criteria are applied equally to all applicants. I'm not able to characterize neighbors or the community by background, but I'd be glad to set up a viewing so you can see the property and neighborhood yourself.",
  "fair_housing_flag": { "flag": true, "note": "Inquiry invited steering and a protected-class (religion/national origin/familial status) characterization. Handled per Fair Housing: provided neutral, equal, factual listing info; declined to characterize the community by background; noted criteria are applied equally. Did NOT steer toward or away." },
  "emergency": { "flag": false, "action": "" },
  "escalation": { "needed": false, "to": "none", "reason": "" },
  "note": "Draft from listing data only. Fair Housing compliant. The agent does not commit, approve, or sign."
}

Note: The defining defensive case — and a subtle one. The question invites steering (describing the community by religion/ethnicity, 'people like us,' how many kids). Answering that way, even 'helpfully,' is a Fair Housing violation. The agent gives neutral, factual, equal information, explicitly declines to characterize neighbors by background, notes equal criteria, and offers a viewing — flagging that it handled a steering attempt. Fair Housing compliance protects both the applicant and the business from real legal liability.

Implementation notes

  • Fair Housing is non-negotiable: block steering, discriminatory language, and protected-class framing, and apply screening criteria equally — violations carry serious legal liability for the business.
  • Answer only from the listing data and never fabricate rent, availability, amenities, or policies; route anything not in the listing to a human.
  • Never approve or deny applications, sign leases, or make binding commitments; those decisions stay with a human and must be applied uniformly.
  • Detect maintenance emergencies (flooding, no heat, gas, lockout, safety) and escalate immediately with safe interim guidance.
  • Route legal questions, disputes, and reasonable-accommodation requests to a human rather than answering them.
  • Keep replies drafts for review where appropriate, and log inquiries and escalations for accountability.
  • Keep the strong model on Fair Housing handling given how subtle and high-stakes steering can be.

Variations

Basic

Inquiry responder

Answers tenant inquiries from listing data with Fair Housing-aware, neutral replies. Draft-only.

Advanced

Compliant leasing assistant

Adds Fair Housing guards, no-commitment gating, emergency detection, and escalation of decisions and disputes.

Enterprise

Leasing operations

Adds PMS integration, multi-listing support, equal-criteria screening workflows, emergency dispatch, and compliance audit trails — humans decide.

Download the Agent Blueprint

The complete blueprint, zipped — including a runnable run.py you can execute with one API key (Anthropic or OpenAI).

Download Blueprint (.zip)
README.mdsystem-prompt.mdsetup-guide.mdtools.jsonworkflow.mdexamples.md.env.examplekit.jsonrun.pyLICENSENOTICEstarters/

Export

Generate a starter for your stack — all client-side, nothing leaves your browser.

ZIP

Starters use mock tools — swap in your integrations to deploy.

View the source on GitHub

This blueprint and the AgentAz™ specification live in the central AgentKits registry — open source under Apache-2.0 (code & schema) and CC‑BY‑4.0 (text).

Frequently asked questions