Methodology
- 1 Pick the notice: an ECOA / Reg B adverse-action notice for a decline or counteroffer; TILA / Reg Z cost-of-credit disclosures for an approval.
- 2 Retrieve the controlling section before citing it (Reg B 1002.9, or Reg Z 1026.18 for auto / 1026.6 + 1026.60 for cards).
- 3 For adverse action: state the action and the specific principal reasons, the ECOA anti-discrimination notice with the enforcement agency, and the FCRA notice with the CRA's name / address / phone, the right to a free report, and the score disclosure.
- 4 For an approval: disclose the TILA terms grounded in the decision (APR, finance charge, amount financed, payment schedule for auto; APR, line, fees for cards). Compute only from the decision's figures.
- 5 Validate completeness; list any gaps as issues; never record an incomplete notice.
Sandboxed tools
In-process MCP tools only. Built-in tools disabled, settingSources [], permissionMode bypassPermissions. The only ground truth is the tools.
retrieve_reg read 12 CFR 1002 / 1026 Retrieves the controlling section (Reg B 1002.9 / Reg Z 1026.18 / 1026.6 / 1026.60) to anchor the citation.
get_disclosure_profile read The bank's standing creditor / CRA / enforcement-agency / score-range boilerplate.
record_disclosure commit Commits the finished, validated notice. Called exactly once.
Outcome contract
The finished notice: its type, the full document text, the elements actually included, the regulatory citations, and the completeness validation.
▸ the validated schema (Disclosure)
type Disclosure = {
noticeType: "adverse-action" | "approval"
document: string // the full notice text, ready to send
requiredElements: string[] // the elements actually included
regulatoryBasis: string[] // the citations anchored to
validation: { complete: boolean, issues: string[] }
} Grounding
Governance seams
The three trust boundaries a runtime governance layer clamps onto. Shown here ungoverned, so you can see exactly what would be inspected, redacted, or blocked.
The Plainspeak methodology plus the decision, the principal reasons (on a denial), and the retrieved reg text + disclosure profile.
governor → Constrain every term to the decision and every institutional field to the profile.
The retrieve_reg and get_disclosure_profile calls that supply the citation and the creditor / CRA fields.
governor → Require the reg lookup and the profile before a notice can be drafted.
The validated notice written to the case journal. A gated mock: nothing is sent to an applicant.
governor → Block an incomplete notice; require the completeness validation to pass.
Plainspeak grounds every term in the decision and every institutional field in the disclosure profile, so it never fabricates a creditor or a credit bureau. It validates the notice for completeness before recording; an incomplete notice does not commit.
Evals & guardrails
- Adverse-action notice. Includes the specific reasons, the ECOA notice, and the FCRA / CRA disclosure with the score.
- No fabrication. Names the creditor and CRA from the profile rather than inventing them.
- Approval disclosures. Discloses the TILA terms computed only from the decision's figures.
Orchestration
- ⇢Fed by the decision (+ Grounds' reasons on a denial)
- ⇢Output is the consumer-facing document