Repository navigation
What's Changed
Sign-in no longer fetches Ministry Platform's OIDC discovery document at boot (#101), so a slow or failing MP can no longer drop the sign-in provider or stall every page's session check. This release also corrects the CommunicationType enum and prepares the repo for public use under the MIT license. Forks: if you ported selfHealingAuth from the 2026-09-28 playbook, replace it by following .claude/playbooks/port-oidc-lazy-discovery.md.
⚠️ Breaking Changes
- Node 22 or later is required (#105):
package.jsonnow sets"engines": {"node": ">=22"}, andnpm run setupchecks the version. Node 20 is end-of-life, and CI already ran on 22. CommunicationTypeis now'Email' | 'SMS'(#92, thanks @jonnydcakes):'Text'and'Letter'are removed, because MP always rejected them with an HTTP 500. An'SMS'communication must setTextPhoneNumberId(adp_SMS_Numbers.SMS_Number_ID). The compiler enforces this, andcreateCommunicationrefuses any other value before it sends.
🐛 Bug Fixes
- OIDC discovery is no longer fetched at boot (#107, fixes #101): before, a failed fetch made sign-in return
404 PROVIDER_NOT_FOUND, and a hung fetch stalled every session check for about 300 s. The provider now uses explicit endpoints, so building the auth instance makes no MP call.- The id_token is still verified against MP's JWKS, with RS256 pinned.
issuerandjwks_uriare fetched at the first sign-in callback with a 5 s timeout. They are cached on success and never cached on failure. - During an MP outage, only the sign-ins made during it fail; the next attempt works without a restart.
selfHealingAuthandrequireIdTokenVerificationare removed.joseis now a direct dependency.
- The id_token is still verified against MP's JWKS, with RS256 pinned.
deps:relocknow writes metadata-only lockfile changes (#107): before, a new dependency that was already hoisted never reachedpackage-lock.json.
📚 Documentation
- Accuracy pass (#105): every claim in
CLAUDE.md,README.mdand the references was checked against the code. Fixes include theCLAUDE.mdvalidation example, which passed aContact_IDas$userId, and aquery-syntax.mdexample that put an unsanitized ID into a$filter. - Downstream port playbook for #101 (aa1bc64):
.claude/playbooks/port-oidc-lazy-discovery.mdsorts forks into four starting states and gives the full code, tests and a checklist. The 2026-09-28 playbook now points to it.
🔧 Maintenance
- Public-repo preparation (#104): adds an MIT
LICENSEandpackage.jsonrepository metadata. The setup placeholder host is nowyour-instance.ministryplatform.com, and setup no longer offers it as the default. The 2026-09-28 review record moved todocs/security/2026-09-28-auth-review.md. - Unused dependencies removed (#106):
@tailwindcss/typography,autoprefixer,@types/js-cookie,@types/react-syntax-highlighterand the Tailwind v3tailwind.config.js.tsxmoved todevDependencies. Forks that use any of these should add them back. - CI actions bumped (#100):
actions/checkout7.0.1,actions/setup-node7.0.0 andcodecov/codecov-action7.1.1.
Full Changelog: v2026.09.29.1945...v2026.09.30.0023