cyberine
UsageRun recipes

Which harness a worker ran with — toolingSnapshot.harness (k7xxg)

Every engine run records, in run.json, a hash of each harness input Cyberine injected, so two runs can be compared on the harness they used without storing the text itself (instruction files can hold secrets).

jq '.toolingSnapshot.harness' .local/runs/<runId>/run.json
jq '.toolingSnapshot.harness.workers[] | {agentId, kind, model, fingerprint, notCovered}' .local/runs/<runId>/run.json
  • invariants, rules, skills, memory: each {sha256, bytes} of what reached the dispatched prompt. The invariants and rules blocks count only when a step prompt actually carries them (a background dispatch prepends them, a plain foreground run does not), skills hashes the discovered skill set (scope, id, description), and memory hashes the MEMORY block found in the step prompts.
  • workers[]: per worker agentId, kind, provider, workerId, model when the adapter knows it (loop workers), instructions (a loop worker's instruction-file preamble, or the preamble a CLI worker gets for files it does not read itself), fingerprint over the shared inputs plus its instructions, and notCovered naming the instruction files a CLI loads on its own.
  • shared: the fingerprint of the four shared inputs.
  • An input that could not be read is recorded as {missing: "<why>"}, and every fingerprint that would depend on it is left out rather than computed from a guess.

Known Limitations and Deferred Work: the fingerprint covers what Cyberine injects, not what a CLI agent loads by itself (its own CLAUDE.md, AGENTS.md, user settings, plugins), which notCovered names but does not hash. A CLI adapter built without an instruction-file list records instructions as an empty preamble. The repo map and the context-provider preamble a loop worker gets are not part of the fingerprint. Workflow-engine runs (cyberine run, --bg, npm run wf) record the per-worker list; the kanban runner and workflow scripts record only the shared inputs, with memory as missing because they pass no prompts; the single-step orchestrate() path writes no tooling snapshot.