AI Skill Test-Execution Integrity Automation: A Coin Flip Decided Pass or Fail, Then Copied the Answer Key

A pass/fail badge only means what the code behind it actually checked
A test suite with a green pass badge next to a version number is one of the most trusted signals in software — it's specifically the kind of evidence a team relies on to decide whether something is safe to promote or ship. That trust is only as sound as what the code labeled "test" actually does the moment it runs: nothing about a badge, a percentage, or a run-history entry can, by itself, distinguish a genuine comparison of a real output against a real expectation from a function that simply decided the outcome in advance and recorded a result to match. The entire value of a test suite lives in the gap between "looks like a test ran" and "a test genuinely ran," and that gap is invisible from every normal vantage point except reading the function itself.
How the underlying problem shows up before you fix it
A "test" or "certification" outcome is decided by a probability roll rather than any actual comparison between a produced output and an expected one.
On a passing result, the system records the identical value in both the "expected" field and the "actual" or "obtained" field — the two things a real test is specifically supposed to compare against each other.
An audit or run-history log records that an evaluation executed and passed, at a point in the code where no evaluation of any kind took place.
A test harness has no distinct path for a genuinely ambiguous or incomplete case — a missing configuration, an undefined behavior to test — other than reporting a pass or fail as if a full evaluation had actually occurred.
A dashboard's aggregate pass rate sits suspiciously close to one fixed percentage over time, regardless of how many test cases exist or how different they are from each other.
Why a placeholder test result is invisible to everything downstream of it
Building a complete testing feature — defining test cases, storing run history, rendering a pass/fail badge, computing an aggregate success rate — is substantial, genuinely necessary work, and a placeholder decision function that just returns a plausible pass/fail ratio lets every one of those other pieces look and behave correctly from the very first demo. The run-history table fills in with rows, the badge renders, the percentage looks sensible — because nothing about how those downstream pieces work depends on whether the underlying decision came from a real evaluation or a coin flip; they only depend on receiving a record shaped like one. That shape-only dependency is exactly what allows a placeholder to survive well past the point where a real evaluation was supposed to replace it, since nothing anywhere in the pipeline ever has a reason to ask.
How Centriu Axiom made the skill test actually test something
This gap surfaced from the same internal audit that rewrote Axiom's proof-of-action mechanism and its safety-scanner enforcement (both covered on this pillar's companion pages) — a feature not yet fully built presenting itself as complete. For the Skill Library specifically, the prior code inside `runTest` was, quoted directly: `const passed = Math.random() > 0.2` — an unconditional 80% pass rate with no relationship whatsoever to the skill's actual prompt, its version, or the specific test case being run. Worse, when that random roll happened to land on "pass," the code copied the test's own `expected_json` — the answer key — directly into `actual_json`, the field specifically meant to record what the skill actually produced. The "obtained" result displayed to anyone reviewing that test run was, by construction, always identical to the expected result, because it was never anything else. And this didn't stay confined to the screen: every run — genuine or not — was logged to the audit trail as a `skill_test_run` event carrying `passed: true`, a permanent record asserting that an evaluation had occurred and succeeded, when nothing had been evaluated at all. Anyone deciding whether to promote a skill version to production based on that run history would have been deciding based on statistical noise dressed up as measurement.
The fix replaces the entire decision with a real execution path. `runTest` now looks up the actual skill version being tested and its real `prompt_template`; if that version doesn't exist, it fails immediately with an explicit message that nothing was executed, rather than reporting any pass/fail result at all. If the version exists but its prompt template is empty, the function explicitly refuses — "there is nothing to execute; define the prompt before testing" — precisely because reporting a pass or fail for a test with no defined behavior would recreate the exact failure mode this fix exists to eliminate. When a real prompt does exist, it's rendered by substituting each double-brace placeholder name with the corresponding value from the test's own `input_json`, then sent to the same AI proxy the rest of the product already uses, explicitly configured for a temperature of zero and a JSON response format — deterministic, real generation, not a simulated one. If the AI backend itself fails to respond, that's recorded as an infrastructure failure with its own specific message, honestly distinguished from a skill genuinely failing its test, since a temporary outage in the underlying AI proxy says nothing about whether the skill's own prompt is any good. If the response comes back but isn't valid JSON, the function fails with a message saying so and still records the first 500 characters of what was actually returned, for debugging — rather than discarding it. Only once a real, parsed JSON response exists does the function compare it against the expected output, using a canonical, key-order-independent comparison that walks every expected field and reports the specific ones that are missing or mismatched, rather than a single undifferentiated "didn't match."
Critically, the recorded `actual_json` now always holds the real response the model produced — including on a pass, which is the exact case the old code fabricated by copying the answer key instead. The audit log entry logged for every run now reflects a genuine outcome: a real pass only when a real comparison found no divergence, a real failure with the real, specific reason otherwise. Confirmed directly against the current source: `Math.random()` is gone from the function entirely, `proxyGemini` is genuinely imported and called at temperature zero, and a real, wired button in `SkillLibrary.tsx` (`handleRunAllTests`) still calls this exact path today, running every defined test case for a skill version in sequence.
What is actually built today
A real prompt-rendering step that substitutes each test's actual input values into the skill version's own prompt template, rather than deciding an outcome without ever constructing a prompt.
A genuine call to the same AI proxy the rest of the product uses, at a deterministic temperature of zero, replacing an unconditional 80% random pass rate.
A field-by-field, key-order-independent comparison between the real response and the expected output, reporting the specific fields that diverge rather than a single pass/fail bit.
The recorded "obtained" result is always the model's real response — including on a pass, correcting the prior behavior of copying the expected answer into that same field whenever the random roll happened to succeed.
Explicit, honestly-labeled refusals for every dead end: a missing skill version, an empty prompt template, a non-JSON response, or an unreachable AI backend — each distinguished from an actual skill failure.
An audit trail that only ever records a genuine pass or a genuine, specifically-explained failure — never a fabricated outcome for a test that did not execute.
A prompt that was never actually checked, then genuinely was (illustrative scenario, not a real client)
A skill's test expects a JSON object with three specific fields. Before the fix, running that test would report passing roughly four times out of five no matter how the prompt was worded, because nothing had ever actually asked a model to produce anything. After the fix, the same test genuinely sends the rendered prompt to the AI; if the response is missing one of the three expected fields, the test fails and the run's error message names exactly which field was absent, rather than a generic "didn't match."
What changes operationally
A pass recorded against a skill version now means a real prompt was rendered, sent to a real model, and its real response genuinely matched the expected output field by field — not that a random number happened to clear a fixed threshold. Anyone reviewing a skill's test history or deciding whether to trust a version in production is now reading a record of what actually happened, including the model's real output on every run, not a copy of the answer key standing in for it.
When this is not the right fit
This mechanism verifies that a skill version's output matches an exact expected JSON shape for the specific test cases someone has explicitly defined — it does not evaluate open-ended qualities like tone, creativity, or persuasiveness beyond whatever the expected JSON encodes, and it says nothing about how the skill behaves on inputs nobody has written a test case for. A team wanting broader, subjective quality evaluation of a skill's output will need a separate mechanism for that; what this fix guarantees is that the specific, defined comparisons it runs are genuinely run.
A pass rate that never moves vs. one that reflects what actually happened
A pass/fail decision generated by a fixed-probability random function will always trend toward that same fixed percentage regardless of how good or bad the underlying prompt actually is — it carries zero information about quality, because it was never connected to quality in the first place. Centriu Axiom's fix replaces that with a real execution and a real comparison, so a skill's pass rate can now genuinely move in response to a prompt actually getting better or worse, because it's finally measuring the thing it always claimed to measure.
Related systems
Main system: Centriu Axiom.
What it does NOT do
- Does not decide a pass or fail outcome using any random-number function — every result comes from an actual comparison between a real AI response and the test's expected output.
- Does not record the expected answer as the "obtained" result on a pass — the actual model response is recorded in every case, including passing ones.
- Does not report a pass or fail for a skill version that doesn't exist, or for a version with no prompt template defined — both cases produce an explicit refusal explaining that nothing was executed.
- Does not treat an AI-backend failure as a skill failure — an unreachable or non-responding proxy is recorded with its own distinct, honest message rather than counted against the skill's own quality.
- Does not discard a non-JSON response silently — it records what was actually returned (truncated for length) alongside an explicit parse-failure message, for debugging.
- Does not log a genuine-looking audit entry for a test that did not actually execute — every `skill_test_run` audit record now reflects a real, specifically-explained outcome.
Security and governance
Skill test execution runs through the same AI proxy already used elsewhere in the product, at a deterministic temperature, and does not persist prompt content anywhere beyond the existing test-run history the organization already controls. Any personal or business data referenced in a test's input or expected output remains subject to Brazil's LGPD (Law No. 13,709/2018). Full detail on access control lives at /governanca and /iso.
Pricing and contracting
Available by monthly subscription, with tiered plans. Values and terms come from the official pricing table at /precos (Centriu's central source — never restated here).
Frequently asked questions
Did skill tests ever actually run before this fix?
No — the pass/fail outcome was decided by `Math.random() > 0.2`, an unconditional 80% pass rate with no relationship to the skill's actual prompt or the AI's actual behavior.
What happened to the "obtained result" field when a test randomly passed?
It was overwritten with the test's own expected answer — the field meant to show what the skill actually produced always mirrored the answer key on a "pass."
How does the comparison work now?
The skill version's real prompt is rendered with the test's actual input, sent to the AI proxy at temperature zero, and the real JSON response is compared field by field against the expected output using a canonical, key-order-independent comparison.
What happens if the AI backend itself fails during a test?
It's recorded as an infrastructure failure with its own distinct message, explicitly not counted as the skill itself failing its test.
What happens if a skill version has no prompt template defined yet?
The test explicitly refuses rather than reporting a pass or fail — there is nothing to execute, and the function says so directly.
What does Centriu Axiom cost?
It is sold by subscription with a published starting price — exact current values are on the central pricing page.
See how Centriu Axiom actually certifies an AI skill before you trust it
Reach our commercial team directly, or leave your details below — we'll follow up with guidance for your case.