Repository navigation
0.8.3
-
Retiring a lesson is a verb, with a reason (okl review R2). "Retracted" was the only
way out, retracting meant re-recording (which wiped the lesson), andokl checknever
read SUPERSEDES, so a replaced lesson was briefed beside its replacement.okl retire <id> --reason "..."(and theokl_retireMCP tool) keeps every field.
Without a flag the lesson is wrong: status retracted, briefed as AVOID.--by <new-id>
marks it superseded and writes<new> SUPERSEDES <id>: briefings leave it out before
the cut, so it never takes a live lesson's slot, and print one line pointing to the
replacement by id.--obsoletetakes it out of briefings. A resolved defect is not
retired and keeps briefing against its return.- The reason goes to a new
retirementtable rather than a column on the lesson, so an
older okl rewriting the lesson's row cannot lose it.okl showandokl_getlist a
lesson's retirements. - Only
okl retirechanges a retirement:okl updateandokl recordrefuse the retired
statuses, and neitherokl seed(eight bundled lessons say "live") nor--replace
brings a retired lesson back. - A replacement must be live and visible wherever the lesson it replaces was, which also
rules out a cycle. The pointer follows the latest replacement through a chain to a
live one; a superseded lesson with no replacement this repo can see stays briefed.
Retired lessons no longer use up the search's window. Retiring a lesson again with
the same reason and replacement changes nothing once the first call has finished; a
retry after a call that failed part-way finishes it without logging the reason twice. - Drift, the committed snapshot, the governs-nothing advisory and the briefing's STALE
mark skip retired lessons, andokl retireon one that governs files refreshes
okl-drift.json(the MCP tool cannot, so it says to runokl export --drift).
Exposure metrics skip them too, andokl deduprecommendsokl retire --byinstead
of a hand-written SUPERSEDES linkokl checknever read. - A shared service gets
POST /retire. - Upgrade every okl that writes to a store before retiring lessons in it: an older
okl'sseedresets a retired status, and itsverifyrefuses the new statuses.
-
Refining a lesson no longer wipes its proof (okl review R1). Recording a lesson again
with its--id, which the Stop hook,/recordand the encoding-loop skill all taught as
the way to refine one, replaced the whole row: its verification, its governed files and
its creation date were lost, and it quietly left drift.okl update <id> --<field> ...(and theokl_updateMCP tool) changes only the fields
given and keeps the rest, the proof and the first creation date included. Changing
--filesclears the stamp, because a check of other files proves nothing about these;
it keeps the stored check, sookl reverifyre-runs it, and refreshesokl-drift.json
asokl verifydoes. An empty value clears an optional field,--ttl-days ""too.
Updating aseed:lesson warns that the nextokl seedrestores the pack's text.okl record --id <existing>is refused (exit 2), namingokl update;--replace
(which needs--id) overwrites the lesson deliberately and keeps only its first
creation date. The MCPokl_recordtool does not offerreplace: an agent is pointed
atokl_update.okl seedstill updates its own lessons in place, and now keeps their
first creation date too.okl show <id>(andokl_get) prints one lesson whole, with its proof.- Every briefed lesson carries its
[id], so an agent can act on a lesson it was just
shown. That adds about 150 tokens to a full briefing on the bundled packs (~1,620 to
~1,770; receipts inevals/results/), and REPORT §4j registers it as a change of
treatment for the A/B. Its run (2026-10-10,ab-20261010-2314.json) read 4/23 unbriefed against 0/23
briefed (one briefed sample returned a plan, not code, and is not counted; #164): the ids are safe on the task set, and the unbriefed arm's own 26-point fall
from §4i starts a new series. The layout pre-flight confirms no content was lost, and its
summary line no longer prints a growth as "-5% smaller". - A shared service gets
POST /update(a closed, typed body),GET /node/{id}(any id,
/included; an unknown one is{"node": null}, so a 404 means an older service) and
replaceon/record. Its read-modify-write endpoints are serialised, since two
concurrent updates lost a change without an error. A client recording an id against a
service older than this refuses, instead of letting it overwrite: upgrade the service
with the client. Every write now checks that text fields are text andttl_daysa
whole number, so a wrong type is refused before it is stored. The client also closes
every HTTP error response it catches: each holds its socket, and R1 made 400s and 404s
routine, so the leak failed the Python 3.14 suite. - The Stop hook,
/record, the skill, the README and the guide now teachokl update.
-
The MCP server reports okl's version (#159). Its
initializereply carried an empty
serverInfo.versionon mcp 2.x and the SDK's own version on mcp 1.x, because okl passed
none. It now passes the installed okl version on both, and a test reads it from a real
initializeover stdio. The MCP build test also reads mcp 1.x's tool replies now, so it
passes on both SDK majors as its docstring claims. -
The Stop hook, the encoding-loop skill, CLAUDE.md and the README no longer say an org
lesson reaches every repo. By default each repo has its own store, so a lesson recorded
with--scope orgreaches another repo through a pack that repo loads. They now say
that;orgstill means a lesson true in any repo.