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.3.3] - 2026-09-07
Changed
- regulatory-update: Peppol AE TDD version pin 1.0.3 → 1.0.4, closes
regulatory-updateissue #1. Upstream published TDD v1.0.4 (Final, 2026-07-23), a Schematron/validation-logic correction release (ibr-tdd-17now independently enforces both the Receiver Endpoint Scheme identifier’s presence and the SPIS value0242). Documentation-only pin refresh —specs/tdd/’s bundled XSD/schematron are dev-reference copies only and were never compiled into the shipped package (no confirmed OpenPeppol redistribution rights, seecontext-library/decisions/peppol-schematron-artifact.md);validate_tdd_aehas reportedengine="unavailable"since v0.2.0, so no runtime behavior changes either way. UpdatedREADME.md,README.ar.md,specs/README.md, andcontext-library/countries/ae.mdat the workspace root.[Unverified against a locally-held primary source]— the bundledtdd-release-notes.pdfstill documents v1.0.3 only.
[0.3.2] - 2026-09-06
Fixed
- AE-SC-1:
__version__drift (was"0.1.0") aligned withpyproject.tomlandserver.json.src/mcp_einvoicing_ae/__init__.pyhad been left at0.1.0across three releases whilepyproject.toml/server.jsonadvanced to0.3.1; the drift passed silently becausetests/test_ae_scaffold.pyhardcoded the same stale literal in its assertion. Bumped__version__to0.3.2and addedtests/test_metadata.py(test_version_slot_consistency,test_server_json_version_matches_pyproject), which readspyproject.toml/server.jsondirectly instead of asserting a literal, so this class of drift cannot pass silently again. Same class of bug asmcp-nfe-brBR-SC-1 (context-library/launches/roadmap-archive-2026.md).
[0.3.1] - 2026-09-06
Fixed
- CI:
mypytype errors resolved (no behavior change).AEUBLSerializer.serializeguarded theCustomizationIDfallback lookup againstNonebefore calling.addnext()(wire_formats.py);_extract_ae_extensions(tools/parsing.py) gained a properetree._Elementparameter annotation and a narrowingcaston the XPath result (lxml’s.xpath()return type is a broad union covering string/number/boolean XPath results, not just element node-sets — our XPath expressions here only ever select elements).ci.yml’smypystep has nocontinue-on-errorfor this package (unlike most others in the fleet), so these were live CI failures, not documented pre-existing debt.
[0.3.0] - 2026-08-29
Resolves the BLOCKING and now-actionable findings from the first AE compliance audit
(audit/2026-08-audit-ae.md, tracked in context-library/audit-history.md).
Fixed
- AE-SC-1 (BLOCKING): generated PINT AE invoices are now structurally conformant.
generate_invoice_aepreviously reused core’s unmodifiedEN16931UBLSerializer, which could not emit the unconditionally-mandatorycbc:UUID(BTAE-07),cbc:ProfileExecutionID(BTAE-02), or per-linecac:ItemPriceExtension(BTAE-10/BTAE-08) — every generated invoice was non-conformant, masked by v0.2.0’s EN16931-base-only validation. Fixed viamcp-einvoicing-corev1.25.0 (document_uuidfield +cac:ItemPriceExtensionopt-in serializer flag) plus a newAEUBLSerializer(mcp_einvoicing_ae/wire_formats.py) that addscbc:ProfileExecutionIDand thetrade_license_numberPartyLegalEntity/CompanyID(schemeAgencyID="TL").AEInvoice.profile_execution_idis now a required field (^[01]{8}$), anddocument_uuid(inherited from core) is enforced via a model validator. - AE-SC-3:
trade_license_numbernow round-trips. Previously accepted and validated onAEPartybut silently dropped by generation and never re-extracted on parse. Generation now emits it (viaAEUBLSerializer);parse_invoice_aere-extracts it (plusdocument_uuidandprofile_execution_id) from the raw XML and re-validates the result asAEInvoice.
Added
- AE-TC-1: the 5.00% standard VAT rate is now enforced.
AEInvoiceLinegained a model validator requiringtax_rate == AE_STANDARD_VAT_RATEfor categoryS, andtax_rate == 0forAE/E/O/Z(the zero-rate constraint is definitionally safe per EN 16931BR-{Z,E,AE,O}-05, independent of any AE-specific citation). - AE-LC-2: Peppol participant lookup registered.
server.pynow mounts core’sregister_peppol_toolsplugin with an AE-specific TIN-based id adapter (scheme0235, first 10 digits of the TRN). - AE-LC-1 (partial): OASIS UBL 2.1 base schemas vendored. Copied from
mcp-invoicenow-sg’s identical vendored copy intospecs/shared/ubl-2.1/common/, unblocking a future XSD-level TDD validator. No XSD validation is implemented yet — the full TDD leg (serialize + validate + transport) stays parked behind the transport-channel question.
Changed
- AE-AG-1: audit gate cleaned up.
audit/audit_vs_core.py’s module-scan list was missingtools/generation.py,tools/parsing.py,tools/validation.py, and the newwire_formats.py— CHECK 1 was reporting ~90 core symbols as “unused” that were genuinely imported, just in unscanned files. Fixed the scan list and populated_INTENTIONAL_OVERRIDESfor the remaining genuinely-unused symbols. CHECK 1 now runs 0 blocking / 0 warnings (down from 142). - Core dependency pin bumped
>=1.23.0,<2.0.0→>=1.25.0,<2.0.0(requires the newdocument_uuid/ItemPriceExtensioncore capabilities).
0.2.0 - 2026-08-28
Fixed
- Removed unlicensed bundled OpenPeppol-derived Schematron/XSD artifacts.
v0.1.0 shipped five self-compiled files with no confirmed redistribution
rights:
pint-ubl-billing.xslt,pint-ubl-selfbilling.xslt,pint-jurisdiction-ae.xslt,peppol-ae-tdd.xslt, andpeppol-tdd-1.0.0.xsd. v0.1.0’s docstrings argued the licensing blocker incontext-library/decisions/peppol-schematron-artifact.mdwas “moot” here because the source files were supplied directly by the user rather than fetched from the web — that reasoning was wrong: being user-supplied only avoids Claude autonomously retrieving copyrighted material, it does not confer redistribution rights to bundle the content into a published wheel. Same gap already identified and fixed formcp-invoicenow-sgv0.2.0, and already blocked-and-labeled honestly formcp-einvoicing-be/mcp-ksef-pl’s Peppol overlay.
Changed
validate_invoice_aenow runs core’s shared, licensing-clean CEN EN16931 base Schematron (en16931_base_schematron_validator()— the same artifactmcp-einvoicing-bev0.8.0 /mcp-ksef-plv0.6.0 consume) in place of the two removed PINT AE stylesheets. Unlikemcp-invoicenow-sg(blocked by an unsourced GST-category crosswalk), AE has no equivalent blocker —AEInvoice’s tax category codes are already UNCL5305-derived (Aligned-TaxCategoryCodes.gc) and itsTaxScheme/IDis already the literal"VAT"(core’s unmodifiedEN16931UBLSerializer). Every result now carriesEN16931_BASE_ONLY_SCOPE_WARNING(PINT-AE jurisdiction rules are not checked) andEN16931_BASE_KNOWN_LIMITATIONS_WARNING(BR-CO-09is expected to fire on every genuine AE invoice — UAE TRNs carry no ISO 3166-1 alpha-2 prefix, confirmed against the government-supplied example fixture).validate_tdd_aenow always returns an explicitengine="unavailable"result. No licensing-clean substitute exists for the removedpeppol_ae_tddSchematron andpeppol-tdd-1.0.0.xsd— the Peppol AE TDD is a distinct document type from an EN16931 UBL invoice, and core provides no TDD validation capability at all.- Known coverage loss, documented not silent: the PINT-AE jurisdiction
overlay (
ibr-*-aerules) and all TDD validation are no longer checked. SeeEN16931_BASE_ONLY_SCOPE_WARNINGand_TDD_VALIDATION_UNAVAILABLEintools/validation.py.
0.1.0 - 2026-08-27
Added
- Initial package scaffold:
src/layout, governance documents, CI and publish workflows, audit directory, and a stdio MCP server entry point with no tools registered yet. - Normative specifications supplied under
specs/; PINT AE publication-status gate resolved (2026-08-26). Seespecs/README.mdandcontext-library/countries/ae.mdin the root repo. AEInvoice/AEParty/AEInvoiceLinemodels (billing + self-billing via avariantconstructor input), reusingmcp_einvoicing_core.wire_formats’sEN16931UBLSerializer/EN16931UBLParserdirectly.AETaxDataDocumentmodel for the Peppol AE TDD (5th-corner reporting document, not a UBL invoice). PINT AE billing/self-billing profile URNs registered viamcp_einvoicing_core.profile_registry. Four bundled Schematron validators (PINT AE billing/self-billing UBL + jurisdiction rules, Peppol AE TDD), requiring thexslt2optional extra (saxonche)._IS_EN16931_FAMILYflipped toTrueinaudit/audit_vs_core.py. (2026-08-27)- Core dependency bumped to
mcp-einvoicing-core>=1.22.0,<2.0.0forTaxIdentifier.validate_ae_trn(), then to>=1.23.0,<2.0.0at release time to match the latest published core version. - MCP tools registered on the server:
generate_invoice_ae,validate_invoice_ae,validate_tdd_ae,parse_invoice_ae. Generation and parsing reusemcp_einvoicing_core.wire_formats.EN16931UBLSerializer/EN16931UBLParserdirectly (AEInvoice/AEPartyadd no bespoke serializer); validation dispatches to the four bundled Schematron stylesheets. Known limitation:AEParty.trade_license_numberhas no mapping in core’s generic UBL serializer/parser and does not round-trip throughgenerate_invoice_ae/parse_invoice_ae.validate_tdd_aeruns Schematron only and flags the missing XSD check explicitly in every result. (2026-08-27)
Blocked
- Schema-level (XSD) validation of the Peppol AE TDD document —
peppol-tdd-1.0.0.xsdimports the base OASISUnqualifiedDataTypes-2schema, which has not been supplied. Schematron-level TDD validation is unaffected. - The TDD reporting-leg transport channel (same AS4 channel as the invoice, or a separate one, e.g. a direct EmaraTax REST push) — undocumented in any supplied source; not a core gap either way, but blocks a transport implementation until resolved.