@dsh-enhanced/assistant-growth-contract 0.1.12

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 dsh-enhanced contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # @dsh-enhanced/assistant-growth-contract
2
+
3
+ 这是一个普通、非激活型共享库,固定 Delivery、Growth Experiments 与 Automations
4
+ 之间的工作流学习协议。它不声明 `dsh.bundle`,不会自行注册服务、工具或定时任务。
5
+
6
+ 协议只允许版本化、带来源证明的 trace;工具步骤只保存 catalog id 与参数**结构**摘要,
7
+ 不保存原始参数值。可复用 prompt 留在 Delivery 的 owner-private template registry,跨插件
8
+ wire 仅传 `templateRef`、`templateDigest` 与可核验的 privacy attestation。无法证明自动脱敏
9
+ 时必须使用 `owner-explicit` 路径,不能把一个字符串枚举伪装成脱敏证明。
10
+ 私有 template content 还包含 Delivery 从当前 authenticated owner binding 派生的
11
+ canonical `principalId`;它纳入 template digest,只由 Host resolver 返回给 Automations,
12
+ 不进入 workflow trace 或 Growth 数据库。candidate signature 同时绑定 exact
13
+ `ownerBindingId`,因此 owner/binding 换代后不会与旧代 trace 合并。
14
+
15
+ Automation 的八个 Host 操作共享同一套 identity、artifact CAS 与 receipt digest。相同
16
+ `operationId` 只有精确相同 payload 才能重放;promotion receipt 同时返回下一版本及其摘要,
17
+ 确保之后的撤票或证据变化能对准实际生产 artifact 回滚。
18
+
19
+ 本包也固定 Delivery 与 Preference Learning 共同消费的可逆 T1 偏好 key/value 目录,
20
+ 避免导出校验与实际激活目录各自维护一份并发生漂移。它只描述闭集协议,不拥有证据、
21
+ 偏好状态或激活权限。
22
+
23
+ Preference/Memory promotion 协议只允许 `memory.retention=long-term` 和固定 renderer,
24
+ 并以 request/result/cancellation digest 绑定 hypothesis 版本、owner generation 与 principal lineage。
25
+ 共享 contract 同时持有 producer 的进程内可撤销 brand,使 Memory 无需加载可选的 Preference 插件即可验真;
26
+ 它只定义 registration 与 content-free wire,不提供自由文本、Memory 写权限或无审批降级。
27
+
28
+ 本包只使用 Node `crypto` 计算 canonical SHA-256,不访问网络、文件系统、子进程、凭据或
29
+ 浏览器,也没有 install script。
@@ -0,0 +1,21 @@
1
+ import { type GrowthArtifactIdentity, type GrowthAutomationApprovalReceipt, type GrowthAutomationApprovalRequest, type GrowthAutomationArtifactRequest, type GrowthAutomationProposalReceipt, type GrowthAutomationProposalRequest, type GrowthCanaryInspectionReceipt, type GrowthCanaryInspectionRequest, type GrowthCanaryReceipt, type GrowthExperimentIdentity, type GrowthPromotionReceipt, type GrowthReplayReceipt, type GrowthRollbackReceipt, type GrowthShadowReceipt } from './types.js';
2
+ export declare function validateGrowthExperimentIdentity(value: unknown): Readonly<GrowthExperimentIdentity>;
3
+ export declare function validateGrowthArtifactIdentity(value: unknown): Readonly<GrowthArtifactIdentity>;
4
+ export declare function growthPortPayloadDigest(value: unknown): string;
5
+ export declare function growthPortReceiptDigest(value: Readonly<Record<string, unknown>>): string;
6
+ export declare function withGrowthPortReceiptDigest<T extends Readonly<Record<string, unknown>>>(value: T): Readonly<T & {
7
+ receiptDigest: string;
8
+ }>;
9
+ export declare function validateGrowthAutomationProposalRequest(value: unknown): Readonly<GrowthAutomationProposalRequest>;
10
+ export declare function validateGrowthAutomationApprovalRequest(value: unknown): Readonly<GrowthAutomationApprovalRequest>;
11
+ export declare function validateGrowthAutomationArtifactRequest(value: unknown): Readonly<GrowthAutomationArtifactRequest>;
12
+ export declare function validateGrowthCanaryInspectionRequest(value: unknown): Readonly<GrowthCanaryInspectionRequest>;
13
+ export declare function validateGrowthAutomationProposalReceipt(value: unknown, expected?: Readonly<GrowthExperimentIdentity>): Readonly<GrowthAutomationProposalReceipt>;
14
+ export declare function validateGrowthAutomationApprovalReceipt(value: unknown, expected?: Readonly<GrowthExperimentIdentity>): Readonly<GrowthAutomationApprovalReceipt>;
15
+ export declare function validateGrowthReplayReceipt(value: unknown, expected?: Readonly<GrowthAutomationArtifactRequest>): Readonly<GrowthReplayReceipt>;
16
+ export declare function validateGrowthShadowReceipt(value: unknown, expected?: Readonly<GrowthAutomationArtifactRequest>): Readonly<GrowthShadowReceipt>;
17
+ export declare function validateGrowthCanaryReceipt(value: unknown, expected?: Readonly<GrowthAutomationArtifactRequest>): Readonly<GrowthCanaryReceipt>;
18
+ export declare function validateGrowthCanaryInspectionReceipt(value: unknown, expected?: Readonly<GrowthCanaryInspectionRequest>): Readonly<GrowthCanaryInspectionReceipt>;
19
+ export declare function validateGrowthPromotionReceipt(value: unknown, expected?: Readonly<GrowthAutomationArtifactRequest>): Readonly<GrowthPromotionReceipt>;
20
+ export declare function validateGrowthRollbackReceipt(value: unknown, expected?: Readonly<GrowthAutomationArtifactRequest>): Readonly<GrowthRollbackReceipt>;
21
+ //# sourceMappingURL=automation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automation.d.ts","sourceRoot":"","sources":["../src/automation.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,sBAAsB,EAC3B,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EACpC,KAAK,6BAA6B,EAClC,KAAK,6BAA6B,EAClC,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACzB,MAAM,YAAY,CAAA;AAgCnB,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,CAAC,wBAAwB,CAAC,CAiBnG;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,CAAC,sBAAsB,CAAC,CAQ/F;AAyCD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE9D;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAGxF;AAED,wBAAgB,2BAA2B,CAAC,CAAC,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACrF,KAAK,EAAE,CAAC,GACP,QAAQ,CAAC,CAAC,GAAG;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,CAGzC;AAUD,wBAAgB,uCAAuC,CACrD,KAAK,EAAE,OAAO,GACb,QAAQ,CAAC,+BAA+B,CAAC,CAuB3C;AAED,wBAAgB,uCAAuC,CACrD,KAAK,EAAE,OAAO,GACb,QAAQ,CAAC,+BAA+B,CAAC,CAO3C;AAED,wBAAgB,uCAAuC,CACrD,KAAK,EAAE,OAAO,GACb,QAAQ,CAAC,+BAA+B,CAAC,CAO3C;AAED,wBAAgB,qCAAqC,CACnD,KAAK,EAAE,OAAO,GACb,QAAQ,CAAC,6BAA6B,CAAC,CAYzC;AAyBD,wBAAgB,uCAAuC,CACrD,KAAK,EAAE,OAAO,EACd,QAAQ,CAAC,EAAE,QAAQ,CAAC,wBAAwB,CAAC,GAC5C,QAAQ,CAAC,+BAA+B,CAAC,CAuC3C;AAED,wBAAgB,uCAAuC,CACrD,KAAK,EAAE,OAAO,EACd,QAAQ,CAAC,EAAE,QAAQ,CAAC,wBAAwB,CAAC,GAC5C,QAAQ,CAAC,+BAA+B,CAAC,CAE3C;AAiBD,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,OAAO,EACd,QAAQ,CAAC,EAAE,QAAQ,CAAC,+BAA+B,CAAC,GACnD,QAAQ,CAAC,mBAAmB,CAAC,CAe/B;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,OAAO,EACd,QAAQ,CAAC,EAAE,QAAQ,CAAC,+BAA+B,CAAC,GACnD,QAAQ,CAAC,mBAAmB,CAAC,CAkC/B;AAwCD,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,OAAO,EACd,QAAQ,CAAC,EAAE,QAAQ,CAAC,+BAA+B,CAAC,GACnD,QAAQ,CAAC,mBAAmB,CAAC,CAG/B;AAED,wBAAgB,qCAAqC,CACnD,KAAK,EAAE,OAAO,EACd,QAAQ,CAAC,EAAE,QAAQ,CAAC,6BAA6B,CAAC,GACjD,QAAQ,CAAC,6BAA6B,CAAC,CAKzC;AAED,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,OAAO,EACd,QAAQ,CAAC,EAAE,QAAQ,CAAC,+BAA+B,CAAC,GACnD,QAAQ,CAAC,sBAAsB,CAAC,CAqBlC;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,OAAO,EACd,QAAQ,CAAC,EAAE,QAAQ,CAAC,+BAA+B,CAAC,GACnD,QAAQ,CAAC,qBAAqB,CAAC,CAYjC"}
@@ -0,0 +1,336 @@
1
+ import { ASSISTANT_GROWTH_CONTRACT_VERSION, GROWTH_AUTOMATION_OPERATION_PROTOCOL, GROWTH_AUTOMATION_RECEIPT_PROTOCOL, GROWTH_EFFECT_BLOCKER_PROTOCOL, } from './types.js';
2
+ import { AssistantGrowthContractError, assertExactGrowthKeys, canonicalGrowthJson, exactGrowthDigest, growthObjectDigest, isGrowthRecord, validateWorkflowAutomationTemplate, validateWorkflowScope, validateWorkflowSteps, } from './canonical.js';
3
+ const identifierPattern = /^[A-Za-z0-9][A-Za-z0-9._:/-]{0,499}$/u;
4
+ function invalid(message) {
5
+ throw new AssistantGrowthContractError('invalid-input', message);
6
+ }
7
+ function identifier(value, label, maxBytes = 500) {
8
+ if (typeof value !== 'string' || value.normalize('NFC').trim() !== value || value === ''
9
+ || Buffer.byteLength(value, 'utf8') > maxBytes || !identifierPattern.test(value)) {
10
+ invalid(`${label} is invalid`);
11
+ }
12
+ return value;
13
+ }
14
+ function positiveInteger(value, label) {
15
+ if (!Number.isSafeInteger(value) || value < 1)
16
+ invalid(`${label} is invalid`);
17
+ return value;
18
+ }
19
+ export function validateGrowthExperimentIdentity(value) {
20
+ if (!isGrowthRecord(value))
21
+ invalid('growth operation identity must be an object');
22
+ assertExactGrowthKeys(value, [
23
+ 'contractVersion', 'operationId', 'experimentId', 'candidateId',
24
+ 'candidateRevision', 'candidateDigest',
25
+ ], 'growth operation identity');
26
+ if (value['contractVersion'] !== ASSISTANT_GROWTH_CONTRACT_VERSION) {
27
+ invalid('growth contract version is invalid');
28
+ }
29
+ return Object.freeze({
30
+ contractVersion: ASSISTANT_GROWTH_CONTRACT_VERSION,
31
+ operationId: identifier(value['operationId'], 'operationId'),
32
+ experimentId: identifier(value['experimentId'], 'experimentId'),
33
+ candidateId: identifier(value['candidateId'], 'candidateId'),
34
+ candidateRevision: positiveInteger(value['candidateRevision'], 'candidateRevision'),
35
+ candidateDigest: exactGrowthDigest(value['candidateDigest'], 'candidateDigest'),
36
+ });
37
+ }
38
+ export function validateGrowthArtifactIdentity(value) {
39
+ if (!isGrowthRecord(value))
40
+ invalid('growth artifact identity must be an object');
41
+ assertExactGrowthKeys(value, ['artifactId', 'artifactVersion', 'artifactDigest'], 'growth artifact identity');
42
+ return Object.freeze({
43
+ artifactId: identifier(value['artifactId'], 'artifactId'),
44
+ artifactVersion: positiveInteger(value['artifactVersion'], 'artifactVersion'),
45
+ artifactDigest: exactGrowthDigest(value['artifactDigest'], 'artifactDigest'),
46
+ });
47
+ }
48
+ function pickIdentity(value) {
49
+ return validateGrowthExperimentIdentity({
50
+ contractVersion: value['contractVersion'],
51
+ operationId: value['operationId'],
52
+ experimentId: value['experimentId'],
53
+ candidateId: value['candidateId'],
54
+ candidateRevision: value['candidateRevision'],
55
+ candidateDigest: value['candidateDigest'],
56
+ });
57
+ }
58
+ function pickArtifact(value) {
59
+ return validateGrowthArtifactIdentity({
60
+ artifactId: value['artifactId'],
61
+ artifactVersion: value['artifactVersion'],
62
+ artifactDigest: value['artifactDigest'],
63
+ });
64
+ }
65
+ function identityMatches(actual, expected) {
66
+ const normalized = pickIdentity(expected);
67
+ if (canonicalGrowthJson(actual) !== canonicalGrowthJson(normalized)) {
68
+ throw new AssistantGrowthContractError('receipt-mismatch', 'growth receipt changed operation identity');
69
+ }
70
+ }
71
+ function artifactMatches(actual, expected) {
72
+ const normalized = pickArtifact(expected);
73
+ if (canonicalGrowthJson(actual) !== canonicalGrowthJson(normalized)) {
74
+ throw new AssistantGrowthContractError('receipt-mismatch', 'growth receipt changed artifact identity');
75
+ }
76
+ }
77
+ export function growthPortPayloadDigest(value) {
78
+ return growthObjectDigest({ contract: GROWTH_AUTOMATION_OPERATION_PROTOCOL, payload: value });
79
+ }
80
+ export function growthPortReceiptDigest(value) {
81
+ const payload = Object.fromEntries(Object.entries(value).filter(([key]) => key !== 'receiptDigest'));
82
+ return growthObjectDigest({ contract: GROWTH_AUTOMATION_RECEIPT_PROTOCOL, receipt: payload });
83
+ }
84
+ export function withGrowthPortReceiptDigest(value) {
85
+ if (Object.hasOwn(value, 'receiptDigest'))
86
+ invalid('receipt builder payload already contains receiptDigest');
87
+ return Object.freeze({ ...value, receiptDigest: growthPortReceiptDigest(value) });
88
+ }
89
+ function verifiedReceipt(value) {
90
+ const digest = exactGrowthDigest(value['receiptDigest'], 'receiptDigest');
91
+ if (growthPortReceiptDigest(value) !== digest) {
92
+ throw new AssistantGrowthContractError('receipt-mismatch', 'growth receipt digest does not match its payload');
93
+ }
94
+ return digest;
95
+ }
96
+ export function validateGrowthAutomationProposalRequest(value) {
97
+ if (!isGrowthRecord(value))
98
+ invalid('growth automation proposal request must be an object');
99
+ assertExactGrowthKeys(value, [
100
+ 'contractVersion', 'operationId', 'experimentId', 'candidateId', 'candidateRevision',
101
+ 'candidateDigest', 'initialState', 'scope', 'ownerBindingId', 'evidenceDigest',
102
+ 'evidenceCount', 'template', 'steps', 'deadlineAt',
103
+ ], 'growth automation proposal request');
104
+ if (value['initialState'] !== 'paused'
105
+ || !Number.isSafeInteger(value['evidenceCount']) || value['evidenceCount'] < 1
106
+ || !Number.isSafeInteger(value['deadlineAt']) || value['deadlineAt'] < 0) {
107
+ invalid('growth automation proposal tuple is invalid');
108
+ }
109
+ return Object.freeze({
110
+ ...pickIdentity(value),
111
+ initialState: 'paused',
112
+ scope: validateWorkflowScope(value['scope']),
113
+ ownerBindingId: identifier(value['ownerBindingId'], 'ownerBindingId', 200),
114
+ evidenceDigest: exactGrowthDigest(value['evidenceDigest'], 'evidenceDigest'),
115
+ evidenceCount: value['evidenceCount'],
116
+ template: validateWorkflowAutomationTemplate(value['template']),
117
+ steps: validateWorkflowSteps(value['steps']),
118
+ deadlineAt: value['deadlineAt'],
119
+ });
120
+ }
121
+ export function validateGrowthAutomationApprovalRequest(value) {
122
+ if (!isGrowthRecord(value))
123
+ invalid('growth automation approval request must be an object');
124
+ assertExactGrowthKeys(value, [
125
+ 'contractVersion', 'operationId', 'experimentId', 'candidateId', 'candidateRevision',
126
+ 'candidateDigest', 'proposalId',
127
+ ], 'growth automation approval request');
128
+ return Object.freeze({ ...pickIdentity(value), proposalId: identifier(value['proposalId'], 'proposalId') });
129
+ }
130
+ export function validateGrowthAutomationArtifactRequest(value) {
131
+ if (!isGrowthRecord(value))
132
+ invalid('growth automation artifact request must be an object');
133
+ assertExactGrowthKeys(value, [
134
+ 'contractVersion', 'operationId', 'experimentId', 'candidateId', 'candidateRevision',
135
+ 'candidateDigest', 'artifactId', 'artifactVersion', 'artifactDigest',
136
+ ], 'growth automation artifact request');
137
+ return Object.freeze({ ...pickIdentity(value), ...pickArtifact(value) });
138
+ }
139
+ export function validateGrowthCanaryInspectionRequest(value) {
140
+ if (!isGrowthRecord(value))
141
+ invalid('growth canary inspection request must be an object');
142
+ assertExactGrowthKeys(value, [
143
+ 'contractVersion', 'operationId', 'experimentId', 'candidateId', 'candidateRevision',
144
+ 'candidateDigest', 'artifactId', 'artifactVersion', 'artifactDigest', 'exposureOperationId',
145
+ ], 'growth canary inspection request');
146
+ return Object.freeze({
147
+ ...validateGrowthAutomationArtifactRequest(Object.fromEntries(Object.entries(value).filter(([key]) => key !== 'exposureOperationId'))),
148
+ exposureOperationId: identifier(value['exposureOperationId'], 'exposureOperationId'),
149
+ });
150
+ }
151
+ function receiptIdentity(value, expected) {
152
+ const identity = pickIdentity(value);
153
+ if (expected !== undefined)
154
+ identityMatches(identity, expected);
155
+ return identity;
156
+ }
157
+ function receiptArtifact(value, expected) {
158
+ const artifact = pickArtifact(value);
159
+ if (expected !== undefined)
160
+ artifactMatches(artifact, expected);
161
+ return artifact;
162
+ }
163
+ const identityKeys = [
164
+ 'contractVersion', 'operationId', 'experimentId', 'candidateId', 'candidateRevision', 'candidateDigest',
165
+ ];
166
+ const artifactKeys = ['artifactId', 'artifactVersion', 'artifactDigest'];
167
+ export function validateGrowthAutomationProposalReceipt(value, expected) {
168
+ if (!isGrowthRecord(value))
169
+ invalid('growth automation proposal receipt must be an object');
170
+ const base = [...identityKeys, 'outcome', 'receiptDigest'];
171
+ if (value['outcome'] === 'approval-pending') {
172
+ assertExactGrowthKeys(value, [...base, 'proposalId'], 'growth automation proposal receipt');
173
+ const receipt = Object.freeze({
174
+ ...receiptIdentity(value, expected),
175
+ outcome: 'approval-pending',
176
+ proposalId: identifier(value['proposalId'], 'proposalId'),
177
+ receiptDigest: verifiedReceipt(value),
178
+ });
179
+ return receipt;
180
+ }
181
+ if (value['outcome'] === 'approved-paused') {
182
+ assertExactGrowthKeys(value, [...base, 'proposalId', ...artifactKeys], 'growth automation proposal receipt');
183
+ return Object.freeze({
184
+ ...receiptIdentity(value, expected),
185
+ outcome: 'approved-paused',
186
+ proposalId: identifier(value['proposalId'], 'proposalId'),
187
+ ...receiptArtifact(value),
188
+ receiptDigest: verifiedReceipt(value),
189
+ });
190
+ }
191
+ if (value['outcome'] === 'conflicted' || value['outcome'] === 'expired' || value['outcome'] === 'rejected') {
192
+ assertExactGrowthKeys(value, value['proposalId'] === undefined ? base : [...base, 'proposalId'], 'growth automation proposal receipt');
193
+ return Object.freeze({
194
+ ...receiptIdentity(value, expected),
195
+ outcome: value['outcome'],
196
+ ...(value['proposalId'] === undefined
197
+ ? {}
198
+ : { proposalId: identifier(value['proposalId'], 'proposalId') }),
199
+ receiptDigest: verifiedReceipt(value),
200
+ });
201
+ }
202
+ invalid('growth automation proposal outcome is invalid');
203
+ }
204
+ export function validateGrowthAutomationApprovalReceipt(value, expected) {
205
+ return validateGrowthAutomationProposalReceipt(value, expected);
206
+ }
207
+ function validateArtifactReceiptBase(value, expected) {
208
+ if (!isGrowthRecord(value))
209
+ invalid('growth artifact receipt must be an object');
210
+ const identity = receiptIdentity(value, expected);
211
+ const artifact = receiptArtifact(value, expected);
212
+ return { value, identity, artifact, receiptDigest: verifiedReceipt(value) };
213
+ }
214
+ export function validateGrowthReplayReceipt(value, expected) {
215
+ const base = validateArtifactReceiptBase(value, expected);
216
+ assertExactGrowthKeys(base.value, [
217
+ ...identityKeys, ...artifactKeys, 'outcome', 'replayDigest', 'receiptDigest',
218
+ ], 'growth replay receipt');
219
+ if (base.value['outcome'] !== 'passed' && base.value['outcome'] !== 'failed') {
220
+ invalid('growth replay outcome is invalid');
221
+ }
222
+ return Object.freeze({
223
+ ...base.identity,
224
+ ...base.artifact,
225
+ outcome: base.value['outcome'],
226
+ replayDigest: exactGrowthDigest(base.value['replayDigest'], 'replayDigest'),
227
+ receiptDigest: base.receiptDigest,
228
+ });
229
+ }
230
+ export function validateGrowthShadowReceipt(value, expected) {
231
+ const base = validateArtifactReceiptBase(value, expected);
232
+ assertExactGrowthKeys(base.value, [
233
+ ...identityKeys, ...artifactKeys, 'outcome', 'effectsBlocked', 'effectBlockerAttestation',
234
+ 'shadowDigest', 'receiptDigest',
235
+ ], 'growth shadow receipt');
236
+ if ((base.value['outcome'] !== 'passed' && base.value['outcome'] !== 'failed')
237
+ || base.value['effectsBlocked'] !== true || !isGrowthRecord(base.value['effectBlockerAttestation'])) {
238
+ invalid('growth shadow outcome or effect blocker is invalid');
239
+ }
240
+ const blocker = base.value['effectBlockerAttestation'];
241
+ assertExactGrowthKeys(blocker, ['contract', 'blockedEffects', 'implementationDigest'], 'growth effect blocker attestation');
242
+ if (blocker['contract'] !== GROWTH_EFFECT_BLOCKER_PROTOCOL
243
+ || !Array.isArray(blocker['blockedEffects'])
244
+ || canonicalGrowthJson(blocker['blockedEffects']) !== canonicalGrowthJson(['delivery', 'tool-execution'])) {
245
+ invalid('growth effect blocker attestation is invalid');
246
+ }
247
+ return Object.freeze({
248
+ ...base.identity,
249
+ ...base.artifact,
250
+ outcome: base.value['outcome'],
251
+ effectsBlocked: true,
252
+ effectBlockerAttestation: Object.freeze({
253
+ contract: GROWTH_EFFECT_BLOCKER_PROTOCOL,
254
+ blockedEffects: Object.freeze(['delivery', 'tool-execution']),
255
+ implementationDigest: exactGrowthDigest(blocker['implementationDigest'], 'effect blocker implementation digest'),
256
+ }),
257
+ shadowDigest: exactGrowthDigest(base.value['shadowDigest'], 'shadowDigest'),
258
+ receiptDigest: base.receiptDigest,
259
+ });
260
+ }
261
+ function validateCanaryReceipt(value, expected, expectedExposureOperationId) {
262
+ const base = validateArtifactReceiptBase(value, expected);
263
+ const passed = base.value['outcome'] === 'passed';
264
+ assertExactGrowthKeys(base.value, [
265
+ ...identityKeys, ...artifactKeys, 'outcome', 'exposureCount', 'exposureOperationId',
266
+ ...(passed ? ['evaluationDigest', 'evaluationTrust', 'objectiveStatus'] : []),
267
+ 'receiptDigest',
268
+ ], 'growth canary receipt');
269
+ if (base.value['outcome'] !== 'passed' && base.value['outcome'] !== 'failed'
270
+ && base.value['outcome'] !== 'pending')
271
+ invalid('growth canary outcome is invalid');
272
+ const exposureOperationId = identifier(base.value['exposureOperationId'], 'exposureOperationId');
273
+ if (base.value['exposureCount'] !== 1
274
+ || (expectedExposureOperationId !== undefined && exposureOperationId !== expectedExposureOperationId)) {
275
+ throw new AssistantGrowthContractError('receipt-mismatch', 'growth canary exposure identity is invalid');
276
+ }
277
+ if (passed && (base.value['evaluationTrust'] !== 'trusted'
278
+ || base.value['objectiveStatus'] !== 'achieved')) {
279
+ invalid('growth canary pass lacks a trusted achieved Evaluation projection');
280
+ }
281
+ return Object.freeze({
282
+ ...base.identity,
283
+ ...base.artifact,
284
+ outcome: base.value['outcome'],
285
+ exposureCount: 1,
286
+ exposureOperationId,
287
+ ...(passed ? {
288
+ evaluationDigest: exactGrowthDigest(base.value['evaluationDigest'], 'evaluationDigest'),
289
+ evaluationTrust: 'trusted',
290
+ objectiveStatus: 'achieved',
291
+ } : {}),
292
+ receiptDigest: base.receiptDigest,
293
+ });
294
+ }
295
+ export function validateGrowthCanaryReceipt(value, expected) {
296
+ const exposure = expected === undefined ? undefined : `${expected.experimentId}:canary`;
297
+ return validateCanaryReceipt(value, expected, exposure);
298
+ }
299
+ export function validateGrowthCanaryInspectionReceipt(value, expected) {
300
+ const artifact = expected === undefined ? undefined : validateGrowthAutomationArtifactRequest(Object.fromEntries(Object.entries(expected).filter(([key]) => key !== 'exposureOperationId')));
301
+ return validateCanaryReceipt(value, artifact, expected?.exposureOperationId);
302
+ }
303
+ export function validateGrowthPromotionReceipt(value, expected) {
304
+ const base = validateArtifactReceiptBase(value, expected);
305
+ assertExactGrowthKeys(base.value, [
306
+ ...identityKeys, ...artifactKeys, 'outcome', 'resultingArtifactVersion',
307
+ 'resultingArtifactDigest', 'receiptDigest',
308
+ ], 'growth promotion receipt');
309
+ if (base.value['outcome'] !== 'promoted'
310
+ || base.value['resultingArtifactVersion'] !== base.artifact.artifactVersion + 1) {
311
+ throw new AssistantGrowthContractError('receipt-mismatch', 'growth promotion did not satisfy exact artifact CAS');
312
+ }
313
+ return Object.freeze({
314
+ ...base.identity,
315
+ ...base.artifact,
316
+ outcome: 'promoted',
317
+ resultingArtifactVersion: base.value['resultingArtifactVersion'],
318
+ resultingArtifactDigest: exactGrowthDigest(base.value['resultingArtifactDigest'], 'resultingArtifactDigest'),
319
+ receiptDigest: base.receiptDigest,
320
+ });
321
+ }
322
+ export function validateGrowthRollbackReceipt(value, expected) {
323
+ const base = validateArtifactReceiptBase(value, expected);
324
+ assertExactGrowthKeys(base.value, [
325
+ ...identityKeys, ...artifactKeys, 'outcome', 'receiptDigest',
326
+ ], 'growth rollback receipt');
327
+ if (base.value['outcome'] !== 'rolled-back')
328
+ invalid('growth rollback outcome is invalid');
329
+ return Object.freeze({
330
+ ...base.identity,
331
+ ...base.artifact,
332
+ outcome: 'rolled-back',
333
+ receiptDigest: base.receiptDigest,
334
+ });
335
+ }
336
+ //# sourceMappingURL=automation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automation.js","sourceRoot":"","sources":["../src/automation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { type GrowthWorkflowTraceSourceRegistration, type ResolvedWorkflowAutomationTemplate, type WorkflowAutomationTemplate, type WorkflowAutomationTemplateContent, type WorkflowScope, type WorkflowStepFingerprint, type WorkflowTemplatePrivacyAttestation, type WorkflowTraceEvidence, type WorkflowTraceProjectionReceipt, type WorkflowTraceRevision, type WorkflowTraceSourceAttestation } from './types.js';
2
+ export type AssistantGrowthContractErrorCode = 'invalid-input' | 'receipt-mismatch';
3
+ export declare class AssistantGrowthContractError extends Error {
4
+ readonly code: AssistantGrowthContractErrorCode;
5
+ constructor(code: AssistantGrowthContractErrorCode, message: string);
6
+ }
7
+ export declare function isGrowthRecord(value: unknown): value is Record<string, unknown>;
8
+ export declare function assertExactGrowthKeys(value: Readonly<Record<string, unknown>>, expected: readonly string[], label: string): void;
9
+ /**
10
+ * Validate Delivery's canonical four-component external principal identity.
11
+ * Components are independently URI-encoded, so provider-owned slashes cannot
12
+ * be confused with the separators between channel/account/tenant/user.
13
+ */
14
+ export declare function validateExternalPrincipalId(value: unknown): string;
15
+ export declare function exactGrowthDigest(value: unknown, label?: string): string;
16
+ /** Strict canonical JSON for already-validated protocol payloads. */
17
+ export declare function canonicalGrowthJson(value: unknown): string;
18
+ export declare function growthSha256(value: string | Uint8Array): string;
19
+ export declare function growthObjectDigest(value: unknown): string;
20
+ /**
21
+ * Fingerprint JSON structure only. Scalar values, array length and member
22
+ * order are deliberately absent. Object field names remain part of shape.
23
+ */
24
+ export declare function workflowArgumentShapeDigest(input: unknown): string;
25
+ export declare function validateWorkflowScope(value: unknown): Readonly<WorkflowScope>;
26
+ export declare function workflowScopeKey(value: unknown): string;
27
+ export declare function validateWorkflowStepFingerprint(value: unknown): Readonly<WorkflowStepFingerprint>;
28
+ export declare function validateWorkflowSteps(value: unknown): readonly Readonly<WorkflowStepFingerprint>[];
29
+ export declare function validateWorkflowTemplatePrivacyAttestation(value: unknown): WorkflowTemplatePrivacyAttestation;
30
+ export declare function validateWorkflowAutomationTemplate(value: unknown): Readonly<WorkflowAutomationTemplate>;
31
+ export declare function validateWorkflowAutomationTemplateContent(value: unknown): Readonly<WorkflowAutomationTemplateContent>;
32
+ export declare function workflowAutomationTemplateContentDigest(value: unknown): string;
33
+ export declare function validateResolvedWorkflowAutomationTemplate(value: unknown): Readonly<ResolvedWorkflowAutomationTemplate>;
34
+ export declare function validateWorkflowTraceEvidence(value: unknown): Readonly<WorkflowTraceEvidence>;
35
+ export declare function validateWorkflowTraceSourceAttestation(value: unknown): Readonly<WorkflowTraceSourceAttestation>;
36
+ export declare function workflowTraceRevisionDigest(value: Omit<WorkflowTraceRevision, 'digest'>): string;
37
+ export declare function validateWorkflowTraceRevision(value: unknown): Readonly<WorkflowTraceRevision>;
38
+ export declare function workflowCandidateSignature(input: Readonly<{
39
+ scope: Readonly<WorkflowScope>;
40
+ evidence: Readonly<WorkflowTraceEvidence>;
41
+ }>): string;
42
+ export declare function validateWorkflowTraceProjectionReceipt(value: unknown, expected?: Readonly<WorkflowTraceRevision>): Readonly<WorkflowTraceProjectionReceipt>;
43
+ export declare function validateGrowthWorkflowTraceSourceRegistration(value: unknown): GrowthWorkflowTraceSourceRegistration;
44
+ //# sourceMappingURL=canonical.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"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"}