# API workflow inventory

Reviewed 2026-10-18; snapshot 6af9c0dec73d3a8e2513d2076e78c2242c2cad75.

Workflow facets structure existing contracts and are not added to the catalog support denominator. Catalog slices link bounded receipts; gap facets never inherit those matches. Overlapping capability IDs count once.

API67 recorded reference fixtures are independent profiles. Standard versus custom objects, single versus multiple principals, API68 and CLI versions are not a Cartesian product of verified combinations. Read linked evidence environments and qualifiers.

## REST records and transport

### API version discovery

rest.api-version-discovery: bounded; reference linked-subset.

31.0-68.0 and Latest Release as observed October17; API67 remains the schema profile; Differential match is profile-bound; broader parity unverified; October17 discovery advertises31.0-68.0 plus Latest Release (39 entries); implemented as a dated discovery profile. The schema/reference API remains67.0; advertising a release does not establish all its resources or contracts.

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: 31.0-68.0 and Latest Release as observed October17; API67 remains the schema profile; Differential match is profile-bound; broader parity unverified; October17 discovery advertises31.0-68.0 plus Latest Release (39 entries); implemented as a dated discovery profile. The schema/reference API remains67.0; advertising a release does not establish all its resources or contracts.

Implementation: packages/runtime/src/index.ts. Tests: VO-RUNTIME-001, VO-CLI-001, VO-DIFF-700, VO-REST-100. Evidence: EV-rest.api-version-discovery-9366705.

[rest.api-version-discovery](/features/rest--api-version-discovery): partial; linked local report not-run.

### Services root

rest.services-root: bounded; reference linked-subset.

GET /services/data and /services/data/ list31.0-68.0 plus latest without a session; other methods answer405 (Allow: HEAD,GET); Differential match is profile-bound; broader parity unverified; Both unauthenticated GET inventory forms include68.0/latest as recorded October17; method restrictions remain. The latest alias and every version-specific resource are not claimed implemented by discovery.

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: GET /services/data and /services/data/ list31.0-68.0 plus latest without a session; other methods answer405 (Allow: HEAD,GET); Differential match is profile-bound; broader parity unverified; Both unauthenticated GET inventory forms include68.0/latest as recorded October17; method restrictions remain. The latest alias and every version-specific resource are not claimed implemented by discovery.

Implementation: packages/runtime/src/index.ts. Tests: VO-DIFF-700, VO-REST-100. Evidence: EV-rest.services-root-9366705.

[rest.services-root](/features/rest--services-root): partial; linked local report not-run.

### Resource discovery

rest.resource-discovery: bounded; reference linked-subset.

Resource map keys recorded at 31.0 and 67.0 (versions in between reuse the 67.0 keys, unverified); identity points at this instance's /id URL; most listed resources answer NOT_FOUND; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Resource map keys recorded at 31.0 and 67.0 (versions in between reuse the 67.0 keys, unverified); identity points at this instance's /id URL; most listed resources answer NOT_FOUND; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/index.ts, packages/runtime/src/rest.ts. Tests: VO-E2E-011, VO-DIFF-700. Evidence: EV-rest.resource-discovery-685ab1e.

[rest.resource-discovery](/features/rest--resource-discovery): partial; linked local report not-run.

### Limits endpoint

rest.limits-endpoint: bounded; reference linked-subset.

Subset of limits; Maxima recorded from the reference environment; Remaining equals Max except DataStorageMB; Differential match is profile-bound; broader parity unverified; Fresh October 17 REST/CLI observations add DailyDataCloudCursorLimit, DailyDataCloudCursorRowsLimit and DailyDataCloudFlexCredits; the older pinned inventory does not establish these counters or their maxima.

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Subset of limits; Maxima recorded from the reference environment; Remaining equals Max except DataStorageMB; Differential match is profile-bound; broader parity unverified; Fresh October 17 REST/CLI observations add DailyDataCloudCursorLimit, DailyDataCloudCursorRowsLimit and DailyDataCloudFlexCredits; the older pinned inventory does not establish these counters or their maxima.

Implementation: packages/runtime/src/index.ts, packages/runtime/src/rest.ts, packages/runtime/src/standard/limits.json. Tests: VO-E2E-011, VO-DIFF-327. Evidence: EV-rest.limits-endpoint-feaf503.

[rest.limits-endpoint](/features/rest--limits-endpoint): partial; linked local report not-run.

### sObject describe endpoints

rest.sobject-describe-endpoints: bounded; reference linked-subset.

Profile-bound: reference-shaped org, API 31.0–67.0 accepted, 67.0 reference; sObject basic information and describe keys as recorded for custom objects; describe/{unknown} is NOT_FOUND and POST answers 405; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Profile-bound: reference-shaped org, API 31.0–67.0 accepted, 67.0 reference; sObject basic information and describe keys as recorded for custom objects; describe/{unknown} is NOT_FOUND and POST answers 405; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/index.ts, packages/runtime/src/rest.ts. Tests: VO-DIFF-001, VO-CLI-003, VO-DIFF-718. Evidence: EV-rest.sobject-describe-endpoints-685ab1e.

[rest.sobject-describe-endpoints](/features/rest--sobject-describe-endpoints): partial; linked local report not-run.

### Org identity discovery

rest.org-identity-discovery: bounded; reference linked-subset.

/services/oauth2/userinfo and /id/{org}/{user} with the recorded keys; URLs point at this instance; photo URLs are placeholders; utcOffset is the zone's standard offset; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: /services/oauth2/userinfo and /id/{org}/{user} with the recorded keys; URLs point at this instance; photo URLs are placeholders; utcOffset is the zone's standard offset; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/index.ts, packages/runtime/src/records.ts. Tests: VO-DIFF-701, VO-REST-103. Evidence: EV-rest.org-identity-discovery-685ab1e.

[rest.org-identity-discovery](/features/rest--org-identity-discovery): partial; linked local report not-run.

### sObject record endpoints

rest.sobject-record-endpoints: bounded; reference linked-subset.

Profile-bound: reference-shaped org, API 31.0–67.0 accepted, 67.0 reference; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Profile-bound: reference-shaped org, API 31.0–67.0 accepted, 67.0 reference; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/index.ts. Tests: VO-DIFF-002, VO-CLI-002, VO-DIFF-014, VO-DIFF-010. Evidence: EV-rest.sobject-record-endpoints-2026-10-06.

[rest.sobject-record-endpoints](/features/rest--sobject-record-endpoints): partial; linked local report not-run.

### External ID endpoint

rest.external-id-endpoint: bounded; reference linked-subset.

GET and PATCH by external ID; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: GET and PATCH by external ID; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/index.ts. Tests: VO-DIFF-020. Evidence: EV-rest.external-id-endpoint-cf693b4.

[rest.external-id-endpoint](/features/rest--external-id-endpoint): partial; linked local report passed.

### Relationship endpoints

rest.relationship-endpoints: bounded; reference linked-subset.

Child relationship URLs answer a query result (GET only, fields parameter honored); parent relationship URLs pass GET, PATCH and DELETE to the parent record; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Child relationship URLs answer a query result (GET only, fields parameter honored); parent relationship URLs pass GET, PATCH and DELETE to the parent record; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/index.ts. Tests: VO-DIFF-710. Evidence: EV-rest.relationship-endpoints-685ab1e.

[rest.relationship-endpoints](/features/rest--relationship-endpoints): partial; linked local report not-run.

### Salesforce-style error arrays

rest.salesforce-style-error-arrays: bounded; reference linked-subset.

Matches the recorded API 67.0 reference receipt for the Project__c profile (RES-REF-001); Jackson-style JSON parse messages for common syntax errors; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Matches the recorded API 67.0 reference receipt for the Project__c profile (RES-REF-001); Jackson-style JSON parse messages for common syntax errors; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/index.ts, packages/runtime/src/rest.ts. Tests: VO-DIFF-005, VO-RUNTIME-001, VO-DIFF-010, VO-DIFF-011, VO-DIFF-333. Evidence: EV-rest.salesforce-style-error-arrays-feaf503.

[rest.salesforce-style-error-arrays](/features/rest--salesforce-style-error-arrays): partial; linked local report not-run.

### HTTP status mapping

rest.http-status-mapping: bounded; reference linked-subset.

404/405 (with Allow)/400/415 as recorded; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: 404/405 (with Allow)/400/415 as recorded; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/index.ts. Tests: VO-DIFF-333. Evidence: EV-rest.http-status-mapping-feaf503.

[rest.http-status-mapping](/features/rest--http-status-mapping): partial; linked local report not-run.

### Date serialization

rest.date-serialization: bounded; reference linked-subset.

Recorded date, datetime (offsets, Z, fractional seconds) and time input forms and errors; datetimes render as .000+0000 in UTC; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Recorded date, datetime (offsets, Z, fractional seconds) and time input forms and errors; datetimes render as .000+0000 in UTC; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/records.ts. Tests: VO-DIFF-711. Evidence: EV-rest.date-serialization-685ab1e.

[rest.date-serialization](/features/rest--date-serialization): partial; linked local report not-run.

### Decimal serialization

rest.decimal-serialization: bounded; reference linked-subset.

Number, currency and percent values are doubles: extra decimal places are kept as sent (no rounding to scale), literals beyond double precision round to the nearest double, and precision errors report the rounded number (API3-DECIMALS-001, NUMEXACT-REST-001); Record GET, SOQL rows, aggregates and queryMore pages render doubles as Java Double.toString text (12.0, 1.0E7, 1.2345678901234568E17, 5.0E-5) while counts and integer fields stay plain, matching the API 67.0 numeric-exact receipt; composite, collection, tree and Apex REST bodies keep JavaScript number text; API SOQL integer literals beyond the int range fail with For input string as recorded; Apex inline SOQL literals are not compared; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Number, currency and percent values are doubles: extra decimal places are kept as sent (no rounding to scale), literals beyond double precision round to the nearest double, and precision errors report the rounded number (API3-DECIMALS-001, NUMEXACT-REST-001); Record GET, SOQL rows, aggregates and queryMore pages render doubles as Java Double.toString text (12.0, 1.0E7, 1.2345678901234568E17, 5.0E-5) while counts and integer fields stay plain, matching the API 67.0 numeric-exact receipt; composite, collection, tree and Apex REST bodies keep JavaScript number text; API SOQL integer literals beyond the int range fail with For input string as recorded; Apex inline SOQL literals are not compared; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/records.ts. Tests: VO-DIFF-712, VO-DIFF-2172, VO-DIFF-2173, VO-DIFF-2174, VO-DIFF-2175. Evidence: EV-rest.decimal-serialization-685ab1e.

[rest.decimal-serialization](/features/rest--decimal-serialization): partial; linked local report not-run.

### Content type negotiation

rest.content-type-negotiation: bounded; reference linked-subset.

JSON only (application/json;charset=UTF-8); gzip responses; non-JSON request bodies get 415; clients that prefer XML (Accept lists XML first) get 406 NOT_ACCEPTABLE where the reference answers XML (documented divergence, VO-DIFF-705); Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: JSON only (application/json;charset=UTF-8); gzip responses; non-JSON request bodies get 415; clients that prefer XML (Accept lists XML first) get 406 NOT_ACCEPTABLE where the reference answers XML (documented divergence, VO-DIFF-705); Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/index.ts, packages/runtime/src/rest.ts. Tests: VO-DIFF-332, VO-DIFF-705, VO-REST-102. Evidence: EV-rest.content-type-negotiation-685ab1e.

[rest.content-type-negotiation](/features/rest--content-type-negotiation): partial; linked local report not-run.

### Request size limits

rest.request-size-limits: bounded; reference linked-subset.

REST bodies above 52,428,800 bytes fail with the recorded JSON_PARSER_ERROR; SOQL string literals longer than 4,000 characters fail as recorded; Bulk 2.0 uploads accept up to 150 MB (documented, not measured); Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: REST bodies above 52,428,800 bytes fail with the recorded JSON_PARSER_ERROR; SOQL string literals longer than 4,000 characters fail as recorded; Bulk 2.0 uploads accept up to 150 MB (documented, not measured); Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/index.ts, packages/runtime/src/soql.ts. Tests: VO-DIFF-704. Evidence: EV-rest.request-size-limits-685ab1e.

[rest.request-size-limits](/features/rest--request-size-limits): partial; linked local report not-run.

### Conditional requests

rest.conditional-requests: bounded; reference linked-subset.

Describe ETag/Last-Modified with If-None-Match/If-Modified-Since 304; record If-Match/If-Unmodified-Since 412; Last-Modified is when Virtual Org first served the current describe; Row GET honors If-None-Match: * and ignores date conditions; PATCH checks If-Unmodified-Since and If-Match; describe ignores a future If-Modified-Since; standalone record GETs issue no ETag; conditional DELETE not run (the reference returned 500); Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Describe ETag/Last-Modified with If-None-Match/If-Modified-Since 304; record If-Match/If-Unmodified-Since 412; Last-Modified is when Virtual Org first served the current describe; Row GET honors If-None-Match: * and ignores date conditions; PATCH checks If-Unmodified-Since and If-Match; describe ignores a future If-Modified-Since; standalone record GETs issue no ETag; conditional DELETE not run (the reference returned 500); Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/index.ts, packages/runtime/src/conditional.ts. Tests: VO-DIFF-331, VO-DIFF-087, VO-DIFF-088. Evidence: EV-rest.conditional-requests-feaf503.

[rest.conditional-requests](/features/rest--conditional-requests): partial; linked local report not-run.

### CORS policy

rest.cors-policy: bounded; reference linked-subset.

No CORS allowlist: OPTIONS answers 200 without a body or Access-Control headers and Origin is ignored; allowlisted origins are not modeled; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: No CORS allowlist: OPTIONS answers 200 without a body or Access-Control headers and Origin is ignored; allowlisted origins are not modeled; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/index.ts. Tests: VO-DIFF-703, VO-REST-101. Evidence: EV-rest.cors-policy-685ab1e.

[rest.cors-policy](/features/rest--cors-policy): partial; linked local report not-run.

### API version rejection

rest.api-version-rejection: bounded; reference linked-subset.

Not yet differentially compared against the reference beyond the cited cases; Retired versions 20.0–30.0 answer 410 GONE (404 without a body for /limits before 29.0, where it never existed); older, malformed and future versions answer NOT_FOUND; Differential match is profile-bound; broader parity unverified; The recorded v68 root is admitted and has the observed resource keys. v69 remains a local future-version rejection control; full version/resource conformance beyond the cited observations remains unverified.

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Not yet differentially compared against the reference beyond the cited cases; Retired versions 20.0–30.0 answer 410 GONE (404 without a body for /limits before 29.0, where it never existed); older, malformed and future versions answer NOT_FOUND; Differential match is profile-bound; broader parity unverified; The recorded v68 root is admitted and has the observed resource keys. v69 remains a local future-version rejection control; full version/resource conformance beyond the cited observations remains unverified.

Implementation: packages/runtime/src/index.ts. Tests: VO-RUNTIME-001, VO-DIFF-333, VO-DIFF-700, VO-REST-100. Evidence: EV-rest.api-version-rejection-9366705.

[rest.api-version-rejection](/features/rest--api-version-rejection): partial; linked local report not-run.

### Rate limits

rest.rate-limits: bounded; reference linked-subset.

Authenticated data API responses (errors included) carry Sforce-Limit-Info api-usage=<count>/<DailyApiRequests max>, counted per org and UTC day; /limits Remaining follows the count; requests are never refused (REQUEST_LIMIT_EXCEEDED not modeled); Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Authenticated data API responses (errors included) carry Sforce-Limit-Info api-usage=<count>/<DailyApiRequests max>, counted per org and UTC day; /limits Remaining follows the count; requests are never refused (REQUEST_LIMIT_EXCEEDED not modeled); Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/index.ts, packages/runtime/src/rest.ts. Tests: VO-DIFF-702. Evidence: EV-rest.rate-limits-685ab1e.

[rest.rate-limits](/features/rest--rate-limits): partial; linked local report not-run.

### Request IDs

rest.request-ids: bounded; reference linked-subset.

A nonempty supplied correlation ID is preserved under both response names; absent markers get one native32hex ID; Differential match is profile-bound; broader parity unverified; Caller X-SFDC-Request-ID or X-Request-ID markers are preserved under both response names, including the four nonempty October18 markers. Native generated IDs remain32hex; other fresh reference generated-ID formats, empty/duplicate headers and header precedence are not fully compared.

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: A nonempty supplied correlation ID is preserved under both response names; absent markers get one native32hex ID; Differential match is profile-bound; broader parity unverified; Caller X-SFDC-Request-ID or X-Request-ID markers are preserved under both response names, including the four nonempty October18 markers. Native generated IDs remain32hex; other fresh reference generated-ID formats, empty/duplicate headers and header precedence are not fully compared.

Implementation: packages/runtime/src/index.ts. Tests: VO-DIFF-702, VO-REST-101, VO-DRIFT-004, VO-DRIFT-005, VO-DRIFT-006, VO-DRIFT-007. Evidence: EV-rest.request-ids-9366705.

[rest.request-ids](/features/rest--request-ids): partial; linked local report not-run.

### Round-trip typed nulls under standard and custom schemas

rest.typed-null-multi-profile: uncompared; reference pending.

Existing CRUD/type receipts do not verify every type, missing/null transition and principal combination.

Next acceptance: Create, read, patch null, read and delete Number, Date, Boolean and lookup fields on one standard and one custom object as administrator and restricted user; preserve each effect and error.

Implementation: packages/runtime/src/index.ts. Tests: none selected. Evidence: none for this facet.

[rest.sobject-record-endpoints](/features/rest--sobject-record-endpoints): partial; linked local report not-run.

### Retry writes after a response is lost

rest.retry-after-lost-response: uncompared; reference pending.

No general idempotency-key or exactly-once retry contract is declared for record creation.

Next acceptance: Interrupt a response after commit, retry the same create and external-ID upsert separately, and measure duplicates and errors before declaring retry semantics.

Implementation: packages/runtime/src/index.ts. Tests: none selected. Evidence: none for this facet.

[rest.sobject-record-endpoints](/features/rest--sobject-record-endpoints): partial; linked local report not-run.

## REST query and search

### REST query endpoint

rest.rest-query-endpoint: bounded; reference linked-subset.

Profile-bound: reference-shaped org, API 31.0–67.0 accepted, 67.0 reference; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Profile-bound: reference-shaped org, API 31.0–67.0 accepted, 67.0 reference; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/index.ts. Tests: VO-DIFF-002, VO-CLI-002, VO-DIFF-009. Evidence: EV-rest.rest-query-endpoint-2026-10-06.

[rest.rest-query-endpoint](/features/rest--rest-query-endpoint): partial; linked local report not-run.

### REST queryAll endpoint

rest.rest-queryall-endpoint: bounded; reference linked-subset.

Not yet differentially compared against the reference beyond the cited cases; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Not yet differentially compared against the reference beyond the cited cases; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/index.ts. Tests: VO-E2E-006, VO-DIFF-014. Evidence: EV-rest.rest-queryall-endpoint-2026-10-06.

[rest.rest-queryall-endpoint](/features/rest--rest-queryall-endpoint): partial; linked local report not-run.

### REST query locator endpoint

rest.rest-query-locator-endpoint: bounded; reference linked-subset.

Not yet differentially compared against the reference beyond the cited cases; See soql.query-locators; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Not yet differentially compared against the reference beyond the cited cases; See soql.query-locators; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/index.ts, packages/runtime/src/soql.ts. Tests: VO-E2E-005, VO-DIFF-309. Evidence: EV-rest.rest-query-locator-endpoint-feaf503.

[rest.rest-query-locator-endpoint](/features/rest--rest-query-locator-endpoint): partial; linked local report not-run.

### REST search endpoint

rest.rest-search-endpoint: bounded; reference linked-subset.

GET /search; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: GET /search; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/index.ts. Tests: VO-DIFF-034, VO-CLI-012. Evidence: EV-rest.rest-search-endpoint-de18f70.

[rest.rest-search-endpoint](/features/rest--rest-search-endpoint): partial; linked local report not-run.

### Pagination URLs

rest.pagination-urls: bounded; reference linked-subset.

nextRecordsUrl /services/data/vXX.X/query/{locator}-{offset}; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: nextRecordsUrl /services/data/vXX.X/query/{locator}-{offset}; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/soql.ts, packages/runtime/src/index.ts. Tests: VO-DIFF-309. Evidence: EV-rest.pagination-urls-feaf503.

[rest.pagination-urls](/features/rest--pagination-urls): partial; linked local report not-run.

### Continue an expired or foreign REST locator

rest.cursor-expiry-principals: uncompared; reference pending.

Native locators store user identity and a fifteen-minute expiry; the linked paging match is not a complete multi-principal or expiry comparison.

Next acceptance: Create a locator with more than one page; continue as owner, second user, other org and after controlled expiry; compare errors and re-evaluated access.

Implementation: packages/runtime/src/index.ts, packages/runtime/src/soql.ts. Tests: none selected. Evidence: none for this facet.

[rest.rest-query-locator-endpoint](/features/rest--rest-query-locator-endpoint): partial; linked local report not-run.

### Filter and project parents and children under revoked access

rest.query-security-projections: uncompared; reference pending.

SOQL, sharing and field-security contracts have separate evidence; their full REST combination is not implied by one query receipt.

Next acceptance: Compare a parent field and child subquery, sort/filter fields and mid-pagination grant revocation with two principals; link SOQL and permissions cases.

Implementation: packages/runtime/src/index.ts. Tests: none selected. Evidence: none for this facet.

[rest.rest-query-endpoint](/features/rest--rest-query-endpoint): partial; linked local report not-run.

## Composite, batch, collections and tree

### sObject collection endpoint

rest.sobject-collection-endpoint: bounded; reference linked-subset.

Not yet differentially compared against the reference beyond the cited cases; Create, update, upsert by external ID or idLookup field, retrieve (GET and POST) and delete with allOrNone; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Not yet differentially compared against the reference beyond the cited cases; Create, update, upsert by external ID or idLookup field, retrieve (GET and POST) and delete with allOrNone; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/index.ts, packages/runtime/src/rest.ts. Tests: VO-E2E-005, VO-E2E-006, VO-DIFF-015, VO-DIFF-324. Evidence: EV-rest.sobject-collection-endpoint-feaf503.

[rest.sobject-collection-endpoint](/features/rest--sobject-collection-endpoint): partial; linked local report not-run.

### sObject tree

rest.sobject-tree: bounded; reference linked-subset.

Not yet differentially compared against the reference beyond the cited cases; Results list parents before children; 200-record, reference-ID and entity-type validation as recorded; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Not yet differentially compared against the reference beyond the cited cases; Results list parents before children; 200-record, reference-ID and entity-type validation as recorded; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/index.ts, packages/runtime/src/rest.ts. Tests: VO-CLI-005, VO-DIFF-326, VO-CLI-105. Evidence: EV-rest.sobject-tree-feaf503.

[rest.sobject-tree](/features/rest--sobject-tree): partial; linked local report not-run.

### Composite requests

rest.composite-requests: bounded; reference linked-subset.

References @{id.path} in URLs and bodies; 25 subrequests, 5 query/collection subrequests; supported resources are sObjects, query and collections; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: References @{id.path} in URLs and bodies; 25 subrequests, 5 query/collection subrequests; supported resources are sObjects, query and collections; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/rest.ts, packages/runtime/src/index.ts. Tests: VO-DIFF-320, VO-DIFF-322. Evidence: EV-rest.composite-requests-feaf503.

[rest.composite-requests](/features/rest--composite-requests): partial; linked local report not-run.

### Composite graph

rest.composite-graph: bounded; reference linked-subset.

Each graph is all-or-none; node and depth limits not enforced; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Each graph is all-or-none; node and depth limits not enforced; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/rest.ts, packages/runtime/src/index.ts. Tests: VO-DIFF-325. Evidence: EV-rest.composite-graph-feaf503.

[rest.composite-graph](/features/rest--composite-graph): partial; linked local report not-run.

### Batch requests

rest.batch-requests: bounded; reference linked-subset.

haltOnError; error results omit fields, as recorded; binaryPartName not supported; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: haltOnError; error results omit fields, as recorded; binaryPartName not supported; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/rest.ts, packages/runtime/src/index.ts. Tests: VO-DIFF-323. Evidence: EV-rest.batch-requests-feaf503.

[rest.batch-requests](/features/rest--batch-requests): partial; linked local report not-run.

### All-or-none composite

rest.all-or-none-composite: bounded; reference linked-subset.

allOrNone rolls back every subrequest and halts the rest with the recorded message; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: allOrNone rolls back every subrequest and halts the rest with the recorded message; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/rest.ts. Tests: VO-DIFF-321. Evidence: EV-rest.all-or-none-composite-feaf503.

[rest.all-or-none-composite](/features/rest--all-or-none-composite): partial; linked local report not-run.

### Mixed create/update/read/error as administrator and denied user

composite.principal-transaction-workflow: uncompared; reference pending.

VO-APIWF-001 exercises actual local workerd; its two-principal workflow has no selected reference comparison.

Next acceptance: Replay VO-APIWF-001 on an explicitly selected authorized API67 target, preserving invalid-field and denied-principal error codes plus independent committed-state readback.

Implementation: packages/runtime/src/rest.ts. Tests: VO-APIWF-001. Evidence: none for this facet.

[rest.all-or-none-composite](/features/rest--all-or-none-composite): partial; linked local report not-run.

### Mixed graph success and rollback across graphs

composite.graph-cross-graph-isolation: uncompared; reference pending.

A graph match does not verify every cross-graph reference, grant or resource-limit combination.

Next acceptance: Execute two graphs, one with a later invalid field; read back each graph under two users and compare graph boundaries and unsupported cross-graph references.

Implementation: packages/runtime/src/rest.ts, packages/runtime/src/index.ts. Tests: none selected. Evidence: none for this facet.

[rest.composite-graph](/features/rest--composite-graph): partial; linked local report not-run.

### Tree depth and child authorization fail without orphan rows

composite.tree-depth-authority: uncompared; reference pending.

Existing nested-tree evidence is bounded; arbitrary relationship depths, child denial and standard/custom combinations remain unestablished.

Next acceptance: Create a parent/child/grandchild tree, deny one child field and exceed the documented depth separately; verify zero orphan rows and exact reference errors.

Implementation: packages/runtime/src/index.ts, packages/runtime/src/rest.ts. Tests: none selected. Evidence: none for this facet.

[rest.sobject-tree](/features/rest--sobject-tree): partial; linked local report not-run.

## Bulk API 2.0

### Bulk API 2.0 ingest jobs

bulk.bulk-api-2-0-ingest-jobs: bounded; reference linked-subset.

Processed synchronously when the upload completes, in 200-record batches; Job info shapes per resource as recorded; Differential match is profile-bound; broader parity unverified; Missing-content UploadComplete is rejected without changing Open state; immediate readback retains contentUrl and omits processing counters, matching October17. Historical opposite observations remain retained; eventual processing and release causality are not inferred.

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Processed synchronously when the upload completes, in 200-record batches; Job info shapes per resource as recorded; Differential match is profile-bound; broader parity unverified; Missing-content UploadComplete is rejected without changing Open state; immediate readback retains contentUrl and omits processing counters, matching October17. Historical opposite observations remain retained; eventual processing and release causality are not inferred.

Implementation: packages/runtime/src/bulk.ts. Tests: VO-CLI-011, VO-DIFF-344, VO-DIFF-345, VO-DIFF-348. Evidence: EV-bulk.bulk-api-2-0-ingest-jobs-9366705.

[bulk.bulk-api-2-0-ingest-jobs](/features/bulk--bulk-api-2-0-ingest-jobs): partial; linked local report not-run.

### CSV parsing

bulk.csv-parsing: bounded; reference linked-subset.

RFC 4180 quoting; empty cells leave fields unset; #N/A sets null; COMMA, PIPE, SEMICOLON, TAB, CARET, BACKQUOTE; LF and CRLF; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: RFC 4180 quoting; empty cells leave fields unset; #N/A sets null; COMMA, PIPE, SEMICOLON, TAB, CARET, BACKQUOTE; LF and CRLF; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/bulk.ts. Tests: VO-CLI-011, VO-DIFF-344, VO-DIFF-345. Evidence: EV-bulk.csv-parsing-feaf503.

[bulk.csv-parsing](/features/bulk--csv-parsing): partial; linked local report not-run.

### Bulk insert

bulk.bulk-insert: bounded; reference linked-subset.

Runs the shared save path (triggers, validation rules); Quoted delimiters, invalid dates and restricted picklists; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Runs the shared save path (triggers, validation rules); Quoted delimiters, invalid dates and restricted picklists; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/bulk.ts. Tests: VO-CLI-011, VO-DIFF-345. Evidence: EV-bulk.bulk-insert-feaf503.

[bulk.bulk-insert](/features/bulk--bulk-insert): partial; linked local report not-run.

### Bulk update

bulk.bulk-update: bounded; reference linked-subset.

Id column required; 15- and 18-character IDs, invalid and duplicate IDs and empty cells behave as recorded; A record ID repeated in one file is saved once per row in file order, so the last value wins (PARTIAL-BULK-UPDATE-001); Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Id column required; 15- and 18-character IDs, invalid and duplicate IDs and empty cells behave as recorded; A record ID repeated in one file is saved once per row in file order, so the last value wins (PARTIAL-BULK-UPDATE-001); Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/bulk.ts. Tests: VO-CLI-011, VO-DIFF-737, VO-DIFF-2178, VO-DIFF-2179. Evidence: EV-bulk.bulk-update-685ab1e.

[bulk.bulk-update](/features/bulk--bulk-update): partial; linked local report not-run.

### Bulk upsert

bulk.bulk-upsert: bounded; reference linked-subset.

Results in uploaded row order; deserialization failures listed after DML failures; External ID or Id; case-insensitive matches and duplicate keys as recorded; A row without an external ID value fails with MISSING_ARGUMENT, a failed update of a matched record reports its ID, and a created record without a Name is named by its ID (PARTIAL-BULK-UPSERT-001); Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Results in uploaded row order; deserialization failures listed after DML failures; External ID or Id; case-insensitive matches and duplicate keys as recorded; A row without an external ID value fails with MISSING_ARGUMENT, a failed update of a matched record reports its ID, and a created record without a Name is named by its ID (PARTIAL-BULK-UPSERT-001); Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/bulk.ts. Tests: VO-CLI-011, VO-DIFF-344, VO-CLI-106, VO-DIFF-738, VO-DIFF-2180, VO-DIFF-2181. Evidence: EV-bulk.bulk-upsert-685ab1e.

[bulk.bulk-upsert](/features/bulk--bulk-upsert): partial; linked local report not-run.

### Bulk delete

bulk.bulk-delete: bounded; reference linked-subset.

Soft delete; hardDelete treated as delete; Unknown IDs fail with INVALID_CROSS_REFERENCE_KEY; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Soft delete; hardDelete treated as delete; Unknown IDs fail with INVALID_CROSS_REFERENCE_KEY; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/bulk.ts. Tests: VO-CLI-011, VO-DIFF-347. Evidence: EV-bulk.bulk-delete-feaf503.

[bulk.bulk-delete](/features/bulk--bulk-delete): partial; linked local report not-run.

### Bulk hard delete

bulk.bulk-hard-delete: bounded; reference linked-subset.

Always FEATURENOTENABLED: the Bulk API Hard Delete permission is not modeled (the recorded administrator lacks it too); Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Always FEATURENOTENABLED: the Bulk API Hard Delete permission is not modeled (the recorded administrator lacks it too); Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/bulk.ts. Tests: VO-DIFF-347. Evidence: EV-bulk.bulk-hard-delete-feaf503.

[bulk.bulk-hard-delete](/features/bulk--bulk-hard-delete): partial; linked local report not-run.

### Bulk query jobs

bulk.bulk-query-jobs: bounded; reference linked-subset.

Query executed at job creation; Processed at creation; COUNT(), aggregates, sub-queries and OFFSET rejected with recorded messages; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Query executed at job creation; Processed at creation; COUNT(), aggregates, sub-queries and OFFSET rejected with recorded messages; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/bulk.ts. Tests: VO-CLI-011, VO-DIFF-341, VO-DIFF-342, VO-DIFF-343. Evidence: EV-bulk.bulk-query-jobs-feaf503.

[bulk.bulk-query-jobs](/features/bulk--bulk-query-jobs): partial; linked local report not-run.

### Bulk query results

bulk.bulk-query-results: bounded; reference linked-subset.

Locator-based paging over a stored result; Opaque locators, maxRecords, delimiters and line endings; datetimes in Z form; Doubles render as Java Double.toString below sixteen significant digits and as plain digits from sixteen (123456789012345680, 0.0001234567890123456), as recorded (NUMEXACT-BULK-001); Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Locator-based paging over a stored result; Opaque locators, maxRecords, delimiters and line endings; datetimes in Z form; Doubles render as Java Double.toString below sixteen significant digits and as plain digits from sixteen (123456789012345680, 0.0001234567890123456), as recorded (NUMEXACT-BULK-001); Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/bulk.ts. Tests: VO-CLI-011, VO-DIFF-341, VO-DIFF-342, VO-CLI-106, VO-DIFF-2177. Evidence: EV-bulk.bulk-query-results-feaf503.

[bulk.bulk-query-results](/features/bulk--bulk-query-results): partial; linked local report not-run.

### Job cancellation

bulk.job-cancellation: bounded; reference linked-subset.

Aborted ingest jobs reject uploads and UploadComplete; completed jobs cannot be aborted; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Aborted ingest jobs reject uploads and UploadComplete; completed jobs cannot be aborted; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/bulk.ts. Tests: VO-DIFF-346, VO-DIFF-343. Evidence: EV-bulk.job-cancellation-feaf503.

[bulk.job-cancellation](/features/bulk--job-cancellation): partial; linked local report not-run.

### Job state transitions

bulk.job-state-transitions: bounded; reference linked-subset.

Open, UploadComplete, JobComplete, Aborted; A missing-content UploadComplete rejection preserves Open state and contentUrl; Differential match is profile-bound; broader parity unverified; Missing-content close leaves an Open uploadable job. Actual local recovery accepts its first CSV and completes; broad asynchronous/eventual state behavior remains unverified.

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Open, UploadComplete, JobComplete, Aborted; A missing-content UploadComplete rejection preserves Open state and contentUrl; Differential match is profile-bound; broader parity unverified; Missing-content close leaves an Open uploadable job. Actual local recovery accepts its first CSV and completes; broad asynchronous/eventual state behavior remains unverified.

Implementation: packages/runtime/src/bulk.ts. Tests: VO-CLI-011, VO-DIFF-346, VO-DIFF-348. Evidence: EV-bulk.job-state-transitions-9366705.

[bulk.job-state-transitions](/features/bulk--job-state-transitions): partial; linked local report not-run.

### Successful result CSV

bulk.successful-result-csv: bounded; reference linked-subset.

sf__Id, sf__Created plus uploaded columns; Echoed values are converted (doubles as 11.0); echoed doubles keep Java form even at sixteen or more significant digits (1.2345678901234568E17), as recorded (NUMEXACT-BULK-001); Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: sf__Id, sf__Created plus uploaded columns; Echoed values are converted (doubles as 11.0); echoed doubles keep Java form even at sixteen or more significant digits (1.2345678901234568E17), as recorded (NUMEXACT-BULK-001); Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/bulk.ts. Tests: VO-CLI-011, VO-DIFF-344, VO-DIFF-345, VO-DIFF-2176. Evidence: EV-bulk.successful-result-csv-feaf503.

[bulk.successful-result-csv](/features/bulk--successful-result-csv): partial; linked local report not-run.

### Failed result CSV

bulk.failed-result-csv: bounded; reference linked-subset.

sf__Error as CODE:message:fields --; Error column CODE:message:fields --; Save failures keep file order and deserialization failures follow them; sf__Id is set only when the row named or matched a record (PARTIAL-BULK-UPDATE-001, PARTIAL-BULK-UPSERT-001); Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: sf__Error as CODE:message:fields --; Error column CODE:message:fields --; Save failures keep file order and deserialization failures follow them; sf__Id is set only when the row named or matched a record (PARTIAL-BULK-UPDATE-001, PARTIAL-BULK-UPSERT-001); Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/bulk.ts. Tests: VO-CLI-011, VO-DIFF-344, VO-DIFF-345, VO-DIFF-348, VO-DIFF-2179, VO-DIFF-2181. Evidence: EV-bulk.failed-result-csv-feaf503.

[bulk.failed-result-csv](/features/bulk--failed-result-csv): partial; linked local report not-run.

### Unprocessed result CSV

bulk.unprocessed-result-csv: bounded; reference linked-subset.

Always empty because processing is synchronous; Empty after completion as recorded; for aborted jobs the reference answered 500 in the recording, so that path is unverified; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Always empty because processing is synchronous; Empty after completion as recorded; for aborted jobs the reference answered 500 in the recording, so that path is unverified; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/bulk.ts. Tests: VO-CLI-011, VO-DIFF-344. Evidence: EV-bulk.unprocessed-result-csv-feaf503.

[bulk.unprocessed-result-csv](/features/bulk--unprocessed-result-csv): partial; linked local report not-run.

### Large dataset limits

bulk.large-dataset-limits: bounded; reference linked-subset.

2,100-row ingest and query jobs with maxRecords and locator paging as recorded; the 150 MB upload limit is documented, not measured; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: 2,100-row ingest and query jobs with maxRecords and locator paging as recorded; the 150 MB upload limit is documented, not measured; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/bulk.ts, packages/runtime/src/soql.ts. Tests: VO-DIFF-727. Evidence: EV-bulk.large-dataset-limits-685ab1e.

[bulk.large-dataset-limits](/features/bulk--large-dataset-limits): partial; linked local report not-run.

### Observe and cancel a genuinely running asynchronous job

bulk2.background-execution: different-lifecycle; reference pending.

Ingest processing occurs during UploadComplete and query processing during creation; durable job records do not establish background scheduling or cancellation races.

Next acceptance: Compare Open, UploadComplete, InProgress and terminal polling while a job runs; cancel before, during and after execution and verify committed rows.

Implementation: packages/runtime/src/bulk.ts. Tests: none selected. Evidence: none for this facet.

[bulk.job-state-transitions](/features/bulk--job-state-transitions): partial; linked local report not-run.

### Access and poll another principal's job after grants change

bulk2.job-owner-current-authority: uncompared; reference pending.

loadJob is org-scoped without an explicit creator predicate; list/info use the current principal. Exact creator/admin access and revocation behavior are reference-pending.

Next acceptance: Create a job as user A; fetch, list, upload, close, download and cancel as A, B and administrator before/after CRUD revocation; compare ownership fields and effects.

Implementation: packages/runtime/src/bulk.ts. Tests: none selected. Evidence: none for this facet.

[bulk.bulk-api-2-0-ingest-jobs](/features/bulk--bulk-api-2-0-ingest-jobs): partial; linked local report not-run.

### Continue Bulk query results after expiry or as another user

bulk2.result-pagination-lifetime: uncompared; reference pending.

Existing CSV paging does not establish every locator lifetime, current-authority or principal combination.

Next acceptance: Fetch a paged result, switch principal, revoke fields and advance time; compare locator headers, result visibility and expiry errors.

Implementation: packages/runtime/src/bulk.ts. Tests: none selected. Evidence: none for this facet.

[bulk.bulk-query-results](/features/bulk--bulk-query-results): partial; linked local report not-run.

### Retry upload and close after ambiguous network outcomes

bulk2.retry-upload-close: uncompared; reference pending.

One upload is accepted per ingest job; this is not a general retry/idempotency guarantee.

Next acceptance: Lose each upload/close response after commit, retry once and compare job state, row counts, duplicate-write prevention and precise error envelope.

Implementation: packages/runtime/src/bulk.ts. Tests: none selected. Evidence: none for this facet.

[bulk.bulk-api-2-0-ingest-jobs](/features/bulk--bulk-api-2-0-ingest-jobs): partial; linked local report not-run.

## Bulk API 1.0

### Bulk API 1.0 batches

bulk.bulk-api-1-0-batches: bounded; reference linked-subset.

XML and JSON job info, CSV and JSON batches for insert, update, upsert by Id and delete, JSON and CSV query result lists, closing, aborting and the recorded error envelopes on Account; Batches are processed inside the request that adds them; the add response shows the created Queued batch; XML batch content, hardDelete, queryAll, PK chunking, serial concurrency, binary attachments and session-error envelopes are not implemented; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: XML and JSON job info, CSV and JSON batches for insert, update, upsert by Id and delete, JSON and CSV query result lists, closing, aborting and the recorded error envelopes on Account; Batches are processed inside the request that adds them; the add response shows the created Queued batch; XML batch content, hardDelete, queryAll, PK chunking, serial concurrency, binary attachments and session-error envelopes are not implemented; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/bulk1.ts, packages/runtime/src/bulk.ts, packages/runtime/src/index.ts. Tests: VO-DIFF-2121, VO-DIFF-2122, VO-DIFF-2123, VO-DIFF-2124, VO-DIFF-2125, VO-DIFF-2126, VO-DIFF-2127, VO-DIFF-2128, VO-DIFF-2129, VO-BULK1-001. Evidence: EV-bulk.bulk-api-1-0-batches-1532fe5.

[bulk.bulk-api-1-0-batches](/features/bulk--bulk-api-1-0-batches): partial; linked local report not-run.

### Upload XML record batches

bulk1.xml-batch: missing; reference pending.

XML job envelopes are implemented; XML batch content is explicitly excluded.

Next acceptance: Create an XML-format job and upload a two-row XML batch with one invalid row; compare result envelopes and partial writes.

Implementation: packages/runtime/src/bulk1.ts, packages/runtime/src/bulk.ts, packages/runtime/src/index.ts. Tests: none selected. Evidence: none for this facet.

[bulk.bulk-api-1-0-batches](/features/bulk--bulk-api-1-0-batches): partial; linked local report not-run.

### Bulk 1.0 hard delete

bulk1.hard-delete: missing; reference pending.

Bulk 2.0 delete evidence cannot establish Bulk 1.0 hardDelete or queryAll, both explicitly excluded.

Next acceptance: Independently measure hardDelete permission/undelete effects and queryAll visibility on deleted records with clean fixtures.

Implementation: packages/runtime/src/bulk1.ts, packages/runtime/src/bulk.ts, packages/runtime/src/index.ts. Tests: none selected. Evidence: none for this facet.

[bulk.bulk-api-1-0-batches](/features/bulk--bulk-api-1-0-batches): partial; linked local report not-run.

### Bulk 1.0 queryAll

bulk1.queryall: missing; reference pending.

Bulk 2.0 delete evidence cannot establish Bulk 1.0 hardDelete or queryAll, both explicitly excluded.

Next acceptance: Independently measure hardDelete permission/undelete effects and queryAll visibility on deleted records with clean fixtures.

Implementation: packages/runtime/src/bulk1.ts, packages/runtime/src/bulk.ts, packages/runtime/src/index.ts. Tests: none selected. Evidence: none for this facet.

[bulk.bulk-api-1-0-batches](/features/bulk--bulk-api-1-0-batches): partial; linked local report not-run.

### Bulk 1.0 PK chunking

bulk1.pk-chunking: missing; reference pending.

PK chunking and serial concurrency are explicitly unimplemented; small batch results establish neither.

Next acceptance: Pin source limits and compare chunk boundaries and two contending batches under serial mode without relaxing transaction isolation.

Implementation: packages/runtime/src/bulk1.ts, packages/runtime/src/bulk.ts, packages/runtime/src/index.ts. Tests: none selected. Evidence: none for this facet.

[bulk.bulk-api-1-0-batches](/features/bulk--bulk-api-1-0-batches): partial; linked local report not-run.

### Bulk 1.0 serial concurrency

bulk1.serial-concurrency: missing; reference pending.

PK chunking and serial concurrency are explicitly unimplemented; small batch results establish neither.

Next acceptance: Pin source limits and compare chunk boundaries and two contending batches under serial mode without relaxing transaction isolation.

Implementation: packages/runtime/src/bulk1.ts, packages/runtime/src/bulk.ts, packages/runtime/src/index.ts. Tests: none selected. Evidence: none for this facet.

[bulk.bulk-api-1-0-batches](/features/bulk--bulk-api-1-0-batches): partial; linked local report not-run.

### Poll and abort a running Bulk 1.0 batch

bulk1.background-and-abort: different-lifecycle; reference pending.

The add-batch request processes the batch synchronously while returning its initial Queued representation.

Next acceptance: Compare queued/running/completed batch polling and abort during processing, including partial writes and terminal-state errors.

Implementation: packages/runtime/src/bulk1.ts, packages/runtime/src/bulk.ts, packages/runtime/src/index.ts. Tests: none selected. Evidence: none for this facet.

[bulk.bulk-api-1-0-batches](/features/bulk--bulk-api-1-0-batches): partial; linked local report not-run.

### Bulk 1.0 binary attachments

bulk1.binary-attachments: missing; reference pending.

Binary attachments and Bulk 1.0 session-error envelopes are explicitly excluded.

Next acceptance: Keep independent binary-upload and expired/revoked/wrong-org X-SFDC-Session cases; compare content types and error bodies without logging secrets.

Implementation: packages/runtime/src/bulk1.ts, packages/runtime/src/bulk.ts, packages/runtime/src/index.ts. Tests: none selected. Evidence: none for this facet.

[bulk.bulk-api-1-0-batches](/features/bulk--bulk-api-1-0-batches): partial; linked local report not-run.

### Bulk 1.0 session-error envelopes

bulk1.session-errors: missing; reference pending.

Binary attachments and Bulk 1.0 session-error envelopes are explicitly excluded.

Next acceptance: Keep independent binary-upload and expired/revoked/wrong-org X-SFDC-Session cases; compare content types and error bodies without logging secrets.

Implementation: packages/runtime/src/bulk1.ts, packages/runtime/src/bulk.ts, packages/runtime/src/index.ts. Tests: none selected. Evidence: none for this facet.

[bulk.bulk-api-1-0-batches](/features/bulk--bulk-api-1-0-batches): partial; linked local report not-run.

## GraphQL

### GraphQL record queries

graphql.record-queries: bounded; reference linked-subset.

Matches uiapi record queries with value/displayValue, Id and variables on a custom object (examples/untracked-org); Fragments, directives, child relationships, scope/upperBound arguments and standard objects with record types are unverified; unsupported syntax returns ValidationError; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Matches uiapi record queries with value/displayValue, Id and variables on a custom object (examples/untracked-org); Fragments, directives, child relationships, scope/upperBound arguments and standard objects with record types are unverified; unsupported syntax returns ValidationError; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/graphql.ts, packages/runtime/src/index.ts. Tests: VO-DIFF-7140, VO-DIFF-7145. Evidence: EV-graphql.record-queries-63938c8.

[graphql.record-queries](/features/graphql--record-queries): partial; linked local report not-run.

### GraphQL where filters

graphql.filtering: bounded; reference linked-subset.

Matches gt/gte/eq/like/in, and/or and eq null filters; Relationship filters, date literals/ranges and nin/ne/lt/lte are implemented but not compared; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Matches gt/gte/eq/like/in, and/or and eq null filters; Relationship filters, date literals/ranges and nin/ne/lt/lte are implemented but not compared; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/graphql.ts, packages/runtime/src/index.ts. Tests: VO-DIFF-7141. Evidence: EV-graphql.filtering-63938c8.

[graphql.filtering](/features/graphql--filtering): partial; linked local report not-run.

### GraphQL ordering

graphql.ordering: bounded; reference linked-subset.

Matches ASC and DESC NULLS LAST ordering; an Id tie-breaker is appended (an inferred stable order); Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Matches ASC and DESC NULLS LAST ordering; an Id tie-breaker is appended (an inferred stable order); Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/graphql.ts, packages/runtime/src/index.ts. Tests: VO-DIFF-7140. Evidence: EV-graphql.ordering-63938c8.

[graphql.ordering](/features/graphql--ordering): partial; linked local report not-run.

### GraphQL pagination

graphql.pagination: bounded; reference linked-subset.

Matches first/after paging, totalCount and pageInfo across three pages; cursors are VirtualOrg's own opaque offsets and foreign cursors are rejected; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Matches first/after paging, totalCount and pageInfo across three pages; cursors are VirtualOrg's own opaque offsets and foreign cursors are rejected; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/graphql.ts, packages/runtime/src/index.ts. Tests: VO-DIFF-7142, VO-UNTRK-007. Evidence: EV-graphql.pagination-63938c8.

[graphql.pagination](/features/graphql--pagination): partial; linked local report not-run.

### GraphQL parent and child relationships

graphql.relationships: bounded; reference linked-subset.

Matches single-target parent relationship fields; child relationship connections are not implemented; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Matches single-target parent relationship fields; child relationship connections are not implemented; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/graphql.ts, packages/runtime/src/index.ts. Tests: VO-DIFF-7143. Evidence: EV-graphql.relationships-63938c8.

[graphql.relationships](/features/graphql--relationships): partial; linked local report not-run.

### GraphQL aggregate queries

graphql.aggregate-queries: bounded; reference linked-subset.

Matches groupBy on a picklist with sum/max/count and picklist definition ordering; avg/min/countDistinct, groupBy functions and pagination of aggregates are not compared; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Matches groupBy on a picklist with sum/max/count and picklist definition ordering; avg/min/countDistinct, groupBy functions and pagination of aggregates are not compared; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/graphql.ts, packages/runtime/src/index.ts. Tests: VO-DIFF-7144. Evidence: EV-graphql.aggregate-queries-63938c8.

[graphql.aggregate-queries](/features/graphql--aggregate-queries): partial; linked local report not-run.

### GraphQL mutations

graphql.mutations: bounded; reference linked-subset.

Matches Create, Update and Delete mutations with Record selections; mutation error payloads and allOrNone batches are unverified; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Matches Create, Update and Delete mutations with Record selections; mutation error payloads and allOrNone batches are unverified; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/graphql.ts, packages/runtime/src/index.ts. Tests: VO-DIFF-7147. Evidence: EV-graphql.mutations-63938c8.

[graphql.mutations](/features/graphql--mutations): partial; linked local report not-run.

### GraphQL object info

graphql.object-info-queries: bounded; reference linked-subset.

Matches objectInfos ApiName/label/labelPlural/keyPrefix/createable and field ApiName/dataType/label (compared sorted; CloneSourceId excluded); Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Matches objectInfos ApiName/label/labelPlural/keyPrefix/createable and field ApiName/dataType/label (compared sorted; CloneSourceId excluded); Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/graphql.ts, packages/runtime/src/index.ts. Tests: VO-DIFF-7146. Evidence: EV-graphql.object-info-queries-63938c8.

[graphql.object-info-queries](/features/graphql--object-info-queries): partial; linked local report not-run.

### GraphQL errors

graphql.errors: bounded; reference linked-subset.

Matches InvalidSyntax and FieldUndefined ValidationError messages and locations and the GET input error; Other graphql-java validation rules are not modeled; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Matches InvalidSyntax and FieldUndefined ValidationError messages and locations and the GET input error; Other graphql-java validation rules are not modeled; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/graphql.ts, packages/runtime/src/index.ts. Tests: VO-DIFF-7148, VO-UNTRK-007. Evidence: EV-graphql.errors-63938c8.

[graphql.errors](/features/graphql--errors): partial; linked local report not-run.

### GraphQL field-level security

graphql.field-level-security: bounded; reference linked-subset.

Matches a Standard User with object read and partial field access: readable fields resolve, an unreadable selected field is FieldUndefined and an unreadable filter field is a WrongType validation error (2026-10-15 receipt); Objects without read access report FieldUndefined (native test only); mutations under restricted access are not compared; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Matches a Standard User with object read and partial field access: readable fields resolve, an unreadable selected field is FieldUndefined and an unreadable filter field is a WrongType validation error (2026-10-15 receipt); Objects without read access report FieldUndefined (native test only); mutations under restricted access are not compared; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/graphql.ts, packages/runtime/src/security.ts. Tests: VO-UNTRK-007, VO-DIFF-7149. Evidence: EV-graphql.field-level-security-82a584e.

[graphql.field-level-security](/features/graphql--field-level-security): partial; linked local report not-run.

### Select child connections with nested pageInfo

graphql.child-connections: missing; reference pending.

VO-DIFF-7143 matches single-target parent fields only; child connection execution is absent.

Next acceptance: Query a parent with two child pages, null parents, a denied child field and independent parent/child cursors; compare data, errors and ordering.

Implementation: packages/runtime/src/graphql.ts, packages/runtime/src/index.ts. Tests: none selected. Evidence: none for this facet.

[graphql.relationships](/features/graphql--relationships): partial; linked local report not-run.

### Execute fragments and conditional directives

graphql.fragments-directives: missing; reference pending.

Native tests explicitly reject fragments and directives; a record-query match does not include them.

Next acceptance: Compare named/inline fragments and include/skip directives with variables, denied fields and malformed definitions.

Implementation: packages/runtime/src/graphql.ts, packages/runtime/src/index.ts. Tests: none selected. Evidence: none for this facet.

[graphql.record-queries](/features/graphql--record-queries): partial; linked local report not-run.

### Bind cursors to query, principal and expiry

graphql.cursor-identity-expiry: uncompared; reference pending.

Current cursors encode offsets, unlike durable REST locators; query identity, ownership and expiration are not established.

Next acceptance: Reuse a cursor across filters, objects, users and orgs; mutate data and advance time; compare allowed continuation and errors against a selected profile.

Implementation: packages/runtime/src/graphql.ts, packages/runtime/src/index.ts. Tests: none selected. Evidence: none for this facet.

[graphql.pagination](/features/graphql--pagination): partial; linked local report not-run.

### Multiple mutations with a later error

graphql.mutation-rollback-errors: uncompared; reference pending.

Create/update/delete in one recorded case does not establish all mutation transaction/error permutations; the handler catches client errors inside the request.

Next acceptance: Run successful then invalid or denied mutations in one operation; compare response data/errors and committed state under the documented transaction option.

Implementation: packages/runtime/src/graphql.ts, packages/runtime/src/index.ts. Tests: none selected. Evidence: none for this facet.

[graphql.mutations](/features/graphql--mutations): partial; linked local report not-run.

### Nested and paged aggregate variants

graphql.aggregate-variants: uncompared; reference pending.

The grouped aggregate match covers selected scalar functions only, not every grouping, null, relationship, paging or permission combination.

Next acceptance: Compare null-only groups, filter/sort, unsupported group functions, denied grouping fields and aggregate pagination independently.

Implementation: packages/runtime/src/graphql.ts, packages/runtime/src/index.ts. Tests: none selected. Evidence: none for this facet.

[graphql.aggregate-queries](/features/graphql--aggregate-queries): partial; linked local report not-run.

### Discover schema and select operationName

graphql.schema-introspection: missing; reference pending.

The bounded parser does not implement general schema introspection or multi-operation selection.

Next acceptance: Compare __schema/__type and multiple named operations with operationName, invalid names and principal-specific visibility.

Implementation: packages/runtime/src/graphql.ts, packages/runtime/src/index.ts. Tests: none selected. Evidence: none for this facet.

[graphql.errors](/features/graphql--errors): partial; linked local report not-run.

## Tooling lifecycle

### Tooling query

tooling.tooling-query: bounded; reference linked-subset.

Tooling query envelope (size, entityTypeName, queryLocator) and tooling record URLs; objects: ApexClass, ApexTrigger, ApexTestQueueItem, ApexTestResult, ApexTestRunResult, ApexLog, AsyncApexJob, User; Other objects fail with INVALID_TYPE as observed; Polymorphic lookups report type Name; coverage objects refreshed at query time; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Tooling query envelope (size, entityTypeName, queryLocator) and tooling record URLs; objects: ApexClass, ApexTrigger, ApexTestQueueItem, ApexTestResult, ApexTestRunResult, ApexLog, AsyncApexJob, User; Other objects fail with INVALID_TYPE as observed; Polymorphic lookups report type Name; coverage objects refreshed at query time; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/index.ts, packages/runtime/src/soql.ts, packages/runtime/src/tooling.ts, packages/runtime/src/schema.ts, packages/runtime/src/standard/tooling.json. Tests: VO-DIFF-045, VO-DIFF-150, VO-DIFF-155, VO-DIFF-158. Evidence: EV-tooling.tooling-query-feaf503.

[tooling.tooling-query](/features/tooling--tooling-query): partial; linked local report passed.

### ApexClass records

tooling.apexclass-records: bounded; reference linked-subset.

Historical0.2.0 record-query profile: class storage/read and its declared Tooling query subset; fresh class creation/compilation was not admitted in that profile.; Tooling query of Name, Status, ApiVersion, IsValid, NamespacePrefix matches the receipt; Differential match is profile-bound; broader parity unverified; Runtime0.7.21 separately measures fresh original named Active API67 Tooling class creation as setup in revenue-cloud.native-decision-table-apex. General Tooling ApexClass authoring/lifecycle/errors remain unadmitted; this older record-read evidence and first parity version stay unchanged.

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Historical0.2.0 record-query profile: class storage/read and its declared Tooling query subset; fresh class creation/compilation was not admitted in that profile.; Tooling query of Name, Status, ApiVersion, IsValid, NamespacePrefix matches the receipt; Differential match is profile-bound; broader parity unverified; Runtime0.7.21 separately measures fresh original named Active API67 Tooling class creation as setup in revenue-cloud.native-decision-table-apex. General Tooling ApexClass authoring/lifecycle/errors remain unadmitted; this older record-read evidence and first parity version stay unchanged.

Implementation: packages/runtime/src/deploy.ts. Tests: VO-CLI-006, VO-DIFF-045. Evidence: EV-tooling.apexclass-records-29bc263.

[tooling.apexclass-records](/features/tooling--apexclass-records): partial; linked local report passed.

### ApexTrigger records

tooling.apextrigger-records: bounded; reference linked-subset.

Deployed triggers stored as ApexTrigger records with usage flags; Tooling query of TableEnumOrId and Usage* flags matches the receipt; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Deployed triggers stored as ApexTrigger records with usage flags; Tooling query of TableEnumOrId and Usage* flags matches the receipt; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/deploy.ts. Tests: VO-APEX-008, VO-DIFF-045. Evidence: EV-tooling.apextrigger-records-29bc263.

[tooling.apextrigger-records](/features/tooling--apextrigger-records): partial; linked local report passed.

### Apex test run records

tooling.apex-test-run-records: missing; reference pending.

Current Rust-only profile: predecessor TypeScript execution/coverage is retired. This workflow is explicitly unsupported or requires a new exact-source Rust comparison. Historical provider observations remain dated evidence, not current support.

Next acceptance: Verify the current explicit fence, then implement and compare a bounded canonical Rust workflow before admitting this slice.

Implementation: packages/runtime/src/index.ts. Tests: none selected. Evidence: none for this facet.

[tooling.apex-test-run-records](/features/tooling--apex-test-run-records): partial; linked local report passed.

### Apex code coverage records

tooling.apex-code-coverage-records: missing; reference pending.

Current Rust-only profile: predecessor TypeScript execution/coverage is retired. This workflow is explicitly unsupported or requires a new exact-source Rust comparison. Historical provider observations remain dated evidence, not current support.

Next acceptance: Verify the current explicit fence, then implement and compare a bounded canonical Rust workflow before admitting this slice.

Implementation: packages/runtime/src/index.ts. Tests: none selected. Evidence: none for this facet.

[tooling.apex-code-coverage-records](/features/tooling--apex-code-coverage-records): partial; linked local report passed.

### Trace flags

tooling.trace-flags: bounded; reference linked-subset.

DEVELOPER_LOG and USER_DEBUG flags trace users; class/trigger tracing not implemented; Default levels for omitted DebugLevel categories are unverified; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: DEVELOPER_LOG and USER_DEBUG flags trace users; class/trigger tracing not implemented; Default levels for omitted DebugLevel categories are unverified; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/tooling.ts, packages/runtime/src/schema.ts, packages/runtime/src/standard/tooling.json. Tests: VO-DIFF-150, VO-DIFF-151, VO-DIFF-152, VO-DIFF-153, VO-APEX-101, VO-APEX-105, VO-APEX-106. Evidence: EV-tooling.trace-flags-feaf503.

[tooling.trace-flags](/features/tooling--trace-flags): partial; linked local report passed.

### Debug logs

tooling.debug-logs: uncompared; reference pending.

Current Rust-only profile: predecessor TypeScript execution/coverage is retired. This workflow is explicitly unsupported or requires a new exact-source Rust comparison. Historical provider observations remain dated evidence, not current support.

Next acceptance: Verify the current explicit fence, then implement and compare a bounded canonical Rust workflow before admitting this slice.

Implementation: packages/runtime/src/tooling.ts, packages/runtime/src/soap.ts, packages/runtime/src/streaming.ts, engine/core/src/compiler/exceptions.rs, engine/core/src/compiler/assertions.rs, engine/core/src/vm/exceptions.rs, engine/core/src/vm/assertions.rs, packages/runtime/src/apex-log.ts, packages/runtime/src/apex-execution.ts. Tests: none selected. Evidence: none for this facet.

[tooling.debug-logs](/features/tooling--debug-logs): experimental; linked local report passed.

### MetadataContainer

tooling.metadatacontainer: bounded; reference linked-subset.

Recorded describe, required/length/duplicate Name errors, reads, queries and deletion with member cascade; containers hold ApexClassMember records only; Deleting a container also removes its requests in Virtual Org; Salesforce request retention after deletion is unmeasured; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Recorded describe, required/length/duplicate Name errors, reads, queries and deletion with member cascade; containers hold ApexClassMember records only; Deleting a container also removes its requests in Virtual Org; Salesforce request retention after deletion is unmeasured; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/apex-container.ts, packages/runtime/src/tooling.ts, packages/runtime/src/standard/tooling.json. Tests: VO-DIFF-2110, VO-DIFF-2111, VO-DIFF-2112, VO-DIFF-2118. Evidence: EV-tooling.metadatacontainer-1532fe5.

[tooling.metadatacontainer](/features/tooling--metadatacontainer): partial; linked local report passed.

### ContainerAsyncRequest

tooling.containerasyncrequest: bounded; reference linked-subset.

Requests compile inside the creating API transaction through the shared Metadata deploy service; the first read already shows Completed or Failed (the reference reports Queued first); Check-only compiles roll back; unchanged member bodies are skipped; completed requests cannot be aborted; IsRunTests, MetadataContainerMemberId and non-class members are rejected as not implemented; Compiler diagnostics are compared for two syntax errors; other messages follow the shared Apex parser and remain reference-pending; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Requests compile inside the creating API transaction through the shared Metadata deploy service; the first read already shows Completed or Failed (the reference reports Queued first); Check-only compiles roll back; unchanged member bodies are skipped; completed requests cannot be aborted; IsRunTests, MetadataContainerMemberId and non-class members are rejected as not implemented; Compiler diagnostics are compared for two syntax errors; other messages follow the shared Apex parser and remain reference-pending; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/apex-container.ts, packages/runtime/src/soap.ts, packages/runtime/src/tooling.ts. Tests: VO-DIFF-2112, VO-DIFF-2113, VO-DIFF-2114, VO-DIFF-2116, VO-DIFF-2117, VO-DIFF-2119. Evidence: EV-tooling.containerasyncrequest-1532fe5.

[tooling.containerasyncrequest](/features/tooling--containerasyncrequest): partial; linked local report passed.

### Symbol tables

tooling.symbol-tables: missing; reference pending.

Current Rust-only profile: predecessor TypeScript execution/coverage is retired. This workflow is explicitly unsupported or requires a new exact-source Rust comparison. Historical provider observations remain dated evidence, not current support.

Next acceptance: Verify the current explicit fence, then implement and compare a bounded canonical Rust workflow before admitting this slice.

Implementation: packages/runtime/src/index.ts. Tests: none selected. Evidence: none for this facet.

[tooling.symbol-tables](/features/tooling--symbol-tables): partial; linked local report passed.

### FlowDefinition records

tooling.flowdefinition-records: bounded; reference linked-subset.

FlowDefinitionView and FlowVersionView rows keep the 15-character ID with a vvv suffix; Differential match is profile-bound; broader parity unverified; Fresh October 18 Flow3 Tooling FlowDefinition ApiVersion is 68 for 19 rows, versus 67 in the selected October 10 oracle. Authored flow XML API versions and active Flow version observations are distinct and unchanged in that comparison; current-native renewal of the definition field is pending.

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: FlowDefinitionView and FlowVersionView rows keep the 15-character ID with a vvv suffix; Differential match is profile-bound; broader parity unverified; Fresh October 18 Flow3 Tooling FlowDefinition ApiVersion is 68 for 19 rows, versus 67 in the selected October 10 oracle. Authored flow XML API versions and active Flow version observations are distinct and unchanged in that comparison; current-native renewal of the definition field is pending.

Implementation: packages/runtime/src/flow-records.ts, packages/runtime/src/tooling.ts. Tests: VO-DIFF-516, VO-DIFF-517, VO-DIFF-568. Evidence: EV-tooling.flowdefinition-records-c3441f6.

[tooling.flowdefinition-records](/features/tooling--flowdefinition-records): partial; linked local report passed.

### Execute anonymous Tooling endpoint

tooling.execute-anonymous-tooling-endpoint: bounded; reference linked-subset.

GET tooling/executeAnonymous; GET tooling/executeAnonymous; traced runs store ApexLog rows; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: GET tooling/executeAnonymous; GET tooling/executeAnonymous; traced runs store ApexLog rows; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/index.ts, packages/runtime/src/soap.ts. Tests: VO-APEX-011, VO-DIFF-100, VO-DIFF-122. Evidence: EV-tooling.execute-anonymous-tooling-endpoint-feaf503.

[tooling.execute-anonymous-tooling-endpoint](/features/tooling--execute-anonymous-tooling-endpoint): partial; linked local report passed.

### Poll and abort a queued container compile

tooling.real-queued-container: different-lifecycle; reference pending.

Compilation runs inside create; first read is Completed or Failed while the recorded reference service initially reports Queued.

Next acceptance: Compare queued-to-compiling-to-terminal transitions, creator authority and abort before completion; retain existing terminal diagnostics.

Implementation: packages/runtime/src/apex-container.ts, packages/runtime/src/soap.ts, packages/runtime/src/tooling.ts. Tests: none selected. Evidence: none for this facet.

[tooling.containerasyncrequest](/features/tooling--containerasyncrequest): partial; linked local report passed.

### Compile trigger and other container members

tooling.nonclass-container-members: missing; reference pending.

Only class members are admitted; non-class members, IsRunTests and MetadataContainerMemberId variants are rejected.

Next acceptance: Create trigger and class members with dependent syntax, check-only and invalid requests; verify no partial source installation.

Implementation: packages/runtime/src/apex-container.ts, packages/runtime/src/tooling.ts, packages/runtime/src/standard/tooling.json. Tests: none selected. Evidence: none for this facet.

[tooling.metadatacontainer](/features/tooling--metadatacontainer): partial; linked local report passed.

### Edit source after revocation or concurrent changes

tooling.source-authority-concurrency: uncompared; reference pending.

Source lifecycle receipts do not establish every version-conflict, principal, dependency and rollback combination.

Next acceptance: Have two users read then update a class, revoke authoring authority and submit an invalid trigger dependency; compare source and diagnostics after failure.

Implementation: packages/runtime/src/deploy.ts. Tests: none selected. Evidence: none for this facet.

[tooling.apexclass-records](/features/tooling--apexclass-records): partial; linked local report passed.

## UI API resources

### UI API object info

ui-api.object-info: bounded; reference linked-subset.

Matches the recorded API 67.0 receipt for a custom object without record types (examples/untracked-org); childRelationships and the CloneSourceId system field (added to custom objects by the 2026-10 release) are documented exclusions; Standard objects are served by the LWC-backed resource, compared on Account under lwc.object-info-and-picklists (VO-DIFF-8123); for custom objects themeInfo is the default custom-object color and record types, dependent fields and compound fields are not modeled; A restricted Standard User comparison (field-level security) also matches (VO-DIFF-7129); Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Matches the recorded API 67.0 receipt for a custom object without record types (examples/untracked-org); childRelationships and the CloneSourceId system field (added to custom objects by the 2026-10 release) are documented exclusions; Standard objects are served by the LWC-backed resource, compared on Account under lwc.object-info-and-picklists (VO-DIFF-8123); for custom objects themeInfo is the default custom-object color and record types, dependent fields and compound fields are not modeled; A restricted Standard User comparison (field-level security) also matches (VO-DIFF-7129); Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/salesforce-ui-api.ts, packages/runtime/src/index.ts. Tests: VO-DIFF-7120, VO-UNTRK-006, VO-DIFF-7129. Evidence: EV-ui-api.object-info-63938c8.

[ui-api.object-info](/features/ui-api--object-info): partial; linked local report not-run.

### UI API batch object info

ui-api.object-info-batch: bounded; reference linked-subset.

Matches batch object info and the 403 unknown-object envelopes (FORBIDDEN in batch, INSUFFICIENT_ACCESS single) as recorded; Same object-info exclusions as ui-api.object-info; Batches naming a standard object answer UNSUPPORTED_UI_API (501); Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Matches batch object info and the 403 unknown-object envelopes (FORBIDDEN in batch, INSUFFICIENT_ACCESS single) as recorded; Same object-info exclusions as ui-api.object-info; Batches naming a standard object answer UNSUPPORTED_UI_API (501); Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/salesforce-ui-api.ts, packages/runtime/src/index.ts. Tests: VO-DIFF-7121. Evidence: EV-ui-api.object-info-batch-63938c8.

[ui-api.object-info-batch](/features/ui-api--object-info-batch): partial; linked local report not-run.

### UI API picklist values

ui-api.picklist-values: bounded; reference linked-subset.

Matches master-record-type picklist values for one field and for all picklists, and the not-a-picklist error, on a custom object (2026-10-15 receipt); Dependent picklists (controllerValues/validFor) and non-master record types return UNSUPPORTED_UI_API (501); Standard-object picklist values are served by the LWC-backed resource, compared on Account under lwc.object-info-and-picklists (VO-DIFF-8123); Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Matches master-record-type picklist values for one field and for all picklists, and the not-a-picklist error, on a custom object (2026-10-15 receipt); Dependent picklists (controllerValues/validFor) and non-master record types return UNSUPPORTED_UI_API (501); Standard-object picklist values are served by the LWC-backed resource, compared on Account under lwc.object-info-and-picklists (VO-DIFF-8123); Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/salesforce-ui-api.ts. Tests: VO-DIFF-7127. Evidence: EV-ui-api.picklist-values-fec9c34.

[ui-api.picklist-values](/features/ui-api--picklist-values): partial; linked local report not-run.

### UI API get record

ui-api.record-read: bounded; reference linked-subset.

Matches fields/optionalFields reads with picklist, date, datetime (user time zone), number, boolean, text and single-target lookup values on a custom object; eTag values are opaque digests (format checked, value not compared); layoutTypes/modes reads return NOT_FOUND; Unknown required fields return INVALID_FIELD without Salesforce's embedded SOQL text; A restricted Standard User comparison (field-level security) also matches (VO-DIFF-7129); Standard-object reads are served by the LWC-backed resource, compared on Account under lwc.record-read-services (VO-DIFF-8121); Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Matches fields/optionalFields reads with picklist, date, datetime (user time zone), number, boolean, text and single-target lookup values on a custom object; eTag values are opaque digests (format checked, value not compared); layoutTypes/modes reads return NOT_FOUND; Unknown required fields return INVALID_FIELD without Salesforce's embedded SOQL text; A restricted Standard User comparison (field-level security) also matches (VO-DIFF-7129); Standard-object reads are served by the LWC-backed resource, compared on Account under lwc.record-read-services (VO-DIFF-8121); Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/salesforce-ui-api.ts, packages/runtime/src/index.ts. Tests: VO-DIFF-7122, VO-DIFF-7123, VO-UNTRK-006, VO-DIFF-7129. Evidence: EV-ui-api.record-read-63938c8.

[ui-api.record-read](/features/ui-api--record-read): partial; linked local report not-run.

### UI API batch records

ui-api.record-batch-read: bounded; reference linked-subset.

Matches batch reads with a missing record (404 'Resource not found.') as recorded; Batches containing a standard-object record answer UNSUPPORTED_UI_API (501); Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Matches batch reads with a missing record (404 'Resource not found.') as recorded; Batches containing a standard-object record answer UNSUPPORTED_UI_API (501); Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/salesforce-ui-api.ts, packages/runtime/src/index.ts. Tests: VO-DIFF-7124. Evidence: EV-ui-api.record-batch-read-63938c8.

[ui-api.record-batch-read](/features/ui-api--record-batch-read): partial; linked local report not-run.

### UI API create record

ui-api.record-create: bounded; reference linked-subset.

Matches create status and persisted values; the response field set follows the reference's page layout and only apiName/id are compared; RecordError envelopes compared for a restricted picklist and missing apiName; Standard-object writes are served by the LWC-backed resource, compared on Account under lwc.record-write-services (VO-DIFF-8122); Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Matches create status and persisted values; the response field set follows the reference's page layout and only apiName/id are compared; RecordError envelopes compared for a restricted picklist and missing apiName; Standard-object writes are served by the LWC-backed resource, compared on Account under lwc.record-write-services (VO-DIFF-8122); Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/salesforce-ui-api.ts, packages/runtime/src/index.ts. Tests: VO-DIFF-7125, VO-DIFF-7126. Evidence: EV-ui-api.record-create-63938c8.

[ui-api.record-create](/features/ui-api--record-create): partial; linked local report not-run.

### UI API update record

ui-api.record-update: bounded; reference linked-subset.

Matches update status and persisted values including clearing a field; response field set compared by apiName/id only; If-Unmodified-Since conflicts are not implemented; Standard-object writes are served by the LWC-backed resource, compared on Account under lwc.record-write-services (VO-DIFF-8122); Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Matches update status and persisted values including clearing a field; response field set compared by apiName/id only; If-Unmodified-Since conflicts are not implemented; Standard-object writes are served by the LWC-backed resource, compared on Account under lwc.record-write-services (VO-DIFF-8122); Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/salesforce-ui-api.ts, packages/runtime/src/index.ts. Tests: VO-DIFF-7125, VO-DIFF-7126. Evidence: EV-ui-api.record-update-63938c8.

[ui-api.record-update](/features/ui-api--record-update): partial; linked local report not-run.

### UI API delete record

ui-api.record-delete: bounded; reference linked-subset.

Matches delete (204), the following 404 read and the INVALID_CROSS_REFERENCE_KEY RecordError for a missing record; Standard-object writes are served by the LWC-backed resource, compared on Account under lwc.record-write-services (VO-DIFF-8122); Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Matches delete (204), the following 404 read and the INVALID_CROSS_REFERENCE_KEY RecordError for a missing record; Standard-object writes are served by the LWC-backed resource, compared on Account under lwc.record-write-services (VO-DIFF-8122); Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/salesforce-ui-api.ts, packages/runtime/src/index.ts. Tests: VO-DIFF-7125, VO-DIFF-7126. Evidence: EV-ui-api.record-delete-63938c8.

[ui-api.record-delete](/features/ui-api--record-delete): partial; linked local report not-run.

### UI API record UI

ui-api.record-ui: missing; reference pending.

The Salesforce record-ui resource is unimplemented; native workspaces and record reads do not establish it. Layout work owns this contract.

Next acceptance: Cross-reference the layout task's record-ui case for record types, modes and authority, without replacing its native authoring acceptance.

Implementation: none. Tests: none selected. Evidence: none for this facet.

[ui-api.record-ui](/features/ui-api--record-ui): partial; linked local report not-run.

### UI API layouts

ui-api.layouts: missing; reference pending.

Inventory cross-reference only; layout semantics and assignments belong to the layouts work area. Native browser layout APIs are a different interface.

Next acceptance: Coordinate acceptance through ui-api.layouts: pin modes/record types and verify the exact UI API response separately from native authoring/browser rendering.

Implementation: none. Tests: none selected. Evidence: none for this facet.

[ui-api.layouts](/features/ui-api--layouts): partial; linked local report not-run.

### UI API list info and list records

ui-api.list-info-and-records: bounded; reference linked-subset.

Matches list-records for metadata list views (record representation of view columns and system fields, offset page tokens, fields echo, unknown view 404) against a 2026-10-15 receipt; list-info and list-ui are not implemented (their inline-edit attributes follow the page layout); sortBy, where, searchTerm and lookup columns return UNSUPPORTED_UI_API (501); Standard-object list views answer UNSUPPORTED_UI_API (501); Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Matches list-records for metadata list views (record representation of view columns and system fields, offset page tokens, fields echo, unknown view 404) against a 2026-10-15 receipt; list-info and list-ui are not implemented (their inline-edit attributes follow the page layout); sortBy, where, searchTerm and lookup columns return UNSUPPORTED_UI_API (501); Standard-object list views answer UNSUPPORTED_UI_API (501); Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/salesforce-ui-api.ts, packages/runtime/src/rest-listviews.ts. Tests: VO-DIFF-7128. Evidence: EV-ui-api.list-info-and-records-fec9c34.

[ui-api.list-info-and-records](/features/ui-api--list-info-and-records): partial; linked local report not-run.

### UI API record defaults

ui-api.record-defaults: bounded; reference linked-subset.

Create defaults (GET /ui-api/record-defaults/create/{object}) are served by the LWC-backed resource and match the API 67.0 receipt on Account for the master record type as the System Administrator (record and objectInfoApiNames compared); Clone defaults (record-defaults/clone) answer NOT_FOUND (not implemented); custom objects, other record types, optionalFields and formFactor variants and non-administrator users have no recorded comparison; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Create defaults (GET /ui-api/record-defaults/create/{object}) are served by the LWC-backed resource and match the API 67.0 receipt on Account for the master record type as the System Administrator (record and objectInfoApiNames compared); Clone defaults (record-defaults/clone) answer NOT_FOUND (not implemented); custom objects, other record types, optionalFields and formFactor variants and non-administrator users have no recorded comparison; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/ui-api.ts, packages/runtime/src/index.ts. Tests: VO-DIFF-8124. Evidence: EV-ui-api.record-defaults-563a7aa.

[ui-api.record-defaults](/features/ui-api--record-defaults): partial; linked local report not-run.

### UI API lookups

ui-api.lookups: missing; reference pending.

Salesforce UI API lookup/action resources are absent; original native lookup/action routes are not equivalent claims.

Next acceptance: Specify lookup search/filter/security and action discovery/execution separately, linking ui-api.lookups and ui-api.actions.

Implementation: none. Tests: none selected. Evidence: none for this facet.

[ui-api.lookups](/features/ui-api--lookups): not-implemented; linked local report not-run.

### UI API actions

ui-api.actions: missing; reference pending.

Salesforce UI API lookup/action resources are absent; original native lookup/action routes are not equivalent claims.

Next acceptance: Specify lookup search/filter/security and action discovery/execution separately, linking ui-api.lookups and ui-api.actions.

Implementation: none. Tests: none selected. Evidence: none for this facet.

[ui-api.actions](/features/ui-api--actions): not-implemented; linked local report not-run.

### UI API error representation

ui-api.error-representation: bounded; reference linked-subset.

Matches four recorded write errors (missing apiName, restricted picklist, unknown field, missing record); Duplicate-rule, validation-rule and enhanced field error variants are unverified; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Matches four recorded write errors (missing apiName, restricted picklist, unknown field, missing record); Duplicate-rule, validation-rule and enhanced field error variants are unverified; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/salesforce-ui-api.ts, packages/runtime/src/index.ts. Tests: VO-DIFF-7126, VO-UNTRK-006. Evidence: EV-ui-api.error-representation-63938c8.

[ui-api.error-representation](/features/ui-api--error-representation): partial; linked local report not-run.

### Read required versus optional denied fields on standard objects

ui-api.required-optional-fields: uncompared; reference pending.

Custom object and Account/LWC source paths differ; a custom typed-value match is not standard-object, compound-field or layout coverage.

Next acceptance: Read Account and a custom object as two users with the same required/optional denied fields; compare omissions, error arrays and compound display values.

Implementation: packages/runtime/src/salesforce-ui-api.ts, packages/runtime/src/index.ts. Tests: none selected. Evidence: none for this facet.

[ui-api.record-read](/features/ui-api--record-read): partial; linked local report not-run.

### Retry UI API saves with conditional preconditions

ui-api.write-retry-preconditions: uncompared; reference pending.

Record CRUD comparisons do not declare general idempotency or all concurrent If-Unmodified-Since/eTag combinations.

Next acceptance: Edit the same record as two users, retry with stale preconditions and compare error payload, field values and absence of duplicate side effects.

Implementation: packages/runtime/src/salesforce-ui-api.ts, packages/runtime/src/index.ts. Tests: none selected. Evidence: none for this facet.

[ui-api.record-update](/features/ui-api--record-update): partial; linked local report not-run.

## Metadata, CLI and SOAP cross-references

### Retrieve ZIP

metadata.retrieve-zip: bounded; reference linked-subset.

Unpackaged manifests only; Retrieved XML is the deployed source, not reference-normalized XML; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Unpackaged manifests only; Retrieved XML is the deployed source, not reference-normalized XML; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/soap.ts, packages/metadata/src/index.ts, packages/runtime/src/deploy.ts. Tests: VO-CLI-008, VO-CLI-102, VO-CLI-103, VO-CLI-104. Evidence: EV-metadata.retrieve-zip-feaf503.

[metadata.retrieve-zip](/features/metadata--retrieve-zip): partial; linked local report not-run.

### Retrieve status

metadata.retrieve-status: bounded; reference linked-subset.

Retrieve completes inside the retrieve call; As recorded; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Retrieve completes inside the retrieve call; As recorded; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/soap.ts, packages/metadata/src/index.ts, packages/runtime/src/deploy.ts. Tests: VO-CLI-008, VO-CLI-102, VO-CLI-103. Evidence: EV-metadata.retrieve-status-feaf503.

[metadata.retrieve-status](/features/metadata--retrieve-status): partial; linked local report not-run.

### Deploy ZIP

metadata.deploy-zip: bounded; reference linked-subset.

Metadata API text ZIP with pre/post/ordinary destructive changes; components selected by package.xml and canonical child identities.; ZIP directory/header consistency, CRC, UTF-8, normalized duplicate paths, traversal, encryption, symlinks and expansion limits are checked. Binary entries, ZIP64 and multiple packages are unavailable.; Multiple structural failures carry file, identity, property and location; exact new result-shape mapping remains reference-pending.; ZIP size and CRC checks use actual incrementally inflated bytes; forged declared sizes cannot truncate accepted XML. Compressed input chunks are bounded before output retention.

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Metadata API text ZIP with pre/post/ordinary destructive changes; components selected by package.xml and canonical child identities.; ZIP directory/header consistency, CRC, UTF-8, normalized duplicate paths, traversal, encryption, symlinks and expansion limits are checked. Binary entries, ZIP64 and multiple packages are unavailable.; Multiple structural failures carry file, identity, property and location; exact new result-shape mapping remains reference-pending.; ZIP size and CRC checks use actual incrementally inflated bytes; forged declared sizes cannot truncate accepted XML. Compressed input chunks are bounded before output retention.

Implementation: packages/runtime/src/soap.ts, packages/metadata/src/index.ts, packages/runtime/src/deploy.ts, packages/metadata/src/xml.ts, packages/metadata/src/validation.ts, packages/metadata/src/conversion.ts, packages/runtime/src/archive.ts. Tests: VO-CLI-006, VO-CLI-100, VO-CLI-101, VO-CLI-104, VO-DIFF-613, VO-DIFF-615, VO-DIFF-616, VO-META-310, VO-MDEP-300, VO-MDEP-304, VO-MDEP-307, VO-META-314, VO-MDEP-309. Evidence: EV-metadata.deploy-zip-315a408.

[metadata.deploy-zip](/features/metadata--deploy-zip): partial; linked local report not-run.

### Deploy status

metadata.deploy-status: bounded; reference linked-subset.

A native DeployRequest durably stores a queued job; the authorized poll executes under the existing request transaction and org lock. Unpolled jobs remain queued.; Cancellation discards queued work before execution; a completed result is retained after commit. This is a local polling executor, with no autonomous scheduler or manufactured finalization states.; Recorded API 67 terminal shapes remain profile-bound; asynchronous timing, finalization and new cancellation cases remain reference-pending.

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: A native DeployRequest durably stores a queued job; the authorized poll executes under the existing request transaction and org lock. Unpolled jobs remain queued.; Cancellation discards queued work before execution; a completed result is retained after commit. This is a local polling executor, with no autonomous scheduler or manufactured finalization states.; Recorded API 67 terminal shapes remain profile-bound; asynchronous timing, finalization and new cancellation cases remain reference-pending.

Implementation: packages/runtime/src/soap.ts, packages/metadata/src/index.ts, packages/runtime/src/deploy.ts, packages/metadata/src/xml.ts, packages/metadata/src/validation.ts, packages/metadata/src/conversion.ts. Tests: VO-CLI-006, VO-CLI-007, VO-CLI-100, VO-CLI-101, VO-DIFF-621, VO-MDEP-305. Evidence: EV-metadata.deploy-status-315a408.

[metadata.deploy-status](/features/metadata--deploy-status): partial; linked local report not-run.

### Check-only deployment

metadata.check-only-deployment: bounded; reference linked-subset.

checkOnly runs real compilation and native schema changes, then rolls back source, compiled definitions, DDL, mappings and permissions while preserving the deployment record.; New native rollback assertions are local evidence; historical reference checkOnly receipts remain profile-bound.

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: checkOnly runs real compilation and native schema changes, then rolls back source, compiled definitions, DDL, mappings and permissions while preserving the deployment record.; New native rollback assertions are local evidence; historical reference checkOnly receipts remain profile-bound.

Implementation: packages/runtime/src/soap.ts, packages/metadata/src/xml.ts, packages/metadata/src/validation.ts, packages/metadata/src/conversion.ts. Tests: VO-CLI-100, VO-MDEP-301. Evidence: EV-metadata.check-only-deployment-feaf503.

[metadata.check-only-deployment](/features/metadata--check-only-deployment): partial; linked local report not-run.

### Quick deployment

metadata.quick-deployment: bounded; reference linked-subset.

Successful checkOnly that ran tests can be quick-deployed under deployment authority; intervening successful deploys and active-source changes invalidate it.; A ten-day expiry guard is locally tested; time boundary, cross-user eligibility and full Salesforce quick-deploy semantics remain reference-pending.

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Successful checkOnly that ran tests can be quick-deployed under deployment authority; intervening successful deploys and active-source changes invalidate it.; A ten-day expiry guard is locally tested; time boundary, cross-user eligibility and full Salesforce quick-deploy semantics remain reference-pending.

Implementation: packages/runtime/src/soap.ts, packages/metadata/src/xml.ts, packages/metadata/src/validation.ts, packages/metadata/src/conversion.ts. Tests: VO-DIFF-620, VO-CLI-202, VO-MDEP-308. Evidence: EV-metadata.quick-deployment-315a408.

[metadata.quick-deployment](/features/metadata--quick-deployment): partial; linked local report not-run.

### Rollback on error

metadata.rollback-on-error: bounded; reference linked-subset.

rollbackOnError rolls back candidate source, compiled state and native DDL/mappings; without it, the existing measured file-level partial-save contract applies.; Multiple structural failures are reported locally; failure followed by a valid deploy and rolled-back native state are tested. New diagnostic mappings remain reference-pending.

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: rollbackOnError rolls back candidate source, compiled state and native DDL/mappings; without it, the existing measured file-level partial-save contract applies.; Multiple structural failures are reported locally; failure followed by a valid deploy and rolled-back native state are tested. New diagnostic mappings remain reference-pending.

Implementation: packages/runtime/src/soap.ts, packages/metadata/src/index.ts, packages/runtime/src/deploy.ts, packages/runtime/src/native.ts, packages/storage/migrations/0004_native_objects.sql, packages/metadata/src/xml.ts, packages/metadata/src/validation.ts, packages/metadata/src/conversion.ts. Tests: VO-CLI-007, VO-DIFF-613, VO-DIFF-614, VO-NATIVE-003, VO-NATIVE-005, VO-NATIVE-010, VO-NATIVE-015, VO-MDEP-301, VO-MDEP-304. Evidence: EV-metadata.rollback-on-error-315a408.

[metadata.rollback-on-error](/features/metadata--rollback-on-error): partial; linked local report not-run.

### Destructive changes pre-deploy

metadata.destructive-changes-pre-deploy: bounded; reference linked-subset.

Fields, objects, Apex, global value sets, permission sets and email templates/folders; purgeOnDelete is accepted and deletions are always immediate; Dependency checks cover formula fields, lookups and global value set usage only; Differential match is profile-bound; broader parity unverified; Replayed through the canonical native deployment service; existing API 67 receipts establish only their recorded profile. New modern-source, cancellation and API 68 cases remain reference-pending.

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Fields, objects, Apex, global value sets, permission sets and email templates/folders; purgeOnDelete is accepted and deletions are always immediate; Dependency checks cover formula fields, lookups and global value set usage only; Differential match is profile-bound; broader parity unverified; Replayed through the canonical native deployment service; existing API 67 receipts establish only their recorded profile. New modern-source, cancellation and API 68 cases remain reference-pending.

Implementation: packages/runtime/src/soap.ts, packages/runtime/src/deploy.ts, packages/metadata/src/index.ts. Tests: VO-DIFF-616, VO-META-100. Evidence: EV-metadata.destructive-changes-pre-deploy-315a408.

[metadata.destructive-changes-pre-deploy](/features/metadata--destructive-changes-pre-deploy): partial; linked local report not-run.

### Destructive changes post-deploy

metadata.destructive-changes-post-deploy: bounded; reference linked-subset.

Fields, objects, Apex, global value sets, permission sets and email templates/folders; purgeOnDelete is accepted and deletions are always immediate; Dependency checks cover formula fields, lookups and global value set usage only; Differential match is profile-bound; broader parity unverified; Replayed through the canonical native deployment service; existing API 67 receipts establish only their recorded profile. New modern-source, cancellation and API 68 cases remain reference-pending.

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Fields, objects, Apex, global value sets, permission sets and email templates/folders; purgeOnDelete is accepted and deletions are always immediate; Dependency checks cover formula fields, lookups and global value set usage only; Differential match is profile-bound; broader parity unverified; Replayed through the canonical native deployment service; existing API 67 receipts establish only their recorded profile. New modern-source, cancellation and API 68 cases remain reference-pending.

Implementation: packages/runtime/src/soap.ts, packages/runtime/src/deploy.ts, packages/metadata/src/index.ts. Tests: VO-DIFF-616, VO-DIFF-617, VO-META-100, VO-CLI-218. Evidence: EV-metadata.destructive-changes-post-deploy-315a408.

[metadata.destructive-changes-post-deploy](/features/metadata--destructive-changes-post-deploy): partial; linked local report not-run.

### Deploy test levels

metadata.deploy-test-levels: uncompared; reference pending.

Current Rust-only profile: predecessor TypeScript execution/coverage is retired. This workflow is explicitly unsupported or requires a new exact-source Rust comparison. Historical provider observations remain dated evidence, not current support.

Next acceptance: Verify the current explicit fence, then implement and compare a bounded canonical Rust workflow before admitting this slice.

Implementation: packages/runtime/src/soap.ts, packages/runtime/src/deploy.ts. Tests: none selected. Evidence: none for this facet.

[metadata.deploy-test-levels](/features/metadata--deploy-test-levels): experimental; linked local report not-run.

### sf org login access-token

cli.sf-org-login-access-token: bounded; reference linked-subset.

Unmodified @salesforce/cli 2.152.14 in an isolated CLI home; matches the API 67.0 reference receipt for access-token login and malformed, invalid and unparsable inputs (CLIAUTH-LOGIN-001/002); Declared profile difference: Virtual Org orgs have no TrialExpirationDate, so the CLI reports isScratch false and isExpired unknown where the reference reports the reference environment; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Unmodified @salesforce/cli 2.152.14 in an isolated CLI home; matches the API 67.0 reference receipt for access-token login and malformed, invalid and unparsable inputs (CLIAUTH-LOGIN-001/002); Declared profile difference: Virtual Org orgs have no TrialExpirationDate, so the CLI reports isScratch false and isExpired unknown where the reference reports the reference environment; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/index.ts, packages/runtime/src/clients.ts. Tests: VO-CLI-001, VO-DIFF-2101, VO-DIFF-2103. Evidence: EV-cli.sf-org-login-access-token-1532fe5.

[cli.sf-org-login-access-token](/features/cli--sf-org-login-access-token): partial; linked local report not-run.

### sf data query

cli.sf-data-query: bounded; reference linked-subset.

Requires columns=true metadata endpoint; Differential match is profile-bound; broader parity unverified; Fresh October 17 CLI record/query observations contain /services/data/v68.0/ attribute URLs. The pinned API 67.0 comparison does not renew those negotiated-version URL observations; create/update/delete subsets are unchanged in this comparison.; October18 cli2 successor selects the observed v68 query/tooling record-URL version segments. Historical identifier placeholders remain profile-bound; this does not admit all current CLI2 behavior.

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Requires columns=true metadata endpoint; Differential match is profile-bound; broader parity unverified; Fresh October 17 CLI record/query observations contain /services/data/v68.0/ attribute URLs. The pinned API 67.0 comparison does not renew those negotiated-version URL observations; create/update/delete subsets are unchanged in this comparison.; October18 cli2 successor selects the observed v68 query/tooling record-URL version segments. Historical identifier placeholders remain profile-bound; this does not admit all current CLI2 behavior.

Implementation: packages/runtime/src/index.ts, packages/runtime/src/soql.ts, packages/runtime/src/tooling.ts. Tests: VO-CLI-002, VO-CLI-005, VO-CLI-212. Evidence: EV-cli.sf-data-query-315a408.

[cli.sf-data-query](/features/cli--sf-data-query): partial; linked local report passed.

### sf data upsert bulk

cli.sf-data-upsert-bulk: bounded; reference linked-subset.

With sf data bulk results and sf data export bulk; sf data query --bulk no longer exists in CLI 2.152; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: With sf data bulk results and sf data export bulk; sf data query --bulk no longer exists in CLI 2.152; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/bulk.ts. Tests: VO-CLI-106. Evidence: EV-cli.sf-data-upsert-bulk-feaf503.

[cli.sf-data-upsert-bulk](/features/cli--sf-data-upsert-bulk): partial; linked local report not-run.

### sf project retrieve start

cli.sf-project-retrieve-start: bounded; reference linked-subset.

Retrieves previously deployed source for objects, fields, permission sets, profiles, roles and Apex; standard-object retrieval not supported; --manifest, --source-dir and tracked retrieves; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Retrieves previously deployed source for objects, fields, permission sets, profiles, roles and Apex; standard-object retrieval not supported; --manifest, --source-dir and tracked retrieves; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/soap.ts, packages/metadata/src/index.ts, packages/runtime/src/deploy.ts. Tests: VO-CLI-008, VO-CLI-102, VO-CLI-103, VO-CLI-104. Evidence: EV-cli.sf-project-retrieve-start-feaf503.

[cli.sf-project-retrieve-start](/features/cli--sf-project-retrieve-start): partial; linked local report not-run.

### sf project deploy start

cli.sf-project-deploy-start: bounded; reference linked-subset.

SOAP Metadata API deploy; synchronous completion reported through checkDeployStatus; test levels run Apex tests; --dry-run, failures and tracked deploys as recorded; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: SOAP Metadata API deploy; synchronous completion reported through checkDeployStatus; test levels run Apex tests; --dry-run, failures and tracked deploys as recorded; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/soap.ts, packages/metadata/src/index.ts, packages/runtime/src/deploy.ts. Tests: VO-CLI-006, VO-CLI-007, VO-CLI-100, VO-CLI-101, VO-CLI-104, VO-CLI-216, VO-CLI-218. Evidence: EV-cli.sf-project-deploy-start-315a408.

[cli.sf-project-deploy-start](/features/cli--sf-project-deploy-start): partial; linked local report not-run.

### sf project deploy validate

cli.sf-project-deploy-validate: uncompared; reference pending.

Current Rust-only profile: predecessor TypeScript execution/coverage is retired. This workflow is explicitly unsupported or requires a new exact-source Rust comparison. Historical provider observations remain dated evidence, not current support.

Next acceptance: Verify the current explicit fence, then implement and compare a bounded canonical Rust workflow before admitting this slice.

Implementation: packages/runtime/src/soap.ts, packages/runtime/src/deploy.ts. Tests: none selected. Evidence: none for this facet.

[cli.sf-project-deploy-validate](/features/cli--sf-project-deploy-validate): experimental; linked local report passed.

### sf project deploy report

cli.sf-project-deploy-report: bounded; reference linked-subset.

checkDeployStatus of completed deploys; deploys complete synchronously; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: checkDeployStatus of completed deploys; deploys complete synchronously; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/soap.ts. Tests: VO-CLI-201. Evidence: EV-cli.sf-project-deploy-report-315a408.

[cli.sf-project-deploy-report](/features/cli--sf-project-deploy-report): partial; linked local report passed.

### sf apex run

cli.sf-apex-run: bounded; reference linked-subset.

SOAP Apex API executeAnonymous with DebuggingInfo log; Differential match is profile-bound; broader parity unverified

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: SOAP Apex API executeAnonymous with DebuggingInfo log; Differential match is profile-bound; broader parity unverified

Implementation: packages/runtime/src/soap.ts. Tests: VO-CLI-009, VO-CLI-204. Evidence: EV-cli.sf-apex-run-315a408.

[cli.sf-apex-run](/features/cli--sf-apex-run): partial; linked local report passed.

### sf apex run test

cli.sf-apex-run-test: missing; reference pending.

Current Rust-only profile: predecessor TypeScript execution/coverage is retired. This workflow is explicitly unsupported or requires a new exact-source Rust comparison. Historical provider observations remain dated evidence, not current support.

Next acceptance: Verify the current explicit fence, then implement and compare a bounded canonical Rust workflow before admitting this slice.

Implementation: packages/runtime/src/index.ts. Tests: none selected. Evidence: none for this facet.

[cli.sf-apex-run-test](/features/cli--sf-apex-run-test): partial; linked local report passed.

### Current sf CLI command version

cli.current-sf-cli-command-version: bounded; reference linked-subset.

Receipts and tests pinned to @salesforce/cli 2.152.14 (sf v2 commands); the CLI negotiates API 67.0 from /services/data; Differential match is profile-bound; broader parity unverified; The fresh October 17 CLI observation reports instance API 68.0; current comparisons remain pinned to the earlier API 67.0 instance observation. Installed CLI version and instance API version are separate contracts.; October18 cli2 successor compares observed v68 discovery fields; other assertions remain the historical API67 project profile. CLI binary identity remains checked separately.

Next acceptance: Reproduce this exact linked slice, then compare the remaining qualifiers independently: Receipts and tests pinned to @salesforce/cli 2.152.14 (sf v2 commands); the CLI negotiates API 67.0 from /services/data; Differential match is profile-bound; broader parity unverified; The fresh October 17 CLI observation reports instance API 68.0; current comparisons remain pinned to the earlier API 67.0 instance observation. Installed CLI version and instance API version are separate contracts.; October18 cli2 successor compares observed v68 discovery fields; other assertions remain the historical API67 project profile. CLI binary identity remains checked separately.

Implementation: packages/runtime/src/index.ts. Tests: VO-CLI-206, VO-CLI-220. Evidence: EV-cli.current-sf-cli-command-version-315a408.

[cli.current-sf-cli-command-version](/features/cli--current-sf-cli-command-version): partial; linked local report passed.

### Use general Partner or Enterprise SOAP CRUD/query

soap.partner-crud-query: missing; reference pending.

soap.ts contains selected Partner lead conversion/assignment and Apex/Metadata operations; general Partner/Enterprise CRUD and query are not implemented.

Next acceptance: Inventory WSDL operations independently; start with Partner create/query/queryMore/update/delete and session faults before claiming general SOAP data coverage.

Implementation: packages/runtime/src/soap.ts. Tests: none selected. Evidence: none for this facet.

[rest.sobject-record-endpoints](/features/rest--sobject-record-endpoints): partial; linked local report not-run.

### Recover a metadata deployment after restart

metadata.async-recovery: uncompared; reference pending.

Metadata deploy/poll/retrieve and native deployment are separate from REST data support; current poll owns durable pending deployment execution.

Next acceptance: Create a deployment, restart the Worker before polling, then poll/cancel as owner and another principal; compare atomic schema/source and status history.

Implementation: packages/runtime/src/soap.ts. Tests: none selected. Evidence: none for this facet.

[metadata.deploy-status](/features/metadata--deploy-status): partial; linked local report not-run.

### Run selected workflows on other CLI/API versions

cli.other-versions: uncompared; reference pending.

Recorded CLI recipes pin @salesforce/cli 2.152.14 and API67; API discovery of 68 is not evidence for all API68 or newer CLI behavior.

Next acceptance: Select one CLI/plugin version and one API version explicitly, repeat login/describe/query/deploy/retrieve and preserve independent version-bound results.

Implementation: packages/runtime/src/index.ts. Tests: none selected. Evidence: none for this facet.

[cli.current-sf-cli-command-version](/features/cli--current-sf-cli-command-version): partial; linked local report passed.

### Invoke authored Apex SOAP webservice methods

soap.apex-user-defined: uncompared; reference pending.

Current Rust-only profile: predecessor TypeScript execution/coverage is retired. This workflow is explicitly unsupported or requires a new exact-source Rust comparison. Historical provider observations remain dated evidence, not current support.

Next acceptance: Verify the current explicit fence, then implement and compare a bounded canonical Rust workflow before admitting this slice.

Implementation: packages/runtime/src/soap.ts. Tests: none selected. Evidence: none for this facet.

[cli.sf-apex-run](/features/cli--sf-apex-run): partial; linked local report passed.

## Other interfaces

- Native browser authoring/rendering (separate acceptance)
- OAuth and general permission composition (separate catalogs; API enforcement cross-referenced)
- Streaming, Pub/Sub, Connect/Chatter, Analytics and product APIs (separate families)
- General Enterprise/Partner SOAP data services (not implemented)
- Hosted performance, provider scheduling and production limits (not established)
