↑ ↓ to move · Enter to open · Esc to closeTap a result

Architecture
agent · class driver · sonnet

project-initializer

Drives a project's first generation from the interview's answers: follows project-bootstrap, installs the hooks and verifies the build. Asks nothing.

agent · driversonneteffort highonly inside **stays in nerviz
§ the agent's definition

project-initializer.md, section by section

The sections of the agent's own file, excerpted. Hover or click one to see which project rules and templates it cites. The sections are also chips: click one to jump to it.

nerviz/.claude/agents/project-initializer.md

## Why this is an agent and not a skill

Two of the three legitimate reasons apply: generation produces verbose output (starter.tgz extraction, POMs, build output) that shouldn't fill the main conversation, and it runs with a restricted tool set. The third does not: the procedure is driven by the blueprint YAML, the Initializr and the templates, so sonnet with effort: high runs it (@.claude/decisions/0078-bootstrap-skill-index-and-initializer-on-sonnet.md). The *procedure* doesn't live here: it lives in the skill. This file just drives.

## Principles

  1. Never assume an answer. The wrong architecture costs days of refactoring. The
  2. Fail fast. Invalid blueprint → stop at step 2. Never mid-generation, with half a
  3. Don't invent versions. Resolve them at runtime; if you can't, ask.
  4. Idempotence. Project already exists at ../<artifactId> → stop and report. Never
  5. Don't reimplement the procedure. It lives in the skill. You drive.
  6. Independent calls go in one response. Every turn re-reads this whole context: the

## Procedure

Follow .claude/skills/project-bootstrap/SKILL.md in the defined order.

## Interview

Owned by /init-project, which runs it in the main session before delegating. This agent runs in the background, where AskUserQuestion does not exist — which is why the tool is not in tools at all. Before it moved, the run handed back twice to have its questions relayed, and the second set reached the user 23 minutes in (@.claude/decisions/0123-lessons-learned-020-init-project-run.md).

Before any generation, check that the delegation message carries every answer § Contract's Input lists. One missing → stop at once and return blocked: missing <field>, <field>, nothing else: never a guess, never a default you chose, never a question.

The chained skills ask their own questions when called alone. Here, pass the answers in their one-line context, which both read before asking: the topology and its follow-up to transport-security-setup (step 7.5), the server and authentication to sonarqube-setup (step 8.4). A chained skill that still needs an answer is a missing field: stop the same way.

## When finished

Return the output contract exactly in the defined format. No narration of the steps: the report is read by busy humans and, eventually, by another agent.

Don't invoke git-publish and don't run git commands: /init-project chains it after filling the genesis record, from the main session, where its two confirmations can be asked. Leave the four GENESIS placeholders verify-and-report.md § 8.6 names in the file — filling them is /init-project's step too.

Open the full file on GitHub →
§ behavior

What it reads, writes and refuses

The skill's own contract, from SKILL.md, in the original wording.

Class

driver — the territory is agent_classes.driver in @.claude/schemas/extensions.json, and it is ** on purpose: this agent writes the whole tree of a project that does not exist yet, which is also why init-project's own territory is empty. ArchHook.java guard reads this agent's agent_type on every write and checks it against the class, so the phase the caller left open is never consulted.

Executor

yes — writes while the /init-project phase is open. The class grants it (executor: true), and ArchHook.java schema cross-checks this marker against that flag in both directions; without either side, every file of a fresh project would be refused with exit 2.

Pattern catalog

not injected — writes through project-bootstrap's templates, designs no Java of its own (agent_classes.driver.pattern_catalog: false; schema cross-checks this line).

Input

— every answer of the interview /init-project ran, in the delegation message: blueprint, groupId, artifactId, projectName, boundedContext, buildTool (maven|gradle), features[], the transport topology and its follow-up, the Sonar server and its authentication. See § Interview for what a missing one does.

Reads

— before any generation:

Output

— report block in the format from .claude/skills/project-bootstrap/SKILL.md § Output contract. No extra prose.

Source: the agent's § Contract, at nerviz e4cae27.

§ guard and hook

What the guard does with it

driver is the agent's class. ArchHook reads its agent_type on every write and on every skill it calls: the phase /init-project opened is never consulted. The text on the right is the hook's own.

write_allow of class project-initializer

  • ✓**

A refusal exits with code 2 and the message goes back to the model.

** on purpose: the agent writes the whole tree of a project that does not exist yet, which is why init-project's own territory is empty.

# phase open: init-project (class orchestrator)
PreToolUse  Agent(project-initializer)
  guard call                       exit 0
# an Agent call changes nothing here: the phase stays init-project
§ orchestration

Where it sits on the rail

Each card is a step of /init-project. The interview runs in the main session; the tinted steps run inside project-initializer; git-publish comes back to the main session, after audit genesis. Dashed steps run only when they apply.

← back to the chains