Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
[0.10.1] - 2026-09-07
Changed
- regulatory-update: Peppol BIS Billing 3.0 spec pin 3.0.20 → 3.0.21, closes
regulatory-updateissue #5. Released 2026-05-20, mandatory from 2026-08-17. Key changes: new optional Profile 02 “Billing with Response” (separate SMP registration); UBL/CII 1.3.16; rulesPEPPOL-COMMON-R052/R053move from warning to error for every profile; new warning-only rules for Dutch identifiers. All of these live in the Peppol-specific overlay (PEPPOL-EN16931-UBL.sch), which stays unbundled per the existingBE-SC-11licensing gap —validate_invoice_beonly runs the CEN base Schematron, so none of this is a behavior regression. Documentation-only pin refresh (context-library/countries/be.mdat the workspace root); no code change.
[0.10.0] - 2026-08-24
Changed
peppol_sendnow emits a realwsse:Securitymessage signature.mcp-einvoicing-corev1.20.0 fixed the AS4 transport client’s_apply_message_signature, which previously computed a signature and discarded it, sending unsigned outbound messages. This is an API-compatible, wire-level behavior change — no code in this package changed to pick it up, but every outbound message sent through this package’speppol_sendis now actually signed. Not yet validated against a live sandbox Peppol AP; treat as unverified at the transport level until that validation runs.- Lower-bound pin on
mcp-einvoicing-coreraised to>=1.20.0(was>=1.19.0). xslt2extra now chainsmcp-einvoicing-core[xslt2]>=1.20.0(was>=1.19.0).
Added
- Mounted three new opt-in core plugins in
server.py, alongside the existing Peppol tool plugin:register_peppol_reporting_tools(mcp_einvoicing_core.peppol.reporting_tools) —validate_eusr_report,validate_tsr_report(End User / Transaction Statistics Reports). Requires the[xslt2]extra.register_peppol_mls_tools(mcp_einvoicing_core.peppol.mls_tools) —validate_mls_message,build_mls_message(Message Level Status). Requires the[xslt2]extra.register_en16931_codelist_tools(mcp_einvoicing_core.en16931_codelist_tools) — 13list_*/check_*pairs plusget_en16931_codelist_versionfor the EN 16931 semantic code lists. RequiresEINVOICING_EN16931_CODELIST_DIRto be set to a local copy of the CEF Digital code lists (not bundled).peppol_directory_search(public Peppol Directory search) arrives automatically via the existingregister_peppol_toolsmount — noserver.pychange needed for this one.
- All new tools are mounted unconditionally; they raise a clear error at call time (not at registration) when their extra or data directory is missing, matching the existing eDEC codelist tool pattern.
[0.9.0] - 2026-08-21
Changed
check_peppol_participant_beremoved. Peppol participant lookup (and the rest of the Peppol network surface: service-endpoint lookup, DNS-only diagnostic, AS4 send, and the eDEC codelist tools) now comes from the shared core Peppol tool plugin (mcp_einvoicing_core.peppol.tools.register_peppol_tools), mounted inserver.pywith a BE-specific identifier adapter (_be_id_adapter) that normalizes a bare Belgian VAT number to the0208:<digits>Peppol scheme (KBO/BCE). Usepeppol_lookup_participantinstead of the removed tool; behavior and response shape are unchanged for that use case, but the tool now also exposespeppol_get_service_endpoint,resolve_peppol_dns,peppol_send, and 8 eDEC codelist tools that were not previously available in this package. Seecontext-library/roadmap-2026.md[ARCH-CONVERGE-BE].- Lower-bound pin on
mcp-einvoicing-coreraised to>=1.19.0(was>=1.18.0), required forregister_peppol_tools.
[0.8.0] — 2026-08-20
Changed
validate_invoice_be(profile="peppol-bis-3"|"pint-eu")now returns real validation results (metadata.engine="schematron-xslt",metadata.scope="en16931-base-only") instead of the"unavailable"result introduced in v0.7.0, using the CEN EN16931 base Schematron newly bundled inmcp-einvoicing-core>=1.18.0([CORE-EN16931-BASE-SCHEMATRON-1]). This checks the ~50 CENBR-*structural/arithmetic rules — a real improvement over the presence-only XPath fallback this package carried before v0.7.0 — but explicitly does not check the Peppol-specific overlay rules (profile/process ID registration,EndpointIDscheme, narrowed code lists). Every result now carries an explicit warning that this is not a full Peppol BIS3 conformance check. Seecontext-library/decisions/peppol-schematron-artifact.mdfor why the overlay itself still cannot ship (no confirmed OpenPeppol redistribution rights).- Lower-bound pin on
mcp-einvoicing-coreraised to>=1.18.0(was>=1.15.0) for the newschematron_artifactsmodule.
Unchanged
- The local full-Peppol-overlay Schematron path (
specs/peppol_bis_3/,_find_schematron_xslt) stays wired exactly as before — if a properly-licensed compiled overlay stylesheet is ever added there, it still takes priority over the new base-only path. No such file exists today.
[0.7.0] — 2026-08-17
Removed
PEPPOL_BIS3_RULES(the package’s hand-rolled Peppol BIS 3.0 base-rule approximation) removed entirely, rather than kept as the “fixed” version shipped in v0.6.0. It covered only ~10 of the ~50+ real CEN/Peppol rules (no arithmetic/totals checks) and had just been found to carry a rule-ID mislabeling bug — a package-local partial duplication of rules that are identical across every Peppol-BIS3-consuming country is a recurring source of exactly this class of bug. Seecontext-library/roadmap-2026.md[CORE-PEPPOL-SCHEMATRON-1].
Changed
validate_invoice_be(profile="peppol-bis-3"|"pint-eu")now returns an explicit unavailable result (valid=False, an error explaining why,metadata.engine="unavailable") when no real compiled Schematron is loaded, instead of a silently-partial pass/fail. A false “valid” from an incomplete rule set is worse than a clear “cannot validate” signal for a compliance tool.standards/mercurius.py’sMERCURIUS_RULESno longer splices inPEPPOL_BIS3_RULES— it now contains only the Mercurius-specific overlay (MER-002/MER-003/MER-004), which is genuinely BE-local and was not part of the cross-country duplication problem. Everymercurius-profile result now carries an explicitMERCURIUS-SCOPEwarning stating that base EN16931/Peppol BIS 3.0 compliance is not checked by this profile, since it no longer runs those checks at all.
Fixed
mercuriusprofile validation was silently affected by the same rule-ID mislabeling bug fixed in v0.6.0, sinceMERCURIUS_RULESpreviously spliced inPEPPOL_BIS3_RULESdirectly. Moot now that the splice is removed.
[0.6.0] — 2026-08-17
Fixed
PEPPOL_BIS3_RULES(XPath fallback validator): rule IDs were paired with the wrong rule content — every entry from the oldBR-02onward tested a different field than its real CEN/Peppol rule ID (e.g. the oldBR-02checked ProfileID/BT-23, but the realBR-02checks the Invoice number/BT-1). Relabeled against the OpenPeppol 3.0.20 Schematron sources; the Profile identifier (BT-23) check is now correctly attributed toPEPPOL-EN16931-R001rather than a nonexistent CENBR-*id.BEDocumentValidator._validate_with_profile: the Schematron-XSLT result branch readsvrl_result.messages/m.message, fields that do not exist on core’sValidationResult/ValidationMessage(.errors/.warningsof.text) — dead code, never exercised because no XSLT was ever bundled, but would have raisedAttributeErrorthe first time it ran.BEDocumentValidator.__init__now uses core’sload_schematron_validator()(auto-dispatch to XSLT 1.0 or Saxon/XSLT 2.0+) instead of hardcoding the XSLT-1-onlySchematronValidator.
Changed
- Pinned Peppol BIS Billing 3.0 spec version to 3.0.20 (OpenPeppol 2025 November release, was 3.0.17). Closes
regulatory-updateissue #4. - Added optional
xslt2extra (mcp-einvoicing-core[xslt2]) for future Saxon-HE-backed Schematron validation.
Known gap (unchanged)
[GAP id=core.schematron.be_bundled_xslt]remains open: no compiled, SVRL-producing Schematron XSLT is bundled. The 3.0.20 release bundle sourced for this refresh contains only the Schematron sources (.sch) plus a UBL-to-HTML viewer stylesheet (verified not to be a validator) —validate_invoice_becontinues to run the XPath fallback above. Seecontext-library/countries/be.mdfor detail.
[0.4.0] — 2026-06-30
Added
parse_ubl_invoice_betool: UBL 2.1 invoice parsing for the mandatory reception capability (Art. 13quater RD no. 1), including Belgian extensions (OGM/VCS reference, 0208 endpoint scheme)- EU PINT v1.0.1 (
pint-eu) profile:urn:peppol:pint:billing-1@en16931-2017@eu-3 - OGM/VCS structured payment reference check-digit validator on
BEPaymentTerms.ogm_reference - Schematron-based validation via core’s
SchematronValidatorwhen the Peppol BIS 3.0 XSLT is present inspecs/ - Structured
BCE_API_KEY_MISSINGwarning and structured Peppol lookup error responses
Removed
validate_pint_betool and thepint-beprofile (PINT-BE was never a published OpenPeppol specification)
Fixed
buyer_item_idrenamed tobuyer_article_id(BT-156, was mislabelled as BT-157); now wired to<cac:BuyersItemIdentification>in UBL output
Changed
- Core dependency floor raised to
mcp-einvoicing-core>=1.13.0,<2.0.0
[0.3.0] — 2026-06-27
Added
- [ARCH-VALID-1c]
BEParty.tax_idnow enforces the BCE/KBO modulo-97 check digit at model-construction time via a new@field_validatorcallingmcp_einvoicing_core.TaxIdentifier.validate_be_vat(3-layer party-validation pattern, Layer 1). Invalid VAT/enterprise numbers raiseValidationErrorinstead of being silently accepted.
Changed
- Test fixtures in
tests/conftest.pyswitched from placeholder VAT numbers to mod-97-valid examples (BE0428759497andBE0403170701).
[0.1.0] — TBD
Initial release.