0xray 4.0.40 → 4.0.42

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 (190) hide show
  1. package/.grok-plugin/plugin.json +1 -1
  2. package/.opencode/agents/api-design.yml +31 -0
  3. package/.opencode/agents/architect.yml +15 -0
  4. package/.opencode/agents/architecture-patterns.yml +14 -0
  5. package/.opencode/agents/auto-format.yml +14 -0
  6. package/.opencode/agents/backend-engineer.yml +12 -0
  7. package/.opencode/agents/boot-orchestrator.yml +14 -0
  8. package/.opencode/agents/bug-triage-specialist.yml +15 -0
  9. package/.opencode/agents/code-analyzer.yml +12 -0
  10. package/.opencode/agents/code-reviewer.yml +14 -0
  11. package/.opencode/agents/content-creator.yml +12 -0
  12. package/.opencode/agents/database-engineer.yml +12 -0
  13. package/.opencode/agents/devops-engineer.yml +12 -0
  14. package/.opencode/agents/framework-compliance-audit.yml +14 -0
  15. package/.opencode/agents/frontend-engineer.yml +12 -0
  16. package/.opencode/agents/frontend-ui-ux-engineer.yml +12 -0
  17. package/.opencode/agents/git-workflow.yml +15 -0
  18. package/.opencode/agents/growth-strategist.yml +12 -0
  19. package/.opencode/agents/hermes-agent.yml +12 -0
  20. package/.opencode/agents/inference-improve.yml +12 -0
  21. package/.opencode/agents/lint.yml +14 -0
  22. package/.opencode/agents/log-monitor.yml +12 -0
  23. package/.opencode/agents/mobile-developer.yml +12 -0
  24. package/.opencode/agents/model-health-check.yml +12 -0
  25. package/.opencode/agents/multimodal-looker.yml +12 -0
  26. package/.opencode/agents/performance-analysis.yml +12 -0
  27. package/.opencode/agents/performance-engineer.yml +12 -0
  28. package/.opencode/agents/performance-optimization.yml +12 -0
  29. package/.opencode/agents/processor-pipeline.yml +14 -0
  30. package/.opencode/agents/project-analysis.yml +12 -0
  31. package/.opencode/agents/refactorer.yml +12 -0
  32. package/.opencode/agents/researcher.yml +12 -0
  33. package/.opencode/agents/security-auditor.yml +12 -0
  34. package/.opencode/agents/security-scan.yml +12 -0
  35. package/.opencode/agents/seo-consultant.yml +12 -0
  36. package/.opencode/agents/session-management.yml +12 -0
  37. package/.opencode/agents/state-manager.yml +12 -0
  38. package/.opencode/agents/storyteller.yml +12 -0
  39. package/.opencode/agents/strategist.yml +12 -0
  40. package/.opencode/agents/tech-writer.yml +12 -0
  41. package/.opencode/agents/testing-best-practices.yml +12 -0
  42. package/.opencode/agents/testing-lead.yml +12 -0
  43. package/.opencode/agents/ui-ux-design.yml +12 -0
  44. package/.opencode/codex.codex +8 -0
  45. package/.opencode/commands/auto-format.md +99 -0
  46. package/.opencode/commands/auto-summary-capture.md +90 -0
  47. package/.opencode/commands/dependency-audit.md +184 -0
  48. package/.opencode/commands/enforcer-daily-scan.md +137 -0
  49. package/.opencode/commands/framework-compliance-audit.md +205 -0
  50. package/.opencode/commands/interactive-validator.md +75 -0
  51. package/.opencode/commands/job-summary-logger.md +68 -0
  52. package/.opencode/commands/lint.md +11 -0
  53. package/.opencode/commands/mode-switch.md +95 -0
  54. package/.opencode/commands/model-health-check.md +186 -0
  55. package/.opencode/commands/performance-analysis.md +144 -0
  56. package/.opencode/commands/pre-commit-introspection.md +185 -0
  57. package/.opencode/commands/pre-commit-introspection.sh +133 -0
  58. package/.opencode/commands/security-scan.md +157 -0
  59. package/.opencode/commands/sisyphus-validation.md +128 -0
  60. package/.opencode/commands/summary-logger.md +83 -0
  61. package/.opencode/enforcer-config.json +282 -0
  62. package/.opencode/skills/orchestrator/SKILL.md +12 -0
  63. package/.opencode/workflows/post-deployment-audit.yml +123 -0
  64. package/.xray/features.json +1 -1
  65. package/.xray/features.schema.json +1 -1
  66. package/AGENTS-consumer.md +2 -0
  67. package/AGENTS.md +2 -0
  68. package/README.md +52 -12
  69. package/SKILLS.md +2 -0
  70. package/dist/AGENTS.md +2 -0
  71. package/dist/CHANGELOG.md +29 -0
  72. package/dist/README.md +52 -12
  73. package/dist/SKILLS.md +2 -0
  74. package/dist/cli/commands/openclaw-install.js +1 -1
  75. package/dist/cli/index.js +12 -0
  76. package/dist/enforcement/index.d.ts +4 -0
  77. package/dist/enforcement/index.js +4 -0
  78. package/dist/enforcement/validators/code-quality-validators.js +6 -4
  79. package/dist/governance/llm-governance-provider.d.ts +7 -1
  80. package/dist/governance/llm-governance-provider.js +72 -14
  81. package/dist/governance/local-confer.d.ts +4 -1
  82. package/dist/governance/local-confer.js +22 -1
  83. package/dist/integrations/grok/grok-cli.js +10 -37
  84. package/dist/integrations/grok/hooks/grok-hook-utils.js +29 -2
  85. package/dist/integrations/grok/hooks/session-start.js +2 -20
  86. package/dist/integrations/hooks/confer-hook-runtime.mjs +23 -1
  87. package/dist/integrations/hooks/goggles-mcp.mjs +36 -4
  88. package/dist/integrations/hooks/goggles-pipeline.mjs +55 -15
  89. package/dist/integrations/hooks/goggles-planes.json +13 -4
  90. package/dist/integrations/hooks/plates.cjs +22 -0
  91. package/dist/integrations/hooks/session-note-index.cjs +298 -0
  92. package/dist/integrations/hooks/session-note-index.mjs +22 -0
  93. package/dist/integrations/hooks/sleeve.cjs +335 -0
  94. package/dist/integrations/hooks/sleeve.mjs +18 -0
  95. package/dist/integrations/hooks/station-hook-runtime.cjs +205 -9
  96. package/dist/integrations/hooks/wake-cascade.cjs +102 -0
  97. package/dist/integrations/hooks/wake-cascade.mjs +16 -0
  98. package/dist/integrations/openclaw/plugin/xray-pre-tool/package.json +1 -1
  99. package/dist/mcps/architect-tools.server.d.ts +6 -0
  100. package/dist/mcps/architect-tools.server.js +19 -2
  101. package/dist/mcps/config/server-config-registry.js +8 -6
  102. package/dist/mcps/governance.server.d.ts +1 -0
  103. package/dist/mcps/governance.server.js +46 -0
  104. package/dist/mcps/knowledge-skills/code-review.server.js +7 -0
  105. package/dist/mcps/knowledge-skills/security-audit.server.js +5 -3
  106. package/dist/mcps/mcp-client.js +1 -1
  107. package/dist/mcps/orchestrator/handlers/complexity-handler.js +2 -2
  108. package/dist/mcps/researcher.server.js +12 -3
  109. package/dist/memory-routing/plates.d.ts +1 -1
  110. package/dist/memory-routing/plates.js +1 -0
  111. package/dist/nucleus/autonomy-kernel.d.ts +2 -0
  112. package/dist/nucleus/autonomy-kernel.js +17 -13
  113. package/dist/nucleus/confer-host.d.ts +35 -0
  114. package/dist/nucleus/confer-host.js +55 -0
  115. package/dist/nucleus/confer.d.ts +19 -3
  116. package/dist/nucleus/confer.js +111 -55
  117. package/dist/nucleus/lead-dev-plan-persistence.js +4 -2
  118. package/dist/nucleus/suit-temperament.d.ts +1 -1
  119. package/dist/nucleus/suit-temperament.js +2 -2
  120. package/dist/nucleus/synthesis-consult-receipt.d.ts +7 -1
  121. package/dist/nucleus/synthesis-consult-receipt.js +86 -35
  122. package/dist/reporting/framework-reporting-system.js +2 -5
  123. package/dist/reporting/log-parser.d.ts +2 -0
  124. package/dist/reporting/log-parser.js +7 -6
  125. package/dist/skills/orchestrator/SKILL.md +12 -0
  126. package/docs-site/docs/plates/activity-log.md +1 -1
  127. package/docs-site/docs/plates/boot.md +2 -0
  128. package/docs-site/docs/plates/centrifuge.md +30 -0
  129. package/docs-site/docs/plates/cursor-compact.md +1 -1
  130. package/docs-site/docs/plates/glossary.md +1 -2
  131. package/docs-site/docs/plates/goggles.md +4 -0
  132. package/docs-site/docs/plates/governance.md +2 -0
  133. package/docs-site/docs/plates/grok-compact.md +1 -1
  134. package/docs-site/docs/plates/grokbot.md +1 -1
  135. package/docs-site/docs/plates/host-pack.md +2 -0
  136. package/docs-site/docs/plates/house.md +1 -1
  137. package/docs-site/docs/plates/index.md +3 -1
  138. package/docs-site/docs/plates/inference-files.md +1 -1
  139. package/docs-site/docs/plates/kept-line.md +1 -1
  140. package/docs-site/docs/plates/kits.md +2 -0
  141. package/docs-site/docs/plates/lens-gate.md +1 -1
  142. package/docs-site/docs/plates/lens-page.md +1 -1
  143. package/docs-site/docs/plates/live-mesh.md +1 -1
  144. package/docs-site/docs/plates/memory-recall.md +4 -0
  145. package/docs-site/docs/plates/notes-page.md +2 -1
  146. package/docs-site/docs/plates/orchestration.md +2 -0
  147. package/docs-site/docs/plates/package-face.md +1 -1
  148. package/docs-site/docs/plates/payload-heat.md +1 -1
  149. package/docs-site/docs/plates/pickup-stamp.md +1 -1
  150. package/docs-site/docs/plates/pre-tool.md +1 -1
  151. package/docs-site/docs/plates/processor.md +2 -0
  152. package/docs-site/docs/plates/record-map.md +2 -1
  153. package/docs-site/docs/plates/reflection-page.md +1 -1
  154. package/docs-site/docs/plates/reporting.md +2 -0
  155. package/docs-site/docs/plates/review.md +1 -1
  156. package/docs-site/docs/plates/routing.md +2 -0
  157. package/docs-site/docs/plates/session-capture.md +1 -1
  158. package/docs-site/docs/plates/site-manual.md +1 -1
  159. package/docs-site/docs/plates/stamp-plate.md +1 -1
  160. package/docs-site/docs/plates/station-card.md +4 -1
  161. package/docs-site/docs/plates/station-heat.md +1 -1
  162. package/docs-site/docs/plates/suit-organs.md +1 -1
  163. package/docs-site/docs/plates/suit-settings.md +1 -1
  164. package/docs-site/docs/plates/suit-wear.md +3 -1
  165. package/docs-site/docs/plates/suit.md +2 -0
  166. package/docs-site/docs/plates/trail-state.md +1 -1
  167. package/docs-site/docs/plates/work-fresh.md +1 -1
  168. package/docs-site/docs/plates/write-home.md +1 -1
  169. package/llms.txt +2 -0
  170. package/package.json +2 -2
  171. package/scripts/mjs/verify-confer-core.mjs +153 -29
  172. package/scripts/mjs/verify-user-aside-core.mjs +3 -4
  173. package/scripts/node/bridge-mcp-wiring.cjs +273 -9
  174. package/scripts/node/confer-switch.cjs +66 -0
  175. package/scripts/node/install-bridges.cjs +188 -60
  176. package/scripts/node/setup.cjs +2 -46
  177. package/src/integrations/openclaw/plugin/xray-pre-tool/package.json +1 -1
  178. package/src/mcps/architect-tools.server.ts +26 -2
  179. package/src/mcps/config/__tests__/server-config-registry.test.ts +15 -6
  180. package/src/mcps/config/server-config-registry.ts +9 -6
  181. package/src/mcps/governance.server.ts +49 -0
  182. package/src/mcps/knowledge-skills/code-review.server.ts +8 -0
  183. package/src/mcps/knowledge-skills/security-audit.server.ts +11 -12
  184. package/src/mcps/mcp-client.ts +1 -1
  185. package/src/mcps/orchestrator/handlers/complexity-handler.ts +2 -1
  186. package/src/mcps/researcher.server.ts +19 -10
  187. package/src/skills/orchestrator/SKILL.md +12 -0
  188. package/vendor/@0xray/repertoire/scripts/run-live-synthesis-checkpoint.mjs +5 -51
  189. package/xray/features.json +1 -1
  190. package/xray/features.schema.json +1 -1
@@ -29,6 +29,7 @@ import * as fs from "fs";
29
29
  import * as path from "path";
30
30
  import { fileURLToPath } from "url";
31
31
  import { randomUUID } from "crypto";
32
+ import { applyConferConsultResult } from "../nucleus/confer.js";
32
33
  import { getGovernanceService } from "../governance/governance-service.js";
33
34
  import { getCodexPolicyService } from "../governance/codex-policy.service.js";
34
35
  import { initializeGovernanceIntegration, shutdownGovernanceIntegration } from "../integrations/governance/index.js";
@@ -136,6 +137,24 @@ class GovernanceServer extends XrayKnowledgeSkillBase {
136
137
  required: [],
137
138
  },
138
139
  },
140
+ {
141
+ name: "record_confer_receipt",
142
+ description:
143
+ "Record a confer verdict written by the wearing TUI. " +
144
+ "The TUI already called the seat's MCP server. This tool stores the receipt. " +
145
+ "Only Verdict: PASS completes the consult todo.",
146
+ inputSchema: {
147
+ type: "object",
148
+ properties: {
149
+ todoId: { type: "string", description: "Consult todo id, such as s.1" },
150
+ subagent: { type: "string", description: "researcher, architect-tools, or code-review" },
151
+ sessionId: { type: "string", description: "Plan session id" },
152
+ outputText: { type: "string", description: "Host verdict text, including a Verdict line" },
153
+ projectRoot: { type: "string", description: "Checkout root. Defaults to XRAY_ROOT or the process cwd." },
154
+ },
155
+ required: ["todoId", "subagent", "sessionId", "outputText"],
156
+ },
157
+ },
139
158
  {
140
159
  name: "get_active_codex",
141
160
  description:
@@ -159,6 +178,7 @@ class GovernanceServer extends XrayKnowledgeSkillBase {
159
178
  "govern_proposals": async (args) => this.handleGovernProposals(this.validateGovernProposalsArgs(args)),
160
179
  "govern_reflection": async (args) => this.handleGovernReflection(this.validateGovernReflectionArgs(args)),
161
180
  "get_active_codex": async (args) => this.handleGetActiveCodex(args as { includeRaw?: boolean }),
181
+ "record_confer_receipt": async (args) => this.handleRecordConferReceipt(args),
162
182
  };
163
183
  this.setupToolHandlers();
164
184
  }
@@ -210,6 +230,8 @@ class GovernanceServer extends XrayKnowledgeSkillBase {
210
230
  return await this.handleGovernReflection(this.validateGovernReflectionArgs(args));
211
231
  case "get_active_codex":
212
232
  return await this.handleGetActiveCodex(args as { includeRaw?: boolean });
233
+ case "record_confer_receipt":
234
+ return await this.handleRecordConferReceipt(args);
213
235
  default:
214
236
  throw new Error(`Unknown tool: ${name}`);
215
237
  }
@@ -334,6 +356,33 @@ class GovernanceServer extends XrayKnowledgeSkillBase {
334
356
  });
335
357
  }
336
358
 
359
+ private async handleRecordConferReceipt(args: unknown): Promise<CallToolResult> {
360
+ if (!args || typeof args !== "object") {
361
+ throw new Error("record_confer_receipt requires an object argument");
362
+ }
363
+ const obj = args as Record<string, unknown>;
364
+ const todoId = typeof obj.todoId === "string" ? obj.todoId.trim() : "";
365
+ const subagent = typeof obj.subagent === "string" ? obj.subagent.trim() : "";
366
+ const sessionId = typeof obj.sessionId === "string" ? obj.sessionId.trim() : "";
367
+ const outputText = typeof obj.outputText === "string" ? obj.outputText : "";
368
+ if (!todoId || !subagent || !sessionId || !outputText.trim()) {
369
+ throw new Error("record_confer_receipt requires todoId, subagent, sessionId, and outputText");
370
+ }
371
+ const projectRoot =
372
+ typeof obj.projectRoot === "string" && obj.projectRoot.trim()
373
+ ? obj.projectRoot
374
+ : process.env.XRAY_ROOT || process.cwd();
375
+ const result = applyConferConsultResult(todoId, subagent, sessionId, outputText, projectRoot);
376
+ return {
377
+ content: [
378
+ {
379
+ type: "text",
380
+ text: JSON.stringify(result),
381
+ },
382
+ ],
383
+ };
384
+ }
385
+
337
386
  private async handleGetActiveCodex(args: { includeRaw?: boolean }): Promise<CallToolResult> {
338
387
  const includeRaw = args?.includeRaw === true;
339
388
  const snapshot = await getCodexPolicyService().getCurrentCodex(includeRaw);
@@ -14,6 +14,7 @@ import {
14
14
  tryLLMGovernance,
15
15
  } from "../../governance/llm-governance-provider.js";
16
16
  import { formatGovernanceVoteText, localConferVote } from "../../governance/local-confer.js";
17
+ import { buildHostConferEvidence } from "../../nucleus/confer-host.js";
17
18
 
18
19
  interface CodeReviewResult {
19
20
  file: string;
@@ -439,6 +440,13 @@ class XrayCodeReviewServer extends XrayKnowledgeSkillBase {
439
440
  async analyzeProposal(args: AnalyzeProposalArgs) {
440
441
  const { proposalTitle = "", proposalDescription = "", evidence = [], proposalType = "" } = args;
441
442
 
443
+ if (proposalType === "synthesis-confer") {
444
+ const packet = [proposalTitle, proposalDescription, ...(evidence || [])].filter(Boolean).join("\n\n");
445
+ return {
446
+ content: [{ type: "text", text: buildHostConferEvidence("code-review", packet) }],
447
+ };
448
+ }
449
+
442
450
  const vote =
443
451
  (await tryLLMGovernance(
444
452
  "code-review",
@@ -8,10 +8,7 @@
8
8
  import * as fs from "fs";
9
9
  import * as path from "path";
10
10
  import { XrayKnowledgeSkillBase } from "../shared/knowledge-skill-base.js";
11
- import {
12
- isGovernanceLlmConfigured,
13
- tryLLMGovernance,
14
- } from "../../governance/llm-governance-provider.js";
11
+ import { attemptLLMGovernance } from "../../governance/llm-governance-provider.js";
15
12
  import { formatGovernanceVoteText, localConferVote } from "../../governance/local-confer.js";
16
13
 
17
14
  interface SecurityVulnerability {
@@ -999,17 +996,19 @@ class XraySecurityAuditServer extends XrayKnowledgeSkillBase {
999
996
  async analyzeProposal(args: AnalyzeProposalArgs) {
1000
997
  const { proposalTitle = "", proposalDescription = "", evidence = [], proposalType = "" } = args;
1001
998
 
999
+ const attempt = await attemptLLMGovernance(
1000
+ "security-audit",
1001
+ proposalTitle,
1002
+ proposalDescription,
1003
+ evidence,
1004
+ proposalType,
1005
+ );
1002
1006
  const vote =
1003
- (await tryLLMGovernance(
1004
- "security-audit",
1005
- proposalTitle,
1006
- proposalDescription,
1007
- evidence,
1008
- proposalType,
1009
- )) ??
1007
+ attempt.vote ??
1010
1008
  localConferVote({
1011
1009
  role: "security-audit",
1012
- llmConfigured: isGovernanceLlmConfigured(),
1010
+ llmConfigured: attempt.miss !== "not-configured",
1011
+ ...(attempt.miss ? { miss: attempt.miss } : {}),
1013
1012
  });
1014
1013
 
1015
1014
  return {
@@ -400,7 +400,7 @@ export class MCPClient extends EventEmitter {
400
400
  this.emit('tool.before', beforeEvent);
401
401
 
402
402
  const serverName = this.config.serverName;
403
- const isGovernanceServer = ['code-review', 'security-audit', 'researcher', 'governance'].includes(serverName);
403
+ const isGovernanceServer = ['code-review', 'security-audit', 'researcher', 'architect', 'governance'].includes(serverName);
404
404
  const isGovernanceTool = toolName === 'analyze_proposal';
405
405
  const preferReal = this.isPureMcpMode || isGovernanceServer || isGovernanceTool;
406
406
 
@@ -12,6 +12,7 @@ import {
12
12
  persistLeadDevPlan,
13
13
  } from '../../../nucleus/autonomy-kernel.js';
14
14
  import {
15
+ conferFixtureAllowed,
15
16
  formatConferQuorumReport,
16
17
  isConferEnabled,
17
18
  runConferQuorum,
@@ -286,7 +287,7 @@ export class ComplexityHandler {
286
287
  collocatedText?: string;
287
288
  } = {
288
289
  dueReason: args.synthesisDueReason ?? null,
289
- fixture: args.conferFixture === true,
290
+ fixture: conferFixtureAllowed() && args.conferFixture === true,
290
291
  };
291
292
  if (args.collocatedText) conferOpts.collocatedText = args.collocatedText;
292
293
  const conferResult = await runConferQuorum(process.cwd(), args.sessionId, conferOpts);
@@ -13,8 +13,7 @@ import * as fs from "fs";
13
13
  import * as path from "path";
14
14
  import { frameworkLogger } from "../core/framework-logger.js";
15
15
  import {
16
- isGovernanceLlmConfigured,
17
- tryLLMGovernance,
16
+ attemptLLMGovernance,
18
17
  } from "../governance/llm-governance-provider.js";
19
18
  import { formatGovernanceVoteText, localConferVote } from "../governance/local-confer.js";
20
19
  import { initializeMemoryRouting } from "../memory-routing/index.js";
@@ -23,6 +22,7 @@ import {
23
22
  formatMemoryRoutingBlock,
24
23
  resolveResearcherMemoryContext,
25
24
  } from "./researcher-confidence.js";
25
+ import { buildHostConferEvidence } from "../nucleus/confer-host.js";
26
26
  import { XrayKnowledgeSkillBase } from "./shared/knowledge-skill-base.js";
27
27
 
28
28
  interface SearchResult {
@@ -465,6 +465,13 @@ class XrayLibrarianServer extends XrayKnowledgeSkillBase {
465
465
  async analyzeProposal(args: AnalyzeProposalArgs): Promise<CallToolResult> {
466
466
  const { proposalTitle = "", proposalDescription = "", evidence = [], proposalType = "" } = args || {};
467
467
 
468
+ if (proposalType === "synthesis-confer") {
469
+ const packet = [proposalTitle, proposalDescription, ...(evidence || [])].filter(Boolean).join("\n\n");
470
+ return {
471
+ content: [{ type: "text", text: buildHostConferEvidence("researcher", packet) }],
472
+ };
473
+ }
474
+
468
475
  const memoryContext = await resolveResearcherMemoryContext({
469
476
  proposalTitle,
470
477
  proposalDescription,
@@ -476,19 +483,21 @@ class XrayLibrarianServer extends XrayKnowledgeSkillBase {
476
483
  enrichedEvidence.push(...buildMemoryRoutingEvidence(memoryContext));
477
484
  }
478
485
 
486
+ const attempt = await attemptLLMGovernance(
487
+ "researcher",
488
+ proposalTitle || "",
489
+ proposalDescription || "",
490
+ enrichedEvidence,
491
+ proposalType || "",
492
+ );
479
493
  const vote =
480
- (await tryLLMGovernance(
481
- "researcher",
482
- proposalTitle || "",
483
- proposalDescription || "",
484
- enrichedEvidence,
485
- proposalType || "",
486
- )) ??
494
+ attempt.vote ??
487
495
  localConferVote({
488
496
  role: "researcher",
489
- llmConfigured: isGovernanceLlmConfigured(),
497
+ llmConfigured: attempt.miss !== "not-configured",
490
498
  highConfidenceTrapPresent: memoryContext?.confidence.highConfidenceTrapPresent,
491
499
  recommendedAgent: memoryContext?.recommendedAgent,
500
+ ...(attempt.miss ? { miss: attempt.miss } : {}),
492
501
  });
493
502
 
494
503
  const memoryRoutingBlock = memoryContext
@@ -72,6 +72,18 @@ The hold lasts for the work that named the plane. A sentence that does not say l
72
72
 
73
73
  Config: `features.json` → `multi_agent_orchestration.lead_dev_mode`
74
74
 
75
+ ## Confer
76
+
77
+ The TUI that is wearing the suit already spawned the MCP servers. Confer uses those servers. It does not start a private server and it does not run `hermes -z`.
78
+
79
+ When `.xray/state/confer-ask-s.1.json`, `confer-ask-s.2.json`, and `confer-ask-s.3.json` are on disk:
80
+
81
+ 1. Call the server and tool named in each ask. Researcher and code-review return evidence. Architect returns the assessment with `Verdict: UNREVIEWED`.
82
+ 2. Write one verdict line from this TUI's model: `Verdict: PASS`, `Verdict: CONDITIONAL`, or `Verdict: FAIL`, plus top risks and a hardening note.
83
+ 3. Call `record_confer_receipt` on `xray-governance` with `todoId`, `subagent`, `sessionId`, and that text.
84
+
85
+ Only `Verdict: PASS` completes the todo. FAIL, CONDITIONAL, and UNREVIEWED stay open. A session id that does not match the plan does not complete the todo. Grok, OpenCode, Hermes, and OpenClaw use these same three steps. Hermes is a voter only when Hermes is the TUI, and then only as that TUI's own model.
86
+
75
87
  ## Lead cadence (syncopation)
76
88
 
77
89
  The seven rules are the engine. The cadence is the time signature. Disk SSOT: `grok-bot/OP-PROC.md` (team specifics live in `house/`).
@@ -5,7 +5,8 @@
5
5
  * Usage:
6
6
  * node scripts/run-live-synthesis-checkpoint.mjs seed [--session-id=ID]
7
7
  * node scripts/run-live-synthesis-checkpoint.mjs status
8
- * node scripts/run-live-synthesis-checkpoint.mjs complete-todo --id=s.1
8
+ * node scripts/run-live-synthesis-checkpoint.mjs complete-todo
9
+ * (refuses: a CLI flag must not mint PASS or clear consult todos)
9
10
  * node scripts/run-live-synthesis-checkpoint.mjs finish
10
11
  */
11
12
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
@@ -132,56 +133,9 @@ async function cmdStatus() {
132
133
  }
133
134
 
134
135
  async function cmdCompleteTodo() {
135
- const todoId = process.argv.find((a) => a.startsWith('--id='))?.split('=')[1];
136
- const verdict = process.argv.find((a) => a.startsWith('--verdict='))?.split('=')[1];
137
- if (!todoId) {
138
- err('Usage: complete-todo --id=s.1 --verdict=PASS|CONDITIONAL|FAIL');
139
- process.exit(1);
140
- }
141
- if (!verdict || !['PASS', 'CONDITIONAL', 'FAIL'].includes(verdict)) {
142
- err('❌ --verdict=PASS|CONDITIONAL|FAIL required (consult receipt gate)');
143
- process.exit(1);
144
- }
145
-
146
- const sessionId = parseSessionId();
147
- const { persistence } = await loadXray();
148
- const { writeSynthesisConsultReceipt } = await import(
149
- join(xrayRoot, 'dist/nucleus/synthesis-consult-receipt.js'),
150
- );
151
-
152
- const plan = persistence.loadPersistedLeadDevPlan(root);
153
- const consultTodo = plan
154
- ? persistence.getSynthesisConsultTodos(plan).find((t) => t.id === todoId)
155
- : null;
156
- if (!consultTodo) {
157
- err(`❌ Consult todo ${todoId} not found in lead-dev plan`);
158
- process.exit(1);
159
- }
160
-
161
- writeSynthesisConsultReceipt(
162
- todoId,
163
- {
164
- sessionId: plan?.sessionId ?? sessionId,
165
- subagent: consultTodo.subagent,
166
- verdict,
167
- topRisks: [],
168
- hardeningNote: process.argv.find((a) => a.startsWith('--note='))?.split('=')[1] ?? '',
169
- },
170
- root,
171
- );
172
-
173
- const updated = persistence.updatePlanTodoStatus(todoId, 'completed', root);
174
- if (!updated) {
175
- err(`❌ Receipt gate blocked completion for ${todoId}`);
176
- process.exit(1);
177
- }
178
-
179
- const refreshed = persistence.loadPersistedLeadDevPlan(root);
180
- const todos = refreshed ? persistence.getSynthesisConsultTodos(refreshed) : [];
181
- const allDone = todos.length > 0 && todos.every((t) => t.status === 'completed');
182
- log(`✅ Marked ${todoId} completed (receipt: ${verdict})`);
183
- log(`📊 consult todos: ${todos.map((t) => `${t.id}:${t.status}`).join(', ')}`);
184
- if (allDone) log('🎉 All consult todos complete — checkpoint should clear on next gate eval');
136
+ err('❌ complete-todo cannot mint a PASS receipt or clear consult todos.');
137
+ err('A consult todo completes only when Confer records a real model approve.');
138
+ process.exit(1);
185
139
  }
186
140
 
187
141
  async function cmdFinish() {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "./features.schema.json",
3
- "version": "4.0.40",
3
+ "version": "4.0.42",
4
4
  "description": "0xRay Framework - Unified Feature Configuration",
5
5
  "suit_temperament": {
6
6
  "profile": "auto",
@@ -45,7 +45,7 @@
45
45
  },
46
46
  "confer_on_synthesis": {
47
47
  "type": "boolean",
48
- "description": "Auto-run 3-agent confer quorum at synthesis checkpoint (default true)"
48
+ "description": "Opt in to the 3-agent confer quorum. A missing key stays off."
49
49
  },
50
50
  "confer": {
51
51
  "type": "object",