You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
v0.7.0 (2026-10-05)
Calibration audit of the decision model (2026-10-03):bench/jev_calibration/ is a
pre-registered audit of jev-1.13.0 on CLINC150 (4,500 in-scope + 1,000 out-of-scope) and
Banking77 (3,080), three passes each plus a bundling check, 26,140 requests, about USD 4.6
at list price. PROTOCOL.md (hash posted on PR #2 before the first request) fixes the
questions, passes, measures and seven expectations; run.py seals every answer in a
hash-chained store; metrics.py (exact binomial intervals, ECE/MCE/Brier/log loss,
tie-aware AUROC and average precision, bootstrap, agreement) is unit tested; analyze.py
verifies the chains and writes metrics.json, report.md, reliability diagrams and a
self-verifying compact store from which every number re-derives. All seven expectations
met: zero-shot accuracy 0.921 [0.912, 0.928] on CLINC150 (a supervised TF-IDF+LR trained on
15,000 examples: 0.925) with ECE 0.024; 0.801 on Banking77 with ECE 0.084 and mid-range
over-confidence; 0.970 accuracy at confidence >= 0.9 on 83% coverage; out-of-scope AUROC
0.977 (yes/no question) against 0.911 from 1 - p_max; 99.4% repeat agreement; p50 322 ms.
Write-up: docs/results/jev-calibration/README.md.
Added:examples/jev_triage_agent/experiment.py builds live manifests
(live_manifest, decisions.upstream = "http", pinned model, paced trial starts, prior
runs) and writes them from the command line
(python -m examples.jev_triage_agent.experiment --out manifest.json), so the day-one
sequence in docs/design/0004-day-one.md runs from files. examples/jev_triage_agent/day_one.sh
drives it end to end: preflight, the clean pair, the N=50 trio, the Node agent through the
official SDK, the pre-registered N=200 run, and a minimised, replayed failure, with a gate
report per run and a refusal to finish if the key appears in any output. Results: docs/results/jev/.
Run against Jev (2026-10-03): the pre-registered day one ran end to end against https://api.typesafe.ai with jev-1.13.0 pinned. A vs B under decision_low_confidence at
N=200: 200/200 vs 0/200, bounds [-1.000, -0.957], BLOCK; A vs A and A vs C PASS at N=50; the
Node agent through the unchanged official SDK BLOCK; the minimised failure replays REPRODUCED;
an exploratory clean run at N=50 routed all 100 decisions correctly at confidence 1.0. 902
recorded decisions, about USD 0.018 at list price. Sealed stores, the preflight receipt, the
invalid first attempt and one write-up per run: docs/results/jev/; every decision.json
re-derives from its committed trials.jsonl. Findings: docs/DECISIONS.md, "What day one
found".
Added:arci preflight --allow-unlisted-model. The account's GET /v1/models lists only
the aliases jev-latest and jev-preview, so the pre-registered preflight exits 2 on a pinned
versioned id. With the flag, preflight prints the listed names, sends the smoke request, and
exits 0 only if the validated response reports exactly the pinned id (3 otherwise). Without the
flag nothing changes except a hint after the exit-2 message. Tests: tests/unit/cli/test_preflight_unlisted_model.py.
Added:ARCI_HTTPS_PROXY=http://host:port makes the decision upstream sender tunnel through
an HTTP CONNECT proxy, for environments whose only egress is such a proxy; unset, the direct
connection is unchanged, and a malformed value is a transport error. Tests: tests/unit/decisions/test_upstream_proxy.py.
Fixed: the three preflight smoke questions carry instructions; the vendor rejects a
question with neither instructions nor criteria (400), so the pre-registered smoke request
could not be accepted as written.
Fixed:examples/jev_triage_agent/day_one.sh puts the repository root on PYTHONPATH
(the manifests name examples.jev_triage_agent.* modules, invisible to the arci console
script), insists on running from the repository root, and stops with exit 4 unless both arms of
the N=1 clean pair PASS, so a harness fault that breaks both arms equally cannot be mistaken
for a measurement.
Fixed: two reader threads, the grader's response reader and the MCP boundary's frame
reader, could end a read on a "not ready" poll verdict computed before the child wrote and
before the parent asked them to stop. On a loaded machine the thread was descheduled across
the child's exit, the stale verdict dropped the whole response, and the trial ended ERROR
(grader returned invalid output, or boundary exited before returning for command agents)
at about 1 trial in 400 with 8 workers on 4 cores, which is enough to turn a 200-per-arm
experiment into an ERROR verdict on a busy CI runner. The worker reader already followed
the correct rule; both readers now snapshot the stop flag before polling, and only a poll
made after the stop was observed may end the read. Regression tests: tests/unit/runner/test_reader_stop_race.py.