SF
STS Forge

/build

Compile your UE5 project via UnrealBuildTool and parse the output with UE-specific error categorization.

Runs the Unreal Engine build and parses the output for errors and warnings.

Trigger phrases#

/build, build the project, compile, run the build, check if it compiles, or after completing an implementation checkpoint.

Do NOT use for: building documentation, running the game in PIE, or packaging/deploying.

What it does#

  1. Reads the build command from Docs/_working/state/project-config.json
  2. Calls UnrealBuildTool directly (not Build.bat)
  3. Captures the full output and extracts real errors from the verbose UBT log
  4. Reports the first error with category and suggested fix
  5. Writes build status to Docs/_working/state/build-status.json

Before first use#

Run /setup to generate project-config.json. The /build skill reads the build command from that file. If the file is missing, it stops and tells you to run /setup first.

Build method#

/build calls UnrealBuildTool directly, not Build.bat. This is intentional. Build.bat wraps UBT with a different working directory and missing flags, which invalidates the incremental build cache and forces a full rebuild. The direct UBT call keeps the Rider/VS IDE cache shared so neither the IDE nor Claude Code triggers a full rebuild after the other.

Error categorization#

UBT output is verbose. /build extracts only the real errors and categorizes them:

Error pattern Category Common fix
error C2065: undeclared identifier Missing include Add the correct #include
error C2027: use of undefined type Forward decl insufficient Replace forward declaration with full #include
error LNK2019: unresolved external symbol Linker error Add module to Build.cs PublicDependencyModuleNames
LogCompile: Error: with UPROPERTY/UFUNCTION Reflection error Check macro syntax and GENERATED_BODY() placement
error C2338: static_assert UE compile-time check Read the assert message, usually a macro usage error
error C4430: missing type specifier Missing GENERATED_BODY() Add GENERATED_BODY() to the class declaration
error LNK2001: unresolved external Missing module Different from LNK2019, may need plugin dependency in Build.cs

The first error in the log is always reported first because subsequent errors often cascade from it.

Output format#

## Build Result: SUCCESS / FAILED

**Method**: UBT CLI
**Config**: Development Editor | Win64
**Duration**: [time]

### Errors (if FAILED)
1. [file:line] Category: [category]
   Error: [message]
   Fix: [suggested fix]

### Warnings (top 5)
- [warning summary]

### Next step
[If success: "Ready for playtest" or "Proceed to next checkpoint"]
[If failure: "Fix the error above and rebuild"]

On failure#

If the error is fixable (missing include, linker issue, reflection macro): /build suggests the specific fix and stops. It does not proceed to the next checkpoint until the build passes.

If the error is infrastructure (disk space, missing SDK, permissions), it reports to you. These require manual resolution.

/build attempts at most one retry without user input.

Build status file#

After every build, the result is written to Docs/_working/state/build-status.json:

{
  "timestamp": "2026-02-17T15:30:00Z",
  "result": "SUCCESS",
  "method": "UBT",
  "config": "Development Editor",
  "platform": "Win64",
  "errors": 0,
  "warnings": 3,
  "error_details": [],
  "duration_seconds": 45
}

/state-save reads this file when capturing build state.

Live Coding note#

Live Coding (Ctrl+Alt+F11 in the editor) is handled within the editor, not via /build. Live Coding does not catch all errors. A full /build is still required at implementation checkpoints. If Live Coding reports "stale modules", a full /build is mandatory.