- Make the smallest upstream-compatible change that satisfies a framework, native component, build, or release boundary. Never encode gamemode-specific behavior in this reusable fork.
- Keep
upstreamfetch-only and never rewrite upstream history. A blocked submodule may be forked to a private SampStack repository only when a reusable native fix is required. - Keep durable rules here and live state in
docs/AGENT-HANDOFF.md. Compaction is unannounced; refresh the handoff after decisions, before noisy work, and after material tests.
- Read this file,
docs/AGENT-HANDOFF.md, and themaintain-sampsharpskill. Inspect the main worktree, remotes, and recursive submodule state. - Trace the owning managed library, native component, SDK, build, or release path. Treat gamemode failures as consumer evidence, not product-specific design requirements.
- Implement one coherent root fix. Preserve package IDs, public APIs, source provenance, and platform-neutral behavior unless the task explicitly changes them.
- Validate proportionally, then run the narrowest consuming gamemode scenario when compatibility is the boundary. Do not run the full managed suite for docs or workflow-only changes.
- Update the handoff; use a branch and pull request for future work; verify the merged revision on
origin/main.
- Native open.mp components: Linux x64/arm64, Windows x64, and macOS x64/arm64.
- Managed NuGet packages are architecture-neutral. Development packages use immutable
1.0.0-dev.<run>.<commit>versions; the mutable GitHubdevrelease points to the current set. - Prefer host-native builds for local development. Docker is not a native compatibility test.
- Resolve
nethostfrom the matching installed .NET host pack. Never link a committed binary built for another operating system or architecture.
- Native component logic: configure and build only the current host first.
- Managed code: run the focused project tests; use
./build.sh librariesplus./build.sh libraries test --no-buildfor framework-wide changes. - Platform/release changes: manually run
release.ymlfor the exact pushed revision. Usebuild_onlyfor artifact-only proof; no workflow runs on a branch push or merge. - The manual release workflow refreshes mutable
devby default. Immutable versions require an explicit three-part version and consumer validation. Setartifact_run_idto a successful prior run of the same workflow and commit to publish its retained artifacts without rebuilding. - Never publish an uncommitted tree, overwrite a stable package, push to
upstream, or place tokens in source, build arguments, artifacts, or logs.