Production Pipeline

Project Setup Steps

The canonical Lambeer foundation checklist, including the reproducible clean-checkout build and packaged dedicated-server validation runbooks for ROAD-P00-02 and ROAD-P00-03.

Status: draftOwner: UnassignedUpdated: 2026-09-13

Production schedule — 2026-09-13: PIPE-ROADMAP now defines 32 focused phases (P00–P31). Phase 0/1/2/3 references retained in this document are legacy scope bands, not the new phase numbers. The owner confirmed limited-area core-loop proof before full-map expansion; see the roadmap for dependencies, audited status and remaining work.

Production context

Deprecated source referenceGDD/05-Technical/05-Project-Setup-Steps.md
Verified baselineGit repository and LFS rules; UE 5.8 project; Game and Server targets.
Browser document roleThis standalone HTML file is authoritative; edit this file directly through the project workflow.

Verified implementation evidence

  • Lambeer.uproject declares EngineAssociation: 5.8.
  • Source/Lambeer.Target.cs defines the Windows-capable Game target and Source/LambeerServer.Target.cs defines the Server target.
  • .gitattributes routes Unreal binary assets and production-source binaries through Git LFS; git lfs ls-files returns tracked assets.
  • The repository has an origin remote. The exact revision for a P00 run must still be selected, committed, pushed and recorded.

Not yet verified: this documentation pass did not prove that the installed engine distribution supports Server targets, that the matching UE 5.8 Linux cross-compile toolchain is valid, that a clean clone builds, or that a packaged Linux server starts. Successful commands and retained logs are the evidence; the existence of target files is not.

Relationships

Document contract coverage

Use these required Production Pipeline areas during review. The HTML content below is authoritative; items not stated explicitly remain unresolved.

  • ReviewScope & Roles
  • ReviewWorkflow
  • ReviewStage Entry / Exit Criteria
  • ReviewReview & Revision
  • ReviewFile Handoff
  • ReviewSource Control
  • ReviewNaming & Paths
  • ReviewDefinition of Done
  • ReviewExternal / Freelancer Handoff

P00 execution boundary and evidence contract

This runbook explains how to produce evidence for ROAD-P00-02 and ROAD-P00-03. It does not mark either package complete. Run all build commands from a separate clean clone, never from a working tree containing uncommitted production work.

RoleResponsibilityRequired evidence
Build operatorSelect a pushed commit; prepare the isolated clone; resolve LFS; verify SDKs; compile, cook, stage and archive the artifacts; preserve command output.Full commit SHA, clean status, LFS check, Turnkey output, UBT/UAT logs, artifact inventory and checksums.
OwnerApprove the revision and test environment, then personally perform the two-client runtime verification. The owner also performs PIE if PIE is used for diagnosis.Topology, server address/port, client 1 and client 2 observations, connect/move/disconnect result, defects and final pass/fail.
Documentation maintainerLink the retained evidence from ROAD-P00; record limitations without converting an unverified result into a pass.Evidence links and status update in the canonical HTML.

Evidence root: TBD / owner-selected durable location. During a run, use a path outside the repository such as <P00-evidence-root>/<full-commit-SHA>/. Do not commit packaged binaries, generated build directories, secrets or private server configuration merely to satisfy this gate.

Current target contract: the project has Lambeer (TargetType.Game) and LambeerServer (TargetType.Server). No LambeerClient.Target.cs was verified. Use the packaged Lambeer Game target as the Windows client artifact for P00; do not invent a Client target as part of this validation.

ROAD-P00-02 — Clean checkout, LFS and target builds

Goal: prove that a new machine/workspace can obtain one exact remote revision, materialize its LFS objects and build the Windows Game target plus the Linux Server target without depending on files from the current workspace.

1. Approve the immutable input

  1. Choose a revision whose required code and assets are committed and pushed. A dirty working tree is not reproducible evidence.
  2. Record the full SHA with git rev-parse HEAD. Do not use only a branch name because the branch can move.
  3. Record the engine source/installed-build identity separately. EngineAssociation = 5.8 identifies the UE release, but it does not prove which engine binary or source revision built the artifact.

2. Check host prerequisites without installing anything

$p00Engine = '<UE-5.8-root-with-server-support>'
& "$p00Engine\Engine\Build\BatchFiles\RunUAT.bat" Turnkey -command=VerifySdk -platform=Win64
& "$p00Engine\Engine\Build\BatchFiles\RunUAT.bat" Turnkey -command=VerifySdk -platform=Linux
  • Both checks must report a valid SDK. Retain the complete output.
  • Epic's UE 5.8 dedicated-server workflow requires a source build; an Installed Build is acceptable only if it was explicitly produced with Server and Linux support. If UBT reports that Server targets are unsupported by the engine distribution, stop and prepare the correct engine build instead of changing project code.
  • If Linux is invalid, install the matching UE 5.8 Linux x86-64 cross-compile toolchain through the approved Epic/Turnkey workflow, restart the shell if environment variables changed, and rerun the non-installing verification above. The exact toolchain build must come from UE 5.8 requirements, not from an older guide.

3. Create the isolated clone and resolve LFS

$p00Source = 'D:\Unreal Projects\Lambeer 5.8'
$p00Clone = '<empty-validation-directory>\Lambeer'
$p00Sha = '<full-commit-SHA>'
$p00Remote = git -C $p00Source remote get-url origin

git clone --no-checkout $p00Remote $p00Clone
git -C $p00Clone lfs install --local
git -C $p00Clone checkout --detach $p00Sha
git -C $p00Clone lfs pull
git -C $p00Clone lfs fsck
git -C $p00Clone rev-parse HEAD
git -C $p00Clone status --porcelain=v1

The printed SHA must equal $p00Sha, git lfs fsck must succeed, and the final status output must be empty. A tiny text file beginning with the Git LFS pointer header where a binary asset is expected is a failure, not a usable asset.

4. Compile the two existing targets

$p00Project = "$p00Clone\Lambeer.uproject"
$p00Build = "$p00Engine\Engine\Build\BatchFiles\Build.bat"

& $p00Build Lambeer Win64 Development -Project="$p00Project" -WaitMutex
if ($LASTEXITCODE -ne 0) { throw 'Lambeer Win64 Development failed' }

& $p00Build LambeerServer Linux Development -Project="$p00Project" -WaitMutex
if ($LASTEXITCODE -ne 0) { throw 'LambeerServer Linux Development failed' }

Run these in a fresh shell associated with the selected engine. Retain the complete console output and AutomationTool/UnrealBuildTool log paths. Warnings require classification; a zero exit code alone does not waive missing-module, missing-plugin or LFS-related warnings.

5. Record the ROAD-P00-02 result

Evidence itemPass condition
RevisionFull SHA matches the owner-approved pushed revision; clean clone status is empty.
LFSgit lfs fsck succeeds and required binary assets are materialized.
Win64 Game buildLambeer Win64 Development exits successfully from the clean clone.
Linux Server buildLambeerServer Linux Development exits successfully using the verified UE 5.8 toolchain.
TraceabilityEngine identity, host prerequisites, commands, start/end time, logs and output file inventory are retained together.

Do not close ROAD-P00-02 if the build uses uncommitted files, an unrecorded engine build, manually copied LFS assets, a different platform/configuration, or a cached binary produced before the clean checkout.

ROAD-P00-03 — Package, launch and verify two clients

Goal: turn the validated revision into archived Development artifacts, start a headless dedicated server with retained configuration/logs, and obtain an owner-reported two-client connect, movement and disconnect result. A Windows local-server smoke test is useful, but the P00 exit still requires the packaged Linux server check.

1. Cook, stage and archive the Windows Game artifact

$p00Uat = "$p00Engine\Engine\Build\BatchFiles\RunUAT.bat"
$p00Artifacts = '<P00-evidence-root>\<full-commit-SHA>\Artifacts'
$p00Map = '/Game/Lambeer/World/Maps/L_Dev_Sandbox/L_Dev_Sandbox'

& $p00Uat BuildCookRun -project="$p00Project" -nop4 -utf8output `
  -build -cook -stage -pak -archive -archivedirectory="$p00Artifacts\Win64Game" `
  -platform=Win64 -clientconfig=Development -map="$p00Map"
if ($LASTEXITCODE -ne 0) { throw 'Win64 Game package failed' }

2. Cook, stage and archive the Linux dedicated server

& $p00Uat BuildCookRun -project="$p00Project" -nop4 -utf8output `
  -server -noclient -serverplatform=Linux -serverconfig=Development `
  -build -cook -stage -pak -archive -archivedirectory="$p00Artifacts\LinuxServer" `
  -map="$p00Map"
if ($LASTEXITCODE -ne 0) { throw 'Linux dedicated-server package failed' }

Retain both UAT logs and enumerate the archived files. Generate checksums with an approved tool after packaging so the tested artifacts can be identified later. Do not assume the executable's final nested path; locate Lambeer.exe in the Win64 archive and LambeerServer/LambeerServer.sh in the Linux archive, then record the actual paths.

3. Transfer and launch on a representative Linux host

  1. Transfer the complete Linux archive without flattening or omitting sibling libraries/content. Verify its checksum after transfer.
  2. Place runtime configuration and logs in owner-approved locations outside the immutable package. Never place credentials or production secrets in the evidence bundle.
  3. Open the selected UDP game port in the host/network firewall only for the approved test scope. Record the host OS, CPU/RAM, public/private topology and exact port. Do not invent a deployment hostname.
  4. Make the discovered server launcher executable and start the explicit development map. Replace placeholders with the paths recorded from the archive:
chmod +x <path-to-LambeerServer-or-launch-script>
<path-to-LambeerServer-or-launch-script> \
  /Game/Lambeer/World/Maps/L_Dev_Sandbox/L_Dev_Sandbox \
  -port=7777 -log -abslog=<P00-evidence-root>/runtime/server.log

The server must remain running, bind the selected port and load the sandbox map without fatal errors or missing cooked packages. If the Linux host uses a service/container, retain the exact wrapper configuration as additional evidence; do not replace the direct executable command with an undocumented service.

4. Owner-only two-client test

User action required: the owner starts and controls both packaged Windows client instances and judges the runtime result. Agents do not perform or claim this test. Use the Linux server address when validating the target package; use 127.0.0.1 only for an explicitly labeled Windows-local diagnostic server.

& '<actual-path-to-Lambeer.exe>' '<server-ip>:7777' -windowed -ResX=960 -ResY=540 `
  -log -abslog='<P00-evidence-root>\runtime\client1.log'

& '<actual-path-to-Lambeer.exe>' '<server-ip>:7777' -windowed -ResX=960 -ResY=540 `
  -log -abslog='<P00-evidence-root>\runtime\client2.log'
  1. Wait until both clients finish loading the same server map. Record server-log evidence for two accepted connections.
  2. On client 1, move and rotate while observing client 2. On client 2, move and rotate while observing client 1. Record whether each remote representation updates and whether either client is corrected, frozen or disconnected.
  3. Close client 2 normally. Confirm the server remains running and records the disconnect; confirm client 1 remains connected and can still move.
  4. Reconnect client 2 once if the current game flow permits it. If character/session entry is not implemented enough to reconnect, record that limitation; do not convert it into a pass.
  5. Close client 1, then stop the server gracefully. Preserve server and both client logs before deleting any temporary runtime directory.

5. Acceptance record

CheckRequired recordPass condition
Package identityFull source SHA, UE 5.8 engine identity, Development configuration, archive checksum.All three identities match the build record.
Linux launchCommand, map, port, host/topology, start/end time and complete server log.Server loads the sandbox and remains stable for the test.
Two connectionsOwner observation plus server/client log timestamps.Both packaged Windows clients enter the same dedicated-server session.
MovementOwner result for client 1 viewed by client 2 and client 2 viewed by client 1.Basic replicated movement is visible in both directions without a blocking defect.
DisconnectOwner action and server/client log timestamps.One client exits cleanly; the server and remaining client continue operating.
DefectsExact symptom, affected process/log and reproduction steps.No unresolved defect blocks the required connect/move/disconnect flow.

Do not close ROAD-P00-03 from Editor PIE alone, from a Windows local server alone, from one connected client, or without the retained Linux package and runtime logs.

Failure routing and rerun rule

FailureMeaningNext action
LFS pointer/missing objectThe clone is incomplete or remote LFS storage/authentication is unavailable.Fix the remote object/auth issue, delete the failed disposable clone if appropriate, and rerun from clone creation. Never copy the asset from the working project.
Server target unsupportedThe selected engine distribution lacks Server support.Use a UE 5.8 source build or an Installed Build produced with Server/Linux support; record its identity and rerun SDK verification.
Linux SDK invalidThe matching cross-compile toolchain is missing or out of range.Install the UE 5.8-compatible toolchain through the approved Epic/Turnkey route, restart the environment and rerun the non-installing check.
Missing cooked map/packageThe UAT cook/archive did not contain the explicit sandbox dependency set.Inspect the UAT cook log and packaging configuration; correct the source/configuration, commit the correction, select the new SHA and restart the clean-clone run.
Client cannot reach serverCould be address, UDP port/firewall, bind state, incompatible build or runtime failure.First prove the server is running and listening; compare source/build identity; then inspect server and client logs before changing gameplay code.

Rerun rule: any source, content, target, plugin or packaging-configuration change creates a new revision. Restart from the clean-clone step and keep the failed evidence alongside the rerun; do not splice logs from different SHAs into one apparent pass.

Primary external references: Epic — Setting Up Dedicated Servers (UE 5.8), Epic — Build Operations (UE 5.8), and Epic — UBT Target Reference (UE 5.8). These links are references only; this page remains usable offline.

Authoritative project content

A checklist to take the project from its current template state to the Lambeer foundation. Do these before/at the start of Phase 1. Treat destructive steps (deletions) carefully and commit to source control first.

0. Source control first — [RECOMMENDATION]

The project is a Git repository with an origin remote, UE-oriented .gitignore, and Git LFS rules for *.uasset, *.umap, textures, audio and production-source binaries. Preserve those rules, verify newly introduced binary extensions with git check-attr, and use the ROAD-P00-02 clean-clone procedure to prove that remote LFS objects are recoverable. Commit and push the chosen validation revision before creating the isolated clone.

1. Remove template variant code & content — [CONFIRMED]

Delete all three example variants (they are Epic demos, not our game):

Source: - Source/Lambeer/Variant_Combat/ - Source/Lambeer/Variant_Platforming/ - Source/Lambeer/Variant_SideScrolling/

Content: - Content/Variant_Combat/ - Content/Variant_Platforming/ - Content/Variant_SideScrolling/

Then: - Remove references to the deleted classes from Lambeer.Build.cs and any includes. - Regenerate project files and rebuild. - Verify the editor opens and LambeerGameMode/LambeerCharacter/LambeerPlayerController still compile.

[RISK] deleting content can leave dangling references in maps/blueprints. Use the editor's reference viewer / "delete with references" flow, fix up redirectors, and resave dirty packages.

2. Decide & clean remaining template content

  • Content/ThirdPerson/, Content/LevelPrototyping/, Content/Characters/, Content/Input/, Content/Collections/ are template content. Decide per folder: reuse (relocate under Content/Lambeer/) or remove. [TBD] per folder — keep only what serves Lambeer.
  • Establish Content/Lambeer/ root and the structure in 03-Content-Folder-Structure.md.

3. Add the dedicated server target — [RECOMMENDATION]

  • Source/LambeerServer.Target.cs exists and defines TargetType.Server; Linux is the primary deployment target and Win64 may be used for explicitly labeled local diagnostics.
  • Compile the Linux target from a clean clone, then package and launch it using the ROAD-P00-02 and ROAD-P00-03 runbooks. See Network Architecture.

4. Enable / confirm plugins

Already enabled: StateTree, GameplayStateTree, MetaHuman, MetaHumanCoreTech, MetaHumanCharacter, ModelingToolsEditorMode.

Enable as features land (don't pre-enable unused): - Enhanced Input (player input) — confirm on. - GameplayAbilities — enable for the confirmed GAS architecture (Tech Stack & Engine). - ChaosVehicles — Phase 2 (vehicles). - World Partition is engine-level (no plugin) — author the main map as a WP level.

5. Configure the project

  • Set up Config/DefaultEngine.ini etc. for: World Partition defaults, Nanite/Lumen settings, networking (max players, net update rates), and a server config approach (see ../04-Multiplayer/02-Servers-and-Hosting.md).
  • Set default GameMode/maps for the project (main menu map + dev sandbox map).

6. Establish foundation classes (Phase 1 scaffolding)

In code (C++), per 04-Source-Code-Structure.md: - Evolve ALambeerCharacter into the component-driven survivor (add survival/inventory/combat/build/interaction components as they're built). - Set up Core/ framework classes (GameState, PlayerState, GameInstance, persistence subsystem stub). - Create BP children for content assignment (BP_PlayerCharacter, etc.).

7. MetaHuman pipeline check

8. Validate

  • Editor opens clean, no missing-reference spam.
  • ROAD-P00-02: the clean clone resolves LFS and compiles Lambeer Win64 Development plus LambeerServer Linux Development.
  • ROAD-P00-03: archived Development artifacts and logs exist; the owner verifies two packaged Windows clients against the packaged Linux server.

Keep this list updated as the foundation solidifies; it is the bridge from "template" to "Lambeer".