owlrunkit 0.19.0 → 0.19.2
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 +48 -0
- package/README.md +81 -3
- package/docs/architecture/OWLCODA_RUNKIT_0190_CONSOLIDATED_DAILY_USE_PRODUCT_DECISION_20260812.md +12 -9
- package/docs/architecture/OWLCODA_RUNKIT_0191_PROFILE_RECONCILE_PATCH_PRODUCT_DECISION_20260813.md +36 -0
- package/docs/architecture/OWLCODA_RUNKIT_0192_FORMAL_USABILITY_PRODUCT_DECISION_20260813.md +141 -0
- package/integrations/codex/skills/owlcoda-runkit/SKILL.md +52 -9
- package/integrations/codex/skills/owlcoda-runkit/assets/templates/config.json +3 -3
- package/package.json +1 -1
- package/packages/attest/distribution-manifest-v1.json +10 -0
- package/packages/attest/src/quick.mjs +42 -4
- package/registry-release-policy-v1.json +5 -5
- package/sbom.spdx.json +5 -5
- package/scripts/runkit-contract/core-contract.mjs +35 -2
- package/scripts/runkit-contract/efficiency-metrics.mjs +9 -7
- package/scripts/runkit-contract/formal-preflight.mjs +352 -0
- package/scripts/runkit-contract/formal-supplemental-evidence.mjs +713 -0
- package/scripts/runkit-contract/formal-workflow.mjs +529 -59
- package/scripts/runkit-contract/onboarding-doctor.mjs +32 -13
- package/scripts/runkit-contract/profile-onboarding.mjs +52 -33
- package/scripts/runkit-contract/project-cli-resolver.mjs +33 -3
- package/scripts/runkit-contract/project-external-delivery.mjs +16 -9
- package/scripts/runkit-contract/quick-attest.mjs +24 -0
- package/scripts/runkit-contract/runkit-cli.mjs +365 -49
- package/scripts/runkit-contract/schemas/formal-check-v2.schema.json +231 -0
- package/scripts/runkit-contract/schemas/formal-envelope-preflight-v1.schema.json +212 -0
- package/scripts/runkit-contract/schemas/formal-evidence-summary-v1.schema.json +114 -0
- package/scripts/runkit-contract/schemas/formal-supplemental-evidence-v1.schema.json +103 -0
- package/scripts/runkit-contract/schemas/team-project-event-v5.schema.json +89 -0
- package/scripts/runkit-contract/schemas/team-project-status-v3.schema.json +173 -0
- package/scripts/runkit-contract/snapshot.mjs +125 -5
- package/scripts/runkit-contract/source-candidate.mjs +271 -69
- package/scripts/runkit-contract/sync-release-identity.mjs +39 -4
- package/scripts/runkit-contract/team-project-successor.mjs +7 -4
- package/scripts/runkit-contract/team-project.mjs +440 -28
- package/scripts/runkit-contract/usage-mode.mjs +9 -3
- package/scripts/runkit-contract/verification-envelope.mjs +425 -37
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,53 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.19.2
|
|
4
|
+
|
|
5
|
+
- Adds read-only `formal preflight` and reuses it before an envelope-backed
|
|
6
|
+
Formal check writes candidate or evidence artifacts. It reports enforcement
|
|
7
|
+
backend, package-script subprocesses, protected `.owlcoda/runkit/` scan
|
|
8
|
+
conflicts, temporary-directory needs, device paths, and actionable repairs.
|
|
9
|
+
- Adds Formal Check V2 failure taxonomy for source failures, missing envelope
|
|
10
|
+
capability, unresolved toolchains, and backend-proven network denial while
|
|
11
|
+
preserving the existing Formal Check V1 contract. Classification uses
|
|
12
|
+
trusted runner facts, never command-authored stdout or stderr; the current
|
|
13
|
+
backend conservatively leaves unproven network causes as source failures.
|
|
14
|
+
- Adds `formal attach-evidence` for fully attested, source-bound
|
|
15
|
+
`supplemental-local` or `networked` Quick evidence and a deterministic finish
|
|
16
|
+
summary. The environment classification is explicitly operator-declared and
|
|
17
|
+
not attested by Quick Receipt V3. Supplemental evidence is always non-gating
|
|
18
|
+
and cannot replace a Formal-eligible passed check.
|
|
19
|
+
- Re-attests supplemental receipt and material bytes at accepted finish, excludes stale
|
|
20
|
+
candidate attachments, rejects symlinked evidence roots, and preserves exact
|
|
21
|
+
resume semantics for the evidence summary.
|
|
22
|
+
- Completes action-specific Formal and Project Driver help for supported
|
|
23
|
+
options without changing Git, release, deployment, production, or business
|
|
24
|
+
authority boundaries.
|
|
25
|
+
- Adds Project Status and Takeover V3 so `overall=completed` means only that the
|
|
26
|
+
WorkItem ledger is complete. Without separate authority the visible delivery
|
|
27
|
+
disposition is `code_complete_without_release_authority`, the dominant gap is
|
|
28
|
+
`release_authority`, and the next action is never silently `none`.
|
|
29
|
+
- Requires a different assigned Agent before a WorkItem enters `verifying`,
|
|
30
|
+
warns when verifying/completed checkpoints lack a Quick or Formal receipt
|
|
31
|
+
reference, and keeps an initialized Project Driver in managed continuity when
|
|
32
|
+
auto mode would otherwise recommend off.
|
|
33
|
+
- Adds append-only Project Event V5 and `project work-item revise-scope` for
|
|
34
|
+
superseding owned paths or measurable units without rewriting the project
|
|
35
|
+
definition or allowing old checkpoints to prove the revised scope.
|
|
36
|
+
- Accepts ISO-8601 UTC timestamps with seconds or up to three fractional digits
|
|
37
|
+
and stores canonical millisecond timestamps. Passed-gate defer errors now
|
|
38
|
+
identify the successor/new-gate correction path.
|
|
39
|
+
|
|
40
|
+
## 0.19.1
|
|
41
|
+
|
|
42
|
+
- Fixes profile reconciliation for mature projects where an existing profile
|
|
43
|
+
already owns command IDs such as `npm-build` or `npm-test`. When those
|
|
44
|
+
detected commands have one existing owner, reconciliation extends that owner
|
|
45
|
+
with the detected paths and current authoritative command definitions instead
|
|
46
|
+
of creating an invalid duplicate-command profile.
|
|
47
|
+
- Preserves create-only receipts, atomic rollback, strict profile validation,
|
|
48
|
+
project-local CLI binding, `authorizationGranted=false`, and the separate
|
|
49
|
+
fleet/shared Skill activation gate.
|
|
50
|
+
|
|
3
51
|
## 0.19.0
|
|
4
52
|
|
|
5
53
|
- Adds `bootstrap --dry-run|--apply` as one exact-registry, project-local,
|
package/README.md
CHANGED
|
@@ -45,6 +45,28 @@ transfer actions, business-layer outcome projection, and local efficiency
|
|
|
45
45
|
metrics. These conveniences do not weaken Formal routing or grant Git,
|
|
46
46
|
release, deployment, production, or business authority.
|
|
47
47
|
|
|
48
|
+
RunKit 0.19.1 fixes mature-project onboarding when an existing owner profile
|
|
49
|
+
already owns command IDs proposed by detection. Reconciliation now extends that
|
|
50
|
+
sole command owner with the newly detected paths and authoritative command
|
|
51
|
+
binding instead of creating a second profile with duplicate IDs. Existing
|
|
52
|
+
owner profiles, strict validation, atomic rollback, and shared-Skill activation
|
|
53
|
+
boundaries remain unchanged.
|
|
54
|
+
|
|
55
|
+
RunKit 0.19.2 makes Formal Delivery easier to configure without weakening its
|
|
56
|
+
sandbox. A read-only envelope preflight reports known backend, subprocess,
|
|
57
|
+
temporary-directory, device-path, and protected runtime-root conflicts before
|
|
58
|
+
candidate evidence is written. Failed envelope checks receive typed failure
|
|
59
|
+
categories. Fully attested Quick receipts may be attached as source-bound
|
|
60
|
+
`supplemental-local` or `networked` evidence, but remain explicitly non-gating
|
|
61
|
+
and can never replace a Formal-eligible passed check.
|
|
62
|
+
|
|
63
|
+
The same candidate makes Project Driver completion honest: a completed
|
|
64
|
+
WorkItem ledger without separate Git/release/deploy authority is visibly
|
|
65
|
+
`code_complete_without_release_authority`, not a product-finished `next: none`.
|
|
66
|
+
Independent verification requires a different assigned Agent. Append-only
|
|
67
|
+
scope revision can widen or narrow a WorkItem after diagnosis without rewriting
|
|
68
|
+
history, and missing Quick/Formal receipt references remain visible warnings.
|
|
69
|
+
|
|
48
70
|
The 0.18 Project Driver is a bounded surface for new projects and controlled
|
|
49
71
|
dogfood. Its product name does not claim to be a general long-running,
|
|
50
72
|
multi-phase, or enterprise control plane. Version 0.18 adds one bounded
|
|
@@ -58,8 +80,13 @@ separate authority boundaries.
|
|
|
58
80
|
|
|
59
81
|
## Install
|
|
60
82
|
|
|
83
|
+
`owlrunkit@0.19.2` is an unpublished release candidate. Until registry
|
|
84
|
+
publication is independently verified, the current installable release is
|
|
85
|
+
`owlrunkit@0.19.1`; a locally packed 0.19.2 tarball is for candidate testing
|
|
86
|
+
only and is not adoption provenance.
|
|
87
|
+
|
|
61
88
|
```bash
|
|
62
|
-
npm install --save-exact owlrunkit@0.19.
|
|
89
|
+
npm install --save-exact owlrunkit@0.19.1
|
|
63
90
|
```
|
|
64
91
|
|
|
65
92
|
Use `npx --no-install owlrunkit` for project commands. The package bootstrap
|
|
@@ -75,9 +102,9 @@ the project Config must independently bind the same Core.
|
|
|
75
102
|
```bash
|
|
76
103
|
npx --no-install owlrunkit --version
|
|
77
104
|
npx --no-install owlrunkit bootstrap --workspace /absolute/path/to/project \
|
|
78
|
-
--exact owlrunkit@0.19.
|
|
105
|
+
--exact owlrunkit@0.19.1 --dry-run
|
|
79
106
|
npx --no-install owlrunkit bootstrap --workspace /absolute/path/to/project \
|
|
80
|
-
--exact owlrunkit@0.19.
|
|
107
|
+
--exact owlrunkit@0.19.1 --apply
|
|
81
108
|
npx --no-install owlrunkit init --workspace /absolute/path/to/project
|
|
82
109
|
npx --no-install owlrunkit doctor --workspace /absolute/path/to/project
|
|
83
110
|
npx --no-install owlrunkit mode recommend --workspace /absolute/path/to/project
|
|
@@ -130,6 +157,13 @@ npx --no-install owlrunkit project reject-and-return --workspace . --rework-id r
|
|
|
130
157
|
npx --no-install owlrunkit project assign --workspace . --assignment-id assign-2 \
|
|
131
158
|
--at 2026-08-09T00:11:00.000Z --work-item work-item-1 \
|
|
132
159
|
--agent agent-successor --supersedes assign-1
|
|
160
|
+
npx --no-install owlrunkit project work-item revise-scope --workspace . \
|
|
161
|
+
--revision-id scope-1 --at 2026-08-09T00:11:30Z \
|
|
162
|
+
--assignment-id assign-2 --work-item work-item-1 --owner-agent agent-successor \
|
|
163
|
+
--owned-path 'src/adapter/**' --owned-path 'src/canonical-store/**' \
|
|
164
|
+
--measurable-unit interface --measurable-total 2 \
|
|
165
|
+
--reason 'Diagnosis proved the canonical store is part of this bounded fix' \
|
|
166
|
+
--evidence evidence/scope-decision.txt
|
|
133
167
|
npx --no-install owlrunkit project decision --workspace . --open --decision-id decision-1 \
|
|
134
168
|
--at 2026-08-09T00:12:00.000Z --title 'Choose the accepted source path' \
|
|
135
169
|
--question 'Which source path should continue?' --owner-agent agent-successor \
|
|
@@ -171,6 +205,19 @@ by itself. The assurance lane follows actual writer and authority count,
|
|
|
171
205
|
rollback certainty, permissions, security, funds, irreversibility, schema/data
|
|
172
206
|
migration, and explicit acceptance contracts—not environment labels alone.
|
|
173
207
|
|
|
208
|
+
`project checkpoint --state verifying` requires the current assignment to have
|
|
209
|
+
been superseded by a different Agent. This turns independent verification into
|
|
210
|
+
a mechanical project invariant without forcing Formal. A verifying or completed
|
|
211
|
+
checkpoint that does not reference a recognizable Quick/Formal receipt remains
|
|
212
|
+
valid project truth but receives `no_bound_verification_receipt`; the warning is
|
|
213
|
+
about the missing bound reference and does not attest any referenced receipt.
|
|
214
|
+
|
|
215
|
+
`project work-item revise-scope` appends Event V5 and never rewrites the original
|
|
216
|
+
definition. It must bind the current assignment and owner, records the previous
|
|
217
|
+
and new paths/measurable contract, and invalidates older checkpoints for progress
|
|
218
|
+
projection. Repeating the exact revision is idempotent; changing an existing
|
|
219
|
+
revision fails closed.
|
|
220
|
+
|
|
174
221
|
`project reject-and-return` applies only to the current explicit failed
|
|
175
222
|
checkpoint. One Event V2 atomically binds that failure, its prior assignment,
|
|
176
223
|
the reviewer, evidence, target Agent, and new assignment. The failed checkpoint
|
|
@@ -255,6 +302,12 @@ WorkItem. An assignment may bind an exact RunKit execution and lease; in that
|
|
|
255
302
|
case, the WorkItem cannot complete until the execution has a trusted accepted
|
|
256
303
|
closeout and its lease is released.
|
|
257
304
|
|
|
305
|
+
In Status/Takeover V3, `overall=completed` is explicitly the WorkItem-ledger
|
|
306
|
+
state. Because Project Driver never grants repository or runtime authority, that
|
|
307
|
+
state is paired with `deliveryDisposition=code_complete_without_release_authority`,
|
|
308
|
+
`dominantGap.kind=release_authority`, a non-empty external-authority next action,
|
|
309
|
+
and `authorizationGranted=false`.
|
|
310
|
+
|
|
258
311
|
`project takeover` adds the current candidate, its exact added/changed/removed
|
|
259
312
|
path delta from the previous imported delivery, and handoffs that are stale
|
|
260
313
|
because later project truth superseded them. These are read-only projections;
|
|
@@ -467,6 +520,9 @@ Formal also accepts a real project command through an enforced Verification
|
|
|
467
520
|
Envelope:
|
|
468
521
|
|
|
469
522
|
```bash
|
|
523
|
+
npx --no-install owlrunkit formal preflight --workspace . \
|
|
524
|
+
--envelope scripts/runkit-contract/templates/verification-envelope.json
|
|
525
|
+
|
|
470
526
|
npx --no-install owlrunkit formal check --workspace . --run-id release-001 \
|
|
471
527
|
--work-item delivery --check-id project-tests \
|
|
472
528
|
--envelope scripts/runkit-contract/templates/verification-envelope.json
|
|
@@ -482,6 +538,24 @@ the policy, the command is not run and no Formal acceptance is possible.
|
|
|
482
538
|
Existing legacy verification may still capture evidence, but it is not silently
|
|
483
539
|
promoted into this Formal path.
|
|
484
540
|
|
|
541
|
+
If a required project check cannot run inside the envelope, attach its fully
|
|
542
|
+
attested Quick receipt to the same source candidate:
|
|
543
|
+
|
|
544
|
+
```bash
|
|
545
|
+
npx --no-install owlrunkit formal attach-evidence --workspace . \
|
|
546
|
+
--run-id release-001 --evidence-id local-migration-readback \
|
|
547
|
+
--kind supplemental-local --receipt /absolute/path/to/receipt.json
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
Use `networked` only for a Quick command that used network access. This is an
|
|
551
|
+
operator declaration, not a fact attested by Quick Receipt V3; the attachment
|
|
552
|
+
and summary therefore expose `classificationBasis=operator_declared_not_attested`.
|
|
553
|
+
The receipt and its materials are re-attested, but attached evidence is always
|
|
554
|
+
non-gating and cannot replace a passed Formal check or grant Git, release,
|
|
555
|
+
deployment, production, or business authority. Evidence Summary generation is
|
|
556
|
+
part of accepted finish; rejected and blocked closeouts remain honest without
|
|
557
|
+
creating an acceptance-oriented summary.
|
|
558
|
+
|
|
485
559
|
Use `npx --no-install owlrunkit status --workspace .` for a concise human view of what is ready,
|
|
486
560
|
what has not happened, how many gates remain, and the next allowed action.
|
|
487
561
|
|
|
@@ -490,6 +564,10 @@ what has not happened, how many gates remain, and the next allowed action.
|
|
|
490
564
|
`SourceCandidateV2` makes a dirty but precisely bounded candidate a first-class
|
|
491
565
|
artifact. It binds the baseline, exact owned-path closure, source manifest,
|
|
492
566
|
and payload bytes without requiring a Git commit.
|
|
567
|
+
The serialized candidate contract is bounded to 64 MiB and 2,000,000 JSON
|
|
568
|
+
values. Freeze applies the same bound as the reader before writing that
|
|
569
|
+
candidate's payload or document, so an oversized workspace fails closed rather
|
|
570
|
+
than producing an unreadable candidate.
|
|
493
571
|
|
|
494
572
|
```bash
|
|
495
573
|
npx --no-install owlrunkit candidate freeze --workspace . --run-id release-001 \
|
package/docs/architecture/OWLCODA_RUNKIT_0190_CONSOLIDATED_DAILY_USE_PRODUCT_DECISION_20260812.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# OwlRunKit 0.19.0 Consolidated Daily-Use Product Decision
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
状态:**七个 Wave 已实现;私仓、tag、npm 与 exact-registry consumer 发布闭环已完成**
|
|
4
4
|
|
|
5
5
|
## Decision
|
|
6
6
|
|
|
@@ -87,11 +87,14 @@ acceptance 才强制 Formal。风险解除后允许降级,升级不成为粘
|
|
|
87
87
|
|
|
88
88
|
低层证据不得自动提升为高层结论。
|
|
89
89
|
|
|
90
|
-
## What Cannot Be Claimed
|
|
91
|
-
|
|
92
|
-
- 0.19.0
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
-
|
|
96
|
-
|
|
97
|
-
-
|
|
90
|
+
## Release Truth And What Cannot Be Claimed
|
|
91
|
+
|
|
92
|
+
- `owlrunkit@0.19.0` 已由私仓 release commit `830aa91c` 发布,npm
|
|
93
|
+
`latest` 已读回为 `0.19.0`;精确 registry consumer 已完成原子
|
|
94
|
+
bootstrap、doctor、profile、inspect、Quick 与 metrics 验证;
|
|
95
|
+
- 发布不等于 fleet/shared Skill 激活、OwlCoda 项目 Core 迁移或任何外部项目
|
|
96
|
+
adoption;这些仍需要各自安全边界和独立读回;
|
|
97
|
+
- 本文记录产品决策和已发布能力,完整 registry 字节、测试与未触碰边界见
|
|
98
|
+
`docs/handoff/OWLCODA_RUNKIT_0190_PRIVATE_GIT_NPM_RELEASE_RECEIPT_20260813.md`;
|
|
99
|
+
- public mirror、官网、8019、全局 Skill、生产与业务验收不属于本次授权,不能
|
|
100
|
+
从本次 package release 推导为已完成。
|
package/docs/architecture/OWLCODA_RUNKIT_0191_PROFILE_RECONCILE_PATCH_PRODUCT_DECISION_20260813.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# OwlRunKit 0.19.1 Profile Reconcile Patch Product Decision
|
|
2
|
+
|
|
3
|
+
状态:**已发布;registry、私仓 tag、项目 adoption 与共享 Skill 激活均已读回**
|
|
4
|
+
|
|
5
|
+
## Decision
|
|
6
|
+
|
|
7
|
+
0.19.1 是 0.19.0 的兼容补丁,不扩展 RunKit 的产品范围。真实 OwlCoda
|
|
8
|
+
dogfood 发现,成熟项目已有 profile 持有 `npm-build`、`npm-test` 时,检测器
|
|
9
|
+
提出新的 `node-quality` profile 会重复这些全局 command ID,使 bootstrap 在
|
|
10
|
+
profile reconcile 阶段失败。
|
|
11
|
+
|
|
12
|
+
当检测出的 commands 只有一个现有 owner 时,reconcile 现在复用该 owner:
|
|
13
|
+
增加真实检测到的 paths,并以项目本地 authoritative tool binding 更新对应
|
|
14
|
+
command。它不会新增第二份重复 command,也不会削弱最终 profile 校验。
|
|
15
|
+
|
|
16
|
+
## Preserved Boundaries
|
|
17
|
+
|
|
18
|
+
- owner profile bytes 仍只通过原子 reconcile 事务更新,失败恢复原始 bytes;
|
|
19
|
+
- 多个不同 command owner 的歧义不会被静默合并;
|
|
20
|
+
- bootstrap、receipt 与 mode 仍不授予 Git、发布、部署、生产或业务权限;
|
|
21
|
+
- npm package 发布、项目 Core adoption 与 process-level shared Skill 激活仍是
|
|
22
|
+
三个独立状态转换;bootstrap 只诊断 Skill drift,不静默刷新 fleet Skill;
|
|
23
|
+
- 0.19.0 的 continuity、assurance、Formal 和 predecessor-contract 边界不变。
|
|
24
|
+
|
|
25
|
+
## Release Truth
|
|
26
|
+
|
|
27
|
+
0.19.1 已通过成熟项目冲突回归、profile/bootstrap 聚焦测试、完整 RunKit
|
|
28
|
+
gate、Core identity、packed package/Skill、干净 consumer 和 npm registry
|
|
29
|
+
字节读回。发布源码是 `0367295c153ed36548a366633de39d5a1b832b3b`,tag
|
|
30
|
+
是 `owlrunkit-v0.19.1`,npm `latest` 是 `0.19.1`。
|
|
31
|
+
|
|
32
|
+
OwlCoda 项目已从官方 registry 精确采用 0.19.1,并得到 doctor `ready`、
|
|
33
|
+
profiles `valid`、inspect `idle` 与 Quick `GO`。process-level shared Skill 也在
|
|
34
|
+
完整 fleet 预检通过后原子升级到 0.19.1;58 个受管项目的 Core config 已生成
|
|
35
|
+
可回滚迁移回执。上述事实不授予 Git、部署、生产或业务权限。完整证据见
|
|
36
|
+
`docs/handoff/OWLCODA_RUNKIT_0191_PRIVATE_GIT_NPM_RELEASE_RECEIPT_20260813.md`。
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# OwlRunKit 0.19.2 Formal Usability and Project Driver Honesty Product Decision
|
|
2
|
+
|
|
3
|
+
状态:**候选实施中;尚未发布、采用或激活**
|
|
4
|
+
|
|
5
|
+
## Decision
|
|
6
|
+
|
|
7
|
+
0.19.2 是一次整合型 Formal 可用性与 Project Driver 诚实状态补丁。它集中修正
|
|
8
|
+
OwlChen 与 OwlFootball 真实主线 dogfood 中已经复现的接入摩擦,不增加新的
|
|
9
|
+
Gate,也不放宽 Verification Envelope 的执行边界。
|
|
10
|
+
|
|
11
|
+
目标是让合法项目命令在执行前获得可行动的静态诊断,让失败回执区分源码
|
|
12
|
+
失败与环境不兼容,并允许同一源码候选的本地或联网补充验证被明确标记、绑定
|
|
13
|
+
和汇总。补充验证永远不是 Formal 门禁证据。
|
|
14
|
+
|
|
15
|
+
Project Driver 同时把“工单账完成”与“获准 Git、发布、部署或上线”拆成两个
|
|
16
|
+
不同事实,并把独立验收者、诊断后的范围修订和缺少绑定验证回执做成可执行
|
|
17
|
+
合同,而不是只留在 Agent 提示词里。
|
|
18
|
+
|
|
19
|
+
## Scope
|
|
20
|
+
|
|
21
|
+
### Formal envelope preflight
|
|
22
|
+
|
|
23
|
+
- 新增只读 `formal preflight --envelope <file>`;
|
|
24
|
+
- 输出 backend、阶段命令、已知隐式子进程、临时目录和 RunKit runtime 扫描
|
|
25
|
+
冲突;
|
|
26
|
+
- 对必然失败的能力缺口返回 blocker,并给出最小 envelope 修正建议;
|
|
27
|
+
- `formal check --envelope` 在写入 candidate、check 或 evidence 前复用同一
|
|
28
|
+
preflight,已知 blocker 零写入停止。
|
|
29
|
+
|
|
30
|
+
### Typed Formal failure
|
|
31
|
+
|
|
32
|
+
Formal Check V2 保留以下稳定分类词汇:
|
|
33
|
+
|
|
34
|
+
- `source_check_failed`;
|
|
35
|
+
- `envelope_capability_missing`;
|
|
36
|
+
- `toolchain_resolution_failed`;
|
|
37
|
+
- `network_policy_blocked`。
|
|
38
|
+
|
|
39
|
+
分类只能来自 RunKit runner/backend 的受信结构化事实,不能解析被测命令可伪造
|
|
40
|
+
的 stdout/stderr。当前 macOS backend 能证明 backend capability、launch/toolchain、
|
|
41
|
+
cleanup/source 失败;只有后续 backend 明确返回结构化 network-denial cause 时才发出
|
|
42
|
+
`network_policy_blocked`。无法归因的命令非零退出保守记为 `source_check_failed`。
|
|
43
|
+
|
|
44
|
+
旧 `OwlCodaRunKitFormalCheckV1` 字节和语义保持不变。新增字段通过 V2
|
|
45
|
+
合同发布,读取器同时支持 V1 与 V2。
|
|
46
|
+
|
|
47
|
+
### Source-bound supplemental evidence
|
|
48
|
+
|
|
49
|
+
新增:
|
|
50
|
+
|
|
51
|
+
```text
|
|
52
|
+
owlrunkit formal attach-evidence \
|
|
53
|
+
--workspace <root> --run-id <id> --evidence-id <id> \
|
|
54
|
+
--kind supplemental-local|networked --receipt <quick-receipt.json>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
附件必须通过完整 Quick attestation,并与当前有效 Formal SourceCandidate
|
|
58
|
+
在同一 workspace 状态下绑定。它保存自己的 Quick workspace fingerprint,
|
|
59
|
+
同时绑定 Formal `sourceFingerprint`、candidate path 和 candidate hash。
|
|
60
|
+
Formal Core 使用运行时计算的当前 Core identity 调用被 Core manifest 绑定的
|
|
61
|
+
Quick attester;发布面中自引用的当前 identity 字段不参与该运行时信任判断。
|
|
62
|
+
`supplemental-local|networked` 是操作者声明的执行环境分类;Quick Receipt V3
|
|
63
|
+
并不证明网络是否被使用,因此附件和摘要必须同时写明
|
|
64
|
+
`classificationBasis=operator_declared_not_attested`,不得把该标签说成 attested fact。
|
|
65
|
+
|
|
66
|
+
`formal finish --decision accepted` 自动生成一份 Evidence Summary,列出当前源码的 Formal checks
|
|
67
|
+
与 supplemental evidence。只有 Formal-eligible checks 参与 acceptance;摘要必须
|
|
68
|
+
明确声明 supplemental evidence 为 non-gating,不能替代 sandbox、授权或业务验收。
|
|
69
|
+
|
|
70
|
+
### CLI and runtime-root guidance
|
|
71
|
+
|
|
72
|
+
- `formal finish --help` 展示 `--decision` 与 `--finalize-id`;
|
|
73
|
+
- `formal preflight` 和 `formal attach-evidence` 有 action-specific help;
|
|
74
|
+
- 已存在但缺 help 的 Project Driver actions 补齐;
|
|
75
|
+
- broad lint/format/test 命令可能扫描 `.owlcoda/runkit/**` 时,在 Formal
|
|
76
|
+
preflight 中直接给出 ignore 修正,而不是等待 sandbox 执行失败。
|
|
77
|
+
|
|
78
|
+
### Project Driver honesty and first-use repair
|
|
79
|
+
|
|
80
|
+
- Project Status V3 与 Takeover V3 保留 `overall=completed` 的工单账语义,但在
|
|
81
|
+
没有外部授权时固定输出
|
|
82
|
+
`deliveryDisposition=code_complete_without_release_authority`、
|
|
83
|
+
`dominantGap.kind=release_authority` 和一条非空外部授权下一动作;
|
|
84
|
+
- `authorizationGranted` 始终为 `false`,Project Driver 不能自行授予 Git、发布、
|
|
85
|
+
部署、生产或业务权限;
|
|
86
|
+
- 进入 `verifying` 前必须由另一 Agent 接管当前 assignment,同一实现者直接把
|
|
87
|
+
自己标为 verifying 时零写入拒绝,并返回可复制的 handoff/assignment 修正路径;
|
|
88
|
+
- 新增 append-only Event V5 `project work-item revise-scope`,允许当前 Owner 在
|
|
89
|
+
诊断后 supersede `ownedPaths` 与 measurable 合同;原 definition 和历史事件不被
|
|
90
|
+
改写,范围修订后旧 checkpoint 不再证明新范围已完成;
|
|
91
|
+
- `verifying` 或 `completed` checkpoint 未引用可识别的 Quick/Formal 回执时,
|
|
92
|
+
Status V3 输出 `no_bound_verification_receipt` warning。该 warning 只证明缺少引用,
|
|
93
|
+
不证明引用本身已经通过 attestation;
|
|
94
|
+
- 已存在 Project Driver definition 时,`mode recommend --mode auto` 保持
|
|
95
|
+
`managed + assurance none|quick`,不再把已初始化的总控账本劝回 `off`;
|
|
96
|
+
- Project Driver 时间戳接受 ISO-8601 UTC 秒精度或最多三位小数,并以 `.sssZ`
|
|
97
|
+
规范化保存;action help 展示必填 measured checkpoint 与 scope revision 参数;
|
|
98
|
+
- 对已通过 gate 的 defer 仍 fail-closed,但错误必须同时给出新 gate 或
|
|
99
|
+
`project successor` 的可行动路径。
|
|
100
|
+
|
|
101
|
+
## Preserved Boundaries
|
|
102
|
+
|
|
103
|
+
- supplemental evidence 永远 `gating=false`、`authorizationGranted=false`;
|
|
104
|
+
- accepted Formal 仍要求当前源码至少一条有效 Formal-eligible passed check;
|
|
105
|
+
- preflight、attachment、summary 不授予 Git、发布、部署、生产、凭据或业务权限;
|
|
106
|
+
- 不自动修改项目 lint/format 配置,不扩大 writable paths、network 或 subprocess
|
|
107
|
+
allowlist;
|
|
108
|
+
- Linux backend 仍 fail-closed,本轮不新增执行器;
|
|
109
|
+
- 已发布 V1 schema 不原地重解释;破坏性变化使用 successor schema;
|
|
110
|
+
- SourceCandidateV2 文档支持上限为 64 MiB、2,000,000 个 JSON value;freeze
|
|
111
|
+
在任何该候选 payload 或 candidate 写入前使用与 reader 相同的上限检查;
|
|
112
|
+
- 0.19.2 package、Git、tag、npm、项目 adoption 与 shared Skill activation 是独立
|
|
113
|
+
状态转换,本文不能证明其中任何一个已完成。
|
|
114
|
+
|
|
115
|
+
## Acceptance Scenarios
|
|
116
|
+
|
|
117
|
+
1. backend 缺失、已知 subprocess 缺口或 broad scan 冲突在 Formal 写入前阻止执行;
|
|
118
|
+
2. 正常 source assertion 失败分类为 `source_check_failed`;
|
|
119
|
+
3. launch/toolchain 与 sandbox capability 由结构化事实分类;命令输出中的同名文本
|
|
120
|
+
不能改变分类,未被 backend 证明的 network cause 不冒充 policy fact;
|
|
121
|
+
4. source drift、失败 Quick receipt、材料漂移或不同 workspace 的附件 fail-closed;
|
|
122
|
+
5. 合法 supplemental-local/networked receipt 可被当前 candidate 绑定;
|
|
123
|
+
6. source 改变后旧附件保留但不进入当前 Evidence Summary;
|
|
124
|
+
7. accepted finish 的摘要同时展示门禁 Formal checks 和 non-gating attachments;
|
|
125
|
+
8. 没有 passed Formal check 时,attachments 再多也不能 accepted finish;
|
|
126
|
+
9. 新旧 FormalCheck 合同都可读取,V1 输出不变;
|
|
127
|
+
10. 所有新增结果保持 `authorizationGranted=false`。
|
|
128
|
+
11. 工单账全部完成后,Status/Takeover 仍醒目显示未获发布授权,且下一动作不为
|
|
129
|
+
`none`;
|
|
130
|
+
12. 同一 Agent 直接进入 verifying 零写入拒绝,另一 Agent 完成 handoff/assignment
|
|
131
|
+
后可进入 verifying;
|
|
132
|
+
13. scope revision 不改写 definition,旧 revision/checkpoint 不能证明新范围;
|
|
133
|
+
14. `...ssZ` 时间戳被接受并规范为 `...ss.000Z`,所有 action help 可直接执行;
|
|
134
|
+
15. 已初始化 Project Driver 的 auto mode 推荐 managed,缺绑定回执只产生 warning,
|
|
135
|
+
不自动升级 Formal。
|
|
136
|
+
|
|
137
|
+
## Release Truth
|
|
138
|
+
|
|
139
|
+
当前只授权形成和验证 0.19.2 source candidate。未授权 commit、push、tag、npm
|
|
140
|
+
publish、项目升级或 shared Skill 更新。候选必须先通过聚焦合同测试、相关 RunKit
|
|
141
|
+
gate、Core identity 与真实 packed-consumer dogfood,之后才能单独决定发布。
|
|
@@ -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
|
|
11
|
-
Core `0.19.
|
|
12
|
-
`sha256:
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
Bundled candidate: standalone `owlrunkit@0.19.2`, bundling Contract `0.2` and
|
|
11
|
+
Core `0.19.2` with manifest
|
|
12
|
+
`sha256:c46ae9d8ed0572e5636ab5725f922f8db3ee5bf0f966b200bce7b2287c9267c8`.
|
|
13
|
+
This candidate is not published. The current published release remains
|
|
14
|
+
`owlrunkit@0.19.1`, 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`.
|
|
@@ -26,7 +28,8 @@ the user to operate the CLI when the request and authority are already clear.
|
|
|
26
28
|
|
|
27
29
|
The normal mainline is `init`, `assign`, `checkpoint`, `handoff`,
|
|
28
30
|
`reject-and-return`, `decision`, `verification`, `integrate`, `status`, and
|
|
29
|
-
`takeover`.
|
|
31
|
+
`takeover`. A diagnosed WorkItem scope change uses append-only `work-item
|
|
32
|
+
revise-scope`. External source lanes use `target-snapshot` and `import-delivery`
|
|
30
33
|
without installing RunKit or writing control artifacts into the frozen target.
|
|
31
34
|
After a project
|
|
32
35
|
derives completed, `successor` is the bounded lifecycle step. `init` accepts one project definition
|
|
@@ -43,6 +46,10 @@ remains available for existing automation and compatibility.
|
|
|
43
46
|
- "I decided ...": append a decision resolution with rationale and evidence.
|
|
44
47
|
- "Hand this to another Agent": append the handoff, then a successor assignment;
|
|
45
48
|
never overwrite the old assignment.
|
|
49
|
+
- "The diagnosis changed this WorkItem's paths or measurable contract": append
|
|
50
|
+
one `project work-item revise-scope` event bound to the current assignment and
|
|
51
|
+
owner. Never edit the project definition or treat an older checkpoint as
|
|
52
|
+
completion evidence for the revised scope.
|
|
46
53
|
- "Reject this failed candidate and return it": use one `project
|
|
47
54
|
reject-and-return` event. Preserve the failed checkpoint, bind the review
|
|
48
55
|
evidence, create the rework assignment, and never rewrite failure as active.
|
|
@@ -71,11 +78,19 @@ remains available for existing automation and compatibility.
|
|
|
71
78
|
underlying risk; bind a Formal WorkItem to its actual execution and lease when
|
|
72
79
|
applicable. Multi-Agent coordination, long duration, or interruption recovery
|
|
73
80
|
alone does not select Formal.
|
|
81
|
+
- "Everything in the ledger is complete": report
|
|
82
|
+
`code_complete_without_release_authority` unless a separate external actor has
|
|
83
|
+
granted the relevant Git/release/deploy authority. Never translate
|
|
84
|
+
`overall=completed` into product activation or `next: none`.
|
|
74
85
|
|
|
75
86
|
For a multi-Agent project, checkpoint meaningful state changes promptly. A
|
|
76
87
|
checkpoint is not a heartbeat and must not contain a guessed percentage.
|
|
77
88
|
Completion requires evidence. If an assignment binds an execution, derive its
|
|
78
89
|
state from the closeout and lease rather than trusting the Agent's claim.
|
|
90
|
+
Before entering `verifying`, hand off and supersede the implementation assignment
|
|
91
|
+
with a different Agent. If a verifying/completed checkpoint has no recognizable
|
|
92
|
+
Quick/Formal receipt reference, preserve the checkpoint but report
|
|
93
|
+
`no_bound_verification_receipt`; do not claim that a mere reference was attested.
|
|
79
94
|
|
|
80
95
|
```bash
|
|
81
96
|
npx --no-install owlrunkit project init --workspace "$PROJECT_ROOT" --definition "$PROJECT_JSON"
|
|
@@ -92,6 +107,11 @@ npx --no-install owlrunkit project reject-and-return --workspace "$PROJECT_ROOT"
|
|
|
92
107
|
--rework-id "$REWORK_ID" --at "$OCCURRED_AT" --work-item "$WORK_ITEM_ID" \
|
|
93
108
|
--reviewer-agent "$REVIEWER_AGENT_ID" --to-agent "$AGENT_ID" \
|
|
94
109
|
--reason "$REJECTION_REASON" --next "$NEXT_ACTION" --evidence "$EVIDENCE_REF"
|
|
110
|
+
npx --no-install owlrunkit project work-item revise-scope --workspace "$PROJECT_ROOT" \
|
|
111
|
+
--revision-id "$REVISION_ID" --at "$OCCURRED_AT" \
|
|
112
|
+
--assignment-id "$ASSIGNMENT_ID" --work-item "$WORK_ITEM_ID" \
|
|
113
|
+
--owner-agent "$AGENT_ID" --owned-path "$OWNED_PATH" \
|
|
114
|
+
--reason "$SCOPE_REASON" --evidence "$EVIDENCE_REF"
|
|
95
115
|
npx --no-install owlrunkit project decision --workspace "$PROJECT_ROOT" --resolve \
|
|
96
116
|
--decision-id "$DECISION_ID" --at "$OCCURRED_AT" --resolution "$RESOLUTION" \
|
|
97
117
|
--rationale "$RATIONALE" --evidence "$EVIDENCE_REF"
|
|
@@ -191,9 +211,9 @@ below has no CLI entry.
|
|
|
191
211
|
|
|
192
212
|
```bash
|
|
193
213
|
npx --no-install owlrunkit bootstrap --workspace "$PROJECT_ROOT" \
|
|
194
|
-
--exact owlrunkit@0.19.
|
|
214
|
+
--exact owlrunkit@0.19.1 --dry-run
|
|
195
215
|
npx --no-install owlrunkit bootstrap --workspace "$PROJECT_ROOT" \
|
|
196
|
-
--exact owlrunkit@0.19.
|
|
216
|
+
--exact owlrunkit@0.19.1 --apply
|
|
197
217
|
npx --no-install owlrunkit init --workspace "$PROJECT_ROOT"
|
|
198
218
|
npx --no-install owlrunkit inspect --json --workspace "$PROJECT_ROOT"
|
|
199
219
|
npx --no-install owlrunkit status --workspace "$PROJECT_ROOT"
|
|
@@ -502,6 +522,9 @@ Formal accepted evidence admits the built-in Node syntax check and real project
|
|
|
502
522
|
commands executed through a Verification Envelope:
|
|
503
523
|
|
|
504
524
|
```bash
|
|
525
|
+
npx --no-install owlrunkit formal preflight \
|
|
526
|
+
--workspace "$PROJECT_ROOT" --envelope "$VERIFICATION_ENVELOPE_JSON"
|
|
527
|
+
|
|
505
528
|
npx --no-install owlrunkit formal check \
|
|
506
529
|
--workspace "$PROJECT_ROOT" --run-id "$RUN_ID" \
|
|
507
530
|
--work-item "$WORK_ITEM_ID" --check-id "$CHECK_ID" \
|
|
@@ -517,10 +540,30 @@ command optimistically. The public 0.17 package provides the enforced macOS
|
|
|
517
540
|
backend; Linux remains fail-closed. Legacy `verify` may capture evidence but
|
|
518
541
|
must not be silently promoted into this Formal path.
|
|
519
542
|
|
|
543
|
+
When a required project check cannot run inside the envelope, run it through
|
|
544
|
+
Quick against the same frozen source and attach the fully attested receipt:
|
|
545
|
+
|
|
546
|
+
```bash
|
|
547
|
+
npx --no-install owlrunkit formal attach-evidence \
|
|
548
|
+
--workspace "$PROJECT_ROOT" --run-id "$RUN_ID" \
|
|
549
|
+
--evidence-id "$EVIDENCE_ID" --kind supplemental-local \
|
|
550
|
+
--receipt "$QUICK_RECEIPT_JSON"
|
|
551
|
+
```
|
|
552
|
+
|
|
553
|
+
Use `networked` instead of `supplemental-local` only when the attached command
|
|
554
|
+
used network access. This classification is operator-declared and not attested
|
|
555
|
+
by Quick Receipt V3, so artifacts expose
|
|
556
|
+
`classificationBasis=operator_declared_not_attested`. Supplemental evidence
|
|
557
|
+
remains non-gating: its receipt and materials are re-attested and summarized by
|
|
558
|
+
an accepted `formal finish`, but it never substitutes for a passed Formal-eligible check or
|
|
559
|
+
grants Git, release, deployment, or business authority.
|
|
560
|
+
|
|
520
561
|
## Freeze a dirty SourceCandidateV2
|
|
521
562
|
|
|
522
563
|
Freeze, verify and materialize an immutable candidate without requiring a Git
|
|
523
|
-
commit
|
|
564
|
+
commit. SourceCandidateV2 documents are limited to 64 MiB and 2,000,000 JSON
|
|
565
|
+
values; producer and reader enforce the same bound before candidate payload or
|
|
566
|
+
document writes.
|
|
524
567
|
|
|
525
568
|
```bash
|
|
526
569
|
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.
|
|
6
|
-
"coreManifestSha256": "sha256:
|
|
7
|
-
"coreSourceRef": "artifact:sha256:
|
|
5
|
+
"coreVersion": "0.19.2",
|
|
6
|
+
"coreManifestSha256": "sha256:c46ae9d8ed0572e5636ab5725f922f8db3ee5bf0f966b200bce7b2287c9267c8",
|
|
7
|
+
"coreSourceRef": "artifact:sha256:c46ae9d8ed0572e5636ab5725f922f8db3ee5bf0f966b200bce7b2287c9267c8"
|
|
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.
|
|
3
|
+
"version": "0.19.2",
|
|
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.19.2",
|
|
45
|
+
"coreManifestSha256": "sha256:c46ae9d8ed0572e5636ab5725f922f8db3ee5bf0f966b200bce7b2287c9267c8"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"contractVersion": "0.2",
|
|
49
|
+
"coreVersion": "0.19.1",
|
|
50
|
+
"coreManifestSha256": "sha256:291ef97c93a513eed24a29f75c400b61cefd6a8c0ab228401cf2c6a73ea9e622"
|
|
51
|
+
},
|
|
42
52
|
{
|
|
43
53
|
"contractVersion": "0.2",
|
|
44
54
|
"coreVersion": "0.19.0",
|
|
@@ -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.19.2",
|
|
25
|
+
coreManifestSha256: "sha256:c46ae9d8ed0572e5636ab5725f922f8db3ee5bf0f966b200bce7b2287c9267c8",
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
contractVersion: "0.2",
|
|
29
|
+
coreVersion: "0.19.1",
|
|
30
|
+
coreManifestSha256: "sha256:291ef97c93a513eed24a29f75c400b61cefd6a8c0ab228401cf2c6a73ea9e622",
|
|
31
|
+
},
|
|
22
32
|
{
|
|
23
33
|
contractVersion: "0.2",
|
|
24
34
|
coreVersion: "0.19.0",
|
|
@@ -129,7 +139,7 @@ export const SUPPORTED_QUICK_CORE_IDENTITIES = Object.freeze([
|
|
|
129
139
|
coreVersion: "0.13.0",
|
|
130
140
|
coreManifestSha256: "sha256:0455c847bf2df77703583c6f19c20cf103206bafc4f122795bf34d3f85f0263d",
|
|
131
141
|
},
|
|
132
|
-
]);
|
|
142
|
+
].map(identity => Object.freeze(identity)));
|
|
133
143
|
|
|
134
144
|
function dependencyEnvironmentCurrent(binding, materials) {
|
|
135
145
|
if (binding === null || binding === undefined) return true;
|
|
@@ -206,11 +216,11 @@ function resultTemplate({ receipt, receiptPath, receiptSha256, decision, issues,
|
|
|
206
216
|
};
|
|
207
217
|
}
|
|
208
218
|
|
|
209
|
-
|
|
219
|
+
function attestQuickReceiptDetailsFromBytesWithCatalog({
|
|
210
220
|
receiptPath,
|
|
211
221
|
receiptBytes,
|
|
212
222
|
workspaceRoot,
|
|
213
|
-
}) {
|
|
223
|
+
}, supportedCoreIdentities) {
|
|
214
224
|
const absoluteReceiptPath = resolveRegularFilePath(receiptPath);
|
|
215
225
|
let receipt;
|
|
216
226
|
try {
|
|
@@ -236,7 +246,7 @@ export function attestQuickReceiptDetailsFromBytes({
|
|
|
236
246
|
let materialMissing = false;
|
|
237
247
|
let materialMismatch = false;
|
|
238
248
|
|
|
239
|
-
const coreValid =
|
|
249
|
+
const coreValid = supportedCoreIdentities.some((core) =>
|
|
240
250
|
receipt.coreIdentity.contractVersion === core.contractVersion
|
|
241
251
|
&& receipt.coreIdentity.coreVersion === core.coreVersion
|
|
242
252
|
&& receipt.coreIdentity.coreManifestSha256 === core.coreManifestSha256);
|
|
@@ -370,6 +380,34 @@ export function attestQuickReceiptDetailsFromBytes({
|
|
|
370
380
|
};
|
|
371
381
|
}
|
|
372
382
|
|
|
383
|
+
export function attestQuickReceiptDetailsFromBytes(options) {
|
|
384
|
+
return attestQuickReceiptDetailsFromBytesWithCatalog(
|
|
385
|
+
options,
|
|
386
|
+
SUPPORTED_QUICK_CORE_IDENTITIES,
|
|
387
|
+
);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
export function attestQuickReceiptDetailsFromBytesWithCoreCatalog(
|
|
391
|
+
options,
|
|
392
|
+
supportedCoreIdentities,
|
|
393
|
+
) {
|
|
394
|
+
if (
|
|
395
|
+
!Array.isArray(supportedCoreIdentities)
|
|
396
|
+
|| supportedCoreIdentities.length === 0
|
|
397
|
+
|| supportedCoreIdentities.some((identity) => (
|
|
398
|
+
identity?.contractVersion !== "0.2"
|
|
399
|
+
|| typeof identity?.coreVersion !== "string"
|
|
400
|
+
|| !/^sha256:[a-f0-9]{64}$/u.test(identity?.coreManifestSha256 ?? "")
|
|
401
|
+
))
|
|
402
|
+
) {
|
|
403
|
+
throw new Error("trusted Quick Core catalog is invalid");
|
|
404
|
+
}
|
|
405
|
+
return attestQuickReceiptDetailsFromBytesWithCatalog(
|
|
406
|
+
options,
|
|
407
|
+
supportedCoreIdentities,
|
|
408
|
+
);
|
|
409
|
+
}
|
|
410
|
+
|
|
373
411
|
export function attestQuickReceiptDetails({ receiptPath, workspaceRoot }) {
|
|
374
412
|
const { absolutePath, bytes } = readFileBytesBounded(receiptPath);
|
|
375
413
|
return attestQuickReceiptDetailsFromBytes({
|