Repository navigation
0.8.4
-
Every run of a lesson's check is kept, pass or fail (okl review R3, first slice). The
stamp keeps only a lesson's last pass, so a check that failed, the run that caught a
change, left nothing but a line on stderr, and a check that has caught regressions looked
the same as one that never failed.okl verify, andokl reverifythrough it, now keeps
each run (command, expected signal, outcome, commit) in a newcheck_runtable: its own
table, so an older okl rewriting a lesson's row cannot lose it.okl showprints how
often the check passed and failed and its last failure;okl_getreturns the latest
runs and the counts. A shared service getsPOST /check-run; against an older service,
or if the write fails, verify warns that the run was not logged and its result stands. -
Every unbriefed prompt now says so (okl review R21).
OKL_OFFLINE=1let a prompt
through when okl could not run, with a line on stderr that neither the agent nor, in
most views, the person ever saw: the agent started the task as if a check had found
nothing. The prompt hook now hands the agent a notice that it was not briefed, with okl's
reason and that the absence of a briefing is not a clean check, and shows the person one
line saying the same. WithoutOKL_OFFLINE, a prompt okl cannot brief is still blocked. -
A pinned okl that cannot start no longer blocks a prompt another okl could brief
(#152). A venvoklwhose python was removed, by a Homebrew upgrade for example, still
exists and is executable, so the hooks accepted the pin and the prompt hook blocked on its
exit 126 even with a working okl onPATH. When a command fails to start within 2 s, the
prompt hook now moves on to the next layer (OKL_BIN, then the pin, thenPATH, then
python3 -m okl), never running a command that already failed, and adds the one it
passed over, with its fix, to the line you see. A command that ran and then exited 127,
such as adocker runwhose image lacks okl, is not run again: at three layers it could
have taken the hook past Claude Code's 30 s limit. A working pin costs nothing extra;
with nothing else to run, the block names the pin and says to re-runokl init. -
A 200 that is not JSON is no answer, not a refusal (okl review R10). Something other
than okl can answer at the service's address with a web page: a proxy's sign-in page,
or a web app on the portOKL_SERVICE_URLnames. The client's JSON parse failed with a
ValueError, whichokl checkreported as "OKL REFUSED THE CHECK" and the MCP tools as
a refusal. It is now reported as unreachable, showing the start of what came back, and
after a write it says MAYBE, since the service behind the page may have stored it. -
The MCP
okl_recordtool says MAYBE RECORDED when a write may have landed. It caught
onlyValueError, so a shared service that took the lesson and never answered reached
the agent as an opaque tool error, and one that could not be reached did too.
okl_updateandokl_retirealready said MAYBE. It now says the service may have
stored the lesson, to look withokl_searchbefore recording it again, and that
recording it again with the same id is safe; a refused connection says NOT RECORDED. -
The A/B harness no longer counts a sample with no code as a clean run (#164). The judge
now says whether the submission implemented the task at all. A plan, a description, a
question or a refusal is unevaluable: a failure, kept out of both arms' denominators and
counted toward the usability bar, with the code's length and an excerpt so the verdict
can be audited. §4j's briefedidor_endpointsample was a plan the harness scored clean.
Receipts also record the model each alias resolved to (review item R12), and the harness
refuses a judge that resolves to the generator's model under a different command string.
REPORT §4k pre-registers the change of instrument.