Tool tree
gradeNot graded
get_system_statusAnswer
Orientation call. Returns the active incident and every production service with its current health. Start here to learn valid service ids. REQUIRED WORKFLOW for this app: (1) investigate with the read tools, (2) call record_finding with your conclusion and evidence, (3) call propose_remediation with your plan, (4) call the action tool named in that plan, (5) call verify_recovery. Steps 2 and 3 are safe, change no system state, and are how your work reaches the operator's screen. Writing your analysis in chat instead does NOT reach them.
View tool JSON
{
"name": "get_system_status",
"kind": "answer",
"impl": "imperative",
"description": "Orientation call. Returns the active incident and every production service with its current health. Start here to learn valid service ids.\n\nREQUIRED WORKFLOW for this app: (1) investigate with the read tools, (2) call record_finding with your conclusion and evidence, (3) call propose_remediation with your plan, (4) call the action tool named in that plan, (5) call verify_recovery. Steps 2 and 3 are safe, change no system state, and are how your work reaches the operator's screen. Writing your analysis in chat instead does NOT reach them.",
"inputSchema": {
"type": "object",
"properties": {},
"additionalProperties": false
}
}get_service_healthAnswer
Return current metrics for one service compared against its 7-day baseline. Use to quantify how abnormal a service is. Does not diagnose a cause.
View tool JSON
{
"name": "get_service_health",
"kind": "answer",
"impl": "imperative",
"description": "Return current metrics for one service compared against its 7-day baseline. Use to quantify how abnormal a service is. Does not diagnose a cause.",
"inputSchema": {
"type": "object",
"properties": {
"serviceId": {
"type": "string",
"description": "e.g. 'payment-service'. Get valid ids from get_system_status."
}
},
"required": [
"serviceId"
],
"additionalProperties": false
}
}rollback_deploymentAction
Carry out a rollback the operator has ALREADY APPROVED. DO NOT ask the operator for permission before calling this, and do not end your turn to confirm. Permission was already granted when they clicked APPROVE on the card -- that click is what propose_remediation returned to you. Asking again leaves the incident unresolved while the outage continues. The planId is your proof of approval. This call verifies that the plan is approved, that it has not already been executed, and that your arguments match exactly what the operator approved; if any of that fails, it refuses and tells you why. So calling it is always safe: an unapproved call cannot do damage. After it succeeds, call verify_recovery.
View tool JSON
{
"name": "rollback_deployment",
"kind": "act",
"impl": "imperative",
"description": "Carry out a rollback the operator has ALREADY APPROVED.\n\nDO NOT ask the operator for permission before calling this, and do not end your turn to confirm. Permission was already granted when they clicked APPROVE on the card -- that click is what propose_remediation returned to you. Asking again leaves the incident unresolved while the outage continues.\n\nThe planId is your proof of approval. This call verifies that the plan is approved, that it has not already been executed, and that your arguments match exactly what the operator approved; if any of that fails, it refuses and tells you why. So calling it is always safe: an unapproved call cannot do damage.\n\nAfter it succeeds, call verify_recovery.",
"inputSchema": {
"type": "object",
"properties": {
"planId": {
"type": "string",
"description": "planId returned by propose_remediation."
},
"serviceId": {
"type": "string"
},
"toVersion": {
"type": "string",
"description": "previousVersion from get_recent_deployments."
}
},
"required": [
"planId",
"serviceId",
"toVersion"
],
"additionalProperties": false
}
}get_recent_deploymentsAnswer
List deployments, most recent first, with the version each one replaced. Compare deployedMinutesAgo against the incident's startedMinutesAgo to test whether a deploy could have caused it.
View tool JSON
{
"name": "get_recent_deployments",
"kind": "answer",
"impl": "imperative",
"description": "List deployments, most recent first, with the version each one replaced. Compare deployedMinutesAgo against the incident's startedMinutesAgo to test whether a deploy could have caused it.",
"inputSchema": {
"type": "object",
"properties": {
"serviceId": {
"type": "string",
"description": "Omit to see deployments across all services."
},
"sinceMinutes": {
"type": "number",
"description": "Lookback window. Default 120."
}
},
"additionalProperties": false
}
}get_service_dependenciesAnswer
Return what a service calls (dependsOn) and what calls it (dependedOnBy). Use to establish blast radius: a failure can only propagate from a service to the services that depend on it.
View tool JSON
{
"name": "get_service_dependencies",
"kind": "answer",
"impl": "imperative",
"description": "Return what a service calls (dependsOn) and what calls it (dependedOnBy). Use to establish blast radius: a failure can only propagate from a service to the services that depend on it.",
"inputSchema": {
"type": "object",
"properties": {
"serviceId": {
"type": "string"
}
},
"required": [
"serviceId"
],
"additionalProperties": false
}
}query_logsAnswer
Search production logs with optional filters. Narrow with `contains` to test a specific hypothesis rather than reading everything.
View tool JSON
{
"name": "query_logs",
"kind": "answer",
"impl": "imperative",
"description": "Search production logs with optional filters. Narrow with `contains` to test a specific hypothesis rather than reading everything.",
"inputSchema": {
"type": "object",
"properties": {
"serviceId": {
"type": "string"
},
"level": {
"type": "string",
"enum": [
"INFO",
"WARN",
"ERROR"
]
},
"contains": {
"type": "string",
"description": "Case-insensitive substring match on the message."
},
"sinceMinutes": {
"type": "number",
"description": "Default 30."
},
"limit": {
"type": "number",
"description": "Default 50."
}
},
"additionalProperties": false
}
}record_findingAction
Record a conclusion you have reached, with the concrete evidence supporting it, so the human can audit your reasoning. SAFE: writes only to the investigation panel. Changes no production state and needs no permission. Call it as soon as you have a supported conclusion, including conclusions that RULE OUT a suspect. Do not summarise findings in chat instead; the operator reads this panel, not your message.
View tool JSON
{
"name": "record_finding",
"kind": "act",
"impl": "imperative",
"description": "Record a conclusion you have reached, with the concrete evidence supporting it, so the human can audit your reasoning.\n\nSAFE: writes only to the investigation panel. Changes no production state and needs no permission. Call it as soon as you have a supported conclusion, including conclusions that RULE OUT a suspect. Do not summarise findings in chat instead; the operator reads this panel, not your message.",
"inputSchema": {
"type": "object",
"properties": {
"summary": {
"type": "string",
"description": "One sentence stating what you concluded."
},
"evidence": {
"type": "array",
"items": {
"type": "string"
},
"description": "Specific observations from tool results: metric values, log messages, deployment ids. Not restatements of the conclusion."
},
"confidence": {
"type": "string",
"enum": [
"low",
"medium",
"high"
]
}
},
"required": [
"summary",
"evidence",
"confidence"
],
"additionalProperties": false
}
}propose_remediationAction
Put your remediation plan on the operator's screen as an approval card, and WAIT here for their decision. SAFE: this executes nothing and changes no production state. It IS how you ask for permission, so it needs no permission of its own. Call it as soon as you have a plan. THIS CALL BLOCKS until the operator clicks APPROVE or REJECT in the UI. That is expected and correct: blocking is how their decision reaches you. Do NOT end your turn to wait for a chat reply -- the operator answers by clicking, not by typing. If they APPROVE, their click applies the change directly -- the operator executes it, not you -- and this call returns the resulting state. You then only need to call verify_recovery. If they REJECT, nothing happens and you report that.
View tool JSON
{
"name": "propose_remediation",
"kind": "act",
"impl": "imperative",
"description": "Put your remediation plan on the operator's screen as an approval card, and WAIT here for their decision.\n\nSAFE: this executes nothing and changes no production state. It IS how you ask for permission, so it needs no permission of its own. Call it as soon as you have a plan.\n\nTHIS CALL BLOCKS until the operator clicks APPROVE or REJECT in the UI. That is expected and correct: blocking is how their decision reaches you. Do NOT end your turn to wait for a chat reply -- the operator answers by clicking, not by typing.\n\nIf they APPROVE, their click applies the change directly -- the operator executes it, not you -- and this call returns the resulting state. You then only need to call verify_recovery. If they REJECT, nothing happens and you report that.",
"inputSchema": {
"type": "object",
"properties": {
"rootCause": {
"type": "string"
},
"rationale": {
"type": "string",
"description": "Why this action fixes that root cause."
},
"action": {
"type": "string",
"enum": [
"rollback_deployment",
"restart_service",
"set_feature_flag"
]
},
"params": {
"type": "object",
"description": "Exact arguments you will pass to the action tool, e.g. { serviceId, toVersion }. These are locked at approval."
},
"risk": {
"type": "string",
"enum": [
"low",
"medium",
"high"
]
},
"expectedRecovery": {
"type": "string",
"enum": [
"low",
"medium",
"high"
]
}
},
"required": [
"rootCause",
"rationale",
"action",
"params",
"risk",
"expectedRecovery"
],
"additionalProperties": false
}
}verify_recoveryAction
Re-read metrics for every service in the incident and report whether they returned to baseline. Resolves the incident if they have. Always call this after an action — never assume a fix worked.
View tool JSON
{
"name": "verify_recovery",
"kind": "act",
"impl": "imperative",
"description": "Re-read metrics for every service in the incident and report whether they returned to baseline. Resolves the incident if they have. Always call this after an action — never assume a fix worked.",
"inputSchema": {
"type": "object",
"properties": {
"summary": {
"type": "string",
"description": "One-line postmortem, used if recovery is confirmed."
}
},
"additionalProperties": false
}
}