Budget: Plan A and Plan B
Two plans for the investor (October 2026): Plan A at ~180M THB keeps every
- machine of the launch plant with six cost levers, Plan B at ~225M THB (+25 %) launches with the second Duplex
- system and everything in; both priced without contingency and with the ramp-up reserve. Bars: the investment
+ machine of the launch plant with six cost levers, Plan B at ~210M THB keeps the same launch plant (one Duplex system
+ and one Classic) with everything the levers cut; both priced without contingency and with the ramp-up reserve,
+ the second Duplex a growth step in both. Marks at 180M and 180M plus 25 % (225M). Bars: the investment
at the low end, the midpoint and the high end of every block (contingency as set under Plant configuration),
plus the ramp-up reserve when it is in the budget (hatched).
@@ -3051,7 +3052,7 @@ grp("Investment rules", [
["wcRef", "Records a year the working capital is sized for", 840000, "", "doc", "revenue-model.md launch plant, central volume"],
["wcMin", "Working capital never below", 60, "%", "est", "Estimate"],
["budgetLo", "Plan A budget", 180000000, "THB", "doc", "total-investment.md: Plan A, ~180M THB without contingency, ramp-up reserve included"],
- ["budgetHi", "Plan B budget, Plan A plus 25 %", 225000000, "THB", "doc", "total-investment.md: Plan B, ~225M THB (user, October 2026)"],
+ ["budgetHi", "Upper budget mark, 180M plus 25 %", 225000000, "THB", "doc", "total-investment.md: the +25 % envelope set for Plan B (user, October 2026); Plan B is ~210M"],
]);
grp("Ten years of cash", [
["ramp1", "Sold output in year 1", 35, "% of the mature year", "est", "Estimate"],
@@ -3091,9 +3092,9 @@ const CFG0 = Object.fromEntries(CFGK.map(k => [k, S0[k]]));
const LAUNCH = { mode: "target", target: 850000, grow: "classic", dMin: 1, cMin: 1, dFleet: 1, cFleet: 1, ...CFG0 };
const PRESETS = {
launch: LAUNCH,
- // Plan A (~180M THB) and Plan B (~225M THB): total-investment.md "Two plans", priced without contingency
+ // Plan A (~180M THB, six levers) and Plan B (~210M THB, the launch plant all in): total-investment.md "Two plans", priced without contingency
planA: { ...LAUNCH, solar: "ppa", metro: "launch", corridor: "later", cass: "off", cdr: "off", crane: "rent", sourcing: "china", cont: "sep" },
- planB: { mode: "target", target: 1250000, grow: "classic", dMin: 2, cMin: 1, dFleet: 2, cFleet: 1, ...CFG0, cont: "sep" },
+ planB: { ...LAUNCH, cont: "sep" },
lean: { ...LAUNCH, galv: "bought", cut: "out" },
full: { mode: "fleet", dFleet: 5, cFleet: 4, ...CFG0 },
};
@@ -3709,7 +3710,7 @@ function renderInvest(e, r) {
H.push(`| Totals |
`);
TR("Subtotal", cx.sub, "", true);
TR(cx.ctgIn ? `Contingency ${f1(A.contPct)} %` : `Contingency ${f1(A.contPct)} % (not in the total)`, cx.ctg, cx.ctgIn ? "total-investment.md" : "shown separately, as in Plan A and Plan B");
- TR("Total investment", cx.tot, "for reference, total-investment.md: the launch plant ~161M to 285M THB with contingency (midpoint ~223M); Plan A ~162M and Plan B ~209M at the midpoint without it, plus the ramp-up reserve", true);
+ TR("Total investment", cx.tot, "for reference, total-investment.md: the launch plant ~161M to 285M THB with contingency (midpoint ~223M); Plan A ~162M and Plan B ~194M at the midpoint without it, plus the ramp-up reserve", true);
if (!cx.boiOn) {
TR(`Import duty without BOI, ${f1(A.dutyMach)} %`, cx.duty, `on ${money(cx.imp.lo)} to ${money(cx.imp.hi)} of imported machinery; import VAT ${money(cx.vat.mid)} at the midpoint, reclaimable`);
TR("Total with import duty", cx.all, "", true);
@@ -3743,7 +3744,7 @@ function renderBudget(e) {
`against ${M(B1)}: ${gap(tot, B1)} · against ${M(B2)}: ${gap(tot, B2)}
`;
}).join("");
const mid = V[1], mt = mid.cap + mid.res, rLo = cx.res.lo * fx, rHi = cx.res.hi * fx;
- const tgt = mt <= B1 ? B1 : B2; // the tightest budget the midpoint fits (Plan A: 180M, Plan B: 225M)
+ const tgt = mt <= B1 ? B1 : B2; // the tightest budget the midpoint fits (Plan A: 180M, Plan B: the 225M mark)
$("budK").innerHTML = kpi(M(mid.cap) + " THB", `investment at the midpoint, ${cx.ctgIn ? "contingency included" : "without contingency"}`) +
kpi(`${M(mid.cap + rLo)} to ${M(mid.cap + rHi)}`, `THB with the ramp-up reserve (${M(rLo)} to ${M(rHi)})`) +
kpi(mt <= tgt ? M(tgt - mt) : "+" + M(mt - B2), `${mt <= tgt ? "to spare under" : "over"} ${M(tgt)} THB at the midpoint${inB ? ", reserve included" : ""}`);
diff --git a/docs/renders/calculator/plan-a-budget.png b/docs/renders/calculator/plan-a-budget.png
index 2f85001..dfbd987 100644
Binary files a/docs/renders/calculator/plan-a-budget.png and b/docs/renders/calculator/plan-a-budget.png differ
diff --git a/docs/renders/calculator/plan-a-cash.png b/docs/renders/calculator/plan-a-cash.png
index e12c91a..bda4889 100644
Binary files a/docs/renders/calculator/plan-a-cash.png and b/docs/renders/calculator/plan-a-cash.png differ
diff --git a/docs/renders/calculator/plan-a-cover.png b/docs/renders/calculator/plan-a-cover.png
index 340c115..6338aa6 100644
Binary files a/docs/renders/calculator/plan-a-cover.png and b/docs/renders/calculator/plan-a-cover.png differ
diff --git a/docs/renders/calculator/plan-a-iso-gf.png b/docs/renders/calculator/plan-a-iso-gf.png
index f9623dd..8735af3 100644
Binary files a/docs/renders/calculator/plan-a-iso-gf.png and b/docs/renders/calculator/plan-a-iso-gf.png differ
diff --git a/docs/renders/calculator/plan-a-iso-hall.png b/docs/renders/calculator/plan-a-iso-hall.png
index 3dbd0fd..0b00800 100644
Binary files a/docs/renders/calculator/plan-a-iso-hall.png and b/docs/renders/calculator/plan-a-iso-hall.png differ
diff --git a/docs/renders/calculator/plan-a-iso-roof.png b/docs/renders/calculator/plan-a-iso-roof.png
index 11e1432..f4a2bea 100644
Binary files a/docs/renders/calculator/plan-a-iso-roof.png and b/docs/renders/calculator/plan-a-iso-roof.png differ
diff --git a/docs/renders/calculator/plan-b-budget.png b/docs/renders/calculator/plan-b-budget.png
index 5c900e1..73a9874 100644
Binary files a/docs/renders/calculator/plan-b-budget.png and b/docs/renders/calculator/plan-b-budget.png differ
diff --git a/docs/renders/calculator/plan-b-cash.png b/docs/renders/calculator/plan-b-cash.png
index df69c12..9e5fd53 100644
Binary files a/docs/renders/calculator/plan-b-cash.png and b/docs/renders/calculator/plan-b-cash.png differ
diff --git a/docs/renders/calculator/plan-b-cover.png b/docs/renders/calculator/plan-b-cover.png
index 6ebdf81..d206590 100644
Binary files a/docs/renders/calculator/plan-b-cover.png and b/docs/renders/calculator/plan-b-cover.png differ
diff --git a/docs/renders/calculator/plan-b-iso-gf.png b/docs/renders/calculator/plan-b-iso-gf.png
index 2d9a487..3b2e30e 100644
Binary files a/docs/renders/calculator/plan-b-iso-gf.png and b/docs/renders/calculator/plan-b-iso-gf.png differ
diff --git a/docs/renders/calculator/plan-b-iso-hall.png b/docs/renders/calculator/plan-b-iso-hall.png
index f6b950b..25df26a 100644
Binary files a/docs/renders/calculator/plan-b-iso-hall.png and b/docs/renders/calculator/plan-b-iso-hall.png differ
diff --git a/docs/renders/calculator/plan-b-iso-roof.png b/docs/renders/calculator/plan-b-iso-roof.png
index c2fe878..a877ae3 100644
Binary files a/docs/renders/calculator/plan-b-iso-roof.png and b/docs/renders/calculator/plan-b-iso-roof.png differ
diff --git a/docs/renders/demos/factory-floor.png b/docs/renders/demos/factory-floor.png
index b0f1ba7..d48ed11 100644
Binary files a/docs/renders/demos/factory-floor.png and b/docs/renders/demos/factory-floor.png differ
diff --git a/docs/renders/demos/scada.png b/docs/renders/demos/scada.png
index a400153..20ac662 100644
Binary files a/docs/renders/demos/scada.png and b/docs/renders/demos/scada.png differ
diff --git a/docs/roadmap.md b/docs/roadmap.md
index f5460bf..bd802fb 100644
--- a/docs/roadmap.md
+++ b/docs/roadmap.md
@@ -10,8 +10,8 @@ These three run in parallel and gate everything downstream:
1. **Market validation**: test the blended pressing price (3.76 to 5.27
USD at the planned 60 % specials; 3.50 to 4.60 at a standard-heavy mix)
- and regional demand, which decides between Plan A (~0.74M records a year)
- and Plan B (~1.25M) in [total investment](finance/total-investment.md#two-plans-a-at-180m-thb-and-b-at-225m-thb-october-2026),
+ and regional demand (~0.74M records a year in both Plan A and Plan B, and
+ when the second Duplex follows from revenue) in [total investment](finance/total-investment.md#two-plans-a-at-180m-thb-and-b-at-210m-thb-october-2026),
with Asian labels and distributors, starting at
Making Vinyl in Haarlem (Alexander and Simona). This is the biggest
assumption in the [revenue model](finance/revenue-model.md); the
@@ -174,8 +174,8 @@ before the BOI certificate, no big-block spending before the market
validates the price, no coppice fuel planning before the land title check.
Since October 2026 the plant launches with everything in one capital
round (~161M to 285M THB with contingency; for the investor Plan A at
-~180M and Plan B at ~225M THB without it, in
-[total investment](finance/total-investment.md#two-plans-a-at-180m-thb-and-b-at-225m-thb-october-2026));
+~180M and Plan B at ~210M THB without it, in
+[total investment](finance/total-investment.md#two-plans-a-at-180m-thb-and-b-at-210m-thb-october-2026));
the gates still come before the round is spent, and the growth options
(more Duplex systems first, then Classics, in a press hall laid out for
five Duplex systems and four Classics) are funded from revenue.