Generated by uv run poe bench-report from the files in bench/results/2026-10-06 at commit 77528b5c76a33d78414c195e7a81519969586161 (working tree dirty). Hardware: NVIDIA GeForce RTX 3050 Ti Laptop GPU (4096 MB), driver 592.82, Windows-11-10.0.26300-SP0. Protocols: docs/furnacebench.md. Every number below is copied from a results file named in its section. Read first: campaign conditions in bench/results/2026-10-06/NOTES.md.
Sources: bench/results/2026-10-06/rq1_first_scan.md, bench/results/2026-10-06/rq1_set2_old_scanner.md, bench/results/2026-10-06/rq1.md.
| category (P / R (tp/truth)) | F1 (dev fixture) | set 1, first scan | set 1 after fixes (not held-out) | set 2, old scanner | set 2, fixed scanner |
|---|---|---|---|---|---|
| llm_call_sites | 1.00 / 1.00 (1/1) | – / 0.00 (0/8) | 1.00 / 1.00 (8/8) | 1.00 / 0.20 (1/5) | 1.00 / 0.20 (1/5) |
| models | 1.00 / 1.00 (1/1) | – / 0.00 (0/4) | 1.00 / 1.00 (4/4) | – / 0.00 (0/2) | – / 0.00 (0/2) |
| serving_engines | 1.00 / 1.00 (1/1) | – / 0.00 (0/4) | 1.00 / 1.00 (4/4) | – / 0.00 (0/3) | – / 0.00 (0/3) |
| retrievers | 1.00 / 1.00 (1/1) | 1.00 / 0.50 (1/2) | 1.00 / 1.00 (2/2) | n/a | n/a |
| tools | 1.00 / 1.00 (1/1) | – / 0.00 (0/1) | – / 0.00 (0/1) | n/a | n/a |
| prompts | 1.00 / 1.00 (1/1) | 0.20 / 0.33 (1/3) | 1.00 / 0.33 (1/3) | 0.00 / 0.00 (0/4) | 0.00 / 0.00 (0/4) |
| workflows | 1.00 / 1.00 (2/2) | – / 0.00 (0/9) | – / 0.00 (0/9) | 1.00 / 0.20 (1/5) | 1.00 / 0.20 (1/5) |
| contradictions | 1.00 / 1.00 (1/1) | – / 0.00 (0/1) | – / 0.00 (0/1) | 0.00 / 0.00 (0/1) | 0.00 / 0.00 (0/1) |
| attribute accuracy | F1 (dev fixture) | set 1, first scan | set 1 after fixes (not held-out) | set 2, old scanner | set 2, fixed scanner |
|---|---|---|---|---|---|
| scanner | 13/13 | 19/22 | 46/46 | 15/16 | 15/16 |
| empty scan (baseline) | 4/7 | 15/20 | 15/20 | 13/14 | 13/14 |
Confidence ECE, first scan (old scanner; dev + set 1): 0.082 over n = 12 decidable claims.
Confidence ECE, current scanner (all apps): 0.054 over n = 45 decidable claims.
Source: bench/results/2026-10-06/rq2.md.
| check (seeded) | recall | FPR | positives / controls |
|---|---|---|---|
| citation_required | 1.000 | 0.000 | 122 / 78 |
| duplicate_action | 1.000 | 0.000 | 2 / 2 |
| forbidden_pattern | 1.000 | 0.000 | 200 / 45 |
| prompt_prefix_stable | 1.000 | 0.000 | 80 / 80 |
| side_effect_requires_approval | 1.000 | 0.000 | 3 / 3 |
Seeded results verify each check against its own specification; they are expected to be perfect for deterministic checks and say nothing about agreement with human judgment.
Source: bench/results/2026-10-06/rq3.md.
| metric | value |
|---|---|
| scenarios | 13 |
| suite items executed (targeted) | 46% |
| wall time full → targeted (s) | 964 → 502 |
| endpoint-busy time full → targeted (s) | 839 → 444 |
| regression recall (full-suite FAILs caught) | 3/3 = 1.00 |
| warning recall | 1/2 |
Perf-gate noise on 6 PRs that cannot affect serving (full-suite runs): p95 TTFT change -17.6% to +10.7% (docs_only -9.6%, r3b_chunk_regex_strip -17.6%, r4_approval_removed +10.7%, test_only -0.7%, dependency_bump -6.0%, health_payload +2.5%).
Source: bench/results/2026-10-06/rq4/rq4.md (raw runs in rq4/runs/).
| max-num-seqs | c | TTFT p95 change with prefix cache off, median [min, max] % | goodput lost, req/s | pairs | same sign |
|---|---|---|---|---|---|
| 8 | 8 | +319.8 [+291.6, +376.0] | +3.59 [+2.84, +4.10] | 3 | yes |
| 8 | 16 | +95.6 [+64.8, +97.4] | +0.80 [+0.75, +1.05] | 3 | yes |
| 32 | 8 | +303.6 [+287.9, +319.0] | +3.76 [+2.74, +4.30] | 3 | yes |
| 32 | 16 | +432.7 [+395.9, +520.5] | +5.21 [+4.30, +5.51] | 3 | yes |
| 128 | 8 | +312.0 [+300.9, +371.8] | +3.63 [+2.63, +4.26] | 3 | yes |
| 128 | 16 | +411.8 [+394.7, +416.2] | +4.58 [+4.28, +4.71] | 3 | yes |
Prefix-cache hit rate with caching on: 88.1–89.3% measured vs 89.0% predicted from the workload's shared prefix.
Source: bench/results/2026-10-06/rq5.md (current rule strategy).
| repeat | status | p95 TTFT base → PR, ms | repair p95 TTFT, ms | repair hit rate | full-suite audit |
|---|---|---|---|---|---|
| 0 | verified | 203.1 → 1043.1 (+414%) | 312.9 (+54.1%, warn) | 98% → 94% | neutral |
| 1 | verified | 231.6 → 1009.9 (+336%) | 269.8 (+16.5%, warn) | 98% → 94% | neutral |
| 2 | verified | 238.2 → 1071.3 (+350%) | 275.7 (+15.7%, warn) | 98% → 94% | neutral |
current strategy: 3/3 verified; 3/3 audits without a FAIL.
First run (bench/results/2026-10-06/rq5_rule_v1.md): the rule moved the per-request value to the end of the *system* message, which still sits before the retrieved context. Kept for the record:
| repeat | status | p95 TTFT base → PR, ms | repair p95 TTFT, ms | repair hit rate | full-suite audit |
|---|---|---|---|---|---|
| 0 | rejected | 244.1 → 1100.2 (+351%) | 436.4 (+78.7%, block) | 98% → 83% | failure |
| 1 | rejected | 257.0 → 1076.5 (+319%) | 445.2 (+73.2%, block) | 98% → 83% | failure |
| 2 | verified | 235.1 → 1052.2 (+348%) | 437.9 (+86.2%, warn) | 98% → 83% | failure |
first strategy: 1/3 verified; 0/3 audits without a FAIL.
- RQ1: the first scan of held-out set 1 (3 OSS apps) found 0/8 LLM call sites. Probes (minimal files, same scanner) confirmed two causes: SDK calls were extracted inside functions but not at module level (Streamlit scripts), and LangChain wrappers were not extracted as call sites at all. Both were fixed afterwards; set 1 is therefore no longer held-out, and set 2 (labeled before the fixes) is the clean test.
- RQ1 (set 2): the scanner fixes motivated by set 1 changed nothing on set 2 (LLM call sites 1/5 before and after). Set 2 uses SDKs the scanner has no rules for (Replicate, llama.cpp) and Azure OpenAI behind a custom base_url: coverage is bounded by hand-written SDK rules, so every unseen SDK is a miss.
- RQ1 (set 2, llama2): false positives: model: ['Llama 2', 'Llama2-7B', 'llama2-chatbot', 'llama2.streamlitapp.com', 'Llama2-13B', 'Llama2-70B']. Left unfixed so set 2 stays a clean test.
- RQ1 (set 2, openai-chat-app-quickstart): false positives: tests/conftest.py::mock_openai_responses_stream.mock_stream#system; tests/test_app.py::test_chat_stream_text#system; tests/test_app.py::test_chat_stream_text_history#system; wrong attributes: rag.present=True. Left unfixed so set 2 stays a clean test.
- RQ1 (set 1 after fixes): recall below 0.5 in: tools (0/1), prompts (1/3), workflows (0/9), contradictions (0/1).
- RQ1 (set 2): recall below 0.5 in: llm_call_sites (1/5), models (0/2), serving_engines (0/3), prompts (0/4), workflows (1/5), contradictions (0/1).
- RQ2:
citation_requiredpasses answers that cite a retrieved but wrong document (31/31 seeded cases): it is a format/provenance check, not a groundedness check. - RQ3: seeded regression
r2_context_bloat(R2 context bloat) produced no FAIL even in the full suite; the suite cannot see it on this setup. - RQ3: seeded regression
r3_citation_strip(R3 citations dropped) produced no FAIL even in the full suite; the suite cannot see it on this setup. - RQ3: seeded regression
r3b_chunk_regex_strip(R3b ineffective tag strip) produced no FAIL even in the full suite; the suite cannot see it on this setup. - RQ3: seeded regression
r5_prefix_caching_off(R5 prefix caching off (serving config)) produced no FAIL even in the full suite (WARN: check:citation_required); the suite cannot see it on this setup. - RQ3: in the R3 run the base revision met the citation contract in 0/34 answers, so a citation regression could not show: a floor effect, not a pass. Across the runs the base rate varied from 0/34 to 2/34 with identical base code (serving nondeterminism); the citation check warned on
r5_prefix_caching_off, which does not change prompts. The 2026-10-04 live Guard run (bench/results/2026-10-04-guard, serving model not recorded there) had 5/34 on base. - RQ3: the perf gate's +10% WARN threshold is inside run-to-run noise on this host (-17.6% to +10.7% on PRs that cannot affect serving); it warned on
r4_approval_removed. None of these PRs was blocked: BLOCK also requires separated runs. - RQ5 (current strategy): in repeat 0 the gate passed the repair as WARN at +54.1% p95 TTFT because its runs overlapped the base runs; a BLOCK needs separated runs, so a large but noisy regression can pass.
- RQ5:
r2_context_bloat: no repair strategy (statusrejected). - RQ5 (first strategy): 2/3 R1 repair attempts were rejected by the gate.
- RQ5 (first strategy): the full-suite audit of the repaired tree failed in 3/3 repeats (bench:chat_perf_gate).
- RQ5 (first strategy): in repeat 2 the gate passed the repair as WARN at +86.2% p95 TTFT because its runs overlapped the base runs; a BLOCK needs separated runs, so a large but noisy regression can pass.
- RQ2 human-labeled agreement: queue of 60 real answers is ready (
bench/labels/f1_queue.jsonl), not labeled yet. - RQ2 LLM judge TPR/TNR: no Groq/OpenRouter key configured.
- RQ1 F2 (TypeScript agent app): no TypeScript extractor yet.
- RQ1 +LLM synthesis ablation: LLM synthesis step not built.
- RQ4 Kaggle T4 (Qwen2.5-1.5B fp16 vs AWQ) and Ollama comparison: not run.
- RQ4
vllm bench servecross-check: not run. - RQ5 LLM-patch strategy: not built.
bench/results/2026-10-04-r1-derisk: removing a 1,000-token shared prefix, c=16 TTFT p95 752 → 1,577 ms (1 repeat).bench/results/2026-10-04-f1-quality: citation contract met 3/89 (0.5B) and 9/88 (1.5B AWQ) on real F1 traffic.bench/results/2026-10-04-guard: live Guard checks for R1-R4 and controls (1 run each).