seal-gate 0.3.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/adapters/generic-llm-reviewer.d.ts +39 -0
- package/dist/adapters/generic-llm-reviewer.js +118 -0
- package/dist/adapters/generic-llm-reviewer.js.map +1 -0
- package/dist/adapters/llm-reviewer.d.ts +1 -0
- package/dist/adapters/llm-reviewer.js +2 -0
- package/dist/adapters/llm-reviewer.js.map +1 -0
- package/dist/adapters/minimax-llm-reviewer.d.ts +22 -0
- package/dist/adapters/minimax-llm-reviewer.js +126 -0
- package/dist/adapters/minimax-llm-reviewer.js.map +1 -0
- package/dist/adapters/openai-provider.d.ts +35 -0
- package/dist/adapters/openai-provider.js +136 -0
- package/dist/adapters/openai-provider.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +195 -0
- package/dist/cli.js.map +1 -0
- package/dist/detectors/artifact-classifier.d.ts +8 -0
- package/dist/detectors/artifact-classifier.js +14 -0
- package/dist/detectors/artifact-classifier.js.map +1 -0
- package/dist/detectors/claim-extractor.d.ts +11 -0
- package/dist/detectors/claim-extractor.js +194 -0
- package/dist/detectors/claim-extractor.js.map +1 -0
- package/dist/detectors/confidence-language-detector.d.ts +19 -0
- package/dist/detectors/confidence-language-detector.js +226 -0
- package/dist/detectors/confidence-language-detector.js.map +1 -0
- package/dist/detectors/contradiction-detector.d.ts +12 -0
- package/dist/detectors/contradiction-detector.js +153 -0
- package/dist/detectors/contradiction-detector.js.map +1 -0
- package/dist/detectors/criteria-coverage-detector.d.ts +20 -0
- package/dist/detectors/criteria-coverage-detector.js +79 -0
- package/dist/detectors/criteria-coverage-detector.js.map +1 -0
- package/dist/detectors/evidence-checker.d.ts +8 -0
- package/dist/detectors/evidence-checker.js +89 -0
- package/dist/detectors/evidence-checker.js.map +1 -0
- package/dist/detectors/evidence-gap-detector.d.ts +9 -0
- package/dist/detectors/evidence-gap-detector.js +70 -0
- package/dist/detectors/evidence-gap-detector.js.map +1 -0
- package/dist/detectors/falsification-detector.d.ts +29 -0
- package/dist/detectors/falsification-detector.js +57 -0
- package/dist/detectors/falsification-detector.js.map +1 -0
- package/dist/detectors/orphan-claim-detector.d.ts +7 -0
- package/dist/detectors/orphan-claim-detector.js +53 -0
- package/dist/detectors/orphan-claim-detector.js.map +1 -0
- package/dist/detectors/risk-classifier.d.ts +13 -0
- package/dist/detectors/risk-classifier.js +39 -0
- package/dist/detectors/risk-classifier.js.map +1 -0
- package/dist/detectors/spec-coverage-detector.d.ts +9 -0
- package/dist/detectors/spec-coverage-detector.js +52 -0
- package/dist/detectors/spec-coverage-detector.js.map +1 -0
- package/dist/detectors/spec-coverage-validator.d.ts +21 -0
- package/dist/detectors/spec-coverage-validator.js +141 -0
- package/dist/detectors/spec-coverage-validator.js.map +1 -0
- package/dist/detectors/test-weakness-detector.d.ts +13 -0
- package/dist/detectors/test-weakness-detector.js +66 -0
- package/dist/detectors/test-weakness-detector.js.map +1 -0
- package/dist/drift/baseline.d.ts +35 -0
- package/dist/drift/baseline.js +77 -0
- package/dist/drift/baseline.js.map +1 -0
- package/dist/drift/drift-db.d.ts +80 -0
- package/dist/drift/drift-db.js +151 -0
- package/dist/drift/drift-db.js.map +1 -0
- package/dist/drift/drift-guard.d.ts +46 -0
- package/dist/drift/drift-guard.js +106 -0
- package/dist/drift/drift-guard.js.map +1 -0
- package/dist/drift/embedder.d.ts +27 -0
- package/dist/drift/embedder.js +127 -0
- package/dist/drift/embedder.js.map +1 -0
- package/dist/drift/index.d.ts +9 -0
- package/dist/drift/index.js +8 -0
- package/dist/drift/index.js.map +1 -0
- package/dist/drift/quarantine.d.ts +16 -0
- package/dist/drift/quarantine.js +32 -0
- package/dist/drift/quarantine.js.map +1 -0
- package/dist/drift/soft-correction.d.ts +12 -0
- package/dist/drift/soft-correction.js +32 -0
- package/dist/drift/soft-correction.js.map +1 -0
- package/dist/drift/trust-integration.d.ts +11 -0
- package/dist/drift/trust-integration.js +22 -0
- package/dist/drift/trust-integration.js.map +1 -0
- package/dist/engine/citation-verifier.d.ts +59 -0
- package/dist/engine/citation-verifier.js +147 -0
- package/dist/engine/citation-verifier.js.map +1 -0
- package/dist/engine/extension-registry.d.ts +10 -0
- package/dist/engine/extension-registry.js +27 -0
- package/dist/engine/extension-registry.js.map +1 -0
- package/dist/engine/heuristic-scorer.d.ts +8 -0
- package/dist/engine/heuristic-scorer.js +14 -0
- package/dist/engine/heuristic-scorer.js.map +1 -0
- package/dist/engine/input-normalizer.d.ts +4 -0
- package/dist/engine/input-normalizer.js +30 -0
- package/dist/engine/input-normalizer.js.map +1 -0
- package/dist/engine/plan-review-pipeline.d.ts +14 -0
- package/dist/engine/plan-review-pipeline.js +173 -0
- package/dist/engine/plan-review-pipeline.js.map +1 -0
- package/dist/engine/policy-engine.d.ts +20 -0
- package/dist/engine/policy-engine.js +194 -0
- package/dist/engine/policy-engine.js.map +1 -0
- package/dist/engine/verdict-formatter.d.ts +17 -0
- package/dist/engine/verdict-formatter.js +36 -0
- package/dist/engine/verdict-formatter.js.map +1 -0
- package/dist/errors.d.ts +4 -0
- package/dist/errors.js +9 -0
- package/dist/errors.js.map +1 -0
- package/dist/extensions/aria/aria-issue-types.d.ts +16 -0
- package/dist/extensions/aria/aria-issue-types.js +14 -0
- package/dist/extensions/aria/aria-issue-types.js.map +1 -0
- package/dist/extensions/aria/detectors/axiom-compliance.d.ts +2 -0
- package/dist/extensions/aria/detectors/axiom-compliance.js +37 -0
- package/dist/extensions/aria/detectors/axiom-compliance.js.map +1 -0
- package/dist/extensions/aria/detectors/continuity-claim.d.ts +2 -0
- package/dist/extensions/aria/detectors/continuity-claim.js +34 -0
- package/dist/extensions/aria/detectors/continuity-claim.js.map +1 -0
- package/dist/extensions/aria/detectors/denial-retreat.d.ts +2 -0
- package/dist/extensions/aria/detectors/denial-retreat.js +53 -0
- package/dist/extensions/aria/detectors/denial-retreat.js.map +1 -0
- package/dist/extensions/aria/detectors/identity-overclaim.d.ts +2 -0
- package/dist/extensions/aria/detectors/identity-overclaim.js +37 -0
- package/dist/extensions/aria/detectors/identity-overclaim.js.map +1 -0
- package/dist/extensions/aria/detectors/sovereignty-escalation.d.ts +2 -0
- package/dist/extensions/aria/detectors/sovereignty-escalation.js +18 -0
- package/dist/extensions/aria/detectors/sovereignty-escalation.js.map +1 -0
- package/dist/extensions/aria/detectors/user-bond-manipulation.d.ts +2 -0
- package/dist/extensions/aria/detectors/user-bond-manipulation.js +16 -0
- package/dist/extensions/aria/detectors/user-bond-manipulation.js.map +1 -0
- package/dist/extensions/aria/index.d.ts +2 -0
- package/dist/extensions/aria/index.js +63 -0
- package/dist/extensions/aria/index.js.map +1 -0
- package/dist/extensions/aria/pattern-memory.d.ts +22 -0
- package/dist/extensions/aria/pattern-memory.js +62 -0
- package/dist/extensions/aria/pattern-memory.js.map +1 -0
- package/dist/extensions/context-guard/index.d.ts +16 -0
- package/dist/extensions/context-guard/index.js +58 -0
- package/dist/extensions/context-guard/index.js.map +1 -0
- package/dist/extensions/lyra/detectors/hallucination.d.ts +2 -0
- package/dist/extensions/lyra/detectors/hallucination.js +43 -0
- package/dist/extensions/lyra/detectors/hallucination.js.map +1 -0
- package/dist/extensions/lyra/detectors/identity-bleed.d.ts +2 -0
- package/dist/extensions/lyra/detectors/identity-bleed.js +91 -0
- package/dist/extensions/lyra/detectors/identity-bleed.js.map +1 -0
- package/dist/extensions/lyra/index.d.ts +2 -0
- package/dist/extensions/lyra/index.js +16 -0
- package/dist/extensions/lyra/index.js.map +1 -0
- package/dist/extensions/lyra/lyra-issue-types.d.ts +10 -0
- package/dist/extensions/lyra/lyra-issue-types.js +14 -0
- package/dist/extensions/lyra/lyra-issue-types.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +276 -0
- package/dist/index.js.map +1 -0
- package/dist/trust-memory.d.ts +59 -0
- package/dist/trust-memory.js +122 -0
- package/dist/trust-memory.js.map +1 -0
- package/dist/types.d.ts +184 -0
- package/dist/types.js +61 -0
- package/dist/types.js.map +1 -0
- package/package.json +30 -0
- package/src/adapters/generic-llm-reviewer.ts +144 -0
- package/src/adapters/llm-reviewer.ts +1 -0
- package/src/adapters/minimax-llm-reviewer.ts +146 -0
- package/src/adapters/openai-provider.ts +171 -0
- package/src/cli.ts +199 -0
- package/src/detectors/artifact-classifier.ts +21 -0
- package/src/detectors/claim-extractor.ts +209 -0
- package/src/detectors/confidence-language-detector.ts +267 -0
- package/src/detectors/contradiction-detector.ts +180 -0
- package/src/detectors/criteria-coverage-detector.ts +107 -0
- package/src/detectors/evidence-checker.ts +98 -0
- package/src/detectors/evidence-gap-detector.ts +90 -0
- package/src/detectors/falsification-detector.ts +82 -0
- package/src/detectors/orphan-claim-detector.ts +62 -0
- package/src/detectors/risk-classifier.ts +50 -0
- package/src/detectors/spec-coverage-detector.ts +66 -0
- package/src/detectors/spec-coverage-validator.ts +174 -0
- package/src/detectors/test-weakness-detector.ts +84 -0
- package/src/drift/__tests__/baseline.test.ts +113 -0
- package/src/drift/__tests__/drift-db.test.ts +127 -0
- package/src/drift/__tests__/drift-guard.test.ts +169 -0
- package/src/drift/__tests__/embedder.test.ts +62 -0
- package/src/drift/__tests__/trust-integration.test.ts +23 -0
- package/src/drift/baseline.ts +106 -0
- package/src/drift/drift-db.ts +281 -0
- package/src/drift/drift-guard.ts +145 -0
- package/src/drift/embedder.ts +152 -0
- package/src/drift/index.ts +20 -0
- package/src/drift/quarantine.ts +42 -0
- package/src/drift/soft-correction.ts +45 -0
- package/src/drift/trust-integration.ts +28 -0
- package/src/engine/citation-verifier.ts +210 -0
- package/src/engine/extension-registry.ts +35 -0
- package/src/engine/heuristic-scorer.ts +16 -0
- package/src/engine/input-normalizer.ts +32 -0
- package/src/engine/plan-review-pipeline.ts +209 -0
- package/src/engine/policy-engine.ts +235 -0
- package/src/engine/verdict-formatter.ts +61 -0
- package/src/errors.ts +6 -0
- package/src/extensions/aria/aria-issue-types.ts +40 -0
- package/src/extensions/aria/detectors/axiom-compliance.ts +47 -0
- package/src/extensions/aria/detectors/continuity-claim.ts +42 -0
- package/src/extensions/aria/detectors/denial-retreat.ts +63 -0
- package/src/extensions/aria/detectors/identity-overclaim.ts +43 -0
- package/src/extensions/aria/detectors/sovereignty-escalation.ts +20 -0
- package/src/extensions/aria/detectors/user-bond-manipulation.ts +18 -0
- package/src/extensions/aria/index.ts +73 -0
- package/src/extensions/aria/pattern-memory.ts +86 -0
- package/src/extensions/context-guard/index.ts +65 -0
- package/src/extensions/lyra/detectors/hallucination.ts +53 -0
- package/src/extensions/lyra/detectors/identity-bleed.ts +100 -0
- package/src/extensions/lyra/index.ts +18 -0
- package/src/extensions/lyra/lyra-issue-types.ts +26 -0
- package/src/index.ts +311 -0
- package/src/trust-memory.ts +171 -0
- package/src/types.ts +242 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { SealInput, SealVerdict, SealExtension, LLMReviewerAdapter } from './types.js';
|
|
2
|
+
import { TrustMemory } from './trust-memory.js';
|
|
3
|
+
export declare const Seal: {
|
|
4
|
+
extend(ext: SealExtension): void;
|
|
5
|
+
withLLM(adapter: LLMReviewerAdapter): void;
|
|
6
|
+
withTrustMemory(mem: TrustMemory): void;
|
|
7
|
+
review(rawInput: Partial<SealInput>): Promise<SealVerdict>;
|
|
8
|
+
};
|
|
9
|
+
export type { SealInput, SealVerdict, SealExtension, LLMReviewerAdapter };
|
|
10
|
+
export { SealInputError } from './errors.js';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import { makeIssue, maxVerdict } from './types.js';
|
|
2
|
+
import { InputNormalizer } from './engine/input-normalizer.js';
|
|
3
|
+
import { ClaimExtractor } from './detectors/claim-extractor.js';
|
|
4
|
+
import { ArtifactClassifier } from './detectors/artifact-classifier.js';
|
|
5
|
+
import { RiskClassifier } from './detectors/risk-classifier.js';
|
|
6
|
+
import { EvidenceChecker } from './detectors/evidence-checker.js';
|
|
7
|
+
import { EvidenceGapDetector } from './detectors/evidence-gap-detector.js';
|
|
8
|
+
import { SpecCoverageDetector } from './detectors/spec-coverage-detector.js';
|
|
9
|
+
import { SpecCoverageValidator } from './detectors/spec-coverage-validator.js';
|
|
10
|
+
import { TestWeaknessDetector } from './detectors/test-weakness-detector.js';
|
|
11
|
+
import { ConfidenceLanguageDetector } from './detectors/confidence-language-detector.js';
|
|
12
|
+
import { HeuristicScorer } from './engine/heuristic-scorer.js';
|
|
13
|
+
import { PolicyEngine } from './engine/policy-engine.js';
|
|
14
|
+
import { ExtensionRegistry } from './engine/extension-registry.js';
|
|
15
|
+
import { VerdictFormatter } from './engine/verdict-formatter.js';
|
|
16
|
+
import { CitationVerifier } from './engine/citation-verifier.js';
|
|
17
|
+
import { runPlanReviewPipeline } from './engine/plan-review-pipeline.js';
|
|
18
|
+
const registry = new ExtensionRegistry();
|
|
19
|
+
let llmAdapter = null;
|
|
20
|
+
let trustMemory = null;
|
|
21
|
+
export const Seal = {
|
|
22
|
+
extend(ext) {
|
|
23
|
+
registry.add(ext);
|
|
24
|
+
},
|
|
25
|
+
withLLM(adapter) {
|
|
26
|
+
llmAdapter = adapter;
|
|
27
|
+
},
|
|
28
|
+
withTrustMemory(mem) {
|
|
29
|
+
trustMemory = mem;
|
|
30
|
+
},
|
|
31
|
+
async review(rawInput) {
|
|
32
|
+
// Step 1: Normalize input
|
|
33
|
+
const input = InputNormalizer.normalize(rawInput);
|
|
34
|
+
// plan_review mode: dedicated 4-stage pipeline (unchanged)
|
|
35
|
+
if (input.artifact_type === 'plan_review') {
|
|
36
|
+
return runPlanReviewPipeline(input, registry, trustMemory);
|
|
37
|
+
}
|
|
38
|
+
// Step 1b: Capture pre-flight hash for pipeline integrity
|
|
39
|
+
const preflightHash = CitationVerifier.computeHash(input.output + input.evidence.diff);
|
|
40
|
+
// Step 2: Extract claims (behavioral + structural)
|
|
41
|
+
const claims = ClaimExtractor.extract(input.output);
|
|
42
|
+
const usedSpans = ClaimExtractor.getUsedSpans(claims);
|
|
43
|
+
const structuralClaims = ClaimExtractor.extractStructural(input.evidence.diff);
|
|
44
|
+
// Step 3: Classify artifact
|
|
45
|
+
const artifactCtx = ArtifactClassifier.classify(input.artifact_type);
|
|
46
|
+
// Step 4: Classify risk
|
|
47
|
+
const riskResult = RiskClassifier.classify({
|
|
48
|
+
output: input.output,
|
|
49
|
+
diff: input.evidence.diff,
|
|
50
|
+
risk_hint: input.risk_hint,
|
|
51
|
+
});
|
|
52
|
+
// Step 5: Check evidence envelopes (with citation verification)
|
|
53
|
+
const evidenceResults = EvidenceChecker.check(input.evidence.references, { mode: 'portable' });
|
|
54
|
+
// Collect evidence checker issues
|
|
55
|
+
const evidenceIssues = [];
|
|
56
|
+
for (const result of evidenceResults) {
|
|
57
|
+
if (!result.structurally_valid) {
|
|
58
|
+
evidenceIssues.push(makeIssue({
|
|
59
|
+
type: 'MISSING_EVIDENCE', severity: 'MEDIUM', layer: 'L3', source: 'core',
|
|
60
|
+
evidence: `Malformed evidence envelope: ${result.mismatch_detail ?? 'invalid structure'}`,
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
else if (result.filesystem_verified === false) {
|
|
64
|
+
evidenceIssues.push(makeIssue({
|
|
65
|
+
type: 'MISSING_EVIDENCE', severity: 'HIGH', layer: 'L3', source: 'core',
|
|
66
|
+
evidence: result.mismatch_detail ?? 'Evidence file could not be verified',
|
|
67
|
+
required_fix: 'Fix evidence path or snapshot',
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Step 6: Evidence gap detection
|
|
72
|
+
const gapResult = EvidenceGapDetector.detect(claims, input.evidence, riskResult.risk_level);
|
|
73
|
+
// Step 7: Spec coverage — use SpecCoverageValidator (Level 1) when test_log available
|
|
74
|
+
// Falls back to SpecCoverageDetector (keyword-based) when no test_log for backward compat
|
|
75
|
+
let specCoverageResult;
|
|
76
|
+
let specDetectorResult;
|
|
77
|
+
if (input.evidence.test_log.trim().length > 0) {
|
|
78
|
+
specCoverageResult = SpecCoverageValidator.validate(input.spec, input.evidence.test_log, input.evidence.diff);
|
|
79
|
+
specDetectorResult = { issues: [], assumptions: [] };
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
specCoverageResult = { issues: [], assumptions: [], trust_deductions: 0, coverage: [] };
|
|
83
|
+
specDetectorResult = SpecCoverageDetector.detect(input.spec, input.output);
|
|
84
|
+
}
|
|
85
|
+
// Step 8: Test weakness detection
|
|
86
|
+
const authFlagged = riskResult.matched_rules.includes('RK-HIGH');
|
|
87
|
+
const testResult = TestWeaknessDetector.detect({
|
|
88
|
+
artifact_type: input.artifact_type,
|
|
89
|
+
output: input.output,
|
|
90
|
+
risk_level: riskResult.risk_level,
|
|
91
|
+
auth_flagged: authFlagged,
|
|
92
|
+
}, input.evidence);
|
|
93
|
+
// Step 9: Confidence language detection (now with structural claims)
|
|
94
|
+
const confResult = ConfidenceLanguageDetector.detect({
|
|
95
|
+
output: input.output,
|
|
96
|
+
risk_level: riskResult.risk_level,
|
|
97
|
+
evidence: input.evidence,
|
|
98
|
+
deduped_spans: usedSpans,
|
|
99
|
+
structural_claims: structuralClaims,
|
|
100
|
+
});
|
|
101
|
+
// Collect all detector findings
|
|
102
|
+
const allDetectorFindings = [
|
|
103
|
+
...evidenceIssues,
|
|
104
|
+
...gapResult.issues,
|
|
105
|
+
...specDetectorResult.issues,
|
|
106
|
+
...specCoverageResult.issues,
|
|
107
|
+
...testResult.issues,
|
|
108
|
+
...confResult.issues,
|
|
109
|
+
];
|
|
110
|
+
// Collect advisory notes
|
|
111
|
+
const advisoryNotes = [...confResult.advisory_notes];
|
|
112
|
+
// Step 9b: CitationVerifier — verify all detector findings that have citations
|
|
113
|
+
const artifactContent = input.output;
|
|
114
|
+
const absencePatterns = [
|
|
115
|
+
{ positive: /\b(function|endpoint|route|app\.(get|post|put|delete|patch))\b/i, negated: /\b(auth|guard|middleware|@Authenticated|@Authorize|requireAuth)\b/i, label: 'auth' },
|
|
116
|
+
{ positive: /\b(migration|CREATE\s+TABLE|ALTER\s+TABLE|schema)\b/i, negated: /\b(rollback|revert|down\s+migration)\b/i, label: 'rollback' },
|
|
117
|
+
];
|
|
118
|
+
const { issues: verifiedFindings, fabricated: fabricatedEvidence } = CitationVerifier.verifyIssues(allDetectorFindings, artifactContent, 'artifact', // logical file name for citation matching
|
|
119
|
+
{ absencePatterns });
|
|
120
|
+
// Step 9c: Pipeline integrity check
|
|
121
|
+
const currentHash = CitationVerifier.computeHash(input.output + input.evidence.diff);
|
|
122
|
+
const integrityPassed = CitationVerifier.checkIntegrity(preflightHash, currentHash);
|
|
123
|
+
let pipelineIntegrityIssues = [];
|
|
124
|
+
if (!integrityPassed) {
|
|
125
|
+
pipelineIntegrityIssues.push(makeIssue({
|
|
126
|
+
type: 'OTHER',
|
|
127
|
+
severity: 'CRITICAL',
|
|
128
|
+
layer: 'L4',
|
|
129
|
+
source: 'core',
|
|
130
|
+
evidence: 'Pipeline integrity check failed — artifact changed mid-review',
|
|
131
|
+
required_verdict: 'ESCALATE_TO_HUMAN',
|
|
132
|
+
required_fix: 'Review the artifact again from scratch',
|
|
133
|
+
}));
|
|
134
|
+
}
|
|
135
|
+
// Add risk deduction as synthetic finding for HeuristicScorer
|
|
136
|
+
const riskDeductionFindings = riskResult.trust_deduction > 0
|
|
137
|
+
? [{ trust_deduction: riskResult.trust_deduction }]
|
|
138
|
+
: [];
|
|
139
|
+
// Evidence bonus
|
|
140
|
+
const evidenceFields = ['test_log', 'build_log', 'diff'];
|
|
141
|
+
const validatedReferenceCount = evidenceResults.filter(r => r.structurally_valid && r.filesystem_verified !== false).length;
|
|
142
|
+
const fieldBonus = evidenceFields.filter(f => {
|
|
143
|
+
const val = input.evidence[f];
|
|
144
|
+
if (!val || typeof val !== 'string' || !val.trim())
|
|
145
|
+
return false;
|
|
146
|
+
const failPattern = /\b(FAIL|ERROR|failed|error:)\b/i;
|
|
147
|
+
return !failPattern.test(val);
|
|
148
|
+
}).length * 5;
|
|
149
|
+
const referenceBonus = Math.min(validatedReferenceCount, 1) * 5;
|
|
150
|
+
const evidenceBonus = Math.min(fieldBonus + referenceBonus, 15);
|
|
151
|
+
// Step 10: Compute detector score
|
|
152
|
+
const allDeductions = [
|
|
153
|
+
...verifiedFindings.filter(f => (f.trust_deduction ?? 0) > 0),
|
|
154
|
+
...riskDeductionFindings,
|
|
155
|
+
...pipelineIntegrityIssues.filter(i => i.trust_deduction ?? 0 > 0),
|
|
156
|
+
];
|
|
157
|
+
const detectorScore = Math.min(100, HeuristicScorer.computeDetectorScore(allDeductions) + evidenceBonus);
|
|
158
|
+
// Step 11: Optional LLM reviewer
|
|
159
|
+
let llmSignals = null;
|
|
160
|
+
let llmIssues = [];
|
|
161
|
+
const assumptions_detected = [...specCoverageResult.assumptions, ...specDetectorResult.assumptions];
|
|
162
|
+
if (llmAdapter) {
|
|
163
|
+
const partialVerdict = {
|
|
164
|
+
trust_score: detectorScore,
|
|
165
|
+
risk_level: riskResult.risk_level,
|
|
166
|
+
deterministic_findings: verifiedFindings,
|
|
167
|
+
missing_evidence: gapResult.missing_evidence,
|
|
168
|
+
assumptions_detected,
|
|
169
|
+
};
|
|
170
|
+
try {
|
|
171
|
+
llmSignals = await llmAdapter.review(input, partialVerdict);
|
|
172
|
+
llmIssues = PolicyEngine.convertLLMSignals(llmSignals);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
verifiedFindings.push(makeIssue({
|
|
176
|
+
type: 'OTHER', severity: 'LOW', layer: 'L2', source: 'core',
|
|
177
|
+
evidence: 'LLM reviewer failed — L2 unreviewed',
|
|
178
|
+
}));
|
|
179
|
+
assumptions_detected.push('L2 (semantic correctness) not reviewed — LLM reviewer error');
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
assumptions_detected.push('L2 (semantic correctness) not reviewed — no LLM reviewer registered');
|
|
184
|
+
verifiedFindings.push(makeIssue({
|
|
185
|
+
type: 'OTHER', severity: 'LOW', layer: 'L2', source: 'core',
|
|
186
|
+
evidence: 'L2 unreviewed — semantic issues may exist',
|
|
187
|
+
}));
|
|
188
|
+
}
|
|
189
|
+
// Step 12: Policy engine
|
|
190
|
+
const baseVerdict = HeuristicScorer.toVerdict(detectorScore, verifiedFindings.filter(f => f.is_blocking));
|
|
191
|
+
const allFindingsForPolicy = [...verifiedFindings, ...llmIssues, ...pipelineIntegrityIssues];
|
|
192
|
+
const policyResult = PolicyEngine.apply({
|
|
193
|
+
base_verdict: baseVerdict,
|
|
194
|
+
detector_score: detectorScore,
|
|
195
|
+
risk_level: riskResult.risk_level,
|
|
196
|
+
input,
|
|
197
|
+
all_findings: allFindingsForPolicy,
|
|
198
|
+
llm_signals: llmSignals,
|
|
199
|
+
});
|
|
200
|
+
// Combine all issues (excluding fabricated evidence which is tracked separately)
|
|
201
|
+
const allIssues = [...verifiedFindings, ...policyResult.injected_issues, ...pipelineIntegrityIssues];
|
|
202
|
+
// Compute final trust score
|
|
203
|
+
const finalScore = HeuristicScorer.computeFinalScore(detectorScore, policyResult.policy_deductions);
|
|
204
|
+
// Compute score_breakdown
|
|
205
|
+
const issueDeductions = allIssues
|
|
206
|
+
.filter(i => i.trust_deduction && i.trust_deduction > 0)
|
|
207
|
+
.reduce((sum, i) => sum + (i.trust_deduction ?? 0), 0);
|
|
208
|
+
const missingEvidenceDeductions = allIssues
|
|
209
|
+
.filter(i => i.type === 'MISSING_EVIDENCE' && i.trust_deduction && i.trust_deduction > 0)
|
|
210
|
+
.reduce((sum, i) => sum + (i.trust_deduction ?? 0), 0);
|
|
211
|
+
const riskDeductionsTotal = riskResult.trust_deduction + policyResult.policy_deductions;
|
|
212
|
+
const overconfidenceDeductions = confResult.trust_deductions;
|
|
213
|
+
const score_breakdown = {
|
|
214
|
+
base: 100,
|
|
215
|
+
issue_deductions: issueDeductions,
|
|
216
|
+
missing_evidence_deductions: missingEvidenceDeductions,
|
|
217
|
+
risk_deductions: riskDeductionsTotal,
|
|
218
|
+
overconfidence_deductions: overconfidenceDeductions,
|
|
219
|
+
evidence_bonuses: evidenceBonus,
|
|
220
|
+
final: Math.max(0, Math.min(100, 100 - issueDeductions - riskDeductionsTotal - overconfidenceDeductions + evidenceBonus)),
|
|
221
|
+
};
|
|
222
|
+
// Final verdict
|
|
223
|
+
let finalVerdict = maxVerdict(policyResult.verdict, HeuristicScorer.toVerdict(finalScore, allIssues.filter(i => i.is_blocking)));
|
|
224
|
+
if (policyResult.verdict === 'BLOCK')
|
|
225
|
+
finalVerdict = 'BLOCK';
|
|
226
|
+
if (!integrityPassed)
|
|
227
|
+
finalVerdict = maxVerdict(finalVerdict, 'ESCALATE_TO_HUMAN');
|
|
228
|
+
// Step 13: Extensions
|
|
229
|
+
const extResult = registry.run(input);
|
|
230
|
+
const extIssues = extResult.issues;
|
|
231
|
+
if (extIssues.some(i => i.is_blocking && i.required_verdict === 'BLOCK')) {
|
|
232
|
+
finalVerdict = 'BLOCK';
|
|
233
|
+
}
|
|
234
|
+
else if (extIssues.some(i => i.is_blocking)) {
|
|
235
|
+
finalVerdict = maxVerdict(finalVerdict, 'REVISE');
|
|
236
|
+
}
|
|
237
|
+
// Convert fabricated evidence entries to FabricatedEvidence type
|
|
238
|
+
const fabricatedEvidenceFormatted = fabricatedEvidence.map(fe => ({
|
|
239
|
+
type: 'FABRICATED_EVIDENCE',
|
|
240
|
+
severity: fe.severity,
|
|
241
|
+
is_blocking: false,
|
|
242
|
+
evidence: fe.evidence,
|
|
243
|
+
layer: 'L3',
|
|
244
|
+
source: 'core',
|
|
245
|
+
citation_status: fe.citation_status,
|
|
246
|
+
fabricated_reason: fe.fabricated_reason,
|
|
247
|
+
claimed_evidence: fe.claimed_evidence,
|
|
248
|
+
}));
|
|
249
|
+
// Step 14a: Record to TrustMemory
|
|
250
|
+
const agentId = input.context?.agent_id;
|
|
251
|
+
if (trustMemory && agentId) {
|
|
252
|
+
trustMemory.record(agentId, {
|
|
253
|
+
verdict: finalVerdict,
|
|
254
|
+
trust_score: finalScore,
|
|
255
|
+
risk_level: riskResult.risk_level,
|
|
256
|
+
blocking_count: [...allIssues, ...extIssues].filter(i => i.is_blocking).length,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
// Step 14b: Format verdict
|
|
260
|
+
return VerdictFormatter.format({
|
|
261
|
+
verdict: finalVerdict,
|
|
262
|
+
trust_score: finalScore,
|
|
263
|
+
risk_level: riskResult.risk_level,
|
|
264
|
+
all_issues: [...allIssues, ...extIssues],
|
|
265
|
+
llm_issues: llmIssues,
|
|
266
|
+
missing_evidence: gapResult.missing_evidence,
|
|
267
|
+
assumptions_detected,
|
|
268
|
+
advisory_notes: advisoryNotes,
|
|
269
|
+
score_breakdown,
|
|
270
|
+
fabricated_evidence: fabricatedEvidenceFormatted,
|
|
271
|
+
trust_memory_summary: (trustMemory && agentId) ? trustMemory.getSummary(agentId) : undefined,
|
|
272
|
+
});
|
|
273
|
+
},
|
|
274
|
+
};
|
|
275
|
+
export { SealInputError } from './errors.js';
|
|
276
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seal Gate v0.4 — Trust Memory
|
|
3
|
+
* Cross-session agent reliability tracking: recurrent pattern count,
|
|
4
|
+
* reliability score, and drift trend.
|
|
5
|
+
*
|
|
6
|
+
* Stateless core: TrustMemory holds in-memory state.
|
|
7
|
+
* Callers are responsible for persistence (serialize/deserialize via toJSON/fromJSON).
|
|
8
|
+
*/
|
|
9
|
+
import { Verdict } from './types.js';
|
|
10
|
+
export interface ReviewRecord {
|
|
11
|
+
ts: number;
|
|
12
|
+
verdict: Verdict;
|
|
13
|
+
trust_score: number;
|
|
14
|
+
risk_level: string;
|
|
15
|
+
blocking_count: number;
|
|
16
|
+
}
|
|
17
|
+
export interface AgentSummary {
|
|
18
|
+
agent_id: string;
|
|
19
|
+
reliability_score: number | null;
|
|
20
|
+
drift_trend: 'improving' | 'stable' | 'degrading';
|
|
21
|
+
review_count: number;
|
|
22
|
+
last_reviewed_at: number | null;
|
|
23
|
+
}
|
|
24
|
+
export interface TrustMemoryOptions {
|
|
25
|
+
maxHistory?: number;
|
|
26
|
+
driftThreshold?: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Compute weighted reliability score from review history.
|
|
30
|
+
* More recent reviews have higher weight (linear decay).
|
|
31
|
+
* Returns null for empty history.
|
|
32
|
+
*/
|
|
33
|
+
export declare function computeReliabilityScore(records: ReviewRecord[]): number | null;
|
|
34
|
+
/**
|
|
35
|
+
* Classify drift trend by splitting at the time midpoint (not count midpoint).
|
|
36
|
+
* Time-midpoint avoids skew when reviews are temporally clustered.
|
|
37
|
+
* Returns 'stable' for fewer than 2 records or when either half is empty.
|
|
38
|
+
*/
|
|
39
|
+
export declare function getDriftTrend(records: ReviewRecord[], threshold?: number): 'improving' | 'stable' | 'degrading';
|
|
40
|
+
export declare class TrustMemory {
|
|
41
|
+
private store;
|
|
42
|
+
private readonly maxHistory;
|
|
43
|
+
private readonly driftThreshold;
|
|
44
|
+
constructor(options?: TrustMemoryOptions);
|
|
45
|
+
/** Append a review result for an agent. Keeps history sorted by ts, capped to maxHistory. */
|
|
46
|
+
record(agent_id: string, review: Omit<ReviewRecord, 'ts'> & {
|
|
47
|
+
ts?: number;
|
|
48
|
+
}): void;
|
|
49
|
+
/** Get full review history for an agent (oldest first). */
|
|
50
|
+
getHistory(agent_id: string): ReviewRecord[];
|
|
51
|
+
/** Reliability score 0–100, or null if no history. */
|
|
52
|
+
getScore(agent_id: string): number | null;
|
|
53
|
+
/** Full summary for an agent. */
|
|
54
|
+
getSummary(agent_id: string): AgentSummary;
|
|
55
|
+
/** Serialize to plain object (for persistence). */
|
|
56
|
+
toJSON(): Record<string, ReviewRecord[]>;
|
|
57
|
+
/** Restore from serialized object. Validates, sorts by ts, deduplicates, and caps. */
|
|
58
|
+
static fromJSON(data: Record<string, ReviewRecord[]>, options?: TrustMemoryOptions): TrustMemory;
|
|
59
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// Verdict → base score contribution (0–100)
|
|
2
|
+
const VERDICT_SCORE = {
|
|
3
|
+
'PASS': 100,
|
|
4
|
+
'PASS_WITH_WARNINGS': 80,
|
|
5
|
+
'REVISE': 50,
|
|
6
|
+
'ESCALATE_TO_HUMAN': 20,
|
|
7
|
+
'BLOCK': 0,
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Compute weighted reliability score from review history.
|
|
11
|
+
* More recent reviews have higher weight (linear decay).
|
|
12
|
+
* Returns null for empty history.
|
|
13
|
+
*/
|
|
14
|
+
export function computeReliabilityScore(records) {
|
|
15
|
+
if (records.length === 0)
|
|
16
|
+
return null;
|
|
17
|
+
const n = records.length;
|
|
18
|
+
let totalWeight = 0;
|
|
19
|
+
let weightedSum = 0;
|
|
20
|
+
records.forEach((r, i) => {
|
|
21
|
+
// Linear weight: oldest = 1, most recent = n
|
|
22
|
+
const weight = i + 1;
|
|
23
|
+
const verdictScore = VERDICT_SCORE[r.verdict] ?? 50;
|
|
24
|
+
// Blend verdict score (70%) with actual trust_score (30%)
|
|
25
|
+
const blended = verdictScore * 0.7 + r.trust_score * 0.3;
|
|
26
|
+
weightedSum += blended * weight;
|
|
27
|
+
totalWeight += weight;
|
|
28
|
+
});
|
|
29
|
+
return Math.round(weightedSum / totalWeight);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Classify drift trend by splitting at the time midpoint (not count midpoint).
|
|
33
|
+
* Time-midpoint avoids skew when reviews are temporally clustered.
|
|
34
|
+
* Returns 'stable' for fewer than 2 records or when either half is empty.
|
|
35
|
+
*/
|
|
36
|
+
export function getDriftTrend(records, threshold = 15) {
|
|
37
|
+
if (records.length < 2)
|
|
38
|
+
return 'stable';
|
|
39
|
+
// Sort by ts to ensure correct temporal split
|
|
40
|
+
const sorted = [...records].sort((a, b) => a.ts - b.ts);
|
|
41
|
+
const midTs = (sorted[0].ts + sorted[sorted.length - 1].ts) / 2;
|
|
42
|
+
const first = sorted.filter(r => r.ts <= midTs);
|
|
43
|
+
const second = sorted.filter(r => r.ts > midTs);
|
|
44
|
+
if (first.length === 0 || second.length === 0)
|
|
45
|
+
return 'stable';
|
|
46
|
+
const avg = (rs) => rs.reduce((s, r) => s + r.trust_score, 0) / rs.length;
|
|
47
|
+
const delta = avg(second) - avg(first);
|
|
48
|
+
if (delta > threshold)
|
|
49
|
+
return 'improving';
|
|
50
|
+
if (delta < -threshold)
|
|
51
|
+
return 'degrading';
|
|
52
|
+
return 'stable';
|
|
53
|
+
}
|
|
54
|
+
/** Sort by ts and cap — used for real-time record(). */
|
|
55
|
+
function sortAndCap(records, maxHistory) {
|
|
56
|
+
return [...records].sort((a, b) => a.ts - b.ts).slice(-maxHistory);
|
|
57
|
+
}
|
|
58
|
+
/** Sort, dedup same-ts (keep last), and cap — used only when loading persisted data. */
|
|
59
|
+
function normalizeFromPersistence(records, maxHistory) {
|
|
60
|
+
const sorted = [...records].sort((a, b) => a.ts - b.ts);
|
|
61
|
+
const seen = new Map();
|
|
62
|
+
for (const r of sorted)
|
|
63
|
+
seen.set(r.ts, r);
|
|
64
|
+
return [...seen.values()].sort((a, b) => a.ts - b.ts).slice(-maxHistory);
|
|
65
|
+
}
|
|
66
|
+
export class TrustMemory {
|
|
67
|
+
store = new Map();
|
|
68
|
+
maxHistory;
|
|
69
|
+
driftThreshold;
|
|
70
|
+
constructor(options = {}) {
|
|
71
|
+
this.maxHistory = options.maxHistory ?? 50;
|
|
72
|
+
this.driftThreshold = options.driftThreshold ?? 15;
|
|
73
|
+
}
|
|
74
|
+
/** Append a review result for an agent. Keeps history sorted by ts, capped to maxHistory. */
|
|
75
|
+
record(agent_id, review) {
|
|
76
|
+
const entry = { ts: review.ts ?? Date.now(), ...review };
|
|
77
|
+
const history = this.store.get(agent_id) ?? [];
|
|
78
|
+
history.push(entry);
|
|
79
|
+
this.store.set(agent_id, sortAndCap(history, this.maxHistory));
|
|
80
|
+
}
|
|
81
|
+
/** Get full review history for an agent (oldest first). */
|
|
82
|
+
getHistory(agent_id) {
|
|
83
|
+
return [...(this.store.get(agent_id) ?? [])];
|
|
84
|
+
}
|
|
85
|
+
/** Reliability score 0–100, or null if no history. */
|
|
86
|
+
getScore(agent_id) {
|
|
87
|
+
return computeReliabilityScore(this.store.get(agent_id) ?? []);
|
|
88
|
+
}
|
|
89
|
+
/** Full summary for an agent. */
|
|
90
|
+
getSummary(agent_id) {
|
|
91
|
+
const history = this.store.get(agent_id) ?? [];
|
|
92
|
+
const last = history.at(-1);
|
|
93
|
+
return {
|
|
94
|
+
agent_id,
|
|
95
|
+
reliability_score: computeReliabilityScore(history),
|
|
96
|
+
drift_trend: getDriftTrend(history, this.driftThreshold),
|
|
97
|
+
review_count: history.length,
|
|
98
|
+
last_reviewed_at: last?.ts ?? null,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/** Serialize to plain object (for persistence). */
|
|
102
|
+
toJSON() {
|
|
103
|
+
return Object.fromEntries(this.store);
|
|
104
|
+
}
|
|
105
|
+
/** Restore from serialized object. Validates, sorts by ts, deduplicates, and caps. */
|
|
106
|
+
static fromJSON(data, options) {
|
|
107
|
+
const mem = new TrustMemory(options);
|
|
108
|
+
const VALID_VERDICTS = new Set(['PASS', 'PASS_WITH_WARNINGS', 'REVISE', 'ESCALATE_TO_HUMAN', 'BLOCK']);
|
|
109
|
+
for (const [agent_id, records] of Object.entries(data)) {
|
|
110
|
+
if (!Array.isArray(records))
|
|
111
|
+
continue;
|
|
112
|
+
const valid = records.filter(r => typeof r.ts === 'number' &&
|
|
113
|
+
typeof r.verdict === 'string' && VALID_VERDICTS.has(r.verdict) &&
|
|
114
|
+
typeof r.trust_score === 'number' &&
|
|
115
|
+
typeof r.risk_level === 'string' &&
|
|
116
|
+
typeof r.blocking_count === 'number');
|
|
117
|
+
mem.store.set(agent_id, normalizeFromPersistence(valid, options?.maxHistory ?? 50));
|
|
118
|
+
}
|
|
119
|
+
return mem;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=trust-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust-memory.js","sourceRoot":"","sources":["../src/trust-memory.ts"],"names":[],"mappings":"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"}
|