Plan B re-defined: the launch plant with everything in (~210M THB); front view on the cover
Deploy test site / deploy (push) Successful in 52s

- Plan B now starts like Plan A with one Duplex system and one Classic,
  but takes none of the six levers: owned solar and battery (with the BOI
  solar measure), the full metrology stack, the visitor corridor, cassette
  and CD-R, the bought crane and Thai-supplied utilities (user, 17 October
  2026). ~193.8M THB before the reserve, ~209M with it (~150M to 268M),
  ~32M (~18 %) more than Plan A; the second Duplex is a growth step from
  revenue in both (~15.4M THB, estimate).
- total-investment.md "Two plans" re-based (heading and anchor now
  "B at ~210M THB", README and roadmap links updated); revenue-model.md
  operating pictures: same volume and EBITDA as Plan A, depreciation on
  Plan B's capital (operating profit 1.26M USD central, payback ~3.7 yr);
  the extra earns nothing in the modelled table, which the docs say.
- Calculator: Plan B preset = the launch plant with contingency kept out
  (EBITDA 2.07M USD, cash payback year ~4.3, IRR ~21 %); budget card marks
  180M and 180M plus 25 %; preset label "Plan B (~210M, all in)".
- Business plan draft 0.3, both versions rebuilt: every Plan B branch of
  the three content files rewritten; renders regenerated with the
  isometric view turned to the front of the site (road, car park, office,
  corridor facade) for the cover and Figures 8 to 10.
This commit is contained in:
grabowski committed 2026-10-17 16:33:18 +07:00
1 parent ffc6cedbca
commit 3f33babdaa
28 files changed
+528 -604

No files matched your search

+37 -43
View File
@@ -1,7 +1,8 @@
"""Part B: what makes it top-notch (traceability, metrology, QC, efficiency); site and building;
regulatory (BOI and licences). Draft 0.3, October 2026: one text for both versions, Plan A (~180M
THB, the launch plant with six cost levers) and Plan B (~225M THB, five presses, everything in); the
plan-specific passages switch with plan_variant.pick(), called inside blocks()."""
THB, the launch plant with six cost levers) and Plan B (~210M THB, the same launch plant with
everything in, none of the levers); the plan-specific passages switch with plan_variant.pick(),
called inside blocks()."""
from plan_lib import H1, H2, H3, P, B, N, T, KV, IMG, CALL, PB
from plan_variant import pick, is_a, is_b, label, name
@@ -192,10 +193,10 @@ def blocks():
"the budget.",
], [
"**At launch: the full stack.** The metrology and QC block is USD 350k to 810k (11.6M to 26.7M "
"THB, estimate, section 8): XRF, laser confocal, wide-area profiler, inline vision on the presses "
"and the audio station. Every father, mother and stamper is measured before the next plating "
"generation or the press. The block was priced with inline vision on three presses, so the "
"cameras for the second Duplex system are to quote.",
"THB, estimate, section 8): XRF, laser confocal, wide-area profiler, inline vision on the three "
"presses and the audio station. Every father, mother and stamper is measured before the next "
"plating generation or the press, and groove geometry and form on the metal are measured from "
"the first release.",
"**If quotes land high,** the laser confocal and the wide-area profiler (USD 180k to 350k, "
"estimate) are the part that can wait and be bought from revenue: thickness and cosmetics "
"would still be measured on every part, and groove geometry judged through the test pressing "
@@ -218,7 +219,7 @@ def blocks():
"stamper), stitching and flow lines, warp, off-centre spindle holes, surface debris, wrong or "
"off-centre labels. Non-fill and stitching correlate with audible defects, so this is a strong "
"proxy for audio quality", "Custom integration of general machine vision (Keyence or Cognex "
"class) on all " + pick("three", "five") + " presses; no vinyl-specific "
"class) on all three presses; no vinyl-specific "
"product exists"],
["2. Press telemetry, every cycle", "Mould temperatures, pressures, cycle time, extruder values, "
"yields and drift alerts from the press PLC", "Process drift before it becomes a defect; the "
@@ -269,9 +270,10 @@ def blocks():
"At launch the three presses need 450 to 540 kg/h of saturated steam at 10 bar / 180 °C and "
"~391.5 kW of cooling at a hot-afternoon peak; the utility backbone is built for the "
"five-press fleet (750 to 900 kg/h of steam, up to ~650 kW of cooling). ",
"At launch the five presses need 750 to 900 kg/h of saturated steam at 10 bar / 180 °C and "
"~652.5 kW of cooling at a hot-afternoon peak, on a utility backbone with rooms for four "
"boiler and four chiller modules. ") +
"At launch the three presses need 450 to 540 kg/h of saturated steam at 10 bar / 180 °C and "
"~391.5 kW of cooling at a hot-afternoon peak, on a utility backbone with rooms for four "
"boiler and four chiller modules, so the second Duplex system plugs in when revenue pays for "
"it. ") +
"On top comes whole-plant air conditioning in a tropical climate. Newbilt excludes "
"steam and cooling from its scope, so these systems are ours to design, and the design rests on "
"one observation: the steam's job is to heat the moulds and the cooling water's job is to remove "
@@ -289,12 +291,11 @@ def blocks():
"lag by one controller. Either boiler alone carries 93 to 111% of the steam demand; one "
"chiller out leaves ~64% of the cooling peak. The boiler bodies come through the Chinese "
"route and the compressor from a Chinese brand's Thai office (below). ",
"at launch two 500 kg/h boilers (B-1, B-2) for the 750 to 900 kg/h peak and three 250 kW "
"air-cooled chillers rated at 40 °C ambient (CH-1 to CH-3) for ~652.5 kW, sequenced lead "
"and lag by one controller; the boilers and the compressor come from Thai suppliers "
"(below). Five presses on two boilers leave no spare: a third module (B-3) is an RFQ option "
"outside the plan price, and without it a boiler fault costs about two presses until it is "
"fixed; one chiller out leaves ~77% of the cooling peak. ") +
"at launch two 500 kg/h boilers (B-1, B-2) for the 450 to 540 kg/h peak and two 250 kW "
"air-cooled chillers rated at 40 °C ambient (CH-1, CH-2) for ~391.5 kW, sequenced lead and "
"lag by one controller. Either boiler alone carries 93 to 111% of the steam demand; one "
"chiller out leaves ~64% of the cooling peak. The boilers and the compressor come from Thai "
"suppliers, with local service (below). ") +
"Identical modules mean one set of spares "
"and one service routine, N+1 later is one more module rather than a redesign, and the plant "
"never runs one oversized boiler at poor part load. Four boilers carry about eight presses with "
@@ -343,7 +344,7 @@ def blocks():
"weekdays) and 2.6037 THB/kWh off-peak, plus the Ft fuel adjustment (+0.1623 THB/kWh for "
"September to December 2026; it resets every four months) and reclaimable VAT. Two shifts put "
"about two thirds of process energy into peak hours: a blended ~3.81 THB/kWh before the demand "
"charge. " + pick("For the five-press fleet the backbone is built for", "For the five presses") +
"charge. For the five-press fleet the backbone is built for" +
", without electric steam, that is "
"roughly 4.5M to 6.8M THB a year before solar, 0.7M to 1.1M of it demand charge (estimates), on "
"an 800 to 1,000 kVA connection. Three design consequences:"),
@@ -404,8 +405,7 @@ def blocks():
"pipeline in Northern Thailand, so gas means a bulk LPG tank on site with hazardous-storage "
"separation and licensing, and diesel means a fuel tank with price exposure. The two routes "
"without a fossil tank, compared for the same heat (~1,120 to 1,280 MWh a year at about 1.0 "
"million records, " + pick("the top of the plant's range", "the low end of the five presses' "
"range") + "; estimates):"),
"million records, the top of the plant's range; estimates):"),
T(["", "Electric boiler bank (~98%)", "Biomass boiler bank (~80%)"], [
["Price of heat", "~3.9 THB/kWh, plus the demand charge", "~0.5 to 0.9 THB/kWh at 1.35 to 2 "
"THB/kg delivered (reported market prices, October 2026; no supplier quote yet)"],
@@ -429,9 +429,7 @@ def blocks():
"land a biomass stack would be a hard sell, which favours electric or LPG there (section 6.1)."),
P("**Fuel.** A biomass bank burns roughly 350 to 400 tonnes of air-dry wood a year at about 1.0 "
"million records (~540 to 620 t as fresh chips, which is what the store and the monsoon stock are "
"sized for)" + pick("", ", up to ~550 t air-dry at 1.5 million (fuel follows records pressed, "
"not presses)") +
". Lamphun alone produces more than 900,000 t of farm residues a year (Maejo "
"sized for). Lamphun alone produces more than 900,000 t of farm residues a year (Maejo "
"University), so supply is not the constraint; price is. Reported prices follow diesel, so the "
"fuel contract gets a diesel clause and sources within ~50 km. The local price-setter is Ratch "
"Pathana's biomass buying centre at Pa Sak, Mueang Lamphun, which feeds a 9.6 MW cogeneration "
@@ -519,8 +517,6 @@ def blocks():
"Figure 2. Plant overview (simulated SCADA) of the launch plant, running at 60×: header with shift, "
"presses running, cycles an hour, good records and rejects, metal in work, steam pressure, plant "
"load and solar; metal path on top, press hall and finishing in the middle, utilities below. "
+ pick("", "The demo draws the launch plant (Duplex system 1 and the Classic); Plan B adds the "
"second Duplex system to the same screen. ") +
"Demo (docs/plant-operation.html), simulated values."),
H3("Back office: the factory console on ERPNext"),
P("The factory application (working name cnx-factory) is the plant's working interface. It shows the "
@@ -687,10 +683,7 @@ def blocks():
caption="Estimates. The boiler and chillers have since moved to the detached utility yard, which "
"frees floor the workshop and corridor take; water treatment is proposed in its own "
"building next to galvanics; cassette and CD-R duplication (~40 to 80 m² and ~20 to "
"40 m²" + pick(", a later step in this plan", "") + ") are not in the table yet. " + pick(
"", "The press rows size one Duplex system and the Classic; the second Duplex "
"system needs its own bay on top (~110 m² at the calculator's floor figure, "
"estimate). ") +
"40 m²" + pick(", a later step in this plan", "") + ") are not in the table yet. "
"At the lower half of the table everything fits in "
"1,500 m²; at the upper half, finished goods move to a second building."),
P("Figures 8 to 10 show the plant as the plant and business plan calculator draws it for " + label() +
@@ -698,7 +691,9 @@ def blocks():
"process order along the glazed visitor corridor, a two-storey office, the detached utility yard "
"and a press hall of ~870 m² laid out for five Duplex bays and four Classic positions, on a "
"150 × 150 m placeholder plot. The building described above and the zone table are the 60 × 25 m "
"hall for Mueang Chi; which layout is built is decided once a plot passes zoning and lease-ability. "
"hall for Mueang Chi; which layout is built is decided once a plot passes zoning and lease-ability. " +
"The views look at the front of the site: the road, the car park, the office and the "
"visitor-corridor facade are in the foreground. " +
"The calculator itself is interactive: rotate, zoom, switch floors and tap any object for its "
"figures and their source."),
IMG(pick("renders/calculator/plan-a-iso-roof.png", "renders/calculator/plan-b-iso-roof.png"), 170,
@@ -725,9 +720,11 @@ def blocks():
"Duplex system 1 (two HRP 12 presses with their extruders) and the Classic; the dashed "
"outlines are the free Duplex bays and Classic positions for growth. In the yard, boiler "
"modules B-1 and B-2 and chillers CH-1 and CH-2, with B-3, B-4, CH-3 and CH-4 free",
"Duplex systems 1 and 2 (four HRP 12 presses with their extruders) and the Classic; the "
"dashed outlines are the free Duplex bays and Classic positions. In the yard, boiler modules "
"B-1 and B-2 (B-3 and B-4 free) and chillers CH-1 to CH-3 (CH-4 free)") +
"Duplex system 1 (two HRP 12 presses with their extruders) and the Classic, in a hall laid "
"out for five Duplex bays and four Classic positions; the dashed outlines are the free bays "
"and positions for growth. In the yard, boiler modules B-1 and B-2 and chillers CH-1 and "
"CH-2, with B-3, B-4, CH-3 and CH-4 free; the 5 t crane over the hall, the visitor corridor "
"and the cassette and CD-R rooms are in place") +
". Schematic, estimates."),
H3("Crane, workshop and visitor corridor"),
B(pick([
@@ -780,14 +777,14 @@ def blocks():
"dB(A) near the presses down to roughly 40 to 50 dB(A) (estimates), so a guide talks without a "
"headset and visitors need no PPE; a 1:12 accessible ramp serves the entrance. Tours for "
"artists, labels, investors and schools can run several times a day without stopping "
"production.",
"production, and the tour route and the Payap programmes start with the plant.",
])),
H3("Utility yard and water-treatment building"),
T(["Detached utility yard (decided October 2026)", "Size (estimate)"], [
["Boiler hall, four 500 kg/h module positions (B-1 and B-2 at launch)", "~162 m² (18 × 9 m), "
"6.0 m high"],
["Biomass fuel store", "42 m²"],
["Chiller compound, open and screened, four pads (" + pick("CH-1 and CH-2", "CH-1 to CH-3") +
["Chiller compound, open and screened, four pads (CH-1 and CH-2"
" at launch)", "~135 m² (12.5 × "
"10.8 m)"],
["Cooling pump and heat-exchanger room", "~40 m² (8 × 5 m)"],
@@ -827,12 +824,9 @@ def blocks():
"or where a CD replication line would go if that option is chosen (section 4.10). **The press "
"hall** is planned for Duplex systems, because the plant focuses on special pressings and "
"specials run only on the Duplex: five Duplex bays and four Classic positions (~73/27 by floor, "
"estimate). " + pick(
"This plan installs one Duplex system and one Classic; growth adds Duplex systems first, into "
"bays whose floor, utility positions and ring-main tees are kept from the start. Where the "
"second Duplex system would stand on the Mueang Chi footprint is not drawn yet; ",
"This plan installs two Duplex systems and one Classic at launch; growth adds Duplex systems "
"first. Where the second Duplex system stands on the Mueang Chi footprint is not drawn yet; ") +
"estimate). This plan installs one Duplex system and one Classic; growth adds Duplex systems "
"first, into bays whose floor, utility positions and ring-main tees are kept from the start. "
"Where the second Duplex system would stand on the Mueang Chi footprint is not drawn yet; "
"the Payap scenario model draws the five-press fleet."),
H3("What the construction RFQ asks"),
P("The budget-level construction RFQ, with quantities from the parametric model, asks contractors "
@@ -938,8 +932,8 @@ def blocks():
"exempt from VAT at import (Revenue Department answer on BOI's FAQ, checked October 2026). The "
"investment blocks assume promotion: without it, ~5% duty on ~2.3M USD of imported machinery "
"(~0.11M USD) plus ~0.17M USD of import VAT, reclaimed only later (estimates for the " +
pick("full equipment list; this plan imports less at first",
"three-press equipment list; the second Duplex system adds to both") + ")."],
pick("full equipment list; this plan imports less at first", "full equipment list") +
")."],
["100% foreign ownership and land privileges", "Overrides Foreign Business Act restrictions "
"for the promoted activity. The land-ownership privilege is unused under the lease strategy."],
["Visas and work permits via the One Stop Service", "Foreign commissioning engineers and the "
@@ -971,7 +965,7 @@ def blocks():
P("**Process:** file via the e-Investment system and present at an analyst meeting. BOI quotes "
"about 40 working days to a decision for projects under THB 200M and 60 to 90 working days for "
"larger tiers; at " + pick("~127M to 226M THB with the ramp-up reserve (~177M at the midpoint)",
"~162M to 286M THB with the ramp-up reserve (~224M at the midpoint)") +
"~150M to 268M THB with the ramp-up reserve (~209M at the midpoint)") +
" the plan sits around that line, so the consultant "
"confirms which applies. In practice it is roughly 4 to 6 months end to end to the certificate; "
"the company is incorporated under it; machinery is imported within a window commonly 30 months "