Context
PhotoCleaner and PlexCleaner both ship a github-release job (in build-release-task.yml) that diverges from the canonical catalog/snippets/workflows/build-release-task.yml, and the audit flags that job verbatim. Investigating the divergence, plus the PhotoCleaner agent's live-release feedback (PhotoCleaner#14), surfaced four interacting questions. They should be reconciled together before any repo re-vendors the job - a naive re-vendor of the current canonical would drop the prerelease backstop the repos already carry (Q1), which is a regression.
This blocks the github-release re-vendor in the PlexCleaner cleanup (PlexCleaner#880 item B1) and the equivalent PhotoCleaner drift.
Questions
Q1 - Adopt the prerelease backstop. Both repos carry a main-only step ("Verify public release version") that refuses to publish when SemVer2's core segment carries a - (NBGV prerelease mis-versioning). The canonical lacks it, and it looks like a genuine safety improvement. Proposal: adopt it into the canonical, standardized to set -Eeuo pipefail (PlexCleaner uses -euo, PhotoCleaner -Eeuo), and recast the ::error:: message's clause-splicing semicolon.
Q2 - expect_release_assets direction. The canonical parameterizes the download guard, fail_on_unmatched_files, and the asset-cleanup gate via inputs.expect_release_assets, so a no-file-target repo (Docker-only) can relax the guard. Both repos instead hardcode fail_on_unmatched_files: true, always download, and carry terser comments. The parameterization is the more correct design. Proposal: keep it, and the repos re-vendor to adopt it and restore the verbose comments.
Q3 - The SHA-verbatim tension (the real structural issue). The job is declared fidelity: interface, but the contract pins verbatimJobs: ["github-release"], and normalize() masks no action SHAs. So every release repo's live workflow perpetually "differs from the canonical" after any Dependabot action-SHA bump - the check can never stay green across the fleet. Decide one of: (a) mask uses: ...@<sha> action pins in normalize() for verbatim job regions, so SHA-only drift is tolerated while structure is still enforced, or (b) drop the job from verbatimJobs and rely on the interface contract's token checks (required jobs, pattern: / merge-multiple: present, artifact-ids: forbidden). Option (a) keeps byte-fidelity on the orchestration logic while tolerating the one field Dependabot owns, and is likely the right call.
Q4 - Build-success gating (PhotoCleaner finding 5). The job's if: ${{ inputs.github && !inputs.smoke }} does not depend on the build jobs succeeding. The canonical and both repos agree, so this is a pure design question: intentional (a degraded release is still tagged), or should it gate on needs success? No downstream drift either way - decide and document.
Not a question (resolved)
The PhotoCleaner agent's finding 7 - per-runtime publish-<runtime> intermediates reaped only by retention-days: 1 rather than surgically deleted - is not a gap. WORKFLOW.md D5.1 explicitly permits an in-run intermediate to rely on the retention backstop (lines 98, 174, 230, 273). The surgical delete rule applies to the cross-job release-asset-*, which is deleted. No change.
Outcome
Once Q1-Q3 land in the canonical and Q4 is decided and documented, the two repos re-vendor the github-release job once, clean.
Context
PhotoCleaner and PlexCleaner both ship a
github-releasejob (inbuild-release-task.yml) that diverges from the canonicalcatalog/snippets/workflows/build-release-task.yml, and the audit flags that job verbatim. Investigating the divergence, plus the PhotoCleaner agent's live-release feedback (PhotoCleaner#14), surfaced four interacting questions. They should be reconciled together before any repo re-vendors the job - a naive re-vendor of the current canonical would drop the prerelease backstop the repos already carry (Q1), which is a regression.This blocks the
github-releasere-vendor in the PlexCleaner cleanup (PlexCleaner#880 item B1) and the equivalent PhotoCleaner drift.Questions
Q1 - Adopt the prerelease backstop. Both repos carry a main-only step ("Verify public release version") that refuses to publish when
SemVer2's core segment carries a-(NBGV prerelease mis-versioning). The canonical lacks it, and it looks like a genuine safety improvement. Proposal: adopt it into the canonical, standardized toset -Eeuo pipefail(PlexCleaner uses-euo, PhotoCleaner-Eeuo), and recast the::error::message's clause-splicing semicolon.Q2 -
expect_release_assetsdirection. The canonical parameterizes the download guard,fail_on_unmatched_files, and the asset-cleanup gate viainputs.expect_release_assets, so a no-file-target repo (Docker-only) can relax the guard. Both repos instead hardcodefail_on_unmatched_files: true, always download, and carry terser comments. The parameterization is the more correct design. Proposal: keep it, and the repos re-vendor to adopt it and restore the verbose comments.Q3 - The SHA-verbatim tension (the real structural issue). The job is declared
fidelity: interface, but the contract pinsverbatimJobs: ["github-release"], andnormalize()masks no action SHAs. So every release repo's live workflow perpetually "differs from the canonical" after any Dependabot action-SHA bump - the check can never stay green across the fleet. Decide one of: (a) maskuses: ...@<sha>action pins innormalize()for verbatim job regions, so SHA-only drift is tolerated while structure is still enforced, or (b) drop the job fromverbatimJobsand rely on the interface contract's token checks (required jobs,pattern:/merge-multiple:present,artifact-ids:forbidden). Option (a) keeps byte-fidelity on the orchestration logic while tolerating the one field Dependabot owns, and is likely the right call.Q4 - Build-success gating (PhotoCleaner finding 5). The job's
if: ${{ inputs.github && !inputs.smoke }}does not depend on the build jobs succeeding. The canonical and both repos agree, so this is a pure design question: intentional (a degraded release is still tagged), or should it gate onneedssuccess? No downstream drift either way - decide and document.Not a question (resolved)
The PhotoCleaner agent's finding 7 - per-runtime
publish-<runtime>intermediates reaped only byretention-days: 1rather than surgically deleted - is not a gap. WORKFLOW.md D5.1 explicitly permits an in-run intermediate to rely on the retention backstop (lines 98, 174, 230, 273). The surgical delete rule applies to the cross-jobrelease-asset-*, which is deleted. No change.Outcome
Once Q1-Q3 land in the canonical and Q4 is decided and documented, the two repos re-vendor the
github-releasejob once, clean.