← Choice Health 2026-07-08-replicant-property-menu-operations.md raw .md

Replicant Property Menu Operations

Date: 2026-07-08

Status: implemented in RIFF pack/compiler/runtime; Replicant receiver endpoints must be available at REPLICANT_API_BASE.

Related:

What changed

The property_management voice menu now opens on a front-desk menu instead of sending every caller straight into the maintenance category intake:

The start-maintenance path opens the repair category submenu:

The existing-request path is generated from packs/property_management.pack.yaml with a first-class replicant_ticket_ops capability, so regenerated flows keep the behavior. The generated states support:

After a caller selects an existing ticket, the action menu is scoped to the selected request title, for example "For leaky sink, what would you like to do?" The selected-ticket menu does not include "start a new request"; new issue creation remains top-level option 1 and still uses the generated maintenance category intake and create endpoint.

There is no /riff/tickets/create alias.

Replicant receiver contract

RIFF calls Replicant through signed POST requests under REPLICANT_API_BASE. Aman's side needs to expose or implement the signed receiver for:

These use the same HMAC headers as identify/create:

operation_id is included only on mutations:

Read calls do not send operation_id.

Source of truth

Replicant is the source of truth for ticket access, status, lease authorization, and ticket mutation semantics.

RIFF local state is only for:

RIFF must not grant ticket access from a local DB or phone-to-unit match. The authorization set is enforced by Replicant: original submitter plus primary tenant and LeaseTenant co-signers on the active lease for the ticket unit. If the phone matches a unit but no active lease record authorizes the caller, Replicant returns pending_reviews instead of ticket access.

Safe read fields

The status path reads only tenant-safe fields returned by Replicant:

Money fields stay excluded: estimates, quotes, invoices, balances, and vendor phone numbers.

Mutation behavior

Updates never overwrite ticket title or description after creation. The voice path sends only an updates object containing tenant_update_text for the spoken tenant note.

Cancel/resolved behavior is Replicant-owned:

RIFF queues timeout, config, and 5xx update/cancel failures to the Replicant ticket spool. Durable retries use an idempotency key based on call_sid|operation_id.

M3 and M1 rollout

M3 is the candidate/latest-code node. M1 is the stable/fallback node.

Practical behavior:

If a caller is routed to M3 after this ships, they can use the existing-request path. If a caller is routed to M1 before promotion, they will not see the new menu yet.

Verification

Focused verification for this implementation:

The property DID must be attached to a 10DLC campaign before keyed builds pass the SMS deliverability gate. On 2026-07-08, +15102160079 was attached to the same Telnyx campaign used by the other RIFF SMS-capable numbers and the Telnyx assignment reached ASSIGNED (att=ADDED, tmobile=ADDED at verification time).