Security • Evidence Traceability
Verification Traceability
Every security claim links directly to its source file, line numbers, and automated test in the repository at commit e179d2b.
Unregistered capability is denied at boundary
rtq.authorize() checks this.capabilities.get(); missing capability returns code: 'capability.not_registered'.
Requested version mismatch is denied
Exact integer equality check between requested version and registered definition version.
Default-deny policy evaluation
PolicyEngine.evaluate() falls through to decision: 'deny' when no rules match.
Authoritative risk: caller claims cannot lower risk
Risk engine evaluates declared capability metadata; caller claimedRisk downgrade is ignored.
Unknown origin escalates authorization
Untrusted origin 'unknown' is prevented from receiving local automatic approval.
High/critical approval strategy is never automatic
Default strategy resolution mandates human or device confirmation for high/critical risks.
Sandbox network deny-by-default with --unshare-net
bubblewrap argv builder injects --unshare-net and throws if an unsupported network allowlist is requested.
Sensitive environment keys stripped from child process
buildSandboxEnvironment() strips keys matching 'secret', 'token', and 'API_TOKEN'.
Single-use tickets: second redemption is rejected
Atomic status transition from 'issued' to 'redeemed'; subsequent redemption returns code: 'replay'.
Ticket signature tamper resistance
HMAC-SHA256 signature covers canonical JSON ticket representation; modified fields fail verification.
Capability version update invalidates outstanding tickets
Ticket redemption verifies expected capability version against stored ticket version.
Approval substitution rejected across challenges
Cryptographic challenge signature bound to challengeId A cannot authorize challengeId B.