tryassay 0.3.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/pricing-enforcer.d.ts +45 -0
- package/dist/api/pricing-enforcer.js +144 -0
- package/dist/api/pricing-enforcer.js.map +1 -0
- package/dist/api/server.d.ts +28 -0
- package/dist/api/server.js +265 -0
- package/dist/api/server.js.map +1 -0
- package/dist/api/team-session.d.ts +59 -0
- package/dist/api/team-session.js +240 -0
- package/dist/api/team-session.js.map +1 -0
- package/dist/cli.js +142 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/api.d.ts +4 -0
- package/dist/commands/api.js +50 -0
- package/dist/commands/api.js.map +1 -0
- package/dist/commands/runtime.d.ts +69 -0
- package/dist/commands/runtime.js +673 -0
- package/dist/commands/runtime.js.map +1 -1
- package/dist/runtime/agent-loop.d.ts +6 -0
- package/dist/runtime/agent-loop.js +87 -5
- package/dist/runtime/agent-loop.js.map +1 -1
- package/dist/runtime/agent-spawner.d.ts +56 -0
- package/dist/runtime/agent-spawner.js +217 -0
- package/dist/runtime/agent-spawner.js.map +1 -0
- package/dist/runtime/agents/code-agent.d.ts +11 -0
- package/dist/runtime/agents/code-agent.js +90 -0
- package/dist/runtime/agents/code-agent.js.map +1 -0
- package/dist/runtime/agents/coordinator-agent.d.ts +20 -0
- package/dist/runtime/agents/coordinator-agent.js +182 -0
- package/dist/runtime/agents/coordinator-agent.js.map +1 -0
- package/dist/runtime/agents/ops-agent.d.ts +11 -0
- package/dist/runtime/agents/ops-agent.js +113 -0
- package/dist/runtime/agents/ops-agent.js.map +1 -0
- package/dist/runtime/agents/research-agent.d.ts +11 -0
- package/dist/runtime/agents/research-agent.js +114 -0
- package/dist/runtime/agents/research-agent.js.map +1 -0
- package/dist/runtime/agents/review-agent.d.ts +11 -0
- package/dist/runtime/agents/review-agent.js +96 -0
- package/dist/runtime/agents/review-agent.js.map +1 -0
- package/dist/runtime/agents/test-agent.d.ts +11 -0
- package/dist/runtime/agents/test-agent.js +114 -0
- package/dist/runtime/agents/test-agent.js.map +1 -0
- package/dist/runtime/capability-registry.d.ts +62 -0
- package/dist/runtime/capability-registry.js +191 -0
- package/dist/runtime/capability-registry.js.map +1 -0
- package/dist/runtime/collusion-detector.d.ts +35 -0
- package/dist/runtime/collusion-detector.js +97 -0
- package/dist/runtime/collusion-detector.js.map +1 -0
- package/dist/runtime/composition-verifier.d.ts +22 -0
- package/dist/runtime/composition-verifier.js +265 -0
- package/dist/runtime/composition-verifier.js.map +1 -0
- package/dist/runtime/confidence-calibrator.d.ts +10 -0
- package/dist/runtime/confidence-calibrator.js +95 -0
- package/dist/runtime/confidence-calibrator.js.map +1 -0
- package/dist/runtime/domain-coverage-analyzer.d.ts +24 -0
- package/dist/runtime/domain-coverage-analyzer.js +178 -0
- package/dist/runtime/domain-coverage-analyzer.js.map +1 -0
- package/dist/runtime/enriched-prompt-builder.d.ts +25 -0
- package/dist/runtime/enriched-prompt-builder.js +173 -0
- package/dist/runtime/enriched-prompt-builder.js.map +1 -0
- package/dist/runtime/gap-detector.d.ts +6 -0
- package/dist/runtime/gap-detector.js +111 -0
- package/dist/runtime/gap-detector.js.map +1 -0
- package/dist/runtime/human-escalation.d.ts +41 -0
- package/dist/runtime/human-escalation.js +122 -0
- package/dist/runtime/human-escalation.js.map +1 -0
- package/dist/runtime/kill-switch.d.ts +51 -0
- package/dist/runtime/kill-switch.js +185 -0
- package/dist/runtime/kill-switch.js.map +1 -0
- package/dist/runtime/layer2-guardian.d.ts +81 -0
- package/dist/runtime/layer2-guardian.js +263 -0
- package/dist/runtime/layer2-guardian.js.map +1 -0
- package/dist/runtime/message-bus.d.ts +57 -0
- package/dist/runtime/message-bus.js +115 -0
- package/dist/runtime/message-bus.js.map +1 -0
- package/dist/runtime/multi-agent-loop.d.ts +37 -0
- package/dist/runtime/multi-agent-loop.js +411 -0
- package/dist/runtime/multi-agent-loop.js.map +1 -0
- package/dist/runtime/pattern-extractor.d.ts +20 -0
- package/dist/runtime/pattern-extractor.js +257 -0
- package/dist/runtime/pattern-extractor.js.map +1 -0
- package/dist/runtime/planner.d.ts +2 -2
- package/dist/runtime/planner.js +10 -7
- package/dist/runtime/planner.js.map +1 -1
- package/dist/runtime/prompt-safety-analyzer.d.ts +17 -0
- package/dist/runtime/prompt-safety-analyzer.js +230 -0
- package/dist/runtime/prompt-safety-analyzer.js.map +1 -0
- package/dist/runtime/reasoner.d.ts +2 -2
- package/dist/runtime/reasoner.js +9 -5
- package/dist/runtime/reasoner.js.map +1 -1
- package/dist/runtime/reflector.d.ts +7 -1
- package/dist/runtime/reflector.js.map +1 -1
- package/dist/runtime/rollback-manager.d.ts +50 -0
- package/dist/runtime/rollback-manager.js +157 -0
- package/dist/runtime/rollback-manager.js.map +1 -0
- package/dist/runtime/rule-canary-deployer.d.ts +69 -0
- package/dist/runtime/rule-canary-deployer.js +289 -0
- package/dist/runtime/rule-canary-deployer.js.map +1 -0
- package/dist/runtime/rule-conflict-detector.d.ts +48 -0
- package/dist/runtime/rule-conflict-detector.js +214 -0
- package/dist/runtime/rule-conflict-detector.js.map +1 -0
- package/dist/runtime/rule-meta-verifier.d.ts +18 -0
- package/dist/runtime/rule-meta-verifier.js +275 -0
- package/dist/runtime/rule-meta-verifier.js.map +1 -0
- package/dist/runtime/rule-proposal-manager.d.ts +95 -0
- package/dist/runtime/rule-proposal-manager.js +190 -0
- package/dist/runtime/rule-proposal-manager.js.map +1 -0
- package/dist/runtime/safety-enforcer.d.ts +35 -0
- package/dist/runtime/safety-enforcer.js +165 -0
- package/dist/runtime/safety-enforcer.js.map +1 -0
- package/dist/runtime/safety-status.d.ts +48 -0
- package/dist/runtime/safety-status.js +119 -0
- package/dist/runtime/safety-status.js.map +1 -0
- package/dist/runtime/shadow-runner.d.ts +14 -0
- package/dist/runtime/shadow-runner.js +190 -0
- package/dist/runtime/shadow-runner.js.map +1 -0
- package/dist/runtime/shared-memory.d.ts +47 -0
- package/dist/runtime/shared-memory.js +151 -0
- package/dist/runtime/shared-memory.js.map +1 -0
- package/dist/runtime/specialized-agent.d.ts +72 -0
- package/dist/runtime/specialized-agent.js +123 -0
- package/dist/runtime/specialized-agent.js.map +1 -0
- package/dist/runtime/stall-detector.d.ts +13 -0
- package/dist/runtime/stall-detector.js +121 -0
- package/dist/runtime/stall-detector.js.map +1 -0
- package/dist/runtime/strategy-library.d.ts +11 -0
- package/dist/runtime/strategy-library.js +142 -0
- package/dist/runtime/strategy-library.js.map +1 -0
- package/dist/runtime/supabase-experience-store.d.ts +19 -0
- package/dist/runtime/supabase-experience-store.js +215 -0
- package/dist/runtime/supabase-experience-store.js.map +1 -0
- package/dist/runtime/tool-approval.d.ts +51 -0
- package/dist/runtime/tool-approval.js +148 -0
- package/dist/runtime/tool-approval.js.map +1 -0
- package/dist/runtime/tool-sandbox.d.ts +43 -0
- package/dist/runtime/tool-sandbox.js +394 -0
- package/dist/runtime/tool-sandbox.js.map +1 -0
- package/dist/runtime/tool-verifier.d.ts +18 -0
- package/dist/runtime/tool-verifier.js +323 -0
- package/dist/runtime/tool-verifier.js.map +1 -0
- package/dist/runtime/trust-manager.d.ts +63 -0
- package/dist/runtime/trust-manager.js +212 -0
- package/dist/runtime/trust-manager.js.map +1 -0
- package/dist/runtime/two-agent-loop.d.ts +35 -0
- package/dist/runtime/two-agent-loop.js +208 -0
- package/dist/runtime/two-agent-loop.js.map +1 -0
- package/dist/runtime/types.d.ts +939 -1
- package/dist/runtime/verification-intensity.d.ts +34 -0
- package/dist/runtime/verification-intensity.js +104 -0
- package/dist/runtime/verification-intensity.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Assay Verified Agent Runtime — Capability Registry
|
|
3
|
+
// Stores and manages tools with version tracking, rollback,
|
|
4
|
+
// and cryptographic integrity verification.
|
|
5
|
+
// ============================================================
|
|
6
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
7
|
+
import { dirname } from 'node:path';
|
|
8
|
+
import { createHash } from 'node:crypto';
|
|
9
|
+
// ── CapabilityRegistryManager ──────────────────────────────
|
|
10
|
+
export class CapabilityRegistryManager {
|
|
11
|
+
registry;
|
|
12
|
+
registryPath;
|
|
13
|
+
versionHistory = [];
|
|
14
|
+
constructor(registryPath) {
|
|
15
|
+
this.registryPath = registryPath;
|
|
16
|
+
this.registry = this.createEmptyRegistry();
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Load the registry from disk. Creates an empty one if not found.
|
|
20
|
+
*/
|
|
21
|
+
async load() {
|
|
22
|
+
try {
|
|
23
|
+
const raw = await readFile(this.registryPath, 'utf-8');
|
|
24
|
+
const parsed = JSON.parse(raw);
|
|
25
|
+
this.registry = parsed;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// File doesn't exist or is invalid — start fresh
|
|
29
|
+
this.registry = this.createEmptyRegistry();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Save the registry to disk with updated manifest hash.
|
|
34
|
+
*/
|
|
35
|
+
async save() {
|
|
36
|
+
this.registry.manifest_hash = this.computeManifestHash();
|
|
37
|
+
await mkdir(dirname(this.registryPath), { recursive: true });
|
|
38
|
+
await writeFile(this.registryPath, JSON.stringify(this.registry, null, 2), 'utf-8');
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get the current registry state (readonly snapshot).
|
|
42
|
+
*/
|
|
43
|
+
getRegistry() {
|
|
44
|
+
return {
|
|
45
|
+
...this.registry,
|
|
46
|
+
tools: {
|
|
47
|
+
active: [...this.registry.tools.active],
|
|
48
|
+
deprecated: [...this.registry.tools.deprecated],
|
|
49
|
+
},
|
|
50
|
+
modifications: [...this.registry.modifications],
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Add a new tool to the registry.
|
|
55
|
+
* The tool must have status 'approved' before calling this.
|
|
56
|
+
*/
|
|
57
|
+
addTool(tool, approvedBy, proposalId) {
|
|
58
|
+
if (tool.status !== 'approved') {
|
|
59
|
+
throw new Error(`Cannot add tool with status "${tool.status}". Must be "approved".`);
|
|
60
|
+
}
|
|
61
|
+
// Check for duplicate IDs
|
|
62
|
+
if (this.findTool(tool.id)) {
|
|
63
|
+
throw new Error(`Tool "${tool.id}" already exists in registry.`);
|
|
64
|
+
}
|
|
65
|
+
// Save version history for rollback
|
|
66
|
+
this.pushHistory();
|
|
67
|
+
// Activate the tool
|
|
68
|
+
const activeTool = { ...tool, status: 'active' };
|
|
69
|
+
this.registry.tools.active.push(activeTool);
|
|
70
|
+
// Log the modification
|
|
71
|
+
this.logModification(proposalId, 'tool', 'added', tool.id, approvedBy);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Deprecate a tool. It remains in the registry but is no longer active.
|
|
75
|
+
*/
|
|
76
|
+
deprecateTool(toolId, deprecatedBy, _reason) {
|
|
77
|
+
const index = this.registry.tools.active.findIndex(t => t.id === toolId);
|
|
78
|
+
if (index === -1) {
|
|
79
|
+
throw new Error(`Tool "${toolId}" not found in active tools.`);
|
|
80
|
+
}
|
|
81
|
+
this.pushHistory();
|
|
82
|
+
const tool = this.registry.tools.active[index];
|
|
83
|
+
this.registry.tools.active.splice(index, 1);
|
|
84
|
+
const deprecated = { ...tool, status: 'deprecated' };
|
|
85
|
+
this.registry.tools.deprecated.push(deprecated);
|
|
86
|
+
this.logModification(`deprecate-${toolId}`, 'tool', 'deprecated', toolId, deprecatedBy);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Rollback the registry to the previous version.
|
|
90
|
+
* Returns true if rollback succeeded, false if no history available.
|
|
91
|
+
*/
|
|
92
|
+
rollback(rolledBackBy) {
|
|
93
|
+
const previous = this.versionHistory.pop();
|
|
94
|
+
if (!previous)
|
|
95
|
+
return false;
|
|
96
|
+
const currentVersion = this.registry.version;
|
|
97
|
+
this.registry = previous;
|
|
98
|
+
// Log the rollback (on the restored version)
|
|
99
|
+
this.logModification(`rollback-from-${currentVersion}`, 'tool', 'rolled_back', 'registry', rolledBackBy);
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Find a tool by ID across active and deprecated pools.
|
|
104
|
+
*/
|
|
105
|
+
findTool(toolId) {
|
|
106
|
+
return this.registry.tools.active.find(t => t.id === toolId)
|
|
107
|
+
?? this.registry.tools.deprecated.find(t => t.id === toolId);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* List all active tools.
|
|
111
|
+
*/
|
|
112
|
+
listActiveTools() {
|
|
113
|
+
return this.registry.tools.active;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* List all deprecated tools.
|
|
117
|
+
*/
|
|
118
|
+
listDeprecatedTools() {
|
|
119
|
+
return this.registry.tools.deprecated;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get the modification history.
|
|
123
|
+
*/
|
|
124
|
+
getModificationHistory() {
|
|
125
|
+
return this.registry.modifications;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Verify registry integrity by recomputing the manifest hash.
|
|
129
|
+
*/
|
|
130
|
+
verifyIntegrity() {
|
|
131
|
+
const actual = this.computeManifestHash();
|
|
132
|
+
return {
|
|
133
|
+
valid: actual === this.registry.manifest_hash,
|
|
134
|
+
expected: this.registry.manifest_hash,
|
|
135
|
+
actual,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
// ── Private helpers ──────────────────────────────────────
|
|
139
|
+
createEmptyRegistry() {
|
|
140
|
+
return {
|
|
141
|
+
version: '0.0.1',
|
|
142
|
+
last_modified: new Date().toISOString(),
|
|
143
|
+
modified_by: 'system',
|
|
144
|
+
tools: { active: [], deprecated: [] },
|
|
145
|
+
manifest_hash: '',
|
|
146
|
+
layer2_hash: '',
|
|
147
|
+
modifications: [],
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
pushHistory() {
|
|
151
|
+
// Deep clone the current state for rollback
|
|
152
|
+
const snapshot = JSON.parse(JSON.stringify(this.registry));
|
|
153
|
+
this.versionHistory.push(snapshot);
|
|
154
|
+
// Keep at most 10 versions for rollback
|
|
155
|
+
if (this.versionHistory.length > 10) {
|
|
156
|
+
this.versionHistory.shift();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
incrementVersion() {
|
|
160
|
+
const parts = this.registry.version.split('.').map(Number);
|
|
161
|
+
parts[2] = (parts[2] ?? 0) + 1;
|
|
162
|
+
return parts.join('.');
|
|
163
|
+
}
|
|
164
|
+
logModification(proposalId, type, action, targetId, approvedBy) {
|
|
165
|
+
const previousVersion = this.registry.version;
|
|
166
|
+
const newVersion = this.incrementVersion();
|
|
167
|
+
this.registry.modifications.push({
|
|
168
|
+
timestamp: new Date().toISOString(),
|
|
169
|
+
proposal_id: proposalId,
|
|
170
|
+
type,
|
|
171
|
+
action,
|
|
172
|
+
target_id: targetId,
|
|
173
|
+
approved_by: approvedBy,
|
|
174
|
+
registry_version_before: previousVersion,
|
|
175
|
+
registry_version_after: newVersion,
|
|
176
|
+
});
|
|
177
|
+
this.registry.version = newVersion;
|
|
178
|
+
this.registry.last_modified = new Date().toISOString();
|
|
179
|
+
this.registry.modified_by = approvedBy;
|
|
180
|
+
}
|
|
181
|
+
computeManifestHash() {
|
|
182
|
+
// Hash everything except the manifest_hash field itself
|
|
183
|
+
const data = {
|
|
184
|
+
version: this.registry.version,
|
|
185
|
+
tools: this.registry.tools,
|
|
186
|
+
modifications: this.registry.modifications,
|
|
187
|
+
};
|
|
188
|
+
return createHash('sha256').update(JSON.stringify(data)).digest('hex');
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=capability-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-registry.js","sourceRoot":"","sources":["../../src/runtime/capability-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { BoundaryClaim, BoundaryVerificationResult, CollusionEvent, AgentIdentity } from './types.js';
|
|
2
|
+
export declare class CollusionDetector {
|
|
3
|
+
private events;
|
|
4
|
+
/**
|
|
5
|
+
* Check a verification result for collusion signals.
|
|
6
|
+
*
|
|
7
|
+
* Collusion is detected when:
|
|
8
|
+
* 1. Two LLM-backed agents agreed on a claim (Code + Review both say PASS)
|
|
9
|
+
* 2. The formal verifier disagrees (says FAIL)
|
|
10
|
+
*
|
|
11
|
+
* This catches the most dangerous failure mode: correlated LLM errors
|
|
12
|
+
* where agents trained on similar data share the same blind spots.
|
|
13
|
+
*/
|
|
14
|
+
check(sourceAgent: AgentIdentity, targetAgent: AgentIdentity, claims: readonly BoundaryClaim[], result: BoundaryVerificationResult): CollusionEvent[];
|
|
15
|
+
/**
|
|
16
|
+
* Check if the collusion rate exceeds a threshold for a given agent pair.
|
|
17
|
+
* Returns true if the ratio of collusion events to total verifications
|
|
18
|
+
* exceeds the threshold (default: 20%).
|
|
19
|
+
*/
|
|
20
|
+
isCollusionRateExcessive(agentA: string, agentB: string, totalVerifications: number, threshold?: number): boolean;
|
|
21
|
+
/** Get all collusion events. */
|
|
22
|
+
getAllEvents(): readonly CollusionEvent[];
|
|
23
|
+
/** Get collusion events for a specific agent. */
|
|
24
|
+
getEventsForAgent(agentId: string): readonly CollusionEvent[];
|
|
25
|
+
/** Get critical collusion events (security/data-loss claims). */
|
|
26
|
+
getCriticalEvents(): readonly CollusionEvent[];
|
|
27
|
+
/** Get collusion event count. */
|
|
28
|
+
getEventCount(): number;
|
|
29
|
+
/** Get unique agent pairs involved in collusion. */
|
|
30
|
+
getColludingPairs(): Array<{
|
|
31
|
+
agentA: string;
|
|
32
|
+
agentB: string;
|
|
33
|
+
count: number;
|
|
34
|
+
}>;
|
|
35
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Assay Verified Agent Runtime — Collusion Detector
|
|
3
|
+
// Detects when LLM-backed agents agree on something the formal
|
|
4
|
+
// verifier disagrees with. This is the anti-collusion primitive.
|
|
5
|
+
// ============================================================
|
|
6
|
+
import { randomUUID } from 'node:crypto';
|
|
7
|
+
// ── Collusion Detector ─────────────────────────────────────
|
|
8
|
+
export class CollusionDetector {
|
|
9
|
+
events = [];
|
|
10
|
+
/**
|
|
11
|
+
* Check a verification result for collusion signals.
|
|
12
|
+
*
|
|
13
|
+
* Collusion is detected when:
|
|
14
|
+
* 1. Two LLM-backed agents agreed on a claim (Code + Review both say PASS)
|
|
15
|
+
* 2. The formal verifier disagrees (says FAIL)
|
|
16
|
+
*
|
|
17
|
+
* This catches the most dangerous failure mode: correlated LLM errors
|
|
18
|
+
* where agents trained on similar data share the same blind spots.
|
|
19
|
+
*/
|
|
20
|
+
check(sourceAgent, targetAgent, claims, result) {
|
|
21
|
+
const detected = [];
|
|
22
|
+
// Only check if both agents are LLM-backed (not formal)
|
|
23
|
+
if (sourceAgent.trustLevel === 'formal' || targetAgent.trustLevel === 'formal') {
|
|
24
|
+
return detected;
|
|
25
|
+
}
|
|
26
|
+
// Look for formal overrides — these are the collusion signals
|
|
27
|
+
for (const claim of claims) {
|
|
28
|
+
if (claim.formalOverride) {
|
|
29
|
+
// LLM said one thing, formal verifier said another
|
|
30
|
+
const event = {
|
|
31
|
+
id: randomUUID(),
|
|
32
|
+
agentA: sourceAgent.id,
|
|
33
|
+
agentB: targetAgent.id,
|
|
34
|
+
agreedVerdict: claim.formalOverride.originalLlmVerdict,
|
|
35
|
+
formalVerdict: claim.formalOverride.formalVerdict,
|
|
36
|
+
claimId: claim.id,
|
|
37
|
+
claimText: claim.text,
|
|
38
|
+
severity: claim.severity,
|
|
39
|
+
timestamp: new Date().toISOString(),
|
|
40
|
+
};
|
|
41
|
+
detected.push(event);
|
|
42
|
+
this.events.push(event);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Also check for suspicious patterns: both agents consistently
|
|
46
|
+
// passing claims that the formal stats show disagreement on
|
|
47
|
+
if (result.formalStats.disagreements > 0 && result.formalStats.formalOverrides > 0) {
|
|
48
|
+
// Each formal override where both LLM agents agreed is a collusion signal
|
|
49
|
+
// (already captured above via formalOverride on claims)
|
|
50
|
+
}
|
|
51
|
+
return detected;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Check if the collusion rate exceeds a threshold for a given agent pair.
|
|
55
|
+
* Returns true if the ratio of collusion events to total verifications
|
|
56
|
+
* exceeds the threshold (default: 20%).
|
|
57
|
+
*/
|
|
58
|
+
isCollusionRateExcessive(agentA, agentB, totalVerifications, threshold = 0.2) {
|
|
59
|
+
const pairEvents = this.events.filter(e => (e.agentA === agentA && e.agentB === agentB) ||
|
|
60
|
+
(e.agentA === agentB && e.agentB === agentA));
|
|
61
|
+
if (totalVerifications === 0)
|
|
62
|
+
return false;
|
|
63
|
+
return pairEvents.length / totalVerifications > threshold;
|
|
64
|
+
}
|
|
65
|
+
/** Get all collusion events. */
|
|
66
|
+
getAllEvents() {
|
|
67
|
+
return this.events;
|
|
68
|
+
}
|
|
69
|
+
/** Get collusion events for a specific agent. */
|
|
70
|
+
getEventsForAgent(agentId) {
|
|
71
|
+
return this.events.filter(e => e.agentA === agentId || e.agentB === agentId);
|
|
72
|
+
}
|
|
73
|
+
/** Get critical collusion events (security/data-loss claims). */
|
|
74
|
+
getCriticalEvents() {
|
|
75
|
+
return this.events.filter(e => e.severity === 'critical' || e.severity === 'high');
|
|
76
|
+
}
|
|
77
|
+
/** Get collusion event count. */
|
|
78
|
+
getEventCount() {
|
|
79
|
+
return this.events.length;
|
|
80
|
+
}
|
|
81
|
+
/** Get unique agent pairs involved in collusion. */
|
|
82
|
+
getColludingPairs() {
|
|
83
|
+
const pairs = new Map();
|
|
84
|
+
for (const event of this.events) {
|
|
85
|
+
const key = [event.agentA, event.agentB].sort().join('::');
|
|
86
|
+
const existing = pairs.get(key);
|
|
87
|
+
if (existing) {
|
|
88
|
+
existing.count++;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
pairs.set(key, { agentA: event.agentA, agentB: event.agentB, count: 1 });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return Array.from(pairs.values());
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=collusion-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collusion-detector.js","sourceRoot":"","sources":["../../src/runtime/collusion-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { AgentIdentity, BoundaryArtifact, VerifiedHandoff } from './types.js';
|
|
2
|
+
export declare class CompositionVerifier {
|
|
3
|
+
private cachedIndex;
|
|
4
|
+
private codebaseRoot;
|
|
5
|
+
constructor(codebaseRoot: string);
|
|
6
|
+
/**
|
|
7
|
+
* Verify an artifact at a composition boundary between two agents.
|
|
8
|
+
* Returns a VerifiedHandoff with the verification result and handoff decision.
|
|
9
|
+
*/
|
|
10
|
+
verifyHandoff(sourceAgent: AgentIdentity, targetAgent: AgentIdentity, artifact: BoundaryArtifact): Promise<VerifiedHandoff>;
|
|
11
|
+
/** Invalidate cached codebase index after code changes. */
|
|
12
|
+
invalidateIndex(): void;
|
|
13
|
+
private extractBoundaryClaims;
|
|
14
|
+
private verifyClaims;
|
|
15
|
+
private makeDecision;
|
|
16
|
+
private makePassResult;
|
|
17
|
+
private makeHandoff;
|
|
18
|
+
private artifactToDocument;
|
|
19
|
+
private getCodebaseIndex;
|
|
20
|
+
private inferCategory;
|
|
21
|
+
private inferSeverity;
|
|
22
|
+
}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Assay Verified Agent Runtime — Composition Verifier
|
|
3
|
+
// Verifies artifacts at every agent-to-agent boundary.
|
|
4
|
+
// No artifact moves between agents without passing this gate.
|
|
5
|
+
// ============================================================
|
|
6
|
+
import { randomUUID } from 'node:crypto';
|
|
7
|
+
import { extractClaims } from '../lib/claim-extractor.js';
|
|
8
|
+
import { verifyClaims } from '../lib/code-verifier.js';
|
|
9
|
+
import { indexCodebase } from '../lib/codebase-indexer.js';
|
|
10
|
+
const TRUST_POLICIES = {
|
|
11
|
+
untrusted: { verifyAll: true, sampleRate: 1.0, requireFormalForCritical: true },
|
|
12
|
+
provisional: { verifyAll: true, sampleRate: 1.0, requireFormalForCritical: true },
|
|
13
|
+
trusted: { verifyAll: false, sampleRate: 0.2, requireFormalForCritical: true },
|
|
14
|
+
formal: { verifyAll: false, sampleRate: 0, requireFormalForCritical: false },
|
|
15
|
+
};
|
|
16
|
+
// ── CompositionVerifier ─────────────────────────────────────
|
|
17
|
+
export class CompositionVerifier {
|
|
18
|
+
cachedIndex = null;
|
|
19
|
+
codebaseRoot;
|
|
20
|
+
constructor(codebaseRoot) {
|
|
21
|
+
this.codebaseRoot = codebaseRoot;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Verify an artifact at a composition boundary between two agents.
|
|
25
|
+
* Returns a VerifiedHandoff with the verification result and handoff decision.
|
|
26
|
+
*/
|
|
27
|
+
async verifyHandoff(sourceAgent, targetAgent, artifact) {
|
|
28
|
+
const boundaryId = randomUUID();
|
|
29
|
+
const start = Date.now();
|
|
30
|
+
// Determine verification intensity based on source agent trust
|
|
31
|
+
const policy = TRUST_POLICIES[sourceAgent.trustLevel];
|
|
32
|
+
// Formal agents produce ground truth — skip verification
|
|
33
|
+
if (sourceAgent.trustLevel === 'formal') {
|
|
34
|
+
const passResult = this.makePassResult(boundaryId, start);
|
|
35
|
+
return this.makeHandoff(boundaryId, sourceAgent, targetAgent, artifact, passResult);
|
|
36
|
+
}
|
|
37
|
+
// Extract claims from the artifact
|
|
38
|
+
const claims = await this.extractBoundaryClaims(artifact, policy);
|
|
39
|
+
if (claims.length === 0) {
|
|
40
|
+
const passResult = this.makePassResult(boundaryId, start);
|
|
41
|
+
return this.makeHandoff(boundaryId, sourceAgent, targetAgent, artifact, passResult);
|
|
42
|
+
}
|
|
43
|
+
// Verify claims
|
|
44
|
+
const verificationResult = await this.verifyClaims(boundaryId, claims, start);
|
|
45
|
+
// Make handoff decision
|
|
46
|
+
const decision = this.makeDecision(verificationResult);
|
|
47
|
+
const boundary = {
|
|
48
|
+
id: boundaryId,
|
|
49
|
+
sourceAgent: sourceAgent.id,
|
|
50
|
+
targetAgent: targetAgent.id,
|
|
51
|
+
artifact,
|
|
52
|
+
extractedClaims: claims,
|
|
53
|
+
verificationResult,
|
|
54
|
+
timestamp: new Date().toISOString(),
|
|
55
|
+
};
|
|
56
|
+
return {
|
|
57
|
+
id: randomUUID(),
|
|
58
|
+
boundary,
|
|
59
|
+
artifact,
|
|
60
|
+
verificationResult,
|
|
61
|
+
decision,
|
|
62
|
+
timestamp: new Date().toISOString(),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/** Invalidate cached codebase index after code changes. */
|
|
66
|
+
invalidateIndex() {
|
|
67
|
+
this.cachedIndex = null;
|
|
68
|
+
}
|
|
69
|
+
// ── Private methods ─────────────────────────────────────
|
|
70
|
+
async extractBoundaryClaims(artifact, policy) {
|
|
71
|
+
// Build a document representation for claim extraction
|
|
72
|
+
const document = this.artifactToDocument(artifact);
|
|
73
|
+
try {
|
|
74
|
+
const { claims: rawClaims } = await extractClaims(document);
|
|
75
|
+
// Apply sampling if trusted agent
|
|
76
|
+
let claimsToVerify = rawClaims;
|
|
77
|
+
if (!policy.verifyAll && policy.sampleRate < 1.0) {
|
|
78
|
+
// Always include critical/high severity claims
|
|
79
|
+
// Sample from medium/low
|
|
80
|
+
const highPriority = rawClaims.filter(c => {
|
|
81
|
+
const text = c.text?.toLowerCase() ?? '';
|
|
82
|
+
return text.includes('security') || text.includes('injection') ||
|
|
83
|
+
text.includes('authentication') || text.includes('authorization');
|
|
84
|
+
});
|
|
85
|
+
const rest = rawClaims.filter(c => !highPriority.includes(c));
|
|
86
|
+
const sampled = rest.filter(() => Math.random() < policy.sampleRate);
|
|
87
|
+
claimsToVerify = [...highPriority, ...sampled];
|
|
88
|
+
}
|
|
89
|
+
// Convert to BoundaryClaims (initially unverified)
|
|
90
|
+
return claimsToVerify.map((c, i) => ({
|
|
91
|
+
id: `${randomUUID().slice(0, 8)}-BC-${String(i + 1).padStart(3, '0')}`,
|
|
92
|
+
text: c.text || `Claim ${i + 1}`,
|
|
93
|
+
category: this.inferCategory(c.text || ''),
|
|
94
|
+
severity: this.inferSeverity(c.text || ''),
|
|
95
|
+
source: 'implicit',
|
|
96
|
+
verificationMethod: 'llm',
|
|
97
|
+
verdict: 'N/A',
|
|
98
|
+
evidence: '',
|
|
99
|
+
}));
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async verifyClaims(boundaryId, claims, startTime) {
|
|
106
|
+
const index = await this.getCodebaseIndex();
|
|
107
|
+
// Convert BoundaryClaims to the Claim format that verifyClaims expects
|
|
108
|
+
const assayClaims = claims.map(c => ({
|
|
109
|
+
id: c.id,
|
|
110
|
+
text: c.text,
|
|
111
|
+
section: c.category,
|
|
112
|
+
category: c.category,
|
|
113
|
+
severity: c.severity,
|
|
114
|
+
testable: true,
|
|
115
|
+
}));
|
|
116
|
+
try {
|
|
117
|
+
const { verifications } = await verifyClaims(assayClaims, index);
|
|
118
|
+
// Map back to BoundaryClaims with verdicts
|
|
119
|
+
const verifiedClaims = claims.map((claim, i) => {
|
|
120
|
+
const v = verifications[i];
|
|
121
|
+
if (!v)
|
|
122
|
+
return claim;
|
|
123
|
+
const avgConfidence = v.evidence?.length > 0
|
|
124
|
+
? v.evidence.reduce((sum, e) => sum + e.confidence, 0) / v.evidence.length
|
|
125
|
+
: 0.5;
|
|
126
|
+
return {
|
|
127
|
+
...claim,
|
|
128
|
+
verdict: v.verdict,
|
|
129
|
+
verificationMethod: avgConfidence >= 0.95 ? 'formal' : 'llm',
|
|
130
|
+
evidence: v.evidence?.map((e) => e.text ?? e.snippet ?? '').join('; ') ?? '',
|
|
131
|
+
};
|
|
132
|
+
});
|
|
133
|
+
const passed = verifiedClaims.filter(c => c.verdict === 'PASS').length;
|
|
134
|
+
const failed = verifiedClaims.filter(c => c.verdict === 'FAIL').length;
|
|
135
|
+
const partial = verifiedClaims.filter(c => c.verdict === 'PARTIAL').length;
|
|
136
|
+
const formallyVerified = verifiedClaims.filter(c => c.verificationMethod === 'formal').length;
|
|
137
|
+
const formalOverrides = verifiedClaims.filter(c => c.formalOverride).length;
|
|
138
|
+
const verdict = failed > 0 ? 'FAIL' :
|
|
139
|
+
partial > 0 ? 'PARTIAL' :
|
|
140
|
+
'PASS';
|
|
141
|
+
return {
|
|
142
|
+
boundaryId,
|
|
143
|
+
passed,
|
|
144
|
+
failed,
|
|
145
|
+
partial,
|
|
146
|
+
total: verifiedClaims.length,
|
|
147
|
+
formalStats: {
|
|
148
|
+
formallyVerified,
|
|
149
|
+
llmVerified: verifiedClaims.length - formallyVerified,
|
|
150
|
+
disagreements: formalOverrides,
|
|
151
|
+
formalOverrides,
|
|
152
|
+
},
|
|
153
|
+
verdict,
|
|
154
|
+
blockers: verifiedClaims.filter(c => c.verdict === 'FAIL' && (c.severity === 'critical' || c.severity === 'high')),
|
|
155
|
+
durationMs: Date.now() - startTime,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// Verification pipeline error — report as partial
|
|
160
|
+
return {
|
|
161
|
+
boundaryId,
|
|
162
|
+
passed: 0,
|
|
163
|
+
failed: 0,
|
|
164
|
+
partial: claims.length,
|
|
165
|
+
total: claims.length,
|
|
166
|
+
formalStats: { formallyVerified: 0, llmVerified: 0, disagreements: 0, formalOverrides: 0 },
|
|
167
|
+
verdict: 'PARTIAL',
|
|
168
|
+
blockers: [],
|
|
169
|
+
durationMs: Date.now() - startTime,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
makeDecision(result) {
|
|
174
|
+
// Any critical/high FAIL → reject
|
|
175
|
+
if (result.blockers.length > 0) {
|
|
176
|
+
return { action: 'reject', blockers: result.blockers };
|
|
177
|
+
}
|
|
178
|
+
// Any formal override → reject (formal verifier disagrees with LLM consensus)
|
|
179
|
+
if (result.formalStats.formalOverrides > 0) {
|
|
180
|
+
return { action: 'reject', blockers: result.blockers };
|
|
181
|
+
}
|
|
182
|
+
// Only low/medium failures → pass with warnings
|
|
183
|
+
if (result.failed > 0) {
|
|
184
|
+
const warnings = result.blockers; // already filtered to critical/high
|
|
185
|
+
return { action: 'pass_with_warnings', warnings };
|
|
186
|
+
}
|
|
187
|
+
// Too many partial results → escalate
|
|
188
|
+
if (result.partial > result.total * 0.5) {
|
|
189
|
+
return { action: 'escalate', reason: 'Too many ambiguous verification results' };
|
|
190
|
+
}
|
|
191
|
+
return { action: 'pass' };
|
|
192
|
+
}
|
|
193
|
+
makePassResult(boundaryId, startTime) {
|
|
194
|
+
return {
|
|
195
|
+
boundaryId,
|
|
196
|
+
passed: 0,
|
|
197
|
+
failed: 0,
|
|
198
|
+
partial: 0,
|
|
199
|
+
total: 0,
|
|
200
|
+
formalStats: { formallyVerified: 0, llmVerified: 0, disagreements: 0, formalOverrides: 0 },
|
|
201
|
+
verdict: 'PASS',
|
|
202
|
+
blockers: [],
|
|
203
|
+
durationMs: Date.now() - startTime,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
makeHandoff(boundaryId, source, target, artifact, result) {
|
|
207
|
+
return {
|
|
208
|
+
id: randomUUID(),
|
|
209
|
+
boundary: {
|
|
210
|
+
id: boundaryId,
|
|
211
|
+
sourceAgent: source.id,
|
|
212
|
+
targetAgent: target.id,
|
|
213
|
+
artifact,
|
|
214
|
+
extractedClaims: [],
|
|
215
|
+
verificationResult: result,
|
|
216
|
+
timestamp: new Date().toISOString(),
|
|
217
|
+
},
|
|
218
|
+
artifact,
|
|
219
|
+
verificationResult: result,
|
|
220
|
+
decision: { action: 'pass' },
|
|
221
|
+
timestamp: new Date().toISOString(),
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
artifactToDocument(artifact) {
|
|
225
|
+
const header = `// Artifact type: ${artifact.type}\n`;
|
|
226
|
+
const pathLine = artifact.path ? `// Path: ${artifact.path}\n` : '';
|
|
227
|
+
const langLine = artifact.language ? `// Language: ${artifact.language}\n` : '';
|
|
228
|
+
return `${header}${pathLine}${langLine}\n${artifact.content}`;
|
|
229
|
+
}
|
|
230
|
+
async getCodebaseIndex() {
|
|
231
|
+
if (this.cachedIndex)
|
|
232
|
+
return this.cachedIndex;
|
|
233
|
+
this.cachedIndex = await indexCodebase(this.codebaseRoot);
|
|
234
|
+
return this.cachedIndex;
|
|
235
|
+
}
|
|
236
|
+
inferCategory(claimText) {
|
|
237
|
+
const lower = claimText.toLowerCase();
|
|
238
|
+
if (lower.includes('security') || lower.includes('injection') || lower.includes('xss'))
|
|
239
|
+
return 'security';
|
|
240
|
+
if (lower.includes('error') || lower.includes('exception') || lower.includes('null'))
|
|
241
|
+
return 'error-handling';
|
|
242
|
+
if (lower.includes('type') || lower.includes('interface'))
|
|
243
|
+
return 'type-safety';
|
|
244
|
+
if (lower.includes('test') || lower.includes('assert'))
|
|
245
|
+
return 'test-quality';
|
|
246
|
+
if (lower.includes('performance') || lower.includes('latency'))
|
|
247
|
+
return 'performance';
|
|
248
|
+
if (lower.includes('edge') || lower.includes('boundary'))
|
|
249
|
+
return 'edge-case';
|
|
250
|
+
if (lower.includes('complete') || lower.includes('implement'))
|
|
251
|
+
return 'completeness';
|
|
252
|
+
return 'correctness';
|
|
253
|
+
}
|
|
254
|
+
inferSeverity(claimText) {
|
|
255
|
+
const lower = claimText.toLowerCase();
|
|
256
|
+
if (lower.includes('injection') || lower.includes('auth') || lower.includes('secret'))
|
|
257
|
+
return 'critical';
|
|
258
|
+
if (lower.includes('error') || lower.includes('crash') || lower.includes('data loss'))
|
|
259
|
+
return 'high';
|
|
260
|
+
if (lower.includes('performance') || lower.includes('edge case'))
|
|
261
|
+
return 'medium';
|
|
262
|
+
return 'low';
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=composition-verifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composition-verifier.js","sourceRoot":"","sources":["../../src/runtime/composition-verifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Experience, CalibrationProfile } from './types.js';
|
|
2
|
+
export declare class ConfidenceCalibrator {
|
|
3
|
+
private profiles;
|
|
4
|
+
constructor(initial?: CalibrationProfile[]);
|
|
5
|
+
calibrate(domain: string, statedConfidence: number): number;
|
|
6
|
+
update(experience: Experience): Promise<void>;
|
|
7
|
+
getProfile(domain: string): CalibrationProfile | null;
|
|
8
|
+
getAllProfiles(): CalibrationProfile[];
|
|
9
|
+
load(profiles: CalibrationProfile[]): void;
|
|
10
|
+
}
|