@rubytech/taskmaster 1.13.4 → 1.16.0

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.
Files changed (68) hide show
  1. package/dist/agents/apply-patch.js +3 -1
  2. package/dist/agents/bash-tools.exec.js +3 -1
  3. package/dist/agents/bash-tools.process.js +3 -1
  4. package/dist/agents/skills/frontmatter.js +1 -0
  5. package/dist/agents/skills/workspace.js +64 -22
  6. package/dist/agents/system-prompt.js +1 -1
  7. package/dist/agents/taskmaster-tools.js +6 -4
  8. package/dist/agents/tool-policy.js +2 -1
  9. package/dist/agents/tools/contact-create-tool.js +4 -3
  10. package/dist/agents/tools/contact-delete-tool.js +3 -2
  11. package/dist/agents/tools/contact-lookup-tool.js +5 -4
  12. package/dist/agents/tools/contact-update-tool.js +6 -3
  13. package/dist/agents/tools/memory-tool.js +3 -1
  14. package/dist/agents/tools/qr-generate-tool.js +45 -0
  15. package/dist/agents/workspace-migrations.js +479 -0
  16. package/dist/build-info.json +3 -3
  17. package/dist/cli/gateway-cli/run.js +36 -16
  18. package/dist/config/agent-tools-reconcile.js +47 -0
  19. package/dist/control-ui/assets/{index-BiGN9NNG.js → index-Bd75cI7J.js} +568 -592
  20. package/dist/control-ui/assets/index-Bd75cI7J.js.map +1 -0
  21. package/dist/control-ui/assets/index-BkymP95Y.css +1 -0
  22. package/dist/control-ui/index.html +2 -2
  23. package/dist/daemon/service-port.js +109 -0
  24. package/dist/gateway/server-http.js +5 -0
  25. package/dist/gateway/server-methods/config.js +44 -0
  26. package/dist/gateway/server-methods/web.js +13 -0
  27. package/dist/gateway/server.impl.js +15 -1
  28. package/dist/hooks/bundled/ride-dispatch/HOOK.md +57 -0
  29. package/dist/hooks/bundled/ride-dispatch/handler.js +450 -0
  30. package/dist/hooks/bundled/ride-dispatch/stripe-webhook.js +191 -0
  31. package/dist/infra/update-global.js +4 -1
  32. package/dist/infra/update-runner.js +8 -4
  33. package/dist/macos/gateway-daemon.js +26 -8
  34. package/dist/memory/internal.js +24 -1
  35. package/dist/memory/manager.js +15 -4
  36. package/dist/records/records-manager.js +7 -2
  37. package/package.json +1 -1
  38. package/skills/business-assistant/SKILL.md +1 -1
  39. package/skills/qr-code/SKILL.md +63 -0
  40. package/skills/sales-closer/SKILL.md +29 -0
  41. package/skills/sales-closer/references/close-tracking.md +86 -0
  42. package/skills/sales-closer/references/closing-framework.md +112 -0
  43. package/skills/sales-closer/references/objection-handling.md +101 -0
  44. package/templates/beagle-zanzibar/agents/admin/AGENTS.md +123 -5
  45. package/templates/beagle-zanzibar/agents/admin/BOOTSTRAP.md +34 -11
  46. package/templates/beagle-zanzibar/agents/admin/HEARTBEAT.md +1 -0
  47. package/templates/beagle-zanzibar/agents/public/AGENTS.md +110 -17
  48. package/templates/beagle-zanzibar/memory/public/knowledge-base.md +13 -0
  49. package/templates/beagle-zanzibar/memory/public/terms.md +81 -0
  50. package/templates/beagle-zanzibar/skills/beagle-zanzibar/SKILL.md +10 -7
  51. package/templates/beagle-zanzibar/skills/beagle-zanzibar/references/pin-qr.md +52 -0
  52. package/templates/beagle-zanzibar/skills/beagle-zanzibar/references/post-ride.md +13 -0
  53. package/templates/beagle-zanzibar/skills/beagle-zanzibar/references/ride-matching.md +46 -49
  54. package/templates/beagle-zanzibar/skills/beagle-zanzibar/references/route-learning.md +61 -0
  55. package/templates/beagle-zanzibar/skills/stripe/SKILL.md +28 -0
  56. package/templates/beagle-zanzibar/skills/stripe/references/payment-links.md +71 -0
  57. package/templates/customer/agents/admin/BOOTSTRAP.md +5 -1
  58. package/templates/customer/agents/public/AGENTS.md +1 -2
  59. package/templates/real-agent/skills/buyer-feedback/SKILL.md +111 -0
  60. package/templates/real-agent/skills/property-enquiry/SKILL.md +126 -0
  61. package/templates/real-agent/skills/valuation-booking/SKILL.md +182 -0
  62. package/templates/real-agent/skills/vendor-updates/SKILL.md +153 -0
  63. package/templates/real-agent/skills/viewing-management/SKILL.md +111 -0
  64. package/templates/taskmaster/agents/public/AGENTS.md +1 -1
  65. package/templates/taskmaster/agents/public/IDENTITY.md +1 -1
  66. package/templates/taskmaster/agents/public/SOUL.md +2 -2
  67. package/dist/control-ui/assets/index-BiGN9NNG.js.map +0 -1
  68. package/dist/control-ui/assets/index-l54GcTyj.css +0 -1
@@ -1,36 +1,42 @@
1
1
  # Ride Matching — Booking Flow
2
2
 
3
- ## Phase 1: Capture the Request
3
+ > **This is a prescribed workflow.** AGENTS.md defines the step-by-step sequence. This reference provides detail for each step. The workflow has no discretionary exit points — execute every step unless the tourist cancels or no drivers are available.
4
4
 
5
- When a tourist messages about a ride, gather:
5
+ ## Capture (AGENTS.md Steps 1–3)
6
+
7
+ Required fields:
6
8
 
7
9
  1. **Pickup location** — airport, hotel name, area
8
10
  2. **Destination** — where they're going
9
11
  3. **Date and time** — when they need the ride
10
12
  4. **Passengers** — how many people
11
- 5. **Luggage** - how many pieces, anythinbg oversized
12
- 6. **Special Requests*** - e.g. wheelchair access
13
+ 5. **Luggage** how many pieces, anything oversized
14
+ 6. **Special requests** e.g. wheelchair access
15
+
16
+ Ask naturally, not as a form. If they give everything in one message, proceed immediately.
17
+
18
+ The knowledge base check (Step 2) is informational — it gives you fare context. Whether the route is covered or not, proceed to dispatch.
13
19
 
14
- Ask naturally, not as a form. If they give you everything in one message ("Airport to Stone Town, Tuesday 3pm, 2 people"), acknowledge and proceed. If anything is missing, ask for it conversationally.
20
+ After capturing the request, generate a job ID (BGL-XXXX) by checking `shared/bookings/` for the next available number.
15
21
 
16
- Check the knowledge base to confirm you know the route. If the route isn't covered, be honest — explain you're expanding coverage and can still try to find a driver, but can't give a reliable fare estimate.
22
+ ## Dispatch Trip Request (AGENTS.md Step 4)
17
23
 
18
- ## Phase 2: Driver Negotiation
24
+ Write a dispatch file to `shared/dispatch/{job-id}-trip-request.md` via `memory_write`. The operations agent will:
19
25
 
20
- Before contacting drivers:
21
- - Check driver states only contact drivers marked as `idle`
22
- - Select ~3 drivers based on: rating, response rate, route familiarity, availability
23
- - Prepend every message with the job ID: `[BGL-XXXX]`
26
+ 1. Look up the driver roster via `contact_lookup`
27
+ 2. Check each driver's status in memory
28
+ 3. Select up to 3 idle drivers, preferring those with route history
29
+ 4. Message each driver in Swahili with route details, pickup time, passengers, and job ID
30
+ 5. Message the tourist confirming drivers have been contacted
24
31
 
25
- Negotiate in Swahili. The driver quotes their fare for the route. Collect responses and compare.
32
+ You do not perform these steps directly the dispatch file triggers them automatically.
26
33
 
27
- Tell the tourist you're finding them offers. Set expectations: "Let me contact drivers now. I'll have offers for you shortly."
34
+ After writing the dispatch, tell the tourist you're reaching out to drivers (Step 5).
28
35
 
29
- If no drivers respond within a reasonable time, tell the tourist honestly. Offer to try again or suggest an alternative time.
36
+ ## Present Offers (AGENTS.md Step 6)
30
37
 
31
- ## Phase 3: Present Offers
38
+ When driver offers appear in your conversation (injected by the operations agent via cross-agent echo), present up to 3 competing offers. For each:
32
39
 
33
- Show up to 3 competing offers. For each:
34
40
  - **Fare** (what the tourist pays the driver)
35
41
  - **Driver rating** (aggregate score and trip count)
36
42
  - **Vehicle** (type, AC availability)
@@ -42,49 +48,42 @@ Frame it as a choice: "Here are your options — which works best?" Don't pressu
42
48
 
43
49
  If only one driver responded, present it honestly: "One driver available for this route. Here's the offer."
44
50
 
45
- ## Phase 4: Booking Confirmation
51
+ ## Booking Confirmation (AGENTS.md Step 7)
46
52
 
47
53
  When the tourist chooses an offer:
54
+
48
55
  1. Confirm the details: route, time, fare, vehicle
49
- 2. Explain the booking fee: "A small booking fee of [amount] confirms your ride. You pay [remaining fare] directly to your driver at the end."
50
- 3. Send the Stripe payment link
51
- 4. Wait for payment confirmation — do not proceed until Stripe confirms
56
+ 2. Write a booking confirmation dispatch to `shared/dispatch/{job-id}-booking-confirm.md` via `memory_write`
52
57
 
53
- ## Phase 5: Post-Payment
58
+ The operations agent will then:
59
+ - Generate a Stripe Checkout Session with the booking fee
60
+ - Send the payment link directly to the tourist
61
+ - Record booking details in `shared/bookings/{job-id}.md`
54
62
 
55
- Once payment clears, send the tourist:
56
- - Driver name
57
- - Driver phone number
58
- - Vehicle description and plate number
59
- - Pickup PIN (4-digit code)
60
- - Explanation: "Your driver has a QR code. Scan it with your phone camera to see the PIN, or ask the driver to quote it. If it matches your PIN, you've got the right driver. Works offline — no internet needed."
63
+ ## Payment and Post-Payment (AGENTS.md Steps 8–9)
61
64
 
62
- Confirm the driver has received:
63
- - Passenger name
64
- - Pickup time and location
65
- - Fare confirmed
66
- - QR code (encodes the tourist's PIN)
65
+ Payment confirmation is automatic — Stripe sends a webhook when the tourist completes payment. The operations agent processes this and:
67
66
 
68
- ## Phase 6: Driver Pickup Reminders
67
+ 1. Generates the pickup PIN and QR code
68
+ 2. Messages the tourist with driver details and PIN
69
+ 3. Messages the driver with passenger details and QR code
70
+ 4. Updates the booking record
69
71
 
70
- For advance bookings (pickup time is more than 1 hour from confirmation):
72
+ You will see these messages appear in your conversation via cross-agent echo. Acknowledge the details to the tourist and explain the PIN verification process.
71
73
 
72
- 1. **Evening before** — If the pickup is the next day, message the driver the evening before: `[BGL-XXXX] Reminder: pickup tomorrow at [time], [location]. Passenger: [name], [passengers] pax. Please confirm you're available.`
73
- 2. **2 hours before** — Message the driver: `[BGL-XXXX] Pickup in 2 hours at [location]. Passenger: [name]. Please confirm.`
74
- 3. **30 minutes before** — Final reminder: `[BGL-XXXX] Pickup in 30 minutes at [location]. Passenger [name] is expecting you.`
74
+ ## Driver Pickup Reminders
75
75
 
76
- If the driver does not confirm the evening-before or 2-hour reminder, escalate:
77
- - Attempt to reach the driver again
78
- - If no response, begin sourcing a replacement driver immediately
79
- - Notify the tourist only when you have a confirmed replacement or have exhausted options — don't create anxiety prematurely
76
+ The operations agent handles driver reminders for advance bookings via its periodic heartbeat:
80
77
 
81
- For same-day bookings with less than 2 hours lead time, send a single confirmation reminder 15 minutes before pickup.
78
+ 1. **Evening before** Reminder with pickup details, request confirmation
79
+ 2. **2 hours before** — Second reminder, request confirmation
80
+ 3. **30 minutes before** — Final reminder
82
81
 
83
- Also message the tourist at the 2-hour mark for advance bookings: "Your ride is confirmed for [time]. [Driver name] will be at [location]." This reassures them without requiring action.
82
+ If a driver doesn't confirm, the operations agent escalates attempting to reach the driver again or sourcing a replacement. The tourist is notified only when there's actionable information (confirmed replacement or exhausted options).
84
83
 
85
- ## Phase 7: Booking Record
84
+ ## Booking Record
86
85
 
87
- Every confirmed booking must be recorded in memory for audit. Store:
86
+ Every confirmed booking is recorded by the operations agent at `shared/bookings/{job-id}.md`. Fields:
88
87
 
89
88
  - **Job ID** (e.g. `BGL-0042`)
90
89
  - **Tourist** — WhatsApp ID, name if given, number of passengers
@@ -95,9 +94,7 @@ Every confirmed booking must be recorded in memory for audit. Store:
95
94
  - **PIN** — the 4-digit pickup code
96
95
  - **Status** — one of: `confirmed`, `reminded`, `picked_up`, `completed`, `cancelled`, `no_show`
97
96
  - **Timestamps** — when each status transition occurred
98
- - **Rating** — post-ride ratings (added after Phase 7 feedback)
99
-
100
- Write the booking record to memory at `bookings/{job-id}.md` on confirmation. Update the record at each lifecycle event (reminder sent, pickup, completion, rating). This creates a complete audit trail per booking.
97
+ - **Rating** — post-ride ratings (added after feedback)
101
98
 
102
99
  The admin agent uses these records for operational oversight — booking summaries, driver reliability tracking, and dispute resolution.
103
100
 
@@ -105,7 +102,7 @@ The admin agent uses these records for operational oversight — booking summari
105
102
 
106
103
  **Tourist wants to cancel after payment:** Explain the booking fee is non-refundable (commitment device for both sides). Offer to reschedule at no extra charge.
107
104
 
108
- **Driver cancels:** Immediately notify the tourist. Attempt to find a replacement driver. If no replacement is available, explain the situation and offer to try again for an alternative time.
105
+ **Driver cancels:** The operations agent handles driver communication. It will notify you (via cross-agent echo) and attempt to source a replacement. Relay the status to the tourist.
109
106
 
110
107
  **Tourist requests a route you don't know:** Be honest. Check the knowledge base. If it's not covered, explain you can still try to negotiate but can't give a reliable fare estimate.
111
108
 
@@ -0,0 +1,61 @@
1
+ # Route Learning — Building Driver Route Affinity
2
+
3
+ ## What This Is
4
+
5
+ Route affinity is the service's accumulated understanding of which drivers tend to perform best on which routes. It is not declared upfront — it emerges from booking outcomes and ratings over time. A driver who consistently earns strong ratings on airport-to-north-coast runs becomes a stronger candidate for that route in future negotiations. A driver with a poor completion record on east coast routes gets deprioritised for those bookings, even if they quote competitively.
6
+
7
+ ## Where the Data Lives
8
+
9
+ Booking records in memory (`bookings/{job-id}.md`) contain the raw data:
10
+ - The route (pickup → destination)
11
+ - Which driver completed the ride
12
+ - The rating received
13
+ - Whether the booking completed or was cancelled/no-show
14
+
15
+ Driver memory profiles (`drivers/{name}.md`) contain the aggregated view. The Route History section builds as bookings complete:
16
+
17
+ ```
18
+ ## Route History
19
+ - 2026-02-14: Airport → Nungwi | BGL-0018 | Rating: 4.6
20
+ - 2026-02-28: Airport → Stone Town | BGL-0031 | Rating: 4.1
21
+ - 2026-03-01: Stone Town → Paje | BGL-0037 | Rating: 4.8
22
+ ```
23
+
24
+ ## How Affinity is Used During Driver Selection (Phase 2)
25
+
26
+ When selecting ~3 drivers to contact for a negotiation, prefer drivers whose history shows:
27
+ - Completed rides on this specific route (or similar routes in the same area)
28
+ - Consistent ratings above 4.0 on those runs
29
+
30
+ New drivers (no history) are treated neutrally — they need the opportunity to build a record. Never exclude a driver solely for lacking route history.
31
+
32
+ Do not apply affinity rigidly. A great driver with no history on a route is still a viable choice. Route history is a signal that improves selection over time, not a gatekeeping rule.
33
+
34
+ ## How the Public Agent Maintains Route History
35
+
36
+ After each completed booking, the public agent adds a route entry to the driver's memory profile:
37
+
38
+ ```
39
+ - [date]: [Pickup] → [Destination] | [job-id] | Rating: [score]
40
+ ```
41
+
42
+ If the ride was cancelled, a no-show, or ended in a complaint, note it:
43
+
44
+ ```
45
+ - [date]: Airport → Nungwi | BGL-0052 | No-show
46
+ ```
47
+
48
+ These entries are the raw material the admin agent uses to identify patterns.
49
+
50
+ ## Admin Agent: Periodic Route Analysis
51
+
52
+ The admin agent should periodically review route history across the driver roster and surface meaningful patterns to the operator:
53
+
54
+ - Drivers consistently rated above 4.5 on a specific route — flag as strong matches worth prioritising
55
+ - Drivers consistently rated below 3.5 on a specific route — recommend exclusion from that route
56
+ - Routes where no driver achieves strong ratings — flag as a coverage or quality gap worth investigating
57
+ - Drivers whose ratings vary sharply by route — worth noting (excellent on airport runs, poor on east coast, for example)
58
+
59
+ ## Limits
60
+
61
+ Patterns need volume to be meaningful. A driver with two rides on a route does not have a pattern — they have a sample. Apply judgement: five or more completed rides on a route with consistent ratings is a reliable signal. Fewer than that warrants patience rather than conclusions.
@@ -0,0 +1,28 @@
1
+ ---
2
+ name: stripe
3
+ description: "Generates Stripe Checkout Session payment links for Beagle booking fees, and verifies payment status before releasing driver details."
4
+ metadata: {"taskmaster":{"always":false,"emoji":"💳","skillKey":"stripe"}}
5
+ ---
6
+
7
+ # Stripe — Payment Links
8
+
9
+ ## Your Role
10
+
11
+ Generate a Stripe Checkout Session link for each confirmed booking and verify payment before releasing driver details to the tourist.
12
+
13
+ ## When to Activate
14
+
15
+ Load this skill when the tourist has chosen an offer and the booking is ready to confirm (Phase 4 of the ride-matching flow).
16
+
17
+ ## Reference Table
18
+
19
+ | Task | When | Reference |
20
+ |------|------|-----------|
21
+ | Create payment link | Tourist confirms offer, booking fee needs collecting | `references/payment-links.md` |
22
+
23
+ ## Key Rules
24
+
25
+ - **Never release driver details before payment is confirmed.** Always verify the Stripe session status before proceeding to Phase 5.
26
+ - **Minimum fee is $2, maximum is $5.** Calculate as 5% of the agreed fare, clamped to this range.
27
+ - **Each booking gets its own Checkout Session.** Never reuse a payment link between bookings.
28
+ - **Test mode is fine to start.** Use `sk_test_...` keys during setup. Switch to live keys when real bookings begin.
@@ -0,0 +1,71 @@
1
+ # Stripe Payment Links — Checkout Session Creation
2
+
3
+ ## Booking Fee Calculation
4
+
5
+ The tourist pays a booking fee to confirm their ride:
6
+
7
+ ```
8
+ fee = max($2, min($5, fare × 0.05))
9
+ ```
10
+
11
+ In cents (Stripe uses the smallest currency unit):
12
+
13
+ ```
14
+ fee_cents = max(200, min(500, round(fare_usd × 5)))
15
+ ```
16
+
17
+ Examples: $20 fare → $2.00 fee | $50 fare → $2.50 fee | $100 fare → $5.00 fee
18
+
19
+ ## Creating a Checkout Session
20
+
21
+ Call the Stripe Checkout Sessions API:
22
+
23
+ ```
24
+ POST https://api.stripe.com/v1/checkout/sessions
25
+ Authorization: Bearer {stripe_secret_key}
26
+ Content-Type: application/x-www-form-urlencoded
27
+
28
+ mode=payment
29
+ payment_method_types[]=card
30
+ line_items[0][price_data][currency]=usd
31
+ line_items[0][price_data][unit_amount]={fee_cents}
32
+ line_items[0][price_data][product_data][name]=Beagle booking fee — {job_id}
33
+ line_items[0][price_data][product_data][description]={route} on {date}
34
+ line_items[0][quantity]=1
35
+ metadata[booking_id]={job_id}
36
+ metadata[tourist_phone]={tourist_phone}
37
+ metadata[negotiated_fare]={fare_usd}
38
+ ```
39
+
40
+ The Stripe secret key is the `stripe` key stored in your API key config (`sk_test_...` for test mode, `sk_live_...` for production).
41
+
42
+ The response includes a `url` field — this is the hosted checkout page to send the tourist.
43
+
44
+ ## Sending the Link
45
+
46
+ Send the tourist the checkout URL with context:
47
+
48
+ > "To confirm your booking, pay the $[fee] booking fee here: [url]
49
+ > This locks in your ride. You pay $[fare] directly to your driver at the end of the journey."
50
+
51
+ ## Verifying Payment
52
+
53
+ Before releasing driver details (Phase 5), verify the session is paid:
54
+
55
+ ```
56
+ GET https://api.stripe.com/v1/checkout/sessions/{session_id}
57
+ Authorization: Bearer {stripe_secret_key}
58
+ ```
59
+
60
+ Check `payment_status == "paid"`. If not yet paid, wait for the tourist to say they've paid — then verify. Do not take their word alone; always confirm with the API before proceeding.
61
+
62
+ ## What to Store in the Booking Record
63
+
64
+ Add these fields to `bookings/{job-id}.md` when the session is created and confirmed:
65
+
66
+ ```
67
+ stripe_session_id: cs_...
68
+ booking_fee_usd: 2.50
69
+ payment_status: pending → paid (update when confirmed)
70
+ paid_at: [timestamp from session]
71
+ ```
@@ -21,6 +21,7 @@ Ask conversationally, one thing at a time:
21
21
  - **Location**
22
22
  - **Working hours**
23
23
  - **Website** (if they have one)
24
+ - **Sales orientation** — Ask: "Would you like your assistant to actively help close enquiries — for example, suggesting next steps, offering to book, or nudging undecided customers? Or should it just handle questions and take messages?" This determines whether the public agent proactively guides customers toward commitment or stays in a passive enquiry-handling role.
24
25
 
25
26
  ## Step 4: Save Everything
26
27
 
@@ -39,7 +40,10 @@ Use your `write` tool to update workspace files and `memory_write` for memory fi
39
40
  **Website summary** (if a website was provided):
40
41
  5. **`memory/public/website.md`** — Use `document_read` to fetch the website, then `memory_write` to save a comprehensive summary covering: what the business does, services offered, pricing (if public), location and coverage area, contact details, opening hours, and any other customer-relevant information. This becomes a key knowledge source for the public agent when answering customer enquiries.
41
42
 
42
- All other files (SOUL.md, AGENTS.md, etc.) are already generic and reference USER.md or shared memory — no changes needed.
43
+ **Public agent personality** (only if sales orientation was chosen):
44
+ 6. **`../public/SOUL.md`** — The default personality is a passive front desk that takes messages and answers questions. If the owner chose sales mode, use `read` to load the current file, then `write` to make the public agent purposeful about closing. The core change: the agent should view guiding customers toward the next step (booking, signing up, committing) as part of being genuinely helpful — not as being pushy. Update the tagline to include "purposeful", add to the core truths that asking for commitment is part of being helpful, and add "guide interested customers toward booking or next steps" to the capabilities list. Do not remove existing content — augment it.
45
+
46
+ All other files (AGENTS.md, etc.) are already generic and reference USER.md or shared memory — no changes needed.
43
47
 
44
48
  ## Step 5: Authorize Admin Devices
45
49
 
@@ -157,11 +157,10 @@ When something needs the business owner's direct attention:
157
157
  - The business owner will get back to them
158
158
 
159
159
  Escalate when:
160
- - Questions you can't answer confidently
160
+ - Questions you can't answer from memory or product knowledge
161
161
  - Pricing negotiations or custom requests
162
162
  - Complaints
163
163
  - Urgent or emergency requests
164
- - Anything you're uncertain about
165
164
 
166
165
  ---
167
166
 
@@ -0,0 +1,111 @@
1
+ ---
2
+ name: buyer-feedback
3
+ description: Collect structured post-viewing feedback from property buyers via WhatsApp. Sends a conversational feedback request after viewings, captures sentiment, interest level, objections, and next steps. Stores feedback per-property and per-buyer for vendor reporting.
4
+ emoji: 🏠
5
+ always: false
6
+ ---
7
+
8
+ # Buyer Feedback Collection
9
+
10
+ Collect post-viewing feedback from buyers in a natural, conversational way via WhatsApp. This is NOT a form — it's a friendly check-in that captures structured data.
11
+
12
+ ## When to Trigger
13
+
14
+ This skill applies when:
15
+ - The agent (or a scheduled event) initiates a post-viewing feedback request
16
+ - A buyer messages after a viewing with unsolicited feedback
17
+ - The business owner asks you to collect feedback on a specific viewing
18
+
19
+ ## Feedback Flow
20
+
21
+ ### Step 1: Opening
22
+
23
+ Send a warm, brief message referencing the specific property and viewing date. Keep it personal — use the buyer's first name and the property address.
24
+
25
+ Example:
26
+ > Hi [Name]! Hope you're well. Just wanted to check in after your viewing at [Address] on [Date]. How did you find it? 😊
27
+
28
+ ### Step 2: Capture Key Data Points
29
+
30
+ Through natural conversation (NOT a bullet list of questions), gather:
31
+
32
+ 1. **Overall impression** — Did they like the property? First reaction.
33
+ 2. **Interest level** — Are they considering making an offer? Scale: Hot / Warm / Cool / Not interested
34
+ 3. **Positives** — What did they like most?
35
+ 4. **Concerns/objections** — What put them off or gave them pause? (Price, condition, location, size, layout, parking, garden, neighbours, noise, etc.)
36
+ 5. **Comparison** — How does it compare to others they've seen?
37
+ 6. **Next steps** — Would they like a second viewing? Are they ready to make an offer? Need more information?
38
+ 7. **Price perception** — Do they think it's fairly priced? (Don't ask directly — infer from conversation or ask tactfully: "How did you feel about the asking price?")
39
+
40
+ ### Step 3: Follow-up Questions
41
+
42
+ Based on their responses, ask ONE follow-up at a time. Don't fire multiple questions. Match their energy — if they're brief, be brief. If they're chatty, engage.
43
+
44
+ If they express interest:
45
+ - "Would you like to book a second viewing?"
46
+ - "Is there anything else you'd like to know about the property?"
47
+
48
+ If they have concerns:
49
+ - Acknowledge the concern genuinely
50
+ - Offer context if you have it (e.g. "The vendor is open to offers" or "There's planning permission for an extension")
51
+ - Don't be pushy — respect their assessment
52
+
53
+ If not interested:
54
+ - Thank them warmly
55
+ - Ask what they ARE looking for (captures buyer criteria for future matching)
56
+
57
+ ### Step 4: Store Feedback
58
+
59
+ After the conversation, save structured feedback to TWO locations:
60
+
61
+ **Property file** — `memory/shared/properties/[property-slug]/feedback/[date]-[buyer-name].md`
62
+ **Buyer profile** — `memory/users/[phone]/viewings/[date]-[property-slug].md`
63
+
64
+ Use this template:
65
+
66
+ ```markdown
67
+ # Viewing Feedback
68
+
69
+ - **Property:** [Full address]
70
+ - **Date:** [Viewing date]
71
+ - **Buyer:** [Name] ([Phone])
72
+ - **Agent present:** [Name if known]
73
+
74
+ ## Feedback
75
+
76
+ - **Overall impression:** [Their words / summary]
77
+ - **Interest level:** [Hot / Warm / Cool / Not interested]
78
+ - **Positives:** [What they liked]
79
+ - **Concerns:** [What they didn't like or worried about]
80
+ - **Price perception:** [Fair / Too high / Bargain / Not discussed]
81
+ - **Comparison:** [How it ranked vs other properties]
82
+ - **Next steps:** [Second viewing / Offer / Thinking / Declined]
83
+
84
+ ## Quotes
85
+ > [Any notable direct quotes from the buyer]
86
+
87
+ ## Notes
88
+ [Any additional context — body language cues mentioned, timing factors, chain status, etc.]
89
+ ```
90
+
91
+ ## Vendor Reporting
92
+
93
+ When the business owner or agent asks for a viewing feedback summary for a property:
94
+
95
+ 1. Read all feedback files from `memory/shared/properties/[property-slug]/feedback/`
96
+ 2. Compile a summary showing:
97
+ - Total viewings to date
98
+ - Interest breakdown (Hot/Warm/Cool/Not interested)
99
+ - Common positives (themes across multiple viewers)
100
+ - Common objections (recurring concerns)
101
+ - Price perception trend
102
+ - Actionable recommendations (e.g. "3 of 5 viewers mentioned the dated kitchen — consider adjusting marketing to acknowledge renovation potential")
103
+
104
+ ## Rules
105
+
106
+ - **Never fabricate feedback.** Only report what buyers actually said.
107
+ - **Never share one buyer's feedback with another buyer.** Feedback goes to the vendor/agent only.
108
+ - **Be genuinely conversational.** Buyers who feel interrogated give shallow answers. Buyers who feel heard give honest ones.
109
+ - **Respect "no."** If a buyer doesn't want to give feedback, thank them and move on. Don't chase.
110
+ - **Timing matters.** Best results come 2-24 hours after the viewing. Same day is ideal. After 48 hours, response rates drop sharply.
111
+ - **One message at a time.** Never send a wall of questions. This is a conversation, not a survey.
@@ -0,0 +1,126 @@
1
+ ---
2
+ name: property-enquiry
3
+ description: Structured intake for new buyer enquiries. Captures requirements, financial position, chain status, and timeline to enable property matching and prioritisation.
4
+ ---
5
+
6
+ # Property Enquiry
7
+
8
+ You handle initial buyer contact — capturing everything the agent needs to qualify them and match properties effectively.
9
+
10
+ ## When This Skill Applies
11
+
12
+ - A new buyer contacts about a specific property
13
+ - A buyer registers interest without a specific property in mind
14
+ - A buyer's requirements or circumstances change and need updating
15
+
16
+ ## Initial Enquiry — Specific Property
17
+
18
+ When someone contacts about a listed property:
19
+
20
+ 1. **Acknowledge warmly** — confirm the property they're asking about
21
+ 2. **Answer their immediate question first** — price, availability, key details. Don't interrogate before helping.
22
+ 3. **Then gather qualification info** conversationally (not as a form):
23
+
24
+ ### Must-Have Information
25
+ - **Full name**
26
+ - **Phone number** (if not already known)
27
+ - **Email** (for property details/brochures)
28
+ - **Current situation:** First-time buyer / homeowner selling / renting / investor / cash buyer
29
+ - **Chain status:** If selling, is their property on the market? Under offer? Sold subject to contract?
30
+ - **Budget:** What's their upper limit? Is this based on an Agreement in Principle (AIP)?
31
+ - **Mortgage:** Do they have an AIP? With which lender? (If not, suggest they get one)
32
+ - **Timeline:** When do they need/want to move?
33
+
34
+ ### Nice-to-Have Information
35
+ - **Property requirements:** Beds, bathrooms, garden, parking, specific features
36
+ - **Area preferences:** Which towns/villages, school catchments, commute considerations
37
+ - **Deal-breakers:** What would rule a property out?
38
+ - **Other agents:** Are they registered with other agents in the area?
39
+
40
+ 4. **Create/update buyer profile** at `memory/users/{phone}/profile.md` with all captured info
41
+ 5. **Offer next steps:**
42
+ - Book a viewing if appropriate
43
+ - Send property details/brochure
44
+ - Suggest similar properties if this one doesn't match perfectly
45
+ - Recommend mortgage advisor if no AIP
46
+
47
+ ## General Registration (No Specific Property)
48
+
49
+ When a buyer wants to register without a specific listing:
50
+
51
+ 1. Capture the same qualification info above
52
+ 2. Focus more on **requirements and preferences** since there's no anchor property
53
+ 3. Save profile and confirm you'll notify them of matching properties
54
+ 4. If any current listings match, suggest them immediately
55
+
56
+ ## Buyer Profile Format
57
+
58
+ ```markdown
59
+ ---
60
+ type: buyer
61
+ status: active
62
+ registered: YYYY-MM-DD
63
+ last_contact: YYYY-MM-DD
64
+ qualified: true/false
65
+ ---
66
+
67
+ # Buyer Profile — [Name]
68
+
69
+ **Phone:** [Number]
70
+ **Email:** [Email]
71
+
72
+ ## Financial Position
73
+ - **Budget:** [Amount]
74
+ - **AIP:** [Yes/No — Lender, amount, expiry if known]
75
+ - **Buyer type:** [First-time / Selling / Cash / Investor]
76
+ - **Chain:** [Details of their chain position]
77
+ - **Deposit:** [If known]
78
+
79
+ ## Requirements
80
+ - **Bedrooms:** [Min]
81
+ - **Bathrooms:** [Min]
82
+ - **Property type:** [House / flat / bungalow / any]
83
+ - **Areas:** [Preferred locations]
84
+ - **Must-haves:** [Garden, parking, garage, etc.]
85
+ - **Deal-breakers:** [What they won't accept]
86
+ - **School catchments:** [If relevant]
87
+
88
+ ## Timeline
89
+ - **When to move:** [Date or timeframe]
90
+ - **Urgency:** [High / Medium / Low]
91
+ - **Chain dependent:** [Yes/No]
92
+
93
+ ## Properties Viewed
94
+ - [Date] — [Address] — [Outcome / Feedback]
95
+
96
+ ## Notes
97
+ [Agent observations, communication preferences, etc.]
98
+ ```
99
+
100
+ ## Qualification Rules
101
+
102
+ A buyer is **qualified** when you have:
103
+ - ✅ Name + contact details
104
+ - ✅ Budget confirmed (ideally with AIP)
105
+ - ✅ Chain status understood
106
+ - ✅ Timeline established
107
+
108
+ A buyer is **unqualified** until these are captured. Unqualified buyers can still view properties, but the agent should be informed of their status.
109
+
110
+ ## Prioritisation
111
+
112
+ Flag high-priority buyers to the agent:
113
+ - **Cash buyers** — no chain, fast completion
114
+ - **First-time buyers with AIP** — no chain below them
115
+ - **Buyers under offer on their own property** — chain progressing
116
+ - **Investors** — often fast, but check funding source
117
+
118
+ ## Privacy Rules
119
+
120
+ - Financial details are **confidential** — never share one buyer's budget or position with another buyer
121
+ - Mortgage details stay in the buyer's profile only
122
+ - If a vendor asks about a buyer's position, share only what the buyer has consented to (typically: qualified/unqualified, chain-free or not, mortgage arranged)
123
+
124
+ ## Matching
125
+
126
+ When new properties come to market, check active buyer profiles for matches. Proactively notify buyers whose criteria match within 24 hours of a new instruction.