@dsh-enhanced/assistant-verifier 0.1.48 → 0.1.49
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/README.md +89 -0
- package/lib/config.d.ts +8 -0
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +4 -0
- package/lib/config.js.map +1 -1
- package/lib/creation-review-native.d.ts +30 -0
- package/lib/creation-review-native.d.ts.map +1 -0
- package/lib/creation-review-native.js +130 -0
- package/lib/creation-review-native.js.map +1 -0
- package/lib/creation-review-store.d.ts +29 -0
- package/lib/creation-review-store.d.ts.map +1 -0
- package/lib/creation-review-store.js +206 -0
- package/lib/creation-review-store.js.map +1 -0
- package/lib/creation-review.d.ts +159 -0
- package/lib/creation-review.d.ts.map +1 -0
- package/lib/creation-review.js +511 -0
- package/lib/creation-review.js.map +1 -0
- package/lib/index.d.ts +9 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +4 -0
- package/lib/index.js.map +1 -1
- package/lib/memory-review-native.d.ts +38 -0
- package/lib/memory-review-native.d.ts.map +1 -0
- package/lib/memory-review-native.js +149 -0
- package/lib/memory-review-native.js.map +1 -0
- package/lib/memory-review.d.ts +48 -0
- package/lib/memory-review.d.ts.map +1 -0
- package/lib/memory-review.js +260 -0
- package/lib/memory-review.js.map +1 -0
- package/lib/plugin-behavior-runner.d.ts +46 -0
- package/lib/plugin-behavior-runner.d.ts.map +1 -0
- package/lib/plugin-behavior-runner.js +437 -0
- package/lib/plugin-behavior-runner.js.map +1 -0
- package/lib/revision-regression-review.d.ts +38 -0
- package/lib/revision-regression-review.d.ts.map +1 -0
- package/lib/revision-regression-review.js +315 -0
- package/lib/revision-regression-review.js.map +1 -0
- package/lib/revision-review.d.ts +99 -0
- package/lib/revision-review.d.ts.map +1 -0
- package/lib/revision-review.js +275 -0
- package/lib/revision-review.js.map +1 -0
- package/lib/service.d.ts +30 -0
- package/lib/service.d.ts.map +1 -1
- package/lib/service.js +139 -1
- package/lib/service.js.map +1 -1
- package/lib/source-review-native.d.ts +9 -0
- package/lib/source-review-native.d.ts.map +1 -1
- package/lib/source-review-native.js +6 -5
- package/lib/source-review-native.js.map +1 -1
- package/lib/source-review-store.d.ts +4 -0
- package/lib/source-review-store.d.ts.map +1 -1
- package/lib/source-review-store.js +65 -12
- package/lib/source-review-store.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +34 -25
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import { createHash, sign } from 'node:crypto';
|
|
2
|
+
import { canonicalGrowthJson, growthObjectDigest, pluginRevisionRegressionSigningPayload, sourceGrowthEvidenceDigest, sourceGrowthRunDigest, validatePluginCreationVerificationCertificate, validatePluginRevisionParentBinding, validatePluginRevisionRegressionRequest, validatePluginRevisionVerificationCertificate, validateRevisionRegressionAcceptanceAuthorityRef, validateSourceGrowthRunBinding, verifyPluginRevisionRegressionCertificate } from '@dsh-enhanced/assistant-growth-contract';
|
|
3
|
+
import { CreationReviewStore } from './creation-review-store.js';
|
|
4
|
+
import { COMPARISON_RULES, SCHEMA_RULES, RULES_VERSION, compareCase, compileCreationReviewConfig, parseCases, projectCreationSchemas } from './creation-review.js';
|
|
5
|
+
const PURPOSE = 'assistant-growth/revision-regression-review/v1';
|
|
6
|
+
const RULES = 'retained-creation-cases-v1:private-certificate-and-case-proof;fresh-parent-and-candidate-isolated-observations;both-compare-expected;exact-sanitized-schema-and-environment;no-model';
|
|
7
|
+
const SHA = /^[a-f0-9]{64}$/u;
|
|
8
|
+
function legacyConfig(input) {
|
|
9
|
+
if (!input || typeof input !== 'object' || Array.isArray(input)
|
|
10
|
+
|| Object.getPrototypeOf(input) !== Object.prototype
|
|
11
|
+
|| Reflect.ownKeys(input).some(key => typeof key !== 'string')
|
|
12
|
+
|| Object.keys(input).sort().join(',') !== ['authorityId', 'owner', 'namePrefix', 'keyId', 'keyPath',
|
|
13
|
+
'expiresAt', 'maxVerifications', 'runner', 'maxDurationMs', 'maxCases', 'receiptTtlMs'].sort().join(',')
|
|
14
|
+
|| Object.values(Object.getOwnPropertyDescriptors(input)).some(field => !field.enumerable || !('value' in field))) {
|
|
15
|
+
throw new Error('revision regression review invalid config');
|
|
16
|
+
}
|
|
17
|
+
return { ...input, policy: RULES, maxInputBytes: 4096, maxOutputTokens: 2 };
|
|
18
|
+
}
|
|
19
|
+
export function validateRevisionRegressionReviewConfig(input) {
|
|
20
|
+
const checked = compileCreationReviewConfig(legacyConfig(input)).config;
|
|
21
|
+
if (checked.runner.maxRuns < checked.maxVerifications * (2 + 2 * checked.maxCases)) {
|
|
22
|
+
throw new Error('revision regression runner cannot cover paired observations');
|
|
23
|
+
}
|
|
24
|
+
const { policy: _policy, maxInputBytes: _maxInputBytes, maxOutputTokens: _maxOutputTokens, ...config } = checked;
|
|
25
|
+
return config;
|
|
26
|
+
}
|
|
27
|
+
export function compileRevisionRegressionReviewConfig(input) {
|
|
28
|
+
const config = validateRevisionRegressionReviewConfig(input);
|
|
29
|
+
const checked = compileCreationReviewConfig(legacyConfig(config));
|
|
30
|
+
const authority = {
|
|
31
|
+
protocol: 'assistant-growth/revision-regression-acceptance-authority/v1', authorityId: config.authorityId,
|
|
32
|
+
keyId: config.keyId, namePrefix: config.namePrefix, expiresAt: config.expiresAt,
|
|
33
|
+
authorityDigest: growthObjectDigest({ purpose: PURPOSE, rules: RULES, baseRules: RULES_VERSION,
|
|
34
|
+
comparisonRules: COMPARISON_RULES, schemaRules: SCHEMA_RULES,
|
|
35
|
+
configurationDigest: checked.authority.authorityDigest }),
|
|
36
|
+
};
|
|
37
|
+
validateRevisionRegressionAcceptanceAuthorityRef(authority);
|
|
38
|
+
return { config, authority: Object.freeze(authority), publicKey: checked.publicKey, privateKey: checked.privateKey };
|
|
39
|
+
}
|
|
40
|
+
function retainedCases(value, parent, maxCases) {
|
|
41
|
+
if (!value || canonicalGrowthJson(value.certificate) !== canonicalGrowthJson(parent))
|
|
42
|
+
throw new Error('retained parent cases unavailable');
|
|
43
|
+
const contract = value.contract;
|
|
44
|
+
const discovery = value.discovery;
|
|
45
|
+
if (!contract || typeof contract !== 'object' || Array.isArray(contract)
|
|
46
|
+
|| Object.keys(contract).sort().join(',') !== 'cases,outputDigest,sessionId'
|
|
47
|
+
|| contract.sessionId !== parent.sessions.contract || typeof contract.outputDigest !== 'string' || !SHA.test(contract.outputDigest)
|
|
48
|
+
|| !discovery || typeof discovery !== 'object' || Array.isArray(discovery)
|
|
49
|
+
|| Object.keys(discovery).sort().join(',') !== 'environment,jobId,schemaDigest,schemas'
|
|
50
|
+
|| discovery.schemaDigest !== parent.schemaDigest
|
|
51
|
+
|| canonicalGrowthJson(discovery.environment) !== canonicalGrowthJson(parent.environment)
|
|
52
|
+
|| typeof discovery.jobId !== 'string' || !Array.isArray(discovery.schemas))
|
|
53
|
+
throw new Error('retained parent contract changed');
|
|
54
|
+
const schemas = projectCreationSchemas(discovery.schemas);
|
|
55
|
+
const parsed = parseCases({ status: 'cases', cases: contract.cases }, maxCases, schemas);
|
|
56
|
+
if (parsed.status !== 'cases' || growthObjectDigest(parsed.cases) !== parent.contractDigest
|
|
57
|
+
|| Object.keys(value.cases).length !== parsed.cases.length || parsed.cases.length !== parent.observations.length) {
|
|
58
|
+
throw new Error('retained parent contract digest changed');
|
|
59
|
+
}
|
|
60
|
+
for (const item of parsed.cases) {
|
|
61
|
+
const old = parent.observations.find(entry => entry.caseId === item.id);
|
|
62
|
+
const saved = value.cases[item.id];
|
|
63
|
+
const operation = { kind: 'invoke', schemaDigest: parent.schemaDigest,
|
|
64
|
+
calls: [{ id: item.id, toolName: item.toolName, arguments: item.arguments }] };
|
|
65
|
+
if (!old || !saved || canonicalGrowthJson(saved) !== canonicalGrowthJson(old)
|
|
66
|
+
|| old.operationDigest !== growthObjectDigest(operation))
|
|
67
|
+
throw new Error('retained parent observation changed');
|
|
68
|
+
}
|
|
69
|
+
return { cases: parsed.cases, schemas };
|
|
70
|
+
}
|
|
71
|
+
/** Independent paired Docker regression; this runtime has no LLM service and cannot switch a tool. */
|
|
72
|
+
export class RevisionRegressionReviewRuntime {
|
|
73
|
+
ctx;
|
|
74
|
+
readParentCases;
|
|
75
|
+
#compiled;
|
|
76
|
+
#store;
|
|
77
|
+
#runner;
|
|
78
|
+
#runnerLoading;
|
|
79
|
+
#abort = new AbortController();
|
|
80
|
+
#flights = new Map();
|
|
81
|
+
#closing;
|
|
82
|
+
constructor(ctx, input, databasePath, readParentCases) {
|
|
83
|
+
this.ctx = ctx;
|
|
84
|
+
this.readParentCases = readParentCases;
|
|
85
|
+
this.#compiled = compileRevisionRegressionReviewConfig(input);
|
|
86
|
+
this.#store = new CreationReviewStore(databasePath + '.revision-regressions');
|
|
87
|
+
}
|
|
88
|
+
#loadRunner() {
|
|
89
|
+
if (this.#runner)
|
|
90
|
+
return Promise.resolve(this.#runner);
|
|
91
|
+
return this.#runnerLoading ??= import('./plugin-behavior-runner.js').then(({ PluginBehaviorRunner }) => {
|
|
92
|
+
this.#abort.signal.throwIfAborted();
|
|
93
|
+
const { config, authority } = this.#compiled;
|
|
94
|
+
if (Date.now() >= Math.min(config.expiresAt, config.runner.expiresAt))
|
|
95
|
+
throw new Error('regression runner authority expired');
|
|
96
|
+
return this.#runner = new PluginBehaviorRunner({ ...config.runner, authorityDigest: authority.authorityDigest });
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
inspect(input) {
|
|
100
|
+
const { config, authority, publicKey } = this.#compiled;
|
|
101
|
+
if (this.#abort.signal.aborted || Date.now() >= config.expiresAt
|
|
102
|
+
|| canonicalGrowthJson(input.owner) !== canonicalGrowthJson(config.owner))
|
|
103
|
+
return undefined;
|
|
104
|
+
const remainingVerifications = this.#store.remaining(config.authorityId, authority.authorityDigest, config.maxVerifications);
|
|
105
|
+
return Object.freeze({ authority, publicKey, remainingVerifications, available: remainingVerifications > 0 });
|
|
106
|
+
}
|
|
107
|
+
run(request, external) {
|
|
108
|
+
try {
|
|
109
|
+
validatePluginRevisionRegressionRequest(request);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return Promise.resolve({ status: 'rejected', reason: 'request-invalid' });
|
|
113
|
+
}
|
|
114
|
+
if (this.#abort.signal.aborted)
|
|
115
|
+
return Promise.resolve({ status: 'unknown', reason: 'interrupted' });
|
|
116
|
+
const existing = this.#flights.get(request.planId);
|
|
117
|
+
if (existing)
|
|
118
|
+
return existing;
|
|
119
|
+
const flight = this.#run(request, external);
|
|
120
|
+
this.#flights.set(request.planId, flight);
|
|
121
|
+
void flight.finally(() => this.#flights.delete(request.planId)).catch(() => { });
|
|
122
|
+
return flight;
|
|
123
|
+
}
|
|
124
|
+
async #run(request, external) {
|
|
125
|
+
const { config, authority, privateKey, publicKey } = this.#compiled;
|
|
126
|
+
const signal = AbortSignal.any([this.#abort.signal, AbortSignal.timeout(config.maxDurationMs), ...(external ? [external] : [])]);
|
|
127
|
+
let admitted;
|
|
128
|
+
try {
|
|
129
|
+
signal.throwIfAborted();
|
|
130
|
+
const port = this.ctx.get('pluginControlPlane');
|
|
131
|
+
if (!port || typeof port.inspectPreparedRevisionRegression !== 'function'
|
|
132
|
+
|| typeof port.withPreparedRevisionRegressionFence !== 'function'
|
|
133
|
+
|| typeof port.inspectPreparedRevisionReviewContext !== 'function')
|
|
134
|
+
throw new Error('regression Host port unavailable');
|
|
135
|
+
const snapshot = port.inspectPreparedRevisionRegression(request.planId);
|
|
136
|
+
if (snapshot.protocol !== 'dsh-prepared-revision-regression/v1')
|
|
137
|
+
throw new Error('regression Host protocol changed');
|
|
138
|
+
const { plan, job, reference, candidate, parent } = snapshot;
|
|
139
|
+
validateSourceGrowthRunBinding(plan.sourceRevision?.growthRun);
|
|
140
|
+
const frozen = plan.sourceRevision.growthRun;
|
|
141
|
+
validateRevisionRegressionAcceptanceAuthorityRef(frozen.revisionRegressionAcceptance);
|
|
142
|
+
validatePluginRevisionVerificationCertificate(candidate.certificate);
|
|
143
|
+
validatePluginCreationVerificationCertificate(parent.certificate);
|
|
144
|
+
validatePluginRevisionParentBinding(parent.binding);
|
|
145
|
+
const now = Date.now();
|
|
146
|
+
const sourceBinding = { referenceDigest: sourceGrowthEvidenceDigest(reference),
|
|
147
|
+
ownerDigest: sourceGrowthEvidenceDigest(reference.owner), growthRunDigest: sourceGrowthRunDigest(frozen) };
|
|
148
|
+
const parentDigest = sourceGrowthEvidenceDigest(parent.binding);
|
|
149
|
+
const candidateVerificationDigest = sourceGrowthEvidenceDigest(candidate.certificate);
|
|
150
|
+
const authorityDigest = sourceGrowthEvidenceDigest(authority);
|
|
151
|
+
if (plan.mode !== 'prepared-revise' || plan.status !== 'pending-approval' || plan.id !== request.planId
|
|
152
|
+
|| canonicalGrowthJson(frozen.revisionRegressionAcceptance) !== canonicalGrowthJson(authority)
|
|
153
|
+
|| canonicalGrowthJson(frozen) !== canonicalGrowthJson(job.intent.revision?.growthRun)
|
|
154
|
+
|| canonicalGrowthJson(parent.binding) !== canonicalGrowthJson(job.intent.revision?.parent)
|
|
155
|
+
|| canonicalGrowthJson(parent.binding) !== canonicalGrowthJson(plan.sourceRevision.parent)
|
|
156
|
+
|| canonicalGrowthJson(parent.binding) !== canonicalGrowthJson(candidate.certificate.parent)
|
|
157
|
+
|| parent.binding.planId !== parent.certificate.plan.id
|
|
158
|
+
|| parent.binding.certificateDigest !== sourceGrowthEvidenceDigest(parent.certificate)
|
|
159
|
+
|| parent.binding.artifactSha256 !== parent.certificate.plan.artifactSha256
|
|
160
|
+
|| candidate.certificate.plan.id !== plan.id || candidate.certificate.plan.digest !== plan.digest
|
|
161
|
+
|| candidate.certificate.plan.name !== plan.name || candidate.certificate.source.referenceDigest !== sourceBinding.referenceDigest
|
|
162
|
+
|| candidate.certificate.source.ownerDigest !== sourceBinding.ownerDigest
|
|
163
|
+
|| candidate.certificate.source.growthRunDigest !== sourceBinding.growthRunDigest
|
|
164
|
+
|| canonicalGrowthJson(candidate.certificate.model) !== canonicalGrowthJson(frozen.model)
|
|
165
|
+
|| candidate.certificate.plan.artifactSha256 !== createHash('sha256').update(candidate.artifact).digest('hex')
|
|
166
|
+
|| candidate.certificate.plan.artifactBytes !== candidate.artifact.length
|
|
167
|
+
|| parent.certificate.plan.artifactSha256 !== createHash('sha256').update(parent.artifact).digest('hex')
|
|
168
|
+
|| parent.certificate.plan.artifactBytes !== parent.artifact.length
|
|
169
|
+
|| typeof candidate.sourceDigest !== 'string' || !SHA.test(candidate.sourceDigest)
|
|
170
|
+
|| now >= Math.min(config.expiresAt, config.runner.expiresAt, plan.expiresAt, plan.sourceRevision.grant.expiresAt, frozen.expiresAt, authority.expiresAt, candidate.certificate.expiresAt)) {
|
|
171
|
+
throw new Error('regression source or authority changed');
|
|
172
|
+
}
|
|
173
|
+
for (const key of ['authorityId', 'authorityHash', 'principalId', 'principalRecordId', 'principalVersion', 'workspace', 'agentPreset']) {
|
|
174
|
+
if (reference.owner[key] !== config.owner[key])
|
|
175
|
+
throw new Error('regression owner changed');
|
|
176
|
+
}
|
|
177
|
+
const fenceInput = { planId: plan.id, planDigest: plan.digest, artifactSha256: candidate.certificate.plan.artifactSha256,
|
|
178
|
+
growthRunDigest: sourceBinding.growthRunDigest, referenceDigest: sourceBinding.referenceDigest,
|
|
179
|
+
parentDigest, candidateVerificationDigest, sourceDigest: candidate.sourceDigest,
|
|
180
|
+
regressionAuthorityDigest: authorityDigest };
|
|
181
|
+
const fence = (callback) => port.withPreparedRevisionRegressionFence(fenceInput, callback);
|
|
182
|
+
fence(() => { });
|
|
183
|
+
const binding = growthObjectDigest({ purpose: PURPOSE, request, authority, fenceInput,
|
|
184
|
+
parentCertificateDigest: parent.binding.certificateDigest, candidateVerificationDigest,
|
|
185
|
+
budget: { maxCases: config.maxCases, maxDurationMs: config.maxDurationMs, maxRuns: 2 + 2 * config.maxCases } });
|
|
186
|
+
const claim = fence(() => this.#store.claim(plan.id, binding, config.authorityId, authority.authorityDigest, config.maxVerifications));
|
|
187
|
+
if (claim.state === 'certificate')
|
|
188
|
+
return claim.certificate
|
|
189
|
+
&& verifyPluginRevisionRegressionCertificate(claim.certificate, authority, publicKey)
|
|
190
|
+
? { status: 'verified', certificate: claim.certificate } : { status: 'unknown', reason: 'stale-source' };
|
|
191
|
+
if (claim.state === 'rejected')
|
|
192
|
+
return { status: 'rejected', reason: claim.reason };
|
|
193
|
+
if (claim.state !== 'new')
|
|
194
|
+
return { status: 'unknown', reason: claim.reason ?? 'previous-unknown' };
|
|
195
|
+
admitted = { planId: plan.id, binding };
|
|
196
|
+
const retained = retainedCases(this.readParentCases(parent.certificate), parent.certificate, config.maxCases);
|
|
197
|
+
fence(() => { });
|
|
198
|
+
const observer = await this.#loadRunner();
|
|
199
|
+
const jobs = new Set();
|
|
200
|
+
const discover = async (side, artifact, expectedSha) => {
|
|
201
|
+
signal.throwIfAborted();
|
|
202
|
+
fence(() => { });
|
|
203
|
+
const result = await observer.run({ key: growthObjectDigest([binding, side, 'discover']),
|
|
204
|
+
artifact, operation: { kind: 'discover' }, signal });
|
|
205
|
+
if (result.status !== 'observed' || !result.quiescent || !result.jobId || jobs.has(result.jobId)
|
|
206
|
+
|| result.artifactSha256 !== expectedSha || !result.schemaDigest || !result.schemas || !result.environment) {
|
|
207
|
+
throw new Error(`${side} schema observation unknown`);
|
|
208
|
+
}
|
|
209
|
+
jobs.add(result.jobId);
|
|
210
|
+
fence(() => { });
|
|
211
|
+
return result;
|
|
212
|
+
};
|
|
213
|
+
const parentDiscovery = await discover('parent', parent.artifact, parent.binding.artifactSha256);
|
|
214
|
+
const candidateDiscovery = await discover('candidate', candidate.artifact, candidate.certificate.plan.artifactSha256);
|
|
215
|
+
const parentSchemas = projectCreationSchemas(parentDiscovery.schemas);
|
|
216
|
+
const candidateSchemas = projectCreationSchemas(candidateDiscovery.schemas);
|
|
217
|
+
if (parentDiscovery.schemaDigest !== parent.certificate.schemaDigest
|
|
218
|
+
|| candidateDiscovery.schemaDigest !== candidate.certificate.schemaDigest
|
|
219
|
+
|| canonicalGrowthJson(parentSchemas) !== canonicalGrowthJson(retained.schemas)
|
|
220
|
+
|| canonicalGrowthJson(parentSchemas) !== canonicalGrowthJson(candidateSchemas)
|
|
221
|
+
|| canonicalGrowthJson(parentDiscovery.environment) !== canonicalGrowthJson(parent.certificate.environment)
|
|
222
|
+
|| canonicalGrowthJson(candidateDiscovery.environment) !== canonicalGrowthJson(candidate.certificate.environment)
|
|
223
|
+
|| canonicalGrowthJson(parentDiscovery.environment) !== canonicalGrowthJson(candidateDiscovery.environment)) {
|
|
224
|
+
fence(() => this.#store.reject(plan.id, binding, 'schema-or-environment-mismatch'));
|
|
225
|
+
admitted = undefined;
|
|
226
|
+
return { status: 'rejected', reason: 'schema-or-environment-mismatch' };
|
|
227
|
+
}
|
|
228
|
+
fence(() => this.#store.discovered(plan.id, binding, { parent: parentDiscovery.jobId, candidate: candidateDiscovery.jobId }));
|
|
229
|
+
fence(() => this.#store.contract(plan.id, binding, { cases: retained.cases }));
|
|
230
|
+
const observations = [];
|
|
231
|
+
for (const item of retained.cases) {
|
|
232
|
+
signal.throwIfAborted();
|
|
233
|
+
fence(() => { });
|
|
234
|
+
const operations = {
|
|
235
|
+
parent: { kind: 'invoke', schemaDigest: parentDiscovery.schemaDigest,
|
|
236
|
+
calls: [{ id: item.id, toolName: item.toolName, arguments: item.arguments }] },
|
|
237
|
+
candidate: { kind: 'invoke', schemaDigest: candidateDiscovery.schemaDigest,
|
|
238
|
+
calls: [{ id: item.id, toolName: item.toolName, arguments: item.arguments }] },
|
|
239
|
+
};
|
|
240
|
+
fence(() => this.#store.claimCase(plan.id, binding, item.id, growthObjectDigest(operations)));
|
|
241
|
+
const pair = {};
|
|
242
|
+
for (const side of ['parent', 'candidate']) {
|
|
243
|
+
const operation = operations[side];
|
|
244
|
+
const observed = await observer.run({ key: growthObjectDigest([binding, side, item.id, growthObjectDigest(operation)]),
|
|
245
|
+
artifact: side === 'parent' ? parent.artifact : candidate.artifact, operation, signal });
|
|
246
|
+
if (observed.status !== 'observed' || !observed.quiescent || !observed.jobId || jobs.has(observed.jobId)
|
|
247
|
+
|| observed.artifactSha256 !== (side === 'parent' ? parent.binding.artifactSha256 : candidate.certificate.plan.artifactSha256)
|
|
248
|
+
|| observed.schemaDigest !== operation.schemaDigest
|
|
249
|
+
|| canonicalGrowthJson(observed.environment) !== canonicalGrowthJson(parentDiscovery.environment)
|
|
250
|
+
|| observed.calls?.length !== 1 || observed.calls[0]?.id !== item.id
|
|
251
|
+
|| observed.calls[0]?.toolName !== item.toolName)
|
|
252
|
+
throw new Error(`${side} case observation unknown`);
|
|
253
|
+
jobs.add(observed.jobId);
|
|
254
|
+
const raw = observed.calls[0].result;
|
|
255
|
+
if (!compareCase(item.expected, raw)) {
|
|
256
|
+
const reason = side === 'parent' ? 'parent-baseline-mismatch' : 'candidate-regression';
|
|
257
|
+
fence(() => this.#store.reject(plan.id, binding, reason));
|
|
258
|
+
admitted = undefined;
|
|
259
|
+
return { status: 'rejected', reason };
|
|
260
|
+
}
|
|
261
|
+
pair[side] = { jobId: observed.jobId, operationDigest: growthObjectDigest(operation),
|
|
262
|
+
observationDigest: growthObjectDigest(raw) };
|
|
263
|
+
fence(() => { });
|
|
264
|
+
}
|
|
265
|
+
const complete = { caseId: item.id, parent: pair.parent, candidate: pair.candidate };
|
|
266
|
+
fence(() => this.#store.observation(plan.id, binding, item.id, complete));
|
|
267
|
+
observations.push(complete);
|
|
268
|
+
}
|
|
269
|
+
await port.inspectPreparedRevisionReviewContext(plan.id, signal);
|
|
270
|
+
fence(() => this.#store.claimReview(plan.id, binding));
|
|
271
|
+
const verifiedAt = Date.now();
|
|
272
|
+
const expiresAt = Math.min(verifiedAt + config.receiptTtlMs, config.expiresAt, config.runner.expiresAt, plan.expiresAt, plan.sourceRevision.grant.expiresAt, frozen.expiresAt, candidate.certificate.expiresAt);
|
|
273
|
+
if (expiresAt <= verifiedAt)
|
|
274
|
+
throw new Error('regression verification windows closed');
|
|
275
|
+
const body = {
|
|
276
|
+
protocol: 'assistant-growth/revision-regression/v1', verificationId: `regression-${binding.slice(0, 40)}`,
|
|
277
|
+
authority, plan: candidate.certificate.plan, parent: parent.binding, source: sourceBinding,
|
|
278
|
+
contractDigest: parent.certificate.contractDigest, schemaDigest: candidateDiscovery.schemaDigest,
|
|
279
|
+
environment: candidateDiscovery.environment, model: frozen.model,
|
|
280
|
+
candidateVerificationDigest, sourceDigest: candidate.sourceDigest,
|
|
281
|
+
schemaCompatibilityDigest: growthObjectDigest(parentSchemas),
|
|
282
|
+
budget: { maxCases: config.maxCases, maxDurationMs: config.maxDurationMs, maxRuns: 2 + 2 * config.maxCases },
|
|
283
|
+
observations, verifiedAt, expiresAt,
|
|
284
|
+
};
|
|
285
|
+
const certificate = { ...body, signature: sign(null, Buffer.from(pluginRevisionRegressionSigningPayload(body)), privateKey).toString('base64url') };
|
|
286
|
+
fence(() => this.#store.certificate(plan.id, binding, certificate));
|
|
287
|
+
admitted = undefined;
|
|
288
|
+
return { status: 'verified', certificate };
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
const reason = signal.aborted ? 'interrupted' : admitted ? 'regression-unknown' : 'stale-source';
|
|
292
|
+
if (admitted) {
|
|
293
|
+
try {
|
|
294
|
+
this.#store.unknown(admitted.planId, admitted.binding, reason);
|
|
295
|
+
}
|
|
296
|
+
catch { /* retained claim remains no-replay */ }
|
|
297
|
+
}
|
|
298
|
+
return { status: 'unknown', reason };
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
close() {
|
|
302
|
+
return this.#closing ??= (async () => {
|
|
303
|
+
this.#abort.abort(new Error('regression review disposed'));
|
|
304
|
+
try {
|
|
305
|
+
await Promise.allSettled(this.#flights.values());
|
|
306
|
+
await this.#runnerLoading?.catch(() => undefined);
|
|
307
|
+
await this.#runner?.close();
|
|
308
|
+
}
|
|
309
|
+
finally {
|
|
310
|
+
this.#store.close();
|
|
311
|
+
}
|
|
312
|
+
})();
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
//# sourceMappingURL=revision-regression-review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revision-regression-review.js","sourceRoot":"","sources":["../src/revision-regression-review.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { type KeyObject } from 'node:crypto';
|
|
2
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
3
|
+
import { type PluginRevisionParentBinding, type PluginRevisionVerificationRequest, type PluginRevisionVerificationResult, type RevisionAcceptanceAuthorityRef } from '@dsh-enhanced/assistant-growth-contract';
|
|
4
|
+
import { type CreationReviewConfig } from './creation-review.js';
|
|
5
|
+
/** Same bounded configuration shape as creation, with a separate policy digest and ledger. */
|
|
6
|
+
export type RevisionReviewConfig = CreationReviewConfig;
|
|
7
|
+
export interface RevisionReviewAuthorityInspection {
|
|
8
|
+
authority: RevisionAcceptanceAuthorityRef;
|
|
9
|
+
publicKey: string;
|
|
10
|
+
remainingVerifications: number;
|
|
11
|
+
available: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function validateRevisionReviewConfig(input: RevisionReviewConfig): RevisionReviewConfig;
|
|
14
|
+
export declare function compileRevisionReviewConfig(input: RevisionReviewConfig): {
|
|
15
|
+
config: RevisionReviewConfig;
|
|
16
|
+
authority: RevisionAcceptanceAuthorityRef;
|
|
17
|
+
publicKey: string;
|
|
18
|
+
privateKey: KeyObject;
|
|
19
|
+
};
|
|
20
|
+
export interface PreparedRevisionPort {
|
|
21
|
+
inspectPreparedRevision(planId: string): {
|
|
22
|
+
protocol: 'dsh-prepared-revision/v1';
|
|
23
|
+
plan: {
|
|
24
|
+
id: string;
|
|
25
|
+
digest: string;
|
|
26
|
+
name: string;
|
|
27
|
+
mode: string;
|
|
28
|
+
status: string;
|
|
29
|
+
expiresAt: number;
|
|
30
|
+
generatorDigest: string;
|
|
31
|
+
sourceCheck?: {
|
|
32
|
+
treeDigest: string;
|
|
33
|
+
patchDigest: string;
|
|
34
|
+
};
|
|
35
|
+
preparedEvidence?: {
|
|
36
|
+
pack: {
|
|
37
|
+
sha256: string;
|
|
38
|
+
sizeBytes: number;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
sourceRevision?: {
|
|
42
|
+
grant: {
|
|
43
|
+
namePrefix: string;
|
|
44
|
+
expiresAt: number;
|
|
45
|
+
};
|
|
46
|
+
growthRun: unknown;
|
|
47
|
+
parent: PluginRevisionParentBinding;
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
job: {
|
|
51
|
+
intent: {
|
|
52
|
+
revision?: unknown;
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
reference: {
|
|
56
|
+
owner: Record<string, unknown>;
|
|
57
|
+
sourceDigest: string;
|
|
58
|
+
outcomeId: string;
|
|
59
|
+
};
|
|
60
|
+
source: {
|
|
61
|
+
owner: Record<string, unknown>;
|
|
62
|
+
judgement: string;
|
|
63
|
+
source: {
|
|
64
|
+
objective: string;
|
|
65
|
+
truncated: boolean;
|
|
66
|
+
quiescent: boolean;
|
|
67
|
+
};
|
|
68
|
+
feedback?: {
|
|
69
|
+
text: string;
|
|
70
|
+
truncated: boolean;
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
artifact: Buffer;
|
|
74
|
+
};
|
|
75
|
+
withPreparedRevisionFence<T>(input: {
|
|
76
|
+
planId: string;
|
|
77
|
+
planDigest: string;
|
|
78
|
+
artifactSha256: string;
|
|
79
|
+
growthRunDigest: string;
|
|
80
|
+
referenceDigest: string;
|
|
81
|
+
parentDigest: string;
|
|
82
|
+
}, callback: () => T): T;
|
|
83
|
+
inspectPreparedRevisionReviewContext(planId: string, signal: AbortSignal): Promise<{
|
|
84
|
+
patch: string;
|
|
85
|
+
changedPaths: string[];
|
|
86
|
+
}>;
|
|
87
|
+
}
|
|
88
|
+
/** Independent Host review of a new task's candidate revision. It does not grant execution or replacement. */
|
|
89
|
+
export declare class RevisionReviewRuntime {
|
|
90
|
+
#private;
|
|
91
|
+
private readonly ctx;
|
|
92
|
+
constructor(ctx: Context, input: RevisionReviewConfig, databasePath: string);
|
|
93
|
+
inspect(input: {
|
|
94
|
+
owner: RevisionReviewConfig['owner'];
|
|
95
|
+
}): RevisionReviewAuthorityInspection | undefined;
|
|
96
|
+
run(request: PluginRevisionVerificationRequest, external?: AbortSignal): Promise<PluginRevisionVerificationResult>;
|
|
97
|
+
close(): Promise<void>;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=revision-review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revision-review.d.ts","sourceRoot":"","sources":["../src/revision-review.ts"],"names":[],"mappings":"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"}
|