Investment Plans workspace
Open raw ↗
// build_deck.js — C9 DECISION PACK. Run: node build_deck.js
const pptxgen = require("pptxgenjs");
const fs = require("fs");
const path = require("path");

const ROOT = path.resolve(__dirname, "..");
const DIA = path.join(ROOT, "02_Work", "diagrams");
const OUT = path.join(ROOT, "05_Outputs", "NDIS_and_Aged_Care_Decision_Pack_v2.0.pptx");
const M = JSON.parse(fs.readFileSync(path.join(__dirname, "model_export.json"), "utf8"));

const INK = "0E1C26", NAVY = "13293B", BLUE = "1F5C8B", TEAL = "2E8B8B",
      AMBER = "C77B1F", RED = "B03A2E", GREEN = "2E7D4F", GREY = "8A98A5",
      PAPER = "F7FAFB", WHITE = "FFFFFF";
const F = "Calibri";
const money = n => "$" + Math.round(n).toLocaleString("en-AU");

const pres = new pptxgen();
pres.layout = "LAYOUT_WIDE";              // 13.3 x 7.5
pres.author = "AI under Governance Standard v3.9 with the v4.0 Business Layer";
pres.title = "NDIS and Aged Care Business Enabling Study — Decision Pack";

// ---- motif: a thin left-edge column block repeated on every content slide
function chrome(s, n, dark) {
  s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 0.42, h: 7.5, fill: { color: dark ? BLUE : NAVY } });
  s.addText(String(n).padStart(2, "0"), {
    x: 0, y: 6.75, w: 0.42, h: 0.5, align: "center",
    fontFace: F, fontSize: 12, bold: true, color: WHITE, margin: 0,
  });
}
function head(s, title, kicker) {
  if (kicker) s.addText(kicker, { x: 0.85, y: 0.34, w: 11.9, h: 0.3, fontFace: F, fontSize: 11,
    bold: true, color: TEAL, charSpacing: 1.6, margin: 0 });
  s.addText(title, { x: 0.85, y: 0.66, w: 11.9, h: 0.72, fontFace: F, fontSize: 27, bold: true,
    color: NAVY, margin: 0 });
}
function src(s, t) {
  s.addText(t, { x: 0.85, y: 6.95, w: 11.9, h: 0.35, fontFace: F, fontSize: 10, color: GREY, margin: 0 });
}
function content(n, title, kicker) {
  const s = pres.addSlide();
  s.background = { color: PAPER };
  chrome(s, n, false);
  head(s, title, kicker);
  return s;
}
function figSlide(n, title, kicker, img, note) {
  const s = content(n, title, kicker);
  s.addImage({ path: path.join(DIA, img), x: 0.9, y: 1.5, w: 11.8, h: 4.9, sizing: { type: "contain", w: 11.8, h: 4.9 } });
  if (note) src(s, note);
  return s;
}
function statTiles(s, tiles, y) {
  const w = 2.72, gap = 0.28;
  tiles.forEach((t, i) => {
    const x = 0.9 + i * (w + gap);
    s.addShape(pres.ShapeType.roundRect, { x, y, w, h: 1.95, rectRadius: 0.08,
      fill: { color: WHITE }, line: { color: "DCE5EA", width: 1 } });
    s.addText(t.v, { x: x + 0.15, y: y + 0.16, w: w - 0.3, h: 0.72, fontFace: F, fontSize: 25,
      bold: true, color: t.c || NAVY, margin: 0 });
    s.addText(t.l, { x: x + 0.15, y: y + 0.86, w: w - 0.3, h: 0.95, fontFace: F, fontSize: 10.5,
      color: INK, margin: 0, valign: "top" });
  });
}

// =====================================================================
// 1 TITLE (dark)
// =====================================================================
let s = pres.addSlide();
s.background = { color: NAVY };
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 0.42, h: 7.5, fill: { color: TEAL } });
s.addText("DECISION PACK", { x: 1.1, y: 2.0, w: 11, h: 0.4, fontFace: F, fontSize: 13, bold: true,
  color: TEAL, charSpacing: 3, margin: 0 });
s.addText("NDIS or aged care —\nwhich business, in what order?", { x: 1.1, y: 2.5, w: 11.2, h: 1.9,
  fontFace: F, fontSize: 40, bold: true, color: WHITE, lineSpacing: 46, margin: 0 });
s.addText("The short answer: aged care first. One aged care client contributes " + money(M.agedcare.ac_client_paid_admin.contribution_per_client_month) +
  " a month against " + money(M.agedcare.ndis_client_paid_admin.contribution_per_client_month) + " for one NDIS participant — " +
  M.agedcare.contribution_ratio_paid_admin + " times, on a third of the service hours. Combined capital before first revenue: " +
  money(M.combined.total_capital_low) + " to " + money(M.combined.total_capital_high) + ".",
  { x: 1.1, y: 4.5, w: 10.6, h: 1.1, fontFace: F, fontSize: 15, color: "C6D5DE", margin: 0 });
s.addText("Prepared for Zaid Al Dabbag  ·  7 September 2026  ·  v2.0.0  ·  AI Project Governance Standard v3.9 with the v4.0 Business Layer, class STANDARD\n" +
  "NDIS facts verified 20 August 2026, aged care facts 7 September 2026. Decision support, not legal or financial advice.",
  { x: 1.1, y: 6.15, w: 11, h: 0.7, fontFace: F, fontSize: 10.5, color: GREY, margin: 0 });
s.addNotes("This pack summarises the full study at 05_Outputs/NDIS_and_Aged_Care_Business_Enabling_Study_v2.0.docx. " +
  "Every figure here traces to a SRC-### row in the source register.");

// =====================================================================
// 2 THE NUMBERS
// =====================================================================
s = content(2, "The eight numbers that decide this", "WHERE IT LANDS");
statTiles(s, [
  { v: money(M.agedcare.ac_client_paid_admin.contribution_per_client_month), l: "Contribution per AGED CARE client per month, after paid administration", c: GREEN },
  { v: money(M.agedcare.ndis_client_paid_admin.contribution_per_client_month), l: "Contribution per NDIS participant per month, on the same basis", c: AMBER },
  { v: "-$2.07", l: "NDIS contribution per hour if administration runs at 0.40 hours per billable hour", c: RED },
  { v: money(M.combined.total_capital_low), l: "Combined capital before first revenue, both entities, drawing NOTHING", c: NAVY },
], 1.62);
statTiles(s, [
  { v: M.agedcare.hours_per_client_week + " hrs", l: "What an average aged care budget buys a week — the real constraint, not the price", c: NAVY },
  { v: money(M.combined.working_capital_low) + "+", l: "Working capital behind the wage cycle — a line your earlier plan had no row for", c: NAVY },
  { v: M.agedcare.breakeven_clients_paid_admin + " client", l: "Aged care break-even, administration paid", c: GREEN },
  { v: Math.round(M.breakeven_hrs_paid_admin) + " hrs", l: "NDIS break-even a month, administration paid", c: AMBER },
], 3.82);
s.addShape(pres.ShapeType.roundRect, { x: 0.9, y: 5.95, w: 11.8, h: 0.85, rectRadius: 0.06,
  fill: { color: "FBE9E7" }, line: { color: RED, width: 1 } });
s.addText("Read tiles 1, 2 and 3 together. Aged care wins on the unit that matters, and the NDIS number is fragile: " +
  "there is a plausible, unfalsified version of the NDIS business where every hour you sell loses money.",
  { x: 1.1, y: 6.08, w: 11.4, h: 0.6, fontFace: F, fontSize: 12.5, bold: true, color: RED, margin: 0 });
src(s, "Sources: SRC-060 IHACPA advisory price · SRC-062 SCHADS Schedule F · SRC-063 care-management pool · SRC-064 classification budgets · SRC-002 NDIS price limit · SRC-009 SACS wage · ASM-008 administration ratio and ASM-020 average budget, both Low confidence");
s.addNotes("Tile 3 is the finding. No source publishes an administration-hours benchmark, so 0.40 cannot be ruled out.");

// =====================================================================
// 3 WHAT CHANGED
// =====================================================================
s = content(3, "One of eight figures survived contact with a source", "YOUR EARLIER FILES");
const rowsChanged = [
  ["Budget of $15,000 to $30,000", money(M.runway_6mo_core_no_draw) + " with zero drawings, or " +
    money(M.runway_6mo_core_draw6k) + " drawing $6,000/mo — plus working capital on top"],
  ["Audit $900 to $1,800", "No auditor publishes a fee at all. Consultancy estimate: $3,500 to $6,000 verification"],
  ["Registration takes 3 to 9 months", "Verification 4 to 6 months. Certification 9 to 12 months"],
  ["Set up a PRODA account", "PRODA closes for Commission portals 30 Sep 2026. It is myID Strong plus RAM now"],
  ["Nothing on mandatory registration", "In force for SIL since 1 Jul 2026. Reaches personal care from Jul 2027"],
  ["Nothing on working capital", money(M.working_capital_at_300h) + " at a 14-day lag; " +
    money(M.working_capital_at_300h_30day) + " at 30 days"],
  ["Nothing on the administration burden", "It is the entire difference between a viable and an unviable business"],
  ["ASIC Pty Ltd $636", "Still $636 — the only figure that held"],
];
s.addTable([[{ text: "What the earlier files said", options: { bold: true, color: WHITE, fill: { color: NAVY } } },
             { text: "What the sourced position is", options: { bold: true, color: WHITE, fill: { color: NAVY } } }]]
  .concat(rowsChanged.map((r, i) => r.map((c, j) => ({
    text: c, options: { fill: { color: i % 2 ? "EDF3F6" : WHITE }, color: j === 1 && i !== 7 ? INK : INK,
    bold: j === 1 && i === 7 } })))),
  { x: 0.9, y: 1.55, w: 11.8, colW: [4.3, 7.5], fontFace: F, fontSize: 11.5, border: { pt: 0.5, color: "DCE5EA" },
    rowH: 0.42, valign: "middle", margin: 0.06 });
src(s, "DEF-001, raised under GOV-F8.8. The originals are archived, not deleted — 04_Inputs/legacy_unsourced and 06_Archive/_versions.");

// =====================================================================
// 4 REGULATORY CLOCK
// =====================================================================
figSlide(4, "You are starting against a clock", "THE REGULATORY POSITION", "D6_regulatory_timeline.png",
  "Verified against primary government sources by an independent verifier. Sources: SRC-014 to SRC-018, SRC-030, SRC-048.")
  .addNotes("The July 2027 date is the one that matters. Verification registration takes 4-6 months, so the " +
    "application starts in month one.");

// =====================================================================
// 5 MARGIN
// =====================================================================
figSlide(5, "Where one hour of revenue actually goes", "UNIT ECONOMICS", "D3_margin_waterfall.png",
  "Independently re-derived by verifier V2, which found the first pass had omitted WorkCover and portable long service leave (DEF-002).");

// =====================================================================
// 6 CASH
// =====================================================================
s = content(6, "Twelve months of cash, before you pay yourself anything", "THE CASH CURVE");
s.addChart(pres.ChartType.line, [
  { name: "Base: first client month 4, you do the admin", labels: [...Array(12).keys()].map(i => "M" + (i + 1)), values: M.base_cum },
  { name: "Slow: first client month 7", labels: [...Array(12).keys()].map(i => "M" + (i + 1)), values: M.slow_cum },
  { name: "Base ramp but administration is paid", labels: [...Array(12).keys()].map(i => "M" + (i + 1)), values: M.paid_cum },
], {
  x: 0.9, y: 1.5, w: 8.4, h: 4.4, chartColors: [GREEN, AMBER, RED], lineSize: 3, lineSmooth: false,
  showLegend: true, legendPos: "b", legendFontSize: 10, legendColor: INK,
  catAxisLabelColor: INK, valAxisLabelColor: INK, catAxisLabelFontSize: 10, valAxisLabelFontSize: 10,
  valGridLine: { color: "E3EAEE", size: 1 }, catGridLine: { style: "none" },
  valAxisLabelFormatCode: '$#,##0;($#,##0)', showTitle: false,
});
[["Only the green line works", GREEN], ["and only if you win a client by month four AND do every hour of paperwork yourself for nothing.", INK]]
  .forEach(() => {});
s.addShape(pres.ShapeType.roundRect, { x: 9.55, y: 1.5, w: 3.15, h: 4.4, rectRadius: 0.08,
  fill: { color: WHITE }, line: { color: "DCE5EA", width: 1 } });
s.addText([
  { text: "Only one line works.\n", options: { bold: true, fontSize: 15, color: NAVY, breakLine: true } },
  { text: "And only if you win a client by month four AND absorb every hour of administration yourself for nothing.\n\n",
    options: { fontSize: 11.5, color: INK, breakLine: true } },
  { text: "Delay the first client to month seven: never cash-positive in year one (" + money(M.slow_final) + ").\n\n",
    options: { fontSize: 11.5, color: AMBER, breakLine: true } },
  { text: "Pay for the administration: never cash-positive either (" + money(M.paid_final) + ").\n\n",
    options: { fontSize: 11.5, color: RED, breakLine: true } },
  { text: "None of these three pays you a wage.", options: { fontSize: 11.5, bold: true, color: NAVY } },
], { x: 9.75, y: 1.7, w: 2.75, h: 4.0, fontFace: F, margin: 0, valign: "top" });
src(s, "REQ-SYS-07. All scenarios assume zero owner drawings. Change one driver in the financial model and every line moves.");

// =====================================================================
// 7 TRADE STUDY
// =====================================================================
s = content(7, "Which service model within the NDIS", "TRADE STUDY 2");
s.addImage({ path: path.join(DIA, "D5_trade_study.png"), x: 0.9, y: 1.45, w: 7.9, h: 3.9,
  sizing: { type: "contain", w: 7.9, h: 3.9 } });
s.addShape(pres.ShapeType.roundRect, { x: 9.05, y: 1.45, w: 3.65, h: 3.9, rectRadius: 0.08,
  fill: { color: "EAF1F7" }, line: { color: BLUE, width: 1 } });
s.addText([
  { text: "Support coordination  3.70\n", options: { bold: true, fontSize: 15, color: GREEN, breakLine: true } },
  { text: "Core supports  3.30\n", options: { bold: true, fontSize: 14, color: BLUE, breakLine: true } },
  { text: "SIL / SDA  2.20\n\n", options: { bold: true, fontSize: 14, color: AMBER, breakLine: true } },
  { text: "That gap is 0.40 on a five-point scale. Raise the weight on regulatory stability from 25% to 40% and it FLIPS: core supports 3.45, support coordination 3.40.\n\n",
    options: { fontSize: 11.5, color: INK, breakLine: true } },
  { text: "GOV-B6.4 requires me to escalate a decision this close rather than take it.",
    options: { fontSize: 11.5, bold: true, color: RED } },
], { x: 9.25, y: 1.65, w: 3.25, h: 3.5, fontFace: F, margin: 0, valign: "top" });
s.addShape(pres.ShapeType.roundRect, { x: 0.9, y: 5.5, w: 11.8, h: 1.15, rectRadius: 0.06,
  fill: { color: WHITE }, line: { color: "DCE5EA", width: 1 } });
s.addText("The judgement is yours: how heavily do you weight the risk that government redesigns support coordination " +
  "into a \"navigator\" model, against the certainty that mandatory registration reaches core supports in July 2027? " +
  "Both are real, both are documented, neither has a settled end state.",
  { x: 1.1, y: 5.65, w: 11.4, h: 0.85, fontFace: F, fontSize: 12.5, color: INK, margin: 0 });
src(s, "DEC-003. Weights fixed 20 Aug 2026 BEFORE any alternative was scored, per GOV-B6.3. Sources: SRC-005, SRC-018, SRC-046, SRC-049, SRC-050.");

// =====================================================================
// 7b TRADE STUDY 3 — WHICH BUSINESS FIRST
// =====================================================================
s = content(8, "Which business to start first — and why I will not decide it", "TRADE STUDY 3");
s.addText("Four options, five criteria, weights fixed and timestamped BEFORE any option was scored.",
  { x: 0.9, y: 1.42, w: 11.8, h: 0.35, fontFace: F, fontSize: 12.5, color: INK, margin: 0 });
M.trade.ranking.forEach((r, i) => {
  const y = 1.92 + i * 0.72;
  const col = i === 0 ? GREEN : (i === M.trade.ranking.length - 1 ? RED : BLUE);
  s.addShape(pres.ShapeType.roundRect, { x: 0.9, y: y, w: 7.7, h: 0.62, rectRadius: 0.05,
    fill: { color: i === 0 ? "E7F3EC" : WHITE }, line: { color: "DCE5EA", width: 1 } });
  s.addText(r.option, { x: 1.02, y: y + 0.05, w: 0.5, h: 0.52, align: "center", valign: "middle",
    fontFace: F, fontSize: 15, bold: true, color: col, margin: 0 });
  s.addText(r.label, { x: 1.6, y: y + 0.05, w: 5.6, h: 0.52, valign: "middle",
    fontFace: F, fontSize: 11, color: INK, margin: 0 });
  s.addText(r.score.toFixed(2), { x: 7.3, y: y + 0.05, w: 1.1, h: 0.52, align: "right", valign: "middle",
    fontFace: F, fontSize: 16, bold: true, color: col, margin: 0 });
});
s.addShape(pres.ShapeType.roundRect, { x: 8.85, y: 1.92, w: 3.85, h: 3.5, rectRadius: 0.08,
  fill: { color: "EAF1F7" }, line: { color: BLUE, width: 1 } });
s.addText([
  { text: "The margin is " + M.trade.margin.toFixed(2) + ".\n\n", options: { bold: true, fontSize: 15, color: RED, breakLine: true } },
  { text: "Four of the five criteria change the winner within a weight movement you could reasonably make:\n\n",
    options: { fontSize: 11, color: INK, breakLine: true } },
].concat(M.trade.flips.filter(f => f.flips_at).map(f => ({
    text: "• " + f.criterion + ": " + f.weight_now.toFixed(2) + " \u2192 " + f.flips_at.toFixed(2) + " hands it to " + f.hands_it_to + "\n",
    options: { fontSize: 10.5, color: INK, breakLine: true } }))),
  { x: 9.05, y: 2.12, w: 3.45, h: 3.1, fontFace: F, margin: 0, valign: "top" });
s.addShape(pres.ShapeType.roundRect, { x: 0.9, y: 5.52, w: 11.8, h: 1.12, rectRadius: 0.06,
  fill: { color: "FDF0E3" }, line: { color: AMBER, width: 1 } });
s.addText("The fork that matters: raise capital preservation from 0.25 to 0.31 and SUPPORT COORDINATION wins instead. " +
  "If the most you are willing to lose entirely is a small number, option C is the right answer and mine is the wrong one. " +
  "That is ACT-003, still unanswered. GOV-B6.4 requires me to escalate a result this close, not take it.",
  { x: 1.1, y: 5.66, w: 11.4, h: 0.85, fontFace: F, fontSize: 12, bold: true, color: INK, margin: 0 });
src(s, "DEC-007, parked with Zaid. " + M.trade.weights_record);

// =====================================================================
// 7c AGED CARE — WHY THE UNIT IS THE CLIENT
// =====================================================================
s = content(9, "In aged care the price is not what limits you", "THE STRUCTURAL POINT");
s.addText("In the NDIS the price is a hard ceiling and the volume is open. In aged care the price is not capped but " +
  "the pot is: each participant holds a FIXED annual classification budget, and when it is spent it is spent.",
  { x: 0.9, y: 1.42, w: 11.8, h: 0.6, fontFace: F, fontSize: 13, color: INK, margin: 0 });
const bs = M.agedcare.budget_sensitivity;
s.addTable([[
    { text: "Classification budget", options: { bold: true, color: WHITE, fill: NAVY } },
    { text: "Service hours a week", options: { bold: true, color: WHITE, fill: NAVY } },
    { text: "Revenue a month", options: { bold: true, color: WHITE, fill: NAVY } },
    { text: "Contribution a month", options: { bold: true, color: WHITE, fill: NAVY } },
  ]].concat(bs.map(r => [
    money(r[0]) + " a year", r[1].toFixed(2) + " hr", money(r[2]), money(r[3]),
  ])), { x: 0.9, y: 2.15, w: 7.7, colW: [2.3, 1.8, 1.8, 1.8], fontFace: F, fontSize: 11,
         border: { pt: 0.5, color: "DCE5EA" }, rowH: 0.36 });
s.addShape(pres.ShapeType.roundRect, { x: 8.85, y: 2.15, w: 3.85, h: 3.2, rectRadius: 0.08,
  fill: { color: "FBE9E7" }, line: { color: RED, width: 1 } });
s.addText([
  { text: "Even the TOP classification\n", options: { fontSize: 12, color: INK, breakLine: true } },
  { text: M.agedcare.hours_top_classification_week + " hrs a week\n\n", options: { fontSize: 26, bold: true, color: RED, breakLine: true } },
  { text: "Most buy under five. You cannot sell more hours to a willing client — you can only acquire more clients.\n\n",
    options: { fontSize: 11.5, color: INK, breakLine: true } },
  { text: "That makes this an ACQUISITION business, not a rostering one.",
    options: { fontSize: 11.5, bold: true, color: RED } },
], { x: 9.05, y: 2.35, w: 3.45, h: 2.8, fontFace: F, margin: 0, valign: "top" });
s.addShape(pres.ShapeType.roundRect, { x: 0.9, y: 5.52, w: 11.8, h: 1.12, rectRadius: 0.06,
  fill: { color: WHITE }, line: { color: "DCE5EA", width: 1 } });
s.addText("And the paradox: the in-home aged care sector just posted its first negative quarter. Independent verification " +
  "found the losses sit in legacy overhead and in the replacement of the old dual-fee structure by a single 10% pool — " +
  "the direct-services line is still positive at about $16.10 per client per day. A new entrant carries neither problem. " +
  "This is the largest single exposure in the study.",
  { x: 1.1, y: 5.66, w: 11.4, h: 0.85, fontFace: F, fontSize: 12, color: INK, margin: 0 });
src(s, "SRC-060 advisory price · SRC-063 care-management pool · SRC-064 classification budgets · SRC-068 sector results · ASM-020 average budget (Low confidence) · verified in V4");

// =====================================================================
// 8 RECOMMENDATION (dark)
// =====================================================================
s = pres.addSlide();
s.background = { color: NAVY };
chrome(s, 10, true);
s.addText("WHAT I RECOMMEND", { x: 0.85, y: 0.5, w: 11.9, h: 0.35, fontFace: F, fontSize: 11.5, bold: true,
  color: TEAL, charSpacing: 2.4, margin: 0 });
s.addText("Proceed — conditionally, cheaply, and in this order", { x: 0.85, y: 0.9, w: 11.9, h: 0.6,
  fontFace: F, fontSize: 28, bold: true, color: WHITE, margin: 0 });
const recs = [
  ["1", "Start the aged care entity first", "It breaks even at " + M.agedcare.breakeven_clients_paid_admin + " client, its payment lag is about seven days, and its 10% care-management pool pays for your own time directly."],
  ["2", "Register the NDIS entity in parallel", "Verification takes 4 to 6 months and July 2027 is legislated. Register early, take core-support clients second."],
  ["3", "Record your first five assessed budgets", "The whole aged care case rests on a $30,000 average that is a Low-confidence assumption. At $20,000 the contribution per client falls by a third."],
  ["4", "Choose on the weight, not the score", "Slide 7 gives you the exact criterion weight that flips the answer between aged care and support coordination. Only you can set it."],
  ["5", "Ring-fence working capital separately", money(M.combined.working_capital_low) + " to " + money(M.combined.working_capital_high) + " across both entities that never gets spent on setup."],
  ["6", "Name a second operator", "Two entities separate legal liability, not operational dependency. Both plans stop on the day you do."],
];
recs.forEach((r, i) => {
  const y = 1.72 + i * 0.83;
  s.addShape(pres.ShapeType.ellipse, { x: 0.9, y: y + 0.06, w: 0.42, h: 0.42, fill: { color: TEAL } });
  s.addText(r[0], { x: 0.9, y: y + 0.06, w: 0.42, h: 0.42, align: "center", valign: "middle",
    fontFace: F, fontSize: 13, bold: true, color: NAVY, margin: 0 });
  s.addText(r[1], { x: 1.5, y: y, w: 3.9, h: 0.6, fontFace: F, fontSize: 13.5, bold: true, color: WHITE, margin: 0 });
  s.addText(r[2], { x: 5.5, y: y + 0.02, w: 7.2, h: 0.68, fontFace: F, fontSize: 11.5, color: "C6D5DE", margin: 0 });
});
s.addText("This is a recommendation to DECIDE, not a recommendation to transfer money.",
  { x: 0.85, y: 6.9, w: 11.9, h: 0.4, fontFace: F, fontSize: 11, italic: true, color: TEAL, margin: 0 });

// =====================================================================
// 9 HOW TO DISAGREE
// =====================================================================
s = content(11, "What would change this answer", "HOW TO DISAGREE WITH ME");
s.addText("GOV-A1.12 requires that every decision put to you comes with what you would need to check in order to " +
  "overrule me. These five are that list, ranked by how much they move the answer.",
  { x: 0.9, y: 1.5, w: 11.8, h: 0.5, fontFace: F, fontSize: 12.5, color: INK, margin: 0 });
const disagree = [
  ["Administration hours", "ASM-008 · Low", "At 0.40 rather than 0.25, core supports loses money on every hour and the recommendation collapses to support coordination or nothing. At 0.10 it becomes materially better than I scored it."],
  ["The SCHADS classification", "ASM-002 · Medium", "fairwork.gov.au blocks automated reading. If your workers sit at Level 3, gross margin falls from $21.30 to $15.15 and every break-even rises about 40%."],
  ["The NDIS price limits", "SRC-002 · Medium", "Five limits were read from a 65-page PDF through a summarising fetch. If one is wrong, every revenue figure moves. Two hours of work fixes it (BKL-001)."],
  ["Time to first client", "ASM-015 · Low", "No published benchmark exists. I assumed month four. The slow case assumes month seven and never reaches cash-positive."],
  ["The navigator design", "SRC-049", "If government preserves support coordination as a fundable service it wins outright. If it absorbs it into a public function the recommendation inverts."],
];
disagree.forEach((d, D) => {
  const y = 2.1 + D * 0.96;
  s.addShape(pres.ShapeType.roundRect, { x: 0.9, y, w: 11.8, h: 0.84, rectRadius: 0.06,
    fill: { color: WHITE }, line: { color: "DCE5EA", width: 1 } });
  s.addText(d[0], { x: 1.1, y: y + 0.08, w: 3.0, h: 0.35, fontFace: F, fontSize: 13, bold: true, color: NAVY, margin: 0 });
  s.addText(d[1], { x: 1.1, y: y + 0.44, w: 3.0, h: 0.3, fontFace: F, fontSize: 10, bold: true, color: RED, margin: 0 });
  s.addText(d[2], { x: 4.25, y: y + 0.1, w: 8.3, h: 0.68, fontFace: F, fontSize: 11.5, color: INK, margin: 0 });
});

// =====================================================================
// 10 WHAT I NEED (dark close)
// =====================================================================
s = pres.addSlide();
s.background = { color: NAVY };
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 0.42, h: 7.5, fill: { color: TEAL } });
s.addText("WHAT I NEED FROM YOU", { x: 1.1, y: 0.75, w: 11.5, h: 0.4, fontFace: F, fontSize: 12, bold: true,
  color: TEAL, charSpacing: 2.6, margin: 0 });
s.addText("Four answers, and this study gives you a number instead of a range",
  { x: 1.1, y: 1.2, w: 11.4, h: 0.9, fontFace: F, fontSize: 26, bold: true, color: WHITE, margin: 0 });
const acts = [
  ["ACT-001", "Will you run this yourself full time, or fund it and employ a manager?",
    "Owner-operator break-even is about " + Math.round(M.breakeven_hrs_owner_admin) + " billable hours a month. An employed manager pushes it past " + Math.round(M.breakeven_hrs_paid_admin) + "."],
  ["ACT-002", "What must you draw from the business each month, and from when?",
    "Every scenario in this study currently assumes you work for nothing. The runway figure is meaningless until you answer."],
  ["ACT-003", "What is the maximum you are willing to lose entirely?",
    "I can tell you what it costs. I cannot tell you whether it is affordable for you."],
  ["ACT-004", "Do you or a co-founder hold relevant qualifications or sector experience?",
    "Support coordination's score depends on you being able to bill personally and be credible to referrers."],
];
acts.forEach((a, i) => {
  const y = 2.45 + i * 1.02;
  s.addShape(pres.ShapeType.roundRect, { x: 1.1, y, w: 11.2, h: 0.88, rectRadius: 0.06,
    fill: { color: "1B3A50" }, line: { color: "2C5670", width: 1 } });
  s.addText(a[0], { x: 1.3, y: y + 0.1, w: 1.15, h: 0.35, fontFace: F, fontSize: 12, bold: true, color: TEAL, margin: 0 });
  s.addText(a[1], { x: 2.5, y: y + 0.07, w: 5.0, h: 0.75, fontFace: F, fontSize: 12.5, bold: true, color: WHITE, margin: 0 });
  s.addText(a[2], { x: 7.7, y: y + 0.09, w: 4.4, h: 0.72, fontFace: F, fontSize: 10.5, color: "A9BECC", margin: 0 });
});
s.addText("Full study: 05_Outputs/NDIS_and_Aged_Care_Business_Enabling_Study_v2.0.docx   ·   Live model: 05_Outputs/NDIS_and_Aged_Care_Financial_Model_v2.0.xlsx   ·   " +
  "Start here: README.md",
  { x: 1.1, y: 6.7, w: 11.4, h: 0.4, fontFace: F, fontSize: 10.5, color: GREY, margin: 0 });

pres.writeFile({ fileName: OUT }).then(() => console.log("wrote " + OUT));