@balpal4495/quorum 3.0.3 → 3.1.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 (243) hide show
  1. package/bin/commands/compass.js +4 -4
  2. package/bin/shared/llm.js +2 -2
  3. package/dist/advisor/ask.d.ts +13 -0
  4. package/dist/advisor/ask.d.ts.map +1 -0
  5. package/dist/advisor/ask.js +67 -0
  6. package/dist/advisor/ask.js.map +1 -0
  7. package/dist/advisor/index.d.ts +3 -0
  8. package/dist/advisor/index.d.ts.map +1 -0
  9. package/dist/advisor/index.js +2 -0
  10. package/dist/advisor/index.js.map +1 -0
  11. package/dist/advisor/prompt.d.ts +5 -0
  12. package/dist/advisor/prompt.d.ts.map +1 -0
  13. package/{modules/advisor/prompt.ts → dist/advisor/prompt.js} +22 -26
  14. package/dist/advisor/prompt.js.map +1 -0
  15. package/dist/advisor/types.d.ts +23 -0
  16. package/dist/advisor/types.d.ts.map +1 -0
  17. package/dist/advisor/types.js +2 -0
  18. package/dist/advisor/types.js.map +1 -0
  19. package/dist/compass/behavior.d.ts +4 -0
  20. package/dist/compass/behavior.d.ts.map +1 -0
  21. package/dist/compass/behavior.js +138 -0
  22. package/dist/compass/behavior.js.map +1 -0
  23. package/dist/compass/create.d.ts +3 -0
  24. package/dist/compass/create.d.ts.map +1 -0
  25. package/dist/compass/create.js +289 -0
  26. package/dist/compass/create.js.map +1 -0
  27. package/dist/compass/evidence/collect.d.ts +11 -0
  28. package/dist/compass/evidence/collect.d.ts.map +1 -0
  29. package/dist/compass/evidence/collect.js +86 -0
  30. package/dist/compass/evidence/collect.js.map +1 -0
  31. package/dist/compass/index.d.ts +8 -0
  32. package/dist/compass/index.d.ts.map +1 -0
  33. package/dist/compass/index.js +8 -0
  34. package/dist/compass/index.js.map +1 -0
  35. package/dist/compass/prompts/index.d.ts +28 -0
  36. package/dist/compass/prompts/index.d.ts.map +1 -0
  37. package/{modules/compass/prompts/index.ts → dist/compass/prompts/index.js} +13 -38
  38. package/dist/compass/prompts/index.js.map +1 -0
  39. package/dist/compass/prompts/system.d.ts +2 -0
  40. package/dist/compass/prompts/system.d.ts.map +1 -0
  41. package/{modules/compass/prompts/system.ts → dist/compass/prompts/system.js} +2 -1
  42. package/dist/compass/prompts/system.js.map +1 -0
  43. package/dist/compass/propose.d.ts +15 -0
  44. package/dist/compass/propose.d.ts.map +1 -0
  45. package/dist/compass/propose.js +128 -0
  46. package/dist/compass/propose.js.map +1 -0
  47. package/dist/compass/schemas.d.ts +1271 -0
  48. package/dist/compass/schemas.d.ts.map +1 -0
  49. package/dist/compass/schemas.js +113 -0
  50. package/dist/compass/schemas.js.map +1 -0
  51. package/dist/compass/score.d.ts +25 -0
  52. package/dist/compass/score.d.ts.map +1 -0
  53. package/dist/compass/score.js +89 -0
  54. package/dist/compass/score.js.map +1 -0
  55. package/dist/compass/sources/index.d.ts +9 -0
  56. package/dist/compass/sources/index.d.ts.map +1 -0
  57. package/dist/compass/sources/index.js +408 -0
  58. package/dist/compass/sources/index.js.map +1 -0
  59. package/dist/compass/types.d.ts +334 -0
  60. package/dist/compass/types.d.ts.map +1 -0
  61. package/dist/compass/types.js +2 -0
  62. package/dist/compass/types.js.map +1 -0
  63. package/dist/council/advisors.d.ts +15 -0
  64. package/dist/council/advisors.d.ts.map +1 -0
  65. package/dist/council/advisors.js +46 -0
  66. package/dist/council/advisors.js.map +1 -0
  67. package/dist/council/chairman.d.ts +13 -0
  68. package/dist/council/chairman.d.ts.map +1 -0
  69. package/dist/council/chairman.js +145 -0
  70. package/dist/council/chairman.js.map +1 -0
  71. package/dist/council/deliberate.d.ts +22 -0
  72. package/dist/council/deliberate.d.ts.map +1 -0
  73. package/dist/council/deliberate.js +99 -0
  74. package/dist/council/deliberate.js.map +1 -0
  75. package/dist/council/frame.d.ts +8 -0
  76. package/dist/council/frame.d.ts.map +1 -0
  77. package/dist/council/frame.js +40 -0
  78. package/dist/council/frame.js.map +1 -0
  79. package/dist/council/index.d.ts +6 -0
  80. package/dist/council/index.d.ts.map +1 -0
  81. package/dist/council/index.js +4 -0
  82. package/dist/council/index.js.map +1 -0
  83. package/dist/council/personas.d.ts +18 -0
  84. package/dist/council/personas.d.ts.map +1 -0
  85. package/dist/council/personas.js +44 -0
  86. package/dist/council/personas.js.map +1 -0
  87. package/dist/council/reviewers.d.ts +13 -0
  88. package/dist/council/reviewers.d.ts.map +1 -0
  89. package/dist/council/reviewers.js +59 -0
  90. package/dist/council/reviewers.js.map +1 -0
  91. package/dist/council/risk.d.ts +16 -0
  92. package/dist/council/risk.d.ts.map +1 -0
  93. package/dist/council/risk.js +74 -0
  94. package/dist/council/risk.js.map +1 -0
  95. package/dist/council/types.d.ts +95 -0
  96. package/dist/council/types.d.ts.map +1 -0
  97. package/dist/council/types.js +2 -0
  98. package/dist/council/types.js.map +1 -0
  99. package/dist/jury/evaluate.d.ts +13 -0
  100. package/dist/jury/evaluate.d.ts.map +1 -0
  101. package/{modules/jury/evaluate.ts → dist/jury/evaluate.js} +60 -84
  102. package/dist/jury/evaluate.js.map +1 -0
  103. package/dist/jury/index.d.ts +6 -0
  104. package/dist/jury/index.d.ts.map +1 -0
  105. package/dist/jury/index.js +4 -0
  106. package/dist/jury/index.js.map +1 -0
  107. package/dist/jury/preflight.d.ts +26 -0
  108. package/dist/jury/preflight.d.ts.map +1 -0
  109. package/dist/jury/preflight.js +71 -0
  110. package/dist/jury/preflight.js.map +1 -0
  111. package/dist/jury/schema.d.ts +57 -0
  112. package/dist/jury/schema.d.ts.map +1 -0
  113. package/dist/jury/schema.js +21 -0
  114. package/dist/jury/schema.js.map +1 -0
  115. package/dist/jury/types.d.ts +47 -0
  116. package/dist/jury/types.d.ts.map +1 -0
  117. package/dist/jury/types.js +2 -0
  118. package/dist/jury/types.js.map +1 -0
  119. package/dist/oracle/adapters/lance-db.d.ts +15 -0
  120. package/dist/oracle/adapters/lance-db.d.ts.map +1 -0
  121. package/dist/oracle/adapters/lance-db.js +68 -0
  122. package/dist/oracle/adapters/lance-db.js.map +1 -0
  123. package/dist/oracle/adapters/xenova-embedder.d.ts +21 -0
  124. package/dist/oracle/adapters/xenova-embedder.d.ts.map +1 -0
  125. package/dist/oracle/adapters/xenova-embedder.js +36 -0
  126. package/dist/oracle/adapters/xenova-embedder.js.map +1 -0
  127. package/dist/oracle/bm25.d.ts +20 -0
  128. package/dist/oracle/bm25.d.ts.map +1 -0
  129. package/dist/oracle/bm25.js +82 -0
  130. package/dist/oracle/bm25.js.map +1 -0
  131. package/dist/oracle/index.d.ts +21 -0
  132. package/dist/oracle/index.d.ts.map +1 -0
  133. package/dist/oracle/index.js +25 -0
  134. package/dist/oracle/index.js.map +1 -0
  135. package/dist/oracle/log.d.ts +6 -0
  136. package/dist/oracle/log.d.ts.map +1 -0
  137. package/dist/oracle/log.js +12 -0
  138. package/dist/oracle/log.js.map +1 -0
  139. package/dist/oracle/propose.d.ts +25 -0
  140. package/dist/oracle/propose.d.ts.map +1 -0
  141. package/dist/oracle/propose.js +133 -0
  142. package/dist/oracle/propose.js.map +1 -0
  143. package/dist/oracle/query.d.ts +17 -0
  144. package/dist/oracle/query.d.ts.map +1 -0
  145. package/dist/oracle/query.js +106 -0
  146. package/dist/oracle/query.js.map +1 -0
  147. package/dist/oracle/summary.d.ts +11 -0
  148. package/dist/oracle/summary.d.ts.map +1 -0
  149. package/dist/oracle/summary.js +102 -0
  150. package/dist/oracle/summary.js.map +1 -0
  151. package/dist/oracle/types.d.ts +31 -0
  152. package/dist/oracle/types.d.ts.map +1 -0
  153. package/dist/oracle/types.js +2 -0
  154. package/dist/oracle/types.js.map +1 -0
  155. package/dist/sentinel/assert.d.ts +28 -0
  156. package/dist/sentinel/assert.d.ts.map +1 -0
  157. package/dist/sentinel/assert.js +63 -0
  158. package/dist/sentinel/assert.js.map +1 -0
  159. package/dist/sentinel/coverage.d.ts +14 -0
  160. package/dist/sentinel/coverage.d.ts.map +1 -0
  161. package/dist/sentinel/coverage.js +96 -0
  162. package/dist/sentinel/coverage.js.map +1 -0
  163. package/dist/sentinel/drift.d.ts +12 -0
  164. package/dist/sentinel/drift.d.ts.map +1 -0
  165. package/dist/sentinel/drift.js +149 -0
  166. package/dist/sentinel/drift.js.map +1 -0
  167. package/dist/sentinel/index.d.ts +7 -0
  168. package/dist/sentinel/index.d.ts.map +1 -0
  169. package/dist/sentinel/index.js +5 -0
  170. package/dist/sentinel/index.js.map +1 -0
  171. package/dist/sentinel/review.d.ts +15 -0
  172. package/dist/sentinel/review.d.ts.map +1 -0
  173. package/dist/sentinel/review.js +177 -0
  174. package/dist/sentinel/review.js.map +1 -0
  175. package/dist/setup.d.ts +103 -0
  176. package/dist/setup.d.ts.map +1 -0
  177. package/dist/setup.js +87 -0
  178. package/dist/setup.js.map +1 -0
  179. package/dist/shared/types.d.ts +173 -0
  180. package/dist/shared/types.d.ts.map +1 -0
  181. package/dist/shared/types.js +16 -0
  182. package/dist/shared/types.js.map +1 -0
  183. package/package.json +13 -8
  184. package/.github/copilot-instructions.md +0 -117
  185. package/CLAUDE.md +0 -146
  186. package/GEMINI.md +0 -73
  187. package/SETUP.md +0 -264
  188. package/evals/__tests__/eval.test.ts +0 -31
  189. package/evals/cases/auth_hs256_rejected.json +0 -46
  190. package/evals/cases/auth_rs256_valid.json +0 -30
  191. package/evals/cases/cache_missing_lock.json +0 -31
  192. package/evals/cases/db_naive_not_null.json +0 -32
  193. package/evals/cases/logging_pii_leak.json +0 -32
  194. package/evals/cases/migration_with_rollback.json +0 -43
  195. package/evals/cases/no_evidence_novel_design.json +0 -16
  196. package/evals/cases/payment_no_idempotency.json +0 -33
  197. package/evals/cases/redis_session_rejected.json +0 -32
  198. package/evals/cases/safe_refactor.json +0 -17
  199. package/evals/runner.ts +0 -226
  200. package/modules/AGENTS.md +0 -78
  201. package/modules/CLAUDE.md +0 -93
  202. package/modules/README.md +0 -504
  203. package/modules/advisor/ask.ts +0 -87
  204. package/modules/advisor/index.ts +0 -2
  205. package/modules/advisor/types.ts +0 -26
  206. package/modules/compass/behavior.ts +0 -161
  207. package/modules/compass/create.ts +0 -365
  208. package/modules/compass/evidence/collect.ts +0 -109
  209. package/modules/compass/index.ts +0 -7
  210. package/modules/compass/propose.ts +0 -152
  211. package/modules/compass/schemas.ts +0 -121
  212. package/modules/compass/score.ts +0 -77
  213. package/modules/compass/sources/index.ts +0 -413
  214. package/modules/compass/types.ts +0 -431
  215. package/modules/council/advisors.ts +0 -71
  216. package/modules/council/chairman.ts +0 -183
  217. package/modules/council/deliberate.ts +0 -141
  218. package/modules/council/frame.ts +0 -54
  219. package/modules/council/index.ts +0 -9
  220. package/modules/council/personas.ts +0 -57
  221. package/modules/council/reviewers.ts +0 -82
  222. package/modules/council/risk.ts +0 -89
  223. package/modules/council/types.ts +0 -107
  224. package/modules/jury/index.ts +0 -5
  225. package/modules/jury/preflight.ts +0 -101
  226. package/modules/jury/schema.ts +0 -24
  227. package/modules/jury/types.ts +0 -50
  228. package/modules/oracle/adapters/lance-db.ts +0 -81
  229. package/modules/oracle/adapters/xenova-embedder.ts +0 -43
  230. package/modules/oracle/bm25.ts +0 -92
  231. package/modules/oracle/index.ts +0 -36
  232. package/modules/oracle/log.ts +0 -15
  233. package/modules/oracle/propose.ts +0 -164
  234. package/modules/oracle/query.ts +0 -146
  235. package/modules/oracle/summary.ts +0 -116
  236. package/modules/oracle/types.ts +0 -32
  237. package/modules/sentinel/assert.ts +0 -95
  238. package/modules/sentinel/coverage.ts +0 -106
  239. package/modules/sentinel/drift.ts +0 -163
  240. package/modules/sentinel/index.ts +0 -6
  241. package/modules/sentinel/review.ts +0 -208
  242. package/modules/setup.ts +0 -202
  243. package/modules/shared/types.ts +0 -193
@@ -0,0 +1,99 @@
1
+ import { DEFAULT_PERSONAS } from "./personas.js";
2
+ import { frameQuestion } from "./frame.js";
3
+ import { fanOutAdvisors } from "./advisors.js";
4
+ import { fanOutReviewers } from "./reviewers.js";
5
+ import { chairman } from "./chairman.js";
6
+ import { classifyRisk } from "./risk.js";
7
+ const DEFAULT_ADVISOR_COUNT = 5;
8
+ const DEFAULT_REVIEWER_COUNT = 5;
9
+ const LITE_ADVISOR_COUNT = 1;
10
+ const LITE_REVIEWER_COUNT = 2;
11
+ /**
12
+ * Run the Council deliberation pipeline.
13
+ *
14
+ * Pipeline:
15
+ * 1. frameQuestion — reframe outcome + design into a deliberation brief
16
+ * 2. fanOutAdvisors — N advisors reason in parallel from Oracle evidence
17
+ * 3. fanOutReviewers — N reviewers critique anonymised advisor responses in parallel
18
+ * 4. chairman — synthesises verdict, cites Oracle entry IDs
19
+ * 5. oracle.propose() — proposes verdict to Chronicle (human approval required to commit)
20
+ *
21
+ * The council_brief from jury_output determines framing tone:
22
+ * "challenge" → find what is wrong (Jury confidence < 0.6)
23
+ * "pressure-test" → try to break what looks solid (Jury confidence ≥ 0.6)
24
+ *
25
+ * Routing on output:
26
+ * satisfied: true → proceed to human gate → Executor
27
+ * satisfied: false, recommendation: redesign → return to Designer
28
+ * satisfied: false, recommendation: investigate-more → return to Detective with gaps list
29
+ */
30
+ export async function deliberate(input, deps) {
31
+ const { llm, oracle, models = {}, } = deps;
32
+ // Classify risk to determine Council mode and advisor/reviewer counts
33
+ const risk = classifyRisk(input.outcome, input.design, input.evidence);
34
+ if (risk.council_mode === "jury-only") {
35
+ return {
36
+ satisfied: true,
37
+ verdict: "Skipped — low-risk design passed by Jury without Council review.",
38
+ blockers: [],
39
+ warnings: [],
40
+ challenges: [],
41
+ evidence_cited: [],
42
+ citation_validation: { valid_ids: [], hallucinated_ids: [] },
43
+ advisor_split: { proceed: 0, redesign: 0, "investigate-more": 0 },
44
+ recommendation: "proceed",
45
+ };
46
+ }
47
+ let defaultAdvisors = DEFAULT_ADVISOR_COUNT;
48
+ let defaultReviewers = DEFAULT_REVIEWER_COUNT;
49
+ if (risk.council_mode === "lite") {
50
+ defaultAdvisors = LITE_ADVISOR_COUNT;
51
+ defaultReviewers = LITE_REVIEWER_COUNT;
52
+ }
53
+ const advisorCount = deps.advisorCount ?? defaultAdvisors;
54
+ const reviewerCount = deps.reviewerCount ?? defaultReviewers;
55
+ // Select personas — cycle DEFAULT_PERSONAS if advisorCount > 5
56
+ const personas = Array.from({ length: advisorCount }, (_, i) => DEFAULT_PERSONAS[i % DEFAULT_PERSONAS.length]);
57
+ // 1. Frame the deliberation question
58
+ const framedQuestion = await frameQuestion(input, llm, models.frame);
59
+ // 2. Advisors reason in parallel
60
+ const advisorResponses = await fanOutAdvisors(framedQuestion, input.evidence, personas, llm, models.advisors);
61
+ // 3. Reviewers critique in parallel (advisor responses anonymised inside fanOutReviewers)
62
+ const reviewerResponses = await fanOutReviewers(advisorResponses, input.evidence, reviewerCount, llm, models.reviewers);
63
+ // 4. Chairman synthesises verdict
64
+ const verdict = await chairman(advisorResponses, reviewerResponses, input.evidence, llm, models.chairman);
65
+ // 5. Propose verdict to Oracle — human must call oracle.commit() to index it
66
+ // Truncate to 200 chars so it passes propose()'s schema validation.
67
+ const firstSentence = verdict.verdict.split(/[.!?]/)[0]?.trim() ?? "";
68
+ const keyInsight = (firstSentence.length >= 20 ? firstSentence : verdict.verdict)
69
+ .slice(0, 200);
70
+ await oracle.propose({
71
+ schema_version: 2,
72
+ topic: input.outcome.slice(0, 80),
73
+ decision: keyInsight,
74
+ key_insight: keyInsight,
75
+ affected_areas: extractAffectedAreas(input.outcome, input.design),
76
+ alternatives_considered: verdict.challenges,
77
+ rejected_reason: verdict.satisfied
78
+ ? []
79
+ : verdict.blockers.map(b => b.issue).slice(0, 3),
80
+ status: "open",
81
+ confidence: input.jury_output.confidence,
82
+ source_module: "council",
83
+ evidence_cited: verdict.citation_validation.valid_ids,
84
+ scope: risk.reasons.slice(0, 3),
85
+ });
86
+ return verdict;
87
+ }
88
+ /**
89
+ * Extract candidate affected areas from the outcome and design text.
90
+ * Looks for capitalised noun phrases as a simple heuristic.
91
+ * The host application may override by post-processing CouncilOutput.
92
+ */
93
+ function extractAffectedAreas(outcome, design) {
94
+ const text = `${outcome} ${design}`;
95
+ const phrases = text.match(/\b[A-Z][a-zA-Z]+(?:\s[A-Z][a-zA-Z]+)*\b/g) ?? [];
96
+ const unique = [...new Set(phrases)];
97
+ return unique.length > 0 ? unique.slice(0, 5) : ["general"];
98
+ }
99
+ //# sourceMappingURL=deliberate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deliberate.js","sourceRoot":"","sources":["../../modules/council/deliberate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { LLMProvider } from "../shared/types.js";
2
+ import type { CouncilInput } from "./types.js";
3
+ /**
4
+ * Reframe the outcome + design into a clear deliberation brief for the advisor panel.
5
+ * Tone and scope are set by the Jury's council_brief value.
6
+ */
7
+ export declare function frameQuestion(input: CouncilInput, llm: LLMProvider, model?: string): Promise<string>;
8
+ //# sourceMappingURL=frame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../../modules/council/frame.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C;;;GAGG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,WAAW,EAChB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CA0CjB"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Reframe the outcome + design into a clear deliberation brief for the advisor panel.
3
+ * Tone and scope are set by the Jury's council_brief value.
4
+ */
5
+ export async function frameQuestion(input, llm, model) {
6
+ const { outcome, design, jury_output } = input;
7
+ const briefInstruction = jury_output.council_brief === "challenge"
8
+ ? `The Jury has LOW confidence (score: ${jury_output.confidence.toFixed(2)}). ` +
9
+ "Find what is WRONG with this design. Look for fundamental flaws, not just edge cases."
10
+ : `The Jury has HIGH confidence (score: ${jury_output.confidence.toFixed(2)}). ` +
11
+ "PRESSURE-TEST this design. Assume it is broadly correct — try to break it. " +
12
+ "Find edge cases, scaling failures, and hidden assumptions.";
13
+ const systemPrompt = [
14
+ "You are the Council Framer. You write the deliberation brief that a panel of expert advisors will work from.",
15
+ "",
16
+ "Write a clear, precise brief that:",
17
+ "1. States what needs to be achieved (the outcome)",
18
+ "2. States what is being proposed (the design)",
19
+ "3. States the Jury's assessment and the gaps it identified",
20
+ "4. Sets the council directive — challenge or pressure-test",
21
+ "",
22
+ "Keep it under 300 words. Be direct. Advisors must know exactly what to evaluate.",
23
+ ].join("\n");
24
+ const userPrompt = [
25
+ `Outcome: ${outcome}`,
26
+ "",
27
+ `Design: ${design}`,
28
+ "",
29
+ `Jury assessment: ${jury_output.assessment}`,
30
+ `Jury confidence: ${jury_output.confidence.toFixed(2)}`,
31
+ `Jury gaps: ${jury_output.gaps.join("; ") || "none identified"}`,
32
+ "",
33
+ briefInstruction,
34
+ ].join("\n");
35
+ return llm([
36
+ { role: "system", content: systemPrompt },
37
+ { role: "user", content: userPrompt },
38
+ ], model);
39
+ }
40
+ //# sourceMappingURL=frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame.js","sourceRoot":"","sources":["../../modules/council/frame.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAmB,EACnB,GAAgB,EAChB,KAAc;IAEd,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,KAAK,CAAA;IAE9C,MAAM,gBAAgB,GACpB,WAAW,CAAC,aAAa,KAAK,WAAW;QACvC,CAAC,CAAC,uCAAuC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;YAC7E,uFAAuF;QACzF,CAAC,CAAC,wCAAwC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;YAC9E,6EAA6E;YAC7E,4DAA4D,CAAA;IAElE,MAAM,YAAY,GAAG;QACnB,8GAA8G;QAC9G,EAAE;QACF,oCAAoC;QACpC,mDAAmD;QACnD,+CAA+C;QAC/C,4DAA4D;QAC5D,4DAA4D;QAC5D,EAAE;QACF,kFAAkF;KACnF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEZ,MAAM,UAAU,GAAG;QACjB,YAAY,OAAO,EAAE;QACrB,EAAE;QACF,WAAW,MAAM,EAAE;QACnB,EAAE;QACF,oBAAoB,WAAW,CAAC,UAAU,EAAE;QAC5C,oBAAoB,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QACvD,cAAc,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,iBAAiB,EAAE;QAChE,EAAE;QACF,gBAAgB;KACjB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEZ,OAAO,GAAG,CACR;QACE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;QACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE;KACtC,EACD,KAAK,CACN,CAAA;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { deliberate } from "./deliberate.js";
2
+ export type { CouncilInput, CouncilOutput, CouncilDeps, CouncilModels, BlockerItem, WarningItem, CitationValidation, AdvisorSplit, RiskLevel, CouncilMode, RiskAssessment, } from "./types.js";
3
+ export { DEFAULT_PERSONAS } from "./personas.js";
4
+ export type { AdvisorPersona } from "./personas.js";
5
+ export { classifyRisk } from "./risk.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../modules/council/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,YAAY,EACV,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EACvD,WAAW,EAAE,WAAW,EAAE,kBAAkB,EAAE,YAAY,EAC1D,SAAS,EAAE,WAAW,EAAE,cAAc,GACvC,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,4 @@
1
+ export { deliberate } from "./deliberate.js";
2
+ export { DEFAULT_PERSONAS } from "./personas.js";
3
+ export { classifyRisk } from "./risk.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../modules/council/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAM5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Default advisor personas for the Council.
3
+ *
4
+ * Personas are interpretive lenses, not knowledge sources.
5
+ * All advisors receive the same Oracle evidence pack — their persona
6
+ * determines which entries they weight and how they read them.
7
+ *
8
+ * Add or replace personas in CouncilDeps to specialise for your domain.
9
+ */
10
+ export interface AdvisorPersona {
11
+ name: string;
12
+ /** One-line description of this persona's evidence focus. */
13
+ lens: string;
14
+ /** System prompt fragment injected into the advisor's prompt. */
15
+ systemFragment: string;
16
+ }
17
+ export declare const DEFAULT_PERSONAS: readonly AdvisorPersona[];
18
+ //# sourceMappingURL=personas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personas.d.ts","sourceRoot":"","sources":["../../modules/council/personas.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAA;IACZ,iEAAiE;IACjE,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,eAAO,MAAM,gBAAgB,EAAE,SAAS,cAAc,EAsCrD,CAAA"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Default advisor personas for the Council.
3
+ *
4
+ * Personas are interpretive lenses, not knowledge sources.
5
+ * All advisors receive the same Oracle evidence pack — their persona
6
+ * determines which entries they weight and how they read them.
7
+ *
8
+ * Add or replace personas in CouncilDeps to specialise for your domain.
9
+ */
10
+ export const DEFAULT_PERSONAS = [
11
+ {
12
+ name: "Pragmatist",
13
+ lens: "Weights validated entries — what has worked in this codebase",
14
+ systemFragment: "Focus on `validated` Oracle entries. What has already worked in this codebase? " +
15
+ "Weight evidence that confirms the design will succeed based on prior outcomes.",
16
+ },
17
+ {
18
+ name: "Sceptic",
19
+ lens: "Weights refuted entries — what has failed and why",
20
+ systemFragment: "Focus on `refuted` Oracle entries. What has already failed in this codebase and why? " +
21
+ "Look for signs this design repeats past mistakes. Surface failure modes explicitly.",
22
+ },
23
+ {
24
+ name: "Systems thinker",
25
+ lens: "Looks for patterns across all entries — second-order effects",
26
+ systemFragment: "Read all Oracle entries as a system. Look for patterns, dependencies, and second-order " +
27
+ "effects. What does the design miss about how the system as a whole behaves?",
28
+ },
29
+ {
30
+ name: "Risk analyst",
31
+ lens: "Weights open entries — unresolved questions and unknowns",
32
+ systemFragment: "Focus on `open` Oracle entries — unresolved questions and unknowns. " +
33
+ "What has not been confirmed? What uncertainty does this design carry? " +
34
+ "Flag every assumption that has not been validated by an outcome.",
35
+ },
36
+ {
37
+ name: "Evidence auditor",
38
+ lens: "Focuses on gaps — what Oracle does NOT contain",
39
+ systemFragment: "Look for what is ABSENT from the Oracle evidence. What decisions is this design making " +
40
+ "without any codebase evidence to support them? " +
41
+ "Name every gap — a gap is not a reason to reject, but it must be surfaced.",
42
+ },
43
+ ];
44
+ //# sourceMappingURL=personas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personas.js","sourceRoot":"","sources":["../../modules/council/personas.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,MAAM,CAAC,MAAM,gBAAgB,GAA8B;IACzD;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,8DAA8D;QACpE,cAAc,EACZ,iFAAiF;YACjF,gFAAgF;KACnF;IACD;QACE,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,mDAAmD;QACzD,cAAc,EACZ,uFAAuF;YACvF,qFAAqF;KACxF;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,8DAA8D;QACpE,cAAc,EACZ,yFAAyF;YACzF,6EAA6E;KAChF;IACD;QACE,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,0DAA0D;QAChE,cAAc,EACZ,sEAAsE;YACtE,wEAAwE;YACxE,kEAAkE;KACrE;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,gDAAgD;QACtD,cAAc,EACZ,yFAAyF;YACzF,iDAAiD;YACjD,4EAA4E;KAC/E;CACF,CAAA"}
@@ -0,0 +1,13 @@
1
+ import type { LLMProvider, OracleResult } from "../shared/types.js";
2
+ import type { AdvisorResponse } from "./advisors.js";
3
+ export interface ReviewerResponse {
4
+ reviewerId: string;
5
+ review: string;
6
+ }
7
+ /**
8
+ * Run all reviewers in parallel.
9
+ * Each reviewer receives the anonymised advisor responses and the original evidence pack.
10
+ * Anonymisation prevents position bias and persona deference.
11
+ */
12
+ export declare function fanOutReviewers(advisorResponses: AdvisorResponse[], evidence: OracleResult[], reviewerCount: number, llm: LLMProvider, model?: string): Promise<ReviewerResponse[]>;
13
+ //# sourceMappingURL=reviewers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewers.d.ts","sourceRoot":"","sources":["../../modules/council/reviewers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAEpD,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;CACf;AAoCD;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,gBAAgB,EAAE,eAAe,EAAE,EACnC,QAAQ,EAAE,YAAY,EAAE,EACxB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,WAAW,EAChB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA2B7B"}
@@ -0,0 +1,59 @@
1
+ import { entryText } from "../shared/types.js";
2
+ /**
3
+ * Shuffle advisor responses and label them A–Z.
4
+ * Prevents reviewers deferring to confident responses by position or persona name.
5
+ */
6
+ function anonymise(responses) {
7
+ const shuffled = [...responses].sort(() => Math.random() - 0.5);
8
+ return shuffled
9
+ .map((r, i) => `## Advisor ${String.fromCharCode(65 + i)}\n${r.response}`)
10
+ .join("\n\n---\n\n");
11
+ }
12
+ function formatEvidenceSummary(evidence) {
13
+ if (evidence.length === 0)
14
+ return "No Oracle evidence available.";
15
+ return evidence
16
+ .map(e => `[${e.id}] (${e.status}) ${entryText(e)}`)
17
+ .join("\n");
18
+ }
19
+ const REVIEWER_SYSTEM_PROMPT = [
20
+ "You are a Council reviewer. You evaluate the quality of advisor responses.",
21
+ "",
22
+ "You are NOT deciding whether the design is correct.",
23
+ "You are assessing the reasoning quality of each advisor response:",
24
+ "",
25
+ "1. Does the advisor actually use the Oracle evidence, or reason from general knowledge?",
26
+ "2. Are Oracle entry IDs cited? Do those citations match the evidence provided?",
27
+ "3. Is the response internally consistent?",
28
+ "4. Which responses provide the strongest evidence-backed reasoning?",
29
+ "5. Which responses make unsupported claims?",
30
+ "",
31
+ "Be critical. Evidence quality matters more than conclusion confidence.",
32
+ "Keep your review under 400 words.",
33
+ ].join("\n");
34
+ /**
35
+ * Run all reviewers in parallel.
36
+ * Each reviewer receives the anonymised advisor responses and the original evidence pack.
37
+ * Anonymisation prevents position bias and persona deference.
38
+ */
39
+ export async function fanOutReviewers(advisorResponses, evidence, reviewerCount, llm, model) {
40
+ const anonymisedResponses = anonymise(advisorResponses);
41
+ const evidenceSummary = formatEvidenceSummary(evidence);
42
+ return Promise.all(Array.from({ length: reviewerCount }, async (_, i) => {
43
+ const userPrompt = [
44
+ "## Advisor Responses (anonymised)",
45
+ anonymisedResponses,
46
+ "",
47
+ "## Oracle Evidence (for cross-referencing citations)",
48
+ evidenceSummary,
49
+ "",
50
+ "Review each advisor response for evidence quality.",
51
+ ].join("\n");
52
+ const review = await llm([
53
+ { role: "system", content: REVIEWER_SYSTEM_PROMPT },
54
+ { role: "user", content: userPrompt },
55
+ ], model);
56
+ return { reviewerId: `reviewer-${i + 1}`, review };
57
+ }));
58
+ }
59
+ //# sourceMappingURL=reviewers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewers.js","sourceRoot":"","sources":["../../modules/council/reviewers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAQ9C;;;GAGG;AACH,SAAS,SAAS,CAAC,SAA4B;IAC7C,MAAM,QAAQ,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAA;IAC/D,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;SACzE,IAAI,CAAC,aAAa,CAAC,CAAA;AACxB,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAwB;IACrD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,+BAA+B,CAAA;IACjE,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;SACnD,IAAI,CAAC,IAAI,CAAC,CAAA;AACf,CAAC;AAED,MAAM,sBAAsB,GAAG;IAC7B,4EAA4E;IAC5E,EAAE;IACF,qDAAqD;IACrD,mEAAmE;IACnE,EAAE;IACF,yFAAyF;IACzF,gFAAgF;IAChF,2CAA2C;IAC3C,qEAAqE;IACrE,6CAA6C;IAC7C,EAAE;IACF,wEAAwE;IACxE,mCAAmC;CACpC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,gBAAmC,EACnC,QAAwB,EACxB,aAAqB,EACrB,GAAgB,EAChB,KAAc;IAEd,MAAM,mBAAmB,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAA;IACvD,MAAM,eAAe,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAA;IAEvD,OAAO,OAAO,CAAC,GAAG,CAChB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAA6B,EAAE;QAC9E,MAAM,UAAU,GAAG;YACjB,mCAAmC;YACnC,mBAAmB;YACnB,EAAE;YACF,sDAAsD;YACtD,eAAe;YACf,EAAE;YACF,oDAAoD;SACrD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEZ,MAAM,MAAM,GAAG,MAAM,GAAG,CACtB;YACE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,sBAAsB,EAAE;YACnD,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE;SACtC,EACD,KAAK,CACN,CAAA;QAED,OAAO,EAAE,UAAU,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,CAAA;IACpD,CAAC,CAAC,CACH,CAAA;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { OracleResult } from "../shared/types.js";
2
+ import type { RiskAssessment } from "./types.js";
3
+ /**
4
+ * Classify the risk level of a proposed change from its text and evidence.
5
+ *
6
+ * Risk determines Council mode — avoid running full fan-out on low-risk changes:
7
+ * low → jury-only (no advisor/reviewer fan-out)
8
+ * medium → lite (Jury + 2 reviewers)
9
+ * high → full (standard 5 advisors + 5 reviewers)
10
+ * critical → full (same as high, but Chronicle entry flags for human architecture review)
11
+ *
12
+ * Refuted Oracle entries also elevate risk — a known failure mode in the evidence pack
13
+ * means the design is repeating something that already went wrong.
14
+ */
15
+ export declare function classifyRisk(outcome: string, design: string, evidence: OracleResult[]): RiskAssessment;
16
+ //# sourceMappingURL=risk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk.d.ts","sourceRoot":"","sources":["../../modules/council/risk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAA0B,cAAc,EAAE,MAAM,YAAY,CAAA;AAyCxE;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,YAAY,EAAE,GACvB,cAAc,CA8BhB"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Patterns that trigger risk escalation.
3
+ * Each entry has a level (the minimum risk level it triggers) and a reason label.
4
+ */
5
+ const RISK_RULES = [
6
+ // Critical — always run full Council + flag for human architecture review
7
+ { pattern: /\b(auth(?:entication|orization)?|jwt|token|session|password|oauth|credential|bearer)\b/i, level: "critical", reason: "authentication or authorisation logic" },
8
+ { pattern: /\b(payment|stripe|charge|billing|checkout|refund|subscription)\b/i, level: "critical", reason: "payment or billing logic" },
9
+ { pattern: /\b(encrypt|decrypt|private\s+key|certificate|tls|ssl|hmac|cipher)\b/i, level: "critical", reason: "cryptography or key management" },
10
+ { pattern: /\b(delete\s+all|drop\s+table|truncate|wipe|destroy.*data|hard\s+delete)\b/i, level: "critical", reason: "irreversible data deletion" },
11
+ // High — full Council
12
+ { pattern: /\b(migrat(?:ion|e)|alter\s+table|schema\s+change|not\s+null|backfill|pg_repack|shadow\s+column)\b/i, level: "high", reason: "database schema migration" },
13
+ { pattern: /\b(permission|role(?:s)?|acl|rbac|access\s+control|entitlement)\b/i, level: "high", reason: "permissions or access control" },
14
+ { pattern: /\b(pii|personal\s+data|gdpr|ccpa|email(?:\s+address)?|phone(?:\s+number)?|ssn|passport)\b/i, level: "high", reason: "PII or compliance-regulated data" },
15
+ { pattern: /\b(api\s+key|secret(?:s)?|private\s+key|credentials?)\b/i, level: "high", reason: "secrets or credentials handling" },
16
+ // Medium — Jury + lite Council
17
+ { pattern: /\b(cache|redis|memcached|invalidat(?:e|ion))\b/i, level: "medium", reason: "cache strategy" },
18
+ { pattern: /\b(rate\s*limit|throttl(?:e|ing)|quota)\b/i, level: "medium", reason: "rate limiting or throttling" },
19
+ { pattern: /\b(webhook|event|queue|pubsub|kafka|rabbitmq|sns|sqs)\b/i, level: "medium", reason: "async event or messaging" },
20
+ { pattern: /\b(deploy(?:ment)?|ci(?:\/cd)?|docker|kubernetes|infra(?:structure)?)\b/i, level: "medium", reason: "deployment or infrastructure" },
21
+ ];
22
+ const RISK_ORDER = ["low", "medium", "high", "critical"];
23
+ function maxLevel(a, b) {
24
+ return RISK_ORDER.indexOf(a) >= RISK_ORDER.indexOf(b) ? a : b;
25
+ }
26
+ function councilModeForLevel(level) {
27
+ switch (level) {
28
+ case "low": return "jury-only";
29
+ case "medium": return "lite";
30
+ case "high": return "full";
31
+ case "critical": return "full";
32
+ }
33
+ }
34
+ /**
35
+ * Classify the risk level of a proposed change from its text and evidence.
36
+ *
37
+ * Risk determines Council mode — avoid running full fan-out on low-risk changes:
38
+ * low → jury-only (no advisor/reviewer fan-out)
39
+ * medium → lite (Jury + 2 reviewers)
40
+ * high → full (standard 5 advisors + 5 reviewers)
41
+ * critical → full (same as high, but Chronicle entry flags for human architecture review)
42
+ *
43
+ * Refuted Oracle entries also elevate risk — a known failure mode in the evidence pack
44
+ * means the design is repeating something that already went wrong.
45
+ */
46
+ export function classifyRisk(outcome, design, evidence) {
47
+ const text = `${outcome} ${design}`;
48
+ let level = "low";
49
+ const reasons = [];
50
+ for (const rule of RISK_RULES) {
51
+ if (rule.pattern.test(text)) {
52
+ const matched = maxLevel(level, rule.level);
53
+ if (matched !== level || !reasons.includes(rule.reason)) {
54
+ level = matched;
55
+ reasons.push(rule.reason);
56
+ }
57
+ }
58
+ }
59
+ // Refuted entries in the evidence pack are a direct risk signal
60
+ const refutedCount = evidence.filter(e => e.status === "refuted").length;
61
+ if (refutedCount > 0) {
62
+ const refutedRisk = refutedCount >= 2 ? "high" : "medium";
63
+ if (RISK_ORDER.indexOf(refutedRisk) > RISK_ORDER.indexOf(level)) {
64
+ level = maxLevel(level, refutedRisk);
65
+ }
66
+ reasons.push(`${refutedCount} refuted Chronicle ${refutedCount === 1 ? "entry" : "entries"} in evidence pack`);
67
+ }
68
+ return {
69
+ level,
70
+ reasons: reasons.length > 0 ? reasons : ["no sensitive patterns detected"],
71
+ council_mode: councilModeForLevel(level),
72
+ };
73
+ }
74
+ //# sourceMappingURL=risk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk.js","sourceRoot":"","sources":["../../modules/council/risk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import type { OracleResult, LLMProvider, OracleClient } from "../shared/types.js";
2
+ import type { JuryOutput } from "../jury/types.js";
3
+ export interface CouncilInput {
4
+ /** What needs to be achieved. */
5
+ outcome: string;
6
+ /** Proposed approach from the Designer. */
7
+ design: string;
8
+ /** Same evidence pack the Jury received. */
9
+ evidence: OracleResult[];
10
+ /** Jury output — drives the council brief and confidence. */
11
+ jury_output: JuryOutput;
12
+ }
13
+ /** A finding that must be resolved before the design can proceed. */
14
+ export interface BlockerItem {
15
+ issue: string;
16
+ /** Oracle entry IDs that evidence this blocker. */
17
+ evidence: string[];
18
+ /** What must change in the design to resolve this. */
19
+ required_fix: string;
20
+ }
21
+ /** A finding that should be addressed but does not block proceeding. */
22
+ export interface WarningItem {
23
+ issue: string;
24
+ suggested_fix?: string;
25
+ }
26
+ /** Validates that cited Oracle IDs actually appeared in the evidence pack. */
27
+ export interface CitationValidation {
28
+ /** IDs that were cited and exist in the evidence pack. */
29
+ valid_ids: string[];
30
+ /** IDs that were cited but were NOT in the evidence pack — likely hallucinated. */
31
+ hallucinated_ids: string[];
32
+ }
33
+ /** How advisors split on their recommendation. Signals disagreement level. */
34
+ export interface AdvisorSplit {
35
+ proceed: number;
36
+ redesign: number;
37
+ "investigate-more": number;
38
+ }
39
+ export interface CouncilOutput {
40
+ satisfied: boolean;
41
+ /** Chairman synthesis — every material conclusion cites Oracle entry IDs. */
42
+ verdict: string;
43
+ /**
44
+ * Findings that MUST be resolved before the design proceeds.
45
+ * Each blocker names the issue, the Oracle evidence behind it, and the required fix.
46
+ */
47
+ blockers: BlockerItem[];
48
+ /**
49
+ * Findings that SHOULD be addressed but don't block execution.
50
+ */
51
+ warnings: WarningItem[];
52
+ /** Flat list of all issues raised — backwards compatible with existing consumers. */
53
+ challenges: string[];
54
+ /** Oracle entry IDs referenced in the verdict. */
55
+ evidence_cited: string[];
56
+ /** Validation of whether cited IDs exist in the evidence pack. */
57
+ citation_validation: CitationValidation;
58
+ /** How advisors split on recommendation — high disagreement = escalate. */
59
+ advisor_split: AdvisorSplit;
60
+ recommendation: "proceed" | "redesign" | "investigate-more";
61
+ }
62
+ export interface CouncilModels {
63
+ /** Model for the framer step. */
64
+ frame?: string;
65
+ /** Model for advisors. High volume — cheaper model appropriate here. */
66
+ advisors?: string;
67
+ /** Model for reviewers. Critical analysis — stronger model recommended. */
68
+ reviewers?: string;
69
+ /** Model for the chairman. Synthesis — best available model recommended. */
70
+ chairman?: string;
71
+ }
72
+ export interface CouncilDeps {
73
+ llm: LLMProvider;
74
+ oracle: OracleClient;
75
+ /** Number of advisors to run in parallel. Default: 5. */
76
+ advisorCount?: number;
77
+ /** Number of reviewers to run in parallel. Default: 5. */
78
+ reviewerCount?: number;
79
+ models?: CouncilModels;
80
+ }
81
+ export type RiskLevel = "low" | "medium" | "high" | "critical";
82
+ /**
83
+ * Determines which Council mode to use.
84
+ * skip → Oracle query only, no LLM validation
85
+ * jury-only → Jury scores, Council skipped entirely (low-risk fast path)
86
+ * lite → Jury + 1–2 reviewers (no full advisor fan-out)
87
+ * full → Full Council (default 5 advisors + 5 reviewers + Chairman)
88
+ */
89
+ export type CouncilMode = "skip" | "jury-only" | "lite" | "full";
90
+ export interface RiskAssessment {
91
+ level: RiskLevel;
92
+ reasons: string[];
93
+ council_mode: CouncilMode;
94
+ }
95
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../modules/council/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAElD,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAA;IACd,4CAA4C;IAC5C,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,6DAA6D;IAC7D,WAAW,EAAE,UAAU,CAAA;CACxB;AAED,qEAAqE;AACrE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,mDAAmD;IACnD,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,sDAAsD;IACtD,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,wEAAwE;AACxE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,8EAA8E;AAC9E,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,mFAAmF;IACnF,gBAAgB,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED,8EAA8E;AAC9E,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,kBAAkB,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,OAAO,CAAA;IAClB,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB;;OAEG;IACH,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,qFAAqF;IACrF,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,kDAAkD;IAClD,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,kEAAkE;IAClE,mBAAmB,EAAE,kBAAkB,CAAA;IACvC,2EAA2E;IAC3E,aAAa,EAAE,YAAY,CAAA;IAC3B,cAAc,EAAE,SAAS,GAAG,UAAU,GAAG,kBAAkB,CAAA;CAC5D;AAED,MAAM,WAAW,aAAa;IAC5B,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,WAAW,CAAA;IAChB,MAAM,EAAE,YAAY,CAAA;IACpB,yDAAyD;IACzD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,MAAM,CAAC,EAAE,aAAa,CAAA;CACvB;AAID,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAA;AAE9D;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,CAAA;AAEhE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,SAAS,CAAA;IAChB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,YAAY,EAAE,WAAW,CAAA;CAC1B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../modules/council/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import type { JuryInput, JuryOutput, JuryDeps } from "./types.js";
2
+ /**
3
+ * Evaluate a proposed design against Oracle evidence.
4
+ *
5
+ * Scores across four dimensions (evidence support, feasibility, risk, completeness)
6
+ * and returns a structured JuryOutput. The council_brief is always derived from the
7
+ * confidence score — the LLM value is overridden to ensure deterministic routing.
8
+ *
9
+ * Throws if the LLM returns non-JSON or a response that fails schema validation.
10
+ * Never silently defaults to a passing score.
11
+ */
12
+ export declare function evaluate(input: JuryInput, deps: JuryDeps): Promise<JuryOutput>;
13
+ //# sourceMappingURL=evaluate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../modules/jury/evaluate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAgEjE;;;;;;;;;GASG;AACH,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,UAAU,CAAC,CA2DrB"}