Summary
create_attestation defaults issued_at to time.time() and jti to uuid.uuid4().hex[:12] when callers omit them. This means identical inputs produce different attestation payloads and identifiers, violating QWED's deterministic issuance contract.
Background
Identified during PR #249 (QWED Security alerts cascade) by coderabbitai review. The fix was deferred because it requires a non-trivial API change.
"Requires callers to explicitly pass issued_at and jti, or inject clock/ID providers. Touches every create_attestation call site. It's a design improvement, not a security fix — better scoped to a follow-up."
Scope
- src/qwed_new/core/attestation.py: Remove
time.time() and uuid.uuid4() fallbacks from create_attestation.
- tests/: Update all call sites that rely on the implicit defaults — they must now pass explicit
issued_at / jti values.
- Injection API: Optionally provide a mechanism to inject clock (
Callable[[], int]) and ID (Callable[[], str]) providers for deterministic testing.
Acceptance Criteria
References
Summary
create_attestationdefaultsissued_attotime.time()andjtitouuid.uuid4().hex[:12]when callers omit them. This means identical inputs produce different attestation payloads and identifiers, violating QWED's deterministic issuance contract.Background
Identified during PR #249 (QWED Security alerts cascade) by coderabbitai review. The fix was deferred because it requires a non-trivial API change.
Scope
time.time()anduuid.uuid4()fallbacks fromcreate_attestation.issued_at/jtivalues.Callable[[], int]) and ID (Callable[[], str]) providers for deterministic testing.Acceptance Criteria
create_attestationraisesTypeError(or a custom error) whenissued_atorjtiare not providedissued_at/jtivaluesReferences
450ce5b: "Keep attestation issuance deterministic"src/qwed_new/core/attestation.pylines 277-279 (originaltime.time()call)src/qwed_new/core/attestation.pylines 277-279 (originaluuid.uuid4()call)