Release 0.9.0
What's Changed
Changed
-
The IBM Quantum client now retries transient GET failures
(retry: :safe_transient) instead of failing on the first blip, and raises
the/resultsreceive timeout to 60 s for multi-MB Sampler V2 results.
Qx.Hardware.PortalGETs retry transiently too; POST requests (IAM exchange,
job submission, transpile) are never auto-replayed. -
Raised minimum runtime dependency versions:
nx ~> 0.12(was~> 0.10),
complex ~> 0.7(was~> 0.6, now required by nx 0.12), andreq ~> 0.6
(was~> 0.5). No Qx API or numerical changes; Nx 0.12 renders float32
tensors at native precision, so twoQx.Mathdoctests were updated to match.
Security
-
Qx.Hardware.IbmandQx.Hardware.PortalHTTP error tuples
({:error, {:http, status, body}}) no longer echo the full decoded response
body, which could carry echoed request context. The body is reduced to a
recognised error message or a generic marker, bounded to ~256 characters.
Behaviour change: the third element is now a bounded string rather than
the raw response map/body. -
Qx.Hardware.Confignow rejects plaintexthttp://URLs to non-loopback
hosts forportal_url,base_url, andiam_url. These carry the portal
bearer token and route IBM IAM token exchange, so a remotehttpURL would
expose them in cleartext.http://stays valid for loopback hosts
(localhost,127.0.0.1,::1) so local mocks and dev are unaffected.
Behaviour change: a config with a remotehttpURL now raises
Qx.Hardware.ConfigErrorinstead of being accepted. -
The OpenQASM importer now caps parenthesis nesting depth (64) before parsing.
The expression grammar recurses one frame per(, so a((((…))))chain
within the 1 MB source cap could exhaust the stack (:enomem); deeply nested
input now raisesQx.QasmParseError. -
Qx.Export.OpenQASM.from_qasm_function/1now wraps the generated code in a
uniqueQx.Generated.<Name>_<hash>module instead of returning a baredef,
so a downstreamCode.compile_string/1can no longer inject an
attacker-named helper into the caller's module. Behaviour change: the
returnedsourceis adefmodule, and the result map gains a:modulekey.
Installation
Add to your mix.exs:
def deps do
[
{:qx_sim, "~> 0.9.0"}
]
end