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.
- package/.grok-plugin/plugin.json +1 -1
- package/.opencode/agents/api-design.yml +31 -0
- package/.opencode/agents/architect.yml +15 -0
- package/.opencode/agents/architecture-patterns.yml +14 -0
- package/.opencode/agents/auto-format.yml +14 -0
- package/.opencode/agents/backend-engineer.yml +12 -0
- package/.opencode/agents/boot-orchestrator.yml +14 -0
- package/.opencode/agents/bug-triage-specialist.yml +15 -0
- package/.opencode/agents/code-analyzer.yml +12 -0
- package/.opencode/agents/code-reviewer.yml +14 -0
- package/.opencode/agents/content-creator.yml +12 -0
- package/.opencode/agents/database-engineer.yml +12 -0
- package/.opencode/agents/devops-engineer.yml +12 -0
- package/.opencode/agents/framework-compliance-audit.yml +14 -0
- package/.opencode/agents/frontend-engineer.yml +12 -0
- package/.opencode/agents/frontend-ui-ux-engineer.yml +12 -0
- package/.opencode/agents/git-workflow.yml +15 -0
- package/.opencode/agents/growth-strategist.yml +12 -0
- package/.opencode/agents/hermes-agent.yml +12 -0
- package/.opencode/agents/inference-improve.yml +12 -0
- package/.opencode/agents/lint.yml +14 -0
- package/.opencode/agents/log-monitor.yml +12 -0
- package/.opencode/agents/mobile-developer.yml +12 -0
- package/.opencode/agents/model-health-check.yml +12 -0
- package/.opencode/agents/multimodal-looker.yml +12 -0
- package/.opencode/agents/performance-analysis.yml +12 -0
- package/.opencode/agents/performance-engineer.yml +12 -0
- package/.opencode/agents/performance-optimization.yml +12 -0
- package/.opencode/agents/processor-pipeline.yml +14 -0
- package/.opencode/agents/project-analysis.yml +12 -0
- package/.opencode/agents/refactorer.yml +12 -0
- package/.opencode/agents/researcher.yml +12 -0
- package/.opencode/agents/security-auditor.yml +12 -0
- package/.opencode/agents/security-scan.yml +12 -0
- package/.opencode/agents/seo-consultant.yml +12 -0
- package/.opencode/agents/session-management.yml +12 -0
- package/.opencode/agents/state-manager.yml +12 -0
- package/.opencode/agents/storyteller.yml +12 -0
- package/.opencode/agents/strategist.yml +12 -0
- package/.opencode/agents/tech-writer.yml +12 -0
- package/.opencode/agents/testing-best-practices.yml +12 -0
- package/.opencode/agents/testing-lead.yml +12 -0
- package/.opencode/agents/ui-ux-design.yml +12 -0
- package/.opencode/codex.codex +8 -0
- package/.opencode/commands/auto-format.md +99 -0
- package/.opencode/commands/auto-summary-capture.md +90 -0
- package/.opencode/commands/dependency-audit.md +184 -0
- package/.opencode/commands/enforcer-daily-scan.md +137 -0
- package/.opencode/commands/framework-compliance-audit.md +205 -0
- package/.opencode/commands/interactive-validator.md +75 -0
- package/.opencode/commands/job-summary-logger.md +68 -0
- package/.opencode/commands/lint.md +11 -0
- package/.opencode/commands/mode-switch.md +95 -0
- package/.opencode/commands/model-health-check.md +186 -0
- package/.opencode/commands/performance-analysis.md +144 -0
- package/.opencode/commands/pre-commit-introspection.md +185 -0
- package/.opencode/commands/pre-commit-introspection.sh +133 -0
- package/.opencode/commands/security-scan.md +157 -0
- package/.opencode/commands/sisyphus-validation.md +128 -0
- package/.opencode/commands/summary-logger.md +83 -0
- package/.opencode/enforcer-config.json +282 -0
- package/.opencode/skills/orchestrator/SKILL.md +12 -0
- package/.opencode/workflows/post-deployment-audit.yml +123 -0
- package/.xray/features.json +1 -1
- package/.xray/features.schema.json +1 -1
- package/AGENTS-consumer.md +2 -0
- package/AGENTS.md +2 -0
- package/README.md +52 -12
- package/SKILLS.md +2 -0
- package/dist/AGENTS.md +2 -0
- package/dist/CHANGELOG.md +29 -0
- package/dist/README.md +52 -12
- package/dist/SKILLS.md +2 -0
- package/dist/cli/commands/openclaw-install.js +1 -1
- package/dist/cli/index.js +12 -0
- package/dist/enforcement/index.d.ts +4 -0
- package/dist/enforcement/index.js +4 -0
- package/dist/enforcement/validators/code-quality-validators.js +6 -4
- package/dist/governance/llm-governance-provider.d.ts +7 -1
- package/dist/governance/llm-governance-provider.js +72 -14
- package/dist/governance/local-confer.d.ts +4 -1
- package/dist/governance/local-confer.js +22 -1
- package/dist/integrations/grok/grok-cli.js +10 -37
- package/dist/integrations/grok/hooks/grok-hook-utils.js +29 -2
- package/dist/integrations/grok/hooks/session-start.js +2 -20
- package/dist/integrations/hooks/confer-hook-runtime.mjs +23 -1
- package/dist/integrations/hooks/goggles-mcp.mjs +36 -4
- package/dist/integrations/hooks/goggles-pipeline.mjs +55 -15
- package/dist/integrations/hooks/goggles-planes.json +13 -4
- package/dist/integrations/hooks/plates.cjs +22 -0
- package/dist/integrations/hooks/session-note-index.cjs +298 -0
- package/dist/integrations/hooks/session-note-index.mjs +22 -0
- package/dist/integrations/hooks/sleeve.cjs +335 -0
- package/dist/integrations/hooks/sleeve.mjs +18 -0
- package/dist/integrations/hooks/station-hook-runtime.cjs +205 -9
- package/dist/integrations/hooks/wake-cascade.cjs +102 -0
- package/dist/integrations/hooks/wake-cascade.mjs +16 -0
- package/dist/integrations/openclaw/plugin/xray-pre-tool/package.json +1 -1
- package/dist/mcps/architect-tools.server.d.ts +6 -0
- package/dist/mcps/architect-tools.server.js +19 -2
- package/dist/mcps/config/server-config-registry.js +8 -6
- package/dist/mcps/governance.server.d.ts +1 -0
- package/dist/mcps/governance.server.js +46 -0
- package/dist/mcps/knowledge-skills/code-review.server.js +7 -0
- package/dist/mcps/knowledge-skills/security-audit.server.js +5 -3
- package/dist/mcps/mcp-client.js +1 -1
- package/dist/mcps/orchestrator/handlers/complexity-handler.js +2 -2
- package/dist/mcps/researcher.server.js +12 -3
- package/dist/memory-routing/plates.d.ts +1 -1
- package/dist/memory-routing/plates.js +1 -0
- package/dist/nucleus/autonomy-kernel.d.ts +2 -0
- package/dist/nucleus/autonomy-kernel.js +17 -13
- package/dist/nucleus/confer-host.d.ts +35 -0
- package/dist/nucleus/confer-host.js +55 -0
- package/dist/nucleus/confer.d.ts +19 -3
- package/dist/nucleus/confer.js +111 -55
- package/dist/nucleus/lead-dev-plan-persistence.js +4 -2
- package/dist/nucleus/suit-temperament.d.ts +1 -1
- package/dist/nucleus/suit-temperament.js +2 -2
- package/dist/nucleus/synthesis-consult-receipt.d.ts +7 -1
- package/dist/nucleus/synthesis-consult-receipt.js +86 -35
- package/dist/reporting/framework-reporting-system.js +2 -5
- package/dist/reporting/log-parser.d.ts +2 -0
- package/dist/reporting/log-parser.js +7 -6
- package/dist/skills/orchestrator/SKILL.md +12 -0
- package/docs-site/docs/plates/activity-log.md +1 -1
- package/docs-site/docs/plates/boot.md +2 -0
- package/docs-site/docs/plates/centrifuge.md +30 -0
- package/docs-site/docs/plates/cursor-compact.md +1 -1
- package/docs-site/docs/plates/glossary.md +1 -2
- package/docs-site/docs/plates/goggles.md +4 -0
- package/docs-site/docs/plates/governance.md +2 -0
- package/docs-site/docs/plates/grok-compact.md +1 -1
- package/docs-site/docs/plates/grokbot.md +1 -1
- package/docs-site/docs/plates/host-pack.md +2 -0
- package/docs-site/docs/plates/house.md +1 -1
- package/docs-site/docs/plates/index.md +3 -1
- package/docs-site/docs/plates/inference-files.md +1 -1
- package/docs-site/docs/plates/kept-line.md +1 -1
- package/docs-site/docs/plates/kits.md +2 -0
- package/docs-site/docs/plates/lens-gate.md +1 -1
- package/docs-site/docs/plates/lens-page.md +1 -1
- package/docs-site/docs/plates/live-mesh.md +1 -1
- package/docs-site/docs/plates/memory-recall.md +4 -0
- package/docs-site/docs/plates/notes-page.md +2 -1
- package/docs-site/docs/plates/orchestration.md +2 -0
- package/docs-site/docs/plates/package-face.md +1 -1
- package/docs-site/docs/plates/payload-heat.md +1 -1
- package/docs-site/docs/plates/pickup-stamp.md +1 -1
- package/docs-site/docs/plates/pre-tool.md +1 -1
- package/docs-site/docs/plates/processor.md +2 -0
- package/docs-site/docs/plates/record-map.md +2 -1
- package/docs-site/docs/plates/reflection-page.md +1 -1
- package/docs-site/docs/plates/reporting.md +2 -0
- package/docs-site/docs/plates/review.md +1 -1
- package/docs-site/docs/plates/routing.md +2 -0
- package/docs-site/docs/plates/session-capture.md +1 -1
- package/docs-site/docs/plates/site-manual.md +1 -1
- package/docs-site/docs/plates/stamp-plate.md +1 -1
- package/docs-site/docs/plates/station-card.md +4 -1
- package/docs-site/docs/plates/station-heat.md +1 -1
- package/docs-site/docs/plates/suit-organs.md +1 -1
- package/docs-site/docs/plates/suit-settings.md +1 -1
- package/docs-site/docs/plates/suit-wear.md +3 -1
- package/docs-site/docs/plates/suit.md +2 -0
- package/docs-site/docs/plates/trail-state.md +1 -1
- package/docs-site/docs/plates/work-fresh.md +1 -1
- package/docs-site/docs/plates/write-home.md +1 -1
- package/llms.txt +2 -0
- package/package.json +2 -2
- package/scripts/mjs/verify-confer-core.mjs +153 -29
- package/scripts/mjs/verify-user-aside-core.mjs +3 -4
- package/scripts/node/bridge-mcp-wiring.cjs +273 -9
- package/scripts/node/confer-switch.cjs +66 -0
- package/scripts/node/install-bridges.cjs +188 -60
- package/scripts/node/setup.cjs +2 -46
- package/src/integrations/openclaw/plugin/xray-pre-tool/package.json +1 -1
- package/src/mcps/architect-tools.server.ts +26 -2
- package/src/mcps/config/__tests__/server-config-registry.test.ts +15 -6
- package/src/mcps/config/server-config-registry.ts +9 -6
- package/src/mcps/governance.server.ts +49 -0
- package/src/mcps/knowledge-skills/code-review.server.ts +8 -0
- package/src/mcps/knowledge-skills/security-audit.server.ts +11 -12
- package/src/mcps/mcp-client.ts +1 -1
- package/src/mcps/orchestrator/handlers/complexity-handler.ts +2 -1
- package/src/mcps/researcher.server.ts +19 -10
- package/src/skills/orchestrator/SKILL.md +12 -0
- package/vendor/@0xray/repertoire/scripts/run-live-synthesis-checkpoint.mjs +5 -51
- package/xray/features.json +1 -1
- package/xray/features.schema.json +1 -1
|
@@ -34,4 +34,6 @@ Wear copies hooks, features.json, and the consumer gitignore into the project, a
|
|
|
34
34
|
|
|
35
35
|
A worn project is a consumer. Its writes go to its own `.xray/logs` and `.xray/inference`, not into `docs/` and not into `.opencode/logs`.
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
A fresh wear fastens mill and inspect. Grok's Goggles launcher stays on that install: the checkout script when the package name is `0xray`, and `node_modules/0xray` for every other project.
|
|
38
|
+
|
|
39
|
+
stamped · 0xray 4.0.42
|
|
@@ -32,4 +32,4 @@ Refresh writes one Fresh line from git and the published package.
|
|
|
32
32
|
|
|
33
33
|
refreshFreshness in src/nucleus/work-freshness.mjs fetches origin, reads npm view 0xray version, and returns that one line. A compact hook does not call it. The plate that belongs here is station-card.
|
|
34
34
|
|
|
35
|
-
stamped · 0xray 4.0.
|
|
35
|
+
stamped · 0xray 4.0.42
|
|
@@ -35,4 +35,4 @@ The path table is `src/integrations/hooks/write-home.cjs`. Writers use it. Reade
|
|
|
35
35
|
|
|
36
36
|
Still on the old path until each caller is rewired: the activity logger, the framework logger, the pipeline hook, the Grok hook, the Hermes bridge, station capture, `saveSessionInference`, reporting, pulse, monitor, and `features.json` `log_path`.
|
|
37
37
|
|
|
38
|
-
stamped · 0xray 4.0.
|
|
38
|
+
stamped · 0xray 4.0.42
|
package/llms.txt
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
**4.0** — mill+inspect plant, 7 MCPs, Codex 69. Constitution always on.
|
|
6
6
|
|
|
7
|
+
Confer votes. Burst runs the swarm.
|
|
8
|
+
|
|
7
9
|
Default consumer wear is **mill plant** (`mill` + `inspect`), not a 45-skill / 42-agent costume dump. `foundry.json` `"costume": true` is the opt-in dump. Do not use costume to land hangar shops. Fasten is **foundry-plant/0**: builtin plant is mill+inspect only. `foundry.json` `"plant": "@0xray/blip"` (aliases `"plant": "blip"` / `"plant": "sound"`) fastens whatever that mill package declares. Organs (looker, vibe, mixer) live in the mill — adding an organ is a mill publish, not an xray catalog PR. CLI shims `foundry blip|sound` still exist on foundry 0.1.11+; fasten is the new cut. Inspect reports the last bed or blip receipt the mill exported. Nested mill `@0xray/foundry` 0.1.12. Not costume.
|
|
8
10
|
|
|
9
11
|
## Wear (what a stranger gets)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "0xray",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.42",
|
|
4
4
|
"description": "Multi-agent orchestration and Codex governance for OpenCode, Hermes, Grok Build, and OpenClaw",
|
|
5
5
|
"readme": "README.md",
|
|
6
6
|
"license": "MIT",
|
|
@@ -73,7 +73,7 @@
|
|
|
73
73
|
"test": "vitest run",
|
|
74
74
|
"test:batch": "npm test",
|
|
75
75
|
"test:unit": "npm test -- src/__tests__/unit/config-loader.test.ts src/__tests__/unit/state-manager.test.ts src/__tests__/unit/state-manager-persistence.test.ts src/__tests__/unit/context-loader.test.ts src/__tests__/unit/pattern-analyzer.test.ts src/__tests__/unit/complexity-calibrator.test.ts",
|
|
76
|
-
"test:core-framework": "npm test -- src/__tests__/unit/v2-deletion-protection.test.ts",
|
|
76
|
+
"test:core-framework": "npm test -- src/__tests__/unit/v2-deletion-protection.test.ts src/__tests__/unit/confer.test.ts src/__tests__/unit/local-confer.test.ts src/__tests__/unit/synthesis-consult-receipt.test.ts src/__tests__/unit/governance-nollm-merge.test.ts",
|
|
77
77
|
"test:security": "npm test -- src/__tests__/unit/security/security-hardener.test.ts src/__tests__/unit/security/security-headers.test.ts src/__tests__/unit/security/security-auditor.test.ts",
|
|
78
78
|
"test:performance": "npm test -- src/__tests__/unit/monitoring.test.ts src/__tests__/unit/benchmark.test.ts src/__tests__/unit/analytics.test.ts",
|
|
79
79
|
"test:session-management": "npm test -- src/__tests__/unit/session-state-manager.test.ts src/__tests__/unit/session-security-validator.test.ts src/__tests__/unit/session-coordination-validator.test.ts src/__tests__/unit/session-migration-validator.test.ts src/__tests__/unit/session-migration-logic.test.ts",
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* Confer quorum fixture
|
|
3
|
+
* Confer quorum fixture.
|
|
4
|
+
* PASS completes. FAIL and no-LLM UNREVIEWED leave the todo open and the checkpoint due.
|
|
5
|
+
* Temp projects opt into synthesis so a due checkpoint can be observed. The repo default stays off.
|
|
4
6
|
*/
|
|
5
|
-
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
7
|
+
import { mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
6
8
|
import { tmpdir } from 'node:os';
|
|
7
9
|
import { dirname, join } from 'node:path';
|
|
8
10
|
import { fileURLToPath } from 'node:url';
|
|
@@ -10,10 +12,14 @@ import { fileURLToPath } from 'node:url';
|
|
|
10
12
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
11
13
|
const packageRoot = join(__dirname, '../..');
|
|
12
14
|
|
|
15
|
+
// Fixture PASS is refused unless this process is a test. The live orchestrate-task
|
|
16
|
+
// flag and XRAY_CONFER_FIXTURE stay unreachable when NODE_ENV is not test.
|
|
17
|
+
process.env.NODE_ENV = 'test';
|
|
18
|
+
|
|
13
19
|
const { buildSynthesisCheckpointPlan } = await import(
|
|
14
20
|
join(packageRoot, 'dist/nucleus/autonomy-kernel.js')
|
|
15
21
|
);
|
|
16
|
-
const { savePersistedLeadDevPlan, areSynthesisConsultTodosComplete } = await import(
|
|
22
|
+
const { savePersistedLeadDevPlan, areSynthesisConsultTodosComplete, loadPersistedLeadDevPlan } = await import(
|
|
17
23
|
join(packageRoot, 'dist/nucleus/lead-dev-plan-persistence.js')
|
|
18
24
|
);
|
|
19
25
|
const { recordExecutionSlice, isSynthesisCheckpointDue } = await import(
|
|
@@ -22,46 +28,103 @@ const { recordExecutionSlice, isSynthesisCheckpointDue } = await import(
|
|
|
22
28
|
const { runConferQuorum, loadConferCheckpoint, CONFER_AGENTS } = await import(
|
|
23
29
|
join(packageRoot, 'dist/nucleus/confer.js')
|
|
24
30
|
);
|
|
31
|
+
const { loadSynthesisConsultReceipt } = await import(
|
|
32
|
+
join(packageRoot, 'dist/nucleus/synthesis-consult-receipt.js')
|
|
33
|
+
);
|
|
34
|
+
const { readConferReviewHint } = await import(
|
|
35
|
+
join(packageRoot, 'src/integrations/hooks/confer-hook-runtime.mjs')
|
|
36
|
+
);
|
|
37
|
+
const { buildSessionBootPayload } = await import(
|
|
38
|
+
join(packageRoot, 'src/integrations/grok/hooks/grok-hook-utils.js')
|
|
39
|
+
);
|
|
25
40
|
|
|
26
|
-
const sessionId = 'verify-confer-core';
|
|
27
41
|
let failed = 0;
|
|
42
|
+
let checks = 0;
|
|
28
43
|
function pass(n) {
|
|
44
|
+
checks++;
|
|
29
45
|
console.log(`✅ ${n}`);
|
|
30
46
|
}
|
|
31
47
|
function fail(n, d = '') {
|
|
32
48
|
failed++;
|
|
49
|
+
checks++;
|
|
33
50
|
console.error(`❌ ${n}${d ? ` — ${d}` : ''}`);
|
|
34
51
|
}
|
|
35
52
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
multi_agent_orchestration: { lead_dev_mode: true, confer_on_synthesis: true },
|
|
42
|
-
synthesis: { enabled: true, every_n_gates: 1, every_n_turns: 0, every_n_todos_completed: 0 },
|
|
43
|
-
}),
|
|
44
|
-
);
|
|
53
|
+
function assertRepoSynthesisStaysOff() {
|
|
54
|
+
const source = readFileSync(join(packageRoot, 'src/nucleus/synthesis.ts'), 'utf8');
|
|
55
|
+
const defaults = source.match(/function defaultSynthesisConfig\(\)[\s\S]*?return \{([\s\S]*?)\n \};/);
|
|
56
|
+
if (defaults && /enabled:\s*false/.test(defaults[1])) pass('repo defaultSynthesisConfig stays enabled: false');
|
|
57
|
+
else fail('repo defaultSynthesisConfig stays enabled: false');
|
|
45
58
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
59
|
+
for (const rel of ['xray/features.json', '.xray/features.json']) {
|
|
60
|
+
const data = JSON.parse(readFileSync(join(packageRoot, rel), 'utf8'));
|
|
61
|
+
if (data.synthesis?.enabled === false) pass(`${rel} synthesis.enabled stays false`);
|
|
62
|
+
else fail(`${rel} synthesis.enabled stays false`, JSON.stringify(data.synthesis));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
50
65
|
|
|
66
|
+
function makeProject() {
|
|
67
|
+
const tmp = mkdtempSync(join(tmpdir(), 'xray-confer-verify-'));
|
|
68
|
+
mkdirSync(join(tmp, '.xray', 'state'), { recursive: true });
|
|
69
|
+
writeFileSync(
|
|
70
|
+
join(tmp, '.xray', 'features.json'),
|
|
71
|
+
JSON.stringify({
|
|
72
|
+
multi_agent_orchestration: { lead_dev_mode: true, confer_on_synthesis: true },
|
|
73
|
+
synthesis: { enabled: true, every_n_gates: 1, every_n_turns: 0, every_n_todos_completed: 0 },
|
|
74
|
+
}),
|
|
75
|
+
);
|
|
76
|
+
return tmp;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function seedDuePlan(tmp, sessionId) {
|
|
80
|
+
recordExecutionSlice('gate', { projectRoot: tmp, sessionId });
|
|
81
|
+
const due = isSynthesisCheckpointDue(tmp, sessionId);
|
|
51
82
|
const plan = buildSynthesisCheckpointPlan('gate threshold (1/1)', tmp);
|
|
52
|
-
if (
|
|
53
|
-
else {
|
|
83
|
+
if (plan) {
|
|
54
84
|
savePersistedLeadDevPlan(
|
|
55
85
|
{ ...plan, persistedAt: new Date().toISOString(), sessionId },
|
|
56
86
|
tmp,
|
|
57
87
|
);
|
|
58
|
-
pass('step 2: synthesis plan persisted');
|
|
59
88
|
}
|
|
89
|
+
return { due, plan };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function blocksCheckpoint(label, tmp, sessionId, result, verdict) {
|
|
93
|
+
const receipt = loadSynthesisConsultReceipt('s.1', tmp);
|
|
94
|
+
if (result.status === 'partial' && result.agents[0]?.verdict === verdict && result.agents[0]?.todoCompleted === false) {
|
|
95
|
+
pass(`${label}: quorum stopped on ${verdict}`);
|
|
96
|
+
} else {
|
|
97
|
+
fail(`${label}: quorum stopped on ${verdict}`, JSON.stringify(result));
|
|
98
|
+
}
|
|
99
|
+
if (receipt?.verdict === verdict) pass(`${label}: receipt verdict ${verdict}`);
|
|
100
|
+
else fail(`${label}: receipt verdict ${verdict}`, JSON.stringify(receipt));
|
|
101
|
+
if (!areSynthesisConsultTodosComplete(loadPersistedLeadDevPlan(tmp))) {
|
|
102
|
+
pass(`${label}: consult todo stays open`);
|
|
103
|
+
} else {
|
|
104
|
+
fail(`${label}: consult todo stays open`);
|
|
105
|
+
}
|
|
106
|
+
if (isSynthesisCheckpointDue(tmp, sessionId)) pass(`${label}: synthesis checkpoint stays due`);
|
|
107
|
+
else fail(`${label}: synthesis checkpoint stays due`);
|
|
108
|
+
const state = loadConferCheckpoint(tmp);
|
|
109
|
+
if (state?.status === 'failed') pass(`${label}: confer checkpoint not cleared`);
|
|
110
|
+
else fail(`${label}: confer checkpoint not cleared`, JSON.stringify(state));
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
assertRepoSynthesisStaysOff();
|
|
114
|
+
|
|
115
|
+
const passRoot = makeProject();
|
|
116
|
+
const passSession = 'verify-confer-core-pass';
|
|
117
|
+
try {
|
|
118
|
+
const seeded = seedDuePlan(passRoot, passSession);
|
|
119
|
+
if (!seeded.due) fail('step 1: synthesis due');
|
|
120
|
+
else pass('step 1: synthesis checkpoint due');
|
|
121
|
+
if (!seeded.plan) fail('step 2: synthesis plan');
|
|
122
|
+
else pass('step 2: synthesis plan persisted');
|
|
60
123
|
|
|
61
124
|
if (CONFER_AGENTS.length !== 3) fail('step 3: confer agent count', String(CONFER_AGENTS.length));
|
|
62
125
|
else pass('step 3: three confer agents defined');
|
|
63
126
|
|
|
64
|
-
const result = await runConferQuorum(
|
|
127
|
+
const result = await runConferQuorum(passRoot, passSession, {
|
|
65
128
|
collocatedText: 'verify confer fixture context',
|
|
66
129
|
dueReason: 'gate threshold',
|
|
67
130
|
fixture: true,
|
|
@@ -73,31 +136,92 @@ try {
|
|
|
73
136
|
fail('step 4: confer quorum', JSON.stringify(result));
|
|
74
137
|
}
|
|
75
138
|
|
|
76
|
-
const state = loadConferCheckpoint(
|
|
139
|
+
const state = loadConferCheckpoint(passRoot);
|
|
77
140
|
if (state?.status === 'completed' && state.completedAgents.length === 3) {
|
|
78
141
|
pass('step 5: confer checkpoint state completed');
|
|
79
142
|
} else {
|
|
80
143
|
fail('step 5: confer state', JSON.stringify(state));
|
|
81
144
|
}
|
|
82
145
|
|
|
83
|
-
if (areSynthesisConsultTodosComplete(
|
|
84
|
-
(await import(join(packageRoot, 'dist/nucleus/lead-dev-plan-persistence.js'))).loadPersistedLeadDevPlan(tmp),
|
|
85
|
-
)) {
|
|
146
|
+
if (areSynthesisConsultTodosComplete(loadPersistedLeadDevPlan(passRoot))) {
|
|
86
147
|
pass('step 6: synthesis consult todos complete after confer');
|
|
87
148
|
} else {
|
|
88
149
|
fail('step 6: consult todos incomplete');
|
|
89
150
|
}
|
|
90
151
|
|
|
91
|
-
if (!isSynthesisCheckpointDue(
|
|
152
|
+
if (!isSynthesisCheckpointDue(passRoot, passSession)) pass('step 7: synthesis checkpoint cleared');
|
|
92
153
|
else fail('step 7: checkpoint still due');
|
|
93
154
|
} finally {
|
|
94
|
-
rmSync(
|
|
155
|
+
rmSync(passRoot, { recursive: true, force: true });
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const failRoot = makeProject();
|
|
159
|
+
const failSession = 'verify-confer-core-fail';
|
|
160
|
+
try {
|
|
161
|
+
seedDuePlan(failRoot, failSession);
|
|
162
|
+
const result = await runConferQuorum(failRoot, failSession, {
|
|
163
|
+
fixture: true,
|
|
164
|
+
fixtureVerdict: 'FAIL',
|
|
165
|
+
});
|
|
166
|
+
blocksCheckpoint('FAIL', failRoot, failSession, result, 'FAIL');
|
|
167
|
+
} finally {
|
|
168
|
+
rmSync(failRoot, { recursive: true, force: true });
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const unreviewedRoot = makeProject();
|
|
172
|
+
const unreviewedSession = 'verify-confer-core-unreviewed';
|
|
173
|
+
try {
|
|
174
|
+
seedDuePlan(unreviewedRoot, unreviewedSession);
|
|
175
|
+
const result = await runConferQuorum(unreviewedRoot, unreviewedSession, {
|
|
176
|
+
fixture: true,
|
|
177
|
+
fixtureNoLlm: true,
|
|
178
|
+
});
|
|
179
|
+
blocksCheckpoint('no-LLM', unreviewedRoot, unreviewedSession, result, 'UNREVIEWED');
|
|
180
|
+
if (readConferReviewHint(unreviewedRoot) === 'UNREVIEWED') {
|
|
181
|
+
pass('no-LLM: confer review hint is UNREVIEWED');
|
|
182
|
+
} else {
|
|
183
|
+
fail('no-LLM: confer review hint is UNREVIEWED');
|
|
184
|
+
}
|
|
185
|
+
const boot = buildSessionBootPayload(unreviewedRoot, 'verify/session-start');
|
|
186
|
+
if (boot.conferReview === 'UNREVIEWED' && String(boot.conferReviewHint).includes('UNREVIEWED')) {
|
|
187
|
+
pass('no-LLM: session-boot hint records UNREVIEWED');
|
|
188
|
+
} else {
|
|
189
|
+
fail('no-LLM: session-boot hint records UNREVIEWED', JSON.stringify({
|
|
190
|
+
conferReview: boot.conferReview,
|
|
191
|
+
conferReviewHint: boot.conferReviewHint,
|
|
192
|
+
}));
|
|
193
|
+
}
|
|
194
|
+
} finally {
|
|
195
|
+
rmSync(unreviewedRoot, { recursive: true, force: true });
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
const conditionalRoot = makeProject();
|
|
199
|
+
const conditionalSession = 'verify-confer-core-conditional';
|
|
200
|
+
try {
|
|
201
|
+
seedDuePlan(conditionalRoot, conditionalSession);
|
|
202
|
+
const result = await runConferQuorum(conditionalRoot, conditionalSession, {
|
|
203
|
+
fixture: true,
|
|
204
|
+
fixtureVerdict: 'CONDITIONAL',
|
|
205
|
+
});
|
|
206
|
+
const verdicts = result.agents.map((agent) => agent.verdict);
|
|
207
|
+
if (result.status === 'partial' && verdicts[0] === 'CONDITIONAL' && result.agents[0]?.todoCompleted === false) {
|
|
208
|
+
pass('CONDITIONAL: explicit conditional does not complete');
|
|
209
|
+
} else {
|
|
210
|
+
fail('CONDITIONAL: explicit conditional does not complete', JSON.stringify(result));
|
|
211
|
+
}
|
|
212
|
+
if (isSynthesisCheckpointDue(conditionalRoot, conditionalSession)) {
|
|
213
|
+
pass('CONDITIONAL: checkpoint stays due');
|
|
214
|
+
} else {
|
|
215
|
+
fail('CONDITIONAL: checkpoint stays due');
|
|
216
|
+
}
|
|
217
|
+
} finally {
|
|
218
|
+
rmSync(conditionalRoot, { recursive: true, force: true });
|
|
95
219
|
}
|
|
96
220
|
|
|
97
221
|
console.log(
|
|
98
222
|
'\n' +
|
|
99
223
|
(failed === 0
|
|
100
|
-
?
|
|
224
|
+
? `🎉 Confer verify passed (${checks}/${checks}).`
|
|
101
225
|
: `⚠️ ${failed} confer check(s) failed.`),
|
|
102
226
|
);
|
|
103
|
-
process.exit(failed === 0 ? 0 : 1);
|
|
227
|
+
process.exit(failed === 0 ? 0 : 1);
|
|
@@ -75,16 +75,15 @@ try {
|
|
|
75
75
|
35,
|
|
76
76
|
tmp,
|
|
77
77
|
);
|
|
78
|
-
|
|
79
|
-
|
|
78
|
+
const todo = aside?.plan.phases.flatMap((phase) => phase.todos)[0];
|
|
79
|
+
if (todo?.id !== 'suit-nft.a.2.1') {
|
|
80
|
+
fail('step 3: build aside plan', todo?.id);
|
|
80
81
|
} else pass('step 3: namespaced aside todos');
|
|
81
82
|
|
|
82
83
|
saveUserAside(aside, tmp);
|
|
83
84
|
setActiveAsideId('suit-nft', tmp, 'verify-session');
|
|
84
85
|
if (getActiveAsideId(tmp, 'verify-session') !== 'suit-nft') fail('step 4: active pointer');
|
|
85
86
|
else pass('step 4: active aside pointer with session');
|
|
86
|
-
|
|
87
|
-
const todo = aside.plan.phases[0].todos[0];
|
|
88
87
|
const resolved = resolveSpawnPlan({ planTodoId: todo.id }, tmp, 'verify-session');
|
|
89
88
|
if (resolved.source !== 'aside') fail('step 5: resolve spawn plan', JSON.stringify(resolved));
|
|
90
89
|
else pass('step 5: spawn plan resolves to aside');
|