owlrunkit 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/LICENSE +674 -0
  3. package/NOTICE.md +137 -0
  4. package/README.md +44 -0
  5. package/SOURCE.md +10 -0
  6. package/docs/architecture/OWLCODA_RUN_KIT_CONTRACT_V0_1.md +160 -0
  7. package/docs/architecture/OWLCODA_RUN_KIT_CONTRACT_V0_2.md +459 -0
  8. package/integrations/codex/skills/owlcoda-runkit/SKILL.md +408 -0
  9. package/integrations/codex/skills/owlcoda-runkit/agents/openai.yaml +4 -0
  10. package/integrations/codex/skills/owlcoda-runkit/assets/templates/agents-snippet.md +7 -0
  11. package/integrations/codex/skills/owlcoda-runkit/assets/templates/config.json +10 -0
  12. package/integrations/codex/skills/owlcoda-runkit/assets/templates/coverage-adopt-request.json +26 -0
  13. package/integrations/codex/skills/owlcoda-runkit/assets/templates/execution-delivery-packet.json +13 -0
  14. package/integrations/codex/skills/owlcoda-runkit/assets/templates/finalize-request.json +18 -0
  15. package/integrations/codex/skills/owlcoda-runkit/assets/templates/goal-contract.json +11 -0
  16. package/integrations/codex/skills/owlcoda-runkit/assets/templates/profiles.json +9 -0
  17. package/integrations/codex/skills/owlcoda-runkit/assets/templates/ready-for-commit-request.json +11 -0
  18. package/integrations/codex/skills/owlcoda-runkit/assets/templates/resource-preflight-request.json +56 -0
  19. package/integrations/codex/skills/owlcoda-runkit/assets/templates/resume-request.json +10 -0
  20. package/integrations/codex/skills/owlcoda-runkit/assets/templates/snapshot-request.json +23 -0
  21. package/integrations/codex/skills/owlcoda-runkit/assets/templates/verification-context.json +15 -0
  22. package/integrations/codex/skills/owlcoda-runkit/assets/templates/verification-receipt.json +11 -0
  23. package/integrations/codex/skills/owlcoda-runkit/assets/templates/verify-plan-request.json +31 -0
  24. package/integrations/codex/skills/owlcoda-runkit/assets/templates/visual-smoke-request.json +32 -0
  25. package/integrations/codex/skills/owlcoda-runkit/assets/templates/worker-lease.json +7 -0
  26. package/package.json +24 -0
  27. package/packages/attest/LICENSE +674 -0
  28. package/packages/attest/README.md +63 -0
  29. package/packages/attest/cli/owlcoda-attest.mjs +155 -0
  30. package/packages/attest/consumer-surface-v1.json +255 -0
  31. package/packages/attest/distribution-manifest-v1.json +104 -0
  32. package/packages/attest/fixtures/bad/accepted-authority-leak.json +7 -0
  33. package/packages/attest/fixtures/bad/accepted-failed-receipt.json +7 -0
  34. package/packages/attest/fixtures/bad/active-context-binding-mismatch.json +7 -0
  35. package/packages/attest/fixtures/bad/active-source-binding-mismatch.json +7 -0
  36. package/packages/attest/fixtures/bad/context-fingerprint-mismatch.json +7 -0
  37. package/packages/attest/fixtures/bad/duplicate-object-key.json +8 -0
  38. package/packages/attest/fixtures/bad/multiple-active-leaves.json +10 -0
  39. package/packages/attest/fixtures/bad/orphan-replacement.json +7 -0
  40. package/packages/attest/fixtures/bad/root-shape-extra-property.json +8 -0
  41. package/packages/attest/fixtures/bad/source-fingerprint-mismatch.json +7 -0
  42. package/packages/attest/fixtures/good/accepted-replacement-chain.json +59 -0
  43. package/packages/attest/fixtures/good/blocked-single-leaf.json +9 -0
  44. package/packages/attest/fixtures/index.json +90 -0
  45. package/packages/attest/sbom.spdx.json +33 -0
  46. package/packages/attest/schemas/attestation-ref-v1.schema.json +44 -0
  47. package/packages/attest/schemas/attestation-result-v1.schema.json +163 -0
  48. package/packages/attest/schemas/offline-attestation-bundle-v1.schema.json +30 -0
  49. package/packages/attest/schemas/public-verification-bundle-v1.schema.json +74 -0
  50. package/packages/attest/schemas/quick-verification-receipt-v1.schema.json +219 -0
  51. package/packages/attest/schemas/workspace-snapshot-v1.schema.json +135 -0
  52. package/packages/attest/src/canonical.mjs +12 -0
  53. package/packages/attest/src/formal.mjs +762 -0
  54. package/packages/attest/src/index.mjs +113 -0
  55. package/packages/attest/src/offline-bundle.mjs +108 -0
  56. package/packages/attest/src/quick-receipt-contract.mjs +156 -0
  57. package/packages/attest/src/quick.mjs +274 -0
  58. package/packages/attest/src/reference-contract.mjs +64 -0
  59. package/packages/attest/src/reference.mjs +131 -0
  60. package/packages/attest/src/workspace-snapshot.mjs +171 -0
  61. package/registry-release-policy-v1.json +34 -0
  62. package/sbom.spdx.json +39 -0
  63. package/scripts/runkit-contract/acceptance-evidence.mjs +103 -0
  64. package/scripts/runkit-contract/core-contract.mjs +392 -0
  65. package/scripts/runkit-contract/coverage-adoption.mjs +414 -0
  66. package/scripts/runkit-contract/delivery-create.mjs +252 -0
  67. package/scripts/runkit-contract/delivery-selection.mjs +31 -0
  68. package/scripts/runkit-contract/finalize.mjs +790 -0
  69. package/scripts/runkit-contract/inspect-presentation.mjs +183 -0
  70. package/scripts/runkit-contract/install-codex-skill.mjs +239 -0
  71. package/scripts/runkit-contract/lease-lifecycle.mjs +324 -0
  72. package/scripts/runkit-contract/lifecycle-orchestration.mjs +415 -0
  73. package/scripts/runkit-contract/offline-store.mjs +248 -0
  74. package/scripts/runkit-contract/profile-impact.mjs +223 -0
  75. package/scripts/runkit-contract/provenance-common.mjs +153 -0
  76. package/scripts/runkit-contract/quick-attest.mjs +4 -0
  77. package/scripts/runkit-contract/quick-canonical.mjs +41 -0
  78. package/scripts/runkit-contract/quick-metrics.mjs +86 -0
  79. package/scripts/runkit-contract/quick-receipt.mjs +139 -0
  80. package/scripts/runkit-contract/quick-verify.mjs +201 -0
  81. package/scripts/runkit-contract/quick-workspace-snapshot.mjs +3 -0
  82. package/scripts/runkit-contract/ready-for-commit.mjs +188 -0
  83. package/scripts/runkit-contract/receipt-lineage.mjs +332 -0
  84. package/scripts/runkit-contract/registry-adoption-gate.mjs +117 -0
  85. package/scripts/runkit-contract/repair-execution.mjs +997 -0
  86. package/scripts/runkit-contract/resource-preflight.mjs +829 -0
  87. package/scripts/runkit-contract/resume-execution.mjs +569 -0
  88. package/scripts/runkit-contract/runkit-cli.mjs +1214 -0
  89. package/scripts/runkit-contract/schemas/closeout-receipt-v2.schema.json +42 -0
  90. package/scripts/runkit-contract/schemas/core-artifact-v2.schema.json +23 -0
  91. package/scripts/runkit-contract/schemas/core-artifact.schema.json +23 -0
  92. package/scripts/runkit-contract/schemas/coverage-adopt-request-v1.schema.json +66 -0
  93. package/scripts/runkit-contract/schemas/engine-pin-v2.schema.json +14 -0
  94. package/scripts/runkit-contract/schemas/engine-pin.schema.json +14 -0
  95. package/scripts/runkit-contract/schemas/evidence-coverage-index-v1.schema.json +131 -0
  96. package/scripts/runkit-contract/schemas/finalize-request-v1.schema.json +131 -0
  97. package/scripts/runkit-contract/schemas/profiles.schema.json +47 -0
  98. package/scripts/runkit-contract/schemas/project-config-v2.schema.json +13 -0
  99. package/scripts/runkit-contract/schemas/project-config.schema.json +13 -0
  100. package/scripts/runkit-contract/schemas/ready-for-commit-v1.schema.json +26 -0
  101. package/scripts/runkit-contract/schemas/replayable-evidence-v1.schema.json +82 -0
  102. package/scripts/runkit-contract/schemas/resource-preflight-request-v1.schema.json +178 -0
  103. package/scripts/runkit-contract/schemas/resource-preflight-v1.schema.json +153 -0
  104. package/scripts/runkit-contract/schemas/resume-attempt-v1.schema.json +80 -0
  105. package/scripts/runkit-contract/schemas/resume-request-v1.schema.json +77 -0
  106. package/scripts/runkit-contract/schemas/snapshot-v1.schema.json +71 -0
  107. package/scripts/runkit-contract/schemas/verification-context-v1.schema.json +92 -0
  108. package/scripts/runkit-contract/schemas/verification-plan-v1.schema.json +150 -0
  109. package/scripts/runkit-contract/schemas/verification-receipt-v2.schema.json +118 -0
  110. package/scripts/runkit-contract/schemas/verify-plan-request-v1.schema.json +56 -0
  111. package/scripts/runkit-contract/schemas/visual-smoke-request-v1.schema.json +64 -0
  112. package/scripts/runkit-contract/schemas/visual-smoke-result-v1.schema.json +68 -0
  113. package/scripts/runkit-contract/snapshot.mjs +340 -0
  114. package/scripts/runkit-contract/source-fingerprint.mjs +404 -0
  115. package/scripts/runkit-contract/templates/coverage-adopt-request.json +26 -0
  116. package/scripts/runkit-contract/templates/finalize-request.json +18 -0
  117. package/scripts/runkit-contract/templates/goal-contract.json +11 -0
  118. package/scripts/runkit-contract/templates/ready-for-commit-request.json +11 -0
  119. package/scripts/runkit-contract/templates/resource-preflight-request.json +56 -0
  120. package/scripts/runkit-contract/templates/resume-request.json +10 -0
  121. package/scripts/runkit-contract/templates/snapshot-request.json +23 -0
  122. package/scripts/runkit-contract/templates/verify-plan-request.json +31 -0
  123. package/scripts/runkit-contract/templates/visual-smoke-request.json +32 -0
  124. package/scripts/runkit-contract/templates/worker-lease.json +7 -0
  125. package/scripts/runkit-contract/verification-context.mjs +141 -0
  126. package/scripts/runkit-contract/verification-plan.mjs +608 -0
  127. package/scripts/runkit-contract/verification-receipt-gate.mjs +566 -0
  128. package/scripts/runkit-contract/visual-smoke.mjs +410 -0
@@ -0,0 +1,459 @@
1
+ # OwlCoda RunKit Contract v0.2
2
+
3
+ Status: implementation candidate for repository-owned Core conformance
4
+
5
+ Date: 2026-07-13
6
+
7
+ Supersedes for new executions: [Contract v0.1](./OWLCODA_RUN_KIT_CONTRACT_V0_1.md)
8
+
9
+ ## Purpose
10
+
11
+ Contract v0.2 hardens acceptance evidence. It keeps the project—not a chat
12
+ window, agent memory, or external dashboard—as the system of record, while
13
+ closing three gaps proven by Run008:
14
+
15
+ - an `accepted` closeout could be written without consuming a passing gate;
16
+ - source freshness did not prove verification-environment freshness;
17
+ - a descriptive shell or GUI label could be accepted without a replayable
18
+ invocation description.
19
+
20
+ Contract v0.1 remains the historical interpretation contract for existing
21
+ artifacts. New accepted closeouts must use v0.2.
22
+
23
+ ## Inherited principles
24
+
25
+ Contract v0.2 retains the v0.1 source fingerprint, safe path, profile impact,
26
+ append-only lineage, foreign-project zero-write, and explicit authorization
27
+ rules. In particular:
28
+
29
+ - `.owlcoda/runkit/**` is runtime truth and never product source;
30
+ - one execution pins one Core identity;
31
+ - uncovered change fails closed;
32
+ - stale source stops verification before command execution;
33
+ - only one active receipt leaf is valid;
34
+ - configuration and closeout state do not grant Git or release authority.
35
+
36
+ ## D8: gate-bound accepted closeout
37
+
38
+ `closeout --decision accepted` must consume a Contract v0.2 gate input and
39
+ recompute the gate. A caller-supplied `accepted` string or a saved gate-output
40
+ summary is insufficient.
41
+
42
+ The recomputed gate must prove:
43
+
44
+ - `decision=accepted_passed`;
45
+ - one valid receipt lineage with one active leaf;
46
+ - the active receipt `runId` equals the execution being closed;
47
+ - the active receipt binds the current source fingerprint;
48
+ - the active receipt binds the current verification-context fingerprint;
49
+ - selected profile IDs match exactly;
50
+ - every command receipt uses replayable evidence and exited successfully;
51
+ - at least one writer lease exists and every lease is released.
52
+
53
+ The accepted closeout payload binds:
54
+
55
+ - Contract version;
56
+ - gate decision;
57
+ - gate-input file SHA-256;
58
+ - active receipt SHA-256;
59
+ - source fingerprint;
60
+ - verification-context fingerprint;
61
+ - selected profile IDs;
62
+ - released lease IDs;
63
+ - `authorizationGranted=false`.
64
+
65
+ `blocked` and `rejected` closeouts may be recorded without a passing gate so
66
+ failed work can still leave durable truth. They remain non-authoritative for
67
+ Git, release, publish, deploy, credential use, deletion, or foreign writes.
68
+
69
+ ## D9: VerificationContextV1
70
+
71
+ Source equality alone is not enough to reuse verification. Contract v0.2 adds
72
+ `OwlCodaRunKitVerificationContextV1` and a canonical SHA-256 fingerprint kept
73
+ separate from the product source fingerprint.
74
+
75
+ The context contains:
76
+
77
+ - `reusePolicy`;
78
+ - material platform identity when bound;
79
+ - toolchain names and versions;
80
+ - lockfile paths and hashes;
81
+ - fixture identities and hashes;
82
+ - service identities;
83
+ - secret-safe environment value hashes.
84
+
85
+ Arrays are canonicalized by their canonical JSON value, object keys are sorted,
86
+ and duplicate primary identities are invalid. Raw secret values are forbidden;
87
+ only declared value hashes may enter the context.
88
+
89
+ ### Reuse policies
90
+
91
+ - `portable`: platform is `null`; the receipt may be reused only when the full
92
+ remaining context fingerprint matches.
93
+ - `platform_bound`: `platform.os` and `platform.arch` are required.
94
+ - `environment_bound`: platform is required and at least one fixture, service,
95
+ or environment identity must be present.
96
+
97
+ A receipt whose declared context fingerprint differs from the recomputed
98
+ current context is rejected even when source files are unchanged.
99
+
100
+ ## D10: replayable evidence
101
+
102
+ Every v0.2 command receipt contains
103
+ `OwlCodaRunKitReplayableEvidenceV1`. A natural-language command label is not
104
+ acceptance evidence.
105
+
106
+ Common required fields are:
107
+
108
+ - evidence kind: `shell` or `automation`;
109
+ - exact working directory;
110
+ - launcher executable and version;
111
+ - material tool versions;
112
+ - material input IDs and SHA-256 values;
113
+ - output artifact paths and SHA-256 values;
114
+ - command exit code plus stdout/stderr SHA-256 on the enclosing receipt.
115
+
116
+ Shell evidence additionally requires the exact argv array. It must not rely on
117
+ an ambiguous reconstructed command string.
118
+
119
+ Automation evidence additionally requires an automation-manifest SHA-256 and at
120
+ least one output artifact. The manifest may describe Computer Use, CDP,
121
+ Playwright, Electron, browser, or another deterministic runner, but acceptance
122
+ consumes its hash and outputs rather than a prose summary.
123
+
124
+ ## Artifact chain
125
+
126
+ ```text
127
+ GoalContract
128
+ -> ExecutionPlan + engine pin
129
+ -> WorkerLease
130
+ -> ExecutionDeliveryPacket
131
+ -> source gate + profile impact
132
+ -> VerificationContextV1
133
+ -> VerificationReceiptV2 + replayable evidence
134
+ -> accepted_passed gate
135
+ -> gate-bound CloseoutReceiptV2
136
+ ```
137
+
138
+ ## Compatibility
139
+
140
+ - v0.1 delivery fingerprints, profile resolution, and receipt lineage remain
141
+ readable and retain their historical meaning.
142
+ - A closed execution is inspected against the immutable Core identity in its
143
+ closeout receipt. Only an active execution is compared with the currently
144
+ installed Core, so active engine drift still fails closed without making
145
+ closed history unreadable.
146
+ - A v0.1 gate may still be inspected, but it cannot authorize a v0.2 accepted
147
+ closeout.
148
+ - New project initialization writes `OwlCodaRunKitConfigV2` and pins Core
149
+ `0.3.0`.
150
+ - Initialization upgrades a known V1 project config or an older v0.2 Core
151
+ patch identity by atomically replacing `config.json` and writing an
152
+ authorization-free local migration receipt. Unknown config versions fail
153
+ closed and are not rewritten.
154
+ - Core artifacts emitted by the current Core use `RunKitCoreArtifactV2`;
155
+ validators may still inspect historical V1 artifacts.
156
+
157
+ ## Exit behavior
158
+
159
+ - accepted closeout with a complete current v0.2 gate: exit `0`;
160
+ - missing, rejected, mismatched, legacy, or lease-incomplete accepted gate:
161
+ `closeout_gate_rejected`, exit `2`;
162
+ - malformed CLI input or unreadable JSON: `invalid_input`, exit `3`;
163
+ - active execution engine drift or an invalid historical closeout: inspect
164
+ exit `2`;
165
+ - rejected or blocked record closeout: exit `0`, without acceptance binding.
166
+
167
+ ## Authorization boundary
168
+
169
+ Accepted is not authorized. A valid v0.2 closeout records the control decision
170
+ for one source/context/profile combination. It does not authorize stage,
171
+ commit, push, tag, publish, deploy, delete, credential use, telemetry, or
172
+ foreign-project writes. Those actions require separate explicit authority.
173
+
174
+ ## Core v0.3 provenance commands
175
+
176
+ Core `0.3.0` implements the first project-owned provenance workflow on top of
177
+ Contract v0.2:
178
+
179
+ - `runkit snapshot` records an exact executable/argv/cwd invocation, immutable
180
+ stdout/stderr bytes and hashes, VerificationContext fingerprint, selected
181
+ source manifest, and Git HEAD/status before and after. RunKit runtime paths
182
+ are excluded from observed product status so evidence writes do not
183
+ self-invalidate. Foreign mode is read-only and target drift fails closed.
184
+ - `runkit finalize` validates the current DeliveryPacket before consuming
185
+ snapshots, recomputes profile impact, verifies replayable evidence and output
186
+ hashes, appends receipt lineage, and emits the gate input/output.
187
+ - `runkit ready-for-commit` requires a fresh DeliveryPacket, accepted gate-bound
188
+ closeout, released leases, and fresh selected root manifests. Its receipt
189
+ keeps every Git/release action and authorization flag false.
190
+
191
+ These commands make the normal path tool-owned instead of hand-authored:
192
+
193
+ ```text
194
+ snapshot
195
+ -> finalize
196
+ -> explicit accepted closeout
197
+ -> fresh root snapshot
198
+ -> ready-for-commit
199
+ ```
200
+
201
+ ## Core v0.4 recovery inspection
202
+
203
+ Core `0.4.0` makes `runkit inspect` the session-independent recovery entrypoint.
204
+ The top-level recovery summary distinguishes zero, one, and multiple active
205
+ executions. It selects a run only when exactly one active execution exists and
206
+ otherwise returns an explicit `plan_new_execution` or
207
+ `select_active_execution` action.
208
+
209
+ Every execution also reports a recovery view over the existing artifact
210
+ contract:
211
+
212
+ - validated engine-pin and closeout state;
213
+ - active and released worker leases;
214
+ - current DeliveryPacket freshness against the working tree;
215
+ - active receipt lineage and the one matching accepted gate;
216
+ - evidence trust level, issues, and one next allowed action.
217
+
218
+ Inspection does not infer acceptance from file presence. Multiple active runs,
219
+ malformed active artifacts, stale delivery, ambiguous packets or gates, and a
220
+ passed receipt without a recorded writer lease fail closed with exit `2`.
221
+ Closed historical executions remain readable through the Core identity bound
222
+ into their closeout receipt. Inspection remains read-only and grants no Git or
223
+ release authority.
224
+
225
+ ## Core v0.5 visual-smoke evidence
226
+
227
+ Core `0.5.0` adds `runkit visual-smoke` as an executor-neutral evidence
228
+ orchestrator. A project supplies one explicit automation runner and exact argv;
229
+ RunKit does not embed a browser, Electron, CDP, Playwright, or Computer Use
230
+ driver.
231
+
232
+ The request freezes the visual surface, viewport, assertion ids, console
233
+ policy, denied external navigation, verification context, and selected source
234
+ manifest. The runner must write a structured result and at least one output
235
+ artifact inside the execution evidence root. RunKit recomputes all artifact
236
+ hashes, binds the canonical automation manifest, stdout, stderr and result to
237
+ `OwlCodaRunKitReplayableEvidenceV1`, and rejects failed assertions, policy
238
+ violations, malformed or missing artifacts, target writes, and post-run artifact
239
+ mutation.
240
+
241
+ The output remains an `OwlCodaRunKitSnapshotV1`, so the existing `finalize`,
242
+ receipt lineage, accepted closeout, and ready-for-commit gates consume visual
243
+ evidence without a parallel acceptance path. A passing visual smoke grants no
244
+ Git, release, credential, navigation, or foreign-write authority.
245
+
246
+ ## Core v0.6 dependency-aware verification planning
247
+
248
+ Core `0.6.0` adds `runkit verify-plan` as the deterministic planning boundary
249
+ between a fresh DeliveryPacket and command execution. It does not weaken the
250
+ v0.2 source or acceptance gate. It records four separate facts:
251
+
252
+ - leased source drift invalidates receipts bound to the changed source;
253
+ - declared dependency drift invalidates receipts bound to the changed
254
+ dependency identity;
255
+ - unrelated dirty-tree drift remains visible without invalidating unrelated
256
+ local receipt evidence;
257
+ - global gate failure blocks the relevant acceptance decision without
258
+ rewriting otherwise reusable receipts as stale or failed.
259
+
260
+ `OwlCodaRunKitEvidenceCoverageIndexV1` binds each candidate reusable receipt to
261
+ source-file hashes, declared dependency hashes, the verification-context
262
+ fingerprint, profile ids and command ids. The resulting
263
+ `OwlCodaRunKitVerificationPlanV1` records reusable and invalid receipts,
264
+ direct/transitive/supporting profile impact, one deterministic primary profile
265
+ or an ambiguity warning, uncovered paths, and the minimum pending command ids.
266
+ The plan also emits exact pending command definitions. A selected profile with
267
+ no command mapping blocks as `verification_mapping_required` instead of being
268
+ misreported as ready, and more than ten direct profile matches emit a
269
+ machine-readable breadth warning.
270
+
271
+ The Core recomputes workspace Git paths, current source hashes and declared
272
+ file-dependency hashes before writing the project-owned plan. Supporting-only
273
+ profile matches fail closed, and an uncovered path still requires the full
274
+ profile. A plan always records `authorizationGranted=false`; command execution,
275
+ Git, release, credentials, deletion and foreign writes require separate
276
+ authority.
277
+
278
+ ## Core v0.7 receipt-backed coverage adoption
279
+
280
+ Core `0.7.0` adds `runkit coverage-adopt` as the provenance boundary between
281
+ accepted Contract v0.2 verification evidence and a reusable
282
+ `OwlCodaRunKitEvidenceCoverageIndexV1`. A request may select a project-owned
283
+ gate input by path and SHA-256 and map receipt command ids to project profile
284
+ commands or dependency ids to material inputs and VerificationContext entries.
285
+ It cannot supply receipt status, source hashes, dependency hashes, context
286
+ fingerprints, selected profiles, or command results.
287
+
288
+ The Core recomputes the gate artifact hash, validates its append-only lineage
289
+ and acceptance decision, selects only the active passed receipt, matches exact
290
+ cwd/launcher/argv and zero exit against the declared profile command, and
291
+ derives source and dependency coverage from bound evidence. The resulting
292
+ coverage artifact records its source gate path/hash, active receipt hash,
293
+ source run, current adopting run, the command/dependency selectors used for
294
+ derivation, and `authorizationGranted=false`.
295
+
296
+ `runkit verify-plan` in Core `0.7.0` consumes the coverage artifact through a
297
+ path and SHA-256, then re-derives it from the current gate bytes, active receipt,
298
+ project profiles, exact command evidence, and declared dependency evidence.
299
+ Changed source evidence or any mismatch between the derived result and the
300
+ stored index fails closed. Unbound inline coverage claims are rejected.
301
+ Coverage adoption and verification planning remain evidence operations:
302
+ neither grants command execution, Git, release, credentials, deletion,
303
+ telemetry, or foreign-write authority.
304
+
305
+ ## Core v0.8 append-only native resume
306
+
307
+ Core `0.8.0` adds `runkit resume` after receipt-backed coverage adoption. The
308
+ CLI `--run-id` identifies the source execution and supports two explicit modes:
309
+
310
+ - an unclosed execution receives a new `OwlCodaRunKitResumeAttemptV1` in the
311
+ same run only when its engine pin is current, it is the sole active execution,
312
+ no writer lease remains active, and no finalized receipt lineage exists. An
313
+ execution with finalized receipts must close before it can resume as a
314
+ distinct continuation, so old verification cannot govern the resumed state;
315
+ - a closed execution creates a distinct continuation run atomically. The new
316
+ execution preserves the exact parent goal bytes and binds the parent goal,
317
+ closeout, decision, engine pin, source run id, and artifact hashes without
318
+ modifying the parent execution.
319
+
320
+ Both modes derive a fresh `OwlCodaRunKitEvidenceCoverageIndexV1` through the
321
+ same accepted-gate and exact-command boundary as `coverage-adopt`. The request
322
+ may select coverage sources but cannot supply receipt status, hashes, profiles,
323
+ command results, or reusable receipt ids. Empty coverage is valid when the
324
+ source execution has no accepted evidence to inherit.
325
+
326
+ Inherited receipt ids remain provisional evidence, not a new acceptance
327
+ decision. The resume attempt requires the next workflow to acquire a writer
328
+ lease, prepare or replace the DeliveryPacket, and run `verify-plan`; that plan
329
+ re-derives the coverage index and determines which stages are still reusable.
330
+ Resume never rewrites a prior goal, lease, packet, snapshot, receipt, gate,
331
+ coverage index, event, or closeout, and every result keeps
332
+ `authorizationGranted=false`.
333
+
334
+ ## Core v0.9 CLI-managed lease and delivery
335
+
336
+ Core `0.9.0` removes hand-authored lease and DeliveryPacket JSON from the
337
+ normal Codex adapter path while retaining the same project-owned artifacts.
338
+ `runkit lease acquire` accepts repeated explicit `--owned-path` values, rejects
339
+ the reserved runtime, and checks every active execution under a project-level
340
+ transaction lock before writing one `OwlCodaRunKitWorkerLeaseV1`. Active path
341
+ overlap, duplicate work items, malformed files, directories, and symlinked
342
+ lease truth fail closed. `lease inspect` reads those artifacts and `lease
343
+ release` is the only normal `active -> released` transition.
344
+
345
+ `runkit delivery create --from-lease` reads current Git porcelain status but
346
+ includes only changed regular files owned by the selected active lease. It
347
+ derives whole-file SHA-256 values, canonical source fingerprint, branch, HEAD,
348
+ Core identity, and a list of unrelated dirty paths. Unrelated dirty paths stay
349
+ visible but are not silently claimed by the lease. Reserved runtime paths,
350
+ deletions, renames, symlinks, an empty candidate set, released or ambiguous
351
+ leases, unsafe output directories, and duplicate packet ids fail closed.
352
+
353
+ These commands write only `.owlcoda/runkit/**`. Every result and generated
354
+ packet keeps `authorizationGranted=false` and all repository actions false;
355
+ lease or delivery state never grants Git, release, credential, deletion,
356
+ telemetry, or foreign-write authority.
357
+
358
+ ## Core v0.10 high-level lifecycle composition
359
+
360
+ Core `0.10.0` adds `runkit start`, `runkit verify`, and `runkit finish` as the
361
+ normal Codex adapter path without replacing any atomic command or artifact.
362
+ `start` composes plan and lease acquisition under the project control lock; an
363
+ invalid or overlapping lease rolls back only the newly created execution.
364
+
365
+ `verify` accepts an exact executable and argv after `--`, including a
366
+ zero-argument executable or empty-string argument. It derives a bounded
367
+ DeliveryPacket from the selected lease, writes generated snapshot/finalize
368
+ requests under the execution, derives platform, Node, Git and recognized
369
+ lockfile identity, runs the snapshot, and finalizes only when that snapshot
370
+ passes without source drift. The complete high-level verify holds the project
371
+ control transaction, so `finish` cannot close while a command is running.
372
+ Finalize and accepted finish both require the snapshot selected-file map,
373
+ manifest fingerprint and material inputs to match the same DeliveryPacket;
374
+ an old snapshot cannot be relabeled with a new source fingerprint. A command failure preserves stdout, stderr,
375
+ exit code, request and snapshot artifacts and emits no passed receipt.
376
+
377
+ `finish accepted` first derives and validates the unique active receipt gate,
378
+ then releases active leases and writes the accepted closeout. Without that gate
379
+ it leaves leases active and fails closed. It accepts only a Contract v0.2 gate
380
+ whose execution, receipt, snapshot, evidence and DeliveryPacket directories are
381
+ real project directories without symlink ancestors. If closeout persistence
382
+ fails after lease release, the same control transaction restores those leases
383
+ before returning failure. `blocked` and `rejected` release the
384
+ execution's leases and close honestly without inventing verification.
385
+
386
+ These commands only compose existing project-owned truth. They do not parse a
387
+ shell string, adopt terminal history, schedule multiple commands, or grant Git,
388
+ release, credential, deletion, telemetry, deployment, or foreign-write
389
+ authority.
390
+
391
+ ## Core v0.11 human-first inspect projection
392
+
393
+ Core `0.11.0` changes only direct `runkit inspect` presentation. Its default
394
+ stdout is a compact human summary of current execution, latest indexed
395
+ closeout, source and evidence status, active lease holders, dominant gap, next
396
+ allowed action and false release authority. The wording is deliberately
397
+ `latest indexed closeout`, not `most recent`, because Contract v0.2 closeout
398
+ artifacts do not carry an acceptance timestamp. A closed delivery remains
399
+ `historical`; inspect does not claim it is still fresh.
400
+
401
+ Machine consumers must call `runkit inspect --json`. That response preserves
402
+ the complete execution and recovery document and adds the deterministic
403
+ `OwlCodaRunKitInspectSummaryV1` projection. `--history` lists only indexed
404
+ closed executions, while `--run-id ID --verbose` focuses one execution's pin,
405
+ lease, source, evidence, trust, issues and next action. These views are derived
406
+ in memory and never write project state or create acceptance, Git or release
407
+ authority.
408
+
409
+ The projection is fail-closed. Every unclosed execution entry remains visible
410
+ even when its engine pin is malformed, multiple active executions never inherit
411
+ source or evidence state from closed history, and damaged closed truth points to
412
+ `repair_execution_artifacts`. Project config, execution, lease, delivery,
413
+ receipt, gate, engine pin and closeout truth must be regular project-owned files
414
+ and real directories without symlink ancestors. Config fields and authority
415
+ policy are validated before they enter the machine document. Symlinked,
416
+ redirected, dangling or non-regular truth is reported as invalid rather than
417
+ followed or silently treated as absent. Human output escapes control characters,
418
+ and indexed identifiers use locale-independent code-unit order.
419
+
420
+ ## Core v0.12 typed model resource preflight
421
+
422
+ Core `0.12.0` adds `runkit resource-preflight` as the boundary before
423
+ model-intensive work. A project supplies a strict request containing one
424
+ hash-bound `OwlCodaRunKitVerificationPlanV1`, typed provider/model observations,
425
+ the remaining workload estimate, explicit unknown handling, and hard resource
426
+ limits. RunKit validates and totals this evidence; it does not query provider
427
+ billing, discover credentials, route a model, or execute the workload.
428
+
429
+ Receipt reuse is limited to workload entries whose `coveredByReceiptId` is
430
+ still present in the bound plan's `reusableReceiptIds`. The Core subtracts only
431
+ those entries, then deterministically totals pending calls, input/output/total
432
+ tokens, elapsed time, and cost. Cost remains typed unknown unless the project
433
+ supplies explicit USD input/output rates. Availability, remaining-call quota,
434
+ remaining-token quota, reset time, and pricing remain independent known or
435
+ unknown facts and preserve their adapter evidence kind, hash, reference, and
436
+ observation time. `maxObservationAgeMs` makes that evidence expire explicitly;
437
+ an expired latest artifact projects `run_resource_preflight` instead of model
438
+ readiness. Inspect revalidates the bound plan path, bytes, SHA-256, identity,
439
+ authority boundary, and reusable receipt set, and recomputes resource demand,
440
+ cost, freshness, blockers, warnings, and decision from the artifact rather than
441
+ trusting its projection fields.
442
+
443
+ The project policy separately chooses fail-open or fail-closed behavior for
444
+ availability, quota, reset time, and pricing. A required unavailable model,
445
+ insufficient known quota, exceeded limit, or fail-closed unknown returns
446
+ `blocked_by_resource` with `pause_at_deterministic_stage`. A model-optional gate
447
+ may return `ready_without_model_execution`; it never invents or selects a
448
+ fallback model. The append-only `OwlCodaRunKitResourcePreflightV1` artifact and
449
+ every CLI result keep authorization, Git, and release authority false.
450
+
451
+ Core `0.12.0` is the typed evidence and deterministic-estimate layer, not a
452
+ claim that every provider exposes reliable remaining quota, reset time, or
453
+ pricing. Live provider adapters require a separately verifiable source and may
454
+ legitimately report typed unknown fields.
455
+
456
+ ## Deferred work
457
+
458
+ Contract v0.2 still does not add a built-in browser or Electron driver, Plugin,
459
+ cloud, team, signing, or transparency-log services.