Validate setup source and materialize canonical defaults before retaining an intent
curl --request POST \
--url https://api.firedrill.run/v1/projects/{projectId}/tool-setups/validate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"tools": [
{
"libraryEntryId": "<string>",
"expectedPackageArchiveDigest": "<string>",
"instanceId": "<string>"
}
],
"name": "<string>",
"previousSetupId": "<string>",
"expectedPreviousBuildHash": "<string>"
}
'import requests
url = "https://api.firedrill.run/v1/projects/{projectId}/tool-setups/validate"
payload = {
"tools": [
{
"libraryEntryId": "<string>",
"expectedPackageArchiveDigest": "<string>",
"instanceId": "<string>"
}
],
"name": "<string>",
"previousSetupId": "<string>",
"expectedPreviousBuildHash": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
tools: [
{
libraryEntryId: '<string>',
expectedPackageArchiveDigest: '<string>',
instanceId: '<string>'
}
],
name: '<string>',
previousSetupId: '<string>',
expectedPreviousBuildHash: '<string>'
})
};
fetch('https://api.firedrill.run/v1/projects/{projectId}/tool-setups/validate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.firedrill.run/v1/projects/{projectId}/tool-setups/validate",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'tools' => [
[
'libraryEntryId' => '<string>',
'expectedPackageArchiveDigest' => '<string>',
'instanceId' => '<string>'
]
],
'name' => '<string>',
'previousSetupId' => '<string>',
'expectedPreviousBuildHash' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.firedrill.run/v1/projects/{projectId}/tool-setups/validate"
payload := strings.NewReader("{\n \"tools\": [\n {\n \"libraryEntryId\": \"<string>\",\n \"expectedPackageArchiveDigest\": \"<string>\",\n \"instanceId\": \"<string>\"\n }\n ],\n \"name\": \"<string>\",\n \"previousSetupId\": \"<string>\",\n \"expectedPreviousBuildHash\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.firedrill.run/v1/projects/{projectId}/tool-setups/validate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"tools\": [\n {\n \"libraryEntryId\": \"<string>\",\n \"expectedPackageArchiveDigest\": \"<string>\",\n \"instanceId\": \"<string>\"\n }\n ],\n \"name\": \"<string>\",\n \"previousSetupId\": \"<string>\",\n \"expectedPreviousBuildHash\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.firedrill.run/v1/projects/{projectId}/tool-setups/validate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"tools\": [\n {\n \"libraryEntryId\": \"<string>\",\n \"expectedPackageArchiveDigest\": \"<string>\",\n \"instanceId\": \"<string>\"\n }\n ],\n \"name\": \"<string>\",\n \"previousSetupId\": \"<string>\",\n \"expectedPreviousBuildHash\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"request": {
"use": "reusable",
"tools": [
{
"libraryEntryId": "<string>",
"expectedPackageArchiveDigest": "<string>",
"initialState": "starter",
"instanceId": "<string>"
}
],
"name": "<string>",
"previousSetupId": "<string>",
"expectedPreviousBuildHash": "<string>",
"testDefinitions": {
"targets": [
{
"schemaVersion": 1,
"target": {
"id": "<string>",
"kind": "module",
"bindings": [
"direct"
],
"module": "<string>",
"export": "default",
"timeoutMs": 1800000,
"bindingEnvironment": {}
}
}
],
"scenarios": [],
"drills": [
{
"schemaVersion": 1,
"id": "<string>",
"tags": [],
"targetId": "<string>",
"trials": {
"count": 1,
"classification": "contract"
},
"assertions": [
{
"id": "<string>",
"gate": true,
"kind": "state.value",
"packageId": "<string>",
"namespace": "<string>",
"rowId": "<string>",
"path": [
"<string>"
],
"comparison": {
"operator": "equals",
"value": "<unknown>"
},
"instanceId": "<string>"
}
],
"title": "<string>",
"scenarioId": "<string>",
"inlineScenario": {
"virtualTimeUs": 0,
"actors": [],
"state": [],
"faults": [],
"initialEvents": [],
"title": "<string>",
"toolOverrides": [
{
"id": "<string>",
"operation": {
"packageId": "<string>",
"operationId": "<string>",
"instanceId": "<string>"
},
"outcome": {
"kind": "return",
"value": "<unknown>"
},
"when": {
"arguments": {},
"actorId": "<string>",
"actorInstanceId": "<string>"
},
"times": 4503599627370495
}
]
},
"toolOverrides": [
{
"id": "<string>",
"operation": {
"packageId": "<string>",
"operationId": "<string>",
"instanceId": "<string>"
},
"outcome": {
"kind": "return",
"value": "<unknown>"
},
"when": {
"arguments": {},
"actorId": "<string>",
"actorInstanceId": "<string>"
},
"times": 4503599627370495
}
],
"actorId": "<string>",
"actorInstanceId": "<string>",
"task": {
"instruction": "<string>",
"input": "<unknown>"
},
"settle": {
"maxVirtualAdvanceUs": 0,
"maxToolCalls": 1000,
"maxEvents": 500000
},
"timeline": {
"horizonUs": 0,
"maxToolCalls": 1000,
"maxEvents": 10000,
"stopOnInvariantFailure": true,
"stopOnTargetFailure": true,
"interactions": [],
"workloads": [],
"invariants": []
}
}
],
"suites": []
}
}
}{
"code": "<string>",
"message": "<string>",
"correlationId": "<string>",
"retryable": true,
"source": "platform",
"retryAfterMs": 123,
"operationId": "<string>",
"issues": [
{
"path": "<string>",
"code": "<string>",
"message": "<string>"
}
],
"details": {},
"evidence": {
"sessionId": "<string>",
"runId": "<string>",
"journalSeq": 4503599627370495,
"buildHash": "<string>"
}
}Validate setup source and materialize canonical defaults before retaining an intent
Requires current tool.publish and build.publish authority. Returns canonical typed source without saving an intent, creating a build or allocating compute. This structural check does not replace compilation or exact parent/build admission. Retain the returned request and reuse it unchanged for interrupted create requests.
Validate setup source and materialize canonical defaults before retaining an intent
curl --request POST \
--url https://api.firedrill.run/v1/projects/{projectId}/tool-setups/validate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"tools": [
{
"libraryEntryId": "<string>",
"expectedPackageArchiveDigest": "<string>",
"instanceId": "<string>"
}
],
"name": "<string>",
"previousSetupId": "<string>",
"expectedPreviousBuildHash": "<string>"
}
'import requests
url = "https://api.firedrill.run/v1/projects/{projectId}/tool-setups/validate"
payload = {
"tools": [
{
"libraryEntryId": "<string>",
"expectedPackageArchiveDigest": "<string>",
"instanceId": "<string>"
}
],
"name": "<string>",
"previousSetupId": "<string>",
"expectedPreviousBuildHash": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
tools: [
{
libraryEntryId: '<string>',
expectedPackageArchiveDigest: '<string>',
instanceId: '<string>'
}
],
name: '<string>',
previousSetupId: '<string>',
expectedPreviousBuildHash: '<string>'
})
};
fetch('https://api.firedrill.run/v1/projects/{projectId}/tool-setups/validate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.firedrill.run/v1/projects/{projectId}/tool-setups/validate",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'tools' => [
[
'libraryEntryId' => '<string>',
'expectedPackageArchiveDigest' => '<string>',
'instanceId' => '<string>'
]
],
'name' => '<string>',
'previousSetupId' => '<string>',
'expectedPreviousBuildHash' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.firedrill.run/v1/projects/{projectId}/tool-setups/validate"
payload := strings.NewReader("{\n \"tools\": [\n {\n \"libraryEntryId\": \"<string>\",\n \"expectedPackageArchiveDigest\": \"<string>\",\n \"instanceId\": \"<string>\"\n }\n ],\n \"name\": \"<string>\",\n \"previousSetupId\": \"<string>\",\n \"expectedPreviousBuildHash\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.firedrill.run/v1/projects/{projectId}/tool-setups/validate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"tools\": [\n {\n \"libraryEntryId\": \"<string>\",\n \"expectedPackageArchiveDigest\": \"<string>\",\n \"instanceId\": \"<string>\"\n }\n ],\n \"name\": \"<string>\",\n \"previousSetupId\": \"<string>\",\n \"expectedPreviousBuildHash\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.firedrill.run/v1/projects/{projectId}/tool-setups/validate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"tools\": [\n {\n \"libraryEntryId\": \"<string>\",\n \"expectedPackageArchiveDigest\": \"<string>\",\n \"instanceId\": \"<string>\"\n }\n ],\n \"name\": \"<string>\",\n \"previousSetupId\": \"<string>\",\n \"expectedPreviousBuildHash\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"request": {
"use": "reusable",
"tools": [
{
"libraryEntryId": "<string>",
"expectedPackageArchiveDigest": "<string>",
"initialState": "starter",
"instanceId": "<string>"
}
],
"name": "<string>",
"previousSetupId": "<string>",
"expectedPreviousBuildHash": "<string>",
"testDefinitions": {
"targets": [
{
"schemaVersion": 1,
"target": {
"id": "<string>",
"kind": "module",
"bindings": [
"direct"
],
"module": "<string>",
"export": "default",
"timeoutMs": 1800000,
"bindingEnvironment": {}
}
}
],
"scenarios": [],
"drills": [
{
"schemaVersion": 1,
"id": "<string>",
"tags": [],
"targetId": "<string>",
"trials": {
"count": 1,
"classification": "contract"
},
"assertions": [
{
"id": "<string>",
"gate": true,
"kind": "state.value",
"packageId": "<string>",
"namespace": "<string>",
"rowId": "<string>",
"path": [
"<string>"
],
"comparison": {
"operator": "equals",
"value": "<unknown>"
},
"instanceId": "<string>"
}
],
"title": "<string>",
"scenarioId": "<string>",
"inlineScenario": {
"virtualTimeUs": 0,
"actors": [],
"state": [],
"faults": [],
"initialEvents": [],
"title": "<string>",
"toolOverrides": [
{
"id": "<string>",
"operation": {
"packageId": "<string>",
"operationId": "<string>",
"instanceId": "<string>"
},
"outcome": {
"kind": "return",
"value": "<unknown>"
},
"when": {
"arguments": {},
"actorId": "<string>",
"actorInstanceId": "<string>"
},
"times": 4503599627370495
}
]
},
"toolOverrides": [
{
"id": "<string>",
"operation": {
"packageId": "<string>",
"operationId": "<string>",
"instanceId": "<string>"
},
"outcome": {
"kind": "return",
"value": "<unknown>"
},
"when": {
"arguments": {},
"actorId": "<string>",
"actorInstanceId": "<string>"
},
"times": 4503599627370495
}
],
"actorId": "<string>",
"actorInstanceId": "<string>",
"task": {
"instruction": "<string>",
"input": "<unknown>"
},
"settle": {
"maxVirtualAdvanceUs": 0,
"maxToolCalls": 1000,
"maxEvents": 500000
},
"timeline": {
"horizonUs": 0,
"maxToolCalls": 1000,
"maxEvents": 10000,
"stopOnInvariantFailure": true,
"stopOnTargetFailure": true,
"interactions": [],
"workloads": [],
"invariants": []
}
}
],
"suites": []
}
}
}{
"code": "<string>",
"message": "<string>",
"correlationId": "<string>",
"retryable": true,
"source": "platform",
"retryAfterMs": 123,
"operationId": "<string>",
"issues": [
{
"path": "<string>",
"code": "<string>",
"message": "<string>"
}
],
"details": {},
"evidence": {
"sessionId": "<string>",
"runId": "<string>",
"journalSeq": 4503599627370495,
"buildHash": "<string>"
}
}Authorizations
Opaque control credential
Path Parameters
Pattern:
^prj_[0-9a-z]{12,32}$Body
application/json
Available options:
reusable, automated Required array length:
1 - 8 elementsShow child attributes
Show child attributes
Required string length:
1 - 100Pattern:
^setup_[0-9a-z]{12,32}$Pattern:
^sha256:[0-9a-f]{64}$Show child attributes
Show child attributes
Response
Canonical setup request
Show child attributes
Show child attributes