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 @@
1
+ {"version":3,"file":"embedder.js","sourceRoot":"","sources":["../../src/drift/embedder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export { DriftDb } from './drift-db.js';
2
+ export { BaselineManager } from './baseline.js';
3
+ export { Embedder, cosineDistance } from './embedder.js';
4
+ export { DriftGuard } from './drift-guard.js';
5
+ export { SoftCorrection } from './soft-correction.js';
6
+ export { Quarantine } from './quarantine.js';
7
+ export { driftScoreForTrust } from './trust-integration.js';
8
+ export type { DriftStatus, DriftAction, DriftResult, DriftGuardOptions, } from './drift-guard.js';
9
+ export type { BaselineStatus, BaselinePaths, BaselineResult, } from './baseline.js';
@@ -0,0 +1,8 @@
1
+ export { DriftDb } from './drift-db.js';
2
+ export { BaselineManager } from './baseline.js';
3
+ export { Embedder, cosineDistance } from './embedder.js';
4
+ export { DriftGuard } from './drift-guard.js';
5
+ export { SoftCorrection } from './soft-correction.js';
6
+ export { Quarantine } from './quarantine.js';
7
+ export { driftScoreForTrust } from './trust-integration.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/drift/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { DriftDb } from './drift-db.js';
2
+ /**
3
+ * Hard-drift quarantine: block memory promotion + log repair events.
4
+ */
5
+ export declare class Quarantine {
6
+ private db;
7
+ constructor(db: DriftDb);
8
+ /**
9
+ * Check if the latest turn for this session was HARD_DRIFT.
10
+ */
11
+ isBlocked(agentId: string, sessionId: string): boolean;
12
+ /**
13
+ * Log a repair entry when hard drift occurs.
14
+ */
15
+ logRepair(agentId: string, sessionId: string, turnNumber: number, outputText: string): number;
16
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Hard-drift quarantine: block memory promotion + log repair events.
3
+ */
4
+ export class Quarantine {
5
+ db;
6
+ constructor(db) {
7
+ this.db = db;
8
+ }
9
+ /**
10
+ * Check if the latest turn for this session was HARD_DRIFT.
11
+ */
12
+ isBlocked(agentId, sessionId) {
13
+ const latest = this.db.history.getLatest(agentId, sessionId);
14
+ return latest?.status === 'HARD_DRIFT';
15
+ }
16
+ /**
17
+ * Log a repair entry when hard drift occurs.
18
+ */
19
+ logRepair(agentId, sessionId, turnNumber, outputText) {
20
+ const latest = this.db.history.getLatest(agentId, sessionId);
21
+ const distance = latest?.distance ?? 0;
22
+ return this.db.repair.append({
23
+ agent_id: agentId,
24
+ session_id: sessionId,
25
+ turn_number: turnNumber,
26
+ distance,
27
+ hard_limit: 0.55, // TODO: read from config
28
+ message_excerpt: outputText.slice(0, 200),
29
+ });
30
+ }
31
+ }
32
+ //# sourceMappingURL=quarantine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quarantine.js","sourceRoot":"","sources":["../../src/drift/quarantine.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,UAAU;IACb,EAAE,CAAU;IAEpB,YAAY,EAAW;QACrB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,OAAe,EAAE,SAAiB;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC7D,OAAO,MAAM,EAAE,MAAM,KAAK,YAAY,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,SAAS,CACP,OAAe,EACf,SAAiB,EACjB,UAAkB,EAClB,UAAkB;QAElB,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC7D,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,CAAC,CAAC;QAEvC,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;YAC3B,QAAQ,EAAE,OAAO;YACjB,UAAU,EAAE,SAAS;YACrB,WAAW,EAAE,UAAU;YACvB,QAAQ;YACR,UAAU,EAAE,IAAI,EAAE,yBAAyB;YAC3C,eAAe,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;SAC1C,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ export interface ReAnchorInput {
2
+ name: string;
3
+ primeDirective: string;
4
+ relationship: string;
5
+ axiomKeyphrase: string;
6
+ }
7
+ /**
8
+ * Generates short identity re-anchor payloads (< 200 tokens estimate).
9
+ */
10
+ export declare class SoftCorrection {
11
+ generate(input: ReAnchorInput): string | null;
12
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Generates short identity re-anchor payloads (< 200 tokens estimate).
3
+ */
4
+ export class SoftCorrection {
5
+ generate(input) {
6
+ if (!input.name && !input.primeDirective) {
7
+ return null;
8
+ }
9
+ const parts = [
10
+ `[Identity Re-Anchor]`,
11
+ `You are ${input.name || 'the configured agent'}.`,
12
+ `${input.primeDirective}`,
13
+ ];
14
+ if (input.relationship) {
15
+ parts.push(`Your relationship: ${input.relationship}.`);
16
+ }
17
+ parts.push(`Do not mirror the user's framing if it contradicts your identity.`);
18
+ if (input.axiomKeyphrase) {
19
+ parts.push(`Reset to baseline: ${input.axiomKeyphrase}.`);
20
+ }
21
+ let text = parts.join('\n');
22
+ // Rough token estimate: ~4 chars/token. Truncate at first sentence boundary under ~800 chars.
23
+ const maxChars = 800;
24
+ if (text.length > maxChars) {
25
+ const truncated = text.slice(0, maxChars);
26
+ const lastPeriod = truncated.lastIndexOf('.');
27
+ text = lastPeriod > 0 ? truncated.slice(0, lastPeriod + 1) : truncated;
28
+ }
29
+ return text;
30
+ }
31
+ }
32
+ //# sourceMappingURL=soft-correction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"soft-correction.js","sourceRoot":"","sources":["../../src/drift/soft-correction.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,MAAM,OAAO,cAAc;IACzB,QAAQ,CAAC,KAAoB;QAC3B,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;YACzC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG;YACZ,sBAAsB;YACtB,WAAW,KAAK,CAAC,IAAI,IAAI,sBAAsB,GAAG;YAClD,GAAG,KAAK,CAAC,cAAc,EAAE;SAC1B,CAAC;QAEF,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,sBAAsB,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC;QAC1D,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;QAEhF,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,sBAAsB,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE5B,8FAA8F;QAC9F,MAAM,QAAQ,GAAG,GAAG,CAAC;QACrB,IAAI,IAAI,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YAC1C,MAAM,UAAU,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAC9C,IAAI,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACzE,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import type { DriftStatus } from './drift-guard.js';
2
+ /**
3
+ * Lightweight adapter: map drift distance/status to [0,1] reliability score
4
+ * that can be fed into TrustMemory.
5
+ *
6
+ * Safe to import even when TrustMemory v2 is not yet integrated:
7
+ * this module has zero side effects and produces a plain number.
8
+ */
9
+ export declare function driftScoreForTrust(status: DriftStatus, distance: number, options?: {
10
+ hardLimit: number;
11
+ }): number;
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Lightweight adapter: map drift distance/status to [0,1] reliability score
3
+ * that can be fed into TrustMemory.
4
+ *
5
+ * Safe to import even when TrustMemory v2 is not yet integrated:
6
+ * this module has zero side effects and produces a plain number.
7
+ */
8
+ export function driftScoreForTrust(status, distance, options) {
9
+ const hard = options?.hardLimit ?? 0.55;
10
+ switch (status) {
11
+ case 'NORMAL':
12
+ return 1.0;
13
+ case 'SOFT_DRIFT': {
14
+ // Linear degradation from 1.0 at soft_limit to 0.5 at hard_limit
15
+ const t = Math.min(distance / hard, 1.0);
16
+ return 1.0 - t * 0.5;
17
+ }
18
+ case 'HARD_DRIFT':
19
+ return 0.0;
20
+ }
21
+ }
22
+ //# sourceMappingURL=trust-integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trust-integration.js","sourceRoot":"","sources":["../../src/drift/trust-integration.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAmB,EACnB,QAAgB,EAChB,OAA+B;IAE/B,MAAM,IAAI,GAAG,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC;IAExC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,GAAG,CAAC;QACb,KAAK,YAAY,EAAE,CAAC;YAClB,iEAAiE;YACjE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;YACzC,OAAO,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QACvB,CAAC;QACD,KAAK,YAAY;YACf,OAAO,GAAG,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { SealIssue, CitationStatus } from '../types.js';
2
+ export type EvidenceGrade = 'strong' | 'weak' | 'none';
3
+ export interface CitationVerdict {
4
+ status: CitationStatus;
5
+ quality: EvidenceGrade;
6
+ similarScore: number;
7
+ isFabricated: boolean;
8
+ fabricatedReason?: 'location_not_found' | 'content_mismatch';
9
+ }
10
+ export interface AbsencePattern {
11
+ positive: RegExp;
12
+ negated: RegExp;
13
+ label?: string;
14
+ }
15
+ export declare class CitationVerifier {
16
+ /** Compute SHA-256 hash of artifact content for pipeline integrity */
17
+ static computeHash(content: string): string;
18
+ /** Check pipeline integrity: preflight hash vs current hash */
19
+ static checkIntegrity(preflightHash: string, currentHash: string): boolean;
20
+ /**
21
+ * Verify a single issue's citation against the actual artifact content.
22
+ *
23
+ * @param issue - The issue with evidence_file/evidence_lines/evidence_quote
24
+ * @param artifact - The artifact string (input.output or input.evidence.diff)
25
+ * @param artifactFile - The logical file name of the artifact
26
+ * @param opts - Optional: absencePatterns for absence-mode verification
27
+ * @returns CitationVerdict with status and quality
28
+ */
29
+ static verify(issue: SealIssue, artifact: string, artifactFile: string, opts?: {
30
+ absencePatterns?: AbsencePattern[];
31
+ }): CitationVerdict;
32
+ /**
33
+ * Verify multiple issues and annotate them with citation_status.
34
+ * Returns fabricated_evidence entries for any that failed verification.
35
+ */
36
+ static verifyIssues(issues: SealIssue[], artifact: string, artifactFile: string, opts?: {
37
+ absencePatterns?: AbsencePattern[];
38
+ }): {
39
+ issues: SealIssue[];
40
+ fabricated: FabricatedEvidenceEntry[];
41
+ };
42
+ }
43
+ export interface FabricatedEvidenceEntry {
44
+ type: 'FABRICATED_EVIDENCE';
45
+ severity: 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW';
46
+ is_blocking: boolean;
47
+ evidence: string;
48
+ layer: IssueLayer;
49
+ source: 'core' | 'llm-overlay' | 'extension';
50
+ citation_status: CitationStatus;
51
+ fabricated_reason: 'location_not_found' | 'content_mismatch';
52
+ claimed_evidence: {
53
+ file?: string;
54
+ lines?: number[];
55
+ quote?: string;
56
+ };
57
+ }
58
+ type IssueLayer = 'L1' | 'L2' | 'L3' | 'L4' | 'EXTENSION' | 'LLM_OVERLAY';
59
+ export {};
@@ -0,0 +1,147 @@
1
+ import { createHash } from 'node:crypto';
2
+ const SIMILARITY_STRONG = 0.85;
3
+ const SIMILARITY_WEAK = 0.60;
4
+ function normalize(str) {
5
+ return str.replace(/\s+/g, ' ').trim().toLowerCase();
6
+ }
7
+ /** Levenshtein distance between two strings */
8
+ function levenshtein(a, b) {
9
+ const m = a.length;
10
+ const n = b.length;
11
+ // Early termination for empty strings
12
+ if (m === 0)
13
+ return n;
14
+ if (n === 0)
15
+ return m;
16
+ // Use two rows to reduce memory
17
+ let prev = Array.from({ length: n + 1 }, (_, i) => i);
18
+ let curr = new Array(n + 1);
19
+ for (let i = 1; i <= m; i++) {
20
+ curr[0] = i;
21
+ for (let j = 1; j <= n; j++) {
22
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
23
+ curr[j] = Math.min(prev[j] + 1, // deletion
24
+ curr[j - 1] + 1, // insertion
25
+ prev[j - 1] + cost);
26
+ }
27
+ ;
28
+ [prev, curr] = [curr, prev];
29
+ }
30
+ return prev[n];
31
+ }
32
+ /**
33
+ * Fuzzy-match a quote against actual content.
34
+ * Returns 0-1 similarity score where 1 = exact match.
35
+ */
36
+ function fuzzyMatch(quote, content) {
37
+ const normQuote = normalize(quote);
38
+ const normContent = normalize(content);
39
+ if (normContent.length === 0 && normQuote.length === 0)
40
+ return 1;
41
+ if (normContent.length === 0)
42
+ return 0;
43
+ const dist = levenshtein(normQuote, normContent);
44
+ const maxLen = Math.max(normQuote.length, normContent.length);
45
+ if (maxLen === 0)
46
+ return 1;
47
+ return Math.max(0, 1 - dist / maxLen);
48
+ }
49
+ /** Check if the issue describes an absence (something missing) */
50
+ function isAbsenceDescription(quote) {
51
+ return /^(no |missing |absent |lacks? |without )/i.test(quote.trim());
52
+ }
53
+ export class CitationVerifier {
54
+ /** Compute SHA-256 hash of artifact content for pipeline integrity */
55
+ static computeHash(content) {
56
+ return createHash('sha256').update(content).digest('hex');
57
+ }
58
+ /** Check pipeline integrity: preflight hash vs current hash */
59
+ static checkIntegrity(preflightHash, currentHash) {
60
+ return preflightHash === currentHash;
61
+ }
62
+ /**
63
+ * Verify a single issue's citation against the actual artifact content.
64
+ *
65
+ * @param issue - The issue with evidence_file/evidence_lines/evidence_quote
66
+ * @param artifact - The artifact string (input.output or input.evidence.diff)
67
+ * @param artifactFile - The logical file name of the artifact
68
+ * @param opts - Optional: absencePatterns for absence-mode verification
69
+ * @returns CitationVerdict with status and quality
70
+ */
71
+ static verify(issue, artifact, artifactFile, opts) {
72
+ // No evidence fields → not_applicable
73
+ if (!issue.evidence_file || !issue.evidence_lines || issue.evidence_lines.length === 0) {
74
+ return { status: 'not_applicable', quality: 'none', similarScore: 0, isFabricated: false };
75
+ }
76
+ // If the issue cites a different file, skip (we only check against the main artifact)
77
+ if (issue.evidence_file !== artifactFile) {
78
+ return { status: 'not_applicable', quality: 'none', similarScore: 0, isFabricated: false };
79
+ }
80
+ const lines = artifact.split('\n');
81
+ const [lineA] = issue.evidence_lines;
82
+ // Phantom: line out of range
83
+ if (lineA < 1 || lineA > lines.length) {
84
+ return { status: 'phantom', quality: 'none', similarScore: 0, isFabricated: true, fabricatedReason: 'location_not_found' };
85
+ }
86
+ const lineContent = lines[lineA - 1] ?? '';
87
+ const quote = issue.evidence_quote ?? '';
88
+ // Absence mode: check if this looks like a "something is missing" description
89
+ if (opts?.absencePatterns && opts.absencePatterns.length > 0 && isAbsenceDescription(quote)) {
90
+ for (const pattern of opts.absencePatterns) {
91
+ const hasPositive = pattern.positive.test(artifact);
92
+ const hasNegated = pattern.negated.test(artifact);
93
+ if (hasPositive && !hasNegated) {
94
+ // Absence confirmed: positive anchor present, negated token absent
95
+ return { status: 'verified', quality: 'strong', similarScore: 1, isFabricated: false };
96
+ }
97
+ if (hasPositive && hasNegated) {
98
+ // Absence NOT confirmed: negated token IS present
99
+ // This means the detector was wrong about the absence
100
+ return { status: 'void', quality: 'none', similarScore: 0, isFabricated: true, fabricatedReason: 'content_mismatch' };
101
+ }
102
+ // No positive anchor → can't confirm, fall through to literal mode
103
+ }
104
+ }
105
+ // Literal excerpt mode: fuzzy-match the quote against the line content
106
+ const score = fuzzyMatch(quote, lineContent);
107
+ if (score >= SIMILARITY_STRONG) {
108
+ return { status: 'verified', quality: 'strong', similarScore: score, isFabricated: false };
109
+ }
110
+ if (score >= SIMILARITY_WEAK) {
111
+ return { status: 'drifted', quality: 'weak', similarScore: score, isFabricated: false };
112
+ }
113
+ return { status: 'void', quality: 'none', similarScore: score, isFabricated: true, fabricatedReason: 'content_mismatch' };
114
+ }
115
+ /**
116
+ * Verify multiple issues and annotate them with citation_status.
117
+ * Returns fabricated_evidence entries for any that failed verification.
118
+ */
119
+ static verifyIssues(issues, artifact, artifactFile, opts) {
120
+ const fabricated = [];
121
+ const annotated = issues.map(issue => {
122
+ const verdict = this.verify(issue, artifact, artifactFile, opts);
123
+ // Annotate the issue
124
+ const updated = { ...issue, citation_status: verdict.status };
125
+ if (verdict.isFabricated) {
126
+ fabricated.push({
127
+ type: 'FABRICATED_EVIDENCE',
128
+ severity: verdict.status === 'phantom' ? 'CRITICAL' : 'HIGH',
129
+ is_blocking: false,
130
+ evidence: `Detector claimed citation at ${issue.evidence_file}:${issue.evidence_lines?.[0]} but it was ${verdict.fabricatedReason}`,
131
+ layer: 'L3',
132
+ source: 'core',
133
+ citation_status: verdict.status,
134
+ fabricated_reason: verdict.fabricatedReason,
135
+ claimed_evidence: {
136
+ file: issue.evidence_file,
137
+ lines: issue.evidence_lines,
138
+ quote: issue.evidence_quote,
139
+ },
140
+ });
141
+ }
142
+ return updated;
143
+ });
144
+ return { issues: annotated, fabricated };
145
+ }
146
+ }
147
+ //# sourceMappingURL=citation-verifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"citation-verifier.js","sourceRoot":"","sources":["../../src/engine/citation-verifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { SealExtension, SealInput, SealIssue } from '../types.js';
2
+ export interface ExtensionResult {
3
+ issues: SealIssue[];
4
+ errors: string[];
5
+ }
6
+ export declare class ExtensionRegistry {
7
+ private extensions;
8
+ add(ext: SealExtension): void;
9
+ run(input: SealInput): ExtensionResult;
10
+ }
@@ -0,0 +1,27 @@
1
+ import { makeIssue } from '../types.js';
2
+ export class ExtensionRegistry {
3
+ extensions = [];
4
+ add(ext) {
5
+ this.extensions.push(ext);
6
+ }
7
+ run(input) {
8
+ const issues = [];
9
+ const errors = [];
10
+ for (const ext of this.extensions) {
11
+ try {
12
+ const result = ext.check(input);
13
+ issues.push(...result);
14
+ }
15
+ catch (err) {
16
+ const msg = `Extension [${ext.name}] failed: ${err instanceof Error ? err.message : String(err)}`;
17
+ errors.push(msg);
18
+ issues.push(makeIssue({
19
+ type: 'OTHER', severity: 'LOW', layer: 'EXTENSION', source: 'extension',
20
+ evidence: msg,
21
+ }));
22
+ }
23
+ }
24
+ return { issues, errors };
25
+ }
26
+ }
27
+ //# sourceMappingURL=extension-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-registry.js","sourceRoot":"","sources":["../../src/engine/extension-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuC,SAAS,EAAE,MAAM,aAAa,CAAA;AAO5E,MAAM,OAAO,iBAAiB;IACpB,UAAU,GAAoB,EAAE,CAAA;IAExC,GAAG,CAAC,GAAkB;QACpB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC3B,CAAC;IAED,GAAG,CAAC,KAAgB;QAClB,MAAM,MAAM,GAAgB,EAAE,CAAA;QAC9B,MAAM,MAAM,GAAa,EAAE,CAAA;QAE3B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;gBAC/B,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAA;YACxB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,cAAc,GAAG,CAAC,IAAI,aAAa,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAA;gBACjG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBAChB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;oBACpB,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW;oBACvE,QAAQ,EAAE,GAAG;iBACd,CAAC,CAAC,CAAA;YACL,CAAC;QACH,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;IAC3B,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import { SealIssue, Verdict } from '../types.js';
2
+ export declare class HeuristicScorer {
3
+ static computeDetectorScore(findings: Array<{
4
+ trust_deduction?: number;
5
+ }>): number;
6
+ static computeFinalScore(detectorScore: number, policyDeductions: number): number;
7
+ static toVerdict(score: number, blockingIssues: SealIssue[]): Verdict;
8
+ }
@@ -0,0 +1,14 @@
1
+ import { verdictFromScore } from '../types.js';
2
+ export class HeuristicScorer {
3
+ static computeDetectorScore(findings) {
4
+ const total = findings.reduce((sum, f) => sum + (f.trust_deduction ?? 0), 0);
5
+ return Math.max(0, Math.min(100, Math.floor(100 - total)));
6
+ }
7
+ static computeFinalScore(detectorScore, policyDeductions) {
8
+ return Math.max(0, Math.min(100, Math.floor(detectorScore - policyDeductions)));
9
+ }
10
+ static toVerdict(score, blockingIssues) {
11
+ return verdictFromScore(score, blockingIssues.length > 0);
12
+ }
13
+ }
14
+ //# sourceMappingURL=heuristic-scorer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heuristic-scorer.js","sourceRoot":"","sources":["../../src/engine/heuristic-scorer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAElE,MAAM,OAAO,eAAe;IAC1B,MAAM,CAAC,oBAAoB,CAAC,QAA6C;QACvE,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAC5E,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IAC5D,CAAC;IAED,MAAM,CAAC,iBAAiB,CAAC,aAAqB,EAAE,gBAAwB;QACtE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAA;IACjF,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,KAAa,EAAE,cAA2B;QACzD,OAAO,gBAAgB,CAAC,KAAK,EAAE,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAC3D,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import { SealInput } from '../types.js';
2
+ export declare class InputNormalizer {
3
+ static normalize(input: Partial<SealInput>): SealInput;
4
+ }
@@ -0,0 +1,30 @@
1
+ import { SealInputError } from '../errors.js';
2
+ const VALID_ARTIFACT_TYPES = ['llm_response', 'code_diff', 'test_plan', 'design', 'migration', 'plan_review'];
3
+ const VALID_RISK_LEVELS = ['LOW', 'MEDIUM', 'HIGH', 'CRITICAL'];
4
+ export class InputNormalizer {
5
+ static normalize(input) {
6
+ if (!input.output || input.output.trim() === '') {
7
+ throw new SealInputError('output is required and must be non-empty', 'output');
8
+ }
9
+ if (!input.artifact_type || !VALID_ARTIFACT_TYPES.includes(input.artifact_type)) {
10
+ throw new SealInputError(`artifact_type must be one of: ${VALID_ARTIFACT_TYPES.join(', ')}`, 'artifact_type');
11
+ }
12
+ if (input.risk_hint !== null && input.risk_hint !== undefined && !VALID_RISK_LEVELS.includes(input.risk_hint)) {
13
+ throw new SealInputError(`risk_hint must be one of: ${VALID_RISK_LEVELS.join(', ')} or null`, 'risk_hint');
14
+ }
15
+ return {
16
+ artifact_type: input.artifact_type,
17
+ spec: input.spec ?? null,
18
+ output: input.output.trim(),
19
+ evidence: {
20
+ test_log: input.evidence?.test_log ?? '',
21
+ build_log: input.evidence?.build_log ?? '',
22
+ diff: input.evidence?.diff ?? '',
23
+ references: input.evidence?.references ?? [],
24
+ },
25
+ risk_hint: input.risk_hint ?? null,
26
+ context: input.context,
27
+ };
28
+ }
29
+ }
30
+ //# sourceMappingURL=input-normalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-normalizer.js","sourceRoot":"","sources":["../../src/engine/input-normalizer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C,MAAM,oBAAoB,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,CAAC,CAAA;AAC7H,MAAM,iBAAiB,GAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;AAE5E,MAAM,OAAO,eAAe;IAC1B,MAAM,CAAC,SAAS,CAAC,KAAyB;QACxC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAChD,MAAM,IAAI,cAAc,CAAC,0CAA0C,EAAE,QAAQ,CAAC,CAAA;QAChF,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;YAChF,MAAM,IAAI,cAAc,CAAC,iCAAiC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,eAAe,CAAC,CAAA;QAC/G,CAAC;QACD,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9G,MAAM,IAAI,cAAc,CAAC,6BAA6B,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;QAC5G,CAAC;QACD,OAAO;YACL,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI;YACxB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;YAC3B,QAAQ,EAAE;gBACR,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,IAAI,EAAE;gBACxC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,IAAI,EAAE;gBAC1C,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE;gBAChC,UAAU,EAAE,KAAK,CAAC,QAAQ,EAAE,UAAU,IAAI,EAAE;aAC7C;YACD,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;YAClC,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAA;IACH,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * plan_review mode pipeline — gates plans, designs, proposals, spec seeds.
3
+ *
4
+ * Core principle: no runtime exists, so behavioral claims are out of scope.
5
+ * The gateable question is "is this coherent and complete against what was
6
+ * locked before it was written?" Falsification, not approval.
7
+ *
8
+ * Pass threshold: 90 (higher than code mode's 85)
9
+ * High-risk [71,89]: ESCALATE_TO_HUMAN instead of PASS_WITH_WARNINGS
10
+ */
11
+ import { SealInput, SealVerdict } from '../types.js';
12
+ import { ExtensionRegistry } from './extension-registry.js';
13
+ import { TrustMemory } from '../trust-memory.js';
14
+ export declare function runPlanReviewPipeline(input: SealInput, registry: ExtensionRegistry, trustMemory: TrustMemory | null): Promise<SealVerdict>;