Verification model
Thoth's core claim is a separation most workflows blur: "a check ran and passed" is not the same as "the change is verified." A passing test suite says nothing about whether the code you just changed was exercised.
Pipeline
- —Diff — Git working tree (staged + unstaged + untracked) vs
HEAD(or--base/--staged). - —Impact — a TypeScript-API dependency graph maps changed files to direct and transitive dependents; changed symbols propagate to referencing symbols.
- —Planning — verification steps are selected from trusted sources only:
package.jsonscripts,.thoth/config.jsonchecks, and one inferred read-onlytsc --noEmit. - —Execution — argv without a shell, with timeouts and bounded output. The working tree is hashed before and after; a command that mutates files is reported.
- —Report — claims are classified into verified, failed, and not verified, and a verdict is computed.
Verdicts
| Verdict | Condition |
|---|---|
| VERIFIED | Every planned step passed and changed code has linked test evidence |
| VERIFIED WITH LIMITATIONS | Executed checks passed but some changes produced no evidence |
| CHECK FAILED | Any step exited non-zero or timed out |
| NOT VERIFIED | No executed check produced evidence for the change |
| NO CHANGES | Empty diff |
Honesty rules
- —Zero tests is not a pass — a test command exiting 0 while running no tests counts as not verified.
- —Refused scripts — anything that looks mutating (
--fix,--write) or non-terminating (watch mode) is never run. - —Unknowns are explicit — unresolvable imports and dynamic imports appear in
unknowns, never silently dropped. - —Blast radius is two numbers —
affectedFilesis a conservative upper bound;symbolLinkedFilesis the tighter bound. - —
--explainattaches evidence trails so every conclusion is inspectable.
Trust boundary
Thoth is not a sandbox. It executes scripts already present in your repository (or explicitly configured). If you wouldn't run the repo's scripts yourself, don't run thoth verify in it.