AUTH-015 | criticalP0passed | The shipped email adapter prints every reset and sign-in link to stdout, and nothing refuses it in production | The shipped email setting prints the whole message to the console instead of sending it, so in any normal container deploy every password-reset link a customer requests is written into the server logs, and anyone who can read logs can take over any account by replaying one. |
|---|
CORE-084 | criticalP0passed | The shipped hop count gives every caller one rate limit bucket, so one attacker switches off authentication for everybody | no failure scenario |
|---|
AUTH-006 | criticalP1passed | The .env.example JWT secret signs tokens at runtime, and only an advisory command objects | The signing key that proves who you are is published in this public repository, so anyone who finds a product built from the template can mint a token for any account on it, including an administrator's, without needing a password or leaving a failed login behind. |
|---|
AUTH-021 | criticalP1failed | Four filters in the grant queries can be deleted without any gate going red | Four lines decide that a permission belongs to you rather than to somebody else, and each can be deleted with every test and every gate still green, so one careless edit would let any signed-in customer read, grant and revoke every other customer's permissions with nothing reporting it. |
|---|
OPS-034 | criticalP1passed | Neither deploy path enforces encryption in transit - the fly module serves plain HTTP on 80 and the deploy script disables TLS to Postgres | A deployed product would answer plain unencrypted HTTP on port 80 and talk to its own database with TLS disabled, so anyone between the two could read every row in transit. |
|---|
AUTH-017 | criticalP2passed | The stub identity provider is permitted in staging, and staging is a public deploy | A staging deployment is a public web address, and on staging the shipped identity setting signs you in as whatever email address you type, so a stranger who finds the staging URL can sign in as the founder or as any customer by typing their address. |
|---|
AUTH-031 | highP0cannot be measured here | a password reset does not end the sessions the account already had | no failure scenario |
|---|
AUTH-037 | highP0cannot be measured here | The admin and founder bootstraps grant the role to an unverified account, so registering the owner's address first makes you system admin | no failure scenario |
|---|
AUTH-043 | highP0cannot be measured here | An admin or founder role granted to an unverified account before AUTH-037 is never revoked | no failure scenario |
|---|
CLI-069 | highP0cannot be measured here | The scratchpad example delta imports app.webauth.templating, which components/webauth does not ship | no failure scenario |
|---|
COMP-021 | highP0passed | An unauthenticated caller starves the billing webhook out of its rate limit, and COMP-018 claims the opposite | no failure scenario |
|---|
COMP-068 | highP0passed | The account bar copies the request path into next, so a capability URL becomes a credential in a query string | A child's wishlist link, which is itself the password, was copied into the sign-in page's return address, so the credential travelled in another URL and into another log line. |
|---|
COMP-093 | highP0passed | A product cannot close self-service registration, and the kit ships it open | A shop whose own privacy declaration says every visitor is a child serves an open account-creation form to anyone who finds the address, and nothing anywhere can switch it off. |
|---|
COMP-103 | highP0passed | a token in a URL cannot become a session, so every product puts the credential in the path | Five children's wishlist links are themselves their passwords, and every page view writes one into the production access log, so anyone who can read those logs can open any of those children's pages. |
|---|
COMP-118 | highP0cannot be measured here | A production deployment verifies fake-provider webhooks with a secret this repository publishes | no failure scenario |
|---|
CORE-006 | highP0passed | CORS is app-wide, and * with credentials is the shipped pairing | With CORS set to allow every origin and send credentials, any website a signed-in customer visited could read their data and act as them from their own browser. |
|---|
CORE-011 | highP0passed | The rate limit is bypassable with one header, because get_client_ip trusts X-Forwarded-For unconditionally | Anyone on the internet could send a made-up X-Forwarded-For header on every request and never hit the rate limit, so one laptop could exhaust a product's login or password-reset endpoint while honest users were throttled. |
|---|
CORE-043 | highP0failed | A person cannot delete their account, and the audit trail holds personal data so deleting them is not a delete | A person asks for their account to be deleted and it is deleted, except that three declared stores say nothing can reach them - a crash report holding whatever a library put in an exception message, the email address on an invitation nobody accepted, and a job payload that never said who it was about - so the delete is honest about what it missed and the data stays until somebody builds the reach. |
|---|
CORE-067 | highP0passed | The personal-data gate is table-level, so a new column on a declared table walks past it | Adding one column to a table that already declared its personal data would hide a person's phone number from the erase routine and from the privacy page, with every gate still green. |
|---|
CORE-075 | highP0passed | Nine postgres tests are red on main | no failure scenario |
|---|
CORE-080 | highP0failed | a declaration is the security mechanism so the gate enumerates the artefacts and fails on an undeclared one | no failure scenario |
|---|
CORE-081 | highP0failed | every unsafe default refuses at boot and the unsafe defaults are a register rather than a memory | no failure scenario |
|---|
OPS-044 | highP0passed | The fly deploy sets three secrets, so a product with billing installed deploys green and cannot sell anything | no failure scenario |
|---|
OPS-052 | highP0passed | A sign-in token is in history and not in the tree, and the history scan is red on it | A real sign-in token sits in this repository's history, so anybody who clones it gets a credential - though this particular one is single use, already spent, was signed by a development secret that was never deployed and only ever addressed a laptop's loopback interface. |
|---|
OPS-084 | highP0cannot be measured here | a Cloudflare token with DNS edit on duchovni.net outlives the job it was minted for | A live API token can rewrite the DNS of the owner's personal domain, including the records that say where his email goes, and it has had no job to do since 2026-09-13. |
|---|
OPS-111 | highP0passed | cp env.example env gives every auth route a 500 while every gate stays green | A founder who copied .env.example and deployed would get a product that boots, answers health checks and accepts sign-ups, all signed with a JWT secret published in this public repository, so anybody could mint a token for any account. |
|---|
OPS-131 | highP0failed | GitHub Actions has started no job since 2026-09-14, so every CI red is the same red | Every CI run on the main branch has shown a red X for three days because the account cannot pay, which looks exactly like a failing test - so a real test failure would be invisible, and nothing has actually been checked since 2026-09-14. |
|---|
OPS-183 | highP0failed | settle OPS-169's central claim by standing up postgres and running the suite | no failure scenario |
|---|
OPS-184 | highP0passed | Eight drifted sites stop make mutation measuring any of its seventy guards | The one tool that can tell a working guard from a deleted one refused to run, so nobody could answer whether deleting a security check would be noticed - and five of the plan's six causes rested on the answer. |
|---|
OPS-186 | highP0passed | Re-verify every security claim against today's tree before any agent is sent to fix one | A programme acting on the security plan would have re-fixed fourteen things that were already fixed, and each one would have produced a diff, a commit and a closed ticket - indistinguishable from progress. |
|---|
OPS-247 | highP0cannot be measured here | On the Hetzner path every email goes to Mailpit, because the compose file pins SMTP_HOST over the founder's .env | no failure scenario |
|---|
PROD-024 | highP0cannot be measured here | A child's wishlist token is a path segment, so every page view writes a live bearer credential into the access log | Five children aged 9 to 15 have live 256-bit credentials accumulating in a production access log, and they cannot be rotated quietly because rotating one breaks that child's link and requires a conversation with the child and their grandfather. |
|---|
PROD-040 | highP0cannot be measured here | The shopkeeper sets up the family with one password, and the token links are retired | no failure scenario |
|---|
AUTH-010 | highP1failed | There is no second factor anywhere, and the password policy is eight characters and nothing else | no failure scenario |
|---|
AUTH-020 | highP1passed | A deactivated account keeps every route, and no test in this repository notices | no failure scenario |
|---|
AUTH-033 | highP1cannot be measured here | Nothing limits login attempts per account, so credential stuffing is unthrottled | no failure scenario |
|---|
AUTH-034 | highP1cannot be measured here | The password policy is one length check, so a stuffed credential that is guessable still works | no failure scenario |
|---|
AUTH-048 | highP1cannot be measured here | API keys: a customer's programs call the product without a password | no failure scenario |
|---|
CLI-059 | highP1passed | saas update reports a lost security declaration as an ordinary conflict, and both naive resolutions are wrong | no failure scenario |
|---|
CLI-076 | highP1cannot be measured here | saas feature --no-owner generates an unauthenticated public read and write, contradicting the product CLAUDE.md it ships beside | no failure scenario |
|---|
CLI-095 | highP1cannot be measured here | a production deploy is a publish, blocked until every fake is fixed or accepted | no failure scenario |
|---|
CLI-096 | highP1cannot be measured here | saas build --static emits an edge gate, so a private static site is private on every hostname including pages.dev | no failure scenario |
|---|
CLI-097 | highP1cannot be measured here | publish applies a site's declared access level, and refuses a private site the host cannot enforce | no failure scenario |
|---|
COMP-010 | highP1passed | No admin surface over users, and nothing decides who an admin is | With no admin surface and nothing deciding who an admin is, an operator had no way to look at a suspected account, and any page added for it would have been reachable by any signed-in customer. |
|---|
COMP-022 | highP1cannot be measured here | Two provider events in one second do not order each other, so a stale snapshot resurrects a cancelled subscription | no failure scenario |
|---|
COMP-035 | highP1passed | The webhook MAC can stop covering the timestamp and every test still passes | no failure scenario |
|---|
COMP-069 | highP1failed | A capability URL that carries its token in the query string is still copied into next | A child's wishlist link is copied whole into the sign-in page's return address, so the credential is handed to the browser's history and to every proxy between the child and the shop. |
|---|
COMP-163 | highP1cannot be measured here | a site password gates every path of a server-rendered product, before accounts | no failure scenario |
|---|
COMP-230 | highP1cannot be measured here | a product cannot tell Google Ads or Meta that an ad brought a sign-up or a payment, so no founder can run ads that optimise | no failure scenario |
|---|
COMP-231 | highP1cannot be measured here | a product has no consent record, so nothing can gate ad tags or conversions on what a visitor agreed to | no failure scenario |
|---|
CORE-016 | highP1passed | DEBUG=true is honoured in production, leaking tracebacks in 500 responses | An error on a production page would return the full stack trace to whoever caused it, including the SQL statement and its parameters, which is a free read of the database schema and often of live values. |
|---|
CORE-033 | highP1passed | The generated CI never sets TEST_DATABASE_URL, so every feature's owner-isolation test is green by skipping | no failure scenario |
|---|
CORE-045 | highP1failed | Nothing erases a person, and the erasure that adr-006 decided has no implementation | no failure scenario |
|---|
CORE-071 | highP1passed | A paying customer's crash reaches nobody, and a traceback that would carry it carries their address too | no failure scenario |
|---|
CORE-082 | highP1failed | CORS is one policy for the whole application, so a public path and a private path cannot allow different origins | A founder who needs their public widget callable from any website has no way to say that only their own site may reach the pages that carry a login session, so they must either widen the whole application or break the widget. |
|---|
CORE-083 | highP1passed | the rate limiter is one module-global, so a rate-limit test poisons its siblings and only collection order hides it | no failure scenario |
|---|
CORE-094 | highP1cannot be measured here | SECURITY_CSP validates only the nonce, so an operator can ship script-src * and boot | no failure scenario |
|---|
CORE-114 | highP1cannot be measured here | The level 2 app is always behind cloudflared, and the example env tells it the hop count is 0 | no failure scenario |
|---|
CORE-119 | highP1cannot be measured here | nothing declares what a log line may carry, so an undeclared log field cannot be a finding | no failure scenario |
|---|
OPS-033 | highP1passed | The fly deploy path never sets ENVIRONMENT, so a deployed product runs in development mode with debug on and console logs | A deployed product would decide it was in development, turn on debug mode and log to the console, which means full stack traces including database contents returned to whoever triggered an error. |
|---|
OPS-035 | highP1cannot be measured here | Nothing configures encryption at rest, and the only backup is a manual pg_dump with no schedule, no encryption and no retention | no failure scenario |
|---|
OPS-037 | highP1failed | Level 2 carries production secrets in a dotenv and a shell, and the documented JWT rotation names a variable no code reads | no failure scenario |
|---|
OPS-054 | highP1passed | Forty-six tests need a database, no gate provides one, and five different variables name it | The gate this project holds itself to reports success over a selection that excludes every test needing a database, so a green result says nothing about whether one customer can read another's data. |
|---|
OPS-057 | highP1failed | The only two row-ownership tests in the repository are collected by nothing, because examples/ holds a delta and not a project | The only two tests in this repository that check one customer cannot read another customer's rows could not be collected by anything, so nobody has ever confirmed that data is separated between accounts. |
|---|
OPS-092 | highP1not evidence | The skeleton ships the broken secret scan this repository already fixed in its own Makefile | no failure scenario |
|---|
OPS-136 | highP1cannot be measured here | An org-level CI runner that every product can leave | no failure scenario |
|---|
OPS-170 | highP1failed | every credential this project holds has a row naming its scope its holder and when it dies | no failure scenario |
|---|
OPS-171 | highP1failed | security impact is self reported and nothing corroborates it so a mis-tagged critical defect is invisible | no failure scenario |
|---|
OPS-185 | highP1passed | The mutation probe is blind to decorator-applied guards and to route modules | The guard checker reports a hundred percent pass rate over a list that contains no decorator-applied guard and only one route file, so a rate-limit exemption can be deleted from a payment webhook and the checker will still say everything is covered. |
|---|
OPS-192 | highP1passed | three of the six examples never declare their cross-account test, so the gate's own safety net misses them | no failure scenario |
|---|
OPS-193 | highP1passed | check_done_when's comment-only rule leads on # and is blind to docstrings, where this repository keeps its prose | no failure scenario |
|---|
OPS-195 | highP1passed | state.json's guarantee requires a run record but not that the command be the ticket's own criterion | no failure scenario |
|---|
OPS-198 | highP1passed | Forty-nine criteria name a test path that does not resolve, and 22 of them name a tree the gate cannot reach | no failure scenario |
|---|
OPS-205 | highP1cannot be measured here | The security lens gates four paths, and most of the trust boundaries live in the other trees | no failure scenario |
|---|
OPS-299 | highP1cannot be measured here | CI runs on a self-hosted runner on any SSH-reachable VM, provisioned by a script that needs only a host and a user | no failure scenario |
|---|
OPS-302 | highP1cannot be measured here | Provision the chosen CI box and run the template's whole CI on it once, then walk the exit | no failure scenario |
|---|
OPS-381 | highP1cannot be measured here | a drifted mutation site is found only by running the slow gate | no failure scenario |
|---|
PROD-004 | highP1passed | The two shipped examples hold an email address and an IP address and declare neither, so the page a founder copies is false about the code beside it | A founder copying an example would ship a privacy page promising to erase personal data, over code that stored an email address and an IP address the erase routine could not find. |
|---|
PROD-096 | highP1cannot be measured here | subscriptions, sponsors and a shop as one commerce model: billing takes the money, grants say what it bought | no failure scenario |
|---|
AUTH-008 | highP2passed | One resolver answers every scope, so a product's own policy decides who administers the installation | no failure scenario |
|---|
AUTH-009 | highP2passed | Nothing revokes a token, so deactivating or deleting a user does not end their session | Sacking someone or deleting their account would not log them out, so an ex-employee's open browser tab would keep working until the token expired on its own. |
|---|
AUTH-024 | highP2failed | Re-authenticating a Google account does not make Google ask for anything, so a borrowed laptop still deletes it | no failure scenario |
|---|
AUTH-035 | highP2cannot be measured here | Nothing sends reauthenticate=True, so a Google account's erasure gate is still only a freshness check | no failure scenario |
|---|
AUTH-059 | highP2cannot be measured here | An administrator must have answered a second factor to reach the admin surface | no failure scenario |
|---|
COMP-144 | highP2cannot be measured here | a tenant row and its members: several people inside one instance, with the operator kept out of the customer's admin role | no failure scenario |
|---|
COMP-167 | highP2cannot be measured here | billing takes card payments for physical goods through an Israeli gateway beside Paddle | no failure scenario |
|---|
COMP-232 | highP2cannot be measured here | a founder cannot switch on a Google, Meta or LinkedIn tag without editing templates and the CSP | no failure scenario |
|---|
COMP-233 | highP2cannot be measured here | a feature built API-first is invisible on its own page, because the routes take a bearer token and the page holds a cookie | no failure scenario |
|---|
CORE-048 | highP2passed | Nothing sets Strict-Transport-Security, so the redirect that closed OPS-034 still costs one cleartext request | A person typing the product's bare hostname on cafe wifi would make one unencrypted request before being redirected, and anybody on that network could read their session cookie from it. |
|---|
CORE-049 | highP2passed | A failed job's traceback keeps whatever it was handling, in a column no sweep touches and no erasure can select on | A failed welcome email would write the customer's address into a database column no retention sweep touches and no erasure request can reach, permanently and silently. |
|---|
CORE-053 | highP2passed | ENVIRONMENT decides two startup refusals and .env.example never declares it | A founder filling in .env.example would never set the one variable that gates two startup refusals, because the file did not mention it, and would deploy with both refusals inert. |
|---|
CORE-060 | highP2failed | A declared credential path that matches no route is inert and looks like protection | no failure scenario |
|---|
OPS-036 | highP2failed | No dependency or secret scan reaches a generated product, and the template's own pip-audit lives in an opt-in lens | no failure scenario |
|---|
OPS-041 | highP2passed | Every GitHub Action is pinned by moving tag rather than by commit SHA | Every GitHub Action was pinned to a moving tag, so the author of any one of them could have repointed it at code that runs with this repository's secrets and read every deploy credential. |
|---|
OPS-058 | highP2failed | A restored backup brings an erased person back, and nothing re-applies the erasure | no failure scenario |
|---|
OPS-075 | highP2cannot be measured here | The secret scan catches a bare high-entropy key about three times in four, and nothing says so | no failure scenario |
|---|
OPS-130 | highP2failed | Six guards die only in the suite make verify never runs | The 135 tests that check who is allowed to see which rows pass when a database is present and vanish without one, and the command this project trusts runs without a database - so the checks that matter most are the ones nobody runs. |
|---|
OPS-191 | highP2failed | the mutation probe's sites are pinned by line number, so any edit above one turns the gate red without a survivor | no failure scenario |
|---|
OPS-196 | highP2passed | a criterion satisfied by a constant's definition cannot fail when the constant's use is deleted | no failure scenario |
|---|
OPS-303 | highP2cannot be measured here | A product gets the self-hosted runner switch and runner.sh, not only the template | no failure scenario |
|---|
OPS-305 | highP2cannot be measured here | infra/runner keeps an admin PAT on the box, which adr-018 forbids | no failure scenario |
|---|
OPS-301 | highP3cannot be measured here | The runner refill loop runs from a laptop, so CI queues whenever the laptop sleeps | no failure scenario |
|---|
OPS-306 | highP3cannot be measured here | A job that may use docker is root on the runner box, until docker is rootless | no failure scenario |
|---|
AUTH-044 | highno prioritycannot be measured here | A verified address is taken as account ownership while a password and sessions from before verification survive | no failure scenario |
|---|
AUTH-057 | highno prioritycannot be measured here | a chosen password may be 8 characters and is checked against 547 words, where 800-63B-4 asks 15 for a single factor and a compromised-password list | no failure scenario |
|---|
CORE-112 | highno prioritycannot be measured here | A null origin with credentials is accepted, and any sandboxed iframe or data URL sends Origin null | no failure scenario |
|---|
CORE-122 | highno prioritycannot be measured here | a product can put the whole site behind one shared password | no failure scenario |
|---|
CORE-123 | highno prioritycannot be measured here | the built image carries no ENVIRONMENT, so a server started without saas deploy runs as development | no failure scenario |
|---|
CORE-133 | highno prioritycannot be measured here | nothing isolates one user's rows from another's, so every query must remember its own WHERE | no failure scenario |
|---|
OPS-122 | highno prioritynot evidence | No gate asks whether a product configured from env.example alone can sign a token | no failure scenario |
|---|
OPS-197 | highno prioritypassed | seven drafted tickets assert a fix on a criterion pinned to a name that outlives the thing | no failure scenario |
|---|
OPS-378 | highno prioritycannot be measured here | work survives the owner's Mac dying: nothing that matters exists only on it | no failure scenario |
|---|