Files
cnx_vinyl/docs/business-plan/build/build_plan.py
T
grabowski d42e99389b Business plan draft 0.2: re-based on the launch plant
The investor business plan (docx + pdf) rebuilt for the launch plant
decided in October 2026: one Duplex system and one Classic, Pheenix
galvanics with zero discharge, the Sibert line, a Sillitoe cutting room,
modular steam and cooling (rooms for four), cassette and CD-R; no bridge
stampers, no outsourced cutting; second Duplex as a growth option.

- Part A: executive summary (what changed since 0.1, the numbers, the
  180M / 216M answer, first release marked open), reading guide, two
  price points (ResurRec and Record Industry), anatomy rewritten for
  Sillitoe, Pheenix, Sibert, Duplex + Classic, lead times without bridge
  stampers, new 4.8 artist platform, cassette 4.9, CD 4.10.
- Part B: traceability with ERPNext as system of record, metrology launch
  tier as the investor's choice, QC, efficiency (PEA tariff, utility
  modules, fuel open, Chinese boilers and DIW rules), site (Mueang Chi,
  Payap zoning result), building blocks, safety, BOI and licences with
  galvanics in the first factory licence.
- Part C: launch-plant investment table, the investor's question and
  levers, tranches, currency, operating picture of the launch plant,
  timeline with the metal path on the critical path, commissioning
  sequence and why the whole chain at launch, team, 22 risks, 17 phase 0
  actions, the ask.
- plan_lib: grid column widths so LibreOffice keeps table widths.
- export_pdf.py: LibreOffice UNO export that fills the table of
  contents (47 pages).
- README: total investment, revenue model and business plan bullets.
2026-10-16 16:01:25 +07:00

34 lines
984 B
Python

"""Build the CNX Vinyl business plan .docx.
python build_plan.py -> ../CNX-Vinyl-Business-Plan.docx
python build_plan.py out.docx -> custom path
Images are resolved relative to docs/ (the parent of business-plan/).
"""
from __future__ import annotations
import sys
from pathlib import Path
HERE = Path(__file__).resolve().parent
sys.path.insert(0, str(HERE))
from plan_lib import Renderer # noqa: E402
import content_a, content_b, content_c # noqa: E402
DOCS = HERE.parent.parent # .../docs
OUT = HERE.parent / "CNX-Vinyl-Business-Plan.docx"
def main(out: Path = OUT) -> Path:
r = Renderer(DOCS, header_text="CNX Vinyl / Poy Records: Business plan, draft 0.2, October 2026",
footer_text="Confidential")
r.render(content_a.blocks() + content_b.blocks() + content_c.blocks())
r.save(out)
return out
if __name__ == "__main__":
target = Path(sys.argv[1]) if len(sys.argv) > 1 else OUT
print(main(target))