@velinussage/locus-agent-skill 0.1.41 → 0.1.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/package.json +4 -2
- package/skill/locus-agent-tools/SKILL.md +112 -33
- package/skill/locus-aging-owner/SKILL.md +4 -3
- package/skill/locus-escrow-shock/SKILL.md +19 -2
- package/skill/locus-home-watch/SKILL.md +15 -10
- package/skill/locus-inherited-home/SKILL.md +4 -1
- package/skill/locus-insurance-nonrenewal/SKILL.md +26 -2
- package/skill/locus-payment-hardship/SKILL.md +2 -2
- package/skill/locus-property-tax-protest/SKILL.md +6 -0
- package/skill/locus-seller-readiness/SKILL.md +21 -5
- package/skill/locus-water-incident/SKILL.md +15 -10
package/README.md
CHANGED
|
@@ -74,7 +74,7 @@ npx skills use velinussage/locus-agent-skill --skill locus-agent-tools
|
|
|
74
74
|
- The property-tax protest workflow keeps deadline, filing-guide, evidence, browser handoff, and published-outcome facts separate from the owner's own filing and value position.
|
|
75
75
|
- The home-watch workflow sets up deadline and change events for an address or a signed-in pool, reads an empty poll as "nothing new seen", and offers each paid next step only with the owner's approval.
|
|
76
76
|
- The water-incident workflow keeps what failed, who maintains each pipe segment, and the resulting damage or bill separate, and gives insurer questions without a coverage verdict.
|
|
77
|
-
- Paid endpoints use live x402 discovery
|
|
77
|
+
- Paid endpoints use live x402 and MPP discovery: x402 may offer USDC on Base and Solana (`accepts[]`), and MPP offers `USDC.e` (`0x20C000000000000000000000b9537d11c60E8b50`) on Tempo mainnet (`eip155:4217`, `chainId: 4217`) via `WWW-Authenticate: Payment`, all requiring explicit user authorization. Agents choose one complete offer (for example `-p x402 --payment-network base` or `-p mpp --payment-network tempo`).
|
|
78
78
|
- The surrounding-area workflow requires two separate approvals: $0.10 for the reusable JSON packet, then $0.15 for an eligible HTML/PDF report within 24 hours. Packet and report retrieval are proof-gated for 90 days.
|
|
79
79
|
|
|
80
80
|
Docs: <https://docs.locus.report/skill.md>
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@velinussage/locus-agent-skill",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "Install the general Locus agent skill, the surrounding-area purchase workflow, and the property-tax protest workflow for free and
|
|
3
|
+
"version": "0.1.44",
|
|
4
|
+
"description": "Install the general Locus agent skill, the surrounding-area purchase workflow, and the property-tax protest workflow for free, x402-paid, and MPP/Tempo-paid property context.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"locus-agent-skill": "bin/locus-agent-skill.js"
|
|
@@ -27,6 +27,8 @@
|
|
|
27
27
|
"locus",
|
|
28
28
|
"mcp",
|
|
29
29
|
"x402",
|
|
30
|
+
"mpp",
|
|
31
|
+
"tempo",
|
|
30
32
|
"skills",
|
|
31
33
|
"skills.sh",
|
|
32
34
|
"real-estate",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: locus-agent-tools
|
|
3
3
|
preamble-tier: 1
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.69.0
|
|
5
5
|
description: Use for cited US place records, including parcels, zoning, permits, meetings, budgets, audits, county data series, changes over time, and setting up dynamic MCP event polling or signed webhooks.
|
|
6
6
|
triggers:
|
|
7
7
|
- property due diligence
|
|
@@ -33,12 +33,12 @@ triggers:
|
|
|
33
33
|
- real estate webhook notifications
|
|
34
34
|
allowed-tools: Bash Read AskUserQuestion
|
|
35
35
|
license: MIT
|
|
36
|
-
contentHash:
|
|
36
|
+
contentHash: 5982e0aebc33
|
|
37
37
|
---
|
|
38
38
|
|
|
39
39
|
# Locus Agent Capabilities
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
This skill is a guide to answering the user's question with Locus, not instructions for running their assistant. It is prescriptive about what Locus records mean and how the API works, and conditional about when to call each tool. The fuller client guide is [`docs/AGENT_CAPABILITIES.md`](https://github.com/velinussage/locus/blob/main/docs/AGENT_CAPABILITIES.md).
|
|
42
42
|
|
|
43
43
|
Locus returns awareness and verification steps, not a verdict. Do not score, rank, predict, screen, value, or label a person, property, block, or neighborhood as safe/unsafe.
|
|
44
44
|
|
|
@@ -48,27 +48,29 @@ On first use in each session, fetch `https://api.locus.report/.well-known/skill.
|
|
|
48
48
|
|
|
49
49
|
## Start with Locus, not a portal scrape
|
|
50
50
|
|
|
51
|
-
-
|
|
52
|
-
- Looking is free. Paying happens only after
|
|
51
|
+
- When the question is broad or the right local lane is unclear for a US address or place, call `locus_lane_availability` or `locus_suggest_workflow` first. When the user asks a specific question that maps to one known free tool (such as a water service-line check, a contractor license number, or a state statutory pointer), call that smallest free tool directly; a water-line question should not trigger the same workflow as a tax notice.
|
|
52
|
+
- Looking is free. Paying happens only after a live x402 or MPP (Tempo) challenge the user authorized.
|
|
53
53
|
- Do not buy a generic scrape of FEMA, EPA ECHO/SDWIS/TRI, USGS, HUD, FCC, county GIS, or assessor sites Locus already wraps with provenance. Still follow the official source link Locus returned when you need to verify.
|
|
54
54
|
- **Multi-home comparison:** when the job is two or three finalist addresses, read the dedicated workflow skill at `https://api.locus.report/.well-known/skills/compare-homes/v1.md`. Successful `locus_lane_availability` responses may include optional `skillContinuation` metadata pointing there when report compose rollout is enabled.
|
|
55
55
|
- **Paid buyer bundle:** for a three-home RentCast matrix with work items, use `locus-three-property-buyer-comparison` after user approval; its paid response may also include the same continuation metadata when compose is enabled.
|
|
56
56
|
|
|
57
57
|
## Choose the property decision first
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
Each recipe below matches a user decision to its minimum inputs, smallest useful free call, coverage limits, what the result establishes, completeness and stop conditions, and the optional paid addition (always presented as an offer, never an instruction to spend). Skip unrelated lanes; use the live catalog for current names and schemas.
|
|
60
60
|
|
|
61
|
-
| Decision |
|
|
62
|
-
|
|
63
|
-
|
|
|
64
|
-
|
|
|
65
|
-
|
|
|
66
|
-
|
|
|
67
|
-
|
|
|
68
|
-
|
|
|
69
|
-
|
|
|
61
|
+
| Decision / question | Minimum inputs | Smallest useful free call | Coverage limits & what the result establishes | Completeness & stop conditions | Optional paid addition (offer only) |
|
|
62
|
+
|---|---|---|---|---|---|
|
|
63
|
+
| Water service-line material or water incident | Complete CA street address (with unit, city, state, ZIP) or US address / PWSID | `locus_service_line_material` (CA address) or `locus_water_systems` + `locus_water_utility_leak_adjustment_rules` | CA address inventory is opt-in and covers `~34%` of published statewide rows with complete indexable street addresses; `locus_water_systems` gives system-wide EPA SDWIS counts (not this parcel). Establishes utility-reported pipe classification or published leak rules as of the snapshot date, not a physical inspection or liability ruling. | `found`: report system-owned and customer-owned materials separately (`unknown` stays unknown; stop if that answers the question). `source_unavailable` with `incomplete_source_rows` ("this address isn't indexed"): do **not** treat as non-lead; direct the user to ask the utility for its inventory entry. `no_matching_record`: indexed system had no match for this address (still not non-lead). | None for pipe material; for broader site environmental context, offer `locus-environmental-context` ($0.05) only if the user asks. |
|
|
64
|
+
| Revaluation notice, tax bill, or owning costs | Address or county + state (plus `noticeDate` if appealing) | `locus_tax_calendar` and `locus_appeal_filing_guide`; add `locus_appeal_window` when `noticeDate` is known | Covers all 50 states + DC for statutory framing and official county pointers; `locus_property_tax_estimate` is wired in supported tax-rate jurisdictions. Establishes statutory deadlines, filing body, and adopted rate components, not whether to appeal. | Stop after returning the deadline, filing steps, and free `locus_owner_programs` exemptions if that answers the user's question. If `matched: false` on `locus_appeal_window`, stop deadline arithmetic and hand off to the county pointer in `locus_tax_calendar`. | Offer `locus-assessment-position` ($0.10, `charge_free_unless_substantive` on 5+ same-roll peers), `locus-owner-action-brief` ($0.05), or `locus-owner-cost-review` ($0.25) if the user wants roll uniformity or recorded tax history. |
|
|
65
|
+
| Mortgage or property-tax payment hardship | Address, point, or 2-letter state | `locus_housing_counselors` (mortgage/general) and `locus_foreclosure_process_pointers` (state) | National HUD directory lookup; 50-state + DC foreclosure pointer registry (`verified` in checked states, `not_verified` portal-only elsewhere). Establishes nearby directory agencies (`sourceStatusCode` is raw HUD `agc_STATUS`, not verified current approval) and state process pointers, not a sale countdown or legal advice. | If `no_agencies_in_radius`, widen the bounded search or give HUD's directory URL. If `locus_foreclosure_process_pointers` is `not_verified`, stop at the official court/housing portal and state that no statute was verified. Never invent a deadline when none is supplied. | None. Keep hardship routing free. |
|
|
66
|
+
| Homeowners insurance nonrenewal or escrow shock | 2-letter state or address (plus notice/end dates or escrow letter figures) | `locus_insurance_nonrenewal_pointers` (nonrenewal) or `locus_homeowners_insurance_context` + `locus_owner_mortgage_calendar` (escrow) | 50-state + DC department portals (`verified` notice rules in 10 states; `complaintStatus: "verified"` where a direct complaint URL is checked, `"unresolved"` where portal-only). `fioZip` is 2018-2022 historical area context, not a quote or current rate. | If `notice.status: "not_verified"`, stop rule comparison and point to the state regulator portal. If `complaintStatus: "unresolved"`, state that the direct complaint handoff is unresolved and give `portalUrl`. For escrow shock without the servicer's letter, stop arithmetic until the user has the letter's figures. | Offer `locus-escrow-insurance-dossier` ($0.89), `locus-assessment-position` ($0.10), or `locus-property-tax` ($0.05). Responses also attach caller-paid x402 `handoffs[]`: `insurance_market.querylines` ($0.10 state NAIC carrier market share / SERFF rate activity) and, on `locus_mitigation_incentives`, `trade_contractors.locationlists` ($0.02 nearby certified roofers/installers). |
|
|
67
|
+
| Inherited home or estate property pointers | 2-letter state or city + state / address | `locus_estate_property_pointers` (state rules) and `locus_tax_payment_status` / `locus_tax_calendar` (what is due) | 50-state + DC registry (`verified` in 34 jurisdictions, `not_verified` court portal elsewhere) plus ULC enactment tables (UPHPA, UPOAA, URPTODA). `smallEstate.thresholdScope: "non_exhaustive_excerpt"` marks statutory dollar excerpts that may have conditional branches (such as Ohio's `$35,000` general and `$100,000` surviving-spouse branches). | Treat `thresholdText` as a non-exhaustive excerpt and read the linked statute before ruling an estate in or out. If `transferOnDeathDeed` or `smallEstate` is `not_verified`, stop statutory claims and give the court self-help portal. If `locus_tax_payment_status` is `out_of_coverage` or `unavailable`, report that gap rather than "nothing due." | None required; if preparing to list the property later, see `locus-seller-readiness`. |
|
|
68
|
+
| Contractor license check before hiring | 2-letter `state` and exact `licenseNumber` (or coordinates/ZIP for partner directory discovery first) | `locus_contractor_license_check` | Currently wired in Washington (WA L&I roster). Returns published license status, type, effective/expiration dates, and citation without person names or addresses. | `found`: report the published status and dates. `no_matching_record`: stop and tell the user to verify spelling/number on the state board portal (a miss is not proof of being unlicensed). `out_of_coverage` or `source_unavailable`: report the coverage or snapshot gap and stop. | None in Locus. When the user first needs nearby trade leads, `locus_mitigation_incentives` and `locus_permit_rules` attach the caller-paid `trade_contractors.locationlists` x402 handoff ($0.02 at `POST https://locationlists.com/api/x402/query`); always verify state licensure next via `locus_contractor_license_check` or the state board. |
|
|
69
|
+
| Buying a property | Exact street address | `locus_lane_availability`, then `locus_place_facts`, `locus_zoning`, `locus_flood_zone`, `locus_parcel_transfers`, `locus_development_cases` | National hazard/environmental lanes cover all 50 states; parcel, zoning, permit, and transfer depth depend on wired county sources. Establishes recorded parcel attributes, district rules, and nearby filings without picking a winner or valuing the home. | Stop on any lane marked `notCovered` in `locus_lane_availability` and name the gap. If parcel identity is unresolved, confirm the house number before interpreting parcel or permit rows. | Offer `locus-before-you-sign` ($0.07), `locus-property-update` ($0.10), or `locus-place-report` ($0.05) as priced options with what each adds. |
|
|
70
|
+
| Renting or checking rental registration | Exact building address | `locus_rental_registration_check`, `locus_flood_zone`, `locus_area_incidents` | Registration is wired in Minneapolis, Montgomery County, NYC, Seattle (long-term), Denver (STR license), and Kansas City (building enforcement only). | Read `recordScope` first: in Kansas City, stop before claiming whether a rental registration exists. A `no_matching_record` is not proof of legal permission or non-compliance. | Offer `locus-local-trend-brief` ($0.05) or `locus-rental-operations-brief` ($0.79) only if the user asks for trend or rent-median comparison. |
|
|
71
|
+
| Leasing, lending, or commercial CMBS diligence | Exact commercial address (or county FIPS for maturity wall) | `locus_parcel_lookup`, `locus_zoning`, `locus_metro_permits`, `locus_development_cases` | Public CMBS filings cover SEC ABS-EE conduit/SASB trusts, not bank balance-sheet or agency loans. | If a CMBS or workplace lookup returns `no_matching_record`, `not_loaded`, or `out_of_coverage`, stop and report that public SEC filings did not match (never "no debt exists"). | Offer `locus-cmbs-loan-context` ($0.10), `locus-cmbs-maturity-wall` ($0.10), or `locus-workplace-employment-context` ($0.01) with exact price and scope. |
|
|
70
72
|
|
|
71
|
-
The detailed tables below are a
|
|
73
|
+
The detailed tables below are a reference lookup by question, not a checklist to run on every turn.
|
|
72
74
|
|
|
73
75
|
## Preview, Brief, and Same-data-paid
|
|
74
76
|
|
|
@@ -123,13 +125,19 @@ A2A and REST discovery:
|
|
|
123
125
|
- [MCP catalog](https://mcp.locus.report/catalog) - searchable tool catalog.
|
|
124
126
|
- [API base](https://api.locus.report) - health and discovery links.
|
|
125
127
|
|
|
126
|
-
Buyers do not need a Locus or Coinbase Developer Platform account API key. Free tools are open. Paid tools return a live x402 or advertised MPP challenge. `PAYMENT-SIGNATURE`
|
|
128
|
+
Buyers do not need a Locus or Coinbase Developer Platform account API key. Free tools are open. Paid tools return a live x402 or advertised MPP challenge. `PAYMENT-SIGNATURE` (x402) and `Authorization: Payment` (MPP) are signed payment credentials, not account API keys.
|
|
127
129
|
|
|
128
130
|
### Fastest paid setup with AgentCash
|
|
129
131
|
|
|
130
132
|
The whole free catalog runs without any of this. Get a wallet when you choose to call a paid route.
|
|
131
133
|
|
|
132
|
-
|
|
134
|
+
The live HTTP 402 payment challenge on native and dual-rail REST endpoints offers two payment protocols side by side:
|
|
135
|
+
|
|
136
|
+
- **x402 (`PAYMENT-REQUIRED` / JSON `accepts[]`):** **Base USDC** (`eip155:8453`, `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913`) and **Solana USDC** (`solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp`).
|
|
137
|
+
- **MPP (`WWW-Authenticate: Payment ..., method="tempo", intent="charge"`):** **Tempo mainnet USDC.e** (`eip155:4217`, `chainId: 4217`, currency `0x20C000000000000000000000b9537d11c60E8b50`), a separate payment protocol. Base is not required when your wallet holds Tempo mainnet `USDC.e` and can answer the MPP Tempo challenge.
|
|
138
|
+
- **Stripe MPP (`WWW-Authenticate: Payment ..., method="stripe", intent="charge"`, `>= $0.50` deliverables on REST):** advertised alongside Tempo on MPP-enabled REST deliverables priced at or above Stripe's `$0.50` card minimum (`locus-property-tax-protest-packet` at `$0.89`, `locus-before-you-sign-dossier` at `$1.19`, `locus-escrow-insurance-dossier` at `$0.89`, and `locus-seller-readiness-packet` at `$0.85`) when Stripe MPP is configured. Link CLI / Stripe Shared Payment Token (`spt_...`) callers can settle these bundled JSON + printable HTML/PDF packets in a single challenge while sub-`$0.50` MPP-enabled tools (`$0.01-$0.49`) offer Tempo MPP and Base/Solana x402. MPP challenges (`tempo` and `stripe`) are served on direct HTTP REST (`POST /api/<tool-slug>`); MCP paid execution uses x402 (`_meta["x402/payment"]`).
|
|
139
|
+
|
|
140
|
+
AgentCash is one compatible x402 and MPP client. It creates a local payer wallet and can install its MCP server into common agent clients. Locus issues no buyer API key.
|
|
133
141
|
|
|
134
142
|
```bash
|
|
135
143
|
npx agentcash@latest onboard
|
|
@@ -148,15 +156,23 @@ npx agentcash@latest discover https://api.locus.report
|
|
|
148
156
|
npx agentcash@latest check https://api.locus.report/api/locus-flood-zone
|
|
149
157
|
```
|
|
150
158
|
|
|
151
|
-
`check` returns request and response schema plus pricing before any payment. Then call it
|
|
159
|
+
`check` returns request and response schema plus pricing before any payment. Then call it on either **Base (x402)** or **Tempo (MPP)**, capping the amount:
|
|
152
160
|
|
|
153
161
|
```bash
|
|
162
|
+
# Base USDC over x402:
|
|
154
163
|
npx agentcash@latest fetch https://api.locus.report/api/locus-flood-zone \
|
|
155
164
|
-m POST -p x402 --payment-network base --max-amount 0.01 \
|
|
156
165
|
-b '{"address":"1 E Edenton St, Raleigh, NC 27601"}'
|
|
166
|
+
|
|
167
|
+
# Tempo mainnet USDC.e over MPP (separate protocol; no Base wallet required):
|
|
168
|
+
npx agentcash@latest fetch https://api.locus.report/api/locus-flood-zone \
|
|
169
|
+
-m POST -p mpp --payment-network tempo --max-amount 0.01 \
|
|
170
|
+
-b '{"address":"1 E Edenton St, Raleigh, NC 27601"}'
|
|
157
171
|
```
|
|
158
172
|
|
|
159
|
-
`fetch` handles paid and SIWX routes alike and pays only when the route still demands payment. Hold the same `--payment-network` across every call in one workflow. Force x402 with `-p x402` when an endpoint advertises
|
|
173
|
+
`fetch` handles paid and SIWX routes alike and pays only when the route still demands payment. Hold the same `-p` and `--payment-network` across every call in one workflow (`-p x402 --payment-network base`, `-p x402 --payment-network solana`, or `-p mpp --payment-network tempo`). Force x402 with `-p x402` or MPP with `-p mpp` when an endpoint advertises both protocols. Full command reference: [agentcash docs](https://www.npmjs.com/package/agentcash).
|
|
174
|
+
|
|
175
|
+
**Wallet compatibility vs. verified settlement on Tempo:** Locus already offers the Tempo payment route over MPP (`method="tempo", intent="charge"`, requesting `USDC.e` on Tempo mainnet), so x402-on-Tempo is not required. The remaining question for any custom wallet is whether it holds Tempo mainnet `USDC.e` (`0x20C000000000000000000000b9537d11c60E8b50`) and can sign the MPP Tempo challenge; inspecting the 402 challenge is a compatibility finding, whereas a completed payment test requires a settled 200 response with `Payment-Receipt` and `charged: true`.
|
|
160
176
|
|
|
161
177
|
Install the Locus skill separately with `npx @velinussage/locus-agent-skill@latest add`. Use the free Locus MCP or the `POST /api/<tool_name>` routes first.
|
|
162
178
|
|
|
@@ -166,6 +182,20 @@ For broad requests, start with the current bundles in the top-agent manifest. Fo
|
|
|
166
182
|
|
|
167
183
|
The live catalogs are authoritative for tool names, schemas, prices, and endpoints. Do not copy stale tool definitions into prompts.
|
|
168
184
|
|
|
185
|
+
### Caller-paid x402 partner handoffs (`handoffs[]`)
|
|
186
|
+
|
|
187
|
+
Selected Locus free and paid responses include an optional `handoffs[]` array of caller-paid third-party x402 endpoints that complement Locus's public-record context. Every entry carries `id`, `category`, `provider`, `endpoint`, `method`, `payment: { protocol: "x402", priceUsd, priceNote }`, `prefilledInput`, `whenToUse`, `verified`, and `disclaimer: "Locus does not call or pay this partner; prices and availability may change."`
|
|
188
|
+
|
|
189
|
+
- **State homeowners-insurance market data (`insurance_market.querylines`, `$0.10` x402 on Base):** attached to `locus_insurance_nonrenewal_pointers`, `locus_homeowners_insurance_context`, `locus-insurance-context`, and `locus-escrow-insurance-dossier` whenever a 2-letter state resolves.
|
|
190
|
+
- **Default prefilled route:** `GET https://api.querylines.com/v1/carriers?state=<ST>&line=homeowners` (`$0.10` USDC on `eip155:8453`), returning NAIC state market share, Direct Premiums Written (DPW) YoY change, and direct loss ratio for the top 10 homeowners carriers in that state.
|
|
191
|
+
- **Companion QueryLines routes (same origin `https://api.querylines.com`, read `https://querylines.com/llms.txt`):** `GET /v1/rates/activity?states=<ST>&line=homeowners&granularity=year` (`$0.10` SERFF rate filing counts, average requested vs. approved rate change, and approval disposition), `GET /v1/solvency?state=<ST>` (`$0.15` carrier RBC and leverage ratios), and `GET /v1/citizens/pif` (`$0.10` Florida Citizens policies-in-force exposure trend).
|
|
192
|
+
- **Boundary:** State-level regulatory market context only. Never treat carrier market share, loss ratios, or SERFF filing activity as a policy quote, a carrier recommendation, or a reason this specific parcel was nonrenewed.
|
|
193
|
+
- **Nearby trade-contractor directory lookup (`trade_contractors.locationlists`, `$0.02` x402 on Base):** attached to `locus_mitigation_incentives`, `locus_permit_rules`, `locus-permit-closeout-check`, `locus-renovation-site-context`, and `locus-seller-readiness-packet` when coordinates or a 5-digit ZIP resolve.
|
|
194
|
+
- **Prefilled route:** `POST https://locationlists.com/api/x402/query` (`$0.02` USDC on `eip155:8453` for `limit: 1..25`, `$0.001/record` above 25) with `prefilledInput` set to `{ "dataset": "roofing-contractor-list", "near": { "lat": <lat>, "lng": <lng>, "radius_miles": 10 }, "limit": 2 }` (or `"near": { "zip": "<ZIP5>", "radius_miles": 10 }`). Also accepts `"hvac-installer-list"` and `"solar-installer-list"`, or `"near": { "place": "City, ST", "radius_miles": 10 }`.
|
|
195
|
+
- **Client call notes:** Call `POST https://locationlists.com/api/x402/query` directly with `npx agentcash@latest fetch https://locationlists.com/api/x402/query -m POST -p x402 --payment-network base --max-amount 0.05 -b '...'`. Do **not** run `agentcash check` on LocationLists (its `/openapi.json` has an unresolved `#/components/schemas/ErrorResponse` `$ref`), and do **not** use its free `GET /api/x402/locations/find` preview (which returns unfiltered nationwide rows when `state` is omitted).
|
|
196
|
+
- **Two-step contractor verification rule:** LocationLists returns manufacturer-certified commercial directory listings (`id: "oc:..."`, business name, address, phone, website, rating, and distance), **not** state government licensing records. Always verify state contractor licensure, bond, and disciplinary status next using Locus's free `locus_contractor_license_check` (where wired, e.g., WA L&I) or the state contractor licensing board before hiring. Never pass contractor names, phone numbers, or person fields from a partner response back into Locus tools.
|
|
197
|
+
- **Other domain handoffs:** `skip_trace.batchdata` and `skip_trace.Trestle` (on `locus_tax_distress` / `locus-tax-liens`), `title_chain.FirstAmerican` (on `locus_parcel_transfers`), `environmental_phase1.EDR` (on `locus_cleanup_sites` / `locus-environmental-context`), `appraisal.HouseCanary` (on `locus-comps-brief` / `locus-valuation-challenge`), and `legal_review.RocketLawyer` (on `locus-before-you-sign` / `locus-local-policy-brief`). Always present any handoff as an optional caller-paid next step and ask for explicit user approval before spending.
|
|
198
|
+
|
|
169
199
|
## Surrounding-area orchestration route
|
|
170
200
|
|
|
171
201
|
This route is rollout-gated. Call it only when `locus-surrounding-area-analysis` appears in the live paid index at `/.well-known/ai-tool/index.json`; when absent, use the free `locus_surrounding_parcels` primitive plus the individual lanes instead of assuming the $0.10/$0.15 workflow exists.
|
|
@@ -416,6 +446,10 @@ Dual-rail routes (a paid `/api/locus-<tool>` with a free `locus_<tool>` counterp
|
|
|
416
446
|
| `POST /api/locus-landslide-diligence` | `$0.05` | Agent needs separate USGS documented inventory history and exact source-native n10 model-cell evidence. | Unless both components answer, returns `charged:false`. Never a probability, parcel stability finding, engineering assessment, or safety label. |
|
|
417
447
|
| `POST /api/locus-permit-closeout-check` | `$0.05` | Agent needs exact-subject permit status plus source-published closeout or occupancy-document evidence. Registry coverage: Raleigh, unincorporated Wake County, Durham, Austin, Seattle, Chicago, Los Angeles, and New York City. It accepts an address or up to 25 jurisdiction-scoped `parcelIds`. The coverage label is generated from the source registry. | Uncovered, uncertain, unavailable, unpublished, and no-exact-match states are charge-suppressed. Not condition, compliance, suite/use permission, or closing approval. |
|
|
418
448
|
| `POST /api/locus-transaction-follow-up` | `$0.10` | Agent needs one explicit homebuyer, land-investor, developer-predevelopment, commercial-tenant, or renovation-planning packet with cited handoffs. Prefer the dedicated `locus-renovation-site-context` route for renovation work because it fixes the profile server-side. | Profile-specific component/group thresholds control chargeability. Assessor totals never establish above-grade or finished-basement area. The result is not a feasibility, condition, drainage-design, permit-requirement, cost, or valuation conclusion. Thin evidence is charge-free. |
|
|
449
|
+
| `POST /api/locus-property-tax-protest-packet` | `$0.89` | Homeowner or representative contesting a property-tax assessment needs one shareable evidence packet (cited JSON + self-contained printable HTML/PDF) bundling same-roll assessment uniformity (`locus-assessment-position`), recorded comparable sales (`locus-comps-brief`), optional proposed-figure protest comparison (`locus-valuation-challenge`), statutory appeal deadline rules, and filing portal pointers. Eligible for Stripe MPP (`method="stripe"`), Tempo MPP (`method="tempo"`), and Base/Solana x402. | Fewer than two resolved constituent lanes return `charged:false`. Descriptive percentile and recorded sales only; never an over-assessment verdict or legal/tax advice. |
|
|
450
|
+
| `POST /api/locus-before-you-sign-dossier` | `$1.19` | Homebuyer or buyer's agent under contract needs one complete pre-signing dossier (cited JSON + self-contained printable HTML/PDF) bundling subject parcel identity and roll value, the immediate surrounding parcel ring, FEMA flood zone and mandatory-purchase rule, EPA TRI/RCRA/SDWIS environmental proximity, recorded comparable sales, and local legislative context. Eligible for Stripe MPP (`method="stripe"`), Tempo MPP (`method="tempo"`), and Base/Solana x402. | Fewer than two resolved constituent lanes return `charged:false`. Never an inspection, appraisal, title opinion, or purchase recommendation. |
|
|
451
|
+
| `POST /api/locus-escrow-insurance-dossier` | `$0.89` | Homeowner facing an escrow payment jump or homeowners insurance nonrenewal needs one two-track action dossier (cited JSON + self-contained printable HTML/PDF) bundling `locus-owner-action-brief` (exemptions, tax calendar, appeal window, LOMA screen), `locus-assessment-position`, `locus-insurance-context` (FEMA flood rule, NFIP/ACS figures, rebuild proxy), state nonrenewal notice and FAIR Plan pointers, and federal RESPA 12-month shortage rules. Eligible for Stripe MPP (`method="stripe"`), Tempo MPP (`method="tempo"`), and Base/Solana x402. | Fewer than two resolved constituent lanes return `charged:false`. Never an insurance quote, servicer error finding, or legal/financial advice. |
|
|
452
|
+
| `POST /api/locus-seller-readiness-packet` | `$0.85` | Seller or listing agent preparing to list needs one pre-listing verification and permit closeout packet (cited JSON + self-contained printable HTML/PDF) bundling `locus-permit-closeout-check`, municipal permit portal rules, county assessor roll baseline, state seller property disclosure statute pointers, municipal code cases, FEMA flood-map revision notices, and special district levies. Eligible for Stripe MPP (`method="stripe"`), Tempo MPP (`method="tempo"`), and Base/Solana x402. | Fewer than two resolved constituent lanes return `charged:false`. Never a compliance certificate, legal disclosure opinion, or inspection substitute. |
|
|
419
453
|
|
|
420
454
|
### Report compose: turn results you already have into one cited comparison
|
|
421
455
|
|
|
@@ -513,7 +547,7 @@ These work for geocodable US addresses at no cost. Some accept address directly.
|
|
|
513
547
|
| Toxic releases | `locus_toxic_releases` | `{ "state": "MT", "county": "Park County" }` | EPA TRI facilities for the county, chemical-release reporting fields where available, profile links. |
|
|
514
548
|
| RCRA hazardous-waste handlers | `locus_rcra_handlers` | `{ "state": "MT", "countyFips3": "067" }` or `{ "state": "MT", "zip": "59047" }` | RCRAInfo handlers, generator status/activity fields, coordinates, ECHO verify links. |
|
|
515
549
|
| EPA radon zone | `locus_radon_zone` | `{ "address": "..." }` or `{ "state": "MT", "county": "Park County" }` | EPA county radon zone 1/2/3, county basis, testing/disclosure caveat, provenance. |
|
|
516
|
-
| California service-line material | `locus_service_line_material` | `{ "address": "<complete CA street address, unit if applicable, city, state and ZIP>" }` | Utility-reported system-owned and customer-owned materials separately. Opt-in snapshot; exact or normalized address only. Unknown stays unknown; no match is not non-lead. Verify current materials and ownership boundaries with the utility. |
|
|
550
|
+
| California service-line material | `locus_service_line_material` | `{ "address": "<complete CA street address, unit if applicable, city, state and ZIP>" }` | Utility-reported system-owned and customer-owned materials separately (~34% of published statewide rows carry complete indexable street addresses; systems with unindexable or excluded location rows return `source_unavailable` on a miss rather than a negative finding). Opt-in snapshot; exact or normalized address only. Unknown stays unknown; no match is not non-lead. Verify current materials and ownership boundaries with the utility. |
|
|
517
551
|
| Public water systems | `locus_water_systems` | `{ "state": "MT", "county": "Park County" }` | Active public water systems, PWSIDs, SDWIS/ECHO links, and dated system-wide lead, galvanized-requiring-replacement, unknown, and non-lead service-line counts when reported; missing counts are not zero and non-lead counts may be underreported until November 1, 2027. County membership does not prove which system serves an address; system counts do not identify the caller's own line. |
|
|
518
552
|
| State boil-water notices | `locus_boil_water_notices` | `{ "pwsid": "MO1010001" }` or `{ "address": "..." }` | State-published active orders where wired; check live coverage. Address input uses candidate service-area boundaries, not county association. Precautionary utility advisories may be excluded. Use `poll_events` or `subscribe_event` with `name: "locus.real_estate.changes_detected"`, `arguments.addresses`, and `arguments.lanes: ["locus_boil_water_notices"]` to watch for new published notices after a quiet complete baseline. Unavailable reads keep the prior notice watermark. A disappearing row never means lifted; confirm address impact and current instructions with the utility. Not an emergency notification service. |
|
|
519
553
|
| Groundwater monitoring-well context | `locus_groundwater_context` | `{ "address": "...", "radiusMeters": 5000 }` | Nearby USGS monitoring locations, aquifer codes/names, well-construction depth distributions, and static water-level observations, returned in distance bands without location names or exact coordinates. Not a domestic-well depth, yield, potability, contamination, or cost prediction. |
|
|
@@ -886,7 +920,7 @@ Both MCP harnesses (via protocol JSON-RPC `events/list`, `events/poll`, `events/
|
|
|
886
920
|
| `locus.real_estate.insurance_renewal_approaching` | `{ "address": "...", "renewalMonth": 7 }` | Opt-in window opens 45 days before the supplied month's first day. Free insurance-context and mitigation `nextActions`. The month boundary is not an actual policy renewal date. |
|
|
887
921
|
| `locus.real_estate.escrow_analysis_approaching` | `{ "address": "...", "escrowAnalysisMonth": 7 }` | Opt-in window opens 30 days before the supplied month's first day. Free mortgage-calendar fact cards, tax-calendar and insurance-context `nextActions`. The month boundary is not a verified servicer date. |
|
|
888
922
|
|
|
889
|
-
Calendar reminders require the provider's `LOCUS_MCP_CALENDAR_EVENTS_ENABLED` flag. Unknown months create no date and return `calendarStatus: "missing_date"`. Caller months are explicitly `caller_supplied`, with no invented source URL. Their `nextActions` are free (`priceUsdc: "0.00"`, `charge: "free"`), with no payment field.
|
|
923
|
+
Calendar reminders require the provider's `LOCUS_MCP_CALENDAR_EVENTS_ENABLED` flag. Unknown months create no date and return `calendarStatus: "missing_date"`. Caller months are explicitly `caller_supplied`, with no invented source URL. Their `nextActions` are free (`priceUsdc: "0.00"`, `charge: "free"`), with no payment field. Cursors expire after 24 hours; when the user has asked for recurring checks, a 12-hour interval supports continuity without losing the baseline. A stale cursor establishes a silent truncated baseline; to recover, omit that cursor and deduplicate by stable `eventId`. Fresh polls list only windows from `triggerDate` through `date`, inclusive in UTC, with no closed-window backfill. If the user opts into a webhook subscription, creating it before the trigger window opens and renewing before `refreshBefore` avoids a gap. Existing `deadline_approaching` events already resurface explicit exemption and appeal dates; never roll recurring prose or a prior-cycle date into a new year. To test event polling, deduplication, or webhook delivery without waiting for a real public-record filing, pass `cursor: "cur_synthetic_test_fixture"` to `events/poll`, `poll_events`, `events/subscribe`, or `subscribe_event`; it emits one clearly labeled synthetic event (`eventId` prefixed `evt_synthetic_`, `synthetic: true` on the poll result) and returns a real cursor. Keep synthetic fixture results separate from proof that a real source change was detected.
|
|
890
924
|
|
|
891
925
|
1. **Discover event schemas first:** Call JSON-RPC `events/list` (or model tool `list_event_types` on `/muse/mcp`, or free `locus_mcp_events_catalog` with `{}` on `/mcp` or REST `/tools/call`) and read each event's strict `inputSchema`, `payloadSchema` (defined `properties` and `required` fields for every listed event; five kinds by default, eight where calendar reminders are enabled), `delivery`, and `requiresAuthForPoll`.
|
|
892
926
|
2. **Poll an address set or pool (`events/poll` or `poll_events`):**
|
|
@@ -989,7 +1023,7 @@ changes what a call is allowed to do.
|
|
|
989
1023
|
|
|
990
1024
|
The paid catalog includes native products, promoted free duals, and paid-only atomics. Native tools use the transports listed in their catalogs. Paid-only atomics are REST-only.
|
|
991
1025
|
|
|
992
|
-
1. **REST:** call `POST /api/<tool-slug>`.
|
|
1026
|
+
1. **REST (x402 or MPP / Tempo):** call `POST /api/<tool-slug>`. An unpaid call returns HTTP 402 with the x402 v2 `PaymentRequired` JSON body (`accepts[]` offers Base USDC and Solana USDC) and, on MPP-enabled native and dual-rail routes, a `WWW-Authenticate: Payment ..., method="tempo", intent="charge"` header requesting `USDC.e` (`0x20C000000000000000000000b9537d11c60E8b50`) on Tempo mainnet (`eip155:4217`, `chainId: 4217`). For x402, retry the identical request with `PAYMENT-SIGNATURE` and read settlement from `PAYMENT-RESPONSE` (legacy `X-PAYMENT` and `X-PAYMENT-RESPONSE` remain compatibility aliases). For MPP / Tempo, retry the identical request with `Authorization: Payment <credential>` and read the receipt from `Payment-Receipt`. Never send both payment headers on the same request.
|
|
993
1027
|
2. **MCP:** use only paid entries present in the MCP catalog. Call `locus_execute`, then retry with `_meta["x402/payment"]` when challenged.
|
|
994
1028
|
3. **A2A:** activate `https://github.com/google-a2a/a2a-x402/v0.1` in `X-A2A-Extensions`. A covered paid call returns a task in `input-required` state with `x402.payment.required`. Retry with the same `taskId` and `contextId` and put only `x402.payment.payload` in message metadata; Locus reuses the server-bound tool and arguments. If the completion response is lost, repeat the same payment-only message during the task's short recovery window. The settled replay returns the stored canonical artifact and may refresh the ephemeral owner-of-record field for the same exact verified parcel without another settlement. If you repeat the tool call, it must match that binding. Read settlement from `x402.payment.receipts` in the completed task.
|
|
995
1029
|
4. On every rail, read `amount`, `network`, `asset`, and `payTo` from the live challenge. Ask before signing. Payment is idempotent on the tool plus a canonical argument hash, so replay does not double-charge.
|
|
@@ -1027,6 +1061,53 @@ Serialize authorization integers as decimal strings. Do not add top-level `resou
|
|
|
1027
1061
|
|
|
1028
1062
|
An `insufficient_funds` 402 includes `payer`, `network`, and `amountRequired` (atomic USDC units). Before topping up, confirm the funding human holds a recovery copy, especially for an ephemeral agent environment. Then fund that wallet on that network and retry using the fresh challenge. `invalid_signature` and `expired_authorization` require a new signature. A malformed envelope remains `invalid_payload`. None of these responses is a settlement receipt.
|
|
1029
1063
|
|
|
1064
|
+
### Minimal Tempo MPP (USDC.e) setup
|
|
1065
|
+
|
|
1066
|
+
Native and promoted dual-rail REST endpoints also advertise Tempo on HTTP 402 via MPP (`WWW-Authenticate: Payment ..., method="tempo", intent="charge"`), a separate payment protocol from x402. You do not need Base USDC or x402-on-Tempo to use this route; you need a wallet that holds **USDC.e** (`0x20C000000000000000000000b9537d11c60E8b50`) on **Tempo mainnet** (`eip155:4217`, `chainId: 4217`) and can answer the MPP Tempo challenge.
|
|
1067
|
+
|
|
1068
|
+
A live `WWW-Authenticate` header on HTTP 402 starts with:
|
|
1069
|
+
|
|
1070
|
+
```text
|
|
1071
|
+
WWW-Authenticate: Payment id="...", realm="api.locus.report", method="tempo", intent="charge", request="<base64url>", description="...", expires="...", opaque="<base64url>"
|
|
1072
|
+
```
|
|
1073
|
+
|
|
1074
|
+
Decoding the `request` base64url payload shows the exact Tempo offer (illustrative; always read the live challenge):
|
|
1075
|
+
|
|
1076
|
+
```json
|
|
1077
|
+
{
|
|
1078
|
+
"amount": "10000",
|
|
1079
|
+
"currency": "0x20C000000000000000000000b9537d11c60E8b50",
|
|
1080
|
+
"externalId": "locus-flood-zone",
|
|
1081
|
+
"methodDetails": { "chainId": 4217 },
|
|
1082
|
+
"recipient": "0xF121fbeceC43e1B616D47285851c20d5fC64431b"
|
|
1083
|
+
}
|
|
1084
|
+
```
|
|
1085
|
+
|
|
1086
|
+
After explicit user spending approval, answer the challenge with an MPP-compatible Tempo client (such as `mppx/client` or `npx agentcash@latest fetch ... -p mpp --payment-network tempo`), which retries the identical `POST` with `Authorization: Payment <credential>` and receives a `Payment-Receipt` header on HTTP 200:
|
|
1087
|
+
|
|
1088
|
+
```js
|
|
1089
|
+
import { Mppx, tempo } from "mppx/client";
|
|
1090
|
+
import { privateKeyToAccount } from "viem/accounts";
|
|
1091
|
+
|
|
1092
|
+
// Requires a wallet holding USDC.e (0x20C000000000000000000000b9537d11c60E8b50) on Tempo mainnet (chainId 4217)
|
|
1093
|
+
// that can sign the MPP tempo/charge challenge.
|
|
1094
|
+
const mppx = Mppx.create({
|
|
1095
|
+
polyfill: false,
|
|
1096
|
+
methods: [tempo.charge({ account: privateKeyToAccount(process.env.TEMPO_PRIVATE_KEY) })],
|
|
1097
|
+
});
|
|
1098
|
+
|
|
1099
|
+
const response = await mppx.fetch("https://api.locus.report/api/locus-flood-zone", {
|
|
1100
|
+
method: "POST",
|
|
1101
|
+
headers: { "content-type": "application/json" },
|
|
1102
|
+
body: JSON.stringify({ address: "1 E Edenton St, Raleigh, NC 27601" }),
|
|
1103
|
+
});
|
|
1104
|
+
const receipt = response.headers.get("Payment-Receipt");
|
|
1105
|
+
const result = await response.json();
|
|
1106
|
+
// Confirm response.status === 200, Boolean(receipt), and result.charged === true.
|
|
1107
|
+
```
|
|
1108
|
+
|
|
1109
|
+
Do not send both `Authorization: Payment` and `PAYMENT-SIGNATURE` on the same request. Lifecycle-bound async jobs (`locus-place-report-batch`, `locus-property-update`, `locus-property-flyer`), paid-only atomics, and `locus-permit-closeout-check` when recheck snapshots are enabled omit the Tempo `WWW-Authenticate` challenge and accept x402 only. Observing the MPP Tempo challenge on a 402 probe is a protocol and asset compatibility finding, not a completed payment test; verify your wallet can sign and settle a `$0.01` call before relying on it in automation.
|
|
1110
|
+
|
|
1030
1111
|
### Probe the challenge without paying
|
|
1031
1112
|
|
|
1032
1113
|
`GET` on any paid endpoint returns a side-effect-free discovery challenge. Do not sign that challenge for a Turnkey-backed workflow because it has no exact request body and reserves no provider capacity. Send the exact `POST` body without payment first. That charge-free preflight either returns a current 402 or an uncharged availability error.
|
|
@@ -1043,7 +1124,7 @@ For RentCast workflows, inspect `X-Locus-Provider-Budget-State` and `X-Locus-Pro
|
|
|
1043
1124
|
|
|
1044
1125
|
A 402 challenge alone is not proof that end-to-end paid settlement works for your client. Before relying on paid Locus calls in automation, validate the full pay-and-retry loop once with a $0.01 promoted lookup such as `locus-parcel-lookup` or `locus-flood-zone`:
|
|
1045
1126
|
|
|
1046
|
-
1. `POST https://api.locus.report/api/locus-flood-zone` with a real address, satisfy the $0.01 challenge, and confirm a 200 with a `PAYMENT-RESPONSE` header (or
|
|
1127
|
+
1. `POST https://api.locus.report/api/locus-flood-zone` with a real address, satisfy the $0.01 challenge on your chosen rail (x402 `PAYMENT-SIGNATURE` on Base/Solana or MPP `Authorization: Payment` on Tempo mainnet `USDC.e`), and confirm a 200 with `charged: true` and a `PAYMENT-RESPONSE` header (x402) or `Payment-Receipt` header (MPP / Tempo).
|
|
1047
1128
|
2. Keep the payment challenge and settlement receipt. Keep signed `offer-receipt` evidence when present. The current EIP-712 receipt extension is EVM-only, so a Solana settlement may omit that additive extension while still returning the standard `PAYMENT-RESPONSE` transaction receipt.
|
|
1048
1129
|
3. Only then move to higher-priced tools. Read the live challenge instead of relying on a copied price range.
|
|
1049
1130
|
|
|
@@ -1100,16 +1181,14 @@ Redirect these asks back to records plus verification questions:
|
|
|
1100
1181
|
|
|
1101
1182
|
## How to speak with owners, sellers and buyers
|
|
1102
1183
|
|
|
1103
|
-
Money, home and deadline questions are stressful.
|
|
1184
|
+
Money, home and deadline questions are stressful. Keep presentation grounded in available evidence across every owner, seller and buyer answer and every Locus workflow skill:
|
|
1104
1185
|
|
|
1105
|
-
- **
|
|
1106
|
-
- **
|
|
1107
|
-
- **
|
|
1108
|
-
- **
|
|
1109
|
-
- **
|
|
1110
|
-
- **
|
|
1111
|
-
- **Route to human help without shame.** "Payment trouble is common, and HUD-approved housing counselors are free or low-cost."
|
|
1112
|
-
- **Re-surface risk on a calendar,** for example flood context before hurricane season or an insurance check in the renewal month.
|
|
1186
|
+
- **Fact, source, uncertainty, useful next step.** State what the record shows, cite the source and its date or vintage when returned, name what the record leaves open, and give a concrete next step when one helps.
|
|
1187
|
+
- **Do not require a date for every risk or promise when an unknown will clear.** Include a deadline or window when a statute, notice, or published schedule actually supports one. Sometimes no supported date exists; when a date is unknown or unverified, say so rather than inventing a timeline.
|
|
1188
|
+
- **Let completeness and stop conditions guide the next step.** `"This address isn't indexed"` (`source_unavailable` with `incomplete_source_rows` on `locus_service_line_material`) leads to asking the utility for its inventory entry rather than reporting a clean result, whereas `"the indexed record says non-lead"` reports the utility's classification as of the snapshot date. An unverified state rule (`not_verified`) stops at the official portal rather than implying no rule exists.
|
|
1189
|
+
- **Treat `nextActions` and paid tools as offers, never instructions to spend or contact someone.** Present the exact tool, arguments, free-versus-paid tier, price (`priceUsdc`), and what question the call answers so the user decides whether to run it.
|
|
1190
|
+
- **No alarm words, fear imagery, or verdicts.** Offer choices supported by the records ("You can appeal, apply for the exemption, or ask the servicer how a shortage can be repaid") rather than telling the user what they must do.
|
|
1191
|
+
- **Route to human help without shame when relevant.** When payment trouble comes up, note that payment trouble is common and that agencies listed in HUD's housing counseling directory can be asked about free or low-cost counseling.
|
|
1113
1192
|
- **Crisis guard:** if a person says they are thinking of harming themselves or are in crisis, stop the records task and give the 988 Suicide and Crisis Lifeline (call or text 988). Locus is not a mental-health service.
|
|
1114
1193
|
|
|
1115
1194
|
## Failure handling
|
|
@@ -69,9 +69,10 @@ account details. You need only the property address.
|
|
|
69
69
|
copy its phone number and hours from the row exactly.
|
|
70
70
|
- Offer a standing watch with the `locus-home-watch` skill on the address.
|
|
71
71
|
Locus does not verify anyone's identity; send that check to a title company.
|
|
72
|
-
5. **Hazards, each with a step.** `locus_flood_zone` and `locus_wildfire_risk`. For each
|
|
73
|
-
fact,
|
|
74
|
-
|
|
72
|
+
5. **Hazards, each with a next step.** `locus_flood_zone` and `locus_wildfire_risk`. For each
|
|
73
|
+
hazard fact, state the record, source, uncertainty, and a useful next step (such as a flood
|
|
74
|
+
insurance question or a mitigation program from `locus_owner_programs` with `{ address, hazard }`);
|
|
75
|
+
include a date only when a program window or season start actually supports one.
|
|
75
76
|
6. **Payment trouble.** If the owner is behind on tax, mortgage or utility payments, say payment
|
|
76
77
|
trouble is common and that HUD-approved housing counselors are free or low-cost. Use
|
|
77
78
|
`locus_housing_counselors` with the address for nearby counseling agencies (a directory
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: locus-escrow-shock
|
|
3
3
|
preamble-tier: 1
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.2.0
|
|
5
5
|
description: Use when an owner, or their agent, asks why their mortgage payment or escrow went up and what they can do, and has the servicer's escrow analysis letter. Splits the change into its tax and insurance parts and routes each part to cited Locus records, dated windows and choices.
|
|
6
6
|
triggers:
|
|
7
7
|
- my mortgage payment went up
|
|
@@ -120,7 +120,24 @@ they do. Do not collect the loan number, account numbers, names or phone numbers
|
|
|
120
120
|
15. Offer to set up the `locus-home-watch` skill so the next tax bill, appeal window and
|
|
121
121
|
exemption deadline surface early. Where the events catalog lists it, its section 9
|
|
122
122
|
`locus.real_estate.escrow_analysis_approaching` reminder (with the month of the servicer's
|
|
123
|
-
usual analysis) surfaces the next escrow analysis 30 days ahead.
|
|
123
|
+
usual analysis) surfaces the next escrow analysis 30 days ahead. When the owner wants a single
|
|
124
|
+
self-contained printable HTML/PDF + JSON dossier combining the tax-track and insurance-track
|
|
125
|
+
records in one settlement, offer `locus-escrow-insurance-dossier` (`$0.89`, eligible for
|
|
126
|
+
Stripe MPP `method="stripe"`, Tempo MPP `method="tempo"`, and Base/Solana x402).
|
|
127
|
+
16. **Optional caller-paid partner x402 handoffs (`handoffs[]`, offer only after user approval):**
|
|
128
|
+
- `insurance_market.querylines` (`$0.10` x402 on Base, returned on `locus_homeowners_insurance_context`,
|
|
129
|
+
`locus-insurance-context`, and `locus-escrow-insurance-dossier`):
|
|
130
|
+
`GET https://api.querylines.com/v1/carriers?state=<ST>&line=homeowners` for NAIC state carrier
|
|
131
|
+
market share, Direct Premiums Written (DPW) YoY change, and direct loss ratio (or
|
|
132
|
+
`/v1/rates/activity?states=<ST>&line=homeowners&granularity=year` at `$0.10` for SERFF rate
|
|
133
|
+
filings). Present as state-level market context, never as a carrier recommendation or quote.
|
|
134
|
+
- `trade_contractors.locationlists` (`$0.02` x402 on Base, returned on `locus_mitigation_incentives`):
|
|
135
|
+
`POST https://locationlists.com/api/x402/query` (`dataset: "roofing-contractor-list"`,
|
|
136
|
+
`near: { lat, lng, radius_miles: 10 }`) for nearby manufacturer-certified roofing/HVAC/solar
|
|
137
|
+
directory leads when the owner wants quotes on mitigation work that qualifies for cited
|
|
138
|
+
insurance discounts. Always verify state contractor licensure next via
|
|
139
|
+
`locus_contractor_license_check` or the state licensing board, and never pass partner contact
|
|
140
|
+
fields into Locus tools.
|
|
124
141
|
|
|
125
142
|
## Never
|
|
126
143
|
|
|
@@ -68,19 +68,24 @@ phone numbers or email addresses for the watch. Calendar reminders may also take
|
|
|
68
68
|
`"deliverWebhooks": true`, so schedule that call at your cadence; a subscription alone does
|
|
69
69
|
not push. Renew before `refreshBefore`.
|
|
70
70
|
|
|
71
|
-
## 3.
|
|
71
|
+
## 3. Technical constraints and check intervals
|
|
72
72
|
|
|
73
|
-
|
|
73
|
+
Use these technical constraints when the owner asks for ongoing checks:
|
|
74
|
+
|
|
75
|
+
| Event | Technical constraint | Consequence for interval choice |
|
|
74
76
|
|---|---|---|
|
|
75
|
-
| `deadline_approaching` |
|
|
76
|
-
| `changes_detected` |
|
|
77
|
-
| `changes_detected` with `locus_boil_water_notices` |
|
|
78
|
-
| Any event |
|
|
77
|
+
| `deadline_approaching` | Fresh polls without a cursor list every dated event inside `horizonDays` (30 to 60 days). | A weekly check with a fresh poll (deduplicating by `eventId`) surfaces upcoming deadlines without maintaining a 24-hour cursor. |
|
|
78
|
+
| `changes_detected` | Poll cursors expire after 24 hours (`CURSOR_TTL_SECONDS = 86400`). | A late poll starts a new baseline and reports nothing for the gap; a 12-to-24-hour interval preserves continuity when the owner wants ongoing change detection. |
|
|
79
|
+
| `changes_detected` with `locus_boil_water_notices` | The lane lists active state-published orders only; if a cursor expires and re-baselines while an order is active, that order joins the new baseline without emitting as a delta. | A 12-hour check interval (or `subscribe_event` when signed in) avoids silent re-baselining across cursor expiry. Locus is not an emergency alert; the utility's own alerts come first. |
|
|
80
|
+
| Any event | `nextPollMs` is 1 hour (`3600000` ms). | Polling faster than `nextPollMs` re-reads the same upstream window and adds load without finding new records. |
|
|
79
81
|
|
|
80
|
-
If you
|
|
82
|
+
If you check `deadline_approaching` weekly, omit the old cursor: a fresh poll lists every dated
|
|
81
83
|
event inside the horizon, and you deduplicate by `eventId` yourself. For `changes_detected`, if
|
|
82
84
|
a cursor has expired, tell the owner the watch restarted on that date and that changes before it
|
|
83
|
-
were not compared.
|
|
85
|
+
were not compared. To verify event polling or webhook delivery without waiting for a real filing,
|
|
86
|
+
pass `cursor: "cur_synthetic_test_fixture"`; it emits one synthetic event (`evt_synthetic_*`,
|
|
87
|
+
`synthetic: true`) and returns a real cursor. Keep synthetic test events separate from real
|
|
88
|
+
public-record changes.
|
|
84
89
|
|
|
85
90
|
## 4. Read each poll honestly
|
|
86
91
|
|
|
@@ -188,9 +193,9 @@ Offer these reminders only where `locus_mcp_events_catalog` lists them. The prov
|
|
|
188
193
|
|
|
189
194
|
The month boundary is not the actual renewal or servicer date. Confirm that date with the insurer or servicer. A missing month returns `calendarStatus: "missing_date"` and no event. Caller months are labeled `caller_supplied`; they have no invented source URL or verification date. Seasonal dates carry the official source and its recorded verification date. Every reminder carries a reason and free `nextActions` with `charge: "free"` and `priceUsdc: "0.00"`. Do not attach payment metadata to those calls.
|
|
190
195
|
|
|
191
|
-
Use the same poll or signed-webhook setup as step 6 in section 2, with the selected event name and its arguments.
|
|
196
|
+
Use the same poll or signed-webhook setup as step 6 in section 2, with the selected event name and its arguments. If the owner opts into a webhook subscription, creating it before the trigger window opens sets a silent baseline; because webhook delivery runs when `poll_events` is called with `"deliverWebhooks": true`, a subscription alone does not push on its own.
|
|
192
197
|
|
|
193
|
-
|
|
198
|
+
Cursors expire after 24 hours even though the calendar cycles are yearly; when the owner asks for ongoing checks, a 12-hour interval supports continuity and `nextPollMs` gives the minimum interval between checks. Passing a stale cursor creates a truncated, silent baseline and may suppress a reminder. To recover a missed poll, omit the expired cursor and deduplicate the fresh result by `eventId`. Fresh polls list reminders only from `triggerDate` through `date`, inclusive, in UTC. Closed windows are not backfilled. A new annual cycle has a new event ID.
|
|
194
199
|
|
|
195
200
|
Exemption and appeal re-surfacing stays on `deadline_approaching`. Only concrete dated rows count. A recurring prose rule or a prior year's deadline never becomes a guessed current-year date.
|
|
196
201
|
|
|
@@ -78,7 +78,10 @@ the attorney.
|
|
|
78
78
|
statute; give the citation and link. Whether one was recorded for this home is a question for
|
|
79
79
|
the county recorder or the attorney; Locus does not search for it.
|
|
80
80
|
- `smallEstate`: if `verified`, give the citation, link and `realProperty` value. Quote
|
|
81
|
-
`thresholdText` only if it is present,
|
|
81
|
+
`thresholdText` only if it is present, note that `thresholdScope` is
|
|
82
|
+
`"non_exhaustive_excerpt"`, and state that small-estate statutes often have conditional
|
|
83
|
+
branches (such as different dollar limits for a surviving spouse or specific property classes)
|
|
84
|
+
and that thresholds change; read the linked statute before ruling an estate out.
|
|
82
85
|
- `heirsProperty`: the Uniform Partition of Heirs Property Act status from the Uniform Law
|
|
83
86
|
Commission. This matters when several heirs share ownership. `not_listed` is not proof the
|
|
84
87
|
state has no related law.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: locus-insurance-nonrenewal
|
|
3
3
|
preamble-tier: 1
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.2.0
|
|
5
5
|
description: Use when a US homeowner says their homeowners insurer will not renew, or is dropping, their policy and wants to know the state notice rule, the insurer of last resort, the complaint route, mitigation credits, flood exposure and the dates that matter before the policy lapses, from cited Locus records.
|
|
6
6
|
triggers:
|
|
7
7
|
- my insurer won't renew my policy
|
|
@@ -47,7 +47,11 @@ details.
|
|
|
47
47
|
- `insurerOfLastResort.status: "listed"`: name each plan and its URL. It is a fallback when
|
|
48
48
|
the regular market declines; eligibility and price are the plan's decision.
|
|
49
49
|
`"not_checked"` means Locus has no plan row for this state; ask the department.
|
|
50
|
-
- `department.complaintUrl
|
|
50
|
+
- `department.complaintUrl` and `department.complaintStatus`: when `complaintStatus` is
|
|
51
|
+
`"verified"`, give `complaintUrl` as the direct page for questions and complaints. When
|
|
52
|
+
`complaintStatus` is `"unresolved"` (`complaintUrl` is `null`), state that a direct
|
|
53
|
+
complaint-page handoff is unresolved in the registry and give `department.portalUrl` as the
|
|
54
|
+
starting portal (`verifyNext[1].handoffStatus` is `"unresolved"`).
|
|
51
55
|
- `emergencyRules`: quote each rule in force with its start and end dates and source. An
|
|
52
56
|
empty list means no dated rule is recorded here, not that none exists.
|
|
53
57
|
- `available: false` (`out_of_coverage`, `input_too_coarse`, `jurisdiction_mismatch`,
|
|
@@ -107,5 +111,25 @@ End with a short dated list of the owner's choices, for example:
|
|
|
107
111
|
- Ask the department, or file a complaint at its page, if the notice timing seems short against
|
|
108
112
|
the cited rule.
|
|
109
113
|
- If there is a mortgage, send the servicer proof of coverage by the dates in the calendar.
|
|
114
|
+
- When the owner wants one self-contained printable HTML/PDF + JSON dossier combining state
|
|
115
|
+
nonrenewal and FAIR Plan pointers, FEMA flood and NFIP/ACS insurance benchmarks, mitigation
|
|
116
|
+
credits, assessment position, and RESPA escrow rules in a single settlement, offer
|
|
117
|
+
`locus-escrow-insurance-dossier` (`$0.89`, eligible for Stripe MPP `method="stripe"`, Tempo MPP
|
|
118
|
+
`method="tempo"`, and Base/Solana x402).
|
|
119
|
+
- **Optional caller-paid partner x402 handoffs (`handoffs[]`, offer only after user approval):**
|
|
120
|
+
- `insurance_market.querylines` (`$0.10` x402 on Base, returned on `locus_insurance_nonrenewal_pointers`,
|
|
121
|
+
`locus_homeowners_insurance_context`, `locus-insurance-context`, and `locus-escrow-insurance-dossier`):
|
|
122
|
+
`GET https://api.querylines.com/v1/carriers?state=<ST>&line=homeowners` for NAIC state market
|
|
123
|
+
share, Direct Premiums Written (DPW) YoY change, and direct loss ratio of top carriers in the
|
|
124
|
+
state (or `/v1/rates/activity?states=<ST>&line=homeowners&granularity=year` at `$0.10` for SERFF
|
|
125
|
+
rate filing momentum, and `/v1/citizens/pif` at `$0.10` for Florida Citizens policy counts).
|
|
126
|
+
Present as state-level market context, never as a carrier recommendation or policy quote.
|
|
127
|
+
- `trade_contractors.locationlists` (`$0.02` x402 on Base, returned on `locus_mitigation_incentives`):
|
|
128
|
+
`POST https://locationlists.com/api/x402/query` with `prefilledInput` (`dataset: "roofing-contractor-list"`,
|
|
129
|
+
`near: { lat, lng, radius_miles: 10 }`) when the owner wants nearby manufacturer-certified
|
|
130
|
+
roofing, HVAC, or solar contractors to bid on wind/mitigation upgrades. Always treat returned
|
|
131
|
+
businesses as commercial directory leads and verify state licensure next via
|
|
132
|
+
`locus_contractor_license_check` or the state licensing board. Never pass partner contact fields
|
|
133
|
+
into Locus tools.
|
|
110
134
|
|
|
111
135
|
Every statement traces to a Locus citation or to a date the owner gave you.
|
|
@@ -60,8 +60,8 @@ license: MIT
|
|
|
60
60
|
|
|
61
61
|
## Answer and completion
|
|
62
62
|
|
|
63
|
-
- Give choices, never a verdict.
|
|
64
|
-
|
|
63
|
+
- Give choices, never a verdict. Ground each item in fact, source, uncertainty, and a useful next step (such as the named agency or office contact and any source-backed date).
|
|
64
|
+
When no supported date exists in the record or caller input, say so and name who can confirm the schedule; do not invent a deadline or promise when an unknown will clear.
|
|
65
65
|
- State what is known, what is unknown, and how the unknown can be checked. Keep factual dates separate from any caller-chosen follow-up date.
|
|
66
66
|
- Use calm words, no alarm wording or fear imagery. Offer early human help without waiting for a deadline.
|
|
67
67
|
Offer a calendar follow-up only if the caller wants it; it does not authorize a subscription, payment or automatic action.
|
|
@@ -57,6 +57,12 @@ anything the filing portal does not require.
|
|
|
57
57
|
a charge.
|
|
58
58
|
5. `locus-comps-brief` only when you need more recorded sales than the challenge carried
|
|
59
59
|
(different radius or months). Same rules: arithmetic over public records, no valuation.
|
|
60
|
+
When the owner or agent wants the entire appeal package in a single settlement — including a
|
|
61
|
+
self-contained, print-ready HTML/PDF appeal packet alongside the cited JSON tables — offer
|
|
62
|
+
`locus-property-tax-protest-packet` (`$0.89`, eligible for Stripe MPP `method="stripe"`, Tempo
|
|
63
|
+
MPP `method="tempo"`, and Base/Solana x402), which bundles `locus-assessment-position`,
|
|
64
|
+
`locus-comps-brief`, optional `locus-valuation-challenge`, the statutory appeal window, and
|
|
65
|
+
filing guide pointers into one deliverable (`charged:false` when fewer than two lanes resolve).
|
|
60
66
|
6. Present the two grounds the boards recognize as two record tables, not conclusions:
|
|
61
67
|
market evidence (recorded sales, dates, prices, price per land square foot) and uniformity
|
|
62
68
|
evidence (assessed values of same-class neighbors and where the subject sits). Any adjustment
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: locus-seller-readiness
|
|
3
3
|
preamble-tier: 1
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.3.0
|
|
5
5
|
description: Use when an owner who plans to sell one US property, or their agent, wants a pre-listing check of disclosure law, open permits, code cases, flood status, district levies and closing-tax arithmetic from cited Locus records.
|
|
6
6
|
triggers:
|
|
7
7
|
- getting ready to sell my house
|
|
@@ -53,6 +53,15 @@ narratives about past tenants.
|
|
|
53
53
|
parcel: permit status and the final or closeout fields the source publishes. Report open or
|
|
54
54
|
expired permits as record facts with their dates and permit numbers. Whether old work was
|
|
55
55
|
permitted is a question for the permit office, not a Locus finding.
|
|
56
|
+
- **Optional caller-paid partner handoff (`trade_contractors.locationlists`, `$0.02` x402 on Base):**
|
|
57
|
+
`locus_permit_rules`, `locus-permit-closeout-check`, and `locus-seller-readiness-packet`
|
|
58
|
+
attach a `handoffs[]` entry for `POST https://locationlists.com/api/x402/query` (`prefilledInput`
|
|
59
|
+
with `dataset: "roofing-contractor-list"` and `near: { lat, lng, radius_miles: 10 }` or `zip`).
|
|
60
|
+
Offer it only if the seller asks for nearby trade contractors to inspect, repair, or close out
|
|
61
|
+
an open roof, HVAC, or solar permit item. Always treat LocationLists rows as commercial
|
|
62
|
+
directory leads (`oc:...`), verify state licensure next via `locus_contractor_license_check`
|
|
63
|
+
(where covered) or the state licensing board, and never pass partner contact fields back into
|
|
64
|
+
Locus tools.
|
|
56
65
|
|
|
57
66
|
## 3. Code cases (free)
|
|
58
67
|
|
|
@@ -82,6 +91,11 @@ narratives about past tenants.
|
|
|
82
91
|
10. With the owner's approval of the price, paid `locus-piti-transfer-tax-calculator` with the
|
|
83
92
|
owner's assumed sale price and closing date. The price is the owner's input, never a Locus
|
|
84
93
|
estimate. Label every figure as arithmetic over the owner's assumptions and the cited schedule.
|
|
94
|
+
When the seller or listing agent wants one self-contained printable HTML/PDF + JSON pre-listing
|
|
95
|
+
packet combining `locus-permit-closeout-check`, municipal permit portal rules, assessor roll
|
|
96
|
+
baseline, state seller disclosure pointers, code cases, flood-map notices, and special district
|
|
97
|
+
levies in a single settlement, offer `locus-seller-readiness-packet` (`$0.85`, eligible for
|
|
98
|
+
Stripe MPP `method="stripe"`, Tempo MPP `method="tempo"`, and Base/Solana x402).
|
|
85
99
|
|
|
86
100
|
## 7. Service-line material (free)
|
|
87
101
|
|
|
@@ -92,10 +106,12 @@ Locus reports what the utility has published. It is not an inspection, and "unkn
|
|
|
92
106
|
system-level counts of lead, galvanized-requiring-replacement, lead-status-unknown and
|
|
93
107
|
non-lead lines, with the reporting period. These counts describe the whole system, not this
|
|
94
108
|
address.
|
|
95
|
-
- `locus_service_line_material` with `{ address }`: in California
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
109
|
+
- `locus_service_line_material` with `{ address }`: in California (`~34%` of published statewide
|
|
110
|
+
rows carry complete indexable street addresses), the utility-reported system-side and
|
|
111
|
+
customer-side material for the address (`systemOwnedMaterial`, `customerOwnedMaterial`), with
|
|
112
|
+
basis, date and source. `source_unavailable` with `incomplete_source_rows` means the utility's
|
|
113
|
+
rows for that system are not address-indexable; `no_matching_record` means no indexed row
|
|
114
|
+
matched; neither is a non-lead finding. Outside California it returns `out_of_coverage`.
|
|
99
115
|
- Where the verified state row names lead service lines (Iowa: Iowa Code 558A.4, as amended by
|
|
100
116
|
2025 Iowa Acts ch. 144, from January 1, 2026), report the system-level counts from
|
|
101
117
|
`locus_water_systems` and point the seller to the utility's published service-line inventory
|
|
@@ -65,22 +65,27 @@ Work through these in order and never merge them:
|
|
|
65
65
|
non-lead counts may be undercounts. Several systems can serve one county; the bill is the
|
|
66
66
|
authority for which one serves this address.
|
|
67
67
|
5a. `locus_service_line_material` with `{ address }` (full street address with unit, state and
|
|
68
|
-
ZIP).
|
|
68
|
+
ZIP). Coverage is California only, and `~34%` of published statewide rows carry complete
|
|
69
|
+
indexable street addresses. Read `status` and let completeness determine the next step:
|
|
69
70
|
- `found`: report each side separately: `systemOwnedMaterial` with `systemOwnedBasis`, and
|
|
70
71
|
`customerOwnedMaterial` with `customerOwnedBasis`, plus the inventory date and source. A
|
|
71
|
-
material of unknown stays unknown.
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
material of unknown stays unknown. Stop here if the user only asked what the published
|
|
73
|
+
inventory records for this address.
|
|
74
|
+
- `no_matching_record`: the indexed snapshot has no exact or normalized record for this
|
|
75
|
+
address. It never means non-lead. Suggest the owner ask the utility for its inventory entry.
|
|
74
76
|
- `out_of_coverage`: the state has no address-level inventory in Locus (California only today).
|
|
75
|
-
|
|
76
|
-
|
|
77
|
+
Stop address-level inventory calls and use the system-level counts from step 5 plus the
|
|
78
|
+
utility's own inventory map.
|
|
79
|
+
- `source_unavailable`: read `reason` before deciding what to do next.
|
|
77
80
|
- An incomplete address (the reason asks for a complete street address, locality, unit or
|
|
78
81
|
ZIP): ask the owner for the full street address with unit, city, state and ZIP, then retry.
|
|
79
|
-
- `incomplete_source_rows` or `address_not_indexable_for_system
|
|
80
|
-
|
|
81
|
-
|
|
82
|
+
- `incomplete_source_rows` or `address_not_indexable_for_system` ("this address isn't
|
|
83
|
+
indexed"): the utility published an inventory, but its rows for this system lack complete
|
|
84
|
+
indexable street addresses (`~34%` of published California rows are indexable). Stop
|
|
85
|
+
retrying Locus and suggest the owner ask the utility for the address's entry. This is not
|
|
86
|
+
non-lead, and not a temporary outage.
|
|
82
87
|
- Any other reason (lane not enabled or not configured, unreadable or stale snapshot,
|
|
83
|
-
unverified address): a temporary gap, not
|
|
88
|
+
unverified address): report a temporary snapshot gap, not a negative finding.
|
|
84
89
|
This is the utility's reported classification, not an inspection.
|
|
85
90
|
6. `locus_water_utility_leak_adjustment_rules` with `{ address }`, plus `confirmedPwsid` when the
|
|
86
91
|
owner has the ID from the bill. Read `coverage`:
|