owlrunkit 0.15.1 → 0.16.1

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 (76) hide show
  1. package/CHANGELOG.md +105 -0
  2. package/README.md +284 -66
  3. package/integrations/codex/skills/owlcoda-runkit/SKILL.md +235 -116
  4. package/integrations/codex/skills/owlcoda-runkit/assets/templates/config.json +3 -3
  5. package/integrations/codex/skills/owlcoda-runkit/assets/templates/ready-for-commit-request.json +2 -2
  6. package/package.json +2 -2
  7. package/packages/attest/distribution-manifest-v1.json +10 -0
  8. package/packages/attest/src/quick.mjs +10 -0
  9. package/registry-release-policy-v1.json +8 -2
  10. package/sbom.spdx.json +5 -5
  11. package/scripts/runkit-contract/assurance-router.mjs +119 -0
  12. package/scripts/runkit-contract/core-contract.mjs +203 -206
  13. package/scripts/runkit-contract/core-successor.mjs +2043 -0
  14. package/scripts/runkit-contract/deployment-workflow.mjs +2040 -0
  15. package/scripts/runkit-contract/finalize.mjs +242 -21
  16. package/scripts/runkit-contract/fleet-discovery.mjs +1198 -0
  17. package/scripts/runkit-contract/formal-workflow.mjs +850 -0
  18. package/scripts/runkit-contract/human-status.mjs +553 -0
  19. package/scripts/runkit-contract/inspect-presentation.mjs +25 -8
  20. package/scripts/runkit-contract/install-codex-skill.mjs +73 -30
  21. package/scripts/runkit-contract/lease-lifecycle.mjs +8 -2
  22. package/scripts/runkit-contract/lifecycle-orchestration.mjs +135 -12
  23. package/scripts/runkit-contract/onboarding-doctor.mjs +43 -90
  24. package/scripts/runkit-contract/owner-authority-trust.mjs +230 -0
  25. package/scripts/runkit-contract/owner-deployment-decision.mjs +385 -0
  26. package/scripts/runkit-contract/profile-onboarding.mjs +841 -13
  27. package/scripts/runkit-contract/project-cli-resolver.mjs +704 -0
  28. package/scripts/runkit-contract/project-control-parser.mjs +889 -0
  29. package/scripts/runkit-contract/project-control-state.mjs +28 -0
  30. package/scripts/runkit-contract/provenance-common.mjs +19 -2
  31. package/scripts/runkit-contract/ready-for-commit.mjs +330 -18
  32. package/scripts/runkit-contract/remote-deployment.mjs +1596 -0
  33. package/scripts/runkit-contract/remote-process-adapter.mjs +177 -0
  34. package/scripts/runkit-contract/runkit-bootstrap.mjs +131 -0
  35. package/scripts/runkit-contract/runkit-cli.mjs +1155 -21
  36. package/scripts/runkit-contract/schemas/assurance-route-v1.schema.json +26 -0
  37. package/scripts/runkit-contract/schemas/core-successor-batch-receipt-v1.schema.json +126 -0
  38. package/scripts/runkit-contract/schemas/core-successor-plan-v1.schema.json +167 -0
  39. package/scripts/runkit-contract/schemas/core-successor-project-success-receipt-v1.schema.json +72 -0
  40. package/scripts/runkit-contract/schemas/deployment-execute-request-v1.schema.json +63 -0
  41. package/scripts/runkit-contract/schemas/deployment-lineage-v1.schema.json +292 -0
  42. package/scripts/runkit-contract/schemas/deployment-prepare-receipt-v1.schema.json +140 -0
  43. package/scripts/runkit-contract/schemas/fleet-discovery-v1.schema.json +62 -0
  44. package/scripts/runkit-contract/schemas/fleet-manifest-v1.schema.json +20 -0
  45. package/scripts/runkit-contract/schemas/fleet-root-registry-v1.schema.json +34 -0
  46. package/scripts/runkit-contract/schemas/human-status-v1.schema.json +102 -0
  47. package/scripts/runkit-contract/schemas/owner-authority-trust-v1.schema.json +66 -0
  48. package/scripts/runkit-contract/schemas/owner-deployment-authority-v1.schema.json +46 -0
  49. package/scripts/runkit-contract/schemas/owner-deployment-authority-v2.schema.json +94 -0
  50. package/scripts/runkit-contract/schemas/owner-deployment-decision-v1.schema.json +102 -0
  51. package/scripts/runkit-contract/schemas/owner-migration-authority-v1.schema.json +33 -0
  52. package/scripts/runkit-contract/schemas/owner-migration-authority-v2.schema.json +67 -0
  53. package/scripts/runkit-contract/schemas/profile-apply-receipt-v1.schema.json +32 -0
  54. package/scripts/runkit-contract/schemas/profile-detection-v2.schema.json +145 -0
  55. package/scripts/runkit-contract/schemas/ready-for-commit-v2.schema.json +37 -0
  56. package/scripts/runkit-contract/schemas/remote-deployment-manifest-v1.schema.json +379 -0
  57. package/scripts/runkit-contract/schemas/remote-deployment-result-v1.schema.json +153 -0
  58. package/scripts/runkit-contract/schemas/remote-deployment-stage-journal-v1.schema.json +183 -0
  59. package/scripts/runkit-contract/schemas/remote-target-v1.schema.json +32 -0
  60. package/scripts/runkit-contract/schemas/source-candidate-v2.schema.json +152 -0
  61. package/scripts/runkit-contract/schemas/verification-receipt-v2.schema.json +13 -0
  62. package/scripts/runkit-contract/snapshot.mjs +1 -1
  63. package/scripts/runkit-contract/source-candidate.mjs +1382 -0
  64. package/scripts/runkit-contract/ssh-remote-adapter.mjs +1184 -0
  65. package/scripts/runkit-contract/sync-core016-release-identity.mjs +166 -0
  66. package/scripts/runkit-contract/templates/assurance-request.json +13 -0
  67. package/scripts/runkit-contract/templates/core-successor-owner-authority.json +15 -0
  68. package/scripts/runkit-contract/templates/deployment-execute-request.json +39 -0
  69. package/scripts/runkit-contract/templates/deployment-owner-authority.json +23 -0
  70. package/scripts/runkit-contract/templates/deployment-owner-decision.json +26 -0
  71. package/scripts/runkit-contract/templates/fleet-manifest.json +8 -0
  72. package/scripts/runkit-contract/templates/fleet-root-registry.json +8 -0
  73. package/scripts/runkit-contract/templates/owner-authority-trust.json +16 -0
  74. package/scripts/runkit-contract/templates/ready-for-commit-request.json +2 -2
  75. package/scripts/runkit-contract/templates/remote-deployment-manifest.json +108 -0
  76. package/scripts/runkit-contract/verification-receipt-gate.mjs +28 -0
@@ -7,8 +7,15 @@ description: Run receipt-backed, project-owned software execution with OwlCoda R
7
7
 
8
8
  Use the bundled deterministic Core to coordinate work through project artifacts rather than chat memory. Require Node.js 20 or later.
9
9
 
10
- Current release: standalone `owlrunkit@0.15.1`, bundling Contract `0.2` and
11
- Core `0.15.1`. The root `owlcoda` package has a separate version lifecycle.
10
+ Bundled release: standalone `owlrunkit@0.16.1`, bundling Contract `0.2` and
11
+ Core `0.16.1` with manifest
12
+ `sha256:38ac9110e328c38a81db05f1359734ca810b991c9f4de77647f9719f5e6af78b`.
13
+ Publication and dist-tag state are mutable registry facts: verify the exact
14
+ official npm registry provenance before adoption. The immutable rollback
15
+ baseline for this release is `owlrunkit@0.16.0` with SHA-1
16
+ `bab651b0e10111a7a179a3a58917a8e90e43c35f` and canonical npm tarball URL
17
+ `https://registry.npmjs.org/owlrunkit/-/owlrunkit-0.16.0.tgz`.
18
+ The root `owlcoda` package has a separate version lifecycle.
12
19
 
13
20
  The session is an execution interface. Project artifacts are the system of record.
14
21
 
@@ -20,13 +27,23 @@ The session is an execution interface. Project artifacts are the system of recor
20
27
  4. Never include `.owlcoda/runkit/**` in delivery changed files, profile rules or lease owned paths.
21
28
  5. Read [references/contract-v0.2.md](references/contract-v0.2.md) for new executions and accepted closeouts. Read [references/contract-v0.1.md](references/contract-v0.1.md) only when interpreting historical v0.1 artifacts.
22
29
 
23
- Set `SKILL_ROOT` to this skill directory before running the examples below.
30
+ Use the `owlrunkit` command for normal work. Its bootstrap resolves the
31
+ project's exact locally bound OwlRunKit CLI before interpreting project control
32
+ state. The currently installed package handles bootstrap-only operations such
33
+ as initialization, exact adoption and Core-successor migration. Do not bypass
34
+ that resolver with a global CLI or a copied Skill Core. Project-local
35
+ delegation requires the canonical official npm tarball URL and SHA-512 SRI,
36
+ an installed Core identity trusted by the current bootstrap, and the same Core
37
+ identity in project Config; any mismatch fails closed.
38
+ Set `SKILL_ROOT` to this Skill directory only when an advanced read-only helper
39
+ below has no CLI entry.
24
40
 
25
41
  ## Initialize and inspect
26
42
 
27
43
  ```bash
28
44
  owlrunkit init --workspace "$PROJECT_ROOT"
29
45
  owlrunkit inspect --json --workspace "$PROJECT_ROOT"
46
+ owlrunkit status --workspace "$PROJECT_ROOT"
30
47
  ```
31
48
 
32
49
  Initialization may write only `.owlcoda/runkit/`. It must not modify business source.
@@ -65,13 +82,13 @@ repair surfaces. OwlRunKit uses its own version lifecycle: the standalone
65
82
  For one low-risk exact command, use the Core v0.13 Quick path:
66
83
 
67
84
  ```bash
68
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" quick-verify \
85
+ owlrunkit quick-verify \
69
86
  --workspace "$PROJECT_ROOT" -- "$ABSOLUTE_EXECUTABLE" "arg-one"
70
87
 
71
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" quick-attest \
88
+ owlrunkit quick-attest \
72
89
  --workspace "$PROJECT_ROOT" --receipt "$QUICK_RECEIPT"
73
90
 
74
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" quick-metrics \
91
+ owlrunkit quick-metrics \
75
92
  --workspace "$PROJECT_ROOT" --local
76
93
  ```
77
94
 
@@ -81,13 +98,13 @@ local-only and perform no telemetry or network request.
81
98
  Core v0.13 also adds deterministic repair and exact-byte offline transport:
82
99
 
83
100
  ```bash
84
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" repair \
101
+ owlrunkit repair \
85
102
  --workspace "$PROJECT_ROOT" --run-id "$RUN_ID"
86
103
 
87
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" offline-export \
104
+ owlrunkit offline-export \
88
105
  --workspace "$PROJECT_ROOT" --receipt "$RECEIPT" --output "$BUNDLE"
89
106
 
90
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" offline-import \
107
+ owlrunkit offline-import \
91
108
  --workspace "$PROJECT_ROOT" --bundle "$BUNDLE" --store "$OFFLINE_STORE"
92
109
  ```
93
110
 
@@ -111,18 +128,29 @@ node "$RUNKIT_PACKAGE_ROOT/scripts/runkit-contract/install-codex-skill.mjs" \
111
128
 
112
129
  node "$RUNKIT_PACKAGE_ROOT/scripts/runkit-contract/install-codex-skill.mjs" \
113
130
  install --repository "$RUNKIT_PACKAGE_ROOT" \
114
- --target "$RUNKIT_SKILL_TARGET" --archive "$RUNKIT_SKILL_ARCHIVE_ROOT" \
115
- --workspace /absolute/project-a --workspace /absolute/project-b
131
+ --target "$RUNKIT_SKILL_TARGET" --archive "$RUNKIT_SKILL_ARCHIVE_ROOT"
116
132
  ```
117
133
 
118
134
  The install manifest binds every Skill, Core, contract and attest file.
119
135
  Unknown installed drift fails closed instead of being overwritten. A changed
120
- process-wide Skill requires an explicit fleet: pass every project that consumes
121
- that Skill as a repeated `--workspace`. The installer validates every project
122
- config and refuses the whole update before replacing the Skill or changing any
123
- project when one project has an active execution, an active writer lease,
124
- ambiguous control state, or invalid configuration. Omitting the fleet is an
125
- error; do not pass a partial fleet to bypass this guard.
136
+ process-wide Skill requires a registered complete fleet. Register each coverage
137
+ root once with `owlrunkit fleet register-root --fleet-root <absolute-root>`.
138
+ Inspect and correct a broad or stale registry through the official
139
+ `fleet inspect-registry` and evidence-bound `fleet replace-registry` workflow;
140
+ never hand-edit the registry. Replacement is dry-runnable and append-only
141
+ receipts preserve the exact rollback preimage. Retired archives are evidence,
142
+ not active fleet writers. Ordinary installs use the registered active
143
+ membership automatically. Repeated
144
+ `--fleet-root` or a frozen `--fleet-manifest` remain explicit one-off sources.
145
+ RunKit stops at each project boundary, reports damaged or incomplete markers by
146
+ exact path, freezes the discovered workspace list, and fails closed if a
147
+ registered root is unreachable. It cannot
148
+ discover projects outside registered coverage and must not claim machine-wide
149
+ safety. The installer validates every discovered project config and refuses the
150
+ whole update before replacing the Skill or changing any project when one
151
+ project has an active execution, an active writer lease, ambiguous control
152
+ state, or invalid configuration. A missing registry is an error; do not use
153
+ partial explicit coverage to bypass this guard.
126
154
 
127
155
  A successful update archives the exact prior Skill, migrates each inactive
128
156
  project, and writes an append-only upgrade receipt containing the prior Skill
@@ -156,16 +184,14 @@ fleet with no matching active execution. An accepted receipt, ready-for-commit
156
184
  receipt, package publication, valid install, rollback, or recovery still does
157
185
  not grant Git, npm, release, deploy, or foreign-project authority.
158
186
 
159
- ## Core v0.15 consolidated onboarding and compatibility
187
+ ## Core v0.14 and v0.15 historical compatibility
160
188
 
161
- Core v0.14 introduced self-service onboarding. The bundled Core is now
162
- `0.15.1`; new users should not need internal module calls,
163
- an external schema validator, or the full Formal lifecycle merely to understand
164
- whether a project can adopt RunKit.
189
+ Core v0.14 introduced `owlrunkit doctor`, registry-first exact adoption and
190
+ deterministic `profiles detect`; Core v0.15/0.15.1 consolidated onboarding and
191
+ made inactive 0.13/0.14 ConfigV2 upgrades and exact rollback safe. Historical
192
+ projects, profiles, executions, packets, receipts and closeouts remain readable.
165
193
 
166
194
  ```bash
167
- owlrunkit --help
168
- owlrunkit --version
169
195
  owlrunkit doctor --workspace "$PROJECT_ROOT"
170
196
  owlrunkit profiles detect --workspace "$PROJECT_ROOT" --dry-run
171
197
  owlrunkit profiles validate --workspace "$PROJECT_ROOT"
@@ -173,46 +199,42 @@ owlrunkit profiles impact --workspace "$PROJECT_ROOT" --changed path/to/file
173
199
  owlrunkit adopt --workspace "$PROJECT_ROOT" --exact owlrunkit@0.15.1
174
200
  ```
175
201
 
176
- `doctor` and `profiles detect --dry-run` are read-only. Registry diagnostics use
177
- a short timeout and distinguish offline or DNS/timeout failures, authorization
178
- failures, missing versions and local-install binding mismatches without
179
- printing credentials. Profile detection is deterministic evidence for a human
180
- decision; it does not write or overwrite project configuration.
181
-
182
- `adopt` accepts only an exact `owlrunkit@0.15.1` binding from the official npm
183
- registry. It recomputes the registry and local install/lock facts, invokes the
184
- strict adoption evaluator, and writes typed project evidence only after an
185
- eligible result. Worktrees, `file:` dependencies, local tarballs, Git sources,
186
- workspace links and mutable tags remain ineligible.
187
-
188
- Detected commands use canonical absolute regular-file launchers, including
189
- NVM-managed npm installs, so a detector result does not conflict with Formal
190
- symlink rejection. Workspace discovery understands safe literal and one-level
191
- `apps/*` / `packages/*` patterns and emits exact root-owned npm workspace
192
- commands. Detection remains dry-run only and never rewrites an existing
193
- profile.
194
-
195
- `doctor` warns when explicit broad formatter, linter, or test-collector
196
- commands can include `.owlcoda/runkit/`; it never edits ignore or tool
197
- configuration. `init` and `inspect` consume valid current-version adoption and
198
- profile facts only while the exact local registry binding remains intact and
199
- every launcher is Formal-safe; otherwise launcher review or adoption remains
200
- explicitly incomplete. The recovery action remains authoritative. A rejected
201
- Formal executable preflight or non-accepted finalize gate is preserved under
202
- the execution before the CLI returns the result.
203
-
204
- Contract v0.2 remains unchanged. Upgrading a 0.13 or 0.14 ConfigV2 project
205
- is allowed only while its RunKit control state is inactive and unambiguous. An
206
- active execution or writer lease refuses the upgrade before `config.json` or
207
- migration evidence changes. A legal refresh writes an exclusive sequenced
208
- Core-refresh migration receipt and changes only `config.json`; a repeated
209
- transition cannot replace its first receipt. Compatibility gates invoke npm
210
- through each selected Node runtime, prove active 0.13/0.14 work blocks 0.15
211
- before mutation, and prove upgrade-receipt rollback restores the exact prior
212
- Skill manifest and ConfigV2 bytes. Existing profiles, adoption evidence,
213
- executions, delivery packets, snapshots, verification receipts, and closeouts
214
- remain byte-identical and readable. Neither compatibility nor a completed
215
- onboarding projection grants authority.
202
+ Exact adoption requires the official npm registry `shasum`, `integrity` and
203
+ tarball binding. A worktree, local tarball, `file:` dependency, Git source,
204
+ workspace link or mutable tag is not formal adoption. Active or ambiguous work
205
+ blocks migration before Config or Skill bytes change. Historical closed leases
206
+ use their trusted immutable closeout/Core semantics only when an accepted
207
+ closed execution exactly binds its released lease. Active, malformed,
208
+ hash-wrong, untrusted, or inconsistently released state still fails closed.
209
+ Compatibility, onboarding,
210
+ rollback and recovery grant no Git, npm, release, deploy or foreign-write
211
+ authority.
212
+
213
+ ## Core v0.16 daily workflow candidate
214
+
215
+ Core 0.16 makes the safe path the ordinary path without weakening its gates:
216
+
217
+ ```bash
218
+ owlrunkit fleet register-root --fleet-root /absolute/declared-projects
219
+ owlrunkit fleet discover
220
+ owlrunkit profiles detect --workspace "$PROJECT_ROOT" --dry-run
221
+ owlrunkit profiles detect --workspace "$PROJECT_ROOT" --apply
222
+ owlrunkit assurance route --workspace "$PROJECT_ROOT" \
223
+ --request "$ASSURANCE_REQUEST_JSON"
224
+ owlrunkit status --workspace "$PROJECT_ROOT"
225
+ ```
226
+
227
+ Fleet discovery is complete only within all registered coverage roots, an
228
+ explicit one-off root list, or a caller-supplied frozen `--fleet-manifest`. It
229
+ refuses unreachable roots and cannot protect projects outside registered
230
+ coverage. `profiles detect --apply` is create-only and adopts only unambiguous
231
+ high-confidence, project-local regular-file launchers; existing profiles and
232
+ low-confidence candidates remain untouched. Lock-bound npm and exact
233
+ project-installed pnpm, Yarn, and Bun launchers are supported; PATH-only
234
+ package managers remain review-required. `assurance route`
235
+ deterministically selects No RunKit, Quick Verification or Formal Delivery
236
+ from explicit risk facts and fails closed to Formal when required facts are
237
+ missing.
216
238
 
217
239
  ## Choose the smallest assurance lane
218
240
 
@@ -232,59 +254,152 @@ If work crosses lanes, re-evaluate risk and authority. Moving from Quick to
232
254
  Formal requires a fresh GoalContract, exact write scope, profiles and authority;
233
255
  never treat a Quick receipt as Formal acceptance.
234
256
 
235
- ## Plan one execution
257
+ ## Use Formal Delivery in three commands
236
258
 
237
- Prepare a JSON goal contract, then run:
259
+ For a normal formally accepted change, start one bounded execution, add
260
+ incremental checks, then finish once:
238
261
 
239
262
  ```bash
240
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" plan \
241
- --workspace "$PROJECT_ROOT" \
242
- --run-id "$RUN_ID" \
243
- --goal "$GOAL_JSON"
244
- ```
245
-
246
- Use one run id on one branch only. Assign one active lease per non-overlapping write scope. Feature work may stop at `ready_for_stage_verification` with a DeliveryPacket.
247
-
248
- ## Use the high-level daily lifecycle
249
-
250
- For a normal single-command verification path, compose the same atomic Core
251
- artifacts with three commands:
263
+ NODE_BIN="$(node -p 'process.execPath')"
252
264
 
253
- ```bash
254
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" start \
265
+ owlrunkit formal start \
255
266
  --workspace "$PROJECT_ROOT" --run-id "$RUN_ID" --goal "$GOAL_JSON" \
256
267
  --work-item "$WORK_ITEM_ID" \
257
268
  --owned-path "src/exact-file.ts" --owned-path "tests/feature/**"
258
269
 
259
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" verify \
270
+ owlrunkit formal check \
260
271
  --workspace "$PROJECT_ROOT" --run-id "$RUN_ID" \
261
- --from-lease "$WORK_ITEM_ID" --verification-id "$VERIFICATION_ID" \
262
- --cwd "." -- "$ABSOLUTE_EXECUTABLE" "arg-one" "arg-two"
272
+ --from-lease "$WORK_ITEM_ID" --check-id "$CHECK_ID" \
273
+ --cwd "." -- "$NODE_BIN" --check "src/exact-file.ts"
263
274
 
264
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" finish \
275
+ owlrunkit formal finish \
265
276
  --workspace "$PROJECT_ROOT" --run-id "$RUN_ID" --decision accepted
266
277
  ```
267
278
 
268
- `start` rolls back a newly created execution if lease acquisition fails.
269
- `verify` preserves the exact argv after `--`, derives the DeliveryPacket,
270
- verification context, snapshot request and finalize request, and never
271
- finalizes a failed snapshot. The executable may have zero arguments and argv
272
- may contain empty strings; no shell normalization is allowed. High-level verify
273
- holds the control transaction through command completion, and its snapshot
274
- source map must match the same DeliveryPacket at finalize and accepted finish.
275
- `finish accepted` derives the unique Contract v0.2 active gate before releasing
276
- leases and closing; a persistence failure restores leases, and project-truth
277
- directories with symlink ancestors fail before mutation. `blocked` and
278
- `rejected` remain honest non-accepted closeouts. These are convenience
279
- composition commands, not a second truth model. The atomic commands below
280
- remain available for recovery and unusual workflows.
279
+ `formal start` creates the execution and exact writer lease. `formal check`
280
+ preserves exact argv and appends source-bound evidence without rebuilding the
281
+ execution. `formal finish` performs final source-drift, evidence, permission,
282
+ acceptance, closeout and lease-release gates. `blocked` and `rejected` remain
283
+ honest non-accepted closeouts. Keep one execution while scope is unchanged;
284
+ create a linked successor only when authority or write scope truly changes.
285
+ Repeating the same `check` or `finish` command resumes exact create-only
286
+ artifacts; a mismatch fails closed.
287
+
288
+ Formal accepted evidence currently admits only the built-in Node syntax check:
289
+ the exact `process.execPath`, `--check`, and an ordinary workspace file.
290
+ Profile, package-manager, wrapper and custom commands are rejected before
291
+ spawn because RunKit does not yet enforce a filesystem-write and network
292
+ sandbox for them. Full controlled execution and legacy `verify` remain
293
+ available, but their deny rules are not sandbox-equivalent and their receipts
294
+ must not be silently promoted into this Formal accepted-evidence path.
295
+
296
+ ## Freeze a dirty SourceCandidateV2
297
+
298
+ Freeze, verify and materialize an immutable candidate without requiring a Git
299
+ commit:
300
+
301
+ ```bash
302
+ owlrunkit candidate freeze --workspace "$PROJECT_ROOT" \
303
+ --run-id "$RUN_ID" --from-lease "$WORK_ITEM_ID" \
304
+ --candidate-id "$CANDIDATE_ID"
305
+ owlrunkit candidate verify --workspace "$PROJECT_ROOT" \
306
+ --candidate "$SOURCE_CANDIDATE"
307
+ owlrunkit candidate materialize --workspace "$PROJECT_ROOT" \
308
+ --candidate "$SOURCE_CANDIDATE" \
309
+ --target-workspace "$CLEAN_WORKSPACE"
310
+ ```
311
+
312
+ `SourceCandidateV2` binds the baseline, exact owned-path closure, changed file
313
+ states, payload bytes and source manifest. Materialization is create-only and
314
+ byte-verified. Payload writes and mode changes happen in a sibling staging
315
+ checkout; the clean target is atomically switched only after verification.
316
+ Failures restore the original target, and an interrupted switch resumes from
317
+ the transaction journal. It is release-candidate evidence, not Git or publish
318
+ authority.
319
+
320
+ ## Upgrade a self-hosted Core with a successor
321
+
322
+ Use a frozen SourceCandidateV2 and the registered fleet boundary:
323
+
324
+ ```bash
325
+ owlrunkit core-successor plan --workspace "$PROJECT_ROOT" \
326
+ --plan-id "$PLAN_ID" --run-id "$RUN_ID" \
327
+ --from-lease "$WORK_ITEM_ID" --candidate-id "$CANDIDATE_ID"
328
+ owlrunkit core-successor apply --workspace "$PROJECT_ROOT" \
329
+ --plan "$SUCCESSOR_PLAN" --owner-authority "$OWNER_AUTHORITY" \
330
+ --receipt-id "$RECEIPT_ID"
331
+ ```
332
+
333
+ Planning proves complete path closure, materializes the candidate in a clean
334
+ workspace, recomputes the proposed Core identity, and freezes the registered
335
+ fleet. Apply rediscovers the fleet, supports mixed prior Core identities,
336
+ requires a signed V2 Owner authority from the fixed user trust store, and writes
337
+ append-only per-project migration receipts. Unsigned V1 authorities cannot
338
+ execute. No execution result is silently inherited.
339
+
340
+ ## Use two-stage deployment and the remote adapter
341
+
342
+ Separate build acceptance from permission to mutate a machine:
343
+
344
+ ```bash
345
+ owlrunkit deployment prepare --workspace "$PROJECT_ROOT" \
346
+ --run-id "$PREPARE_RUN_ID" --artifact "$ARTIFACT" \
347
+ --owner-decision "$OWNER_DECISION" \
348
+ --media-type application/gzip --output "$PREPARE_RECEIPT"
349
+ owlrunkit deployment execute --workspace "$PROJECT_ROOT" \
350
+ --prepare "$PREPARE_RECEIPT" \
351
+ --owner-decision "$OWNER_DECISION" \
352
+ --owner-authority "$OWNER_AUTHORITY" \
353
+ --manifest "$REMOTE_MANIFEST"
354
+ ```
355
+
356
+ `deployment prepare` binds the accepted source artifact, exact build artifact,
357
+ and independent canonical `OwnerDeploymentDecisionV1`, but grants no deploy
358
+ permission. The decision must explicitly state deployment mode, existing
359
+ assets, rollback and data authority, service activation, baseline cut, and
360
+ destructive scope; unset high-risk fields fail closed. A Formal `SourceCandidateV2`,
361
+ including ordinary modifications and deletion-only candidates, remains the
362
+ first-class source artifact through the verification receipt, accepted
363
+ closeout, prepare receipt, and deployment lineage. Legacy DeliveryPacket-based
364
+ accepted runs remain compatible. `deployment execute` requires a separate active execution
365
+ and signed V2 Owner authority binding the full remote intent and exact decision
366
+ hash. Before child creation or lease acquisition, RunKit compiles the decision
367
+ against Goal, prepare receipt, manifest, and authority. A conflict creates no
368
+ executable child and sends no remote command. The standard
369
+ remote deployment adapter binds VM identity, create-only upload, ordered
370
+ before/after stages, exact hashes, first-install versus update mode, deletion
371
+ allowlists and remote smoke. It revalidates execution, lease, preflight, engine,
372
+ and lineage before every stage and records the exact failure stage. Deletion is
373
+ rejected unless both the manifest and the authorized execute execution permit
374
+ it.
375
+
376
+ The default execute command creates and closes the deployment child, goal,
377
+ lease, profile, resource preflight, lineage, and result. Use `--request` with
378
+ manual lineage/output paths only as an advanced compatibility path when another
379
+ controller already owns those exact artifacts.
380
+
381
+ `deployment execute --resume` may resume only the same child under the same
382
+ decision. An explicitly superseding decision closes the old child as blocked
383
+ `closed_superseded`, releases its lease, preserves the prior decision snapshot,
384
+ and reports `businessGoalIncomplete=true` plus
385
+ `nextAllowedAction=plan_replacement_execution`. Do not treat that closeout as
386
+ business completion or reuse the old rollback plan, remote intent, or Owner
387
+ authority for the replacement.
388
+
389
+ For `kind: "builtin_ssh"`, the privileged
390
+ `owlrunkit-remote-helper` is a caller-provided target-VM prerequisite; the npm
391
+ package does not install it. Bind its exact path, protocol, version and fixed
392
+ `execute`/`reconcile` capabilities in the remote manifest.
393
+ `identity_preflight` must return that exact descriptor before upload or any
394
+ later side effect. Treat a mismatch as blocking. This is a built-in SSH client
395
+ and protocol contract, not an out-of-the-box privileged VM deployment.
281
396
 
282
397
  ## Manage leases and create delivery without hand-authored JSON
283
398
 
284
399
  Acquire one bounded writer lease with repeated explicit paths:
285
400
 
286
401
  ```bash
287
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" lease acquire \
402
+ owlrunkit lease acquire \
288
403
  --workspace "$PROJECT_ROOT" \
289
404
  --run-id "$RUN_ID" \
290
405
  --work-item "$WORK_ITEM_ID" \
@@ -295,10 +410,10 @@ node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" lease acquire \
295
410
  Inspect or release it through the Core instead of editing lease JSON:
296
411
 
297
412
  ```bash
298
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" lease inspect \
413
+ owlrunkit lease inspect \
299
414
  --workspace "$PROJECT_ROOT" --run-id "$RUN_ID"
300
415
 
301
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" lease release \
416
+ owlrunkit lease release \
302
417
  --workspace "$PROJECT_ROOT" --run-id "$RUN_ID" \
303
418
  --work-item "$WORK_ITEM_ID"
304
419
  ```
@@ -306,7 +421,7 @@ node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" lease release \
306
421
  After implementation, derive the bounded DeliveryPacket from the active lease:
307
422
 
308
423
  ```bash
309
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" delivery create \
424
+ owlrunkit delivery create \
310
425
  --workspace "$PROJECT_ROOT" \
311
426
  --run-id "$RUN_ID" \
312
427
  --from-lease "$WORK_ITEM_ID" \
@@ -342,7 +457,7 @@ If any path is uncovered, use the declared full profile. Do not interpret an emp
342
457
  Before reusing evidence, prepare `OwlCodaRunKitCoverageAdoptRequestV1` and run:
343
458
 
344
459
  ```bash
345
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" coverage-adopt \
460
+ owlrunkit coverage-adopt \
346
461
  --workspace "$PROJECT_ROOT" \
347
462
  --run-id "$RUN_ID" \
348
463
  --request "$COVERAGE_ADOPT_REQUEST_JSON"
@@ -362,7 +477,7 @@ After inspecting the source execution, prepare `OwlCodaRunKitResumeRequestV1`
362
477
  and run:
363
478
 
364
479
  ```bash
365
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" resume \
480
+ owlrunkit resume \
366
481
  --workspace "$PROJECT_ROOT" \
367
482
  --run-id "$SOURCE_RUN_ID" \
368
483
  --request "$RESUME_REQUEST_JSON"
@@ -392,7 +507,7 @@ After freezing a DeliveryPacket, prepare
392
507
  SHA-256, then run:
393
508
 
394
509
  ```bash
395
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" verify-plan \
510
+ owlrunkit verify-plan \
396
511
  --workspace "$PROJECT_ROOT" \
397
512
  --run-id "$RUN_ID" \
398
513
  --request "$VERIFY_PLAN_REQUEST_JSON"
@@ -423,7 +538,7 @@ For a model workload, first bind the remaining work to a hashed
423
538
  `OwlCodaRunKitResourcePreflightRequestV1` and run:
424
539
 
425
540
  ```bash
426
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" resource-preflight \
541
+ owlrunkit resource-preflight \
427
542
  --workspace "$PROJECT_ROOT" \
428
543
  --run-id "$RUN_ID" \
429
544
  --request "$RESOURCE_PREFLIGHT_REQUEST_JSON"
@@ -468,7 +583,7 @@ labels are not acceptance evidence.
468
583
  Prepare `OwlCodaRunKitSnapshotRequestV1`, then run:
469
584
 
470
585
  ```bash
471
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" snapshot \
586
+ owlrunkit snapshot \
472
587
  --workspace "$PROJECT_ROOT" \
473
588
  --run-id "$RUN_ID" \
474
589
  --request "$SNAPSHOT_REQUEST_JSON"
@@ -490,7 +605,7 @@ and after the command.
490
605
  Prepare `OwlCodaRunKitVisualSmokeRequestV1`, then run:
491
606
 
492
607
  ```bash
493
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" visual-smoke \
608
+ owlrunkit visual-smoke \
494
609
  --workspace "$PROJECT_ROOT" \
495
610
  --run-id "$RUN_ID" \
496
611
  --request "$VISUAL_SMOKE_REQUEST_JSON"
@@ -510,7 +625,7 @@ After every required snapshot passed and the DeliveryPacket is still fresh,
510
625
  prepare `OwlCodaRunKitFinalizeRequestV1` and run:
511
626
 
512
627
  ```bash
513
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" finalize \
628
+ owlrunkit finalize \
514
629
  --workspace "$PROJECT_ROOT" \
515
630
  --run-id "$RUN_ID" \
516
631
  --request "$FINALIZE_REQUEST_JSON"
@@ -527,7 +642,7 @@ this command is available.
527
642
  Close only after consuming the current stage receipt and making an explicit controller decision:
528
643
 
529
644
  ```bash
530
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" closeout \
645
+ owlrunkit closeout \
531
646
  --workspace "$PROJECT_ROOT" \
532
647
  --run-id "$RUN_ID" \
533
648
  --decision accepted \
@@ -542,20 +657,24 @@ passing gate so failed work still leaves durable truth.
542
657
 
543
658
  ## Produce ready-for-commit evidence
544
659
 
545
- After an accepted closeout, capture fresh project-root snapshots, prepare
546
- `OwlCodaRunKitReadyForCommitRequestV1`, then run:
660
+ After an accepted closeout, capture fresh project-root snapshots and start from
661
+ `assets/templates/ready-for-commit-request.json`. The default
662
+ `OwlCodaRunKitReadyForCommitRequestV2` binds exactly one
663
+ `sourceCandidatePath` or legacy `deliveryPacketPath`, then run:
547
664
 
548
665
  ```bash
549
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" ready-for-commit \
666
+ owlrunkit ready-for-commit \
550
667
  --workspace "$PROJECT_ROOT" \
551
668
  --run-id "$RUN_ID" \
552
669
  --request "$READY_REQUEST_JSON"
553
670
  ```
554
671
 
555
- The command revalidates the DeliveryPacket, profile impact, gate input,
556
- accepted closeout, released leases, and selected root manifests. It writes
557
- `READY_FOR_COMMIT_RECEIPT.json` with every repository action and
558
- `authorizationGranted` set to false. A ready receipt records state; it does
672
+ The command revalidates the selected source artifact, profile impact, gate
673
+ input, accepted closeout, released leases, and selected root manifests.
674
+ SourceCandidateV2 remains exact across additions, modifications, deletions, and
675
+ renames. V1 DeliveryPacket requests remain supported for historical executions.
676
+ The command writes `READY_FOR_COMMIT_RECEIPT.json` with every repository action
677
+ and `authorizationGranted` set to false. A ready receipt records state; it does
559
678
  not authorize Git.
560
679
 
561
680
  ## Foreign-project shadow
@@ -2,9 +2,9 @@
2
2
  "schemaVersion": "OwlCodaRunKitConfigV2",
3
3
  "core": {
4
4
  "contractVersion": "0.2",
5
- "coreVersion": "0.15.1",
6
- "coreManifestSha256": "sha256:replace-with-installed-core-manifest",
7
- "coreSourceRef": "artifact:sha256:replace-with-content-addressed-source"
5
+ "coreVersion": "0.16.1",
6
+ "coreManifestSha256": "sha256:38ac9110e328c38a81db05f1359734ca810b991c9f4de77647f9719f5e6af78b",
7
+ "coreSourceRef": "artifact:sha256:38ac9110e328c38a81db05f1359734ca810b991c9f4de77647f9719f5e6af78b"
8
8
  },
9
9
  "authorizationPolicy": "external_explicit_authority_required"
10
10
  }
@@ -1,6 +1,6 @@
1
1
  {
2
- "schemaVersion": "OwlCodaRunKitReadyForCommitRequestV1",
3
- "deliveryPacketPath": ".owlcoda/runkit/executions/replace-with-run-id/delivery-packets/replace-with-packet.json",
2
+ "schemaVersion": "OwlCodaRunKitReadyForCommitRequestV2",
3
+ "sourceCandidatePath": ".owlcoda/runkit/executions/replace-with-run-id/source-candidates/replace-with-candidate.json",
4
4
  "verificationGateInputPath": ".owlcoda/runkit/executions/replace-with-run-id/verification-receipts/replace-with-receipt/verification-gate-input.json",
5
5
  "roots": [
6
6
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "owlrunkit",
3
- "version": "0.15.1",
3
+ "version": "0.16.1",
4
4
  "description": "Project-owned execution, evidence, verification, and recovery for coding agents.",
5
5
  "license": "GPL-3.0-or-later",
6
6
  "author": "yeemio <owlclaw@163.com>",
@@ -11,7 +11,7 @@
11
11
  "registry": "https://registry.npmjs.org"
12
12
  },
13
13
  "bin": {
14
- "owlrunkit": "scripts/runkit-contract/runkit-cli.mjs",
14
+ "owlrunkit": "scripts/runkit-contract/runkit-bootstrap.mjs",
15
15
  "owlrunkit-attest": "packages/attest/cli/owlcoda-attest.mjs"
16
16
  },
17
17
  "exports": {
@@ -36,6 +36,16 @@
36
36
  "sha256": "sha256:3972dc9744f6499f0f9b2dbf76696f2ae7ad8af9b23dde66d6af86c9dfb36986"
37
37
  },
38
38
  "supportedProducerCoreIdentities": [
39
+ {
40
+ "contractVersion": "0.2",
41
+ "coreVersion": "0.16.1",
42
+ "coreManifestSha256": "sha256:38ac9110e328c38a81db05f1359734ca810b991c9f4de77647f9719f5e6af78b"
43
+ },
44
+ {
45
+ "contractVersion": "0.2",
46
+ "coreVersion": "0.16.0",
47
+ "coreManifestSha256": "sha256:320fb1d97b4459d1a14b0b67807dcf2bc6b03970492cb9fb2c6245b17912c81e"
48
+ },
39
49
  {
40
50
  "contractVersion": "0.2",
41
51
  "coreVersion": "0.15.1",
@@ -18,6 +18,16 @@ import { captureWorkspaceSnapshot } from "./workspace-snapshot.mjs";
18
18
  export { validQuickReceiptShape } from "./quick-receipt-contract.mjs";
19
19
 
20
20
  export const SUPPORTED_QUICK_CORE_IDENTITIES = Object.freeze([
21
+ {
22
+ contractVersion: "0.2",
23
+ coreVersion: "0.16.1",
24
+ coreManifestSha256: "sha256:38ac9110e328c38a81db05f1359734ca810b991c9f4de77647f9719f5e6af78b",
25
+ },
26
+ {
27
+ contractVersion: "0.2",
28
+ coreVersion: "0.16.0",
29
+ coreManifestSha256: "sha256:320fb1d97b4459d1a14b0b67807dcf2bc6b03970492cb9fb2c6245b17912c81e",
30
+ },
21
31
  {
22
32
  contractVersion: "0.2",
23
33
  coreVersion: "0.15.1",
@@ -2,7 +2,7 @@
2
2
  "schemaVersion": "OwlCodaRunKitRegistryReleasePolicyV1",
3
3
  "status": "release_candidate_unpublished",
4
4
  "packageName": "owlrunkit",
5
- "candidateVersion": "0.15.1",
5
+ "candidateVersion": "0.16.1",
6
6
  "registry": "https://registry.npmjs.org",
7
7
  "registryRequiredBeforeAdoption": true,
8
8
  "exactVersionRequired": true,
@@ -21,7 +21,13 @@
21
21
  "symlink",
22
22
  "workspace"
23
23
  ],
24
- "currentPublishedRelease": null,
24
+ "currentPublishedRelease": {
25
+ "packageName": "owlrunkit",
26
+ "version": "0.16.0",
27
+ "shasum": "bab651b0e10111a7a179a3a58917a8e90e43c35f",
28
+ "integrity": "sha512-qrlJueVypcetnFXAEHhDcYlZvpJAnTsbtLu9Rtp9SXNekAAD/rtBM8p2GqM5dOc1ERojixc3ipQkDGw6T7IR1A==",
29
+ "tarballUrl": "https://registry.npmjs.org/owlrunkit/-/owlrunkit-0.16.0.tgz"
30
+ },
25
31
  "registryRelease": null,
26
32
  "registryEvidenceMustBeExternal": true,
27
33
  "registryEvidenceSchemaVersion": "OwlCodaRunKitRegistryReleaseEvidenceV1",