TEDY new modules — open questions & risks
Consolidated from the research + first-slice implementation of the four new modules (TEDY.06 Implementation Guides, TEDY.07 Spaces, TEDY.08 Servers, TEDY.09 Ecosystems). Decisions marked DECIDE need product/back-end confirmation before the phased screens land.
Cross-cutting
- Non-
/tsbase paths. Servers (/servers), Ecosystems (/ecosystems), Spaces (/spaces), IGs (/implementation-guides) and the public/public/ecosystemsare served off the API root, not/ts/*. Verified working through the/txapiproxy on the dev backend (list endpoints return 200). Confirm the same holds in staging/prod edge config. (verified in dev) - Numeric vs string ids. Servers/Ecosystems/Spaces use numeric ids; IG uses a string id with versions addressed by string
version. The resource-canonical routing helpers used by CS/VS/MS assume a string id — the new modules use plain numeric-id routes instead. - Auth in dev is the guest superuser. Privilege gating is wired via
usePrivileged(), but everything is visible in dev. Real gating needs the tx OIDC wiring (tracked with the existing tx-Keycloak follow-up). - Naming. No committed code/i18n/comment contains the reference product names; specs use “the reference editor”/“the reference project”. Real backend URLs live only in the gitignored
.env.
Servers (TEDY.08)
- Two privilege families (
Server.*andSpace.*) both gate server actions in the reference (backend usesServer.*; route guards/edit affordances use{id}.Space.*). DECIDE whether the target auth model actually grants{id}.Space.*for server ids. - Load-for-edit needs
Server.write(GET /servers/{id}is write-gated). A read-only details view for aServer.read-only user must source from the list payload (public view, no secrets), notGET /{id}. The built read view usesGET /{id}(fine for the superuser dev); revisit for the phased edit/details split. - Secret masking round-trip. ✅ Implemented —
clientSecret/Authorizationheader values are masked to null on read and the edit form uses the_masked= “null means keep persisted” convention (ServerMetadataseeds_maskedon load and strips it on save). Verify against a server with real credentials that an unchanged edit preserves the secret. editfolded intodetails. TEDY convention has no/:id/editroute (edit is a toggle inside the details/metadata view). This deviates from the reference’s separate/edit— intentional; flag for reviewers.- Remote resource listing (
/servers/{id}/resources/{type}for non-current-installation servers) makes live paged FHIR calls — needs loading UI + tolerance of partial/empty results. exclusionshas no editor in the reference (round-trips via ecosystem import/export only) — treat as pass-through.
Ecosystems (TEDY.09)
- Servers dependency. The picklist + tag resolution need
GET /servers. If/serversis gated by*.Server.read(distinct fromSpace.read), aSpace.read-only user opening Ecosystems could get an empty/403 picklist — handle gracefully. formatVersionis effectively constant"1"(server-defaulted, read-only) — kept in the model/form for fidelity.- Public
ecosystem.jsonlink is/txapi/public/ecosystems/{code}— confirm the proxy forwards/txapi/public/*and that it’s genuinely unauthenticated in the deployed env.
Spaces (TEDY.07)
- Context shell → TxResourceBar (decided, built). The reference uses a matrix-param context shell (
;s=;p=;v=) with a package/version drawer. TEDY instead renders the space throughTxResourceBar; resource tabs read the space’s linked resources, and Comparison/Repository are tabs. - Scope simplification (decided). Package-manager UI, SSG generator, ACL editor and wiki/GitHub import are out of scope; mdBook (SSG replacement) is a future concern. Metadata = Core + GitHub only. This is narrower than the reference on purpose.
- Resources map directly to the Space (built, point 6). A space’s CS/VS/MS are
PackageResources;searchCodeSystems({spaceId})returns exactly the linked set. “Add” links an existing resource (append aPackageResource+PackageTransactionRequest), never creates. The package/version layer is hidden behind an auto-managed default package (linkResourceToSpace/unlinkResourceFromSpace). - Zero-package default (resolved). When a space has no package, add-as-link creates a default package (
{code: space.code||'default', status:'draft'}) with a1.0.0version, then appends. The link picker filters against the space’s full linked set (not just the visible page) so already-linked resources aren’t offered. - Diff is async (Lorque), built.
GET /spaces/{id}/diff→ 202{id}; pollGET /lorque-processes/{id}untilfinished/failed;resultis base64 JSON.runSpaceDiffdrives start→poll→decode and surfaces the decodedfailederror in the tab. Note: on the dev backend the diff fails withTC105: Terminology server for current installation is not defined(no comparable server configured) — the error path is verified; the success path needs a server-configured space to exercise.POST …/sync(per-resource) is not implemented (out of the simplified scope). - GitHub tab = OAuth-redirect state machine (built).
authenticatemay return{isAuthenticated:false, redirectUrl}→ the tab shows Connect (hard redirect). MS DevOps is the identical component parametrized, feature-flagged (VITE_TX_MSDEVOPS_ENABLED). Default commit message is the neutral"update space". Note:GET …/github/statusis slow/blocks without a live OAuth session, so on the dev backend only the not-connected/Connect state is exercised; the status/push/pull/diff paths need a connected repo to verify end-to-end. textContainsspace search — TEDY’s list wires it; DECIDE whether the backend applies it server-side or it should be dropped.
Implementation Guides (TEDY.06)
- Version delete has no backend endpoint — the reference UI exposes it but the controller has none (would 405/404). Omit the delete action (do not port the client method as-is).
- Reference-web IG model has fields the backend ignores (
otherTitle,topic,useContext,sourceReference) — the built type includes only persisted fields. - GitHub push ignores per-file selection (server recomputes all changed files); the per-file checkboxes are cosmetic — DECIDE whether to keep the affordance.
- List delete privilege typo in the reference (
*.Implementation.maintain) — use the correct*.ImplementationGuide.maintain. - “Add FHIR” is a dead menu item in the reference — implement a FHIR-import flow or omit.
MapSetskipped on GitHub export (no PATHS entry) — expected or a gap? DECIDE.- No data in the dev backend — IG list verified empty (“No data”); rich rendering (versions/date/title) is unverified against live data.