reno-stars-coordinator
A single human-in-the-loop lifecycle agent that runs the Reno Stars renovation
project lifecycle end-to-end. It owns the workflow logic and calls the existing
services (Odoo CRM, invoice-service, Google Calendar, Reno Stars Companion, Resend)
rather than replacing them. Built as an EnterSkill ability (repo root = the
ability) + a reno-work MCP (Python) that is the CRM/ledger spine.
Design canvas: ~/Downloads/reno-stars-coordinator-design.html.
The lifecycle (a state machine, not a flat list)
A resolved human nod transitions a project and auto-spawns the next stage's tasks; every customer/worker-facing action is nod-gated; all state is durable in Odoo (the agent is stateless between wakes).
⓪ intake → ① quote (橱柜/台面/陈师傅) → ①b send + 3-day follow-up → accepted/lost
accepted → ② start date (→ Calendar) + site/material checklists (each nodded)
→ ③ weekly milestone (until done AND fully paid)
→ ④ Google review + monthly care
lost → ④ monthly re-engage (reactivate_lead re-enters ① on a bite)
✉ inquiry → triage + reply for inbound that isn't a clean lead/nod
Layout
| Path | What |
|---|---|
SKILL.md |
root engine — correlation, idle drain, state transitions, the tool map |
children/<stage>/SKILL.md |
intake · quoting · scheduling · construction · aftercare · inquiry |
mcp/renowork/ |
the reno-work MCP (DI package): tools, lifecycle SSOT, Odoo/invoice/email/calendar/companion clients |
mcp/server.py |
stdio JSON-RPC entrypoint |
mcp/digest_provider.py |
idle-digest provider (overdue coordinator tasks) |
config/ |
routing.md, cadences.md |
workspace/template.yaml · config.yaml |
workspace manifest (channels + reno-work + skill; delivery_mode=poll; idle prompt) |
.gitea/workflows/ci.yml |
per-function unit tests + stdio smoke |
The reno-work tools
Lifecycle transitions (auto-spawn the next stage): create_project, record_quote,
mark_quote_sent, set_outcome, reactivate_lead, set_start_date,
begin_construction, complete_project. Stage actions (§7 — real, confirm-gated
sends): send_material_list, request_review (Resend email), push_site_checklist
(Companion), set_start_date books Google Calendar directly. Ledger/CRM:
match_customer, create_customer, create_task, mark_task_done, promote_inbound,
fetch_routing, get_payment_status, send_reminder. Robustness: reopen_task
(undo), list_triage (dead-letter), rearm_task (cadence loop). 开工 dispatch queue:
enqueue_worker_dispatch, list_pending_dispatch, mark_dispatch_sent.
Develop
python3.11 -m pytest mcp/ -q # unit tests (no live Odoo/network)
printf '%s\n%s\n' '{"jsonrpc":"2.0","id":1,"method":"initialize"}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/list"}' | python3.11 mcp/server.py
Writes are gated by RENO_WORK_DRY_RUN (any of ""/0/false/no/off = LIVE;
anything else = shadow/dry). Integration clients (email/calendar/companion) stay inert
until their secrets are set, falling back to an agent_action for the host canvas.
Secrets resolve env → workspace self-fetch → local-dev config/env.json.