Skip to content

Roadmap

Philip Helger edited this page Oct 9, 2026 · 15 revisions

Roadmap

Status: draft. The milestone contents are a proposal for discussion, not a commitment. No dates are given on purpose — the ordering is the useful part, and it is driven by dependencies, not by calendar.

Ordering principle

Read-only before write, local before remote, and the config plus output plumbing first — because every later command depends on it and retrofitting a stable JSON envelope is painful.

M1 — Useful read-only core

The smallest set that makes the tool worth installing. Everything here is read-only, so a mistake cannot damage the network.

Item Notes
Project skeleton Maven build, picocli command tree, fat JAR, distribution archive.
Configuration File discovery, network profiles, environment overrides, peppol config show.
Output plumbing text and json renderers, the stable JSON envelope, exit code mapping, stdout/stderr split.
Identifiers Three areas, because the rules differ per type: peppol pid …, peppol doctypeid …, peppol procid ….
DNS / Discovery peppol dns hash, peppol dns resolve with the step-by-step chain.
SMP read peppol smp service-group, peppol smp metadata, peppol smp verify-signature, peppol smp can-receive.
Code lists peppol codelist list, peppol codelist search, offline bundled data, and active/deprecated/removed state filtering.
Document type aliases Resolving short names to full document type IDs, with ambiguity as an error. Needed early, because every other command's usability depends on it. Depends on Open Questions #9.
Shell completion Generated scripts shipped in the archive.
Test tiers T1–T3 Unit, component and CLI integration tests, plus the golden-file JSON contract tests. Set up with the code, not after — see Testing Strategy.
Test tier T6 Packaging tests, which is also what catches the shaded-JAR SPI problem.

M1 is done when peppol smp can-receive gives a correct answer with a correct exit code for a real participant on both networks, and its JSON output is documented.

M2 — Diagnostics and trust

Turns the tool from a lookup client into a diagnostic one. The theme is why does it not work.

Item Notes
Certificates / PKI peppol cert verify, peppol cert info, expiry and revocation checking, and Seat ID extraction via SPIDHelper.getSeatIDFromCertificate.
Keystore helpers Inspection, P12 conversion, CSR generation.
Directory peppol dir search via the released peppol-directory-searchclient 1.0.0, peppol dir businesscard (fetched from the participant's SMP), and dir index / unindex / indexed via peppol-directory-client. No Directory protocol code in this project.
Endpoint diagnostics peppol endpoint tls, peppol endpoint http. No AS4.
Registration conformance checks Now concretely specifiable from the specs: U-NAPTR URI rules (https only, no userinfo, no query/fragment), the SMP port-443 and TLS requirement, the signature algorithm profile, and the redirect certificate cross-check. These turn "it seems to work" into a pass/fail verdict and are cheap once the read path exists.
Phorm validation peppol validate file / detect / vesids via phorm-client.
MLS and SBDH peppol mls parse, peppol mls validate and peppol sbdh parse. Entirely offline, so nothing here waits on network access or credentials — placed in M2 because the theme is diagnosing a message, not looking one up.
Deprecation flagging Straightforward — the three-valued state comes from the enums. Note codelist diff and codelist update are rejected, so code lists are refreshed by upgrading the tool.
Test tier T4 Live read-only tests against the test network, nightly.

M2 is done when a failing exchange can be diagnosed end to end — registration, metadata, certificate trust, TLS, reachability — from one tool.

M3 — Write operations

First point at which the tool can change state, so it comes last among the core areas and needs the confirmation and dry-run conventions settled before it starts.

Item Notes
phoss-SMP write Create, update and delete participants and endpoints via the phoss-SMP write API, in the phoss-smp area.
SML SMP record read/create/update/delete, participant add/remove (single and CreateList/DeleteList batch), List() paging, peppol sml cert-change (a labelled BDMSL extension, not SML 1.3.0), and the two-step migration with key generation. All authenticated via mTLS.
Bulk peppol bulk lookup over a CSV, plus SMP bulk import and export.
Safety rails --dry-run, and an explicit confirmation or --yes for every destructive action — with --yes mandatory for bulk writes, which also prompt when stdin is a TTY. > TODO(decide): make --dry-run the default for write commands?
Test tier T5 Live write tests against project-owned test-network resources, manually approved. Blocked unless such resources exist — see Testing Strategy.

M3 is done when an SMP operator can do their routine participant maintenance without the web UI.

Upstream dependencies

Some milestone contents depend on gaps in the libraries rather than on work in this project. These should be scheduled upstream first, or the features move milestone. Full detail in Library Gaps.

Needed for Gap Milestone at risk
peppol pid check-value (GLN) GLN algorithm exists in ph-masterdata (GTINValidator.isValidGLN) but is not wired into the peppol-id-checks SPI M1 — small upstream fix, no new dependency
SMP write commands No standardised SMP management API (SMP 1.4.0 §3) M3 — scope must be decided, not discovered
Config discovery ph-config has no XDG/%APPDATA% discovery M1 — needed either way, better solved upstream

Later

Deliberately unscheduled; each needs its own decision first.

Item Blocked on
MLS generation Deferred — no present need, and a CLI emitting a statement about someone else's message traffic is the wrong default. Parsing and validating are accepted and scheduled for M2. See Open Questions #4.
GraalVM native image Open Questions #1.
Package manager distribution Homebrew, Scoop, distro packages — depends on the packaging outcome in Architecture.

Clone this wiki locally