[
 {
  "calc_id": "M01",
  "v2_location": "s05/R021; s11",
  "description": "LiveRamp enterprise value = equity value − acquired net cash",
  "inputs": [
   {
    "name": "equity_value_USD_bn",
    "value": 2.546,
    "status": "stored_passage",
    "note": "PUB-S009 release"
   },
   {
    "name": "acquired_net_cash_USD_bn",
    "value": 0.379,
    "status": "stored_passage",
    "note": "PUB-S009"
   }
  ],
  "formula": "2.546 − 0.379",
  "output": 2.167,
  "reported_value": 2.167,
  "verdict": "reconciles",
  "unit": "USD bn",
  "currency": "USD",
  "period": "Agreement 17 May 2026 (signed 16 May per archive PUB-S010)",
  "measure_label": "enterprise value (equity value less net cash); announced, not closed",
  "source_ids": [
   "PUB-S009"
  ],
  "rounding_rule": "3 dp as released",
  "limits": "Deal values as stated by acquirer; not a completed purchase. Per-share price $38.50 sits only in archive PUB-S010 (not among the 49 stored passages).",
  "v3_action": "Keep; add per-share price with 8-K citation after re-sourcing; label equity vs enterprise value explicitly (see report)."
 },
 {
  "calc_id": "M02",
  "v2_location": "s11/R052 row Publicis FY2025",
  "description": "Publicis FY2025 gross/net bridge: net revenue + pass-through = revenue",
  "inputs": [
   {
    "name": "net_revenue_EUR_m",
    "value": 14547,
    "status": "stored_passage"
   },
   {
    "name": "pass_through_EUR_m",
    "value": 2852,
    "status": "stored_passage"
   }
  ],
  "formula": "14547 + 2852",
  "output": 17399,
  "reported_value": 17399,
  "verdict": "reconciles",
  "unit": "EUR m",
  "currency": "EUR",
  "period": "FY2025 (calendar)",
  "measure_label": "revenue = net revenue + pass-through costs (IFRS 15 presentation)",
  "source_ids": [
   "PUB-S039"
  ],
  "rounding_rule": "integer EUR m as reported",
  "limits": "Pass-through is not disclosed principal-media margin.",
  "v3_action": "Keep."
 },
 {
  "calc_id": "M03",
  "v2_location": "ledger only (V1 §6 text 4.2%)",
  "description": "Publicis reported net revenue growth FY2025",
  "inputs": [
   {
    "name": "net_revenue_2025_EUR_m",
    "value": 14547,
    "status": "stored_passage"
   },
   {
    "name": "net_revenue_2024_EUR_m",
    "value": 13965,
    "status": "stored_passage"
   }
  ],
  "formula": "(14547/13965 − 1) × 100",
  "output": 4.167561761546734,
  "reported_value": 4.2,
  "verdict": "reconciles",
  "unit": "%",
  "currency": "EUR",
  "period": "FY2025 vs FY2024",
  "measure_label": "reported (not organic) net revenue growth",
  "source_ids": [
   "PUB-S039"
  ],
  "rounding_rule": "1 dp; inputs rounded to EUR 1m so result certain to ±0.01pp",
  "limits": "Organic growth (5.6% per V1) cannot be recomputed from public rounded inputs; attribute if used.",
  "v3_action": "Keep as reported-growth check; attribute organic rate."
 },
 {
  "calc_id": "M04",
  "v2_location": "s11/R052 row Publicis H1 2026",
  "description": "Publicis H1 2026 operating margin subtotal / net revenue",
  "inputs": [
   {
    "name": "operating_margin_subtotal_EUR_m",
    "value": 1261,
    "status": "stored_passage"
   },
   {
    "name": "net_revenue_EUR_m",
    "value": 7229,
    "status": "stored_passage"
   }
  ],
  "formula": "1261/7229 × 100",
  "output": 17.443629824318716,
  "reported_value": 17.4,
  "verdict": "reconciles_with_label_fix",
  "unit": "%",
  "currency": "EUR",
  "period": "H1 2026 (Jan–Jun)",
  "measure_label": "company \"operating margin\" subtotal (non-statutory) over net revenue, after €7m LiveRamp costs",
  "source_ids": [
   "PUB-S015"
  ],
  "rounding_rule": "1 dp. Inputs rounded to EUR 1m give a range 17.44–17.45%; V2 prints 17.4436% (false precision).",
  "limits": "Numerator is a company subtotal, not statutory operating income.",
  "v3_action": "Print 17.4% (recomputed) beside the company-reported 17.4%; drop 4-decimal display."
 },
 {
  "calc_id": "M05",
  "v2_location": "s11/R052 row Publicis H1 2026",
  "description": "Publicis H1 2026 margin before LiveRamp transaction costs",
  "inputs": [
   {
    "name": "operating_margin_subtotal_EUR_m",
    "value": 1261,
    "status": "stored_passage"
   },
   {
    "name": "liveramp_costs_EUR_m",
    "value": 7,
    "status": "stored_passage"
   },
   {
    "name": "net_revenue_EUR_m",
    "value": 7229,
    "status": "stored_passage"
   }
  ],
  "formula": "(1261+7)/7229 × 100",
  "output": 17.540462027943008,
  "reported_value": 17.5,
  "verdict": "reconciles_with_label_fix",
  "unit": "%",
  "currency": "EUR",
  "period": "H1 2026",
  "measure_label": "adjusted (ex-transaction-cost) operating margin rate",
  "source_ids": [
   "PUB-S015",
   "PUB-S041"
  ],
  "rounding_rule": "1 dp; V2 prints 17.5405% (false precision)",
  "limits": "Adjusted measure defined by the company.",
  "v3_action": "Print 17.5%; label as adjusted; drop 4 decimals."
 },
 {
  "calc_id": "M06",
  "v2_location": "ledger only",
  "description": "Publicis H1 2026 statutory operating income / net revenue",
  "inputs": [
   {
    "name": "operating_income_EUR_m",
    "value": 1149,
    "status": "unstated",
    "note": "Not in stored PUB-S015 passage, not in V1 text, not in archive financials.csv"
   },
   {
    "name": "net_revenue_EUR_m",
    "value": 7229,
    "status": "stored_passage"
   }
  ],
  "formula": "1149/7229 × 100",
  "output": 15.89431456633006,
  "reported_value": null,
  "verdict": "cannot_recompute_here",
  "unit": "%",
  "currency": "EUR",
  "period": "H1 2026",
  "measure_label": "statutory operating income margin",
  "source_ids": [
   "PUB-S015"
  ],
  "rounding_rule": "1 dp",
  "limits": "Arithmetic reproduces 15.9% but the €1,149m input has no stored provenance.",
  "v3_action": "Do not publish until €1,149m is re-sourced from the H1 2026 financial report income statement (PUB-S015, printed p4/PDF p6)."
 },
 {
  "calc_id": "M07",
  "v2_location": "s06/R028; s11/R052 WPP row",
  "description": "WPP H1 2026 headline operating margin",
  "inputs": [
   {
    "name": "headline_operating_profit_GBP_m",
    "value": 398,
    "status": "stored_passage"
   },
   {
    "name": "revenue_less_pass_through_GBP_m",
    "value": 4745,
    "status": "stored_passage"
   }
  ],
  "formula": "398/4745 × 100",
  "output": 8.387776606954688,
  "reported_value": 8.4,
  "verdict": "reconciles_with_label_fix",
  "unit": "%",
  "currency": "GBP",
  "period": "H1 2026",
  "measure_label": "headline (non-GAAP) operating profit / revenue less pass-through costs",
  "source_ids": [
   "WPP-S003"
  ],
  "rounding_rule": "1 dp; V2 prints 8.3878% (false precision; input rounding gives 8.38–8.40%)",
  "limits": "Unaudited interim; headline excludes items.",
  "v3_action": "Print 8.4%; drop 4 decimals."
 },
 {
  "calc_id": "M08",
  "v2_location": "s06/R028; s11/R052 WPP row",
  "description": "WPP H1 2026 reported operating margin",
  "inputs": [
   {
    "name": "reported_operating_profit_GBP_m",
    "value": 261,
    "status": "stored_passage"
   },
   {
    "name": "revenue_GBP_m",
    "value": 6373,
    "status": "stored_passage"
   }
  ],
  "formula": "261/6373 × 100",
  "output": 4.095402479209163,
  "reported_value": 4.1,
  "verdict": "reconciles_with_label_fix",
  "unit": "%",
  "currency": "GBP",
  "period": "H1 2026",
  "measure_label": "reported (IFRS) operating profit / reported revenue (including pass-through costs)",
  "source_ids": [
   "WPP-S003"
  ],
  "rounding_rule": "1 dp; V2 prints 4.0954%",
  "limits": "R028 calls the denominator \"gross revenue\"; WPP labels it \"revenue\". Different numerator AND denominator from M07.",
  "v3_action": "Print 4.1%; say \"reported revenue, which includes pass-through costs\" rather than \"gross revenue\"."
 },
 {
  "calc_id": "M09",
  "v2_location": "ledger only",
  "description": "WPP H1 2026 reported change in revenue less pass-through costs",
  "inputs": [
   {
    "name": "H1_2026_GBP_m",
    "value": 4745,
    "status": "stored_passage"
   },
   {
    "name": "H1_2025_GBP_m",
    "value": 5026,
    "status": "inherited_archive_only",
    "note": "archive WPP-F003 (WPP-S003) not in stored passage"
   }
  ],
  "formula": "(4745/5026 − 1) × 100",
  "output": -5.5909271786709125,
  "reported_value": -5.6,
  "verdict": "reconciles",
  "unit": "%",
  "currency": "GBP",
  "period": "H1 2026 vs H1 2025",
  "measure_label": "reported change (includes currency and scope) — NOT the −4.7% like-for-like",
  "source_ids": [
   "WPP-S003"
  ],
  "rounding_rule": "1 dp",
  "limits": "Prior-year input is archive-only. LFL −4.7% is company-computed and cannot be recomputed here.",
  "v3_action": "If used, re-source £5,026m from the interim key-figures table; keep reported and LFL labels apart."
 },
 {
  "calc_id": "M10",
  "v2_location": "s11/R052 Omnicom row",
  "description": "Omnicom Q2 2026 consolidated → Core Operations revenue bridge",
  "inputs": [
   {
    "name": "consolidated_revenue_USD_m",
    "value": 6562.5,
    "status": "inherited_archive_only",
    "note": "archive OMC-F019 and V1 text; not in stored OMC-S036 passage"
   },
   {
    "name": "excluded_disposed_held_for_sale_USD_m",
    "value": 567.5,
    "status": "derived",
    "note": "residual 6562.5 − 5995; not a sourced input"
   },
   {
    "name": "core_revenue_USD_m",
    "value": 5995,
    "status": "stored_passage"
   }
  ],
  "formula": "6562.5 − 567.5",
  "output": 5995,
  "reported_value": 5995,
  "verdict": "reconciles_with_label_fix",
  "unit": "USD m",
  "currency": "USD",
  "period": "Q2 2026",
  "measure_label": "Core Operations revenue (non-GAAP selected perimeter excluding disposed/held-for-sale businesses)",
  "source_ids": [
   "OMC-S036"
  ],
  "rounding_rule": "0.1 USD m",
  "limits": "The calculation is circular as recorded: the \"excluded\" figure is the residual of the other two. It confirms consistency, not an independent input.",
  "v3_action": "Present as \"6,562.5 − 5,995.0 = 567.5 excluded (residual)\" or cite the release's own excluded-business line after re-sourcing."
 },
 {
  "calc_id": "M11",
  "v2_location": "s07/R034 (margin implied)",
  "description": "Omnicom Q2 2026 Core adjusted EBITA margin",
  "inputs": [
   {
    "name": "core_adjusted_EBITA_USD_m",
    "value": 1068.8,
    "status": "stored_passage"
   },
   {
    "name": "core_revenue_USD_m",
    "value": 5995,
    "status": "stored_passage"
   }
  ],
  "formula": "1068.8/5995 × 100",
  "output": 17.828190158465386,
  "reported_value": 17.8,
  "verdict": "reconciles",
  "unit": "%",
  "currency": "USD",
  "period": "Q2 2026",
  "measure_label": "adjusted EBITA (non-GAAP) / Core Operations revenue; prior-year base combines OMC+IPG (not Article 11 pro forma)",
  "source_ids": [
   "OMC-S036"
  ],
  "rounding_rule": "1 dp",
  "limits": "Not statutory; selected perimeter.",
  "v3_action": "Keep; keep perimeter label."
 },
 {
  "calc_id": "M12",
  "v2_location": "s08/R038",
  "description": "Dentsu FY2025 goodwill impairment regional sum",
  "inputs": [
   {
    "name": "Americas_JPY_m",
    "value": 299656,
    "status": "stored_passage"
   },
   {
    "name": "EMEA_JPY_m",
    "value": 96418,
    "status": "stored_passage"
   }
  ],
  "formula": "299656 + 96418",
  "output": 396074,
  "reported_value": 396074,
  "verdict": "reconciles",
  "unit": "JPY m",
  "currency": "JPY",
  "period": "FY2025 (Dentsu fiscal year ending Dec 2025)",
  "measure_label": "goodwill impairment (non-cash, carrying-value test)",
  "source_ids": [
   "DH-S016"
  ],
  "rounding_rule": "JPY m",
  "limits": "Sum equals total, so no other region carried a charge per the stored passage; not deal-level.",
  "v3_action": "Keep."
 },
 {
  "calc_id": "M13",
  "v2_location": "s09/R042; s11/R052 Havas row",
  "description": "Havas FY2025 adjusted EBIT margin",
  "inputs": [
   {
    "name": "adjusted_EBIT_EUR_m",
    "value": 358,
    "status": "stored_passage"
   },
   {
    "name": "net_revenue_EUR_m",
    "value": 2783,
    "status": "stored_passage"
   }
  ],
  "formula": "358/2783 × 100",
  "output": 12.86381602587136,
  "reported_value": 12.9,
  "verdict": "reconciles_with_label_fix",
  "unit": "%",
  "currency": "EUR",
  "period": "FY2025",
  "measure_label": "adjusted EBIT / net revenue (company-defined)",
  "source_ids": [
   "DH-S041"
  ],
  "rounding_rule": "1 dp; V2 prints 12.8638% (false precision; range 12.86–12.87%)",
  "limits": "Full-year adjusted; not comparable with H1 statutory margins.",
  "v3_action": "Print 12.9%; drop 4 decimals."
 },
 {
  "calc_id": "M14",
  "v2_location": "ledger only",
  "description": "Stagwell H1 2026 reported net revenue growth",
  "inputs": [
   {
    "name": "H1_2026_net_revenue_USD_k",
    "value": 1216207,
    "status": "stored_passage"
   },
   {
    "name": "H1_2025_net_revenue_USD_k",
    "value": 1162316,
    "status": "stored_passage"
   }
  ],
  "formula": "(1216207/1162316 − 1) × 100",
  "output": 4.6365188124399825,
  "reported_value": 4.6,
  "verdict": "reconciles",
  "unit": "%",
  "currency": "USD",
  "period": "H1 2026 vs H1 2025",
  "measure_label": "reported (not organic) net revenue growth",
  "source_ids": [
   "ALT-S018"
  ],
  "rounding_rule": "1 dp",
  "limits": "Archive release rounds this to 5%.",
  "v3_action": "Keep in ledger."
 },
 {
  "calc_id": "M15",
  "v2_location": "s10/R047; s11/R052 Stagwell row",
  "description": "Stagwell H1 2026 organic net revenue growth from bridge",
  "inputs": [
   {
    "name": "organic_component_USD_k",
    "value": 38936,
    "status": "stored_passage"
   },
   {
    "name": "prior_net_revenue_USD_k",
    "value": 1162316,
    "status": "stored_passage"
   }
  ],
  "formula": "38936/1162316 × 100",
  "output": 3.349863548294956,
  "reported_value": 3.3,
  "verdict": "reconciles",
  "unit": "%",
  "currency": "USD",
  "period": "H1 2026",
  "measure_label": "organic net revenue growth, Stagwell method as changed in Q3 2025 (acquired businesses enter after 12 months; current-period adjustment)",
  "source_ids": [
   "ALT-S018",
   "ALT-S023"
  ],
  "rounding_rule": "Print 3.3% (company rate). Input rounding ±$0.5k gives 3.3498–3.3500%; the 3.3499% display is arithmetically justified but unnecessary. Original 3.0% (A072) was false precision from a rounded 3% headline.",
  "limits": "Organic component itself is company-computed; method change breaks comparability with pre-Q3-2025 series.",
  "v3_action": "Print 3.3% with H1 label and method note; no decimal beyond the filing."
 },
 {
  "calc_id": "M16",
  "v2_location": "ledger only",
  "description": "Stagwell H1 2026 adjusted EBITDA margin",
  "inputs": [
   {
    "name": "adjusted_EBITDA_USD_k",
    "value": 198372,
    "status": "inherited_archive_only",
    "note": "stored passage lacks it; archive has rounded $198m"
   },
   {
    "name": "net_revenue_USD_k",
    "value": 1216207,
    "status": "stored_passage"
   }
  ],
  "formula": "198372/1216207 × 100",
  "output": 16.31071026560446,
  "reported_value": 16.3,
  "verdict": "reconciles",
  "unit": "%",
  "currency": "USD",
  "period": "H1 2026",
  "measure_label": "adjusted EBITDA (non-GAAP) / net revenue",
  "source_ids": [
   "ALT-S018"
  ],
  "rounding_rule": "1 dp",
  "limits": "Precise numerator not in stored passage.",
  "v3_action": "Re-source $198,372k from the presentation if published; otherwise use $198m and 16.3% attributed."
 },
 {
  "calc_id": "M17",
  "v2_location": "s10/R048; s11/R052 S4 row",
  "description": "S4 Capital FY2025 reported net revenue change",
  "inputs": [
   {
    "name": "FY2025_net_revenue_GBP_m",
    "value": 673,
    "status": "stored_passage"
   },
   {
    "name": "FY2024_net_revenue_GBP_m",
    "value": 754.6,
    "status": "unstated",
    "note": "not in stored ALT-S028 passage; archive holds FY2025 gross revenue 754.8 (different line, near-identical figure — confusion risk)"
   }
  ],
  "formula": "(673.0/754.6 − 1) × 100",
  "output": -10.813676119798576,
  "reported_value": -10.8,
  "verdict": "reconciles_with_label_fix",
  "unit": "%",
  "currency": "GBP",
  "period": "FY2025 vs FY2024",
  "measure_label": "reported change in net revenue (revenue less direct costs); LFL −8.4% is separate",
  "source_ids": [
   "ALT-S028"
  ],
  "rounding_rule": "1 dp; V2 prints −10.8137% (false precision)",
  "limits": "Any prior-year value in £754.1–754.9m reproduces −10.8%; the exact 754.6 is unverified here. V2 publishes it in R052.",
  "v3_action": "Re-source FY2024 net revenue from the FY2025 results financial summary before printing; print −10.8%; drop 4 decimals."
 },
 {
  "calc_id": "M18",
  "v2_location": "s10/R048 (qualitative)",
  "description": "S4 Capital FY2025 operational EBITDA margin",
  "inputs": [
   {
    "name": "operational_EBITDA_GBP_m",
    "value": 81.2,
    "status": "stored_passage"
   },
   {
    "name": "net_revenue_GBP_m",
    "value": 673,
    "status": "stored_passage"
   }
  ],
  "formula": "81.2/673.0 × 100",
  "output": 12.065378900445765,
  "reported_value": 12.1,
  "verdict": "reconciles",
  "unit": "%",
  "currency": "GBP",
  "period": "FY2025",
  "measure_label": "operational EBITDA (non-GAAP) / net revenue",
  "source_ids": [
   "ALT-S028"
  ],
  "rounding_rule": "1 dp",
  "limits": "R048 says the margin \"rose\": prior-year margin not in stored passage, so the rise is attributed, not recomputed.",
  "v3_action": "Keep; attribute the \"rose\"."
 },
 {
  "calc_id": "M19",
  "v2_location": "s07/R033",
  "description": "Guitar Center recognised-visitor change, percentage points",
  "inputs": [
   {
    "name": "before_pct",
    "value": 23,
    "status": "stored_passage"
   },
   {
    "name": "after_pct",
    "value": 35,
    "status": "stored_passage"
   }
  ],
  "formula": "35 − 23",
  "output": 12,
  "reported_value": 12,
  "verdict": "reconciles",
  "unit": "percentage points",
  "currency": "",
  "period": "vendor case published 2026-07-14; measurement window not stated",
  "measure_label": "attributed vendor-case recognition rate change (pp)",
  "source_ids": [
   "OMC-S033"
  ],
  "rounding_rule": "integer pp; inputs are rounded whole percentages so true change is 11–13 pp",
  "limits": "No denominator, control or sales-lift audit.",
  "v3_action": "Keep \"12 points\" with \"about\"."
 },
 {
  "calc_id": "M20",
  "v2_location": "s07/R033",
  "description": "Guitar Center recognised-visitor change, relative",
  "inputs": [
   {
    "name": "before_pct",
    "value": 23,
    "status": "stored_passage"
   },
   {
    "name": "after_pct",
    "value": 35,
    "status": "stored_passage"
   }
  ],
  "formula": "(35/23 − 1) × 100",
  "output": 52.17391304347827,
  "reported_value": 52.2,
  "verdict": "reconciles_with_label_fix",
  "unit": "% relative",
  "currency": "",
  "period": "as M19",
  "measure_label": "relative change in a rate",
  "source_ids": [
   "OMC-S033"
  ],
  "rounding_rule": "Inputs are whole percentages: relative change range (34.5/23.5−1)=46.8% to (35.5/22.5−1)=57.8%. \"About 52.2%\" is false precision.",
  "limits": "Relative change of a rate is not sales uplift.",
  "v3_action": "Say \"roughly half again (about 50%) relative\" or drop the relative figure; keep 12 points."
 },
 {
  "calc_id": "M21",
  "v2_location": "not printed in V2 (V1 §4.1; ledger)",
  "description": "ANA principal-media use, wave difference",
  "inputs": [
   {
    "name": "2026_wave_pct",
    "value": 58,
    "status": "stored_passage",
    "note": "base: 114 qualified client-side members, fieldwork Oct 2025–Jan 2026"
   },
   {
    "name": "prior_wave_pct",
    "value": 47,
    "status": "stored_passage",
    "note": "prior-wave n not stored"
   }
  ],
  "formula": "58 − 47",
  "output": 11,
  "reported_value": 11,
  "verdict": "reconciles_with_label_fix",
  "unit": "percentage points",
  "currency": "",
  "period": "2026 survey vs prior wave",
  "measure_label": "respondent-reported use in past year; member sample, not spend share",
  "source_ids": [
   "ECO-S002"
  ],
  "rounding_rule": "integer pp; relative change would be 23.4% but inputs are rounded and bases differ",
  "limits": "Item base for 58% may differ from 114 (question-specific bases not inspected); cross-wave sample equivalence not established; no weighting info.",
  "v3_action": "If restored: \"58% of 114 qualified respondents (Oct 2025–Jan 2026) vs 47% in the prior wave; 11 points; samples not matched\"."
 },
 {
  "calc_id": "M22",
  "v2_location": "not in V2 (V1 §7 Omnicom H1)",
  "description": "Omnicom H1 2026 Core Operations revenue change vs combined OMC+IPG 2025",
  "inputs": [
   {
    "name": "H1_2026_consolidated_USD_m",
    "value": 12805.4,
    "status": "inherited_archive_only",
    "note": "OMC-S037 not among 49 stored passages"
   },
   {
    "name": "H1_2026_excluded_USD_m",
    "value": 1194.7,
    "status": "inherited_archive_only"
   },
   {
    "name": "H1_2025_combined_USD_m",
    "value": 12565.4,
    "status": "inherited_archive_only"
   },
   {
    "name": "H1_2025_excluded_USD_m",
    "value": 1708.8,
    "status": "inherited_archive_only"
   }
  ],
  "formula": "((12805.4−1194.7)/(12565.4−1708.8) − 1) × 100",
  "output": 6.946005194996574,
  "reported_value": 6.95,
  "verdict": "reconciles",
  "unit": "%",
  "currency": "USD",
  "period": "H1 2026 vs H1 2025 combined",
  "measure_label": "reported-basis change in selected core perimeter; NOT organic, NOT statutory; 2025 comparator is combined, not Article 11 pro forma",
  "source_ids": [
   "OMC-S037 (archive)"
  ],
  "rounding_rule": "2 dp in V1; 1 dp sufficient",
  "limits": "All inputs archive-only; not freshly verified.",
  "v3_action": "Archive only unless OMC-S037 is re-opened."
 },
 {
  "calc_id": "M23",
  "v2_location": "not in V2 (V1 §16)",
  "description": "Havas 2010 compensation / revenue",
  "inputs": [
   {
    "name": "compensation_EUR_m",
    "value": 963,
    "status": "inherited_archive_only",
    "note": "HDH-S007"
   },
   {
    "name": "revenue_EUR_m",
    "value": 1558,
    "status": "inherited_archive_only"
   }
  ],
  "formula": "963/1558 × 100",
  "output": 61.81001283697047,
  "reported_value": 61.8,
  "verdict": "reconciles",
  "unit": "%",
  "currency": "EUR",
  "period": "FY2010",
  "measure_label": "compensation expense share of revenue (fees/commissions basis)",
  "source_ids": [
   "HDH-S007 (archive)"
  ],
  "rounding_rule": "1 dp",
  "limits": "Not freshly verified; not comparable with Publicis personnel ratio (different revenue definitions).",
  "v3_action": "Archive only."
 },
 {
  "calc_id": "M24",
  "v2_location": "not in V2 (V1 §16)",
  "description": "Havas 2015 personnel expense / revenue",
  "inputs": [
   {
    "name": "personnel_EUR_m",
    "value": 1339,
    "status": "inherited_archive_only",
    "note": "HDH-S008"
   },
   {
    "name": "revenue_EUR_m",
    "value": 2188,
    "status": "inherited_archive_only"
   }
  ],
  "formula": "1339/2188 × 100",
  "output": 61.19744058500915,
  "reported_value": 61.2,
  "verdict": "reconciles",
  "unit": "%",
  "currency": "EUR",
  "period": "FY2015",
  "measure_label": "personnel expense share of revenue",
  "source_ids": [
   "HDH-S008 (archive)"
  ],
  "rounding_rule": "1 dp",
  "limits": "Not freshly verified.",
  "v3_action": "Archive only."
 },
 {
  "calc_id": "M25",
  "v2_location": "not in V2 (V1 §4 illustrative)",
  "description": "Illustrative agency-route budget split",
  "inputs": [
   {
    "name": "media",
    "value": 80,
    "status": "assumption"
   },
   {
    "name": "external_tech",
    "value": 10,
    "status": "assumption"
   },
   {
    "name": "agency_fee",
    "value": 10,
    "status": "assumption"
   }
  ],
  "formula": "80+10+10",
  "output": 100,
  "reported_value": 100,
  "verdict": "reconciles",
  "unit": "units per 100 paid",
  "currency": "",
  "period": "n/a",
  "measure_label": "assumed budget allocation",
  "source_ids": [],
  "rounding_rule": "n/a",
  "limits": "Illustrative; not observed rates.",
  "v3_action": "Keep in archive; if restored, label every input as assumption in the graphic."
 },
 {
  "calc_id": "M26",
  "v2_location": "not in V2 (V1 §4 illustrative)",
  "description": "Illustrative principal-resale budget split",
  "inputs": [
   {
    "name": "inventory_cost",
    "value": 75,
    "status": "assumption"
   },
   {
    "name": "external_tech",
    "value": 8,
    "status": "assumption"
   },
   {
    "name": "gross_spread",
    "value": 17,
    "status": "assumption"
   }
  ],
  "formula": "75+8+17",
  "output": 100,
  "reported_value": 100,
  "verdict": "reconciles",
  "unit": "units per 100 paid",
  "currency": "",
  "period": "n/a",
  "measure_label": "assumed; gross spread is before service cost and risk, not net profit",
  "source_ids": [],
  "rounding_rule": "n/a",
  "limits": "Illustrative.",
  "v3_action": "As M25."
 },
 {
  "calc_id": "M27",
  "v2_location": "s17/R073 (figure) + interactive model",
  "description": "Task model baseline profit",
  "inputs": [
   {
    "name": "fee",
    "value": 100,
    "status": "assumption"
   },
   {
    "name": "labour",
    "value": 60,
    "status": "assumption"
   },
   {
    "name": "other",
    "value": 20,
    "status": "assumption"
   },
   {
    "name": "new_tool_review_cost",
    "value": 0,
    "status": "assumption"
   }
  ],
  "formula": "100 − 60 − 20 − 0",
  "output": 20,
  "reported_value": 20,
  "verdict": "reconciles",
  "unit": "units",
  "currency": "",
  "period": "n/a",
  "measure_label": "assumed single-task economics; output and quality fixed",
  "source_ids": [],
  "rounding_rule": "n/a",
  "limits": "Excludes tax, financing, media spend, working capital, quality change, added sales.",
  "v3_action": "Keep; one model boundary (see E-series)."
 },
 {
  "calc_id": "M28",
  "v2_location": "s17/R073; economics.svg; HTML compute()",
  "description": "Task model, 25% labour saving, +5 new cost, fixed fee",
  "inputs": [
   {
    "name": "fee",
    "value": 100,
    "status": "assumption"
   },
   {
    "name": "labour",
    "value": 60,
    "status": "assumption"
   },
   {
    "name": "saving_pct",
    "value": 25,
    "status": "assumption"
   },
   {
    "name": "other",
    "value": 20,
    "status": "assumption"
   },
   {
    "name": "new_cost",
    "value": 5,
    "status": "assumption"
   }
  ],
  "formula": "100 − 60×0.75 − 20 − 5",
  "output": 30,
  "reported_value": 30,
  "verdict": "reconciles",
  "unit": "units",
  "currency": "",
  "period": "n/a",
  "measure_label": "agency profit at fixed fee (agency keeps the whole 10-unit net saving)",
  "source_ids": [],
  "rounding_rule": "1 dp in figure",
  "limits": "Client fee saving 0.",
  "v3_action": "Keep."
 },
 {
  "calc_id": "M29",
  "v2_location": "s17/R073",
  "description": "Task model, repriced fee 85",
  "inputs": [
   {
    "name": "fee",
    "value": 85,
    "status": "assumption"
   },
   {
    "name": "labour",
    "value": 45,
    "status": "assumption"
   },
   {
    "name": "other",
    "value": 20,
    "status": "assumption"
   },
   {
    "name": "new_cost",
    "value": 5,
    "status": "assumption"
   }
  ],
  "formula": "85 − 45 − 20 − 5",
  "output": 15,
  "reported_value": 15,
  "verdict": "reconciles",
  "unit": "units",
  "currency": "",
  "period": "n/a",
  "measure_label": "agency profit when the client takes 15 units of fee (more than the 10-unit net saving); agency profit falls below baseline 20",
  "source_ids": [],
  "rounding_rule": "n/a",
  "limits": "Shows the saving can be over-passed-through.",
  "v3_action": "Keep; say explicitly that at fee 85 the client gains 15 while the net saving is 10, so the agency is worse off than baseline."
 },
 {
  "calc_id": "M30",
  "v2_location": "not in V2 (original F05)",
  "description": "Original F05 fixed-fee budget total with 50% internal-labour cut",
  "inputs": [
   {
    "name": "media",
    "value": 72,
    "status": "assumption"
   },
   {
    "name": "services",
    "value": 8,
    "status": "assumption"
   },
   {
    "name": "data",
    "value": 4,
    "status": "assumption"
   },
   {
    "name": "creative",
    "value": 8,
    "status": "assumption"
   },
   {
    "name": "internal",
    "value": 4,
    "status": "assumption"
   },
   {
    "name": "cut",
    "value": 0.5,
    "status": "assumption"
   },
   {
    "name": "proof",
    "value": 4,
    "status": "assumption"
   }
  ],
  "formula": "72+8+4+8+4×0.5+4",
  "output": 98,
  "reported_value": 98,
  "verdict": "reconciles",
  "unit": "units per 100 budget",
  "currency": "",
  "period": "n/a",
  "measure_label": "DIFFERENT boundary: whole-budget view, no added tool/review cost (F10)",
  "source_ids": [],
  "rounding_rule": "n/a",
  "limits": "Second model boundary; must not be shown beside the task model as one estimate.",
  "v3_action": "Archive only; do not restore alongside the task model."
 },
 {
  "calc_id": "M31",
  "v2_location": "not in V2 (original F05)",
  "description": "Original F05 hourly-fee total with 50% cut on 60% labour share",
  "inputs": [
   {
    "name": "media",
    "value": 72,
    "status": "assumption"
   },
   {
    "name": "service_fee",
    "value": 8,
    "status": "assumption"
   },
   {
    "name": "labour_share",
    "value": 0.6,
    "status": "assumption"
   },
   {
    "name": "cut",
    "value": 0.5,
    "status": "assumption"
   },
   {
    "name": "data",
    "value": 4,
    "status": "assumption"
   },
   {
    "name": "creative",
    "value": 8,
    "status": "assumption"
   },
   {
    "name": "internal",
    "value": 4,
    "status": "assumption"
   },
   {
    "name": "proof",
    "value": 4,
    "status": "assumption"
   }
  ],
  "formula": "72+8×(1−0.6×0.5)+4+8+4×0.5+4",
  "output": 95.6,
  "reported_value": 95.6,
  "verdict": "reconciles",
  "unit": "units per 100 budget",
  "currency": "",
  "period": "n/a",
  "measure_label": "as M30 (second boundary)",
  "source_ids": [],
  "rounding_rule": "1 dp",
  "limits": "As M30.",
  "v3_action": "Archive only."
 },
 {
  "calc_id": "M32",
  "v2_location": "s16/R068",
  "description": "Proof-delay illustration: spend before feedback",
  "inputs": [
   {
    "name": "daily_spend_USD",
    "value": 10000,
    "status": "assumption"
   },
   {
    "name": "lag_days",
    "value": 7,
    "status": "assumption"
   }
  ],
  "formula": "10000 × 7",
  "output": 70000,
  "reported_value": 70000,
  "verdict": "reconciles",
  "unit": "USD",
  "currency": "USD",
  "period": "n/a",
  "measure_label": "cash spent before feedback; explicitly NOT a loss estimate or a risk ceiling (R068 text confirms)",
  "source_ids": [],
  "rounding_rule": "n/a",
  "limits": "Booked commitments, reporting delay and stop failure can add exposure beyond this figure.",
  "v3_action": "Keep wording \"not a forecast loss or hard risk ceiling\"."
 },
 {
  "calc_id": "N01",
  "v2_location": "s02/R006,R008",
  "description": "Coverage counts: 49 sources checked",
  "inputs": [],
  "formula": "len(source-checks.csv)",
  "output": 49,
  "reported_value": 49,
  "verdict": "reconciles",
  "unit": "count",
  "currency": "",
  "period": "audit 2026-10",
  "measure_label": "count of stored source-check rows | entity: audit | stored passage support: yes",
  "source_ids": [],
  "rounding_rule": "",
  "limits": "Recounted: source-checks.csv has 49 rows.",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N02",
  "v2_location": "s02/R008",
  "description": "72 selected atomic claims",
  "inputs": [],
  "formula": "len(atomic-claim-ledger.csv)",
  "output": 72,
  "reported_value": 72,
  "verdict": "reconciles",
  "unit": "count",
  "currency": "",
  "period": "audit",
  "measure_label": "count | entity: audit | stored passage support: yes",
  "source_ids": [],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N03",
  "v2_location": "s02/R008",
  "description": "20-claim Horizon supplement",
  "inputs": [],
  "formula": "len(horizon-claim-ledger.csv)",
  "output": 20,
  "reported_value": 20,
  "verdict": "reconciles",
  "unit": "count",
  "currency": "",
  "period": "audit",
  "measure_label": "count | entity: audit | stored passage support: yes",
  "source_ids": [],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N04",
  "v2_location": "s02/R008",
  "description": "362 original chapter/executive paragraphs",
  "inputs": [],
  "formula": "len(original-paragraph-inventory.csv)",
  "output": 362,
  "reported_value": 362,
  "verdict": "reconciles",
  "unit": "count",
  "currency": "",
  "period": "V1",
  "measure_label": "count | entity: audit | stored passage support: yes",
  "source_ids": [],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N05",
  "v2_location": "s02/R008",
  "description": "232-claim original register",
  "inputs": [],
  "formula": "len(inherited-claim-register.csv)",
  "output": 232,
  "reported_value": 232,
  "verdict": "reconciles",
  "unit": "count",
  "currency": "",
  "period": "V1",
  "measure_label": "count | entity: audit | stored passage support: yes",
  "source_ids": [],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N06",
  "v2_location": "s02/R008",
  "description": "329 financial records in archive",
  "inputs": [],
  "formula": "len(archive financials.csv)",
  "output": 329,
  "reported_value": 329,
  "verdict": "reconciles",
  "unit": "count",
  "currency": "",
  "period": "V1",
  "measure_label": "count | entity: audit | stored passage support: yes",
  "source_ids": [],
  "rounding_rule": "",
  "limits": "V2 says these \"have not all received a fresh source audit\" — correct; this pass re-ran arithmetic only.",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N07",
  "v2_location": "s02 deck; s24",
  "description": "Research cutoff 5 October 2026; history from January 2006",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "2006-01 to 2026-10-05",
  "verdict": "reconciles",
  "unit": "date range",
  "currency": "",
  "period": "n/a",
  "measure_label": "cutoff | entity: paper | stored passage support: n/a",
  "source_ids": [],
  "rounding_rule": "",
  "limits": "Unchanged per PROGRESS.md.",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N08",
  "v2_location": "s03/R013; s06/R025",
  "description": "WPP Media replaced GroupM, May 2025; InfoSum bought April 2025 (3 April)",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "2025-04-03; 2025-05",
  "verdict": "reconciles",
  "unit": "date",
  "currency": "",
  "period": "2025",
  "measure_label": "event dates | entity: WPP | stored passage support: yes",
  "source_ids": [
   "WPP-S001",
   "WPP-S004"
  ],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N09",
  "v2_location": "s03/R013",
  "description": "Power of One plan December 2015, effective January 2016",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "2015-12-02 → 2016-01",
  "verdict": "reconciles",
  "unit": "date",
  "currency": "",
  "period": "2015–16",
  "measure_label": "plan vs effective date | entity: Publicis | stored passage support: yes",
  "source_ids": [
   "PUB-S035"
  ],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N10",
  "v2_location": "s03/R013; s07/R031",
  "description": "Hearts United August 2026 (28 Aug): Hearts & Science + Mediahub; UM a sibling",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "2026-08-28",
  "verdict": "reconciles",
  "unit": "date",
  "currency": "",
  "period": "2026",
  "measure_label": "brand combination, not acquisition | entity: Omnicom | stored passage support: yes",
  "source_ids": [
   "OMC-S034"
  ],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N11",
  "v2_location": "s03/R013; s09/R040; s10/R050",
  "description": "Horizon Global JV September 2025; 50/50 partnership",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "2025-09-29; 50/50",
  "verdict": "reconciles",
  "unit": "date; share",
  "currency": "",
  "period": "2025",
  "measure_label": "commercial JV; parents not merged; combined billings ≠ Havas revenue | entity: Havas/Horizon | stored passage support: yes",
  "source_ids": [
   "DH-S038",
   "HOR-S001"
  ],
  "rounding_rule": "",
  "limits": "50/50 comes from HOR-S001 corporate note; DH-S038 passage does not state the split.",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N12",
  "v2_location": "s03/R013; s05/R021; s24",
  "description": "LiveRamp latest dated status 16 September 2026, still conditional",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "2026-09-16",
  "verdict": "reconciles",
  "unit": "date",
  "currency": "",
  "period": "2026",
  "measure_label": "latest dated status checked; no close verified to cutoff | entity: Publicis/LiveRamp | stored passage support: yes",
  "source_ids": [
   "PUB-S012"
  ],
  "rounding_rule": "",
  "limits": "Absence of a later record is not proof nothing changed (F05).",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N13",
  "v2_location": "s04/R015",
  "description": "Digitas agreement 2006 (20 Dec); Xaxis launch 2011 (28 Jun)",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "2006-12-20; 2011-06-28",
  "verdict": "reconciles",
  "unit": "date",
  "currency": "",
  "period": "2006; 2011",
  "measure_label": "agreement (not close) / launch | entity: Publicis; GroupM | stored passage support: yes",
  "source_ids": [
   "PUB-S001",
   "WPP-S012"
  ],
  "rounding_rule": "",
  "limits": "Digitas closed Jan 2007 (archive); V2 correctly says \"agreement\".",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N14",
  "v2_location": "s04/R015; s08/R036; s05/R018",
  "description": "Aegis closed March 2013 (26 Mar); Sapient closed February 2015 (6 Feb)",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "2013-03-26; 2015-02-06",
  "verdict": "reconciles",
  "unit": "date",
  "currency": "",
  "period": "2013; 2015",
  "measure_label": "completion dates | entity: Dentsu; Publicis | stored passage support: yes",
  "source_ids": [
   "DH-S003",
   "PUB-S003"
  ],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N15",
  "v2_location": "s04/R015; s05/R018",
  "description": "Epsilon joined 2019 (completion release 2 July; consolidated from 1 July)",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "2019-07-02 / 2019-07-01",
  "verdict": "reconciles",
  "unit": "date",
  "currency": "",
  "period": "2019",
  "measure_label": "publication vs consolidation date | entity: Publicis | stored passage support: yes",
  "source_ids": [
   "PUB-S006"
  ],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N16",
  "v2_location": "s04/R015; s06/R026",
  "description": "Kantar: Dec 2019, 60% sale closed for ~90% of business; 40% retained; rest expected 2020",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "60%; ~90%; 40%; 2020",
  "verdict": "reconciles",
  "unit": "% stake; % of business; date",
  "currency": "",
  "period": "2019-12-05",
  "measure_label": "staged change of control | entity: WPP | stored passage support: yes",
  "source_ids": [
   "WPP-S007"
  ],
  "rounding_rule": "",
  "limits": "Do not infer the 2026 stake from this.",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N17",
  "v2_location": "s04/R015; s10/R044",
  "description": "Stagwell/MDC combination completed August 2021 (2 Aug)",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "2021-08-02",
  "verdict": "reconciles",
  "unit": "date",
  "currency": "",
  "period": "2021",
  "measure_label": "completion | entity: Stagwell | stored passage support: yes",
  "source_ids": [
   "ALT-S006"
  ],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N18",
  "v2_location": "s04/R015; s07/R030",
  "description": "Flywheel closed 2 January 2024; IPG closed 26 November 2025",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "2024-01-02; 2025-11-26",
  "verdict": "reconciles",
  "unit": "date",
  "currency": "",
  "period": "2024; 2025",
  "measure_label": "completion records | entity: Omnicom | stored passage support: yes",
  "source_ids": [
   "OMC-S020",
   "OMC-S024"
  ],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N19",
  "v2_location": "s04/R015; s09/R040",
  "description": "Havas Amsterdam listing December 2024 (16 Dec)",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "2024-12-16",
  "verdict": "reconciles",
  "unit": "date",
  "currency": "",
  "period": "2024",
  "measure_label": "listing after spin-off | entity: Havas | stored passage support: yes",
  "source_ids": [
   "DH-S029"
  ],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N20",
  "v2_location": "s05/R020",
  "description": "Publicis FY2016 charge €1.44bn incl. €1.392bn Publicis.Sapient hub",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "1440; 1392",
  "verdict": "reconciles",
  "unit": "EUR m",
  "currency": "EUR",
  "period": "FY2016",
  "measure_label": "impairment charge; hub broader than Sapient deal | entity: Publicis | stored passage support: yes",
  "source_ids": [
   "PUB-S004"
  ],
  "rounding_rule": "",
  "limits": "V2 rounds €1,440m to €1.44bn; consistent.",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N21",
  "v2_location": "s05/R021",
  "description": "Lotame full purchase dated April 2025 by H1 2026 report note",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "2025-04",
  "verdict": "reconciles",
  "unit": "date",
  "currency": "",
  "period": "2025",
  "measure_label": "completion month per note 3.2 | entity: Publicis | stored passage support: yes",
  "source_ids": [
   "PUB-S015"
  ],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N22",
  "v2_location": "s05/R021",
  "description": "LiveRamp: $2.546bn equity value; $379m net cash; $2.167bn enterprise value; May 2026 agreement",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "2.546; 0.379; 2.167",
  "verdict": "reconciles",
  "unit": "USD bn",
  "currency": "USD",
  "period": "agreement May 2026",
  "measure_label": "equity value / acquired net cash / enterprise value — labelled correctly in V2 | entity: Publicis/LiveRamp | stored passage support: yes",
  "source_ids": [
   "PUB-S009"
  ],
  "rounding_rule": "",
  "limits": "See M01 and report §LiveRamp for the $2.5bn vs ~$2.2bn press confusion and the $38.50/share price (archive PUB-S010).",
  "v3_action": "Keep; add one sentence distinguishing equity value (price × diluted shares) from enterprise value (equity less net cash)."
 },
 {
  "calc_id": "N23",
  "v2_location": "s06/R028",
  "description": "WPP H1 2026: revenue less pass-through fell 4.7% LFL; 8.4% headline margin; 4.1% reported margin",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "-4.7; 8.4; 4.1",
  "verdict": "reconciles_with_label_fix",
  "unit": "%",
  "currency": "GBP",
  "period": "H1 2026",
  "measure_label": "LFL growth (company-computed, not recomputable) + two margins on different bases | entity: WPP | stored passage support: yes",
  "source_ids": [
   "WPP-S003"
  ],
  "rounding_rule": "",
  "limits": "\"gross revenue\" wording — see M08.",
  "v3_action": "Attribute −4.7% as company LFL; relabel denominator wording."
 },
 {
  "calc_id": "N24",
  "v2_location": "s07/R033",
  "description": "Guitar Center 23% → 35%; 12 points; about 52.2% relative",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "23; 35; 12; 52.2",
  "verdict": "reconciles_with_label_fix",
  "unit": "%; pp; % relative",
  "currency": "",
  "period": "2026 case",
  "measure_label": "attributed vendor case | entity: Acxiom/Guitar Center | stored passage support: yes",
  "source_ids": [
   "OMC-S033"
  ],
  "rounding_rule": "",
  "limits": "See M20: 52.2% is false precision.",
  "v3_action": "Replace \"about 52.2%\" with \"roughly 50%\" or drop."
 },
 {
  "calc_id": "N25",
  "v2_location": "s07/R034",
  "description": "Omnicom Q2 2026 core revenue $5,995m; core adjusted EBITA $1,068.8m",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "5995; 1068.8",
  "verdict": "reconciles",
  "unit": "USD m",
  "currency": "USD",
  "period": "Q2 2026",
  "measure_label": "Core Operations perimeter; adjusted non-GAAP | entity: Omnicom | stored passage support: yes",
  "source_ids": [
   "OMC-S036"
  ],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N26",
  "v2_location": "s08/R036",
  "description": "Merkle: April 2020 full ownership; final stake payment due 2021",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "2020-04-15; 2021 (Q3)",
  "verdict": "reconciles",
  "unit": "date",
  "currency": "",
  "period": "2020–21",
  "measure_label": "ownership vs cash settlement timing | entity: Dentsu | stored passage support: yes",
  "source_ids": [
   "DH-S008"
  ],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N27",
  "v2_location": "s08/R038",
  "description": "Dentsu FY2025 goodwill charge ¥396.074bn; Americas ¥299.656bn; EMEA ¥96.418bn",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "396074; 299656; 96418",
  "verdict": "reconciles",
  "unit": "JPY m",
  "currency": "JPY",
  "period": "FY2025",
  "measure_label": "impairment (non-cash) | entity: Dentsu | stored passage support: yes",
  "source_ids": [
   "DH-S016"
  ],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N28",
  "v2_location": "s09/R042",
  "description": "Havas FY2025 net revenue €2,783m; adjusted EBIT €358m; ratio rounds to 12.9%",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "2783; 358; 12.9",
  "verdict": "reconciles",
  "unit": "EUR m; %",
  "currency": "EUR",
  "period": "FY2025",
  "measure_label": "adjusted; full year | entity: Havas | stored passage support: yes",
  "source_ids": [
   "DH-S041"
  ],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N29",
  "v2_location": "s10/R046",
  "description": "Stagwell $16m committed enterprise-software revenue",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "16",
  "verdict": "reconciles",
  "unit": "USD m",
  "currency": "USD",
  "period": "Q2/H1 2026 presentation",
  "measure_label": "commitments, NOT recognised revenue | entity: Stagwell | stored passage support: yes",
  "source_ids": [
   "ALT-S018"
  ],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N30",
  "v2_location": "s10/R047",
  "description": "Stagwell 3.3% organic (bridge) vs original chart 3.0%; method change Q3 2025",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "3.3; 3.0; Q3 2025",
  "verdict": "reconciles",
  "unit": "%",
  "currency": "",
  "period": "H1 2026",
  "measure_label": "organic net revenue growth; changed method | entity: Stagwell | stored passage support: yes",
  "source_ids": [
   "ALT-S018",
   "ALT-S023"
  ],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N31",
  "v2_location": "s10/R048",
  "description": "S4 FY2025 net revenue £673.0m; −10.8% reported; −8.4% LFL; margin rose; net debt fell",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "673.0; -10.8; -8.4",
  "verdict": "reconciles_with_label_fix",
  "unit": "GBP m; %",
  "currency": "GBP",
  "period": "FY2025",
  "measure_label": "net revenue; reported vs LFL; LFL not recomputable | entity: S4 Capital | stored passage support: partial",
  "source_ids": [
   "ALT-S028"
  ],
  "rounding_rule": "",
  "limits": "\"margin rose\" and \"net debt fell\" need prior-year values not in stored passage (archive: net debt £86.9m FY2025, prior not stored).",
  "v3_action": "Attribute the direction statements to the release; re-source prior-year figures if the directions are kept as facts."
 },
 {
  "calc_id": "N32",
  "v2_location": "s11/R052",
  "description": "Bridges table — seven rows (see M02,M04,M05,M07,M08,M10,M13,M15,M17)",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "see M-rows",
  "verdict": "reconciles_with_label_fix",
  "unit": "mixed",
  "currency": "",
  "period": "FY2025/H1 2026/Q2 2026",
  "measure_label": "mixed periods and bases, labelled \"not a league table\" | entity: multiple | stored passage support: partial",
  "source_ids": [
   "PUB-S039",
   "PUB-S015",
   "WPP-S003",
   "OMC-S036",
   "DH-S041",
   "ALT-S018",
   "ALT-S028"
  ],
  "rounding_rule": "",
  "limits": "Four-decimal percentages overstate precision; S4 prior-year and Omnicom consolidated/excluded inputs are not in stored passages.",
  "v3_action": "One-decimal outputs; add \"inputs rounded to nearest €/£/$m\"; re-source the two unstated inputs."
 },
 {
  "calc_id": "N33",
  "v2_location": "s12/R055",
  "description": "ANA 2023: 162 respondents; 82% in-house; 92% still use outside agencies",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "162; 82; 92",
  "verdict": "reconciles",
  "unit": "n; %",
  "currency": "",
  "period": "Feb–Mar 2023 fieldwork",
  "measure_label": "incidence among respondents, not share of spend; item bases ambiguous | entity: ANA members | stored passage support: yes",
  "source_ids": [
   "ECO-S003"
  ],
  "rounding_rule": "",
  "limits": "Item base for each % may differ from 162.",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N34",
  "v2_location": "s12/R055",
  "description": "WFA/Observatory: 45 companies; 66% in-house; all use outside agencies",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "45; 66; 100",
  "verdict": "reconciles",
  "unit": "n; %",
  "currency": "",
  "period": "2023 study",
  "measure_label": "incidence; different population from ANA — do not pool | entity: WFA members | stored passage support: yes",
  "source_ids": [
   "ECO-S004"
  ],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N35",
  "v2_location": "s13/R059; s14/R060",
  "description": "Nine propositions; six capability levels; five gates",
  "inputs": [],
  "formula": "rows in R059 (9), R060 (6), R062 (5)",
  "output": "9; 6; 5",
  "reported_value": "9; 6; 5",
  "verdict": "reconciles",
  "unit": "count",
  "currency": "",
  "period": "n/a",
  "measure_label": "structural counts | entity: paper | stored passage support: n/a",
  "source_ids": [],
  "rounding_rule": "",
  "limits": "R059 JSON row list shows 8 fully visible rows in dump (truncated print); the publication text lists nine — recount in manuscript build.",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N36",
  "v2_location": "s15/R064",
  "description": "AAMP 3.0 released 22 September 2026; comment window to 22 October 2026 (30 days)",
  "inputs": [],
  "formula": "22 Oct − 22 Sep = 30 days",
  "output": 30,
  "reported_value": "2026-09-22 → 2026-10-22",
  "verdict": "reconciles",
  "unit": "date",
  "currency": "",
  "period": "2026",
  "measure_label": "proposal status only | entity: IAB Tech Lab | stored passage support: yes",
  "source_ids": [
   "ROOT-S002"
  ],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N37",
  "v2_location": "s15/R064; s22/R141",
  "description": "Amazon page dated 21 March 2025; title beta, body GA",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "2025-03-21",
  "verdict": "reconciles",
  "unit": "date",
  "currency": "",
  "period": "2025",
  "measure_label": "mutable page; stage not settled | entity: Amazon Ads | stored passage support: yes",
  "source_ids": [
   "PLT-S003"
  ],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N38",
  "v2_location": "s16/R068",
  "description": "$10,000/day × 7 days = $70,000 before feedback",
  "inputs": [],
  "formula": "10000×7",
  "output": 70000,
  "reported_value": "70000",
  "verdict": "reconciles",
  "unit": "USD",
  "currency": "USD",
  "period": "n/a",
  "measure_label": "illustration; not loss, not ceiling | entity: n/a | stored passage support: assumption",
  "source_ids": [],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N39",
  "v2_location": "s17/R071",
  "description": "WFA 2026: 69 multinationals; 71% global procurement roles; 63% expect more performance fees",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "69; 71; 63",
  "verdict": "reconciles",
  "unit": "n; %",
  "currency": "",
  "period": "2026 publication",
  "measure_label": "public summary; respondent expectations | entity: WFA | stored passage support: yes",
  "source_ids": [
   "ECO-S006"
  ],
  "rounding_rule": "",
  "limits": "Field dates and questionnaire not inspected; V1 also cited $147bn spend and 67–80%/<20% shares, not in V2.",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N40",
  "v2_location": "s17/R073",
  "description": "Task model: fee 100; labour 60; other 20; profit 20; 25% saving + 5 new cost → cost 70; fixed fee profit 30; fee 85 profit 15",
  "inputs": [],
  "formula": "see M27–M29 and E-series",
  "output": "20; 70; 30; 15",
  "reported_value": "100;60;20;20;25;5;70;30;85;15",
  "verdict": "reconciles",
  "unit": "units",
  "currency": "",
  "period": "n/a",
  "measure_label": "ALL assumptions (figure labels them ASSUMPTIONS) | entity: illustrative | stored passage support: assumption",
  "source_ids": [],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N41",
  "v2_location": "s18/R076",
  "description": "Kohl's FY2025 annual plan: merchandise sales 60%, operating margin 40%",
  "inputs": [],
  "formula": "60+40",
  "output": 100,
  "reported_value": "60; 40",
  "verdict": "reconciles",
  "unit": "% weight",
  "currency": "",
  "period": "FY2025",
  "measure_label": "named-officer plan weights | entity: Kohl's | stored passage support: yes",
  "source_ids": [
   "ECO-S017"
  ],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N42",
  "v2_location": "s18/R080",
  "description": "2019 study: 15 US Facebook experiments",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "15",
  "verdict": "reconciles",
  "unit": "count",
  "currency": "",
  "period": "2019 paper",
  "measure_label": "study scope | entity: Gordon et al. | stored passage support: yes",
  "source_ids": [
   "ECO-S020"
  ],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N43",
  "v2_location": "s21/R114",
  "description": "Horizon June 2026 release (18 Jun): Blu, APIs, MCP; SharkNinja audience collaboration",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "2026-06-18",
  "verdict": "reconciles",
  "unit": "date",
  "currency": "",
  "period": "2026",
  "measure_label": "attributed deployment of a specific task | entity: Horizon | stored passage support: yes",
  "source_ids": [
   "HOR-S002"
  ],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N44",
  "v2_location": "s21/R115",
  "description": "1 October 2026: 11 cohort partners from over 600 submissions; over 50 participants",
  "inputs": [],
  "formula": "11/600",
  "output": 1.83,
  "reported_value": "11; >600; >50",
  "verdict": "reconciles",
  "unit": "count",
  "currency": "",
  "period": "2026-10-01",
  "measure_label": "participation counts, not integrations; 11/600 ≈ 1.8% selection rate (not stated in V2) | entity: Horizon | stored passage support: yes",
  "source_ids": [
   "HOR-S003"
  ],
  "rounding_rule": "",
  "limits": "\"over 600\" is a floor, so selection rate ≤ 1.8%.",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N45",
  "v2_location": "s19–s22 figures",
  "description": "Seven-stage scenarios; eight-task baseline",
  "inputs": [],
  "formula": "stages listed in R085/R100/R132 = 7; R082 lists 8 steps",
  "output": "7; 8",
  "reported_value": "7; 8",
  "verdict": "reconciles",
  "unit": "count",
  "currency": "",
  "period": "n/a",
  "measure_label": "structural | entity: paper | stored passage support: n/a",
  "source_ids": [],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N46",
  "v2_location": "s10/R050",
  "description": "HorizonOS launch December 2025 (18 Dec)",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "2025-12-18",
  "verdict": "reconciles",
  "unit": "date",
  "currency": "",
  "period": "2025",
  "measure_label": "announcement | entity: Horizon | stored passage support: yes",
  "source_ids": [
   "HOR-S001"
  ],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N47",
  "v2_location": "s05/R023",
  "description": "2023 Publicis product release (16 June 2023)",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "2023-06-16",
  "verdict": "reconciles",
  "unit": "date",
  "currency": "",
  "period": "2023",
  "measure_label": "product launch claim | entity: Publicis | stored passage support: yes",
  "source_ids": [
   "PUB-S023"
  ],
  "rounding_rule": "",
  "limits": "",
  "v3_action": "Keep."
 },
 {
  "calc_id": "N48",
  "v2_location": "s16/R067 \"Proof lag\"; s21/R118 \"spend cap\"; s21/R124",
  "description": "Spend cap / exposure limit wording",
  "inputs": [],
  "formula": "",
  "output": null,
  "reported_value": "n/a",
  "verdict": "reconciles",
  "unit": "text check",
  "currency": "",
  "period": "n/a",
  "measure_label": "spend cap described as a brand-set rule, not a liability ceiling; R068 denies loss/ceiling reading | entity: paper | stored passage support: n/a",
  "source_ids": [],
  "rounding_rule": "",
  "limits": "No graphic or block treats spend-awaiting-proof as certain loss or a cap as a liability ceiling (grep of HTML + SVGs).",
  "v3_action": "Keep; carry the R068 caveat into any V3 figure that shows the $70,000."
 },
 {
  "calc_id": "E01",
  "v2_location": "s17 interactive model (HTML compute()) / economics.svg",
  "description": "Task model edge case: Default (HTML/SVG)",
  "inputs": [
   {
    "name": "saving_pct",
    "value": 25,
    "status": "assumption"
   },
   {
    "name": "new_cost",
    "value": 5,
    "status": "assumption"
   },
   {
    "name": "fee",
    "value": 100,
    "status": "assumption"
   },
   {
    "name": "labour_base",
    "value": 60,
    "status": "assumption"
   },
   {
    "name": "other",
    "value": 20,
    "status": "assumption"
   },
   {
    "name": "baseline_fee",
    "value": 100,
    "status": "assumption"
   }
  ],
  "formula": "cost = 60×(1−s/100)+20+newCost; profit = fee − cost; clientFeeSaving = 100 − fee; netSaving = 80 − cost",
  "output": {
   "labour": 45,
   "cost": 70,
   "agency_profit": 30,
   "client_fee_saving": 0,
   "net_task_saving_vs_base": 10
  },
  "reported_value": 30,
  "verdict": "reconciles",
  "unit": "units",
  "currency": "",
  "period": "n/a",
  "measure_label": "single-task fee/cost model; output and quality fixed; no added sales; excludes tax, financing, media, working capital",
  "source_ids": [],
  "rounding_rule": "1 dp as the HTML prints",
  "limits": "Slider ranges: saving 0–75, new cost 0–20, fee 60–130. Reachable in the published control.",
  "v3_action": "Record in model notes."
 },
 {
  "calc_id": "E02",
  "v2_location": "s17 interactive model (HTML compute()) / economics.svg",
  "description": "Task model edge case: Zero savings, default new cost",
  "inputs": [
   {
    "name": "saving_pct",
    "value": 0,
    "status": "assumption"
   },
   {
    "name": "new_cost",
    "value": 5,
    "status": "assumption"
   },
   {
    "name": "fee",
    "value": 100,
    "status": "assumption"
   },
   {
    "name": "labour_base",
    "value": 60,
    "status": "assumption"
   },
   {
    "name": "other",
    "value": 20,
    "status": "assumption"
   },
   {
    "name": "baseline_fee",
    "value": 100,
    "status": "assumption"
   }
  ],
  "formula": "cost = 60×(1−s/100)+20+newCost; profit = fee − cost; clientFeeSaving = 100 − fee; netSaving = 80 − cost",
  "output": {
   "labour": 60,
   "cost": 85,
   "agency_profit": 15,
   "client_fee_saving": 0,
   "net_task_saving_vs_base": -5
  },
  "reported_value": null,
  "verdict": "reconciles",
  "unit": "units",
  "currency": "",
  "period": "n/a",
  "measure_label": "single-task fee/cost model; output and quality fixed; no added sales; excludes tax, financing, media, working capital",
  "source_ids": [],
  "rounding_rule": "1 dp as the HTML prints",
  "limits": "Slider ranges: saving 0–75, new cost 0–20, fee 60–130. Reachable in the published control.",
  "v3_action": "Record in model notes."
 },
 {
  "calc_id": "E03",
  "v2_location": "s17 interactive model (HTML compute()) / economics.svg",
  "description": "Task model edge case: Zero savings, zero new cost (identity)",
  "inputs": [
   {
    "name": "saving_pct",
    "value": 0,
    "status": "assumption"
   },
   {
    "name": "new_cost",
    "value": 0,
    "status": "assumption"
   },
   {
    "name": "fee",
    "value": 100,
    "status": "assumption"
   },
   {
    "name": "labour_base",
    "value": 60,
    "status": "assumption"
   },
   {
    "name": "other",
    "value": 20,
    "status": "assumption"
   },
   {
    "name": "baseline_fee",
    "value": 100,
    "status": "assumption"
   }
  ],
  "formula": "cost = 60×(1−s/100)+20+newCost; profit = fee − cost; clientFeeSaving = 100 − fee; netSaving = 80 − cost",
  "output": {
   "labour": 60,
   "cost": 80,
   "agency_profit": 20,
   "client_fee_saving": 0,
   "net_task_saving_vs_base": 0
  },
  "reported_value": null,
  "verdict": "reconciles",
  "unit": "units",
  "currency": "",
  "period": "n/a",
  "measure_label": "single-task fee/cost model; output and quality fixed; no added sales; excludes tax, financing, media, working capital",
  "source_ids": [],
  "rounding_rule": "1 dp as the HTML prints",
  "limits": "Slider ranges: saving 0–75, new cost 0–20, fee 60–130. Reachable in the published control.",
  "v3_action": "Record in model notes."
 },
 {
  "calc_id": "E04",
  "v2_location": "s17 interactive model (HTML compute()) / economics.svg",
  "description": "Task model edge case: Added review/tool cost at slider max",
  "inputs": [
   {
    "name": "saving_pct",
    "value": 25,
    "status": "assumption"
   },
   {
    "name": "new_cost",
    "value": 20,
    "status": "assumption"
   },
   {
    "name": "fee",
    "value": 100,
    "status": "assumption"
   },
   {
    "name": "labour_base",
    "value": 60,
    "status": "assumption"
   },
   {
    "name": "other",
    "value": 20,
    "status": "assumption"
   },
   {
    "name": "baseline_fee",
    "value": 100,
    "status": "assumption"
   }
  ],
  "formula": "cost = 60×(1−s/100)+20+newCost; profit = fee − cost; clientFeeSaving = 100 − fee; netSaving = 80 − cost",
  "output": {
   "labour": 45,
   "cost": 85,
   "agency_profit": 15,
   "client_fee_saving": 0,
   "net_task_saving_vs_base": -5
  },
  "reported_value": null,
  "verdict": "reconciles",
  "unit": "units",
  "currency": "",
  "period": "n/a",
  "measure_label": "single-task fee/cost model; output and quality fixed; no added sales; excludes tax, financing, media, working capital",
  "source_ids": [],
  "rounding_rule": "1 dp as the HTML prints",
  "limits": "Slider ranges: saving 0–75, new cost 0–20, fee 60–130. Reachable in the published control.",
  "v3_action": "Record in model notes."
 },
 {
  "calc_id": "E05",
  "v2_location": "s17 interactive model (HTML compute()) / economics.svg",
  "description": "Task model edge case: New cost swallows the saving exactly (15 = 60×0.25)",
  "inputs": [
   {
    "name": "saving_pct",
    "value": 25,
    "status": "assumption"
   },
   {
    "name": "new_cost",
    "value": 15,
    "status": "assumption"
   },
   {
    "name": "fee",
    "value": 100,
    "status": "assumption"
   },
   {
    "name": "labour_base",
    "value": 60,
    "status": "assumption"
   },
   {
    "name": "other",
    "value": 20,
    "status": "assumption"
   },
   {
    "name": "baseline_fee",
    "value": 100,
    "status": "assumption"
   }
  ],
  "formula": "cost = 60×(1−s/100)+20+newCost; profit = fee − cost; clientFeeSaving = 100 − fee; netSaving = 80 − cost",
  "output": {
   "labour": 45,
   "cost": 80,
   "agency_profit": 20,
   "client_fee_saving": 0,
   "net_task_saving_vs_base": 0
  },
  "reported_value": null,
  "verdict": "reconciles",
  "unit": "units",
  "currency": "",
  "period": "n/a",
  "measure_label": "single-task fee/cost model; output and quality fixed; no added sales; excludes tax, financing, media, working capital",
  "source_ids": [],
  "rounding_rule": "1 dp as the HTML prints",
  "limits": "Slider ranges: saving 0–75, new cost 0–20, fee 60–130. Reachable in the published control.",
  "v3_action": "Record in model notes."
 },
 {
  "calc_id": "E06",
  "v2_location": "s17 interactive model (HTML compute()) / economics.svg",
  "description": "Task model edge case: Negative margin: fee at slider min, no saving, max new cost",
  "inputs": [
   {
    "name": "saving_pct",
    "value": 0,
    "status": "assumption"
   },
   {
    "name": "new_cost",
    "value": 20,
    "status": "assumption"
   },
   {
    "name": "fee",
    "value": 60,
    "status": "assumption"
   },
   {
    "name": "labour_base",
    "value": 60,
    "status": "assumption"
   },
   {
    "name": "other",
    "value": 20,
    "status": "assumption"
   },
   {
    "name": "baseline_fee",
    "value": 100,
    "status": "assumption"
   }
  ],
  "formula": "cost = 60×(1−s/100)+20+newCost; profit = fee − cost; clientFeeSaving = 100 − fee; netSaving = 80 − cost",
  "output": {
   "labour": 60,
   "cost": 100,
   "agency_profit": -40,
   "client_fee_saving": 40,
   "net_task_saving_vs_base": -20
  },
  "reported_value": null,
  "verdict": "reconciles",
  "unit": "units",
  "currency": "",
  "period": "n/a",
  "measure_label": "single-task fee/cost model; output and quality fixed; no added sales; excludes tax, financing, media, working capital",
  "source_ids": [],
  "rounding_rule": "1 dp as the HTML prints",
  "limits": "Slider ranges: saving 0–75, new cost 0–20, fee 60–130. Reachable in the published control.",
  "v3_action": "Record in model notes."
 },
 {
  "calc_id": "E07",
  "v2_location": "s17 interactive model (HTML compute()) / economics.svg",
  "description": "Task model edge case: Negative margin with default saving: fee 60",
  "inputs": [
   {
    "name": "saving_pct",
    "value": 25,
    "status": "assumption"
   },
   {
    "name": "new_cost",
    "value": 5,
    "status": "assumption"
   },
   {
    "name": "fee",
    "value": 60,
    "status": "assumption"
   },
   {
    "name": "labour_base",
    "value": 60,
    "status": "assumption"
   },
   {
    "name": "other",
    "value": 20,
    "status": "assumption"
   },
   {
    "name": "baseline_fee",
    "value": 100,
    "status": "assumption"
   }
  ],
  "formula": "cost = 60×(1−s/100)+20+newCost; profit = fee − cost; clientFeeSaving = 100 − fee; netSaving = 80 − cost",
  "output": {
   "labour": 45,
   "cost": 70,
   "agency_profit": -10,
   "client_fee_saving": 40,
   "net_task_saving_vs_base": 10
  },
  "reported_value": null,
  "verdict": "reconciles",
  "unit": "units",
  "currency": "",
  "period": "n/a",
  "measure_label": "single-task fee/cost model; output and quality fixed; no added sales; excludes tax, financing, media, working capital",
  "source_ids": [],
  "rounding_rule": "1 dp as the HTML prints",
  "limits": "Slider ranges: saving 0–75, new cost 0–20, fee 60–130. Reachable in the published control.",
  "v3_action": "Record in model notes."
 },
 {
  "calc_id": "E08",
  "v2_location": "s17 interactive model (HTML compute()) / economics.svg",
  "description": "Task model edge case: Break-even fee = cost (70)",
  "inputs": [
   {
    "name": "saving_pct",
    "value": 25,
    "status": "assumption"
   },
   {
    "name": "new_cost",
    "value": 5,
    "status": "assumption"
   },
   {
    "name": "fee",
    "value": 70,
    "status": "assumption"
   },
   {
    "name": "labour_base",
    "value": 60,
    "status": "assumption"
   },
   {
    "name": "other",
    "value": 20,
    "status": "assumption"
   },
   {
    "name": "baseline_fee",
    "value": 100,
    "status": "assumption"
   }
  ],
  "formula": "cost = 60×(1−s/100)+20+newCost; profit = fee − cost; clientFeeSaving = 100 − fee; netSaving = 80 − cost",
  "output": {
   "labour": 45,
   "cost": 70,
   "agency_profit": 0,
   "client_fee_saving": 30,
   "net_task_saving_vs_base": 10
  },
  "reported_value": null,
  "verdict": "reconciles",
  "unit": "units",
  "currency": "",
  "period": "n/a",
  "measure_label": "single-task fee/cost model; output and quality fixed; no added sales; excludes tax, financing, media, working capital",
  "source_ids": [],
  "rounding_rule": "1 dp as the HTML prints",
  "limits": "Slider ranges: saving 0–75, new cost 0–20, fee 60–130. Reachable in the published control.",
  "v3_action": "Record in model notes."
 },
 {
  "calc_id": "E09",
  "v2_location": "s17 interactive model (HTML compute()) / economics.svg",
  "description": "Task model edge case: Fee change: 85 (R073 repriced case)",
  "inputs": [
   {
    "name": "saving_pct",
    "value": 25,
    "status": "assumption"
   },
   {
    "name": "new_cost",
    "value": 5,
    "status": "assumption"
   },
   {
    "name": "fee",
    "value": 85,
    "status": "assumption"
   },
   {
    "name": "labour_base",
    "value": 60,
    "status": "assumption"
   },
   {
    "name": "other",
    "value": 20,
    "status": "assumption"
   },
   {
    "name": "baseline_fee",
    "value": 100,
    "status": "assumption"
   }
  ],
  "formula": "cost = 60×(1−s/100)+20+newCost; profit = fee − cost; clientFeeSaving = 100 − fee; netSaving = 80 − cost",
  "output": {
   "labour": 45,
   "cost": 70,
   "agency_profit": 15,
   "client_fee_saving": 15,
   "net_task_saving_vs_base": 10
  },
  "reported_value": 15,
  "verdict": "reconciles",
  "unit": "units",
  "currency": "",
  "period": "n/a",
  "measure_label": "single-task fee/cost model; output and quality fixed; no added sales; excludes tax, financing, media, working capital",
  "source_ids": [],
  "rounding_rule": "1 dp as the HTML prints",
  "limits": "Slider ranges: saving 0–75, new cost 0–20, fee 60–130. Reachable in the published control.",
  "v3_action": "Record in model notes."
 },
 {
  "calc_id": "E10",
  "v2_location": "s17 interactive model (HTML compute()) / economics.svg",
  "description": "Task model edge case: Fee 90: client takes the whole 10-unit net saving; agency back at baseline 20",
  "inputs": [
   {
    "name": "saving_pct",
    "value": 25,
    "status": "assumption"
   },
   {
    "name": "new_cost",
    "value": 5,
    "status": "assumption"
   },
   {
    "name": "fee",
    "value": 90,
    "status": "assumption"
   },
   {
    "name": "labour_base",
    "value": 60,
    "status": "assumption"
   },
   {
    "name": "other",
    "value": 20,
    "status": "assumption"
   },
   {
    "name": "baseline_fee",
    "value": 100,
    "status": "assumption"
   }
  ],
  "formula": "cost = 60×(1−s/100)+20+newCost; profit = fee − cost; clientFeeSaving = 100 − fee; netSaving = 80 − cost",
  "output": {
   "labour": 45,
   "cost": 70,
   "agency_profit": 20,
   "client_fee_saving": 10,
   "net_task_saving_vs_base": 10
  },
  "reported_value": null,
  "verdict": "reconciles",
  "unit": "units",
  "currency": "",
  "period": "n/a",
  "measure_label": "single-task fee/cost model; output and quality fixed; no added sales; excludes tax, financing, media, working capital",
  "source_ids": [],
  "rounding_rule": "1 dp as the HTML prints",
  "limits": "Slider ranges: saving 0–75, new cost 0–20, fee 60–130. Reachable in the published control.",
  "v3_action": "Record in model notes."
 },
 {
  "calc_id": "E11",
  "v2_location": "s17 interactive model (HTML compute()) / economics.svg",
  "description": "Task model edge case: Fee at slider max 130",
  "inputs": [
   {
    "name": "saving_pct",
    "value": 25,
    "status": "assumption"
   },
   {
    "name": "new_cost",
    "value": 5,
    "status": "assumption"
   },
   {
    "name": "fee",
    "value": 130,
    "status": "assumption"
   },
   {
    "name": "labour_base",
    "value": 60,
    "status": "assumption"
   },
   {
    "name": "other",
    "value": 20,
    "status": "assumption"
   },
   {
    "name": "baseline_fee",
    "value": 100,
    "status": "assumption"
   }
  ],
  "formula": "cost = 60×(1−s/100)+20+newCost; profit = fee − cost; clientFeeSaving = 100 − fee; netSaving = 80 − cost",
  "output": {
   "labour": 45,
   "cost": 70,
   "agency_profit": 60,
   "client_fee_saving": -30,
   "net_task_saving_vs_base": 10
  },
  "reported_value": null,
  "verdict": "reconciles",
  "unit": "units",
  "currency": "",
  "period": "n/a",
  "measure_label": "single-task fee/cost model; output and quality fixed; no added sales; excludes tax, financing, media, working capital",
  "source_ids": [],
  "rounding_rule": "1 dp as the HTML prints",
  "limits": "Slider ranges: saving 0–75, new cost 0–20, fee 60–130. Reachable in the published control.",
  "v3_action": "Record in model notes."
 },
 {
  "calc_id": "E12",
  "v2_location": "s17 interactive model (HTML compute()) / economics.svg",
  "description": "Task model edge case: Saving at slider max 75%, no new cost, fee 100",
  "inputs": [
   {
    "name": "saving_pct",
    "value": 75,
    "status": "assumption"
   },
   {
    "name": "new_cost",
    "value": 0,
    "status": "assumption"
   },
   {
    "name": "fee",
    "value": 100,
    "status": "assumption"
   },
   {
    "name": "labour_base",
    "value": 60,
    "status": "assumption"
   },
   {
    "name": "other",
    "value": 20,
    "status": "assumption"
   },
   {
    "name": "baseline_fee",
    "value": 100,
    "status": "assumption"
   }
  ],
  "formula": "cost = 60×(1−s/100)+20+newCost; profit = fee − cost; clientFeeSaving = 100 − fee; netSaving = 80 − cost",
  "output": {
   "labour": 15,
   "cost": 35,
   "agency_profit": 65,
   "client_fee_saving": 0,
   "net_task_saving_vs_base": 45
  },
  "reported_value": null,
  "verdict": "reconciles",
  "unit": "units",
  "currency": "",
  "period": "n/a",
  "measure_label": "single-task fee/cost model; output and quality fixed; no added sales; excludes tax, financing, media, working capital",
  "source_ids": [],
  "rounding_rule": "1 dp as the HTML prints",
  "limits": "Slider ranges: saving 0–75, new cost 0–20, fee 60–130. Reachable in the published control.",
  "v3_action": "Record in model notes."
 },
 {
  "calc_id": "E13",
  "v2_location": "s17 interactive model (HTML compute()) / economics.svg",
  "description": "Task model edge case: Saving max, new cost max, fee min",
  "inputs": [
   {
    "name": "saving_pct",
    "value": 75,
    "status": "assumption"
   },
   {
    "name": "new_cost",
    "value": 20,
    "status": "assumption"
   },
   {
    "name": "fee",
    "value": 60,
    "status": "assumption"
   },
   {
    "name": "labour_base",
    "value": 60,
    "status": "assumption"
   },
   {
    "name": "other",
    "value": 20,
    "status": "assumption"
   },
   {
    "name": "baseline_fee",
    "value": 100,
    "status": "assumption"
   }
  ],
  "formula": "cost = 60×(1−s/100)+20+newCost; profit = fee − cost; clientFeeSaving = 100 − fee; netSaving = 80 − cost",
  "output": {
   "labour": 15,
   "cost": 55,
   "agency_profit": 5,
   "client_fee_saving": 40,
   "net_task_saving_vs_base": 25
  },
  "reported_value": null,
  "verdict": "reconciles",
  "unit": "units",
  "currency": "",
  "period": "n/a",
  "measure_label": "single-task fee/cost model; output and quality fixed; no added sales; excludes tax, financing, media, working capital",
  "source_ids": [],
  "rounding_rule": "1 dp as the HTML prints",
  "limits": "Slider ranges: saving 0–75, new cost 0–20, fee 60–130. Reachable in the published control.",
  "v3_action": "Record in model notes."
 },
 {
  "calc_id": "E14",
  "v2_location": "s17 interactive model (HTML compute()) / economics.svg",
  "description": "Task model edge case: Out-of-range: saving 100% (not reachable by slider)",
  "inputs": [
   {
    "name": "saving_pct",
    "value": 100,
    "status": "assumption"
   },
   {
    "name": "new_cost",
    "value": 0,
    "status": "assumption"
   },
   {
    "name": "fee",
    "value": 100,
    "status": "assumption"
   },
   {
    "name": "labour_base",
    "value": 60,
    "status": "assumption"
   },
   {
    "name": "other",
    "value": 20,
    "status": "assumption"
   },
   {
    "name": "baseline_fee",
    "value": 100,
    "status": "assumption"
   }
  ],
  "formula": "cost = 60×(1−s/100)+20+newCost; profit = fee − cost; clientFeeSaving = 100 − fee; netSaving = 80 − cost",
  "output": {
   "labour": 0,
   "cost": 20,
   "agency_profit": 80,
   "client_fee_saving": 0,
   "net_task_saving_vs_base": 60
  },
  "reported_value": null,
  "verdict": "reconciles",
  "unit": "units",
  "currency": "",
  "period": "n/a",
  "measure_label": "single-task fee/cost model; output and quality fixed; no added sales; excludes tax, financing, media, working capital",
  "source_ids": [],
  "rounding_rule": "1 dp as the HTML prints",
  "limits": "Slider ranges: saving 0–75, new cost 0–20, fee 60–130. NOT reachable by the published sliders; arithmetic only.",
  "v3_action": "Record in model notes."
 },
 {
  "calc_id": "E15",
  "v2_location": "s17 interactive model (HTML compute()) / economics.svg",
  "description": "Task model edge case: Out-of-range: saving −10% (labour rises; not reachable by slider)",
  "inputs": [
   {
    "name": "saving_pct",
    "value": -10,
    "status": "assumption"
   },
   {
    "name": "new_cost",
    "value": 0,
    "status": "assumption"
   },
   {
    "name": "fee",
    "value": 100,
    "status": "assumption"
   },
   {
    "name": "labour_base",
    "value": 60,
    "status": "assumption"
   },
   {
    "name": "other",
    "value": 20,
    "status": "assumption"
   },
   {
    "name": "baseline_fee",
    "value": 100,
    "status": "assumption"
   }
  ],
  "formula": "cost = 60×(1−s/100)+20+newCost; profit = fee − cost; clientFeeSaving = 100 − fee; netSaving = 80 − cost",
  "output": {
   "labour": 66,
   "cost": 86,
   "agency_profit": 14,
   "client_fee_saving": 0,
   "net_task_saving_vs_base": -6
  },
  "reported_value": null,
  "verdict": "reconciles",
  "unit": "units",
  "currency": "",
  "period": "n/a",
  "measure_label": "single-task fee/cost model; output and quality fixed; no added sales; excludes tax, financing, media, working capital",
  "source_ids": [],
  "rounding_rule": "1 dp as the HTML prints",
  "limits": "Slider ranges: saving 0–75, new cost 0–20, fee 60–130. NOT reachable by the published sliders; arithmetic only.",
  "v3_action": "Record in model notes."
 },
 {
  "calc_id": "G01",
  "v2_location": "not in V2 (V1 F06 / archive growth.csv); V2 R053 forbids a common axis",
  "description": "Peer growth observation: Publicis H1 2026 4.7%",
  "inputs": [
   {
    "name": "reported_rate_pct",
    "value": 4.7,
    "status": "inherited_archive_only",
    "note": "not in stored passage (PUB-S041 gives Q2 organic 4.8% only); archive PUBLICIS-FIN013"
   }
  ],
  "formula": "attributed company rate; not recomputable from public rounded inputs",
  "output": null,
  "reported_value": 4.7,
  "verdict": "cannot_recompute_here",
  "unit": "%",
  "currency": "EUR",
  "period": "H1 2026",
  "measure_label": "organic net revenue growth (company method) | scope: group; Lotame consolidated from Apr 2025",
  "source_ids": [
   "PUB-S015"
  ],
  "rounding_rule": "as reported (1 dp); no extra decimals",
  "limits": "growth.csv basis says \"Net revenue\" and omits \"organic\" — label error",
  "v3_action": "Present only as a dated bridge row with measure, period, currency, scope and method; never on a shared axis."
 },
 {
  "calc_id": "G02",
  "v2_location": "not in V2 (V1 F06 / archive growth.csv); V2 R053 forbids a common axis",
  "description": "Peer growth observation: WPP H1 2026 -4.7%",
  "inputs": [
   {
    "name": "reported_rate_pct",
    "value": -4.7,
    "status": "stored_passage",
    "note": "yes"
   }
  ],
  "formula": "attributed company rate; not recomputable from public rounded inputs",
  "output": null,
  "reported_value": -4.7,
  "verdict": "cannot_recompute_here",
  "unit": "%",
  "currency": "GBP",
  "period": "H1 2026",
  "measure_label": "like-for-like change in revenue less pass-through costs | scope: group",
  "source_ids": [
   "WPP-S003"
  ],
  "rounding_rule": "as reported (1 dp); no extra decimals",
  "limits": "LFL = constant currency and scope per WPP; not recomputable",
  "v3_action": "Present only as a dated bridge row with measure, period, currency, scope and method; never on a shared axis."
 },
 {
  "calc_id": "G03",
  "v2_location": "not in V2 (V1 F06 / archive growth.csv); V2 R053 forbids a common axis",
  "description": "Peer growth observation: Omnicom Q2 2026 6.1%",
  "inputs": [
   {
    "name": "reported_rate_pct",
    "value": 6.1,
    "status": "inherited_archive_only",
    "note": "not in stored passage; archive OMC-F031"
   }
  ],
  "formula": "attributed company rate; not recomputable from public rounded inputs",
  "output": null,
  "reported_value": 6.1,
  "verdict": "cannot_recompute_here",
  "unit": "%",
  "currency": "USD",
  "period": "Q2 2026",
  "measure_label": "organic growth, Core Operations perimeter; 2025 base combines OMC+IPG | scope: selected core perimeter",
  "source_ids": [
   "OMC-S036"
  ],
  "rounding_rule": "as reported (1 dp); no extra decimals",
  "limits": "quarter, not half; combined base not pro forma",
  "v3_action": "Present only as a dated bridge row with measure, period, currency, scope and method; never on a shared axis."
 },
 {
  "calc_id": "G04",
  "v2_location": "not in V2 (V1 F06 / archive growth.csv); V2 R053 forbids a common axis",
  "description": "Peer growth observation: Dentsu H1 2026 0.3%",
  "inputs": [
   {
    "name": "reported_rate_pct",
    "value": 0.3,
    "status": "inherited_archive_only",
    "note": "source not among the 49 checked"
   }
  ],
  "formula": "attributed company rate; not recomputable from public rounded inputs",
  "output": null,
  "reported_value": 0.3,
  "verdict": "cannot_recompute_here",
  "unit": "%",
  "currency": "JPY",
  "period": "H1 2026",
  "measure_label": "organic net revenue growth; changed perimeter | scope: group",
  "source_ids": [
   "DH-S018 (archive)"
  ],
  "rounding_rule": "as reported (1 dp); no extra decimals",
  "limits": "perimeter change noted in growth.csv",
  "v3_action": "Present only as a dated bridge row with measure, period, currency, scope and method; never on a shared axis."
 },
 {
  "calc_id": "G05",
  "v2_location": "not in V2 (V1 F06 / archive growth.csv); V2 R053 forbids a common axis",
  "description": "Peer growth observation: Havas H1 2026 2.5%",
  "inputs": [
   {
    "name": "reported_rate_pct",
    "value": 2.5,
    "status": "inherited_archive_only",
    "note": "source not among the 49 checked"
   }
  ],
  "formula": "attributed company rate; not recomputable from public rounded inputs",
  "output": null,
  "reported_value": 2.5,
  "verdict": "cannot_recompute_here",
  "unit": "%",
  "currency": "EUR",
  "period": "H1 2026",
  "measure_label": "organic net revenue growth | scope: group",
  "source_ids": [
   "DH-S042 (archive)"
  ],
  "rounding_rule": "as reported (1 dp); no extra decimals",
  "limits": "release mirror, not issuer page",
  "v3_action": "Present only as a dated bridge row with measure, period, currency, scope and method; never on a shared axis."
 },
 {
  "calc_id": "G06",
  "v2_location": "not in V2 (V1 F06 / archive growth.csv); V2 R053 forbids a common axis",
  "description": "Peer growth observation: Stagwell H1 2026 3.3%",
  "inputs": [
   {
    "name": "reported_rate_pct",
    "value": 3.3,
    "status": "stored_passage",
    "note": "yes (bridge 38,936/1,162,316)"
   }
  ],
  "formula": "38936/1162316×100",
  "output": 3.349863548294956,
  "reported_value": 3.3,
  "verdict": "reconciles",
  "unit": "%",
  "currency": "USD",
  "period": "H1 2026",
  "measure_label": "organic net revenue growth; method changed Q3 2025 | scope: group",
  "source_ids": [
   "ALT-S018"
  ],
  "rounding_rule": "as reported (1 dp); no extra decimals",
  "limits": "growth.csv shows 3 → chart 3.0 (false precision); use 3.3",
  "v3_action": "Present only as a dated bridge row with measure, period, currency, scope and method; never on a shared axis."
 },
 {
  "calc_id": "G07",
  "v2_location": "not in V2 (V1 F06 / archive growth.csv); V2 R053 forbids a common axis",
  "description": "Peer growth observation: S4 Capital H1 2026 -4.7%",
  "inputs": [
   {
    "name": "reported_rate_pct",
    "value": -4.7,
    "status": "inherited_archive_only",
    "note": "source not among the 49 checked"
   }
  ],
  "formula": "attributed company rate; not recomputable from public rounded inputs",
  "output": null,
  "reported_value": -4.7,
  "verdict": "cannot_recompute_here",
  "unit": "%",
  "currency": "GBP",
  "period": "H1 2026",
  "measure_label": "like-for-like net revenue change | scope: group",
  "source_ids": [
   "ALT-S029 (archive)"
  ],
  "rounding_rule": "as reported (1 dp); no extra decimals",
  "limits": "coincides numerically with WPP −4.7 on a different basis",
  "v3_action": "Present only as a dated bridge row with measure, period, currency, scope and method; never on a shared axis."
 },
 {
  "calc_id": "P01",
  "v2_location": "all growth figures",
  "description": "Precision rule: no precise organic/LFL rate from rounded inputs",
  "inputs": [],
  "formula": "n/a",
  "output": null,
  "reported_value": null,
  "verdict": "reconciles",
  "unit": "",
  "currency": "",
  "period": "",
  "measure_label": "rule",
  "source_ids": [],
  "rounding_rule": "Attribute the company rate at its published precision; recompute only reported changes from disclosed absolute figures; show one decimal when inputs are rounded to the nearest million.",
  "limits": "Stagwell 3.0% (V1) violated this; V2 R052 four-decimal percentages violate the spirit.",
  "v3_action": "Apply to R052 and any restored chart."
 },
 {
  "calc_id": "P02",
  "v2_location": "s04/R015; s11/R053",
  "description": "Precision rule: no smoothed twenty-year series from unlike measures",
  "inputs": [],
  "formula": "n/a",
  "output": null,
  "reported_value": null,
  "verdict": "reconciles",
  "unit": "",
  "currency": "",
  "period": "",
  "measure_label": "rule",
  "source_ids": [],
  "rounding_rule": "Historical anchors keep original label (revenue vs net revenue vs net sales vs gross profit), fiscal basis (Dentsu March-year vs calendar), currency and profit definition; gaps stay visible.",
  "limits": "V2 complies (dated anchors table, no line). V1 §16 anchors are archive and not freshly verified.",
  "v3_action": "Keep R053 statement; any V3 history figure is a dated-anchor table or separated snapshots."
 }
]
