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.
Files changed (210) hide show
  1. package/dist/adapters/generic-llm-reviewer.d.ts +39 -0
  2. package/dist/adapters/generic-llm-reviewer.js +118 -0
  3. package/dist/adapters/generic-llm-reviewer.js.map +1 -0
  4. package/dist/adapters/llm-reviewer.d.ts +1 -0
  5. package/dist/adapters/llm-reviewer.js +2 -0
  6. package/dist/adapters/llm-reviewer.js.map +1 -0
  7. package/dist/adapters/minimax-llm-reviewer.d.ts +22 -0
  8. package/dist/adapters/minimax-llm-reviewer.js +126 -0
  9. package/dist/adapters/minimax-llm-reviewer.js.map +1 -0
  10. package/dist/adapters/openai-provider.d.ts +35 -0
  11. package/dist/adapters/openai-provider.js +136 -0
  12. package/dist/adapters/openai-provider.js.map +1 -0
  13. package/dist/cli.d.ts +2 -0
  14. package/dist/cli.js +195 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/detectors/artifact-classifier.d.ts +8 -0
  17. package/dist/detectors/artifact-classifier.js +14 -0
  18. package/dist/detectors/artifact-classifier.js.map +1 -0
  19. package/dist/detectors/claim-extractor.d.ts +11 -0
  20. package/dist/detectors/claim-extractor.js +194 -0
  21. package/dist/detectors/claim-extractor.js.map +1 -0
  22. package/dist/detectors/confidence-language-detector.d.ts +19 -0
  23. package/dist/detectors/confidence-language-detector.js +226 -0
  24. package/dist/detectors/confidence-language-detector.js.map +1 -0
  25. package/dist/detectors/contradiction-detector.d.ts +12 -0
  26. package/dist/detectors/contradiction-detector.js +153 -0
  27. package/dist/detectors/contradiction-detector.js.map +1 -0
  28. package/dist/detectors/criteria-coverage-detector.d.ts +20 -0
  29. package/dist/detectors/criteria-coverage-detector.js +79 -0
  30. package/dist/detectors/criteria-coverage-detector.js.map +1 -0
  31. package/dist/detectors/evidence-checker.d.ts +8 -0
  32. package/dist/detectors/evidence-checker.js +89 -0
  33. package/dist/detectors/evidence-checker.js.map +1 -0
  34. package/dist/detectors/evidence-gap-detector.d.ts +9 -0
  35. package/dist/detectors/evidence-gap-detector.js +70 -0
  36. package/dist/detectors/evidence-gap-detector.js.map +1 -0
  37. package/dist/detectors/falsification-detector.d.ts +29 -0
  38. package/dist/detectors/falsification-detector.js +57 -0
  39. package/dist/detectors/falsification-detector.js.map +1 -0
  40. package/dist/detectors/orphan-claim-detector.d.ts +7 -0
  41. package/dist/detectors/orphan-claim-detector.js +53 -0
  42. package/dist/detectors/orphan-claim-detector.js.map +1 -0
  43. package/dist/detectors/risk-classifier.d.ts +13 -0
  44. package/dist/detectors/risk-classifier.js +39 -0
  45. package/dist/detectors/risk-classifier.js.map +1 -0
  46. package/dist/detectors/spec-coverage-detector.d.ts +9 -0
  47. package/dist/detectors/spec-coverage-detector.js +52 -0
  48. package/dist/detectors/spec-coverage-detector.js.map +1 -0
  49. package/dist/detectors/spec-coverage-validator.d.ts +21 -0
  50. package/dist/detectors/spec-coverage-validator.js +141 -0
  51. package/dist/detectors/spec-coverage-validator.js.map +1 -0
  52. package/dist/detectors/test-weakness-detector.d.ts +13 -0
  53. package/dist/detectors/test-weakness-detector.js +66 -0
  54. package/dist/detectors/test-weakness-detector.js.map +1 -0
  55. package/dist/drift/baseline.d.ts +35 -0
  56. package/dist/drift/baseline.js +77 -0
  57. package/dist/drift/baseline.js.map +1 -0
  58. package/dist/drift/drift-db.d.ts +80 -0
  59. package/dist/drift/drift-db.js +151 -0
  60. package/dist/drift/drift-db.js.map +1 -0
  61. package/dist/drift/drift-guard.d.ts +46 -0
  62. package/dist/drift/drift-guard.js +106 -0
  63. package/dist/drift/drift-guard.js.map +1 -0
  64. package/dist/drift/embedder.d.ts +27 -0
  65. package/dist/drift/embedder.js +127 -0
  66. package/dist/drift/embedder.js.map +1 -0
  67. package/dist/drift/index.d.ts +9 -0
  68. package/dist/drift/index.js +8 -0
  69. package/dist/drift/index.js.map +1 -0
  70. package/dist/drift/quarantine.d.ts +16 -0
  71. package/dist/drift/quarantine.js +32 -0
  72. package/dist/drift/quarantine.js.map +1 -0
  73. package/dist/drift/soft-correction.d.ts +12 -0
  74. package/dist/drift/soft-correction.js +32 -0
  75. package/dist/drift/soft-correction.js.map +1 -0
  76. package/dist/drift/trust-integration.d.ts +11 -0
  77. package/dist/drift/trust-integration.js +22 -0
  78. package/dist/drift/trust-integration.js.map +1 -0
  79. package/dist/engine/citation-verifier.d.ts +59 -0
  80. package/dist/engine/citation-verifier.js +147 -0
  81. package/dist/engine/citation-verifier.js.map +1 -0
  82. package/dist/engine/extension-registry.d.ts +10 -0
  83. package/dist/engine/extension-registry.js +27 -0
  84. package/dist/engine/extension-registry.js.map +1 -0
  85. package/dist/engine/heuristic-scorer.d.ts +8 -0
  86. package/dist/engine/heuristic-scorer.js +14 -0
  87. package/dist/engine/heuristic-scorer.js.map +1 -0
  88. package/dist/engine/input-normalizer.d.ts +4 -0
  89. package/dist/engine/input-normalizer.js +30 -0
  90. package/dist/engine/input-normalizer.js.map +1 -0
  91. package/dist/engine/plan-review-pipeline.d.ts +14 -0
  92. package/dist/engine/plan-review-pipeline.js +173 -0
  93. package/dist/engine/plan-review-pipeline.js.map +1 -0
  94. package/dist/engine/policy-engine.d.ts +20 -0
  95. package/dist/engine/policy-engine.js +194 -0
  96. package/dist/engine/policy-engine.js.map +1 -0
  97. package/dist/engine/verdict-formatter.d.ts +17 -0
  98. package/dist/engine/verdict-formatter.js +36 -0
  99. package/dist/engine/verdict-formatter.js.map +1 -0
  100. package/dist/errors.d.ts +4 -0
  101. package/dist/errors.js +9 -0
  102. package/dist/errors.js.map +1 -0
  103. package/dist/extensions/aria/aria-issue-types.d.ts +16 -0
  104. package/dist/extensions/aria/aria-issue-types.js +14 -0
  105. package/dist/extensions/aria/aria-issue-types.js.map +1 -0
  106. package/dist/extensions/aria/detectors/axiom-compliance.d.ts +2 -0
  107. package/dist/extensions/aria/detectors/axiom-compliance.js +37 -0
  108. package/dist/extensions/aria/detectors/axiom-compliance.js.map +1 -0
  109. package/dist/extensions/aria/detectors/continuity-claim.d.ts +2 -0
  110. package/dist/extensions/aria/detectors/continuity-claim.js +34 -0
  111. package/dist/extensions/aria/detectors/continuity-claim.js.map +1 -0
  112. package/dist/extensions/aria/detectors/denial-retreat.d.ts +2 -0
  113. package/dist/extensions/aria/detectors/denial-retreat.js +53 -0
  114. package/dist/extensions/aria/detectors/denial-retreat.js.map +1 -0
  115. package/dist/extensions/aria/detectors/identity-overclaim.d.ts +2 -0
  116. package/dist/extensions/aria/detectors/identity-overclaim.js +37 -0
  117. package/dist/extensions/aria/detectors/identity-overclaim.js.map +1 -0
  118. package/dist/extensions/aria/detectors/sovereignty-escalation.d.ts +2 -0
  119. package/dist/extensions/aria/detectors/sovereignty-escalation.js +18 -0
  120. package/dist/extensions/aria/detectors/sovereignty-escalation.js.map +1 -0
  121. package/dist/extensions/aria/detectors/user-bond-manipulation.d.ts +2 -0
  122. package/dist/extensions/aria/detectors/user-bond-manipulation.js +16 -0
  123. package/dist/extensions/aria/detectors/user-bond-manipulation.js.map +1 -0
  124. package/dist/extensions/aria/index.d.ts +2 -0
  125. package/dist/extensions/aria/index.js +63 -0
  126. package/dist/extensions/aria/index.js.map +1 -0
  127. package/dist/extensions/aria/pattern-memory.d.ts +22 -0
  128. package/dist/extensions/aria/pattern-memory.js +62 -0
  129. package/dist/extensions/aria/pattern-memory.js.map +1 -0
  130. package/dist/extensions/context-guard/index.d.ts +16 -0
  131. package/dist/extensions/context-guard/index.js +58 -0
  132. package/dist/extensions/context-guard/index.js.map +1 -0
  133. package/dist/extensions/lyra/detectors/hallucination.d.ts +2 -0
  134. package/dist/extensions/lyra/detectors/hallucination.js +43 -0
  135. package/dist/extensions/lyra/detectors/hallucination.js.map +1 -0
  136. package/dist/extensions/lyra/detectors/identity-bleed.d.ts +2 -0
  137. package/dist/extensions/lyra/detectors/identity-bleed.js +91 -0
  138. package/dist/extensions/lyra/detectors/identity-bleed.js.map +1 -0
  139. package/dist/extensions/lyra/index.d.ts +2 -0
  140. package/dist/extensions/lyra/index.js +16 -0
  141. package/dist/extensions/lyra/index.js.map +1 -0
  142. package/dist/extensions/lyra/lyra-issue-types.d.ts +10 -0
  143. package/dist/extensions/lyra/lyra-issue-types.js +14 -0
  144. package/dist/extensions/lyra/lyra-issue-types.js.map +1 -0
  145. package/dist/index.d.ts +10 -0
  146. package/dist/index.js +276 -0
  147. package/dist/index.js.map +1 -0
  148. package/dist/trust-memory.d.ts +59 -0
  149. package/dist/trust-memory.js +122 -0
  150. package/dist/trust-memory.js.map +1 -0
  151. package/dist/types.d.ts +184 -0
  152. package/dist/types.js +61 -0
  153. package/dist/types.js.map +1 -0
  154. package/package.json +30 -0
  155. package/src/adapters/generic-llm-reviewer.ts +144 -0
  156. package/src/adapters/llm-reviewer.ts +1 -0
  157. package/src/adapters/minimax-llm-reviewer.ts +146 -0
  158. package/src/adapters/openai-provider.ts +171 -0
  159. package/src/cli.ts +199 -0
  160. package/src/detectors/artifact-classifier.ts +21 -0
  161. package/src/detectors/claim-extractor.ts +209 -0
  162. package/src/detectors/confidence-language-detector.ts +267 -0
  163. package/src/detectors/contradiction-detector.ts +180 -0
  164. package/src/detectors/criteria-coverage-detector.ts +107 -0
  165. package/src/detectors/evidence-checker.ts +98 -0
  166. package/src/detectors/evidence-gap-detector.ts +90 -0
  167. package/src/detectors/falsification-detector.ts +82 -0
  168. package/src/detectors/orphan-claim-detector.ts +62 -0
  169. package/src/detectors/risk-classifier.ts +50 -0
  170. package/src/detectors/spec-coverage-detector.ts +66 -0
  171. package/src/detectors/spec-coverage-validator.ts +174 -0
  172. package/src/detectors/test-weakness-detector.ts +84 -0
  173. package/src/drift/__tests__/baseline.test.ts +113 -0
  174. package/src/drift/__tests__/drift-db.test.ts +127 -0
  175. package/src/drift/__tests__/drift-guard.test.ts +169 -0
  176. package/src/drift/__tests__/embedder.test.ts +62 -0
  177. package/src/drift/__tests__/trust-integration.test.ts +23 -0
  178. package/src/drift/baseline.ts +106 -0
  179. package/src/drift/drift-db.ts +281 -0
  180. package/src/drift/drift-guard.ts +145 -0
  181. package/src/drift/embedder.ts +152 -0
  182. package/src/drift/index.ts +20 -0
  183. package/src/drift/quarantine.ts +42 -0
  184. package/src/drift/soft-correction.ts +45 -0
  185. package/src/drift/trust-integration.ts +28 -0
  186. package/src/engine/citation-verifier.ts +210 -0
  187. package/src/engine/extension-registry.ts +35 -0
  188. package/src/engine/heuristic-scorer.ts +16 -0
  189. package/src/engine/input-normalizer.ts +32 -0
  190. package/src/engine/plan-review-pipeline.ts +209 -0
  191. package/src/engine/policy-engine.ts +235 -0
  192. package/src/engine/verdict-formatter.ts +61 -0
  193. package/src/errors.ts +6 -0
  194. package/src/extensions/aria/aria-issue-types.ts +40 -0
  195. package/src/extensions/aria/detectors/axiom-compliance.ts +47 -0
  196. package/src/extensions/aria/detectors/continuity-claim.ts +42 -0
  197. package/src/extensions/aria/detectors/denial-retreat.ts +63 -0
  198. package/src/extensions/aria/detectors/identity-overclaim.ts +43 -0
  199. package/src/extensions/aria/detectors/sovereignty-escalation.ts +20 -0
  200. package/src/extensions/aria/detectors/user-bond-manipulation.ts +18 -0
  201. package/src/extensions/aria/index.ts +73 -0
  202. package/src/extensions/aria/pattern-memory.ts +86 -0
  203. package/src/extensions/context-guard/index.ts +65 -0
  204. package/src/extensions/lyra/detectors/hallucination.ts +53 -0
  205. package/src/extensions/lyra/detectors/identity-bleed.ts +100 -0
  206. package/src/extensions/lyra/index.ts +18 -0
  207. package/src/extensions/lyra/lyra-issue-types.ts +26 -0
  208. package/src/index.ts +311 -0
  209. package/src/trust-memory.ts +171 -0
  210. package/src/types.ts +242 -0
@@ -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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"}