PipelineGuard is a portfolio-scale game-production tool that turns Unreal content checks into deterministic reports that people, CI jobs, and AI-assisted workflows can use safely.
The intended end-to-end flow is:
- A shared Unreal validation runner checks content from either an editor tab or a headless commandlet.
- The runner writes a versioned JSON report and returns a CI-safe exit code.
- A .NET CLI verifies and summarizes the report; an ASP.NET service stores run history.
- OpenTelemetry makes the .NET workflow observable.
- A constrained MCP server lets an AI agent inspect results without arbitrary command or filesystem access.
The portable .NET layer and sample reports do not require Unreal Engine or BlackWood. The Unreal plugin requires a compatible Unreal Engine 5.6 installation. Project-specific BlackWood rules require the BlackWood repository and must be defined only after its real data contracts have been inspected.
The 2026-07-16 local release is verified, with the limits stated explicitly:
- A seven-project .NET 8 solution builds in Release with zero warnings; 49 xUnit tests pass.
- SDK 8.0.300 restore audits direct and transitive NuGet dependencies; no known vulnerable package is reported.
- GitHub Actions passes the same audited build and test gates on Ubuntu and Windows.
- The UE 5.6.1 editor target builds, all four synthetic Unreal automation tests pass, and the headless commandlet emits schema
1.0. - The two-node BuildGraph compiles the editor target and runs the commandlet successfully.
- Fixture outcomes are
0clean,1findings, and2invalid contract. - The loopback API returns
201ingest,409duplicate, and400invalid; SQLite retrieval, structured logs, traces, and three custom metrics were observed. - An official MCP SDK client discovered exactly four read-only tools and successfully called both run-list and run-summary tools.
The fixture host intentionally has zero project assets. Generic rule behavior is covered by synthetic tests; BlackWood integration and production time-saved claims are not made. See the verification record.
| Capability | Portable .NET | Unreal 5.6 | BlackWood |
|---|---|---|---|
| Validate, summarize, store, and query fixture reports | Yes | No | No |
| OpenTelemetry traces, metrics, and structured logs | Yes | No | No |
| Read-only MCP inspection tools | Yes | No | No |
| Editor validation tab and headless commandlet | No | Yes | No |
| Generic naming, path, texture, and DataTable rules | No | Yes | No |
| Item, dialogue, soft-reference, or footstep rules | No | Yes | Yes |
Not in the first release: Horde deployment, WPF, Entra/Key Vault, Perforce integration, remote production hosting, automatic AI fixes, or arbitrary MCP-triggered commands.
- .NET 8 SDK
- Git
- Unreal Engine 5.6 and its C++ build prerequisites only for the Unreal phase
Confirm the SDK and build the portable solution:
dotnet --version
dotnet restore PipelineGuard.sln
dotnet build PipelineGuard.sln --configuration Release --no-restore
dotnet test PipelineGuard.sln --configuration Release --no-buildThe exact executable commands are exposed by the CLI itself:
dotnet run --project src/PipelineGuard.Cli -- --helpUse the supplied fixtures to exercise all three report outcomes:
dotnet run --project src/PipelineGuard.Cli -- summary samples/clean-report.json --minimum info --fail-on error
dotnet run --project src/PipelineGuard.Cli -- summary samples/error-report.json --minimum info --fail-on error
dotnet run --project src/PipelineGuard.Cli -- summary samples/malformed-report.json --minimum info --fail-on errorCompare a prior accepted report with a current run:
dotnet run --project src/PipelineGuard.Cli -- compare samples/clean-report.json samples/error-report.json --fail-on errorWhen Unreal is installed, ask the CLI for the engine-orchestration arguments:
dotnet run --project src/PipelineGuard.Cli -- validate --helpThe CLI's engine invocation is equivalent to:
UnrealEditor-Cmd.exe <Project.uproject> -run=PipelineGuard -Report=<report.json> -unattended -nop4 -nullrhiIf -Report is omitted from a direct commandlet run, the plugin writes to <Project>/Saved/PipelineGuard/PipelineGuardReport.json. Prefer an explicit report path in automation.
Expected process results:
| Exit code | Meaning | Fixture |
|---|---|---|
0 |
Valid report below the configured failure threshold | clean-report.json |
1 |
Valid report containing findings at or above the threshold | error-report.json |
2 |
Invalid arguments, configuration, or report contract | malformed-report.json |
3 |
Unreal process, report-write, or internal execution failure | Not fixture-driven |
The raw Unreal commandlet additionally uses exit 4 when validation ran but its report could not be written. The .NET CLI maps that condition to its public execution-failure exit 3.
Start the loopback-only API in one terminal:
dotnet run --project src/PipelineGuard.ApiIn another terminal, check health, ingest a conforming fixture, and list stored runs:
curl http://127.0.0.1:5078/health
curl -i -X POST http://127.0.0.1:5078/api/v1/runs -H "Content-Type: application/json" --data-binary "@samples/clean-report.json"
curl "http://127.0.0.1:5078/api/v1/runs?limit=20&offset=0"The default SQLite database lives beneath the API build output. Override PipelineGuard:DatabasePath through normal ASP.NET configuration when a stable local path is needed.
Configure an MCP client to launch the stdio server with executable dotnet and arguments run --project src/PipelineGuard.Mcp. It queries http://127.0.0.1:5078/ by default. PIPELINEGUARD_API_URL may select another endpoint, but non-loopback endpoints are rejected unless PIPELINEGUARD_ALLOW_REMOTE_API=true is explicitly set.
The tools/PipelineGuard.Mcp.Smoke client uses the official SDK to verify initialization, the exact tool allowlist, and real tool calls against a running API.
On Windows, run the same two-node compile-and-validate graph used for the local verification:
./scripts/Invoke-PipelineGuardBuildGraph.ps1 -EngineRoot "C:/Program Files/Epic Games/UE_5.6"malformed-report.json is valid JSON by design. It is malformed as a PipelineGuard report, which lets parsers load it and contract tests reject it predictably.
PipelineGuard/
|-- src/ .NET contracts, CLI, API, and MCP server
|-- tests/ portable unit and integration tests
|-- tools/ official-SDK MCP protocol smoke client
|-- unreal/ editor-only Unreal plugin and fixture host
|-- schemas/ versioned JSON report contract
|-- samples/ clean, failing, and contract-invalid reports
|-- docs/ architecture, safety, schema, demo, and support
`-- .github/workflows/ portable Windows/Linux verification
schemas/validation-report-v1.schema.json is the portable boundary between Unreal and .NET. Producers must validate their output against it. Consumers must additionally enforce the cross-field invariants documented in docs/report-schema.md, such as matching summary counts and chronological timestamps.
MCP inspection is read-only. An optional run tool, if implemented later, is disabled by default and accepts a preconfigured profile ID rather than an executable, project path, or raw arguments. See docs/threat-model.md for trust boundaries, abuse cases, and required negative tests.
Report suspected vulnerabilities privately as described in
SECURITY.md. The code is published for portfolio review and
evaluation under an all-rights-reserved LICENSE; it is not
open-source licensed.
Only claims listed in the verification record are release evidence. BlackWood integration, production performance, defects found, and time saved remain unverified and must not be claimed. Future releases should update the record with their actual tests, assets, findings, and environment.