AI agents
Multi-step execution, state transitions, decision paths, failure recovery and tool interaction. Does the agent complete the intended task under controlled adverse conditions?
Independent adversarial validation for AI agents, tool-using systems, evaluation pipelines and technical benchmarks. We test the system — and the measurement that says it works.
Start with a claim your system makes. Define what would disprove it. Test the paths and conditions that a headline score can hide.
Multi-step execution, state transitions, decision paths, failure recovery and tool interaction. Does the agent complete the intended task under controlled adverse conditions?
Compare behavior after changes to models, prompts, context, tools, orchestration or infrastructure. Identify regressions that an aggregate success rate conceals.
Tool schemas, permissions, routing, selection and state propagation. Exercise malformed responses, unavailable tools and unexpected behavior across the interaction.
Test whether an evaluation measures what its authors think it measures. Inspect labels, leakage, metric defects, silent exclusions and evaluation-code bugs.
Thresholds · Invalid assumptions · Non-independent samples · Misleading aggregate scoresDetermine whether an optimization improved the system or moved the failure. Compare latency, throughput, cost and quality against a reproducible baseline.
Quantization · Inference configuration · Model and backend changes · Caching · Batching · HardwareIndexing, corpus state, answerability, grounding, citations and omissions. Trace silent retrieval failures through ranking, chunking and the evaluation harness.
Focused work in synthetic speech evaluation, technical benchmarking and scientific software, including published research on quantum-compiler benchmarking. Scope follows the available evidence and a defensible reference.
The result is an evidence package you can inspect and reproduce. The conditions and limits travel with every finding.
Agree what “correct” means, what is being measured and where the claim stops.
Record versions, inputs, settings and controls before interpreting an improvement or a failure.
Check the scorer, labels, sampling and exclusions. Ask what could fail without moving the score.
Introduce adversarial, shifted or pathological conditions with an explicit expected behavior.
Use defensible comparisons and controls. Separate a system defect from noise or a broken test.
Deliver the commands, raw output, characterized failures, corrections and limits.
Executable reproductions, controlled test cases and raw evidence. Datasets or corpora where applicable, corrected measurements, regression tests and concrete recommendations. You keep the harness and the findings.
Public reports, issue threads and corrections. Inspect the conditions behind a finding before trusting the headline.
Testing an external code indexer exposed incorrect relationships between same-named functions. Every measurement was made from outside, against a pinned build, with no access to the source. The maintainer confirmed each finding at source level in public, and located the last one himself.
Small source examples isolated incorrect cross-file call resolution, phantom import edges and misleading edge descriptions. A pre-registered before/after across two releases then established a third and deeper finding: the graph stores one edge per source, target and relation type, with the field identifying which import outside that key — so an import that resolved and was merged away leaves exactly what an import that never resolved leaves, which is nothing. Fifteen apparent regressions were two. The findings concern these specific cases in Octocode, not every result produced by the indexer.
Three denominator analyses were retracted after the maintainer disclosed that an internal sort was unstable; the instability was then confirmed independently from outside. An early figure taken from a contaminated index store was withdrawn and re-measured. The count of affected statements was revised downward three times, each time after checking one layer further.
An internal metric returned the same clean zero for genuine agreement, a task with only one possible answer, and calls that failed in transport. That number did not establish answer quality.
The published account reports that the metric was anti-correlated with answer quality in the tested setting. Distinguishing transport failure from a valid observation is part of validating the measurement itself.
A published result was corrected from a 32 percentage-point improvement to 15.8 after auditing the scorer. The paper and correction remain public.
The correction rescored 1,786 saved items from the same corpus and Qwen3 model setting, using authored gold orderings. It does not establish that the corrected improvement generalizes to other corpora or models.
An evaluation function returned an empty list. Its output was recorded as a measurement in every result row, so an unimplemented check appeared to report no errors.
A result can be structurally valid and still contain no measurement. The published finding separates an absent check from a test that actually ran and passed.
On 28 August 2026 I audited 38 of my own live pages. The two findings worth writing down were not about the pages. They were about the tools I was using to judge them — and both tools were wrong, in opposite directions.
One script reported three pages I had just fixed as still broken, because it did not recognise a relative link. A working fix looked like a failure.
One date parser had thrown an exception on every crawl-statistics read since it was written. The report that answers “is the crawler arriving at all” had never once returned a number. A working crawler was invisible.
I spent a day acting on numbers produced by instruments nobody had checked. That is the ordinary state of most evaluation code — including the code that tells you your AI system is working.
IBM's Benchpress pins the seeds that build its circuits and passes no seed to the code that compiles them. On one circuit, over 400 seeds per version, the real change between two Qiskit releases is +5.37%. The suite's own three-run protocol reports that as a ≥10% regression 24.4% of the time. Somebody merges or reverts a pull request on that answer.
Every URL in the sitemap, over plain HTTP with no JavaScript executed. An earlier audit on this same estate had returned “all clean” for months while the homepage was handing crawlers a fraction of its navigation in a form they could not use. That is why the rule is a number per page rather than a pass mark.
Reported unchanged in the same table, because a measurement that only shows movement is an advertisement: canonical problems 0 → 0, images with no alt attribute of 199 0 → 0, non-200 responses 0 → 0.
<button onclick> — usable
with a mouse, invisible to a crawler.
Read the audit
Fixed scope, agreed in writing before work starts. Conducted personally by Panagiotis (Panos) Gkilis. Remote, using a copy, staging environment or public API.
A focused first step around one failure mode or technical question. Establish the useful scope and test a specific concern.
Credited in full toward a €2,000 engagement if the project continues.
An independent investigation of the system's behavior and the measurement used to judge it.
This is not a code review. This is not a penetration test.
We validate claims, measurements and system behavior.
No production access required.
A passing set of tests does not certify that a system is safe.
A way to provide inputs and read outputs, plus a conversation at the start to agree what “correct” means. A repository copy, staging system or public API can be enough. Access and scope are agreed before work begins.
You receive a written account of the cases, controls and limits. Absence of a reproduced failure is reported as that, with no claim that the system is sound beyond the tested conditions.
You keep the corpora, harness and reproductions produced for the engagement. Findings remain private unless you choose publication; published results include their limits and corrections.
Start with what the system does, how you judge it today and the failure you most want to rule out. The €400 investigation can establish a useful, bounded target for the full engagement.
BED VIBE GKILIS is a Norwegian sole proprietorship for independent research and engineering. Panagiotis (Panos) Gkilis conducts the validation work and builds the instruments behind it.
Public research, open-source packages and operating AI systems make the work inspectable. Corrections are part of that record, including corrections to our own measurements.
No incentive to certify a system merely because the client wants a green result.
Open tooling, published experiments and operating systems. The broader lab work supports the validation practice.
Investigations of evaluation defects, tool behavior and code intelligence, with public issue threads and corrections.
Research notebook ↗Tool investigation ↗notchecked records which checks ran, could not run or were outside scope. BookProof checks AI-generated summaries and answers against their source manuscript.
notchecked / PyPI ↗BookProof ↗Open-source tools for TTS quality assurance, training-run failure detection and speaker-verification false rejection.
ttsproof ↗trainproof ↗spkproof ↗Research into compiler randomness, regression decisions and the reliability of benchmark measurements. Results retain their experimental scope.
Study and replication ↗Research record ↗An operating observability platform tracks AI crawler and search-engine activity with continuously collected evidence.
Open the Observatory ↗Retrieval systems, evaluation tooling, speech infrastructure and the systems that connect them.
Engineering portfolio ↗Source repositories ↗Tell Panos what the system does, how you evaluate it today, and the failure you are most concerned about. Include a repository, staging URL or public API if available.
bedvibe@bedvibe.studio ↗Direct contact · Scope agreed before work begins