EdiTargetV1 (table fields and associations, current rules, transforms with argument schemas)
POST /sandbox/preview
EdiPreviewV1 (parse counts, findings by SNIP level, ack, mapped records, diffs; values suppressed for PHI maps)
POST /maps/{mapId}/validate
EdiValidationV1 (per-rule errors for unsaved rules)
Same permissions as the record actions (edi.map.preview, table read); rule writes stay on the core table API.
MapPreviewService is shared by the Preview Map action and the endpoint; MapRuleValidator checks paths, transforms and arguments.
Committed fragment src/main/resources/openapi/qqq-v1/edi.yaml (22 schemas) and a contract test (UiApiContract.check); HTTP tests run the server in strict raw-route mode.
Hosts need an 8 MiB request limit for the 5 MiB base64 upload.
Next: the Next UI mapper page (separate PR to qqq-frontend-next main), which vendors this fragment.
## Summary
Phase (f), part 1: the backend for the mapper UI, as a spec'd UI API extension (UI-API-EXTENSIONS.md; guardrails G2, G3).
| Endpoint (`/qqq/v1/qbit/edi`) | Response |
|---|---|
| `GET /guides/{guideId}/tree` | `EdiGuideTreeV1` (loops, segments, elements, usage, code lists) |
| `GET /maps/{mapId}/target` | `EdiTargetV1` (table fields and associations, current rules, transforms with argument schemas) |
| `POST /sandbox/preview` | `EdiPreviewV1` (parse counts, findings by SNIP level, ack, mapped records, diffs; values suppressed for PHI maps) |
| `POST /maps/{mapId}/validate` | `EdiValidationV1` (per-rule errors for unsaved rules) |
- Same permissions as the record actions (`edi.map.preview`, table read); rule writes stay on the core table API.
- `MapPreviewService` is shared by the Preview Map action and the endpoint; `MapRuleValidator` checks paths, transforms and arguments.
- Committed fragment `src/main/resources/openapi/qqq-v1/edi.yaml` (22 schemas) and a contract test (`UiApiContract.check`); HTTP tests run the server in strict raw-route mode.
- Hosts need an 8 MiB request limit for the 5 MiB base64 upload.
Next: the Next UI mapper page (separate PR to qqq-frontend-next `main`), which vendors this fragment.
## Test plan
- [x] `./mvnw verify`: 242 tests (19 new API/contract), Checkstyle, JaCoCo (93.8% instructions, 99% classes)
- [ ] CircleCI `test_only`
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Phase (f), part 1: the backend for the mapper UI, as a spec'd UI API extension (UI-API-EXTENSIONS.md; guardrails G2, G3).
/qqq/v1/qbit/edi)GET /guides/{guideId}/treeEdiGuideTreeV1(loops, segments, elements, usage, code lists)GET /maps/{mapId}/targetEdiTargetV1(table fields and associations, current rules, transforms with argument schemas)POST /sandbox/previewEdiPreviewV1(parse counts, findings by SNIP level, ack, mapped records, diffs; values suppressed for PHI maps)POST /maps/{mapId}/validateEdiValidationV1(per-rule errors for unsaved rules)edi.map.preview, table read); rule writes stay on the core table API.MapPreviewServiceis shared by the Preview Map action and the endpoint;MapRuleValidatorchecks paths, transforms and arguments.src/main/resources/openapi/qqq-v1/edi.yaml(22 schemas) and a contract test (UiApiContract.check); HTTP tests run the server in strict raw-route mode.Next: the Next UI mapper page (separate PR to qqq-frontend-next
main), which vendors this fragment.Test plan
./mvnw verify: 242 tests (19 new API/contract), Checkstyle, JaCoCo (93.8% instructions, 99% classes)test_only🤖 Generated with Claude Code