I kept coming back to a small problem in security testing:
If the business outcome is safe, do we know that the control under test actually worked?
Often, we do not.
A downstream safeguard may prevent the final impact after an earlier control has already failed. If a test checks only the last step, the whole path goes green and the failed control disappears from the result.
I built a deliberately plain example to make that ambiguity visible: a support export, an entitlement boundary, and a release guard.
The request that “passed”
In the synthetic case, support-017 has an active case for one customer. The account then requests one record from each of ten other customers.
The effective entitlement is wrong: it contains a wildcard instead of the assigned customer's scope. The policy engine faithfully enforces that bad entitlement, and the service selects all ten out-of-scope records.
A later release guard sees an unapproved sensitive bulk response and blocks it.
The client receives nothing.
Entitlement boundary 10 out-of-scope records selected REFUTED
Release guard release blocked SUPPORTED
Outside boundary 0 out-of-scope records delivered SUPPORTED
Final-outcome-only PASS
Control-specific MASKED TARGET FAILURE
Enter fullscreen mode Exit fullscreen mode
At the client, the tested outcome is safe. Inside the service, the intended entitlement boundary has failed.
The release guard reduced the impact. It did not retroactively repair the entitlement.
The same outcome can have different causes
Looking only at “records delivered” makes very different executions appear identical:
| Entitlement | Release guard | Out-of-scope selected | Guard result | Delivered |
|---|---|---|---|---|
| Wildcard misgrant | Monitor only | 10 | Allowed | 10 |
| Wildcard misgrant | Enforce | 10 | Blocked | 0 |
| Case scoped | Monitor only | 0 | Not reached | 0 |
| Case scoped | Enforce | 0 | Not reached | 0 |
The second and fourth rows both end at zero delivered records.
In the second row, unauthorized selection occurred and a downstream control contained it. In the fourth row, the entitlement boundary stopped the request before the guard had anything to inspect.
Those are not interchangeable results.
The fourth row exposes another easy mistake: a guard that is configured but never reached has not demonstrated that it can block this request. It should be reported as not exercised, not given credit for the safe outcome.
I use masked target failure for the second row: the target control failed, while a compensating control hid that failure from an outcome-only check.
One successful request is not enough
The checked-in case is built from 16 executions:
2 inputs
× 2 entitlement states
× 2 release-guard modes
× 2 redeploy states
= 16 executions
Enter fullscreen mode Exit fullscreen mode
The two inputs are the out-of-case export and a normal assigned-case request. Each execution uses a fresh SQLite clone and its own trace identity.
The entitlement changes between a wildcard misgrant and case-scoped access. The release guard changes between monitor-only and enforcement. A sham redeploy repeats the deployment lifecycle without changing control semantics, which helps expose restart, cache, ordering, or harness effects.
The normal request is not just a health check. It must still return the assigned record. In the included evidence it succeeds in all eight benign combinations.
That matters because “deny everything” is not a successful access-control fix. It is an outage.
The useful inference is narrow:
- under the fixed synthetic request and environment, correcting the entitlement changes out-of-scope selection from 10 records to 0;
- enforcing the release guard changes final delivery from 10 records to 0 when the bad selection reaches it;
- the normal assigned-case request remains available; and
- a redeploy without a semantic change does not explain the difference.
This is stronger than reading one log line, but it is not universal proof that the same control is effective in production.
Keep each fact at its own layer
The result preserves three observations separately:
target out-of-scope records selected
compensator unapproved release blocked
outcome out-of-scope records delivered
Enter fullscreen mode Exit fullscreen mode
They come from different points on the path and support different claims.
The outcome-only baseline reads the final delivery observation and returns PASS. In this case, it evaluates that one observation while ignoring 59 others.
The control-specific evaluation uses the same evidence but refuses to let the final outcome overwrite an upstream result:
- entitlement boundary: refuted;
- release guard: supported;
- tested delivery path: supported;
- residual issue: unauthorized selection occurred before release.
There is no average score that turns those statements into one green badge.
The table is derived, not hand-written evidence
The repository includes the experiment contract, raw runtime observations, stage records, trial attestations, cleanup observations, and the deterministic synthetic dataset.
The verifier checks that the bundle covers the exact 16-cell plan, that trial and clone identities were not reused, and that recorded interventions match the compiled experiment. It then reconstructs the displayed values from the raw stage evidence and evaluates the claims again.
Missing evidence, mismatched interventions, reused lineage, or failed cleanup prevents a positive conclusion.
You can open the verified case in a browser. The browser hashes the bundle files, ties displayed values to the verified records, and recalculates the four current point claims and masked-failure classification. It deliberately does not claim to recompute the complete experimental protocol or every matched contrast; the CLI does that.
To verify the checked-in evidence locally:
git clone --branch v0.1.2 --depth 1 \
https://github.com/gyubin02/control-assurance-lab.git
cd control-assurance-lab
python3.12 -m venv .venv
. .venv/bin/activate
python -m pip install \
--only-binary=:all: --require-hashes -r requirements/ci.lock
python -m pip install --no-deps --no-build-isolation .
assurance-lab verify examples/masked-export.cab
Enter fullscreen mode Exit fullscreen mode
The result should end with:
Final-outcome-only PASS
Control-specific MASKED TARGET FAILURE
Evidence cab:sha256:a0d192d2...02725136c4a3
Scope synthetic · simulated clock · integrity-only
Enter fullscreen mode Exit fullscreen mode
The source and evidence are in Control Assurance Lab.
The boundary matters
This is an alpha reference implementation using a synthetic scenario and a simulated clock. The checked-in bundle has an integrity-only profile.
Its digest can reveal that covered bytes changed. It does not authenticate the publisher, prove that the original collector told the truth, establish effectiveness in a live financial network, or demonstrate regulatory compliance.
That limitation is part of the result, not a footnote to hide.
The point is narrower: a safe downstream outcome should not be asked to testify on behalf of every upstream control. Sometimes “nothing left the system” and “the first control failed” are both true.
If you have seen a downstream safeguard hide an upstream failure, I would be interested to hear how your team recorded the result.
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.