SentinelAI β Backlog
Confidential Β· Living document. Priorities: P0 (MVP must-have), P1 (MVP nice-to-have),
P2 (Phase 2), P3 (later).
Epic A β Browser Extension (MVP primary surface)
| ID |
Priority |
Item |
Notes |
| A1 |
P0 |
MV3 scaffold: manifest, background SW, content script, page-context inject |
Done in scaffold |
| A2 |
P0 |
fetch / XMLHttpRequest hook to intercept outbound prompts pre-send |
Core interception |
| A3 |
P0 |
Prompt extraction per provider (ChatGPT, Claude, Gemini, Copilot, M365) |
Endpoint + body shape map |
| A4 |
P0 |
Bridge page β background β local agent; await decision before send |
|
| A5 |
P0 |
Enforcement UX: allow (silent), warn (coaching overlay + ack), block (overlay) |
|
| A6 |
P1 |
Paste + send-button/Enter secondary hooks |
UX belt-and-suspenders |
| A7 |
P1 |
Popup: status, agent connectivity, recent decisions |
|
| A8 |
P1 |
Fail-safe mode when agent unreachable (fail-open vs fail-closed policy) |
Decision needed |
| A9 |
P1 |
Enterprise force-install policy docs (Chrome/Edge ExtensionInstallForcelist) |
|
| A10 |
P2 |
Firefox port |
|
Epic B β Local Agent (classification + risk brain)
| ID |
Priority |
Item |
Notes |
| B1 |
P0 |
FastAPI service on 127.0.0.1:8787, /classify + /health, CORS for extension |
Done in scaffold |
| B2 |
P0 |
Rules/regex classifier: PII, secrets/API keys, source code, financial, contract |
|
| B3 |
P0 |
Risk engine: sensitivity + destination β 0β100 + decision bands |
|
| B4 |
P1 |
On-device SLM (Ollama, Llama 3.2 3B) as false-positive suppressor + extension toggle |
Done β off by default; see docs/AI.md |
| B4b |
P2 |
Cloud verification option (Lambda β Bedrock) for laptops that can't run a local model |
Interface is provider-agnostic |
| B5 |
P1 |
Best-effort telemetry forwarder to central backend (hash + snippet + metadata) |
|
| B6 |
P1 |
Config file: bands, allow/deny lists, snippet-capture policy |
|
| B7 |
P2 |
Windows service packaging (pywin32) + auto-start |
|
| B8 |
P2 |
Model download/warm-up + health for Ollama |
|
Epic C β Central Platform (serverless: Lambda + DynamoDB)
| ID |
Priority |
Item |
Notes |
| C1 |
P0 |
FastAPI ingest POST /api/events, feed GET /api/events, GET /api/stats |
Done |
| C2 |
P0 |
DynamoDB single-table repository (per-tenant partition) |
Done (repository.py) |
| C2b |
P0 |
FastAPI on Lambda via Mangum + Function URL |
Done (main.py handler) |
| C3 |
P1 |
AuthN/Z for the API + dashboard (SSO + RBAC) |
Clarification #10 β currently open Function URL |
| C4 |
P1 |
Audit-trail export (CSV/JSON) |
|
| C5 |
P1 |
Enforce tenant isolation from auth (derive org_id from session, not client) |
org_id column done; enforcement pending C3 |
| C6 |
P2 |
Stats via GSI / counter items if volume outgrows in-Lambda aggregation |
ADR-002 consequence |
Epic D β Analyst Dashboard (Next.js)
| ID |
Priority |
Item |
Notes |
| D1 |
P0 |
Overview tiles: events, blocks, top risk apps |
Done (static export) |
| D2 |
P0 |
Event feed table with filters (app, decision, category) |
Feed done; UI filters pending |
| D6 |
P1 |
Auth in front of the static dashboard (CloudFront + Cognito/OIDC) |
Ties to C3 |
| D3 |
P1 |
Shadow-AI usage view |
|
| D4 |
P1 |
Risk trends over time |
|
| D5 |
P2 |
Per-user risk profiles |
|
Epic H β AI tailoring (make suppression org/department-aware)
Base Ollama has no knowledge of the org; it judges "familiar to the internet," not "proprietary to
us." Tailoring is authored centrally and pushed to endpoints (laptops run inference only). See
docs/AI.md. Sequenced easiestβheaviest.
| ID |
Priority |
Item |
Notes |
| H1 |
P1 |
Policy context in the judge prompt β per org/department context + proprietary markers (hard "never suppress") + public hints |
Done |
| H2 |
P2 |
Central policy distribution β agent fetches org/department policy bundle from backend (GET /api/policy?org=&dept=), cached; edited centrally |
H1 uses a local file first. See docs/TAILORING.md |
| H3 |
P1 |
Feedback capture β analyst marks events "should've blocked / was fine" on the dashboard; labels stored |
Done (labels stored; do not yet influence decisions) |
| H3b |
P1 |
Feedback β few-shot β inject the org's recent analyst corrections into the judge prompt as examples, so "correct a decision β it adapts" works without any training |
The missing rung between H3 and H5; highest-leverage, lowest-risk "learning" |
| H4 |
P2 |
Grounding lists β allow (published OSS) / deny (codenames, internal domains, employee names) as hard signals |
|
| H5 |
P3 |
LoRA fine-tune on labeled feedback (central box) + adapter OTA to agents |
Needs H3 data + GPU + privacy review. Per-org, not per-dept |
| H6 |
P3 |
Versioned model/policy OTA bundle per org/department |
Ties to H2/H5 |
| H7 |
P2 |
Department routing β resolve the user's department (identity/SSO or per-endpoint config) and apply that dept's policy bundle + thresholds |
Config, not training. Needs auth (#10) for trusted claims. See docs/TAILORING.md |
Epic E β CI/CD & Infra
| ID |
Priority |
Item |
Notes |
| E1 |
P0 |
CI: test agent+backend, static-build dashboard, package extension |
Done |
| E2 |
P0 |
SAM template.yaml (Lambda + DynamoDB + S3/CloudFront + OIDC role) |
Done; validated with sam validate --lint |
| E3 |
P0 |
Staging pipeline on main (sam deploy + dashboard sync) via OIDC |
Done |
| E4 |
P0 |
Prod pipeline (separate stack) with approval gate |
Done |
| E5 |
P0 |
One-time bootstrap + repo-var wiring |
Done β staging live in account 835422347653 |
| E6 |
P1 |
Set repo vars AWS_DEPLOY_ROLE_ARN, AWS_REGION |
Done (via bootstrap) |
| E9 |
P2 |
Bootstrap prod stack (sentinelai-production) + production env reviewers |
Pending |
| E7 |
P1 |
Scope down the OIDC deploy role to least-privilege |
Done β resource-scoped inline policy, no *FullAccess/IAMFullAccess |
| E8 |
P2 |
Signed extension packaging + store/enterprise distribution |
|
Epic F β Event Collection Strategy (recorded)
Captures the ADR-001 decision and the deferred collection surfaces. See
ARCHITECTURE.md Β§8.
| ID |
Priority |
Item |
Notes |
| F1 |
P0 |
Decision: browser extension as MVP collection + enforcement point |
ADR-001 |
| F2 |
P2 |
IDE Copilot collector (VS Code / JetBrains extension) |
Different surface; code exfil focus |
| F3 |
P2 |
Office / desktop Copilot (Windows UI Automation or MS Purview) |
Native apps |
| F4 |
P2 |
ChatGPT / Claude desktop apps (process detect + clipboard + UIA) |
Native apps |
| F5 |
P3 |
Clipboard collector |
From original spec |
| F6 |
P3 |
File-system collector (downloads/documents) |
From original spec |
| F7 |
P3 |
USB insert detection (WMI) |
From original spec |
| F8 |
P3 |
Evaluate TLS/API interception for native apps only |
Rejected for MVP (cert pinning, maintenance) |
Epic G β Attachment / file-upload DLP (raised by sponsor, not in MVP)
Current interception reads prompt text from JSON request bodies. File attachments (drag-drop
PDFs/spreadsheets/images into ChatGPT/Claude, paste screenshots, upload docs to Copilot) go through
a separate multipart/form-data upload path the current hook does not inspect. This is
genuinely harder and is Phase 2 (the original spec parked "browser upload blocking" + "screen
OCR" there too).
| ID |
Priority |
Item |
Notes |
| G1 |
P2 |
Intercept file-upload requests (FormData / upload endpoints) per provider |
New surface in inject.js |
| G2 |
P2 |
Extract + classify file content (text extraction; OCR for images) before upload completes |
Agent-side; likely needs the LLM/OCR |
| G3 |
P2 |
Block/warn on attachment uploads (real-time) |
Ties to enforcement UX A5 |
| G4 |
P3 |
Size/type policy (e.g. block >N MB, block source archives) |
|
Epic I β Packaging, distribution & hardening
The self-contained Windows package (SentinelAI-Windows.zip with sentinelai-agent.exe) works, but
is unsigned and served from a public URL. Items to make it distribution-grade.
| ID |
Priority |
Item |
Notes |
| I1 |
P1 |
Code-sign the exe + PowerShell installer (Authenticode / EV cert) |
Removes SmartScreen "unknown publisher" + most AV false positives |
| I2 |
P1 |
Gate the download β auth or short-lived/expiring link instead of a public URL |
Today: dlp.kshetra.studio/download/β¦ is world-readable; use S3 presigned URLs or Cognito/basic-auth |
| I3 |
P2 |
Wrap the installer in a real MSI/Inno installer (double-click, Add/Remove Programs) |
Nicer than "run the .ps1" for non-technical users |
| I4 |
P2 |
Auto-warm the model on install/login so the first AI prompt isn't a cold ~10s |
Warm-up call after ollama serve; or ship llama3.2:1b on low-spec machines |
| I5 |
P2 |
Attach the exe to a GitHub Release for a stable, versioned download |
build-windows-agent.yml already runs on release |
| I6 |
P3 |
macOS signing + notarization for the agent + a .pkg installer |
Parallel to I1/I3 for Mac endpoints |
| I7 |
P3 |
Windows service (pywin32/NSSM) instead of a logon/startup Scheduled Task for fleet |
Runs without an interactive session |
Decisions locked (2026-08-10)
- LLM (ADR-003): MVP is rules-only; local endpoint LLM is Phase 2 (
SENTINEL_LLM=1).
- Deployment (#9 / ADR-002): SaaS in the user's AWS, serverless (SAM + Lambda + DynamoDB +
static S3/CloudFront).
Open Questions (still need sponsor input)
- #6 Policy ownership β hardcoded defaults vs admin-configurable thresholds. Blocks B6.
- #8 Data egress β metadata-only vs full-payload capture. Blocks B5, privacy review.
- #10 Auth model β SSO/RBAC for API + dashboard. Blocks C3/C5/D6. (API is an open Function URL until then.)
- A8 Fail mode β fail-open vs fail-closed when the local agent is unreachable.
- Attachments (Epic G) β confirm Phase-2 priority vs pulling G1βG3 forward.