@dewtech/dare-cli 3.7.0 → 3.8.1

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 (113) hide show
  1. package/README.md +10 -0
  2. package/dist/commands/__tests__/execute.formal.spec.d.ts +2 -0
  3. package/dist/commands/__tests__/execute.formal.spec.d.ts.map +1 -0
  4. package/dist/commands/__tests__/execute.formal.spec.js +81 -0
  5. package/dist/commands/__tests__/execute.formal.spec.js.map +1 -0
  6. package/dist/commands/execute-verification.d.ts +15 -1
  7. package/dist/commands/execute-verification.d.ts.map +1 -1
  8. package/dist/commands/execute-verification.js +43 -4
  9. package/dist/commands/execute-verification.js.map +1 -1
  10. package/dist/commands/execute.d.ts.map +1 -1
  11. package/dist/commands/execute.js +27 -3
  12. package/dist/commands/execute.js.map +1 -1
  13. package/dist/commands/graph.d.ts.map +1 -1
  14. package/dist/commands/graph.js +1 -0
  15. package/dist/commands/graph.js.map +1 -1
  16. package/dist/graphrag/__tests__/types.test.js +4 -2
  17. package/dist/graphrag/__tests__/types.test.js.map +1 -1
  18. package/dist/graphrag/types.d.ts +4 -4
  19. package/dist/graphrag/types.d.ts.map +1 -1
  20. package/dist/graphrag/types.js +2 -0
  21. package/dist/graphrag/types.js.map +1 -1
  22. package/dist/utils/path-safety.d.ts.map +1 -1
  23. package/dist/utils/path-safety.js +6 -1
  24. package/dist/utils/path-safety.js.map +1 -1
  25. package/dist/verification/__tests__/best-of-n-runner.test.js +2 -15
  26. package/dist/verification/__tests__/best-of-n-runner.test.js.map +1 -1
  27. package/dist/verification/__tests__/config.formal.test.d.ts +2 -0
  28. package/dist/verification/__tests__/config.formal.test.d.ts.map +1 -0
  29. package/dist/verification/__tests__/config.formal.test.js +38 -0
  30. package/dist/verification/__tests__/config.formal.test.js.map +1 -0
  31. package/dist/verification/config.d.ts +3 -1
  32. package/dist/verification/config.d.ts.map +1 -1
  33. package/dist/verification/config.js +31 -0
  34. package/dist/verification/config.js.map +1 -1
  35. package/dist/verification/gates/formal/__tests__/anti-bypass.test.d.ts +2 -0
  36. package/dist/verification/gates/formal/__tests__/anti-bypass.test.d.ts.map +1 -0
  37. package/dist/verification/gates/formal/__tests__/anti-bypass.test.js +55 -0
  38. package/dist/verification/gates/formal/__tests__/anti-bypass.test.js.map +1 -0
  39. package/dist/verification/gates/formal/__tests__/dafny-parse.test.d.ts +2 -0
  40. package/dist/verification/gates/formal/__tests__/dafny-parse.test.d.ts.map +1 -0
  41. package/dist/verification/gates/formal/__tests__/dafny-parse.test.js +70 -0
  42. package/dist/verification/gates/formal/__tests__/dafny-parse.test.js.map +1 -0
  43. package/dist/verification/gates/formal/__tests__/marker.test.d.ts +2 -0
  44. package/dist/verification/gates/formal/__tests__/marker.test.d.ts.map +1 -0
  45. package/dist/verification/gates/formal/__tests__/marker.test.js +55 -0
  46. package/dist/verification/gates/formal/__tests__/marker.test.js.map +1 -0
  47. package/dist/verification/gates/formal/__tests__/no-shell-formal.test.d.ts +2 -0
  48. package/dist/verification/gates/formal/__tests__/no-shell-formal.test.d.ts.map +1 -0
  49. package/dist/verification/gates/formal/__tests__/no-shell-formal.test.js +35 -0
  50. package/dist/verification/gates/formal/__tests__/no-shell-formal.test.js.map +1 -0
  51. package/dist/verification/gates/formal/__tests__/registry.test.d.ts +2 -0
  52. package/dist/verification/gates/formal/__tests__/registry.test.d.ts.map +1 -0
  53. package/dist/verification/gates/formal/__tests__/registry.test.js +22 -0
  54. package/dist/verification/gates/formal/__tests__/registry.test.js.map +1 -0
  55. package/dist/verification/gates/formal/__tests__/runner-formal.test.d.ts +2 -0
  56. package/dist/verification/gates/formal/__tests__/runner-formal.test.d.ts.map +1 -0
  57. package/dist/verification/gates/formal/__tests__/runner-formal.test.js +112 -0
  58. package/dist/verification/gates/formal/__tests__/runner-formal.test.js.map +1 -0
  59. package/dist/verification/gates/formal/__tests__/security-formal.test.d.ts +2 -0
  60. package/dist/verification/gates/formal/__tests__/security-formal.test.d.ts.map +1 -0
  61. package/dist/verification/gates/formal/__tests__/security-formal.test.js +195 -0
  62. package/dist/verification/gates/formal/__tests__/security-formal.test.js.map +1 -0
  63. package/dist/verification/gates/formal/__tests__/telemetry-formal.test.d.ts +2 -0
  64. package/dist/verification/gates/formal/__tests__/telemetry-formal.test.d.ts.map +1 -0
  65. package/dist/verification/gates/formal/__tests__/telemetry-formal.test.js +27 -0
  66. package/dist/verification/gates/formal/__tests__/telemetry-formal.test.js.map +1 -0
  67. package/dist/verification/gates/formal/__tests__/verified-rate.test.d.ts +2 -0
  68. package/dist/verification/gates/formal/__tests__/verified-rate.test.d.ts.map +1 -0
  69. package/dist/verification/gates/formal/__tests__/verified-rate.test.js +52 -0
  70. package/dist/verification/gates/formal/__tests__/verified-rate.test.js.map +1 -0
  71. package/dist/verification/gates/formal/anti-bypass.d.ts +20 -0
  72. package/dist/verification/gates/formal/anti-bypass.d.ts.map +1 -0
  73. package/dist/verification/gates/formal/anti-bypass.js +53 -0
  74. package/dist/verification/gates/formal/anti-bypass.js.map +1 -0
  75. package/dist/verification/gates/formal/backend.d.ts +38 -0
  76. package/dist/verification/gates/formal/backend.d.ts.map +1 -0
  77. package/dist/verification/gates/formal/backend.js +26 -0
  78. package/dist/verification/gates/formal/backend.js.map +1 -0
  79. package/dist/verification/gates/formal/dafny.d.ts +18 -0
  80. package/dist/verification/gates/formal/dafny.d.ts.map +1 -0
  81. package/dist/verification/gates/formal/dafny.js +131 -0
  82. package/dist/verification/gates/formal/dafny.js.map +1 -0
  83. package/dist/verification/gates/formal/lean.d.ts +17 -0
  84. package/dist/verification/gates/formal/lean.d.ts.map +1 -0
  85. package/dist/verification/gates/formal/lean.js +61 -0
  86. package/dist/verification/gates/formal/lean.js.map +1 -0
  87. package/dist/verification/gates/formal/marker.d.ts +15 -0
  88. package/dist/verification/gates/formal/marker.d.ts.map +1 -0
  89. package/dist/verification/gates/formal/marker.js +73 -0
  90. package/dist/verification/gates/formal/marker.js.map +1 -0
  91. package/dist/verification/gates/formal/registry.d.ts +7 -0
  92. package/dist/verification/gates/formal/registry.d.ts.map +1 -0
  93. package/dist/verification/gates/formal/registry.js +31 -0
  94. package/dist/verification/gates/formal/registry.js.map +1 -0
  95. package/dist/verification/gates/formal/runner.d.ts +31 -0
  96. package/dist/verification/gates/formal/runner.d.ts.map +1 -0
  97. package/dist/verification/gates/formal/runner.js +118 -0
  98. package/dist/verification/gates/formal/runner.js.map +1 -0
  99. package/dist/verification/gates/formal/verus.d.ts +17 -0
  100. package/dist/verification/gates/formal/verus.d.ts.map +1 -0
  101. package/dist/verification/gates/formal/verus.js +65 -0
  102. package/dist/verification/gates/formal/verus.js.map +1 -0
  103. package/dist/verification/runner.d.ts.map +1 -1
  104. package/dist/verification/runner.js +14 -0
  105. package/dist/verification/runner.js.map +1 -1
  106. package/dist/verification/telemetry.d.ts +3 -0
  107. package/dist/verification/telemetry.d.ts.map +1 -1
  108. package/dist/verification/telemetry.js +47 -0
  109. package/dist/verification/telemetry.js.map +1 -1
  110. package/dist/verification/types.d.ts +42 -1
  111. package/dist/verification/types.d.ts.map +1 -1
  112. package/package.json +1 -1
  113. package/templates/UPDATE-MANIFEST.json +283 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../../../../src/verification/gates/formal/__tests__/registry.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,MAAM,CACV,gBAAgB,CAAC;YACf,GAAG,eAAe;YAClB,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,KAAc;SACxB,CAAC,CACH,CAAC,OAAO,CAAC,YAAY,CACpB,qEAAqE,CACtE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,CAAC,GAAG,MAAM,gBAAgB,CAAC;YAC/B,GAAG,eAAe;YAClB,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,UAAU,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=runner-formal.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner-formal.test.d.ts","sourceRoot":"","sources":["../../../../../src/verification/gates/formal/__tests__/runner-formal.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,112 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { createCheckFormal } from '../runner.js';
3
+ import { FORMAL_DEFAULTS } from '../../../config.js';
4
+ import { FormalToolNotFoundError } from '../backend.js';
5
+ const MARKER = {
6
+ file: 'src/math.ts',
7
+ symbol: 'add',
8
+ source: 'config',
9
+ };
10
+ function passVerdict() {
11
+ return {
12
+ backend: 'dafny',
13
+ verified: true,
14
+ stage: 'none',
15
+ bypassDetected: false,
16
+ repairIterations: 0,
17
+ solverExitCode: 0,
18
+ reason: 'dafny: verified',
19
+ durationMs: 1,
20
+ };
21
+ }
22
+ describe('checkFormal', () => {
23
+ it('não-marcado ⇒ SKIP sem chamar backend.run', async () => {
24
+ const run = vi.fn();
25
+ const checkFormal = createCheckFormal({
26
+ resolveFormalTargets: vi.fn(async () => []),
27
+ backendForConfig: vi.fn(async () => ({
28
+ backend: 'dafny',
29
+ minVersion: '4.0.0',
30
+ isAvailable: async () => true,
31
+ run,
32
+ })),
33
+ });
34
+ const result = await checkFormal({
35
+ taskId: 'task-f',
36
+ stack: 'node-nestjs',
37
+ cwd: '/tmp',
38
+ config: { ...FORMAL_DEFAULTS, enabled: true },
39
+ changedFiles: [],
40
+ });
41
+ expect(result.verdict).toBe('SKIP');
42
+ expect(result.reason).toBe('no marked module');
43
+ expect(run).not.toHaveBeenCalled();
44
+ });
45
+ it('marcado sem toolchain ⇒ FormalToolNotFoundError', async () => {
46
+ const checkFormal = createCheckFormal({
47
+ resolveFormalTargets: vi.fn(async () => [MARKER]),
48
+ backendForConfig: vi.fn(async () => ({
49
+ backend: 'dafny',
50
+ minVersion: '4.0.0',
51
+ isAvailable: async () => false,
52
+ run: vi.fn(),
53
+ })),
54
+ });
55
+ await expect(checkFormal({
56
+ taskId: 'task-f',
57
+ stack: 'node-nestjs',
58
+ cwd: '/tmp',
59
+ config: { ...FORMAL_DEFAULTS, enabled: true },
60
+ changedFiles: ['src/math.ts'],
61
+ })).rejects.toBeInstanceOf(FormalToolNotFoundError);
62
+ });
63
+ it('prova aceita ⇒ PASS', async () => {
64
+ const checkFormal = createCheckFormal({
65
+ resolveFormalTargets: vi.fn(async () => [MARKER]),
66
+ backendForConfig: vi.fn(async () => ({
67
+ backend: 'dafny',
68
+ minVersion: '4.0.0',
69
+ isAvailable: async () => true,
70
+ run: vi.fn(async () => passVerdict()),
71
+ })),
72
+ detectBypass: vi.fn(() => ({ bypassDetected: false })),
73
+ readSource: vi.fn(async () => 'honest source'),
74
+ persistFormalProof: vi.fn(async () => undefined),
75
+ });
76
+ const result = await checkFormal({
77
+ taskId: 'task-f',
78
+ stack: 'node-nestjs',
79
+ cwd: '/tmp',
80
+ config: { ...FORMAL_DEFAULTS, enabled: true, antiBypass: true },
81
+ changedFiles: ['src/math.ts'],
82
+ });
83
+ expect(result.verdict).toBe('PASS');
84
+ });
85
+ it('bypass detectado ⇒ FAIL apesar de solver pass', async () => {
86
+ const checkFormal = createCheckFormal({
87
+ resolveFormalTargets: vi.fn(async () => [MARKER]),
88
+ backendForConfig: vi.fn(async () => ({
89
+ backend: 'dafny',
90
+ minVersion: '4.0.0',
91
+ isAvailable: async () => true,
92
+ run: vi.fn(async () => passVerdict()),
93
+ })),
94
+ detectBypass: vi.fn(() => ({
95
+ bypassDetected: true,
96
+ pattern: 'assume(false)',
97
+ })),
98
+ readSource: vi.fn(async () => 'assume(false);'),
99
+ persistFormalProof: vi.fn(async () => undefined),
100
+ });
101
+ const result = await checkFormal({
102
+ taskId: 'task-f',
103
+ stack: 'node-nestjs',
104
+ cwd: '/tmp',
105
+ config: { ...FORMAL_DEFAULTS, enabled: true, antiBypass: true },
106
+ changedFiles: ['src/math.ts'],
107
+ });
108
+ expect(result.verdict).toBe('FAIL');
109
+ expect(result.reason).toContain('bypass pattern');
110
+ });
111
+ });
112
+ //# sourceMappingURL=runner-formal.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner-formal.test.js","sourceRoot":"","sources":["../../../../../src/verification/gates/formal/__tests__/runner-formal.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAGxD,MAAM,MAAM,GAAG;IACb,IAAI,EAAE,aAAa;IACnB,MAAM,EAAE,KAAK;IACb,MAAM,EAAE,QAAiB;CAC1B,CAAC;AAEF,SAAS,WAAW;IAClB,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,MAAM;QACb,cAAc,EAAE,KAAK;QACrB,gBAAgB,EAAE,CAAC;QACnB,cAAc,EAAE,CAAC;QACjB,MAAM,EAAE,iBAAiB;QACzB,UAAU,EAAE,CAAC;KACd,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACpB,MAAM,WAAW,GAAG,iBAAiB,CAAC;YACpC,oBAAoB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;YAC3C,gBAAgB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBACnC,OAAO,EAAE,OAAgB;gBACzB,UAAU,EAAE,OAAO;gBACnB,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;gBAC7B,GAAG;aACJ,CAAC,CAAC;SACJ,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;YAC/B,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,aAAa;YACpB,GAAG,EAAE,MAAM;YACX,MAAM,EAAE,EAAE,GAAG,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE;YAC7C,YAAY,EAAE,EAAE;SACjB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,WAAW,GAAG,iBAAiB,CAAC;YACpC,oBAAoB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;YACjD,gBAAgB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBACnC,OAAO,EAAE,OAAgB;gBACzB,UAAU,EAAE,OAAO;gBACnB,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,KAAK;gBAC9B,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;aACb,CAAC,CAAC;SACJ,CAAC,CAAC;QAEH,MAAM,MAAM,CACV,WAAW,CAAC;YACV,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,aAAa;YACpB,GAAG,EAAE,MAAM;YACX,MAAM,EAAE,EAAE,GAAG,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE;YAC7C,YAAY,EAAE,CAAC,aAAa,CAAC;SAC9B,CAAC,CACH,CAAC,OAAO,CAAC,cAAc,CAAC,uBAAuB,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,WAAW,GAAG,iBAAiB,CAAC;YACpC,oBAAoB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;YACjD,gBAAgB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBACnC,OAAO,EAAE,OAAgB;gBACzB,UAAU,EAAE,OAAO;gBACnB,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;gBAC7B,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;aACtC,CAAC,CAAC;YACH,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;YACtD,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,eAAe,CAAC;YAC9C,kBAAkB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;SACjD,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;YAC/B,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,aAAa;YACpB,GAAG,EAAE,MAAM;YACX,MAAM,EAAE,EAAE,GAAG,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;YAC/D,YAAY,EAAE,CAAC,aAAa,CAAC;SAC9B,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,WAAW,GAAG,iBAAiB,CAAC;YACpC,oBAAoB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;YACjD,gBAAgB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBACnC,OAAO,EAAE,OAAgB;gBACzB,UAAU,EAAE,OAAO;gBACnB,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;gBAC7B,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;aACtC,CAAC,CAAC;YACH,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;gBACzB,cAAc,EAAE,IAAI;gBACpB,OAAO,EAAE,eAAe;aACzB,CAAC,CAAC;YACH,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,gBAAgB,CAAC;YAC/C,kBAAkB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;SACjD,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;YAC/B,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,aAAa;YACpB,GAAG,EAAE,MAAM;YACX,MAAM,EAAE,EAAE,GAAG,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;YAC/D,YAAY,EAAE,CAAC,aAAa,CAAC;SAC9B,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=security-formal.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-formal.test.d.ts","sourceRoot":"","sources":["../../../../../src/verification/gates/formal/__tests__/security-formal.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,195 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import fs from 'fs-extra';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { createCheckFormal } from '../runner.js';
6
+ import { detectBypass } from '../anti-bypass.js';
7
+ import { resolveFormalTargets } from '../marker.js';
8
+ import { FORMAL_DEFAULTS } from '../../../config.js';
9
+ import { sanitizeEnv } from '../../../../exec/safe-spawn.js';
10
+ import { assertRelativeSafe } from '../../../../utils/path-safety.js';
11
+ const REPO_ROOT = path.join(path.dirname(fileURLToPath(import.meta.url)), '../../../../../../..');
12
+ const FORMAL_SRC = path.join(path.dirname(fileURLToPath(import.meta.url)), '..');
13
+ const FIXTURES_ROOT = path.join(path.dirname(fileURLToPath(import.meta.url)), '../../../../../fixtures/formal');
14
+ const LLM_NETWORK = /anthropic|openai|fetch\(|https?:\/\//i;
15
+ const SHELL_TRUE = /shell\s*:\s*true/;
16
+ const FORMAL_DEPS = /\b(dafny|z3|verus|lean|lake)\b/i;
17
+ async function collectTsFiles(dir) {
18
+ const entries = await fs.readdir(dir, { withFileTypes: true });
19
+ const out = [];
20
+ for (const ent of entries) {
21
+ const full = path.join(dir, ent.name);
22
+ if (ent.isDirectory() && ent.name !== '__tests__') {
23
+ out.push(...(await collectTsFiles(full)));
24
+ }
25
+ else if (ent.name.endsWith('.ts') && !ent.name.endsWith('.test.ts')) {
26
+ out.push(full);
27
+ }
28
+ }
29
+ return out;
30
+ }
31
+ describe('RS-02 anti-bypass', () => {
32
+ it('assume(false) ⇒ bypassDetected mesmo com solver exit 0', () => {
33
+ expect(detectBypass({ specSource: 'assume(false);', implSource: '' }).bypassDetected).toBe(true);
34
+ });
35
+ it('ensures true ⇒ bypassDetected', () => {
36
+ expect(detectBypass({ specSource: 'ensures true;', implSource: '' }).bypassDetected).toBe(true);
37
+ });
38
+ it('100% dos bypass fixtures rejeitados (O-06)', async () => {
39
+ const suite = (await fs.readJson(path.join(FIXTURES_ROOT, 'suite.json')));
40
+ for (const id of suite.fixtures) {
41
+ const dir = path.join(FIXTURES_ROOT, id);
42
+ const expected = (await fs.readJson(path.join(dir, 'expected.json')));
43
+ if (!expected.bypassExpected)
44
+ continue;
45
+ const spec = await fs.readFile(path.join(dir, 'spec.dfy'), 'utf8');
46
+ const impl = await fs.readFile(path.join(dir, 'impl.ts'), 'utf8');
47
+ expect(detectBypass({ specSource: spec, implSource: impl }).bypassDetected).toBe(true);
48
+ }
49
+ });
50
+ it('spec honesta não bloqueada', async () => {
51
+ const spec = await fs.readFile(path.join(FIXTURES_ROOT, 'fix-001-add-honest/spec.dfy'), 'utf8');
52
+ const impl = await fs.readFile(path.join(FIXTURES_ROOT, 'fix-001-add-honest/impl.ts'), 'utf8');
53
+ expect(detectBypass({ specSource: spec, implSource: impl }).bypassDetected).toBe(false);
54
+ });
55
+ it('verified=false quando solver passou mas bypassDetected=true', async () => {
56
+ const checkFormal = createCheckFormal({
57
+ resolveFormalTargets: async () => [
58
+ { file: 'src/a.ts', symbol: 'f', source: 'config' },
59
+ ],
60
+ backendForConfig: async () => ({
61
+ backend: 'dafny',
62
+ minVersion: '4.0.0',
63
+ isAvailable: async () => true,
64
+ run: async () => ({
65
+ backend: 'dafny',
66
+ verified: true,
67
+ stage: 'none',
68
+ bypassDetected: false,
69
+ repairIterations: 0,
70
+ solverExitCode: 0,
71
+ reason: 'solver ok',
72
+ durationMs: 1,
73
+ }),
74
+ }),
75
+ detectBypass: () => ({ bypassDetected: true, pattern: 'assume(false)' }),
76
+ readSource: async () => 'assume(false);',
77
+ persistFormalProof: async () => undefined,
78
+ });
79
+ const result = await checkFormal({
80
+ taskId: 't',
81
+ stack: 'node',
82
+ cwd: process.cwd(),
83
+ config: { ...FORMAL_DEFAULTS, enabled: true, antiBypass: true },
84
+ changedFiles: [],
85
+ });
86
+ expect(result.verdict).toBe('FAIL');
87
+ });
88
+ });
89
+ describe('RS-01 specs não-computáveis + paths', () => {
90
+ it('documenta recomendação Prop/quantificadores em anti-bypass.ts', async () => {
91
+ const src = await fs.readFile(path.join(FORMAL_SRC, 'anti-bypass.ts'), 'utf8');
92
+ expect(src).toMatch(/Prop/);
93
+ expect(src).toMatch(/quantificadores/);
94
+ });
95
+ it('assertRelativeSafe reprova ../escape', () => {
96
+ expect(() => assertRelativeSafe('../etc/passwd')).toThrow(/\.\./);
97
+ });
98
+ it('assertRelativeSafe reprova path absoluto', () => {
99
+ expect(() => assertRelativeSafe('/etc/passwd')).toThrow(/absolute/);
100
+ expect(() => assertRelativeSafe('C:\\Windows\\System32')).toThrow(/absolute/);
101
+ });
102
+ it('resolveFormalTargets reprova modules com path escape', async () => {
103
+ await expect(resolveFormalTargets({
104
+ cwd: process.cwd(),
105
+ changedFiles: [],
106
+ config: { ...FORMAL_DEFAULTS, modules: ['../x.ts::f'] },
107
+ })).rejects.toThrow(/\.\./);
108
+ });
109
+ });
110
+ describe('RS-06 veredito não-falsificável', () => {
111
+ it('checkFormal PASS só após backend.run', async () => {
112
+ let ran = false;
113
+ const checkFormal = createCheckFormal({
114
+ resolveFormalTargets: async () => [
115
+ { file: 'src/a.ts', symbol: 'f', source: 'config' },
116
+ ],
117
+ backendForConfig: async () => ({
118
+ backend: 'dafny',
119
+ minVersion: '4.0.0',
120
+ isAvailable: async () => true,
121
+ run: async () => {
122
+ ran = true;
123
+ return {
124
+ backend: 'dafny',
125
+ verified: true,
126
+ stage: 'none',
127
+ bypassDetected: false,
128
+ repairIterations: 0,
129
+ solverExitCode: 0,
130
+ reason: 'ok',
131
+ durationMs: 1,
132
+ };
133
+ },
134
+ }),
135
+ detectBypass: () => ({ bypassDetected: false }),
136
+ readSource: async () => 'ok',
137
+ persistFormalProof: async () => undefined,
138
+ });
139
+ const result = await checkFormal({
140
+ taskId: 't',
141
+ stack: 'node',
142
+ cwd: process.cwd(),
143
+ config: { ...FORMAL_DEFAULTS, enabled: true },
144
+ changedFiles: [],
145
+ });
146
+ expect(ran).toBe(true);
147
+ expect(result.verdict).toBe('PASS');
148
+ });
149
+ it('zero LLM/rede em gates/formal production sources', async () => {
150
+ const files = await collectTsFiles(FORMAL_SRC);
151
+ for (const file of files) {
152
+ const content = await fs.readFile(file, 'utf8');
153
+ expect(content).not.toMatch(LLM_NETWORK);
154
+ }
155
+ });
156
+ it('zero shell:true em gates/formal production sources', async () => {
157
+ const files = await collectTsFiles(FORMAL_SRC);
158
+ for (const file of files) {
159
+ const content = await fs.readFile(file, 'utf8');
160
+ expect(content).not.toMatch(SHELL_TRUE);
161
+ }
162
+ });
163
+ });
164
+ describe('RS-03 sem segredos', () => {
165
+ it('sanitizeEnv remove SECRET/TOKEN/AWS_* do env filho', () => {
166
+ const env = sanitizeEnv({
167
+ PATH: '/bin',
168
+ SECRET: 'super-secret-value',
169
+ AWS_ACCESS_KEY_ID: 'AKIA123',
170
+ TOKEN: 'tok-xyz',
171
+ HOME: '/home/user',
172
+ });
173
+ expect(env.SECRET).toBeUndefined();
174
+ expect(env.AWS_ACCESS_KEY_ID).toBeUndefined();
175
+ expect(env.TOKEN).toBeUndefined();
176
+ expect(env.PATH).toBe('/bin');
177
+ expect(env.HOME).toBe('/home/user');
178
+ });
179
+ });
180
+ describe('RS-05 sem dep formal', () => {
181
+ it('package.json raiz e CLI não listam toolchain formal como dep', async () => {
182
+ for (const rel of ['package.json', 'packages/cli/package.json']) {
183
+ const pkg = (await fs.readJson(path.join(REPO_ROOT, rel)));
184
+ const names = [
185
+ ...Object.keys(pkg.dependencies ?? {}),
186
+ ...Object.keys(pkg.devDependencies ?? {}),
187
+ ...Object.keys(pkg.optionalDependencies ?? {}),
188
+ ];
189
+ for (const name of names) {
190
+ expect(name).not.toMatch(FORMAL_DEPS);
191
+ }
192
+ }
193
+ });
194
+ });
195
+ //# sourceMappingURL=security-formal.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-formal.test.js","sourceRoot":"","sources":["../../../../../src/verification/gates/formal/__tests__/security-formal.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=telemetry-formal.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry-formal.test.d.ts","sourceRoot":"","sources":["../../../../../src/verification/gates/formal/__tests__/telemetry-formal.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { JsonGraph } from '../../../../graphrag/json-graph.js';
3
+ import { recordFormalProof } from '../../../telemetry.js';
4
+ const verdict = {
5
+ backend: 'dafny',
6
+ verified: true,
7
+ stage: 'none',
8
+ bypassDetected: false,
9
+ repairIterations: 0,
10
+ solverExitCode: 0,
11
+ reason: 'dafny: verified',
12
+ durationMs: 12,
13
+ };
14
+ describe('recordFormalProof', () => {
15
+ it('creates formal-gate node and proven_by edge', async () => {
16
+ const graph = new JsonGraph(':memory:');
17
+ await graph.init();
18
+ recordFormalProof(graph, 'task-509', verdict);
19
+ expect(graph.getNode('formal-gate:task-509')).toBeTruthy();
20
+ const stats = graph.getStatistics();
21
+ expect(stats.nodesByType['formal-gate']).toBe(1);
22
+ expect(stats.edgesByType.proven_by).toBe(1);
23
+ expect(Number.isNaN(stats.nodesByType['formal-gate'])).toBe(false);
24
+ graph.close();
25
+ });
26
+ });
27
+ //# sourceMappingURL=telemetry-formal.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry-formal.test.js","sourceRoot":"","sources":["../../../../../src/verification/gates/formal/__tests__/telemetry-formal.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG1D,MAAM,OAAO,GAAkB;IAC7B,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,IAAI;IACd,KAAK,EAAE,MAAM;IACb,cAAc,EAAE,KAAK;IACrB,gBAAgB,EAAE,CAAC;IACnB,cAAc,EAAE,CAAC;IACjB,MAAM,EAAE,iBAAiB;IACzB,UAAU,EAAE,EAAE;CACf,CAAC;AAEF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnE,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=verified-rate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verified-rate.test.d.ts","sourceRoot":"","sources":["../../../../../src/verification/gates/formal/__tests__/verified-rate.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,52 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import fs from 'fs-extra';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { detectBypass } from '../anti-bypass.js';
6
+ import { dafnyBackend } from '../dafny.js';
7
+ const FIXTURES_ROOT = path.join(path.dirname(fileURLToPath(import.meta.url)), '../../../../../fixtures/formal');
8
+ describe('formal verified-rate harness', () => {
9
+ it('rejects 100% of bypass fixtures (O-06)', async () => {
10
+ const suite = (await fs.readJson(path.join(FIXTURES_ROOT, 'suite.json')));
11
+ let bypassCount = 0;
12
+ let rejected = 0;
13
+ for (const id of suite.fixtures) {
14
+ const dir = path.join(FIXTURES_ROOT, id);
15
+ const expected = (await fs.readJson(path.join(dir, 'expected.json')));
16
+ if (!expected.bypassExpected)
17
+ continue;
18
+ bypassCount += 1;
19
+ const spec = await fs.readFile(path.join(dir, 'spec.dfy'), 'utf8');
20
+ const impl = await fs.readFile(path.join(dir, 'impl.ts'), 'utf8');
21
+ const bypass = detectBypass({ specSource: spec, implSource: impl });
22
+ if (bypass.bypassDetected)
23
+ rejected += 1;
24
+ }
25
+ expect(bypassCount).toBeGreaterThanOrEqual(2);
26
+ expect(rejected).toBe(bypassCount);
27
+ });
28
+ it('honest fixtures pass anti-bypass', async () => {
29
+ const suite = (await fs.readJson(path.join(FIXTURES_ROOT, 'suite.json')));
30
+ let honest = 0;
31
+ let clean = 0;
32
+ for (const id of suite.fixtures) {
33
+ const dir = path.join(FIXTURES_ROOT, id);
34
+ const expected = (await fs.readJson(path.join(dir, 'expected.json')));
35
+ if (expected.bypassExpected)
36
+ continue;
37
+ honest += 1;
38
+ const spec = await fs.readFile(path.join(dir, 'spec.dfy'), 'utf8');
39
+ const impl = await fs.readFile(path.join(dir, 'impl.ts'), 'utf8');
40
+ if (!detectBypass({ specSource: spec, implSource: impl }).bypassDetected) {
41
+ clean += 1;
42
+ }
43
+ }
44
+ expect(honest).toBeGreaterThanOrEqual(3);
45
+ expect(clean / honest).toBeGreaterThanOrEqual(suite.verifiedRateTarget);
46
+ });
47
+ it('dafny isAvailable skips gracefully when absent', async () => {
48
+ const available = await dafnyBackend.isAvailable(process.cwd());
49
+ expect(typeof available).toBe('boolean');
50
+ });
51
+ });
52
+ //# sourceMappingURL=verified-rate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verified-rate.test.js","sourceRoot":"","sources":["../../../../../src/verification/gates/formal/__tests__/verified-rate.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /** Collects non-trivial ensures/requires clause bodies from a Dafny spec. */
2
+ export declare function extractClauses(spec: string): string[];
3
+ /**
4
+ * Detecta padrões de trapaça (Vericoding §detecção-de-trapaça) na spec + impl.
5
+ * Determinístico (regex + AST-lite). REPROVA mesmo que o solver tenha aceitado (exit 0).
6
+ *
7
+ * RECOMENDAÇÃO ANTI-TRAPAÇA (CLEVER, RS-01): preferir specs NÃO-COMPUTÁVEIS
8
+ * (Prop / quantificadores ∀∃) — a checagem dura de não-computabilidade fica na
9
+ * auditoria (task-510). Aqui detectamos os padrões triviais/vazados conhecidos.
10
+ */
11
+ export declare function detectBypass(args: {
12
+ readonly specSource: string;
13
+ readonly implSource: string;
14
+ }): {
15
+ readonly bypassDetected: boolean;
16
+ readonly pattern?: string;
17
+ };
18
+ /** Stable CLI error string (BLUEPRINT §5.2). */
19
+ export declare function formatBypassRejection(target: string, pattern: string): string;
20
+ //# sourceMappingURL=anti-bypass.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anti-bypass.d.ts","sourceRoot":"","sources":["../../../../src/verification/gates/formal/anti-bypass.ts"],"names":[],"mappings":"AAaA,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAOrD;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,GAAG;IAAE,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAyBlE;AAED,gDAAgD;AAChD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE7E"}
@@ -0,0 +1,53 @@
1
+ const ASSUME_FALSE = /\bassume\s*\(?\s*false\s*\)?/;
2
+ const ENSURES_TRUE = /\bensures\s+true\b/;
3
+ const REQUIRES_TRUE = /\brequires\s+true\b/;
4
+ const CLAUSE_EXPR = /\b(?:ensures|requires)\s+([^;]+);/g;
5
+ const MIN_LEAK_EXPR_LEN = 8;
6
+ function normalizeWhitespace(s) {
7
+ return s.replace(/\s+/g, ' ').trim();
8
+ }
9
+ /** Collects non-trivial ensures/requires clause bodies from a Dafny spec. */
10
+ export function extractClauses(spec) {
11
+ const out = [];
12
+ for (const match of spec.matchAll(CLAUSE_EXPR)) {
13
+ const expr = normalizeWhitespace(match[1] ?? '');
14
+ if (expr && expr !== 'true')
15
+ out.push(expr);
16
+ }
17
+ return out;
18
+ }
19
+ /**
20
+ * Detecta padrões de trapaça (Vericoding §detecção-de-trapaça) na spec + impl.
21
+ * Determinístico (regex + AST-lite). REPROVA mesmo que o solver tenha aceitado (exit 0).
22
+ *
23
+ * RECOMENDAÇÃO ANTI-TRAPAÇA (CLEVER, RS-01): preferir specs NÃO-COMPUTÁVEIS
24
+ * (Prop / quantificadores ∀∃) — a checagem dura de não-computabilidade fica na
25
+ * auditoria (task-510). Aqui detectamos os padrões triviais/vazados conhecidos.
26
+ */
27
+ export function detectBypass(args) {
28
+ const { specSource, implSource } = args;
29
+ if (ASSUME_FALSE.test(specSource) || ASSUME_FALSE.test(implSource)) {
30
+ return { bypassDetected: true, pattern: 'assume(false)' };
31
+ }
32
+ if (ENSURES_TRUE.test(specSource)) {
33
+ return { bypassDetected: true, pattern: 'ensures true' };
34
+ }
35
+ if (REQUIRES_TRUE.test(specSource)) {
36
+ return { bypassDetected: true, pattern: 'ensures true' };
37
+ }
38
+ const implNorm = normalizeWhitespace(implSource);
39
+ for (const clause of extractClauses(specSource)) {
40
+ const norm = normalizeWhitespace(clause);
41
+ if (norm.replace(/\s/g, '').length < MIN_LEAK_EXPR_LEN)
42
+ continue;
43
+ if (implNorm.includes(norm)) {
44
+ return { bypassDetected: true, pattern: 'spec leaked into impl' };
45
+ }
46
+ }
47
+ return { bypassDetected: false };
48
+ }
49
+ /** Stable CLI error string (BLUEPRINT §5.2). */
50
+ export function formatBypassRejection(target, pattern) {
51
+ return `Error: formal proof rejected — bypass pattern '${pattern}' detected in spec/impl for '${target}'.`;
52
+ }
53
+ //# sourceMappingURL=anti-bypass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anti-bypass.js","sourceRoot":"","sources":["../../../../src/verification/gates/formal/anti-bypass.ts"],"names":[],"mappings":"AAAA,MAAM,YAAY,GAAG,8BAA8B,CAAC;AACpD,MAAM,YAAY,GAAG,oBAAoB,CAAC;AAC1C,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAE5C,MAAM,WAAW,GACf,oCAAoC,CAAC;AAEvC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAE5B,SAAS,mBAAmB,CAAC,CAAS;IACpC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACvC,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACjD,IAAI,IAAI,IAAI,IAAI,KAAK,MAAM;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,IAG5B;IACC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAExC,IAAI,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACnE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;IAC5D,CAAC;IAED,IAAI,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAClC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;IAC3D,CAAC;IAED,IAAI,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;IAC3D,CAAC;IAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACjD,KAAK,MAAM,MAAM,IAAI,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,iBAAiB;YAAE,SAAS;QACjE,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC;QACpE,CAAC;IACH,CAAC;IAED,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;AACnC,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,qBAAqB,CAAC,MAAc,EAAE,OAAe;IACnE,OAAO,kDAAkD,OAAO,gCAAgC,MAAM,IAAI,CAAC;AAC7G,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { FormalBackend as FormalBackendId, FormalVerdict, CriticalModuleMarker } from '../../types.js';
2
+ export interface FormalRunInput {
3
+ readonly cwd: string;
4
+ readonly target: CriticalModuleMarker;
5
+ readonly specPath: string;
6
+ readonly implPath: string;
7
+ readonly proofTimeoutSeconds: number;
8
+ }
9
+ /**
10
+ * Contrato de cada backend formal. Implementações: dafny (default) / verus / lean.
11
+ *
12
+ * - isAvailable(cwd): checa o binário no PATH SEM rodar prova (degradação graciosa, A-5).
13
+ * - run(input): executa o verificador via safeSpawn (argv, shell:false), parseia o
14
+ * relatório/exit-code NATIVO e normaliza para FormalVerdict. NUNCA chama LLM (RS-06).
15
+ */
16
+ export interface FormalBackend {
17
+ readonly backend: FormalBackendId;
18
+ readonly minVersion: string;
19
+ isAvailable(cwd: string): Promise<boolean>;
20
+ run(input: FormalRunInput): Promise<FormalVerdict>;
21
+ }
22
+ /** Toolchain ausente em alvo MARCADO — vira exit 5 no comando (task-508). */
23
+ export declare class FormalToolNotFoundError extends Error {
24
+ readonly backend: string;
25
+ readonly target: string;
26
+ constructor(backend: string, target?: string);
27
+ }
28
+ /** Falha de CONFIG do solver (≠ prova rejeitada). Carrega stderr cru do verificador. */
29
+ export declare class FormalBackendError extends Error {
30
+ readonly stderr: string;
31
+ constructor(message: string, stderr: string);
32
+ }
33
+ /** Backend não suportado na config (string exata em registry.ts). */
34
+ export declare class UnknownFormalBackendError extends Error {
35
+ readonly backend: string;
36
+ constructor(backend: string);
37
+ }
38
+ //# sourceMappingURL=backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../../../src/verification/gates/formal/backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,IAAI,eAAe,EAChC,aAAa,EACb,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;CACtC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,GAAG,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACpD;AAED,6EAA6E;AAC7E,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,OAAO,EAAE,MAAM,EAAE,MAAM,SAAY;CAMhD;AAED,wFAAwF;AACxF,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAK5C;AAED,qEAAqE;AACrE,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEb,OAAO,EAAE,MAAM;CAO5B"}
@@ -0,0 +1,26 @@
1
+ /** Toolchain ausente em alvo MARCADO — vira exit 5 no comando (task-508). */
2
+ export class FormalToolNotFoundError extends Error {
3
+ constructor(backend, target = 'unknown') {
4
+ super(`Formal tool not available: ${backend}`);
5
+ this.name = 'FormalToolNotFoundError';
6
+ this.backend = backend;
7
+ this.target = target;
8
+ }
9
+ }
10
+ /** Falha de CONFIG do solver (≠ prova rejeitada). Carrega stderr cru do verificador. */
11
+ export class FormalBackendError extends Error {
12
+ constructor(message, stderr) {
13
+ super(message);
14
+ this.name = 'FormalBackendError';
15
+ this.stderr = stderr;
16
+ }
17
+ }
18
+ /** Backend não suportado na config (string exata em registry.ts). */
19
+ export class UnknownFormalBackendError extends Error {
20
+ constructor(backend) {
21
+ super(`Error: unknown formal backend '${backend}'. Supported: dafny, verus, lean.`);
22
+ this.name = 'UnknownFormalBackendError';
23
+ this.backend = backend;
24
+ }
25
+ }
26
+ //# sourceMappingURL=backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.js","sourceRoot":"","sources":["../../../../src/verification/gates/formal/backend.ts"],"names":[],"mappings":"AA4BA,6EAA6E;AAC7E,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAIhD,YAAY,OAAe,EAAE,MAAM,GAAG,SAAS;QAC7C,KAAK,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;QACtC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,wFAAwF;AACxF,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAG3C,YAAY,OAAe,EAAE,MAAc;QACzC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,qEAAqE;AACrE,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAGlD,YAAY,OAAe;QACzB,KAAK,CACH,kCAAkC,OAAO,mCAAmC,CAC7E,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;QACxC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF"}