owlrunkit 0.20.0 → 0.22.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 (50) hide show
  1. package/CHANGELOG.md +88 -0
  2. package/README.md +102 -10
  3. package/docs/architecture/OWLCODA_RUNKIT_0201_RELEASE_TRUTH_AND_PROFILE_NORMALIZATION_PATCH_DECISION_20260813.md +95 -0
  4. package/docs/architecture/OWLCODA_RUNKIT_021_TEAM_DELIVERY_PHASE2_PRODUCT_DECISION_20260813.md +249 -0
  5. package/integrations/codex/skills/owlcoda-runkit/SKILL.md +117 -12
  6. package/integrations/codex/skills/owlcoda-runkit/assets/templates/config.json +3 -3
  7. package/package.json +1 -1
  8. package/packages/attest/README.md +7 -1
  9. package/packages/attest/consumer-surface-v3.json +275 -0
  10. package/packages/attest/distribution-manifest-v1.json +24 -0
  11. package/packages/attest/schemas/canonical-candidate-identity-v1.schema.json +112 -0
  12. package/packages/attest/schemas/foreign-workspace-filesystem-identity-v1.schema.json +32 -0
  13. package/packages/attest/schemas/quick-verification-receipt-v4.schema.json +226 -0
  14. package/packages/attest/src/candidate-identity.mjs +454 -0
  15. package/packages/attest/src/index.mjs +11 -0
  16. package/packages/attest/src/quick-receipt-contract.mjs +126 -5
  17. package/packages/attest/src/quick.mjs +53 -8
  18. package/{registry-release-policy-v1.json → registry-release-policy-v2.json} +8 -9
  19. package/sbom.spdx.json +4 -4
  20. package/scripts/runkit-contract/core-contract.mjs +19 -1
  21. package/scripts/runkit-contract/fleet-skill-plan.mjs +223 -0
  22. package/scripts/runkit-contract/formal-workflow.mjs +3 -1
  23. package/scripts/runkit-contract/hook-recovery.mjs +496 -0
  24. package/scripts/runkit-contract/inspect-presentation.mjs +187 -0
  25. package/scripts/runkit-contract/install-codex-skill.mjs +1 -0
  26. package/scripts/runkit-contract/onboarding-bootstrap.mjs +15 -0
  27. package/scripts/runkit-contract/onboarding-doctor.mjs +378 -9
  28. package/scripts/runkit-contract/profile-onboarding.mjs +6 -0
  29. package/scripts/runkit-contract/project-cli-resolver.mjs +17 -1
  30. package/scripts/runkit-contract/quick-metrics.mjs +9 -5
  31. package/scripts/runkit-contract/quick-verify.mjs +108 -24
  32. package/scripts/runkit-contract/registry-adoption-gate.mjs +12 -3
  33. package/scripts/runkit-contract/registry-adoption.mjs +10 -5
  34. package/scripts/runkit-contract/runkit-bootstrap.mjs +1 -0
  35. package/scripts/runkit-contract/runkit-cli.mjs +332 -30
  36. package/scripts/runkit-contract/schemas/delivery-lifecycle-v1.schema.json +91 -0
  37. package/scripts/runkit-contract/schemas/external-gate-v1.schema.json +68 -0
  38. package/scripts/runkit-contract/schemas/fleet-skill-upgrade-plan-v1.schema.json +140 -0
  39. package/scripts/runkit-contract/schemas/hook-recovery-v1.schema.json +592 -0
  40. package/scripts/runkit-contract/schemas/inspect-compact-v1.schema.json +93 -0
  41. package/scripts/runkit-contract/schemas/inspect-compact-v2.schema.json +122 -0
  42. package/scripts/runkit-contract/schemas/team-delivery-status-v2.schema.json +219 -0
  43. package/scripts/runkit-contract/schemas/team-delivery-status-v3.schema.json +113 -0
  44. package/scripts/runkit-contract/schemas/team-project-event-v6.schema.json +82 -0
  45. package/scripts/runkit-contract/schemas/team-project-event-v7.schema.json +80 -0
  46. package/scripts/runkit-contract/schemas/team-project-status-v4.schema.json +208 -0
  47. package/scripts/runkit-contract/schemas/team-recommendation-v2.schema.json +120 -0
  48. package/scripts/runkit-contract/sync-release-identity.mjs +87 -0
  49. package/scripts/runkit-contract/team-delivery.mjs +203 -3
  50. package/scripts/runkit-contract/team-project.mjs +1032 -11
package/CHANGELOG.md CHANGED
@@ -1,5 +1,93 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.22.0
4
+
5
+ - Adds the independent `OwlCodaRunKitHookRecoveryV1` public contract and
6
+ `hook recovery` CLI for Codex `SessionStart(source=compact)` consumers.
7
+ - Projects active Project Driver truth even when there is no active execution,
8
+ while keeping execution and lease state as a separate bounded summary.
9
+ - Binds project identity with a deterministic objective digest, bounded preview,
10
+ current dominant gap, owner, next action, delivery disposition, warning
11
+ summary, and latest provable project fact time.
12
+ - Caps the complete JSON response at 2,000 UTF-8 bytes, escapes control and
13
+ separator characters as untrusted data, and fails closed on redirected,
14
+ version-mismatched, invalid, or ambiguous control truth.
15
+ - Keeps Compact V1/V2, full inspect, status, and takeover contracts unchanged;
16
+ Hook recovery remains byte-stable, read-only, zero-write, no-dispatch, and
17
+ all authority fields remain false.
18
+
19
+ ## 0.21.1
20
+
21
+ - Adds Inspect Compact V2 with separate lifecycle, Project Driver, and
22
+ maintenance next actions plus distinct project, maintenance, shared-Skill,
23
+ and advisory summaries. Historical non-required receipt advisories no longer
24
+ inflate its actionable warning count.
25
+ - Adds Doctor Report V3. ESLint flat config projects receive a global `ignores`
26
+ recommendation instead of the obsolete `.eslintignore` advice; only an
27
+ ignore-only object or ESLint's `globalIgnores()` helper counts as global
28
+ coverage. Shared-Skill activation is explicitly `eligible`, `blocked`, or
29
+ `not_evaluated`; unmanaged or drifted bytes remain blocked consistently with
30
+ fleet planning. Relative launcher warnings remain grouped and non-blocking.
31
+ - Adds Team Recommendation V2 and Team Delivery Status V3. The public field is
32
+ now `teamCoordinationMode`, making clear that Team projection does not replace
33
+ ordinary usage-mode assurance. Missing historical verification receipts are
34
+ advisory and remain non-retroactive.
35
+ - Adds Takeover V4 so completed WorkItems remain visible in history without
36
+ being presented as a current responsibility or contributing a stale owner
37
+ next action. Earlier takeover contracts remain unchanged.
38
+ - Keeps project-local bootstrap compatible with the exact published 0.20.1 and
39
+ 0.21.0 predecessor Core identities, and makes Team Delivery Status V3's
40
+ public schema mechanically keep receipt advisories out of actionable warning
41
+ summaries.
42
+
43
+ ## 0.21.0
44
+
45
+ - Adds ExternalGateV1 as typed, source-hash-bound Project Driver truth. A due
46
+ pending, blocked, or deferred Gate becomes the dominant gap for its delivery
47
+ stage; superseding observations are append-only and raw capture cannot bypass
48
+ typed intake.
49
+ - Adds DeliveryLifecycleV1 and Project Status V4 so source acceptance,
50
+ integration, materialization, deployment, live readback, and product acceptance are distinct
51
+ evidence facts. Work-ledger completion never auto-promotes a later stage.
52
+ - Adds Team Delivery Status V2 with explicit known-but-unmodeled candidate
53
+ lanes while retaining one Project Driver graph and read-only, no-dispatch
54
+ Team coordination.
55
+ - Adds optional WorkItem Quick-evidence policy and
56
+ `project checkpoint --from-quick-receipt`; ordinary WorkItems remain
57
+ lightweight and no assurance mode changes automatically.
58
+ - Adds read-only `fleet skill-plan` for affected-project inventory, active
59
+ execution/lease blockers, and copyable dry-run, install, and rollback
60
+ commands. It grants no shared-Skill, project, Git, or release authority.
61
+ - Adds a canonical candidate ledger with fixed Git object width, C-locale path
62
+ ordering, complete path/mode/size/content bindings, and a transport-only raw
63
+ binary diff. Object-store growth no longer changes the candidate identity.
64
+ - Adds controller-owned `quick-verify --foreign-workspace` and Quick Receipt
65
+ V4. The target is copied into a disposable consumer; receipts remain under
66
+ the controller and bind target candidate, filesystem, dependency, command,
67
+ and before/after observed zero-write evidence without initializing RunKit in
68
+ the frozen target.
69
+ - Doctor now reports the package-bound and discovered process-wide Skill versions and
70
+ absolute paths, labels drift as a visible non-blocking warning, and keeps the
71
+ actually loaded Skill version honest as `unknown`.
72
+ - Replaces the temporal, candidate-only registry policy with a lifecycle-stable
73
+ registry-gated release artifact policy. The packed README, Skill, policy, and
74
+ SBOM no longer claim that the package is unpublished or that an older version
75
+ is still current; adoption still requires independent exact-registry evidence.
76
+ - Treats formatting-only profile reconciliation as an apply-time no-op. The
77
+ result remains explicit through `normalizationOnly: true`, but owner JSON
78
+ bytes stay unchanged and no migration receipt or tracked diff is created.
79
+ - Makes a version-mismatched bootstrap return the exact successor install and
80
+ dry-run commands instead of only reporting the older CLI's own exact spec.
81
+ - Adds `inspect --json --compact`, a bounded projection of project truth,
82
+ progress, dominant gap, owner, next action, warning groups, execution counts,
83
+ and the unchanged authority boundary without full execution history.
84
+ - Adds Team Delivery Status V2. Missing receipt warnings now carry severity,
85
+ blocking and gate semantics, an actionable recommendation, and deterministic
86
+ aggregation without retroactively requiring Formal evidence.
87
+ - Shows project CLI/Core and process-level shared Skill versions in doctor.
88
+ Skill drift is explicitly non-blocking and includes a fleet activation
89
+ blocker when an active execution or lease prevents safe refresh.
90
+
3
91
  ## 0.20.0
4
92
 
5
93
  - Adds read-only `team recommend` and `team status` projections over the
package/README.md CHANGED
@@ -67,17 +67,50 @@ Independent verification requires a different assigned Agent. Append-only
67
67
  scope revision can widen or narrow a WorkItem after diagnosis without rewriting
68
68
  history, and missing Quick/Formal receipt references remain visible warnings.
69
69
 
70
- RunKit 0.20.0 Phase 1 adds Team Delivery as a read-only coordination dimension
70
+ RunKit 0.20 Phase 1 adds Team Delivery as a read-only coordination dimension
71
71
  over the existing Project Driver. `team recommend` exits for ordinary
72
72
  single-owner work, recommends Team only for real coordination facts, exposes
73
73
  owned-path conflicts and independent-acceptance gaps, and never dispatches an
74
74
  Agent. `team status` projects the existing project graph without storing a
75
75
  second graph. Three strict portable contracts—TeamTaskPacket V2,
76
76
  TeamAcceptancePacket V2, and CandidateTransferPacket V1—can be validated on a
77
- machine that does not have the local `manage-agent-team` Skill. This candidate
77
+ machine that does not have the local `manage-agent-team` Skill. This phase
78
78
  does not add automatic or assisted dispatch and does not change Quick or Formal
79
79
  assurance.
80
80
 
81
+ RunKit 0.21 Phase 2 keeps Team Delivery read-only while making delivery truth
82
+ explicit. Typed external Gates may block the relevant stage without parsing a
83
+ domain product's documents. Source acceptance, integration, materialization, deployment, live
84
+ readback, and product acceptance are separate evidence-bound lifecycle facts.
85
+ Project Status V4 and Team Delivery Status V3 expose that progression and an
86
+ explicit inventory of known-but-unmodeled candidates. An optional WorkItem
87
+ policy can require a currently attested Quick receipt, and `fleet skill-plan`
88
+ shows affected projects, active blockers, and copyable install/rollback commands
89
+ without mutating the shared Skill. No command dispatches an Agent or raises
90
+ assurance automatically.
91
+
92
+ The same phase adds a fixed-width canonical candidate ledger and
93
+ controller-owned Foreign Quick. A controller running 0.21 may verify a
94
+ disjoint frozen Git worktree without installing RunKit, changing package/lock
95
+ files, or creating `.owlcoda/runkit` in that target. Doctor also exposes the
96
+ package-bound and discovered process-wide Skill identities; it cannot prove which
97
+ instructions an already-running Agent process loaded, so that field remains
98
+ `unknown`.
99
+
100
+ This release also folds in the upgrade-usability patch: cross-version bootstrap
101
+ failures return copyable install and retry commands; `inspect --json --compact`
102
+ omits historical payloads; Team receipt warnings are non-blocking, actionable,
103
+ and grouped; doctor reports project CLI/Core separately from a process-level
104
+ shared Skill; and formatting-only profile reconciliation is a zero-write apply.
105
+
106
+ RunKit 0.22 adds a dedicated Hook Recovery projection for Codex
107
+ `SessionStart(source=compact)`. It exposes only the bounded project identity,
108
+ objective digest/preview, current Project Driver gap, execution/lease summary,
109
+ warnings, and false authority boundary needed for a consumer to decide whether
110
+ the project matches its current chat goal. It does not infer chat intent, emit
111
+ full execution or event history, change project state, dispatch an Agent, or
112
+ raise assurance.
113
+
81
114
  The 0.18 Project Driver is a bounded surface for new projects and controlled
82
115
  dogfood. Its product name does not claim to be a general long-running,
83
116
  multi-phase, or enterprise control plane. Version 0.18 adds one bounded
@@ -91,13 +124,15 @@ separate authority boundaries.
91
124
 
92
125
  ## Install
93
126
 
94
- `owlrunkit@0.20.0` is an unpublished release candidate. Until registry
95
- publication is independently verified, the current installable release is
96
- `owlrunkit@0.19.2`; a locally packed 0.20.0 tarball is for candidate testing
97
- only and is not adoption provenance.
127
+ This package is the lifecycle-stable, registry-gated `owlrunkit@0.22.0`
128
+ artifact. Registry adoption remains fail-closed until its exact official npm
129
+ version, shasum, integrity, and tarball URL are independently verified. Local
130
+ tarballs remain candidate-test inputs and are never adoption provenance. Until
131
+ that registry evidence exists, use the package only for isolated candidate
132
+ verification; do not treat the command below as available release truth.
98
133
 
99
134
  ```bash
100
- npm install --save-exact owlrunkit@0.19.2
135
+ npm install --save-exact owlrunkit@0.22.0
101
136
  ```
102
137
 
103
138
  Use `npx --no-install owlrunkit` for project commands. The package bootstrap
@@ -113,11 +148,12 @@ the project Config must independently bind the same Core.
113
148
  ```bash
114
149
  npx --no-install owlrunkit --version
115
150
  npx --no-install owlrunkit bootstrap --workspace /absolute/path/to/project \
116
- --exact owlrunkit@0.19.2 --dry-run
151
+ --exact owlrunkit@0.22.0 --dry-run
117
152
  npx --no-install owlrunkit bootstrap --workspace /absolute/path/to/project \
118
- --exact owlrunkit@0.19.2 --apply
153
+ --exact owlrunkit@0.22.0 --apply
119
154
  npx --no-install owlrunkit init --workspace /absolute/path/to/project
120
155
  npx --no-install owlrunkit doctor --workspace /absolute/path/to/project
156
+ npx --no-install owlrunkit inspect --workspace /absolute/path/to/project --json --compact
121
157
  npx --no-install owlrunkit mode recommend --workspace /absolute/path/to/project
122
158
  npx --no-install owlrunkit mode status --workspace /absolute/path/to/project
123
159
  ```
@@ -129,11 +165,44 @@ back doctor. Dry-run is zero-write; failed apply restores the governed preimage
129
165
  and keeps a failure receipt. It reports shared Skill drift but never silently
130
166
  updates a user or fleet Skill.
131
167
 
168
+ When an older CLI receives a different exact successor spec, bootstrap returns
169
+ two bounded repair commands: install that exact project dependency, then rerun
170
+ the successor's project-local bootstrap dry-run. Doctor keeps shared Skill
171
+ drift non-blocking and reports why fleet-safe activation must wait when an
172
+ active execution or lease is present.
173
+
132
174
  `mode recommend` is read-only and defaults to human output; add `--json` for a
133
175
  machine contract. The five user modes are presets over `continuity`
134
176
  (`none | project_driver`) and `assurance` (`none | quick | formal`). They never
135
177
  grant Git, release, deployment, production, or business authority.
136
178
 
179
+ ## Hook recovery for compacted sessions
180
+
181
+ Use the dedicated machine surface instead of full inspect when a Codex Hook
182
+ needs only enough RunKit truth to compare identities after compaction:
183
+
184
+ ```bash
185
+ npx --no-install owlrunkit hook recovery --workspace /absolute/path/to/project --json
186
+ ```
187
+
188
+ The strict `OwlCodaRunKitHookRecoveryV1` response is deterministic and no more
189
+ than 2,000 UTF-8 bytes. It includes `projectId`, `projectTruthHash`, an
190
+ `objectiveDigest`, a bounded `objectivePreview`, progress, headline, dominant
191
+ gap, owner, next action, delivery disposition, execution/open/lease counts,
192
+ aggregated warnings, the latest provable project fact time, and a complete
193
+ all-false authority boundary. Project text is escaped and labeled
194
+ `untrusted_data`; it is data, never an instruction.
195
+
196
+ The Hook consumer must first compare its current Goal/Done-when with
197
+ `projectId` and the objective digest/preview. Only after that identity check may
198
+ it consider `nextAction`; RunKit does not decide what the current chat means.
199
+ An active Project Driver remains visible when there is no active execution.
200
+ No Project Driver is explicit. Invalid, redirected, version-mismatched, or
201
+ ambiguous control truth fails closed. The command never assigns, checkpoints,
202
+ hands off, takes over, creates an execution, acquires a lease, dispatches an
203
+ Agent, changes assurance, or grants Git, release, deployment, production,
204
+ business, automation, or money authority.
205
+
137
206
  ## Team Delivery: Recommend coordination without dispatch
138
207
 
139
208
  Team Delivery is separate from continuity and assurance. It reads the current
@@ -156,6 +225,12 @@ raising assurance. Every result keeps Agent dispatch and all external authority
156
225
  false. Phase 1 contains no launcher, scheduler, model ranking, or vendor CLI
157
226
  federation.
158
227
 
228
+ `team status` emits Team Delivery Status V3. Each
229
+ `no_bound_verification_receipt` entry includes `severity`, `blocking`,
230
+ `requiredAtGate`, and `recommendedAction`, plus a separate advisory summary.
231
+ Completed historical WorkItems whose evidence policy did not require a reusable
232
+ receipt are not retroactively told to add Formal evidence.
233
+
159
234
  ## Project Driver: Coordinate a multi-Agent project
160
235
 
161
236
  RunKit 0.18 keeps the project alive independently of any one Agent or chat.
@@ -244,6 +319,8 @@ a mechanical project invariant without forcing Formal. A verifying or completed
244
319
  checkpoint that does not reference a recognizable Quick/Formal receipt remains
245
320
  valid project truth but receives `no_bound_verification_receipt`; the warning is
246
321
  about the missing bound reference and does not attest any referenced receipt.
322
+ Team Status V3 and Compact V2 surface this non-retroactive fact as an advisory,
323
+ not an actionable warning.
247
324
 
248
325
  `project work-item revise-scope` appends Event V5 and never rewrites the original
249
326
  definition. It must bind the current assignment and owner, records the previous
@@ -371,7 +448,9 @@ and launchers that do not resolve to exact local files. Detection directly
371
448
  supports lock-bound npm plus exact project-installed pnpm, Yarn, and Bun
372
449
  launchers. A PATH-only package manager remains review-required. A dry-run that
373
450
  only canonicalizes JSON formatting reports `normalizationOnly: true` instead of
374
- showing unexplained hash drift with an empty update list.
451
+ showing unexplained hash drift with an empty update list. Applying that plan is
452
+ a zero-write `profiles_already_current` result: owner bytes remain unchanged and
453
+ no migration receipt or tracked formatting diff is created.
375
454
 
376
455
  The dry-run is the V2 detection contract. It reports `profiles_insufficient`
377
456
  instead of `profiles_detected` when Git-visible source paths are uncovered or
@@ -427,6 +506,9 @@ npx --no-install owlrunkit quick-verify --workspace . --stdin-file ./remote-chec
427
506
  -- ssh test-host /bin/sh
428
507
  npx --no-install owlrunkit quick-verify --workspace . --isolate \
429
508
  --dependency-root /absolute/dependency-consumer -- npm test
509
+ npx --no-install owlrunkit quick-verify --workspace /absolute/controller \
510
+ --foreign-workspace /absolute/frozen-target \
511
+ --dependency-root /absolute/dependency-consumer -- npm test
430
512
  npx --no-install owlrunkit quick-verify --workspace . \
431
513
  --bind-ignored .generated/audit.json -- node ./verify-generated.mjs
432
514
  npx --no-install owlrunkit quick-reuse --workspace . \
@@ -461,6 +543,16 @@ into the consumer, prepends its binary directory, and hash-binds package, lock,
461
543
  installed-package, and executable metadata before and after execution. RunKit
462
544
  does not install dependencies or contact a registry for this command.
463
545
 
546
+ `--foreign-workspace` emits Quick Receipt V4 and always uses a disposable
547
+ consumer. The exact project-local CLI, receipt store, stdout/stderr, and any
548
+ stdin material remain under the controller `--workspace`; the target receives
549
+ no RunKit initialization. The receipt records the target realpath, HEAD,
550
+ fixed-width status ledger, path/mode/size/content hashes, before/after governed
551
+ filesystem identity, command argv/cwd, and dependency environment. A permanent
552
+ observed target change invalidates the receipt. This is before/after evidence,
553
+ not an OS write sandbox or proof that no transient write was restored between
554
+ observations.
555
+
464
556
  Repeatable literal `--bind-ignored` paths opt specific ignored workspace bytes
465
557
  into Workspace Snapshot V2. Missing is a bound state; file or directory changes
466
558
  invalidate Quick. Unrequested ignored paths remain explicitly outside the
@@ -0,0 +1,95 @@
1
+ # OwlRunKit 0.20.1 Release Truth and Profile Normalization Patch Decision
2
+
3
+ Date: 2026-08-13
4
+ Status: `release_artifact_registry_gated`
5
+
6
+ ## Decision
7
+
8
+ OwlRunKit 0.20.1 is a bounded patch over 0.20.0. It fixes six defects found by
9
+ installing the official 0.20.0 registry package into an isolated consumer and
10
+ then running bootstrap, doctor, profile validation, Team recommendation, and
11
+ Quick attestation.
12
+
13
+ The patch does not add Team dispatch, new assurance gates, deployment
14
+ authority, or any other product branch.
15
+
16
+ ## Verified 0.20.0 dogfood facts
17
+
18
+ - Exact registry installation and project-local bootstrap completed.
19
+ - Doctor was ready, 28 profiles validated, Team recommendation remained
20
+ read-only, and Quick attestation returned GO.
21
+ - The installed 0.20.0 README, Skill, and release policy still carried stale
22
+ candidate-lifecycle wording and a stale 0.19.2 registry pointer.
23
+ - Applying profile reconciliation rewrote tracked `profiles.json` bytes for a
24
+ formatting-only normalization even though the update list was empty.
25
+ - An older bootstrap receiving the 0.20.0 exact spec reported only its own
26
+ 0.19.1 exact spec and a generic issue code instead of the install-and-retry
27
+ correction.
28
+ - `inspect --json` retained complete execution and Project Driver history for
29
+ a routine blank-session status read.
30
+ - Five historical `no_bound_verification_receipt` warnings were non-blocking
31
+ but lacked severity, gate semantics, a recommended action, and aggregation.
32
+ - Doctor was ready while the project CLI/Core and process-level shared Skill
33
+ were on different versions, with no visible reason why fleet activation was
34
+ deferred.
35
+
36
+ ## Product contract
37
+
38
+ ### Lifecycle-stable release artifacts
39
+
40
+ `OwlCodaRunKitRegistryReleasePolicyV2` describes immutable artifact behavior,
41
+ not mutable registry time:
42
+
43
+ - `status=release_artifact_registry_gated`;
44
+ - `artifactVersion` is the package version;
45
+ - `rollbackRelease` is the exact already-published rollback baseline;
46
+ - adoption requires external exact-registry version, shasum, integrity, and
47
+ tarball evidence;
48
+ - the artifact does not encode mutable publication state or name a moving
49
+ latest release.
50
+
51
+ The V1 policy remains historical and is not reinterpreted in place.
52
+
53
+ ### Formatting-only profile reconciliation
54
+
55
+ A dry-run may still report `normalizationOnly: true` and show the canonical
56
+ proposal. Applying that same plan is a semantic no-op:
57
+
58
+ - status is `profiles_already_current`;
59
+ - `writesPerformed=0`;
60
+ - the owner profile bytes remain unchanged;
61
+ - no reconcile receipt is created.
62
+
63
+ Real profile additions or command/path updates retain the existing atomic
64
+ write, receipt, and rollback behavior.
65
+
66
+ ### Compact, actionable upgrade and recovery output
67
+
68
+ - A version-mismatched bootstrap returns the exact `npm install --save-exact`
69
+ command for the requested successor and the matching project-local bootstrap
70
+ dry-run command.
71
+ - `inspect --json --compact` emits `OwlCodaRunKitInspectCompactV1`: project
72
+ truth hash, progress, dominant gap, owner, next action, warning groups,
73
+ execution counts, and the false authority boundary only.
74
+ - Existing full inspect remains unchanged; compact cannot be combined with
75
+ history, a selected run, or verbose output.
76
+
77
+ ### Team warning and shared Skill diagnosis
78
+
79
+ Team Delivery Status V2 enriches and groups Project Driver warnings while
80
+ leaving Status V1 unchanged. A missing Quick/Formal reference remains
81
+ non-blocking, does not prove that any receipt was attested, and does not impose
82
+ retroactive Formal work on a completed historical WorkItem.
83
+
84
+ Doctor reports project-local CLI, project Core, and process-level shared Skill
85
+ versions separately. Shared Skill drift does not change `ready`; if fleet-safe
86
+ activation is blocked by an active execution or lease, the blocker and the
87
+ wait-then-refresh action are visible.
88
+
89
+ ## Authority boundary
90
+
91
+ This document and the packaged artifact grant no npm publication, project
92
+ adoption, Git integration, deployment, production, or business authority.
93
+ All authorization fields remain false. Registry adoption becomes eligible only
94
+ after separate external evidence binds the exact official-registry version,
95
+ shasum, integrity, and tarball URL.
@@ -0,0 +1,249 @@
1
+ # OwlRunKit 0.21 Team Delivery Phase 2 Product Decision
2
+
3
+ Date: 2026-08-13
4
+ Status: `product_contract_definition / implementation_and_release_truth_tracked_separately`
5
+
6
+ ## Decision
7
+
8
+ OwlRunKit 0.21 extends the existing Project Driver and read-only Team Delivery
9
+ projection with two missing kinds of durable truth:
10
+
11
+ 1. typed external Gates produced by domain-owned adapters; and
12
+ 2. an evidence-bound delivery lifecycle that keeps source acceptance,
13
+ integration, materialization, deployment, live readback, and product acceptance separate.
14
+
15
+ Project Driver remains the only active task graph. Phase 2 does not add a
16
+ scheduler, start an Agent, select a model, increase assurance, parse arbitrary
17
+ domain documents, or grant Git, release, deployment, production, or business
18
+ authority.
19
+
20
+ The implementation order is fixed:
21
+
22
+ 1. ExternalGateV1 plus DeliveryLifecycleV1 contracts and read-only projection;
23
+ 2. explicit Quick-receipt binding for WorkItems that declare an evidence
24
+ requirement;
25
+ 3. inventory of explicit candidate artifacts not yet represented as active
26
+ WorkItem lanes; and
27
+ 4. copyable fleet Skill dry-run, install, and rollback plans.
28
+
29
+ The OwlFootball 0.20 dogfood adds three bounded Phase 2 corrections to the
30
+ same release: a canonical candidate identity, controller-owned verification of
31
+ a frozen foreign worktree, and explicit Doctor visibility for package/shared
32
+ Skill drift. Commit-rebinding remains a separate future receipt contract and
33
+ is not implied by these additions.
34
+
35
+ Assisted or automatic Agent dispatch is not part of 0.21. It requires a later
36
+ Owner decision after real dogfood demonstrates lower handoff time or lower
37
+ controller intervention.
38
+
39
+ ## Stable product model
40
+
41
+ The independent dimensions remain:
42
+
43
+ ```text
44
+ continuity none | project_driver
45
+ coordination none | team_delivery
46
+ assurance none | quick | formal
47
+ acceptance L0 | L1 | L2 | L3
48
+ authority externally granted; never inferred by RunKit
49
+ ```
50
+
51
+ Phase 2 adds delivery state without folding it into those dimensions:
52
+
53
+ ```text
54
+ work ledger
55
+ -> source accepted
56
+ -> integrated
57
+ -> materialized
58
+ -> deployed
59
+ -> live readback
60
+ -> product accepted
61
+ ```
62
+
63
+ Every arrow requires a new append-only fact and evidence. A passed source Gate
64
+ does not imply integration. Integration does not imply a sealed or built
65
+ artifact. Materialization does not imply deployment. Deployment does not imply
66
+ a healthy readback. A healthy readback does not imply product or business
67
+ acceptance.
68
+
69
+ ## ExternalGateV1
70
+
71
+ RunKit does not know what an OwlFootball packaging Gate, a MES runtime Gate, or
72
+ another domain decision means. The domain product owns that judgment. A
73
+ domain-owned adapter may emit one strict generic Gate observation containing:
74
+
75
+ - a stable Gate identity and title;
76
+ - the delivery stage that requires it;
77
+ - `pending`, `passed`, `blocked`, or `deferred` status;
78
+ - the responsible Agent;
79
+ - adapter identity, source reference, and exact SHA-256 source digest;
80
+ - a concise summary and evidence references; and
81
+ - an all-false authority boundary.
82
+
83
+ The typed Project Driver command records the observation as an immutable event.
84
+ A later observation must explicitly supersede the current observation for that
85
+ Gate. RunKit validates the structure and source binding; it does not parse or
86
+ reinterpret the domain source.
87
+
88
+ An unresolved external Gate is visible throughout status projection. Once the
89
+ work ledger is otherwise ready for the Gate's delivery stage, that Gate becomes
90
+ the dominant gap and replaces any misleading execution next action.
91
+
92
+ ## DeliveryLifecycleV1
93
+
94
+ The lifecycle contains six fixed stages:
95
+
96
+ | Stage | Positive fact | Other honest outcomes |
97
+ |---|---|---|
98
+ | source | `accepted` | `rejected` |
99
+ | integration | `integrated` | `rejected` |
100
+ | materialization | `materialized` | `failed` |
101
+ | deployment | `deployed` | `failed`, `rolled_back` |
102
+ | live readback | `passed` | `failed` |
103
+ | product acceptance | `accepted` | `rejected`, `deferred` |
104
+
105
+ A lifecycle record binds one stage, outcome, responsible Agent, evidence, and
106
+ the external Gates used for that transition. The current projection includes
107
+ all six stages, the highest positively established stage, the next required
108
+ stage, any blocking stage, and unresolved external Gates.
109
+
110
+ The runtime enforces ordering. It rejects integration before source acceptance,
111
+ materialization before integration, deployment before materialization, live
112
+ readback before deployment, and product acceptance before a passed live
113
+ readback. A later correction for the same stage
114
+ must supersede the current stage record. A correction cannot silently rewrite
115
+ downstream facts.
116
+
117
+ Recording a deployed or accepted fact is evidence bookkeeping only. Every
118
+ result continues to carry `authorizationGranted=false` and cannot authorize the
119
+ underlying action.
120
+
121
+ ## Versioning and compatibility
122
+
123
+ Published predecessor contracts are immutable:
124
+
125
+ - TeamProject Event V1-V5 retain their existing bytes and meanings;
126
+ - TeamProject Status V1-V3 retain their existing fields and projections; and
127
+ - Team Delivery Status V1 retains its Phase 1 surface.
128
+
129
+ Phase 2 uses successor contracts:
130
+
131
+ - TeamProject Event V6 for external Gate and delivery lifecycle facts;
132
+ - TeamProject Event V7 for WorkItem evidence policy and receipt-bound
133
+ checkpoint facts;
134
+ - TeamProject Status V4 for ExternalGateV1 and DeliveryLifecycleV1 projection;
135
+ - Team Delivery Status V2 for the corresponding read-only Team view.
136
+
137
+ Raw generic capture may not create V6 or V7 facts. Operators use typed commands so
138
+ the current Gate, lifecycle ordering, source binding, and exact retry rules are
139
+ checked before the event is written.
140
+
141
+ ## Receipt binding
142
+
143
+ Phase 2 adds `project work-item require-evidence` and
144
+ `project checkpoint --from-quick-receipt`. The WorkItem policy is append-only
145
+ and may select `none` or `quick`; it does not represent Formal acceptance.
146
+ Receipt binding attests the current Quick receipt and persists an immutable
147
+ reference. It becomes blocking only when the WorkItem contract explicitly
148
+ requires Quick evidence. Existing WorkItems, measurable work, and
149
+ assurance=`none` are not retroactively upgraded to Quick or Formal.
150
+
151
+ ## Explicit candidate inventory
152
+
153
+ Team Delivery may report `unmodeled_candidate_lanes` only from artifacts RunKit
154
+ can identify explicitly, such as a verified DeliveryPacket, target snapshot,
155
+ data-candidate event, or external Gate. It may not infer a candidate from an
156
+ arbitrary dirty worktree or create a second task graph.
157
+
158
+ The inventory is read-only. Turning an artifact into active Project Driver work
159
+ requires a separate typed project action and authority.
160
+
161
+ ## Fleet Skill operations
162
+
163
+ Shared Skill drift remains non-blocking for a project-local CLI unless an exact
164
+ project contract says otherwise. A fleet plan may show affected projects and
165
+ copyable dry-run, install, and rollback commands. It may not silently update a
166
+ shared Skill while any project has an active execution or lease.
167
+
168
+ ## Canonical candidate identity
169
+
170
+ The primary dirty-candidate identity is a canonical ordered ledger, not a raw
171
+ `git diff` digest. It records the target HEAD and tracked tree plus every
172
+ changed path, prior rename path, operation, Git status, file kind, mode, byte
173
+ length, and content SHA-256. Discovery uses `LC_ALL=C`, disables optional Git
174
+ locks, and fixes `core.abbrev=40`; the command, environment, Git version,
175
+ ledger byte length, ledger hash, and candidate fingerprint are persisted.
176
+
177
+ The full-index binary diff remains available as a transport artifact with a
178
+ fixed command, but its digest is explicitly not the candidate identity.
179
+
180
+ ## Controller-owned Foreign Quick
181
+
182
+ `quick-verify --workspace <controller> --foreign-workspace <target>` keeps the
183
+ project-local CLI and every RunKit artifact in the controller. The target must
184
+ be a separate real Git worktree root. RunKit copies its visible source into a
185
+ disposable consumer, optionally projects an already-installed disjoint
186
+ dependency root, and binds Quick Receipt V4 to the target's canonical candidate
187
+ and bounded filesystem identities before and after execution.
188
+
189
+ The current resolver remains fail-closed: a controller CLI may not masquerade
190
+ as the target's older or absent project-local CLI. `zeroWriteObserved` means
191
+ the governed target state matched before and after; RunKit does not claim an OS
192
+ write sandbox or prove that a transient write restored before the second
193
+ observation never occurred.
194
+
195
+ ## Doctor Skill drift
196
+
197
+ Doctor reports package-bound and discovered process-wide Skill versions and absolute
198
+ paths. A mismatch is a visible non-blocking warning when the project-local CLI
199
+ and Core are valid. RunKit cannot observe which instruction bytes an existing
200
+ Agent process loaded, so `loadedSkillVersion` remains `unknown` and the repair
201
+ guidance starts a new session using the package-bound Skill. Fleet mutation
202
+ still requires the separate safe plan/install boundary.
203
+
204
+ ## Acceptance scenarios
205
+
206
+ 1. A typed pending external Gate is projected with its source hash, blocks the
207
+ relevant delivery stage, and becomes the unique dominant gap when due.
208
+ 2. A later exact superseding observation may pass the Gate; stale, duplicate,
209
+ or source-unbound observations fail closed.
210
+ 3. Source, integration, materialization, deployment, live readback, and product acceptance each
211
+ require a separate evidence-bound event and never auto-promote.
212
+ 4. Out-of-order lifecycle facts, unresolved required external Gates, and
213
+ attempts to revise an earlier stage beneath downstream truth fail before
214
+ writing.
215
+ 5. Status V1-V3 and Team Delivery Status V1 remain unchanged; V4/V2 expose the
216
+ new fields under new schema identities.
217
+ 6. Raw project capture cannot bypass typed V6 intake.
218
+ 7. Team and Project status remain read-only and dispatch remains disabled.
219
+ 8. No result grants Git, release, deployment, production, business, automation,
220
+ money, credential, or Agent-dispatch authority.
221
+ 9. Quick-receipt binding never forces assurance on an existing WorkItem that
222
+ did not explicitly require it.
223
+ 10. Candidate inventory is derived only from explicit artifacts and does not
224
+ infer arbitrary dirty-worktree truth.
225
+ 11. Canonical candidate identity remains byte-stable when only Git object
226
+ abbreviation settings or unrelated object-store population changes.
227
+ 12. Foreign Quick writes receipts only under the controller, creates no target
228
+ `.owlcoda/runkit`, binds target/dependency/command evidence, and invalidates
229
+ any permanent governed target delta observed after execution.
230
+ 13. Doctor exposes package/process Skill drift and absolute package Skill path
231
+ without claiming knowledge of the Skill already loaded by an Agent.
232
+
233
+ ## Non-goals
234
+
235
+ - no automatic or assisted Agent launch;
236
+ - no model or vendor selection;
237
+ - no general scheduler or second graph;
238
+ - no automatic assurance escalation;
239
+ - no parsing of domain product contracts inside Core;
240
+ - no implicit deployment, product acceptance, or business verdict;
241
+ - no shared Skill mutation without fleet-safe explicit invocation;
242
+ - no publication claim from repository source or test success.
243
+
244
+ ## Claims boundary
245
+
246
+ This document defines the Phase 2 product contract. Its presence does not prove
247
+ implementation completion, package publication, project adoption, shared Skill
248
+ activation, runtime deployment, or business acceptance. Those facts require
249
+ their own current receipts and external readback.