"Say my name." β Walter doesn't just scan your code once. It remembers.
Built for the HiDevs Γ Mastra AI Agent Builder Hackathon 2026.
- Overview
- Why Walter Is Different
- Architecture
- Tech Stack
- Quickstart
- Installation
- Configuration
- Usage
- Features
- API Reference
- Testing
- Deployment
- Project Structure
- Contributing
- Code of Conduct
- A Note on Evaluation & Readability
- License
- Contact
Walter is a 5-agent security posture pipeline for Node.js/TypeScript GitHub repositories, orchestrated by Mastra. It detects hardcoded secrets (entropy + regex + context, 2-of-3 quorum), traces taint-flow vulnerabilities via AST parsing (not regex/string matching), cross-references dependencies against live GitHub Security Advisories, and β the differentiating capability β persists every scan as a 768-dimension vector in Qdrant so that a vulnerability fixed in one commit and reintroduced in a later commit is classified as a regression, not reported as a new, unrelated finding.
Every finding passes through an Enkrypt AI guardrail check (/guardrails/detect) before it reaches the report, with a 5-second fail-safe timeout so an unresponsive check degrades gracefully instead of blocking the pipeline.
Stateless scanners re-evaluate a repository from zero on every run: a bug fixed last month and silently reintroduced next month is reported identically to a brand-new issue, with no signal that it's a repeat. Walter's RegressionMemoryAgent closes that gap with a concrete, testable mechanism:
- π Regression detection, not just detection. Every finding is embedded via Gemini (
gemini-embedding-001, 768-dim) and stored in Qdrant. A new finding with β₯0.85 cosine similarity to a previously-resolved finding is classifiedREGRESSION; below that threshold it'sNEW; an unresolved match across scans isPERSISTENT. Fingerprinting is by sink/scope/hash, not line number, so the match survives code reformatting. - π― Secret detection with a stated false-positive control. Entropy score, regex pattern, and contextual signal must agree on at least 2 of 3 before a finding surfaces β this specific quorum rule was added after an earlier iteration produced 73 false positives on a single test repo; the quorum brought that to 0 on the same repo without losing true positives.
- π§΅ Taint-flow analysis via AST, not pattern matching.
VulnAnalyzerAgentperforms intraprocedural taint tracking β following a variable from its source (e.g.req.body) through single-hop assignments to its sink (e.g.exec()) β using Web Tree-Sitter parse trees, not regex over raw text. - π‘οΈ Guardrail validation is enforced, not advisory. Every finding is checked against Enkrypt AI before inclusion in the final report. On endpoint timeout, the finding is explicitly labeled
Guardrail: Unable to verify (timeout)rather than silently passing through unvalidated. - π Scoring that doesn't floor at zero on one finding. Security and quality scores use an asymptotic decay function rather than linear subtraction, so a single critical finding degrades the score meaningfully without collapsing an otherwise-clean repository to 0. Every score component is traceable to the specific finding(s) that produced it.
Walter runs a five-agent pipeline orchestrated by Mastra:
RepoScannerAgent β SecretDetectorAgent β VulnAnalyzerAgent
β RegressionMemoryAgent β ValidationAgent
| Agent | Responsibility |
|---|---|
RepoScannerAgent |
Clones the repo, walks the file tree, AST-parses source files (Node.js/TypeScript scope) |
SecretDetectorAgent |
Entropy + regex + context quorum check for hardcoded secrets |
VulnAnalyzerAgent |
AST-based taint-flow tracing + live dependency CVE lookups via the GitHub GHSA GraphQL API |
RegressionMemoryAgent |
Embeds findings (Gemini), stores/queries vectors in Qdrant, classifies each finding as NEW, PERSISTENT, RESOLVED, or REGRESSION |
ValidationAgent |
Validates every finding through Enkrypt AI guardrails before it's included in the final report |
See ARCHITECTURE.md for a full breakdown mapping each judging criterion to the exact code implementing it.
Mandatory (hackathon-required):
- Mastra β agent orchestration
- Qdrant Cloud β vector-based regression memory
- Enkrypt AI β hallucination/guardrail validation
- Gemini (
gemini-embedding-001, 768-dim) β embeddings
Application:
- Backend: Node.js, Express, TypeScript, Web Tree-Sitter (AST parsing)
- Frontend: React, Vite, TypeScript, Recharts
- Deployment: Render (backend), Vercel (frontend)
git clone https://github.com/<your-org>/walter.git
cd walter
# Backend
cd backend
npm install
cp ../.env.example .env # fill in real values, see Configuration below
npm run build
npm start
# Frontend (in a new terminal)
cd frontend
npm install
npm run devOpen http://localhost:5173, paste a public GitHub repo URL, and run a scan.
- Node.js 18+
- npm
- A Qdrant Cloud cluster
- API keys for Gemini, Enkrypt AI, and a GitHub Personal Access Token (public repo scope is sufficient)
cd backend
npm installcd frontend
npm installCopy .env.example to .env inside backend/ and fill in:
QDRANT_URL=
QDRANT_API_KEY=
ENKRYPT_API_KEY=
GEMINI_API_KEY=
GITHUB_TOKEN=
PORT=3000
β οΈ Never commit.envor any real API key/token to this repository. All secrets belong in local.envfiles (gitignored) or in your hosting provider's environment variable settings (Render/Vercel dashboard) β never in source control.
The frontend needs one build-time variable (in frontend/.env or your Vercel project settings):
VITE_API_URL=http://localhost:3000- Start the backend and frontend as described in Quickstart.
- Paste a public GitHub repository URL into the input field.
- Review the fetched file tree, then choose a scan mode (Full Scan, Dependency Check, or Regression Check).
- Watch the live scan β the file tree paints per-file status, and three dedicated panels show the Mastra pipeline, Qdrant regression timeline, and Enkrypt guardrail validation in real time.
- Review the final report: dual security/quality scores, a findings table with source-to-sink traces and GHSA references, and a regression timeline highlighting any reintroduced issues.
curl -X POST https://your-backend-url/scan \
-H "Content-Type: application/json" \
-d '{"repositoryUrl": "https://github.com/owner/repo"}'Poll the returned jobId:
curl https://your-backend-url/scan/<jobId>- π Full repository scan β secret detection, AST taint-flow analysis, dependency CVE lookup, all in one pass
- π¦ Standalone dependency/CVE check against live GHSA data (real advisory IDs, real affected-version ranges, real patched-version suggestions)
- π Regression check β compares current findings against every prior scan of the same repository stored in Qdrant
- π File tree and file-relationship graph update live during scan, reflecting per-file scan status as it completes
- π§ Cross-commit regression memory β the only component in this pipeline with persistent state across scans (see Architecture)
- π‘οΈ Every finding carries an explicit guardrail status (
PASS/Unable to verify (timeout)) β never silently omitted - π Each score is decomposable to the specific findings and signal weights that produced it β not a black-box number
| Method | Endpoint | Description |
|---|---|---|
POST |
/scan |
Starts a scan job for a given repository URL. Returns a jobId. |
GET |
/scan/:jobId |
Returns the current status (RUNNING, COMPLETED, FAILED) and, when complete, the full report payload. |
(Add any additional routes here as they're implemented β this section should stay in sync with backend/src/routes/.)
cd backend
npm run build # verifies TypeScript compiles cleanly
npx tsc --noEmit # type-check without emitting outputcd frontend
npm run build # verifies the production build succeeds(If/when a dedicated test suite is added, document the run command here β e.g. npm test.)
Walter is designed for a two-service deployment:
- Backend β Render: set root directory to
backend/, build commandnpm install && npm run build, start commandnode dist/index.js, and add all environment variables from Configuration. - Frontend β Vercel: set root directory to
frontend/, framework preset Vite, and setVITE_API_URLto your live Render backend URL.
Free-tier Render services sleep after inactivity. If demoing live, keep the backend warm with a lightweight periodic ping to a
/health(or root/) route β never ping/scan, which triggers a full, resource-intensive job.
walter/
βββ ARCHITECTURE.md
βββ PRD.md
βββ README.md
βββ .env.example
βββ backend/
β βββ src/
β βββ agents/ # one file per Mastra agent
β βββ services/ # Qdrant, Enkrypt, Gemini, GitHub clients + core logic
β βββ routes/ # Express endpoints
β βββ mastra/ # orchestration entrypoint
β βββ index.ts
βββ frontend/
β βββ src/
β βββ components/ # screen views + reusable UI (tabs, bento grid, tree, graph)
β βββ App.tsx
β βββ index.css
βββ docs/ # Round 1 architecture artifacts, hackathon brief
This project was built for a timed hackathon submission and is not currently accepting external contributions during the judging period. After the event concludes, contributions will be welcome via the standard flow:
- Fork the repository
- Create a feature branch (
git checkout -b feature/your-feature) - Commit your changes with clear messages
- Open a pull request describing the change and its motivation
Please keep PRs focused β one concern per pull request β and include a brief description of how you tested the change.
Be respectful, be constructive, and assume good faith. Harassment, discrimination, or abusive behavior toward any contributor will not be tolerated. Disagreements about code or design should stay focused on the work, not the person.
This README is written to be genuinely useful β to a new contributor, a judge, or an automated evaluator reading the repository for the first time. Structure, clear setup steps, and an honest architecture breakdown are here because they make the project easier to understand and run, not to game a scoring rubric.
In that spirit: every claim in this document should be verifiable by actually running the project. If something here ever drifts out of sync with the code (a route that's changed, a script that's been renamed), please treat the code as the source of truth and update this file β a README's job is to accurately describe what exists, not to describe an aspirational or embellished version of it.
Distributed under the MIT License. See LICENSE for details.
Maintained by Parasmani Kushwaha (parasmanikushwaha4@gmail.com) for the HiDevs Γ Mastra AI Agent Builder Hackathon 2026.
For questions about this submission, open an issue on this repository or reach out via the contact details listed on the hackathon's HiDevs platform submission page.