owlrunkit 0.22.0 → 0.22.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,35 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.22.1
4
+
5
+ - Makes process-wide Codex Skill activation require every discovered project
6
+ to already have an exact package, lockfile, installed CLI/Core, Config, and
7
+ official-registry adoption binding for the target RunKit version.
8
+ - Removes project migration from the shared Skill installer. Skill activation
9
+ now replaces only the shared Skill bytes and emits V2 upgrade/rollback
10
+ receipts proving that the package manifest, lockfile, installed package
11
+ manifest, Config, and adoption evidence were unchanged.
12
+ - Adds canonical project control locks, a fleet-registry transaction lock,
13
+ frozen-fleet revalidation, and recoverable install and rollback journals so
14
+ interruption cannot leave a silent half-upgrade or partial legacy Config
15
+ rollback.
16
+ - Gives upgrade receipts and transaction journals independent, writer-enforced
17
+ byte bounds before Skill mutation. Legacy V1 Config preimages are stored as
18
+ transaction-scoped, hash-bound files instead of duplicated base64 journal
19
+ payloads, and terminal rollback recovery cannot rewrite a newly active
20
+ project after its control lock is released.
21
+ - Binds V2 upgrade receipts to the exact fleet discovery source and frozen
22
+ membership. Rollback rediscovers the current fleet and refuses newly added,
23
+ active, or identity-drifted projects; legacy receipts require an explicit
24
+ current fleet source.
25
+ - Makes both first activation and the read-only plan fail closed on an existing
26
+ incompatible default fleet or any path-level discovery issue.
27
+ - Makes the read-only fleet Skill plan report package/adoption mismatches as
28
+ blocking, with a project-local install/bootstrap or adoption repair boundary,
29
+ instead of presenting Config-only projects as safe to activate.
30
+ - Preserves legacy V1 rollback receipts while keeping all Git, release,
31
+ deployment, production, business, automation, and money authority false.
32
+
3
33
  ## 0.22.0
4
34
 
5
35
  - Adds the independent `OwlCodaRunKitHookRecoveryV1` public contract and
package/README.md CHANGED
@@ -124,7 +124,7 @@ separate authority boundaries.
124
124
 
125
125
  ## Install
126
126
 
127
- This package is the lifecycle-stable, registry-gated `owlrunkit@0.22.0`
127
+ This package is the lifecycle-stable, registry-gated `owlrunkit@0.22.1`
128
128
  artifact. Registry adoption remains fail-closed until its exact official npm
129
129
  version, shasum, integrity, and tarball URL are independently verified. Local
130
130
  tarballs remain candidate-test inputs and are never adoption provenance. Until
@@ -132,7 +132,7 @@ that registry evidence exists, use the package only for isolated candidate
132
132
  verification; do not treat the command below as available release truth.
133
133
 
134
134
  ```bash
135
- npm install --save-exact owlrunkit@0.22.0
135
+ npm install --save-exact owlrunkit@0.22.1
136
136
  ```
137
137
 
138
138
  Use `npx --no-install owlrunkit` for project commands. The package bootstrap
@@ -148,9 +148,9 @@ the project Config must independently bind the same Core.
148
148
  ```bash
149
149
  npx --no-install owlrunkit --version
150
150
  npx --no-install owlrunkit bootstrap --workspace /absolute/path/to/project \
151
- --exact owlrunkit@0.22.0 --dry-run
151
+ --exact owlrunkit@0.22.1 --dry-run
152
152
  npx --no-install owlrunkit bootstrap --workspace /absolute/path/to/project \
153
- --exact owlrunkit@0.22.0 --apply
153
+ --exact owlrunkit@0.22.1 --apply
154
154
  npx --no-install owlrunkit init --workspace /absolute/path/to/project
155
155
  npx --no-install owlrunkit doctor --workspace /absolute/path/to/project
156
156
  npx --no-install owlrunkit inspect --workspace /absolute/path/to/project --json --compact
@@ -736,6 +736,22 @@ auditable but are never interpreted as active writers.
736
736
 
737
737
  RunKit rejects an unreachable root and freezes the exact active workspace list
738
738
  before a shared Skill or Core change.
739
+ Shared Skill activation is the final fleet step: every discovered project must
740
+ already bind the target release through its exact package declaration,
741
+ lockfile, installed CLI/Core, Config, and official-registry adoption evidence.
742
+ The installer replaces only the process-wide Skill. It locks every project
743
+ control root in canonical order and proves the workspace package manifest,
744
+ lockfile, installed package manifest, Config, and adoption evidence unchanged;
745
+ it never upgrades project dependencies or Core. An interruption journal
746
+ restores the exact prior Skill before a later installer action continues. The
747
+ fleet registry remains transaction-locked through final receipt commit.
748
+ Receipt and journal byte bounds are enforced by both writers and readers before
749
+ Skill mutation; legacy Config preimages use transaction-scoped, hash-bound
750
+ files so a large fleet does not make its recovery journal unreadable. V2
751
+ receipts always bind their discovery source and frozen membership, so rollback
752
+ must rediscover the same current fleet and also recovers atomically after an
753
+ interruption. Legacy V1 rollback remains supported only when the operator
754
+ supplies an explicit current fleet source.
739
755
  Explicit `--fleet-root` and `--fleet-manifest` remain available for bounded
740
756
  one-off operations. Completeness is intentionally limited to registered roots;
741
757
  RunKit does not claim machine-wide protection for an unregistered location.
@@ -7,14 +7,14 @@ description: Run receipt-backed, project-owned work with OwlCoda RunKit. Use whe
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
- Bundled registry-gated artifact: standalone `owlrunkit@0.22.0`, bundling Contract
11
- `0.2` and Core `0.22.0` with manifest
12
- `sha256:e79d2123d88ada0e2e31f62fabee83b1d661ca02e93a383691a502f721ae1e7e`.
10
+ Bundled registry-gated artifact: standalone `owlrunkit@0.22.1`, bundling Contract
11
+ `0.2` and Core `0.22.1` with manifest
12
+ `sha256:41447517f78b74a070802bd67c8b066a833eedde72e2606e3127fa1258c289a4`.
13
13
  Registry adoption remains fail-closed until exact official npm registry
14
- provenance for `owlrunkit@0.22.0` is independently verified. The published
15
- rollback baseline for this artifact is `owlrunkit@0.21.0`, with SHA-1
16
- `f9ecfa41ad2ba3140258234b49d98798675651f2` and canonical npm tarball URL
17
- `https://registry.npmjs.org/owlrunkit/-/owlrunkit-0.21.0.tgz`.
14
+ provenance for `owlrunkit@0.22.1` is independently verified. The published
15
+ rollback baseline for this artifact is `owlrunkit@0.22.0`, with SHA-1
16
+ `23fb305f24b2487a2a1de3c8e407d7e4606a3b86` and canonical npm tarball URL
17
+ `https://registry.npmjs.org/owlrunkit/-/owlrunkit-0.22.0.tgz`.
18
18
  The root `owlcoda` package has a separate version lifecycle.
19
19
 
20
20
  The session is an execution interface. Project artifacts are the system of record.
@@ -86,6 +86,17 @@ npx --no-install owlrunkit fleet skill-plan \
86
86
  --skill-root "$RUNKIT_SKILL_TARGET" --archive-root "$RUNKIT_SKILL_ARCHIVE_ROOT"
87
87
  ```
88
88
 
89
+ Activate the process-wide Skill only after every discovered project already
90
+ binds the target release through its exact package, lockfile, installed
91
+ CLI/Core, Config, and official-registry adoption evidence. The Skill installer
92
+ must not install project dependencies, initialize Core, or rewrite project
93
+ state; its V2 receipt proves the package manifest, lockfile, installed package
94
+ manifest, Config, and adoption evidence stayed unchanged. V2 restore always
95
+ uses the receipt's frozen fleet binding; only a legacy V1 receipt may accept an
96
+ explicit current fleet source. Receipt and recovery-journal bounds are checked
97
+ before Skill mutation, and interruption recovery remains terminal before
98
+ project control locks are released.
99
+
89
100
  Doctor reports both the package-bound and discovered shared Skill absolute
90
101
  paths and versions. Shared drift is visible but non-blocking for a valid
91
102
  project-local CLI. `loadedSkillVersion=unknown` is deliberate: RunKit cannot
@@ -304,9 +315,9 @@ below has no CLI entry.
304
315
 
305
316
  ```bash
306
317
  npx --no-install owlrunkit bootstrap --workspace "$PROJECT_ROOT" \
307
- --exact owlrunkit@0.22.0 --dry-run
318
+ --exact owlrunkit@0.22.1 --dry-run
308
319
  npx --no-install owlrunkit bootstrap --workspace "$PROJECT_ROOT" \
309
- --exact owlrunkit@0.22.0 --apply
320
+ --exact owlrunkit@0.22.1 --apply
310
321
  npx --no-install owlrunkit init --workspace "$PROJECT_ROOT"
311
322
  npx --no-install owlrunkit inspect --json --workspace "$PROJECT_ROOT"
312
323
  npx --no-install owlrunkit inspect --json --compact --workspace "$PROJECT_ROOT"
@@ -489,10 +500,16 @@ project has an active execution, an active writer lease, ambiguous control
489
500
  state, or invalid configuration. A missing registry is an error; do not use
490
501
  partial explicit coverage to bypass this guard.
491
502
 
492
- A successful update archives the exact prior Skill, migrates each inactive
493
- project, and writes an append-only upgrade receipt containing the prior Skill
494
- manifest identity and each prior ConfigV2 byte sequence. Use that receipt for
495
- an exact rollback:
503
+ A successful update archives the exact prior Skill without migrating any
504
+ project. It holds each project control lock while proving the package manifest,
505
+ lockfile, installed package manifest, Config, and adoption evidence unchanged,
506
+ then writes an append-only upgrade receipt. An interrupted swap is recovered
507
+ from its bounded transaction journal before a later installer action proceeds.
508
+ The registry transaction lock remains held through receipt commit. A V2
509
+ receipt binds the exact fleet source and frozen membership; rollback
510
+ rediscovers that fleet and uses its own interruption journal. Legacy V1
511
+ receipts require an explicit current fleet source. Use the upgrade receipt for
512
+ an exact Skill rollback:
496
513
 
497
514
  ```bash
498
515
  node "$RUNKIT_PACKAGE_ROOT/scripts/runkit-contract/install-codex-skill.mjs" \
@@ -2,9 +2,9 @@
2
2
  "schemaVersion": "OwlCodaRunKitConfigV2",
3
3
  "core": {
4
4
  "contractVersion": "0.2",
5
- "coreVersion": "0.22.0",
6
- "coreManifestSha256": "sha256:e79d2123d88ada0e2e31f62fabee83b1d661ca02e93a383691a502f721ae1e7e",
7
- "coreSourceRef": "artifact:sha256:e79d2123d88ada0e2e31f62fabee83b1d661ca02e93a383691a502f721ae1e7e"
5
+ "coreVersion": "0.22.1",
6
+ "coreManifestSha256": "sha256:41447517f78b74a070802bd67c8b066a833eedde72e2606e3127fa1258c289a4",
7
+ "coreSourceRef": "artifact:sha256:41447517f78b74a070802bd67c8b066a833eedde72e2606e3127fa1258c289a4"
8
8
  },
9
9
  "authorizationPolicy": "external_explicit_authority_required"
10
10
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "owlrunkit",
3
- "version": "0.22.0",
3
+ "version": "0.22.1",
4
4
  "description": "Project Driver for cross-Agent project continuity and progression; execution, evidence, verification, and recovery are the underlying trust substrate.",
5
5
  "license": "GPL-3.0-or-later",
6
6
  "author": "yeemio <owlclaw@163.com>",
@@ -42,6 +42,11 @@
42
42
  "sha256": "sha256:3972dc9744f6499f0f9b2dbf76696f2ae7ad8af9b23dde66d6af86c9dfb36986"
43
43
  },
44
44
  "supportedProducerCoreIdentities": [
45
+ {
46
+ "contractVersion": "0.2",
47
+ "coreVersion": "0.22.1",
48
+ "coreManifestSha256": "sha256:41447517f78b74a070802bd67c8b066a833eedde72e2606e3127fa1258c289a4"
49
+ },
45
50
  {
46
51
  "contractVersion": "0.2",
47
52
  "coreVersion": "0.22.0",
@@ -23,6 +23,11 @@ import {
23
23
  export { validQuickReceiptShape } from "./quick-receipt-contract.mjs";
24
24
 
25
25
  export const SUPPORTED_QUICK_CORE_IDENTITIES = Object.freeze([
26
+ {
27
+ contractVersion: "0.2",
28
+ coreVersion: "0.22.1",
29
+ coreManifestSha256: "sha256:41447517f78b74a070802bd67c8b066a833eedde72e2606e3127fa1258c289a4",
30
+ },
26
31
  {
27
32
  contractVersion: "0.2",
28
33
  coreVersion: "0.22.0",
@@ -2,7 +2,7 @@
2
2
  "schemaVersion": "OwlCodaRunKitRegistryReleasePolicyV2",
3
3
  "status": "release_artifact_registry_gated",
4
4
  "packageName": "owlrunkit",
5
- "artifactVersion": "0.22.0",
5
+ "artifactVersion": "0.22.1",
6
6
  "registry": "https://registry.npmjs.org",
7
7
  "registryRequiredBeforeAdoption": true,
8
8
  "exactVersionRequired": true,
@@ -23,10 +23,10 @@
23
23
  ],
24
24
  "rollbackRelease": {
25
25
  "packageName": "owlrunkit",
26
- "version": "0.21.0",
27
- "shasum": "f9ecfa41ad2ba3140258234b49d98798675651f2",
28
- "integrity": "sha512-hopLyvN5vp0y3xu0H0jQbMI6DxaDSWcGYcn7tAbCa0m2OqW2G8n5kJvnr217jqPYlArQwJ2TDPRLNmp4vPEhVQ==",
29
- "tarballUrl": "https://registry.npmjs.org/owlrunkit/-/owlrunkit-0.21.0.tgz"
26
+ "version": "0.22.0",
27
+ "shasum": "23fb305f24b2487a2a1de3c8e407d7e4606a3b86",
28
+ "integrity": "sha512-sQVFAOvOT7/qLWj5xwLkTvx2g2CGXT3JtRgQDK5Ku2okHGXN6FsgERYKv21IYOxRbEjABamhUwENTflw8ipeSQ==",
29
+ "tarballUrl": "https://registry.npmjs.org/owlrunkit/-/owlrunkit-0.22.0.tgz"
30
30
  },
31
31
  "registryEvidenceMustBeExternal": true,
32
32
  "registryEvidenceSchemaVersion": "OwlCodaRunKitRegistryReleaseEvidenceV1",
package/sbom.spdx.json CHANGED
@@ -2,8 +2,8 @@
2
2
  "spdxVersion": "SPDX-2.3",
3
3
  "dataLicense": "CC0-1.0",
4
4
  "SPDXID": "SPDXRef-DOCUMENT",
5
- "name": "owlrunkit-0.22.0",
6
- "documentNamespace": "https://owlcoda.com/spdx/owlrunkit/0.22.0",
5
+ "name": "owlrunkit-0.22.1",
6
+ "documentNamespace": "https://owlcoda.com/spdx/owlrunkit/0.22.1",
7
7
  "creationInfo": {
8
8
  "created": "2026-07-29T00:00:00Z",
9
9
  "creators": [
@@ -14,7 +14,7 @@
14
14
  {
15
15
  "name": "owlrunkit",
16
16
  "SPDXID": "SPDXRef-Package-OwlRunKit",
17
- "versionInfo": "0.22.0",
17
+ "versionInfo": "0.22.1",
18
18
  "downloadLocation": "NOASSERTION",
19
19
  "filesAnalyzed": false,
20
20
  "licenseConcluded": "GPL-3.0-or-later",
@@ -24,7 +24,7 @@
24
24
  {
25
25
  "referenceCategory": "PACKAGE-MANAGER",
26
26
  "referenceType": "purl",
27
- "referenceLocator": "pkg:npm/owlrunkit@0.22.0"
27
+ "referenceLocator": "pkg:npm/owlrunkit@0.22.1"
28
28
  }
29
29
  ]
30
30
  }
@@ -14,7 +14,7 @@ import { fileURLToPath } from "node:url";
14
14
  import { parseProjectControlState } from "./project-control-parser.mjs";
15
15
 
16
16
  export const CONTRACT_VERSION = "0.2";
17
- export const CORE_VERSION = "0.22.0";
17
+ export const CORE_VERSION = "0.22.1";
18
18
  export const RUNTIME_ROOT = ".owlcoda/runkit";
19
19
 
20
20
  const CORE_FILES = [
@@ -1,13 +1,11 @@
1
- import { readFile } from "node:fs/promises";
2
1
  import path from "node:path";
3
2
 
4
- import {
5
- currentCoreIdentity,
6
- validateProjectConfigV2,
7
- } from "./core-contract.mjs";
3
+ import { currentCoreIdentity } from "./core-contract.mjs";
8
4
  import { discoverFleet } from "./fleet-discovery.mjs";
9
- import { inspectInstalledSkillCompatibility } from "./install-codex-skill.mjs";
10
- import { inspectProjectControlState } from "./project-control-state.mjs";
5
+ import {
6
+ inspectInstalledSkillCompatibility,
7
+ inspectProjectForSkillChange,
8
+ } from "./install-codex-skill.mjs";
11
9
 
12
10
  function shellQuote(value) {
13
11
  return `'${String(value).replaceAll("'", `'"'"'`)}'`;
@@ -34,63 +32,6 @@ function fleetSourceArguments({
34
32
  : "";
35
33
  }
36
34
 
37
- function validLegacyConfigV1(config) {
38
- return config?.schemaVersion === "OwlCodaRunKitConfigV1"
39
- && config?.core?.contractVersion === "0.1"
40
- && config?.authorizationPolicy === "external_explicit_authority_required";
41
- }
42
-
43
- async function inspectAffectedProject(workspaceRoot) {
44
- const blockers = [];
45
- const control = inspectProjectControlState({ workspaceRoot }).upgradeSafety;
46
- for (const artifactId of control.activeRunIds) {
47
- blockers.push({ code: "active_execution", workspaceRoot, artifactId });
48
- }
49
- for (const artifactId of control.activeLeaseIds) {
50
- blockers.push({ code: "active_lease", workspaceRoot, artifactId });
51
- }
52
- for (const issue of control.issues) {
53
- blockers.push({ code: "control_state_invalid", workspaceRoot, detail: issue });
54
- }
55
-
56
- const configPath = path.join(workspaceRoot, ".owlcoda/runkit/config.json");
57
- let config = null;
58
- try {
59
- config = JSON.parse((await readFile(configPath)).toString("utf8"));
60
- } catch (error) {
61
- blockers.push({
62
- code: "project_config_invalid",
63
- workspaceRoot,
64
- detail: error instanceof Error ? error.message : String(error),
65
- });
66
- }
67
- if (config !== null) {
68
- const validation = config.schemaVersion === "OwlCodaRunKitConfigV2"
69
- ? validateProjectConfigV2(config)
70
- : null;
71
- if ((validation !== null && !validation.valid)
72
- || (validation === null && !validLegacyConfigV1(config))) {
73
- blockers.push({
74
- code: "project_config_invalid",
75
- workspaceRoot,
76
- detail: validation?.issues?.join(",") ?? "unsupported_config",
77
- });
78
- }
79
- }
80
-
81
- return {
82
- project: {
83
- workspaceRoot,
84
- configPath,
85
- configCoreVersion: config?.core?.coreVersion ?? null,
86
- activeRunIds: [...control.activeRunIds],
87
- activeLeaseIds: [...control.activeLeaseIds],
88
- upgradeSafe: blockers.length === 0,
89
- },
90
- blockers,
91
- };
92
- }
93
-
94
35
  export async function planFleetSkillUpgradeV1({
95
36
  repositoryRoot,
96
37
  targetRoot,
@@ -125,11 +66,17 @@ export async function planFleetSkillUpgradeV1({
125
66
  for (const workspaceRoot of discovery.unreachableRoots) {
126
67
  blockers.push({ code: "fleet_root_unreachable", workspaceRoot });
127
68
  }
69
+ for (const issue of discovery.issues) {
70
+ blockers.push({
71
+ code: "fleet_discovery_issue",
72
+ detail: `${issue.code}:${issue.path}`,
73
+ });
74
+ }
128
75
  }
129
76
 
130
77
  const affectedProjects = [];
131
78
  for (const workspaceRoot of discovery?.workspaceRoots ?? []) {
132
- const inspected = await inspectAffectedProject(workspaceRoot);
79
+ const inspected = await inspectProjectForSkillChange(workspaceRoot);
133
80
  affectedProjects.push(inspected.project);
134
81
  blockers.push(...inspected.blockers);
135
82
  }
@@ -187,6 +134,7 @@ export async function planFleetSkillUpgradeV1({
187
134
  complete: discovery.complete,
188
135
  workspaceCount: discovery.workspaceRoots.length,
189
136
  unreachableRoots: discovery.unreachableRoots,
137
+ issues: discovery.issues,
190
138
  },
191
139
  affectedProjects,
192
140
  blockers,
@@ -209,7 +157,7 @@ export function formatFleetSkillUpgradePlanHumanV1(plan) {
209
157
  if (plan.blockers.length > 0) {
210
158
  lines.push("Blockers:");
211
159
  for (const blocker of plan.blockers) {
212
- lines.push(`- ${blocker.code}${blocker.workspaceRoot ? `: ${blocker.workspaceRoot}` : ""}${blocker.artifactId ? ` (${blocker.artifactId})` : ""}`);
160
+ lines.push(`- ${blocker.code}${blocker.workspaceRoot ? `: ${blocker.workspaceRoot}` : ""}${blocker.artifactId ? ` (${blocker.artifactId})` : ""}${blocker.detail ? `: ${blocker.detail}` : ""}`);
213
161
  }
214
162
  }
215
163
  lines.push(
@@ -1394,7 +1394,7 @@ export function resumeCompletedFormalFinishV1({
1394
1394
  };
1395
1395
  }
1396
1396
  if (
1397
- new Set(["0.19.2", "0.20.0", "0.20.1", "0.21.0", "0.21.1", "0.22.0"]).has(
1397
+ new Set(["0.19.2", "0.20.0", "0.20.1", "0.21.0", "0.21.1", "0.22.0", "0.22.1"]).has(
1398
1398
  closeout.artifact.core?.coreVersion,
1399
1399
  )
1400
1400
  && (