Skip to content

Commit c4aa543

Browse files
committed
fix(quota): bind poll readback to the accounting Agent
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
1 parent 465a052 commit c4aa543

2 files changed

Lines changed: 13 additions & 10 deletions

File tree

‎loopx/control_plane/quota/monitor_poll_commit.ts‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,9 @@ interface Admission {
567567

568568
async function readMonitorSettlement(request: MonitorRequest): Promise<JsonObject | null> {
569569
const todoId = request.observation.settlement_todo_id ?? request.observation.todo_id;
570-
const agentId = request.observation.actor_agent_id ?? request.decision.agent_id;
570+
// The Turn/effect and run record belong to the decision Agent; provider actor
571+
// metadata cannot select a different historical settlement to evade its fence.
572+
const agentId = request.decision.agent_id;
571573
if (!request.runtime_root || !request.turn_instance_id ||
572574
!agentId || !todoId) return null;
573575
const snapshot = await readQuotaSettlementSnapshot(

‎tests/control_plane/test_monitor_unavailable_closeout_cli.py‎

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -186,16 +186,17 @@ def cli(*args: str) -> tuple[int, dict]:
186186
from loopx.control_plane.quota import monitor_poll as monitor_runtime
187187
native = monitor_runtime._native_result
188188

189-
def actor_optional_request(request):
190-
request = {**request, "observation": {**request["observation"], "actor_agent_id": None}}
191-
return native(request)
192-
193189
# The native compatibility request permits an omitted actor;
194-
# provider and settlement admission must use the same agent fallback.
195-
with monkeypatch.context() as context:
196-
context.setattr(monitor_runtime, "_native_result", actor_optional_request)
197-
rc, missing_actor = cli(*poll_args, "--execute")
198-
assert rc != 0 and missing_actor["error_code"] == "monitor_poll_admission_rejected", missing_actor
190+
# provider actor metadata cannot rebind the Turn's accounting Agent.
191+
for actor in (None, "other-synthetic-actor"):
192+
def actor_metadata_request(request):
193+
request = {**request, "observation": {**request["observation"], "actor_agent_id": actor}}
194+
return native(request)
195+
196+
with monkeypatch.context() as context:
197+
context.setattr(monitor_runtime, "_native_result", actor_metadata_request)
198+
rc, actor_reply = cli(*poll_args, "--execute")
199+
assert rc != 0 and actor_reply["error_code"] == "monitor_poll_admission_rejected", actor_reply
199200
rc, after_late = cli("todo", "list", "--goal-id", GOAL_ID)
200201
assert rc == 0, after_late
201202
monitor = next(todo for todo in after_late["todos"] if todo["todo_id"] == MONITOR_ID)

0 commit comments

Comments
 (0)