Repository navigation
Security Model
rogerjeasy edited this page Oct 19, 2026
·
1 revision
The rules that hold the whole system together are ten invariants, written in AGENTS.md and enforced by tests, lint rules and infrastructure policy. Breaking one is a build break, not a review comment.
| Rule | How it is held | |
|---|---|---|
| INV-1 | No long-lived credential ever reaches the television. It holds one device-bound token for one household and nothing else. Assume it can be extracted. | Short-lived tokens; a long random secret per television where the platform can keep a file; no Ring, AWS or Bedrock credential in either TV app |
| INV-2 | Every family-bound string passes through the Guardian. There is no second path. | One MCP server, made behind the gate; only the guarded routes serve a family television; a lint rule keeps the transports in one module |
| INV-3 | No Ring media is kept beyond 24 hours. | The bucket's lifecycle policy, not application code |
| INV-4 | Nothing protected, and nothing verbatim, reaches the family. Health, money, relationships, location and speech. | A deterministic lexicon, no model; property tests through the real tool paths |
| INV-5 | Deferred cards never render during a scene. Only the door is immediate. | Property tests on the break engine |
| INV-6 | Every agent tool call is idempotent and correlated. | A correlationId from ingress to the device and back; write tools claim each call once |
| INV-7 | She sees her week before the family can read it. | Enforced on the write path |
| INV-8 | The household comes from a verified token, never from a request. | No tool, route or Lambda takes a household id from a body, URL or environment |
| INV-9 | Nobody reads a household before the resident allows them. | Only her press makes a membership allowed; every tool call asks again |
| INV-10 | Nothing different leaves the house before she says so. | The family can never tell "kept" from "nothing happened" |
- CI holds no AWS keys. GitHub Actions authenticates over OIDC. The deploy role is narrow: it can change the stack but is explicitly denied the data plane, so merging to main does not give anyone the ability to read a household.
- Ring tokens are one Secrets Manager secret per household. Only the Ring link and the hourly refresh lambda touch them, and the Wick server never sees one.
- The release signing key for the Fire OS app is readable only by a tag-only release job in a protected environment.
-
.envis a laptop file. Exactly one module reads it, and it is never baked into an image. - Spend is bounded. An anonymous visitor's assistant, hearing and demo-account budgets are counted in the database across all instances, and an automatic AWS budget action attaches a deny policy to the model-calling roles at 100% of the monthly budget.
| Threat | What bounds it |
|---|---|
| A television's token is extracted | It is scoped to one household, expires, and grants nothing over Ring, AWS or any family surface |
| A family member is removed or turned down | It takes effect on their next request |
| Someone who knows a simulator's id | The simulator is only ever paired to demo homes; its tokens live an hour and are refused wherever a secret is held |
| A model says something it should not | Models never decide what is protected; the Guardian and a Bedrock Guardrail read the output |
| A replayed Ring webhook | HMAC verification and idempotent handling |
| An anonymous visitor runs up model spend | Durable per-person and global budgets, a scaling cap, and an automatic spend brake |
The full model, with the known accepted exceptions written out and bounded, is in section 10 of the technical document and in AGENTS.md.
Open an issue on the repository. Do not include real household data, tokens or captures.
Wick is MIT licensed. Built for the Build, Ship, Shape Amazon Developer Hackathon. These pages summarise the repository's documents; where they differ, the documents in docs/ win.
Understand
Try
Build on it
Learn from it