Skip to content

Add property-pro community ability - #367

Merged
uzair401 merged 10 commits into
openhome-dev:devfrom
ileana-pr:add-property-pro
Aug 31, 2026
Merged

Add property-pro community ability#367
uzair401 merged 10 commits into
openhome-dev:devfrom
ileana-pr:add-property-pro

Conversation

@ileana-pr

Copy link
Copy Markdown
Contributor

Summary

  • Add PropertyPro, a voice showing-tour guide for residential listings (Suite B).
  • Visitors say hello to walk room-by-room from a markdown listing packet, with dimensions and richer room notes.
  • Fair-housing guardrails redirect crime/school-quality/demographic questions; unanswered property facts go to tour_questions.md.
  • After a tour ends, the device stays in a lobby (“say hello to start again”) instead of handing off to the regular agent.
  • Includes three fictitious listing fixtures (Maple / Canal / Pine) plus product discovery notes.

Test plan

  • python3 validate_ability.py community/property-pro/ passes
  • Install/push ability with triggers: hello, start tour, begin tour, property pro
  • Say hello → Maple greeting + foyer beat with dimensions and detail
  • Navigate rooms (“kitchen”, “next”) and ask facts (sq ft, roof, appliances)
  • Ask “is this a safe neighborhood?” → redirect, no crime stats
  • Ask “are the schools good?” → assignment only, no ratings
  • Ask an unknown fact on a sparse listing → logged to agent question list
  • Say done → “Closing the tour…” then ask a fact → “tour is closed…” until hello again

Made with Cursor

ileana-pr and others added 2 commits August 10, 2026 22:12
Add Stage 1 product docs, fair-housing guardrails, and three fictitious
markdown listing packets so we can implement the voice tour next.

Co-authored-by: Cursor <cursoragent@cursor.com>
Implement hello-triggered room tours from markdown listing packets,
fair-housing redirects, question logging, and a lobby that keeps
visitors in PropertyPro until they say hello again.

Co-authored-by: Cursor <cursoragent@cursor.com>
@ileana-pr
ileana-pr requested a review from a team as a code owner August 21, 2026 20:59
@github-actions

Copy link
Copy Markdown
Contributor

🔀 Branch Merge Check

PR direction: add-property-prodev

Passedadd-property-prodev is a valid merge direction

@github-actions

Copy link
Copy Markdown
Contributor

✅ Community PR Path Check — Passed

All changed files are inside the community/ folder. Looks good!

@github-actions github-actions Bot added the community-ability Community-contributed ability label Aug 21, 2026
@github-actions

Copy link
Copy Markdown
Contributor

✅ Ability Validation Passed

📋 Validating: community/property-pro
  ✅ All checks passed!

@github-actions

github-actions Bot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

🔍 Lint Results

__init__.py — Empty as expected

Files linted: community/property-pro/main.py

✅ Flake8 — Passed

✅ All checks passed!

ileana-pr and others added 8 commits August 21, 2026 20:06
…vior

Align triggers, lobby flow, contact fallbacks, and feature checklist with
main.py; restore a clean community .openhome.json without local push IDs.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
- .openhome.json: the OpenHome CLI's own local tooling metadata (capability_id,
  version tracking), scaffolded by `openhome create` and committed by accident.
  Carries no ability behavior and is account/environment state, not source.
- notes/PRODUCT_DISCOVERY.md: internal design notes (sample dialogue, non-goals,
  next-slice planning). Useful during development, not part of what ships.

Kept everything the ability actually reads at runtime: main.py, fair_housing.md,
the listing fixtures, and .gitignore (which correctly excludes the ability's own
runtime-written files -- tour_questions.md, propertypro_prefs.json,
knowledge_gaps.json -- from being committed).

Updated README.md's project-layout tree and removed a link to the deleted notes
file so nothing dangles.
…atch()

- .gitignore removed: none of the three files it listed were ever committed
  (confirmed via git ls-files), so there was nothing for it to protect.

- HOTWORDS was checked with plain substring matching ("hw in t"), and "hi" is a
  substring of ordinary words -- "this", "which", etc. A visitor mid-tour asking
  "is this room big?" hit _is_restart() and got reset to the foyer greeting
  instead of an answer. Replaced with a word-boundary regex, same style as the
  EXIT_PATTERN already in this file.

- Removed does_match(): it duplicated trigger words in code that belong to the
  dashboard config, a second source of truth that can drift from the first with
  no ability to notice. RESTART_PATTERN stays, since that check happens entirely
  inside the ability's own conversation loop (deciding whether an utterance means
  restart vs. real question) and the dashboard has no way to make that call.

Verified: previously-false-positive inputs ("is this room big?", "which room has
the fireplace") no longer trigger a restart; real restart phrases (hello, hi,
start tour, property pro, showing tour) still do.
…kground)

Stale files removed:
- fixtures/listings/88-canal-loft-richmond.md and 7-pine-sparse-chesterfield.md --
  neither is reachable through the running ability. active_listing_id is set once
  from propertypro_prefs.json and there is no voice command anywhere in main.py
  that changes it, so these only ever loaded if someone hand-edited that file.
- fixtures/LISTINGS.md -- an index of the three fixtures above, zero references
  from main.py, and now stale (documents two files that no longer exist).
README updated to match: dropped the two rows and the dead LISTINGS.md link,
corrected the "switch fixtures" instructions to say plainly that no voice
command does this yet, removed the tree entry.

Bug fixed while reading through main.py for anything left behind: _match_room_nav
checked "back"/"next" as plain substrings, the same class of bug as the
does_match() HOTWORDS issue fixed last commit. Concretely, on the one listing
that ships, the tour's actual last room is named "backyard" -- asking "is there
a backyard?" from the basement matched "back" and navigated to upstairs instead
of the backyard. Fixed with word-boundary patterns (NEXT_ROOM_PATTERN /
BACK_ROOM_PATTERN), matching EXIT_PATTERN's existing style in the same file.
"next" keeps one residual, harder-to-avoid ambiguity (it's also a preposition --
"next to", "next door"), noted in the code comment rather than silently left.

Verified against the real shipped listing: navigating to backyard now resolves
correctly (index 6), the restart-phrase fix from the prior commit is intact, and
main.py still parses and imports cleanly.

@uzair401 uzair401 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Solid ability, the fair-housing guardrails are handled well. Trimmed unused fixture/notes files, removed the does_match() duplication, and fixed two substring-matching bugs (_is_restart and room navigation) that misfired on ordinary words like "this" and "backyard". Approving.

@uzair401
uzair401 merged commit 619b78d into openhome-dev:dev Aug 31, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

community-ability Community-contributed ability

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants