@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 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, may offer USDC on Base and Solana, and require explicit user authorization. Agents choose one complete `accepts[]` entry.
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.41",
4
- "description": "Install the general Locus agent skill, the surrounding-area purchase workflow, and the property-tax protest workflow for free and x402-paid property context.",
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.66.0
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: c714bcb0c789
36
+ contentHash: 5982e0aebc33
37
37
  ---
38
38
 
39
39
  # Locus Agent Capabilities
40
40
 
41
- Use this skill to connect an agent to Locus when a place-based workflow needs local-government context: taxes, parcels, zoning, flood, environmental records, development activity, transportation projects, local policy, source coverage, or recurring monitoring. The fuller client guide is [`docs/AGENT_CAPABILITIES.md`](https://github.com/velinussage/locus/blob/main/docs/AGENT_CAPABILITIES.md).
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
- - Every time the question is a US address or place plus official records or local-government context, call `locus_lane_availability` or `locus_suggest_workflow` first.
52
- - Looking is free. Paying happens only after an x402 challenge the user authorized.
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
- Start with `locus_suggest_workflow` for a broad question, then `locus_lane_availability` for the exact place. Use the records below as evidence for the person's decision, not as a verdict. Skip unavailable lanes; use the live catalog for current names and schemas.
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 | Free record evidence to check first |
62
- |---|---|
63
- | Owning costs or a revaluation notice | `locus_tax_calendar` and `locus_appeal_filing_guide` for statutory rules, official county pointers, and filing steps; confirm current-cycle dates, then use `locus_property_tax_estimate` where supported. Use `locus_appeal_window` with a notice date if deadline arithmetic is needed. Paid assessment or owner-cost follow-ups only if the free evidence leaves a question and the user approves. |
64
- | Buying | `locus_place_facts`, parcel records, zoning, flood, transfers, and development cases for the exact property. Check each returned source before comparing places; do not pick a winner. |
65
- | Renting | `locus_rental_registration_check` where wired, plus parcel, flood, and nearby official records. A no-match is not proof of legal permission or habitability. |
66
- | Leasing | Parcel, zoning, permits, and nearby development records for the proposed premises; use workplace context only if jobs near the site matter. Jobs are not customer demand. |
67
- | Lending | Parcel, zoning, transfers, flood, and dated area lending or house-price records where available. Area aggregates do not value or qualify the subject or a borrower. |
68
- | Commercial property financing or ownership | Identify the exact commercial property and check parcel facts first. If the paid CMBS lanes appear in the live index, use `locus-cmbs-loan-context` for its filed loan and maturity, then `locus-cmbs-maturity-wall` only when county-level timing matters. Use the distinct area-context lanes described below only when they answer the user's question; none establish the property's loan or value. |
69
- | Developing | Parcel, zoning, permits, development cases, soil, wetlands, and flood records. Confirm current rules and project status with the agency; no buildability conclusion. |
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 record lookup, not an order to call every tool.
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` is a signed payment credential, not an account API key.
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
- AgentCash is one compatible x402 client. It creates a local payer wallet and can install its MCP server into common agent clients. Locus issues no buyer API key.
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, capping the amount:
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 several rails. Full command reference: [agentcash docs](https://www.npmjs.com/package/agentcash).
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. Poll at least every 12 hours. The existing cursor TTL is 24 hours: 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. Subscribe before the trigger window and renew the subscription before expiry. Existing `deadline_approaching` events already resurface explicit exemption and appeal dates; never roll recurring prose or a prior-cycle date into a new year.
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>`. Read the x402 v2 `PaymentRequired` body from HTTP 402. Retry the identical request with `PAYMENT-SIGNATURE`. Read settlement from `PAYMENT-RESPONSE`. Legacy `X-PAYMENT` and `X-PAYMENT-RESPONSE` remain compatibility aliases.
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 the legacy `X-PAYMENT-RESPONSE` compatibility header).
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. These rules apply to every owner, seller and buyer answer and to every Locus workflow skill:
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
- - **Pair every risk with a step and a date.** A flood zone, shortage or deadline comes with what the person can do and by when.
1106
- - **No alarm words or fear imagery.** State the fact, its date and its source.
1107
- - **Say what is known, what is unknown, and when the unknown will be known** (for example, the date a notice, bill or hearing result is due).
1108
- - **Surface items early.** Raise a window or deadline when it opens, not on its last day.
1109
- - **Offer choices, never verdicts.** "You can appeal, apply for the exemption, or ask the servicer how a shortage can be repaid", not "you should appeal".
1110
- - **Give a concrete next step,** such as a pre-filled `nextActions` call, a filing guide or an official contact, not just a reminder.
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 hazard
73
- fact, give one step and a date, for example the flood insurance question before hurricane
74
- season, or a mitigation program from `locus_owner_programs` with `{ address, hazard }`.
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.1.0
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. Cadence guide
71
+ ## 3. Technical constraints and check intervals
72
72
 
73
- | Event | Suggested cadence | Why |
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` | Weekly, with `horizonDays` of 30 to 60 | Deadlines move slowly; a wider horizon gives the owner time to gather papers. |
76
- | `changes_detected` | Daily, and never slower than every 24 hours | A poll cursor expires after 24 hours. A late poll starts a new baseline and reports nothing for the gap. |
77
- | `changes_detected` with `locus_boil_water_notices` | At least every 12 hours, or `subscribe_event` when signed in | Boil-water notices are time-critical, and the lane lists active orders only: a notice issued during a re-baseline after a late poll joins the baseline silently and never emits. Locus is not an emergency alert; the utility's own alerts come first. |
78
- | Any event | Not faster than `nextPollMs` (one hour) | Faster polls add load and find nothing new. |
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 poll `deadline_approaching` weekly, omit the old cursor: a fresh poll lists every dated
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. Set up a subscription before the trigger window opens; its initial baseline is silent. A subscription alone still does not schedule delivery. Keep the polling caller active and renew before expiry.
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
- Poll at least every 12 hours and honor `nextPollMs`. Cursors expire after 24 hours even though the calendar cycles are yearly. 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.
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, and say thresholds change.
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.1.0
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`: the page for questions and complaints.
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. Pair each concern with a feasible next step, the named agency or business contact, and a source-backed date.
64
- If the date is unknown, say who can confirm it and when the caller can ask; do not invent a deadline.
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.2.0
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, the utility-reported
96
- system-side and customer-side material for the address (`systemOwnedMaterial`,
97
- `customerOwnedMaterial`), with basis, date and source. `no_matching_record` is not a non-lead
98
- finding. Outside California it returns `out_of_coverage`.
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). Read `status`:
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
- - `no_matching_record`: the snapshot has no exact or normalized record for this address. It
73
- never means non-lead. Ask the utility for its inventory entry.
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
- Use the system-level counts from step 5 and the utility's own inventory map.
76
- - `source_unavailable`: read `reason` before you retry.
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`: the utility published an
80
- inventory, but Locus cannot match this address to it. Ask the utility for the address's
81
- entry. This is not non-lead, and not a temporary gap.
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 an answer. Try again later.
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`: