Repository navigation
Releases
Ocura OSS 0.8.0
This release renames stored state and cannot read ledgers written by earlier versions.
- Use the names ledger, run, and branch point in stored state and JSON output, as
0.7 did in Python. State is nowledger.json,runs/, andbranch-points/; IDs
start withledger-,run-, andbranch-point-, and logs are named for the run
ID. JSON keys areledger_id,run_id,branch_point_id, and
source_branch_point_id, andverify --jsoncountsrunsandbranch_points.
Records carry schema version 3. - Refuse state written by 0.5 to 0.7 (schema 2) with exit status 2 and a message
to keep usingocura-oss<0.8for it or start a new ledger. The old directory is
not modified, and there is no conversion. - Remove the names 0.7 kept for compatibility:
Den,Atom,Chokepoint, their
attributes, fields, and keyword arguments,load_atom()and the other old
Storemethods, thechokepointscommand, and the--atomoption.
docs/naming-migration.mdmaps each one to its replacement.
Ocura OSS 0.7.2
- On Python 3.11 and 3.12, record a stop request that arrives between polls of the
command as an interrupted run. It could instead endrunwith a traceback, leaving
the attempt forrecoverand, on macOS, the command still running.
Ocura OSS 0.7.1
This documentation release changes no code or record formats.
- Use full URLs for README links so they resolve on PyPI. The release check now
reports relative links in a built package description. - Show how to fetch the history inspector after installing from PyPI; the script
is not in the distributions. - Introduce opt-in log compression in the overview.
- Replace pre-release wording in the example guide that shipped in the 0.7.0 source
distribution.
Ocura OSS 0.7.0
- Keep the demo and history inspection as the primary example in the core
repository. Move the autoregressive demonstration and its backend tests to the
semi-permanentexamples/0.7branch, alongside the CI-report and Dream examples.
Link their setup and compatibility requirements from the use-case catalog. - On Windows,
verifyno longer reports an unreadable attempt when a concurrent
run finalizes while it reads; a read denied while the record still exists is
retried briefly, and one denied throughout is still reported. - Preserve both filenames and Windows error details when wrapping operating-system
failures, and accept indexing-only command sequences supported by earlier callers. - Add
run --from BRANCH_POINT_ID --reason TEXT -- COMMANDand Python
run(..., source_branch_point_id=ID, reason=TEXT)to create and execute a
variation in one call. Parameters override the new child pathway's inherited
labels; labels declared only on the source run are not copied. Existing run
results, defaults, and the separatebranch/run --pathwayworkflow remain unchanged. Input
is checked before the child is created. A later storage or execution failure can
leave the child in place; structured errors retain known child and source IDs for
inspection and explicit continuation without automatic retries. - Record a stop request arriving between process-polling timeouts as an interrupted
run, stopping the command and retaining its evidence through the existing result
interface. - Add canonical public names
Ledger,RunRecord, andBranchPoint; retain
Pathwayand the legacyDen,Atom, andChokepointclass aliases. Add
descriptive result properties, Store readers, source keywords, and the
branch-pointsCLI alias and--runstorage selector. Existing constructor
fields, success JSON, schema-2 records, IDs, checksums, and retained manifests
remain compatible. - Add opt-in
--json-errorsfor JSON results and structured failures, including
argument errors, stable error categories, known run IDs, execution state, and
recovery guidance. Existing--jsonbehavior and exit statuses remain unchanged.
logsstill prints log bytes. PythonStoreErrorexposes diagnostic fields too;
run()errors that wereValidationErrororOSErrorstill are. A failure after launch directs
callers to inspect retained attempts and runs before considering resubmission. - Add an executable history inspection example for a fresh caller with only a
ledger root. It includes failed retries, empty variations, unfinished attempts,
and verified bounded log excerpts with original-content references. It never
executes or recovers a workload. Update terminology and migration guidance. - Fixed: validating a pathway no longer doubles its work for every branch
generation. A history built by branching each run from the previous one made
run,branch,compare, andverifytake seconds after about ten generations
and far longer after that. Each record is now validated once per operation. ocura-oss --versionprints the installed version.pathwaysandcompareread the atom records once per command, instead of
once for every pathway or child pathway.- Add
ocura-oss runsandStore.list_runs(): finalized runs ordered by terminal
record timestamp and ID, including failed retries, each with thechokepoint_id
to branch from.
Filter by pathway or outcome, page with--limitand--after, or list every
match with--all. Each page counts the runs still unfinished, which can finish
behind its cursor; a walk whose pages count none lists every finished run. - Add
ocura-oss showandStore.inspect_run(): one run with its pathway, terminal
chokepoint, and the pathways branched from it. Command arguments are included
only with--command. Neither command reads log contents. - Add
--archiveto the commands that only read, andStore(root, archive=True),
to read a stable copy of a ledger without creating lock files. Archive mode
refuses every change, and refuses a ledger with unfinished attempts, saying how
to list and recover them. - Add
ocura-oss logs,Store.open_verified_log(), andStore.log_info(): a
run's verified original log bytes,--offset/--lengthexcerpts, and storage
metadata with--infoor--json. - Add opt-in lossless log compression.
run --compress(or--compress-min-bytes N)
stores a run's captured logs of at least 1 MiB as gzip once it finishes, when that
saves at least 10%;compressanddecompressconvert finalized logs, and
--dry-runpreviews either. Logs stay raw by default. Records, IDs, digests, and
retained manifests do not change, and every reader returns the original bytes.
runandshowprint each log's current file, reported aslog_filesin JSON
and byStore.log_files(), so standard gzip tools can open compressed logs.
Ocura OSS 0.6 cannot read compressed logs: rundecompressandverifybefore
opening the ledger with it. - Keep completed run results available when optional compression or log-path
reporting fails. Interrupted compression reports a storage warning and leaves
finalized evidence intact. Refused locks fail promptly for writes; verified
reads can fall back to unlocked access where locks are unavailable. - Support linked log directories when reporting storage paths, classify conversion
failures by their underlying cause, and stop log output quietly when its reader
closes the pipe.
Ocura OSS 0.6.0
- License: Ocura OSS is now released under the Apache License 2.0. Versions 0.5.0
and earlier remain under MPL-2.0. Contributions are accepted under Apache-2.0. branch --from,compare --from, andrun --pathwayaccept a shortened ID: at
least four of its leading hexadecimal characters, with or without the kind word.
The prefix must match exactly one record; an ambiguous one is rejected with the
matches listed. Output and records still carry full IDs. AddStore.resolve_id().
The Python workflow functions still take full IDs.- Changed: a run now records its pathway's effective parameters together with
its own, so a run on a branch no longer repeats the branch's--paramvalues. A
parameter declared on the run replaces the pathway's value for the same key. Before
this release a run recorded only what it declared, plus any pathway parameter that
--substituteused.comparetherefore reports a child run's inherited labels
underrun_parameterswhere it previously reported none. Atoms already recorded
are not changed. - A command run where there is no state now names
ocura-oss initin its error.
When a directory above the root holds state, the error names that directory
instead. State is never created implicitly. ocura-oss runnow handlesSIGTERM,SIGHUP, and Ctrl+Break on Windows as it
handles the first Ctrl+C: the command is stopped and the run is recorded as
interruptedwith exit status 1. Before this release those requests ended the
recorder, left an abandoned attempt, and left the command running. A signal the
caller ignores, as undernohup, stays ignored. The Pythonrun()function
installs no signal handlers.- Changed: a command no longer outlives a killed recorder on Windows or Linux.
On Windows the operating system ends the command and the processes it started,
and an interrupted run now ends those processes too. On Linux the kernel kills
the command itself. On macOS the command still keeps running. A command that
finishes on its own is not affected. See "When the recorder stops" in
docs/state-and-verification.md. - Documentation: the README and overview show what
compareprints, say when a
different tool is the better choice, and state how to remove the package's data. - Add an optional, standalone tool to copy complete 0.4 ledgers into schema 2.
It verifies the source, preserves IDs and log bytes, and writes a separate copy
with a migration receipt. Download it fromtools/migrations/; it is excluded
from both the wheel and source distribution and adds no runtime dependencies.
Ocura OSS 0.5.0
- Breaking: change the record format to schema version 2. State written by 0.4 and
earlier is rejected with exit status 2 and left untouched; there is no migration. To
keep using existing records, stay on 0.4 for that project (ocura-oss<0.5). To record
with 0.5, move the old.ocura-oss/aside and runocura-oss init. See "Upgrading
from 0.4" indocs/state-and-verification.md.Atomlog fields,finished_at, andduration_seconds
may now beNone, andRunSummary.duration_secondsmay beNone. - Journal each run under
.ocura-oss/attempts/before its command launches. An attempt
whose recording process is interrupted twice or killed stays visible instead of leaving
orphaned logs. Addocura-oss attemptsandStore.list_attempts()to list unfinished
attempts asrunningorabandoned. - Add
ocura-oss recover,recover(), andStore.recover()to close abandoned attempts.
One with no recorded outcome becomes an atom with the newabandonedoutcome: its
captured output is retained, and no finish time, duration, or return code is invented. - Support several processes recording runs under one state root at once.
verifyand
comparework while runs are in flight and report them as running rather than as damage.
Of several concurrentinitcalls, exactly one succeeds. - Report an atom that does not have exactly one chokepoint as a verification problem.
- Add
run --no-captureandrun(capture=False)to retain no stdout or stderr. The atom
recordsoutput_capture: noneinstead of log paths. - Add
run --mask-arg POSITIONandrun(masked_arguments=[...])to store a placeholder for
chosen command tokens while the command still receives the real values. - Add
run --substituteandrun(substitute=True)to replace{KEY}in command tokens
with declared or pathway parameter values and record every parameter used, so one
declaration both labels and configures a run. - Add opt-in launch context:
run --contextrecords the platform and the git revision and
dirty state, andrun --context-file PATHrecords a file's size and SHA-256. Nothing is
queried, executed, or read for context unless requested. - Add
ocura-oss manifest,verify --against FILE, andverify(against=...). A manifest
kept outside the state detects records later rewritten together with their checksums.
verifyalso reports a digest of the manifest. - State how the format evolves: readers ignore payload fields they do not recognize, so a
schema version can gain optional fields without another break. - Publish releases from GitHub Actions through PyPI Trusted Publishing.
- Keep the core runtime dependency-free.
Ocura OSS 0.4.0
Ocura OSS 0.4.0 adds Store.read_verified_log(), so scripts and agents can consume recorded stdout or stderr as bytes checked against the stored run's byte count and SHA-256 digest. The autoregressive example's report now uses this method to read saved output.
The method validates the stored atom and its lineage, checks log path containment, and verifies the exact bytes it returns. It checks the selected stream; use verify() or Store.verify_state() to verify the full ledger. Decoding and metric interpretation remain with the caller.
Install the published release with Python 3.11 or later:
python -m pip install ocura-oss==0.4.0The core continues to use only Python's standard library at runtime. The autoregressive example and its optional framework dependencies remain repository-only.
Validation for this release publication: the published wheel and source distribution passed SHA-256 checks against PyPI metadata, and all nine Python source modules in each distribution match the v0.4.0 tag at 240843038a744b906ed6dffa8836dd827ea50691.
Ocura OSS 0.3.0
Ocura OSS 0.3.0 adds init --json and run --json, so scripts and AI agents can record a baseline, branch, rerun, verify, and compare using returned identifiers throughout. Command output stays in its recorded logs while stdout contains one JSON result; existing exit codes and text output remain available. JSON also handles Unicode paths on legacy Windows encodings.
The source repository includes a small autoregressive example with PyTorch and JAX backends and an optional local Ray Core executor. It records two training runs and reconstructs their comparison from verified logs. Examples and framework requirements are excluded from both package distributions; the core remains dependency-free with the existing storage format.
See the CLI reference, automation guide, and autoregressive example.
Validation: all 126 packaged tests passed from fresh wheel and source-distribution installations on Windows with Python 3.12/3.14 and Linux under WSL with Python 3.12. All four example combinations passed with a fresh Windows CPU installation of PyTorch 2.14.0, JAX 0.11.1, and Ray 2.58.0. Build, Twine, lint, formatting, and type checks passed.