Observation-class finding, filed unassigned from the census run for objectstack-ai/objectstack#7941. Nothing here is broken today; this records a declared option that has stopped being able to do anything.
What
packages/data-objectstack/src/metadata-client.ts sends an X-Actor request header whenever a caller passes options.actor, at four sites:
save (PUT), line ~742
reset (DELETE), line ~918
publish (POST), line ~941
rollback (POST), line ~970
objectstack-ai/objectstack#7941 ruled that the authenticated identity is the recorded actor on all five /meta write sites and removed the X-Actor limb from the server's resolver. So from that release on, the header this client sends is ignored by the server — the audit and history rows record the authenticated caller regardless of what options.actor says.
Why it is only a finding
The census run for that card searched this whole repo, all paths: no caller anywhere passes actor. Every real call site omits it —
apps/… / packages/app-shell/src/views/metadata-admin/EmbeddedItemEditor.tsx:116 client.save(parentType, parentName, updated)
packages/app-shell/src/views/metadata-admin/ResourceEditPage.tsx:1233 client.reset(type, name)
packages/app-shell/src/views/metadata-admin/ResourceHistoryPage.tsx:190 client.rollback(type, name, version)
packages/app-shell/src/views/runtime-metadata-persistence.ts:339 ctx.metadataClient.publish(type, name)
— and the only place actor: is passed to this client in the repo is the client's own unit test (packages/data-objectstack/src/metadata-client.test.ts:97), which asserts the header is emitted when provided. So no user-visible behaviour changes here, and nothing needs an urgent fix. That emptiness is exactly what let the server-side ruling land as option A rather than option C.
The decision this records
The option is now a parameter that types cleanly, sends a header, and cannot affect the outcome — the "declared but nothing consumes it" shape. Worth a deliberate choice rather than leaving it to be discovered by whoever next tries to use it and finds their attribution silently ignored:
- Remove
options.actor from the four methods and drop the header emission (plus its unit test). Matches the server: there is no way to choose the recorded actor, so the client should not offer one.
- Keep it, documented as inert against current servers — only worth it if this client is expected to talk to older servers where the header still wins.
- Keep it and make it loud — e.g. a deprecation note on the option so an author is told the server ignores it.
No recommendation is forced from here; option 1 is the one that matches the server contract, and it is a deletion rather than a new obligation.
Related: objectstack-ai/objectstack#7941 (the ruling and the server change), objectstack-ai/objectstack#7749 (the producer fix that made the precedence load-bearing).
Observation-class finding, filed unassigned from the census run for objectstack-ai/objectstack#7941. Nothing here is broken today; this records a declared option that has stopped being able to do anything.
What
packages/data-objectstack/src/metadata-client.tssends anX-Actorrequest header whenever a caller passesoptions.actor, at four sites:save(PUT), line ~742reset(DELETE), line ~918publish(POST), line ~941rollback(POST), line ~970objectstack-ai/objectstack#7941 ruled that the authenticated identity is the recorded actor on all five
/metawrite sites and removed theX-Actorlimb from the server's resolver. So from that release on, the header this client sends is ignored by the server — the audit and history rows record the authenticated caller regardless of whatoptions.actorsays.Why it is only a finding
The census run for that card searched this whole repo, all paths: no caller anywhere passes
actor. Every real call site omits it —— and the only place
actor:is passed to this client in the repo is the client's own unit test (packages/data-objectstack/src/metadata-client.test.ts:97), which asserts the header is emitted when provided. So no user-visible behaviour changes here, and nothing needs an urgent fix. That emptiness is exactly what let the server-side ruling land as option A rather than option C.The decision this records
The option is now a parameter that types cleanly, sends a header, and cannot affect the outcome — the "declared but nothing consumes it" shape. Worth a deliberate choice rather than leaving it to be discovered by whoever next tries to use it and finds their attribution silently ignored:
options.actorfrom the four methods and drop the header emission (plus its unit test). Matches the server: there is no way to choose the recorded actor, so the client should not offer one.No recommendation is forced from here; option 1 is the one that matches the server contract, and it is a deletion rather than a new obligation.
Related: objectstack-ai/objectstack#7941 (the ruling and the server change), objectstack-ai/objectstack#7749 (the producer fix that made the precedence load-bearing).