Skip to content

Roadmap: operational, manually testable AS / DC / TP — prioritized open issues #255

Open

Description

@dfcoffin

Purpose

Prioritise every open issue towards one objective: operational Authorization Server, Data Custodian and Third Party applications that can be tested by hand, quickly. Phases run in order. Within a phase, the order is the critical path. Size: S ≈ a day, M ≈ a few days, L ≈ a week or more.

Principles: unblock the end-to-end flow before adding breadth; make local setup reproducible before debugging it; fix wrong data exposure before anything is shared; one source of truth for each concern (schema = Flyway, access rules = one policy, registration = RFC 7591).


Phase 1: Manually testable locally (critical path)

Exit criteria: scripts/local/start-all → smoke passes; a TP user logs in to the TP, authorizes access, logs in and consents at the DC, the TP receives a token, and the TP displays that customer's usage data. Admin and token checks run from docs/LOCAL_TESTING.md.

# Item Size Why now
1 #254 Local manual-test kit (aligned local profiles, AS admin bootstrap, start/stop/smoke scripts, runbook) S Removes the hidden-secret and mismatch friction; everything after builds on it
2 #253 DC local sample dataset (with the DC-local slice of #241: Flyway on H2) S–M Without data, consent and feeds can't be exercised
3 #232 AS → DC delegation drops the authorize parameters (400) S Blocks the customer flow
4 #249 TP username/password login M A TP user must exist to start the flow; today the login button gives a 500
5 #146 TP OAuth client wiring (authorize → callback → token storage) + #202 token-response URIs M TP must obtain and store the token and know where the customer's resources are
6 #197 (rest: <atom:content>, getResource(), empty feed) + minimal #89 (fetch and display a UsagePoint and its readings) M TP must show data to prove the flow end to end
7 #211 customer scope narrowing → invalid_scope S–M Consent with fewer function blocks must work
8 #225 401 (not 302) on unauthenticated token / introspect / revoke; #234 missing AS H2 tables S + S Makes curl testing and the logs trustworthy

Phase 2: Safe to share (sandbox / demo deployment)

# Item Size Notes
9 Fixes for privately reported security advisories (tracked in GitHub Security Advisories) M Before anything is exposed beyond localhost
10 #187 resource scoping: ESPI GETs must be limited to the token's Subscription/Authorization (today Subscription-scoped GETs ignore subscriptionId, per CLAUDE.md) L Prevents one customer's data being returned for another's token
11 #138 consent withdrawal → token revocation + subscription cleanup M
12 #251 registration access token (RFC 7591 + FB=36_40 renewal, DC accepts it for ApplicationInformation) → #252 TP self-registration M + L Replaces the seeded TP client; spike done
13 #131 dependency CVEs; #237 CodeQL triage M
14 #241 (rest) + #145 / #123 / #152 vendor schema alignment; #200 audit-log writers; #199 abandoned-authorization cleanup M–L Needed for the MySQL/PostgreSQL deployment profiles
15 #233 metadata advertises unsupported JWT/JWKS features; #188 TLS certificates S + M

Phase 3: ESPI completeness and certification readiness

#119 epic, #187 (E1 engine: all resources), full #89 import, #168 / #169 / #101 schema compliance, #245 DC customer portal (usage, Download My Data), #186 AS home page.

Continuous: quality and hygiene (pick up alongside)

#151 rebuild the AS OAuth flow integration suite (it would have caught #232; prioritise it early in Phase 2), #194 skipped/disabled tests, #78 timestamp-resolution flake (seen again: CustomerAccountRepositoryTest.shouldUpdateTimestampsOnModification), #88, #103, #133.


Recommended to close (reviewer: please confirm)

# Reason
#141 Done in #250: DC Authorization endpoints implemented with per-TP filtering (AdminCaller, AdminRowScopeTest)
#204 Done: admin API bearer tokens are on main (merged with the GHSA-mh65 fix, 40812eb)
#205 Done: admin user store + passkey MFA + bootstrap are on main (same merge)
#203 Superseded by #251: the certification question is answered, since REQ.21 requires the registration access token
#98 Delivered by #116; no description of its own; remaining work is in #187 / #119
#117 Obsolete: pr-checks.yml no longer exists, and no workflow runs Spotless

Decisions needed

  1. Third Party: register itself via RFC 7591 dynamic client registration and manage its registration #252: how a Third Party receives its RFC 7591 initial access token during onboarding (DC operator, GBA, or another out-of-band step).
  2. Registration access token: issue it on RFC 7591 registration, renew via FB=36_40, and require it for ApplicationInformation #251: RFC 7592 (Experimental) says a registration access token should not expire while the client is registered; ESPI renews an expired one through FB=36_40. Document this as a deliberate ESPI profile choice.
  3. Third Party cannot unmarshal any ESPI Atom feed (AtomFeedDto date adapters + abstract entry type) #197: adopting the <atom:content> wrapper changes the wire format for both DC export and TP import. Confirm it should be done as one change.

References

RFC 7591 (Dynamic Client Registration), RFC 7592 (Registration Management, Experimental), NAESB REQ.21 v4.1, CLAUDE.md "Known Issues"

🤖 Generated with Claude Code

Activity

  1. dfcoffin commented on Nov 14, 2026

    @dfcoffin
    ContributorAuthor

    Roadmap update:

    🤖 Generated with Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    taskA general task

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions