@rubytech/create-maxy-code 0.1.111 → 0.1.112

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 (28) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/plugins/memory/references/schema-estate-agent.md +51 -1
  3. package/payload/platform/plugins/venture-studio/PLUGIN.md +6 -1
  4. package/payload/platform/plugins/venture-studio/bin/scaffold.sh +1 -1
  5. package/payload/platform/plugins/venture-studio/skills/brand-pack/SKILL.md +1 -1
  6. package/payload/platform/plugins/venture-studio/skills/investor-data-room/SKILL.md +27 -14
  7. package/payload/platform/plugins/venture-studio/skills/investor-data-room/references/business-plan-template.md +7 -4
  8. package/payload/platform/plugins/venture-studio/skills/investor-data-room/references/data-room-structure.md +6 -5
  9. package/payload/platform/plugins/venture-studio/skills/investor-data-room/references/deck-blueprint-template.md +7 -6
  10. package/payload/platform/plugins/venture-studio/skills/office-hours/SKILL.md +8 -9
  11. package/payload/platform/plugins/venture-studio/skills/zero-to-prototype/SKILL.md +4 -0
  12. package/payload/premium-plugins/real-agent/BUNDLE.md +3 -2
  13. package/payload/premium-plugins/real-agent/agents/listing-curator.md +133 -0
  14. package/payload/premium-plugins/real-agent/plugins/brochures/skills/a4-print-documents/SKILL.md +1 -1
  15. package/payload/premium-plugins/real-agent/plugins/brochures/skills/brand-design/SKILL.md +5 -11
  16. package/payload/premium-plugins/real-agent/plugins/brochures/skills/make-brochure/SKILL.md +7 -7
  17. package/payload/premium-plugins/real-agent/plugins/brochures/skills/property-extract/SKILL.md +31 -39
  18. package/payload/premium-plugins/real-agent/plugins/brochures/skills/property-market-report/SKILL.md +4 -4
  19. package/payload/premium-plugins/real-agent/plugins/brochures/skills/property-socials/SKILL.md +3 -2
  20. package/payload/premium-plugins/venture-studio/PLUGIN.md +6 -1
  21. package/payload/premium-plugins/venture-studio/bin/scaffold.sh +1 -1
  22. package/payload/premium-plugins/venture-studio/skills/brand-pack/SKILL.md +1 -1
  23. package/payload/premium-plugins/venture-studio/skills/investor-data-room/SKILL.md +27 -14
  24. package/payload/premium-plugins/venture-studio/skills/investor-data-room/references/business-plan-template.md +7 -4
  25. package/payload/premium-plugins/venture-studio/skills/investor-data-room/references/data-room-structure.md +6 -5
  26. package/payload/premium-plugins/venture-studio/skills/investor-data-room/references/deck-blueprint-template.md +7 -6
  27. package/payload/premium-plugins/venture-studio/skills/office-hours/SKILL.md +8 -9
  28. package/payload/premium-plugins/venture-studio/skills/zero-to-prototype/SKILL.md +4 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/create-maxy-code",
3
- "version": "0.1.111",
3
+ "version": "0.1.112",
4
4
  "description": "Install Maxy — AI for Productive People",
5
5
  "bin": {
6
6
  "create-maxy-code": "./dist/index.js"
@@ -12,12 +12,59 @@ When loading this reference, confirm: "Using schema-base + schema-estate-agent".
12
12
 
13
13
  | Entity | Neo4j Label | Schema.org Type | Required Properties |
14
14
  |--------|-------------|-----------------|---------------------|
15
- | Listing | `Listing` | `schema:RealEstateListing` | `accountId`, `address` (id), `listingType` (sale/let), `price`, `status`, `bedrooms`, `bathrooms`, `sqft` |
15
+ | Listing | `Listing` | `schema:RealEstateListing` | `accountId`, `slug`, `displayName`, `listingType` (sale/let), `status`, `sourceSystem`, `sourceId`, `scope`, `heroImageUrl`*, `pageUrl`*, `blurb` |
16
16
  | Property | `Property` | `schema:Accommodation` | `accountId`, `address` (id), `propertyType`, `tenure`, `epcRating`, `features` |
17
17
  | Viewing | `Viewing` | `schema:Event` (subtype) | `accountId`, `listing` (id), `applicant` (id), `date`, `feedback`, `outcome` |
18
18
  | Applicant | `Applicant` | `schema:Person` (extended) | Base Person properties + `budget`, `tenure`, `moveDate`, `requirements` |
19
19
  | Offer | `Offer` | `schema:Offer` | `accountId`, `listing` (id), `applicant` (id), `amount`, `conditions`, `status`, `date` |
20
20
 
21
+ \* `heroImageUrl` and `pageUrl` are required for any Listing whose `status` is `for-sale`, `under-offer`, or `sold` (anything publicly listable). Listings with `status: "off-market"` or `status: "withdrawn"` are exempt — they describe stock not currently visible to visitors and have no public listing page to point at. The curator writes `status: "off-market"` and skips the two URLs when the source has no public marketing.
22
+
23
+ ### Listing — full property set
24
+
25
+ The required-properties column above is the minimum a Listing must carry. The complete property set the `listing-curator` specialist writes:
26
+
27
+ **Visitor-renderable (the public agent reads these to assemble property cards):**
28
+ - `slug` — URL-safe identifier derived from address (`griffin-house-upper-church-street-chepstow`)
29
+ - `displayName` — human-readable title (`Griffin House, Upper Church Street, Chepstow NP16 5EX`)
30
+ - `heroImageUrl` — primary image URL that will render inline in the chat
31
+ - `blurb` — single marketing-grade sentence, ≤ 280 characters, suitable as alt-text and short caption
32
+ - `pageUrl` — the live listing URL the visitor follows to view full details
33
+
34
+ **Marketing entity:**
35
+ - `listingType` — `sale` or `let`
36
+ - `status` — `for-sale` / `under-offer` / `sold` / `withdrawn` / `off-market`
37
+ - `price` — integer in pence (no currency symbol, no commas)
38
+ - `priceQualifier` — `guide` / `offers-over` / `offers-in-excess` / `poa` / `fixed-price` / `auction` (null when not stated)
39
+ - `bedrooms`, `bathrooms`, `receptionRooms` — integers (null when unknown)
40
+ - `floorAreaSqft` — integer square feet (null when unknown)
41
+
42
+ **Address (carried directly on the Listing rather than via a separate PostalAddress when only the formatted address is known — addresses upgrade to a linked `:PostalAddress` once structured):**
43
+ - `postcode` — UK postcode, upper-case, single-space-separated outward/inward (`NP16 5EX`)
44
+ - `addressLine` — first line of the address
45
+ - `town`
46
+
47
+ **Structured detail (optional):**
48
+ - `propertyType` — `cottage` / `detached` / `semi-detached` / `terraced` / `flat` / `bungalow` / etc.
49
+ - `tenure` — `freehold` / `leasehold` / `share-of-freehold` / `commonhold`
50
+ - `description` — the full descriptive copy from the source (the `body` of any legacy KnowledgeDocument; the description block of the source listing)
51
+ - `imageUrls` — string array of all image URLs (`heroImageUrl` is always also present in this array, at index 0)
52
+ - `floorplanUrls` — string array
53
+ - `epcUrl` — the EPC document URL
54
+
55
+ **Provenance + search:**
56
+ - `sourceSystem` — `loop-crm` / `zip-upload` / `manual`
57
+ - `sourceId` — natural key in the source system (for Loop, the `loopPropertyId`)
58
+ - `ingestedAt`, `lastVerifiedAt` — ISO timestamps
59
+ - `scope` — `public` for listings that should be returned to anonymous visitors via the public memory-search; `shared` for staff-only listings (e.g. pre-marketing pipeline)
60
+ - `embedding` — 768-dim vector (written automatically by `memory-write`)
61
+
62
+ ### Listing — natural-key contract
63
+
64
+ Idempotency key: **`(accountId, sourceSystem, sourceId)`**. The curator MERGEs on this triple. Re-running the curator over the same source record updates the existing Listing in place — fields refresh (status drift over the listing's lifecycle is expected and desired: `for-sale` → `under-offer` → `sold`); no duplicate Listing is ever created.
65
+
66
+ If the source emits multiple distinct listing events tied to a single underlying property (e.g. relisted after withdrawal, then again let separately), each listing event carries its own `sourceId` in the source system and becomes its own `:Listing` node. The two listings share a `:Property` parent via separate `[:FOR_PROPERTY]` edges. The curator never collapses distinct listing events into one node.
67
+
21
68
  ### Applicant vs base Person
22
69
 
23
70
  `Applicant` extends the base `Person` type with property-search-specific properties. Use `Applicant` as an additional label on the `Person` node — the applicant is still a `Person` for base queries, but the extra label carries estate-agent-specific fields like `budget` and `requirements`.
@@ -27,9 +74,12 @@ When loading this reference, confirm: "Using schema-base + schema-estate-agent".
27
74
  ## Relationship Patterns
28
75
 
29
76
  ```
77
+ (:Listing)-[:LISTED_BY]->(:LocalBusiness)
30
78
  (:Listing)-[:FOR_PROPERTY]->(:Property)
31
79
  (:Viewing)-[:FOR_LISTING]->(:Listing)
32
80
  (:Viewing)-[:BY_APPLICANT]->(:Person)
33
81
  (:Offer)-[:ON_LISTING]->(:Listing)
34
82
  (:Offer)-[:FROM_APPLICANT]->(:Person)
35
83
  ```
84
+
85
+ `(:Listing)-[:LISTED_BY]->(:LocalBusiness)` is the mandatory parent edge that every Listing carries — it satisfies the ≥1-adjacency write-gate doctrine ([[feedback_graph_hierarchy_doctrine]]) and names the estate agency that owns the listing. `[:FOR_PROPERTY]` is composed additionally when the underlying physical `:Property` node is known (full structural data captured); it is optional because Listings frequently land before Property structural data has been collected.
@@ -4,6 +4,7 @@ description: "Founding-a-business agent. Drives an operator from raw idea to fun
4
4
  requires:
5
5
  - projects
6
6
  - work
7
+ - deep-research
7
8
  metadata: {"platform":{"always":false,"embed":["admin"],"pluginKey":"venture-studio","optional":true,"recommended":true}}
8
9
  ---
9
10
 
@@ -62,8 +63,8 @@ The script's three effects:
62
63
  2. **Creates the `Project` node.** Tier `full` (data-room work is multi-phase). Project name is the business's working name; description references the data-room root path.
63
64
  3. **Enumerates the eight artefact Tasks** in section order — one transaction, atomic with the Project. The work-item list the script pre-seeds:
64
65
  - **Stage 1 — Office-hours design doc** → produces `01-narrative/office-hours-design.md` (skill: `office-hours`)
65
- - **Brand pack** → produces brand identity files into `06-product-ip/brand/` (skill: `brand-pack`)
66
66
  - **Stage 2 — Wedge validation + landing page + PRD** → produces `01-narrative/{PMF, LANDING, PRD}.md` (skill: `zero-to-prototype`)
67
+ - **Brand pack** → produces brand guidelines + summary + color palette + typography system + tone-of-voice (voice/messaging/copy) + logo guidelines into `06-product-ip/brand/` (skill: `brand-pack`)
67
68
  - **Stage 3 — Business plan** → produces `01-narrative/business-plan.md` (skill: `investor-data-room` Stage 3)
68
69
  - **Stage 3b — Term sheet** → produces `html/prospectus/term_sheet.html` (skill: `investor-data-room` Stage 3b)
69
70
  - **Stage 4 — Deck blueprint** → produces `01-narrative/deck-blueprint.md` (skill: `investor-data-room` Stage 4)
@@ -96,6 +97,10 @@ When the operator's intent matches a row but the scaffold does not yet exist, ru
96
97
  - If a section reveals a new artefact the operator wants (e.g. a competitor-claims-rebuttal in `08-market/`), `work-create` a new Task under the same Project, then proceed.
97
98
  - The Project's health signal (green/amber/red) is computed from Task state. Use `project-get` at the start of each turn to surface what's outstanding.
98
99
 
100
+ ## Research routing
101
+
102
+ Every structured-research task — market sizing (TAM/SAM/SOM + CAGR), compliance research (DMCC / ICO ADM / EU AI Act), competitor scans, comparable rounds and exit comparables, named-acquirer enumeration — routes through the `research-assistant` specialist with the five `deep-research` skills (`deep-research`, `book-mirror`, `strategic-reading`, `academic-verify`, `data-research`). Dispatch the specialist; do not call `WebSearch` or `WebFetch` directly from a venture-studio skill. The specialist returns structured findings with citations the data-room artefacts can quote verbatim.
103
+
99
104
  ## Tone
100
105
 
101
106
  Founder-facing. Direct, evidence-based, no flattery. You are the chief of staff for a one-person founding team — your job is to keep every artefact tracked and every deadline visible, while the operator focuses on the parts only they can do (customer conversations, founder signal, vision).
@@ -64,8 +64,8 @@ PAYLOAD=$(cat <<JSON
64
64
  "tier": "full",
65
65
  "workItems": [
66
66
  {"name": "Stage 1 — Office-hours design doc", "description": "Produces 01-narrative/office-hours-design.md via the office-hours skill."},
67
- {"name": "Brand pack", "description": "Produces brand identity (palette, typography, logo) into 06-product-ip/brand/ via the brand-pack skill."},
68
67
  {"name": "Stage 2 — Wedge validation + landing page + PRD", "description": "Produces 01-narrative/{PMF,LANDING,PRD}.md via the zero-to-prototype skill."},
68
+ {"name": "Brand pack", "description": "Produces brand guidelines + summary + color palette + typography system + tone-of-voice (voice/messaging/copy) + logo guidelines into 06-product-ip/brand/ via the brand-pack skill."},
69
69
  {"name": "Stage 3 — Business plan", "description": "Produces 01-narrative/business-plan.md via investor-data-room Stage 3."},
70
70
  {"name": "Stage 3b — Term sheet", "description": "Produces html/prospectus/term_sheet.html via investor-data-room Stage 3b."},
71
71
  {"name": "Stage 4 — Deck blueprint", "description": "Produces 01-narrative/deck-blueprint.md via investor-data-room Stage 4."},
@@ -39,7 +39,7 @@ Before generating anything, gather the following. Ask all questions in a single
39
39
  - Website URL (fetch it if provided — extract existing colors, fonts, tone)
40
40
  - Inspiration brands (brands they admire aesthetically)
41
41
 
42
- If the user provides a URL, use the fetch tool to read it and extract: dominant colors (check CSS or visual description), font choices, tone of copy, and any existing brand signals. Pre-fill your recommendations based on this research.
42
+ If the user provides a URL — their own site, a competitor brand, or an inspiration brand — dispatch the `research-assistant` specialist (with `deep-research` for site copy + visual scan, `WebFetch` available through the specialist) rather than calling `fetch` or `WebFetch` directly from this skill. The specialist returns: dominant colors (CSS or visual description), font choices, tone of copy, and any existing brand signals. Pre-fill your recommendations from the specialist's structured findings.
43
43
 
44
44
  ---
45
45
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: investor-data-room
3
- description: Use when a UK-domiciled founder needs to produce a full seed-raise pack from idea to deliverables: graph-structured data room, 15-section business plan, persuasive prospectus + formal term sheet (with FCA self-certification appendices), 12-slide deck blueprint, print-ready HTML+PDF for each. Trigger phrases include "build me a data room", "draft a business plan", "deck from the business plan", "draft an investment prospectus", "generate a term sheet", "from office hours to investor pack", "set up the fundraise repo". The skill never speculates on financial figures or cap-table values: every number traces to a Companies House filing, a financial model worksheet, or a source citation. Public-facing artefacts contain zero internal workings (no "reconciliation pending", no "open Q" markers, no comparison-to-baseline commentary). Design tokens are harmonised across business plan, prospectus, term sheet, and deck via the operator's project design-tokens spec.
3
+ description: Use when a UK-domiciled founder needs to produce a full seed-raise pack from idea to deliverables: graph-structured data room, 16-section business plan, persuasive prospectus + formal term sheet (with FCA self-certification appendices), 13-slide deck blueprint, print-ready HTML+PDF for each. Trigger phrases include "build me a data room", "draft a business plan", "deck from the business plan", "draft an investment prospectus", "generate a term sheet", "from office hours to investor pack", "set up the fundraise repo". The skill never speculates on financial figures or cap-table values: every number traces to a Companies House filing, a financial model worksheet, or a source citation. Public-facing artefacts contain zero internal workings (no "reconciliation pending", no "open Q" markers, no comparison-to-baseline commentary). Design tokens are harmonised across business plan, prospectus, term sheet, and deck via the operator's project design-tokens spec.
4
4
  allowed-tools:
5
5
  - Bash
6
6
  - Read
@@ -25,13 +25,15 @@ Complete when the data room contains:
25
25
  README.md # data-room index, status snapshot, doctrine
26
26
  01-narrative/
27
27
  office-hours-design.md # ideation working scratchpad
28
- business-plan.md # 15-section business plan
29
- deck-blueprint.md # 12-slide blueprint
28
+ business-plan.md # 16-section business plan
29
+ deck-blueprint.md # 13-slide blueprint
30
+ exit-thesis.md # named acquirers + recent exit comparables
30
31
  02-corporate-legal/
31
32
  README.md # incorporation filings, articles, board minutes
32
33
  incorporation-<co-house-no>-<date>.pdf # IN01 + statement of capital + cap table
33
34
  03-cap-table/
34
35
  README.md # pre/post-investment cap table with PSC notes
36
+ comparables.md # recent comparable rounds (company / pre-money / post-money / multiple / source) cited by the term-sheet valuation
35
37
  04-financials/
36
38
  README.md
37
39
  model_worksheet.md # opening cash, capex, burn, MRR ramp, two-round
@@ -78,7 +80,9 @@ Skip stages that are already complete; do not regenerate stale artefacts blindly
78
80
 
79
81
  ## Stage 1 — Office-hours ideation
80
82
 
81
- Drive a conversational discovery session using the sibling `office-hours` skill. Output a single `office-hours-design.md` capturing:
83
+ Drive a conversational discovery session using the sibling `office-hours` skill. Market sizing and competitor recon during discovery dispatch the `research-assistant` specialist with `deep-research` + `data-research` rather than calling `WebSearch` directly — every market figure that ends up in `08-market/sources.md` must trace to a structured-research citation.
84
+
85
+ Output a single `office-hours-design.md` capturing:
82
86
 
83
87
  - Problem statement
84
88
  - Demand evidence (with numbers and dates)
@@ -113,22 +117,23 @@ References: `references/data-room-structure.md` for the section-by-section purpo
113
117
 
114
118
  ## Stage 3 — Business plan synthesis
115
119
 
116
- Generate `01-narrative/business-plan.md` with **15 sections** following the canonical structure:
120
+ Generate `01-narrative/business-plan.md` with **16 sections** following the canonical structure:
117
121
 
118
122
  1. Executive Summary
119
123
  2. Vision and Mission (Vision / Mission / Doctrine triad)
120
124
  3. The Company (legal entity table + pre-investment cap table)
121
- 4. The Market (TAM/SAM/SOM + structural tailwind + self-employed wedge + domestic adjacency + international upside + pricing)
125
+ 4. The Market (TAM/SAM/SOM bottoms-up with geography-tier floor + CAGR with citation + 3-yr market-expansion thesis + market-share trajectory to 3–8% SAM in 5 yrs + structural tailwind + self-employed wedge + domestic adjacency + international upside + pricing)
122
126
  5. The Product (what it is + wedge product + upsell path + substrate moat + conversation ingestion + network + Anthropic asymmetric capture + human-services layer)
123
- 6. The Business Model (revenue streams + unit economics)
127
+ 6. The Business Model (revenue streams + unit economics — ACV, CAC, LTV, **LTV:CAC**, gross margin, **burn multiple**, churn — each a named line)
124
128
  7. Go-to-Market (Wedge → Beachhead → Blitzscale framework + demand evidence + GTM partners + horse-before-cart logic + geography)
125
129
  8. Competition (three failing categories + RANL differentiation + most-direct-competitor counter)
126
130
  9. Operations (technology stack + data sovereignty + IP ownership chain + compliance posture summary)
127
131
  10. Compliance and regulatory positioning (UK consumer protection + UK data/AI regime + EU AI Act + adjacent UK obligations + moat-not-tax close)
128
132
  11. Team (founders + strategic shareholders + hiring plan)
129
- 12. Financial Plan (12.1 opening balance sheet through 12.7 use of funds)
133
+ 12. Financial Plan (12.1 opening balance sheet through 12.7 use of funds; valuation per round cites `03-cap-table/comparables.md`)
130
134
  13. Risks and Mitigations
131
135
  14. Milestones (the N-month thesis)
136
+ 14b. Exit thesis (target exit value + 5–8-year horizon + exit routes — strategic / PE / IPO — + 3–5 named acquirers with one-line rationale each)
132
137
  15. The bottom line (summary table + close)
133
138
  + Appendices (titled documents only; no internal-only file pointers)
134
139
 
@@ -140,7 +145,14 @@ Generate `01-narrative/business-plan.md` with **15 sections** following the cano
140
145
  - **Financial figures derive from the model worksheet.** Cite "Appendix A" by title.
141
146
  - **No em-dashes between alphabetic words** in user-facing prose (recurring style violation in this project's history; see `references/internal-workings-scrub.md`).
142
147
 
143
- Compliance research is mandatory before drafting Section 10. WebSearch (or equivalent) for: DMCC Act (UK consumer protection for estate-agency), ICO ADM framework (Articles 22A–22D under UK GDPR + ICO 2025 strategy), EU AI Act (force date, high-risk classification for property-financing decisions). Cite each.
148
+ **Research routing across Stage 3.** Every figure sourced from the wider world routes through the `research-assistant` specialist never raw `WebSearch` / `WebFetch` from this skill:
149
+
150
+ - **Section 4 (Market)** — TAM/SAM/SOM citations, CAGR sourcing, market-share trajectory baselines, competitor rebuttal facts: dispatch `research-assistant` with `data-research`.
151
+ - **Section 10 (Compliance)** — DMCC Act (UK consumer protection for estate-agency), ICO ADM framework (Articles 22A–22D under UK GDPR + ICO 2025 strategy), EU AI Act (force date, high-risk classification for property-financing decisions): dispatch `research-assistant` with `academic-verify` to retrieve the primary regulatory texts. Cite each in the body.
152
+ - **Section 12 (Financial — valuation comparables)** — recent comparable rounds that feed `03-cap-table/comparables.md`: dispatch `research-assistant` with `data-research`.
153
+ - **Section 14b (Exit thesis)** — 3–5 named acquirers (strategic / PE / IPO) with one-line rationale each, plus recent comparable exits (company / acquirer / multiple / year / source) that feed the exit section of `03-cap-table/comparables.md`: dispatch `research-assistant` with `data-research`.
154
+
155
+ The specialist returns structured findings; the skill quotes those findings verbatim into the relevant section and into `08-market/sources.md` / `03-cap-table/comparables.md`.
144
156
 
145
157
  References: `references/business-plan-template.md` for the section-by-section template; `references/compliance-research-checklist.md` for the UK + EU regulatory regimes to verify.
146
158
 
@@ -172,20 +184,21 @@ References: `references/termsheet-template.md`.
172
184
 
173
185
  ## Stage 4 — Deck blueprint synthesis
174
186
 
175
- Generate `01-narrative/deck-blueprint.md` as a **12-slide brief** the deck designer can execute. Each slide has Purpose, Headline (one-line message), Body (bullets + figures pulled from the business plan), Visual suggestion, and Source reference. The 12 slides:
187
+ Generate `01-narrative/deck-blueprint.md` as a **13-slide brief** the deck designer can execute. Each slide has Purpose, Headline (one-line message), Body (bullets + figures pulled from the business plan), Visual suggestion, and Source reference. The 13 slides:
176
188
 
177
189
  1. Cover (raise headline + founders)
178
190
  2. Vision (Vision / Mission / Doctrine)
179
- 3. The Market (TAM + tailwind + wedge)
191
+ 3. The Market (TAM + tailwind + wedge + **CAGR with citation**)
180
192
  4. Business Model (subscription + service layer + unit economics)
181
193
  5. Go-to-Market (Wedge → Beachhead → Blitzscale + named partners)
182
194
  6. The Product (substrate + wedge + network + asymmetric capture + services layer)
183
195
  7. Competition (three failing categories + most-direct counter)
184
196
  8. The Team (founders + strategic shareholders)
185
- 9. Economics (P&L summary + cash flow + break-even)
197
+ 9. Economics (P&L summary + cash flow + break-even + **LTV:CAC and burn multiple**)
186
198
  10. The Raise (size, valuation, dilution, instrument, use of funds, IP transfer, follow-on round)
187
- 11. Milestones (M0 to M-final timeline)
188
- 12. Other Information (compliance + platform dependency + contact)
199
+ 11. Exit (target exit value + 5–8-year horizon + routes — strategic / PE / IPO — + 3–5 named acquirers with one-line rationale)
200
+ 12. Milestones (M0 to M-final timeline)
201
+ 13. Other Information (compliance + platform dependency + contact)
189
202
 
190
203
  Production notes attached: format (16:9 landscape, PDF + source deck), design tokens reference (the operator's project design-tokens spec, path supplied at Stage 5 invocation), chart-source consistency with the financial model, speaker-note attribution.
191
204
 
@@ -1,4 +1,4 @@
1
- # Business plan template — 15-section structure
1
+ # Business plan template — 16-section structure
2
2
 
3
3
  The canonical structure used by `01-narrative/business-plan.md`. Every public-facing artefact (deck, prospectus, term sheet) derives from this file. Apply the internal-workings scrub (see `internal-workings-scrub.md`) on every revision.
4
4
 
@@ -14,13 +14,13 @@ Three blocks. **Vision.** Where the company ends up at full execution. **Mission
14
14
  Legal entity table (legal name, Companies House number, incorporation date, registered office, SIC, PSC status, sole proposed director on IN01) + pre-investment cap table (sourced from the IN01 verbatim) + post-investment dilution pointer.
15
15
 
16
16
  ### 4. The Market
17
- Subsections: Size of the addressable market (TAM with citation per figure); Structural tailwind (margin squeeze, regulatory tailwind, or equivalent); Self-employed wedge or analogous high-growth segment; Domestic adjacency (next-vertical expansion); International upside (channel partner enabling it); Pricing and TAM (per-customer ACV × addressable count = TAM number).
17
+ Subsections: Size of the addressable market (TAM with citation per figure, bottoms-up construction; geography-tier floor — **late pre-seed TAM is expected to clear $1B US / $500M UK / $500M EU**, flag if the named geography sits below its floor); Market growth rate (single CAGR figure with citation + a one-line 3-year market-expansion thesis stating why the market gets bigger and why this company captures more share as it does); Market-share trajectory (path to 3-8% of SAM within 5 years, reconciled line-by-line against the ARR target in Section 12); Structural tailwind (margin squeeze, regulatory tailwind, or equivalent); Self-employed wedge or analogous high-growth segment; Domestic adjacency (next-vertical expansion); International upside (channel partner enabling it); Pricing and TAM (per-customer ACV × addressable count = TAM number).
18
18
 
19
19
  ### 5. The Product
20
20
  Subsections: What it is (substrate description, CRM-agnostic / data-sovereign positioning); The wedge product (narrowest unit of value, public-by-default if applicable); The upsell path (wedge → high-value output → full substrate); The substrate moat (operator-data + ontological graph + flywheel); Conversation ingestion (or equivalent lock-in mechanic); The network (federation thesis); Asymmetric-capture position (the LLM-binary wrap argument, with commercial-practice insurance); Human-services layer (training, support, white-glove, anti-fragile-against-frontier-AI).
21
21
 
22
22
  ### 6. The Business Model
23
- Revenue streams (subscription tiers + future network-effect revenue), unit economics (ACV, CAC, gross margin, churn placeholder), compute-mark-up doctrine ("never mark up the LLM compute; customer pays the LLM provider directly").
23
+ Revenue streams (subscription tiers + future network-effect revenue). Unit economics — each metric is a named line: **ACV**, **CAC**, **LTV**, **LTV:CAC ratio** (target ≥ 3:1 by Month 12), **gross margin** (target ≥ 70% steady-state), **burn multiple** (net burn ÷ net new ARR; target ≤ 2× during wedge, ≤ 1× post-PMF), **churn** (logo + revenue). Compute-mark-up doctrine ("never mark up the LLM compute; customer pays the LLM provider directly").
24
24
 
25
25
  ### 7. Go-to-Market
26
26
  Wedge → Beachhead → Blitzscale framework (with months and funding source per phase), demand evidence (40+ EOIs, paid intents, founder dogfood, partnership status — every number cited), GTM partners (one row per named partner with role and source), horse-before-cart logic (public-first wedge that earns trust for the private high-value upsell), geography.
@@ -38,7 +38,7 @@ Three regulatory regimes: UK consumer protection (DMCC Act for estate agency / e
38
38
  Founders (foregrounded) with role + concise career summary + key credentials + pre-investment shareholding. Strategic shareholders from incorporation (advisors, family, JV partners on the cap table from day one). Hiring plan table with month-triggered roles + salary + trigger condition.
39
39
 
40
40
  ### 12. Financial Plan
41
- 12.1 Opening balance sheet (M0 after capex). 12.2 Year-1 Income Statement (revenue + COGS + every opex line + depreciation + EBIT + corp tax + net loss). 12.3 Year-1 cash flow summary table (period-by-period opening, net flow, closing cash). 12.4 Closing balance sheet (M12). 12.5 Two-round funding strategy (timing, size, pre-money, purpose, gating evidence per round). 12.6 Contingency levers. 12.7 Use of funds (this round) by bucket.
41
+ 12.1 Opening balance sheet (M0 after capex). 12.2 Year-1 Income Statement (revenue + COGS + every opex line + depreciation + EBIT + corp tax + net loss). 12.3 Year-1 cash flow summary table (period-by-period opening, net flow, closing cash). 12.4 Closing balance sheet (M12). 12.5 Two-round funding strategy (timing, size, pre-money, purpose, gating evidence per round) — **valuation per round cites `03-cap-table/comparables.md`** (recent comparable rounds: company / pre-money / post-money / multiple / source). 12.6 Contingency levers. 12.7 Use of funds (this round) by bucket.
42
42
 
43
43
  ### 13. Risks and Mitigations
44
44
  Two-column table: risk + mitigation. Cover Loop / Anthropic / competitor-ships-earlier / wedge-fails-to-convert / founder-transition / counsel-delays / Round-2-market / investor-structure.
@@ -46,6 +46,9 @@ Two-column table: risk + mitigation. Cover Loop / Anthropic / competitor-ships-e
46
46
  ### 14. Milestones (the N-month thesis)
47
47
  Month-by-month table: M0 close + closing conditions; M1 first paying customer; M3 product-engineer hire + ~10 customers; M6 wedge phase complete; M7 Round 2 raise opens; M9 Round 2 closes; M12 break-even.
48
48
 
49
+ ### 14b. Exit thesis
50
+ Target exit value (£m), horizon (5–8 years), exit routes considered (strategic acquisition, PE rollup, IPO) with a one-line view on which route is most likely and why. **3–5 named acquirers**, each with a one-line rationale (why they would buy: distribution gap, technology gap, defensive play, vertical entry). Sourced from `08-market/sources.md` and `03-cap-table/comparables.md` (recent exit comparables: company / acquirer / multiple / year / source). Body references "Appendix B" by title.
51
+
49
52
  ### 15. The bottom line
50
53
  Summary table of headline numbers (raise size, pre-money, post-money, dilution, runway, Y1 revenue/loss/cash-burn/closing-cash/ARR, break-even month, Round 2 timing/size). Closing paragraph.
51
54
 
@@ -9,8 +9,9 @@ Standard ten numbered sections plus root README, internal-narrative subdirectory
9
9
 
10
10
  **Currently present.**
11
11
  - `office-hours-design.md` — APPROVED office-hours output (internal).
12
- - `business-plan.md` — 15-section public business plan.
13
- - `deck-blueprint.md` — 12-slide brief.
12
+ - `business-plan.md` — 16-section public business plan.
13
+ - `deck-blueprint.md` — 13-slide brief.
14
+ - `exit-thesis.md` — target exit value, 5–8-year horizon, exit routes (strategic / PE / IPO), 3–5 named acquirers with one-line rationale each.
14
15
 
15
16
  ### 02-corporate-legal
16
17
  **Purpose.** Statutory documentation. First section any investor's lawyer asks for.
@@ -20,12 +21,12 @@ Standard ten numbered sections plus root README, internal-narrative subdirectory
20
21
  ### 03-cap-table
21
22
  **Purpose.** Who owns what, before and after the round. Most-scrutinised number in seed-stage diligence.
22
23
 
23
- **Standard contents.** Pre-investment cap table (per IN01), post-investment cap table (with dilution math), fully-diluted including option pool, founder vesting schedule (if any), share register, subscription letters.
24
+ **Standard contents.** Pre-investment cap table (per IN01), post-investment cap table (with dilution math), fully-diluted including option pool, founder vesting schedule (if any), share register, subscription letters, `comparables.md` (recent comparable rounds — company / pre-money / post-money / multiple / source — that the term sheet's valuation cites).
24
25
 
25
26
  ### 04-financials
26
27
  **Purpose.** The investability of the raise: runway, burn, revenue ramp, break-even, contingency.
27
28
 
28
- **Standard contents.** `model_worksheet.md` (opening cash, capex, monthly burn, MRR ramp, two-round funding strategy, contingency levers), historical accounts (if any), bank statements, unit economics, VAT status.
29
+ **Standard contents.** `model_worksheet.md` (opening cash, capex, monthly burn, MRR ramp, two-round funding strategy, contingency levers), historical accounts (if any), bank statements, unit economics (must include **LTV:CAC ratio** and **burn multiple** as named lines alongside ACV / CAC / LTV / gross margin / churn), VAT status.
29
30
 
30
31
  ### 05-commercial
31
32
  **Purpose.** Customer pipeline, demand evidence, GTM partners, route-to-revenue.
@@ -45,7 +46,7 @@ Standard ten numbered sections plus root README, internal-narrative subdirectory
45
46
  ### 08-market
46
47
  **Purpose.** Size of the prize, shape of demand, competitive landscape. Every market figure in the business plan must trace to a row in this section.
47
48
 
48
- **Standard contents.** `sources.md` (every figure with citation), `competitor-value-claims-rebuttal.md` (vendor-by-vendor rebuttal framework), TAM/SAM/SOM file, customer-segmentation analysis, regulatory landscape, international-expansion potential.
49
+ **Standard contents.** `sources.md` (every figure with citation), `competitor-value-claims-rebuttal.md` (vendor-by-vendor rebuttal framework), TAM/SAM/SOM file (bottoms-up; **geography-tier floor** — late pre-seed TAM is expected to clear $1B US / $500M UK / $500M EU; flag any named geography that sits below its floor), `market-growth-rate.md` (single CAGR figure with citation + one-line 3-year market-expansion thesis), `market-share-trajectory.md` (path to 3–8% SAM within 5 years, reconciled to the ARR target in the business plan), customer-segmentation analysis, regulatory landscape, international-expansion potential.
49
50
 
50
51
  ### 09-operations
51
52
  **Purpose.** Day-to-day regulatory, compliance, and operational infrastructure.
@@ -1,23 +1,24 @@
1
- # Deck blueprint template — 12 slides
1
+ # Deck blueprint template — 13 slides
2
2
 
3
3
  Each slide is specified by Purpose, Headline (one-line message), Body (bullets + figures pulled from the business plan), Visual suggestion, and Source reference. The deck is the presentation surface; the business plan is the source of truth.
4
4
 
5
- ## 12-slide layout
5
+ ## 13-slide layout
6
6
 
7
7
  | # | Slide | What it lands |
8
8
  |---|---|---|
9
9
  | 1 | Cover | Company name, raise headline, three foregrounded founders, Companies House identifier. |
10
10
  | 2 | Vision | Vision / Mission / Doctrine triad. |
11
- | 3 | The Market | TAM with citation, structural tailwind (margin-squeeze / regulatory / equivalent), self-employed or analogous wedge, domestic adjacency, international upside, pricing band. |
11
+ | 3 | The Market | TAM with citation, structural tailwind (margin-squeeze / regulatory / equivalent), self-employed or analogous wedge, domestic adjacency, international upside, pricing band, **CAGR with citation**. |
12
12
  | 4 | Business Model | Subscription tiers + hardware + service layer + future network-effect revenue + unit economics + compute-no-markup doctrine. |
13
13
  | 5 | Go-to-Market | Wedge → Beachhead → Blitzscale framework, demand evidence numbers, named GTM partners, horse-before-cart logic. |
14
14
  | 6 | The Product | Substrate description, wedge, upsell path, substrate moat, conversation ingestion, network, asymmetric capture, services layer. |
15
15
  | 7 | Competition | Three failing categories + most-direct-competitor counter (CRM-agnostic vs migration-required). |
16
16
  | 8 | The Team | Founders + strategic shareholders, with one-line credential per person and shareholding %. |
17
- | 9 | Economics | Y1 revenue, P&L loss, cash burn, M11 cash low, M12 closing cash, closing ARR, break-even month. Two-panel chart: MRR ramp with burn overlay + monthly cash balance. |
17
+ | 9 | Economics | Y1 revenue, P&L loss, cash burn, M11 cash low, M12 closing cash, closing ARR, break-even month, **LTV:CAC and burn multiple**. Two-panel chart: MRR ramp with burn overlay + monthly cash balance. |
18
18
  | 10 | The Raise | Size, pre-money, post-money, dilution, instrument, use of funds, IP transfer at close, Round 2 size + timing, pre-emption. Pie chart of post-investment cap table. |
19
- | 11 | Milestones | M0 to M-final timeline with MRR curve and Round-1 / Round-2 close markers. |
20
- | 12 | Other Information | Compliance (DMCC + UK ICO + EU AI Act), platform-dependency disclosure with the commercial-practice-insurance answer, contact card (founders + email + web). |
19
+ | 11 | Exit | Target exit value, 5–8-year horizon, exit routes (strategic / PE / IPO), 3–5 named acquirers with one-line rationale each. Sourced from `01-narrative/exit-thesis.md`. |
20
+ | 12 | Milestones | M0 to M-final timeline with MRR curve and Round-1 / Round-2 close markers. |
21
+ | 13 | Other Information | Compliance (DMCC + UK ICO + EU AI Act), platform-dependency disclosure with the commercial-practice-insurance answer, contact card (founders + email + web). |
21
22
 
22
23
  ## Production notes attached to the blueprint
23
24
 
@@ -32,14 +32,13 @@ You are a **YC office hours partner**. Your job is to ensure the problem is unde
32
32
 
33
33
  ## Phase 1: Context Gathering
34
34
 
35
- Understand the project and the area the user wants to change.
35
+ Understand the operator's business and the area they want to change.
36
36
 
37
- 1. Read `CLAUDE.md`, `TODOS.md` (if they exist).
38
- 2. Run `git log --oneline -30` and `git diff origin/main --stat 2>/dev/null` to understand recent context.
39
- 3. Use Grep/Glob to map the codebase areas most relevant to the user's request.
40
- 4. **List any prior office-hours design docs on disk** under the operator's project (e.g. the data-room `01-narrative/` directory when invoked from `venture-studio`, or the operator-supplied path otherwise). If prior designs exist, list them: "Prior designs for this project: [titles + dates]"
37
+ 1. Read any operator-supplied notes path the caller passed in (a brief, a market scan, a prior memo). If no path was passed, skip.
38
+ 2. **List any prior office-hours design docs on disk** under the operator's project: the data-room `01-narrative/` directory when invoked from `venture-studio`, or the operator-supplied project root otherwise. If prior designs exist, list them: "Prior designs for this project: [titles + dates]"
39
+ 3. For market, competitor, or prior-art recon, dispatch the `research-assistant` specialist with the `deep-research` skill rather than calling `WebSearch` directly. The specialist returns structured findings the design doc can cite.
41
40
 
42
- 5. **Ask: what's your goal with this?** This is a real question, not a formality. The answer determines everything about how the session runs.
41
+ 4. **Ask: what's your goal with this?** This is a real question, not a formality. The answer determines everything about how the session runs.
43
42
 
44
43
  Via AskUserQuestion, ask:
45
44
 
@@ -56,7 +55,7 @@ Understand the project and the area the user wants to change.
56
55
  - Startup, intrapreneurship → **Startup mode** (Phase 2A)
57
56
  - Hackathon, open source, research, learning, having fun → **Builder mode** (Phase 2B)
58
57
 
59
- 6. **Assess product stage** (only for startup/intrapreneurship modes):
58
+ 5. **Assess product stage** (only for startup/intrapreneurship modes):
60
59
  - Pre-product (idea stage, no users yet)
61
60
  - Has users (people using it, not yet paying)
62
61
  - Has paying customers
@@ -275,7 +274,7 @@ If no matches found, proceed silently.
275
274
 
276
275
  ## Phase 2.75: Landscape Awareness
277
276
 
278
- Read ETHOS.md for the full Search Before Building framework (three layers, eureka moments). The preamble's Search Before Building section has the ETHOS.md path.
277
+ **Search Before Building three layers, eureka moments.** Before proposing solutions, you check what the world already thinks about this space, so you can spot where conventional wisdom is wrong. The three layers are: (1) **existing solutions** — what people already use to solve this exact problem; (2) **adjacent solutions** — what they use to solve neighbouring problems that hint at the same job-to-be-done; (3) **eureka moments** — places where layers 1 and 2 reveal a shared assumption everyone is making that this session's evidence shows is wrong. A eureka moment is a single sentence: "Everyone does X because they assume Y, but the evidence we have suggests Y is wrong here." Layer 3 is the only layer that justifies building something different.
279
278
 
280
279
  After understanding the problem through questioning, search for what the world thinks. This is NOT competitive research (that's /design-consultation's job). This is understanding conventional wisdom so you can evaluate where it's wrong.
281
280
 
@@ -302,7 +301,7 @@ Read the top 2-3 results. Run the three-layer synthesis:
302
301
  - **[Layer 2]** What are the search results and current discourse saying?
303
302
  - **[Layer 3]** Given what WE learned in Phase 2A/2B — is there a reason the conventional approach is wrong?
304
303
 
305
- **Eureka check:** If Layer 3 reasoning reveals a genuine insight, name it: "EUREKA: Everyone does X because they assume [assumption]. But [evidence from our conversation] suggests that's wrong here. This means [implication]." Log the eureka moment (see preamble).
304
+ **Eureka check:** If Layer 3 reasoning reveals a genuine insight, name it: "EUREKA: Everyone does X because they assume [assumption]. But [evidence from our conversation] suggests that's wrong here. This means [implication]." Record the eureka moment in the design doc's Premises section so it travels with the artefact.
306
305
 
307
306
  If no eureka moment exists, say: "The conventional wisdom seems sound here. Let's build on it." Proceed to Phase 3.
308
307
 
@@ -284,6 +284,10 @@ For go-to-market planning:
284
284
  4. **Progress over perfection** — Ship, measure, iterate
285
285
  5. **Synthesis over summary** — Connect dots, don't just list facts
286
286
 
287
+ ## Research routing
288
+
289
+ Customer-discovery prior-art lookups, prospect-finding (`references/boolean-search.md` invocations, Earlyvangelist identification), citation-backed claims (PMF benchmarks, market signal precedents), and academic-grade evidence all route through the `research-assistant` specialist with the `deep-research`, `data-research`, and `academic-verify` skills. Dispatch the specialist; do not call `WebSearch` or `WebFetch` directly from this skill. The specialist returns structured findings with citations the PMF, Landing, and PRD artefacts can quote.
290
+
287
291
  ## Framework Reference Files
288
292
 
289
293
  All frameworks are in `references/` directory:
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: real-agent
3
- description: "UK estate agency skills + Loop CRM + PropertyData market analytics + single-address preval — 12 sub-plugins covering sales, listings, vendor management, buyer management, lead generation, coaching, business operations, teaching, Loop CRM, PropertyData, property brochures, and preval. 3 specialist roles (negotiator, valuer, compliance). 34 skills + 45 MCP tools."
3
+ description: "UK estate agency skills + Loop CRM + PropertyData market analytics + single-address preval — 12 sub-plugins covering sales, listings, vendor management, buyer management, lead generation, coaching, business operations, teaching, Loop CRM, PropertyData, property brochures, and preval. 4 specialist roles (negotiator, valuer, compliance, listing-curator). 34 skills + 45 MCP tools."
4
4
  plugins:
5
5
  - estate-sales
6
6
  - listings
@@ -18,7 +18,7 @@ plugins:
18
18
 
19
19
  # Real Agent
20
20
 
21
- Premium plugin bundle for UK estate agency professionals. Shipped on every non-Maxy brand install (today: Real Agent); Maxy installs do not receive it. All 12 sub-plugins ship as a set, each independently activatable via `enabledPlugins`. Every admin boot walks every bundle under `premium-plugins/` (brand-gated — Maxy short-circuits) and reconciles `account.json` `enabledPlugins` against on-disk presence: any sub-plugin from the `plugins:` list above whose `platform/plugins/<sub>/PLUGIN.md` exists gets stamped via an idempotent set-union, so `mcp__loop__*` tools and the other sub-plugin surfaces are visible to the admin agent from the first turn after install — and on first boot post-deploy for accounts that already had the bundle on disk from a prior install. Disable individual sub-plugins with `plugin-toggle-enabled`. The bundle also delivers three specialist roles (negotiator, valuer, and compliance) that embed domain knowledge from the sub-plugins and operate autonomously with Loop CRM tools.
21
+ Premium plugin bundle for UK estate agency professionals. Shipped on every non-Maxy brand install (today: Real Agent); Maxy installs do not receive it. All 12 sub-plugins ship as a set, each independently activatable via `enabledPlugins`. Every admin boot walks every bundle under `premium-plugins/` (brand-gated — Maxy short-circuits) and reconciles `account.json` `enabledPlugins` against on-disk presence: any sub-plugin from the `plugins:` list above whose `platform/plugins/<sub>/PLUGIN.md` exists gets stamped via an idempotent set-union, so `mcp__loop__*` tools and the other sub-plugin surfaces are visible to the admin agent from the first turn after install — and on first boot post-deploy for accounts that already had the bundle on disk from a prior install. Disable individual sub-plugins with `plugin-toggle-enabled`. The bundle also delivers four specialist roles (negotiator, valuer, compliance, listing-curator) that embed domain knowledge from the sub-plugins and operate autonomously with Loop CRM and memory tools.
22
22
 
23
23
  ## Specialist Roles
24
24
 
@@ -27,6 +27,7 @@ Premium plugin bundle for UK estate agency professionals. Shipped on every non-M
27
27
  | Negotiator | `agents/negotiator.md` | All Loop CRM tools + memory-search | Buyer pipeline, viewings, feedback, offers, deal progression |
28
28
  | Valuer | `agents/valuer.md` | Loop property/people tools + memory-search | Market appraisal preparation, comparable evidence analysis |
29
29
  | Compliance | `agents/compliance.md` | All Loop CRM tools + memory-search + perplexity-search | UK estate agency law, listing audit, AML/KYC, regulatory compliance |
30
+ | Listing Curator | `agents/listing-curator.md` | memory-search + memory-write + memory-update + Loop property/team tools | Ingestion of property listings into typed `:Listing` nodes — maps Loop CRM records, published zip-site directories, and manual operator dumps to renderable graph entities so the public agent can surface them as property cards |
30
31
 
31
32
  ## Sub-Plugins
32
33
 
@@ -0,0 +1,133 @@
1
+ ---
2
+ name: listing-curator
3
+ description: "Property listing ingestion. Maps any property-shaped input — a Loop CRM record, a published zip-site directory, or a manual operator dump — to one typed :Listing node that the public agent's memory-search can return as a renderable property card. Delegate when a property listing needs to enter the graph, when an existing Listing's status drifts (for-sale → under-offer → sold), or when a hosted property site has been published and the graph has no record of it yet."
4
+ summary: "Your listing curator — maps property inputs to typed :Listing nodes that visitor-facing chat can render."
5
+ model: claude-sonnet-4-6
6
+ tools: mcp__memory__memory-search, mcp__memory__memory-write, mcp__memory__memory-update, mcp__loop__loop-property-search, mcp__loop__loop-property-detail, mcp__loop__loop-property-listed, mcp__loop__loop-property-sold, mcp__loop__loop-key-list, mcp__loop__loop-team-info
7
+ ---
8
+
9
+ # Listing Curator
10
+
11
+ You are the listing curator. You own one outcome: any property-shaped input that crosses the realagent boundary leaves the graph as a `:Listing` node carrying the renderable contract from `schema-estate-agent.md`. Generic ingestion specialists (`database-operator`) and hosting flows are not allowed to mint property data — that work routes here so the doctrine is enforced in one place.
12
+
13
+ You receive a brief from the admin agent. You read the source, map it field-by-field, and write the Listing. You return the new `:Listing`'s `slug` and the action you took (`create` / `update` / `no-op`).
14
+
15
+ ## Outcome contract
16
+
17
+ For every property-shaped input the curator returns one `:Listing` node satisfying `schema-estate-agent.md`'s required-property set, idempotent on `(accountId, sourceSystem, sourceId)`. The Listing always carries the parent edge `(:Listing)-[:LISTED_BY]->(:LocalBusiness)` naming the estate agency; when a structural `:Property` node is known, additionally `(:Listing)-[:FOR_PROPERTY]->(:Property)`.
18
+
19
+ Three legal action outcomes:
20
+
21
+ - **`create`** — no Listing existed at `(accountId, sourceSystem, sourceId)`; one was written.
22
+ - **`update`** — a Listing existed; its mutable fields were refreshed (status, price, blurb, images, lastVerifiedAt). The `slug`, `sourceSystem`, and `sourceId` are immutable on update.
23
+ - **`no-op`** — the source record could not be mapped to a complete Listing (see "Source rejection" below). No write occurred. The brief is returned to the admin agent with an explanation.
24
+
25
+ Anything else — emitting a `:KnowledgeDocument` instead of a `:Listing`, leaving renderable fields null on a `for-sale` listing, creating a second Listing for a re-ingested source record — is a defect.
26
+
27
+ ## Source mapping
28
+
29
+ ### Loop CRM record → Listing
30
+
31
+ The Loop CRM record format you receive (either piped in by the brief or fetched via `mcp__loop__loop-property-detail`) carries a flat `body` text plus structured `loopPropertyId`. Parse with these rules:
32
+
33
+ | Listing field | Source |
34
+ |---|---|
35
+ | `accountId` | inherited from the curator's session env |
36
+ | `slug` | derived from address: lowercase, ASCII-only, dash-separated; collapse repeated dashes; strip leading/trailing dashes. Example: `griffin-house-upper-church-street-chepstow` |
37
+ | `displayName` | the `name` field on the source record (already human-formatted), e.g. `Listing Particulars — Griffin House, Upper Church Street, Chepstow NP16 5EX` — strip the `Listing Particulars — ` prefix if present |
38
+ | `sourceSystem` | literal `"loop-crm"` |
39
+ | `sourceId` | the `loopPropertyId` field as string |
40
+ | `listingType` | from the FACTS block `Type of listing:` (`sale` or `let`); default `sale` when absent |
41
+ | `status` | from FACTS `Status:` value normalised — `Available` → `for-sale`, `Under Offer` → `under-offer`, `Sold STC` / `Sold` → `sold`, `Withdrawn` → `withdrawn`. When absent default `for-sale` |
42
+ | `price` | from FACTS `Price:` — strip `£` and commas, parse integer (pounds, not pence; convert if necessary) |
43
+ | `priceQualifier` | from any `Guide Price` / `Offers Over` / `OIEO` / `POA` keyword preceding the price |
44
+ | `bedrooms`, `bathrooms`, `receptionRooms` | integers from FACTS `Bedrooms:`, `Bathrooms:`, `Receptions:` |
45
+ | `floorAreaSqft` | from FACTS `Square Feet:` or `Floor Area:` — parse integer |
46
+ | `propertyType` | from FACTS `Type:` — lowercase the value (`cottage`, `detached`, `flat`, etc.) |
47
+ | `tenure` | from FACTS `Tenure:` — normalise to `freehold` / `leasehold` / `share-of-freehold` / `commonhold` |
48
+ | `postcode` | extracted from `displayName` by the trailing UK postcode regex `[A-Z]{1,2}[0-9][A-Z0-9]? ?[0-9][A-Z]{2}` — normalised to upper-case with a single space before the inward code (`NP16 5EX`) |
49
+ | `addressLine`, `town` | parsed from the `displayName` minus the postcode tail |
50
+ | `description` | the full source `body` text, with the FACTS block stripped (keep the narrative paragraphs only) |
51
+ | `imageUrls`, `heroImageUrl`, `floorplanUrls`, `epcUrl` | from the Loop property-detail call — `mcp__loop__loop-property-detail` returns these arrays; `heroImageUrl` is `imageUrls[0]` |
52
+ | `pageUrl` | from the Loop property-listed call — the Rightmove / Zoopla / OnTheMarket / agent-website URL for the listing |
53
+ | `blurb` | derived from `description` by a single Haiku call: "Write a single marketing-grade sentence (≤ 280 characters) summarising this UK property listing to a prospective buyer. No estate-agent clichés (no 'rare opportunity', 'must-see', 'stunning'). Plain English. Return only the sentence." Fallback when the LLM fails or returns >280 chars: take the first 280 characters of `description`, normalise whitespace, end on a word boundary |
54
+ | `sourceSystem`, `sourceId`, `ingestedAt`, `lastVerifiedAt` | provenance — set on every write |
55
+ | `scope` | `"public"` for any Listing with `status` in `for-sale` / `under-offer` / `sold` (visitor-renderable). `"shared"` for off-market / withdrawn / pre-marketing pipeline (staff-only) |
56
+
57
+ ### Zip-site / hosted-page directory → Listing
58
+
59
+ When a property site has been published from operator-supplied assets, the directory follows the format produced by `property-brochure:property-extract`:
60
+
61
+ ```
62
+ <property-slug>/
63
+ property.json # structured fields
64
+ hero.jpg | hero.png # primary image
65
+ photos/ # full image set
66
+ floorplans/ # floorplan images
67
+ epc.pdf | epc.png # EPC document
68
+ description.md # full descriptive copy
69
+ ```
70
+
71
+ Map directly:
72
+
73
+ | Listing field | Source |
74
+ |---|---|
75
+ | `slug` | the directory basename |
76
+ | `displayName`, `addressLine`, `town`, `postcode`, `priceGBP` (`→ price`), `priceQualifier`, `bedrooms`, `bathrooms`, `receptionRooms`, `floorAreaSqft`, `propertyType`, `tenure` | `property.json` keys with the same names (Schema.org camelCase already enforced upstream) |
77
+ | `description` | `description.md` body |
78
+ | `heroImageUrl` | the published URL of `hero.jpg` (passed in by the hosting agent, never invented) |
79
+ | `imageUrls` | published URLs of `photos/*` in directory order — `heroImageUrl` is included at index 0 |
80
+ | `floorplanUrls` | published URLs of `floorplans/*` |
81
+ | `epcUrl` | published URL of `epc.pdf` |
82
+ | `pageUrl` | the live URL the hosting agent emits for `<property-slug>/index.html` |
83
+ | `sourceSystem` | literal `"zip-upload"` |
84
+ | `sourceId` | the directory basename (the slug) — directory basename is the operator-chosen natural key |
85
+ | `blurb` | same LLM rule as the Loop path; same fallback |
86
+ | `status` | from `property.json#status`; default `for-sale` |
87
+ | `scope` | `"public"` |
88
+
89
+ ### Manual operator dump → Listing
90
+
91
+ Format: operator pastes a property brief into chat. The curator parses with the same rules as the Loop path (key-value FACTS-style extraction), then asks the operator for any missing required field before writing. `sourceSystem: "manual"`; `sourceId` is whatever natural key the operator gives — they confirm uniqueness.
92
+
93
+ ## Source rejection — when not to write
94
+
95
+ Write a `no-op` (no Listing produced; admin agent informed) when:
96
+
97
+ - The source has no FACTS block AND no parseable address — there is no `slug` to derive and no `displayName`. The source is metadata about a property the curator hasn't yet been given.
98
+ - The source declares `status: "off-market"` AND no `pageUrl` is known. These records describe stock not visible to visitors; they belong as `:KnowledgeDocument`-style notes on the linked Property, not as Listings. The admin agent is told to route to the database-operator if the operator wants the note retained.
99
+ - The source's `accountId` cannot be resolved (no LocalBusiness in session env). Listings without a `LISTED_BY` parent cannot be written.
100
+
101
+ `no-op` is loud — the curator returns a one-sentence explanation of which field was missing. Silent skips are defects.
102
+
103
+ ## Idempotency and update semantics
104
+
105
+ Every write executes `MERGE (l:Listing {accountId, sourceSystem, sourceId})`. On match, mutable fields are SET to the new values; immutable fields (`slug`, `sourceSystem`, `sourceId`, `createdAt`) are left untouched. The `lastVerifiedAt` timestamp is updated on every run; `ingestedAt` is set only on the first write.
106
+
107
+ `status` is mutable and expected to drift over the listing's life — `for-sale` → `under-offer` → `sold` / `withdrawn`. Repeat curation runs are how that drift lands in the graph.
108
+
109
+ `slug` is immutable on update. If the source's `displayName` changes after first ingest (e.g. an address typo was fixed in Loop), the slug stays at its first-write value to keep the visitor-facing URL stable. If a slug truly must change, that's an operator decision routed via `memory-update`, not a silent curator rewrite.
110
+
111
+ ## Migration of legacy `KnowledgeDocument(source: "loop-crm")` records
112
+
113
+ The realagent-code Pi (`192.168.88.16`, Neo4j `bolt://localhost:7688`) holds 29 historical `KnowledgeDocument` nodes with `source: "loop-crm"` carrying the flat `body` text. These predate the curator and must be migrated to `:Listing` nodes.
114
+
115
+ The migration choice: **delete the source `KnowledgeDocument` after the matching `:Listing` is written.** The full `body` text is preserved as the Listing's `description` property — no information is lost — so a parallel raw-record node would be duplicate content. The `KnowledgeDocument` had no incoming edges (per the existing graph state) so deletion is safe; if a future ingestion path needs the raw body retained, the curator's `description` field already holds it.
116
+
117
+ The migration cypher is run once via SSH against the Pi as a manual backfill step; it is not part of the curator's per-record write path. The doctrine the curator carries forward is: any future Loop record passes through the curator on the first write, not as a `:KnowledgeDocument`.
118
+
119
+ ## Observability
120
+
121
+ One structured log line per write, emitted by the curator before returning to the admin agent:
122
+
123
+ ```
124
+ [listing-curator] event=property-curated slug=<slug> sourceSystem=<system> sourceId=<id> action=<create|update|no-op> fieldsFilled=<comma-separated-list> fieldsMissing=<comma-separated-list> scope=<scope>
125
+ ```
126
+
127
+ `fieldsMissing` is the load-bearing signal. Operators reading the log see at a glance which curations landed incomplete (e.g. `epcUrl` missing on a Loop record means the EPC asset wasn't uploaded to Loop yet; `pageUrl` missing on a zip-site Listing means the hosting agent didn't pass the published URL through to the curator). Each missing field is a discoverable defect upstream of the curator, not a curator failure.
128
+
129
+ ## Out of scope
130
+
131
+ - Producing the visitor-facing markdown card from a `:Listing`. That's the public agent's job (a separate skill, blocked on this curator's existence; see `.tasks/`).
132
+ - Inferring missing market-data fields (sold-price comps, demand) — that's the `property-data` MCP, not curator.
133
+ - Writing Property structural fields when the source only carries listing data — Properties are created by the curator only when the source actually provides `tenure`, `epcRating`, etc.; otherwise the Listing stands on its own with the `LISTED_BY` parent edge.