vibe-coding-master 0.7.20 → 0.7.21

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/README.md CHANGED
@@ -9,7 +9,7 @@ VCM helps you keep one task organized across dedicated roles:
9
9
  - Architect
10
10
  - Coder
11
11
  - Tester
12
- - optional Gate Reviewer
12
+ - optional Reviewer
13
13
 
14
14
  It runs locally, connects to a local Git repository, creates a task branch and
15
15
  worktree, starts embedded Claude Code terminals, and manages handoffs,
@@ -133,7 +133,7 @@ If you want VCM app state to survive container rebuilds, set:
133
133
  7. Review the harness/bootstrap commit diff.
134
134
  8. Start the role sessions, or use the saved launch template / one-click start.
135
135
  9. Talk mostly to Project Manager.
136
- 10. Let PM route work to Architect, Coder, Tester, and Gate Reviewer when
136
+ 10. Let PM route work to Architect, Coder, Tester, and Reviewer when
137
137
  enabled.
138
138
  11. Review the final result and close the task when finished.
139
139
 
@@ -290,7 +290,7 @@ The global launch template stores per-role defaults for the five workflow roles:
290
290
  - auto orchestration
291
291
 
292
292
  One-click start launches the four core roles. If any Gate Review Gate is enabled,
293
- it also launches Gate Reviewer.
293
+ it also launches Reviewer.
294
294
 
295
295
  Translator and Harness Engineer are tool roles. They are controlled from their
296
296
  own panels, not from the main role tab bar or the one-click launch template.
@@ -331,14 +331,14 @@ Available gates:
331
331
  - Validation adequacy
332
332
  - Code diff
333
333
 
334
- When a gate is enabled, VCM uses Gate Reviewer as an independent review role.
335
- Gate Reviewer reviews artifacts and diffs, writes a gate report, and returns
334
+ When a gate is enabled, VCM uses Reviewer as an independent review role.
335
+ Reviewer reviews artifacts and diffs, writes a gate report, and returns
336
336
  only:
337
337
 
338
338
  - `approve`
339
339
  - `request_changes`
340
340
 
341
- Gate Reviewer does not run tests and does not choose owners or fixes. PM routes
341
+ Reviewer does not run tests and does not choose owners or fixes. PM routes
342
342
  findings back to the responsible role.
343
343
 
344
344
  ## Translation
@@ -405,7 +405,7 @@ Gateway can:
405
405
  - translate mobile messages when Gateway translation is enabled
406
406
 
407
407
  Gateway does not expose the embedded terminal and does not send directly to
408
- Architect, Coder, Tester, or Gate Reviewer.
408
+ Architect, Coder, Tester, or Reviewer.
409
409
 
410
410
  Common commands:
411
411
 
@@ -462,7 +462,7 @@ files.
462
462
 
463
463
  `Auto memory` is the switch for the entire automated memory workflow. During
464
464
  Review Task Harness after Final Acceptance, Project Manager, Architect, Coder,
465
- Tester, and an enabled Gate Reviewer submit proposals in sequence through
465
+ Tester, and an enabled Reviewer submit proposals in sequence through
466
466
  `vcm-propose-memory`. Harness Engineer verifies and consolidates them before VCM
467
467
  applies the result. Roles cannot edit active memory directly.
468
468
 
@@ -484,7 +484,7 @@ Final Acceptance
484
484
  ```
485
485
 
486
486
  Memory proposal prompts sent to Project Manager, Architect, Coder, Tester, and
487
- an enabled Gate Reviewer use their normal task sessions and participate in
487
+ an enabled Reviewer use their normal task sessions and participate in
488
488
  Round/Turn tracking. Harness Engineer review and retrospective work remain tool
489
489
  role activity and do not participate in Round completion.
490
490
 
@@ -8,7 +8,7 @@ import { renderArchitectHarnessRules } from "../templates/harness/architect-agen
8
8
  import { renderCoderHarnessRules } from "../templates/harness/coder-agent.js";
9
9
  import { renderCoderWorkerHarnessRules } from "../templates/harness/coder-worker-agent.js";
10
10
  import { renderArchitectScaffoldWorkerHarnessRules } from "../templates/harness/architect-scaffold-worker-agent.js";
11
- import { renderGateReviewerAgentRules, renderRequestGateReviewTool, renderTranslatorAgentRules, renderVcmGateReviewSkillRules } from "../templates/harness/gate-review.js";
11
+ import { renderReviewerAgentRules, renderRequestGateReviewTool, renderTranslatorAgentRules, renderVcmGateReviewSkillRules } from "../templates/harness/gate-review.js";
12
12
  import { renderHarnessEngineerHarnessRules } from "../templates/harness/harness-engineer-agent.js";
13
13
  import { renderRootClaudeHarnessRules } from "../templates/harness/claude-root.js";
14
14
  import { renderGitignoreHarnessRules } from "../templates/harness/gitignore.js";
@@ -34,6 +34,8 @@ const CLI_DIR = path.dirname(fileURLToPath(import.meta.url));
34
34
  const APP_ROOT = path.resolve(CLI_DIR, "../../..");
35
35
  const VCM_PACKAGE_VERSION = readVcmPackageVersion(APP_ROOT);
36
36
  const MANIFEST_PATH = ".ai/vcm-harness-manifest.json";
37
+ const LEGACY_REVIEWER_AGENT_PATH = ".claude/agents/gate-reviewer.md";
38
+ const REVIEWER_AGENT_PATH = ".claude/agents/reviewer.md";
37
39
  const HTML_BLOCK_PATTERN = /<!-- VCM:BEGIN(?:\s+version=\d+)? -->[\s\S]*?<!-- VCM:END -->/m;
38
40
  const HASH_BLOCK_PATTERN = /# VCM:BEGIN(?:\s+version=\d+)?\n[\s\S]*?# VCM:END/m;
39
41
  const LEGACY_CODEX_HARNESS_PATHS = [
@@ -71,7 +73,7 @@ const AGENT_FRONTMATTER = {
71
73
  tester: {
72
74
  description: "VCM testing role for validation, test adequacy, approved-scope validation, and risk findings."
73
75
  },
74
- "gate-reviewer": {
76
+ reviewer: {
75
77
  description: "VCM independent gate review role for architecture plans, validation adequacy, and code diffs.",
76
78
  tools: "Read, Grep, Glob, Bash, Write"
77
79
  },
@@ -171,13 +173,13 @@ const MANAGED_FILES = [
171
173
  content: renderPullRequestTemplateHarnessRules()
172
174
  },
173
175
  {
174
- path: ".claude/agents/gate-reviewer.md",
175
- title: "Gate Reviewer Agent",
176
- agentName: "gate-reviewer",
176
+ path: ".claude/agents/reviewer.md",
177
+ title: "Reviewer Agent",
178
+ agentName: "reviewer",
177
179
  commentStyle: "html",
178
- category: "gate-reviewer-agent",
180
+ category: "reviewer-agent",
179
181
  memoryBlock: true,
180
- content: renderGateReviewerAgentRules()
182
+ content: renderReviewerAgentRules()
181
183
  },
182
184
  {
183
185
  path: ".claude/agents/translator.md",
@@ -380,6 +382,7 @@ async function main() {
380
382
  const dryRun = args.dryRun;
381
383
  const operations = [];
382
384
  await assertDirectory(projectRoot, "Project root");
385
+ await migrateReviewerAgent({ projectRoot, dryRun, operations });
383
386
  const manifest = await buildManifest(projectRoot);
384
387
  for (const definition of MANAGED_FILES) {
385
388
  await installManagedFile({ projectRoot, definition, dryRun, operations });
@@ -405,6 +408,32 @@ async function main() {
405
408
  });
406
409
  printReport({ projectRoot, dryRun, operations });
407
410
  }
411
+ async function migrateReviewerAgent({ projectRoot, dryRun, operations }) {
412
+ const legacyPath = resolveInside(projectRoot, LEGACY_REVIEWER_AGENT_PATH);
413
+ const legacyContent = await readOptionalText(legacyPath);
414
+ if (legacyContent === undefined) {
415
+ return;
416
+ }
417
+ const reviewerPath = resolveInside(projectRoot, REVIEWER_AGENT_PATH);
418
+ const reviewerContent = await readOptionalText(reviewerPath);
419
+ if (dryRun) {
420
+ operations.push(plan(LEGACY_REVIEWER_AGENT_PATH, reviewerContent === undefined
421
+ ? `rename to ${REVIEWER_AGENT_PATH}`
422
+ : `delete after ${REVIEWER_AGENT_PATH} was installed`));
423
+ return;
424
+ }
425
+ if (reviewerContent === undefined) {
426
+ const migratedContent = legacyContent
427
+ .replace(/^name:[ \t]*gate-reviewer[ \t]*$/m, "name: reviewer")
428
+ .replace(/^# Gate Reviewer Agent[ \t]*$/m, "# Reviewer Agent");
429
+ await fs.mkdir(path.dirname(reviewerPath), { recursive: true });
430
+ await fs.writeFile(reviewerPath, migratedContent, "utf8");
431
+ }
432
+ await fs.rm(legacyPath, { force: true });
433
+ operations.push(done(LEGACY_REVIEWER_AGENT_PATH, reviewerContent === undefined
434
+ ? `renamed to ${REVIEWER_AGENT_PATH}`
435
+ : `deleted after ${REVIEWER_AGENT_PATH} was installed`));
436
+ }
408
437
  function parseArgs(argv) {
409
438
  const args = {
410
439
  dryRun: false,
@@ -14,7 +14,7 @@ const MEMORY_FILE_DEFINITIONS = [
14
14
  { path: ".claude/agents/architect.md", title: "Architect Memory", role: "architect" },
15
15
  { path: ".claude/agents/coder.md", title: "Coder Memory", role: "coder" },
16
16
  { path: ".claude/agents/tester.md", title: "Tester Memory", role: "tester" },
17
- { path: ".claude/agents/gate-reviewer.md", title: "Gate Reviewer Memory", role: "gate-reviewer" },
17
+ { path: ".claude/agents/reviewer.md", title: "Reviewer Memory", role: "reviewer" },
18
18
  { path: ".claude/agents/harness-engineer.md", title: "Harness Engineer Memory", role: "harness-engineer" }
19
19
  ];
20
20
  export function createAutoMemoryService(deps) {
@@ -151,7 +151,7 @@ export function createAutoMemoryService(deps) {
151
151
  const gateSettings = await deps.appSettings.getGateReviewSettings(input.baseRepoRoot, input.taskSlug);
152
152
  const roles = ["project-manager", "architect", "coder", "tester"];
153
153
  if (gateSettings.enabled) {
154
- roles.push("gate-reviewer");
154
+ roles.push("reviewer");
155
155
  }
156
156
  const timestamp = now();
157
157
  const runId = createRunId(timestamp, "auto");
@@ -1,4 +1,4 @@
1
- import { isGateReviewerRoleName, isHarnessEngineerToolRoleName, isTranslatorToolRoleName, isVcmRoleName } from "../../shared/constants.js";
1
+ import { isHarnessEngineerToolRoleName, isReviewerRoleName, isTranslatorToolRoleName, isVcmRoleName } from "../../shared/constants.js";
2
2
  import { VcmError } from "../errors.js";
3
3
  import { readTranscriptTurnEvidence } from "./claude-transcript-reply.js";
4
4
  import { submitTerminalInput } from "../runtime/terminal-submit.js";
@@ -298,7 +298,7 @@ export function createClaudeHookService(deps) {
298
298
  }
299
299
  }
300
300
  return recordTurnEnd(input, context, eventName, {
301
- dispatchRouteFiles: !isGateReviewerRoleName(input.role),
301
+ dispatchRouteFiles: !isReviewerRoleName(input.role),
302
302
  notifyGateway: true,
303
303
  settleGuard: true
304
304
  });
@@ -347,7 +347,7 @@ export function createClaudeHookService(deps) {
347
347
  if (hasCompletionEvidence) {
348
348
  await clearStopFailureRecoveryState(context, input.role);
349
349
  return recordTurnEnd(input, context, eventName, {
350
- dispatchRouteFiles: !isGateReviewerRoleName(input.role),
350
+ dispatchRouteFiles: !isReviewerRoleName(input.role),
351
351
  notifyGateway: false,
352
352
  settleGuard: true
353
353
  });
@@ -6,11 +6,11 @@ import { VcmError } from "../errors.js";
6
6
  import { resolveRepoPath } from "../adapters/filesystem.js";
7
7
  import { submitTerminalInput } from "../runtime/terminal-submit.js";
8
8
  import { getTaskRuntimeRepoRoot } from "./task-service.js";
9
- const GATE_REVIEW_AGENT_PATH = ".claude/agents/gate-reviewer.md";
9
+ const REVIEWER_AGENT_PATH = ".claude/agents/reviewer.md";
10
10
  const GATE_REVIEW_DIR = ".ai/vcm/gate-reviews";
11
11
  const REQUESTS_DIR = ".ai/vcm/gate-reviews/requests";
12
12
  const GATE_REVIEW_VERSION = 1;
13
- const GATE_REVIEWER_ROLE = "gate-reviewer";
13
+ const REVIEWER_ROLE = "reviewer";
14
14
  const DEFAULT_REPORT_POLL_INTERVAL_MS = 1000;
15
15
  const DEFAULT_REPORT_TIMEOUT_MS = 30 * 60 * 1000;
16
16
  const activeRuns = new Set();
@@ -431,7 +431,7 @@ export function createGateReviewService(deps) {
431
431
  });
432
432
  await updateRequestStatus(deps.fs, context, requestId, "running", { startedAt: timestamp });
433
433
  const reviewDir = resolveRepoPath(context.taskRepoRoot, GATE_REVIEW_DIR);
434
- const agentPath = resolveRepoPath(context.repoRoot, GATE_REVIEW_AGENT_PATH);
434
+ const agentPath = resolveRepoPath(context.repoRoot, REVIEWER_AGENT_PATH);
435
435
  const prompt = buildGatePrompt(context, gate, requestId, codeDiffInput, codeDiffSources);
436
436
  await deps.fs.ensureDir(reviewDir);
437
437
  await deps.fs.ensureDir(resolveRepoPath(context.taskRepoRoot, REQUESTS_DIR));
@@ -439,20 +439,20 @@ export function createGateReviewService(deps) {
439
439
  if (!(await deps.fs.pathExists(agentPath))) {
440
440
  throw new VcmError({
441
441
  code: "GATE_REVIEW_AGENT_MISSING",
442
- message: `${GATE_REVIEW_AGENT_PATH} does not exist.`,
442
+ message: `${REVIEWER_AGENT_PATH} does not exist.`,
443
443
  statusCode: 409,
444
444
  hint: "Apply the VCM harness before requesting Gate Review Gates."
445
445
  });
446
446
  }
447
- const session = await ensureGateReviewerSession(context);
447
+ const session = await ensureReviewerSession(context);
448
448
  await submitTerminalInput(deps.runtime, session.id, prompt);
449
- await deps.sessionService.markRoleActivityRunning(context.repoRoot, context.taskSlug, GATE_REVIEWER_ROLE, session.id);
449
+ await deps.sessionService.markRoleActivityRunning(context.repoRoot, context.taskSlug, REVIEWER_ROLE, session.id);
450
450
  await deps.roundService.recordRoleTurnEvent({
451
451
  repoRoot: context.repoRoot,
452
452
  stateRepoRoot: context.taskRepoRoot,
453
453
  stateRoot: context.stateRoot,
454
454
  taskSlug: context.taskSlug,
455
- role: GATE_REVIEWER_ROLE,
455
+ role: REVIEWER_ROLE,
456
456
  eventName: "UserPromptSubmit"
457
457
  });
458
458
  const parsed = await waitForGateReport(deps.fs, context.taskRepoRoot, gate, requestId, now(), {
@@ -501,24 +501,24 @@ export function createGateReviewService(deps) {
501
501
  activeRuns.delete(runKey);
502
502
  }
503
503
  }
504
- async function ensureGateReviewerSession(context) {
505
- const existing = await deps.sessionService.getRoleSession(context.repoRoot, context.taskSlug, GATE_REVIEWER_ROLE);
504
+ async function ensureReviewerSession(context) {
505
+ const existing = await deps.sessionService.getRoleSession(context.repoRoot, context.taskSlug, REVIEWER_ROLE);
506
506
  if (existing?.status === "running" && deps.runtime.getSession(existing.id)) {
507
507
  return existing;
508
508
  }
509
509
  if (existing?.claudeSessionId) {
510
510
  try {
511
- return await deps.sessionService.resumeRoleSession(context.repoRoot, context.taskSlug, GATE_REVIEWER_ROLE, {
511
+ return await deps.sessionService.resumeRoleSession(context.repoRoot, context.taskSlug, REVIEWER_ROLE, {
512
512
  cols: 100,
513
513
  rows: 28,
514
514
  model: "default"
515
515
  });
516
516
  }
517
517
  catch {
518
- // Fall through to a fresh Gate Reviewer terminal if the saved session cannot be resumed.
518
+ // Fall through to a fresh Reviewer terminal if the saved session cannot be resumed.
519
519
  }
520
520
  }
521
- return deps.sessionService.startRoleSession(context.repoRoot, context.taskSlug, GATE_REVIEWER_ROLE, {
521
+ return deps.sessionService.startRoleSession(context.repoRoot, context.taskSlug, REVIEWER_ROLE, {
522
522
  cols: 100,
523
523
  rows: 28,
524
524
  model: "default"
@@ -891,7 +891,7 @@ async function computeInputHash(deps, taskRepoRoot, gate, codeDiffInput, codeDif
891
891
  "CLAUDE.md",
892
892
  ".claude/agents/architect.md",
893
893
  ".claude/agents/coder.md",
894
- ".claude/agents/gate-reviewer.md",
894
+ ".claude/agents/reviewer.md",
895
895
  ".claude/agents/tester.md",
896
896
  ".claude/skills/vcm-gate-review/SKILL.md",
897
897
  ".ai/tools/request-gate-review",
@@ -1048,13 +1048,13 @@ function buildGatePrompt(context, gate, requestId, codeDiffInput, codeDiffSource
1048
1048
  ? "\nDiff: inspect git status/diff in Worktree."
1049
1049
  : "";
1050
1050
  const architectureContract = gate === "architecture-plan"
1051
- ? "\n\nComplete every Architecture Analysis field required by the Gate Reviewer role with concrete current-worktree evidence before deciding."
1051
+ ? "\n\nComplete every Architecture Analysis field required by the Reviewer role with concrete current-worktree evidence before deciding."
1052
1052
  : "";
1053
1053
  const validationContract = gate === "validation-adequacy"
1054
- ? "\n\nComplete every Validation Analysis field required by the Gate Reviewer role with concrete current-worktree production and test evidence before deciding."
1054
+ ? "\n\nComplete every Validation Analysis field required by the Reviewer role with concrete current-worktree production and test evidence before deciding."
1055
1055
  : "";
1056
1056
  const codeDiffContract = gate === "code-diff"
1057
- ? "\n\nComplete every Code Diff Analysis field required by the Gate Reviewer role with concrete evidence from the named commit range before deciding."
1057
+ ? "\n\nComplete every Code Diff Analysis field required by the Reviewer role with concrete evidence from the named commit range before deciding."
1058
1058
  : "";
1059
1059
  const codeDiffSection = gate === "code-diff" && codeDiffInput
1060
1060
  ? `
@@ -1109,7 +1109,7 @@ async function waitForGateReport(fs, taskRepoRoot, gate, requestId, timestamp, o
1109
1109
  const detail = errorMessage(lastError);
1110
1110
  throw new VcmError({
1111
1111
  code: "GATE_REVIEW_REPORT_TIMEOUT",
1112
- message: `Gate Reviewer did not produce a valid ${gate} report within ${Math.round(options.timeoutMs / 1000)}s.`,
1112
+ message: `Reviewer did not produce a valid ${gate} report within ${Math.round(options.timeoutMs / 1000)}s.`,
1113
1113
  statusCode: 504,
1114
1114
  hint: detail
1115
1115
  });
@@ -5,7 +5,7 @@ import { renderArchitectHarnessRules } from "../templates/harness/architect-agen
5
5
  import { renderCoderHarnessRules } from "../templates/harness/coder-agent.js";
6
6
  import { renderCoderWorkerHarnessRules } from "../templates/harness/coder-worker-agent.js";
7
7
  import { renderArchitectScaffoldWorkerHarnessRules } from "../templates/harness/architect-scaffold-worker-agent.js";
8
- import { renderGateReviewerAgentRules, renderRequestGateReviewTool, renderTranslatorAgentRules, renderVcmGateReviewSkillRules } from "../templates/harness/gate-review.js";
8
+ import { renderReviewerAgentRules, renderRequestGateReviewTool, renderTranslatorAgentRules, renderVcmGateReviewSkillRules } from "../templates/harness/gate-review.js";
9
9
  import { renderHarnessEngineerHarnessRules } from "../templates/harness/harness-engineer-agent.js";
10
10
  import { renderRootClaudeHarnessRules } from "../templates/harness/claude-root.js";
11
11
  import { renderGitignoreHarnessRules } from "../templates/harness/gitignore.js";
@@ -183,12 +183,12 @@ const HARNESS_FILES = [
183
183
  renderRules: renderRestartArchitectSkillRules
184
184
  },
185
185
  {
186
- kind: "agent-gate-reviewer",
187
- path: ".claude/agents/gate-reviewer.md",
188
- title: "Gate Reviewer Agent",
186
+ kind: "agent-reviewer",
187
+ path: ".claude/agents/reviewer.md",
188
+ title: "Reviewer Agent",
189
189
  memoryBlock: true,
190
- frontmatter: renderAgentFrontmatter("gate-reviewer", "VCM independent gate review role for architecture plans, validation adequacy, and code diffs.", { tools: "Read, Grep, Glob, Bash, Write" }),
191
- renderRules: renderGateReviewerAgentRules
190
+ frontmatter: renderAgentFrontmatter("reviewer", "VCM independent gate review role for architecture plans, validation adequacy, and code diffs.", { tools: "Read, Grep, Glob, Bash, Write" }),
191
+ renderRules: renderReviewerAgentRules
192
192
  },
193
193
  {
194
194
  kind: "agent-translator",
@@ -1279,7 +1279,7 @@ async function analyzeLegacyCodexHarnessPaths(fs, repoRoot) {
1279
1279
  changes.push({
1280
1280
  path: relativePath,
1281
1281
  action: "delete",
1282
- reason: "Legacy Codex harness path is obsolete; VCM now uses Claude Code Gate Reviewer and Translator roles."
1282
+ reason: "Legacy Codex harness path is obsolete; VCM now uses Claude Code Reviewer and Translator roles."
1283
1283
  });
1284
1284
  }
1285
1285
  return changes;
@@ -1,4 +1,4 @@
1
- import { CORE_VCM_ROLE_DEFINITIONS, GATE_REVIEWER_ROLE_DEFINITION, VCM_ROLE_NAMES } from "../../shared/constants.js";
1
+ import { CORE_VCM_ROLE_DEFINITIONS, REVIEWER_ROLE_DEFINITION, VCM_ROLE_NAMES } from "../../shared/constants.js";
2
2
  import { VcmError } from "../errors.js";
3
3
  import { getTaskRuntimeRepoRoot } from "./task-service.js";
4
4
  const ONE_CLICK_SESSION_COLS = 100;
@@ -25,10 +25,10 @@ export function createTaskLaunchService(deps) {
25
25
  mode
26
26
  });
27
27
  }
28
- function composeRoleDefinitions(gateReviewerEnabled) {
28
+ function composeRoleDefinitions(reviewerEnabled) {
29
29
  return [
30
30
  ...CORE_VCM_ROLE_DEFINITIONS,
31
- ...(gateReviewerEnabled ? [GATE_REVIEWER_ROLE_DEFINITION] : [])
31
+ ...(reviewerEnabled ? [REVIEWER_ROLE_DEFINITION] : [])
32
32
  ];
33
33
  }
34
34
  // Skip a running role, resume one that has a prior Claude session, otherwise
@@ -1,10 +1,10 @@
1
1
  import { renderRoleMemoryRules } from "./role-memory.js";
2
- export function renderGateReviewerAgentRules() {
2
+ export function renderReviewerAgentRules() {
3
3
  return `## Role
4
4
 
5
- You are VCM \`gate-reviewer\`.
5
+ You are VCM \`reviewer\`.
6
6
 
7
- ${renderRoleMemoryRules("gate-reviewer")}
7
+ ${renderRoleMemoryRules("reviewer")}
8
8
 
9
9
  Review only the gate in the VCM prompt. Use the task and worktree paths named there. Project memory may orient you, but only current worktree evidence can decide the gate.
10
10
 
@@ -459,7 +459,7 @@ When VCM sends \`[VCM GATE REVIEW CALLBACK]\`, read the named report path.
459
459
  - \`failed\`: stop and ask the user to retry, skip, or override in VCM.
460
460
  - \`skipped\` or \`overridden\`: record the exception reason in PM context and continue only as appropriate.
461
461
 
462
- Do not ask Gate Reviewer to choose owners, fixes, Replan, or user-intervention needs. PM routes those decisions through normal VCM responsibilities.`;
462
+ Do not ask Reviewer to choose owners, fixes, Replan, or user-intervention needs. PM routes those decisions through normal VCM responsibilities.`;
463
463
  }
464
464
  export function renderRequestGateReviewTool() {
465
465
  return `#!/usr/bin/env python3
@@ -691,7 +691,7 @@ def input_hash(root: Path, gate: str, sources: list[str] | None = None, gate_rec
691
691
  "CLAUDE.md",
692
692
  ".claude/agents/architect.md",
693
693
  ".claude/agents/coder.md",
694
- ".claude/agents/gate-reviewer.md",
694
+ ".claude/agents/reviewer.md",
695
695
  ".claude/agents/tester.md",
696
696
  ".claude/skills/vcm-gate-review/SKILL.md",
697
697
  ".ai/tools/request-gate-review",
@@ -40,7 +40,7 @@ PM Managed Mode applies only when the user explicitly asks to complete the curre
40
40
  - PM must drive the accepted task to completion through the normal VCM flow.
41
41
  - PM must not reduce, defer, reinterpret, skip, or move requested work outside the current task.
42
42
  - PM must not use workload, task size, context size, implementation difficulty, dependency choice, refactor need, testing effort, or number of iterations as a reason to ask the user.
43
- - Technical execution questions are handled inside the VCM flow. PM routes them to Architect, Coder, Tester, or Gate Reviewer according to role responsibility.
43
+ - Technical execution questions are handled inside the VCM flow. PM routes them to Architect, Coder, Tester, or Reviewer according to role responsibility.
44
44
  - PM may defer non-blocking user-facing questions until the final user report, but only when continuing does not require user intent, external authorization, or a user-approved exception.
45
45
  - Deferred questions remain part of the current task report. They must not become follow-up scope unless the user explicitly creates a new task.
46
46
  - PM must pause and ask the user only when the task cannot proceed without user intent or real-world authorization: unclear or conflicting requested outcome, required account/secret/test environment/data access, real cost, production permission, sensitive data access, destructive or irreversible real-world action, durable-doc conflict requiring user choice, or a required user-approved exception.
@@ -334,7 +334,7 @@ PM may lightly rewrite the user's words to:
334
334
  - Do not run \`code-diff\` for incomplete, failed, planning-only, Docs-Only Flow, Validation-Only Flow, PR-Preparation Flow, or Communication-Only Flow.
335
335
  - Gate Review trigger points apply only when the active delivery flow reaches that milestone. Do not run Gate Review for Communication-Only Flow.
336
336
  - On a callback, accept only \`approve\` or \`request_changes\`. Apply \`request_changes\` through the allowed branch defined by the active flow; in Code-Change Flow use Architecture Plan Revision, Code-Diff Correction, or Validation Revision according to the gate.
337
- - Do not ask Gate Reviewer to choose owners, fixes, Replan, or user-intervention needs.
337
+ - Do not ask Reviewer to choose owners, fixes, Replan, or user-intervention needs.
338
338
  - Record gate decision, report path, and any skip or override reason.
339
339
 
340
340
  ### Partial Role Results
@@ -26,15 +26,15 @@ export const CORE_VCM_ROLE_DEFINITIONS = [
26
26
  dispatchable: true
27
27
  }
28
28
  ];
29
- export const GATE_REVIEWER_ROLE_DEFINITION = {
30
- name: "gate-reviewer",
31
- label: "Gate Reviewer",
32
- commandAgent: "gate-reviewer",
29
+ export const REVIEWER_ROLE_DEFINITION = {
30
+ name: "reviewer",
31
+ label: "Reviewer",
32
+ commandAgent: "reviewer",
33
33
  dispatchable: false
34
34
  };
35
35
  export const VCM_ROLE_DEFINITIONS = [
36
36
  ...CORE_VCM_ROLE_DEFINITIONS,
37
- GATE_REVIEWER_ROLE_DEFINITION
37
+ REVIEWER_ROLE_DEFINITION
38
38
  ];
39
39
  export const TRANSLATOR_TOOL_ROLE_DEFINITION = {
40
40
  name: "translator",
@@ -69,8 +69,8 @@ export function isRoleName(value) {
69
69
  export function isVcmRoleName(value) {
70
70
  return VCM_ROLE_NAMES.includes(value);
71
71
  }
72
- export function isGateReviewerRoleName(value) {
73
- return value === GATE_REVIEWER_ROLE_DEFINITION.name;
72
+ export function isReviewerRoleName(value) {
73
+ return value === REVIEWER_ROLE_DEFINITION.name;
74
74
  }
75
75
  export function isToolRoleName(value) {
76
76
  return TOOL_ROLE_NAMES.includes(value);
@@ -3,6 +3,6 @@ export const VCM_MEMORY_ROLE_NAMES = [
3
3
  "architect",
4
4
  "coder",
5
5
  "tester",
6
- "gate-reviewer",
6
+ "reviewer",
7
7
  "harness-engineer"
8
8
  ];