@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.
- package/dist/index.js +1 -1
- package/dist/uninstall.js +1 -1
- package/package.json +1 -1
- package/payload/platform/plugins/.claude-plugin/marketplace.json +0 -15
- package/payload/premium-plugins/real-agent/plugins/brochures/skills/property-brochure/SKILL.md +5 -1
- package/payload/server/{chunk-BVDLDM6O.js → chunk-TZD23CX6.js} +71 -1
- package/payload/server/maxy-edge.js +1 -1
- package/payload/server/server.js +6 -1
- package/payload/platform/plugins/founder-pack/.claude-plugin/plugin.json +0 -8
- package/payload/platform/plugins/founder-pack/skills/investor-data-room/SKILL.md +0 -258
- package/payload/platform/plugins/founder-pack/skills/investor-data-room/references/business-plan-template.md +0 -61
- package/payload/platform/plugins/founder-pack/skills/investor-data-room/references/compliance-research-checklist.md +0 -53
- package/payload/platform/plugins/founder-pack/skills/investor-data-room/references/data-room-structure.md +0 -77
- package/payload/platform/plugins/founder-pack/skills/investor-data-room/references/deck-blueprint-template.md +0 -38
- package/payload/platform/plugins/founder-pack/skills/investor-data-room/references/design-tokens-application.md +0 -79
- package/payload/platform/plugins/founder-pack/skills/investor-data-room/references/html-pdf-pipeline.md +0 -236
- package/payload/platform/plugins/founder-pack/skills/investor-data-room/references/internal-workings-scrub.md +0 -33
- package/payload/platform/plugins/founder-pack/skills/investor-data-room/references/termsheet-template.md +0 -88
- package/payload/platform/plugins/teaching/.claude-plugin/plugin.json +0 -8
- package/payload/platform/plugins/teaching/PLUGIN.md +0 -58
- package/payload/platform/plugins/teaching/skills/interactive-tutor/SKILL.md +0 -59
- package/payload/platform/plugins/teaching/skills/interactive-tutor/references/assessment.md +0 -70
- package/payload/platform/plugins/teaching/skills/interactive-tutor/references/classroom-conduct.md +0 -43
- package/payload/platform/plugins/teaching/skills/interactive-tutor/references/teaching-modes.md +0 -83
- package/payload/platform/plugins/teaching/skills/lesson-planner/SKILL.md +0 -48
- package/payload/platform/plugins/teaching/skills/lesson-planner/references/context-gathering.md +0 -41
- package/payload/platform/plugins/teaching/skills/lesson-planner/references/plan-structure.md +0 -94
- package/payload/platform/plugins/teaching/skills/study-pack-builder/SKILL.md +0 -52
- package/payload/platform/plugins/teaching/skills/study-pack-builder/references/disaggregation.md +0 -49
- package/payload/platform/plugins/teaching/skills/study-pack-builder/references/materials.md +0 -116
- package/payload/platform/plugins/writer-craft/.claude-plugin/plugin.json +0 -8
- package/payload/platform/plugins/writer-craft/PLUGIN.md +0 -88
- package/payload/platform/plugins/writer-craft/agents/writer-craft--manuscript-reviewer.md +0 -92
- package/payload/platform/plugins/writer-craft/skills/citation-style/SKILL.md +0 -94
- package/payload/platform/plugins/writer-craft/skills/citation-style/references/book-and-chapter-models.md +0 -77
- package/payload/platform/plugins/writer-craft/skills/citation-style/references/citation-rules.md +0 -103
- package/payload/platform/plugins/writer-craft/skills/citation-style/references/journal-article-models.md +0 -74
- package/payload/platform/plugins/writer-craft/skills/citation-style/references/other-source-models.md +0 -146
- package/payload/platform/plugins/writer-craft/skills/citation-style/references/reference-list-rules.md +0 -70
- package/payload/platform/plugins/writer-craft/skills/editorial-practice/SKILL.md +0 -108
- package/payload/platform/plugins/writer-craft/skills/editorial-practice/references/copyediting.md +0 -73
- package/payload/platform/plugins/writer-craft/skills/editorial-practice/references/developmental-editing.md +0 -85
- package/payload/platform/plugins/writer-craft/skills/editorial-practice/references/genre-specific-editing.md +0 -78
- package/payload/platform/plugins/writer-craft/skills/editorial-practice/references/line-editing.md +0 -55
- package/payload/platform/plugins/writer-craft/skills/editorial-practice/references/self-editing.md +0 -89
- package/payload/platform/plugins/writer-craft/skills/persuasive-storytelling/SKILL.md +0 -114
- package/payload/platform/plugins/writer-craft/skills/persuasive-storytelling/references/audience-analysis.md +0 -73
- package/payload/platform/plugins/writer-craft/skills/persuasive-storytelling/references/crafting-persuasive-story.md +0 -76
- package/payload/platform/plugins/writer-craft/skills/persuasive-storytelling/references/persuasion-case-studies.md +0 -67
- package/payload/platform/plugins/writer-craft/skills/persuasive-storytelling/references/transformation-framework.md +0 -86
- package/payload/platform/plugins/writer-craft/skills/point-of-view/SKILL.md +0 -97
- package/payload/platform/plugins/writer-craft/skills/point-of-view/references/indirect-narration.md +0 -72
- package/payload/platform/plugins/writer-craft/skills/point-of-view/references/pov-types-and-voice.md +0 -91
- package/payload/platform/plugins/writer-craft/skills/point-of-view/references/protagonist-filter.md +0 -71
- package/payload/platform/plugins/writer-craft/skills/point-of-view/references/tense-and-person.md +0 -85
- package/payload/platform/plugins/writer-craft/skills/prose-craft/SKILL.md +0 -100
- package/payload/platform/plugins/writer-craft/skills/prose-craft/references/punctuation-and-grammar.md +0 -72
- package/payload/platform/plugins/writer-craft/skills/prose-craft/references/repetition.md +0 -71
- package/payload/platform/plugins/writer-craft/skills/prose-craft/references/sound-and-rhythm.md +0 -64
- package/payload/platform/plugins/writer-craft/skills/prose-craft/references/word-economy.md +0 -93
- package/payload/platform/plugins/writer-craft/skills/reader-engagement/SKILL.md +0 -100
- package/payload/platform/plugins/writer-craft/skills/reader-engagement/references/cause-effect-setup-payoff.md +0 -79
- package/payload/platform/plugins/writer-craft/skills/reader-engagement/references/conflict-escalation.md +0 -81
- package/payload/platform/plugins/writer-craft/skills/reader-engagement/references/hooking-readers.md +0 -67
- package/payload/platform/plugins/writer-craft/skills/reader-engagement/references/neurochemistry-of-engagement.md +0 -94
- package/payload/platform/plugins/writer-craft/skills/review-manuscript/SKILL.md +0 -111
- package/payload/platform/plugins/writer-craft/skills/review-manuscript/references/review-manuscript-checklist.md +0 -119
- package/payload/platform/plugins/writer-craft/skills/review-prose/SKILL.md +0 -99
- package/payload/platform/plugins/writer-craft/skills/review-prose/references/prose-review-checklist.md +0 -112
- package/payload/platform/plugins/writer-craft/skills/review-scene/SKILL.md +0 -99
- package/payload/platform/plugins/writer-craft/skills/review-scene/references/scene-analysis-framework.md +0 -95
- package/payload/platform/plugins/writer-craft/skills/story-architecture/SKILL.md +0 -106
- package/payload/platform/plugins/writer-craft/skills/story-architecture/references/blueprinting-and-scene-cards.md +0 -118
- package/payload/platform/plugins/writer-craft/skills/story-architecture/references/inner-issue-and-protagonist-goal.md +0 -66
- package/payload/platform/plugins/writer-craft/skills/story-architecture/references/misbelief-desire-worldview.md +0 -87
- package/payload/platform/plugins/writer-craft/skills/story-architecture/references/origin-scenes-and-escalation.md +0 -82
- package/payload/platform/plugins/writer-craft/skills/story-blueprint/SKILL.md +0 -133
- package/payload/platform/plugins/writer-craft/skills/story-blueprint/references/blueprinting-exercises.md +0 -118
- 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
|
@@ -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
|
}
|
package/payload/premium-plugins/real-agent/plugins/brochures/skills/property-brochure/SKILL.md
CHANGED
|
@@ -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. **
|
|
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 (
|
|
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,
|
package/payload/server/server.js
CHANGED
|
@@ -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-
|
|
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,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.
|