Files
satellite-provider/_docs/_process_leftovers/2026-05-12_perf-cycle3-harness-execution.md
T
Oleksandr Bezdieniezhnykh c0f004d2c9 [AZ-500] Cycle 4 Step 9: new-task .NET 10 migration
Closes Step 9 (New Task) of cycle 4. AZ-500 spec defines the
.NET 8 -> .NET 10 migration (TFM bump on 9 csprojs, global.json
SDK pin to 10.0.0, both Dockerfiles + run-tests.sh + woodpecker
to mcr.microsoft.com/dotnet/*:10.0, Microsoft.AspNetCore.* and
Microsoft.Extensions.* to the 10.x line, Serilog.AspNetCore to
10.x or documented 8.0.3 fallback, plus arch.md + AGENTS.md doc
sync). Closes the cycle-3 perf-harness leftover via AC-5
(bootstrap smoke after migration).

Also logs the cycle-4 perf-leftover replay attempt that
discovered the host-SDK / project-SDK mismatch and rolls the
state file from cycle 3 -> cycle 4 (Step 9 done -> Step 10
ready).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-12 04:35:52 +03:00

3.3 KiB

Leftover — Cycle 3 perf harness execution

Timestamp: 2026-05-12T01:11:00Z (last replay attempt; original deferral at 2026-05-12T00:00:00Z) Reason for deferral: User skipped the Step 15 (Performance Test) gate of cycle 3. Per meta-rule.mdc, performance tests require explicit approval; a skipped question is not approval. Defaulted to skip + record-as-leftover to avoid blocking cycle-3 progress through Steps 16-17.

Replay attempt — 2026-05-12 (cycle 4 /autodev start)

User picked A (run perf harness now). Stack came up cleanly via docker-compose up -d --build. Perf script scripts/run-performance-tests.sh failed at the bootstrap step (dotnet build SatelliteProvider.IntegrationTests for the --mint-only JWT subcommand) because the host has only .NET 10.0.103 SDK installed and global.json pins sdk.version=8.0.0 with rollForward=latestMinor (only rolls within 8.0.x). Exit code 3.

Sibling script scripts/run-tests.sh does NOT have this problem because it shells out to docker run --rm ... mcr.microsoft.com/dotnet/sdk:8.0 for every dotnet invocation. The perf script was written without that pattern.

Per cycle-3 lesson "scenarios accumulate as Unverified across cycles" — this is a real script bug, not just a host quirk.

Resolution path

Cycle 4 will run a full ".NET 8 → .NET 10 migration" task (see Step 9 of cycle 4). Once the project targets net10.0 and global.json no longer pins to 8.x, the host SDK becomes the project SDK and the perf script's bootstrap will succeed without modification (it shells out to dotnet build against the same project, which will then resolve against mcr.microsoft.com/dotnet/sdk:10.0 for any Docker-side calls and against the host 10.x SDK for host-side calls). Cycle 4's deploy gate (Step 15) will then re-run this perf harness against the migrated build.

Pre-requisites for replay (after .NET 10 migration lands)

Same as before — env vars must be present:

  • JWT_SECRET — ≥ 32 bytes; already in .env
  • JWT_ISSUER — already in .env as DEV-ONLY (AZ-494)
  • JWT_AUDIENCE — already in .env as DEV-ONLY (AZ-494)
  • GOOGLE_MAPS_API_KEY — already in .env

Optionally:

  • PERF_REPEAT_COUNT (default 20)
  • PERF_UAV_BATCH_SIZE (default 10)

How to replay (after .NET 10 migration)

docker-compose up -d --build           # bring up API on :18980
./scripts/run-performance-tests.sh     # ~3-5 minutes
docker-compose down --remove-orphans

Why this is NOT a hard blocker

  • The cycle-3 implementation report and code review verdicts already note that the perf harness was statically verified (script grep + integration-test compile + AZ-492 AC-1/AC-4/AC-5/AC-6 covered).
  • The AZ-488 batch-p95 threshold was set in cycle 2 and existing integration tests do NOT regress at the cycle-3 build (Step 11 full suite all-green).
  • No cycle-3 change altered the production hot paths beyond JWT validation (AZ-494 adds two string comparisons per request — sub-microsecond).
  • The cycle-2 deploy also skipped this gate (Option B) without negative consequences.

Replay obligation

Defer until cycle 4's .NET 10 migration is deployed (Step 16). At that point, replay this leftover as part of cycle 4's Step 15 (Performance Test) gate. If perf passes — delete this file. If it fails — keep with failure detail.