
Security News
Deno Goes the Way of the Dinosaur
Cloudflare is acquiring Deno’s team, which will provide another year of bug fixes and security updates before ending support for the runtime.
Deterministic fact producers for security auditing: which deleted code came from a security fix, and which changed symbols no test ever executed.
εὔθυνα — in classical Athens, the audit every outgoing official had to submit. You did not get to simply walk away from office. You handed over your accounts and they were examined. Pass, and you left with your standing intact. Fail, and you faced trial.
euthyna is a code security audit framework for AI coding agents. It is not another scanner. It does two things: it produces the facts an agent cannot compute by reading code, and it forces every security claim the agent makes through gates before it counts as a finding.
When an AI coding agent touches security, it fails in two specific ways:
Neither is fixed by telling the agent to be more careful. euthyna changes the handshake between you and the agent:
The agent saying "I'm done" does not count. The accounts get handed over, and the gates decide.
Two fact producers — a zero-dependency Node CLI:
history — for every line a change deletes, it finds the commit that introduced
that line and classifies that commit from its own message. If the deleted code came
from a security fix, that is flagged. This is git archaeology no model can do from
reading a diff.coverage — was this symbol ever actually invoked by a test? It has exactly two
answers: never invoked (established), or entered but that proves nothing about any
specific call site (unknown). It never reports "executed" — V8 coverage marks
unreachable code as covered, and "line covered → call ran" is wrong in exactly the
direction an audit cannot afford. The reasoning is in
docs/fact-contract.md §6.2.The skill is the audit discipline itself, as loadable Markdown. Every security claim must pass six gates — reachability, trust boundary, real impact, and their counterparts. A claim that cannot produce evidence is downgraded to an observation, not reported as a finding. "I'm done" becomes a package: claims, evidence, and the commands that reproduce both.
Prerequisite for everything: Node >= 20 and git. There is nothing else to install — the project is deliberately zero-dependency.
| Host | The skill (audit discipline) | The CLI (fact producers) |
|---|---|---|
| DSH | Copy .agents/skills/euthyna/ into ~/.agents/skills/ (user-wide) or <project>/.agents/skills/. Markdown hot-reloads; no restart needed. | npm install -g euthyna — runs in any terminal |
| Claude Code | Copy the same folder into ~/.claude/skills/ | Same |
| Codex | The same Markdown layer works; packaging goes through Codex's plugin/marketplace format | Same |
| Any terminal | — | npm install -g euthyna, then euthyna … |
Two honest notes:
npm install -g euthyna) or
keep this repository checked out; on a host without the CLI, the skill requires the
unmeasurable criteria to be recorded as not evaluated rather than guessed at — that
fallback is the design, not a gap.npm install -g euthyna
euthyna history --repo <path> --base main --head HEAD
euthyna coverage --coverage coverage/coverage-final.json --symbol <name>
Or without a global install: npx euthyna history --repo <path> --base main.
From a checkout instead (development):
git clone https://github.com/slow-stack/euthyna
cd euthyna && npm test # 92 tests; no install step exists
node bin/euthyna.js history --repo <path> --base main --head HEAD
What history reports looks like this:
已确证 (7)
• 本次变更删除了 4 行来自提交 ab877f9d70 的代码,分布在 2 个文件。
提交信息:"fix(link-in-text-block): don't match style or script text (#3775)",分类:fix
证据: lib/checks/color/link-in-text-block-evaluate.js (ab877f9d70)
复现: git blame --porcelain -L 104,104 -L 114,114 <base> -- lib/checks/.../evaluate.js
Every deleted line is blamed back to the commit that introduced it, and the 复现
(Reproduce) command lets you re-derive the claim yourself without trusting the report.
Add --json for the structured fact report, and --pickaxe to detect lines that were
removed and are now being added back.
Surveying eight measurement plugins in this ecosystem found none of them publishes a process exit code, which makes their output unusable as a CI gate. This one does:
| Code | Meaning |
|---|---|
0 | Measured; nothing security-classified found |
10 | Measured; at least one security-classified fact exists |
1 | Usage error |
2 | Could not measure at all — must not be read as clean |
2 being distinct from 0 is the whole point: failing to measure and measuring and
finding nothing are different things.
| Piece | What it is | Status |
|---|---|---|
| Fact producers | A zero-dependency Node CLI that answers two questions deterministically | Working, tested |
| The skill | The audit discipline itself, as loadable Markdown | Working, loadable |
| The benchmark | A blind recall measurement for the adjudication layer | Four rounds complete |
This project tries to be explicit about the difference. Current state:
history attribution against real repositories — in two languages. Run against
axe-core (JavaScript) and
crewAI (Python); deleted lines attributed to the
commits that introduced them, then checked by hand against git blame. The checks
developed for that comparison now run as regression tests in the suite.coverage on real output in two formats — c8/V8 JSON and coverage.py JSON (format 3) —
distinguishing all three states correctly.bench/RESULTS.md,
bench/RESULTS-round2.md,
bench/RESULTS-round3.md,
and bench/RESULTS-round4.md.docs/dsh-stop-gate.md.docs/case-study-crewai.md and
docs/case-study-axe-core.md.euthyna/
├── bin/ src/ test/ Fact producers (zero dependencies, Node >= 20)
├── .agents/skills/euthyna/ The audit discipline, as a portable skill
├── bench/ Blind recall benchmark + results
├── docs/ Design notes and case studies (English and Chinese)
├── tools/ Research and verification scripts
└── data/ DSH plugin catalog snapshot
tools/fetch-references.js downloads the upstream sources this project reads into .refs/
(gitignored). No third-party files are distributed in this repository — see
NOTICE.md for why, and for what is owed to whom.
Early, and honest about it. Working: the two fact producers, the skill, the benchmark harness. Not yet built: wiring the skill to the CLI so an agent uses them without being told, and the git-history / coverage work needed to close the remaining recall gap.
The design notes are available in English and Chinese; the -zh files are the originals.
Read CONTRIBUTING.md. The short version: no AI attribution in commits,
one change per commit, and do not claim something works until you have run it.
The fact producers execute git and parse coverage output; their integrity is the product.
What is in scope, and how to report privately: SECURITY.md. Note that the
benchmark fixtures in bench/cases/ are vulnerable by construction and are not vulnerabilities.
Apache License 2.0 — see LICENSE.
FAQs
Deterministic fact producers for security auditing: which deleted code came from a security fix, and which changed symbols no test ever executed.
The npm package euthyna receives a total of 0 weekly downloads. As such, euthyna popularity was classified as not popular.
We found that euthyna demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Security News
Cloudflare is acquiring Deno’s team, which will provide another year of bug fixes and security updates before ending support for the runtime.

Security News
Anthropic’s free OSS Scanner uses Mythos and other Claude models to find open source vulnerabilities and send maintainers reports with proposed fixes.

Security News
On Front Lines’ Early Adopters: CISO podcast, Andrew Becherer shares lessons from Datadog, weighs the long-term costs of AI-built tools, and explains how founders can actually gain a CISO’s trust.