Skip to content

[finding] The SINGLE_RECORD_WRITE_ONLY comment states the cost of a batch exemption using #3757's disproven premise — the per-row fallback does exist #7817

Description

@os-help

Filed unassigned from #7802, which registered the map's first entry. Observation class — no user hits this; the cost is that the comment misprices a decision future authors make by reading it.

What the comment says

packages/spec/src/data/api-methods-batch-conformance.test.ts, on SINGLE_RECORD_WRITE_ONLY:

Adding an entry is a real decision — batch denial is invisible until a user multi-selects rows and data-objectstack rethrows the 405 without falling back to per-row writes. Write down why the object is worth that.

That sentence is the map's whole pricing model: it tells the author an exemption buys a hard user-visible error.

Why it is not accurate

It restates the original body of #3757, which #3757's own author retracted twice after getting the objectui source, and which was then closed not planned. Re-verified today against the console build this release pins (.objectui-sha 6314e87f2):

Layer Behaviour
data-objectstack bulkUpdate / bulkDelete does rethrow — this half of the sentence is right
its only caller, useBulkExecutorexecuteBulkBatch (packages/core/src/actions/bulkFastPath.ts) try { bulkCall } catch { /* Fall through to per-row */ } — falls back on any throw, 405 included, and reports per-row (id, error) detail
the console object grid's multi-select delete (packages/app-shell/src/hooks/useObjectActions.ts:99-100) Promise.allSettled(records.map(r => dataSource.delete(...))) — never calls bulkDelete at all

So the adapter's rethrow is caught one layer up, and the console's own bulk-delete path does not reach the adapter's bulk primitive in the first place. The real cost of a batch exemption is a wasted round trip followed by N per-row writes, not a hard error.

Why it is worth recording

The comment is load-bearing by design — it is the instruction the exemption map gives whoever is deciding whether to widen an object or exempt it, and it inflates one side of that trade. #7802's decision does not depend on it (it went the other way: a cheaper denial argues for the exemption, and the deciding evidence was that no multi-select surface exists for sys_api_key at all), which is why this is filed rather than fixed in that PR.

Also worth folding in from #3757's second correction, since it bears on the same paragraph: the grid's built-in bulk-delete entry gates on the child verb delete, not on bulk, and gating it on bulk would be a regression — an object granting delete without bulk keeps a working multi-select delete via the fallback. So "batch denial is invisible" is true in a narrower sense than the comment implies: nothing is hidden from the user, and nothing fails.

Suggested fix

One paragraph in the test file: replace the disproven consequence with the real one, cite #3757's two corrections so the next reader does not re-derive it a fourth time, and keep the instruction ("write down why") unchanged — that part is right and is what made #7802's entry come with evidence.

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions