Reproduced on frozen TRACE revision 6737005e1feefa5739d971a2b71ac123a4235220 using governed DSR job fe2b6851dcb866fb0ddcb43d639d8a10 on worker vps-377a113a.
Observed behavior
For the same signed TRACE v0.2 record and same trusted key:
max_age_seconds=86400 vs max_age_seconds=None -> identical successful VerificationResult
max_future_skew_seconds=300 vs 3600 -> identical successful VerificationResult
now=iat+60 vs now=iat+120 -> identical successful VerificationResult
The result object contains only:
revocation
trusted_key_thumbprint
Control: revocation context is preserved. No revocation source yields no_check_performed; an empty consulted store yields verified, so those results differ.
Opposite-direction control: age policy is decision-relevant. At now=iat+86401, max_age_seconds=86400 rejects as stale while max_age_seconds=None accepts.
DSR output:
{
"age_policy_collision": true,
"skew_policy_collision": true,
"verification_time_collision": true,
"age_policy_semantically_live": true,
"revocation_noncollision_control": true,
"result_fields": ["revocation", "trusted_key_thumbprint"]
}
DSR status: PASS, exit 0, radial ALLOW, Parallax shadow ALLOW, signed worker result and DDC Action Receipt present.
Internal consistency point
TRACE's own non-normative docs/verification-outcome-statements.md says that, for a "Verified at the required floor" statement, evidence worth retaining includes:
- the record itself;
- the trusted-key thumbprint used;
- the freshness bounds applied;
- revocation evidence when consulted;
- the complete appraisal.
VerificationResult currently preserves the trusted-key thumbprint and revocation result, but not the freshness bounds or verification time used to reach the successful decision.
That does not prove the result type is wrong by itself: the page is informative, and a caller could retain verifier context separately. It does show that the repository already treats freshness configuration as part of the evidence needed to interpret a retained verification statement.
Governing invariant
If changing a verifier-side input can change the verification decision for the same signed record, that input is decision-relevant.
A successful result does not have to serialize every verifier input. But if a decision-relevant input is omitted from the retained result, then at least one of these has to be true for a later consumer to interpret the result without silently widening it:
- the input is recoverable from a stable policy/configuration identifier or version carried with the result;
- the input is retained in an external evidence statement explicitly bound to that result; or
- the result is documented as process-local / context-dependent and must not be treated as a context-independent assurance statement.
Otherwise two successful verifications reached under materially different appraisal frames can collapse to the same retained value even though those frames are capable of producing different decisions.
Why this is not just timestamp logging
now is not interesting merely because the wall clock changed. It matters because the same record can move from accepted to stale under the same age policy. Likewise, max_age_seconds and max_future_skew_seconds are not metadata about the process; they are decision functions over the signed iat.
The counterexample therefore does not rely on two results merely occurring at different times. It relies on verifier-side inputs whose values are semantically live in the acceptance boundary.
Question
What is the intended contract of a successful VerificationResult?
- If it is only an immediate, process-local API return, should the documentation explicitly say that callers must retain the decision-relevant verifier context separately before turning it into a durable assurance statement?
- If it is intended to support retained/reproducible assurance statements, which decision-relevant inputs belong in the result itself, and which should be represented by a stable policy/configuration identity?
This seems adjacent to, but distinct from, #190 (unresolvable citations), #116 (version skew), #66 (verification axes), and #332/#338 (transition closure).
RATS/RFC 9334 treats a verifier as consuming Evidence, Reference Values, Endorsements, and an Appraisal Policy to produce Attestation Results; current EAR work also carries appraisal-context information. I am not proposing that TRACE copy EAR here. The repo-local issue is narrower: TRACE already says freshness bounds are evidence worth retaining, while the current success result does not retain or identify them.
Non-goals
This issue is not proposing:
- that every
verify_record argument be copied into VerificationResult;
- that wall-clock time alone become an assurance field;
- a schema change to the signed Trust Record;
- a universal appraisal-policy format;
- that equal successful outcomes under different policies are themselves erroneous.
The question is only whether a retained success needs enough binding to its decision-relevant appraisal frame that a downstream consumer cannot mistake "verified under these conditions" for an unconditional verification fact.
AI-assisted research and falsification design; I remain responsible for the contribution.
Reproduced on frozen TRACE revision
6737005e1feefa5739d971a2b71ac123a4235220using governed DSR jobfe2b6851dcb866fb0ddcb43d639d8a10on workervps-377a113a.Observed behavior
For the same signed TRACE v0.2 record and same trusted key:
max_age_seconds=86400vsmax_age_seconds=None-> identical successfulVerificationResultmax_future_skew_seconds=300vs3600-> identical successfulVerificationResultnow=iat+60vsnow=iat+120-> identical successfulVerificationResultThe result object contains only:
Control: revocation context is preserved. No revocation source yields
no_check_performed; an empty consulted store yieldsverified, so those results differ.Opposite-direction control: age policy is decision-relevant. At
now=iat+86401,max_age_seconds=86400rejects as stale whilemax_age_seconds=Noneaccepts.DSR output:
{ "age_policy_collision": true, "skew_policy_collision": true, "verification_time_collision": true, "age_policy_semantically_live": true, "revocation_noncollision_control": true, "result_fields": ["revocation", "trusted_key_thumbprint"] }DSR status: PASS, exit 0, radial ALLOW, Parallax shadow ALLOW, signed worker result and DDC Action Receipt present.
Internal consistency point
TRACE's own non-normative
docs/verification-outcome-statements.mdsays that, for a "Verified at the required floor" statement, evidence worth retaining includes:VerificationResultcurrently preserves the trusted-key thumbprint and revocation result, but not the freshness bounds or verification time used to reach the successful decision.That does not prove the result type is wrong by itself: the page is informative, and a caller could retain verifier context separately. It does show that the repository already treats freshness configuration as part of the evidence needed to interpret a retained verification statement.
Governing invariant
If changing a verifier-side input can change the verification decision for the same signed record, that input is decision-relevant.
A successful result does not have to serialize every verifier input. But if a decision-relevant input is omitted from the retained result, then at least one of these has to be true for a later consumer to interpret the result without silently widening it:
Otherwise two successful verifications reached under materially different appraisal frames can collapse to the same retained value even though those frames are capable of producing different decisions.
Why this is not just timestamp logging
nowis not interesting merely because the wall clock changed. It matters because the same record can move from accepted to stale under the same age policy. Likewise,max_age_secondsandmax_future_skew_secondsare not metadata about the process; they are decision functions over the signediat.The counterexample therefore does not rely on two results merely occurring at different times. It relies on verifier-side inputs whose values are semantically live in the acceptance boundary.
Question
What is the intended contract of a successful
VerificationResult?This seems adjacent to, but distinct from, #190 (unresolvable citations), #116 (version skew), #66 (verification axes), and #332/#338 (transition closure).
RATS/RFC 9334 treats a verifier as consuming Evidence, Reference Values, Endorsements, and an Appraisal Policy to produce Attestation Results; current EAR work also carries appraisal-context information. I am not proposing that TRACE copy EAR here. The repo-local issue is narrower: TRACE already says freshness bounds are evidence worth retaining, while the current success result does not retain or identify them.
Non-goals
This issue is not proposing:
verify_recordargument be copied intoVerificationResult;The question is only whether a retained success needs enough binding to its decision-relevant appraisal frame that a downstream consumer cannot mistake "verified under these conditions" for an unconditional verification fact.
AI-assisted research and falsification design; I remain responsible for the contribution.