Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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

  1. Non-/ts base paths. Servers (/servers), Ecosystems (/ecosystems), Spaces (/spaces), IGs (/implementation-guides) and the public /public/ecosystems are served off the API root, not /ts/*. Verified working through the /txapi proxy on the dev backend (list endpoints return 200). Confirm the same holds in staging/prod edge config. (verified in dev)
  2. 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.
  3. 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).
  4. 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)

  1. Two privilege families (Server.* and Space.*) both gate server actions in the reference (backend uses Server.*; route guards/edit affordances use {id}.Space.*). DECIDE whether the target auth model actually grants {id}.Space.* for server ids.
  2. Load-for-edit needs Server.write (GET /servers/{id} is write-gated). A read-only details view for a Server.read-only user must source from the list payload (public view, no secrets), not GET /{id}. The built read view uses GET /{id} (fine for the superuser dev); revisit for the phased edit/details split.
  3. Secret masking round-trip. ✅ Implemented — clientSecret / Authorization header values are masked to null on read and the edit form uses the _masked = “null means keep persisted” convention (ServerMetadata seeds _masked on load and strips it on save). Verify against a server with real credentials that an unchanged edit preserves the secret.
  4. edit folded into details. TEDY convention has no /:id/edit route (edit is a toggle inside the details/metadata view). This deviates from the reference’s separate /edit — intentional; flag for reviewers.
  5. 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.
  6. exclusions has no editor in the reference (round-trips via ecosystem import/export only) — treat as pass-through.

Ecosystems (TEDY.09)

  1. Servers dependency. The picklist + tag resolution need GET /servers. If /servers is gated by *.Server.read (distinct from Space.read), a Space.read-only user opening Ecosystems could get an empty/403 picklist — handle gracefully.
  2. formatVersion is effectively constant "1" (server-defaulted, read-only) — kept in the model/form for fidelity.
  3. Public ecosystem.json link is /txapi/public/ecosystems/{code} — confirm the proxy forwards /txapi/public/* and that it’s genuinely unauthenticated in the deployed env.

Spaces (TEDY.07)

  1. 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 through TxResourceBar; resource tabs read the space’s linked resources, and Comparison/Repository are tabs.
  2. 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.
  3. 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 a PackageResource + PackageTransactionRequest), never creates. The package/version layer is hidden behind an auto-managed default package (linkResourceToSpace/unlinkResourceFromSpace).
  4. Zero-package default (resolved). When a space has no package, add-as-link creates a default package ({code: space.code||'default', status:'draft'}) with a 1.0.0 version, 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.
  5. Diff is async (Lorque), built. GET /spaces/{id}/diff → 202 {id}; poll GET /lorque-processes/{id} until finished/failed; result is base64 JSON. runSpaceDiff drives start→poll→decode and surfaces the decoded failed error in the tab. Note: on the dev backend the diff fails with TC105: 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).
  6. GitHub tab = OAuth-redirect state machine (built). authenticate may 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/status is 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.
  7. textContains space search — TEDY’s list wires it; DECIDE whether the backend applies it server-side or it should be dropped.

Implementation Guides (TEDY.06)

  1. 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).
  2. Reference-web IG model has fields the backend ignores (otherTitle, topic, useContext, sourceReference) — the built type includes only persisted fields.
  3. GitHub push ignores per-file selection (server recomputes all changed files); the per-file checkboxes are cosmetic — DECIDE whether to keep the affordance.
  4. List delete privilege typo in the reference (*.Implementation.maintain) — use the correct *.ImplementationGuide.maintain.
  5. “Add FHIR” is a dead menu item in the reference — implement a FHIR-import flow or omit.
  6. MapSet skipped on GitHub export (no PATHS entry) — expected or a gap? DECIDE.
  7. No data in the dev backend — IG list verified empty (“No data”); rich rendering (versions/date/title) is unverified against live data.