diff --git a/.agents/skills/euthyna-en/references/fact-producers.md b/.agents/skills/euthyna-en/references/fact-producers.md index a08c487..2d04a14 100644 --- a/.agents/skills/euthyna-en/references/fact-producers.md +++ b/.agents/skills/euthyna-en/references/fact-producers.md @@ -89,7 +89,7 @@ When the fork point is uncertain, use the result of `git merge-base /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 diff --git a/.agents/skills/euthyna/references/fact-producers.md b/.agents/skills/euthyna/references/fact-producers.md index e976024..57e3a24 100644 --- a/.agents/skills/euthyna/references/fact-producers.md +++ b/.agents/skills/euthyna/references/fact-producers.md @@ -99,7 +99,7 @@ node /bin/euthyna.js history --base <改前版本> --no-origins ### 输出长什么样(真实捕获) ``` -euthyna euthyna-history — 被删除代码的来源归属与安全分类 +euthyna-history — 被删除代码的来源归属与安全分类 目标: D:/axe-core/axe-core 范围: 8390a5a9…..397f5fce… @@ -243,7 +243,7 @@ node /bin/euthyna.js coverage ` ### 输出长什么样(真实捕获,一次查询命中两种结果) ``` -euthyna euthyna-coverage — 符号调用计数(只能证伪) +euthyna-coverage — 符号调用计数(只能证伪) 已确证 (1) • 符号 cleanup 在本次测试运行中一次都没有被调用(调用计数为 0) diff --git a/package.json b/package.json index 86682f9..81acddd 100644 --- a/package.json +++ b/package.json @@ -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": { diff --git a/src/contract.js b/src/contract.js index 7f876dc..bf5923d 100644 --- a/src/contract.js +++ b/src/contract.js @@ -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( diff --git a/test/i18n.test.js b/test/i18n.test.js index 6f809f0..989e37b 100644 --- a/test/i18n.test.js +++ b/test/i18n.test.js @@ -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/);