Inspiration

In modern DevOps, alert fatigue is a massive problem. When a critical CI/CD pipeline fails or a bad commit is pushed, Slack notifications and automated emails easily get lost in the noise—especially at 2 AM. We realized that while text-based alerts are easy to ignore, a physical phone call is not. However, we didn't just want a bot that plays a recorded beep; we wanted an intelligent agent that could bridge the gap between the physical world and GitOps. We built CallAction to not only wake up the engineer but to capture their immediate operational decision and inject it right back into the GitHub workflow.

What it does

CallAction is a highly portable, open-source GitHub Action. When dropped into a repository's workflow, it acts as a last-line-of-defense escalation tool.

If a CI pipeline fails, CallAction halts the workflow and places a live, consent-first CALL-E phone call to the designated on-call engineer. It discloses that it is an AI, provides the context of the failure (Run ID, PR context), and asks the engineer for a directive.

Using CALL-E's structured result extraction, it categorizes the engineer's spoken response into a strict decision (revert, escalate, or will_fix), summarizes their notes, and posts a formatted, redacted escalation report directly as a comment on the triggering GitHub Pull Request.

How we built it

We built CallAction using TypeScript, the @call-e/calle SDK, and the @actions/github toolkit.

Because GitHub Actions runners execute code in a pristine environment without running npm install, we utilized esbuild to compile our TypeScript and all external SDKs into a single, zero-dependency dist/index.js file targeted for Node 20.

Instead of building a separate web server to handle webhooks, we leveraged CALL-E's powerful createAndWait polling mechanism. This allowed the entire voice interaction, transcription, and structured JSON extraction to happen synchronously inside the lifecycle of the GitHub Actions runner.

Challenges we ran into

Building an open-source AI calling tool requires extreme care regarding security and abuse prevention. We submitted this to the official awesome-phone-call-agents repository, which enforces incredibly strict safety guidelines. We had to solve several major architectural challenges:

  1. Idempotency & Call Spam: CI pipelines retry often. We had to ensure a re-run didn't spam the engineer with duplicate calls. We solved this by deriving a stable idempotencyKey from github.run_id.
  2. Fail-Closed Dispositions: What if the call hits voicemail? What if the engineer hangs up? We engineered a strict fail-closed state machine. If the call status isn't completed or the AI's confidence is low, it defaults to a needs_human status and fails the pipeline, never guessing the outcome.
  3. Data Leakage & XSS: We had to aggressively sanitize inputs and outputs. If a user provided a malformed phone number, we had to ensure the raw input wasn't echoed into public GitHub logs. Furthermore, we wrote regex redaction (redactPhoneLike) to scrub any phone numbers the LLM might have hallucinated or transcribed into the engineer_notes before posting to GitHub.

Accomplishments that we're proud of

We are incredibly proud that CallAction meets the rigorous, production-grade security standards of the official CALL-E community repository. We successfully implemented a preview-by-default mode with a strict authorize_live_call_to authorization gate, ensuring this tool is safe for any open-source developer to install without fear of accidental rogue dialers.

What we learned

We learned a massive amount about module resolution in modern Node/TypeScript (navigating the transition from CommonJS to ESM bundling). More importantly, we learned how to design "Fail-Closed" AI workflows. When dealing with physical telephony and CI/CD pipelines, you cannot rely on LLM improvisation; you must constrain the AI to strict JSON schemas and gracefully degrade to human review the moment ambiguity is detected.

What's next for CallAction

Currently, the on-call phone number is stored as a static GitHub Secret. The next major feature for CallAction will be integrating with the PagerDuty or Opsgenie APIs. This will allow the GitHub Action to dynamically query who is currently on schedule and route the CALL-E escalation to the correct engineer automatically!

Built With

  • call-e
Share this project:

Updates

Submission history