From 905f751ec281ab31dc1fbc4cf95722565087045b Mon Sep 17 00:00:00 2001 From: Note Flow AI Date: Tue, 15 Sep 2026 07:44:07 +0800 Subject: [PATCH] Connect audit coverage to case evidence across three task packs --- CHANGELOG.md | 4 ++ README.md | 5 +++ README.zh-CN.md | 5 +++ docs/coverage-review.png | Bin 0 -> 92437 bytes huggingface/DATASET.md | 7 +++- package-lock.json | 4 +- package.json | 2 +- scripts/build_dataset.py | 9 ++++- scripts/build_site.py | 70 +++++++++++++++++++++++++++------ scripts/check_site.cjs | 12 ++++++ site/index.html | 9 ++++- site/style.css | 2 + src/evalarc/audit.py | 4 +- src/evalarc/report.py | 64 +++++++++++++++++++++++++++--- tests/test_dataset.py | 13 +++++- tests/test_detection_margin.py | 25 ++++++++++++ tests/test_report.py | 24 +++++++++++ tests/test_site.py | 4 ++ 18 files changed, 236 insertions(+), 27 deletions(-) create mode 100644 docs/coverage-review.png create mode 100644 tests/test_detection_margin.py diff --git a/CHANGELOG.md b/CHANGELOG.md index a631e58..dc94284 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## 0.10.0 — 2026-09-14 +- Add a three-task audit coverage section with direct links from single-case dependencies to recorded fault evidence. Re-render all three reports from unchanged saved JSON, with accessible disclosures and layouts for narrow screens. +- Include assessed surviving faults as zero in the weakest detection margin; environment failures remain unassessed. +- Extend the Hugging Face casebook to all three task packs: 251 case rows, with the parent control's distinct-case detection margin. Preserve the original source records and distinguish reference controls with a null margin. + - Report detection margins beside the mutation score: how many cases caught each declared fault, the weakest margin in the pack, the faults caught by exactly one case, and the cases that are the sole detector of some fault. All three packs score 1.0, and six of their 21 declared faults rest on a single case each; that fragility was previously invisible. - Count margins over distinct cases rather than case runs, so adding a seed cannot inflate them. Measured margins are identical under the Python and JavaScript references. - State the relation to the hack-verifiable environments methodology and record both papers as verified primary sources. HVE plants a hack in the environment to measure whether an agent exploits it; an audit here plants a fault in the submission to measure whether the checks catch it. Opposite directions, no equivalence claimed. diff --git a/README.md b/README.md index eadac26..a07293f 100644 --- a/README.md +++ b/README.md @@ -107,6 +107,11 @@ integrations remain planned. No frontier-model benchmark result is claimed. evidence and fingerprints every input. Use `--require-resolved` when your handoff also requires all checks to pass. [Verification and limits](docs/verification.md). + +[![Three task packs with direct evidence links for six single-case dependencies.](docs/coverage-review.png)](https://noteflowai.github.io/evalarc/#coverage) + +**Inspect coverage before trusting a perfect score.** The website now lists all three task packs and links each single-case dependency directly to its recorded checks and seeds. Offline audit reports provide the same disclosures without scripts or remote assets. These are new views of the original records, not new model runs. + ## New in 0.9.0: research you can inspect [Explore all 27 real GPU skill trials](https://noteflowai.github.io/evalarc/skill-impact/) and [the research pilots](docs/research-pilots.md). Robot Reel's [captured-scene editor](https://noteflowai.github.io/robot-reel/scene-lab/) and [official LIBERO-Plus replay](https://noteflowai.github.io/robot-reel/libero-plus/) connect real source records with portable skill delivery and independent grading. Every failed attempt stays visible; no skill efficacy, full-benchmark or real-hardware result is implied. diff --git a/README.zh-CN.md b/README.zh-CN.md index 1b12f59..e546fd6 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -91,6 +91,11 @@ Docker 评测:参考策略 3/3 轮完全通过,重复写入策略虽然平 需要全部任务通过时加 `--require-resolved`。 [使用说明与校验范围](docs/verification.md)。 + +[![三个任务包的覆盖薄弱点与原始证据入口](docs/coverage-review.png)](https://noteflowai.github.io/evalarc/#coverage) + +**在信任满分前,先检查覆盖薄弱点。** 网页现展示全部三个任务包,可从仅靠一个用例检出的缺陷直接定位到原始检查与种子记录。离线审计报告也提供相同的证据展开入口,不依赖脚本或远程资源;新增界面沿用原始数据,不冒充新模型运行。 + ## 0.9.0:有原始证据的研究场景 [查看 27 次真实 GPU 技能评测](https://noteflowai.github.io/evalarc/skill-impact/),并阅读[完整方法与限制](docs/research-pilots.md)。新增[实景 Blender 编辑](https://noteflowai.github.io/robot-reel/scene-lab/)与[官方 LIBERO-Plus 子集回放](https://noteflowai.github.io/robot-reel/libero-plus/),把原始记录、技能交付与独立验收连接起来。失败尝试全部保留;不宣称技能提分、完整基准成绩或真机效果。 diff --git a/docs/coverage-review.png b/docs/coverage-review.png new file mode 100644 index 0000000000000000000000000000000000000000..b8b3a9d6f56159491422591eee2d11c62f6ae907 GIT binary patch literal 92437 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 pn7t2>Qup_n5O5~2 str: @@ -62,9 +62,13 @@ def provenance(path: Path, pointer: str, evaluation: dict) -> dict: "runtime_json": compact(evaluation["runtime"]), } - for directory in ("audit", "support-audit"): + for directory in ("audit", "support-audit", "research/robot-audit-python"): path = ROOT / "examples" / directory / "audit.json" audit = json.loads(path.read_text()) + margins = { + item["name"]: len(set(item["failing_cases"])) if item["valid"] else None + for item in audit["mutants"] + } controls = [("reference", "/reference", audit["reference"], "reference")] controls.extend( (item["name"], f"/mutants/{i}/evaluation", item["evaluation"], "declared-fault") @@ -78,6 +82,7 @@ def provenance(path: Path, pointer: str, evaluation: dict) -> dict: "id": f"{evaluation['task']['id']}/{name}/{case['seed']}/{case['case_id']}", "control": name, "control_kind": kind, + "control_detection_margin": margins.get(name), "case_id": case["case_id"], "seed": case["seed"], "case_passed": case["passed"], diff --git a/scripts/build_site.py b/scripts/build_site.py index c8df56c..357912d 100644 --- a/scripts/build_site.py +++ b/scripts/build_site.py @@ -4,6 +4,7 @@ import argparse import hashlib +import html import json import re import shutil @@ -242,6 +243,31 @@ def verify(folder: Path) -> dict: return record +def coverage_cards(audits: dict) -> str: + cards = [] + for name, audit in audits.items(): + fragile = [ + (i, row) + for i, row in enumerate(audit["mutants"]) + if row["valid"] and row["killed"] and len(set(row["failing_cases"])) == 1 + ] + links = "".join( + f'
  • ' + f"{html.escape(row['name'])}" + f" Sole case: {html.escape(row['failing_cases'][0])}
  • " + for index, row in fragile + ) + cards.append( + '
    ' + f"

    {html.escape(audit['reference']['task']['id'])}

    " + f"

    {audit['killed']}/{audit['total']} declared faults detected

    " + f'

    {len(fragile)} single-case dependencies

    ' + f'
      {links}
    ' + "Inspect all controls ↗
    " + ) + return "".join(cards) + + def build(destination: Path) -> dict: destination = destination.resolve() if destination.exists(): @@ -255,8 +281,20 @@ def build(destination: Path) -> dict: ("coding", "audit", "durable-kv", 8, "boolean-equals-one", 0.925), ("support", "support-audit", "support-routing", 7, "new-key-on-retry", 0.9375), ] - for _, directory, task, count, spotlight, score in specifications: + specifications.append( + ( + "robot", + "research/robot-audit-python", + "robot-evidence-review", + 6, + "invent-source", + 0.9, + ) + ) + audits = {} + for name, directory, task, count, spotlight, score in specifications: audit = json.loads((ROOT / "examples" / directory / "audit.json").read_text()) + audits[name] = audit if ( not audit["valid"] or not audit["reference_passed"] @@ -271,6 +309,16 @@ def build(destination: Path) -> dict: highlighted = next(row for row in audit["mutants"] if row["name"] == spotlight) if highlighted["score"] != score or highlighted["evaluation"]["resolved"]: raise ValueError(f"Spotlight outcome changed: {spotlight}") + for row in audit["mutants"]: + observed = sorted( + { + case["case_id"] + for case in row["evaluation"]["cases"] + if case["checks"].get(row["target_dimension"]) is False + } + ) + if observed != sorted(set(row["failing_cases"])): + raise ValueError(f"Audit detection evidence disagrees: {row['name']}") verify_comparison() verify_repetitions() verify_suite() @@ -280,22 +328,22 @@ def build(destination: Path) -> dict: if path.name == "index.html": version = tomllib.loads((ROOT / "pyproject.toml").read_text())["project"]["version"] (destination / path.name).write_text( - path.read_text().replace("__EVALARC_VERSION__", version) + path.read_text() + .replace("__EVALARC_VERSION__", version) + .replace("__AUDIT_COVERAGE__", coverage_cards(audits)) ) else: shutil.copyfile(path, destination / path.name) for name, directory, *_ in specifications: target = destination / name target.mkdir() - for filename in ("audit.json", "index.html"): - source = ROOT / "examples" / directory / filename - if filename.endswith(".html"): - # Avoid multibyte HTML corruption by the static Space injector. - (target / filename).write_bytes( - source.read_text().encode("ascii", errors="xmlcharrefreplace") - ) - else: - shutil.copyfile(source, target / filename) + # Render current, accessible UI from unchanged recorded evidence. + from evalarc.report import render_audit + + shutil.copyfile(ROOT / "examples" / directory / "audit.json", target / "audit.json") + render_audit(audits[name], target / "index.html") + page = target / "index.html" + page.write_bytes(page.read_text().encode("ascii", errors="xmlcharrefreplace")) for directory, filenames in ( ("comparison", ("index.html", "comparison.json", "baseline.json", "current.json")), ("evaluation", ("index.html", "evaluation.json")), diff --git a/scripts/check_site.cjs b/scripts/check_site.cjs index d1c9c07..1540ec8 100644 --- a/scripts/check_site.cjs +++ b/scripts/check_site.cjs @@ -40,6 +40,8 @@ async function main() { await app.locator("#comparison-workspace").waitFor({state:"visible"}); await app.locator("#repeat-workspace").waitFor({state:"visible"}); await app.locator("#suite-workspace").waitFor({state:"visible"}); + assert.equal(await app.locator(".coverage-card").count(),3); + assert.equal(await app.locator(".coverage-card li").count(),6); await page.waitForLoadState("networkidle"); for (const name of ["partial", "protected"]) { assert.equal(await app.locator("#suite-" + name + "-score").innerText(), "93.75%"); @@ -248,6 +250,16 @@ async function main() { await app.getByRole("heading",{name:"Skill composition: 12 attempts, 3 accepted"}).waitFor(); assert.equal(await app.locator("tbody tr").count(),18); assert.equal(await app.locator("body").evaluate(() => document.documentElement.scrollWidth > innerWidth), false); + const coveragePage = await browser.newPage({viewport:{width,height:1000}}); + try { + await coveragePage.goto(new URL("robot/index.html#fault-3", suiteBase).href); + await coveragePage.locator("#fault-3").waitFor({state:"visible"}); + assert.match(await coveragePage.locator("#fault-3").innerText(), /incomplete-recording/); + assert.equal(await coveragePage.locator(".audit-control").count(),6); + assert(await coveragePage.evaluate(() => document.documentElement.scrollWidth <= innerWidth + 1)); + await coveragePage.locator("#fault-3 details summary").first().click(); + assert.match(await coveragePage.locator("#fault-3 pre").first().innerText(), /"completeness": false/); + } finally { await coveragePage.close(); } assert.deepEqual(errors, []); results.push({width, controls:17, cases:167, comparedCases:3, repeatedControls:2, attempts:6, suiteJobs:3, suiteAttempts:5, junitFailures:1, offlineReports:7, suiteDownloadVerified:true, sharedTraceRestored:true, keyboardCaseReturn:true, realModelTrials:27, supplementaryTrials:18, errors}); await page.close(); diff --git a/site/index.html b/site/index.html index 9ad81a2..0e212a0 100644 --- a/site/index.html +++ b/site/index.html @@ -44,7 +44,14 @@

    Look past
    the score.

    JSONdownloadable evidence
    CPUreproduce without a model API
    - + +
    +

    THREE TASK PACKS / DECLARED FAULTS

    +

    A perfect score.
    How much coverage remains?

    +

    A fault detected by one case loses its coverage if that case is removed or weakened. Open each dependency to inspect the recorded checks, status and seed. Margins count distinct case IDs, not repeated runs.

    +
    __AUDIT_COVERAGE__
    +

    These summaries derive from the original scripted audit records. They are not new agent runs or a guarantee against unseen faults.

    +

    NEW IN 0.5 / DECLARE YOUR ACCEPTANCE RULES

    Same score. Different gate.

    One frozen policy.
    Two explicit acceptance rules.

    Both support jobs score 93.75% and resolve 0/2 attempts. A deliberately permissive gate accepts the result; requiring every notes check to pass rejects it. The task outcome stays the same.

    diff --git a/site/style.css b/site/style.css index 2675fb6..a7d318e 100644 --- a/site/style.css +++ b/site/style.css @@ -35,3 +35,5 @@ button:disabled{opacity:.5;cursor:default} .proof-top{flex-wrap:wrap} .receipt{grid-template-columns:minmax(0,1.2fr) minmax(0,1fr);overflow-wrap:anywhere;font-size:11px} } + +#coverage{padding:48px 0;border-top:1px solid var(--line)}.coverage-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px}.coverage-card{padding:22px;border:1px solid var(--line);border-radius:12px;min-width:0}.coverage-card h3{font-size:15px;overflow-wrap:anywhere}.coverage-card strong{font-size:32px;color:var(--mint)}.coverage-card ul{padding-left:18px}.coverage-card li{margin:14px 0;overflow-wrap:anywhere;font-size:13px}.coverage-card li span{display:block;color:var(--muted);font-size:12px}.coverage-fragile{color:#efa6a0}@media(max-width:850px){.coverage-grid{grid-template-columns:minmax(0,1fr)}} diff --git a/src/evalarc/audit.py b/src/evalarc/audit.py index 569e9f6..67bbfc1 100644 --- a/src/evalarc/audit.py +++ b/src/evalarc/audit.py @@ -126,7 +126,7 @@ def observer(control: str) -> EventCallback | None: ) killed = sum(row["killed"] for row in rows) valid = reference["valid"] and all(row["valid"] for row in rows) - margins = {row["name"]: row["detection_margin"] for row in rows if row["killed"]} + margins = {row["name"]: row["detection_margin"] for row in rows if row["valid"]} # A case that is the only detector of some fault cannot be removed or # loosened without losing coverage the mutation score still claims. sole_detectors = sorted( @@ -144,7 +144,7 @@ def observer(control: str) -> EventCallback | None: # Reported next to the score because a perfect score says nothing about # how much of the suite has to survive for it to stay perfect. "detection": { - "weakest_margin": min(margins.values()) if margins else None, + "weakest_margin": min(margins.values()) if valid and margins else None, "single_case_detections": sorted(name for name, n in margins.items() if n == 1), "sole_detector_cases": sole_detectors, }, diff --git a/src/evalarc/report.py b/src/evalarc/report.py index 5f5343c..7b29f25 100644 --- a/src/evalarc/report.py +++ b/src/evalarc/report.py @@ -23,6 +23,13 @@ .metadata{overflow-wrap:anywhere;font-size:13px} pre{overflow:auto;padding:18px;background:#17221c;font-size:12px;max-height:480px} summary{cursor:pointer;color:#96e8b9}details{margin:16px 0} +summary{min-height:44px;padding:10px 0} +a:focus-visible,summary:focus-visible{outline:3px solid #96e8b9;outline-offset:4px} +.audit-control{border:1px solid #33463d;border-radius:12px;padding:12px 18px} +.audit-control summary{overflow-wrap:anywhere}.audit-control p{overflow-wrap:anywhere} +.audit-coverage{border-left:3px solid #edb68d;padding:12px 20px;background:#17221c} +@media(max-width:640px){body{margin:28px auto;padding:0 16px}.cards{gap:12px} +.card{min-width:0;flex-basis:100%}.dimension{flex-wrap:wrap}.audit-control{padding:10px 14px}} a{color:#96e8b9}.failed,.agent_error,.environment_error{color:#edb68d} .passed{color:#96e8b9}td{overflow-wrap:anywhere} .scroll table{min-width:680px}td:first-child{min-width:170px;overflow-wrap:normal} @@ -37,7 +44,13 @@ def render_audit(data: dict, destination: Path) -> None: score_text = lambda value: "unassessed" if value is None else f"{value:.3f}" # noqa: E731 margin_text = lambda value: "—" if value is None else str(value) # noqa: E731 rows = [] - for row in data["mutants"]: + fragile = [ + row + for row in data["mutants"] + if row.get("valid") is not False and row["killed"] and len(set(row["failing_cases"])) == 1 + ] + for index, row in enumerate(data["mutants"]): + margin = None if row.get("valid") is False else len(set(row["failing_cases"])) state = ( "UNASSESSED" if row.get("valid") is False @@ -47,8 +60,8 @@ def render_audit(data: dict, destination: Path) -> None: f"{esc(row['name'])}" f"{esc(row['target_dimension'])}" f"{score_text(row['score'])}{state}" - f"{esc(margin_text(row.get('detection_margin')))}" - f"{esc(', '.join(row['failing_cases']))}" + f"{esc(margin_text(margin))}" + f'Inspect recorded cases' ) reference = data["reference"] bars = "".join( @@ -88,14 +101,55 @@ def render_audit(data: dict, destination: Path) -> None: '
    reference correctness
    ' f'
    {esc(reference["runtime"]["backend"])}
    ' '
    execution backend
    ' - '

    Does the grader detect plausible defects?

    ' + '
    ' + '

    Which faults depend on one case?

    ' + f"

    {len(fragile)} of {data['total']} declared faults have " + "exactly one distinct detecting case in the assessed records. Repeating a " + "case under more seeds does not increase this margin. A surviving fault has " + "margin zero; an environment failure remains unassessed.

    " + "

    Margins below are derived from the saved failing case IDs. " + "Rendering an older audit does not rerun its controls.

    " + "

    Does the grader detect plausible defects?

    " + '
    ' "" "" '' "" + "".join(rows) + "
    Negative controlTargetCandidate scoreResultMarginEvidence
    " - "

    Positive control

    " + bars ) + document += "

    Inspect the detecting cases

    " + for index, row in enumerate(data["mutants"]): + margin = None if row.get("valid") is False else len(set(row["failing_cases"])) + label = ( + "unassessed" + if margin is None + else ("single-case dependency" if margin == 1 else f"{margin} detecting cases") + ) + case_ids = ", ".join(sorted(set(row["failing_cases"]))) or "none" + document += ( + f'
    {esc(row["name"])} · {label}' + f'

    Target: {esc(row["target_dimension"])}. ' + f"Detecting case IDs: {esc(case_ids)}.

    " + ) + cases = [ + case + for case in row.get("evaluation", {}).get("cases", []) + if case.get("checks", {}).get(row["target_dimension"]) is False + ] + if cases: + for case in cases: + document += ( + f"
    {esc(case['case_id'])} · seed {esc(case['seed'])}" + f" · {esc(case['status'])}
    "
    +                    f"{esc(json.dumps(case, ensure_ascii=False, indent=2))}
    " + ) + else: + document += ( + "

    No detecting-case trace is embedded for this control. " + "Consult the complete JSON evidence for its recorded validity and outcome.

    " + ) + document += "
    " + document += "

    Positive control

    " + bars traces = [case for case in reference.get("cases", []) if "trace" in case] if traces: document += "

    Reference execution evidence

    " diff --git a/tests/test_dataset.py b/tests/test_dataset.py index 0b93fdd..2ca87cc 100644 --- a/tests/test_dataset.py +++ b/tests/test_dataset.py @@ -31,11 +31,22 @@ def test_casebook_preserves_source_objects_and_distinct_gate_outcomes(tmp_path): folder = tmp_path / "casebook" manifest = build_dataset.build(folder) assert manifest["row_counts"] == { - "audit_cases": 167, + "audit_cases": 251, "repetition_attempts": 6, "suite_jobs": 3, } cases = table(folder, "audit_cases") + assert {row["task"] for row in cases} == { + "durable-kv", + "support-routing", + "robot-evidence-review", + } + assert len([row for row in cases if row["task"] == "robot-evidence-review"]) == 84 + assert all( + row["control_detection_margin"] is None + for row in cases + if row["control_kind"] == "reference" + ) for row in cases: case = original(folder, row) assert json.loads(row["case_json"]) == case diff --git a/tests/test_detection_margin.py b/tests/test_detection_margin.py new file mode 100644 index 0000000..b654826 --- /dev/null +++ b/tests/test_detection_margin.py @@ -0,0 +1,25 @@ +"""An assessed surviving control is zero coverage, not an absent measurement.""" + +import importlib + +from evalarc.runner import Runtime + + +def test_surviving_controls_are_included_in_the_weakest_margin(monkeypatch): + module = importlib.import_module("evalarc.audit") + monkeypatch.setattr( + module, + "evaluate", + lambda *args, **kwargs: { + "valid": True, + "resolved": True, + "score": 1.0, + "candidate_sha256": "0" * 64, + "cases": [{"case_id": "permissive", "checks": {}}], + }, + ) + result = module.audit(Runtime(backend="local"), [17]) + assert result["valid"] and not result["passed"] + assert result["mutation_score"] == 0 + assert result["detection"]["weakest_margin"] == 0 + assert result["detection"]["single_case_detections"] == [] diff --git a/tests/test_report.py b/tests/test_report.py index 007f00d..732ec12 100644 --- a/tests/test_report.py +++ b/tests/test_report.py @@ -32,3 +32,27 @@ def test_report_escapes_external_content(tmp_path): assert "