Investment Plans workspace
Open raw ↗

V6 — INDEPENDENT VERIFICATION, BASELINE v2.0.0

I built none of this and I have taken no statement in it on trust. I read the 32 requirements out of project_data.REQ and then went to the artefacts themselves. I opened the delivered study with python-docx and extracted all 553 blocks and all 42 tables to text; I opened the delivered workbook twice with openpyxl, once for formulas and once for cached values, and dumped all fourteen sheets cell by cell; I opened the delivered Decision Pack with python-pptx and read every run and every table on all twelve slides. I re-derived the aged care contribution, the NDIS contribution, the 2.3x ratio, the trade study weighted scores, the sensitivity flip and the whole business-plan CBA from first principles in a scratch interpreter without importing the project's own result functions, then compared my numbers against the model, against the workbook's cached values, and against the study. I rendered BUSINESS_PLAN_A3.html in headless Chromium and printed it to PDF three ways. I extracted every one of the 177 distinct dollar figures in the study and matched them mechanically against every numeric cell in the workbook. I read model_agedcare.py, model_params.py, trade_study.py, build_business_plan_json.py, business_plan.json, BUSINESS_PLAN_A3.html, SYSTEM_BREAKDOWN.md, SOURCE_MANIFEST.json, Dashboard.html, 09_Help_Hub/index.html, 02_Work/scratch/T3_trade_study_weights.md, 02_Work/scratch/V4_agedcare_margin_verification.md, the checker source for C10, C27, C29, C34 and C36, and the REQ, SRC, ASM, ACT, DEC, COMPONENTS and METRIC_LINEAGE registers. I ran 01_System/checkers/run_checks.py once. I did not run build_all.py.

The arithmetic in this project is, with two exceptions, correct — I could not break the aged care model, the trade study or the CBA. What I could break is the gap between what the checkers measure and what the requirements say. Six of the nine failures below are cases where a check passes over a narrower artefact set than its requirement covers, and nobody noticed because the check's own PASS line reads like a proof.

Verdict table

RequirementVerdictEvidence you personally openedIf FAIL, exactly what is wrong
REQ-SYS-01PASSStudy Tables 5.1 and 18.1 give core supports $10,790.80, support coordination $3,673.20 and aged care $11,157.80; I traced every line to Costs B6:D13, SupportCoordination B14 and model_agedcare.ONE_OFF_COSTS, each row carrying SRC-025/027/028/030/031/034/036/041/065/066 or ASM-006; SIL/SDA carries DEC-005.—
REQ-SYS-02FAILStudy Table 20 gives core supports "Weeks 8-16 … First invoice"; ASM-015 sets month 4. Nothing else.Neither support coordination nor SIL/SDA carries any elapsed month-count from incorporation to first revenue. Support coordination has only "the fastest line to first revenue" (trade_study.py option C) with no figure. SIL/SDA has a registration lead time (9-12 months, SRC-021) but no time to first revenue, and REQ-SYS-02 — unlike REQ-SYS-01 and REQ-SYS-10 — carries no DEC-### exclusion branch.
REQ-SYS-03PASSDEC.csv DEC-004 records "WEIGHTS FIXED AND RECORDED AT 2026-08-20T09:40 AEST … (scores recorded at 2026-08-20T11:05 AEST)" — weights block precedes scores block. Study Table 12 shows three alternatives; the sensitivity names the flipping weight (addressable market above ~55%); rationale present. I re-derived A1 2.85, A2 4.05, A3 2.30 by hand and they are correct.— (see defect 6 on the lawfulness of alternative A3)
REQ-SYS-04PASSStudy Table 13: core supports 3.30, support coordination 3.70, SIL/SDA 2.20 against six identical criteria and weights; I recomputed all three by hand and they are correct. Table 14 states the sensitivity (regulatory stability 25%→40% flips to core supports 3.45 v 3.40; I verified that flip arithmetically).—
REQ-SYS-05PASSWorkbook UnitEconomics!B11 is =SUM(B5:B10) where B5 = Inputs!$B$5 (SRC-002, 73.58) and B6:B9 are -Inputs!$B$8 times Inputs!$B$10/$B$11/$B$12 (SRC-009, SRC-011, SRC-012, SRC-013). Cached value 21.30424. No constant anywhere in the chain.—
REQ-SYS-06FAILStudy Table 4.1, sixteen rows, columns Obligation / Authority / Cost / Lead time / Source.Two independent grounds. (a) There is no frequency field at all, and the criterion names it explicitly; rows such as ABN, TFN/GST/PAYG, myID+RAM and the Worker Orientation Module carry no frequency in any cell. (b) The requirement says every Victorian and Commonwealth obligation, and the study now covers two businesses — but no equivalent table exists for the aged care entity. The Aged Care Quality and Safety Commission registration is priced ($600–$3,000, SRC-065) yet its lead time appears nowhere in the delivered set, and aged care worker screening (SRC-057) never reaches an obligations table at all.
REQ-SYS-07PASSWorkbook Scenarios rows 37-45: the downside scenario carries a formula-driven month-by-month cumulative cash line from -11,638.13 to -20,958.80, and the single runway figure -$20,958.80 reconciles to 10,790.80 + 847.33 × 12 which I computed independently.—
REQ-SYS-08PASSStudy Table 19 lists five items, each naming a register ID (ASM-008, ASM-002, SRC-002, ASM-015, SRC-049); at least three also name the checkable party — "a real provider", "you", "government publishes".—
REQ-SYS-09FAILStudy section 10 Table 20, eleven sequenced rows, explicitly labelled "This roadmap is CONDITIONAL".It does not sequence every dependency named in REQ-SYS-06. WorkCover registration with WorkSafe Victoria and registration as an employer under the Portable Long Service Benefits Scheme are both in Table 4.1 and both absent from the roadmap — you cannot lawfully run the first pay run without them, and the roadmap runs a pay run at "Weeks 5-8". The Working with Children Check is also absent.
REQ-SYS-10PASSBreakEven!B6 = =Costs!$C$28/UnitEconomics!$B$16 → 39.77; B7 = =Costs!$C$28/UnitEconomics!$B$14 → 126.53; SupportCoordination!B13 = =Costs!$C$28/Inputs!$B$7 → 8.46; aged care 1.0 client from model_agedcare.breakeven_clients() (993.17/1002.06 = 0.991, which I recomputed). SIL/SDA excluded by DEC-005 and named in Table 5.1.—
REQ-SYS-11PASSBreakEven!B12 = =Drivers!$B$14*(Inputs!$B$8*(1+...))*(Drivers!$B$6/30) → 7,318.61. Wage rate, hours driver and the ASM-007 payment lag are all live cell references, not constants. Aged care $4,173.20 is derived in model_agedcare.working_capital(), which I re-ran.—
REQ-SYS-12FAILStudy Table 3 finding 7, Table 3.1, Table 15 and RSK-001 all state the July 2027 consequence for core supports and give the cost to be ready ($3,500–$6,000 audit plus $649–$1,825 manual). SIL/SDA carries "registration already mandatory" plus $8,600–$16,900.Support coordination carries no stated July-2027 consequence and, critically, no cost to be ready. The SupportCoordination sheet does the opposite: B14 explicitly zeroes the audit and the policy manual "because mandatory registration for support coordination is currently PAUSED". A paused regime is not a cost to be ready; it is the absence of one.
REQ-SYS-13FAILTen diagrams D1-D10 exist in 02_Work/diagrams/ and I confirmed ten image relationships embedded in the delivered docx.All ten are Part I. Part II (sections 14-19) contains no diagram at all, and it describes two things the criterion names: the aged care operating mechanism in section 15 ("the price is not capped but the pot is") and the two-entity dependency structure in section 17, both in prose and tables alone. Checker C12 only counts files on disk against images embedded; it never tests "every process narrative has a corresponding image artefact", so it cannot detect this.
REQ-SYS-14PASSI read the HLP-10 table in 09_Help_Hub/index.html directly. All nine GOV-G3.4 symptoms are present as real symptom/cause/check/fix rows: dead link, chart empty, dashboard blank, register will not open, two documents disagree, #NAME?, wrong version, phone view, conflict copy. Count = nine.— (see defect 7 — two of those rows state facts that are false)
REQ-SYS-15PASSDashboard.html carries "GENERATED FILE … Rebuilt from 01_System/project_data.py by 01_System/build_web.py"; it is the only dashboard in the tree; the nine tile values (47, 26/32, 10, 23/73, $21.30, $6.70, -$2.07, $15,875, $7,319) all come from generated register/model values, none hand-entered.—
REQ-SYS-16PASSNine tiles carry data-metric attributes; I matched each against 03_Registers/METRIC_LINEAGE.csv, which gives Metric / What this number means / Formula in words / Source data / As at / Owner for all seventeen rows with no blanks. Metrics-without-lineage = 0.—
REQ-SYS-17PASSI ran the suite myself. C22 PASS — "15 pack files re-derive from their sources". C23 PASS — "C22 detected a deliberate one-line tamper in HANDOVER.txt and the file was restored". The negative test demonstrably fails on demand.—
REQ-SYS-18PASSI parsed 03_Registers/SRC.csv: 50 of 73 rows sit below High confidence and the 'Why below High' field is non-empty on all 50 (I tested for empties, not for the checker's word).—
REQ-CON-01PASSC05 reports 0.975 over 285 material figures with 7 unmatched; I opened all seven and they are internal arithmetic (123 = 45+78, 1,849 = 649+1,200, 5,325 = 1,825+3,500, 406.39 = 87.64+318.75, 20,959 = the downside runway, 16,900 = the SIL band) or an HTTP status code (403), not external claims. Zero material external claims lack a SRC reference.— (see defect 5 — one figure's citation resolves to a source row that does not contain it)
REQ-CON-02PASSI grepped the extracted study for New South Wales, Queensland, South Australia, Western Australia, Tasmania, Northern Territory, NSW and QLD: zero hits. Every jurisdiction-dependent obligation — worker screening, WWCC, WorkCover, portable LSL, payroll tax, disability worker registration — names Victoria.—
REQ-CON-03PASS73 SRC rows: 53 accessed 2026-08-20, 20 accessed 2026-09-07, against a currency date of 2026-09-07. None later than the currency date; the oldest is 18 days earlier, inside the 90-day window CR-007 set.— (see defect 8 — the workbook README contradicts this)
REQ-CON-04FAILI ran my own script over all three delivered Office artefacts, not just the one C29 opens.The Decision Pack carries eight text runs at 9.0pt (slides 2, 3, 4, 5, 6, 7, 8, 9 — every source footer). The workbook carries 145 cells at 9.0pt across all fourteen sheets, and three sheets exceed six columns: Scenarios (14), Costs (7), TradeStudy3 (7). C29 opens only NDIS_and_Aged_Care_Business_Enabling_Study_v2.0.docx, so its PASS line — "1475 text runs measured, none below 10pt; 42 tables, none above six columns" — is true of one artefact and reported as if it settled a requirement that says "every delivered Office artefact".
REQ-CON-05PASSI parsed 03_Registers/ASM.csv: 31 rows, zero with an empty Confidence field, zero with an empty 'What breaks if it is wrong' field. 26 Low, 5 Medium — which matches the study's own Table 12.1 caption.—
REQ-CON-06PASSI ran my own regex scan for email addresses, Australian mobile numbers and ABN-shaped identifiers across every .html, .md, .csv, .json, .txt and .py in the controlled set: zero hits outside the quoted governance standard text. C08 agrees.—
REQ-MOE-01FAILI read all thirteen rows of 03_Registers/ACT.csv.ACT-010 ("Before the sixth client") and ACT-012 ("Before the tenth client") carry an event trigger in the Due column, not a due date. ACT-010 blocks "the aged care revenue projection and the ordering in DEC-007" — DEC-007 is the go/no-go. The criterion says "an ACT-### with an owner and a due date". This is the narrowest failure in this report and one edit closes it. Separately, seven of the thirteen actions are already past their stated due date.
REQ-MOP-01PASSI re-implemented C27's unit extraction independently and got 131 units carrying a dollar figure, 128 attributed, ratio 0.9771 — above 0.90. The three unattributed units are the DEF-001/DEF-002/DEF-005 defect-history rows.—
REQ-AC-01PASSI rebuilt $1,002.06 from scratch: $30,000/12 = $2,500; less 10% (SRC-063) = $2,250 service revenue; ÷ $103.11 (SRC-060) = 21.82135 hr; × ($43.03 × 1.1545) = $1,084.04 labour; + $250 pool; less 1.5 × ($50.61 × 1.1545) = $87.64; less 5.4553 × $58.429 = $318.75; less $7.50 bad debt = $1,002.06. And $435.30: 65 hr × $73.58 = $4,782.70; less 65 × $52.27576 = $3,397.92; less 16.25 × $58.429 = $949.48 = $435.30. Ratio 1002.06/435.30 = 2.30199 → 2.3. Both figures are in Table 15.3; workbook AC_ClientEconomics!B17/C17 cache 1002.06053495854 and 435.300368749999, matching the model to the cent; C37 compares fifteen such figures.— (see defect 4 — "on the same basis" is only partly true)
REQ-AC-02FAILStudy Table 15.2 and workbook AC_ClientEconomics A22:D27 give six computed rows from $12,000 to $78,106, every cell a live formula. The rows are genuinely computed — I verified $348.24 and $2,749.44 by hand.The criterion requires the table to span at least the bottom and top ongoing classifications. The top is right ($78,106 = Level 8). The bottom row is $12,000, which is not a classification — model_agedcare.INPUTS["budget_level_1"] and SRC-064 both give the bottom ongoing classification as $10,731. The model computes hours_bottom_classification_week = 1.80 for it and the delivered study never shows that row, even though the workbook's own AC_Inputs note advertises it ("At the advisory price this buys about 1.8 service hours a week"). The study's weakest classification is therefore softer than its own model's.
REQ-AC-03PASS$606.50 / $7,278.00 / $22,578.00 all appear in the study (Table 3 finding 6 gives all three; Table 17.1 gives the monthly and the three-year) and in business_plan.json (value_proposition.benefits[3].target, areas_of_concern[4], value_validation.conditions[4]). All three derive from model_agedcare.structure_comparison(); workbook Structure!D5, D7 = =D5*12, D8 = =D5*36+D6. I recomputed 606.50 = 78+300+200+342/12 and 22,578 = 606.50×36 + 744.—
REQ-AC-04PASSStudy Table 29 states the mechanism (dual care-management 15-20% plus package-management 10-15% replaced by a single 10% pool, against cost bases built for the old structure), cites the independent pass by name ("an independent verification pass was run specifically to resolve it (V4)"), and names the falsifying early warning ("the DIRECT-SERVICES line turning negative in the quarterly sector report — not the total result"). I opened V4_agedcare_margin_verification.md and confirmed the $16.10 pcd is derived there from quoted StewartBrown text ($63.85 revenue less $47.75 cost), not asserted.— (see defect 5 — no SRC row carries that figure)
REQ-BUS-01FAILThe twin exists; the A3 page carries "12/12 checks" and is same-minute current with the twin; C33 passes. I re-derived the whole CBA independently and it reconciles exactly: costs 21,948.60 + 66,258.00 + 7,520.00 + 180,000.00 = 275,726.60; benefits 11,110 NDIS hours × $6.70 + 345 aged care client-months × $1,002.06 = 420,147.70; net 144,421.10; ROI 52.4%; break-even month 17 with opportunity cost, month 10 on cash. All match business_plan.json to the cent.The rendered page does not fit one A3 landscape sheet. I loaded it in headless Chromium and printed it three ways — format=A3, landscape=True (2 pages), prefer_css_page_size=True honouring the file's own @page{size:A3 landscape;margin:8mm} (2 pages), and zero margins (2 pages). Page 2 is not a sliver: it carries 8,127 characters — sections 7, 8, 9 and the whole value-validation verdict block, more text than page 1. C34 passes because it measures a DOM div's scrollHeight in a 1600px screen viewport (1,103px of content in a 1,123px box) and never invokes the print engine. The requirement says "as measured in a browser"; the browser's own paginator says two sheets.
REQ-WEB-01PASSSYSTEM_BREAKDOWN.md section 5 declares the slot with an explicit status — "SLOT DECLARED, NOT BUILT" — and names the three binding constraints; BKL-011 carries it in the backlog; REQ-WEB-01 is scoped to component C1 in COMPONENTS.csv. My own credential scan across every generated artefact returned zero hits, as did C08.—

Defects found

1. The A3 business plan is a two-page document called a one-page document, and the check that says otherwise measures the wrong thing. What is wrong: BUSINESS_PLAN_A3.html prints to two A3 landscape sheets in Chromium under its own @page rule, at zero margins, and at browser-default margins. C34 measures document.querySelector('.sheet') height with style.height='auto' in a 1600×1200 screen viewport and reports "20 px to spare"; I reproduced that measurement exactly (held 1123, wanted 1103) and it is simply not a test of pagination — the DOM height is identical under emulate_media('print'), yet the printed output splits inside the three-column masonry. Why it matters: REQ-BUS-01 is the one requirement whose criterion explicitly says "as measured in a browser", precisely to stop this being asserted. The check was written to close a prior instance of this exact defect (its own docstring says the first build ran to 2,169px) and it closed the symptom, not the mechanism. What would fix it: make C34 call page.pdf(...) and fail on len(PdfReader(...).pages) > 1. Then fix the layout — the .sheet is 420mm×297mm inside an 8mm-margin @page, so it cannot fit even before the column fragmentation.

2. REQ-CON-04 is enforced over one of three delivered Office artefacts. What is wrong: C29 opens only the .docx. The delivered .pptx has 8 runs at 9.0pt; the delivered .xlsx has 145 cells at 9.0pt and three sheets wider than six columns (Scenarios 14, Costs 7, TradeStudy3 7). Why it matters: the requirement says "every delivered Office artefact". A green check over a subset is worse than no check, because the DoD in Appendix A cites C29's measured counts as the evidence for gate 13. What would fix it: extend C29 to iterate 05_Outputs/*.docx, *.pptx and *.xlsx, and then either raise the small type or record a waiver — there is currently no WVR row and the register is empty by design.

3. Two artefacts state different values for the same named quantity: the modelled three-year net. What is wrong: trade_study.py line 79 scores option D on "The modelled three-year net forgone is $145,621", and ASM-029 (in project_data.py line 1574, projected into both 03_Registers/ASM.csv and 00_Handover/ASM.csv) uses the same $145,621. The business plan computes $144,421.10 and repeats it three times, and the A3 page and value_validation both carry $144,421.10. The difference is $1,199.90. Why it matters: $145,621 is not produced by any function in the project — I re-derived the CBA and got 144,421.10 exactly. It is a stale constant carried into a trade study score rationale, and the whole point of trade_study.py's design is that "every score cites the figure it rests on". Here the figure it rests on does not exist. C09 compares twelve figures across artefacts and this was not one of them. What would fix it: compute it from build_business_plan_json's net rather than typing it, in both places.

4. The "same basis" comparison is not on the same basis, and the trade study's capital rationale misdescribes its own numbers. What is wrong: (a) The aged care side of Table 15.3 carries a care-management revenue line and a bad-debt line the NDIS side does not, and compares a budget-capped 5.04 hr/week client against an assumed 15 hr/week NDIS client (ASM-025, Low confidence) — ASM-025 itself concedes "At 34 hours a week the two contributions are equal", so the headline 2.3x is a statement about the assumed hours as much as about the sectors. The study discloses this in prose; the criterion for REQ-AC-01 does not test it, which is why I passed the requirement and am recording it here instead. (b) trade_study.py scores option C's capital 5/5 on "$3,673 one-off and an $8,757 six-month runway — under a quarter of either operating business". It is not: $3,673 is 34% of the NDIS $10,791 and 33% of the aged care $11,158, and $8,757 is 55% and 51% of the two six-month runways. The score may still be right; the figure cited to justify it is wrong by a factor of two. What would fix it: state the comparison's asymmetry inside Table 15.3 rather than only in the surrounding prose, and correct the option-C rationale to the ratio the model actually produces.

5. The number that reconciles the aged care paradox is in no source register row. What is wrong: "$16.10 per client per day" carries the whole of REQ-AC-04 — it appears in study finding 5, Table 29, RSK-011, deck slide 9 and the business plan mitigation, each time cited as "[SRC-068 …]". SRC-068's Value field is "Aged Care Financial Performance Survey, March 2026, Support at Home results". It contains no figure. No SRC row anywhere carries $16.10, $63.85 or $47.75. Why it matters: C36 checks that every cited identifier exists; it does not check that the cited row contains the figure. The project's own C36 docstring warns that "a citation that resolves to nothing is worse than no citation" — this is the same failure one level down. The derivation is real (V4 quotes the primary text and does the subtraction honestly, and explicitly refuses to convert it to a $/hour figure it cannot evidence), but a scratch verification file is not the source register. What would fix it: add an SRC row carrying $63.85 and $47.75 pcd from SRC-068's PDF, and cite that.

6. The T3 weights record cannot evidence its own ordering, and the file system contradicts it. What is wrong: 02_Work/scratch/T3_trade_study_weights.md states "Timestamp: 2026-09-07T06:22:16Z" and "Nothing below this line existed when the timestamp above was taken" — then contains the scored results below that line, in the same file. Its mtime is 06:23:22. trade_study.py's mtime is 06:23:07. The weights record was last written fifteen seconds after the scores file. The manifest hash-gates it at 06:38:43, long after both. Why it matters: GOV-B6.3's whole content is the ordering, and under GOV-C3.2 the builder's statement about that ordering carries zero weight. A single file that contains both the weights and the scores, whose only ordering evidence is a line of prose inside itself, is exactly the "justification, not a trade study" the file's own text warns against. Note the contrast: DEC-004 and DEC-003 do it properly, recording weights at 09:40 and scores at 11:05 as separate register fields. What would fix it: split the record into a weights file and a results file, and let the results file's mtime be the later one. (Separately: alternative A3 in trade study 1, "Remain unregistered indefinitely", is by the study's own SRC-015 unlawful for a core-supports business from July 2027, so the three-alternative count leans on one option that cannot be adopted for the period the study models.)

7. The Help Hub and the Dashboard are Part-I surfaces that were not updated for Part II, and two Help Hub entries state facts that are false. What is wrong: HLP-10 tells a user diagnosing "two documents give different numbers" to "Check the as-at date on both. Every artefact in this project carries 20 August 2026" — every artefact carries 7 September 2026 and v2.0.0. It tells a user chasing a dead source URL that "Every row says 20 August 2026" in SRC.csv — twenty of the seventy-three rows say 2026-09-07. HLP-03's register table describes DEF as "Three raised, three closed" beside a count of 24. HLP-05's fifteen-minute reading route sends the reader to sections 1, 9, 5.2, 7 and 13 — entirely Part I — and never mentions the aged care business, section 16 or the recommendation that actually stands; it also says section 1 has "Six findings" where the delivered study has seven. The Dashboard's "Capital at risk before first revenue" tile reads $15,875 (the NDIS entity alone) while the study's headline for the same concept is $44,483–$52,848, and no aged care metric appears on the dashboard at all, though METRIC_LINEAGE carries four. Why it matters: C10 matches the nine failure modes by regex against wording, so wording that is present but false passes. The status surface a stranger opens first tells them the capital at risk is a third of what the study says it is. What would fix it: drive those sentences from CURRENCY_DATE and the register counts instead of typing them, and add the combined capital and the per-client contribution to the dashboard.

8. The delivered workbook's own README makes three false statements about the workbook. What is wrong: it is titled "NDIS Business Enabling Study — Financial Model v1.0" on a file delivered as v2.0; it says "CURRENCY | Every external figure was verified on 2026-09-07" when 53 of 73 sources were verified 2026-08-20 (and then says "re-verify before 2027-08-20", which is twelve months from the other date); and it says "Nothing in this workbook is a typed-in result", which is untrue of the Combined sheet (B5:C9 are all typed constants copied from the models, only D5:D11 are formulas) and the Structure sheet (B5, C5, B6, C6 typed). Why it matters: the second statement is the exact falsification that CR-007 amended REQ-CON-03 to prevent — "the project could only stay green by pretending the older sources had been re-read". The amendment fixed the register and left the claim standing inside the delivered artefact. What would fix it: generate the README's currency sentence from CURRENCY_DATE and the SRC accessed-date distribution, and either wire Combined and Structure to the other sheets or drop the "nothing is typed in" claim.

9. The study contradicts its own computed sensitivity table on what happens at a $20,000 budget, and the $90,000 opportunity-cost figure is wrong. What is wrong: (a) Study finding on page 1 and ACT-010 say "At $20,000 the contribution per client falls by a third" (the model says 36%, consistent). Study Table 37, business_plan.json.value_validation.what_would_change_this and the A3 page all say "An average assessed classification budget below $20,000 a year, which halves the aged care contribution per client". Halving happens at roughly $16,200, not $20,000 — the study's own Table 15.2 shows $20,000 → $638.83 against $1,002.06. The same document says "a third" and "a half" about the same threshold. (b) ASM-028 and the study's ACT-013 box both say "At $90,000 a year of foregone income the three-year return falls from 53 per cent to roughly 10 per cent". Substituting $90,000 into the plan's own CBA gives total cost $365,726.60, net $54,421.10, ROI 14.9% — and the base is 52.4%, not 53. ACT-013 describes this as "the one input that changes the verdict", so the number carrying it should be computed, not estimated. What would fix it: compute both sensitivities from build_business_plan_json and emit them, rather than writing them in prose.

10. Smaller things I would still record. build_business_plan_json.py line 186 emits "baseline": "NDIS $%s" % f"{ac_contrib_client_paid and NR and 0 or 0}" — which always evaluates to 0 — and is silently repaired 250 lines later by a patch at the end of build(). The delivered JSON is correct only because of that patch; any refactor that drops it ships "NDIS $0" onto the A3 page. The quantitative_benefits figure uses the rounded $6.70 rather than $6.69692875, overstating three-year benefits by $34.12 (immaterial, but it is why the number is 420,147.70 rather than 420,113.58). The CBA excludes the support coordination line entirely while revenue_model projects $246,660 of it over three years and the recommendation tells the owner to run it — the two blocks are on different bases, and the support coordination year_projection is net of fixed cost while the other two rows are gross revenue. Study Table 5.1 cites "$8,757 … [Financial Model, SupportCoordination sheet]" for a six-month runway figure that sheet does not contain. The SIL/SDA band "$8,600 to $16,900" is not reproducible from the components it names. Deck slide 12 uses Windows backslash separators in its file paths, and slides 7, 8 and 9 are all numbered "07". BUSINESS_PLAN_A3.html names two different OWNER generators — portable/templates/business_plan/build_business_plan.py in the head comment and build_business_plan_json.py in the footer. The workbook's AC_Inputs row for the Schedule F Level 3 rate says it is "used for care management and administration time" when the model deliberately uses the SACS rate instead (ASM-031, stated three rows below on the same sheet).

11. The 26 "Verified" statuses rest on a verification of a different artefact set. What is wrong: IV_VERDICT marks 26 requirements PASS, sourced to V3_closing_verdict.md, "independent verification pass 4, 2026-08-20". Every delivered artefact was rebuilt on 2026-09-07 with Part II, sections 14-20, tables 24-38 and the aged care registers added. C31 checks that the register agrees with IV_VERDICT; it does not check that IV_VERDICT was taken against the current baseline. Why it matters: nine of the failures in my table above are in artefacts that carry a v2.0.0 baseline stamp and a 20 August verdict. The mechanism that removed self-certification is sound; it simply has no staleness test. What would fix it: record the baseline each verdict was taken against, and have C31 fail when a requirement's verdict predates the baseline it is claimed for. This report supplies the v2.0.0 verdicts.

What I could not verify, and why

Disclosure of my own footprint. Running 01_System/checkers/run_checks.py, as I was invited to, rewrote 01_System/checker_run_log.txt. My first command imported project_data without sys.dont_write_bytecode, which created 01_System/__pycache__/project_data.cpython-311.pyc — that directory is the entire content of the C35 FAIL in the run above, and it is mine, not the build's. python 01_System/tidy.py clears it. I modified no other file and did not run build_all.py.

Closing verdict

23 of 32 requirements PASS.