Church Bylaws Generator: resolution of the 2026-09-25 adversarial reviews
- Editor: Claude Fable 5.1 (rules editor; not the author of any of the three reviews)
- Date: 2026-09-25
- Reviews resolved:
bylaws-2026-09-25-opus.md: 25 findings (R-01–R-25)bylaws-2026-09-25-fable.md: 23 findings (C-01, M-01–M-13, m-01–m-09)bylaws-2026-09-25-codex.md: 20 findings (F1–F20)
- Files rewritten:
sources/bylaws/rules.yaml(54 → 69 rules),clause-library.yaml(43 → 50 clauses; a declared input model of 60 inputs + 64 derived variables),test-cases.yaml(23 → 44 cases, 110 evaluated cases/subcases),open-questions.md. New:sources/bylaws/validate.py(mechanical checker; not app code).
Totals: 66 FIXED · 0 REJECTED · 2 REFER (68 findings). One sub-claim inside a FIXED finding (R-05) is rejected against the verbatim statute; see the row.
Primary sources opened in this pass
| Source | URL | What it established |
|---|---|---|
| CNCA s. 2 | https://laws-lois.justice.gc.ca/eng/acts/C-7.75/section-2.html | "special resolution means a resolution passed by a majority of not less than two thirds of the votes cast on that resolution"; "ordinary resolution means a resolution passed by a majority of the votes cast"; s. 2(5.1) still summary only. |
| CNCA s. 128 | .../section-128.html | 128(3) members elect for "a term expiring within the prescribed period"; (4) differing terms; (5) default one-AGM term; (6) hold-over; (8) up to one-third appointed directors if the articles provide. No ex officio mechanism. |
| CNCA s. 133 | .../section-133.html | 133(3): number within a range fixed "by ordinary resolution" or delegated. |
| CNCA s. 141 | .../section-141.html | Mandatory written/minuted disclosure; voting bar with the remuneration / indemnity / affiliate exceptions. |
| CNCA s. 142 | .../section-142.html | Directors designate offices and appoint "persons of full capacity"; officers need not be directors. |
| CNCA s. 151 | .../section-151.html | Indemnity conditions (3), mandatory indemnity (5), insurance (6). |
| CNCA s. 152 | .../section-152.html | (1)–(6) verbatim: effective from directors' resolution; ceases if not submitted/rejected; repeat resolution needs confirmation; member proposals. |
| CNCA ss. 156, 157, 158 | .../section-156.html, -157, -158 | Default termination events; rights cease; discipline power only for "the directors, the members or any committee of directors or members" and must set out circumstances and manner. |
| CNCA s. 159 | .../section-159.html | (4) electronic participation unless by-laws say otherwise; (5) entirely electronic meeting only "if the by-laws so provide". |
| CNCA s. 160 + Reg. s. 61 | .../section-160.html; .../regulations/SOR-2011-223/section-61.html | AGM: 18 months; then 15 months after the last AGM and 6 months after year-end. |
| CNCA s. 163 | .../section-163.html | Proposals in the notice; director nominations at the prescribed percentage; floor nominations preserved. |
| CNCA s. 167 + Reg. s. 72 | .../section-167.html; Reg. FullText | Requisition at "the prescribed percentage ... or a lower percentage that is set out in the by-laws"; 5 %. |
| CNCA s. 171 + Reg. s. 74 | .../section-171.html; .../SOR-2011-223/section-74.html | By-laws "may provide for any prescribed methods"; methods: proxy, mailed-in ballot, telephonic/electronic, each with the verify-but-anonymous system condition. |
| CNCA ss. 188, 189 | .../section-188.html, -189 | Designated corporation: review by default, audit on ordinary resolution; non-designated: audit, or review by special resolution for a soliciting corporation at/below the prescribed amount. |
| CNCA s. 197 | .../section-197.html | 197(1)(a)–(n) verbatim, incl. (h) transfer of membership. |
| CNCA s. 235 + Reg. s. 37 | .../section-235.html; .../SOR-2011-223/section-37.html | 235(1)(c)(i) "donations or gifts ... requested from any person who is not" an insider; Reg. 37: 60 months / $10,000 in any financial year. |
| CNCA Regulations (FullText + ss. 16, 61, 74) | https://laws-lois.justice.gc.ca/eng/regulations/SOR-2011-223/FullText.html | s. 16 ($10,000; last FY; from first AGM to third AGM); s. 28(1) four years; s. 65 (5 %); s. 70 (quorum must be a number, percentage or formula); s. 80 ($50,000 / $1,000,000); s. 84 ($250,000). |
| ONCA (in-browser, JS-rendered) | https://www.ontario.ca/laws/statute/10n15 | ss. 1(1), 17(1)–(6), 18(1), 22(1)–(2), 23(1)–(5), 24(1)–(5), 26(1), 41(1)–(6), 46(1)–(6), 47(1)–(2), 48(1)–(3), 51(1)–(5), 52(1), 53(1)–(6), 55(1)–(1.1), 57(1)–(4), 58(1)–(3), 60(1), 64(1)–(1.1), 66(1)–(2), 67(1), 68(1), 76(1)–(4), 103(1)–(4) captured verbatim and quoted in rules.yaml. |
| O. Reg. 4/01 (Charities Accounting Act), s. 2.1 (in-browser) | https://www.ontario.ca/laws/regulation/010004 | s. 2.1(4): "This section does not authorize any of the following: 1. Remuneration or other direct or indirect payment for services provided by a director as a director or employee of the corporate trustee, as the case may be, in that capacity." s. 2.1(7): at least four other voting directors. |
| Relied on from the reviews' own verbatim fetches (not re-fetched; consistent with the first pass) | CNCA ss. 7(1)(a)–(g), 7(4), 125, 179; Reg. s. 63(1)(c)–(d); IRS Articles Third/Fifth/Sixth; Pub 557 "Bylaws alone aren't organizing documents". | Listed as OQ-19. |
Not reached (still open): CNCA s. 2(5.1) verbatim (OQ-03r), s. 7(5) (OQ-04), Reg. ss. 71 and 74(2) detail (OQ-18, OQ-15), ONCA ss. 56 and 84, the Charities Accounting Act itself, CRA CPS-024 and directors'-remuneration guidance, CRA model purposes/dissolution wording, Texas BOC, natural-justice case law.
Mechanical check
python sources/bylaws/validate.py — parses the three YAML files; resolves every clause→rule and test→rule reference; checks every {{variable}} and {{#flag}} against the declared inputs/derived (section flags must be bool-typed, which structurally prevents "vote by none"); for each of the 110 evaluated cases merges defaults ⊕ inputs, computes the clause set and the single matching variant per clause, renders every selected clause, and asserts the case's expectations plus the BL-TC-23 invariants (no placeholder, no raw enum slug, no "one 3th" / "at least simple" / "State of .", no articles content in the by-law body). It also fails if any clause is never asserted by a test, and carries two positive controls (an enum used as a section flag and an undeclared variable must be caught). Output of the final run is appended at the end of this file.
Resolutions: Opus review (R-01–R-25)
| Finding | Resolution | What changed / why | Source |
|---|---|---|---|
| R-01 (crit) CL-EFFECTIVE misstates s. 152; no adoption path for a replacement by-law | FIXED | CL-EFFECTIVE now has four variants: text_ca_replacement (whole by-law adopted by special resolution of the Members, because a replacement always changes s. 197(1) content), text_ca_new_board (effective from the Board resolution per s. 152(3), with the special-resolution sections carved out until the Members adopt them), text_ca_new_members_only, text_us. New input adoption_context (default replacing_existing). CA-FED-03 rewritten with 152(3)–(6) verbatim. Tests BL-TC-24, BL-TC-25. | CNCA s. 152(1)–(6); s. 197(1); ONCA s. 17(1)–(5) |
| R-02 (crit) Board-amendment clause omits transfer (h) and class rights (f) | FIXED | CL-AMEND-BOARD-THEN-MEMBERS text_ca_fed excludes every s. 197(1) by-law matter by name (conditions, class creation and rights, transfer of memberships, director range, notice, absentee voting) and by reference to s. 197(1); text_ca_on excludes exactly 103(1)(g), (k), (l) per s. 17(1). BL-TC-01 and BL-TC-04 assert the word "transfer". | CNCA ss. 152(1), 197(1)(f),(h); ONCA s. 17(1) |
| R-03 (crit) absentee-voting method handed to the Board | FIXED | CL-VOTING-MEMBERS writes the method and the full procedure (ballot with the notice, sealed return / anonymous electronic tally, two scrutineers, combined count reported and minuted) into the by-law and says the method changes only by special resolution of the Members. Rule CA-FED-21 added (s. 171 + Reg. s. 74 verified). BL-TC-26. | CNCA s. 171(1); Reg. s. 74(1); s. 197(1)(m) |
| R-04 (maj) designated corporations get a REVIEW by default | FIXED | CL-AUDIT-CA-FED restates ss. 182, 188, 189 in order: unanimous dispensation; review by default with audit on ordinary resolution; audit for non-designated, with the s. 189(2) special-resolution review option (now with the $250,000 figure). CA-FED-12 rewritten to high confidence. BL-TC-02, BL-TC-37. | CNCA ss. 179, 182, 188(1)–(3), 189(1)–(3); Reg. ss. 80, 84 |
| R-05 (maj) s. 235(1)(c) ignored | FIXED (sub-claim rejected) | kind is dynamic: mandatory for a registered charity or soliciting/unsure, recommended ("required for CRA registration") for intends, recommended-on otherwise, with an explainer stating the 60-month / $10,000 test (Reg. s. 37). The soliciting question now covers the last five financial years so it answers (c) as well. BL-TC-02 expects recommended; BL-TC-22 rejects "members" in all four situations. Rejected sub-claim: the review said (c) "does not appear to require that the donations be requested"; the verbatim text is "(i) donations or gifts ... requested from any person who is not (A) a member, director, officer or employee". | CNCA s. 235(1)(c)(i); Reg. s. 37 |
R-06 (maj) both notice method renders nothing | FIXED | {{#notice_both}} branch (mail/courier/delivery or electronic, one window that must satisfy both: validation 21–35); the non-electronic alternative fires for electronic and both; publication method added and gated on expected_membership > 250. BL-TC-16 e–h, BL-TC-38. | Reg. s. 63(1)(a)–(d), 63(2) |
| R-07 (maj) "effective ... until it is confirmed" | FIXED | Both variants now read "effective from the date of the Board's resolution and, if confirmed or confirmed as amended by the Members, remains effective in the form in which it was confirmed; it ceases to have effect if it is not submitted ... or if they reject it, and a later Board resolution to substantially the same effect is not effective until the Members confirm it." | CNCA s. 152(3)–(5); ONCA s. 17(3)–(5) |
| R-08 (maj) profession of faith hard-coded | FIXED | CL-MEMBER-CONDITIONS renders a dynamic numbered list (membership_conditions_list, a derived numbered_list); every condition is emitted only when selected. BL-TC-33 ([baptism] → no profession sentence, no "(viii)"). | CNCA s. 154(1) |
| R-09 (maj) term cap cited to s. 128(3) | FIXED | CA-FED-23 cites Reg. s. 28(1) ("the prescribed period is four years") and quotes 128(3)–(8) verbatim; CL-BOARD-TERM expresses terms as "the close of the Nth annual meeting" and adds the s. 128(5) default sentence. | CNCA s. 128(3),(5); Reg. s. 28(1) |
| R-10 (maj) Canadian rules applied to US churches | FIXED | CL-BOARD-NUMBER text_us (number fixed by resolution of the Members; qualifications per state law); BL-TC-06 and BL-TC-39 output_excludes "special resolution", "undischarged bankrupt", "Crown", "public accountant". | US-STATE-01 |
| R-11 (maj) soliciting question mis-states s. 2(5.1) | FIXED | Question rewritten (clause-library inputs.soliciting): "requested" gifts, limb (c) entities, five-year window; CA-FED-14 states the status period from Reg. s. 16 (from the first AGM after the FY to the third AGM after that). s. 2(5.1) letters remain paraphrase (OQ-03r). | CNCA s. 2(1); Reg. s. 16 |
| R-12 (maj) requisition % has no ceiling | FIXED | requisition_percent is nullable (null = statutory figure); validation ≤ 5 (CA-FED) / ≤ 10 (CA-ON); the clause prints the statutory figure unless lowered. New rules CA-FED-20, CA-ON-19. BL-TC-29. | CNCA s. 167(1); Reg. s. 72(1); ONCA s. 60(1) |
| R-13 (min) CNCA definition verified; CL-INTERP wrong for CA-FED | FIXED | CL-INTERP has text_ca_fed (no "meeting called for the purpose", no written-consent element), text_ca_on (both, plus extraordinary resolution), text_us. CA-FED-11 high. | CNCA s. 2(1); ONCA s. 1(1) |
| R-14 (min) s. 7(1) letters; s. 154(4) mis-cite | FIXED | CA-FED-01 excerpt carries (a)–(g); CL-ART-MEMBER-CLASSES note cites s. 7(1)(c) for "voting rights in the articles" and s. 154(4) only for "at least one voting class". | CNCA s. 7(1)(c), 154(4) |
| R-15 (min) s. 7(4) verbatim; (5) carve-out | FIXED | CA-FED-02 quotes 7(4) verbatim and notes (5) as unfetched (OQ-04). | CNCA s. 7(4) |
| R-16 (min) CL-NOTICE-CA-ON "amending the Articles" | FIXED | Dropped; now "may be changed only by the Members by special resolution". ONCA ss. 17(1), 55(1), 103(1)(k) read. BL-TC-04 asserts. | ONCA ss. 17(1), 55(1) |
| R-17 (min) CL-AUDIT-CA-ON wording | FIXED | "appoint an auditor ... or, where an extraordinary resolution under section 76 of the Act is in effect for that financial year, a person to conduct a review engagement". BL-TC-37. | ONCA ss. 68(1), 76(1) |
| R-18 (min) s. 179 / s. 190 | FIXED | CA-FED-12 quotes s. 179 verbatim and mentions s. 190 deeming. | CNCA s. 179 |
| R-19 (min) member proposals gap | FIXED | New CL-MEMBER-PROPOSALS (CA); CL-AMEND-MEMBERS-ONLY no longer requires "a meeting called for that purpose". CA-FED-20 quotes s. 163(1),(2),(5) and Reg. s. 65. | CNCA ss. 152(6), 163; Reg. s. 65 |
| R-20 (min) BL-TC-18 message rationale | FIXED | Message now says the ≥ two-thirds floor applies because the single threshold also governs s. 197/103 matters, and that ordinary confirmation alone would need only a majority. | CNCA ss. 2(1), 152(2); ONCA ss. 1(1), 17(2) |
| R-21 (min) "at least simple" | FIXED | pastor_call_threshold is an integer percent rendered through percent_phrase (50 → "a majority", 67 → "two-thirds", 75 → "three-quarters"). BL-TC-41. | — |
| R-22 (min) CL-AMEND-US mis-scoped | FIXED | CL-AMEND-US applies to every US case; CL-AMEND-MEMBERS-ONLY is CA-only. | — |
| R-23 (min) self-executing removal | FIXED | Replaced by an eligibility rule ("No employee is eligible to be elected or appointed ... if ... employees would exceed one-third") plus a resign-if-later-employed sentence. | ONCA s. 23(3) |
| R-24 (min) QD clause without fallback | FIXED | "... as the members shall determine by special resolution or, failing such a determination before the distribution, as the directors shall determine" (also applied to CL-ART-DISSOLUTION-ON). | CNCA s. 235(2)–(3) |
R-25 (min) intends labelled mandatory | FIXED | Dynamic kind: intends → recommended, label "required for CRA registration; not yet required by the Act". BL-TC-03 asserts the mandatory label only for soliciting/unsure. | CNCA s. 235(1)(a) |
Resolutions: Fable review (C-01, M-01–M-13, m-01–m-09)
| Finding | Resolution | What changed / why | Source |
|---|---|---|---|
| C-01 (crit) paid pastor as voting Ontario director drafted, not referred | REFER (implemented) | O. Reg. 4/01 s. 2.1(4) read: it does not authorize paying "a director as a director or employee". Derived flag paid_director_refer fires for pay_directors = yes, any Ontario employee director, any Ontario voting ex officio pastor, and any registered/intending charity with an employee director; the REFER banner names the regulation; the employee-remuneration sentence is withheld; Ontario default is ex_officio_nonvoting (DQ-04 adopted). CA-ON-08 rewritten to high confidence with the regulation text; CA-CRA-04 updated (CRA half still unfetched, OQ-07r). BL-TC-05, BL-TC-34. | O. Reg. 4/01 s. 2.1(2),(4),(7); ONCA s. 47 |
| M-01 (maj) jurisdiction-blind clauses vs test assertions | FIXED | CL-AGM, CL-ARTICLES-CROSSREF, CL-EFFECTIVE, CL-INTERP, CL-BOARD-NUMBER, CL-CONFLICT-OF-INTEREST, CL-INDEMNITY, CL-MEETINGS-ELECTRONIC all have per-jurisdiction variants; state is a declared input required when jurisdiction = US. BL-TC-04/06/39 output_excludes now pass mechanically. | — |
| M-02 (maj) board size by special resolution (CNCA says ordinary) | FIXED | text_ca_fed: "by ordinary resolution of the Members, who may delegate that power to the Board"; text_ca_on: "by special resolution of the Members or, if a special resolution so empowers it, by resolution of the Board". New rule CA-FED-22. BL-TC-01, BL-TC-04. | CNCA s. 133(3); ONCA s. 22(2) |
| M-03 (maj) requisition % free input | FIXED | As R-12; ONCA s. 60(1) now read: 10 %. | ONCA s. 60(1); CNCA s. 167(1) |
| M-04 (maj) absentee voting delegated; enum renders raw | FIXED | As R-03; absentee_voting has a display map ("mailed-in ballot"); a proxy paragraph with deposit deadline, revocation and form reference is emitted when proxies = yes. ONCA s. 64(1.1) / s. 67(1) read (CA-ON-20). | CNCA s. 171; Reg. s. 74; ONCA ss. 64(1.1), 66, 67(1) |
| M-05 (maj) transfer omitted; Ontario note misstates s. 103 | FIXED | Transfer added to both variants; CL-MEMBER-CONDITIONS note and CA-ON-15 now say s. 103 governs the ARTICLES and that the Ontario lock on by-law conditions is a deliberate, lawful over-lock (DQ-08). | ONCA ss. 17(1), 103(1) |
| M-06 (maj) no indemnification clause | FIXED | New CL-INDEMNITY (text_ca tracking s. 151 / s. 46 conditions, advance of costs, insurance, "Nothing in this section gives an indemnity the Act does not permit"; text_us with state banner). New rules CA-FED-18, CA-ON-17. BL-TC-32. | CNCA s. 151(1)–(6); ONCA s. 46(1)–(6) |
| M-07 (maj) dangling "Discipline section" reference | FIXED | Expulsion phrase wrapped in {{#has_discipline}}; when off: "The corporation has no power to expel a Member other than as this section provides." BL-TC-36. | CNCA s. 158 |
M-08 (maj) elders outside s. 158 | FIXED | discipline_body / admitting_body enum is `board | board_committee |
| M-09 (maj) discipline gaps | FIXED (case law → OQ-14) | Grounds reference Schedules A/B only when they exist; notice states grounds, action, date/place; hearing not less than five days before effect (s. 51(3)(b)); decision by persons who did not bring the complaint, with reasons; suspension defined and capped (suspension_max_months, default 12); one appeal; members'-meeting discipline in camera with an anonymised notice. Case law not fetched — listed as OQ-14 and not relied on. | ONCA s. 51(2)–(3) |
| M-10 (maj) ex officio voting pastor under the CNCA | FIXED | CA-FED: pastor_on_board = ex_officio_voting is rejected with the s. 128(3) explanation (CA-FED-23; the rule says "no provision for", not "prohibits" — OQ-17). CA-ON: new CL-BOARD-EX-OFFICIO-ON (term ends with the office; not removable under s. 26(1), verified) and a carve-out in CL-BOARD-TERM. BL-TC-05, BL-TC-34. | CNCA s. 128(3); ONCA ss. 23(4), 26(1) |
| M-11 (maj) template nonsense | FIXED | "one 3th" → term_fraction word map, staggering suppressed at 1 year; simple → percent_phrase; all *_body enums have display maps; conditions list is dynamic; "An Adherents" → nonvoting_class_singular; admitting_body declared; both branch; "[opening-quorum ... as above]" replaced with full text in every quorum variant; us_review_level display map replaces the undeclared _phrase; CL-OFFICERS uses officer_titles_phrase ("a Chair, a Secretary and a Treasurer") and no longer says every officer is a director; denomination_phrase replaced by an is_connectional section; date declared as a runtime input; document: both admitted to the schema. validate.py fails on any {{, raw slug, or the listed strings. | — |
| M-12 (maj) COI labelled optional; CNCA s. 141 mandatory | FIXED | CL-CONFLICT-OF-INTEREST is default for Canada (applies regardless of coi_policy), opens "Every director and officer shall comply with the disclosure requirements of the Act", restates the statutory duty per jurisdiction (Ontario adds the must-not-attend rule and deemed quorum), and labels the annual declaration / leaving the room as the church's additions; IRS label kept for the US only. New rules CA-FED-19, CA-ON-18. BL-TC-43. | CNCA s. 141(1),(2),(5),(6); ONCA s. 41(1),(5),(6) |
| M-13 (maj) no electronic-meetings clause | FIXED | New CL-MEETINGS-ELECTRONIC (option, default on) with per-jurisdiction variants; CNCA s. 159(5) "if the by-laws so provide" is now satisfied. New rules CA-FED-24, CA-ON-21. BL-TC-42. | CNCA s. 159(4)–(5); ONCA s. 53(4)–(6), 58(3) |
| m-01 CL-INTERP stricter than CNCA | FIXED | As R-13. | CNCA s. 2(1) |
| m-02 confidence upgrades | FIXED | CA-FED-11, -12, -14, -16, -17 → high; CL-BOARD-TERM CNCA cap is now statute (Reg. s. 28(1)); s. 133(3), 141, 151, 158, 167 + Reg. 72 all sourced in new rules. rules.yaml: 64 high / 5 medium / 0 low. | as listed |
| m-03 CL-NOTICE-CA-ON "amending the Articles" | FIXED | As R-16. | ONCA s. 17(1) |
| m-04 cap validation uses directors_min; ambiguous tiebreak | FIXED | Automatic vacation removed (eligibility rule instead); directors_min kept deliberately conservative and the note says so; the ex officio pastor is counted first (floor(directors_min/3) - 1 when voting). | ONCA s. 23(3) |
| m-05 promised explainer never emitted | FIXED | New CL-GOVERNANCE-EXPLAINER (kind: explainer) for elder-led / connectional models. BL-TC-02, BL-TC-05. | CHURCH-OPT-02 |
| m-06 AGM six-month default unsourced | FIXED | New rule CA-FED-25 (s. 160(1) + Reg. s. 61); input agm_months_after_year_end with CA-FED validation ≤ 6. BL-TC-29. | CNCA s. 160(1); Reg. s. 61 |
| m-07 US member clauses without banners; no-members churches | FIXED | New CL-US-SKELETON-NOTICE on both US documents ("This is a SKELETON ... the law of the State of {{state}} governs"); new input us_statutory_members with a REFER sentence in CL-MEMBER-CONDITIONS and the cover note; US refer banners on CL-AGM, CL-VOTING-MEMBERS, CL-MEETINGS-ELECTRONIC, CL-INDEMNITY. BL-TC-06, BL-TC-39. | US-STATE-01, -03 |
| m-08 Pub 557 vs Pub 1828 | FIXED | US-IRS-01 note: do not cite Pub 557 for automatic exemption. | Pub 1828 |
| m-09 non-voting class notice inconsistency | FIXED | CL-NOTICE-CA-FED and CL-NOTICE-CA-ON give notice "and to each of the {{nonvoting_class_name}}" when the class exists; CL-MEMBER-CLASSES-BYLAW says they receive notice, attend and speak but do not vote. BL-TC-08. | CNCA s. 162(1) (extra right) |
Resolutions: Codex structural review (F1–F20)
| Finding | Resolution | What changed / why | Source |
|---|---|---|---|
| F1 six clauses never asserted | FIXED | BL-TC-28 (CL-FISCAL-YEAR), BL-TC-29 (CL-AGM, all three variants), BL-TC-26/27 (CL-VOTING-MEMBERS), BL-TC-30 (CL-BOARD-MEETINGS), BL-TC-31 (CL-OFFICERS), BL-TC-24/25/09 (CL-EFFECTIVE, all four variants). validate.py fails if any clause is never in a must_include. | — |
| F2 no canonical defaults | FIXED | inputs declares a default for every selector; validate.py computes each case from defaults ⊕ inputs and asserts exactly one variant per selected clause. | — |
F3 static mandatory vs BL-TC-02 | FIXED | kind: dynamic with kind_when; BL-TC-02 asserts recommended, BL-TC-01/03 mandatory. | CNCA s. 235(1) |
| F4 CL-AGM prints "public accountant" for Ontario | FIXED | Three variants; BL-TC-04 output_excludes. | ONCA s. 68(1) |
| F5 US gets articles-of-amendment wording | FIXED | CL-ARTICLES-CROSSREF text_us. | — |
| F6 tests omit conditions / admitting body | FIXED | Defaults [profession_of_faith] and board; BL-TC-21a still rejects an explicit empty list. | — |
F7 dissolution_choice undefined | FIXED | Declared input (default charitable) with statute/product validations on the three dissolution clauses. BL-TC-22 a–d. | CNCA s. 235; ONCA s. 167(1)(d); IRS Pub 557 |
| F8 BL-TC-23 invariant vs CL-BOARD-NUMBER | FIXED | Decision: the by-law may repeat the range only as a cross-reference ("within the range the Articles provide (at present not fewer than X and not more than Y)"); the invariant was rewritten accordingly and its bylaws_output_excludes forbids the articles phrasing "shall have a minimum of". | CNCA s. 7(1)(d) |
| F9 Schedule B missing; Schedule A referenced without its clause | FIXED | New CL-SCHEDULE-B (covenant_text, required when the covenant condition is selected); cross-field validations on statement_of_faith and covenant_text; CL-DISCIPLINE grounds conditional on the schedules. BL-TC-35. | — |
F10 both notice method | FIXED | As R-06. | Reg. s. 63 |
| F11 profession of faith always emitted | FIXED | As R-08. | — |
| F12 members-only document contradicts CL-EFFECTIVE | FIXED | CL-EFFECTIVE text_ca_new_members_only / text_ca_replacement; BL-TC-09 asserts no "passed by the Board". | CNCA s. 152(1) |
| F13 ex officio pastor vs "elected by members" | FIXED | As M-10. | ONCA ss. 23(4), 26(1) |
F14 absentee_voting used as truthy | FIXED | Section flags must be bool-typed inputs/derived (has_absentee); validate.py's positive control proves an enum flag is rejected. | — |
| F15 no minimum term | FIXED | director_term_years min 1 (input bound + clause validation). BL-TC-19c. | — |
| F16 amendment threshold representations disagree | FIXED | Single integer percent; ≥ 67 for Canada (statute), ≥ 50 for the US (product); rendered through percent_phrase. BL-TC-18. | CNCA s. 2(1); ONCA s. 1(1) |
F17 state, admitting_body, us_review_level_phrase, date undeclared | FIXED | All declared; validate.py fails on any undeclared or unlisted variable. | — |
| F18 free text: no non-blank requirement, no escaping contract | FIXED | required / required_when on church_name, state, denomination, nonvoting_class_name, statement_of_faith_text, covenant_text; the header states the engine escapes variables and throws on missing ones. BL-TC-44. | — |
| F19 raw enum values render badly | FIXED | Display maps on every enum; derived percent_phrase, term_ordinal, term_fraction, officer_titles_phrase; validate.py fails on any \w+_\w+ slug in rendered text. | — |
| F20 no bounds | FIXED | Bounds on minimum_age (12–21), inactivity_months (6–60), requisition_percent (≤ 5 / ≤ 10 statute), US notice (5–90), board_notice_days (1–30), max_consecutive_terms (1–6), agm_months_after_year_end (1–12; ≤ 6 CA-FED statute), suspension_max_months (1–24), directors (1–50), expected_membership (1–100000). Each carries basis/bounds_basis so the UI can label product floors. BL-TC-44. | Reg. ss. 61, 72; ONCA s. 60(1) |
Validator output (final run)
$ python C:\dev\kn-churchwise\products\churchwise\sources\bylaws\validate.py
rules: 69 clauses: 50 inputs: 60 derived: 64 tests: 44 evaluated cases: 110
clauses with variants: 11 special-resolution clauses: ['CL-MEMBER-CONDITIONS', 'CL-MEMBER-CLASSES-BYLAW', 'CL-NOTICE-CA-FED', 'CL-NOTICE-CA-ON', 'CL-VOTING-MEMBERS']
rules by jurisdiction: CA-FED=30, CA-ON=23, CA-CRA=5, US-IRS=8, US-STATE=3
confidence: high=64, medium=5, low=0
positive controls: 2 passed
PASS: yaml parses, all references resolve, every case is deterministic, no undeclared variables, no unasserted clauses
Proof the checker can fail: the first run against the same files (before four fixes) reported FAIL: 89 problem(s), including YAML-1.1 yes/no boolean coercion, "special resolution" leaking into US output, and the covenant_text cross-field case; the second run reported FAIL: 2 problem(s). The two positive controls (an enum used as a {{#flag}}, an undeclared {{variable}}) are asserted inside the script on every run.
Final-pass resolutions (2026-09-25, after the Codex and Fable FINAL re-checks)
- Editor: Claude Fable 5.1 (rules editor; not the author of either final review)
- Inputs:
bylaws-2026-09-25-final-codex.md(F3, F8, F12, F13, F18, D1, V1–V4) andbylaws-2026-09-25-final-fable.md(F-1, F-2, F-3, m-1–m-6, housekeeping) - Files changed:
clause-library.yaml,test-cases.yaml(44 → 48 cases, 110 → 139 evaluated),validate.py(rewritten),rules.yaml(two notes; no rule text changed) - Primary source re-opened this pass: ONCA https://www.ontario.ca/laws/statute/10n15 in-browser (new tab, closed after): s. 17(1) verbatim — "…except in respect of a matter referred to in clause 103 (1) (g), (k) or (l)"; s. 23(3)–(4) verbatim; s. 103(1)(g)–(m) verbatim. Nothing else re-fetched.
Totals: 19 FIXED · 0 REJECTED · 0 REFER.
| Finding | Resolution | What changed / why | Source / proof |
|---|---|---|---|
F3 (Codex) QD kind_when branches overlap (intends + unsure) | FIXED | The intends branch now requires soliciting = no; the three branches are disjoint and the otherwise fallback applies only when neither matches. validate.py pick_branch() raises if two non-fallback branches match. BL-TC-48 covers all four registered_charity × soliciting corners. | CNCA s. 235(1) |
| F8 (Codex) min ≤ max check was Canada-only | FIXED | The directors_max >= directors_min invariant moved from CL-ART-DIRECTOR-RANGE (CA-only articles clause) to CL-BOARD-NUMBER, which is selected in every jurisdiction; message names both numbers. BL-TC-45: rejected in CA-FED, CA-ON, US; equal range accepted. | — |
| F12 / D1 (Codex) CL-EFFECTIVE branches overlap; ~100 cases relied on list order | FIXED | Four disjoint Canadian branches (adoption_context × amendment_authority): text_ca_replacement, text_ca_replacement_members_only (new — no "Board has also passed" sentence; states the Board has no power), text_ca_new_members_only, text_ca_new_board; text_us is the fallback only. BL-TC-25 gained five subcases asserting each branch by name. | CNCA s. 152; ONCA s. 17 |
F13 / C1 (Codex) US accepted ex_officio_voting with no US clause | FIXED (reject, not variant) | CL-BOARD-TERM validation for jurisdiction = US: rejects with "…check your state's nonprofit act with your lawyer…". No US variant was written: state acts differ and the only ex officio clause is Ontario law. BL-TC-34 us_voting (reject) and us_nonvoting_ok. | US-STATE-02 |
F18 (Codex) escaping promised, not implemented; board_name / committee_name could be blank | FIXED | board_name is required: true; committee_name is required_when any of admitting_body, discipline_body, search_body is board_committee. Header now states the ESCAPING CONTRACT (the app renderer escapes every substituted variable; library text is trusted). validate.py's reference renderer html.escapes every variable (nested library templates render their own variables escaped, once). BL-TC-44 (+4 subcases), BL-TC-36 committee_without_name, BL-TC-47 (&, <Church>, <script> all escaped) and an in-script positive control. | — |
| V1 (Codex) determinism check took the first match | FIXED | pick_branch(): exactly one non-fallback variant / kind_when branch, else ValueError → the case FAILS; fallback only when none matches; static check that otherwise is at most one and last. Positive control: two overlapping branches must raise. | — |
| V2 (Codex) rejection cases credited reachability | FIXED | check_case() returns the credited ids only when the evaluation succeeded AND was not rejected; the report prints "successful (credited) cases: 25". | — |
| V3 (Codex) undeclared-variable scan missed display maps, derived maps, lists, banners, labels | FIXED | scan_all_strings() walks every string under clauses, inputs, derived (except prose notes) for {{…}} tokens; banners, side notes, explainers, labels, kind labels and validation messages are now RENDERED through the same renderer at evaluation time, so a stray token fails the {{/}} hygiene check as well. | — |
| V4 (Codex) no non-empty assertions; exceptions crashed | FIXED | Explicit FAIL (exit 1) on missing file, YAML error, schema key, empty rules/clauses/inputs/derived/tests, zero evaluated cases, zero successful cases, or a missing BL-TC-23 invariant. Observed: the first run after the rewrite hit a stray } in YAML and reported FAIL: 1 problem(s) - clause-library.yaml: YAML parse error … instead of a traceback. | — |
| F-1 (Fable) input-typed bool flags always truthy → "Associate Members" for single-class churches | FIXED | build_ctx() coerces every type: bool input to a real Python bool; render_tree() REFUSES a non-boolean section value (never truthiness); input_rejections checks isinstance(v, bool). Header BOOLEAN CONTRACT tells the app to coerce YAML yes/no before rendering. Assertions: BL-TC-01 and BL-TC-04 text_excludes "Associate Members" / "and to each of the" / "including each of the"; BL-TC-08 gained single_class and single_class_ontario subcases; third positive control renders {{#nonvoting_class}}x{{/nonvoting_class}} empty for no and "X" for yes. | — |
| F-2 (Fable) Ontario: "no director shall be an employee" vs one-third cap | FIXED | Statute-consistent rule chosen: ONCA s. 23(3) is a CEILING, so the church may lawfully over-lock to zero. CL-BOARD-EMPLOYEE-CAP-ON always restates the Act's cap once; when has_employee_directors is false it adds "This By-law further provides, as the Act permits, that no director shall be an employee…" and DROPS the eligibility / resign-if-limit-exceeded sentences; when an employee director is possible the eligibility rule governs and CL-BOARD-REMUNERATION withholds its sentence (already did). The duplicate cap sentence was removed from CL-BOARD-NUMBER text_ca_on. BL-TC-46 (three subcases) plus a render-test contradiction pair. | ONCA s. 23(3) (verbatim, re-verified) |
| F-3 (Fable) Ontario CL-EFFECTIVE said the Act reserves the conditions of membership; over-lock inconsistent with the amendment clause | FIXED | s. 17(1) re-verified in-browser: the directors are barred ONLY from 103(1)(g), (k), (l). Ontario text now (via is_ca_fed / is_ca_on sections inside the four Canadian branches) attributes transfer / notice / absentee voting to the Act and the conditions of membership + any second class to THIS BY-LAW's over-lock — in text_ca_replacement, text_ca_replacement_members_only and text_ca_new_board. CL-AMEND-BOARD-THEN-MEMBERS text_ca_on now excludes (a) what the Act withholds and (b) what this By-law withholds, so the Board can no longer amend the membership conditions by resolution — DQ-08 applied consistently. CL-MEMBER-CONDITIONS note, CA-ON-03 note rewritten. Assertions: BL-TC-04 / BL-TC-25 text_excludes "the Act reserves…"; BL-TC-01 text_contains the federal wording; render test forbids "the Act reserves" in any Ontario document and requires both over-lock attributions. | ONCA s. 17(1), 103(1) |
| m-1 US "percentage your state's act provides" | FIXED | CL-AGM text_us rewritten: "holding the percentage of the votes entitled to be cast that applicable state law provides"; the map value is now prose and unused by the US template; NONSENSE list forbids the old phrase everywhere. BL-TC-06. | — |
| m-2 lone "(i)" | FIXED | numbered_list: one item → no numeral; two → "(i) a and (ii) b". Hygiene check fails any clause with "(i)" but no "(ii)". BL-TC-33 (+ two_items). | — |
| m-3 US register ("this By-law", "financial year", "registered office") | FIXED | Derived maps bylaw_ref, year_word, office_ref used in CL-FISCAL-YEAR, CL-MEMBER-CLASSES-BYLAW, CL-MEMBER-TERMINATION, CL-DISCIPLINE, CL-QUORUM-MEMBERS, CL-PASTOR-CALL, CL-DENOMINATIONAL-OVERSIGHT, CL-FINANCE-NONPROFIT, CL-RECORDS-MINUTES ("the Articles, these Bylaws and all amendments"), CL-DISCLAIMER. BL-TC-06 / BL-TC-39 output_excludes "By-law", "by-law", "financial year", "registered office"; render test likewise. | — |
| m-4 US "(or, if the church has no statutory members, by the Board)" always printed | FIXED | Wrapped in {{^us_has_members}}. BL-TC-06 (absent), BL-TC-39 (present), render test. | — |
| m-5 Ontario ordinary resolution lacked the written-consent limb | FIXED | CL-INTERP text_ca_on: "…or consented to in writing by every Member entitled to vote" for ordinary resolutions too. BL-TC-04. | ONCA s. 1(1)(b) |
| m-6 in-camera sentence only for members-meeting discipline; appeal to Members would name the Member | FIXED | New derived members_hear_discipline (discipline_body in (members_meeting, board)); sentence now reads "considering discipline, or an appeal from a disciplinary decision". BL-TC-36 board_appeal_to_members; on_committee still excludes "in camera". | — |
| Housekeeping: CA-FED-21 "[…re-quote before printing]" | FIXED | Bracket replaced: s. 171(1) second sentence recorded as verified by the independent final review's fetch (2026-09-25), with the clause features that satisfy it. Not re-fetched this pass; attributed, not asserted. | CNCA s. 171(1) |
Render test (new, inside validate.py)
Three default by-laws render end to end every run — ON congregational (defaults, 3,493 words), federal non-soliciting elder-led (3,383 words), US connectional / Texas (3,040 words) — and must contain no {{, }}, [..., […, 3th, one 3th, at least simple, vote by none, <<unmapped, raw \w+_\w+ slug, the word none, or a lone "(i)"; no US Canadian/UI text; no Ontario "the Act reserves"; and none of the contradiction pairs (employee-director rule vs eligibility rule; proxies permitted vs not; one class vs a named second class).
Validator output (final run)
rules: 69 clauses: 50 inputs: 60 derived: 68 tests: 48 evaluated cases: 139 successful (credited) cases: 25
clauses with variants: 11 special-resolution clauses: ['CL-MEMBER-CONDITIONS', 'CL-MEMBER-CLASSES-BYLAW', 'CL-NOTICE-CA-FED', 'CL-NOTICE-CA-ON', 'CL-VOTING-MEMBERS']
rules by jurisdiction: CA-FED=30, CA-ON=23, CA-CRA=5, US-IRS=8, US-STATE=3
confidence: high=64, medium=5, low=0
render test: ON congregational (defaults) = 3493 words, Federal non-soliciting elder-led = 3383 words, US connectional (Texas) = 3040 words
positive controls: 5 passed
PASS: yaml parses, all references resolve, every case is deterministic (exactly one branch), no undeclared variables anywhere, every clause reached by a successful case, three default by-laws render clean
Positive controls run by hand (files backed up, broken, restored; md5 identical before and after)
- Overlapping branches: dropped
AND adoption_context = new_corporationfromtext_ca_new_members_onlyso it overlappedtext_ca_replacement_members_only→FAIL: 5 problem(s), e.g.BL-TC-25/on_replacement_members_only: evaluation error: CL-EFFECTIVE: 2 variant branches match (text_ca_replacement_members_only, text_ca_new_members_only); branches must be mutually exclusive. - "no" truthy again (coercion removed,
bool(val)truthiness restored, old string-based bool check restored — the exact F-1 bug) →FAIL: 12 problem(s), includingBL-TC-08/single_class: CL-NOTICE-CA-FED contains forbidden 'Associate Members',BL-TC-08/single_class_ontario: CL-NOTICE-CA-ON contains forbidden 'Associate Members',BL-TC-01,BL-TC-04likewise, andpositive control 'no' is never truthy (F-1): … 'no' opened a section: 'X'.
Both restored; md5sum -c reported OK for clause-library.yaml and validate.py; final run PASS as above.
Codex re-check resolutions (orchestrator, 2026-09-25)
Codex re-check: all 13 findings (F3, F8, F12, F13, F18, D1, V1–V4, F-1, F-2, F-3) are RESOLVED. It returned FAIL only on these residual items:
- Validator not runnable in the Codex sandbox (no PyYAML): environment only. Run by the orchestrator: PASS.
- The overlap check covered only tested combinations: FIXED.
validate.pynow hascheck_branches_exhaustive(). It enumerates every combination of the enum/bool inputs each branch set depends on (following derived values), and fails on any overlap. Result: proven over 39 input combinations. Positive control: a deliberately broadened CL-EFFECTIVE branch fails with "variant branches overlap at {…}" and names the combination; restored byte-identical. - BL-TC-48 covered 4 of 9 combinations: FIXED. The remaining five subcases were added (all mandatory). The validator evaluates 144 cases: PASS.
Status: bylaws rules CLEARED for build.