| id | Q.3 |
|---|---|
| title | consume sc-publish develop update |
| status | complete |
| branch | sprint/q-3-sc-publish-consume-update |
| worktree | ../sc-compose-worktrees/sprint/q-3-sc-publish-consume-update |
| target | sc-compose develop |
| depends_on | Q.2 merged (sc-compose develop 5ab6da0); sc-publish PR |
| parallel_with | unrelated work outside release assets and publishing workflows |
sc-compose is a consumer of the sc-publish package, not its owner. This
sprint re-installs the current sc-publish develop commit (0fa5b05) into
sc-compose, replacing the Q.2-era vendored copy, and verifies sc-compose's own
install/test/CI surface still passes against the update.
This sprint does not modify sc-publish's internal workflow, probe, or
install logic. sc-publish PR #45 resolves the prior pypi build_system, GitHub
Release transient-probe, and winget transient-probe defects (sc-publish#39,
#40, and #41); this consumer sprint only re-vendors that upstream result.
The empty optional channel-output handling defect is likewise tracked upstream
as sc-publish#43.
plugins/sc-publish/(full re-vendor from sc-publish develop0fa5b05)release/sc-publish-install.json(update only if the new package version requires new/changed manifest fields; do not otherwise touch)- generated
release/publish-artifacts.toml - generated
release/publish-channel-contracts.toml - installed
.claude/,.cursor/,.github/actions/,.github/scripts/,.github/workflows/, and package-ownedrelease/assets
- Re-run the installer against the current
sc-publishdevelop commit (0fa5b05) using the existingrelease/sc-publish-install.json, updating only what the new package version requires. - Confirm the resulting
plugins/sc-publish/tree matches upstreamsc-publishdevelop byte-for-byte (diff against the sc-publish repo checkout, not just "installer exited zero"). - Prove generated manifests still validate against Cargo/package metadata and that installed workflows reference existing local assets.
- Run sc-compose's full test suite and Release Preflight rehearsal against the updated install; confirm no regression from the Q.2 baseline.
- Confirm sc-compose's own test run uses the pinned bootstrap venv
(
sc_composebootstrap script), not a stale ambientsc-composeinstall — this was flagged as a reproducibility risk in the PR #38 independent review.
-
plugins/sc-publish/matches sc-publish develop0fa5b05exactly (no drift, no local patches). - A second installer dry run is clean with exit code zero.
-
validate-manifest, publish-order, version-lockstep, package checks, and workflow-local-file checks pass. - Release Preflight rehearsal run records either a clean result or an explicit, expected fail-closed external-service stop on the updated install. A rejected liveness probe is expected external-service evidence, not a consumer defect or a reason to investigate, rotate, request, or inspect a credential.
- sc-compose's own test run is confirmed to use the pinned bootstrap venv.
- No sc-publish internal logic (probes, workflows, install.py) is modified by this sprint's diff.
python3 plugins/sc-publish/install.py --input release/sc-publish-install.json --dry-run .
python3 plugins/sc-publish/install.py --input release/sc-publish-install.json .
python3 plugins/sc-publish/install.py --input release/sc-publish-install.json --dry-run .
python3 .github/scripts/release_artifacts.py validate-manifest \
--manifest release/publish-artifacts.toml --workspace-toml Cargo.toml
diff -rq plugins/sc-publish/ <sc-publish-repo-checkout>/plugins/sc-publish/
git diff --check
python3 -m pytest -q
python3 -m pytest -q must be run through the pinned bootstrap venv used by
Sprint Q.2 (sc-compose==1.4.1), not a stale ambient sc-compose install —
record which venv path was used in the sprint handoff.
Then run the installed GitHub Actions Release Preflight, recording the workflow run URL in the sprint handoff. Local success is not sufficient to close the sprint.
- The package was re-vendored from
sc-publishdevelop0fa5b05; every upstream tracked package file has the same Git blob inplugins/sc-publish/, with no consumer-only non-cache package files. - Installer dry-run, install, and second dry-run all completed cleanly; the second dry-run returned zero.
- Manifest, publish-order, and version-lockstep validation passed. Package
script tests passed (
63 passed, 7 skipped, 3 subtests). - The pinned bootstrap environment is
/private/tmp/sc-compose-q3-venv-1.4.1/bin/pythonwithsc-compose==1.4.1. Itssc-shanative extension was rebuilt withmaturin developbefore test collection. The full suite recorded125 passed, 4 failed; each remaining failure is the existinggo_nativemanifest omission tracked by sc-publish#42, which PR #45 does not claim to address. - On the
0fa5b05snapshot,validate-manifest,validate-publish-order, andverify-version-locksteppassed. The manifest-derivedcargo packagechecks passed forsc-sha,sc-composer, andsc-compose; withSC_LINT_SOURCE_ROOT=/Users/randlee/Documents/github/sc-lint,cargo test --workspacepassed. - Release Preflight run
32340747396(workflow run) completed with the expected external credential failures plus thechannel-resultsdefect: it fails closed on invalid emptyjq --argjsoninput. The earlier Homebrewbinary_paths/binariestest-fixture mismatch has been fixed in this consumer repository. No production publication occurred. - Post-fix
SC_LINT_SOURCE_ROOT=/Users/randlee/Documents/github/sc-lint cargo test --workspacepassed. Without that explicit local source root, the twosc_lint_identity_literalstests reproduce the known bootstrap/environment failure ondevelop; this is pre-existing and not a Q3 regression. - The post-fix pinned-venv command was
/private/tmp/sc-compose-q3-venv-1.4.1/bin/python -m pytest -q. It recorded125 passed, 4 failed; the four failures are only thego_nativemanifest omission tracked by sc-publish#42. - After reverting the local consumer workflow patch, the installer dry run is
clean and
.github/workflows/release-preflight.ymlagain exactly matches the vendored workflow. The underlying empty-channel JSON defect is now tracked by sc-publish#43 and must be fixed and re-vendored upstream before this sprint can satisfy the fresh-clean-preflight criterion. - The renewed Release Preflight rehearsal result is recorded below after the
0fa5b05re-vendor. A rejectedCARGO_REGISTRY_TOKEN, Homebrew, Winget, or Scoop liveness probe is the explicit, expected external-service stop for AC4: it proves the non-disclosing, fail-closed guard operated. The consumer must report the sanitized result only; it must not investigate the token, request a token, or request rotation. - Release Preflight run
32388936922(workflow run) ran from76b521bon this sprint branch. It completed every local readiness check (formatting, clippy, workspace tests, manifest/order, version, package, and GitHub Release permissions) and stopped only at the final fail-closed denial. Its sanitized summary wasfailed=[environment-secrets,credential-liveness,registry-state,channel-results]andblocked=[]; no publication was dispatched. This is the explicit external-service stop accepted by AC4, recorded without credential investigation or remediation.
- Q3-BLOCK-01 (
go_native) — confirmed as an upstreamsc-publishrendering defect: the install manifest declaresgo_native, but the upstreampublish-artifacts.toml.j2does not render that table. This is tracked by sc-publish#42; no consumer workaround was added, and the vendored package remains exact. - Q3-BLOCK-02 (Homebrew fixture) — fixed the sc-compose test fixture to
use the current upstream
binary_pathscontract rather than the obsoletebinarieskey. The upstream template was not modified. - Q3-BLOCK-03 (empty channel JSON) — confirmed as an upstream package workflow defect and filed as sc-publish#43. The local consumer patch was reverted so installer dry-run remains clean.
The Release Preflight acceptance criterion's "explicit, expected external-service stop" means: the workflow records a specific, independently verifiable non-disclosing result — including a rejected CARGO_REGISTRY_TOKEN, Homebrew, Winget, or Scoop liveness probe — rather than silently continuing. This is a valid AC4 stop when the workflow reports the sanitized failure and does not publish. No consumer investigation or credential remediation follows from that result.
Send team-lead the sc-publish source commit, dry-run proof, upstream-diff proof, manifest validation output, and Release Preflight run URL. Team-lead opens the PR to develop and routes it to quality-mgr. Any finding that is actually an sc-publish defect (not an install/consumption problem) gets filed as an sc-publish issue, not fixed in this sprint's worktree.