Aegis — Package Overview
Personal cybersecurity. Company 00000000-0000-0000-0000-000000000032, slug aegis, type Portfolio. Scope: the description on its row in packages/common/companies.py. Interaction contract: CLAUDE.md. Context: plans/context/00_CONTEXT_INDEX.md.
Module map
`` packages/companies/aegis/ ├── CLAUDE.md the interaction contract — read first ├── AEGIS_PACKAGE.md this file ├── __init__.py the only .py at the package root ├── models/ the shapes Aegis stores and returns — breach card, finding, asset, device, case, │ consent, evidence, removal, autonomy (four levels) ├── services/ the work — PROTECT: breach_provider, exposure (check + finding answers), monitoring, │ accounts (inventory, priorities, guides), devices, recovery, journal, integrations, │ protect_metrics · CASES: cases, tasks (Helm sync), scam, incidents, playbooks, │ evidence, privacy, consent, authority (preview), notify, cross_company, cases_metrics · │ SHARED: addresses, agents, core_a_agents, errands, comparison, plan, settings, refusal, │ fix_steps ├── stores/ Aegis's collections — every personal field sealed or blind-indexed (13 helm_aegis_*) ├── support/ SUPPORT_PROFILE.yaml, which Bridge's support FAB answers from ├── tests/ unit tests └── plans/ ├── context/ 00_CONTEXT_INDEX.md · AEGIS_PATTERN_260930.md · AEGIS_DEIDENTIFICATION_261001.md · │ AEGIS_MASTER_PLAN_261006.md · AEGIS_TRUST_DESIGN_261006.md · AEGIS_COMMERCIAL_MODEL_261006.md └── genesis/atomic/ AEGIS_FEATURE_REGISTER.md (keeper's) · intake/<lane>.md ``
HTTP surface
| Route | What it does | |---|---| | GET /aegisco/health | the signed-in app's runtime check: the registry row served, and whether the paid breach lookup is connected | | GET /aegisco/me · GET /aegisco/plan | who is signed in (and whether they are the owner); their plan from Vault | | POST /aegisco/check/password | the password check — only 5 hex characters of its SHA-1 leave; nothing about it is stored but the count | | POST /aegisco/check/email | one verified address checked: payload · presentation (one card per breach) · followups, plus what the autonomy level did | | GET /aegisco/checks | the person's recent checks | | GET · POST /aegisco/addresses · POST /aegisco/addresses/verify · DELETE /aegisco/addresses/{id} | the addresses a person owns; a new one is confirmed by a link Bridge sends | | POST /aegisco/watches · DELETE /aegisco/watches/{id} | keep watching (a weekly Helm reminder) on or off | | GET · PUT /aegisco/settings/autonomy | how much Aegis does on its own | | GET · PUT /aegisco/errands/switch · POST /aegisco/errands/compare · GET /aegisco/errands/pairs | the per-kind switch and the off/on comparison (owner only to change or run) | | Round 2 (on main ab0d0fc0ea, PRs #4786 + #4774, then #4812): routes/aegis_app.py 44 routes and routes/aegis_cases.py 36, both at /aegisco (api.py:5110, :5114) | | | GET /aegisco/checks/{id} · POST /aegisco/findings/{id}/answers | one check's result state and findings; the answers that change a finding's steps | | GET · POST /aegisco/monitoring · DELETE /aegisco/monitoring/{id} · POST …/{id}/run · …/pause · …/resume | watching as a subscription with its honest state | | GET /aegisco/journal · POST /aegisco/journal/reviewed | what changed since the last review | | GET · POST /aegisco/accounts · PATCH · DELETE /aegisco/accounts/{id} · GET /aegisco/accounts/priorities · GET …/{id}/guide · POST …/{id}/guide/steps/{step}/done | the account inventory, what to protect first, dated guides | | GET · POST /aegisco/devices · PATCH · DELETE /aegisco/devices/{id} · GET /aegisco/recovery/map · POST /aegisco/recovery/rehearsal | devices with dated evidence; the recovery map and rehearsal | | GET /aegisco/integrations · POST /aegisco/integrations/{name}/revalidate · GET /aegisco/metrics | the connector registry; the person's own metrics | | GET · POST /aegisco/cases · GET · PATCH /aegisco/cases/{id} · POST …/{id}/approve · …/close · …/helm · …/handoff · GET …/{id}/export | cases end to end, their Helm to-dos, the recovery packet | | POST /aegisco/cases/{id}/evidence · GET · DELETE …/evidence/{eid} · POST …/evidence/{eid}/redact · GET /aegisco/tasks · GET /aegisco/cases-metrics | evidence and the timeline; task contracts; cases' metrics | | POST /aegisco/scam/check · POST /aegisco/scam/escalate · GET · POST /aegisco/incidents · POST /aegisco/incidents/{id}/intake | the suspicious-message check; incidents and their playbooks | | GET · POST · PATCH /aegisco/privacy/requests (id in the body) · PATCH …/{id} · POST …/{id}/prepare · …/authorise · …/status | removal requests through their lifecycle | | GET · POST /aegisco/permissions · DELETE …/{id} · POST /aegisco/permissions/preview · GET · PUT /aegisco/settings/notifications · GET · PUT /aegisco/events/optins · POST /aegisco/events | grants, the preview, notification settings, cross-company opt-ins and events | | GET /aegis-admin/status | the operator read for command-web's /aegis page (operator key only) |
⛔ /aegisco, not /aegis — /aegis/* is Labs' code-audit pipeline (routes/aegis.py). auth.AUDIENCE_BY_PATH_PREFIX admits only an aegis_user token at /aegisco/.
Collections
| Collection | Holds | De-identified how | |---|---|---| | helm_aegis_addresses | addresses a person owns, watching state | address sealed; address_index / token_index blind indexes; watching yes/no | | helm_aegis_checks | each check run | sealed; ⛔ never a password, its hash or prefix | | helm_aegis_settings | the autonomy level | sealed | | helm_aegis_errands | errand answers and off/on comparisons | sealed | | helm_aegis_monitoring · helm_aegis_assets · helm_aegis_devices · helm_aegis_journal | round 2, protect: watches, declared accounts, declared devices, protection changes | sealed (stores/_common); listed in Helm's sealed_fields.py | | helm_aegis_cases · helm_aegis_tasks · helm_aegis_consents · helm_aegis_evidence · helm_aegis_removals | round 2, cases: cases, Helm task contracts, grants, evidence, removal requests | sealed; listed in Helm's sealed_fields.py | | aegis_breaches | the public breach facts and the steps written once per breach | holds no person |
The thirteen helm_aegis_* collections (stores on main 06ff3b0505) are keyed on user_id, so Helm's account census covers them for export and erase.
Errands and agents
packages/common/errands/offers/aegis.py offers security.exposure.check, security.account.protect and security.incident.resolve (runs in services/errands.py). CORE-A agents: aegisco_breach_advisor (Iaso — the steps for one breach) and aegisco_account_guard (Ladon — the steps for one account) and, round 2, aegisco_message_checker (Tiresias — the suspicious-message check, services/scam.py), generated under generated/ by _launch/ops/aegis_build_260930/request_aegis_agents.py.
Environment
| Var | Service | Notes | |---|---|---| | HIBP_API_KEY | central-command | Have I Been Pwned's paid key, for the email half. Unset → "not connected yet"; the password half needs no key | | GOOGLE_CLIENT_ID_AEGIS | central-command, aegis-web | Aegis's own Google client — google_identity.aegis_audiences() reads it, no default | | GOOGLE_CLIENT_SECRET_AEGIS | aegis-web | |
Change Log
• 2026-10-01 — Created with the company (lane AEGIS aegis-build). • 2026-10-07 — Round 2 reached main (06ff3b0505: #4786 aegis-core, #4774 aegis-web): module map, routes (44 + 35 at /aegisco), the nine new helm_aegis_* collections and the third agent added from a census of origin/main (_launch/ops/aegis_keeper_r2_261006/package_census.py) (lane AEGIS aegis-keeper, round 2, AGS-R2-KEEP-03). • 2026-10-07 — Re-census at main ab0d0fc0ea (#4812 carried aegis-core 514bb2dd49): aegis_cases.py 35 → 36 routes, the new one PATCH /aegisco/privacy/requests (id in the body, as aegis-web's client sends it); modules 57, aegis_app.py 44 and 13 helm_aegis_* collections unchanged (package_census.py origin/main) (lane AEGIS aegis-keeper, round 2, AGS-R2-KEEP-03).