Repository navigation
openadapt-flow 2.4.0
·
167 commits
to main
since this release
Immutable
release. Only release title and notes can be modified.
A person's approval counts only when a registered approver key signed it, and the verification, identity and recovery paths below fail closed where they used to pass.
Features
- A person's approval of a gated save carries an Ed25519 signature from a key registered under the
approversrole (jit register --role approver), made with the route's own method (desktop_keyfor Desktop,portal_keyfor the decision portal). Item approvals, the durableapproveandresume, the console and the agent tools all verify it; an unsigned, claimed or hand-written answer gives no authority.approve,resume,runandrun-casetake--key-dirto name the registry (#1486, #1501). - Loop induction learns worklists that are not back-to-back repeats: a click names the parameter that identifies its row (
Step.target_param), and each pass works on, and is checked against, its own row's record (#1435). - Pipelined read-back runs under durable, Standard and Regulated runs. The deferred check is written into the durable pause before the side thread gets it, and a
problems_onlyrun decides each item from its settled check (#1442, #1460). - An admitted API step runs inside a multi-surface program on its own surface, under a managed dispatch that names it, and under a qualification admission that qualified its path (#1439, #1444, #1451).
verify-runjudges frame conditions: a record that no effect declares, added, removed or changed, is a collateral change, with optional attribution from an audit log or a modified-by field (#1443). A record check is admitted only after it catches its faults on a test copy of the system of record (fault_gate,openadapt.check-coverage/v1) (#1445). A saved record is compared with its source document through a second extraction by a different method (provenance) (#1446).- A pinned bundle can be repaired: the fix is re-qualified on a test copy and re-admitted with signed lineage, and the pin accepts the new version only through that lineage (#1450). A renamed save button is repaired when the recorded identity hash proves only the label changed (#1514).
qualifyhandles a bundle that already has a qualification project, an encrypted bundle and a sealed set (#1454). - The record check reads a typed label back as its stored code (
ValueExprmap) and can require exactly the new record (record.exact_new_set) (#1456). - Under
problems_only, problems with an item's own input leave the switch on and send that item to a person; program and environment problems turn it off, and a person re-arms it with one signed tap (#1517). - Look-alike rows are counted on Windows, macOS, Linux and pixel-only surfaces, so a step that picks a row halts when it cannot tell the target from its twin (#1504, #1518, #1557).
openadapt-agent serve --teach-browserlets a coding agent turn a read-only browser task into a named tool it calls again with new values;openadapt setupregisters it with Claude Code, Cursor, Codex and Gemini CLI (#1502).induce --held-outscores each held-out item by running it and checking the record independently (#1527).
Fixes
- A save that was sent but not confirmed never resumes as a plain retry; the pause offers reconcile or an explicit single retry (#1485).
- A value typed whole in one step and inside longer text in another is reported as unlifted, and a canary that reuses run 1's values returns the draft to review (#1465).
- Record identity stays stable across the JSON baseline, so rows read back from UUID, decimal and datetime columns are not counted as new (#1482).
- An empty or not-found page in a separate-session read-back is indeterminate, not proof that a record is absent (#1515, thanks @yunusarda-sudo).
- A binary SQL column (such as OpenEMR's
uuid) is read as hex byverify-runandscaffold-verifier(#1503). - Recording and replay follow a window by a stable handle after its title changes (#1468).
sealworks on a bundle certified by a qualification campaign (#1453); the approval gate classifies saves with the certifying policy, as the run gate does (#1455).- Process workers always end their child process, even on failure (#1498).
- The
run --profile standardexamples name an execution surface (#1525). Synthetic referral last names in the OpenEMR benchmark are unique (#1420, thanks @xiaofeilovecoding).