DOCS · CONFIGURATION

Configuration

Synthex reads project settings from .synthex/config.yaml. Anything you don't specify falls back to the plugin's documented default, so the file only needs to contain the values you actually want to override.

File location and resolution

init/synthex:init creates .synthex/config.yaml at your project root as a copy of the plugin defaults, with inline comments documenting every section. Settings can live in four files. They resolve in this order, with later values winning:

LayerPathScope
Plugin defaultsconfig/defaults.yamlShipped with Synthex
User~/.config/synthex/config.yamlYour settings for every repo. Honors $XDG_CONFIG_HOME
Project (shared).synthex/config.yamlThe team's settings for this repo. Committed
Project-local.synthex/config.local.yamlYour settings for this one repo. Gitignored by init/synthex:init, never committed

Within a command, per-command overrides (the review_loops: block under a specific command's section) beat the global block, and per-invocation parameters passed to the command itself beat everything.

For when to use each layer, with worked examples, see Workspaces & config layers.

Project settings beat user settings, matching Claude Code's settings precedence, so a repo can pin behavior for everyone who works in it. Only include the keys you want to change at each layer; the rest fall through. You can delete any section you don't want to override; missing keys and missing files do not error.

A project that still keeps settings in the old .synthex-plus/config.yaml keeps working for one major version: it is read just below .synthex/config.yaml, with a deprecation warning when a value only resolves there. Move those keys into .synthex/config.yaml.

init/synthex:init also writes .synthex/facts.md, a cache of detected project facts (commit convention, test runner, frontend framework, and a spec index). Agents read it first and fall back to detecting a fact themselves when it is missing or stale. It is gitignored, because the recorded commit SHAs and file times differ per clone.

Keys that break the order

Two narrow groups of multi-model review keys resolve differently, because they are not the repo's call:

  • User-owned: multi_model_review.per_reviewer.*. Which external models are installed on a machine, and what they are called, depends on the machine, not the repo. Your user layer is consulted first, so a repo asking for qwen2.5-coder:32b cannot override the model you actually pulled.
  • Restrictive-wins: multi_model_review.enabled and any multi_model_review.*.enabled. false in any hand-written layer disables it, the way Claude Code unions permission deny rules instead of replacing them. A repo cannot turn on sending your code to an external CLI after you have turned it off. Plugin defaults don't count here, so the shipped false is still just a default.

To turn external review off everywhere, whatever a repo asks for:

# ~/.config/synthex/config.yaml
multi_model_review:
  enabled: false

User-level config never makes Synthex treat an unrelated repo as initialized. Hooks still check only the project's own .synthex/ files.

Global review loops

review_loops:
  max_cycles: 2
  min_severity_to_address: high
KeyDefaultWhat it does
max_cycles2Maximum review iterations before the loop exits with unresolved findings recorded
min_severity_to_addresshighMinimum severity that blocks loop exit. Options: critical, high, medium, low

Most commands inherit this block. Individual commands can override it under their own section (implementation_plan.review_loops, code_review.review_loops, and so on).

Model profiles

Pick how much model each spawned agent gets, project-wide or per agent.

models:
  profile: balanced # economy | balanced | premium
  agents:
    code-reviewer:
      model: opus
      effort: high
KeyDefaultWhat it does
profilebalancedActive tier. balanced is each agent's shipped model and effort, unchanged
agents.<name>{}Pin one agent's model and/or effort, whatever the profile
profiles.economysee belowPer-agent model/effort deltas applied under economy
profiles.premiumsee belowPer-agent model/effort deltas applied under premium
hosts.<harness>.modelsopencode, gemini, codex mapsTier → host-native model name, for harnesses other than Claude Code (advisory)

The tiers only change the agents where it matters; every other agent keeps its shipped settings under any profile:

ProfileChanges from balanced
economyProduct Manager and Architect stay on Opus but drop from high to medium effort
balancedNone
premiumProduct Manager and Architect move to Fable at xhigh effort; Security Reviewer goes to xhigh

Commands that spawn agents (next-priority/synthex:next-priority,

review-code/synthex:review-code, performance-audit/synthex:performance-audit, refine-requirements/synthex:refine-requirements, write-implementation-plan/synthex:write-implementation-plan, write-rfc/synthex:write-rfc) accept --profile economy|balanced|premium for one run.

Each agent's model and effort resolve in this order, first match wins:

  1. The --profile flag
  2. models.agents.<name>
  3. The models.profile tier
  4. The agent's own shipped settings

On Claude Code the result is applied to each spawned agent directly. Other harnesses treat these keys as advisory: they apply them where the harness supports choosing a model per sub-agent, and otherwise run every sub-agent on the session's model. models.hosts maps each tier to a harness's own model names for that case. A running standing review pool keeps the models it started with; a profile change reaches only newly spawned agents.

Implementation plan

Used by write-implementation-plan/synthex:write-implementation-plan.

implementation_plan:
  reviewers:
    - agent: architect
      enabled: true
      focus: "Technical architecture, feasibility, NFR coverage, missing technical tasks"
    - agent: design-system-agent
      enabled: true
      focus: "Design tasks, UX impact, visual/interaction design clarity"
    - agent: tech-lead
      enabled: true
      focus: "Task clarity, acceptance criteria, parallelizability, dependency accuracy"
  concurrent_tasks: 3
  review_loops:
    max_cycles: 3
KeyDefaultWhat it does
reviewersarchitect, design-system-agent, tech-leadSub-agents that review the draft plan. Add specialists or disable defaults
concurrent_tasks3Maximum tasks the PM recommends per parallel batch in the plan output
review_loopsmax_cycles: 3Plans get one extra cycle by default since they ripple downstream

To add a project-specific reviewer, append to the list:

implementation_plan:
  reviewers:
    - agent: compliance-reviewer
      enabled: true
      focus: "Regulatory compliance, audit trail requirements"

To disable a default reviewer, set enabled: false on its entry.

Older configs may still list agent: designer. There is no agent by that name; Synthex reads it as design-system-agent here and as lead-frontend-engineer in the refine requirements roster, so existing configs keep working.

Refine requirements

Used by refine-requirements/synthex:refine-requirements.

refine_requirements:
  reviewers:
    - agent: product-manager
      enabled: true
      focus: "Requirement clarity, acceptance criteria, scope boundaries, success metrics"
    - agent: tech-lead
      enabled: true
      focus: "Technical clarity, implicit assumptions, NFR targets, missing requirements"
    - agent: lead-frontend-engineer
      enabled: true
      focus: "UX clarity, interaction patterns, accessibility, user flow completeness"

The roster mirrors the plan reviewers but with PRD-focused prompts. The Product Manager always leads the interview; reviewers join the clarity loop afterward.

Code review

Used by review-code/synthex:review-code.

code_review:
  reviewers:
    - code-reviewer
    - security-reviewer
  max_diff_lines: 300
  convention_sources:
    - CLAUDE.md
    - .eslintrc
    - .prettierrc
  spec_paths:
    - docs/specs
KeyDefaultWhat it does
reviewerscode-reviewer, security-reviewerMandatory parallel reviewers; both run on every diff. An entry may also be a prompt file
max_diff_lines300Threshold above which the reviewer warns that diff size hurts review quality
convention_sourcesCLAUDE.md, .eslintrc, .prettierrcFiles the code reviewer reads to learn project conventions
spec_pathsdocs/specsDirectories the reviewer scans for specifications to check compliance against
spec_inline_bytes65536When specs under spec_paths total more than this, the reviewer skims the first 50 lines of each and reads only the relevant ones in full
verificationoffprose turns on the verification pass
engineproseworkflow opts into the review engine on Claude Code
refute_passoffon adds the review engine's adversarial refute pass
specialistsunsetOptional extra reviewers, each an agent: with a focus:
review_loopsinherits globalPer-command override of the global review loops

For performance-critical code, add the optional performance-engineer reviewer:

code_review:
  reviewers:
    - code-reviewer
    - security-reviewer
    - performance-engineer

Specialist reviewers (compliance, accessibility, domain experts) attach via the specialists: block in the same section.

Verification pass

code_review:
  verification: prose # prose | off

With prose, the Code Reviewer, Security Reviewer, and Performance Engineer each check their own top five critical and high findings before reporting them. They use a language-server tool when the session has one, otherwise they grep for the symbol's references. Each checked finding gets a Verification: line: CONFIRMED (lsp), CONFIRMED (grep), or PLAUSIBLE (none) when it couldn't be checked. Verification never blocks the review.

It is off by default because it adds tool calls and changes the report. The review engine has its own, heavier check, refute_pass, which is a separate key.

Prompt-file reviewers

Any reviewers entry can point at a markdown prompt file in your project instead of naming a Synthex agent. A review prompt you already maintain — a CI guardian prompt, a house checklist, a domain rule set — then runs as part of a Synthex review without being rewritten as a plugin agent. Its findings are deduped, severity-ranked, and attributed alongside every other reviewer's rather than landing in a section of their own.

Accepted in every reviewer block: code_review.reviewers, implementation_plan.reviewers, and refine_requirements.reviewers. - prompt: and - agent: entries mix freely in one list.

code_review:
  reviewers:
    - code-reviewer
    - security-reviewer
    - prompt: .github/scripts/pr-guardian/prompt.md
      id: pr-guardian # optional; here it would default to `pr-guardian` anyway
      enabled: true # optional; defaults to true
KeyRequiredWhat it does
promptyesPath to the prompt file, relative to the project root. Absolute paths and paths escaping the project root are rejected
idnoAttribution label in the report. Falls back to the frontmatter name; then, for a generic filename (prompt.md, review.md, index.md), the name of its directory; otherwise the filename without its extension
enablednofalse skips the reviewer, matching - agent: entries

In blocks that support focus: (implementation_plan, refine_requirements), a focus: on a prompt: entry is appended to the borrowed prompt the same way.

Frontmatter. The file may carry YAML frontmatter; only name is read (as the id fallback). Every other field is ignored rather than rejected, so a prompt written for another runner stays valid. A file with no frontmatter is fine — the whole file is the prompt.

Output contract. Synthex appends the host command's reviewer output format to the prompt. Where the borrowed prompt specifies its own output format, the appended contract wins.

Read-only by convention. Borrowed CI prompts often post comments or call gh. The appended contract tells the reviewer to apply the review criteria but ignore any instruction to post, write, or otherwise act. This is a convention, not a sandbox — review prompt files the way you review any code that runs in your repo.

Failure modes degrade, never abort. A missing, unreadable, empty, absolute, or project-escaping path skips that one reviewer with a warning; the rest of the review continues. A prompt reviewer that returns nothing is reported as FAIL (no response), the same as a named reviewer. A review left with no usable reviewers at all reports FAIL rather than an empty PASS.

Standing pools. When review-code/synthex:review-code routes a review to a standing review pool, the pool's report is the review and prompt-file reviewers do not run. A reviewer list made up entirely of prompt files skips pool routing.

Quality / testing

Used by test-coverage-analysis/synthex:test-coverage-analysis.

quality:
  coverage_thresholds:
    line: 80
    branch: 70
    function: 80
  test_runner: vitest
  priority_modules: []
KeyDefaultWhat it does
coverage_thresholds.line80Minimum line coverage for new code
coverage_thresholds.branch70Minimum branch coverage for new code
coverage_thresholds.function80Minimum function coverage for new code
test_runnervitestTest runner used to produce coverage reports
priority_modules[]Modules that always require thorough coverage. Empty = auto-detect by risk

Architecture

Used by write-adr/synthex:write-adr and write-rfc/synthex:write-rfc.

architecture:
  decisions_path: docs/specs/decisions
  rfcs_path: docs/specs/rfcs
KeyDefaultWhat it does
decisions_pathdocs/specs/decisionsWhere Architecture Decision Records land
rfcs_pathdocs/specs/rfcsWhere RFCs land

Design system

Used by design-system-audit/synthex:design-system-audit.

design_system:
  spec_path: docs/specs/design-system.md
  scan_paths:
    - src/
KeyDefaultWhat it does
spec_pathdocs/specs/design-system.mdCanonical reference for tokens, components, and patterns
scan_pathssrc/Directories to scan during compliance audits
specialistsunsetOptional framework specialists, each an agent: with a focus:

Add framework-specific specialists (Storybook expert, Figma expert) via the specialists: block.

Reliability

Used by reliability-review/synthex:reliability-review.

reliability:
  slo_document: docs/specs/slos.md
  runbooks_path: docs/runbooks
KeyDefaultWhat it does
slo_documentdocs/specs/slos.mdPath to the SLO/SLI definitions document
runbooks_pathdocs/runbooksWhere operational runbooks are stored

Performance audit

Used by performance-audit/synthex:performance-audit.

performance_audit:
  review_loops:
    max_cycles: 2

The performance audit only carries a per-command review_loops override; everything else inherits global defaults.

Retrospective

Used by retrospective/synthex:retrospective.

retrospective:
  output_path: docs/retros
  format: start-stop-continue
  max_improvement_items: 3
KeyDefaultWhat it does
output_pathdocs/retrosWhere retrospective documents land
formatstart-stop-continueRetro format. Options: start-stop-continue, 4ls, sailboat
max_improvement_items3Cap on improvement items per cycle. More than 3 means none get done

Next priority

Used by next-priority/synthex:next-priority.

next_priority:
  concurrent_tasks: 3
  execution_environment: local # local | cloud | workspace
KeyDefaultWhat it does
concurrent_tasks3Maximum number of tasks executed in parallel per next-priority/synthex:next-priority run
execution_environmentlocalWhere parallel Tech Lead workers run: local git worktrees, cloud Cursor cloud subagents, or workspace Orca/Herdr child workspaces

Override concurrent_tasks per invocation by passing concurrent_tasks=N to the command. execution_environment is overridden per call by --in-cloud / --in-workspace / --local (flag beats key beats local; --local wins any conflict, and --in-cloud with --in-workspace is refused). cloud is Cursor-only: each worker gets its own VM and branch. workspace runs each worker in an Orca or Herdr child workspace. When a mode isn't available, Synthex prints a one-line notice and falls back to local worktrees. See Cloud agents and Host workspaces.

Workflow engines

Two keys opt pieces of Synthex into Workflow scripts on Claude Code. Both ship as prose.

code_review:
  engine: prose # prose | workflow
  refute_pass: off # on | off

native_looping:
  engine: prose # prose | workflow
KeyDefaultWhat it does
code_review.engineproseworkflow runs each review-code/synthex:review-code cycle through the review engine
code_review.refute_passoffon sends each critical and high finding to three independent refuters. Only read by the review engine
native_looping.engineproseworkflow has every --loop command get its done/continue verdict from the loop engine, with a second check on "done"

workflow only takes effect when a Workflow tool is in the session's tool list (and, for the loop engine, without --loop-isolated). Everywhere else, including every other harness, the command runs prose. Headless runs need a Workflow(synthex:review-code-engine) or Workflow(synthex:loop-engine) permission allow rule. See Workflow engines for what each engine does and when to turn it on.

Worktrees

Used by next-priority/synthex:next-priority for parallel task execution.

worktrees:
  base_path: .claude/worktrees
  branch_prefix: "feature/"
KeyDefaultWhat it does
base_path.claude/worktreesDirectory where per-task worktrees are created. Add this path to .gitignore
branch_prefixfeature/Prefix prepended to each task branch name

Use an absolute path (e.g., /tmp/synthex-worktrees) if you want worktrees outside the repo. On Claude Code, the default base_path lets Synthex use the Agent tool's built-in isolation: "worktree". Claude Code always creates those worktrees under .claude/worktrees, so a custom base_path switches back to Synthex's own git worktree add. branch_prefix applies either way. Host workspaces (execution_environment: workspace) ignore base_path, because the workspace manager decides where checkouts live.

Commit convention

Synthex agents write their own commit messages in your project's convention.

git:
  commit_convention: auto # conventional | issue-key | gitmoji | plain | auto
ValueMeaning
conventionalConventional Commits (feat: …, fix(api): …)
issue-keySubjects start with a ticket key (PROJ-1234: … or [PROJ-1234] …)
gitmojiSubjects start with a gitmoji shortcode (:bug: …)
plainNo enforced pattern
autoNot detected yet, or no single pattern reached a 60% majority

init/synthex:init samples up to your last 50 commits on every run and writes the majority pattern here, printing Detected commit convention: <value> (from <N> commits). Set it by hand to override.

When the value is exactly conventional, a commit-lint hook checks each git commit -m subject the agent runs (on Claude Code and Codex) and blocks one that doesn't match, with a hint so the agent can fix it. Every other value, including auto, is never linted.

The hook also checks a message piped to git commit -F - when the message is written out in the same command: a heredoc on the commit (git commit -F - <<'MSG'), cat <<EOF | git commit -F -, or a single literal piped from printf or echo. It lints the first non-empty, non-comment line, and finds the commit inside an && chain. This is how the Tech Lead, the Lead Frontend Engineer, and next-priority/synthex:next-priority write their commits, so Synthex's own commits are now checked too.

The hook fails open whenever it can't be sure what the message is: no Node.js, no config, -F <file>, a message built from variables or command substitution, an unquoted heredoc that contains $, a here-string, more than one heredoc or more than one git commit in the command, an amend that keeps the message, or a merge in progress all pass through.

Multi-model review

The multi_model_review block turns on review by external model CLIs alongside Synthex's own reviewers. It is off by default; configure-multi-model/synthex:configure-multi-model writes it for you. Synthex calls each CLI with your own login; it holds no API keys. Two groups of its keys resolve differently from everything else — see Keys that break the order. For how the fan-out and consolidation work, see Multi-model review.

multi_model_review:
  enabled: false
  reviewers: [] # e.g. codex-review-prompter, gemini-review-prompter, ollama-review-prompter
  per_reviewer:
    codex-review-prompter:
      model: gpt-5
      family: openai
      allow_api_key_billing: false
  per_command:
    review_code:
      enabled: false
    write_implementation_plan:
      enabled: false

Top-level keys

KeyDefaultWhat it does
enabledfalseMaster switch. When false, review is native-only and unchanged. Restrictive-wins
strict_modefalsetrue aborts the review on preflight failures; false degrades to whichever proposers are available
include_native_reviewerstrueRun Synthex's own reviewers alongside the external ones. Set false only to isolate external behavior
min_family_diversity2Fewest distinct model families (natives count as anthropic) before preflight warns
min_proposers_to_proceed2Fewest available proposers to proceed. Below it, preflight aborts (strict) or warns (lenient)
per_reviewer_timeout_seconds180How long to wait on one proposer. A timeout is that reviewer's error, not the whole review's
reviewers[]External adapters to run, by agent name (codex-review-prompter, etc.). Empty means natives only
per_reviewer.<adapter>unsetPer-adapter overrides (model, family, flags), forwarded to the adapter as-is. User-owned
sandbox_profile_pathplugins/synthex/config/sandbox.sbmacOS sandbox-exec profile used for sandbox-yolo adapters
sandbox_bwrap_flags--ro-bind / / --bind /tmp /tmp --proc /proc --dev /devLinux bwrap flags used for sandbox-yolo adapters

Codex billing. per_reviewer.codex-review-prompter.allow_api_key_billing defaults to false: Synthex unsets CODEX_API_KEY and OPENAI_API_KEY for Codex calls so they use your stored codex login. Set it to true to allow per-token API-key billing.

context

The context bundle every proposer receives, assembled once per review.

KeyDefaultWhat it does
context.max_bundle_bytes204800Hard cap on the bundle (200 KB). An oversized artifact asks you to narrow scope
context.max_file_bytes65536Files over 64 KB are summarized instead of sent verbatim
context.convention_pathsCLAUDE.md, .eslintrc, .prettierrcConvention files included verbatim. Mirrors code_review.convention_sources
context.spec_pathsdocs/specsWhere to find specs for touched files. Mirrors code_review.spec_paths

aggregator

KeyDefaultWhat it does
aggregator.commandautoWhich model consolidates. auto picks the strongest configured family from tier_table, else the host Claude session
aggregator.tier_table6 rowsRanked {tier, family, model} rows: Claude Opus, GPT-5, Claude Sonnet, Gemini 2.5 Pro, DeepSeek V3, Qwen 32B. Override to re-rank or add families

per_command

KeyDefaultWhat it does
per_command.review_code.enabledfalseUse multi-model review in review-code/synthex:review-code
per_command.review_code.complexity_gate.threshold_lines_changed50Smaller diffs skip multi-model review
per_command.review_code.complexity_gate.threshold_files_touched3Diffs touching fewer files skip multi-model review
per_command.review_code.complexity_gate.always_escalate_pathsauth, payments, billing, migrations, security, secrets, crypto globsDiffs touching these always get multi-model review
per_command.write_implementation_plan.enabledfalseUse multi-model review in write-implementation-plan/synthex:write-implementation-plan. No complexity gate

Consolidation, demotion, and audit

KeyDefaultWhat it does
consolidation.stage2_jaccard_threshold0.8Lexical similarity at which two findings merge
consolidation.stage3_embedding_threshold0.85Embedding-based merge threshold. Not active yet
consolidation.stage4.max_calls_per_consolidation25Cap on LLM tiebreaker calls per consolidation
minority_of_one.enabledtrueDemote a finding only one reviewer raised
minority_of_one.skip_categories["security"]Categories never demoted
audit.enabledtrueWrite an audit file for every multi-model review
audit.output_pathdocs/reviews/Where audit files go
audit.raw_output_pathdocs/reviews/raw/Where each adapter's raw output goes
audit.record_finding_attribution_telemetrytrueRecord who raised each finding and how many agreed

external_permission_mode

How much each external CLI may do. read-only runs the CLI in its read-only or sandbox mode. parent-mediated proxies its tool approvals back to your session. sandbox-yolo gives it full permissions inside an OS sandbox and asks you to confirm at spawn.

KeyDefaultNotes
defaultread-onlyApplies to any CLI not listed
codexparent-mediatedRuns as codex exec --sandbox read-only with one warning for now
claudeparent-mediatedApproval proxying over --output-format stream-json
geminiread-only
bedrockread-onlyNo tool-use surface
llmread-onlyNo tool-use surface
ollamaread-onlyNo tool-use surface

Any other key in this block is ignored. Adapter binary names are fixed in each adapter, never read from config.

Standing pools

The standing_pools block controls standing review pools: long-lived reviewer teams that

review-code/synthex:review-code and performance-audit/synthex:performance-audit route to when one is running. It is off by default; configure-teams/synthex:configure-teams writes it for you. Pools need Claude Code's Agent Teams tools. See Standing pools.

KeyDefaultWhat it does
enabledfalseTurn on pool routing. Pool commands work either way
ttl_minutes60Idle minutes before a pool may be reaped, checked lazily at the next discovery. 0 disables TTL
default_namereview-poolPool name when start-review-team/synthex:start-review-team gets no --name
default_reviewerscode-reviewer, security-reviewerPool roster when no reviewers are given; matches code_review.reviewers
default_multi_modelfalseStart pools with multi-model review on
storage_root~/.claude/teams/standingWhere pools live. Not user-configurable
tasks_root~/.claude/tasks/standingWhere pool tasks live. Not user-configurable
routing_modeprefer-with-fallbackprefer-with-fallback falls back to fresh reviewers; explicit-pool-required aborts with no pool
matching_modecoverscovers: pool roster is a superset of the needed reviewers; exact: identical

Standing-pool settings used to live in synthex-plus's .synthex-plus/config.yaml. Since Synthex 2.0 they belong in .synthex/config.yaml; the legacy file is still read for one major version, with a deprecation warning when a value only resolves there.

configure-teams/synthex:configure-teams writes only .synthex/config.yaml.

Lifecycle

lifecycle:
  submission_timeout_seconds: 300
KeyDefaultWhat it does
submission_timeout_seconds300How long a command waits on a pool's result before timing out and falling back

This is a top-level block, not nested under standing_pools, because it governs the submitting command, not the pool.

Hooks

The TaskCompleted and TeammateIdle hooks only act when standing_pools.enabled is true; otherwise they do nothing.

KeyDefaultWhat it does
hooks.task_completed.review_gate.enabledtrueRequire the right reviewers to see a teammate's completed task
hooks.task_completed.review_gate.reviewerscode / frontend / infrastructure tableIllustrative only; the hook script holds the real table
hooks.teammate_idle.work_assignment.enabledtruePoint an idle teammate at an unblocked task
hooks.teammate_idle.work_assignment.allow_cross_functionalfalseLet idle teammates take tasks outside their role

See Hooks for every hook Synthex installs.

Document paths

Default locations for project documents. Commands consult these unless overridden by their own parameters.

documents:
  requirements: docs/reqs/main.md
  implementation_plan: docs/plans/main.md
  specs: docs/specs
  decisions: docs/specs/decisions
  rfcs: docs/specs/rfcs
  runbooks: docs/runbooks
  retros: docs/retros

Most commands accept an explicit path parameter, so changing these is rarely necessary.

A minimal override file

If your project follows the defaults closely, your .synthex/config.yaml can be very short:

next_priority:
  concurrent_tasks: 6

code_review:
  reviewers:
    - code-reviewer
    - security-reviewer
    - performance-engineer

Everything else inherits from the plugin defaults. init/synthex:init will scaffold a fully-commented file when you want every setting visible at once.

Next