@zelari/core 0.7.12 → 1.0.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 (157) hide show
  1. package/dist/agents/councilApi.d.ts +142 -0
  2. package/dist/agents/councilApi.d.ts.map +1 -1
  3. package/dist/agents/councilApi.js +523 -8
  4. package/dist/agents/councilApi.js.map +1 -1
  5. package/dist/agents/roles.d.ts.map +1 -1
  6. package/dist/agents/roles.js +11 -3
  7. package/dist/agents/roles.js.map +1 -1
  8. package/dist/agents/toolSchemas.d.ts.map +1 -1
  9. package/dist/agents/toolSchemas.js +32 -3
  10. package/dist/agents/toolSchemas.js.map +1 -1
  11. package/dist/core/AgentHarness.d.ts +21 -0
  12. package/dist/core/AgentHarness.d.ts.map +1 -1
  13. package/dist/core/AgentHarness.js +153 -0
  14. package/dist/core/AgentHarness.js.map +1 -1
  15. package/dist/core/tools/builtin/filesystem.d.ts.map +1 -1
  16. package/dist/core/tools/builtin/filesystem.js +4 -2
  17. package/dist/core/tools/builtin/filesystem.js.map +1 -1
  18. package/dist/council/completion/buildCompletion.d.ts +23 -0
  19. package/dist/council/completion/buildCompletion.d.ts.map +1 -0
  20. package/dist/council/completion/buildCompletion.js +75 -0
  21. package/dist/council/completion/buildCompletion.js.map +1 -0
  22. package/dist/council/completion/index.d.ts +3 -0
  23. package/dist/council/completion/index.d.ts.map +1 -0
  24. package/dist/council/completion/index.js +3 -0
  25. package/dist/council/completion/index.js.map +1 -0
  26. package/dist/council/completion/types.d.ts +38 -0
  27. package/dist/council/completion/types.d.ts.map +1 -0
  28. package/dist/council/completion/types.js +2 -0
  29. package/dist/council/completion/types.js.map +1 -0
  30. package/dist/council/index.d.ts +6 -0
  31. package/dist/council/index.d.ts.map +1 -1
  32. package/dist/council/index.js +6 -0
  33. package/dist/council/index.js.map +1 -1
  34. package/dist/council/lessons/index.d.ts +7 -0
  35. package/dist/council/lessons/index.d.ts.map +1 -0
  36. package/dist/council/lessons/index.js +7 -0
  37. package/dist/council/lessons/index.js.map +1 -0
  38. package/dist/council/lessons/io.d.ts +5 -0
  39. package/dist/council/lessons/io.d.ts.map +1 -0
  40. package/dist/council/lessons/io.js +30 -0
  41. package/dist/council/lessons/io.js.map +1 -0
  42. package/dist/council/lessons/isAnswerLeak.d.ts +7 -0
  43. package/dist/council/lessons/isAnswerLeak.d.ts.map +1 -0
  44. package/dist/council/lessons/isAnswerLeak.js +26 -0
  45. package/dist/council/lessons/isAnswerLeak.js.map +1 -0
  46. package/dist/council/lessons/recallLessons.d.ts +8 -0
  47. package/dist/council/lessons/recallLessons.d.ts.map +1 -0
  48. package/dist/council/lessons/recallLessons.js +56 -0
  49. package/dist/council/lessons/recallLessons.js.map +1 -0
  50. package/dist/council/lessons/recordFailure.d.ts +7 -0
  51. package/dist/council/lessons/recordFailure.d.ts.map +1 -0
  52. package/dist/council/lessons/recordFailure.js +86 -0
  53. package/dist/council/lessons/recordFailure.js.map +1 -0
  54. package/dist/council/lessons/signatures.d.ts +6 -0
  55. package/dist/council/lessons/signatures.d.ts.map +1 -0
  56. package/dist/council/lessons/signatures.js +31 -0
  57. package/dist/council/lessons/signatures.js.map +1 -0
  58. package/dist/council/lessons/types.d.ts +27 -0
  59. package/dist/council/lessons/types.d.ts.map +1 -0
  60. package/dist/council/lessons/types.js +2 -0
  61. package/dist/council/lessons/types.js.map +1 -0
  62. package/dist/council/mission.d.ts +23 -0
  63. package/dist/council/mission.d.ts.map +1 -0
  64. package/dist/council/mission.js +32 -0
  65. package/dist/council/mission.js.map +1 -0
  66. package/dist/council/missionBrief.d.ts +49 -0
  67. package/dist/council/missionBrief.d.ts.map +1 -0
  68. package/dist/council/missionBrief.js +115 -0
  69. package/dist/council/missionBrief.js.map +1 -0
  70. package/dist/council/modeBanners.d.ts +24 -1
  71. package/dist/council/modeBanners.d.ts.map +1 -1
  72. package/dist/council/modeBanners.js +31 -4
  73. package/dist/council/modeBanners.js.map +1 -1
  74. package/dist/council/runMode.d.ts.map +1 -1
  75. package/dist/council/runMode.js +6 -3
  76. package/dist/council/runMode.js.map +1 -1
  77. package/dist/council/scope/extractTaskScope.d.ts +35 -0
  78. package/dist/council/scope/extractTaskScope.d.ts.map +1 -0
  79. package/dist/council/scope/extractTaskScope.js +174 -0
  80. package/dist/council/scope/extractTaskScope.js.map +1 -0
  81. package/dist/council/scope/index.d.ts +3 -0
  82. package/dist/council/scope/index.d.ts.map +1 -0
  83. package/dist/council/scope/index.js +3 -0
  84. package/dist/council/scope/index.js.map +1 -0
  85. package/dist/council/scope/nfrSpecWarn.d.ts +6 -0
  86. package/dist/council/scope/nfrSpecWarn.d.ts.map +1 -0
  87. package/dist/council/scope/nfrSpecWarn.js +21 -0
  88. package/dist/council/scope/nfrSpecWarn.js.map +1 -0
  89. package/dist/council/verification/autofix.d.ts +12 -0
  90. package/dist/council/verification/autofix.d.ts.map +1 -0
  91. package/dist/council/verification/autofix.js +41 -0
  92. package/dist/council/verification/autofix.js.map +1 -0
  93. package/dist/council/verification/citeVerify.d.ts +13 -0
  94. package/dist/council/verification/citeVerify.d.ts.map +1 -0
  95. package/dist/council/verification/citeVerify.js +73 -0
  96. package/dist/council/verification/citeVerify.js.map +1 -0
  97. package/dist/council/verification/completion.d.ts +19 -0
  98. package/dist/council/verification/completion.d.ts.map +1 -0
  99. package/dist/council/verification/completion.js +50 -0
  100. package/dist/council/verification/completion.js.map +1 -0
  101. package/dist/council/verification/degraded.d.ts +26 -0
  102. package/dist/council/verification/degraded.d.ts.map +1 -0
  103. package/dist/council/verification/degraded.js +35 -0
  104. package/dist/council/verification/degraded.js.map +1 -0
  105. package/dist/council/verification/honesty.d.ts +6 -0
  106. package/dist/council/verification/honesty.d.ts.map +1 -0
  107. package/dist/council/verification/honesty.js +28 -0
  108. package/dist/council/verification/honesty.js.map +1 -0
  109. package/dist/council/verification/implementationDelivery.d.ts +26 -0
  110. package/dist/council/verification/implementationDelivery.d.ts.map +1 -0
  111. package/dist/council/verification/implementationDelivery.js +70 -0
  112. package/dist/council/verification/implementationDelivery.js.map +1 -0
  113. package/dist/council/verification/index.d.ts +15 -0
  114. package/dist/council/verification/index.d.ts.map +1 -0
  115. package/dist/council/verification/index.js +15 -0
  116. package/dist/council/verification/index.js.map +1 -0
  117. package/dist/council/verification/inlineJsAutofix.d.ts +8 -0
  118. package/dist/council/verification/inlineJsAutofix.d.ts.map +1 -0
  119. package/dist/council/verification/inlineJsAutofix.js +85 -0
  120. package/dist/council/verification/inlineJsAutofix.js.map +1 -0
  121. package/dist/council/verification/microGate.d.ts +18 -0
  122. package/dist/council/verification/microGate.d.ts.map +1 -0
  123. package/dist/council/verification/microGate.js +81 -0
  124. package/dist/council/verification/microGate.js.map +1 -0
  125. package/dist/council/verification/motionAutofix.d.ts +8 -0
  126. package/dist/council/verification/motionAutofix.d.ts.map +1 -0
  127. package/dist/council/verification/motionAutofix.js +160 -0
  128. package/dist/council/verification/motionAutofix.js.map +1 -0
  129. package/dist/council/verification/parseCssMotion.d.ts +22 -0
  130. package/dist/council/verification/parseCssMotion.d.ts.map +1 -0
  131. package/dist/council/verification/parseCssMotion.js +142 -0
  132. package/dist/council/verification/parseCssMotion.js.map +1 -0
  133. package/dist/council/verification/runChecks.d.ts +10 -0
  134. package/dist/council/verification/runChecks.d.ts.map +1 -0
  135. package/dist/council/verification/runChecks.js +254 -0
  136. package/dist/council/verification/runChecks.js.map +1 -0
  137. package/dist/council/verification/synthesisAudit.d.ts +14 -0
  138. package/dist/council/verification/synthesisAudit.d.ts.map +1 -0
  139. package/dist/council/verification/synthesisAudit.js +106 -0
  140. package/dist/council/verification/synthesisAudit.js.map +1 -0
  141. package/dist/council/verification/tiers.d.ts +8 -0
  142. package/dist/council/verification/tiers.d.ts.map +1 -0
  143. package/dist/council/verification/tiers.js +46 -0
  144. package/dist/council/verification/tiers.js.map +1 -0
  145. package/dist/council/verification/types.d.ts +53 -0
  146. package/dist/council/verification/types.d.ts.map +1 -0
  147. package/dist/council/verification/types.js +5 -0
  148. package/dist/council/verification/types.js.map +1 -0
  149. package/dist/index.d.ts +1 -0
  150. package/dist/index.d.ts.map +1 -1
  151. package/dist/index.js +2 -0
  152. package/dist/index.js.map +1 -1
  153. package/dist/memory/types.d.ts +63 -0
  154. package/dist/memory/types.d.ts.map +1 -0
  155. package/dist/memory/types.js +13 -0
  156. package/dist/memory/types.js.map +1 -0
  157. package/package.json +5 -1
@@ -0,0 +1,174 @@
1
+ /** Keywords that indicate measurable NFR constraints (motion, perf, budget). */
2
+ export const NFR_KEYWORDS = [
3
+ 'motion',
4
+ 'animation',
5
+ 'animate',
6
+ 'keyframes',
7
+ 'transition',
8
+ 'compositor',
9
+ 'reduced-motion',
10
+ 'prefers-reduced-motion',
11
+ 'byte budget',
12
+ 'bytes',
13
+ 'performance',
14
+ 'perf budget',
15
+ 'nfr',
16
+ 'layout thrash',
17
+ 'box-shadow',
18
+ 'inline js',
19
+ 'inline-js',
20
+ ];
21
+ const FILE_PATH_RE = /\b((?:[\w.-]+\/)*[\w.-]+\.(?:html|css|js|ts|tsx|jsx|json|md|mjs|cjs))\b/gi;
22
+ const ANIMATE_KEYWORDS = [
23
+ 'animate',
24
+ 'animation',
25
+ 'motion',
26
+ 'transition',
27
+ 'keyframes',
28
+ 'fade',
29
+ 'slide',
30
+ ];
31
+ const BACKLOG_FEATURE_HINTS = [
32
+ 'command palette',
33
+ 'print stylesheet',
34
+ 'dark mode',
35
+ 'i18n',
36
+ 'localization',
37
+ 'auth',
38
+ 'login',
39
+ 'database',
40
+ 'api server',
41
+ ];
42
+ const EXPLICIT_OUT_RE = /\b(?:not|don't|do not|skip|defer(?:red)?|later|backlog|out of scope|exclude|without|no need for)\b[^.\n]{0,60}/gi;
43
+ const VERSION_DEFER_RE = /\bv\d+\.\d+(?:\.\d+)?\b/gi;
44
+ function normalizePath(p) {
45
+ return p.replace(/\\/g, '/').replace(/^\.\//, '');
46
+ }
47
+ function uniqueLower(items) {
48
+ const seen = new Set();
49
+ const out = [];
50
+ for (const item of items) {
51
+ const key = item.toLowerCase();
52
+ if (seen.has(key))
53
+ continue;
54
+ seen.add(key);
55
+ out.push(item);
56
+ }
57
+ return out;
58
+ }
59
+ function extractFilePaths(text) {
60
+ const found = [];
61
+ for (const match of text.matchAll(FILE_PATH_RE)) {
62
+ const raw = match[1];
63
+ if (!raw)
64
+ continue;
65
+ const norm = normalizePath(raw);
66
+ if (norm.includes('node_modules'))
67
+ continue;
68
+ found.push(norm);
69
+ }
70
+ return uniqueLower(found);
71
+ }
72
+ function extractKeywords(text) {
73
+ const lower = text.toLowerCase();
74
+ const hits = [];
75
+ for (const kw of [...ANIMATE_KEYWORDS, ...NFR_KEYWORDS]) {
76
+ if (lower.includes(kw))
77
+ hits.push(kw);
78
+ }
79
+ return uniqueLower(hits);
80
+ }
81
+ function extractExplicitOut(userMessage, planText) {
82
+ const combined = `${userMessage}\n${planText ?? ''}`;
83
+ const out = [];
84
+ for (const match of combined.matchAll(EXPLICIT_OUT_RE)) {
85
+ const phrase = match[0]?.trim();
86
+ if (phrase && phrase.length > 8)
87
+ out.push(phrase);
88
+ }
89
+ for (const hint of BACKLOG_FEATURE_HINTS) {
90
+ if (combined.toLowerCase().includes(hint)) {
91
+ const inScope = userMessage.toLowerCase().includes(hint) &&
92
+ !/\b(?:not|don't|do not|skip|later|backlog|without)\b[^.\n]{0,30}/i.test(userMessage);
93
+ if (!inScope)
94
+ out.push(hint);
95
+ }
96
+ }
97
+ for (const match of combined.matchAll(VERSION_DEFER_RE)) {
98
+ const ver = match[0];
99
+ if (ver && /later|backlog|defer|not yet|planned/i.test(combined)) {
100
+ out.push(`${ver} (deferred)`);
101
+ }
102
+ }
103
+ return uniqueLower(out);
104
+ }
105
+ /** True when the task text mentions measurable NFR themes. */
106
+ export function taskMatchesNfrKeywords(userMessage, planText) {
107
+ const lower = `${userMessage}\n${planText ?? ''}`.toLowerCase();
108
+ return NFR_KEYWORDS.some((kw) => lower.includes(kw));
109
+ }
110
+ /**
111
+ * Deterministic task scope from user message + optional nfr-spec.
112
+ * No NLP — keyword overlap, file-path regex, and nfr-spec targets only.
113
+ */
114
+ export function extractTaskScope(input) {
115
+ const sources = [];
116
+ const targets = [];
117
+ const keywords = extractKeywords(input.userMessage);
118
+ if (input.userMessage.trim())
119
+ sources.push('userMessage');
120
+ for (const p of extractFilePaths(input.userMessage)) {
121
+ targets.push(p);
122
+ }
123
+ if (input.nfrSpec?.targets?.length) {
124
+ sources.push('nfr-spec');
125
+ for (const t of input.nfrSpec.targets) {
126
+ targets.push(normalizePath(t));
127
+ }
128
+ if (input.nfrSpec.animation?.compositorOnly) {
129
+ keywords.push('compositor-only');
130
+ }
131
+ if (input.nfrSpec.inlineJs?.maxBytes) {
132
+ keywords.push(`inline-js<=${input.nfrSpec.inlineJs.maxBytes}b`);
133
+ }
134
+ }
135
+ const explicitOut = extractExplicitOut(input.userMessage, input.planText);
136
+ const nfrRelevant = taskMatchesNfrKeywords(input.userMessage, input.planText);
137
+ return {
138
+ targets: uniqueLower(targets),
139
+ keywords: uniqueLower(keywords),
140
+ explicitOut,
141
+ nfrRelevant,
142
+ sources: [...new Set(sources)],
143
+ };
144
+ }
145
+ /** Classify a plan task relative to extracted scope. */
146
+ export function classifyTaskScope(task, scope) {
147
+ const blob = `${task.name ?? ''} ${task.description ?? ''} ${task.id ?? ''}`.toLowerCase();
148
+ for (const out of scope.explicitOut) {
149
+ const needle = out.toLowerCase().replace(/\s*\(deferred\)$/i, '');
150
+ if (needle.length >= 4 && blob.includes(needle))
151
+ return 'backlog';
152
+ }
153
+ for (const hint of BACKLOG_FEATURE_HINTS) {
154
+ if (blob.includes(hint) &&
155
+ scope.explicitOut.some((o) => o.toLowerCase().includes(hint))) {
156
+ return 'backlog';
157
+ }
158
+ }
159
+ if (scope.targets.length > 0) {
160
+ const hitsTarget = scope.targets.some((t) => blob.includes(t.toLowerCase()));
161
+ if (hitsTarget)
162
+ return 'in-scope';
163
+ }
164
+ if (scope.keywords.length > 0) {
165
+ const hitsKeyword = scope.keywords.some((kw) => blob.includes(kw.toLowerCase()));
166
+ if (hitsKeyword)
167
+ return 'in-scope';
168
+ }
169
+ if (scope.targets.length > 0 || scope.keywords.length > 0) {
170
+ return 'backlog';
171
+ }
172
+ return 'neutral';
173
+ }
174
+ //# sourceMappingURL=extractTaskScope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractTaskScope.js","sourceRoot":"","sources":["../../../src/council/scope/extractTaskScope.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from './extractTaskScope.js';
2
+ export * from './nfrSpecWarn.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/council/scope/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './extractTaskScope.js';
2
+ export * from './nfrSpecWarn.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/council/scope/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Soft design-phase check: warn when Nettuno plans motion/perf/budget work
3
+ * but does not emit createNfrSpec. No forced retry in v0.9.1.
4
+ */
5
+ export declare function warnIfNfrSpecMissing(memberId: string, userMessage: string, emittedToolNames: string[], planText?: string): boolean;
6
+ //# sourceMappingURL=nfrSpecWarn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nfrSpecWarn.d.ts","sourceRoot":"","sources":["../../../src/council/scope/nfrSpecWarn.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,gBAAgB,EAAE,MAAM,EAAE,EAC1B,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAcT"}
@@ -0,0 +1,21 @@
1
+ import { taskMatchesNfrKeywords } from './extractTaskScope.js';
2
+ /**
3
+ * Soft design-phase check: warn when Nettuno plans motion/perf/budget work
4
+ * but does not emit createNfrSpec. No forced retry in v0.9.1.
5
+ */
6
+ export function warnIfNfrSpecMissing(memberId, userMessage, emittedToolNames, planText) {
7
+ if (memberId !== 'nettun')
8
+ return false;
9
+ if (!taskMatchesNfrKeywords(userMessage, planText))
10
+ return false;
11
+ const count = emittedToolNames.filter((n) => n === 'createNfrSpec').length;
12
+ if (count >= 1)
13
+ return false;
14
+ // eslint-disable-next-line no-console
15
+ console.warn('[council] member "nettun" did not emit createNfrSpec for an NFR-heavy task ' +
16
+ '(motion/perf/budget keywords detected). Implementation will fall back to ' +
17
+ 'DEFAULT_NFR_SPEC until .zelari/nfr-spec.json exists. Emit createNfrSpec in ' +
18
+ 'design-phase when constraints are measurable.');
19
+ return true;
20
+ }
21
+ //# sourceMappingURL=nfrSpecWarn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nfrSpecWarn.js","sourceRoot":"","sources":["../../../src/council/scope/nfrSpecWarn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAgB,EAChB,WAAmB,EACnB,gBAA0B,EAC1B,QAAiB;IAEjB,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,CAAC,sBAAsB,CAAC,WAAW,EAAE,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACjE,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,eAAe,CAAC,CAAC,MAAM,CAAC;IAC3E,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAE7B,sCAAsC;IACtC,OAAO,CAAC,IAAI,CACV,6EAA6E;QAC3E,2EAA2E;QAC3E,6EAA6E;QAC7E,+CAA+C,CAClD,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { VerificationReport } from './types.js';
2
+ export interface AutofixResult {
3
+ applied: boolean;
4
+ filesChanged: string[];
5
+ fixes: string[];
6
+ }
7
+ /**
8
+ * Deterministic autofix for motion, inline-js budget, and css.dead-hook.
9
+ * Max one pass per hook invocation — no LLM loop.
10
+ */
11
+ export declare function applyDeterministicAutofix(projectRoot: string, report: VerificationReport): AutofixResult;
12
+ //# sourceMappingURL=autofix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autofix.d.ts","sourceRoot":"","sources":["../../../src/council/verification/autofix.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,kBAAkB,GACzB,aAAa,CA+Bf"}
@@ -0,0 +1,41 @@
1
+ import { readFileSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { applyInlineJsAutofix } from './inlineJsAutofix.js';
4
+ import { applyMotionAutofix } from './motionAutofix.js';
5
+ /**
6
+ * Deterministic autofix for motion, inline-js budget, and css.dead-hook.
7
+ * Max one pass per hook invocation — no LLM loop.
8
+ */
9
+ export function applyDeterministicAutofix(projectRoot, report) {
10
+ const motion = applyMotionAutofix(projectRoot, report);
11
+ const inlineJs = applyInlineJsAutofix(projectRoot, report);
12
+ const filesChanged = [...motion.filesChanged, ...inlineJs.filesChanged];
13
+ const fixes = [...motion.fixes, ...inlineJs.fixes];
14
+ const deadHooks = report.results.filter((r) => r.id === 'css.dead-hook' && !r.ok && r.file);
15
+ for (const r of deadHooks) {
16
+ const rel = r.file;
17
+ if (filesChanged.includes(rel))
18
+ continue;
19
+ const m = r.evidence?.match(/classList\.add\(\s*['"]([\w-]+)['"]\s*\)/);
20
+ if (!m || m[1] === 'rm')
21
+ continue;
22
+ const abs = join(projectRoot, rel);
23
+ let html = readFileSync(abs, 'utf8');
24
+ const snippet = m[0];
25
+ if (!html.includes(snippet))
26
+ continue;
27
+ const lines = html.split(/\r?\n/);
28
+ const filtered = lines.filter((line) => !line.includes(snippet));
29
+ if (filtered.length === lines.length)
30
+ continue;
31
+ writeFileSync(abs, filtered.join('\n'), 'utf8');
32
+ filesChanged.push(rel);
33
+ fixes.push(`removed dead hook line in ${rel}: ${snippet}`);
34
+ }
35
+ return {
36
+ applied: filesChanged.length > 0,
37
+ filesChanged: [...new Set(filesChanged)],
38
+ fixes,
39
+ };
40
+ }
41
+ //# sourceMappingURL=autofix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autofix.js","sourceRoot":"","sources":["../../../src/council/verification/autofix.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AASxD;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,WAAmB,EACnB,MAA0B;IAE1B,MAAM,MAAM,GAAG,kBAAkB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC3D,MAAM,YAAY,GAAG,CAAC,GAAG,MAAM,CAAC,YAAY,EAAE,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IACxE,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEnD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CACrC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,eAAe,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CACnD,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,CAAC,CAAC,IAAK,CAAC;QACpB,IAAI,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QACzC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,0CAA0C,CAAC,CAAC;QACxE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;YAAE,SAAS;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACnC,IAAI,IAAI,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACjE,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;YAAE,SAAS;QAC/C,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;QAChD,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,6BAA6B,GAAG,KAAK,OAAO,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO;QACL,OAAO,EAAE,YAAY,CAAC,MAAM,GAAG,CAAC;QAChC,YAAY,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QACxC,KAAK;KACN,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { VerificationCheckResult } from './types.js';
2
+ export interface CiteRef {
3
+ file: string;
4
+ line: number;
5
+ raw: string;
6
+ }
7
+ /** Extract path:line citations from synthesis text. */
8
+ export declare function extractCitations(text: string): CiteRef[];
9
+ /**
10
+ * Verify that cited path:line references exist and the line is non-empty.
11
+ */
12
+ export declare function verifyCitations(projectRoot: string, synthesisText: string | undefined): VerificationCheckResult[];
13
+ //# sourceMappingURL=citeVerify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"citeVerify.d.ts","sourceRoot":"","sources":["../../../src/council/verification/citeVerify.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAK1D,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,uDAAuD;AACvD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAcxD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GAAG,SAAS,GAChC,uBAAuB,EAAE,CA+C3B"}
@@ -0,0 +1,73 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ const CITE_RE = /(?:^|[\s|])([A-Za-z0-9_./-]+\.(?:html|css|js|ts|tsx|jsx|md|json)):(?:L)?(\d{1,6})\b/gi;
4
+ /** Extract path:line citations from synthesis text. */
5
+ export function extractCitations(text) {
6
+ const out = [];
7
+ const seen = new Set();
8
+ let m;
9
+ CITE_RE.lastIndex = 0;
10
+ while ((m = CITE_RE.exec(text)) !== null) {
11
+ const file = (m[1] ?? '').replace(/^\.\//, '');
12
+ const line = Number.parseInt(m[2] ?? '0', 10);
13
+ const key = `${file}:${line}`;
14
+ if (!file || line < 1 || seen.has(key))
15
+ continue;
16
+ seen.add(key);
17
+ out.push({ file, line, raw: m[0].trim() });
18
+ }
19
+ return out;
20
+ }
21
+ /**
22
+ * Verify that cited path:line references exist and the line is non-empty.
23
+ */
24
+ export function verifyCitations(projectRoot, synthesisText) {
25
+ if (!synthesisText?.trim())
26
+ return [];
27
+ const results = [];
28
+ for (const cite of extractCitations(synthesisText)) {
29
+ const abs = join(projectRoot, cite.file);
30
+ if (!existsSync(abs)) {
31
+ results.push({
32
+ id: 'synthesis.cite-invalid',
33
+ severity: 'error',
34
+ ok: false,
35
+ tier: 'grep',
36
+ file: cite.file,
37
+ line: cite.line,
38
+ message: `Citation ${cite.file}:L${cite.line} — file not found`,
39
+ evidence: cite.raw,
40
+ });
41
+ continue;
42
+ }
43
+ const lines = readFileSync(abs, 'utf8').split(/\r?\n/);
44
+ if (cite.line > lines.length) {
45
+ results.push({
46
+ id: 'synthesis.cite-invalid',
47
+ severity: 'error',
48
+ ok: false,
49
+ tier: 'grep',
50
+ file: cite.file,
51
+ line: cite.line,
52
+ message: `Citation ${cite.file}:L${cite.line} — line out of range (file has ${lines.length} lines)`,
53
+ evidence: cite.raw,
54
+ });
55
+ continue;
56
+ }
57
+ const content = lines[cite.line - 1] ?? '';
58
+ if (!content.trim()) {
59
+ results.push({
60
+ id: 'synthesis.cite-invalid',
61
+ severity: 'error',
62
+ ok: false,
63
+ tier: 'grep',
64
+ file: cite.file,
65
+ line: cite.line,
66
+ message: `Citation ${cite.file}:L${cite.line} — line is empty`,
67
+ evidence: cite.raw,
68
+ });
69
+ }
70
+ }
71
+ return results;
72
+ }
73
+ //# sourceMappingURL=citeVerify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"citeVerify.js","sourceRoot":"","sources":["../../../src/council/verification/citeVerify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Implementation-mode completion gate — Lucifero must verify writes with tools.
3
+ */
4
+ export interface ImplementationCompletionCheck {
5
+ ok: boolean;
6
+ /** Tool(s) to advertise on forced retry (first executable wins). */
7
+ missing: string[];
8
+ reason?: string;
9
+ }
10
+ /** Escape hatch for dev / tests. */
11
+ export declare function isVerifyToolCheckSkipped(): boolean;
12
+ /**
13
+ * True when at least one verify tool ran after the last write/edit in the turn.
14
+ */
15
+ export declare function checkImplementationCompletion(emittedToolNames: readonly string[]): ImplementationCompletionCheck;
16
+ /** Pick the first verify tool the runtime can execute for retry. */
17
+ export declare function resolveVerifyRetryTool(executableTools: ReadonlySet<string> | null): string | null;
18
+ export declare function buildImplementationVerifyRetryPrompt(toolName: string): string;
19
+ //# sourceMappingURL=completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../../src/council/verification/completion.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,6BAA6B;IAC5C,EAAE,EAAE,OAAO,CAAC;IACZ,oEAAoE;IACpE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,oCAAoC;AACpC,wBAAgB,wBAAwB,IAAI,OAAO,CAElD;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,gBAAgB,EAAE,SAAS,MAAM,EAAE,GAClC,6BAA6B,CAyB/B;AAED,oEAAoE;AACpE,wBAAgB,sBAAsB,CACpC,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,GAC1C,MAAM,GAAG,IAAI,CAKf;AAED,wBAAgB,oCAAoC,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK7E"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Implementation-mode completion gate — Lucifero must verify writes with tools.
3
+ */
4
+ const WRITE_TOOLS = new Set(['write_file', 'edit_file']);
5
+ const VERIFY_TOOLS = new Set(['grep_content', 'bash']);
6
+ /** Escape hatch for dev / tests. */
7
+ export function isVerifyToolCheckSkipped() {
8
+ return process.env.ZELARI_VERIFY_SKIP_TOOL === '1';
9
+ }
10
+ /**
11
+ * True when at least one verify tool ran after the last write/edit in the turn.
12
+ */
13
+ export function checkImplementationCompletion(emittedToolNames) {
14
+ if (isVerifyToolCheckSkipped()) {
15
+ return { ok: true, missing: [] };
16
+ }
17
+ let lastWriteIdx = -1;
18
+ for (let i = 0; i < emittedToolNames.length; i++) {
19
+ if (WRITE_TOOLS.has(emittedToolNames[i])) {
20
+ lastWriteIdx = i;
21
+ }
22
+ }
23
+ if (lastWriteIdx === -1) {
24
+ return { ok: true, missing: [] };
25
+ }
26
+ const afterWrite = emittedToolNames.slice(lastWriteIdx + 1);
27
+ if (afterWrite.some((t) => VERIFY_TOOLS.has(t))) {
28
+ return { ok: true, missing: [] };
29
+ }
30
+ return {
31
+ ok: false,
32
+ missing: ['grep_content'],
33
+ reason: 'No grep_content or bash after last write_file/edit_file',
34
+ };
35
+ }
36
+ /** Pick the first verify tool the runtime can execute for retry. */
37
+ export function resolveVerifyRetryTool(executableTools) {
38
+ if (!executableTools)
39
+ return 'grep_content';
40
+ if (executableTools.has('grep_content'))
41
+ return 'grep_content';
42
+ if (executableTools.has('bash'))
43
+ return 'bash';
44
+ return null;
45
+ }
46
+ export function buildImplementationVerifyRetryPrompt(toolName) {
47
+ return (`You wrote files but did not run ${toolName} or bash to verify them. ` +
48
+ `Call ${toolName} NOW on your changed HTML (search @keyframes, transition, classList.add). No prose.`);
49
+ }
50
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../../src/council/verification/completion.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;AACzD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;AASvD,oCAAoC;AACpC,MAAM,UAAU,wBAAwB;IACtC,OAAO,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,GAAG,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,6BAA6B,CAC3C,gBAAmC;IAEnC,IAAI,wBAAwB,EAAE,EAAE,CAAC;QAC/B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACnC,CAAC;IAED,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,IAAI,WAAW,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC;YAC1C,YAAY,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IACD,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACnC,CAAC;IAED,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;IAC5D,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACnC,CAAC;IAED,OAAO;QACL,EAAE,EAAE,KAAK;QACT,OAAO,EAAE,CAAC,cAAc,CAAC;QACzB,MAAM,EAAE,yDAAyD;KAClE,CAAC;AACJ,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,sBAAsB,CACpC,eAA2C;IAE3C,IAAI,CAAC,eAAe;QAAE,OAAO,cAAc,CAAC;IAC5C,IAAI,eAAe,CAAC,GAAG,CAAC,cAAc,CAAC;QAAE,OAAO,cAAc,CAAC;IAC/D,IAAI,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC/C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,oCAAoC,CAAC,QAAgB;IACnE,OAAO,CACL,mCAAmC,QAAQ,2BAA2B;QACtE,QAAQ,QAAQ,qFAAqF,CACtG,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { VerificationCheckResult } from './types.js';
2
+ export declare const DEGRADED_RUN_BANNER = "DEGRADED_RUN";
3
+ export interface DegradedRunInput {
4
+ chairmanErrored?: boolean;
5
+ councilAborted?: boolean;
6
+ /**
7
+ * Total project-file writes (write_file/edit_file) this run — implementer
8
+ * agnostic. Named `lucifer*` for history; implementation runs now have a
9
+ * single implementer (specialists are read-only), so "0 writes" reliably
10
+ * means nobody implemented, not merely that the chairman didn't.
11
+ */
12
+ luciferWriteCount?: number;
13
+ synthesisText?: string;
14
+ runMode?: 'implementation' | 'design-phase';
15
+ }
16
+ export interface DegradedRunResult {
17
+ degraded: boolean;
18
+ reasons: string[];
19
+ }
20
+ /**
21
+ * Detect council runs that should not be treated as a clean hand-off.
22
+ */
23
+ export declare function detectDegradedRun(input: DegradedRunInput): DegradedRunResult;
24
+ /** Warn when a degraded run omits the mandatory banner in synthesis. */
25
+ export declare function auditDegradedBanner(synthesisText: string | undefined, degraded: boolean): VerificationCheckResult[];
26
+ //# sourceMappingURL=degraded.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"degraded.d.ts","sourceRoot":"","sources":["../../../src/council/verification/degraded.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AAElD,MAAM,WAAW,gBAAgB;IAC/B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,gBAAgB,GAAG,cAAc,CAAC;CAC7C;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAKD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CAY5E;AAED,wEAAwE;AACxE,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,QAAQ,EAAE,OAAO,GAChB,uBAAuB,EAAE,CAU3B"}
@@ -0,0 +1,35 @@
1
+ export const DEGRADED_RUN_BANNER = 'DEGRADED_RUN';
2
+ const DONE_CLAIM_RE = /\b(pronto\s+al\s+commit|complet[oa]|hand[- ]?off|implementat[oi]|tutto\s+fatto)\b/i;
3
+ /**
4
+ * Detect council runs that should not be treated as a clean hand-off.
5
+ */
6
+ export function detectDegradedRun(input) {
7
+ if (input.runMode === 'design-phase') {
8
+ return { degraded: false, reasons: [] };
9
+ }
10
+ const reasons = [];
11
+ if (input.chairmanErrored)
12
+ reasons.push('chairman errored');
13
+ if (input.councilAborted)
14
+ reasons.push('council aborted');
15
+ const writes = input.luciferWriteCount ?? 0;
16
+ if (DONE_CLAIM_RE.test(input.synthesisText ?? '') && writes === 0) {
17
+ reasons.push('synthesis claims done but no files were written');
18
+ }
19
+ return { degraded: reasons.length > 0, reasons };
20
+ }
21
+ /** Warn when a degraded run omits the mandatory banner in synthesis. */
22
+ export function auditDegradedBanner(synthesisText, degraded) {
23
+ if (!degraded || !synthesisText?.trim())
24
+ return [];
25
+ if (synthesisText.includes(DEGRADED_RUN_BANNER))
26
+ return [];
27
+ return [{
28
+ id: 'synthesis.degraded-banner',
29
+ severity: 'warn',
30
+ ok: false,
31
+ tier: 'grep',
32
+ message: `Degraded council run must include ${DEGRADED_RUN_BANNER} banner in synthesis`,
33
+ }];
34
+ }
35
+ //# sourceMappingURL=degraded.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"degraded.js","sourceRoot":"","sources":["../../../src/council/verification/degraded.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAqBlD,MAAM,aAAa,GACjB,oFAAoF,CAAC;AAEvF;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAuB;IACvD,IAAI,KAAK,CAAC,OAAO,KAAK,cAAc,EAAE,CAAC;QACrC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC1C,CAAC;IACD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,KAAK,CAAC,eAAe;QAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,cAAc;QAAE,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,KAAK,CAAC,iBAAiB,IAAI,CAAC,CAAC;IAC5C,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC;AACnD,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,mBAAmB,CACjC,aAAiC,EACjC,QAAiB;IAEjB,IAAI,CAAC,QAAQ,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IACnD,IAAI,aAAa,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3D,OAAO,CAAC;YACN,EAAE,EAAE,2BAA2B;YAC/B,QAAQ,EAAE,MAAM;YAChB,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,qCAAqC,mBAAmB,sBAAsB;SACxF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { VerificationCheckResult } from './types.js';
2
+ /**
3
+ * Flag synthesis text that asserts verification without citing evidence.
4
+ */
5
+ export declare function lintSynthesisHonesty(synthesisText: string | undefined): VerificationCheckResult[];
6
+ //# sourceMappingURL=honesty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"honesty.d.ts","sourceRoot":"","sources":["../../../src/council/verification/honesty.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAQ1D;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,uBAAuB,EAAE,CAqBjG"}
@@ -0,0 +1,28 @@
1
+ const UNVERIFIED_CLAIM_RE = /\b(verificat[oi]|confermat[oi]|nessuna\s+regressione|pronto\s+al\s+commit|✓|Lighthouse\s*≥|axe\s+(clean|pulito)|CLS\s*[<≤])\b/i;
2
+ const EVIDENCE_MARKERS_RE = /\b(path:|L\d+|evidence:|verification-report|\.zelari\/|bash:|grep_|wc\s+-c)\b/i;
3
+ /**
4
+ * Flag synthesis text that asserts verification without citing evidence.
5
+ */
6
+ export function lintSynthesisHonesty(synthesisText) {
7
+ if (!synthesisText?.trim()) {
8
+ return [];
9
+ }
10
+ const hasClaim = UNVERIFIED_CLAIM_RE.test(synthesisText);
11
+ const hasEvidence = EVIDENCE_MARKERS_RE.test(synthesisText) ||
12
+ /##\s+Verification\s+status/i.test(synthesisText);
13
+ if (!hasClaim) {
14
+ return [];
15
+ }
16
+ if (hasEvidence) {
17
+ return [];
18
+ }
19
+ return [{
20
+ id: 'synthesis.honesty',
21
+ severity: 'error',
22
+ ok: false,
23
+ tier: 'grep',
24
+ message: 'Synthesis asserts verification (✓/verificato/regressione/Lighthouse) without Evidence table or report reference',
25
+ evidence: synthesisText.slice(0, 200),
26
+ }];
27
+ }
28
+ //# sourceMappingURL=honesty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"honesty.js","sourceRoot":"","sources":["../../../src/council/verification/honesty.ts"],"names":[],"mappings":"AAEA,MAAM,mBAAmB,GACvB,gIAAgI,CAAC;AAEnI,MAAM,mBAAmB,GACvB,gFAAgF,CAAC;AAEnF;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,aAAiC;IACpE,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,mBAAmB,CAAC,IAAI,CAAC,aAAa,CAAC;QACzD,6BAA6B,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACpD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,CAAC;YACN,EAAE,EAAE,mBAAmB;YACvB,QAAQ,EAAE,OAAO;YACjB,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,iHAAiH;YAC1H,QAAQ,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;SACtC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { VerificationCheckResult } from './types.js';
2
+ /** Lucifero must emit at least one mutating tool in implementation mode. */
3
+ export declare const IMPLEMENTATION_WRITE_REQUIREMENTS: readonly [{
4
+ readonly name: "write_file";
5
+ readonly min: 1;
6
+ }, {
7
+ readonly name: "edit_file";
8
+ readonly min: 1;
9
+ }];
10
+ export interface ImplementationDeliveryCheck {
11
+ ok: boolean;
12
+ missing: string[];
13
+ reason?: string;
14
+ }
15
+ /**
16
+ * True when at least one write_file/edit_file succeeded (not merely emitted).
17
+ * edit_file counts only when occurrencesReplaced > 0.
18
+ */
19
+ export declare function checkImplementationDelivery(successfulWriteCount: number, emittedWriteTools: number): ImplementationDeliveryCheck;
20
+ /** Blocking verify failures the chairman can fix on disk (exclude synthesis meta). */
21
+ export declare function filterDeliveryBlockingFails(results: VerificationCheckResult[]): VerificationCheckResult[];
22
+ export declare function buildImplementationWriteRetryPrompt(userMessage: string): string;
23
+ /** Imperative fix prompt from deterministic verify FAILs (post-write delivery loop). */
24
+ export declare function buildDeliveryFixPrompt(blocking: VerificationCheckResult[], userMessage: string): string;
25
+ export declare function countEmittedWriteTools(emittedToolNames: readonly string[]): number;
26
+ //# sourceMappingURL=implementationDelivery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"implementationDelivery.d.ts","sourceRoot":"","sources":["../../../src/council/verification/implementationDelivery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAI1D,4EAA4E;AAC5E,eAAO,MAAM,iCAAiC;;;;;;EAGpC,CAAC;AAEX,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,oBAAoB,EAAE,MAAM,EAC5B,iBAAiB,EAAE,MAAM,GACxB,2BAA2B,CAiB7B;AAED,sFAAsF;AACtF,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,uBAAuB,EAAE,GACjC,uBAAuB,EAAE,CAO3B;AAED,wBAAgB,mCAAmC,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAY/E;AAED,wFAAwF;AACxF,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,uBAAuB,EAAE,EACnC,WAAW,EAAE,MAAM,GAClB,MAAM,CA0BR;AAED,wBAAgB,sBAAsB,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAElF"}