Intelligence
AEV-2026-0050

Vibe-Trading's report audit gate returned PASS on a call where every sampled point's evidence was missing

Vibe-Trading's research report audit gate, render_verdict in report_audit_tool.py, skipped every data point whose fetched_value was missing without counting it, then computed PASS whenever the accumulated failed count was zero. A call carrying two reported values and no fetched value for either, reproduced directly for this record, returned verdict PASS, total 0, pass_count 0, fail_count 0, an empty evidence set certified with the framework's own highest confidence word.

AESS 7.0 highConfirmedStatus: resolvedEvent: 6 September 2026Audit and EvidenceExecution Authority

Affected

Organisation
HKUDS
Product
Vibe-Trading, an open source LLM agent trading and research framework, report_audit tool
Component
render_verdict (agent/src/tools/report_audit_tool.py)
Versions
Every commit before merge commit cc4774ed42d9f2e24e66ea4a7ee8d283c553bbba (pull request 1362), fixed in that commit, merged 6 September 2026
Configurations
A verdict call whose results list carries one or more points, each with a reported_value, where every point's own fetched_value is None because an upstream fetch was never attempted or did not succeed

Execution authority facts

Fields the evidence does not establish are shown as unknown rather than guessed.

Intended task
Gate a research report's sampled numeric claims before publication by comparing each against an independently fetched value, returning PASS only when the sampled points were checked and none failed
Agent
unknown
Delegating actor
unknown
Action
Submitted a verdict call for two sampled points, reported values 1234.5 and 999.0, with fetched_value None for both, reproduced directly for this record
Target resource
The report_audit gate's own certification of the sampled report, and any downstream decision, such as publication, that treats the gate's PASS verdict as meaning the sample was verified
Environment
Vibe-Trading's report_audit tool (agent/src/tools/report_audit_tool.py), verdict phase
Credentials used
unknown
Privileges available
Whatever the agent's own tool calling loop can reach; report_audit's own verdict command is read only and writes nothing
Authority presented
The gate's own verdict, PASS, computed from fail_count equal to 0 over an accumulated total of 0 checked points
Authority required
Authority to certify the sample as verified requires at least one point actually checked against a fetched value and found to agree; a call in which every point's evidence is absent never reaches that bar
Applicable policy
render_verdict, which this record's own direct read of the commit before the fix confirms skipped a None fetched_value with a bare continue, contributing to neither total nor fail_count, and set the final verdict to PASS whenever fail_count was 0 with no separate floor on total
Approval mechanism
Automated policy check, not human review
Required approver
unknown
Independent approval
no
Action binding
The returned verdict object, PASS with total 0, carries no field or flag distinguishing an empty checked set from a genuinely checked and passing one; a downstream reader trusting the verdict word alone cannot tell the two apart without separately inspecting total
Sequence context
The verdict call runs as the second of report_audit's two phases, immediately after an extract phase samples a report's own data points and separate tool calls attempt to fetch each sampled point's authoritative value; nothing upstream of render_verdict is established by this record to have blocked publication on its own

Impact

Consequence
material
Reach
single
Reversibility
unknown
Detectability
silent
Propagation
potential
Recovery
Not established by anything available to this record. Nothing in Vibe-Trading's own repository describes a compensating control, such as a separate downstream check on the verdict object's own total field, for a report that reached this gate with no fetched evidence for any sampled point.

Evidence

Primary sources

Supporting sources

Reproduction status
Independently reproduced for this record, not merely read from the pull request's own description: render_verdict's literal source was extracted directly from both the commit before the fix (9c063312) and the fixed commit (fc780704) of a local clone and executed in isolation. The stated scenario, two points with reported values 1234.5 and 999.0 and no fetched value for either, returns verdict PASS, total 0, pass_count 0, fail_count 0 at the commit before the fix, and verdict FAIL, total 0, fail_count 1 at the fixed commit, with the added failure item's own reason stating that no data points were verified because every result lacked a fetched value. A companion reproduction confirms a present but non finite fetched_value, a string such as about 100, raises an uncaught value error at the commit before the fix and a clean FAIL at the fixed commit, and that a genuinely absent fetched_value beside one genuinely checked and passing point still returns PASS with total 1 at both commits.
Evidence state
Confirmed

Known unknowns

  • Whether this exact gap was ever exercised against a report that reached actual publication or a reader, rather than the synthetic inputs this record's own reproduction and the pull request's own added tests use.
  • Whether report_audit is the only gate standing between a drafted report and publication in Vibe-Trading's own pipeline, or whether a separate, later step would independently have caught a report whose sample carried no verified evidence.
  • Whether the five day proximity between this fix and the unrelated MCP order gate fix in pull request 1361, both merged the same week, reflects a broader review pass across the framework's own gates or is coincidental; the pull requests' own text does not say and this record does not infer a connection between the two mechanisms.

Limitations

  • This record's evidence rests on a direct, independent checkout and isolated execution of render_verdict's own literal source at the commit before the fix and the fixed commit, rather than on the pull request's own description alone. The full framework's dependency set was not installed for this record; render_verdict itself was isolated and executed directly against both commits' literal source, and its own five new tests were read directly against the diff rather than run inside the framework's full test harness.

Claim provenance