Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .agents/skills/euthyna-en/references/fact-producers.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ When the fork point is uncertain, use the result of `git merge-base <target bran
### What the output looks like (real capture)

```
euthyna euthyna-history — attribution and security classification of deleted code
euthyna-history — attribution and security classification of deleted code
Target: D:/axe-core/axe-core
Range: 8390a5a9…..397f5fce…

Expand Down Expand Up @@ -217,7 +217,7 @@ node <euthyna repo>/bin/euthyna.js coverage `
### What the output looks like (real capture; one query hitting both result kinds)

```
euthyna euthyna-coverage — symbol invocation counts (can only falsify)
euthyna-coverage — symbol invocation counts (can only falsify)

Established (1)
• Symbol cleanup was never invoked in this test run (invocation count 0) — any behavior depending on it was never exercised
Expand Down
4 changes: 2 additions & 2 deletions .agents/skills/euthyna/references/fact-producers.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ node <euthyna 仓库>/bin/euthyna.js history --base <改前版本> --no-origins
### 输出长什么样(真实捕获)

```
euthyna euthyna-history — 被删除代码的来源归属与安全分类
euthyna-history — 被删除代码的来源归属与安全分类
目标: D:/axe-core/axe-core
范围: 8390a5a9…..397f5fce…

Expand Down Expand Up @@ -243,7 +243,7 @@ node <euthyna 仓库>/bin/euthyna.js coverage `
### 输出长什么样(真实捕获,一次查询命中两种结果)

```
euthyna euthyna-coverage — 符号调用计数(只能证伪)
euthyna-coverage — 符号调用计数(只能证伪)

已确证 (1)
• 符号 cleanup 在本次测试运行中一次都没有被调用(调用计数为 0)
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "euthyna",
"version": "0.9.0",
"description": "Deterministic fact producers for security auditing: which deleted code came from a security fix, and which changed symbols no test ever executed.",
"description": "Audit framework for AI coding agents: produces the deterministic facts a model cannot compute — deleted-code provenance, symbol invocations, dependency pins — and adjudicates every claim against six gates, downgrading what cannot produce evidence to an observation. Not a scanner.",
"type": "module",
"main": "./plugin/index.js",
"bin": {
Expand Down
5 changes: 4 additions & 1 deletion src/contract.js
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,10 @@ export function renderReport(report, { write: rawWrite = console.log, lang = DEF
const unknown = facts.filter(f => f.status === STATUS.UNKNOWN);

write('');
write(`euthyna ${producer.name} — ${producer.purpose || ''}`.trim());
// The producer name is `euthyna-history`, `euthyna-audit`, …: it already names
// the tool, so the header prints it as the contract emits it — the same string
// the `--json` `producer` field carries.
write(`${producer.name} — ${producer.purpose || ''}`.trim());
write(`${t('目标: ', 'Target: ')}${subject.repo ?? subject.coverageFile ?? t('(未指定)', '(unspecified)')}`);
if (subject.base || subject.head) {
write(
Expand Down
11 changes: 11 additions & 0 deletions test/i18n.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,17 @@ describe('renderReport language', () => {
return lines.join('\n');
}

test('the title line is the producer name and purpose, in either language', () => {
// The producer name already carries the `euthyna-` prefix, so a literal
// `euthyna ` in front of it renders `euthyna euthyna-audit` on every run —
// the shipped 0.9.0 header. The name is printed as the contract emits it,
// which also keeps the human line and the `--json` `producer` field equal.
const zh = render(sampleReport('测试'), 'zh');
assert.match(zh, /^euthyna-test — 测试$/m, 'the Chinese title names the producer once');
const en = render(sampleReport('test'), 'en');
assert.match(en, /^euthyna-test — test$/m, 'the English title names the producer once');
});

test('Chinese by default', () => {
const out = render(sampleReport('测试'), 'zh');
assert.match(out, /目标: \/tmp\/repo/);
Expand Down
Loading