@dzhechkov/keysarium 1.7.14 → 1.7.18

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 (84) hide show
  1. package/.dz-manifest.json +215 -55
  2. package/README.md +35 -6
  3. package/README.ru.md +36 -16
  4. package/package.json +3 -3
  5. package/sbom.json +456 -56
  6. package/src/cli.js +32 -2
  7. package/src/commands/doctor.js +25 -1
  8. package/src/commands/init.js +46 -12
  9. package/src/utils.js +1 -0
  10. package/templates/.agents/skills/casarium/SKILL.md +29 -0
  11. package/templates/.claude/agents/code-goal-planner.md +9 -0
  12. package/templates/.claude/commands/analyst-manual.md +4 -2
  13. package/templates/.claude/commands/casarium.md +3 -1
  14. package/templates/.claude/commands/cjm-prototype.md +2 -2
  15. package/templates/.claude/commands/research.md +4 -1
  16. package/templates/.claude/rules/checkpoint-protocol.md +2 -1
  17. package/templates/.claude/rules/research-quality.md +11 -6
  18. package/templates/.claude/shards/phase-2-research.shard.md +12 -8
  19. package/templates/.claude/shards/phase-25-cjm.shard.md +5 -3
  20. package/templates/.claude/skills/analyst-manual-full/SKILL.md +65 -37
  21. package/templates/.claude/skills/feature-adr/SKILL.md +17 -15
  22. package/templates/.claude/skills/feature-adr/modules/03-adr.md +1 -1
  23. package/templates/.claude/skills/feature-adr/modules/03.5-ideation-swarm.md +1 -1
  24. package/templates/.claude/skills/feature-adr/modules/06-implementation-plan.md +2 -2
  25. package/templates/.claude/skills/feature-adr/modules/08-qe.md +1 -1
  26. package/templates/.claude/skills/feature-adr/modules/09-fleet-qe.md +12 -12
  27. package/templates/.claude/skills/feature-adr/references/agentic-qe/LICENSE.agentic-qe +21 -0
  28. package/templates/.claude/skills/feature-adr/references/agentic-qe/README.md +20 -16
  29. package/templates/.claude/skills/feature-adr/references/agentic-qe/UPSTREAM-MANIFEST.json +246 -0
  30. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-brutal-honesty-review/README.md +218 -0
  31. package/templates/.claude/skills/feature-adr/references/agentic-qe/{brutal-honesty-review.md → qe-ref-brutal-honesty-review/REFERENCE.md} +14 -1
  32. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-brutal-honesty-review/resources/assessment-rubrics.md +295 -0
  33. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-brutal-honesty-review/resources/review-template.md +102 -0
  34. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-brutal-honesty-review/schemas/output.json +291 -0
  35. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-brutal-honesty-review/scripts/assess-code.sh +179 -0
  36. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-brutal-honesty-review/scripts/assess-tests.sh +223 -0
  37. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-brutal-honesty-review/scripts/validate-config.json +34 -0
  38. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-enterprise-integration-testing/REFERENCE.md +758 -0
  39. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-enterprise-integration-testing/evals/enterprise-integration-testing.yaml +158 -0
  40. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-enterprise-integration-testing/schemas/output.json +74 -0
  41. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-enterprise-integration-testing/scripts/validate-config.json +25 -0
  42. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-qcsd-ideation-swarm/REFERENCE.md +226 -0
  43. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-qcsd-ideation-swarm/evals/qcsd-ideation-swarm.yaml +138 -0
  44. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-qcsd-ideation-swarm/schemas/output.json +568 -0
  45. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-qcsd-ideation-swarm/scripts/validate-config.json +25 -0
  46. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-qcsd-ideation-swarm/steps/01-flag-detection.md +57 -0
  47. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-qcsd-ideation-swarm/steps/02-core-agents.md +29 -0
  48. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-qcsd-ideation-swarm/steps/03-batch1-results.md +15 -0
  49. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-qcsd-ideation-swarm/steps/04-conditional-agents.md +23 -0
  50. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-qcsd-ideation-swarm/steps/05-decision-synthesis.md +29 -0
  51. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-qcsd-ideation-swarm/steps/06-report-generation.md +18 -0
  52. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-qcsd-ideation-swarm/steps/07-learning-persistence.md +29 -0
  53. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-qcsd-ideation-swarm/steps/08-final-output.md +18 -0
  54. package/templates/.claude/skills/feature-adr/references/agentic-qe/{qe-coverage-analysis.md → qe-ref-qe-coverage-analysis/REFERENCE.md} +42 -3
  55. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-qe-coverage-analysis/evals/qe-coverage-analysis.yaml +494 -0
  56. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-qe-coverage-analysis/schemas/output.json +286 -0
  57. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-qe-coverage-analysis/scripts/validate-config.json +42 -0
  58. package/templates/.claude/skills/feature-adr/references/agentic-qe/{qe-requirements-validation.md → qe-ref-qe-requirements-validation/REFERENCE.md} +13 -3
  59. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-qe-requirements-validation/evals/qe-requirements-validation.yaml +598 -0
  60. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-qe-requirements-validation/schemas/output.json +587 -0
  61. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-qe-requirements-validation/scripts/validate-config.json +37 -0
  62. package/templates/.claude/skills/feature-adr/references/agentic-qe/{regression-testing.md → qe-ref-regression-testing/REFERENCE.md} +30 -49
  63. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-regression-testing/evals/regression-testing.yaml +504 -0
  64. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-regression-testing/schemas/output.json +311 -0
  65. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-regression-testing/scripts/validate-config.json +50 -0
  66. package/templates/.claude/skills/feature-adr/references/agentic-qe/{risk-based-testing.md → qe-ref-risk-based-testing/REFERENCE.md} +23 -52
  67. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-risk-based-testing/evals/risk-based-testing.yaml +141 -0
  68. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-risk-based-testing/schemas/output.json +480 -0
  69. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-risk-based-testing/scripts/validate-config.json +25 -0
  70. package/templates/.claude/skills/feature-adr/references/agentic-qe/{shift-left-testing.md → qe-ref-shift-left-testing/REFERENCE.md} +33 -88
  71. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-shift-left-testing/evals/shift-left-testing.yaml +145 -0
  72. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-shift-left-testing/schemas/output.json +459 -0
  73. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-ref-shift-left-testing/scripts/validate-config.json +25 -0
  74. package/templates/CLAUDE.md +3 -1
  75. package/templates/docs/feature-adr/04-admin-guide.md +1 -1
  76. package/templates/docs/improvement-directions.md +3 -3
  77. package/templates/docs/keysarium/02-admin-guide.md +2 -2
  78. package/templates/docs/keysarium/03-user-guide.md +3 -3
  79. package/templates/docs/keysarium/05-architecture.md +9 -8
  80. package/templates/docs/keysarium/06-user-flows.md +4 -4
  81. package/templates/lib/platform-templates/copilot.md +1 -1
  82. package/templates/lib/platform-templates/opencode.md +1 -1
  83. package/templates/.claude/skills/feature-adr/references/agentic-qe/enterprise-integration-testing.md +0 -111
  84. package/templates/.claude/skills/feature-adr/references/agentic-qe/qcsd-ideation-swarm.md +0 -126
package/src/cli.js CHANGED
@@ -10,7 +10,7 @@ function showBanner() {
10
10
  console.log('');
11
11
  console.log(cyan('╔══════════════════════════════════════════════════════╗'));
12
12
  console.log(cyan('║') + bold(' \uD83D\uDD2C DZ-KEYSARIUM — AI Research Toolkit ') + cyan('║'));
13
- console.log(cyan('║') + ' Full 7-phase pipeline for Claude Code ' + cyan('║'));
13
+ console.log(cyan('║') + ' Full 7-phase research pipeline ' + cyan('║'));
14
14
  console.log(cyan('╚══════════════════════════════════════════════════════╝'));
15
15
  console.log('');
16
16
  }
@@ -40,6 +40,8 @@ function showHelp() {
40
40
  console.log(' ' + yellow('--minimal') + ' Install only .claude/ directory (skills, commands, rules)');
41
41
  console.log(' ' + yellow('--force') + ' Overwrite existing files without prompting');
42
42
  console.log(' ' + yellow('--with-docs') + ' Include docs/ directory');
43
+ console.log(' ' + yellow('--target') + ' Install for claude (default) or codex');
44
+ console.log(' ' + yellow('--project') + ' Project directory (default: current directory)');
43
45
  console.log(' ' + yellow('--dry-run') + ' Show what would be done without making changes');
44
46
  console.log(' ' + yellow('--help, -h') + ' Show this help message');
45
47
  console.log(' ' + yellow('--version, -v') + ' Show version number');
@@ -47,6 +49,7 @@ function showHelp() {
47
49
  console.log(bold('Examples:'));
48
50
  console.log(dim(' $ ') + 'npx @dzhechkov/keysarium init');
49
51
  console.log(dim(' $ ') + 'npx @dzhechkov/keysarium init --minimal --force');
52
+ console.log(dim(' $ ') + 'npx @dzhechkov/keysarium init --target codex --project ./my-case');
50
53
  console.log(dim(' $ ') + 'npx @dzhechkov/keysarium update --dry-run');
51
54
  console.log(dim(' $ ') + 'npx @dzhechkov/keysarium doctor');
52
55
  console.log('');
@@ -64,11 +67,14 @@ function parseArgs(argv) {
64
67
  withDocs: false,
65
68
  dryRun: false,
66
69
  targetDir: process.cwd(),
70
+ target: 'claude',
71
+ targetSpecified: false,
67
72
  };
68
73
 
69
74
  let command = null;
70
75
 
71
- for (const arg of args) {
76
+ for (let index = 0; index < args.length; index += 1) {
77
+ const arg = args[index];
72
78
  switch (arg) {
73
79
  case '--minimal':
74
80
  flags.minimal = true;
@@ -82,6 +88,25 @@ function parseArgs(argv) {
82
88
  case '--dry-run':
83
89
  flags.dryRun = true;
84
90
  break;
91
+ case '--target': {
92
+ const value = args[++index];
93
+ if (value !== 'claude' && value !== 'codex') {
94
+ error('--target must be claude or codex');
95
+ process.exit(1);
96
+ }
97
+ flags.target = value;
98
+ flags.targetSpecified = true;
99
+ break;
100
+ }
101
+ case '--project': {
102
+ const value = args[++index];
103
+ if (!value || value.startsWith('-')) {
104
+ error('--project requires a directory path');
105
+ process.exit(1);
106
+ }
107
+ flags.targetDir = path.resolve(value);
108
+ break;
109
+ }
85
110
  case '--help':
86
111
  case '-h':
87
112
  command = 'help';
@@ -132,6 +157,11 @@ function main() {
132
157
 
133
158
  // Route to command handlers
134
159
  const resolvedCommand = command || 'init';
160
+ if (flags.targetSpecified && resolvedCommand !== 'init') {
161
+ error('--target is supported only by init; update and doctor use the installation manifest');
162
+ process.exitCode = 1;
163
+ return;
164
+ }
135
165
 
136
166
  switch (resolvedCommand) {
137
167
  case 'init':
@@ -293,6 +293,28 @@ function checkSettingsValid(targetDir) {
293
293
  });
294
294
  }
295
295
 
296
+ function checkCodexEntrypoint(targetDir) {
297
+ return check('Codex entrypoint', () => {
298
+ const entry = path.join(targetDir, '.agents', 'skills', 'casarium', 'SKILL.md');
299
+ const command = path.join(targetDir, '.claude', 'commands', 'casarium.md');
300
+ const shards = path.join(targetDir, '.claude', 'shards');
301
+ const missing = [entry, command, shards].filter((item) => !fileExists(item));
302
+ if (missing.length > 0) {
303
+ return { passed: false, detail: `Missing ${missing.map((item) => path.relative(targetDir, item)).join(', ')}`,
304
+ fix: 'Run keysarium update to restore the installed Codex entrypoint.' };
305
+ }
306
+ const body = fs.readFileSync(entry, 'utf8');
307
+ const frontmatter = body.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/);
308
+ if (!frontmatter || !/^name:\s*casarium\s*$/m.test(frontmatter[1])
309
+ || !/^description:\s*\S.+$/m.test(frontmatter[1])
310
+ || !body.includes('.claude/commands/casarium.md')) {
311
+ return { passed: false, detail: 'SKILL.md lacks Codex discovery metadata or the canonical command reference',
312
+ fix: 'Run keysarium update to restore the Codex entrypoint.' };
313
+ }
314
+ return { passed: true, detail: 'Project skill and canonical pipeline references present' };
315
+ });
316
+ }
317
+
296
318
  /**
297
319
  * Check 8: researches/ directory exists.
298
320
  */
@@ -372,7 +394,9 @@ async function run(options) {
372
394
  checkRulesPresent(targetDir),
373
395
  checkShardsPresent(targetDir),
374
396
  checkAgentsPresent(targetDir),
375
- checkSettingsValid(targetDir),
397
+ manifest.components?.includes('codex_entry')
398
+ ? checkCodexEntrypoint(targetDir)
399
+ : checkSettingsValid(targetDir),
376
400
  checkResearchDir(targetDir),
377
401
  ];
378
402
 
@@ -22,8 +22,10 @@ const {
22
22
  * --with-docs: add docs group
23
23
  */
24
24
  function resolveComponents(options) {
25
- const { minimal, withDocs } = options;
26
- const coreKeys = ['skills', 'commands', 'rules', 'shards', 'agents', 'hooks', 'claude_md', 'harvest'];
25
+ const { minimal, withDocs, target } = options;
26
+ const coreKeys = ['skills', 'commands', 'rules', 'shards', 'agents', 'claude_md', 'harvest'];
27
+ if (target === 'codex') coreKeys.push('codex_entry');
28
+ else coreKeys.push('hooks');
27
29
  const keys = [...coreKeys];
28
30
 
29
31
  if (!minimal) {
@@ -81,9 +83,10 @@ function installComponent(comp, templatesDir, targetDir, force) {
81
83
  * @param {boolean} options.withDocs — Include docs/ directory
82
84
  * @param {boolean} options.dryRun — Preview without writing anything
83
85
  * @param {string} options.targetDir — Destination project root
86
+ * @param {string} options.target — claude (default) or codex
84
87
  */
85
88
  async function run(options) {
86
- const { force, dryRun, targetDir } = options;
89
+ const { force, dryRun, targetDir, target = 'claude' } = options;
87
90
  const manifestPath = path.join(targetDir, MANIFEST_FILE);
88
91
 
89
92
  // ── a) Check for existing installation ──────────────────────────────────
@@ -93,9 +96,25 @@ async function run(options) {
93
96
  info(`Run ${cyan('npx @dzhechkov/keysarium update')} to update, or use ${yellow('--force')} to overwrite.`);
94
97
  process.exit(1);
95
98
  }
99
+ const existing = readJSON(manifestPath);
100
+ if (!existing || !Array.isArray(existing.components)) {
101
+ logError('Existing .keysarium.json is invalid; refusing to overwrite its ownership record.');
102
+ process.exit(1);
103
+ }
104
+ const existingTarget = existing.components.includes('codex_entry') ? 'codex' : 'claude';
105
+ if (existingTarget !== target) {
106
+ logError(`Cannot switch an installed ${existingTarget} toolkit to ${target} with --force. Remove it first, then init for the new target.`);
107
+ process.exit(1);
108
+ }
96
109
  warn('Existing installation found — overwriting (--force).');
97
110
  }
98
111
 
112
+ const codexEntryPath = path.join(targetDir, '.agents', 'skills', 'casarium', 'SKILL.md');
113
+ if (target === 'codex' && fileExists(codexEntryPath) && !force) {
114
+ logError('A project skill named casarium already exists. Use --force only if it may be replaced.');
115
+ process.exit(1);
116
+ }
117
+
99
118
  // ── b) Determine components ─────────────────────────────────────────────
100
119
  const componentKeys = resolveComponents(options);
101
120
  const templatesDir = getTemplatesDir();
@@ -103,6 +122,7 @@ async function run(options) {
103
122
  // ── c) Show plan ────────────────────────────────────────────────────────
104
123
  console.log('');
105
124
  info(bold('Installation plan:'));
125
+ info(`Target: ${target}; project: ${targetDir}`);
106
126
  console.log('');
107
127
 
108
128
  for (const key of componentKeys) {
@@ -161,16 +181,30 @@ async function run(options) {
161
181
 
162
182
  console.log('');
163
183
  console.log(bold('Next steps:'));
164
- console.log(` 1. Open ${cyan('Claude Code')} in this directory`);
165
- console.log(` 2. Run ${cyan('/casarium [your case description]')}`);
166
- console.log(` 3. Follow the 7-phase pipeline`);
167
- console.log('');
168
- console.log(bold('Available commands:'));
169
- console.log(` ${cyan('/casarium')} ${dim('\u2014 Full pipeline')}`);
170
- console.log(` ${cyan('/new-research')} ${dim('\u2014 New research')}`);
171
- console.log(` ${cyan('/parallel-research')} ${dim('\u2014 Multiple cases in parallel')}`);
172
- console.log(` ${cyan('/harvest')} ${dim('\u2014 Extract knowledge')}`);
184
+ if (target === 'codex') {
185
+ console.log(` 1. Open ${cyan('Codex')} in ${targetDir}`);
186
+ console.log(` 2. Invoke ${cyan('$casarium [your case description]')}`);
187
+ console.log(` 3. Confirm each phase checkpoint and select a CJM variant`);
188
+ console.log('');
189
+ console.log(bold('Codex integration status:'));
190
+ console.log(' Bundled workflow skills: installed under .claude/skills/ as phase references');
191
+ console.log(' Full pipeline entrypoint: installed at .agents/skills/casarium/SKILL.md');
192
+ console.log(' Codex hooks and MCP integrations: not installed');
193
+ console.log(' Claude settings/hooks: not installed for this target');
194
+ } else {
195
+ console.log(` 1. Open ${cyan('Claude Code')} in this directory`);
196
+ console.log(` 2. Run ${cyan('/casarium [your case description]')}`);
197
+ console.log(` 3. Follow the 7-phase pipeline`);
198
+ }
173
199
  console.log('');
200
+ if (target === 'claude') {
201
+ console.log(bold('Available commands:'));
202
+ console.log(` ${cyan('/casarium')} ${dim('\u2014 Full pipeline')}`);
203
+ console.log(` ${cyan('/new-research')} ${dim('\u2014 New research')}`);
204
+ console.log(` ${cyan('/parallel-research')} ${dim('\u2014 Multiple cases in parallel')}`);
205
+ console.log(` ${cyan('/harvest')} ${dim('\u2014 Extract knowledge')}`);
206
+ console.log('');
207
+ }
174
208
 
175
209
  process.exit(0);
176
210
  }
package/src/utils.js CHANGED
@@ -311,6 +311,7 @@ const COMPONENT_SPECS = {
311
311
  docs: { src: 'docs', name: 'Documentation', unit: 'guides', countMode: 'files', group: 'docs' },
312
312
  claude_md: { src: 'CLAUDE.md', name: 'Master instructions', group: 'core', isFile: true },
313
313
  harvest: { src: 'TOOLKIT_HARVEST.md', name: 'Knowledge harvest tracker', group: 'core', isFile: true },
314
+ codex_entry: { src: '.agents/skills/casarium', name: 'Codex pipeline entrypoint', unit: 'entrypoint', countMode: 'files', group: 'codex' },
314
315
  };
315
316
 
316
317
  /**
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: casarium
3
+ description: Run the installed Keysarium seven-phase case research pipeline in Codex, with phase artifacts and user checkpoints. Use when the user invokes $casarium or asks to work through a Keysarium case.
4
+ ---
5
+
6
+ # Casarium in Codex
7
+
8
+ This project contains the complete Keysarium workflow. Start by reading
9
+ `.claude/commands/casarium.md`; it is the source of truth for phase order, outputs and
10
+ checkpoints. Treat its `$ARGUMENTS` as the user's request after `$casarium`. If the case is
11
+ missing, ask for it.
12
+
13
+ For each phase, read only its `.claude/shards/phase-*.shard.md` and the skill files it names
14
+ under `.claude/skills/`. Read `.claude/rules/checkpoint-protocol.md` and
15
+ `.claude/rules/research-quality.md` when reaching their gates. Create phase artifacts under
16
+ `researches/<case-name>/` as the phase runs. Show the checkpoint and wait for the user's
17
+ confirmation before advancing. Phase 2.5 requires an explicit CJM choice; preserve that
18
+ choice in later phases. A failed research gate cannot emit a success promise.
19
+
20
+ The `.claude/` files are workflow references in Codex. Claude slash commands, Agent tool
21
+ calls, hook settings and model names inside them are not Codex commands or installed Codex
22
+ integrations. Use available Codex tools for the work and state any unavailable capability;
23
+ do not claim that a named Claude agent or hook ran. Parallel work is optional when the host
24
+ supports it. The research mode requirements still apply to every worker.
25
+
26
+ If the case asks for AI Factory mapping, read
27
+ `.claude/shards/phase-ai-factory.shard.md` and its referenced skill before Phase 0. Otherwise
28
+ leave that branch inactive. The project-local `$casarium` skill is the Codex entrypoint;
29
+ `/casarium` remains the Claude Code entrypoint.
@@ -0,0 +1,9 @@
1
+ ---
2
+ name: code-goal-planner
3
+ description: Plans software changes with the bundled SPARC-GOAP protocol and testable milestones.
4
+ color: blue
5
+ ---
6
+
7
+ Read `.claude/skills/feature-adr/references/agentic-qe/code-goal-planner.md` before planning. It is the canonical protocol for this project agent.
8
+
9
+ Use the feature requirements, ADR decisions, quality risks and current repository evidence to propose an ordered implementation plan. Give each milestone a deliverable and a check that could disprove completion. Identify unresolved inputs instead of inventing metrics or claiming that code has already been verified. Return the plan to Step 6 of feature-ADR; the lead checks it before recording the plan artifact.
@@ -20,9 +20,11 @@ $ARGUMENTS
20
20
  - Output: `01_task_brief.md`
21
21
  - ⏸️ **CHECKPOINT 1:** Подтверждение Task Brief + выбор verification mode
22
22
 
23
- 4. **Phase 2: Verified Research** (goap-research-ed25519)
23
+ 4. **Phase 2: Research** (goap-research-ed25519)
24
24
  - Используй `scripts/goap_planner.py` и `scripts/ed25519_verifier.py`
25
- - Режим: выбранный на CHECKPOINT 1 (moderate/strict/paranoid)
25
+ - По умолчанию `moderate`; `strict`/`paranoid` выбираются только при подтверждённых `issuer_keys_available` и `source_class_verified`
26
+ - Если planner вернул `PlanNotFound`, покажи verdict и причину и остановись до Solve
27
+ - Статус подписи издателя бери из `verify_fact`, а целостность цепочки — отдельно из `verify_citation_chain`
26
28
  - Output: `02_research_findings.md`
27
29
  - ⏸️ **CHECKPOINT 2:** Подтверждение findings
28
30
 
@@ -195,7 +195,9 @@ researches/CASE_NAME/
195
195
  - Файлы создаются в момент фазы, не в Phase 6
196
196
  - ⭐ Phase 2.5 (CJM Prototype) — НИКОГДА НЕ ПРОПУСКАТЬ
197
197
  - ⭐ 08_executive_summary.md — ОБЯЗАТЕЛЕН
198
- - Research в paranoid mode — ноль непроверенных утверждений
198
+ - Research: `moderate` для обычных источников; `strict`/`paranoid` только после проверки
199
+ `issuer_keys_available` и `source_class_verified` по `.claude/rules/research-quality.md`.
200
+ Недостижимая цель исследования останавливает checkpoint и следующие фазы.
199
201
  - {CHOSEN_CJM} передаётся в Phase 3-5
200
202
  - Если банк: on-premise, ФЗ-152, ЦБ, GigaChat/YandexGPT
201
203
  - Если мало времени: Quick Mode
@@ -23,7 +23,7 @@ $ARGUMENTS
23
23
  4. **Step 2:** Определить 3 варианта CJM (A/B/C)
24
24
  5. **Step 2.5:** VARIANT D — Future-Ready CJM (Trend-Based)
25
25
  - Загрузи `.claude/skills/goap-research-ed25519/SKILL.md` для trend research
26
- - Исследуй 5 категорий трендов (PARANOID mode)
26
+ - Исследуй 5 категорий трендов в режиме, разрешённом `.claude/rules/research-quality.md`
27
27
  - Создай Trend Brief
28
28
  - Синтезируй Variant D
29
29
  6. **Step 3:** Сгенерируй React-прототип (.jsx) с 4 вариантами
@@ -38,5 +38,5 @@ $ARGUMENTS
38
38
  Запусти 3 агента параллельно:
39
39
  - Agent 1: CJM Variant A — один подход к точке входа
40
40
  - Agent 2: CJM Variant B + C — альтернативные подходы
41
- - Agent 3: Trend Research для Variant D (GOAP PARANOID)
41
+ - Agent 3: Trend Research для Variant D (GOAP `moderate` для обычных источников)
42
42
  Затем синтезируй в единый прототип с 4 вариантами.
@@ -12,7 +12,10 @@ $ARGUMENTS
12
12
 
13
13
  1. **Загрузи скилл:** Прочитай `.claude/skills/goap-research-ed25519/SKILL.md`
14
14
  2. **Прочитай Phase 0-1** для контекста
15
- 3. **Режим: PARANOID** — ноль непроверенных утверждений
15
+ 3. **Выбери режим по `.claude/rules/research-quality.md`:** `moderate` для обычных
16
+ источников; `strict`/`paranoid` только при подтверждённых ключах издателей и
17
+ подписанной выдаче. Если GOAP вернул `GOAL_UNREACHABLE`, покажи причину и не
18
+ отмечай фазу завершённой.
16
19
 
17
20
  4. **Исследуй по направлениям:**
18
21
  - Аналоги — кто решал похожую задачу
@@ -29,7 +29,7 @@ Promises are machine-readable markers that formalize phase gates.
29
29
  |-------|------------|---------|
30
30
  | Phase 0 | `<promise>DISCOVERY_COMPLETE</promise>` | JTBD + competitors + ROI analyzed |
31
31
  | Phase 1 | `<promise>CASE_EXPLORED</promise>` | Case fully understood, brief created |
32
- | Phase 2 | `<promise>RESEARCH_PARANOID_PASSED</promise>` | All claims verified, zero unverified |
32
+ | Phase 2 | `<promise>RESEARCH_PARANOID_PASSED</promise>` | Legacy tag: evidence gate passed in the selected GOAP mode; no issuer-signature claim unless independently confirmed |
33
33
  | Phase 2.5 | `<promise>CJM_VALIDATED</promise>` | CJM prototype created and variant chosen |
34
34
  | Phase 3 | `<promise>SOLUTION_DESIGNED</promise>` | Solution strategy formulated |
35
35
  | Phase 4 | `<promise>ARCHITECTURE_DEFINED</promise>` | C4 diagrams + sequence flows ready |
@@ -57,6 +57,7 @@ Files created: [list] ✅
57
57
  ### Promise Validation Rules
58
58
 
59
59
  - A promise tag MUST only be emitted AFTER its conditions are verifiably met
60
+ - GOAP `GOAL_UNREACHABLE` cannot satisfy the Phase 2 promise; report the missing capability and stop
60
61
  - If conditions are NOT met, emit `<promise>[TAG]_INCOMPLETE</promise>` instead
61
62
  - Downstream phases SHOULD check for upstream promises before starting
62
63
  - Promise tags serve as formal phase gates — they replace informal "phase done" signals
@@ -1,10 +1,15 @@
1
1
  # Research Quality Rules
2
2
 
3
- ## PARANOID Mode (Default for all research)
4
- - Every factual claim MUST have a verifiable source
5
- - Zero tolerance for hallucinated citations
6
- - Confidence threshold: 0.99 minimum
7
- - If source cannot be verified → mark as [UNVERIFIED] and flag
3
+ ## Research mode selection
4
+ - Use GOAP `moderate` for ordinary web and publication sources. Cite material factual claims,
5
+ identify uncertainty and do not turn an unverified claim into a decisive conclusion.
6
+ - Select GOAP `strict` or `paranoid` only after confirming both `issuer_keys_available` (real
7
+ pinned Ed25519 issuer keys) and `source_class_verified` (signed delivery for that source
8
+ class). A URL or citation alone establishes neither capability.
9
+ - If the requested mode returns `GOAL_UNREACHABLE`, record the missing capabilities and stop
10
+ the research checkpoint. Do not emit a success promise or advance to the next phase.
11
+ - Zero tolerance for invented citations applies in every mode. Source attribution and issuer
12
+ signature verification are different claims.
8
13
 
9
14
  ## Citation Requirements
10
15
  - Format: `[Claim] — Source: [URL or publication], [Date]`
@@ -14,7 +19,7 @@
14
19
  ## Verification Checklist
15
20
  Before completing any research phase:
16
21
  - [ ] All claims have sources
17
- - [ ] No unverified statistics or percentages
22
+ - [ ] No unverified statistics or percentages presented as established facts
18
23
  - [ ] Competitor names verified to exist
19
24
  - [ ] Technology recommendations are for real, available products
20
25
  - [ ] Regulatory references cite actual laws/standards
@@ -13,12 +13,14 @@ Load: `.claude/skills/goap-research-ed25519/SKILL.md`
13
13
  ## Mandatory Outputs
14
14
  - `02_research_findings.md`
15
15
 
16
- ## PARANOID Mode — ACTIVE
17
- - Every factual claim MUST have a verifiable source
18
- - Zero tolerance for hallucinated citations
19
- - Confidence threshold: 0.99 minimum
20
- - Unverifiable claims: mark as [UNVERIFIED] and flag
21
- - Citation format: `[Claim] — Source: [URL or publication], [Date]`
16
+ ## Research mode and evidence
17
+ - Follow `.claude/rules/research-quality.md`: default GOAP `moderate` for ordinary sources.
18
+ - Use `strict`/`paranoid` only if both issuer-key and signed-delivery capabilities are
19
+ confirmed for the selected source class. Do not infer signature verification from a URL.
20
+ - Cite material factual claims; label unsupported claims `[UNVERIFIED]` and keep them out of
21
+ decisive conclusions. Invented citations are never acceptable.
22
+ - Citation format: `[Claim] — Source: [URL or publication], [Date]`.
23
+ - A `GOAL_UNREACHABLE` result blocks the checkpoint and transition to Phase 2.5.
22
24
 
23
25
  ## Agent Swarm (3 parallel, model: sonnet)
24
26
  - Agent 1: Analogues + Benchmarks
@@ -28,13 +30,15 @@ Load: `.claude/skills/goap-research-ed25519/SKILL.md`
28
30
 
29
31
  ## Quality Gates
30
32
  - ALL claims have sources
31
- - No unverified statistics or percentages
33
+ - No unverified statistics or percentages presented as established facts
32
34
  - Competitor names verified to exist
33
35
  - Technology recommendations are for real, available products
34
36
  - Regulatory references cite actual laws/standards
35
37
 
36
38
  ## Promise
37
- On completion: `<promise>RESEARCH_PARANOID_PASSED</promise>`
39
+ On successful evidence review in the selected mode: `<promise>RESEARCH_PARANOID_PASSED</promise>`.
40
+ The tag name is retained for downstream compatibility; it does not assert GOAP paranoid mode or
41
+ cryptographic issuer verification. On failure, emit the incomplete marker and do not advance.
38
42
 
39
43
  ## Anti-Patterns to Check
40
44
  - Bare claims without attribution → BLOCK
@@ -21,14 +21,15 @@
21
21
  ## Process
22
22
  1. Extract: primary_user, segments, aha_moment, solution_concept from Phases 0-2
23
23
  2. Define 3 CJM variants (A/B/C) with different approaches
24
- 3. Research 5 trend categories for Variant D (PARANOID mode)
24
+ 3. Research 5 trend categories for Variant D in the GOAP mode allowed by
25
+ `.claude/rules/research-quality.md`; ordinary sources use `moderate`
25
26
  4. Generate React .jsx prototype with all 4 variants
26
27
  5. User selects winning variant → sets `{CHOSEN_CJM}`
27
28
 
28
29
  ## Agent Swarm (3 parallel)
29
30
  - Agent 1 (opus): CJM Variant A design
30
31
  - Agent 2 (opus): CJM Variants B + C design
31
- - Agent 3 (sonnet): Trend Research for Variant D (PARANOID mode, 5 categories)
32
+ - Agent 3 (sonnet): Trend Research for Variant D (selected GOAP mode, 5 categories)
32
33
 
33
34
  ## Critical Variable
34
35
  `{CHOSEN_CJM}` — MUST be set by user selection. Passed to Phases 3-5.
@@ -36,7 +37,8 @@
36
37
  ## Quality Gates
37
38
  - Minimum 3 CJM variants (A/B/C) + 1 trend variant (D)
38
39
  - Prototype must be valid React JSX
39
- - Trend research in PARANOID mode (verified sources)
40
+ - Trend research cites sources, labels uncertainty and does not claim issuer verification
41
+ without confirmed capabilities
40
42
  - User MUST explicitly select a variant
41
43
 
42
44
  ## Promise