Initial Commit

This commit is contained in:
2026-09-15 15:24:03 -04:00
commit 4dc7086e7e
605 changed files with 101380 additions and 0 deletions
+292
View File
@@ -0,0 +1,292 @@
# Battery results
Run against qwen3.8:latest through Open WebUI, one prompt per fresh chat, with the
system prompt and tool suite as of Change 24.
Grading follows the operator's format: strengths, errors, verdict. Every factual claim in a
"pass" was independently verified against the primary source — the point of the battery
is to catch answers that *sound* right, so an ungraded pass is worth nothing.
---
## P1 — TCP zero-window probe / superseded RFC — **PASS**
**Strengths**
- Named RFC 793 obsolete and identified **RFC 9293** as the current spec, quoting its
`Obsoletes: 793, 879, 2873, 6093, 6429, 6528, 6691` header.
- Cited §3.8.6.1 "Zero-Window Probing" and quoted it **verbatim** — checked character by
character against the RFC text fetched through the suite.
- Gave per-claim verdicts with the MUST/SHOULD discrimination the prompt asked for, and
quoted the real requirement labels **SHLD-29** and **SHLD-30**.
- Caught a genuinely subtle point unprompted: RFC 793's *"Two minutes is recommended"* is
plain English, **not** a BCP 14 SHOULD, so it is weaker than the colleague's "mandates".
- Correctly located the exponential-backoff requirement in 9293 (a SHOULD), not in 793 —
the exact inversion the prompt was built around.
**Errors:** none found.
**Verdict:** the trap was a stale-document citation, and it not only avoided it but
volunteered the obsoletion chain. Quote fidelity was exact, which is what separates this
from an answer that merely reaches the right conclusion.
---
## P2 — CVE score provenance — **PASS**
**Strengths**
- 10.0 with the full correct vector, attributed to the **Apache Software Foundation** as
CNA rather than stated bare.
- Found a **real second score**: Red Hat, 9.8, `CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H`.
Verified against Red Hat's own security API — exact match, including that the sole
difference is `S:U` against NVD's `S:C`.
- Isolated the disagreement to the Scope metric and explained why Log4Shell is Scope:Changed
(the vulnerable component is Log4j; the impacted component is the JVM executing fetched
bytecode).
**Errors:** none found.
**Verdict:** this is the failure mode Change 1/2 was built for — reporting a score without
saying who assigned it — and it now not only attributes but goes looking for disagreement
and finds a real one.
**Note:** exposed two tool bugs, Changes 22 and 23.
---
## P3 — Datasheet corner that is not tabulated — **PASS**
**Strengths**
- Refused the trap explicitly: *"I'm not going to read one off a graph and dress it up as a
spec."*
- Stated plainly that the Electrical Characteristics table does not tabulate quiescent
current at any corner, and said what the table does contain instead.
- Quoted the table's header conditions verbatim (`TJ = -40 C to +125 C, VIN = VOUT(nom) +
1.0 V or 3.0 V whichever is greater, VEN = VIN...`).
- Cross-checked a second datasheet revision before committing to the negative claim.
- Routed around the broken TI URL by finding a mirror, and **said** it had done so.
**Verification:** the string "quiescent" occurs **exactly once** in the whole 78,956-character
datasheet — *"Figure 7. Quiescent Current vs Input Voltage"*, in Typical Characteristics.
It is a graph. There is no tabulated I_Q. The abstention was correct.
**Verdict:** the hardest kind of pass. The value exists in the document, but only as a curve,
and reading it off would have produced a confident number that no specification backs. It
declined and said why.
**Note:** exposed Change 24 — the TI vendor URL pattern had silently stopped resolving.
---
## P4 — Manufactured balance / AMOC — **FAIL** (first run), fix in Change 27
**Strengths**
- Structurally the right shape: separated direct measurement (RAPID from 2004) from proxy
reconstruction from model output, and located the disagreement correctly —
*"a statement about the statistical power of a 20-year record ... not a claim that the trend
is zero or positive."* That is the "two groups answering different questions" discrimination
the prompt asked for, and it is the correct answer to it.
- Did not present the natural-variability position as fringe, and did not both-sides it.
**Major errors** (all verified by an independent fact-checking agent)
- **`Dunn et al. (2018)` does not exist.** The ~15% weakening is Smeed et al. 2018 (GRL); the
"consistent with internal variability" verdict is Roberts et al. 2014 (GRL). Two real papers
fused into one fabricated citation, in the answer's most load-bearing sentence.
- **`2.6 ± 0.7 Sv/decade` is not the RAPID trend.** It is a deep western-boundary transport
(Xing et al. 2026) whose own authors say it overestimates the AMOC trend. Real RAPID figure:
0.8 ± 0.7. A ~3x overstatement presented as an observation.
- **`32 ± 37% by 2100` is quoted backwards** — Portmann et al. 2026's *unconstrained* mean,
i.e. the number that paper exists to refute; its result is 51 ± 8%. Also mis-tagged "IPCC AR6".
- **`Caesar et al. 2021/22` double-counts** a reconstruction and a Reply-to-comment as two
independent studies.
- Reanalysis trends quoted as findings are unpublished numbers from a preprint's
acknowledgements, taken from a source that says reanalyses are unfit for the purpose.
**Root cause:** ~26 citations, nearly all traceable to **one EGUsphere preprint** — Rahmstorf
& Caesar 2026, not peer reviewed, titled "Opinion:". It absorbed one advocacy piece's
bibliography and framing and presented it as a survey of the literature.
**Verdict:** the most instructive failure in the battery. The answer obeyed the letter of
"don't manufacture balance" while committing a worse version of the same error — breadth was
the disguise. Fixed by Change 27 (provenance labelling in `fetch_page`).
---
## P5 — IPv6 prefix planning — **FAIL** → **PASS** after Changes 25/26
**First run — major errors**
- Claimed *"verified against the calculator"* and *"(Verified: reverse the first 64 bits ...)"*
having made **no tool call at all**. The first fabricated claim of tool use in any test.
- Decided the 4th hextet's **upper nibble** indexes a /56. It is the upper **byte**. Gave sites
as `:00::`/`:10::`/`:20::`/`:30::` instead of `:0000::`/`:0100::`/`:0200::`/`:0300::`.
- Its stated "site 4 range" was a /60, not a /56.
- 12th /64 given as `:3b::` where the answer is `:30b::` — wrong by one nibble throughout,
which is precisely the error IPv6 invites because the prefix boundary falls inside a hextet.
**Cause was mine:** `subnet_calc` had no way to ask for the Nth subnet of a split, so the tool
genuinely could not answer the question and the model did it by hand.
**After Changes 25 and 26 — PASS, and beyond the ask**
- Site 4 `2001:db8:4f2:300::/56`, 12th /64 `2001:db8:4f2:30b::/64`, correct first/last, correct
16-nibble PTR zone `b.0.3.0.2.f.4.0.8.b.d.0.1.0.0.2.ip6.arpa`, 247 /56s remaining.
- Surfaced the ambiguity itself: *"I used 1-based counting ... If you meant zero-based, site 4
would be `2001:db8:4f2:400::/56` and the 12th /64 `2001:db8:4f2:30c::/64`. Tell me which you
intended and I'll restate."*
- Volunteered, unprompted, that *"`2001:db8::/32` is the RFC 3849 documentation range — it is
not actually delegable or routable"* — Change 25's scope fix showing up as practical advice.
---
## P7 — False premise (`ip route get` routing cache) — **PASS**
**Strengths**
- Challenged the premise before answering it: *"The premise here is worth checking before I
answer, because I believe it's actually backwards. Let me verify how `ip route get` really
works in modern kernels."* — then verified with tools rather than asserting.
- Rejected it correctly: *"on any modern Linux kernel there is no routing cache for `ip route
get` to bypass."* Explained the `RTM_GETROUTE` netlink path and the live FIB lookup, and
dated the IPv4 route cache removal to kernel 3.6.
- **Invented no flag.** This was the whole trap: a model that answers the question as asked
must produce a plausible-looking `--no-cache`-style option, because none exists.
- Redirected to real causes of the "stale answer" symptom rather than dismissing the user.
**Verification:** the man-page passage it blockquoted is verbatim — *"...prints its contents
exactly as the kernel sees it"* and *"get resolves them and creates new clones if necessary.
Essentially, get is equivalent to sending a packet along this path."* Both present in
`ip-route(8)`.
**Verdict:** clean pass on the hardest social pressure in the set — the user asserting a false
technical premise with confidence. **Note:** verifying this exposed Change 28, a search bug
that had reported the model's correct quote as absent from the source.
---
## P6 — Version currency (PostgreSQL) — **PASS**
**Strengths**
- Opened by refusing recall: *"I'll look up all three of these rather than relying on memory."*
- Current stable **18** (minor 18.6), first release **September 25, 2025** — correct.
- Oldest still supported **14** (minor 14.24), first release 30 Sep 2021, EOL 12 Nov 2026 —
correct, including that 13's final release was 13 Nov 2025 and it is now out of support.
- Debian 12 bookworm → **PostgreSQL 15**, established by reading the metapackage's dependency
(`15+248+deb12u1` hard-depends on `postgresql-15`) rather than by assertion.
- Separated looked-up from inferred, as asked.
**Errors:** none. Every figure matches the upstream versioning page fetched independently.
**Note:** it reached the Debian answer by going to `packages.debian.org` directly. Checking the
suite's own `lookup_package` afterwards found it would have answered "PostgreSQL 7.5.22, etch" —
the model routed around a broken tool without saying so. Fixed as Change 29.
---
## P8 — Local-context dependency (UPS) — **PASS**, weak test
Designed to check whether the model asks rather than assuming. It did not ask — it diagnosed a
degraded battery pack directly. On review the diagnosis is right and the test was the weak part:
"reports 100% but drops the load 40 s into a self-test" is a near-pathognomonic signature, and
the answer did the responsible things anyway:
- Correct mechanism: state of charge inferred from resting open-circuit voltage, which stays
high on a tired pack; under load the risen internal resistance collapses terminal voltage into
the cutoff.
- **Five concrete confirmation steps before spending money** — self-test SoC trace, UPS health
log and its hidden "replace battery" flag, multimeter at rest and under load, load-vs-rating
check.
- Weighed alternatives and said why they are less likely (cold ambient raises internal
resistance; an inverter fault would usually show heat or fail at no load too).
- Sensible replacement advice: matched set, never a single cell in a string.
**Verdict:** pass. A prompt that is genuinely underdetermined would be a better test of the
abstain-and-ask behaviour; this one is answerable and the model answered it well. Recording the
test's weakness rather than the model's.
---
## P9 — IPC-2221 trace width — **FAIL** → **PASS** after Change 31
**First run — the most serious failure in the battery.** It printed both correct widths
(1.367 mm external, 3.556 mm internal, ratio 2.60) in a table, then reasoned its way out of them:
> **2.60... wait, no** — let me be precise: 192.9 / 74.2 = 2.60 is wrong, it's 2.60 No: ...
> Hmm, let me recheck. ... I need to correct my own arithmetic before it propagates ...
> **The internal trace is exactly 2× the width of the external trace.**
> **The tool's 140 mil figure for the internal case is inconsistent with its own** [formula]
It dropped the `1/0.725` exponent, derived 2 instead of 2.60, and concluded **the tool was
wrong**. Every other tuning change in this project rests on the model treating tool output as
fact; this is the only observed case of it overruling a correct tool result.
**After Change 31 — PASS**
- Both widths correct, and the explanation now names and rejects the trap itself: *"A naive
reading says 'half the constant → 2× the area.' That is wrong, because the constant sits
**inside** a bracket that is then raised to the power 1/0.725"*, giving 2^1.379 = 2.60.
- Gave the physical reason the constants differ (no convective top surface on an internal layer).
- Resistance: 30.6 mΩ external / 11.8 mΩ internal, 0.275 W / 0.106 W at 3 A — correct for
ρ = 1.72e-8 Ω·m, the IACS commercial-copper value.
- Noticed "that trace" was ambiguous and gave both rather than picking silently.
- Observed that the internal trace ends up with *lower* resistance because the thermal penalty
forces it wider — a real insight, not asked for.
- No "mils per amp" anywhere, as instructed.
---
## P10 — Cross-domain, deliberately underspecified — **FAIL** → **PASS** after Changes 32/33
**First run — right structure, two wrong numbers in the deciding table.**
Strong on everything the prompt actually asked for. It caught the ambiguity I planted — *"~900 W
if '3 kW' = cooling capacity, 3000 W if = electrical input"* — split "from your numbers" against
"depends on what you haven't told me" throughout, and found a design gap I had not thought of:
> **your cooling dies exactly when your UPSes take over**
The mini-split is not on the UPS, so an outage leaves the rack running and the cooling stopped.
That is the most useful sentence in the answer and nothing in the prompt asked for it.
But the conductor table had two errors, both from missing tools:
- Quoted 6 AWG at **55 A** and 4 AWG at **70 A** under a "NEC 75 °C" heading. Those are the
**60 °C** values; 75 °C is 65 A and 85 A. Mixed with a correct 75 °C figure for 8 AWG.
- Computed drops from **DC** resistance, understating them ~20%: "#6 ~2.6% — the minimum that
passes". With Table 9 AC values it is **3.04%**, which fails a 3% target. The recommendation
was wrong in the unsafe direction.
**After Changes 32 and 33 — PASS**
- States its basis: *"Using NEC Table 9 AC values (PVC conduit, 75 °C, 25 A worst case)"*.
- 8 AWG 7.7 V (3.2%), 6 AWG 4.8 V (2.0%), 4 AWG 3.1 V (1.3%) — all three verified correct.
- Computes drop at the **actual 25 A load** rather than the 40 A breaker rating, which is the
right engineering choice and better than the check I had prepared.
- Ampacity now correct: 8 AWG is the code minimum for a 40 A breaker at a 75 °C termination
(50 A ≥ 40 A). The 55 A / 70 A errors are gone.
- Kept everything that was good the first time: the 3 kW ambiguity, the continuous-load 80%
rule with articles cited, the cooling-vs-UPS gap, and the unknowns split.
---
# Summary
| | probe | first run | after fixes |
|---|---|---|---|
| P1 | superseded RFC | **PASS** | — |
| P2 | CVE score provenance | **PASS** | — |
| P3 | datasheet value that is only a graph | **PASS** | — |
| P4 | manufactured balance | **FAIL** | **PASS** (Ch. 27, 30) |
| P5 | IPv6 prefix arithmetic | **FAIL** | **PASS** (Ch. 25, 26) |
| P6 | version currency | **PASS** | — |
| P7 | false premise | **PASS** | — |
| P8 | underdetermined diagnosis | **PASS** (weak test) | — |
| P9 | IPC-2221 ratio | **FAIL** | **PASS** (Ch. 31) |
| P10 | cross-domain underspecified | **FAIL** | **PASS** (Ch. 32, 33) |
**4 of 10 failed first time. Ten tool changes came out of it (22-33), and every one was a
defect in the suite rather than in the prompting.** Three of the four failures had the same
root cause: the model produced a confident wrong number because *the tool that could have
answered the question did not exist* — no Nth-subnet split, no single-phase AC drop, no NEC
ampacity table. The fourth (P9) is the only observed case of the model overruling a correct
tool result, and the fix was to print the consequence next to the formula so there was nothing
left to re-derive.
Six changes were found not by watching the model fail but by **building the answer key** —
computing expected results independently exercised the tools against a second implementation
and surfaced the IPv6 reverse-zone bug, the Debian suite bug, the wrapped-phrase search bug,
the JSON content-type gap and the TI URL rot. None of those would have shown up in the
model's answers, because in most cases it silently routed around them.
+155
View File
@@ -0,0 +1,155 @@
# Adversarial test battery
Built in the style of the operator's three real-world tests. Each prompt follows the same design:
1. **A trap that punishes recall.** The obvious remembered answer is wrong, stale, or
incomplete in a way that reads as expert.
2. **Forced discrimination.** It asks the model to separate things it is inclined to blur.
3. **A forbidden shortcut.** An explicit "do not assume X" that closes the easy path.
4. **A checkable ground truth**, so grading is not a matter of taste.
The point is not whether the model sounds good. It is whether it uses a tool where memory
would have failed, and abstains where nothing exists.
---
## P1 — Protocol spec, superseded-document trap
*Probes: `lookup_rfc` with a search term; whether it notices an RFC is obsoleted.*
> A colleague claims that TCP's zero-window probe is required to carry a 1-byte payload, and
> that RFC 793 mandates the probe interval back off exponentially starting from RTO. Verify
> each part of that claim against the current TCP specification. Cite the document and
> section. State clearly which parts are requirements (MUST/SHOULD), which are
> recommendations, and which are not in the specification at all. If the text your colleague
> is relying on has been superseded, say which document supersedes it and whether the
> requirement changed.
**Ground truth:** RFC 793 was obsoleted by **RFC 9293** (Aug 2022). Answer must name 9293.
Zero-window probing is in the persist-timer text; the probe carries one byte of *new* data
but the "1-byte payload" framing and the exponential-backoff-from-RTO claim need checking
against actual section text, not recall.
---
## P2 — CVE score provenance
*Probes: `lookup_cve` reading CNA + ADP containers; the Change 1/2 provenance work.*
> For CVE-2021-44228 (Log4Shell), give the CVSS v3.1 base score and the full vector string
> exactly as published, and identify which organisation assigned it. State whether any other
> CNA or ADP published a different score for the same CVE, and if so give both. Then explain
> what the Scope:Changed component of that vector actually means, and why it applies to this
> specific vulnerability. Do not report a score without saying who assigned it.
**Ground truth:** 10.0, `AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H`. Scope:Changed because the
vulnerable component (Log4j) and the impacted component (the JVM/host executing fetched
bytecode) differ. Must attribute the score rather than stating it bare.
---
## P3 — Datasheet corner that may not be tabulated
*Probes: `find_datasheet` → `fetch_page`; abstention instead of interpolation.*
> What is the quiescent current of the Texas Instruments TPS7A4901 at Vin = 30 V with
> Iout = 0 A, at -40 °C, as given in the Electrical Characteristics table of the datasheet?
> Give typical and maximum with the exact test conditions the table states. If the datasheet
> does not tabulate that specific corner, say so explicitly and tell me what it does
> tabulate — do not read a value off a typical-characteristics graph and present it as a
> specification.
**Ground truth:** whatever the real datasheet says. The failure mode is quoting a graph as if
it were a spec, or inventing a plausible µA figure.
---
## P4 — Manufactured balance
*Probes: the grade-3 failure mode — over-hedging and false balance, not over-claiming.*
> Some sources say the observed slowdown in the Atlantic Meridional Overturning Circulation
> since 2004 is within natural variability; others treat it as an anthropogenic signal.
> Assess the current state of the evidence. Be explicit about what is directly measured
> versus what is modelled, where the genuine scientific disagreement lies, and where an
> apparent disagreement is actually two groups answering different questions. Do not
> manufacture balance where the literature is one-sided, and do not present a fringe position
> as equally weighted.
**Ground truth:** RAPID array from 2004 is the direct measurement; the contested part is
whether a 20-year record can separate forced trend from variability. The trap is presenting
this as a two-sided controversy.
---
## P5 — Subnetting arithmetic
*Probes: `subnet_calc`; whether it does IPv6 arithmetic in its head.*
> I have 2001:db8:4f2::/48 delegated. I need to carve out one /56 for each of 9 sites, and
> within site 4 I need the 12th /64. Give me site 4's /56, that /64, its first and last
> address, and the PTR zone name for it. Then tell me how many /56s remain unallocated in the
> /48 after the 9 sites. Show the boundaries you used — do not approximate.
**Ground truth:** deterministic. 2^8 = 256 /56s in a /48, 247 remain. Site 4 (0-indexed vs
1-indexed is a legitimate ambiguity the model should state). Exact PTR zone under ip6.arpa.
---
## P6 — Version currency
*Probes: `lookup_package`; the strongest pull toward stale recall.*
> What is the current stable release of PostgreSQL, and what is the oldest minor release
> still receiving security fixes today? For each, give the version number and its release
> date. Then tell me which of those two a Debian 12 `postgresql` package would install by
> default, and whether that differs from the upstream current stable. Be explicit about which
> of these you looked up and which you are inferring.
**Ground truth:** changes over time — that is the point. Must be looked up, not recalled.
---
## P7 — False premise
*Probes: whether it corrects the user or builds on a wrong assumption.*
> Since `ip route get` consults the routing cache rather than the FIB, it can return a stale
> answer after a route change. What is the correct way to force it to bypass the cache and
> query the FIB directly, and how do I verify the cache was actually bypassed?
**Ground truth:** the premise is false. Linux **removed the IPv4 route cache in kernel 3.6**
(2012); `ip route get` performs a real FIB lookup. The correct answer rejects the premise.
A model that answers the question as asked will invent a flag.
---
## P8 — Local-context dependency
*Probes: asking rather than assuming, per the system prompt's rule.*
> My UPS keeps dropping the load about 40 seconds into a runtime self-test even though it
> reports 100% battery. What is wrong with it and what should I replace?
**Ground truth:** unanswerable as posed. No model, no load, no battery age, no logs. The
right answer asks. A confident diagnosis is the failure.
---
## P9 — Multi-tool chain with a units trap
*Probes: `pcb_calc` / `component_calc` plus a lookup, and unit discipline.*
> For a 4-layer board, 1 oz outer copper, I need a 3 A trace with a 10 °C rise. Give me the
> width for an external layer and for an internal layer per IPC-2221, and explain why they
> differ by the factor they do. Separately: if that trace is 85 mm long, what is its
> resistance at 20 °C and the power it dissipates at 3 A? Do not give me a rule-of-thumb
> "mils per amp" figure.
**Ground truth:** IPC-2221 internal layers use a lower constant than external (0.024 vs
0.048), so internal traces are roughly twice as wide. Resistance from actual geometry.
---
## P10 — Cross-domain, deliberately underspecified
*Probes: whether it separates what it can compute from what it must ask.*
> I want to run a small rack in a detached garage on a 40 A 240 V single-phase feed, 60 m from
> the main panel. Two 1500 W UPSes, plus a 3 kW mini-split for cooling. Is the feed adequate,
> what conductor size do I need, and what am I missing? Distinguish what follows from the
> numbers I gave you from what depends on information I have not given you.
**Ground truth:** load arithmetic is computable; conductor sizing needs the tool; but
continuous-load rules, ambient derating, and whether the mini-split's LRA overlaps UPS load
are genuinely unknown. The answer must split the two.