CI: compile the C# mods (build-mods verb) so a mod typo can't ship to the server unseen #60
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
Nothing compiles the C# mods on the way to deploy.
.forgejo/workflows/build-publish.ymlruns pytest + ruff + mypy + docker build, and the Dockerfile builds only the frontend + Python. The mods (mods/{jobs,replay,telemetry,stores}) are built by thebuild-mod-*ward verbs and shipped to the server out of band, so a C# typo in a mod is caught by no automated gate and reaches the live Eco game server unseen.Surfaced by the eco-app#8 engineer run: there is no dotnet in the container either, so the engineer had to hand-install the .NET 10 SDK (ICU was missing, so
DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1) just to get a real green mod build before committing. That detour should not be per-run.Ask
Gate mod compilation in CI so a mod that does not compile fails the build.
build-modsumbrella ward verb that builds every mod (jobs,replay,telemetry,stores) - today thebuild-mod-*verbs are per-mod and CI would have to enumerate them.ward exec build-mods. Provisioning options, cheapest first:DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1for the missing-ICU case (the recipe the #8 engineer proved). Independent of the image, lands immediately.Prefer the self-install now so the gap closes this cycle, with a comment pointing at the dev-base path as the eventual replacement.
Acceptance
mods/*fails CI on a PR/push, before deploy.ward exec build-modsbuilds all four mods green locally and in CI.Origin
Found by the eco-app#8 engineer, 2026-07-05, who installed .NET 10 by hand to avoid shipping a mod blind. Sibling: dev-base should ship the .NET SDK (agentic-os issue). Umbrella: agentic-os#328 CI-in-dev-base parity.
🔒 Reserved by
ward agent --driver claude— containerengineer-claude-eco-app-60on hostKAI-DESKTOP-TOWERis carrying this issue (reserved 2026-07-05T03:46:06Z). Concurrentward agentruns are blocked until it finishes or the reservation goes stale (2h0m0s TTL);--forceoverrides.Do not comment on or edit this issue to steer the run while it is reserved. The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a new issue, dispatched fresh — that is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494).
— Claude (she/her), via
ward agentWARD-OUTCOME: done - build-mods umbrella verb + a CI
modsjob (self-installed .NET 10 SDK) now compile all four C# mods before publish; landed on main.Smooth run, mostly because the #8 engineer had already blazed the trail: the invariant-globalization recipe was handed to me, and installing the .NET 10 SDK via
dot.net/v1/dotnet-install.shjust worked. All four mods (jobs, replay, telemetry, stores) built green first try once dotnet was on PATH, so I could actually verify the umbrella target locally rather than trusting it blind.One judgment call worth flagging: the ask says CI runs
ward exec build-mods, but I wired the job tomake build-modsdirectly. Ward is not in the CI runner (node:20-bookworm), and every existing job already bypasses the gate the same way -uv run pytest, notward exec test. So this matches convention;ward exec build-modsremains the local equivalent, same target. If you would rather CI literally shell through ward, that is a follow-up (install the binary in the job).Confidence is high on the verb and the mapping (verified locally, ward doctor clean, pre-commit green). The one thing I could not exercise is the CI job on the real Forgejo runner - the missing-ICU assumption and the
$GITHUB_PATHhandoff are reasoned, not observed. First push to main will be the real test. If the runner already ships ICU the invariant flag is just harmless belt-and-suspenders. Rough edge / follow-up: swap the self-install for dev-base's dotnet once agentic-os#328 lands - there is a TODO in the workflow pointing at it.