owlrunkit 0.19.1 → 0.20.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 (42) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/README.md +107 -3
  3. package/docs/architecture/OWLCODA_RUNKIT_0191_PROFILE_RECONCILE_PATCH_PRODUCT_DECISION_20260813.md +11 -5
  4. package/docs/architecture/OWLCODA_RUNKIT_0192_FORMAL_USABILITY_PRODUCT_DECISION_20260813.md +141 -0
  5. package/docs/architecture/OWLCODA_RUNKIT_020_TEAM_DELIVERY_PHASE1_PRODUCT_DECISION_20260813.md +296 -0
  6. package/integrations/codex/skills/owlcoda-runkit/SKILL.md +74 -9
  7. package/integrations/codex/skills/owlcoda-runkit/assets/templates/config.json +3 -3
  8. package/package.json +1 -1
  9. package/packages/attest/distribution-manifest-v1.json +10 -0
  10. package/packages/attest/src/quick.mjs +42 -4
  11. package/registry-release-policy-v1.json +5 -5
  12. package/sbom.spdx.json +5 -5
  13. package/scripts/runkit-contract/core-contract.mjs +42 -2
  14. package/scripts/runkit-contract/efficiency-metrics.mjs +9 -7
  15. package/scripts/runkit-contract/formal-preflight.mjs +352 -0
  16. package/scripts/runkit-contract/formal-supplemental-evidence.mjs +713 -0
  17. package/scripts/runkit-contract/formal-workflow.mjs +529 -59
  18. package/scripts/runkit-contract/onboarding-doctor.mjs +32 -13
  19. package/scripts/runkit-contract/project-cli-resolver.mjs +33 -3
  20. package/scripts/runkit-contract/project-external-delivery.mjs +16 -9
  21. package/scripts/runkit-contract/quick-attest.mjs +24 -0
  22. package/scripts/runkit-contract/runkit-cli.mjs +445 -52
  23. package/scripts/runkit-contract/schemas/candidate-transfer-packet-v1.schema.json +98 -0
  24. package/scripts/runkit-contract/schemas/formal-check-v2.schema.json +231 -0
  25. package/scripts/runkit-contract/schemas/formal-envelope-preflight-v1.schema.json +212 -0
  26. package/scripts/runkit-contract/schemas/formal-evidence-summary-v1.schema.json +114 -0
  27. package/scripts/runkit-contract/schemas/formal-supplemental-evidence-v1.schema.json +103 -0
  28. package/scripts/runkit-contract/schemas/team-acceptance-packet-v2.schema.json +109 -0
  29. package/scripts/runkit-contract/schemas/team-delivery-status-v1.schema.json +72 -0
  30. package/scripts/runkit-contract/schemas/team-packet-validation-v1.schema.json +33 -0
  31. package/scripts/runkit-contract/schemas/team-project-event-v5.schema.json +89 -0
  32. package/scripts/runkit-contract/schemas/team-project-status-v3.schema.json +173 -0
  33. package/scripts/runkit-contract/schemas/team-recommendation-v1.schema.json +121 -0
  34. package/scripts/runkit-contract/schemas/team-task-packet-v2.schema.json +228 -0
  35. package/scripts/runkit-contract/snapshot.mjs +125 -5
  36. package/scripts/runkit-contract/source-candidate.mjs +271 -69
  37. package/scripts/runkit-contract/sync-release-identity.mjs +39 -4
  38. package/scripts/runkit-contract/team-delivery.mjs +906 -0
  39. package/scripts/runkit-contract/team-project-successor.mjs +7 -4
  40. package/scripts/runkit-contract/team-project.mjs +440 -28
  41. package/scripts/runkit-contract/usage-mode.mjs +9 -3
  42. package/scripts/runkit-contract/verification-envelope.mjs +425 -37
@@ -0,0 +1,296 @@
1
+ # OwlRunKit 0.20 Team Delivery Phase 1 Product Decision
2
+
3
+ Date: 2026-08-13
4
+ Status: `source_candidate_implemented_and_verified / initial_read_only_dogfood_passed / owner_release_authorized / registry_publication_pending`
5
+
6
+ ## Decision
7
+
8
+ OwlRunKit 0.20 Phase 1 adds a read-only Team Delivery projection and portable
9
+ team packet contracts on top of the existing Project Driver. It does not add a
10
+ second task graph, start Agents, route vendors, dispatch work, or change Quick
11
+ or Formal assurance.
12
+
13
+ The product sequence is fixed:
14
+
15
+ 1. publish and stabilize 0.19.2;
16
+ 2. implement 0.20 Phase 1 as read-only recommendation plus native contracts;
17
+ 3. dogfood it in at least two real projects;
18
+ 4. only if measured net value is positive, ask the Owner whether opt-in assisted
19
+ dispatch should be designed.
20
+
21
+ Steps 1 and 2 are complete through a repository source candidate. Step 3 has
22
+ started with read-only recommendation and status projection; transfer and
23
+ acceptance value have not yet been proven through a complete live lifecycle.
24
+ The Owner separately authorized the 0.20 publication transition after the
25
+ initial read-only dogfood. That authorization does not pre-authorize assisted
26
+ dispatch, project adoption, deployment, production, business, funds, or any
27
+ other permission transition.
28
+
29
+ ## Current source-candidate evidence
30
+
31
+ - Focused Team Delivery and public-contract checks: 25 passed, 0 failed.
32
+ - Compatibility, CLI, project-local binding, and neighboring Formal checks:
33
+ 129 passed, 0 failed.
34
+ - Standalone pack, isolated install, initialization, Team packet validation,
35
+ and Quick attestation: 6 passed, 0 failed.
36
+ - Complete RunKit gate: 853 tests, 841 passed, 0 failed, 12 skipped.
37
+ - Root build and production dependency audit passed; the production audit
38
+ reported 0 vulnerabilities.
39
+ - Core, Skill candidate, package config, public attester, and distribution
40
+ manifest resolve to
41
+ `sha256:30098aa9344c17c1ed0b5ed45ef1c590b3214b824402f584029c1ecb38ca7a70`.
42
+
43
+ These facts establish a source candidate only. They do not establish dogfood
44
+ value, registry publication, project adoption, runtime activation, or release
45
+ authority.
46
+
47
+ ## Initial read-only dogfood
48
+
49
+ The candidate was run directly against current Project Driver truth without
50
+ installing or modifying either target project.
51
+
52
+ - OwlFootball had one actionable owned lane and one dependency-blocked future
53
+ lane. Recommendation: `off + project_driver`, assurance unchanged.
54
+ - The active Sierac MES control project had one actionable writer and several
55
+ dependency-blocked future lanes. Recommendation: `off + project_driver`,
56
+ assurance unchanged.
57
+ - A real Sierac MES parallel worktree had two simultaneously actionable,
58
+ disjoint, unassigned lanes. Recommendation: `team + project_driver_team`,
59
+ both lanes parallel-eligible, no path conflict, assurance unchanged.
60
+ - The first Team result exposed a self-referential `team status` next action.
61
+ The candidate was corrected so unassigned actionable lanes now point to
62
+ `project assign --help`; focused and complete gates were rerun afterward.
63
+ - For each directly tested project/worktree, the Project Driver tree
64
+ fingerprint and Git status fingerprint were byte-identical before and after.
65
+ Dispatch remained disabled and every authority field remained false.
66
+
67
+ This establishes correct initial admission and exit behavior. It does not yet
68
+ establish lower handoff time, candidate transfer value, independent acceptance
69
+ value, or eligibility for assisted dispatch.
70
+
71
+ ## Verified starting facts
72
+
73
+ - `owlrunkit@0.19.2` is published and exact-registry verified.
74
+ - Project Driver already owns durable WorkItems, dependencies, owned paths,
75
+ assignments, decisions, checkpoints, handoffs, rework, integration gates,
76
+ source delivery, takeover, and project truth hashing.
77
+ - Usage Mode already keeps continuity and assurance separate.
78
+ - Quick and Formal already own evidence strength; multi-Agent work does not by
79
+ itself imply Formal.
80
+ - The local `manage-agent-team` Skill contains useful operating policy, but it
81
+ is not available on every machine and is not an acceptable product runtime
82
+ dependency.
83
+ - Real dogfood shows Team coordination is useful for multiple writers,
84
+ independent acceptance, candidate transfer, and cross-session ownership; it
85
+ is negative value for ordinary single-owner closure.
86
+
87
+ ## Stable product model
88
+
89
+ Team Delivery adds one orthogonal dimension:
90
+
91
+ ```text
92
+ continuity none | project_driver
93
+ coordination none | team_delivery
94
+ assurance none | quick | formal
95
+ acceptance L0 | L1 | L2 | L3
96
+ authority always externally granted; never inferred by RunKit
97
+ ```
98
+
99
+ `team_delivery` is a read-only coordination recommendation in Phase 1. It is
100
+ not a continuity mode, assurance level, acceptance verdict, or authority.
101
+
102
+ Project Driver remains the sole active project and task truth. Team Delivery
103
+ may project WorkItems into lanes, but it cannot create a parallel team/task
104
+ database or reinterpret project events.
105
+
106
+ ## User-visible Phase 1 surface
107
+
108
+ ```text
109
+ npx --no-install owlrunkit team recommend --workspace "$PWD"
110
+ npx --no-install owlrunkit team status --workspace "$PWD"
111
+ npx --no-install owlrunkit team packet validate --workspace "$PWD" --packet <file>
112
+ ```
113
+
114
+ All commands are read-only and support `--json`. Human output is the default.
115
+ Every result includes the authority boundary and
116
+ `authorizationGranted=false`.
117
+
118
+ ### `team recommend`
119
+
120
+ The recommendation is derived only from current Project Driver truth:
121
+
122
+ - no initialized project, no ready work, or one ordinary ready WorkItem:
123
+ `off`;
124
+ - two or more simultaneously actionable WorkItems with disjoint owned paths:
125
+ `team`;
126
+ - overlapping owned paths: `team`, but parallel writing is blocked and the
127
+ unique next action is to revise ownership or serialize the lanes;
128
+ - a WorkItem in independent verification: `team`;
129
+ - a pending handoff, rework return, or live candidate ownership transfer:
130
+ `team`;
131
+ - multiple active owners: `team`.
132
+
133
+ The result explains trigger reasons, rejected lighter handling, projected
134
+ overhead, path conflicts, acceptance gaps, and one next command. It never
135
+ chooses a model vendor or starts an Agent.
136
+
137
+ ### `team status`
138
+
139
+ Status projects the current Project Driver into:
140
+
141
+ - current project identity and truth hash;
142
+ - incomplete lanes with current owner, dependencies, owned paths, and explicit
143
+ actionable state;
144
+ - which lanes may run concurrently;
145
+ - path conflicts;
146
+ - independent-acceptance gaps;
147
+ - handoff, rework, and source-delivery continuity facts;
148
+ - the current Team recommendation and unique coordination next action.
149
+
150
+ The next command must not loop back to `team status`. An unassigned actionable
151
+ lane points to assignment help, a path conflict points to immutable scope
152
+ revision help, an owner transition points to takeover help, and an already
153
+ owned Team candidate points to portable packet validation help.
154
+
155
+ It does not copy or persist a second task graph.
156
+
157
+ ### `team packet validate`
158
+
159
+ The validator accepts one bounded regular non-symlink JSON file, rejects
160
+ duplicate keys and extra fields, validates the native packet contract, and
161
+ binds project-aware packets to the current `projectId`, `projectTruthHash`,
162
+ WorkItem, and owned paths. Validation performs no packet creation or project
163
+ mutation.
164
+
165
+ ## Native portable contracts
166
+
167
+ Phase 1 publishes three strict Draft 2020-12 contracts and matching runtime
168
+ validators.
169
+
170
+ ### TeamTaskPacket V2
171
+
172
+ The task packet binds one Project Driver WorkItem and Gate. It carries:
173
+
174
+ - actual launcher-declared Agent, model family, and model version;
175
+ - risk axes and required acceptance level;
176
+ - exact worktree and candidate-entry identity;
177
+ - allowed and prohibited paths/actions;
178
+ - evidence plan, verification cadence, handoff requirement, escalation budget,
179
+ and exact stop point;
180
+ - project identity and project truth hash;
181
+ - an explicit all-false authority boundary.
182
+
183
+ Model family is opaque declared identity. Core does not contain Sol, Luna,
184
+ Grok, Kimi, capacity ratios, retries, or routing preferences.
185
+
186
+ ### TeamAcceptancePacket V2
187
+
188
+ The acceptance packet binds one Gate and candidate, records implementation and
189
+ verification identities, acceptance level, fresh adversarial families,
190
+ candidate identity before and after, evidence reuse, findings, verdict, and
191
+ remaining levels. Medium or high second-order risk cannot claim independent
192
+ acceptance when implementation and verification model families are equal.
193
+
194
+ `ACCEPT`, `REWORK`, and `BLOCKED` remain distinct. One packet accepts one Gate;
195
+ it does not grant the next external transition.
196
+
197
+ ### CandidateTransferPacket V1
198
+
199
+ The transfer packet preserves a live candidate across writer ownership change:
200
+
201
+ ```text
202
+ candidate_active
203
+ -> transfer_requested
204
+ -> packet_generated
205
+ -> new_owner_validation
206
+ -> handoff_ack
207
+ -> old_writer_release
208
+ ```
209
+
210
+ It binds candidate identity, dirty manifest, reconstruction sources, protected
211
+ artifacts, previous and next owner, verification state, and handoff ACK. A
212
+ packet at `old_writer_release` is invalid unless the new owner has accepted the
213
+ handoff with evidence. The packet does not itself assign Project Driver
214
+ authority or release the prior writer.
215
+
216
+ ## Admission and exit rules
217
+
218
+ Team Mode is recommended only when coordination changes the outcome or critical
219
+ path. Parallelism being possible is insufficient.
220
+
221
+ The recommendation must explicitly exit Team Mode for a single authorized
222
+ owner with a bounded, reversible, directly verifiable task. Production or
223
+ release labels alone do not force Team Mode. Long duration alone selects
224
+ continuity, not coordination. Multiple Agents alone do not force Formal.
225
+
226
+ Path conflict does not authorize parallel writers. It creates a visible
227
+ coordination blocker.
228
+
229
+ ## Acceptance scenarios
230
+
231
+ 1. No Project Driver definition returns `off`, zero lanes, no dispatch, and no
232
+ authority.
233
+ 2. One ordinary ready WorkItem returns `off` even though Project Driver exists.
234
+ 3. Two independent ready WorkItems with disjoint owned paths return `team` and
235
+ both lanes are parallel-eligible.
236
+ 4. Two actionable WorkItems with overlapping owned paths return `team`, expose
237
+ the exact conflict, and mark both lanes non-parallel.
238
+ 5. Independent verification, pending handoff/rework, candidate transfer, or
239
+ multiple active owners recommends `team` without changing assurance.
240
+ 6. `team recommend`, `team status`, and packet validation write zero project,
241
+ source, Git, or RunKit bytes.
242
+ 7. A valid TeamTaskPacket is bound to the current Project Driver WorkItem and
243
+ owned paths; stale project truth or widened scope is rejected.
244
+ 8. Same-family verification at medium/high second-order risk cannot claim
245
+ independent acceptance.
246
+ 9. Candidate transfer cannot reach `old_writer_release` before accepted
247
+ handoff ACK with evidence.
248
+ 10. Packet schemas and runtime validators reject missing, extra, duplicate-key,
249
+ authority-looking, and malformed identity fields consistently.
250
+ 11. Installed-package help, CLI JSON, public schemas, Core manifest, and the
251
+ Skill describe the same Phase 1 surface without requiring the local
252
+ `manage-agent-team` Skill.
253
+ 12. No output authorizes Git, release, deployment, production, business,
254
+ automation, money, credentials, or Agent dispatch.
255
+
256
+ ## Phase 1 non-goals
257
+
258
+ - no automatic or assisted Agent launch;
259
+ - no vendor CLI federation or general swarm;
260
+ - no model ranking, scorecard, capacity allocation, retry policy, or
261
+ model-specific prompt logic in Core;
262
+ - no second project/task graph;
263
+ - no packet generator that silently assigns ownership;
264
+ - no new Quick or Formal Gate;
265
+ - no replacement for COM-019 or any domain product decision;
266
+ - no 0.20 publication claim before a separately verified release transition.
267
+
268
+ ## Dogfood Gate before assisted dispatch
269
+
270
+ At least two real projects must demonstrate all of the following:
271
+
272
+ - ordinary single-owner work reliably exits Team Mode;
273
+ - multiple writers and independent acceptance produce correct lanes, path
274
+ conflicts, and independence gaps;
275
+ - a machine without the local Skill can validate and continue from the npm
276
+ package and self-contained packets;
277
+ - writer transfer preserves the candidate through ACK;
278
+ - measured handoff time, controller intervention, or duplicate verification
279
+ decreases;
280
+ - the benefit is not merely more packets or receipts.
281
+
282
+ Only after these facts exist may the Owner decide whether to design opt-in
283
+ assisted dispatch. General automatic federation remains a separate product and
284
+ authority decision.
285
+
286
+ ## What cannot be claimed now
287
+
288
+ - 0.20 has not completed transfer or independent-acceptance dogfood and has not
289
+ yet been committed, tagged, registry-published, adopted, or made active;
290
+ source-candidate verification is not registry publication proof.
291
+ - Team Delivery does not dispatch or supervise Agents.
292
+ - The local Skill is not part of the product runtime contract.
293
+ - Team recommendation is not acceptance or authority.
294
+ - Phase 1 is not the selected COM-019 Primary AI Value Loop.
295
+ - No business, production, deployment, or release outcome follows from this
296
+ product decision.
@@ -7,11 +7,13 @@ 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 release: standalone `owlrunkit@0.19.1`, bundling Contract `0.2` and
11
- Core `0.19.1` with manifest
12
- `sha256:291ef97c93a513eed24a29f75c400b61cefd6a8c0ab228401cf2c6a73ea9e622`.
13
- The published `owlrunkit@0.19.0` package is the trusted prior for rollback;
14
- verify exact official npm registry provenance before adoption. The immutable
10
+ Bundled candidate: standalone `owlrunkit@0.20.0`, bundling Contract `0.2` and
11
+ Core `0.20.0` with manifest
12
+ `sha256:30098aa9344c17c1ed0b5ed45ef1c590b3214b824402f584029c1ecb38ca7a70`.
13
+ This candidate is not published. The current published release remains
14
+ `owlrunkit@0.19.2`, which is the trusted prior for rollback and the only
15
+ registry-installable version named by this Skill before publication. Verify
16
+ exact official npm registry provenance before adoption. The immutable
15
17
  rollback baseline for the prior release is `owlrunkit@0.16.1` with SHA-1
16
18
  `1bc119d24879bdd8959af16b364af55ca9d61ea9` and canonical npm tarball URL
17
19
  `https://registry.npmjs.org/owlrunkit/-/owlrunkit-0.16.1.tgz`.
@@ -19,6 +21,28 @@ The root `owlcoda` package has a separate version lifecycle.
19
21
 
20
22
  The session is an execution interface. Project artifacts are the system of record.
21
23
 
24
+ ## Team Delivery Phase 1
25
+
26
+ Use Team Delivery only when current Project Driver facts make coordination
27
+ material. It is a read-only projection, not a second graph or an Agent launcher.
28
+
29
+ ```bash
30
+ npx --no-install owlrunkit team recommend --workspace "$PROJECT_ROOT"
31
+ npx --no-install owlrunkit team status --workspace "$PROJECT_ROOT"
32
+ npx --no-install owlrunkit team packet validate --workspace "$PROJECT_ROOT" \
33
+ --packet /absolute/path/to/team-packet.json
34
+ ```
35
+
36
+ An uninitialized project, no actionable work, or one ordinary ready WorkItem
37
+ must remain off. Disjoint actionable lanes may be parallel-eligible; overlapping
38
+ owned paths must block parallel writing. Independent verification, handoff,
39
+ rework, candidate transfer, or multiple active owners may recommend Team without
40
+ changing assurance. TeamTaskPacket V2, TeamAcceptancePacket V2, and
41
+ CandidateTransferPacket V1 are package-owned portable contracts. Do not depend
42
+ on a user-level `manage-agent-team` Skill at runtime. Core does not choose model
43
+ vendors, score Agents, start tasks, or grant Git, release, deployment,
44
+ production, business, automation, or money authority.
45
+
22
46
  ## Project Driver actions
23
47
 
24
48
  Translate ordinary user requests into durable typed project actions. Do not ask
@@ -26,7 +50,8 @@ the user to operate the CLI when the request and authority are already clear.
26
50
 
27
51
  The normal mainline is `init`, `assign`, `checkpoint`, `handoff`,
28
52
  `reject-and-return`, `decision`, `verification`, `integrate`, `status`, and
29
- `takeover`. External source lanes use `target-snapshot` and `import-delivery`
53
+ `takeover`. A diagnosed WorkItem scope change uses append-only `work-item
54
+ revise-scope`. External source lanes use `target-snapshot` and `import-delivery`
30
55
  without installing RunKit or writing control artifacts into the frozen target.
31
56
  After a project
32
57
  derives completed, `successor` is the bounded lifecycle step. `init` accepts one project definition
@@ -43,6 +68,10 @@ remains available for existing automation and compatibility.
43
68
  - "I decided ...": append a decision resolution with rationale and evidence.
44
69
  - "Hand this to another Agent": append the handoff, then a successor assignment;
45
70
  never overwrite the old assignment.
71
+ - "The diagnosis changed this WorkItem's paths or measurable contract": append
72
+ one `project work-item revise-scope` event bound to the current assignment and
73
+ owner. Never edit the project definition or treat an older checkpoint as
74
+ completion evidence for the revised scope.
46
75
  - "Reject this failed candidate and return it": use one `project
47
76
  reject-and-return` event. Preserve the failed checkpoint, bind the review
48
77
  evidence, create the rework assignment, and never rewrite failure as active.
@@ -71,11 +100,19 @@ remains available for existing automation and compatibility.
71
100
  underlying risk; bind a Formal WorkItem to its actual execution and lease when
72
101
  applicable. Multi-Agent coordination, long duration, or interruption recovery
73
102
  alone does not select Formal.
103
+ - "Everything in the ledger is complete": report
104
+ `code_complete_without_release_authority` unless a separate external actor has
105
+ granted the relevant Git/release/deploy authority. Never translate
106
+ `overall=completed` into product activation or `next: none`.
74
107
 
75
108
  For a multi-Agent project, checkpoint meaningful state changes promptly. A
76
109
  checkpoint is not a heartbeat and must not contain a guessed percentage.
77
110
  Completion requires evidence. If an assignment binds an execution, derive its
78
111
  state from the closeout and lease rather than trusting the Agent's claim.
112
+ Before entering `verifying`, hand off and supersede the implementation assignment
113
+ with a different Agent. If a verifying/completed checkpoint has no recognizable
114
+ Quick/Formal receipt reference, preserve the checkpoint but report
115
+ `no_bound_verification_receipt`; do not claim that a mere reference was attested.
79
116
 
80
117
  ```bash
81
118
  npx --no-install owlrunkit project init --workspace "$PROJECT_ROOT" --definition "$PROJECT_JSON"
@@ -92,6 +129,11 @@ npx --no-install owlrunkit project reject-and-return --workspace "$PROJECT_ROOT"
92
129
  --rework-id "$REWORK_ID" --at "$OCCURRED_AT" --work-item "$WORK_ITEM_ID" \
93
130
  --reviewer-agent "$REVIEWER_AGENT_ID" --to-agent "$AGENT_ID" \
94
131
  --reason "$REJECTION_REASON" --next "$NEXT_ACTION" --evidence "$EVIDENCE_REF"
132
+ npx --no-install owlrunkit project work-item revise-scope --workspace "$PROJECT_ROOT" \
133
+ --revision-id "$REVISION_ID" --at "$OCCURRED_AT" \
134
+ --assignment-id "$ASSIGNMENT_ID" --work-item "$WORK_ITEM_ID" \
135
+ --owner-agent "$AGENT_ID" --owned-path "$OWNED_PATH" \
136
+ --reason "$SCOPE_REASON" --evidence "$EVIDENCE_REF"
95
137
  npx --no-install owlrunkit project decision --workspace "$PROJECT_ROOT" --resolve \
96
138
  --decision-id "$DECISION_ID" --at "$OCCURRED_AT" --resolution "$RESOLUTION" \
97
139
  --rationale "$RATIONALE" --evidence "$EVIDENCE_REF"
@@ -191,9 +233,9 @@ below has no CLI entry.
191
233
 
192
234
  ```bash
193
235
  npx --no-install owlrunkit bootstrap --workspace "$PROJECT_ROOT" \
194
- --exact owlrunkit@0.19.1 --dry-run
236
+ --exact owlrunkit@0.19.2 --dry-run
195
237
  npx --no-install owlrunkit bootstrap --workspace "$PROJECT_ROOT" \
196
- --exact owlrunkit@0.19.1 --apply
238
+ --exact owlrunkit@0.19.2 --apply
197
239
  npx --no-install owlrunkit init --workspace "$PROJECT_ROOT"
198
240
  npx --no-install owlrunkit inspect --json --workspace "$PROJECT_ROOT"
199
241
  npx --no-install owlrunkit status --workspace "$PROJECT_ROOT"
@@ -502,6 +544,9 @@ Formal accepted evidence admits the built-in Node syntax check and real project
502
544
  commands executed through a Verification Envelope:
503
545
 
504
546
  ```bash
547
+ npx --no-install owlrunkit formal preflight \
548
+ --workspace "$PROJECT_ROOT" --envelope "$VERIFICATION_ENVELOPE_JSON"
549
+
505
550
  npx --no-install owlrunkit formal check \
506
551
  --workspace "$PROJECT_ROOT" --run-id "$RUN_ID" \
507
552
  --work-item "$WORK_ITEM_ID" --check-id "$CHECK_ID" \
@@ -517,10 +562,30 @@ command optimistically. The public 0.17 package provides the enforced macOS
517
562
  backend; Linux remains fail-closed. Legacy `verify` may capture evidence but
518
563
  must not be silently promoted into this Formal path.
519
564
 
565
+ When a required project check cannot run inside the envelope, run it through
566
+ Quick against the same frozen source and attach the fully attested receipt:
567
+
568
+ ```bash
569
+ npx --no-install owlrunkit formal attach-evidence \
570
+ --workspace "$PROJECT_ROOT" --run-id "$RUN_ID" \
571
+ --evidence-id "$EVIDENCE_ID" --kind supplemental-local \
572
+ --receipt "$QUICK_RECEIPT_JSON"
573
+ ```
574
+
575
+ Use `networked` instead of `supplemental-local` only when the attached command
576
+ used network access. This classification is operator-declared and not attested
577
+ by Quick Receipt V3, so artifacts expose
578
+ `classificationBasis=operator_declared_not_attested`. Supplemental evidence
579
+ remains non-gating: its receipt and materials are re-attested and summarized by
580
+ an accepted `formal finish`, but it never substitutes for a passed Formal-eligible check or
581
+ grants Git, release, deployment, or business authority.
582
+
520
583
  ## Freeze a dirty SourceCandidateV2
521
584
 
522
585
  Freeze, verify and materialize an immutable candidate without requiring a Git
523
- commit:
586
+ commit. SourceCandidateV2 documents are limited to 64 MiB and 2,000,000 JSON
587
+ values; producer and reader enforce the same bound before candidate payload or
588
+ document writes.
524
589
 
525
590
  ```bash
526
591
  npx --no-install owlrunkit candidate freeze --workspace "$PROJECT_ROOT" \
@@ -2,9 +2,9 @@
2
2
  "schemaVersion": "OwlCodaRunKitConfigV2",
3
3
  "core": {
4
4
  "contractVersion": "0.2",
5
- "coreVersion": "0.19.1",
6
- "coreManifestSha256": "sha256:291ef97c93a513eed24a29f75c400b61cefd6a8c0ab228401cf2c6a73ea9e622",
7
- "coreSourceRef": "artifact:sha256:291ef97c93a513eed24a29f75c400b61cefd6a8c0ab228401cf2c6a73ea9e622"
5
+ "coreVersion": "0.20.0",
6
+ "coreManifestSha256": "sha256:30098aa9344c17c1ed0b5ed45ef1c590b3214b824402f584029c1ecb38ca7a70",
7
+ "coreSourceRef": "artifact:sha256:30098aa9344c17c1ed0b5ed45ef1c590b3214b824402f584029c1ecb38ca7a70"
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.19.1",
3
+ "version": "0.20.0",
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>",
@@ -39,6 +39,16 @@
39
39
  "sha256": "sha256:3972dc9744f6499f0f9b2dbf76696f2ae7ad8af9b23dde66d6af86c9dfb36986"
40
40
  },
41
41
  "supportedProducerCoreIdentities": [
42
+ {
43
+ "contractVersion": "0.2",
44
+ "coreVersion": "0.20.0",
45
+ "coreManifestSha256": "sha256:30098aa9344c17c1ed0b5ed45ef1c590b3214b824402f584029c1ecb38ca7a70"
46
+ },
47
+ {
48
+ "contractVersion": "0.2",
49
+ "coreVersion": "0.19.2",
50
+ "coreManifestSha256": "sha256:c46ae9d8ed0572e5636ab5725f922f8db3ee5bf0f966b200bce7b2287c9267c8"
51
+ },
42
52
  {
43
53
  "contractVersion": "0.2",
44
54
  "coreVersion": "0.19.1",
@@ -19,6 +19,16 @@ import { captureWorkspaceSnapshot } from "./workspace-snapshot.mjs";
19
19
  export { validQuickReceiptShape } from "./quick-receipt-contract.mjs";
20
20
 
21
21
  export const SUPPORTED_QUICK_CORE_IDENTITIES = Object.freeze([
22
+ {
23
+ contractVersion: "0.2",
24
+ coreVersion: "0.20.0",
25
+ coreManifestSha256: "sha256:30098aa9344c17c1ed0b5ed45ef1c590b3214b824402f584029c1ecb38ca7a70",
26
+ },
27
+ {
28
+ contractVersion: "0.2",
29
+ coreVersion: "0.19.2",
30
+ coreManifestSha256: "sha256:c46ae9d8ed0572e5636ab5725f922f8db3ee5bf0f966b200bce7b2287c9267c8",
31
+ },
22
32
  {
23
33
  contractVersion: "0.2",
24
34
  coreVersion: "0.19.1",
@@ -134,7 +144,7 @@ export const SUPPORTED_QUICK_CORE_IDENTITIES = Object.freeze([
134
144
  coreVersion: "0.13.0",
135
145
  coreManifestSha256: "sha256:0455c847bf2df77703583c6f19c20cf103206bafc4f122795bf34d3f85f0263d",
136
146
  },
137
- ]);
147
+ ].map(identity => Object.freeze(identity)));
138
148
 
139
149
  function dependencyEnvironmentCurrent(binding, materials) {
140
150
  if (binding === null || binding === undefined) return true;
@@ -211,11 +221,11 @@ function resultTemplate({ receipt, receiptPath, receiptSha256, decision, issues,
211
221
  };
212
222
  }
213
223
 
214
- export function attestQuickReceiptDetailsFromBytes({
224
+ function attestQuickReceiptDetailsFromBytesWithCatalog({
215
225
  receiptPath,
216
226
  receiptBytes,
217
227
  workspaceRoot,
218
- }) {
228
+ }, supportedCoreIdentities) {
219
229
  const absoluteReceiptPath = resolveRegularFilePath(receiptPath);
220
230
  let receipt;
221
231
  try {
@@ -241,7 +251,7 @@ export function attestQuickReceiptDetailsFromBytes({
241
251
  let materialMissing = false;
242
252
  let materialMismatch = false;
243
253
 
244
- const coreValid = SUPPORTED_QUICK_CORE_IDENTITIES.some((core) =>
254
+ const coreValid = supportedCoreIdentities.some((core) =>
245
255
  receipt.coreIdentity.contractVersion === core.contractVersion
246
256
  && receipt.coreIdentity.coreVersion === core.coreVersion
247
257
  && receipt.coreIdentity.coreManifestSha256 === core.coreManifestSha256);
@@ -375,6 +385,34 @@ export function attestQuickReceiptDetailsFromBytes({
375
385
  };
376
386
  }
377
387
 
388
+ export function attestQuickReceiptDetailsFromBytes(options) {
389
+ return attestQuickReceiptDetailsFromBytesWithCatalog(
390
+ options,
391
+ SUPPORTED_QUICK_CORE_IDENTITIES,
392
+ );
393
+ }
394
+
395
+ export function attestQuickReceiptDetailsFromBytesWithCoreCatalog(
396
+ options,
397
+ supportedCoreIdentities,
398
+ ) {
399
+ if (
400
+ !Array.isArray(supportedCoreIdentities)
401
+ || supportedCoreIdentities.length === 0
402
+ || supportedCoreIdentities.some((identity) => (
403
+ identity?.contractVersion !== "0.2"
404
+ || typeof identity?.coreVersion !== "string"
405
+ || !/^sha256:[a-f0-9]{64}$/u.test(identity?.coreManifestSha256 ?? "")
406
+ ))
407
+ ) {
408
+ throw new Error("trusted Quick Core catalog is invalid");
409
+ }
410
+ return attestQuickReceiptDetailsFromBytesWithCatalog(
411
+ options,
412
+ supportedCoreIdentities,
413
+ );
414
+ }
415
+
378
416
  export function attestQuickReceiptDetails({ receiptPath, workspaceRoot }) {
379
417
  const { absolutePath, bytes } = readFileBytesBounded(receiptPath);
380
418
  return attestQuickReceiptDetailsFromBytes({
@@ -2,7 +2,7 @@
2
2
  "schemaVersion": "OwlCodaRunKitRegistryReleasePolicyV1",
3
3
  "status": "release_candidate_unpublished",
4
4
  "packageName": "owlrunkit",
5
- "candidateVersion": "0.19.1",
5
+ "candidateVersion": "0.20.0",
6
6
  "registry": "https://registry.npmjs.org",
7
7
  "registryRequiredBeforeAdoption": true,
8
8
  "exactVersionRequired": true,
@@ -23,10 +23,10 @@
23
23
  ],
24
24
  "currentPublishedRelease": {
25
25
  "packageName": "owlrunkit",
26
- "version": "0.19.0",
27
- "shasum": "83d156554924e2e1c58d972e1c7d31262bddb186",
28
- "integrity": "sha512-edtzE58ShWEM4C0IpHJQiu2h0kKBSprU+LjaZNsXTXObeVZlGuAxZXkD7Jn6chMk3mpCidOf4VtA1/an+EZNWw==",
29
- "tarballUrl": "https://registry.npmjs.org/owlrunkit/-/owlrunkit-0.19.0.tgz"
26
+ "version": "0.19.2",
27
+ "shasum": "f9b0f797fe9f79878374380db0756223accd61dc",
28
+ "integrity": "sha512-rFEnbOtPuybztz8EZbcQSY3tGycCAuTkg+qGDwcKaTPjdJRhsXS4OB2HLwDBiILIV6BFyRPSQ7zanObT4jd58g==",
29
+ "tarballUrl": "https://registry.npmjs.org/owlrunkit/-/owlrunkit-0.19.2.tgz"
30
30
  },
31
31
  "registryRelease": null,
32
32
  "registryEvidenceMustBeExternal": true,
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.19.1",
6
- "documentNamespace": "https://owlcoda.com/spdx/owlrunkit/0.19.1",
5
+ "name": "owlrunkit-0.20.0",
6
+ "documentNamespace": "https://owlcoda.com/spdx/owlrunkit/0.20.0",
7
7
  "creationInfo": {
8
8
  "created": "2026-07-29T00:00:00Z",
9
9
  "creators": [
@@ -14,8 +14,8 @@
14
14
  {
15
15
  "name": "owlrunkit",
16
16
  "SPDXID": "SPDXRef-Package-OwlRunKit",
17
- "versionInfo": "0.19.1",
18
- "downloadLocation": "https://registry.npmjs.org/owlrunkit/-/owlrunkit-0.19.1.tgz",
17
+ "versionInfo": "0.20.0",
18
+ "downloadLocation": "NOASSERTION",
19
19
  "filesAnalyzed": false,
20
20
  "licenseConcluded": "GPL-3.0-or-later",
21
21
  "licenseDeclared": "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.19.1"
27
+ "referenceLocator": "pkg:npm/owlrunkit@0.20.0"
28
28
  }
29
29
  ]
30
30
  }