# UI API Contract Compatibility Report

Last updated: 2026-03-21

## Scope

This report tracks the UI API live contract suite under [`tests/contract/ui_api`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api). Compatibility status is updated only from three pieces of evidence together:

- official Salesforce documentation indexed in [`catalog.yaml`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/catalog.yaml)
- the live contract test case that exercises the endpoint
- the latest local backend run result

Current inventory from [`catalog.yaml`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/catalog.yaml):

- `49` tracked endpoints
- `20` endpoints still carrying `doc: todo`

## This Run

- Re-read the current UI API artifacts: [`catalog.yaml`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/catalog.yaml), all live tests under [`tests/contract/ui_api`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api), and the previous report.
- Revalidated the local backend health at `http://127.0.0.1:3001/health` as `{"db":"connected","server":"golang","status":"ok"}` before the live run.
- Ran the full local live UI API suite with `GOCACHE=/tmp/gocache-ui-local GOMODCACHE=/tmp/gomodcache-ui-local CONTRACT_TARGET=local go test -p 1 ./ui_api/... -count=1 -json > /tmp/ui_api_local_test.json`.
- Current package split: `ui_api/actions`, `ui_api/apps`, `ui_api/favorites`, `ui_api/lists`, `ui_api/lookups`, `ui_api/navigation`, `ui_api/records`, and `ui_api/themes` failed; the package root compile wrapper passed.
- Revalidated compile-only coverage with `GOCACHE=/tmp/gocache-ui-local GOMODCACHE=/tmp/gomodcache-ui-local go test -p 1 ./ui_api/... -run '^$' -count=1`, which passed.
- Route audit against [`backend/cmd/server/routes.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/backend/cmd/server/routes.go) shows that only `7` of the current `49` UI API catalog endpoints are mounted locally:
  - `GET /ui-api/apps`
  - `GET /ui-api/record-ui/{recordIds}`
  - `GET /ui-api/object-info/{objectApiName}`
  - `GET /ui-api/layout/{objectApiName}`
  - `GET /ui-api/record-defaults/create/{objectApiName}`
  - `GET /ui-api/record-defaults/clone/{recordId}`
  - `GET /ui-api/list-info/{objectApiName}/{listViewApiName}`
- Current local compatibility split from this run: `3` `🟢`, `1` `🟡`, `3` `🔴`, and `42` `🚫`.

## Compatibility Legend

- `🚫` 明确未实现
- `⭕` 无测试覆盖（无法验证）
- `🔴` 不兼容：已实现，但经测试发现无法工作，或者存在严重的功能/schema错误
- `🟡` 部分兼容：已实现，可以工作，但是经测试发现存在偏差
- `🟢` 完全兼容，行为与官方文档一致

## Local Backend Compatibility Assessment

### Apps

| Endpoint | Method + Path | 兼容性 | Reason |
| --- | --- | ---: | --- |
| Get Apps | `GET /services/data/v63.0/ui-api/apps` | 🟡 | Test: [`apps/get_apps_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/apps/get_apps_live_test.go); local returns `200`, but the `/ui-api/apps` handler in [`ui_handler.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/backend/internal/interfaces/rest/ui_handler.go) serializes `apps` as a map keyed by app ID, and the current contract suite rejects that response shape. |
| Get Last Selected App | `GET /services/data/v63.0/ui-api/apps/selected` | 🚫 | Test: [`apps/get_selected_app_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/apps/get_selected_app_live_test.go); local returns plain-text `404 page not found`, and no `/ui-api/apps/selected` route is mounted in [`routes.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/backend/cmd/server/routes.go). |
| Get an App | `GET /services/data/v63.0/ui-api/apps/{appId}` | 🚫 | Test path is exercised from [`apps/get_app_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/apps/get_app_live_test.go), but the backend does not mount `/ui-api/apps/:appId`; the current local test run is blocked earlier by the incompatible `/ui-api/apps` discovery shape. |
| Update Last Selected App | `PATCH /services/data/v63.0/ui-api/apps/{appId}` | 🚫 | Test path is exercised from [`apps/patch_selected_app_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/apps/patch_selected_app_live_test.go), but the backend does not mount `PATCH /ui-api/apps/:appId`; the current local test run is blocked earlier by the incompatible `/ui-api/apps` discovery shape. |
| Get Personalized Navigation Items | `GET /services/data/v63.0/ui-api/apps/{appId}/user-nav-items` | 🚫 | Test path is exercised from [`apps/get_user_nav_items_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/apps/get_user_nav_items_live_test.go), but no `/ui-api/apps/:appId/user-nav-items` route is mounted locally. |
| Update Personalized Navigation Items | `PUT /services/data/v63.0/ui-api/apps/{appId}/user-nav-items` | 🚫 | Test path is exercised from [`apps/put_user_nav_items_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/apps/put_user_nav_items_live_test.go), but no `PUT /ui-api/apps/:appId/user-nav-items` route is mounted locally. |

### Actions

| Endpoint | Method + Path | 兼容性 | Reason |
| --- | --- | ---: | --- |
| Get Lightning Page Actions | `GET /services/data/v63.0/ui-api/actions/flexipage/{flexipageNames}` | 🚫 | Test: [`actions/get_flexipage_actions_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/actions/get_flexipage_actions_live_test.go); local returns `404 page not found`, and no matching route is mounted. |
| Get Global Actions | `GET /services/data/v63.0/ui-api/actions/global` | 🚫 | Test: [`actions/get_global_actions_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/actions/get_global_actions_live_test.go); local returns `404 page not found`, and no matching route is mounted. |
| Get List View Chart Actions | `GET /services/data/v63.0/ui-api/actions/list-view-chart/{objectApiName}` | 🚫 | Test: [`actions/get_list_view_chart_actions_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/actions/get_list_view_chart_actions_live_test.go); local returns `404 page not found`, and no matching route is mounted. |
| Get List View Record Actions | `GET /services/data/v63.0/ui-api/actions/list-view-record/{recordIds}` | 🚫 | Test: [`actions/get_list_view_record_actions_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/actions/get_list_view_record_actions_live_test.go); local returns `404 page not found`, and no matching route is mounted. |
| Get List View Header Actions | `GET /services/data/v63.0/ui-api/actions/list-view/{listViewIds}` | 🚫 | Test: [`actions/get_list_view_actions_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/actions/get_list_view_actions_live_test.go); the backend has no mounted `/ui-api/actions/list-view/*` route, and the current local run also fails earlier when local fixture discovery cannot resolve `ListView` records. |
| Get Lookup Field Actions | `GET /services/data/v63.0/ui-api/actions/lookup/{objectApiNames}` | 🚫 | Test: [`actions/get_lookup_actions_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/actions/get_lookup_actions_live_test.go); local returns `404 page not found`, and no matching route is mounted. |
| Get MRU List View Actions | `GET /services/data/v63.0/ui-api/actions/mru-list/{objectApiNames}` | 🚫 | Test: [`actions/get_mru_list_actions_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/actions/get_mru_list_actions_live_test.go); local returns `404 page not found`, and no matching route is mounted. |
| Get Photo Actions | `GET /services/data/v63.0/ui-api/actions/photo/{recordIds}` | 🚫 | Test: [`actions/get_photo_actions_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/actions/get_photo_actions_live_test.go); local returns `404 page not found`, and no matching route is mounted. |
| Get Record Detail Page Actions | `GET /services/data/v63.0/ui-api/actions/record/{recordIds}` | 🚫 | Test: [`actions/get_record_actions_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/actions/get_record_actions_live_test.go); local returns `404 page not found`, and no matching route is mounted. |
| Get Record Edit Page Actions | `GET /services/data/v63.0/ui-api/actions/record/{recordId}/record-edit` | 🚫 | Test: [`actions/get_record_edit_actions_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/actions/get_record_edit_actions_live_test.go); local returns `404 page not found`, and no matching route is mounted. |
| Get Related List Record Actions | `GET /services/data/v63.0/ui-api/actions/record/{recordId}/related-list-record/{relatedListRecordIds}` | 🚫 | Test: [`actions/get_related_list_record_actions_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/actions/get_related_list_record_actions_live_test.go); local returns `404 page not found`, and no matching route is mounted. |
| Get Related List Actions | `GET /services/data/v63.0/ui-api/actions/record/{recordId}/related-list/{relatedListIds}` | 🚫 | Test: [`actions/get_related_list_actions_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/actions/get_related_list_actions_live_test.go); local returns `404 page not found`, and no matching route is mounted. |

### Favorites

| Endpoint | Method + Path | 兼容性 | Reason |
| --- | --- | ---: | --- |
| Get Favorites | `GET /services/data/v63.0/ui-api/favorites` | 🚫 | Test: [`favorites/get_favorites_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/favorites/get_favorites_live_test.go); local returns `404 page not found`, and no `/ui-api/favorites*` routes are mounted in [`routes.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/backend/cmd/server/routes.go). |
| Create a Favorite | `POST /services/data/v63.0/ui-api/favorites` | 🚫 | Test: [`favorites/create_favorite_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/favorites/create_favorite_live_test.go); local returns a non-contract response and the route family is not mounted. |
| Update a Batch of Favorites | `PUT /services/data/v63.0/ui-api/favorites/batch` | 🚫 | Test: [`favorites/update_favorites_batch_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/favorites/update_favorites_batch_live_test.go); local returns a non-contract response and the route family is not mounted. |
| Delete a Favorite | `DELETE /services/data/v63.0/ui-api/favorites/{favoriteId}` | 🚫 | Test: [`favorites/delete_favorite_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/favorites/delete_favorite_live_test.go); local returns a non-contract response and the route family is not mounted. |
| Get a Favorite | `GET /services/data/v63.0/ui-api/favorites/{favoriteId}` | 🚫 | Test: [`favorites/get_favorite_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/favorites/get_favorite_live_test.go); local returns a non-contract response and the route family is not mounted. |
| Update a Favorite | `PATCH /services/data/v63.0/ui-api/favorites/{favoriteId}` | 🚫 | Test: [`favorites/update_favorite_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/favorites/update_favorite_live_test.go); local returns a non-contract response and the route family is not mounted. |
| Update Usage of a Favorite | `PATCH /services/data/v63.0/ui-api/favorites/{favoriteId}/usage` | 🚫 | Test: [`favorites/update_favorite_usage_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/favorites/update_favorite_usage_live_test.go); local returns a non-contract response and the route family is not mounted. |

### Layouts And Lists

| Endpoint | Method + Path | 兼容性 | Reason |
| --- | --- | ---: | --- |
| Get Record Layout Metadata | `GET /services/data/v63.0/ui-api/layout/{objectApiName}` | 🔴 | Test: [`records/get_layout_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/records/get_layout_live_test.go); local returns `200`, but the response is missing any of the required top-level layout containers (`recordTypeMappings`, `layouts`, or `layout`). |
| Get List View Metadata by ID | `GET /services/data/v63.0/ui-api/list-info/{listViewId}` | 🚫 | Test: [`lists/get_list_info_by_id_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/lists/get_list_info_by_id_live_test.go); the backend does not mount `/ui-api/list-info/:listViewId`, and the current local run also fails earlier when fixture discovery cannot resolve `ListView` records. |
| Get List Views for an Object | `GET /services/data/v63.0/ui-api/list-info/{objectApiName}` | 🚫 | Test: [`lists/get_list_info_by_object_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/lists/get_list_info_by_object_live_test.go); local returns `404 page not found`, and no `/ui-api/list-info/:objectApiName` route is mounted. |
| Get List View Metadata by API Name | `GET /services/data/v63.0/ui-api/list-info/{objectApiName}/{listViewApiName}` | 🔴 | Test: [`lists/get_list_info_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/lists/get_list_info_live_test.go); the route is mounted, but the local response leaves the expected list metadata object nil. |
| Get List View Records by ID | `GET /services/data/v63.0/ui-api/list-records/{listViewId}` | 🚫 | Test: [`lists/get_list_records_by_id_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/lists/get_list_records_by_id_live_test.go); the backend does not mount `/ui-api/list-records/*`, and the current local run also fails earlier when fixture discovery cannot resolve `ListView` records. |
| Get List View Records by API Name | `GET /services/data/v63.0/ui-api/list-records/{objectApiName}/{listViewApiName}` | 🚫 | Test: [`lists/get_list_records_by_api_name_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/lists/get_list_records_by_api_name_live_test.go); the backend does not mount `/ui-api/list-records/*`, and the current local run also fails earlier when fixture discovery cannot resolve `ListView` records. |
| Get List View Records | `POST /services/data/v63.0/ui-api/list-records/{objectApiName}/{listViewApiName}` | 🚫 | Test: [`lists/post_list_records_by_api_name_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/lists/post_list_records_by_api_name_live_test.go); the backend does not mount `/ui-api/list-records/*`, and the current local run also fails earlier when fixture discovery cannot resolve `ListView` records. |

### Lookups And Navigation

| Endpoint | Method + Path | 兼容性 | Reason |
| --- | --- | ---: | --- |
| Get Lookup Field Suggestions | `GET /services/data/v63.0/ui-api/lookups/{objectApiName}/{fieldApiName}` | 🚫 | Test: [`lookups/get_lookup_suggestions_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/lookups/get_lookup_suggestions_live_test.go); local returns `404 page not found`, and no `/ui-api/lookups/*` routes are mounted. |
| Get Lookup Field Suggestions for a Specified Object | `GET /services/data/v63.0/ui-api/lookups/{objectApiName}/{fieldApiName}/{targetApiName}` | 🚫 | Test: [`lookups/get_lookup_suggestions_target_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/lookups/get_lookup_suggestions_target_live_test.go); local returns `404 page not found`, and no `/ui-api/lookups/*` routes are mounted. |
| Get All Navigation Items | `GET /services/data/v63.0/ui-api/nav-items` | 🚫 | Test: [`navigation/get_nav_items_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/navigation/get_nav_items_live_test.go); local returns `404 page not found`, and no `/ui-api/nav-items` route is mounted. |

### Object Info, Defaults, And Record UI

| Endpoint | Method + Path | 兼容性 | Reason |
| --- | --- | ---: | --- |
| Get a Directory of Supported Objects | `GET /services/data/v63.0/ui-api/object-info` | 🚫 | Test: [`records/get_object_info_directory_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/records/get_object_info_directory_live_test.go); local returns `404 page not found`, and no `/ui-api/object-info` directory route is mounted. |
| Get Object Metadata | `GET /services/data/v63.0/ui-api/object-info/{objectApiName}` | 🟢 | Test: [`records/get_object_info_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/records/get_object_info_live_test.go); local passed for Account and Opportunity in the latest full run. |
| Get Values for All Picklist Fields of a Record Type | `GET /services/data/v63.0/ui-api/object-info/{objectApiName}/picklist-values/{recordTypeId}` | 🚫 | Test: [`records/get_picklist_values_by_record_type_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/records/get_picklist_values_by_record_type_live_test.go); no matching route is mounted, and the current local run also cannot fetch a usable `recordTypeId` for Account from the mounted object-info payload. |
| Get Values for a Picklist Field | `GET /services/data/v63.0/ui-api/object-info/{objectApiName}/picklist-values/{recordTypeId}/{fieldApiName}` | 🚫 | Test: [`records/get_picklist_values_by_field_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/records/get_picklist_values_by_field_live_test.go); no matching route is mounted, and the current local run also cannot fetch a usable `recordTypeId` for Account from the mounted object-info payload. |
| Get Default Values to Clone a Record | `GET /services/data/v63.0/ui-api/record-defaults/clone/{recordId}` | 🔴 | Test: [`records/get_record_defaults_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/records/get_record_defaults_live_test.go); the route is mounted and returns `200`, but the clone response is missing the expected `recordDefaults` or `record` object. |
| Get Default Values to Create a Record | `GET /services/data/v63.0/ui-api/record-defaults/create/{objectApiName}` | 🟢 | Test: [`records/get_record_defaults_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/records/get_record_defaults_live_test.go); the create-defaults subtest passed in the latest full local run. |
| Get Record UI | `GET /services/data/v63.0/ui-api/record-ui/{recordIds}` | 🟢 | Test: [`records/get_record_ui_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/records/get_record_ui_live_test.go); local passed in the latest full run. |

### Records And Themes

| Endpoint | Method + Path | 兼容性 | Reason |
| --- | --- | ---: | --- |
| Create or Clone a Record | `POST /services/data/v63.0/ui-api/records` | 🚫 | Test: [`records/create_record_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/records/create_record_live_test.go); no `/ui-api/records` route is mounted, and the current local response is not a contract-compatible JSON object. |
| Get a Batch of Records | `GET /services/data/v63.0/ui-api/records/batch/{recordIds}` | 🚫 | Test: [`records/get_records_batch_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/records/get_records_batch_live_test.go); no matching route is mounted, and the current local response is not a contract-compatible JSON object. |
| Delete a Record | `DELETE /services/data/v63.0/ui-api/records/{recordId}` | 🚫 | Test: [`records/delete_record_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/records/delete_record_live_test.go); no matching route is mounted, and the current local response is not a contract-compatible JSON object. |
| Get a Record | `GET /services/data/v63.0/ui-api/records/{recordId}` | 🚫 | Test: [`records/get_record_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/records/get_record_live_test.go); no matching route is mounted, and the current local response is not a contract-compatible JSON object. |
| Update a Record | `PATCH /services/data/v63.0/ui-api/records/{recordId}` | 🚫 | Test: [`records/update_record_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/records/update_record_live_test.go); no matching route is mounted, and the current local response is not a contract-compatible JSON object. |
| Get Child Records | `GET /services/data/v63.0/ui-api/records/{recordId}/child-relationships/{relationshipName}` | 🚫 | Test: [`records/get_child_relationships_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/records/get_child_relationships_live_test.go); no matching route is mounted, and the current local response is not a contract-compatible JSON object. |
| Get Active Theme | `GET /services/data/v63.0/ui-api/themes/active` | 🚫 | Test: [`themes/get_active_theme_live_test.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/themes/get_active_theme_live_test.go); local returns `404 page not found`, and no `/ui-api/themes/active` route is mounted. |

## Compatibility State Changes

- Replaced the earlier package-level failure summary with endpoint-level local verdicts for all `49` cataloged UI API endpoints.
- The report now explicitly distinguishes unmounted route debt from implemented-but-wrong behavior. Current local split is `42` `🚫`, `3` `🔴`, `1` `🟡`, and `3` `🟢`.
- `GET /services/data/v63.0/ui-api/apps` is now treated as `🟡` instead of being lumped into a generic apps-package failure: the endpoint exists locally, but its response shape is still incompatible with the current contract suite.
- `GET /services/data/v63.0/ui-api/layout/{objectApiName}`, `GET /services/data/v63.0/ui-api/list-info/{objectApiName}/{listViewApiName}`, and `GET /services/data/v63.0/ui-api/record-defaults/clone/{recordId}` are now tracked as `🔴` because they are mounted and return data, but the latest local responses are still missing required contract structure.
- `GET /services/data/v63.0/ui-api/object-info/{objectApiName}`, `GET /services/data/v63.0/ui-api/record-defaults/create/{objectApiName}`, and `GET /services/data/v63.0/ui-api/record-ui/{recordIds}` are the only `🟢` endpoints in the current local run.

## Remaining Gaps

- `20` UI API catalog rows still have `doc: todo` in [`catalog.yaml`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract/ui_api/catalog.yaml). Actions, favorites, and themes remain the largest documentation-index debt.
- Only `7` of the current `49` cataloged UI API endpoints are mounted locally in [`routes.go`](/Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/backend/cmd/server/routes.go). Until that changes, most of the suite will remain `🚫` by construction.
- Even among mounted routes, schema-level compatibility work is still needed for `/ui-api/apps`, `/ui-api/layout/{objectApiName}`, `/ui-api/list-info/{objectApiName}/{listViewApiName}`, and `/ui-api/record-defaults/clone/{recordId}`.
- The mounted `/ui-api/object-info/{objectApiName}` route is green for the base metadata contract, but its current payload still does not provide a usable `recordTypeId` for the local Account fixture. That blocks local live progress for the picklist-value endpoints even before those missing routes are implemented.
- Salesforce sandbox verification was not rerun in this iteration. This report reflects the current local backend only.

## Verification

```bash
cd /Users/liangzhiyuan/Projects/MetaDrivenPlatform4AI/tests/contract
curl -sS http://127.0.0.1:3001/health
GOCACHE=/tmp/gocache-ui-local GOMODCACHE=/tmp/gomodcache-ui-local CONTRACT_TARGET=local go test -p 1 ./ui_api/... -count=1 -json > /tmp/ui_api_local_test.json
GOCACHE=/tmp/gocache-ui-local GOMODCACHE=/tmp/gomodcache-ui-local go test -p 1 ./ui_api/... -run '^$' -count=1
```
