Cross-org row reads answer operator's org
Task 9214 lets an operator edit another org's project, task and account in place: every write goes as the row's org for one request. A few controls stay locked or hidden on those pages, because their READS still answer for the operator's own org:
- Project page, Default agent: the picker lists the operator's org's agents, so it stays disabled. Read the agent choices and providers as the project's org (actAsOnce on the reads, cache keys by org).
- Project page, Budget tab: hidden on another org's project (the budget routes answer for the caller's org only). Read and write as the project's org.
- Project page, repositories: Create a new repository is not offered on another org's project, because the owners and repositories lookup (`/api/git-repos`, `/api/git-repos/owners`) is the operator's own forge connection. Read them as the project's org and create as it.
- Task page, Live Cast item control: hidden on another org's task. Read the task's Live Cast state as its org.
- Brains roster, Re-login and Add to node on another org's account: the login commands (`POST /api/commands`) go as the operator. Send them as the account's org, or hide them there.
Out of scope: API authz; act-as for the whole tab (ADR-0161) is unchanged.
Done means:
- On another org's project, an operator can pick a default agent from that org's agents, edit its budget, and create a repository; on another org's task, the Live Cast control shows; each request carries `X-Jaah-Act-As: <row org>` (vitest per surface).
Outcome
On another org's project/task the Default agent, Budget, repo create and Live Cast now read and write as the row's org (X-Jaah-Act-As, vitest per surface). Brains login verbs are hidden there. Quick gate green, 3 review lanes pass. PR #6727 queued. Follow-ups in draft 9345. Memory: used mem-15203, mem-14612; proposed none.
Artifacts
Activity
- Created
- Updated
- Run
- Runner started
- Runner ended (done)