Skip to content

Tools And Build Workflow

rayswaynl edited this page Jul 6, 2026 · 142 revisions

Tools And Build Workflow

For the release-readiness and integration risk audit that sits on top of this workflow, see Tooling release readiness audit.

Page ownership: this page owns the operational LoadoutManager rules, skip-list and generated-mission status table. Source fix propagation queue owns the current source/Vanilla propagation and smoke-gate ledger. Full drift evidence and file-count analysis live in Deep-review findings DR-4 and DR-32; keep only the actionable build/propagation rules here.

LoadoutManager

Tools/LoadoutManager is a .NET 8 executable. Program.cs calls SqfFileGenerator.GenerateCommonBalanceInitAndTheEasaFileForEachTerrain().

Responsibilities:

  • generate common balance/EASA SQF files for terrains;
  • copy source mission files from Chernarus to maintained vanilla target missions;
  • adjust terrain-specific map parameters such as Takistan SET_MAP;
  • optionally package missions with 7-Zip.

Generated files vs copied files — edit the generator, not the output. LoadoutManager both generates SQF from C# and copies the source mission, and the two cases have opposite editing rules:

  • Generated filesClient/Module/EASA/EASA_Init.sqf, Common/Functions/Common_BalanceInit.sqf, Common/Common_ReturnAircraftNameFromItsType.sqf, the marker block in Common/Functions/Common_ModifyAirVehicle.sqf, and per-terrain version.sqf (full set in Gear, loadout and EASA atlas). Fix these in the generator source under Tools/LoadoutManager/ (the Data/** classes and the SqfFileGenerator/Generate* builders), never by hand in the .sqf. A hand-edit to a generated .sqf is overwritten on the next dotnet run, including the Chernarus source copy, so it silently reverts. Concrete case: a turret-MG classname corrected directly in a generated loadout SQF kept reappearing every run because the generator still emitted the old class, until the builder itself was changed.
  • Copied files — the rest of the mission tree: edit the Chernarus source, then dotnet run propagates to Takistan, except the skip-list in the Propagation rules & the skip-list trap section below, which must be hand-mirrored.

The generated aircraft loadout and balance pipeline is mapped in Gear, loadout and EASA atlas. In short: change aircraft loadouts in Tools/LoadoutManager/Data/Vehicles/Aircrafts/**, then inspect generated Client/Module/EASA/EASA_Init.sqf and Common/Functions/Common_BalanceInit.sqf.

Build configurations:

  • DEBUG
  • SERVER_DEBUG
  • RELEASE
  • AIRWAR_DEBUG
  • AIRWAR_SERVER_DEBUG
  • AIRWAR_RELEASE

Repo instruction: after mission edits, run from Tools/LoadoutManager with dotnet run, or from the repo root with dotnet run --project Tools\LoadoutManager\LoadoutManager.csproj. If .NET SDK is missing, stop and tell the user. On branches where the tooling source implements it, A2WASP_SKIP_ZIP=1 can make propagation-only runs skip _MISSIONS.7z packaging; verify the target branch's Tools/LoadoutManager source before relying on that shortcut.

Upstream history warning: the second-wave Developer history and upstream lessons pass found concrete tooling hazards: current packaging is source Chernarus plus generated Vanilla/Takistan only, Modded_Missions packaging/generation is commented out, ZipManager depends on env var 7za, version.sqf load order was reverted once, Takistan DB map ID needed generator-side post-copy repair, and sound generation assumes ClassName-volume.ogg filenames. Treat LoadoutManager console output plus git diff --stat as the release check, not a blind "DONE" signal.

Local workspace note: root discovery is branch-sensitive. Current docs/source HEAD@101930f47 is unchanged from 7b1187d32 for checked tooling paths: FileManager.FindA2WaspWarfareDirectory supports both an ancestor folder literally named a2waspwarfare and a normal repo root containing Missions, Missions_Vanilla and Tools\LoadoutManager\LoadoutManager.csproj (FileManager.cs:153,158,166,176,186-188). Current master after PR #87/B750, origin/master@c4c9a6479 (same checked LoadoutManager tooling shape as PR #85/PR #86/PR #87), has the merged B745/LoadoutManager sibling marker check: named-root still passes, otherwise the root must contain Missions\[55-2hc]warfarev2_073v48co.chernarus, Tools\LoadoutManager and AGENTS.md (FileManager.cs:165-176; AGENTS.md check at :172). Current B74.2 origin/claude/b74.2-aicom@21b62b04, B69/B74 and historical a96fdda2 use the same stable-shaped helper. Current master also keeps the Takistan-only directory blacklist conditional (FileManager.cs:37), adds/keeps the generated EASA category compile (SqfFileGenerator.cs:30), runs Chernarus and Takistan generation before packaging (SqfFileGenerator.cs:121,140) and has no checked A2WASP_SKIP_ZIP support. Current Miksuu and perf/quick-wins still require an ancestor named a2waspwarfare.

Current local feat/supply-helicopter checkout caveat: LoadoutManager is still old tooling shape at HEAD@558fba343. A2WASP_SKIP_ZIP is not referenced under Tools/LoadoutManager; SqfFileGenerator.cs:135 calls ZipManager.DoZipOperations() unconditionally, ZipManager.cs:38 calls Create7zFromDirectory(...), and ZipManager.cs:73-76 requires env var 7za and throws if it is missing. Root discovery is also named-root-only in this checkout (FileManager.cs:145-152). Treat skip-zip support and marker-root discovery as branch-specific claims.

Operator Checklist

Before running tooling or deployment-adjacent pieces, check these first:

Item Why it matters
Checkout path resolves to the repo root. On docs/source HEAD@101930f47, LoadoutManager accepts either an ancestor named a2waspwarfare or root markers Missions, Missions_Vanilla and Tools/LoadoutManager/LoadoutManager.csproj. On current stable origin/master@c4c9a6479, current B74.2/B69/B74 and historical a96fdda2, the marker set is Missions/[55-2hc]warfarev2_073v48co.chernarus, Tools/LoadoutManager and AGENTS.md; current-stable line refs are FileManager.cs:165-176. On current Miksuu/perf-shaped refs, keep the checkout under an ancestor named a2waspwarfare.
A2WASP_SKIP_ZIP=1 is verified before propagation-only runs. Docs/source HEAD@101930f47 implements it in ZipManager.cs:11,96, and release command-center 177ef1385f keeps skip-zip plus the current 7-Zip auto-detection/temp-archive path. Current stable origin/master@c4c9a6479, current B74.2/B69/B74, historical a96fdda2, current Miksuu/perf and the local feat/supply-helicopter checkout do not have checked support, so missing 7za will still throw after generation/copy on those refs.
7za is configured and available if packaging is required. Required only when producing _MISSIONS.7z release archives.
Existing _MISSIONS.7z replacement behavior is known for the target branch. Release command-center 177ef1385f writes _MISSIONS.7z.tmp, gates on the 7-Zip exit code, and only replaces the existing archive after the temp archive succeeds. Older refs such as docs/source HEAD@101930f47 and current stable-shaped refs may delete first and lack the exit-code gate. Keep a rollback copy before server deployment either way.
version.sqf exists for every claimed target root. It is generated and git-ignored, but included by description.ext and initJIPCompatible.sqf; Rsc/Header.hpp consumes its WF_RESPAWNDELAY, WF_MISSIONNAME and WF_MAXPLAYERS defines. Missing version.sqf blocks pack/test/release claims for that root.
Generated aircraft damage insertion markers still exist. BaseTerrain.cs:84-86 writes Common_ModifyAirVehicle.sqf through marker replacement, and FileManager.cs:224-247 only logs missing marker content. A marker drift can produce a soft generator warning instead of a clear release failure.
Missions_Vanilla is not confused with the VANILLA macro. The folder name is a generated target label; the #ifndef VANILLA preprocessor gate in description.ext / Rsc/Header.hpp controls OA/CO config behavior inside mission headers.
stringtable.xml and loadScreen.jpg exist for the mission being packed/tested. They are ordinary runtime assets for playable mission roots; modded forks may lack them even when their description.ext includes generated/sound/music dependencies.
Generated version.sqf has the intended release flags. Prepared/generated files can contain debug/log-enabled values; inspect WF_DEBUG and WF_LOG_CONTENT before packaging a public release.
DiscordBot has real preferences.json and token.txt outside git. Missing token/config is expected in repo and is not a mission-code failure. Current bot startup touches preferences.json through GameData.LoadFromFile() before the clean missing-token exit, so provide preferences before debugging token-only failures.
AntiStack has the separate A2WaspDatabase DLL if enabled. The in-repo Extension project is a2waspwarfare_Extension / GLOBALGAMESTATS, not the AntiStack database extension.
Deployment inventory records actual server artifacts and config paths. Track a2waspwarfare_Extension, separate A2WaspDatabase, token.txt, preferences.json, production BEpath, and any external server.cfg/basic.cfg before calling a host reproducible.
The in-repo Extension is built with legacy MSBuild tooling. It targets .NET Framework 4.8 x86 with RGiesecke.DllExport/UnmanagedExports packages under ../packages; do not treat it as a normal SDK-style dotnet build project.
Do not expect server/deploy wrapper scripts in the scoped release folders. A scoped scout found no .cmd, .ps1, .bat or .sh files under Tools/LoadoutManager, DiscordBot, Extension or BattlEyeFilter; use the documented dotnet/MSBuild/manual deployment flow unless new scripts are added later. Tools/PerformanceAuditAnalyzer is the exception: it has local analyzer launchers, not server deployment wrappers.

Propagation rules & the skip-list trap (verified)

"Edit Chernarus, then run dotnet run" is correct for most files but silently incomplete for a fixed skip-list. LoadoutManager copies Chernarus → Takistan via FileManagement/FileManager.cs, which never overwrites certain files and never copies certain directories. A change made in Chernarus to any of these does not reach Takistan and must be hand-mirrored in both missions:

Not propagated (Chernarus → Takistan) Mechanism Why
mission.sqm ShouldSkipFile Map-specific editor data.
version.sqf ShouldSkipFile + git-ignored Generated per-terrain.
Client/GUI/GUI_Menu_Help.sqf skip + post-copy name patch Mission name differs per terrain.
WASP/unsort/StartVeh.sqf ShouldSkipFile Per-map starting vehicles.
texHeaders.bin, loadScreen.jpg ShouldSkipFile Binary/terrain assets.
Common/Config/Core_Artillery/* directory blacklist (co.takistan) Takistan keeps its own artillery configs.
Server/Config/* directory blacklist Map-specific server config.
Textures/* directory blacklist Per-terrain textures.
Server/Init/Init_Server.sqf copied then patched SET_MAP 1 → 2 rewrite post-copy.

A recursive diff in Deep-review findings DR-4 confirmed vanilla Takistan has no accidental drift outside this skip-list/blacklist and the SET_MAP rewrite. If you edit a skip-listed gameplay file, especially mission.sqm or WASP/unsort/StartVeh.sqf, hand-mirror it instead of assuming dotnet run will propagate it.

Takistan blacklist caveat: FileManager.cs:22-37 applies the directory blacklist when the destination path contains co.takistan. If future generated target names change away from that substring, re-test the blacklist before trusting artillery/config/texture propagation behavior.

Sync blast radius: LoadoutManager also deletes destination files and directories that do not exist in the source copy (FileManager.cs:116-119,123-136). Treat generated mission trees as disposable outputs. Manual edits or extra assets placed only in Missions_Vanilla/* can be removed by a later propagation run unless the generator/source tree owns them.

Soft-copy failure caveat: FileManager.cs:72-83 catches IOException during individual file copies, prints Error copying file: ..., and then continues the run. A LoadoutManager run can therefore finish with partial copy failures in console output. For release or propagation claims, inspect the console log and git diff --stat; do not rely only on process completion.

Generated root gate: for any release, smoke or pack claim, verify the root-specific version.sqf file exists and matches the target terrain before moving on. At minimum, source Chernarus should carry WF_MAXPLAYERS 55, WF_MISSIONNAME "[55] Warfare V48 Chernarus" and its intended Chernarus/naval flags; maintained Vanilla Takistan should carry WF_MAXPLAYERS 61, WF_MISSIONNAME "[61] Warfare V48 Takistan" and the intended non-Chernarus/non-naval flag shape. git status --ignored --short -- "Missions/[55-2hc]warfarev2_073v48co.chernarus/version.sqf" "Missions_Vanilla/[61-2hc]warfarev2_073v48co.takistan/version.sqf" should show ignored-present files in a prepared local checkout. The 2026-06-23 docs/source check at HEAD@101930f47 found both live files absent in a clean checkout; current master origin/master@c4c9a6479 tracks version.sqf.template in both maintained roots, but still does not track live version.sqf, so LoadoutManager generation is still required first. Companion PR #126 adds Tools/Ops/Test-WaspVersionTemplates.ps1 to guard the tracked fallback templates against exact-package markers and terrain identity drift before that lane is promoted. The machine-readable gate is agent-release-readiness.json versionSqfGeneratedInput.

Modded missions are not maintained by the current dotnet run path. The modded-terrain propagation call is commented out at SqfFileGenerators/SqfFileGenerator.cs:132 on docs/source/Miksuu/perf/a96fdda2 and :135 on current stable/B74.1/B74.2/B69/B74; packaging includes only Missions plus Missions_Vanilla at ZipManager.cs:16 on docs/source and :10 on stable-shaped/Miksuu/perf/a96fdda2 refs. Treat Modded_Missions/* as non-authoritative until the owner chooses regenerate-from-source or maintained-fork policy; see DR-32 for the full tier analysis.

Generated Mission Status Table

This is the operational summary of DR-32's three maintenance tiers. Use it before assuming a fix in Chernarus reaches every mission folder.

Target Current status Development consequence
Missions/[55-2hc]warfarev2_073v48co.chernarus Source of truth. Apply gameplay and documentation evidence here first.
Missions_Vanilla/[61-2hc]warfarev2_073v48co.takistan Faithful generated/copy target. Current drift is map-config and terrain assets only; logic files are byte-identical to Chernarus outside the documented skip-list and SET_MAP patch. Source fixes should propagate through LoadoutManager, except skip-listed files that need hand-mirroring. All DR findings in Chernarus apply to vanilla Takistan unless the changed file is map-specific.
Modded_Missions/napf, Modded_Missions/eden, Modded_Missions/lingor Divergent hand-edited partial forks with 100+ logic-file differences, including security-sensitive runtime/PVF/victory/upgrade/HQ paths. Wave S confirmed they are not drop-in runnable from the checkout, and the 2026-06-04 modded scout tightened this to boot-incomplete: eden lacks tracked version.sqf, stringtable.xml, loadScreen.jpg, sound and music descriptions; Napf lacks tracked mission.sqm, version.sqf, stringtable.xml, loadScreen.jpg, sound and music descriptions; lingor lacks tracked mission.sqm, description.ext, initJIPCompatible.sqf, version.sqf, stringtable.xml, loadScreen.jpg, sound/music descriptions and textures. All three still compile missing Common/Functions/Common_GetTotalCamps.sqf from Common/Init/Init_Common.sqf:52-53,127-128. PR #125 177ef1385f clears the previously committed conflict-marker tokens, but does not make these forks runnable. Source fixes do not automatically reach these missions. Pick a maintenance model before shipping them: regenerate from hardened source or maintain as explicit forks with separate audits, generated/runtime inputs and terrain-specific package proof.
Modded_Missions/sahrani, Modded_Missions/dingor, Modded_Missions/tavi, Modded_Missions/isladuala Abandoned/non-runnable stubs with only a small fraction of the real mission tree; dingor also has a description.ext that includes missing version.sqf. Complete or delete before presenting them as supported missions.

Tooling Project Inventory

Project Runtime Entry point Inputs Outputs / side effects Notes
Tools/LoadoutManager .NET 8 executable Program.cs -> SqfFileGenerator.GenerateCommonBalanceInitAndTheEasaFileForEachTerrain() Terrain/loadout data classes, source Chernarus mission, terrain skip lists. Generated EASA_Init.sqf, Common_BalanceInit.sqf, aircraft-name helper, per-terrain version.sqf, copied Takistan mission and optional _MISSIONS.7z. Root discovery, generated EASA category compile and skip-zip behavior are branch-sensitive; current master 6a34799b4 has marker-root discovery plus WFBE_EASA_FNC_LoadoutCat generation but no checked A2WASP_SKIP_ZIP.
Tools/PerformanceAuditAnalyzer PowerShell Analyze-PerformanceAudit.ps1, GUI launcher Existing Arma RPT/log files containing [Performance Audit]. CSV, Markdown, HTML and Word-friendly performance reports. Safe read-only analyzer for logs; no shipped live tailer service was found in the tree. See PerformanceAuditAnalyzer.
Tools/Ops/Set-MissionTemplate.ps1 PowerShell Current master script plus Set-MissionTemplate.Tests.ps1; present after PR #85 and unchanged in PR #86 / current origin/master@c4c9a6479 Server cfg-style files containing mission template lines matching the script regex. Repoints mission template values idempotently, with separate no-match, already-correct and write paths at Set-MissionTemplate.ps1:86-107. Current-master tooling source, but still production-config-sensitive. Run the dependency-free tests before using it, and use a throwaway config or reviewed diff before touching production server cfg files.
Tools/RptTownDefenseAnalyzer PowerShell Current master Analyze-TownDefenseRpt.ps1 and launcher scripts; present after PR #85 and unchanged in PR #86 / current origin/master@c4c9a6479 Arma RPT/log files with town-defense diagnostics and createGroup failure lines. HTML/console report sections, including createGroup failure parsing at Analyze-TownDefenseRpt.ps1:149-153 and reporting at :386,:524. Current-master read-only analyzer source. Treat output as triage evidence until paired with the exact RPT, mission branch/hash and runtime context.
DiscordBot .NET 9 executable DiscordBot/src/Program.cs -> ProgramRuntime.ProgramRuntimeTask() preferences.json, token.txt, extension database.json. Discord channel name, bot presence and status embed updates every 60 seconds. Missing token/preferences are expected in repo; active status reads Preferences.Instance.DataSourcePath or the default data path, while FileConfiguration.cs is secondary until config ownership is cleaned up.
Extension .NET Framework 4.8 x86 Arma extension _RVExtension@12 export Arma callExtension arguments from mission scripts. Writes C:\a2waspwarfare\Data\database.json for DiscordBot. Legacy Visual Studio/MSBuild target using RGiesecke.DllExport/UnmanagedExports from ../packages; preserve x86.
Mods/mkswf_sidewinder_reload_time_fix Arma addon config CfgWeapons.hpp Sidewinder launcher class config. Sets magazineReloadTime = 1 for Sidewinder launchers. External addon fragment, not mission SQF.

Local Build Verification 2026-06-03

Project Local result Notes
Tools/LoadoutManager/LoadoutManager.csproj dotnet build -v minimal succeeded with 86 nullable warnings and 0 errors. Warnings are mostly non-nullable initialization / possible null-reference warnings in data classes and zip helper paths. Build success does not run mission generation or packaging.
DiscordBot/DiscordBot.csproj dotnet build -v minimal succeeded with 0 warnings and 0 errors. Runtime still requires ignored token.txt and preferences.json plus a valid database.json source.
Extension/Extension.csproj dotnet build -v minimal failed locally with MSB3644: .NET Framework 4.8 reference assemblies were not found. Treat as local toolchain missing targeting pack, not proof the legacy extension source is broken. Use Visual Studio/MSBuild with the .NET Framework 4.8 developer pack and x86/package layout before release claims.

PerformanceAuditAnalyzer

Dedicated page: PerformanceAuditAnalyzer.

Tools/PerformanceAuditAnalyzer parses existing Arma 2 RPT/log files containing [Performance Audit] and exports CSV/Markdown/HTML/Word-friendly reports. It has a GUI picker plus command-line script, but the current tree does not ship a live RPT tailer, background telemetry service or server restart/deploy helper.

Operational caveats from the 2026-06-04 tooling scout:

  • Analyze-PerformanceAudit.ps1:1224-1228 creates the output directory before it confirms any input files, so failed/no-input runs can still leave output folders behind.
  • Analyze-PerformanceAudit.ps1:1248 reads each input with Get-Content | ForEach-Object; useful for normal RPTs, but very large logs should be treated as memory/latency-sensitive until streaming behavior is improved and tested.
  • Start-PerformanceAuditAnalyzer.ps1:11-12,119-120 loads System.Windows.Forms and opens the picker dialog, so the launcher is desktop/interactive only. Use Analyze-PerformanceAudit.ps1 directly for automation, CI or headless server log processing.

Important outputs include:

  • performance_raw.csv
  • performance_pivot_ready.csv
  • performance_extra_fields.csv
  • performance_timeline.csv
  • performance_by_script.csv
  • performance_spikes.csv
  • performance_fps_context.csv
  • performance_by_player.csv
  • performance_by_map.csv
  • performance_by_session.csv
  • performance_report.md
  • performance_report.html
  • performance_interpretation.html
  • performance_report_word.doc

Use it after performance-sensitive mission changes or live-server audits.

Packaging And Deployment Notes

  • 7za environment variable points to 7za.exe.
  • ZipManager packages mission directories after copy/generation and currently zips only Missions plus Missions_Vanilla, not Modded_Missions (ZipManager.cs:16 on docs/source, :10 on stable-shaped/Miksuu/perf/a96fdda2 refs).
  • Missing 7za causes the final packaging step to throw unless the target branch implements and honors A2WASP_SKIP_ZIP=1 or the release command-center unset-7za skip. Current stable origin/master@c4c9a6479, B74.2/B69/B74, historical a96fdda2, current Miksuu/perf and the local feat/supply-helicopter checkout do not in the checked refs. Inspect generated/copied files before assuming the whole run did nothing.

Historical snapshot (superseded). The PR #125 identity guardrail below was written against the 2026-06-30/07-02 release-command-center packaging state; the live build has moved on (see Current live state — Build 89 line, cmdcon44 chain, 2026-07-06). The PR base branch claude/build84-cmdcon36 remains the active base; branch@commit snapshots below are point-in-time evidence, not the live state. Re-verify before acting.

  • PR #125 identity guardrail: current checked command-center release head is codex/release-command-center-20260630@177ef1385f22aefb466368ef9c381d64a57801c0. The current package proof is _MISSIONS.7z SHA256 5910819DF9840B06146A5C237691AD159B507162399AF596050822EB86F2E5F2, 1,885 entries, 7,167,459 bytes, with release handoff status ready_for_runtime_collection. The latest package refresh keeps Build83/cmdcon35 reconciliation and the cmdcon35 placement-preview private declaration fix, while adding the AICOM order-sequence, capture-stall guardrails and movement-root/arrival-radius follow-up in both maintained terrains: AllCamps camp MOVE/SAD is one WaypointsAdd chain, same-target stall age is checked independently of the older far-from-target stuck branch, and relaid waypoint batches now call setCurrentWaypoint on their first new node, and arrival now latches from WFBE_C_AICOM_ASSAULT_ARRIVE_RADIUS while the capture phase keeps the tighter SAD/depot behavior. It preserves PVF dispatcher shape guards, AICOM requester validation, AICOM lifecycle/refund authority guards including corrupted active marker-list reset, AICOM/group-funds default reads, AICOM artillery interval/range-array guards, feed-request replay validation/throttling, shared factory queue empty-head guards, Attack Wave PV/activation authority guards, ICBM RequestSpecial requester/team/commander/funds/structure/unlock/duplicate validation, supply mission start/completion/cooldown-query payload guards with server-stamped expected cargo/side and friendly Command Center completion validation, SCUD requester/team/action-grant/pad-proximity server revalidation, GUER mortar player/vehicle/range/funds server validation plus client result payload unwrapping, player support/UAV requester/team/destination/upgrade/cooldown/funds binding, RespawnST and aicom-focus requester tuple alignment, safe side-supply no-commander logging, upgrade artillery side ownership, missing AI commander funds defaults, HCTopUp draft exclusion and deleted-proposal cleanup; no runtime proof or deploy approval is implied. Older package proof for cf75f9e0e, 88368a9723, 84b0b79ab and any intermediate journal package proof is historical only. Do not collect or score runtime RPTs against a stale package identity.
  • Packaging success is not a strong release proof by itself. On release command-center 177ef1385f, ZipManager gates on 7-Zip exit code and uses _MISSIONS.7z.tmp before replacing the archive; then Tools/PrTestHarness/Package/Test-WaspReleasePackage.ps1 verifies the archive roots, required Chernarus/Takistan boot files, release markers, per-required-file hashes and the complete git-tracked mission payload against HEAD while allowing only the two generated ignored version.sqf files outside git. The 2026-07-02 local manifest for 177ef1385f recorded 1,885 entries, 7,167,459 bytes, SHA256 5910819DF9840B06146A5C237691AD159B507162399AF596050822EB86F2E5F2, 1,723 tracked mission files matched to HEAD, 1,725 archive mission files, zero missing tracked files, zero unexpected mission files and zero hash mismatches. Tools/PrTestHarness/Package/Test-WaspReleasePackage.SelfTest.ps1 proves the gate rejects both stray untracked mission files and stale tracked content injected into copied archives. Tools/PrTestHarness/Release/New-WaspReleaseHandoff.ps1 can turn that manifest into a local operator handoff packet, copy release-package-manifest.json plus sibling release-package-manifest.md into the same folder, re-hash the local archive before handoff readiness, and includes runtime-approval/runtime-evidence/deployment-approval pending gates, runtime-rpt-source-map.template.json, the New-WaspRuntimeRptPacket.ps1 builder command, runtime-rpt-packet-manifest.json as the publishable packet inventory, runtime-run-ledger.template.json, the Test-WaspRuntimeRptPacket.ps1 -ExpectedArchiveSha256 5910819DF9840B06146A5C237691AD159B507162399AF596050822EB86F2E5F2 -RunLedgerPath "<release-candidate-rpts>\release-run-ledger.json" -RequireSourceRptExists gate, and the summary command with -RuntimePacketManifestPath "<release-candidate-rpts>\runtime-rpt-packet-manifest.json" -ExpectedCandidate release-command-center-20260630 -ExpectedGit 177ef1385f -ExpectedArchiveSha256 5910819DF9840B06146A5C237691AD159B507162399AF596050822EB86F2E5F2 -RequireRuntimePacketManifest before release wording. The handoff contract has a local self-test, the runtime packet builder rejects private source-map release identity drift instead of letting stale source-map values override explicit expected values, and the runtime packet checker requires the run ledger to contain non-empty matching release.candidate, release.git and release.archiveSha256 when expected values are supplied. The runtime packet checker also rejects duplicate RPT content, role-identity mismatches and HC/player-client per-role proof mismatches while validating exact roleProof and client joinPhase; the scorer then requires startup banners, CIV HC registry proof, stronger no-human AICOM telemetry (AICOMSTAT event, TEAM_FOUNDED, CMDRSTAT plus autonomous action/progress), the dedicated takistan-west-aicom-infantry-fallback scorer gate for the Takistan WEST AICOMGATE|WEST|infFallback proof token, and per-terrain runtime evidence for both Chernarus and Takistan. The summary stays red unless the packet manifest matches the expected candidate/git/archive SHA, has schema a2waspwarfare-runtime-rpt-packet-builder-v1, validation.requested=true, validation.overall=pass, all required packet-validator gates with status=pass, a matching rptRootHash, matching copied file copiedPathHash/copiedRptSha256 values and exactly ten copied RPT files. Outputs stay path-hashed, but runtime launch, deployment and fresh dual-terrain RPT evidence still require separate approval/proof. Older refs may still delete an existing _MISSIONS.7z before proving a new archive and may not gate on the process exit code. Confirm package provenance before calling a release archive complete.
  • File replacement warnings can still hard-fail later: BaseTerrain.cs:275-301 logs "File not found!" for a missing expected file and then still calls File.ReadAllText on the same path. Treat missing replacement targets as real generator failures, not harmless warnings.
  • Generated aircraft damage insertion is marker-based: BaseTerrain.cs:84-86 wires Common_ModifyAirVehicle.sqf, and FileManager.cs:224-247 prints missing-content warnings without failing the run. Keep a marker-contract check in release validation before changing generated aircraft damage logic.
  • The source Chernarus mission is copied to target terrain folders, and extra destination-only files/directories can be deleted during sync (FileManager.cs:116-119,123-136). Avoid manual changes in generated targets unless the generator is being updated; snapshot generated mission trees before risky propagation runs.
  • The specified content was not found in the file. during the current run comes from the terrain help-menu title replacement path and did not stop Chernarus/Takistan generation/copy.
  • For the exact version.sqf -> description.ext / Rsc/Header.hpp / initJIPCompatible.sqf contract, use Mission config/version include graph.

Development Commands

cd Tools\LoadoutManager
dotnet run
dotnet run -c SERVER_DEBUG
$env:A2WASP_SKIP_ZIP = "1"
dotnet run --project Tools\LoadoutManager\LoadoutManager.csproj

Use the skip-zip command only after confirming the target branch references A2WASP_SKIP_ZIP in Tools/LoadoutManager; otherwise configure 7za or expect the packaging step to throw after generation/copy.

powershell -ExecutionPolicy Bypass -File .\Tools\PerformanceAuditAnalyzer\Analyze-PerformanceAudit.ps1 -InputPath ".\logs\arma2oa.rpt" -OutputPath ".\PerformanceAuditResults"

Continue Reading

Previous: Client UI systems atlas | Next: External integrations

Main map: Home | Fast path: Quickstart | Agent file: agent-context.json

Sidebar

Clone this wiki locally