Works with the AI tools you already use

    Claude CodeClaude CodeCursorCursorCodex CLICodex CLIGitHub CopilotGitHub CopilotGemini CLIGemini CLI+20 more

    SWIFT MT to ISO 20022 CBPR+ Migration Auditor

    1

    These are the defects that pass unit tests, pass schema validation, and get rejected at the correspondent.

    $69

    Secure checkout via Stripe

    30-day refund guarantee

    Converts to your local currency at checkout

    0 installsSecurity scanned
    SWIFT MT to ISO 20022 CBPR+ Migration Auditor

    SWIFT MT to ISO 20022 CBPR+ Migration Auditor

    Example session with this skill installed

    "Audit our camt.056 recall generation flow for CBPR+ compliance. A downstream clearing house flagged that our recall messages aren't linking back to the original payments, and we suspect structural non-conformance. Find every defect.
    Sample inbound MT192:
    text

    :20:RCLL20260115001
    :21:ORIG-REF-98765
    :11S:MT192
    :11R:MT192
    :32A:260115USD50000,00
    :52A:BANKUS33XXX
    :72:/REASON/FRAUD SUSPECTED
    
    

    Sample generated camt.056 output:
    xml

    <Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.056.001.08">
      <FIToFIPmtCxlReq>
        <Assgnmt>
          <Id>RCLL20260115001</Id>
          <Cretr><FIId><FinInstnId><BICFI>BANKUS33XXX</BICFI></FinInstnId></FIId></Cretr>
          <Assgnr><FIId><FinInstnId><BICFI>BANKUS33XXX</BICFI></FinInstnId></FIId></Assgnr>
        </Assgnmt>
        <Case><Id>ORIG-REF-98765</Id></Case>
        <OrgnlGrpInf>
          <OrgnlMsgId>RCLL20260115001</OrgnlMsgId>
          <OrgnlMsgNmId>pacs.008.001.08</OrgnlMsgNmId>
        </OrgnlGrpInf>
        <TxInf>
          <OrgnlIntrBkSttlmAmt Ccy="USD">50000.00</OrgnlIntrBkSttlmAmt>
          <OrgnlIntrBkSttlmDt>2026-01-15</OrgnlIntrBkSttlmDt>
          <CxlRsnInf>
            <Rsn><Prtry>/REASON/FRAUD SUSPECTED</Prtry></Rsn>
          </CxlRsnInf>
        </TxInf>
      </FIToFIPmtCxlReq>
    </Document>
    
    

    Camt056Builder.cs:
    csharp

    public class Camt056Builder
    {
        public Camt056 Build(Mt192 mt)
        {
            var doc = new Camt056();
            doc.Assgnmt.Id = mt.Field20;
            doc.Assgnmt.Cretr = new Party { Bic = "BANKUS33XXX" };
            doc.Assgnmt.Assgnr = new Party { Bic = mt.Field52A };
            doc.Case.Id = mt.Field21;
            doc.OrgnlGrpInf.OrgnlMsgId = mt.Field20;
            doc.OrgnlGrpInf.OrgnlMsgNmId = "pacs.008.001.08";
            doc.TxInf.OrgnlIntrBkSttlmAmt = new Amount {
                Value = mt.Field32A.Amount.ToString(),
                Ccy = mt.Field32A.Currency
            };
            doc.TxInf.OrgnlIntrBkSttlmDt = DateTime.ParseExact(
                mt.Field32A.ValueDate, "yyMMdd", CultureInfo.InvariantCulture
            ).ToString("yyyy-MM-dd");
            doc.TxInf.CxlRsnInf = new CxlRsnInf {
                Rsn = new Reason { Prtry = mt.Field72 }
            };
            return doc;
        }
    }
    
    

    Give me the full audit report per the skill's report format."

    • Read your context and instructions
    • Compiled the swift mt to
    • Generated the document

    ISO 20022 Migration Audit Report

    Repository: N/A (inline artifacts)
    Commit: N/A
    Audit scope: MT192 → camt.056.001.08 (Recall)
    CBPR+ baseline: UHB v5
    Files audited: 3 (CODE: 1, FIXTURE: 2, CONFIG: 0)
    Line-number provenance: counted from pasted text (Camt056Builder.cs)
    Audit timestamp: 2026-09-21T00:00:00Z

    Executive summary

    Audited the MT192→camt.056 recall builder plus the sample inbound MT192 and generated camt.056 output. Confirmed the reported linkage failure: OrgnlUETR is never populated anywhere in the build path (C-20, CRITICAL), and Assgnmt/Cretr is hardcoded to a literal BIC instead of being parsed from MT field 11S/11R (MAP-01, CRITICAL), silently corrupting assignor data for any originator other than BANKUS33XXX. The MT 72 reason sub-code wrapper is passed through unstripped into CxlRsnInf/Prtry (MAP-02, HIGH), and the settlement amount is serialized with a culture-unaware .ToString() immediately next to a date parse that correctly uses InvariantCulture (C-10, HIGH). Overall risk posture: HIGH — the builder emits schema-shaped but semantically unlinkable and partly corrupted recall messages.

    Finding counts: CRITICAL: 3 | HIGH: 3 | MEDIUM: 0 | LOW: 1

    CRITICAL findings

    [C-20] camt.056 recall not linked to the original payment via OrgnlUETR

    • File: Camt056Builder.cs:12-21 (pasted, Build method, TxInf construction)
    • Evidence:
    doc.TxInf.OrgnlIntrBkSttlmAmt = new Amount {
        Value = mt.Field32A.Amount.ToString(),
        Ccy = mt.Field32A.Currency
    };
    doc.TxInf.OrgnlIntrBkSttlmDt = DateTime.ParseExact(
        mt.Field32A.ValueDate, "yyMMdd", CultureInfo.InvariantCulture
    ).ToString("yyyy-MM-dd");
    doc.TxInf.CxlRsnInf = new CxlRsnInf {
        Rsn = new Reason { Prtry = mt.Field72 }
    };
    
    • Impact: Per §8.3, TxInf/OrgnlUETR is the element that lets the correspondent/clearing house match the recall back to the original credit transfer. No OrgnlUETR assignment exists anywhere in Build(), and the generated camt.056 sample confirms it is absent from the output. This is exactly the defect the downstream clearing house flagged: recalls carry Case/Id (a free-text reference) but no machine-linkable transaction identifier, so automated matching against the original pacs.008/MT103 fails or falls back to fragile string matching on Case/Id.
    • Fix: Thread the original transaction's UETR through from wherever it is captured when the original payment was sent/received (e.g., a lookup keyed on mt.Field21 or a stored UETR-to-reference index), and set doc.TxInf.OrgnlUETR before returning doc. If the UETR is genuinely unavailable to this service, that is itself a data-flow gap that must be closed upstream — it cannot be omitted silently.
    • Verification: CONFIRMED

    [MAP-01] Assgnmt/Cretr hardcoded to a literal BIC instead of parsed from MT 11S/11R

    • File: Camt056Builder.cs:7
    • Evidence: doc.Assgnmt.Cretr = new Party { Bic = "BANKUS33XXX" };
    • Impact: Per §8.3, Assgnmt/Cretr is sourced from MT field 11S/11R, not from a fixed constant. The sample input happens to carry :52A:BANKUS33XXX, making the hardcoded value coincidentally match — but the code never reads mt.Field11S or mt.Field11R at all. Any recall processed through this builder from a different creator institution will silently emit the wrong Cretr BIC while still validating against the XSD, producing schema-valid but factually false assignment data on every message that isn't from BANKUS33XXX.
    • Fix: Parse mt.Field11S (or the appropriate creator-identifying field per your MT192 model) and map it to doc.Assgnmt.Cretr.Bic. Remove the literal. Add a unit test asserting Cretr varies with a non-BANKUS33XXX fixture.
    • Verification: CONFIRMED

    [C-09] Amount type/serialization path not confirmed float-safe

    • File: Camt056Builder.cs:13
    • Evidence: Value = mt.Field32A.Amount.ToString(),
    • Impact: If mt.Field32A.Amount is a float/double anywhere upstream in the Mt192/Field32A model (not shown in the pasted artifacts), this is a CRITICAL rounding/precision defect for settlement amounts. The pasted snippet does not show the declared type of Amount, so this cannot be confirmed either way from what was provided.
    • Fix: Confirm Field32A.Amount is decimal (or an equivalent fixed-point type) end-to-end from MT parsing through to this builder. If it is ever cast through float/double, replace with decimal.
    • Verification: UNVERIFIED (type of mt.Field32A.Amount not shown in provided code)

    HIGH findings

    [MAP-02] MT 72 reason sub-code wrapper passed through unextracted into CxlRsnInf/Prtry

    • File: Camt056Builder.cs:19-20
    • Evidence: Rsn = new Reason { Prtry = mt.Field72 }
    • Impact: §8.3 explicitly states for field 72→CxlRsnInf/Prtry: "extract the reason text, do not pass the raw sub-code wrapper." The builder assigns mt.Field72 verbatim, and the generated sample output confirms <Prtry>/REASON/FRAUD SUSPECTED</Prtry> — the /REASON/ wrapper is included rather than stripped. Downstream systems and the clearing house that expect a clean proprietary reason string (per CBPR+ usage) may reject, mis-file, or fail to route the recall reason correctly — plausibly contributing to the structural non-conformance the clearing house flagged.
    • Fix: Strip the /REASON/ (and any other) sub-code delimiter before assignment, e.g. Prtry = ExtractSubCodeText(mt.Field72, "REASON"), and only fall back to the raw string if no recognized sub-code wrapper is present.
    • Verification: CONFIRMED

    [C-10] Settlement amount serialized without explicit invariant culture

    • File: Camt056Builder.cs:13
    • Evidence: Value = mt.Field32A.Amount.ToString(),
    • Impact: .ToString() with no format provider uses the current thread culture. On a host configured with a comma-decimal locale (common in many European deployments), this would emit 50000,00 into an XML numeric element expecting a dot-decimal value — malformed per ISO 20022 numeric typing. This is a real inconsistency in the file itself: three lines later, DateTime.ParseExact(...) correctly passes CultureInfo.InvariantCulture, but the amount serialization does not.
    • Fix: Value = mt.Field32A.Amount.ToString(CultureInfo.InvariantCulture).
    • Verification: CONFIRMED

    [C-08] Currency not visibly validated against ISO 4217

    • File: Camt056Builder.cs:14
    • Evidence: Ccy = mt.Field32A.Currency
    • Impact: No ISO 4217 validation is visible at the point Ccy is assigned. If mt.Field32A.Currency can carry an invalid, lowercase, or non-list code (e.g., XXX) unvalidated through to this builder, the resulting OrgnlIntrBkSttlmAmt/@Ccy would be non-conformant. The validation could plausibly exist in the (unseen) MT192/Field32A parsing layer.
    • Fix: Confirm and, if absent, add an ISO 4217 active-code-list check either in the MT192 parser or immediately before this assignment.
    • Verification: UNVERIFIED (validation, if any, would live in code not provided)

    MEDIUM findings

    None found.

    LOW findings

    [LOW-01] OrgnlGrpInf/OrgnlMsgNmId hardcoded to a fixed literal

    • File: Camt056Builder.cs:11
    • Evidence: doc.OrgnlGrpInf.OrgnlMsgNmId = "pacs.008.001.08";
    • Impact: This value is fixed regardless of input, while MT fields 11S/11R (MT192) indicate the original message context. Section 8.3 does not map any MT field to OrgnlGrpInf/OrgnlMsgNmId, so this cannot be asserted as a confirmed mapping defect against the provided ground truth — but a hardcoded literal in a field named "original message name" is a maintainability/correctness risk if this builder is ever reused for recalls of non-pacs.008-originated payments.
    • Fix: If this builder is intentionally scoped to pacs.008-only recalls, document that constraint in code (a named constant with a comment). If not, derive the value from the actual original message type.
    • Verification: UNVERIFIED (target element not covered by §8.3 ground truth; cannot confirm intended source)

    Mapping gaps (fields silently dropped)

    MT fieldPresent in sourceTarget MX path expectedObserved behaviourFinding ID
    (n/a — original UETR)No (not carried by MT192 in this fixture)TxInf/OrgnlUETRNever assigned; absent from generated outputC-20
    11S/11RYes (MT192 / MT192)Assgnmt/CretrIgnored; Cretr hardcoded to literal BIC insteadMAP-01
    72Yes (/REASON/FRAUD SUSPECTED)CxlRsnInf/PrtrySub-code wrapper passed through unextractedMAP-02

    Truncation risks

    No .substring(N)/.slice(N)-style truncation patterns were present in the pasted Camt056Builder.cs. No truncation-risk findings identified.

    Character set and encoding issues

    None found. The only free-text field observed (mt.Field72 → CxlRsnInf/Prtry) contains plain ASCII with no &, <, >, or " characters requiring XML escaping in this sample, and no X-charset validation is applied to any MX field in the pasted code.

    Structured address readiness

    Not applicable. The camt.056 FIToFIPmtCxlReq recall flow audited here carries no party postal address elements (no PstlAdr/AdrLine in either the MT192 input or the camt.056 output); §11 structured-address rules do not apply to this artifact set.

    Files audited

    • Camt056Builder.cs — CODE_BUILDER — 7 findings (C-20, MAP-01, C-09, MAP-02, C-10, C-08, LOW-01)
    • Sample inbound MT192 (pasted) — FIXTURE — 0 findings (evidence source only)
    • Sample generated camt.056 output (pasted) — FIXTURE — 0 findings (corroborating evidence for Camt056Builder.cs findings above; not double-counted)

    Out-of-scope artefacts skipped

    None. All three pasted artifacts (MT192 fixture, camt.056 fixture, Camt056Builder.cs) are in-scope per section 4.

    swift-mt-to-iso-20022-cbpr-migration-aud.pdf

    PDF · document

    Generated

    Example file from a real run - the skill writes it into your workspace.

    Connects securely to your tools. The creator never sees your data.

    What you get

    Detect truncation risks in payment IDs and reference fields.Validate MT 71A to MX ChrgBr mapping against CBPR+ rules.Audit structured address logic ahead of the 2026 mandate.Identify missing mandatory elements in pacs.008 and pacs.009 builders.

    About this skill

    Your MT→MX migration will not fail because of a missing semicolon. It will fail because your pacs.008 defaults ChrgBr to SHAR when 71A is absent, because your EndToEndId derivation throws on a null field 21, because your structured address is populated from a literal instead of the parsed party object, or because your recall camt.056 never populates OrgnlUETR. These are the defects that pass unit tests, pass schema validation, and get rejected at the correspondent.

    This skill is not a linter. It is a CBPR+ UHB v5-aware auditor built on the actual MT→MX field map — 33 defect classes, ten false-positive rules, and a mandatory-field enforcement pass. It reads your Java, C#, Python, XSLT, DataWeave, or YAML mapping, classifies every artifact, runs six audit phases in order, and produces a report your payments engineers can action the same day.

    What it catches that generic reviewers miss: charge-bearer defaults, service-level codes, structured-address readiness for the November 2026 mandate, MT 72 sub-code routing, decimal-separator handling, ISO 4217 validation depth, OrgnlUETR linkage on recall flows, hardcoded literals where parsed input should be.

    What it refuses to do: invent findings on clean code. Tag uncertain findings as UNVERIFIED instead of asserting them. Report a mandatory-field omission only in a supplementary table. Suppress defects because you said the code was expected to pass. Every finding carries File, Evidence, Impact, Fix, and a CONFIRMED or UNVERIFIED tag. Every report self-checks its own count arithmetic before emitting.

    Built for teams on a deadline — CBPR+ enforcement, HVPS+ migration, SEPA ISO 20022 cutover, or the November 2026 structured-address mandate. If your next production release includes a payment message builder you have not audited line-by-line, run this on it first.

    How to install

    Works the same in every agent - Claude, Cursor, Codex, Copilot and 20+ more.

    ~30 seconds
    1. 1

      Download the ZIP

      Free skills download straight away. Paid skills unlock right after purchase.

    2. 2

      Unzip into your skills folder

      Every agent reads skills from one folder on your machine. Drop the unzipped folder in there.

    3. 3

      Ask your agent to use it

      Restart the agent if it was already running. It picks the skill up automatically - no config needed.

    Skills folder by agent

    Click the path to copy it. Create the folder if it does not exist yet.

    Reviews

    No reviews yet

    Be one of the first to try it. Every listed skill passes our trust checks below.

    Security scanned

    Passed our 8-point scan before listing

    Fresh listing

    Recently published to Agensi

    30-day refund

    Not a fit? Get your money back

    Trust & safety

    Security scanned

    Verified clean 12 days ago

    • Passed all security checks, Safe to install

    Listed12 days ago

    What's inside

    Frequently Asked Questions