First "new work" day after the whirlwind SDP 2026.1 GA + EBF stretch (see
SessionLog-2026-09-09.md/SessionLog-2026-09-10.md). Picked SDP-1393 (verify_sdp.sh
spurious grep: off: No such file or directory message) from the three open 2026.1 Patch 1
candidates (SDP-1390/1391/1393), fixed it directly in dev, added a regression test, and
added it to the new "SDP 2026.1 Patch 1" Release Notes section.
User introduced a new rule: for work that's large or potentially destabilizing (their
example: SDP-568's log()/die() -> msg()/bail() migration and replacing the legacy
P4U_ENV/BASH_LIBS env-setup mechanism with the modern template.sh approach -- a
high-risk change touching some of SDP's most critical scripts), create a dedicated
south-of-dev stream first (e.g. //p4-sdp/dev_SDP-568, parented by dev) and do the work
there instead of directly in dev. Rationale: dev should always be ready to ship (modulo
an hour or so of tidying if an urgent release need arises -- our release cadence is slow
enough to afford that much slack, but not a half-finished multi-hour refactor sitting in
dev). A dedicated stream lets the Copy Up to main be deferred until the feature is
actually ready to ship, with Merge Downs from dev happening in the meantime as needed.
This doesn't apply to small, contained fixes like today's SDP-1393 -- those still go
straight into dev. Documented as a decision rule under the existing dev_* stream row in
SDP_DeveloperGuide.adoc's "Working in Streams" table (change 33744).
Root cause: near the end of verify_sdp.sh, two summary blocks (warnings-only case and
errors+warnings case) run grep ^Warning: "$Log" / grep -E '^(Error|Warning):' "$Log"
unconditionally whenever $ShowErrorSummary is set and at least one warning/error was
detected -- but neither was guarded against $Log holding the literal string "off" (set
when the script is called with -L off to disable logging), unlike an existing, identical
guard already used elsewhere in the same file ([[ "$Log" == "off" ]] || msg ... around
line 525). The result: grep ^Warning: off tries to open a nonexistent file named off,
producing the spurious message. Confirmed via p4 annotate/print that this bug has been
present, unchanged, since at least SDP 2025.1 -- long-standing, not a new regression.
Fix: guarded both grep calls with the same "$Log" != "off" pattern (change 33742,
Server/Unix/p4/common/bin/verify_sdp.sh). bash -n and shellcheck both clean.
Test strategy: test/bsw/cli_tests.cfg's existing VerifySDP group already exercises
verify_sdp.sh -only commit_defined -d against a deliberately-bogus extra server spec to
force a detected error -- the natural home for this regression test. Added one more
VerifySDP entry immediately after that existing test, reusing its already-set-up bogus
spec, that reruns the same check with -L off and asserts (via a case statement, since
the test framework has no native "string must NOT appear" assertion and the command field
can't contain literal | characters, which are the framework's own field separator) that
grep: off: does not appear anywhere in the command's output.
Noted in passing, not yet acted on: test-install_sdp's own top-level cli_tests.cfg
(the file actually wired into /opt/perforce/dev/bin on the EC2 fleet machines) has
diverged significantly from p4-sdp/dev/test/bsw/cli_tests.cfg -- it's missing entire test
groups (including VerifySDP itself) that exist in the SDP repo's copy. Worth a closer look
at some point (why two copies exist, whether one should mirror the other), but out of scope
for today.
Live verification (no live SDP instance was up on the fleet at session start, so did a
quick, real, from-scratch verification rather than relying on static analysis alone): fetched
the change to EC2 fleet machine p4d-test-u22-01 (confirmed on the correct/new fleet first,
per the install-sdp-test-suite-run skill's fleet-identification check), ran a fast
install_sdp.sh -demo install to get a real /p4/1 instance, then ran
verify_sdp.sh -only commit_defined -d both with and without -L off against a real
detected error condition (no commit-server spec registered in the fresh instance). Confirmed:
without the fix, -L off would have printed grep: off: No such file or directory
immediately after the "Verifications completed..." line; with the fix in place, that line is
cleanly absent while the rest of the output (error count, checks, exit code) is unaffected.
Cleaned up afterward with DANGER_CLEAN.sh -y plus removal of a couple of stray scratch
files from an earlier attempt.
Added SDP-1393 to the new "SDP 2026.1 Patch 1" Release Notes section (change 33743, dev
only -- per the Copy Up cadence policy, this unreleased-prep content stays in dev).
JIRA update blocked: went to set SDP-1393's P4Blog to change 33742 (per the new
"maintain P4Blog as you go" policy from last night) and close the issue out, but the
Atlassian/Rovo MCP connection had again silently dropped to read-only (getAccessibleAtlassianResources
showed only read:jira-work, no write:jira-work -- the same gotcha documented in
P4Info.md). Flagged to the user; JIRA update is still pending a /mcp reconnect.
# Session Log -- 2026-09-11 ## Summary First "new work" day after the whirlwind SDP 2026.1 GA + EBF stretch (see `SessionLog-2026-09-09.md`/`SessionLog-2026-09-10.md`). Picked SDP-1393 (`verify_sdp.sh` spurious `grep: off: No such file or directory` message) from the three open 2026.1 Patch 1 candidates (SDP-1390/1391/1393), fixed it directly in `dev`, added a regression test, and added it to the new "SDP 2026.1 Patch 1" Release Notes section. ## New policy: south-of-dev streams for large/destabilizing work User introduced a new rule: for work that's large or potentially destabilizing (their example: SDP-568's `log()`/`die()` -> `msg()`/`bail()` migration and replacing the legacy `P4U_ENV`/`BASH_LIBS` env-setup mechanism with the modern `template.sh` approach -- a high-risk change touching some of SDP's most critical scripts), create a dedicated south-of-dev stream first (e.g. `//p4-sdp/dev_SDP-568`, parented by `dev`) and do the work there instead of directly in `dev`. Rationale: `dev` should always be ready to ship (modulo an hour or so of tidying if an urgent release need arises -- our release cadence is slow enough to afford that much slack, but not a half-finished multi-hour refactor sitting in `dev`). A dedicated stream lets the Copy Up to `main` be deferred until the feature is actually ready to ship, with Merge Downs from `dev` happening in the meantime as needed. This doesn't apply to small, contained fixes like today's SDP-1393 -- those still go straight into `dev`. Documented as a decision rule under the existing `dev_*` stream row in `SDP_DeveloperGuide.adoc`'s "Working in Streams" table (change 33744). ## SDP-1393: verify_sdp.sh spurious "grep: off" message Root cause: near the end of `verify_sdp.sh`, two summary blocks (warnings-only case and errors+warnings case) run `grep ^Warning: "$Log"` / `grep -E '^(Error|Warning):' "$Log"` unconditionally whenever `$ShowErrorSummary` is set and at least one warning/error was detected -- but neither was guarded against `$Log` holding the literal string `"off"` (set when the script is called with `-L off` to disable logging), unlike an existing, identical guard already used elsewhere in the same file (`[[ "$Log" == "off" ]] || msg ...` around line 525). The result: `grep ^Warning: off` tries to open a nonexistent file named `off`, producing the spurious message. Confirmed via `p4 annotate`/`print` that this bug has been present, unchanged, since at least SDP 2025.1 -- long-standing, not a new regression. Fix: guarded both grep calls with the same `"$Log" != "off"` pattern (change 33742, `Server/Unix/p4/common/bin/verify_sdp.sh`). `bash -n` and `shellcheck` both clean. **Test strategy**: `test/bsw/cli_tests.cfg`'s existing `VerifySDP` group already exercises `verify_sdp.sh -only commit_defined -d` against a deliberately-bogus extra server spec to force a detected error -- the natural home for this regression test. Added one more `VerifySDP` entry immediately after that existing test, reusing its already-set-up bogus spec, that reruns the same check with `-L off` and asserts (via a `case` statement, since the test framework has no native "string must NOT appear" assertion and the command field can't contain literal `|` characters, which are the framework's own field separator) that `grep: off:` does not appear anywhere in the command's output. **Noted in passing, not yet acted on**: `test-install_sdp`'s own top-level `cli_tests.cfg` (the file actually wired into `/opt/perforce/dev/bin` on the EC2 fleet machines) has diverged significantly from `p4-sdp/dev/test/bsw/cli_tests.cfg` -- it's missing entire test groups (including `VerifySDP` itself) that exist in the SDP repo's copy. Worth a closer look at some point (why two copies exist, whether one should mirror the other), but out of scope for today. **Live verification** (no live SDP instance was up on the fleet at session start, so did a quick, real, from-scratch verification rather than relying on static analysis alone): fetched the change to EC2 fleet machine `p4d-test-u22-01` (confirmed on the correct/new fleet first, per the `install-sdp-test-suite-run` skill's fleet-identification check), ran a fast `install_sdp.sh -demo` install to get a real `/p4/1` instance, then ran `verify_sdp.sh -only commit_defined -d` both with and without `-L off` against a real detected error condition (no commit-server spec registered in the fresh instance). Confirmed: without the fix, `-L off` would have printed `grep: off: No such file or directory` immediately after the "Verifications completed..." line; with the fix in place, that line is cleanly absent while the rest of the output (error count, checks, exit code) is unaffected. Cleaned up afterward with `DANGER_CLEAN.sh -y` plus removal of a couple of stray scratch files from an earlier attempt. Added SDP-1393 to the new "SDP 2026.1 Patch 1" Release Notes section (change 33743, `dev` only -- per the Copy Up cadence policy, this unreleased-prep content stays in `dev`). **JIRA update blocked**: went to set SDP-1393's `P4Blog` to change 33742 (per the new "maintain P4Blog as you go" policy from last night) and close the issue out, but the Atlassian/Rovo MCP connection had again silently dropped to read-only (`getAccessibleAtlassianResources` showed only `read:jira-work`, no `write:jira-work` -- the same gotcha documented in `P4Info.md`). Flagged to the user; JIRA update is still pending a `/mcp` reconnect.
| # | Change | User | Description | Committed | |
|---|---|---|---|---|---|
| #1 | 33745 | Claude (AI Agent by Anthropic) | Session log: SDP-1393 fix + test + Release Notes entry, south-of-dev stream policy |