{"asOf":"2026-10-03","doesNotChangeDepotPicks":true,"doesNotChangePriceSort":true,"doesNotRescore":true,"caps":{"needs":6,"freePerNeed":3,"caseStudies":3},"class":{"id":"orchestrator","name":"Multi-agent orchestrator","definition":"A lead assigns subtasks to workers and accepts a result only when it matches the assignment.","needs":{"jtbdIds":["durable-agent-workflows","event-driven-agent-jobs","langgraph-deploy","ray-distributed-agents","a2a-agent-discovery","agent-tool-router","mcp-discovery"],"freeKinds":["free_mcp","dev_tool"],"capabilityTags":["mcp","agents"],"plain":["A written assignment per worker","A budget for the whole fan-out"]},"failureModeIds":["inter-agent-misalignment","tool-loop","runaway-spend","identity-confusion","partial-tool-success","weak-verification","instruction-drift","hallucinated-tool-args","observability-gap"],"exampleTasks":["Delegate two searches and reject a worker result that answers a different question","Stop the fan-out when the tool-call budget is spent"]},"needsConsidered":["durable-agent-workflows","event-driven-agent-jobs","langgraph-deploy","ray-distributed-agents","a2a-agent-discovery","agent-tool-router"],"needsOmitted":["mcp-discovery"],"jobs":[{"jtbdId":"durable-agent-workflows","decide":{"available":true,"unavailableReason":null,"providerId":"temporal-cloud","scoreAsOf":"2026-09-14","scoreAgeDays":43,"scoreStale":true,"runnerUpId":"inngest","cite":"Depot Pick for durable-agent-workflows: temporal-cloud (asOf 2026-09-14). See GET /api/jtbds/durable-agent-workflows + GET /api/methodology.","citePath":"/api/jtbds/durable-agent-workflows"},"quote":{"available":true,"unavailableReason":null,"cheapest":null,"recommendedWorkloadQuote":null,"representativeQuote":null,"estimatedTaskCost":null,"reason":"Nothing was compared. no comparable sourced unit for this job; chat input $/1M and other units were not borrowed pickIsPriceWinner is null.","priceWinnerNote":"Nothing was compared. no comparable sourced unit for this job; chat input $/1M and other units were not borrowed pickIsPriceWinner is null."},"pickIsNotPriceWinner":false,"freeResources":[{"id":"langgraph","name":"LangGraph","kind":"dev_tool","cost":"oss","substitutable":true,"sourceUrl":"https://raw.githubusercontent.com/langchain-ai/langgraph/main/LICENSE"}],"freeMatch":"jtbd","paidPick":{"available":true,"unavailableReason":null,"providerId":"temporal-cloud","scoreAsOf":"2026-09-14","scoreAgeDays":43,"scoreStale":true,"runnerUpId":"inngest","cite":"Depot Pick for durable-agent-workflows: temporal-cloud (asOf 2026-09-14). See GET /api/jtbds/durable-agent-workflows + GET /api/methodology.","citePath":"/api/jtbds/durable-agent-workflows"},"recommendation":{"mode":"free_only","use":[{"id":"langgraph","name":"LangGraph","kind":"dev_tool","cost":"oss","substitutable":true,"sourceUrl":"https://raw.githubusercontent.com/langchain-ai/langgraph/main/LICENSE"}],"gap":null,"creditsNotFree":[],"doesNotPromotePaidSku":true}},{"jtbdId":"event-driven-agent-jobs","decide":{"available":true,"unavailableReason":null,"providerId":"inngest","scoreAsOf":"2026-09-14","scoreAgeDays":43,"scoreStale":true,"runnerUpId":"trigger-dev","cite":"Depot Pick for event-driven-agent-jobs: inngest (asOf 2026-09-14). See GET /api/jtbds/event-driven-agent-jobs + GET /api/methodology.","citePath":"/api/jtbds/event-driven-agent-jobs"},"quote":{"available":true,"unavailableReason":null,"cheapest":null,"recommendedWorkloadQuote":{"providerId":"inngest","providerName":"Inngest","skuId":"inngest-free","item":"Free","plan":"Free — 50k executions","unit":"usd_per_month","amountUsd":0,"outputSkuId":null,"outputItem":null,"outputAmountUsd":null,"outputUnit":null,"sourceUrl":"https://www.inngest.com/pricing","asOf":"2026-10-03","pricingLastVerifiedAt":"2026-10-27","isFlagshipForJob":false,"differsFromFloorCheapest":false,"representativeQuote":{"skuId":"inngest-free","item":"Free","plan":"Free — 50k executions","amountUsd":0,"inputOrUnitUsd":0,"unit":"usd_per_month","outputUsd":null,"outputUnit":null,"sourceUrl":"https://www.inngest.com/pricing","asOf":"2026-10-03"},"estimatedTaskCost":{"tasks":1000,"retryAndToolOverheadMultiplier":1.15,"retryToolOverheadMultiplier":1.15,"unitsPerTask":1,"baseCostPer1kTasksUsd":0,"totalUsd":0,"estimatedTotalUsd":0,"perTaskUsd":0,"estimatedCostPerTaskUsd":0,"formula":"Monthly base plan $0/mo covering 1,000 tasks (1.15x overhead buffer)","assumptions":"Monthly subscription plan amortized over 1,000 tasks/month."}},"representativeQuote":{"skuId":"inngest-free","item":"Free","plan":"Free — 50k executions","amountUsd":0,"inputOrUnitUsd":0,"unit":"usd_per_month","outputUsd":null,"outputUnit":null,"sourceUrl":"https://www.inngest.com/pricing","asOf":"2026-10-03"},"estimatedTaskCost":{"tasks":1000,"retryAndToolOverheadMultiplier":1.15,"retryToolOverheadMultiplier":1.15,"unitsPerTask":1,"baseCostPer1kTasksUsd":0,"totalUsd":0,"estimatedTotalUsd":0,"perTaskUsd":0,"estimatedCostPerTaskUsd":0,"formula":"Monthly base plan $0/mo covering 1,000 tasks (1.15x overhead buffer)","assumptions":"Monthly subscription plan amortized over 1,000 tasks/month."},"reason":"Nothing was compared. mixed_units: usd_per_100k_messages and usd_per_million_events are both stored. They were not ranked together and were not converted. Monthly plans were not included. cheapest stays null. pickIsPriceWinner is null.","priceWinnerNote":"Nothing was compared. mixed_units: usd_per_100k_messages and usd_per_million_events are both stored. They were not ranked together and were not converted. Monthly plans were not included. cheapest stays null. pickIsPriceWinner is null."},"pickIsNotPriceWinner":false,"freeResources":[{"id":"hatchet","name":"Hatchet","kind":"dev_tool","cost":"oss","substitutable":true,"sourceUrl":"https://raw.githubusercontent.com/hatchet-dev/hatchet/main/LICENSE"},{"id":"upstash-qstash-free","name":"Upstash QStash Free plan","kind":"free_queue","cost":"free","substitutable":true,"sourceUrl":"https://upstash.com/pricing/qstash"}],"freeMatch":"jtbd","paidPick":{"available":true,"unavailableReason":null,"providerId":"inngest","scoreAsOf":"2026-09-14","scoreAgeDays":43,"scoreStale":true,"runnerUpId":"trigger-dev","cite":"Depot Pick for event-driven-agent-jobs: inngest (asOf 2026-09-14). See GET /api/jtbds/event-driven-agent-jobs + GET /api/methodology.","citePath":"/api/jtbds/event-driven-agent-jobs"},"recommendation":{"mode":"free_only","use":[{"id":"hatchet","name":"Hatchet","kind":"dev_tool","cost":"oss","substitutable":true,"sourceUrl":"https://raw.githubusercontent.com/hatchet-dev/hatchet/main/LICENSE"},{"id":"upstash-qstash-free","name":"Upstash QStash Free plan","kind":"free_queue","cost":"free","substitutable":true,"sourceUrl":"https://upstash.com/pricing/qstash"}],"gap":null,"creditsNotFree":[],"doesNotPromotePaidSku":true}},{"jtbdId":"langgraph-deploy","decide":{"available":true,"unavailableReason":null,"providerId":"langgraph-cloud","scoreAsOf":"2026-09-14","scoreAgeDays":43,"scoreStale":true,"runnerUpId":"langsmith","cite":"Depot Pick for langgraph-deploy: langgraph-cloud (asOf 2026-09-14). See GET /api/jtbds/langgraph-deploy + GET /api/methodology.","citePath":"/api/jtbds/langgraph-deploy"},"quote":{"available":true,"unavailableReason":null,"cheapest":null,"recommendedWorkloadQuote":null,"representativeQuote":null,"estimatedTaskCost":null,"reason":"Nothing was compared. no comparable sourced unit for this job; chat input $/1M and other units were not borrowed pickIsPriceWinner is null.","priceWinnerNote":"Nothing was compared. no comparable sourced unit for this job; chat input $/1M and other units were not borrowed pickIsPriceWinner is null."},"pickIsNotPriceWinner":false,"freeResources":[],"freeMatch":"none","paidPick":{"available":true,"unavailableReason":null,"providerId":"langgraph-cloud","scoreAsOf":"2026-09-14","scoreAgeDays":43,"scoreStale":true,"runnerUpId":"langsmith","cite":"Depot Pick for langgraph-deploy: langgraph-cloud (asOf 2026-09-14). See GET /api/jtbds/langgraph-deploy + GET /api/methodology.","citePath":"/api/jtbds/langgraph-deploy"},"recommendation":{"mode":"free_only","use":[],"gap":"no_free_resource_for_job","creditsNotFree":[],"doesNotPromotePaidSku":true}},{"jtbdId":"ray-distributed-agents","decide":{"available":true,"unavailableReason":null,"providerId":"anyscale","scoreAsOf":"2026-09-14","scoreAgeDays":43,"scoreStale":true,"runnerUpId":"modal","cite":"Depot Pick for ray-distributed-agents: anyscale (asOf 2026-09-14). See GET /api/jtbds/ray-distributed-agents + GET /api/methodology.","citePath":"/api/jtbds/ray-distributed-agents"},"quote":{"available":true,"unavailableReason":null,"cheapest":null,"recommendedWorkloadQuote":null,"representativeQuote":null,"estimatedTaskCost":null,"reason":"Nothing was compared. no comparable sourced unit for this job; chat input $/1M and other units were not borrowed pickIsPriceWinner is null.","priceWinnerNote":"Nothing was compared. no comparable sourced unit for this job; chat input $/1M and other units were not borrowed pickIsPriceWinner is null."},"pickIsNotPriceWinner":false,"freeResources":[{"id":"ray","name":"Ray","kind":"dev_tool","cost":"oss","substitutable":true,"sourceUrl":"https://raw.githubusercontent.com/ray-project/ray/master/LICENSE"}],"freeMatch":"jtbd","paidPick":{"available":true,"unavailableReason":null,"providerId":"anyscale","scoreAsOf":"2026-09-14","scoreAgeDays":43,"scoreStale":true,"runnerUpId":"modal","cite":"Depot Pick for ray-distributed-agents: anyscale (asOf 2026-09-14). See GET /api/jtbds/ray-distributed-agents + GET /api/methodology.","citePath":"/api/jtbds/ray-distributed-agents"},"recommendation":{"mode":"free_only","use":[{"id":"ray","name":"Ray","kind":"dev_tool","cost":"oss","substitutable":true,"sourceUrl":"https://raw.githubusercontent.com/ray-project/ray/master/LICENSE"}],"gap":null,"creditsNotFree":[],"doesNotPromotePaidSku":true}},{"jtbdId":"a2a-agent-discovery","decide":{"available":true,"unavailableReason":null,"providerId":"aws-agent-registry","scoreAsOf":"2026-09-14","scoreAgeDays":43,"scoreStale":true,"runnerUpId":"google-agent-registry","cite":"Depot Pick for a2a-agent-discovery: aws-agent-registry (asOf 2026-09-14). See GET /api/jtbds/a2a-agent-discovery + GET /api/methodology.","citePath":"/api/jtbds/a2a-agent-discovery"},"quote":{"available":true,"unavailableReason":null,"cheapest":null,"recommendedWorkloadQuote":null,"representativeQuote":null,"estimatedTaskCost":null,"reason":"Nothing was compared. no comparable sourced unit for this job; chat input $/1M and other units were not borrowed pickIsPriceWinner is null.","priceWinnerNote":"Nothing was compared. no comparable sourced unit for this job; chat input $/1M and other units were not borrowed pickIsPriceWinner is null."},"pickIsNotPriceWinner":false,"freeResources":[],"freeMatch":"none","paidPick":{"available":true,"unavailableReason":null,"providerId":"aws-agent-registry","scoreAsOf":"2026-09-14","scoreAgeDays":43,"scoreStale":true,"runnerUpId":"google-agent-registry","cite":"Depot Pick for a2a-agent-discovery: aws-agent-registry (asOf 2026-09-14). See GET /api/jtbds/a2a-agent-discovery + GET /api/methodology.","citePath":"/api/jtbds/a2a-agent-discovery"},"recommendation":{"mode":"free_only","use":[],"gap":"no_free_resource_for_job","creditsNotFree":[],"doesNotPromotePaidSku":true}},{"jtbdId":"agent-tool-router","decide":{"available":true,"unavailableReason":null,"providerId":"composio","scoreAsOf":"2026-10-19","scoreAgeDays":8,"scoreStale":false,"runnerUpId":"browserbase","cite":"Depot Pick for agent-tool-router: composio (asOf 2026-10-19). See GET /api/jtbds/agent-tool-router + GET /api/methodology.","citePath":"/api/jtbds/agent-tool-router"},"quote":{"available":true,"unavailableReason":null,"cheapest":null,"recommendedWorkloadQuote":{"providerId":"composio","providerName":"Composio","skuId":"composio-hobby","item":"Hobby","plan":"Hobby — Hard-capped","unit":"usd_per_month","amountUsd":0,"outputSkuId":null,"outputItem":null,"outputAmountUsd":null,"outputUnit":null,"sourceUrl":"https://composio.dev/pricing","asOf":"2026-10-03","pricingLastVerifiedAt":"2026-10-27","isFlagshipForJob":false,"differsFromFloorCheapest":false,"representativeQuote":{"skuId":"composio-hobby","item":"Hobby","plan":"Hobby — Hard-capped","amountUsd":0,"inputOrUnitUsd":0,"unit":"usd_per_month","outputUsd":null,"outputUnit":null,"sourceUrl":"https://composio.dev/pricing","asOf":"2026-10-03"},"estimatedTaskCost":{"tasks":1000,"retryAndToolOverheadMultiplier":1.15,"retryToolOverheadMultiplier":1.15,"unitsPerTask":1,"baseCostPer1kTasksUsd":0,"totalUsd":0,"estimatedTotalUsd":0,"perTaskUsd":0,"estimatedCostPerTaskUsd":0,"formula":"Monthly base plan $0/mo covering 1,000 tasks (1.15x overhead buffer)","assumptions":"Monthly subscription plan amortized over 1,000 tasks/month."}},"representativeQuote":{"skuId":"composio-hobby","item":"Hobby","plan":"Hobby — Hard-capped","amountUsd":0,"inputOrUnitUsd":0,"unit":"usd_per_month","outputUsd":null,"outputUnit":null,"sourceUrl":"https://composio.dev/pricing","asOf":"2026-10-03"},"estimatedTaskCost":{"tasks":1000,"retryAndToolOverheadMultiplier":1.15,"retryToolOverheadMultiplier":1.15,"unitsPerTask":1,"baseCostPer1kTasksUsd":0,"totalUsd":0,"estimatedTotalUsd":0,"perTaskUsd":0,"estimatedCostPerTaskUsd":0,"formula":"Monthly base plan $0/mo covering 1,000 tasks (1.15x overhead buffer)","assumptions":"Monthly subscription plan amortized over 1,000 tasks/month."},"reason":"Nothing was compared. no comparable sourced unit for this job; chat input $/1M and other units were not borrowed pickIsPriceWinner is null.","priceWinnerNote":"Nothing was compared. no comparable sourced unit for this job; chat input $/1M and other units were not borrowed pickIsPriceWinner is null."},"pickIsNotPriceWinner":false,"freeResources":[{"id":"composio-sdk","name":"Composio SDK","kind":"dev_tool","cost":"oss","substitutable":true,"sourceUrl":"https://raw.githubusercontent.com/ComposioHQ/composio/master/LICENSE"}],"freeMatch":"jtbd","paidPick":{"available":true,"unavailableReason":null,"providerId":"composio","scoreAsOf":"2026-10-19","scoreAgeDays":8,"scoreStale":false,"runnerUpId":"browserbase","cite":"Depot Pick for agent-tool-router: composio (asOf 2026-10-19). See GET /api/jtbds/agent-tool-router + GET /api/methodology.","citePath":"/api/jtbds/agent-tool-router"},"recommendation":{"mode":"free_only","use":[{"id":"composio-sdk","name":"Composio SDK","kind":"dev_tool","cost":"oss","substitutable":true,"sourceUrl":"https://raw.githubusercontent.com/ComposioHQ/composio/master/LICENSE"}],"gap":null,"creditsNotFree":[],"doesNotPromotePaidSku":true}}],"failures":[{"id":"inter-agent-misalignment","name":"Inter-agent misalignment","detection":"Log the assigned subtask next to the worker's stated result. The lead rejects a result that does not match the assignment."},{"id":"tool-loop","name":"Tool loop","detection":"Hash the last several tool names and arguments. Stop when the same call repeats and the observation did not change. Cap tool calls per task."},{"id":"runaway-spend","name":"Runaway spend","detection":"Set a budget and a tool-call cap per task. Alert when spend jumps. Stop the run at the cap instead of summarizing a partial trace as success."},{"id":"identity-confusion","name":"Identity confusion","detection":"Bind every tool call to a user or tenant id. Refuse the call if that id changed mid-task. For a public bot, the operator owns the words the bot shows."},{"id":"partial-tool-success","name":"Partial tool success","detection":"Require a per-item status and a failure count. Success for the task requires the failed count to be zero or explicitly handed to a retry queue."},{"id":"weak-verification","name":"Weak verification","detection":"Success requires an end-state check the agent does not grade for itself: tests, a database diff, or a separate judge that cannot see the gold label."},{"id":"instruction-drift","name":"Instruction drift","detection":"Restate the stop condition in the trace. End the run when it is met. Review long traces for steps that do not serve the original task."},{"id":"hallucinated-tool-args","name":"Hallucinated tool arguments","detection":"Reject a call that fails the current schema or names an unknown id, and do that before the tool runs a side effect."},{"id":"observability-gap","name":"Observability gap","detection":"Alert on a drop in trace ingestion and on certificate expiry for the trace host. Do not treat a missing trace as a successful quiet run."}],"failuresOmittedBecauseMissing":[],"caseStudies":[{"id":"anthropic-building-effective-agents-2024","title":"Building effective agents","sourceUrl":"https://www.anthropic.com/engineering/building-effective-agents","year":2024,"studyKind":"vendor_writeup"},{"id":"anthropic-multi-agent-research-2025","title":"How we built our multi-agent research system","sourceUrl":"https://www.anthropic.com/engineering/built-multi-agent-research-system","year":2025,"studyKind":"vendor_writeup"},{"id":"the-agent-company-2025","title":"TheAgentCompany: Benchmarking LLM Agents on Consequential Real World Tasks","sourceUrl":"https://arxiv.org/abs/2412.14161","year":2025,"studyKind":"capability_ceiling"}],"caseStudiesRelated":4,"caseStudiesOmitted":1,"caseStudiesReason":null,"links":{"kit":"/api/kit?class=orchestrator&cost=free","page":"/agents/kit/orchestrator?cost=free","agentClass":"/api/agent-classes/orchestrator","failures":"/api/failures","caseStudies":"/api/case-studies?class=orchestrator"},"recommendation":{"mode":"free_only","doesNotPromotePaidSku":true,"use":[{"jtbdId":"durable-agent-workflows","paidPick":{"available":true,"unavailableReason":null,"providerId":"temporal-cloud","scoreAsOf":"2026-09-14","scoreAgeDays":43,"scoreStale":true,"runnerUpId":"inngest","cite":"Depot Pick for durable-agent-workflows: temporal-cloud (asOf 2026-09-14). See GET /api/jtbds/durable-agent-workflows + GET /api/methodology.","citePath":"/api/jtbds/durable-agent-workflows"},"use":[{"id":"langgraph","name":"LangGraph","kind":"dev_tool","cost":"oss","substitutable":true,"sourceUrl":"https://raw.githubusercontent.com/langchain-ai/langgraph/main/LICENSE"}],"gap":null,"creditsNotFree":[]},{"jtbdId":"event-driven-agent-jobs","paidPick":{"available":true,"unavailableReason":null,"providerId":"inngest","scoreAsOf":"2026-09-14","scoreAgeDays":43,"scoreStale":true,"runnerUpId":"trigger-dev","cite":"Depot Pick for event-driven-agent-jobs: inngest (asOf 2026-09-14). See GET /api/jtbds/event-driven-agent-jobs + GET /api/methodology.","citePath":"/api/jtbds/event-driven-agent-jobs"},"use":[{"id":"hatchet","name":"Hatchet","kind":"dev_tool","cost":"oss","substitutable":true,"sourceUrl":"https://raw.githubusercontent.com/hatchet-dev/hatchet/main/LICENSE"},{"id":"upstash-qstash-free","name":"Upstash QStash Free plan","kind":"free_queue","cost":"free","substitutable":true,"sourceUrl":"https://upstash.com/pricing/qstash"}],"gap":null,"creditsNotFree":[]},{"jtbdId":"langgraph-deploy","paidPick":{"available":true,"unavailableReason":null,"providerId":"langgraph-cloud","scoreAsOf":"2026-09-14","scoreAgeDays":43,"scoreStale":true,"runnerUpId":"langsmith","cite":"Depot Pick for langgraph-deploy: langgraph-cloud (asOf 2026-09-14). See GET /api/jtbds/langgraph-deploy + GET /api/methodology.","citePath":"/api/jtbds/langgraph-deploy"},"use":[],"gap":"no_free_resource_for_job","creditsNotFree":[]},{"jtbdId":"ray-distributed-agents","paidPick":{"available":true,"unavailableReason":null,"providerId":"anyscale","scoreAsOf":"2026-09-14","scoreAgeDays":43,"scoreStale":true,"runnerUpId":"modal","cite":"Depot Pick for ray-distributed-agents: anyscale (asOf 2026-09-14). See GET /api/jtbds/ray-distributed-agents + GET /api/methodology.","citePath":"/api/jtbds/ray-distributed-agents"},"use":[{"id":"ray","name":"Ray","kind":"dev_tool","cost":"oss","substitutable":true,"sourceUrl":"https://raw.githubusercontent.com/ray-project/ray/master/LICENSE"}],"gap":null,"creditsNotFree":[]},{"jtbdId":"a2a-agent-discovery","paidPick":{"available":true,"unavailableReason":null,"providerId":"aws-agent-registry","scoreAsOf":"2026-09-14","scoreAgeDays":43,"scoreStale":true,"runnerUpId":"google-agent-registry","cite":"Depot Pick for a2a-agent-discovery: aws-agent-registry (asOf 2026-09-14). See GET /api/jtbds/a2a-agent-discovery + GET /api/methodology.","citePath":"/api/jtbds/a2a-agent-discovery"},"use":[],"gap":"no_free_resource_for_job","creditsNotFree":[]},{"jtbdId":"agent-tool-router","paidPick":{"available":true,"unavailableReason":null,"providerId":"composio","scoreAsOf":"2026-10-19","scoreAgeDays":8,"scoreStale":false,"runnerUpId":"browserbase","cite":"Depot Pick for agent-tool-router: composio (asOf 2026-10-19). See GET /api/jtbds/agent-tool-router + GET /api/methodology.","citePath":"/api/jtbds/agent-tool-router"},"use":[{"id":"composio-sdk","name":"Composio SDK","kind":"dev_tool","cost":"oss","substitutable":true,"sourceUrl":"https://raw.githubusercontent.com/ComposioHQ/composio/master/LICENSE"}],"gap":null,"creditsNotFree":[]}]},"stackContext":{"host":null,"framework":null,"repo":null,"lang":null,"existing":[],"volume":null,"sender":null,"detectedFromTask":[]},"contextAdvice":[],"firstActions":["https://getagentdepot.com/api/hub","https://getagentdepot.com/api/decide?jtbd=durable-agent-workflows","https://getagentdepot.com/api/quote?jtbd=durable-agent-workflows","https://getagentdepot.com/api/kit?class=orchestrator&cost=free","https://getagentdepot.com/api/failures"],"honesty":["Picks are the current Depot Pick from GET /api/decide. This kit does not rescore.","Cheapest SKU is copied from GET /api/quote for that job. Input and output are not blended. A chat SKU is not borrowed for a non-chat job. If quote.cheapest is null, there is no matching sourced price.","pickIsNotPriceWinner is true only when that job's Depot Pick and cheapest matching SKU both exist and the quote says the pick is not the price winner. If either is missing, the field is false.","freeResources are existing /api/free items whose jtbdIds include that job, up to 3, sorted by id. If none list the job, freeResources is [] and freeMatch is none. Kind, provider, and docs are not fallbacks. Free does not change the pick.","firstActions are endpoint URLs for this class: hub, decide for the first listed need, quote for that need, this kit, and /api/failures. No other step is added.","Failures are the modes already listed on the class. Case studies are the first 3 related studies in catalog order, with the source URL already stored. Omitted studies stay on GET /api/case-studies?class=.","cost=free sets recommendation.mode to free_only. recommendation.use on each need is existing free rows whose jtbd ids include that job, excluding credits_not_free_forever. Those credit rows are listed under creditsNotFree with their stored notes. If none remain, use is [] and gap is no_free_resource_for_job. paidPick is the same decide result and is not free. A cheapest paid SKU is not copied into use."]}