More of /tls-cert moves from prose into tested code, issuance becomes
resumable across sessions, and the model-routing eval now runs on a
schedule.
Added
- Tested cert helper (
scripts/cert_helper.py+
cert_helper_test.py). The key/CSR generation that used to be a
hand-builtopenssl reqline in the prompt is now
cert_helper.py csr: it validates the domain before anything runs,
picks the SAN set the order expects (dns-01 = apex+www, http-01 =
apex), writes the key0600in a0700dir, and backs up an
existing key instead of clobbering it (the old key may be the only
copy of one still deployed). - Issued chains are verified before being presented as usable.
The fullchain PEM is server-provided (untrusted); it's saved with
the Write tool (no shell) andcert_helper.py verify-chainthen
parses the leaf with openssl and refuses (exit 2) unless its SANs
cover the requested domain - a wrong or garbage chain is caught
before the user installs it. On success it reports SANs, expiry,
and days remaining. - Resumable issuance.
/tls-certpersists each order to
~/.config/tlsradar/orders/<domain>.json(order_id, resume_token,
challenge, email, challenge records) and offers to resume an
in-flight order from a previous session instead of starting over.
Once issued, the file is markedcompleted_atand becomes local
history:/tls-renewreads it to reuse the saved email and
challenge method (with confirmation) instead of re-asking. - Scheduled LLM routing eval (
.github/workflows/llm-eval.yml).
The real model-routing eval (evals/run_evals.py --llm) now runs
weekly (and on manual dispatch) instead of being local-only, so a
routing regression is noticed within days. Skips cleanly when the
ANTHROPIC_API_KEYsecret is absent; never gates merges.
Changed
/tls-certand/tls-renewcall the cert helper instead of
hand-buildingopenssl req;cert_helper_test.pyruns in CI
alongside the DNS-provider tests.