SKILL.md #3

  • //
  • test-install_sdp/
  • dev/
  • ai_dev_support/
  • skills/
  • install-sdp-test-suite-run/
  • SKILL.md
  • Markdown
  • View
  • Commits
  • Open Download .zip Download (14 KB)

name: install-sdp-test-suite-run description: Run (or re-run) the SDP Installer Test Suite's full regression across the AWS platform fleet -- exercises install_sdp.sh, mkdirs.sh, and related scripts across every qualified Linux platform. Also covers manual real install-then-upgrade testing (sdp_upgrade.sh), which isn't yet automated. Use whenever asked to run/re-run install_sdp.sh regression tests, or to test an SDP upgrade.

SDP Installer Test Suite Runner

Runs the full install_sdp.sh regression suite (the r/uat aliases, driven by cli_tests.cfg and test/bsw/run_cli_tests.sh) across the AWS fleet of platform test machines. See InstallSDP-TestServerSetup.md (in the //test-install_sdp stream root) for the full background on this fleet and how a machine gets added to it; this skill just codifies running the existing fleet's regression suite so it doesn't have to be re-derived each session.

Safety: this test suite calls DANGER_CLEAN.sh repeatedly and is destructive by design. Only ever run it against the dedicated fleet machines below -- never against a real customer-facing or production machine.

Two fleets exist -- only one is correct to use

There are TWO sets of AWS test machines, left over from the Classic-to-Streams depot migration (see SDP-1170). Only the new fleet's DVCS remotes point at the real Stream depots (//test-install_sdp/dev/... and //p4-sdp/dev_rebrand/...); the old fleet's remotes point at stale personal/Classic guest paths (e.g. //guest/tom_tyler/sw/main/install_sdp/dev/bin/...) that stopped being updated long ago. Running against the old fleet silently tests stale code -- p4 fetch reports "No changes to fetch" and everything appears to pass, but nothing you just changed was actually exercised. This bit us on 2026-08-31: a full-suite run looked clean (574/0) but had actually run against code from hundreds of changelists earlier.

How to tell them apart, in order of reliability:

  1. Wrapper script name: ssh-test-install_sdp-*.sh = new/correct fleet. ssh-install_sdp-test*.sh (note the word order swap) = old/Classic fleet. Easy to misread -- check carefully.
  2. Authoritative check: cd into /opt/perforce/dev/bin and /opt/perforce/dev/sdp and run p4 remote -o origin; the DepotMap should read //test-install_sdp/dev/... //test-install_sdp/dev/... and //p4-sdp/dev_rebrand/... //p4-sdp/dev_rebrand/... (mapping the stream to itself, 1:1). Anything mapping to a //guest/... path is the old fleet or a stale clone -- don't trust it.

Hostname is not a reliable tell as of 2026-08-31: both fleets' machines are now named p4d-test-<tag>-01 (the new fleet's AWS-default ip-... names were fixed via bootstrap_test_machine.sh -host / manual hostnamectl -- see "Fleet setup hygiene" below -- and happened to reuse the same naming convention as the old fleet). Don't use hostname to distinguish the fleets; always fall back to check #2 above if the wrapper script name is ever ambiguous.

If you ever aren't sure which fleet a wrapper script belongs to, check its filename against the pattern above, or just SSH in and check the remote -- don't assume.

Retargeting the fleet's SDP source stream

When a new dev-cycle stream becomes the one to test (e.g. after a Merge Down/Copy Up promotes dev_rebrand's work into dev), retarget each fleet machine's sdp clone with swap_source.sh (ships in /opt/perforce/dev/bin, part of the test-install_sdp clone -- see its header comment for full mechanics). It parks the current checkout by suffix and either restores a previously-parked checkout for the target stream or does a fresh p4 clone -r if none exists yet:

ssh -o StrictHostKeyChecking=no -l <user> -i <pem> <ip> "sudo bash -c '
source /opt/perforce/dev/bin/dev_env.sh
cd /opt/perforce/dev/bin
export P4_SWAP_USER=ftp
./swap_source.sh p4-sdp/dev
'"

Run this once per fleet machine (all 7, in parallel) before the next full-suite run. It only touches /opt/perforce/dev/sdp (the Target=sdp case) -- the bin clone (the test suite itself) stays on test-install_sdp/dev throughout; retarget it too (./swap_source.sh test-install_sdp/dev) only if the test suite itself has a new stream to track, which is rare.

Known gotcha found 2026-09-02: after retargeting, test_preflight.sh can fail with The 'p4 status' in /opt/perforce/dev/bin was NOT clean; ... .p4ignore even though nothing about the retarget touched bin at all -- if a fleet machine's bin clone predates change 33164 (the .p4ignore content fix in test-install_sdp/dev), the working file on disk is stale relative to head and shows up as a bogus reconcile candidate. Fix with a one-time p4 sync -f .p4ignore in /opt/perforce/dev/bin on the affected machine(s) -- confirm first with p4 diff -f .p4ignore that the only difference is exactly this, not a real conflict.

Fleet setup hygiene

bootstrap_test_machine.sh -host <hostname> sets both the machine's hostname AND its timezone to America/Los_Angeles (so Public Depot submit timestamps aren't skewed relative to the target P4 Server's Pacific time -- push/fetch timestamps don't get translated across time zones, so mismatched zones produce technically-valid but visually-wrong-looking timestamps). This is optional and easy to forget when bootstrapping a new machine -- the new fleet's boxes sat with default AWS ip-... hostnames and (most likely) UTC/default timezones until this was caught and fixed on 2026-08-31. If you bootstrap a new machine, pass -host p4d-test-<tag>-01 (or run hostnamectl set-hostname/timedatectl set-timezone America/Los_Angeles directly) rather than skipping it.

Prerequisites

  • SSH access to each fleet machine via its PEM + public IP (see "Fleet" below). The PEM and per-machine SSH wrapper scripts live at /Users/ttyler/ppn/BattleSchool/aws/pem/us-east-2/ssh-test-install_sdp-*.sh -- cat one to get the exact ssh -l <user> -i <pem> <ip> invocation for that machine (login user varies: rocky for Rocky Linux, ec2-user for SLES, ubuntu for Ubuntu). Do NOT use the similarly-named ssh-install_sdp-test*.sh scripts -- those are the old/Classic fleet; see above.
  • Each machine already has /opt/perforce/dev/bin (the test suite clone) and /opt/perforce/dev/sdp (the SDP clone under test) bootstrapped via bootstrap_test_machine.sh -- see InstallSDP-TestServerSetup.md if a machine needs (re-)bootstrapping. This skill assumes that's already done.

Fleet (as of 2026-08-31; re-derive from the wrapper scripts if this looks stale)

Wrapper script Platform Login user
ssh-test-install_sdp-r8x86_64.sh Rocky 8 rocky
ssh-test-install_sdp-r9x86_64.sh Rocky 9 rocky
ssh-test-install_sdp-r10x86_64.sh Rocky 10 rocky
ssh-test-install_sdp-sles15x86_64.sh SLES 15 ec2-user
ssh-test-install_sdp-u22x86_64.sh Ubuntu 22 ubuntu
ssh-test-install_sdp-u24x86_64.sh Ubuntu 24 ubuntu
ssh-test-install_sdp-u26aarch64.sh Ubuntu 26 ubuntu

No Ubuntu 20 wrapper exists in the new fleet as of this writing (the old fleet had one) -- don't assume it's missing by mistake; just confirm before relying on Ubuntu 20 coverage.

Ubuntu 26 has a known, pre-existing failure (POSIX chown regression, tracked upstream) -- see InstallSDP-TestServerSetup.md's Platforms list. A failure there is not by itself a sign of a new regression; compare against that known issue before treating it as new. (This was noted against the old fleet; re-confirm it still applies to the new fleet's Ubuntu 26 box the first time you use it.)

Running the full suite on one machine

This replicates the interactive dev + uat aliases (defined in each machine's ~/.bashrc and dev_env.sh) as a single non-interactive command. Order matters: dev_env.sh must be sourced before any p4 command, or p4 won't be on PATH yet and you'll get p4: command not found.

ssh -o StrictHostKeyChecking=no -l <user> -i <pem> <ip> "sudo bash -c '
set -e
source /opt/perforce/dev/bin/dev_env.sh
export KEEP_GOING=1
cd /opt/perforce/dev/sdp/Server/Unix/setup && p4 fetch
cd /opt/perforce/dev/bin && p4 fetch
./test_preflight.sh && ./r
'" > <scratchpad>/<platform>_run.log 2>&1

Notes on this command:

  • The two p4 fetch calls pull the latest SDP (//p4-sdp/dev as of 2026-09-02, see "Retargeting" above for how/when this changes) and latest test suite (//test-install_sdp/dev) respectively -- each of .../sdp and .../bin is its own independent p4 clone-managed DVCS repo (see dev_env.sh's comments), so both fetches are needed.
  • KEEP_GOING=1 makes the suite run through all test groups even if one fails, instead of aborting at the first failure -- needed to get a full pass/fail picture in one run.
  • test_preflight.sh && ./r mirrors the uat alias exactly: don't run the destructive suite if the workspace isn't clean.
  • Run this via a background Bash task per machine (run_in_background: true) -- a full regression run takes a while, and you'll want to run the whole fleet in parallel rather than one machine at a time.

Running across the whole fleet

Launch the command above once per machine (substituting that machine's user/pem/ip and a distinct log file), all as separate background Bash calls in parallel. Wait for each task-completion notification rather than polling.

Analyzing results

Each log ends with:

Summary:
PASS Test 1 ...
PASS Test 2 ...
...
Scan for unreported errors:
grep -c '^PASS Test' <log>   # pass count
grep -c '^FAIL Test' <log>   # fail count
grep -n '^FAIL Test' <log>   # which ones, to investigate

Anything printed under "Scan for unreported errors:" is also worth reviewing -- it's the r script's own heuristic catch-all for error-looking lines that didn't get wrapped in a PASS/FAIL marker.

To see the list of individual test groups (e.g. to re-run just one after a fix), run ./r ls in place of ./r in the command above.

Manual upgrade testing (not yet part of the automated suite)

./r/cli_tests.cfg exercise install_sdp.sh fresh installs across platforms, but do not exercise sdp_upgrade.sh -- there is currently no automated upgrade-path coverage anywhere in this fleet's regression suite. This gap let a real bug ship in SDP 2026.1 GA (SDP-1394: install_sdp.sh and friends hardcoded the planned-for-2026.2 /opt/perforce/p4-sdp path instead of 2026.1's /opt/perforce/helix-sdp) and a second one found only by testing the fix itself (SDP-1395: sdp_upgrade.sh reported a false "FAILED" on an otherwise-successful package-structure upgrade). Both were caught the day after GA, not before, specifically because nothing exercised a real install-then-upgrade cycle.

Until this is automated, do this manually whenever a release touches install_sdp.sh, sdp_upgrade.sh, mkdirs.sh, configure_sample_depot_for_sdp.sh, or anything else in the package-structure install/upgrade path -- ideally as part of Step 4 (pre-release verification), not just post-release smoke testing, so a regression like SDP-1394/1395 is caught before shipping rather than after:

  1. Reset the machine to a clean slate. From the fleet machine (either fleet -- this doesn't depend on the DVCS source-tracking distinction above, since you're testing the shipped tarball, not the fleet's own dev clone):
    sudo bash /opt/perforce/dev/bin/DANGER_CLEAN.sh -y
  2. Install a real older release, matching what an actual customer upgrading today would have. Fetch the target release's install_sdp.sh from wherever it actually shipped from (the frozen Classic depot for anything through 2025.2 Patch 1, e.g. p4 print -q //guest/perforce_software/sdp/main/Server/Unix/setup/install_sdp.sh@<CL>; //p4-sdp/r<NN.N> release streams for anything 2026.1+), copy it to the machine, and run it in -demo mode for speed (storage layout isn't the point of this test):
    ./install_sdp.sh -C > sdp_install.cfg
    ./install_sdp.sh -c sdp_install.cfg -init -y -demo

    Confirm the resulting structure matches that release's actual convention (e.g. /opt/perforce/helix-sdp for anything through 2026.1) before proceeding -- don't assume; verify with ls /opt/perforce/.

  3. Upgrade to the release candidate, using the same download path a real customer would -- the actual published tarball URL for a released version (https://workshop.perforce.com/download/p4-sdp/main/downloads/sdp.Unix.tgz once published), or a freshly-built local tarball copied to the machine directly if testing an unpublished release candidate before Step 20:
    cd /opt/perforce/helix-sdp/downloads   # or /opt/perforce/p4-sdp/downloads, per the release
    curl -sL -O <tarball URL>              # or scp a locally-built tarball here instead
    cd /opt/perforce/helix-sdp
    mkdir -p backup && mv sdp backup/sdp.old.$(date +'%Y-%m-%d-%H%M%S')
    tar -xzf downloads/sdp.Unix.tgz && chown -R root:root sdp
    cd sdp/Server/Unix/p4/common/sdp_upgrade
    ./sdp_upgrade.sh -y
  4. Verify for real, not just the script's own "SUCCESS" line: check /p4/sdp/Version matches the target release, confirm the directory structure landed correctly (no stray directory named for a not-yet-released naming convention), and if a p4d instance is actually running, confirm it still answers (p4 -p ssl:1999 info or equivalent).

Old-fleet caveat: machines on the old (ssh-install_sdp-test*.sh) fleet may be in whatever ad hoc state a prior test left them in -- e.g. one Rocky 8 box was found to be a broker-only fixture with no real p4d instance at all. Still a valid starting point for this procedure (just run DANGER_CLEAN.sh first per step 1 above), but don't assume any given old-fleet machine already has a clean or representative state without checking.

---
name: install-sdp-test-suite-run
description: Run (or re-run) the SDP Installer Test Suite's full regression across the AWS platform fleet -- exercises install_sdp.sh, mkdirs.sh, and related scripts across every qualified Linux platform. Also covers manual real install-then-upgrade testing (sdp_upgrade.sh), which isn't yet automated. Use whenever asked to run/re-run install_sdp.sh regression tests, or to test an SDP upgrade.
---

# SDP Installer Test Suite Runner

Runs the full `install_sdp.sh` regression suite (the `r`/`uat` aliases, driven by
`cli_tests.cfg` and `test/bsw/run_cli_tests.sh`) across the AWS fleet of platform test
machines. See `InstallSDP-TestServerSetup.md` (in the `//test-install_sdp` stream root) for
the full background on this fleet and how a machine gets added to it; this skill just
codifies running the existing fleet's regression suite so it doesn't have to be re-derived
each session.

**Safety**: this test suite calls `DANGER_CLEAN.sh` repeatedly and is destructive by
design. Only ever run it against the dedicated fleet machines below -- never against a
real customer-facing or production machine.

## Two fleets exist -- only one is correct to use

There are TWO sets of AWS test machines, left over from the Classic-to-Streams depot
migration (see SDP-1170). **Only the new fleet's DVCS remotes point at the real Stream
depots** (`//test-install_sdp/dev/...` and `//p4-sdp/dev_rebrand/...`); the old fleet's
remotes point at stale personal/Classic guest paths (e.g.
`//guest/tom_tyler/sw/main/install_sdp/dev/bin/...`) that stopped being updated long ago.
Running against the old fleet silently tests stale code -- `p4 fetch` reports "No changes
to fetch" and everything appears to pass, but nothing you just changed was actually
exercised. This bit us on 2026-08-31: a full-suite run looked clean (574/0) but had
actually run against code from hundreds of changelists earlier.

**How to tell them apart, in order of reliability:**
1. Wrapper script name: `ssh-test-install_sdp-*.sh` = new/correct fleet.
   `ssh-install_sdp-test*.sh` (note the word order swap) = old/Classic fleet. Easy to
   misread -- check carefully.
2. Authoritative check: `cd` into `/opt/perforce/dev/bin` and `/opt/perforce/dev/sdp` and
   run `p4 remote -o origin`; the `DepotMap` should read
   `//test-install_sdp/dev/... //test-install_sdp/dev/...` and
   `//p4-sdp/dev_rebrand/... //p4-sdp/dev_rebrand/...` (mapping the stream to itself,
   1:1). Anything mapping to a `//guest/...` path is the old fleet or a stale clone --
   don't trust it.

Hostname is **not** a reliable tell as of 2026-08-31: both fleets' machines are now named
`p4d-test-<tag>-01` (the new fleet's AWS-default `ip-...` names were fixed via
`bootstrap_test_machine.sh -host` / manual `hostnamectl` -- see "Fleet setup hygiene"
below -- and happened to reuse the same naming convention as the old fleet). Don't use
hostname to distinguish the fleets; always fall back to check #2 above if the wrapper
script name is ever ambiguous.

If you ever aren't sure which fleet a wrapper script belongs to, check its filename
against the pattern above, or just SSH in and check the remote -- don't assume.

## Retargeting the fleet's SDP source stream

When a new dev-cycle stream becomes the one to test (e.g. after a Merge Down/Copy Up
promotes `dev_rebrand`'s work into `dev`), retarget each fleet machine's `sdp` clone with
`swap_source.sh` (ships in `/opt/perforce/dev/bin`, part of the `test-install_sdp` clone --
see its header comment for full mechanics). It parks the current checkout by suffix and
either restores a previously-parked checkout for the target stream or does a fresh
`p4 clone -r` if none exists yet:

```bash
ssh -o StrictHostKeyChecking=no -l <user> -i <pem> <ip> "sudo bash -c '
source /opt/perforce/dev/bin/dev_env.sh
cd /opt/perforce/dev/bin
export P4_SWAP_USER=ftp
./swap_source.sh p4-sdp/dev
'"
```

Run this once per fleet machine (all 7, in parallel) before the next full-suite run. It
only touches `/opt/perforce/dev/sdp` (the `Target=sdp` case) -- the `bin` clone (the test
suite itself) stays on `test-install_sdp/dev` throughout; retarget it too
(`./swap_source.sh test-install_sdp/dev`) only if the test suite itself has a new stream to
track, which is rare.

**Known gotcha found 2026-09-02**: after retargeting, `test_preflight.sh` can fail with `The
'p4 status' in /opt/perforce/dev/bin was NOT clean; ... .p4ignore` even though nothing about
the retarget touched `bin` at all -- if a fleet machine's `bin` clone predates change 33164
(the `.p4ignore` content fix in `test-install_sdp/dev`), the working file on disk is stale
relative to head and shows up as a bogus reconcile candidate. Fix with a one-time
`p4 sync -f .p4ignore` in `/opt/perforce/dev/bin` on the affected machine(s) -- confirm first
with `p4 diff -f .p4ignore` that the only difference is exactly this, not a real conflict.

## Fleet setup hygiene

`bootstrap_test_machine.sh -host <hostname>` sets both the machine's hostname AND its
timezone to `America/Los_Angeles` (so Public Depot submit timestamps aren't skewed
relative to the target P4 Server's Pacific time -- push/fetch timestamps don't get
translated across time zones, so mismatched zones produce technically-valid but
visually-wrong-looking timestamps). This is optional and easy to forget when bootstrapping
a new machine -- the new fleet's boxes sat with default AWS `ip-...` hostnames and
(most likely) UTC/default timezones until this was caught and fixed on 2026-08-31. If you
bootstrap a new machine, pass `-host p4d-test-<tag>-01` (or run `hostnamectl
set-hostname`/`timedatectl set-timezone America/Los_Angeles` directly) rather than
skipping it.

## Prerequisites

- SSH access to each fleet machine via its PEM + public IP (see "Fleet" below). The PEM
  and per-machine SSH wrapper scripts live at
  `/Users/ttyler/ppn/BattleSchool/aws/pem/us-east-2/ssh-test-install_sdp-*.sh` -- `cat` one
  to get the exact `ssh -l <user> -i <pem> <ip>` invocation for that machine (login user
  varies: `rocky` for Rocky Linux, `ec2-user` for SLES, `ubuntu` for Ubuntu). Do NOT use
  the similarly-named `ssh-install_sdp-test*.sh` scripts -- those are the old/Classic
  fleet; see above.
- Each machine already has `/opt/perforce/dev/bin` (the test suite clone) and
  `/opt/perforce/dev/sdp` (the SDP clone under test) bootstrapped via
  `bootstrap_test_machine.sh` -- see `InstallSDP-TestServerSetup.md` if a machine needs
  (re-)bootstrapping. This skill assumes that's already done.

## Fleet (as of 2026-08-31; re-derive from the wrapper scripts if this looks stale)

| Wrapper script                            | Platform  | Login user |
|--------------------------------------------|-----------|------------|
| `ssh-test-install_sdp-r8x86_64.sh`        | Rocky 8   | `rocky`    |
| `ssh-test-install_sdp-r9x86_64.sh`        | Rocky 9   | `rocky`    |
| `ssh-test-install_sdp-r10x86_64.sh`       | Rocky 10  | `rocky`    |
| `ssh-test-install_sdp-sles15x86_64.sh`    | SLES 15   | `ec2-user` |
| `ssh-test-install_sdp-u22x86_64.sh`       | Ubuntu 22 | `ubuntu`   |
| `ssh-test-install_sdp-u24x86_64.sh`       | Ubuntu 24 | `ubuntu`   |
| `ssh-test-install_sdp-u26aarch64.sh`      | Ubuntu 26 | `ubuntu`   |

No Ubuntu 20 wrapper exists in the new fleet as of this writing (the old fleet had one) --
don't assume it's missing by mistake; just confirm before relying on Ubuntu 20 coverage.

Ubuntu 26 has a **known, pre-existing failure** (POSIX `chown` regression, tracked
upstream) -- see `InstallSDP-TestServerSetup.md`'s Platforms list. A failure there is not
by itself a sign of a new regression; compare against that known issue before treating it
as new. (This was noted against the old fleet; re-confirm it still applies to the new
fleet's Ubuntu 26 box the first time you use it.)

## Running the full suite on one machine

This replicates the interactive `dev` + `uat` aliases (defined in each machine's
`~/.bashrc` and `dev_env.sh`) as a single non-interactive command. **Order matters**:
`dev_env.sh` must be sourced *before* any `p4` command, or `p4` won't be on `PATH` yet and
you'll get `p4: command not found`.

```bash
ssh -o StrictHostKeyChecking=no -l <user> -i <pem> <ip> "sudo bash -c '
set -e
source /opt/perforce/dev/bin/dev_env.sh
export KEEP_GOING=1
cd /opt/perforce/dev/sdp/Server/Unix/setup && p4 fetch
cd /opt/perforce/dev/bin && p4 fetch
./test_preflight.sh && ./r
'" > <scratchpad>/<platform>_run.log 2>&1
```

Notes on this command:
- The two `p4 fetch` calls pull the latest SDP (`//p4-sdp/dev` as of 2026-09-02, see
  "Retargeting" above for how/when this changes) and latest test suite
  (`//test-install_sdp/dev`) respectively -- each of `.../sdp` and `.../bin` is its own
  independent `p4 clone`-managed DVCS repo (see `dev_env.sh`'s comments), so both fetches
  are needed.
- `KEEP_GOING=1` makes the suite run through all test groups even if one fails, instead of
  aborting at the first failure -- needed to get a full pass/fail picture in one run.
- `test_preflight.sh && ./r` mirrors the `uat` alias exactly: don't run the destructive
  suite if the workspace isn't clean.
- Run this via a background Bash task per machine (`run_in_background: true`) -- a full
  regression run takes a while, and you'll want to run the whole fleet in parallel rather
  than one machine at a time.

## Running across the whole fleet

Launch the command above once per machine (substituting that machine's user/pem/ip and a
distinct log file), all as separate background Bash calls in parallel. Wait for each
task-completion notification rather than polling.

## Analyzing results

Each log ends with:

```
Summary:
PASS Test 1 ...
PASS Test 2 ...
...
Scan for unreported errors:
```

```bash
grep -c '^PASS Test' <log>   # pass count
grep -c '^FAIL Test' <log>   # fail count
grep -n '^FAIL Test' <log>   # which ones, to investigate
```

Anything printed under "Scan for unreported errors:" is also worth reviewing -- it's the
`r` script's own heuristic catch-all for error-looking lines that didn't get wrapped in a
`PASS`/`FAIL` marker.

To see the list of individual test groups (e.g. to re-run just one after a fix), run
`./r ls` in place of `./r` in the command above.

## Manual upgrade testing (not yet part of the automated suite)

`./r`/`cli_tests.cfg` exercise `install_sdp.sh` fresh installs across platforms, but do
**not** exercise `sdp_upgrade.sh` -- there is currently no automated upgrade-path coverage
anywhere in this fleet's regression suite. This gap let a real bug ship in SDP 2026.1 GA
(SDP-1394: `install_sdp.sh` and friends hardcoded the planned-for-2026.2
`/opt/perforce/p4-sdp` path instead of 2026.1's `/opt/perforce/helix-sdp`) and a second one
found only by testing the fix itself (SDP-1395: `sdp_upgrade.sh` reported a false "FAILED"
on an otherwise-successful package-structure upgrade). Both were caught the day after GA,
not before, specifically because nothing exercised a real install-then-upgrade cycle.

Until this is automated, do this manually whenever a release touches `install_sdp.sh`,
`sdp_upgrade.sh`, `mkdirs.sh`, `configure_sample_depot_for_sdp.sh`, or anything else in the
package-structure install/upgrade path -- ideally as part of Step 4 (pre-release
verification), not just post-release smoke testing, so a regression like SDP-1394/1395 is
caught before shipping rather than after:

1. **Reset the machine to a clean slate.** From the fleet machine (either fleet -- this
   doesn't depend on the DVCS source-tracking distinction above, since you're testing the
   *shipped tarball*, not the fleet's own dev clone):
   ```bash
   sudo bash /opt/perforce/dev/bin/DANGER_CLEAN.sh -y
   ```
2. **Install a real older release**, matching what an actual customer upgrading today would
   have. Fetch the target release's `install_sdp.sh` from wherever it actually shipped from
   (the frozen Classic depot for anything through 2025.2 Patch 1, e.g.
   `p4 print -q //guest/perforce_software/sdp/main/Server/Unix/setup/install_sdp.sh@<CL>`;
   `//p4-sdp/r<NN.N>` release streams for anything 2026.1+), copy it to the machine, and run
   it in `-demo` mode for speed (storage layout isn't the point of this test):
   ```bash
   ./install_sdp.sh -C > sdp_install.cfg
   ./install_sdp.sh -c sdp_install.cfg -init -y -demo
   ```
   Confirm the resulting structure matches that release's actual convention (e.g.
   `/opt/perforce/helix-sdp` for anything through 2026.1) before proceeding -- don't assume;
   verify with `ls /opt/perforce/`.
3. **Upgrade to the release candidate**, using the same download path a real customer would
   -- the actual published tarball URL for a released version
   (`https://workshop.perforce.com/download/p4-sdp/main/downloads/sdp.Unix.tgz` once
   published), or a freshly-built local tarball copied to the machine directly if testing an
   unpublished release candidate before Step 20:
   ```bash
   cd /opt/perforce/helix-sdp/downloads   # or /opt/perforce/p4-sdp/downloads, per the release
   curl -sL -O <tarball URL>              # or scp a locally-built tarball here instead
   cd /opt/perforce/helix-sdp
   mkdir -p backup && mv sdp backup/sdp.old.$(date +'%Y-%m-%d-%H%M%S')
   tar -xzf downloads/sdp.Unix.tgz && chown -R root:root sdp
   cd sdp/Server/Unix/p4/common/sdp_upgrade
   ./sdp_upgrade.sh -y
   ```
4. **Verify for real**, not just the script's own "SUCCESS" line: check `/p4/sdp/Version`
   matches the target release, confirm the directory structure landed correctly (no stray
   directory named for a not-yet-released naming convention), and if a `p4d` instance is
   actually running, confirm it still answers (`p4 -p ssl:1999 info` or equivalent).

**Old-fleet caveat**: machines on the old (`ssh-install_sdp-test*.sh`) fleet may be in
whatever ad hoc state a prior test left them in -- e.g. one Rocky 8 box was found to be a
broker-only fixture with no real `p4d` instance at all. Still a valid *starting point* for
this procedure (just run `DANGER_CLEAN.sh` first per step 1 above), but don't assume any
given old-fleet machine already has a clean or representative state without checking.
# Change User Description Committed
#3 33648 Claude (AI Agent by Anthropic) install-sdp-test-suite-run skill: document the manual real
install-then-upgrade testing procedure (DANGER_CLEAN.sh -> install
an older real release -> upgrade to the release candidate ->
verify), codifying what was proven out for real today catching
SDP-1394/1395. This fleet's automated suite (cli_tests.cfg/./r)
only exercises install_sdp.sh fresh installs, never
sdp_upgrade.sh -- flagged as a real, currently-unautomated gap
that let both bugs ship in 2026.1 GA. Recommends running this
manually as part of Step 4 (pre-release verification) for any
release touching the package-structure install/upgrade path, not
just post-release smoke testing.

Agent: Claude (Sonnet 5), on behalf of Tom Tyler.
#2 33425 Claude (AI Agent by Anthropic) Update sdp-jenkins-build-check and install-sdp-test-suite-run skills for the dev_rebrand -> dev retarget, plus Robert Cowham's Jenkins container-crash fix procedure.

sdp-jenkins-build-check: retarget to p4-sdp-build_dev as the primary job;
documented the build_<stream> virtual-stream indirection and how to clone
a job for a new stream; RAM headroom note; and the 'Container crashes'
section covering the container state improper / exit 137 crash --
including what did NOT fix it (full podman wipe, host reboot) and what
did, per Robert Cowham 2026-09-03 (remove specific stale image IDs, not
everything, then kill/rm containers and let images rebuild), plus the
known-harmless gzip/sdp.Unix.tgz noise to expect in an otherwise-passing
run.

install-sdp-test-suite-run: documented the swap_source.sh retarget
procedure and the stale-.p4ignore gotcha found while retargeting the AWS
fleet to dev.

Agent: Claude Code, Model: Claude Sonnet 5 (claude-sonnet-5), operating as bot_Claude_Anthropic.
#1 33327 Claude (AI Agent by Anthropic) Add two new AI-dev-support skills for triggering/checking the remaining test suites: install-sdp-test-suite-run (Task 1, the AWS platform fleet regression suite for install_sdp.sh) and sdp-jenkins-build-check (Task 3, the Docker/Podman Jenkins build).
Matches the existing bsw-qa-build-run skill's pattern for Task 2.

Agent: Claude Code, model claude-sonnet-5.