Bylaws: Codex final re-check (2026-09-25)
Recorded by the orchestrator from Codex's final message. Verdict: FAIL.
Resolved: F1, F2, F4, F5, F6, F7, F9, F10, F11, F14, F15, F16, F17, F19, F20.
| id | sev | location | problem | fix |
|---|---|---|---|---|
| F3 | major | clause-library.yaml:552-559; BL-TC-03 | The dissolution kind branches aren't mutually exclusive (intends + unsure matches both); it relies on first-match order | Make the recommended branch require intends AND soliciting=no; assert exactly one match |
| F8 | major | clause-library.yaml:535-550, 1138-1188 | The min≤max check is Canada-only; the US CL-BOARD-NUMBER can render an inverted range | Make it a cross-field invariant for all jurisdictions |
| F12 | major | clause-library.yaml:1752-1786 | CL-EFFECTIVE branches overlap (the broad Canadian branch plus the replacement and members-only branches) | Four disjoint Canadian branches (new/replacement × board-then-members/members-only) |
| F13/C1 | major | clause-library.yaml:267-272, 1191-1206, 1232-1259 | The US allows pastor_on_board=ex_officio_voting with no US clause, contradicting CL-BOARD-TERM | Reject the US voting ex officio option (state law governs), or add a variant |
| F18 | major | clause-library.yaml:36-38, 136-140, 249-253; validate.py:169-179 | Escaping is promised but not implemented in the reference renderer; board_name and committee_name can be blank | Declare them required non-blank; the app renderer (renderTemplate) escapes, so document that contract and test it |
| D1 | major | CL-EFFECTIVE across ~100 Canadian cases | The cases rely on list order | Fixed by F12 |
| V1 | major | validate.py:279-290 | The determinism check takes the first match and never asserts exactly one | Fail unless exactly one non-fallback variant/kind matches |
| V2 | major | validate.py:313-318, 376-391 | Rejection cases falsely credit reachability | Credit only clauses selected in successful evaluations |
| V3 | major | validate.py:201-222, 393-401 | The undeclared-variable scan misses enum display values, derived maps, lists, banners and labels | Scan every renderable string recursively |
| V4 | minor | validate.py | No non-empty assertions, so an empty fixture could PASS | Assert rules, clauses, tests and n_cases are > 0 |