owlrunkit 0.15.1 → 0.16.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 (76) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/README.md +274 -66
  3. package/integrations/codex/skills/owlcoda-runkit/SKILL.md +222 -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 +5 -0
  8. package/packages/attest/src/quick.mjs +5 -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 +456 -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 +701 -0
  28. package/scripts/runkit-contract/project-control-parser.mjs +830 -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 +1097 -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 +155 -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 +31 -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 +161 -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,11 @@ 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
+ Current release candidate: standalone `owlrunkit@0.16.0`, bundling Contract
11
+ `0.2` and Core `0.16.0` with manifest
12
+ `sha256:320fb1d97b4459d1a14b0b67807dcf2bc6b03970492cb9fb2c6245b17912c81e`.
13
+ It is not published. The current published release remains `owlrunkit@0.15.1`.
14
+ The root `owlcoda` package has a separate version lifecycle.
12
15
 
13
16
  The session is an execution interface. Project artifacts are the system of record.
14
17
 
@@ -20,13 +23,23 @@ The session is an execution interface. Project artifacts are the system of recor
20
23
  4. Never include `.owlcoda/runkit/**` in delivery changed files, profile rules or lease owned paths.
21
24
  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
25
 
23
- Set `SKILL_ROOT` to this skill directory before running the examples below.
26
+ Use the `owlrunkit` command for normal work. Its bootstrap resolves the
27
+ project's exact locally bound OwlRunKit CLI before interpreting project control
28
+ state. The currently installed package handles bootstrap-only operations such
29
+ as initialization, exact adoption and Core-successor migration. Do not bypass
30
+ that resolver with a global CLI or a copied Skill Core. Project-local
31
+ delegation requires the canonical official npm tarball URL and SHA-512 SRI,
32
+ an installed Core identity trusted by the current bootstrap, and the same Core
33
+ identity in project Config; any mismatch fails closed.
34
+ Set `SKILL_ROOT` to this Skill directory only when an advanced read-only helper
35
+ below has no CLI entry.
24
36
 
25
37
  ## Initialize and inspect
26
38
 
27
39
  ```bash
28
40
  owlrunkit init --workspace "$PROJECT_ROOT"
29
41
  owlrunkit inspect --json --workspace "$PROJECT_ROOT"
42
+ owlrunkit status --workspace "$PROJECT_ROOT"
30
43
  ```
31
44
 
32
45
  Initialization may write only `.owlcoda/runkit/`. It must not modify business source.
@@ -65,13 +78,13 @@ repair surfaces. OwlRunKit uses its own version lifecycle: the standalone
65
78
  For one low-risk exact command, use the Core v0.13 Quick path:
66
79
 
67
80
  ```bash
68
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" quick-verify \
81
+ owlrunkit quick-verify \
69
82
  --workspace "$PROJECT_ROOT" -- "$ABSOLUTE_EXECUTABLE" "arg-one"
70
83
 
71
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" quick-attest \
84
+ owlrunkit quick-attest \
72
85
  --workspace "$PROJECT_ROOT" --receipt "$QUICK_RECEIPT"
73
86
 
74
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" quick-metrics \
87
+ owlrunkit quick-metrics \
75
88
  --workspace "$PROJECT_ROOT" --local
76
89
  ```
77
90
 
@@ -81,13 +94,13 @@ local-only and perform no telemetry or network request.
81
94
  Core v0.13 also adds deterministic repair and exact-byte offline transport:
82
95
 
83
96
  ```bash
84
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" repair \
97
+ owlrunkit repair \
85
98
  --workspace "$PROJECT_ROOT" --run-id "$RUN_ID"
86
99
 
87
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" offline-export \
100
+ owlrunkit offline-export \
88
101
  --workspace "$PROJECT_ROOT" --receipt "$RECEIPT" --output "$BUNDLE"
89
102
 
90
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" offline-import \
103
+ owlrunkit offline-import \
91
104
  --workspace "$PROJECT_ROOT" --bundle "$BUNDLE" --store "$OFFLINE_STORE"
92
105
  ```
93
106
 
@@ -111,18 +124,23 @@ node "$RUNKIT_PACKAGE_ROOT/scripts/runkit-contract/install-codex-skill.mjs" \
111
124
 
112
125
  node "$RUNKIT_PACKAGE_ROOT/scripts/runkit-contract/install-codex-skill.mjs" \
113
126
  install --repository "$RUNKIT_PACKAGE_ROOT" \
114
- --target "$RUNKIT_SKILL_TARGET" --archive "$RUNKIT_SKILL_ARCHIVE_ROOT" \
115
- --workspace /absolute/project-a --workspace /absolute/project-b
127
+ --target "$RUNKIT_SKILL_TARGET" --archive "$RUNKIT_SKILL_ARCHIVE_ROOT"
116
128
  ```
117
129
 
118
130
  The install manifest binds every Skill, Core, contract and attest file.
119
131
  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.
132
+ process-wide Skill requires a registered complete fleet. Register each coverage
133
+ root once with `owlrunkit fleet register-root --fleet-root <absolute-root>`.
134
+ Ordinary installs then scan every registered root automatically. Repeated
135
+ `--fleet-root` or a frozen `--fleet-manifest` remain explicit one-off sources.
136
+ RunKit skips control and dependency directories, freezes the discovered
137
+ workspace list, and fails closed if a registered root is unreachable. It cannot
138
+ discover projects outside registered coverage and must not claim machine-wide
139
+ safety. The installer validates every discovered project config and refuses the
140
+ whole update before replacing the Skill or changing any project when one
141
+ project has an active execution, an active writer lease, ambiguous control
142
+ state, or invalid configuration. A missing registry is an error; do not use
143
+ partial explicit coverage to bypass this guard.
126
144
 
127
145
  A successful update archives the exact prior Skill, migrates each inactive
128
146
  project, and writes an append-only upgrade receipt containing the prior Skill
@@ -156,16 +174,14 @@ fleet with no matching active execution. An accepted receipt, ready-for-commit
156
174
  receipt, package publication, valid install, rollback, or recovery still does
157
175
  not grant Git, npm, release, deploy, or foreign-project authority.
158
176
 
159
- ## Core v0.15 consolidated onboarding and compatibility
177
+ ## Core v0.14 and v0.15 historical compatibility
160
178
 
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.
179
+ Core v0.14 introduced `owlrunkit doctor`, registry-first exact adoption and
180
+ deterministic `profiles detect`; Core v0.15/0.15.1 consolidated onboarding and
181
+ made inactive 0.13/0.14 ConfigV2 upgrades and exact rollback safe. Historical
182
+ projects, profiles, executions, packets, receipts and closeouts remain readable.
165
183
 
166
184
  ```bash
167
- owlrunkit --help
168
- owlrunkit --version
169
185
  owlrunkit doctor --workspace "$PROJECT_ROOT"
170
186
  owlrunkit profiles detect --workspace "$PROJECT_ROOT" --dry-run
171
187
  owlrunkit profiles validate --workspace "$PROJECT_ROOT"
@@ -173,46 +189,39 @@ owlrunkit profiles impact --workspace "$PROJECT_ROOT" --changed path/to/file
173
189
  owlrunkit adopt --workspace "$PROJECT_ROOT" --exact owlrunkit@0.15.1
174
190
  ```
175
191
 
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.
192
+ Exact adoption requires the official npm registry `shasum`, `integrity` and
193
+ tarball binding. A worktree, local tarball, `file:` dependency, Git source,
194
+ workspace link or mutable tag is not formal adoption. Active or ambiguous work
195
+ blocks migration before Config or Skill bytes change. Historical closed leases
196
+ remain evidence but do not become active writers. Compatibility, onboarding,
197
+ rollback and recovery grant no Git, npm, release, deploy or foreign-write
198
+ authority.
199
+
200
+ ## Core v0.16 daily workflow candidate
201
+
202
+ Core 0.16 makes the safe path the ordinary path without weakening its gates:
203
+
204
+ ```bash
205
+ owlrunkit fleet register-root --fleet-root /absolute/declared-projects
206
+ owlrunkit fleet discover
207
+ owlrunkit profiles detect --workspace "$PROJECT_ROOT" --dry-run
208
+ owlrunkit profiles detect --workspace "$PROJECT_ROOT" --apply
209
+ owlrunkit assurance route --workspace "$PROJECT_ROOT" \
210
+ --request "$ASSURANCE_REQUEST_JSON"
211
+ owlrunkit status --workspace "$PROJECT_ROOT"
212
+ ```
213
+
214
+ Fleet discovery is complete only within all registered coverage roots, an
215
+ explicit one-off root list, or a caller-supplied frozen `--fleet-manifest`. It
216
+ refuses unreachable roots and cannot protect projects outside registered
217
+ coverage. `profiles detect --apply` is create-only and adopts only unambiguous
218
+ high-confidence, project-local regular-file launchers; existing profiles and
219
+ low-confidence candidates remain untouched. Lock-bound npm and exact
220
+ project-installed pnpm, Yarn, and Bun launchers are supported; PATH-only
221
+ package managers remain review-required. `assurance route`
222
+ deterministically selects No RunKit, Quick Verification or Formal Delivery
223
+ from explicit risk facts and fails closed to Formal when required facts are
224
+ missing.
216
225
 
217
226
  ## Choose the smallest assurance lane
218
227
 
@@ -232,59 +241,152 @@ If work crosses lanes, re-evaluate risk and authority. Moving from Quick to
232
241
  Formal requires a fresh GoalContract, exact write scope, profiles and authority;
233
242
  never treat a Quick receipt as Formal acceptance.
234
243
 
235
- ## Plan one execution
244
+ ## Use Formal Delivery in three commands
236
245
 
237
- Prepare a JSON goal contract, then run:
246
+ For a normal formally accepted change, start one bounded execution, add
247
+ incremental checks, then finish once:
238
248
 
239
249
  ```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:
250
+ NODE_BIN="$(node -p 'process.execPath')"
252
251
 
253
- ```bash
254
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" start \
252
+ owlrunkit formal start \
255
253
  --workspace "$PROJECT_ROOT" --run-id "$RUN_ID" --goal "$GOAL_JSON" \
256
254
  --work-item "$WORK_ITEM_ID" \
257
255
  --owned-path "src/exact-file.ts" --owned-path "tests/feature/**"
258
256
 
259
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" verify \
257
+ owlrunkit formal check \
260
258
  --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"
259
+ --from-lease "$WORK_ITEM_ID" --check-id "$CHECK_ID" \
260
+ --cwd "." -- "$NODE_BIN" --check "src/exact-file.ts"
263
261
 
264
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" finish \
262
+ owlrunkit formal finish \
265
263
  --workspace "$PROJECT_ROOT" --run-id "$RUN_ID" --decision accepted
266
264
  ```
267
265
 
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.
266
+ `formal start` creates the execution and exact writer lease. `formal check`
267
+ preserves exact argv and appends source-bound evidence without rebuilding the
268
+ execution. `formal finish` performs final source-drift, evidence, permission,
269
+ acceptance, closeout and lease-release gates. `blocked` and `rejected` remain
270
+ honest non-accepted closeouts. Keep one execution while scope is unchanged;
271
+ create a linked successor only when authority or write scope truly changes.
272
+ Repeating the same `check` or `finish` command resumes exact create-only
273
+ artifacts; a mismatch fails closed.
274
+
275
+ Formal accepted evidence currently admits only the built-in Node syntax check:
276
+ the exact `process.execPath`, `--check`, and an ordinary workspace file.
277
+ Profile, package-manager, wrapper and custom commands are rejected before
278
+ spawn because RunKit does not yet enforce a filesystem-write and network
279
+ sandbox for them. Full controlled execution and legacy `verify` remain
280
+ available, but their deny rules are not sandbox-equivalent and their receipts
281
+ must not be silently promoted into this Formal accepted-evidence path.
282
+
283
+ ## Freeze a dirty SourceCandidateV2
284
+
285
+ Freeze, verify and materialize an immutable candidate without requiring a Git
286
+ commit:
287
+
288
+ ```bash
289
+ owlrunkit candidate freeze --workspace "$PROJECT_ROOT" \
290
+ --run-id "$RUN_ID" --from-lease "$WORK_ITEM_ID" \
291
+ --candidate-id "$CANDIDATE_ID"
292
+ owlrunkit candidate verify --workspace "$PROJECT_ROOT" \
293
+ --candidate "$SOURCE_CANDIDATE"
294
+ owlrunkit candidate materialize --workspace "$PROJECT_ROOT" \
295
+ --candidate "$SOURCE_CANDIDATE" \
296
+ --target-workspace "$CLEAN_WORKSPACE"
297
+ ```
298
+
299
+ `SourceCandidateV2` binds the baseline, exact owned-path closure, changed file
300
+ states, payload bytes and source manifest. Materialization is create-only and
301
+ byte-verified. Payload writes and mode changes happen in a sibling staging
302
+ checkout; the clean target is atomically switched only after verification.
303
+ Failures restore the original target, and an interrupted switch resumes from
304
+ the transaction journal. It is release-candidate evidence, not Git or publish
305
+ authority.
306
+
307
+ ## Upgrade a self-hosted Core with a successor
308
+
309
+ Use a frozen SourceCandidateV2 and the registered fleet boundary:
310
+
311
+ ```bash
312
+ owlrunkit core-successor plan --workspace "$PROJECT_ROOT" \
313
+ --plan-id "$PLAN_ID" --run-id "$RUN_ID" \
314
+ --from-lease "$WORK_ITEM_ID" --candidate-id "$CANDIDATE_ID"
315
+ owlrunkit core-successor apply --workspace "$PROJECT_ROOT" \
316
+ --plan "$SUCCESSOR_PLAN" --owner-authority "$OWNER_AUTHORITY" \
317
+ --receipt-id "$RECEIPT_ID"
318
+ ```
319
+
320
+ Planning proves complete path closure, materializes the candidate in a clean
321
+ workspace, recomputes the proposed Core identity, and freezes the registered
322
+ fleet. Apply rediscovers the fleet, supports mixed prior Core identities,
323
+ requires a signed V2 Owner authority from the fixed user trust store, and writes
324
+ append-only per-project migration receipts. Unsigned V1 authorities cannot
325
+ execute. No execution result is silently inherited.
326
+
327
+ ## Use two-stage deployment and the remote adapter
328
+
329
+ Separate build acceptance from permission to mutate a machine:
330
+
331
+ ```bash
332
+ owlrunkit deployment prepare --workspace "$PROJECT_ROOT" \
333
+ --run-id "$PREPARE_RUN_ID" --artifact "$ARTIFACT" \
334
+ --owner-decision "$OWNER_DECISION" \
335
+ --media-type application/gzip --output "$PREPARE_RECEIPT"
336
+ owlrunkit deployment execute --workspace "$PROJECT_ROOT" \
337
+ --prepare "$PREPARE_RECEIPT" \
338
+ --owner-decision "$OWNER_DECISION" \
339
+ --owner-authority "$OWNER_AUTHORITY" \
340
+ --manifest "$REMOTE_MANIFEST"
341
+ ```
342
+
343
+ `deployment prepare` binds the accepted source artifact, exact build artifact,
344
+ and independent canonical `OwnerDeploymentDecisionV1`, but grants no deploy
345
+ permission. The decision must explicitly state deployment mode, existing
346
+ assets, rollback and data authority, service activation, baseline cut, and
347
+ destructive scope; unset high-risk fields fail closed. A Formal `SourceCandidateV2`,
348
+ including ordinary modifications and deletion-only candidates, remains the
349
+ first-class source artifact through the verification receipt, accepted
350
+ closeout, prepare receipt, and deployment lineage. Legacy DeliveryPacket-based
351
+ accepted runs remain compatible. `deployment execute` requires a separate active execution
352
+ and signed V2 Owner authority binding the full remote intent and exact decision
353
+ hash. Before child creation or lease acquisition, RunKit compiles the decision
354
+ against Goal, prepare receipt, manifest, and authority. A conflict creates no
355
+ executable child and sends no remote command. The standard
356
+ remote deployment adapter binds VM identity, create-only upload, ordered
357
+ before/after stages, exact hashes, first-install versus update mode, deletion
358
+ allowlists and remote smoke. It revalidates execution, lease, preflight, engine,
359
+ and lineage before every stage and records the exact failure stage. Deletion is
360
+ rejected unless both the manifest and the authorized execute execution permit
361
+ it.
362
+
363
+ The default execute command creates and closes the deployment child, goal,
364
+ lease, profile, resource preflight, lineage, and result. Use `--request` with
365
+ manual lineage/output paths only as an advanced compatibility path when another
366
+ controller already owns those exact artifacts.
367
+
368
+ `deployment execute --resume` may resume only the same child under the same
369
+ decision. An explicitly superseding decision closes the old child as blocked
370
+ `closed_superseded`, releases its lease, preserves the prior decision snapshot,
371
+ and reports `businessGoalIncomplete=true` plus
372
+ `nextAllowedAction=plan_replacement_execution`. Do not treat that closeout as
373
+ business completion or reuse the old rollback plan, remote intent, or Owner
374
+ authority for the replacement.
375
+
376
+ For `kind: "builtin_ssh"`, the privileged
377
+ `owlrunkit-remote-helper` is a caller-provided target-VM prerequisite; the npm
378
+ package does not install it. Bind its exact path, protocol, version and fixed
379
+ `execute`/`reconcile` capabilities in the remote manifest.
380
+ `identity_preflight` must return that exact descriptor before upload or any
381
+ later side effect. Treat a mismatch as blocking. This is a built-in SSH client
382
+ and protocol contract, not an out-of-the-box privileged VM deployment.
281
383
 
282
384
  ## Manage leases and create delivery without hand-authored JSON
283
385
 
284
386
  Acquire one bounded writer lease with repeated explicit paths:
285
387
 
286
388
  ```bash
287
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" lease acquire \
389
+ owlrunkit lease acquire \
288
390
  --workspace "$PROJECT_ROOT" \
289
391
  --run-id "$RUN_ID" \
290
392
  --work-item "$WORK_ITEM_ID" \
@@ -295,10 +397,10 @@ node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" lease acquire \
295
397
  Inspect or release it through the Core instead of editing lease JSON:
296
398
 
297
399
  ```bash
298
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" lease inspect \
400
+ owlrunkit lease inspect \
299
401
  --workspace "$PROJECT_ROOT" --run-id "$RUN_ID"
300
402
 
301
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" lease release \
403
+ owlrunkit lease release \
302
404
  --workspace "$PROJECT_ROOT" --run-id "$RUN_ID" \
303
405
  --work-item "$WORK_ITEM_ID"
304
406
  ```
@@ -306,7 +408,7 @@ node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" lease release \
306
408
  After implementation, derive the bounded DeliveryPacket from the active lease:
307
409
 
308
410
  ```bash
309
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" delivery create \
411
+ owlrunkit delivery create \
310
412
  --workspace "$PROJECT_ROOT" \
311
413
  --run-id "$RUN_ID" \
312
414
  --from-lease "$WORK_ITEM_ID" \
@@ -342,7 +444,7 @@ If any path is uncovered, use the declared full profile. Do not interpret an emp
342
444
  Before reusing evidence, prepare `OwlCodaRunKitCoverageAdoptRequestV1` and run:
343
445
 
344
446
  ```bash
345
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" coverage-adopt \
447
+ owlrunkit coverage-adopt \
346
448
  --workspace "$PROJECT_ROOT" \
347
449
  --run-id "$RUN_ID" \
348
450
  --request "$COVERAGE_ADOPT_REQUEST_JSON"
@@ -362,7 +464,7 @@ After inspecting the source execution, prepare `OwlCodaRunKitResumeRequestV1`
362
464
  and run:
363
465
 
364
466
  ```bash
365
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" resume \
467
+ owlrunkit resume \
366
468
  --workspace "$PROJECT_ROOT" \
367
469
  --run-id "$SOURCE_RUN_ID" \
368
470
  --request "$RESUME_REQUEST_JSON"
@@ -392,7 +494,7 @@ After freezing a DeliveryPacket, prepare
392
494
  SHA-256, then run:
393
495
 
394
496
  ```bash
395
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" verify-plan \
497
+ owlrunkit verify-plan \
396
498
  --workspace "$PROJECT_ROOT" \
397
499
  --run-id "$RUN_ID" \
398
500
  --request "$VERIFY_PLAN_REQUEST_JSON"
@@ -423,7 +525,7 @@ For a model workload, first bind the remaining work to a hashed
423
525
  `OwlCodaRunKitResourcePreflightRequestV1` and run:
424
526
 
425
527
  ```bash
426
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" resource-preflight \
528
+ owlrunkit resource-preflight \
427
529
  --workspace "$PROJECT_ROOT" \
428
530
  --run-id "$RUN_ID" \
429
531
  --request "$RESOURCE_PREFLIGHT_REQUEST_JSON"
@@ -468,7 +570,7 @@ labels are not acceptance evidence.
468
570
  Prepare `OwlCodaRunKitSnapshotRequestV1`, then run:
469
571
 
470
572
  ```bash
471
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" snapshot \
573
+ owlrunkit snapshot \
472
574
  --workspace "$PROJECT_ROOT" \
473
575
  --run-id "$RUN_ID" \
474
576
  --request "$SNAPSHOT_REQUEST_JSON"
@@ -490,7 +592,7 @@ and after the command.
490
592
  Prepare `OwlCodaRunKitVisualSmokeRequestV1`, then run:
491
593
 
492
594
  ```bash
493
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" visual-smoke \
595
+ owlrunkit visual-smoke \
494
596
  --workspace "$PROJECT_ROOT" \
495
597
  --run-id "$RUN_ID" \
496
598
  --request "$VISUAL_SMOKE_REQUEST_JSON"
@@ -510,7 +612,7 @@ After every required snapshot passed and the DeliveryPacket is still fresh,
510
612
  prepare `OwlCodaRunKitFinalizeRequestV1` and run:
511
613
 
512
614
  ```bash
513
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" finalize \
615
+ owlrunkit finalize \
514
616
  --workspace "$PROJECT_ROOT" \
515
617
  --run-id "$RUN_ID" \
516
618
  --request "$FINALIZE_REQUEST_JSON"
@@ -527,7 +629,7 @@ this command is available.
527
629
  Close only after consuming the current stage receipt and making an explicit controller decision:
528
630
 
529
631
  ```bash
530
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" closeout \
632
+ owlrunkit closeout \
531
633
  --workspace "$PROJECT_ROOT" \
532
634
  --run-id "$RUN_ID" \
533
635
  --decision accepted \
@@ -542,20 +644,24 @@ passing gate so failed work still leaves durable truth.
542
644
 
543
645
  ## Produce ready-for-commit evidence
544
646
 
545
- After an accepted closeout, capture fresh project-root snapshots, prepare
546
- `OwlCodaRunKitReadyForCommitRequestV1`, then run:
647
+ After an accepted closeout, capture fresh project-root snapshots and start from
648
+ `assets/templates/ready-for-commit-request.json`. The default
649
+ `OwlCodaRunKitReadyForCommitRequestV2` binds exactly one
650
+ `sourceCandidatePath` or legacy `deliveryPacketPath`, then run:
547
651
 
548
652
  ```bash
549
- node "$SKILL_ROOT/scripts/runkit-contract/runkit-cli.mjs" ready-for-commit \
653
+ owlrunkit ready-for-commit \
550
654
  --workspace "$PROJECT_ROOT" \
551
655
  --run-id "$RUN_ID" \
552
656
  --request "$READY_REQUEST_JSON"
553
657
  ```
554
658
 
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
659
+ The command revalidates the selected source artifact, profile impact, gate
660
+ input, accepted closeout, released leases, and selected root manifests.
661
+ SourceCandidateV2 remains exact across additions, modifications, deletions, and
662
+ renames. V1 DeliveryPacket requests remain supported for historical executions.
663
+ The command writes `READY_FOR_COMMIT_RECEIPT.json` with every repository action
664
+ and `authorizationGranted` set to false. A ready receipt records state; it does
559
665
  not authorize Git.
560
666
 
561
667
  ## 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.0",
6
+ "coreManifestSha256": "sha256:320fb1d97b4459d1a14b0b67807dcf2bc6b03970492cb9fb2c6245b17912c81e",
7
+ "coreSourceRef": "artifact:sha256:320fb1d97b4459d1a14b0b67807dcf2bc6b03970492cb9fb2c6245b17912c81e"
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.0",
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,11 @@
36
36
  "sha256": "sha256:3972dc9744f6499f0f9b2dbf76696f2ae7ad8af9b23dde66d6af86c9dfb36986"
37
37
  },
38
38
  "supportedProducerCoreIdentities": [
39
+ {
40
+ "contractVersion": "0.2",
41
+ "coreVersion": "0.16.0",
42
+ "coreManifestSha256": "sha256:320fb1d97b4459d1a14b0b67807dcf2bc6b03970492cb9fb2c6245b17912c81e"
43
+ },
39
44
  {
40
45
  "contractVersion": "0.2",
41
46
  "coreVersion": "0.15.1",
@@ -18,6 +18,11 @@ 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.0",
24
+ coreManifestSha256: "sha256:320fb1d97b4459d1a14b0b67807dcf2bc6b03970492cb9fb2c6245b17912c81e",
25
+ },
21
26
  {
22
27
  contractVersion: "0.2",
23
28
  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.0",
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.15.1",
27
+ "shasum": "efdf9900019dd3b3cd776cde35fb3817d777ff09",
28
+ "integrity": "sha512-39M+GWBIK5nT4B9blueOg/S839g/9YjSJ6IhVL3h99MdwbOvcLhQ0GvsWzKHeSjFyjCu1bdR0uZuyXXnev3sdA==",
29
+ "tarballUrl": "https://registry.npmjs.org/owlrunkit/-/owlrunkit-0.15.1.tgz"
30
+ },
25
31
  "registryRelease": null,
26
32
  "registryEvidenceMustBeExternal": true,
27
33
  "registryEvidenceSchemaVersion": "OwlCodaRunKitRegistryReleaseEvidenceV1",