Inspiration
An incident commander should not change a service because someone typed "approve." Fleet Commander is the board for that decision. The product on screen is FleetOps. A person declares what happened, reads the suggested fix, and writes why they are approving, rejecting, or overriding it. Nothing runs until that reason is there.
The fleet in this demo is a scenario simulator, not a customer's live metrics, logs, or traces. The board says that on every reply.
What it does
Reset scene opens on three incidents: payment-service, vault-secrets-manager, and ingress-nginx-controller. Simulate chaos degrades the next healthy service in the catalog. A muted service is skipped.
Open is the decision list. Alerts is that same incident with the rule and the suggested action. Fleet is the healthy services, grouped by layer. Declare is on a healthy service: you file the title, the security level, and what happened. Notes, links, and attributes are kept when you add them. The catalog fault stays underneath.
Overview, Timeline, and Dashboard are the three views of one incident. Ask "what's wrong with payments?" in the box, or press Talk about this. The microphone uses the same path. The reply is Situation, Insight, Knowledge, and the token budget. Every turn is kept in the command record.
You can hand FleetOps a repository path or a git URL. It reads that repo and does not install or edit until you approve.
Approve runs the suggested fix and marks the service healthy. Reject leaves it open as triage and keeps your reason. Override picks a different action and target, and nothing runs until Execute. All three stay disabled until the Why field is filled in.
How we built it
The board is a Next.js app. It talks to one FastAPI agent. That agent is also an MCP server on protocol 2025-11-25.
The public MCP tools are read-only:
get_fleetget_service_statusverify_recoverylist_incidentsget_timelineget_alert
Declaring an incident, muting a service, and approve, reject, or override stay on the agent routes. The operator chooses a catalog service and files a title, a security level (SEV-1, SEV-2, or SEV-3), and the incident details.
SEV-1 is an error rate at or above 20%, or a critical failure. SEV-2 is at or above 5%. Anything else open is SEV-3. A rising rate is labeled "approaching SEV-2." The dashboard groups the fleet by the simulator's layers.
A discussion reply is split into Situation, Insight, Knowledge, and a token budget capped at 40 model calls. The AWS strip shows the last Bedrock result, whether the CloudWatch log group exists, and the App Runner host.
Challenges we ran into
Amazon Bedrock is the reasoning path. This account returns Error 002, "Access to Bedrock models is not allowed for this account," so InvokeModel is refused. The board still makes the call, and the source stays Scenario fallback. We did not hide that.
Alexa+ partner tools were closed to this hackathon, so the board is the MCP client. Approve and reject are not MCP tools.
Slack and Jira send a notice only when real credentials are configured. They are not configured here, so those notices are idle.
The CloudWatch log group for the hosted agent is /opspilot/traces. That is the group already created in the account. The product name on the board is FleetOps.
Accomplishments that we're proud of
The person owns the change. Approve, reject, and override stay disabled until a Why is written, and that sentence is kept on the incident and on the timeline.
The MCP server speaks protocol 2025-11-25 and stays read-only. Six tools can look at the fleet, the service, the recovery, the incident list, the timeline, and the alert. Declaring, muting, and the decision stay on the agent routes.
The board shows its source. When Amazon Bedrock refuses the call with Error 002, the badge stays Scenario fallback. We still make the InvokeModel call, and we do not replace the refusal with a quieter answer.
Slack and Jira stay quiet unless real credentials are present. They are not present, so the board does not pretend a message was sent.
What we learned
A read-only tool list is easier to trust. The MCP server can look at the fleet, and the person still owns the change. A one-word "approve" is not a decision, so the board keeps the sentence that explains it. When a model call is refused, the useful move is to show the refusal, not to swap in a quieter answer.
What's next for Fleet Commander
Clear Bedrock Error 002 with AWS so InvokeModel can answer. The source badge stays either way: Bedrock when the account allows the call, Scenario fallback when it does not.
Redeploy the agent so the public App Runner URL serves this board. The repository name still says OpsPilot, and that should change before the link goes on this page.
Turn on Slack and Jira only with real workspace credentials. Until those exist, the notices stay idle.
When Alexa+ partner tools are open to this project, the skill should call this same agent. Approve and reject stay off the MCP tool list.
Built With
- amazon
- amazon-web-services
- app
- bedrock
- boto3
- cloudwatch
- context
- fastapi
- model
- next.js
- opentelemetry
- protocol
- pydantic
- python
- react
- runner
- services
- typescript
- web
Log in or sign up for Devpost to join the conversation.