@rubytech/create-maxy-code 0.1.105 → 0.1.107

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 (79) hide show
  1. package/dist/index.js +1 -1
  2. package/dist/uninstall.js +1 -1
  3. package/package.json +1 -1
  4. package/payload/platform/plugins/.claude-plugin/marketplace.json +0 -15
  5. package/payload/premium-plugins/real-agent/plugins/brochures/skills/property-brochure/SKILL.md +5 -1
  6. package/payload/server/{chunk-BVDLDM6O.js → chunk-TZD23CX6.js} +71 -1
  7. package/payload/server/maxy-edge.js +1 -1
  8. package/payload/server/server.js +6 -1
  9. package/payload/platform/plugins/founder-pack/.claude-plugin/plugin.json +0 -8
  10. package/payload/platform/plugins/founder-pack/skills/investor-data-room/SKILL.md +0 -258
  11. package/payload/platform/plugins/founder-pack/skills/investor-data-room/references/business-plan-template.md +0 -61
  12. package/payload/platform/plugins/founder-pack/skills/investor-data-room/references/compliance-research-checklist.md +0 -53
  13. package/payload/platform/plugins/founder-pack/skills/investor-data-room/references/data-room-structure.md +0 -77
  14. package/payload/platform/plugins/founder-pack/skills/investor-data-room/references/deck-blueprint-template.md +0 -38
  15. package/payload/platform/plugins/founder-pack/skills/investor-data-room/references/design-tokens-application.md +0 -79
  16. package/payload/platform/plugins/founder-pack/skills/investor-data-room/references/html-pdf-pipeline.md +0 -236
  17. package/payload/platform/plugins/founder-pack/skills/investor-data-room/references/internal-workings-scrub.md +0 -33
  18. package/payload/platform/plugins/founder-pack/skills/investor-data-room/references/termsheet-template.md +0 -88
  19. package/payload/platform/plugins/teaching/.claude-plugin/plugin.json +0 -8
  20. package/payload/platform/plugins/teaching/PLUGIN.md +0 -58
  21. package/payload/platform/plugins/teaching/skills/interactive-tutor/SKILL.md +0 -59
  22. package/payload/platform/plugins/teaching/skills/interactive-tutor/references/assessment.md +0 -70
  23. package/payload/platform/plugins/teaching/skills/interactive-tutor/references/classroom-conduct.md +0 -43
  24. package/payload/platform/plugins/teaching/skills/interactive-tutor/references/teaching-modes.md +0 -83
  25. package/payload/platform/plugins/teaching/skills/lesson-planner/SKILL.md +0 -48
  26. package/payload/platform/plugins/teaching/skills/lesson-planner/references/context-gathering.md +0 -41
  27. package/payload/platform/plugins/teaching/skills/lesson-planner/references/plan-structure.md +0 -94
  28. package/payload/platform/plugins/teaching/skills/study-pack-builder/SKILL.md +0 -52
  29. package/payload/platform/plugins/teaching/skills/study-pack-builder/references/disaggregation.md +0 -49
  30. package/payload/platform/plugins/teaching/skills/study-pack-builder/references/materials.md +0 -116
  31. package/payload/platform/plugins/writer-craft/.claude-plugin/plugin.json +0 -8
  32. package/payload/platform/plugins/writer-craft/PLUGIN.md +0 -88
  33. package/payload/platform/plugins/writer-craft/agents/writer-craft--manuscript-reviewer.md +0 -92
  34. package/payload/platform/plugins/writer-craft/skills/citation-style/SKILL.md +0 -94
  35. package/payload/platform/plugins/writer-craft/skills/citation-style/references/book-and-chapter-models.md +0 -77
  36. package/payload/platform/plugins/writer-craft/skills/citation-style/references/citation-rules.md +0 -103
  37. package/payload/platform/plugins/writer-craft/skills/citation-style/references/journal-article-models.md +0 -74
  38. package/payload/platform/plugins/writer-craft/skills/citation-style/references/other-source-models.md +0 -146
  39. package/payload/platform/plugins/writer-craft/skills/citation-style/references/reference-list-rules.md +0 -70
  40. package/payload/platform/plugins/writer-craft/skills/editorial-practice/SKILL.md +0 -108
  41. package/payload/platform/plugins/writer-craft/skills/editorial-practice/references/copyediting.md +0 -73
  42. package/payload/platform/plugins/writer-craft/skills/editorial-practice/references/developmental-editing.md +0 -85
  43. package/payload/platform/plugins/writer-craft/skills/editorial-practice/references/genre-specific-editing.md +0 -78
  44. package/payload/platform/plugins/writer-craft/skills/editorial-practice/references/line-editing.md +0 -55
  45. package/payload/platform/plugins/writer-craft/skills/editorial-practice/references/self-editing.md +0 -89
  46. package/payload/platform/plugins/writer-craft/skills/persuasive-storytelling/SKILL.md +0 -114
  47. package/payload/platform/plugins/writer-craft/skills/persuasive-storytelling/references/audience-analysis.md +0 -73
  48. package/payload/platform/plugins/writer-craft/skills/persuasive-storytelling/references/crafting-persuasive-story.md +0 -76
  49. package/payload/platform/plugins/writer-craft/skills/persuasive-storytelling/references/persuasion-case-studies.md +0 -67
  50. package/payload/platform/plugins/writer-craft/skills/persuasive-storytelling/references/transformation-framework.md +0 -86
  51. package/payload/platform/plugins/writer-craft/skills/point-of-view/SKILL.md +0 -97
  52. package/payload/platform/plugins/writer-craft/skills/point-of-view/references/indirect-narration.md +0 -72
  53. package/payload/platform/plugins/writer-craft/skills/point-of-view/references/pov-types-and-voice.md +0 -91
  54. package/payload/platform/plugins/writer-craft/skills/point-of-view/references/protagonist-filter.md +0 -71
  55. package/payload/platform/plugins/writer-craft/skills/point-of-view/references/tense-and-person.md +0 -85
  56. package/payload/platform/plugins/writer-craft/skills/prose-craft/SKILL.md +0 -100
  57. package/payload/platform/plugins/writer-craft/skills/prose-craft/references/punctuation-and-grammar.md +0 -72
  58. package/payload/platform/plugins/writer-craft/skills/prose-craft/references/repetition.md +0 -71
  59. package/payload/platform/plugins/writer-craft/skills/prose-craft/references/sound-and-rhythm.md +0 -64
  60. package/payload/platform/plugins/writer-craft/skills/prose-craft/references/word-economy.md +0 -93
  61. package/payload/platform/plugins/writer-craft/skills/reader-engagement/SKILL.md +0 -100
  62. package/payload/platform/plugins/writer-craft/skills/reader-engagement/references/cause-effect-setup-payoff.md +0 -79
  63. package/payload/platform/plugins/writer-craft/skills/reader-engagement/references/conflict-escalation.md +0 -81
  64. package/payload/platform/plugins/writer-craft/skills/reader-engagement/references/hooking-readers.md +0 -67
  65. package/payload/platform/plugins/writer-craft/skills/reader-engagement/references/neurochemistry-of-engagement.md +0 -94
  66. package/payload/platform/plugins/writer-craft/skills/review-manuscript/SKILL.md +0 -111
  67. package/payload/platform/plugins/writer-craft/skills/review-manuscript/references/review-manuscript-checklist.md +0 -119
  68. package/payload/platform/plugins/writer-craft/skills/review-prose/SKILL.md +0 -99
  69. package/payload/platform/plugins/writer-craft/skills/review-prose/references/prose-review-checklist.md +0 -112
  70. package/payload/platform/plugins/writer-craft/skills/review-scene/SKILL.md +0 -99
  71. package/payload/platform/plugins/writer-craft/skills/review-scene/references/scene-analysis-framework.md +0 -95
  72. package/payload/platform/plugins/writer-craft/skills/story-architecture/SKILL.md +0 -106
  73. package/payload/platform/plugins/writer-craft/skills/story-architecture/references/blueprinting-and-scene-cards.md +0 -118
  74. package/payload/platform/plugins/writer-craft/skills/story-architecture/references/inner-issue-and-protagonist-goal.md +0 -66
  75. package/payload/platform/plugins/writer-craft/skills/story-architecture/references/misbelief-desire-worldview.md +0 -87
  76. package/payload/platform/plugins/writer-craft/skills/story-architecture/references/origin-scenes-and-escalation.md +0 -82
  77. package/payload/platform/plugins/writer-craft/skills/story-blueprint/SKILL.md +0 -133
  78. package/payload/platform/plugins/writer-craft/skills/story-blueprint/references/blueprinting-exercises.md +0 -118
  79. package/payload/platform/plugins/writer-craft/skills/story-blueprint/references/blueprinting-process.md +0 -128
package/dist/index.js CHANGED
@@ -59,7 +59,7 @@ function claudePluginEnv() {
59
59
  * evidence. When a third brand is added under `brands/`, append its hostname
60
60
  * here AND in the matching constant in `uninstall.ts` (intentional duplication
61
61
  * per `uninstall.ts:` "Shell helpers (duplicated from index.ts ...)" policy). */
62
- const KNOWN_BRAND_HOSTNAMES = ["maxy", "realagent", "maxy-2", "maxy-3", "maxy-4"];
62
+ const KNOWN_BRAND_HOSTNAMES = ["maxy", "maxy-code", "realagent", "realagent-code", "maxy-2", "maxy-3", "maxy-4"];
63
63
  // The device's actual hostname — may differ from BRAND.hostname if the user customized it.
64
64
  // Updated by installSystemDeps() after hostname setup; used for user-facing URLs.
65
65
  let DEVICE_HOSTNAME = BRAND.hostname;
package/dist/uninstall.js CHANGED
@@ -103,7 +103,7 @@ export function isMaxyInstalled() {
103
103
  * `.service` file — stale units, gnome-keyring disable markers, and unrelated
104
104
  * user services are not peer evidence. When a third brand is
105
105
  * added under `brands/`, append its hostname here. */
106
- const KNOWN_BRAND_HOSTNAMES = ["maxy", "realagent", "maxy-2", "maxy-3", "maxy-4"];
106
+ const KNOWN_BRAND_HOSTNAMES = ["maxy", "maxy-code", "realagent", "realagent-code", "maxy-2", "maxy-3", "maxy-4"];
107
107
  /** Detect whether another brand is installed on this device.
108
108
  * device-wide steps (apt package purge, Ollama binary removal, apt
109
109
  * repo cleanup, ~/.claude / ~/.ollama wipes) must skip when a peer brand is
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/create-maxy-code",
3
- "version": "0.1.105",
3
+ "version": "0.1.107",
4
4
  "description": "Install Maxy — AI for Productive People",
5
5
  "bin": {
6
6
  "create-maxy-code": "./dist/index.js"
@@ -39,11 +39,6 @@
39
39
  "source": "./email",
40
40
  "version": "0.1.0"
41
41
  },
42
- {
43
- "name": "founder-pack",
44
- "source": "./founder-pack",
45
- "version": "0.1.0"
46
- },
47
42
  {
48
43
  "name": "linkedin-extension",
49
44
  "source": "./linkedin-extension",
@@ -84,11 +79,6 @@
84
79
  "source": "./scheduling",
85
80
  "version": "0.1.0"
86
81
  },
87
- {
88
- "name": "teaching",
89
- "source": "./teaching",
90
- "version": "0.1.0"
91
- },
92
82
  {
93
83
  "name": "telegram",
94
84
  "source": "./telegram",
@@ -113,11 +103,6 @@
113
103
  "name": "workflows",
114
104
  "source": "./workflows",
115
105
  "version": "0.1.0"
116
- },
117
- {
118
- "name": "writer-craft",
119
- "source": "./writer-craft",
120
- "version": "0.1.0"
121
106
  }
122
107
  ]
123
108
  }
@@ -176,7 +176,11 @@ When any field above is unresolved after consulting its primary source, **stop b
176
176
  - **Web bundle ships the PDF, not per-page JPGs.** The bundle does not include `cover-print.jpg … backpage-print.jpg` — those duplicate the brochure content already embedded in `<slug>-brochure.pdf`. The web copy of `brochure.html` has its `.print-img` src attributes cleared so the print stylesheet drops to the live-DOM fallback; operators who want a printable PDF download the bundled PDF directly. See `references/build.md → Clear .print-img src in the web copy`. Shipping both was the historical bundle-bloat defect.
177
177
  - **Bottom chrome on `.page` is absolutely-positioned and stacks deterministically.** Three classes of bottom element exist: (1) the `.folio` page-number strip (`bottom: 8mm`, ~8mm tall → occupies bottom ~16mm of every page); (2) `.back-disclaimer` on the back page (`bottom: 16mm`, wraps to up to 5 lines × 3.7mm → occupies bottom ~34.5mm); (3) `.mi-foot` on the Material Information page (`bottom: 22mm`, ~7mm tall → occupies bottom ~22–29mm). All are `position: absolute`, anchored to their nearest positioned ancestor (`.page` which is `position: relative`). In-flow content above (e.g. `.mi-grid` inside `.mi-page`, `.backpage-inner` centred content) is a SIBLING in the stacking flow — nothing in CSS structure enforces clearance from the absolute layer. The fix is to either (a) **make the relevant footer absolute** (the approach used for `.mi-foot` to prevent oversized `.mi-grid` from pushing the disclaimer into the folio), or (b) **pull the in-flow container up via its parent's `padding-bottom`** when the footer is small and predictable (e.g. `.backpage-inner` uses 42mm to clear folio + disclaimer with a 4mm gap). Never use `margin-*` on a `position: absolute` element whose anchor is `bottom` — it has no positional effect.
178
178
  - **Folio is plain text on whitespace or absent — never chrome over imagery.** The `.folio > span` carries no background, blur, padding, border-radius, or shadow. It is plain text in `--teal-900` that sits on the clean whitespace reserved at the page bottom (see the previous rule on padding-bottom clearance). The folio is **hidden entirely** on full-bleed-bottom pages: `.cover`, `.page.intermission`, `.page.folio-dark`, and any `.page` whose body wraps a `.feature-page` (photo+panel layout where the photo bleeds to the page bottom). Never reintroduce a folio-pill background to "make it readable over the image" — that's competing chrome on the page; suppress the folio on that page instead. Any new full-bleed-bottom page class must be added to the `.folio` `display: none` selector in `references/template.html`.
179
- - **Page 13's `{{ siteplan_src }}` is extract-or-omit-or-ask — NEVER fabricated.** Page 13 (the site-plan / plot page, `.page siteplan-page`, "Continued, Chapter VI · The plot") expects a real plot drawing, real site plan, or real aerial/exterior photograph — an image that EXISTS on disk because the listing supplied it, the operator staged it, or `property-extract` captured it. **The agent must never fabricate this image.** No mock plan drawn from coloured rectangles + text labels (e.g. "THE LODGE / DRIVEWAY · PARKING / SOUTH-WEST FACING LAWN" on a green background — a real-world failure observed on Plate VIII of a recent brochure), no SVG diagram synthesised from `property.json` dimensions, no AI-generated site sketch, no postcode-centroid satellite render, no Mapbox/Google static-map call with our API key, no `<canvas>` hand-drawing, no HTML/CSS box-and-label illustration. ALL of these are forbidden — the same "extract or omit" doctrine that governs `property-extract → Map detection` applies here. **Before any "no image" fallback** (asking the operator, dropping to the 12-page layout, or — forbidden — fabricating), the agent MUST first **scan `<property_dir>/images/` and enumerate candidates**. Any photo that shows the property from height (drone shot, upper-floor view down the grounds), the plot from a distance, the front elevation framing the home in its setting, a paddock/grounds wide, or an aerial perspective IS a candidate for `siteplan_src`. Visual scan via the contact-sheet montage technique already required elsewhere in this SKILL ("Never assign an image to a slot from filename alone"). Real-world failure observed today: a brochure shipped with a fabricated mock plan on page 13 even though THREE perfectly good aerial photos sat in `<property_dir>/images/` unused. The agent skipped the directory scan, jumped to fabrication, and shipped. If candidates exist, the operator confirmation prompt lists them by filename + one-line description (e.g. "siteplan_src: 3 candidates found in images/ — <slug>-12.webp (drone, S-facing), <slug>-18.webp (wide exterior), <slug>-21.webp (aerial through trees). Pick one, or supply a different image.") — and the agent renders only after the operator picks. Only when zero candidates exist on disk does the prompt request a fresh image; only when the operator declines does the brochure drop to the 12-page reduced layout. The order is **scan-disk first, ask second, drop-to-12 third** fabricate, never. The brochure must NEVER ship with a fabricated illustration where a real plot/aerial belongs; this is a ship-stopper defect that misrepresents the property to a buyer. Also forbidden by the same doctrine: silently falling back to the floorplan (duplicates page 14). If the operator cannot supply a real image, the brochure drops to the 12-page reduced layout (no page 13) — never to a 16-page layout with fabricated or duplicated content on page 13.
179
+ - **Page 13's `{{ siteplan_src }}` is extract-or-omit-or-ask — NEVER fabricated.** Page 13 (the site-plan / plot page, `.page siteplan-page`, "Continued, Chapter VI · The plot") expects a real plot drawing, real site plan, or real aerial/exterior photograph — an image that EXISTS on disk because the listing supplied it, the operator staged it, or `property-extract` captured it. **The agent must never fabricate this image.** No mock plan drawn from coloured rectangles + text labels (e.g. "THE LODGE / DRIVEWAY · PARKING / SOUTH-WEST FACING LAWN" on a green background — a real-world failure observed on Plate VIII of a recent brochure), no SVG diagram synthesised from `property.json` dimensions, no AI-generated site sketch, no postcode-centroid satellite render, no Mapbox/Google static-map call with our API key, no `<canvas>` hand-drawing, no HTML/CSS box-and-label illustration. ALL of these are forbidden — the same "extract or omit" doctrine that governs `property-extract → Map detection` applies here. **The acceptable image set for `siteplan_src` is a closed list: (1) aerial / drone shot (taken from height, looking down on the property and its grounds), (2) site plan / plot drawing (line-art, supplied by the listing or staged by the operator), (3) local-area shot (street view, neighbourhood context, immediate surrounding setting that frames the plot's relationship to its area). Nothing else.** Ground-level exteriors of the house itself are NOT siteplan candidates those belong to the cover, opener, intermission, or feature slots. Interior shots (kitchen, garden, terrace, lounge) are NOT candidates. The floorplan is NOT a candidate (page 14's content; banned above). A fabricated mock illustration is NOT a candidate (banned above). The hero photo is NOT a candidate (used on the cover).
180
+
181
+ **Before any "no image" fallback** (asking the operator, dropping to the 12-page layout, or — forbidden — fabricating), the agent MUST first **scan `<property_dir>/images/` and enumerate candidates that match the closed list above**. Visual scan via the contact-sheet montage technique already required elsewhere in this SKILL ("Never assign an image to a slot from filename alone") — read each candidate's pixel content, not the filename. Real-world failure observed today: a brochure shipped with a fabricated mock plan on page 13 even though THREE perfectly good aerial photos sat in `<property_dir>/images/` unused; the agent skipped the directory scan, jumped to fabrication, and shipped. A separate failure mode also observed: agent picked an inappropriate image (e.g. ground-level garden shot, interior moment) for the slot because it scanned but didn't filter against the closed list. Both fail the same test — the slot must be filled with an image that ACTUALLY conveys the plot's geography, not just any image that happens to be on disk.
182
+
183
+ If one or more candidates from the closed list exist, the operator confirmation prompt lists them by filename + one-line description (e.g. *"siteplan_src: 3 candidates found in images/ — <slug>-12.webp (drone, S-facing), <slug>-18.webp (street-view from the lane), <slug>-21.webp (aerial through trees). Pick one, or supply a different image."*) and the agent renders only after the operator picks. Only when zero candidates from the closed list exist on disk does the prompt request a fresh image; only when the operator declines does the brochure drop to the 12-page reduced layout. The order is **scan-and-filter first, ask second, drop-to-12 third** — fabricate, never; pick-an-inappropriate-image-just-because-it's-there, never. The brochure must NEVER ship with a fabricated illustration where a real plot/aerial belongs; this is a ship-stopper defect that misrepresents the property to a buyer. Also forbidden by the same doctrine: silently falling back to the floorplan (duplicates page 14). If the operator cannot supply a real image, the brochure drops to the 12-page reduced layout (no page 13) — never to a 16-page layout with fabricated or duplicated content on page 13.
180
184
  - **Verification covers every page in the deliverable — sampling is a defect, not a shortcut.** `scrollHeight` fit checks, computed-style collision probes (`.mi-foot` ↔ `.folio` gap, `.back-disclaimer` ↔ in-flow content, any future absolute-bottom element vs in-flow neighbour), and visual review before declaring done all walk **every page** in the 16-page folio (or 12-page reduced layout). "Sample-checked 3 of 12 pages" or any variant ("spot-checked the spreads I changed", "skimmed a few representative pages") is not authorised — the skill explicitly says "verify every page" in `references/build.md → Live editing workflow` step 8 and in `references/structure.md`. The deliverable is the brochure as a whole; a defect on an unchecked page ships exactly as readily as a defect on a checked one. If a probe is expensive enough that walking 16 pages feels burdensome, the cost is the probe's, not the skill's — propose a faster probe rather than narrowing the coverage.
181
185
  - **`scrollHeight > viewport budget` is ALWAYS a defect — never "negligible".** Landscape budget is **794px** (`min-height: 210mm` at 96dpi); portrait is **1123px**. Every `.page`'s `scrollHeight` must be `≤` the budget — strict, not "approximately equal". A 4px overflow IS a defect: `overflow: hidden` silently clips that excess, and on pages with absolute-positioned bottom chrome (`.folio`, `.back-disclaimer`) the clipped content paints over chrome that lives in the absolute layer. "It's only 4 pixels" is the rationalisation that ships defects — the rule does not have a tolerance band. If a page reports `scrollHeight > budget` even by 1px, the build halts until the operator addresses the content-volume mismatch (trim copy, shrink an image, reduce a row count, or split into a continuation page). Never paper over with `overflow: hidden`-as-clip; the warning sign is the deliverable's only signal that the content doesn't fit.
182
186
  - **Material Information table has a hard row capacity — overflow is a content-volume defect, not a render bug.** At the default `.mi-row` sizing (9.5/11.5px fonts, 6px vertical padding, 18px `.mi-grid` row-gap), one column in the three-column MI grid fits **~13 rows** within the 22mm-clearance budget. A property with an unusually full table (e.g. 17+ rows in the tallest column, observed on a recent run) overruns by ~25mm / ~85px and clips into the folio zone. When MI's content volume exceeds the budget, the operator confirmation prompt MUST surface `mi.<column>.row_count` as an overflow item and ask the operator to either (a) trim the column to ≤ 13 rows by consolidating related disclosures (e.g. merge "easements" + "water/sewerage" + "rights of way" into one "Other matters" row that points at the seller's solicitor), or (b) opt into a continuation page (15a / 15b) — a separate skill-level decision that breaks the default 16-page contract and must be operator-confirmed. The build never silently truncates rows, never shrinks fonts to "make it fit", and never accepts a scrollHeight overflow as "negligible". The default `.mi-page` 22mm bottom-padding is sized for the typical property; properties outside the typical range MUST resolve via operator confirmation, not via the agent's judgement about which rows are "less important".
@@ -2632,6 +2632,7 @@ import { resolve, join } from "path";
2632
2632
  import { existsSync, readFileSync } from "fs";
2633
2633
  var configDirName = ".maxy";
2634
2634
  var commercialMode = false;
2635
+ var shipsPremiumBundlesFlag = false;
2635
2636
  var vncDisplayNum = 99;
2636
2637
  var rfbPortNum = 5900;
2637
2638
  var websockifyPortNum = 6080;
@@ -2651,6 +2652,7 @@ if (platformRoot) {
2651
2652
  }
2652
2653
  if (typeof brand.configDir === "string") configDirName = brand.configDir;
2653
2654
  if (brand.commercialMode === true) commercialMode = true;
2655
+ if (brand.shipsPremiumBundles === true) shipsPremiumBundlesFlag = true;
2654
2656
  if (typeof brand.vncDisplay === "number") vncDisplayNum = brand.vncDisplay;
2655
2657
  const brandLabel = configDirName.replace(/^\./, "");
2656
2658
  const required = [
@@ -2674,6 +2676,7 @@ if (platformRoot) {
2674
2676
  var MAXY_DIR = resolve(homedir(), configDirName);
2675
2677
  var BRAND_NAME = configDirName.replace(/^\./, "");
2676
2678
  var COMMERCIAL_MODE = commercialMode;
2679
+ var SHIPS_PREMIUM_BUNDLES = shipsPremiumBundlesFlag;
2677
2680
  var VNC_DISPLAY = `:${vncDisplayNum}`;
2678
2681
  var RFB_PORT = rfbPortNum;
2679
2682
  var WEBSOCKIFY_PORT = websockifyPortNum;
@@ -3429,6 +3432,38 @@ if (!existsSync4(PLATFORM_ROOT2)) {
3429
3432
  Set the MAXY_PLATFORM_ROOT environment variable to the absolute path of the platform directory.`
3430
3433
  );
3431
3434
  }
3435
+ var _stubDirsLoggedThisBoot = /* @__PURE__ */ new Set();
3436
+ function listValidAccounts() {
3437
+ if (!existsSync4(ACCOUNTS_DIR)) return [];
3438
+ const out = [];
3439
+ const entries = readdirSync(ACCOUNTS_DIR, { withFileTypes: true });
3440
+ for (const entry of entries) {
3441
+ if (!entry.isDirectory()) continue;
3442
+ if (entry.name.startsWith(".")) continue;
3443
+ const accountDir = resolve3(ACCOUNTS_DIR, entry.name);
3444
+ const configPath = resolve3(accountDir, "account.json");
3445
+ if (!existsSync4(configPath)) {
3446
+ if (!_stubDirsLoggedThisBoot.has(entry.name)) {
3447
+ console.error(
3448
+ `[platform] accounts-state STUB-DIR id=${entry.name} \u2014 onboarding leak; remove or repair`
3449
+ );
3450
+ _stubDirsLoggedThisBoot.add(entry.name);
3451
+ }
3452
+ continue;
3453
+ }
3454
+ let config;
3455
+ try {
3456
+ config = JSON.parse(readFileSync4(configPath, "utf-8"));
3457
+ } catch {
3458
+ console.error(
3459
+ `[platform] accounts-state CORRUPT-JSON id=${entry.name} \u2014 account.json failed to parse; treating as stub`
3460
+ );
3461
+ continue;
3462
+ }
3463
+ out.push({ accountId: config.accountId, accountDir, config });
3464
+ }
3465
+ return out;
3466
+ }
3432
3467
  function resolveAccount() {
3433
3468
  if (!existsSync4(ACCOUNTS_DIR)) return null;
3434
3469
  let usersJsonUserId = null;
@@ -3622,7 +3657,10 @@ function readBundleSubPlugins(bundlePath) {
3622
3657
  return subs;
3623
3658
  }
3624
3659
  function walkPremiumBundles() {
3625
- if (BRAND_NAME === "maxy") return [];
3660
+ if (!SHIPS_PREMIUM_BUNDLES) return [];
3661
+ return walkPremiumBundlesOnDisk();
3662
+ }
3663
+ function walkPremiumBundlesOnDisk() {
3626
3664
  const stagingRoot = resolve4(PLATFORM_ROOT2, "../premium-plugins");
3627
3665
  if (!existsSync5(stagingRoot)) return [];
3628
3666
  let entries;
@@ -3735,6 +3773,36 @@ function reconcileEnabledPlugins(accountDir, config) {
3735
3773
  console.error(`${TAG} enabled-stamp write failed: ${err instanceof Error ? err.message : String(err)}`);
3736
3774
  }
3737
3775
  }
3776
+ function cleanupLeakedPremiumSubs(accountDir, config, accountId) {
3777
+ const TAG = "[premium-auto-deliver]";
3778
+ if (!accountDir || !config) return;
3779
+ if (SHIPS_PREMIUM_BUNDLES) return;
3780
+ const current = Array.isArray(config.enabledPlugins) ? config.enabledPlugins : [];
3781
+ if (current.length === 0) return;
3782
+ const leakedNames = /* @__PURE__ */ new Set();
3783
+ for (const { subs } of walkPremiumBundlesOnDisk()) {
3784
+ for (const sub of subs) leakedNames.add(sub);
3785
+ }
3786
+ if (leakedNames.size === 0) return;
3787
+ const removed = [];
3788
+ const kept = [];
3789
+ for (const name of current) {
3790
+ if (leakedNames.has(name)) removed.push(name);
3791
+ else kept.push(name);
3792
+ }
3793
+ if (removed.length === 0) return;
3794
+ const configPath = resolve4(accountDir, "account.json");
3795
+ try {
3796
+ const raw2 = readFileSync5(configPath, "utf-8");
3797
+ const parsed = JSON.parse(raw2);
3798
+ parsed.enabledPlugins = kept;
3799
+ writeFileSync2(configPath, JSON.stringify(parsed, null, 2) + "\n");
3800
+ config.enabledPlugins = kept;
3801
+ console.log(`${TAG} cleanup accountId=${accountId ?? "unknown"} removed=[${removed.join(",")}]`);
3802
+ } catch (err) {
3803
+ console.error(`${TAG} cleanup write failed accountId=${accountId ?? "unknown"}: ${err instanceof Error ? err.message : String(err)}`);
3804
+ }
3805
+ }
3738
3806
 
3739
3807
  // app/lib/claude-agent/logging.ts
3740
3808
  var emitMissingOnResolve = (..._args) => null;
@@ -4414,6 +4482,7 @@ export {
4414
4482
  parseCookieValue,
4415
4483
  PLATFORM_ROOT2 as PLATFORM_ROOT,
4416
4484
  ACCOUNTS_DIR,
4485
+ listValidAccounts,
4417
4486
  resolveAccount,
4418
4487
  resolveUserAccounts,
4419
4488
  fingerprintSessionKey,
@@ -4432,6 +4501,7 @@ export {
4432
4501
  walkPremiumBundles,
4433
4502
  autoDeliverPremiumPlugins,
4434
4503
  reconcileEnabledPlugins,
4504
+ cleanupLeakedPremiumSubs,
4435
4505
  emitMissingOnResolve,
4436
4506
  stripAttachmentMetaSuffix,
4437
4507
  requirePortEnv,
@@ -19,7 +19,7 @@ import {
19
19
  streamActionEvents,
20
20
  vncLog,
21
21
  websockifyLog
22
- } from "./chunk-BVDLDM6O.js";
22
+ } from "./chunk-TZD23CX6.js";
23
23
  import "./chunk-JRBCOVA4.js";
24
24
  import "./chunk-JSBRDJBE.js";
25
25
 
@@ -18,6 +18,7 @@ import {
18
18
  browserViewerLog,
19
19
  canAccessAdmin,
20
20
  checkRateLimit,
21
+ cleanupLeakedPremiumSubs,
21
22
  clearRateLimit,
22
23
  clientIpMiddleware,
23
24
  createRemoteSession,
@@ -35,6 +36,7 @@ import {
35
36
  isPasswordValid,
36
37
  isRemoteAuthConfigured,
37
38
  launchAction,
39
+ listValidAccounts,
38
40
  reconcileEnabledPlugins,
39
41
  recordFailedAttempt,
40
42
  registerSession,
@@ -59,7 +61,7 @@ import {
59
61
  vncLog,
60
62
  waitForExit,
61
63
  walkPremiumBundles
62
- } from "./chunk-BVDLDM6O.js";
64
+ } from "./chunk-TZD23CX6.js";
63
65
  import {
64
66
  CLOUDFLARE_TASK_DIAGNOSTICS,
65
67
  appendCloudflareSteps,
@@ -14368,6 +14370,9 @@ var bootEntitlement = bootAccountConfig ? resolveEntitlement(
14368
14370
  ) : null;
14369
14371
  autoDeliverPremiumPlugins();
14370
14372
  reconcileEnabledPlugins(bootAccount?.accountDir, bootAccount?.config);
14373
+ for (const acct of listValidAccounts()) {
14374
+ cleanupLeakedPremiumSubs(acct.accountDir, acct.config, acct.accountId);
14375
+ }
14371
14376
  (async () => {
14372
14377
  if (!bootAccount) return;
14373
14378
  try {
@@ -1,8 +0,0 @@
1
- {
2
- "name": "founder-pack",
3
- "description": "founder-pack plugin",
4
- "version": "0.1.0",
5
- "author": {
6
- "name": "Rubytech LLC"
7
- }
8
- }
@@ -1,258 +0,0 @@
1
- ---
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, 12-slide deck blueprint, print-ready HTML+PDF for both. Trigger phrases include "build me a data room", "draft a business plan", "deck from the business plan", "print-ready PDF for the prospectus", "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, deck, and prospectus per `realagent-site/.docs/design-tokens.md`.
4
- allowed-tools:
5
- - Bash
6
- - Read
7
- - Write
8
- - Edit
9
- - Glob
10
- - Grep
11
- - WebSearch
12
- - WebFetch
13
- ---
14
-
15
- # investor-data-room
16
-
17
- Build a UK seed-raise pack in five stages. Each stage has an outcome contract; do not advance until the contract is met.
18
-
19
- ## Outcome contract (whole skill)
20
-
21
- Complete when the data room contains:
22
-
23
- ```
24
- <project-site>/.docs/data-room/
25
- README.md # data-room index, status snapshot, doctrine
26
- 01-narrative/
27
- office-hours-design.md # ideation working scratchpad
28
- business-plan.md # 15-section business plan
29
- deck-blueprint.md # 12-slide blueprint
30
- 02-corporate-legal/
31
- README.md # incorporation filings, articles, board minutes
32
- incorporation-<co-house-no>-<date>.pdf # IN01 + statement of capital + cap table
33
- 03-cap-table/
34
- README.md # pre/post-investment cap table with PSC notes
35
- 04-financials/
36
- README.md
37
- model_worksheet.md # opening cash, capex, burn, MRR ramp, two-round
38
- 05-commercial/
39
- README.md
40
- <gtm-partner-1>.md # one file per named partner
41
- <gtm-partner-1>-proposal.pdf
42
- 06-product-ip/
43
- README.md
44
- encrypted-document-sharing.md # if applicable
45
- 07-team/
46
- README.md
47
- <founder-1>.pdf # CV per foregrounded founder
48
- 08-market/
49
- README.md
50
- sources.md # every market figure with citation
51
- competitor-value-claims-rebuttal.md
52
- 09-operations/
53
- README.md
54
- 10-supporting/
55
- README.md
56
- html/
57
- business-plan/
58
- index.html # A4 portrait, design tokens, premium register
59
- render-pdf.mjs # Playwright + img2pdf + qpdf pipeline
60
- business-plan.pdf # rendered output
61
- logo-light.png logo-dark.png
62
- prospectus/
63
- index.html # A4 portrait, 10-15 page persuasive cut
64
- term_sheet.html # A4 portrait, 6-8 page formal term sheet
65
- render-pdf.mjs
66
- prospectus.pdf term_sheet.pdf
67
- logo-light.png logo-dark.png
68
- deck/
69
- index.html # 16:9 landscape (297mm x 167mm), 12+1 slides
70
- render-pdf.mjs
71
- deck.pdf
72
- logo-light.png logo-dark.png
73
- team/ # cropped headshot WebPs for slide 8 founder grid
74
- <founder-firstname>-<lastname>.webp
75
- ```
76
-
77
- Skip stages that are already complete; do not regenerate stale artefacts blindly.
78
-
79
- ## Stage 1 — Office-hours ideation
80
-
81
- Drive a conversational discovery session using the `/office-hours` skill (or equivalent YC-style forcing questions: demand reality, status quo, desperate specificity, narrowest wedge, observation, future-fit). Output a single `office-hours-design.md` capturing:
82
-
83
- - Problem statement
84
- - Demand evidence (with numbers and dates)
85
- - Status quo
86
- - Target user and narrowest wedge
87
- - Constraints
88
- - Six to eight numbered premises (founder-confirmed)
89
- - Two to four narrative-shape alternatives with a recommendation
90
- - Financials / use-of-funds placeholders flagged as open questions
91
- - Founder Signal Reflection
92
-
93
- This file is the working substrate. It stays internal-only. Every later artefact derives from it.
94
-
95
- **Doctrine.** Never speculate on numbers; flag them as open questions until the founder confirms.
96
-
97
- ## Stage 2 — Data room scaffold
98
-
99
- Build the directory tree above. Each section gets a `README.md` that doubles as a content checklist (purpose, expected contents, current state, gaps). The graph structure is fixed: ten numbered sections (`01-narrative` through `10-supporting`) plus a top-level README and an `html/` subdirectory for rendered deliverables.
100
-
101
- **File-naming conventions:**
102
-
103
- - `<co-house-no>` for Companies House filings (e.g. `incorporation-17237239-2026-05-22.pdf`).
104
- - `<founder-firstname>-<lastname>.pdf` for CVs.
105
- - `<gtm-partner>.md` + `<gtm-partner>-proposal.pdf` for each commercial partner.
106
- - All `README.md` files are markdown only.
107
-
108
- **Where the published URL lives.** If the project hosts a public prospectus or marketing microsite, keep the published artefacts at a stable path (e.g. `realagent.chat/sites/<slug>/`); the rendered HTML inside `html/<artefact>/index.html` is the source of truth and republishes from there.
109
-
110
- References: `references/data-room-structure.md` for the section-by-section purpose statements.
111
-
112
- ## Stage 3 — Business plan synthesis
113
-
114
- Generate `01-narrative/business-plan.md` with **15 sections** following the canonical structure:
115
-
116
- 1. Executive Summary
117
- 2. Vision and Mission (Vision / Mission / Doctrine triad)
118
- 3. The Company (legal entity table + pre-investment cap table)
119
- 4. The Market (TAM/SAM/SOM + structural tailwind + self-employed wedge + domestic adjacency + international upside + pricing)
120
- 5. The Product (what it is + wedge product + upsell path + substrate moat + conversation ingestion + network + Anthropic asymmetric capture + human-services layer)
121
- 6. The Business Model (revenue streams + unit economics)
122
- 7. Go-to-Market (Wedge → Beachhead → Blitzscale framework + demand evidence + GTM partners + horse-before-cart logic + geography)
123
- 8. Competition (three failing categories + RANL differentiation + most-direct-competitor counter)
124
- 9. Operations (technology stack + data sovereignty + IP ownership chain + compliance posture summary)
125
- 10. Compliance and regulatory positioning (UK consumer protection + UK data/AI regime + EU AI Act + adjacent UK obligations + moat-not-tax close)
126
- 11. Team (founders + strategic shareholders + hiring plan)
127
- 12. Financial Plan (12.1 opening balance sheet through 12.7 use of funds)
128
- 13. Risks and Mitigations
129
- 14. Milestones (the N-month thesis)
130
- 15. The bottom line (summary table + close)
131
- + Appendices (titled documents only; no internal-only file pointers)
132
-
133
- **Critical rules** (all enforced; recurrence is a P0 violation):
134
-
135
- - **No internal workings** in body text. No "reconciliation pending", no "open Q", no comparison-to-baseline ("loss has grown from X to Y because…"), no cross-references to `office-hours-design.md` or any working file.
136
- - **Cap table is authoritative from the IN01.** Reconcile the share-capital line (`500,000 ordinary @ £0.001 nominal` vs `@ £0.01`) before writing the opening balance sheet. Inception premium (e.g. one founder paying £4,500 above nominal) reconciles £5k inception cash against £500 nominal.
137
- - **Every market figure cites a source.** Maintain `08-market/sources.md` with every figure used in the business plan; the body references "Appendix B" by title, never an internal file path.
138
- - **Financial figures derive from the model worksheet.** Cite "Appendix A" by title.
139
- - **No em-dashes between alphabetic words** in user-facing prose (recurring style violation in this project's history; see `references/internal-workings-scrub.md`).
140
-
141
- 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.
142
-
143
- 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.
144
-
145
- ## Stage 3b — Term sheet synthesis
146
-
147
- Generate `html/prospectus/term_sheet.html` as an **A4 portrait, 10-page formal term sheet** sectioned as:
148
-
149
- 1. Cover + preamble + parties (Issuer / Founders / Investors / round size / minimum cheque / target close)
150
- 2. Share economics & use of proceeds (instrument, valuation, dilution, issue price, share count, use of funds)
151
- 3. Cap table on closing (post-money, fully diluted, total = 100%)
152
- 4. Governance & shareholder protections (board, info rights, pre-emption, drag/tag, SEIS/EIS posture)
153
- 5. Closing terms (governing law, IP assignment, conditions to closing, long-form docs timeline)
154
- 6. Signatures (Company + Investor blocks)
155
- 7. **Appendix A — High Net Worth Individual Investor Statement** (FSMA 2000 / FCA COBS 4 Annex 2 verbatim)
156
- 8. **Appendix B — Self-Certified Sophisticated Investor Statement** (FSMA 2000 / FCA COBS 4 Annex 4 verbatim)
157
- 9. Backpage (contact)
158
-
159
- **Doctrine for the term sheet:**
160
-
161
- - **Entity name is the IN01-filed name**, not a marketing entity. Issuer must read as the actual filed company (e.g. "Real Agent Network Limited" not "Real Agent Systems Ltd").
162
- - **Cap table matches the IN01 + Round 1 dilution model exactly.** Pre-investment shares + new investor Round Shares = post-investment total. No fractional shares; no rounding to the % column that breaks share totals.
163
- - **Founder list reads exactly as the cap table.** No phantom founders. Strategic shareholders (e.g. an investing LLP) ride in the cap table by entity name, not via their individuals.
164
- - **Sole director on IN01 is the director-designate.** A term sheet that names two directors when IN01 names one is a defect.
165
- - **SEIS/EIS posture is post-funding obligation, not closing contingency.** Never assured prior to distribution; no representation as to qualifying status. Forms no part of consideration.
166
- - **Confidentiality and exclusivity provisions are the only binding clauses.** Everything else non-binding until long-form docs.
167
- - **FCA self-certification statements are appendices to the term sheet, not separate documents.** The High Net Worth Individual Investor Statement (FSMA 2000 (Financial Promotion) Order 2005 / FCA COBS 4 Annex 2) and the Self-Certified Sophisticated Investor Statement (COBS 4 Annex 4) ship as Appendix A and Appendix B. **Use verbatim wording**; never paraphrase regulatory text. Current source: UKBAA's templated PDFs (Feb 2024 versions reflect the post-31 Jan 2024 reverted thresholds: HNW £170k income or £430k net assets; sophisticated director threshold £1.6m turnover). When the regulatory wording changes, the templates change first at UKBAA / FCA COBS Annexes; re-fetch before issue.
168
-
169
- References: `references/termsheet-template.md`.
170
-
171
- ## Stage 4 — Deck blueprint synthesis
172
-
173
- 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:
174
-
175
- 1. Cover (raise headline + founders)
176
- 2. Vision (Vision / Mission / Doctrine)
177
- 3. The Market (TAM + tailwind + wedge)
178
- 4. Business Model (subscription + service layer + unit economics)
179
- 5. Go-to-Market (Wedge → Beachhead → Blitzscale + named partners)
180
- 6. The Product (substrate + wedge + network + asymmetric capture + services layer)
181
- 7. Competition (three failing categories + most-direct counter)
182
- 8. The Team (founders + strategic shareholders)
183
- 9. Economics (P&L summary + cash flow + break-even)
184
- 10. The Raise (size, valuation, dilution, instrument, use of funds, IP transfer, follow-on round)
185
- 11. Milestones (M0 to M-final timeline)
186
- 12. Other Information (compliance + platform dependency + contact)
187
-
188
- Production notes attached: format (16:9 landscape, PDF + source deck), design tokens reference (`realagent-site/.docs/design-tokens.md` or project equivalent), chart-source consistency with the financial model, speaker-note attribution.
189
-
190
- References: `references/deck-blueprint-template.md`.
191
-
192
- ## Stage 5 — HTML + PDF render pipeline
193
-
194
- For each artefact that ships as a print-ready PDF (business plan, prospectus, deck), produce three files under `html/<artefact>/`:
195
-
196
- ```
197
- index.html # A4 portrait single HTML file, premium design tokens, sectioned by <section class="page">
198
- render-pdf.mjs # Playwright + img2pdf + qpdf pipeline (image-only PDF, linearized)
199
- <artefact>.pdf # rendered output (regenerate after every HTML edit)
200
- ```
201
-
202
- **Hard constraints** (from the `property-brochure:a4-print-documents` skill):
203
-
204
- - A4 portrait: `@page { size: A4 portrait; margin: 18mm 16mm 20mm; }`
205
- - One `<section class="page">` per A4 page; renderer aborts if `scrollHeight` exceeds 1123px + 2px slack.
206
- - Page numbers via CSS counter in `.page::after { content: counter(pagenum); }`. The renderer screenshots each section, so `@page @bottom-center` rules do NOT propagate.
207
- - Image-only PDF: Playwright captures one PNG per section at deviceScaleFactor 3.125 (300 dpi); `img2pdf --pagesize 210mmx297mm` binds them; `qpdf --linearize --object-streams=disable` linearises.
208
- - Even page count for booklet binding (multiple of 4 ideal). Add or remove a supporting page if parity breaks.
209
- - Cover and backpage are full-bleed `--surface-deep` with `@page :first { margin: 0 }` and named `@page backpage-full`.
210
- - Screen-only chrome (e.g. a Download PDF pill button) uses `@media print { display: none !important; }` per the skill.
211
- - `execFileSync` for img2pdf and qpdf (never `execSync` with template strings: shell-injection class).
212
- - Verify: `qpdf --check`, `pdfinfo | grep -E "Pages|Optimized"`, **and read every page visually**. `pdfinfo` reporting "25 pages, A4" is not verification.
213
-
214
- **Design tokens.** Reference the project's `design-tokens.md` Tier 1 (raw) + Tier 2 (semantic aliases) + Tier 3 (component) layers. Premium register defaults: `--paper-25` near-white page surface, `--teal-900` ink, `--gold-500` accent, `--paper-100` cool mist (`#ECF1F2`) tinted-band surface. Update token values in one place; CSS `:root` mirrors the spec.
215
-
216
- **Logo placement.** Copy the light and dark icon variants from the project's public assets (`logo-light.png` for dark cover/backpage, `logo-dark.png` reserved for light content pages if needed) into the artefact directory. Cover top-left pairs the icon with the wordmark; backpage top-left does the same.
217
-
218
- References: `references/html-pdf-pipeline.md` for the canonical `render-pdf.mjs` source and CSS scaffold.
219
-
220
- ## Doctrine (enforced across all stages)
221
-
222
- - **No internal workings in public artefacts.** Comparison-to-baseline, reconciliation-pending, open-Q markers, internal cross-references all stay in working files (`01-narrative/office-hours-design.md`, section READMEs). Public artefacts (business plan, deck, prospectus, PDFs) state the current position as a fact.
223
- - **Every claim cites a source.** Companies House for the cap table. The model worksheet for every financial figure. A named publication for every market figure. A specific vendor page for every competitor claim.
224
- - **Design tokens are the visual contract.** Update once in the tokens spec; the business plan CSS, the prospectus CSS, and the deck CSS all consume the same tokens. Never hardcode hex values inside component CSS.
225
- - **Even page count for booklet binding.** Multiple of 4 ideally; minimum even. Add or remove a supporting page to maintain parity if a section change breaks it.
226
- - **Verify by reading every rendered page.** `pdfinfo` page count is not verification. The bottom 30% of every page must reach the content margin without significant whitespace.
227
-
228
- ## Slide-design patterns (collected from the deck build)
229
-
230
- - **Cap-table over labelled pie chart.** A labelled donut with seven slices puts the percentages on the chart but adds visual clutter at small slice counts. A clean post-investment cap table (Shareholder / Shares / % with a gold-rule Total row) reads faster on the slide and matches the term-sheet treatment. Default to the table; reserve the pie for slides with three to four large slices.
231
- - **Circular founder avatars on the team slide.** Square photos at full card width over-allocate vertical real-estate and crowd the bio + advisor band. Fixed-diameter circular avatars (e.g. 42mm × 42mm, `border-radius: 50%`, centred `margin: 0 auto`) leave room for the eyebrow + name + 3-line bio + advisor band on a 16:9 slide.
232
- - **Headshot crops are face-centred, not full-environment.** Crop each source PNG/JPG to a tight head + shoulders square at 1200×1200 (`magick <src> -crop WxH+X+Y +repage -resize 1200x1200 -strip <crop>.png`), then encode with `cwebp -q 88 -m 6 -mt`. Resize-then-encode never loses face fidelity at the 42mm display size. Track per-founder face position from the source dimensions and centre the crop window on it.
233
- - **Bio line budget on slide 8 is ~3 lines at 8.5pt.** A 4th line crashes into the advisor band's `border-top`. Trim aggressively: lead with the headline number ("33 years residential estate agency"), then 2-3 firms and 1-2 awards.
234
- - **Linter strips trailing text in long edits.** When editing a multi-line founder bio (or any cell where you append clauses past a verbatim sentence), the auto-formatter has rewritten the trailing fragment on this project. Always re-grep the file after the edit; if "Sole IN01 director." or "2× Capper" went missing, the edit needs a second pass with a smaller anchor.
235
-
236
- ## Pitfalls to avoid (collected from the reference project)
237
-
238
- - **Renaming a directory after the URL is published.** Keep `<project-site>/.docs/data-room/html/<artefact>/index.html` stable; if the URL changes, downstream investor links break.
239
- - **Letting Round-2 hires inflate the Year-1 P&L.** Only Round-1 hires belong in the Year-1 income statement. Customer-success and product-engineer hires that trigger in Round 1 are in; senior platform engineer, head of growth, and CS team scale that Round 2 funds are not.
240
- - **Mixing "Year 1" (12-month) and "Round 1 runway" (9-month).** If the £350k buys 9 months, present a 9-month forecast; do not present a 12-month forecast that implicitly assumes Round 2 closes mid-period without modelling the Round-2 cash injection.
241
- - **Generic AI-bolted-onto-cloud-CRM competitors.** Treat the competitive set as three failing categories: incumbents (cloud CRM + bolted AI), Anthropic horizontal AI (inaccessible to non-tech-wizard users), and new-build cloud-SaaS AI-OS replacements (migration-required, same lock-in pattern as incumbents). Name each vendor, cite each claim from the vendor's own page, rebut with the substrate-AI inversion.
242
- - **Forgetting Priestley / equivalent founder-thesis anchor.** Any founder who built the same thesis years before AI made it structurally apparent should reference it: book title, first-publication date, founder's costly-signal action (e.g. "bought 200 copies and distributed them to operators in his network"). This dates the conviction and lifts the deck's signal weight.
243
- - **Letting the page background go light brown.** Premium register page surface (`--paper-25`) is near-white (`#FBFAF6`), not ivory. The screen-preview body background stays plain white (`#FFFFFF`).
244
-
245
- ## References
246
-
247
- - `references/data-room-structure.md` — section-by-section README templates
248
- - `references/business-plan-template.md` — 15-section business plan template
249
- - `references/deck-blueprint-template.md` — 12-slide deck brief template
250
- - `references/html-pdf-pipeline.md` — render-pdf.mjs canonical source + CSS scaffold
251
- - `references/compliance-research-checklist.md` — UK + EU regulatory regimes to verify
252
- - `references/internal-workings-scrub.md` — the public-vs-internal doctrine, patterns to scrub, recurrence list
253
- - `references/design-tokens-application.md` — how to consume `realagent-site/.docs/design-tokens.md` from an artefact's `:root` block
254
- - `references/termsheet-template.md` — A4-portrait term-sheet structure, cap-table reconciliation, common defects
255
-
256
- ## Reference project
257
-
258
- The first execution of this skill produced `realagent-site/.docs/data-room/` for Real Agent Network Limited (Companies House 17237239). Read that directory as the canonical example; the skill's job is to reproduce its structure and doctrine for any subsequent UK seed raise.
@@ -1,61 +0,0 @@
1
- # Business plan template — 15-section structure
2
-
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
-
5
- ## Section-by-section skeleton
6
-
7
- ### 1. Executive Summary
8
- One paragraph each: what the company is (legal entity + Companies House identifier + substrate description), what is being raised (size, pre-money, post-money, runway, Round 2 follow-on), demand evidence (numbers with dates), market size + structural tailwind, competitive set in three failing categories + the architectural inversion, bottom-line P&L summary.
9
-
10
- ### 2. Vision and Mission
11
- Three blocks. **Vision.** Where the company ends up at full execution. **Mission.** What the company gives to its customer day one. **Doctrine.** The structural belief that everything else derives from.
12
-
13
- ### 3. The Company
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
-
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).
18
-
19
- ### 5. The Product
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
-
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").
24
-
25
- ### 7. Go-to-Market
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.
27
-
28
- ### 8. Competition
29
- Three failing categories: (a) cloud-CRM-bolted-AI incumbents, (b) horizontal-AI providers inaccessible to ICP, (c) new-build cloud-SaaS replacements requiring full migration. RANL differentiation paragraph. Most-direct-competitor counter (CRM-agnostic vs migration-required is the headline rebuttal).
30
-
31
- ### 9. Operations
32
- Technology stack (foundation model, graph store, hardware tiered by workload, network, hosting), data sovereignty paragraph, IP ownership chain (deed-of-assignment commitment), compliance posture operational summary (pointer to Section 10 for full treatment).
33
-
34
- ### 10. Compliance and regulatory positioning
35
- Three regulatory regimes: UK consumer protection (DMCC Act for estate agency / equivalent for the vertical), UK data and AI regime (UK GDPR + ICO ADM Articles 22A–22D), EU AI Act (relevant only to international expansion). Adjacent UK obligations (Estate Agents Act / equivalent + AML + sector membership bodies). Closing: "Why compliance is the moat, not the tax".
36
-
37
- ### 11. Team
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
-
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.
42
-
43
- ### 13. Risks and Mitigations
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.
45
-
46
- ### 14. Milestones (the N-month thesis)
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
-
49
- ### 15. The bottom line
50
- 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
-
52
- ### Appendices
53
- Cited documents listed by title only. Each available to a serious investor on request; internal-only working documents are not listed.
54
-
55
- ## Writing rules
56
-
57
- - **Numbers cite their source.** Every figure in the body links to an Appendix entry that is itself a publicly-shareable document.
58
- - **No internal commentary.** See `internal-workings-scrub.md`.
59
- - **No em-dashes between alphabetic words** in user-facing prose. Use colons, parentheses, semicolons, or rewrites.
60
- - **Even-page-count parity** if the document is printed; add a supporting page if a section change breaks parity.
61
- - **One pre-investment cap table source: the IN01.** Reconcile the nominal-value discrepancy (e.g. £0.001 vs £0.01) before writing the balance sheet.