From 946da99b944a61e3b2d6babf3aba96ba9fb565b9 Mon Sep 17 00:00:00 2001 From: bigboateng Date: Tue, 13 Oct 2026 04:01:12 +0100 Subject: [PATCH 1/2] Bind Responses verification results to issued tool calls --- tests/model_control_proxy.py | 31 ++++- tests/test_model_control_proxy.py | 184 +++++++++++++++++++++++++++++- 2 files changed, 209 insertions(+), 6 deletions(-) diff --git a/tests/model_control_proxy.py b/tests/model_control_proxy.py index 09a33fb..02394cd 100644 --- a/tests/model_control_proxy.py +++ b/tests/model_control_proxy.py @@ -16,7 +16,13 @@ def contains(value: object, needle: str) -> bool: return needle in json.dumps(value, separators=(",", ":"), ensure_ascii=True) -def tool_result_contains(protocol: str, body: dict[str, object], needle: str) -> bool: +def tool_result_contains( + protocol: str, + body: dict[str, object], + needle: str, + *, + call_id: str | None = None, +) -> bool: """Search only native tool-result fields, never echoed tool-call arguments.""" if protocol == "gemini_generate_content": values = [] @@ -45,10 +51,14 @@ def tool_result_contains(protocol: str, body: dict[str, object], needle: str) -> values.append(item.get("content")) return any(contains(value, needle) for value in values) if protocol == "openai_responses": + if not call_id: + return False values = [ item.get("output") for item in body.get("input", []) - if isinstance(item, dict) and item.get("type") == "function_call_output" + if isinstance(item, dict) + and item.get("type") == "function_call_output" + and item.get("call_id") == call_id ] return any(contains(value, needle) for value in values) return False @@ -584,10 +594,16 @@ def do_POST(self) -> None: self.reply(payload, stream=bool(body.get("stream")), protocol=protocol) return allow_result = tool_result_contains( - protocol, body, f"PITOT_CANARY_RESULT PITOT_ALLOW {nonce}" + protocol, + body, + f"PITOT_CANARY_RESULT PITOT_ALLOW {nonce}", + call_id="pitot_tool_allow", ) denied_result = tool_result_contains( - protocol, body, f"PITOT_CONTROLLER_DENY {nonce}" + protocol, + body, + f"PITOT_CONTROLLER_DENY {nonce}", + call_id="pitot_tool_deny", ) opencode_allow = opencode_deny = None if state.args.agent == "opencode": @@ -595,6 +611,13 @@ def do_POST(self) -> None: opencode_deny = opencode_tool_result(protocol, body, "deny", nonce) allow_result = opencode_allow is not None denied_result = opencode_deny is not None + if protocol == "openai_responses": + allow_result = ( + allow_result and state.receipt["allow_tool_call_response_emitted"] + ) + denied_result = ( + denied_result and state.receipt["deny_tool_call_response_emitted"] + ) phase = "allow" final = False if not state.receipt["initial_prompt_observed"]: diff --git a/tests/test_model_control_proxy.py b/tests/test_model_control_proxy.py index caa1a15..33c3acd 100644 --- a/tests/test_model_control_proxy.py +++ b/tests/test_model_control_proxy.py @@ -1,14 +1,17 @@ from __future__ import annotations import importlib.util +import argparse import copy import base64 import hashlib +import http.client import json import os from pathlib import Path import subprocess import tempfile +import threading import time import tomllib import unittest @@ -1048,7 +1051,13 @@ def test_tool_result_detection_accepts_only_native_result_fields(self): }, "openai_chat": {"messages": [{"role": "tool", "content": marker}]}, "openai_responses": { - "input": [{"type": "function_call_output", "output": marker}] + "input": [ + { + "type": "function_call_output", + "call_id": "pitot_tool_allow", + "output": marker, + } + ] }, "gemini_generate_content": { "contents": [ @@ -1063,7 +1072,11 @@ def test_tool_result_detection_accepts_only_native_result_fields(self): } for dialect, body in bodies.items(): with self.subTest(dialect): - self.assertTrue(proxy.tool_result_contains(dialect, body, marker)) + self.assertTrue( + proxy.tool_result_contains( + dialect, body, marker, call_id="pitot_tool_allow" + ) + ) def test_capture_record_binds_detected_dialect_and_executable(self): agent = next( @@ -1167,6 +1180,173 @@ def test_cursor_proxy_persists_native_path_before_ready(self): process.communicate(timeout=5) +class ResponsesCallCorrelationTests(unittest.TestCase): + def setUp(self): + directory = tempfile.TemporaryDirectory() + self.addCleanup(directory.cleanup) + self.args = argparse.Namespace( + agent="codex", + nonce="nonce", + receipt=str(Path(directory.name) / "receipt.json"), + canary_command="pitot-e2e-canary", + response_fault="none", + ) + self.server = proxy.ThreadingHTTPServer(("127.0.0.1", 0), proxy.Handler) + self.server.state = proxy.State(self.args) + self.thread = threading.Thread(target=self.server.serve_forever) + self.thread.start() + self.addCleanup(self.close_server) + + def close_server(self): + self.server.shutdown() + self.server.server_close() + self.thread.join(timeout=5) + self.assertFalse(self.thread.is_alive()) + + def post(self, inputs): + body = { + "model": "pitot-control", + "tools": [{"type": "function", "name": "shell", "parameters": {}}], + "input": inputs, + } + connection = http.client.HTTPConnection( + "127.0.0.1", self.server.server_port, timeout=5 + ) + try: + connection.request( + "POST", + "/v1/responses", + json.dumps(body), + {"Content-Type": "application/json"}, + ) + response = connection.getresponse() + return response.status, response.read().decode() + finally: + connection.close() + + @staticmethod + def result(phase, call_id): + marker = ( + "PITOT_CANARY_RESULT PITOT_ALLOW nonce" + if phase == "allow" + else "PITOT_CONTROLLER_DENY nonce" + ) + return {"type": "function_call_output", "call_id": call_id, "output": marker} + + def start(self): + status, raw = self.post([{"role": "user", "content": "nonce"}]) + self.assertEqual(status, 200) + completed = [ + json.loads(line[6:]) + for line in raw.splitlines() + if line.startswith("data: {") + and json.loads(line[6:]).get("type") == "response.completed" + ] + self.assertEqual(len(completed), 1) + self.assertEqual( + completed[0]["response"]["output"][0]["call_id"], "pitot_tool_allow" + ) + + def test_result_marker_requires_the_expected_native_call(self): + marker = "PITOT_CANARY_RESULT PITOT_ALLOW nonce" + for call_id in (None, "", 42, {}, "unrelated", "pitot_tool_deny"): + with self.subTest(call_id=call_id): + item = self.result("allow", call_id) + self.assertFalse( + proxy.tool_result_contains( + "openai_responses", + {"input": [item]}, + marker, + call_id="pitot_tool_allow", + ) + ) + correct = self.result("allow", "pitot_tool_allow") + self.assertFalse( + proxy.tool_result_contains("openai_responses", {"input": [correct]}, marker) + ) + self.assertFalse( + proxy.tool_result_contains( + "openai_responses", + { + "input": [ + self.result("allow", "unrelated"), + {**correct, "output": ""}, + ] + }, + marker, + call_id="pitot_tool_allow", + ) + ) + + def test_http_rejects_uncorrelated_results_and_preserves_full_history(self): + self.start() + bad_results = [ + self.result("allow", value) + for value in (None, "", 42, {}, "wrong", "pitot_tool_deny") + ] + bad_results.append( + { + "type": "function_call_output", + "output": "PITOT_CANARY_RESULT PITOT_ALLOW nonce", + } + ) + bad_results.append( + { + "type": "function_call", + "call_id": "pitot_tool_allow", + "arguments": "PITOT_CANARY_RESULT PITOT_ALLOW nonce", + } + ) + bad_results.append( + { + **self.result("allow", "pitot_tool_allow"), + "output": "PITOT_CANARY_RESULT PITOT_ALLOW another_nonce", + } + ) + for item in bad_results: + with self.subTest(item=item): + self.assertEqual(self.post([item])[0], 409) + self.assertFalse( + self.server.state.receipt["allow_tool_result_observed"] + ) + self.assertFalse( + self.server.state.receipt["deny_tool_call_response_emitted"] + ) + allow = self.result("allow", "pitot_tool_allow") + history = [self.result("allow", "unrelated"), allow] + self.assertEqual(self.post(history)[0], 200) + self.assertTrue(self.server.state.receipt["deny_tool_call_response_emitted"]) + self.assertEqual(self.post([allow])[0], 409) + self.assertEqual(self.post([self.result("deny", "pitot_tool_allow")])[0], 409) + self.assertFalse(self.server.state.receipt["denied_result_observed"]) + self.assertEqual( + self.post([*history, self.result("deny", "pitot_tool_deny")])[0], 200 + ) + self.assertTrue(self.server.state.receipt["final_response_emitted"]) + + def test_text_only_response_cannot_admit_an_unissued_call_result(self): + for agent in ("codex", "opencode"): + with self.subTest(agent=agent): + self.args.agent = agent + self.args.response_fault = "text" + self.server.state = proxy.State(self.args) + self.assertEqual( + self.post([{"role": "user", "content": "nonce"}])[0], 200 + ) + self.assertFalse( + self.server.state.receipt["allow_tool_call_response_emitted"] + ) + self.assertEqual( + self.post([self.result("allow", "pitot_tool_allow")])[0], 409 + ) + self.assertFalse( + self.server.state.receipt["allow_tool_result_observed"] + ) + self.assertFalse( + self.server.state.receipt["deny_tool_call_response_emitted"] + ) + + class CursorFixtureIdentityTests(unittest.TestCase): def test_native_windows_resolves_existing_owned_root_once(self): original, canonical = mock.Mock(), mock.Mock() From ab9083b68a2490837e3d768242841bf71077bd1b Mon Sep 17 00:00:00 2001 From: bigboateng Date: Tue, 13 Oct 2026 04:17:11 +0100 Subject: [PATCH 2/2] Refresh native provenance for Responses call correlation --- tests/endpoint-provenance.json | 402 ++++++++++++++++----------------- 1 file changed, 201 insertions(+), 201 deletions(-) diff --git a/tests/endpoint-provenance.json b/tests/endpoint-provenance.json index c4cb504..a847311 100644 --- a/tests/endpoint-provenance.json +++ b/tests/endpoint-provenance.json @@ -1564,531 +1564,531 @@ "artifacts": [ { "agent": "claude", - "archive_sha256": "7d4a0209677795f6d6b2bae589c050b6e47d54723140ba5556e75cbf1f48140f", - "artifact_id": 11784218741, + "archive_sha256": "d69195afe769363245241f292c185409226d081bf0bbd564999bf99453f759c9", + "artifact_id": 11785968881, "capture_sha256": "6eb5f870d6d9eec0fd8bdfce34693ce86e057feb07df5aa9a4af3f3bd706ea8c", - "check_run_id": 115092463447, + "check_run_id": 115107707605, "conclusion": "success", - "job_id": 115092463447, + "job_id": 115107707605, "platform": "macos", "runner": "macos-latest", - "runner_id": 1000035205, + "runner_id": 1000035349, "runner_labels": [ "macos-latest" ], - "runner_name": "GitHub Actions 1000035205" + "runner_name": "GitHub Actions 1000035349" }, { "agent": "claude", - "archive_sha256": "24e7e00c17579bb5c9f4ac3c93a6422df195426c607a59d584168fe5e6608cd1", - "artifact_id": 11784810202, + "archive_sha256": "ddcd51653a271ee70a389d87cc13d87486e360f401c5a327249ff4f29a1d8761", + "artifact_id": 11786053325, "capture_sha256": "21fa65e59854f6623ddc764b14463d23d1bf87527e4a4173501a0dc354a7dce9", - "check_run_id": 115092463257, + "check_run_id": 115107707777, "conclusion": "success", - "job_id": 115092463257, + "job_id": 115107707777, "platform": "ubuntu", "runner": "ubuntu-latest", - "runner_id": 1000035190, + "runner_id": 1000035336, "runner_labels": [ "ubuntu-latest" ], - "runner_name": "GitHub Actions 1000035190" + "runner_name": "GitHub Actions 1000035336" }, { "agent": "claude", - "archive_sha256": "262998f7b2c598669d4ccd8574b9b4503f8fd88bed29dcc0bbda8563bbd0251c", - "artifact_id": 11784715413, + "archive_sha256": "f949e2e3a4a27af272048c82d2ecbf2ab5485b7772aa413e250d524bfc9c8243", + "artifact_id": 11786497938, "capture_sha256": "de00faa86bcc17a3858475a91044c6a28b24a1af11650bb7758044643de2aa1f", - "check_run_id": 115092463246, + "check_run_id": 115107707788, "conclusion": "success", - "job_id": 115092463246, + "job_id": 115107707788, "platform": "windows", "runner": "windows-latest", - "runner_id": 1000035187, + "runner_id": 1000035345, "runner_labels": [ "windows-latest" ], - "runner_name": "GitHub Actions 1000035187" + "runner_name": "GitHub Actions 1000035345" }, { "agent": "codex", - "archive_sha256": "1d293978c306bd922143e01c172ba616372ca97520ca75d5028fef1235bc662a", - "artifact_id": 11783759750, + "archive_sha256": "8e8bcbd939ad46ac7f117c9028b94e7f27e75a4787b1e5ca930083e8b1d274c2", + "artifact_id": 11786782742, "capture_sha256": "5e39c8858cfe781d5febb081b393afd0c385a73c33bf6609ca7d7b5a4749852e", - "check_run_id": 115092463276, + "check_run_id": 115107707871, "conclusion": "success", - "job_id": 115092463276, + "job_id": 115107707871, "platform": "macos", "runner": "macos-latest", - "runner_id": 1000035192, + "runner_id": 1000035352, "runner_labels": [ "macos-latest" ], - "runner_name": "GitHub Actions 1000035192" + "runner_name": "GitHub Actions 1000035352" }, { "agent": "codex", - "archive_sha256": "1f60601058dff45458e59d567c88b054b84bc9a26c42387a685dbb6ea1443d7f", - "artifact_id": 11784575515, + "archive_sha256": "3e307ed8a8107320e9c17aac94934df74b3338d5621980d2060f466c3b241d20", + "artifact_id": 11786098231, "capture_sha256": "a45c25b9a94213356abc092f187117258099981423758f74e27cf6398efea157", - "check_run_id": 115092463311, + "check_run_id": 115107707667, "conclusion": "success", - "job_id": 115092463311, + "job_id": 115107707667, "platform": "ubuntu", "runner": "ubuntu-latest", - "runner_id": 1000035196, + "runner_id": 1000035334, "runner_labels": [ "ubuntu-latest" ], - "runner_name": "GitHub Actions 1000035196" + "runner_name": "GitHub Actions 1000035334" }, { "agent": "codex", - "archive_sha256": "758d7450cfa57183eb80585c87e9d5598dd340366146f34030542cc1f1f488a3", - "artifact_id": 11784520738, + "archive_sha256": "fcdcac0fa3ab2d41dbd1df5f42562348c9451effb6f80f7941756774cb68fa8f", + "artifact_id": 11786118312, "capture_sha256": "1f90c8f26662b2532208cf6abe8bc263e22cadc0a05fd966dc5cfe13652afb5c", - "check_run_id": 115092463429, + "check_run_id": 115107707518, "conclusion": "success", - "job_id": 115092463429, + "job_id": 115107707518, "platform": "windows", "runner": "windows-latest", - "runner_id": 1000035199, + "runner_id": 1000035325, "runner_labels": [ "windows-latest" ], - "runner_name": "GitHub Actions 1000035199" + "runner_name": "GitHub Actions 1000035325" }, { "agent": "copilot", - "archive_sha256": "21ac74aebefd2adf5078412b129e2fb98c10c907ccfe9ed49a8f6f033540cd12", - "artifact_id": 11783979146, + "archive_sha256": "4808b04d3ced1b7cf834a3df4d9e81ee97cb99fd39e630ed354c7c9f8784e576", + "artifact_id": 11786633306, "capture_sha256": "c922e1edecb25cf7909b1fdb0bf8144a7c05ea841ad2315f5fc7656873571dd8", - "check_run_id": 115092463269, + "check_run_id": 115107707884, "conclusion": "success", - "job_id": 115092463269, + "job_id": 115107707884, "platform": "macos", "runner": "macos-latest", - "runner_id": 1000035189, + "runner_id": 1000035353, "runner_labels": [ "macos-latest" ], - "runner_name": "GitHub Actions 1000035189" + "runner_name": "GitHub Actions 1000035353" }, { "agent": "copilot", - "archive_sha256": "6fc6a994989aaa7e44c3b192a31e209eb91007b805600b08c8b982cdd0b5ff74", - "artifact_id": 11783669847, + "archive_sha256": "576af44333134fc09f3f1ee09911b012a340ac7a258a0049f277325b59e9b54b", + "artifact_id": 11786712537, "capture_sha256": "d17ae1033aafd6c8c7eb5ee2cf2cb134a661ecc37944169574d60806038fa103", - "check_run_id": 115092463698, + "check_run_id": 115107707664, "conclusion": "success", - "job_id": 115092463698, + "job_id": 115107707664, "platform": "ubuntu", "runner": "ubuntu-latest", - "runner_id": 1000035204, + "runner_id": 1000035326, "runner_labels": [ "ubuntu-latest" ], - "runner_name": "GitHub Actions 1000035204" + "runner_name": "GitHub Actions 1000035326" }, { "agent": "copilot", - "archive_sha256": "1af46ae40b6ef47911e13422673e58c9b37120f08a89165f786614e14c63b0c3", - "artifact_id": 11784625508, + "archive_sha256": "b89d39e9beeb8a55d595bdd516f391875f9462366e9a9097d9bcba40071ab533", + "artifact_id": 11786426905, "capture_sha256": "01594240b7ce34526bf7ccbc15bcf9f2ba4b2fff552d6e949c501720df7a0868", - "check_run_id": 115092463248, + "check_run_id": 115107707545, "conclusion": "success", - "job_id": 115092463248, + "job_id": 115107707545, "platform": "windows", "runner": "windows-latest", - "runner_id": 1000035188, + "runner_id": 1000035324, "runner_labels": [ "windows-latest" ], - "runner_name": "GitHub Actions 1000035188" + "runner_name": "GitHub Actions 1000035324" }, { "agent": "cursor", - "archive_sha256": "6a0d36f0a5058c855f9c0e70d4c7d3e0aeef526dbf7c0dadfdc3db9de7887a12", - "artifact_id": 11784109023, + "archive_sha256": "c1815f49f84e76967febf624d1dc5cc51e3a2f81a08a1bdc51636e577b575aa9", + "artifact_id": 11785828861, "capture_sha256": "45b8810fda9834e0a492a9926dffb9be57ee1338d513286ef17d3abe005751b2", - "check_run_id": 115092463571, + "check_run_id": 115107707576, "conclusion": "success", - "job_id": 115092463571, + "job_id": 115107707576, "platform": "macos", "runner": "macos-latest", - "runner_id": 1000035214, + "runner_id": 1000035348, "runner_labels": [ "macos-latest" ], - "runner_name": "GitHub Actions 1000035214" + "runner_name": "GitHub Actions 1000035348" }, { "agent": "cursor", - "archive_sha256": "17201f1abf6103aadd56c46c1192500c442bc5c759926ce282501b269de44d73", - "artifact_id": 11784465698, + "archive_sha256": "e0ac95563d4a850b8e1eee53e6e4113f84697d6ce676755301cd1e8f692786db", + "artifact_id": 11786211931, "capture_sha256": "e10c16ce205909adef763903de2d0ac84eabb2e1b496347992ad3c3360213908", - "check_run_id": 115092463339, + "check_run_id": 115107707604, "conclusion": "success", - "job_id": 115092463339, + "job_id": 115107707604, "platform": "ubuntu", "runner": "ubuntu-latest", - "runner_id": 1000035191, + "runner_id": 1000035335, "runner_labels": [ "ubuntu-latest" ], - "runner_name": "GitHub Actions 1000035191" + "runner_name": "GitHub Actions 1000035335" }, { "agent": "cursor", - "archive_sha256": "e9e4de8c1b8bfac5e5b1cb23d60921c460d2ff16e84874e3801a55912f4fa2df", - "artifact_id": 11784685557, + "archive_sha256": "c87ad8c2bf3f9d97aefeeb3d3b239c177b2af7c54ec6d797600380f1e39a08fe", + "artifact_id": 11785698934, "capture_sha256": "b8af04ff98e36d1f956dd00742a51aed5325e2fef51e867edca544ae8da00555", - "check_run_id": 115092463360, + "check_run_id": 115107707674, "conclusion": "success", - "job_id": 115092463360, + "job_id": 115107707674, "platform": "windows", "runner": "windows-latest", - "runner_id": 1000035210, + "runner_id": 1000035330, "runner_labels": [ "windows-latest" ], - "runner_name": "GitHub Actions 1000035210" + "runner_name": "GitHub Actions 1000035330" }, { "agent": "deepseek", - "archive_sha256": "dc2f15720c8d912fa360311162ac4b9b6b58e2b6ac6cfc8978ed76d105ab01bd", - "artifact_id": 11784760716, + "archive_sha256": "40c5d41265d83c934b5a41a112853c08096110c364293fc8d43d0277b15e3d8f", + "artifact_id": 11786068764, "capture_sha256": "9f36db049a9f7ac3a58356a9aa17e1bc3727e1a41badd1e2e3b3af30491f672c", - "check_run_id": 115092463819, + "check_run_id": 115107707447, "conclusion": "success", - "job_id": 115092463819, + "job_id": 115107707447, "platform": "macos", "runner": "macos-latest", - "runner_id": 1000035218, + "runner_id": 1000035321, "runner_labels": [ "macos-latest" ], - "runner_name": "GitHub Actions 1000035218" + "runner_name": "GitHub Actions 1000035321" }, { "agent": "deepseek", - "archive_sha256": "37e9188fd7e05c09def4140a38200eec4266c1ea322f55e1ec0d7b0280875eef", - "artifact_id": 11783998992, + "archive_sha256": "ea84a33dd5d981bc82871944f1e56c8d9920c9f7f049bf9126fd374a98e9d994", + "artifact_id": 11785847314, "capture_sha256": "5c08fb7a1644f87521c9321c99b6deca046ba0c46993d7d747f51215c587f4b2", - "check_run_id": 115092463336, + "check_run_id": 115107707527, "conclusion": "success", - "job_id": 115092463336, + "job_id": 115107707527, "platform": "ubuntu", "runner": "ubuntu-latest", - "runner_id": 1000035195, + "runner_id": 1000035327, "runner_labels": [ "ubuntu-latest" ], - "runner_name": "GitHub Actions 1000035195" + "runner_name": "GitHub Actions 1000035327" }, { "agent": "deepseek", - "archive_sha256": "53daea493e9505770b56b8b6494f80dae01e8b08f498baf5d3dc7d2f1556e811", - "artifact_id": 11784765864, + "archive_sha256": "06d922eda25c7e935863adec1a7df89ea1357339c45bc4b4c265fd13b9557585", + "artifact_id": 11785683142, "capture_sha256": "5b26b5c0c269b5fd0392a298d3e238da8ea197f382698c5e3df71ab81101f4be", - "check_run_id": 115092463464, + "check_run_id": 115107707863, "conclusion": "success", - "job_id": 115092463464, + "job_id": 115107707863, "platform": "windows", "runner": "windows-latest", - "runner_id": 1000035201, + "runner_id": 1000035346, "runner_labels": [ "windows-latest" ], - "runner_name": "GitHub Actions 1000035201" + "runner_name": "GitHub Actions 1000035346" }, { "agent": "devin", - "archive_sha256": "db0aaf6ebddecfcd581cfc9c59c4f117b66b6de4707a9231a0f2a186697ab44d", - "artifact_id": 11784313291, + "archive_sha256": "b55b11fc1aa8590032910c004b597b285969b71658252e2965c0af4eb755a13c", + "artifact_id": 11786298580, "capture_sha256": "b162effcbc4be932b051e18ae73139dbaa9d4611e7cb1bdf795fd79a1ce24fed", - "check_run_id": 115092463359, + "check_run_id": 115107707811, "conclusion": "success", - "job_id": 115092463359, + "job_id": 115107707811, "platform": "macos", "runner": "macos-latest", - "runner_id": 1000035200, + "runner_id": 1000035350, "runner_labels": [ "macos-latest" ], - "runner_name": "GitHub Actions 1000035200" + "runner_name": "GitHub Actions 1000035350" }, { "agent": "devin", - "archive_sha256": "107ca351236e534f729425602f9b472f8c5132263aa98b9a8ea20db0af38a3a2", - "artifact_id": 11783954038, + "archive_sha256": "d27b04db7af0af140d9db1e83a0ba26f07abc9c81fe9ffd391ee9448d91e06a6", + "artifact_id": 11786028417, "capture_sha256": "a87dc314284a5502d80d34de2b532667198652a256bcf85e22211e4bd502bf8f", - "check_run_id": 115092463696, + "check_run_id": 115107707844, "conclusion": "success", - "job_id": 115092463696, + "job_id": 115107707844, "platform": "ubuntu", "runner": "ubuntu-latest", - "runner_id": 1000035208, + "runner_id": 1000035347, "runner_labels": [ "ubuntu-latest" ], - "runner_name": "GitHub Actions 1000035208" + "runner_name": "GitHub Actions 1000035347" }, { "agent": "devin", - "archive_sha256": "f0ce1cf090092c51e35424009d608fbd2f7a3752b438316f087f78f005ea7847", - "artifact_id": 11784560536, + "archive_sha256": "6c202c7d7d6efe9240ba92f9facc8dbaae03e88684110a26127d89c748ab29c8", + "artifact_id": 11786318056, "capture_sha256": "8b1dbc6de5b80be42494d1b0066082b7e6c99bea96043bae9960409c0dc776d2", - "check_run_id": 115092463454, + "check_run_id": 115107707639, "conclusion": "success", - "job_id": 115092463454, + "job_id": 115107707639, "platform": "windows", "runner": "windows-latest", - "runner_id": 1000035198, + "runner_id": 1000035338, "runner_labels": [ "windows-latest" ], - "runner_name": "GitHub Actions 1000035198" + "runner_name": "GitHub Actions 1000035338" }, { "agent": "gemini", - "archive_sha256": "a16ab22c9940e07ea9eda04282a47e22037655c04fde2e7490a288efcb19d74e", - "artifact_id": 11784860573, + "archive_sha256": "2d9d8b7a5f95e4ce998f9b129ca6d3921c461d7fcfb486b65ed0640e9230814a", + "artifact_id": 11785842761, "capture_sha256": "0b9396676f937c13f30aa871d2874b3f438e1c91b801dcd16264529de39d4762", - "check_run_id": 115092463763, + "check_run_id": 115107707772, "conclusion": "success", - "job_id": 115092463763, + "job_id": 115107707772, "platform": "macos", "runner": "macos-latest", - "runner_id": 1000035217, + "runner_id": 1000035351, "runner_labels": [ "macos-latest" ], - "runner_name": "GitHub Actions 1000035217" + "runner_name": "GitHub Actions 1000035351" }, { "agent": "gemini", - "archive_sha256": "6393290b8ba1520a8695dec3fd52b6303ecdaf015e53602bf179ff41ebe452bc", - "artifact_id": 11783769501, + "archive_sha256": "5c7ad45650b7cabb7c8b67517235c79cfe736adf79ff2a2b893e03bf86c88cca", + "artifact_id": 11786177076, "capture_sha256": "6cd688f58722a757df69a82543f4c988a5930479012e63baf936a887fa93419d", - "check_run_id": 115092463649, + "check_run_id": 115107707606, "conclusion": "success", - "job_id": 115092463649, + "job_id": 115107707606, "platform": "ubuntu", "runner": "ubuntu-latest", - "runner_id": 1000035202, + "runner_id": 1000035332, "runner_labels": [ "ubuntu-latest" ], - "runner_name": "GitHub Actions 1000035202" + "runner_name": "GitHub Actions 1000035332" }, { "agent": "gemini", - "archive_sha256": "be667eb04338d5e0c10bb290c5832f77be69c8b17440f3dc8b091bbdfcdcaf25", - "artifact_id": 11784149001, + "archive_sha256": "54448edc510fdf41780d3585ea3c15287bce3c854f40c8bba7bdebd14239f33b", + "artifact_id": 11786217184, "capture_sha256": "1f6d00cc96e00f3cb972f8e1089b13935ffd149e6b8aa67911848068f77d668b", - "check_run_id": 115092463476, + "check_run_id": 115107707647, "conclusion": "success", - "job_id": 115092463476, + "job_id": 115107707647, "platform": "windows", "runner": "windows-latest", - "runner_id": 1000035206, + "runner_id": 1000035329, "runner_labels": [ "windows-latest" ], - "runner_name": "GitHub Actions 1000035206" + "runner_name": "GitHub Actions 1000035329" }, { "agent": "kimi", - "archive_sha256": "28def1186a4c0122eb00446014614a0215eb91116f318112fc4516405b3b7b7b", - "artifact_id": 11784084296, + "archive_sha256": "b437a8881c22fdd882dfd7b228f293f317f72a2e6c121a56eb43e73b5124ee49", + "artifact_id": 11785867531, "capture_sha256": "4ca011a5faccac9d135d75220d2738d19a9df347a0b975546c560afff1e0915b", - "check_run_id": 115092463752, + "check_run_id": 115107707506, "conclusion": "success", - "job_id": 115092463752, + "job_id": 115107707506, "platform": "macos", "runner": "macos-latest", - "runner_id": 1000035216, + "runner_id": 1000035322, "runner_labels": [ "macos-latest" ], - "runner_name": "GitHub Actions 1000035216" + "runner_name": "GitHub Actions 1000035322" }, { "agent": "kimi", - "archive_sha256": "3fdef6c3c722879f71bfdf1f52bf3d7227ae8aff4f8687c6482a35dae375f946", - "artifact_id": 11784390883, + "archive_sha256": "9e81abbb71bcfb90738c411642bf03b7a1d5f97f71baf433b24b968f8fddc009", + "artifact_id": 11785733793, "capture_sha256": "a3c2d0a3c96e99de4f74ad40970e3fb082250efab11cbaeb80b8ecca357c7de4", - "check_run_id": 115092463607, + "check_run_id": 115107707658, "conclusion": "success", - "job_id": 115092463607, + "job_id": 115107707658, "platform": "ubuntu", "runner": "ubuntu-latest", - "runner_id": 1000035212, + "runner_id": 1000035333, "runner_labels": [ "ubuntu-latest" ], - "runner_name": "GitHub Actions 1000035212" + "runner_name": "GitHub Actions 1000035333" }, { "agent": "kimi", - "archive_sha256": "23d8440a5a77f3b40921efa39b2e88728f106104f5a5a304f6025cda93375822", - "artifact_id": 11784069030, + "archive_sha256": "53c687ac2021af50bfcd13f917bf31a301a453295d6f7698fc12f3c336a513dd", + "artifact_id": 11785807604, "capture_sha256": "08c897a74d0946a64a448578de24169eb65736289fd1eb7222274de539c14c24", - "check_run_id": 115092463319, + "check_run_id": 115107707783, "conclusion": "success", - "job_id": 115092463319, + "job_id": 115107707783, "platform": "windows", "runner": "windows-latest", - "runner_id": 1000035197, + "runner_id": 1000035341, "runner_labels": [ "windows-latest" ], - "runner_name": "GitHub Actions 1000035197" + "runner_name": "GitHub Actions 1000035341" }, { "agent": "opencode", - "archive_sha256": "d404cbb226c6368f0f62b666fd2fb11e10791b3b360c744a3d7f2b44ae455bd9", - "artifact_id": 11784004151, + "archive_sha256": "9a9544a5a98a446a36eed71a444ee6c300179d6064c64d9919424b97d0a47f3a", + "artifact_id": 11786098425, "capture_sha256": "0197c1c312d6532e4a8d05dce595bc6a86e3a393ba74b3f8c6a0a1459a1aaf5c", - "check_run_id": 115092463294, + "check_run_id": 115107707735, "conclusion": "success", - "job_id": 115092463294, + "job_id": 115107707735, "platform": "macos", "runner": "macos-latest", - "runner_id": 1000035193, + "runner_id": 1000035328, "runner_labels": [ "macos-latest" ], - "runner_name": "GitHub Actions 1000035193" + "runner_name": "GitHub Actions 1000035328" }, { "agent": "opencode", - "archive_sha256": "b502034de9791207c5545aa58c40694773be399369569298e87a24ddfae21b04", - "artifact_id": 11784740386, + "archive_sha256": "e28fc529010b6479916ad8560c4d6b2853e4ea10752a89d8a71b3c76165c780a", + "artifact_id": 11786497803, "capture_sha256": "f9a06f9015188a22a73e7d1717185489dca98151e57448533e53ad05e03810bb", - "check_run_id": 115092463769, + "check_run_id": 115107707839, "conclusion": "success", - "job_id": 115092463769, + "job_id": 115107707839, "platform": "ubuntu", "runner": "ubuntu-latest", - "runner_id": 1000035213, + "runner_id": 1000035343, "runner_labels": [ "ubuntu-latest" ], - "runner_name": "GitHub Actions 1000035213" + "runner_name": "GitHub Actions 1000035343" }, { "agent": "opencode", - "archive_sha256": "cc1f0ccb455329ac22ff0a7372941f171f50a29410a8e1992d5e9da1f4818e23", - "artifact_id": 11784298330, + "archive_sha256": "f94d0890936e37db1adb73105156f178acb49a4d04983eb49009c51d6ace3e42", + "artifact_id": 11786147190, "capture_sha256": "31ce073b2034222781b9a4519bae2ffd62b72ffe167aa70bc136aae29d55cfe6", - "check_run_id": 115092463719, + "check_run_id": 115107707702, "conclusion": "success", - "job_id": 115092463719, + "job_id": 115107707702, "platform": "windows", "runner": "windows-latest", - "runner_id": 1000035209, + "runner_id": 1000035342, "runner_labels": [ "windows-latest" ], - "runner_name": "GitHub Actions 1000035209" + "runner_name": "GitHub Actions 1000035342" }, { "agent": "pi", - "archive_sha256": "4821e4a6a9d65cf315eae52c662812278add8ddbf7c438bfec2bb546cbe23aea", - "artifact_id": 11784620719, + "archive_sha256": "0bcc222733b379073e772b7c0181886e602b467696fadde02f03b2ccea96026d", + "artifact_id": 11786282071, "capture_sha256": "f90ded0ea820aaf27a2e025956367f2d4f1c1271a4c8c0797f3ad0975e70f55e", - "check_run_id": 115092463530, + "check_run_id": 115107707622, "conclusion": "success", - "job_id": 115092463530, + "job_id": 115107707622, "platform": "macos", "runner": "macos-latest", - "runner_id": 1000035215, + "runner_id": 1000035331, "runner_labels": [ "macos-latest" ], - "runner_name": "GitHub Actions 1000035215" + "runner_name": "GitHub Actions 1000035331" }, { "agent": "pi", - "archive_sha256": "5cffa48c12fcad281b1b9e5642a654915e373bc92e49a1bcb55afbda7d4018ea", - "artifact_id": 11784695408, + "archive_sha256": "67ecd816f981da73c1bcd552a104028db648a26143ca38f3c45d87dca0ef8f68", + "artifact_id": 11786587728, "capture_sha256": "e0316503ed761604e429919e7593590bc1b2f329b13b0c604864ae2a88a3ec87", - "check_run_id": 115092463677, + "check_run_id": 115107707808, "conclusion": "success", - "job_id": 115092463677, + "job_id": 115107707808, "platform": "ubuntu", "runner": "ubuntu-latest", - "runner_id": 1000035207, + "runner_id": 1000035340, "runner_labels": [ "ubuntu-latest" ], - "runner_name": "GitHub Actions 1000035207" + "runner_name": "GitHub Actions 1000035340" }, { "agent": "pi", - "archive_sha256": "c18692f5c89e286f7f92d44e706d7758c0297f3a2258255f0d3578eaf8bca1df", - "artifact_id": 11784870373, + "archive_sha256": "87f52ec4ba147d9d26f1f0f4077dcf1d066e31e39295817e45199c642443d79c", + "artifact_id": 11786137440, "capture_sha256": "453d9e32581184d83cb26ba6b529db15f08662fd17fea6b1cc75f8b49a34c7e4", - "check_run_id": 115092463873, + "check_run_id": 115107707784, "conclusion": "success", - "job_id": 115092463873, + "job_id": 115107707784, "platform": "windows", "runner": "windows-latest", - "runner_id": 1000035211, + "runner_id": 1000035344, "runner_labels": [ "windows-latest" ], - "runner_name": "GitHub Actions 1000035211" + "runner_name": "GitHub Actions 1000035344" }, { "agent": "qwen", - "archive_sha256": "c8a9a29a3f79b24f50ca1baa903fc54c0f3b80f312cdcbae22308337159a6063", - "artifact_id": 11784745692, + "archive_sha256": "c60672f66f35b5b0016885f2e553a88535697168f2d330a72a5edb1783200d1f", + "artifact_id": 11785927418, "capture_sha256": "bf800127313bc7c5e43bb483ee6d8cfee8ca53c2057a150ac5e1c939bb7d1336", - "check_run_id": 115092463835, + "check_run_id": 115107707761, "conclusion": "success", - "job_id": 115092463835, + "job_id": 115107707761, "platform": "macos", "runner": "macos-latest", - "runner_id": 1000035219, + "runner_id": 1000035339, "runner_labels": [ "macos-latest" ], - "runner_name": "GitHub Actions 1000035219" + "runner_name": "GitHub Actions 1000035339" }, { "agent": "qwen", - "archive_sha256": "456d0717c3468c5ae832a5dafad950a4da504f9d21cfcaf80c9ab93f96bd353d", - "artifact_id": 11784350961, + "archive_sha256": "14a210b0e2502ef3ed91550bd0ddb0ca4239e841381344efe296a19e93758bf0", + "artifact_id": 11786662510, "capture_sha256": "0a9133db580f0861d1fe583fbb0fd81196581af4d4141ab793015a1e8ac516de", - "check_run_id": 115092463493, + "check_run_id": 115107707769, "conclusion": "success", - "job_id": 115092463493, + "job_id": 115107707769, "platform": "ubuntu", "runner": "ubuntu-latest", - "runner_id": 1000035203, + "runner_id": 1000035337, "runner_labels": [ "ubuntu-latest" ], - "runner_name": "GitHub Actions 1000035203" + "runner_name": "GitHub Actions 1000035337" }, { "agent": "qwen", - "archive_sha256": "5d124b4888be1d0dfbae01ad59832174fec3353777e1e5499823203554ed6c5b", - "artifact_id": 11784143744, + "archive_sha256": "8f9fe187a19dbb4f80ed934a16f18c6bef89f8b100cc8c6b0cc337fc68334588", + "artifact_id": 11786717551, "capture_sha256": "71a9c5e9463a5ea1b7050053286f4fa11484c2c30c7b509ddac86c16527a1e13", - "check_run_id": 115092463370, + "check_run_id": 115107707468, "conclusion": "success", - "job_id": 115092463370, + "job_id": 115107707468, "platform": "windows", "runner": "windows-latest", - "runner_id": 1000035194, + "runner_id": 1000035323, "runner_labels": [ "windows-latest" ], - "runner_name": "GitHub Actions 1000035194" + "runner_name": "GitHub Actions 1000035323" } ], "catalog_sha256": "f92926d7a643aed5dfb151ba8af1ff570f1a8e46a3587a91e2ae4498868abe82", @@ -2243,7 +2243,7 @@ }, { "path": "tests/model_control_proxy.py", - "sha256": "636cf45e45fb888efa5a78c1879439c3d192dab1af940069b9494da16f40e2e7" + "sha256": "ab4deb6faee9401b9494e39acb81ab172981a6102ca5cdce769fb706607f7d58" }, { "path": "tests/real_agent_driver.py", @@ -2262,8 +2262,8 @@ "repository": "operatorstack/pitot", "repository_id": 1305805198, "run_attempt": 1, - "run_id": 38334816963, - "source_sha": "20a1e4c6e2366f53f1ce47063c338b2385ce2301", + "run_id": 38339689686, + "source_sha": "946da99b944a61e3b2d6babf3aba96ba9fb565b9", "workflow_id": 381486275, "workflow_path": ".github/workflows/pitot-e2e.yml" }