MarketingClaw Release CI
Use this with $release-marketingclaw-maintainer and $marketingclaw-testing when a release candidate needs full validation, install/update proof, live provider checks, or CI recovery.
Guardrails
- No version bump, tag, npm publish, GitHub release, or release promotion without explicit operator approval.
- Validate provider secrets before dispatching expensive full release matrices.
- Do not set GitHub secrets from unvalidated 1Password candidates. If a candidate returns 401/403, leave the existing secret alone and report the exact missing provider.
- Use
$one-password for secret reads/writes: one persistent tmux session, targeted items only, no secret output.
- Watch one parent run plus compact child summaries. Avoid broad
gh run view polling loops; REST quota is easy to burn.
- Fetch logs only for failed or currently-blocking jobs. If quota is low, stop polling and wait for reset.
- Treat live-provider flakes separately from code failures: prove key validity, provider HTTP status, retry evidence, and exact failing lane before editing code.
- A model-list response proves authentication, not billing or inference
entitlement. Mandatory live providers must pass a real completion probe
before release dispatch. Fix the credential first; do not add an alternate
auth path merely to bypass a failed release credential.
- Full Release Validation parent monitors fail fast: once a required child job
fails, the parent cancels the remaining child matrix and prints the failed
job summary. Inspect that first red job instead of waiting for unrelated
matrix tails.
- In a sparse worktree or Testbox source sync, first confirm
package.json,
pnpm-lock.yaml, and every source path the selected check reads. If any are
absent, that checkout cannot validate a release dependency or Docker lane:
stop and use the repo remote changed gate or a full task worktree. When the
inputs are present and a release fix changes package.json or
pnpm-lock.yaml, rebuild only the task-owned disposable box with
CI=true pnpm install --frozen-lockfile, then run an explicit
require.resolve() probe before Docker or focused tests. The CI flag permits
pnpm to recreate a prewarmed modules directory without an interactive
confirmation. Do not weaken the lockfile or label sparse-checkout failures
as product/Docker failures.
- If the candidate is rebased or its base SHA changes after warmup, stop the
task-owned box and warm a fresh one before testing. Testbox source sync is
relative to the warmed source tree; continuing can mix an old base file with
a new candidate diff and produce false lockfile or Docker failures.
- For a committed release candidate, warm the box with
blacksmith testbox warmup ... --ref <candidate-branch-or-sha>. Do not rely
on source sync to overlay committed branch changes onto the workflow's
default ref.
Preflight
Before full release validation:
node .agents/skills/release-marketingclaw-ci/scripts/verify-provider-secrets.mjs --required openai,anthropic,fireworks
gh api rate_limit --jq '.resources.core'
git status --short --branch
git rev-parse HEAD
1Password service-account values are the first source for release provider
preflight. Inject those exact targeted keys first, then run the verifier; use
ambient env only when it was already intentionally injected for this release.
The script prints only provider status and HTTP class, never tokens.
The Anthropic check performs a tiny message completion so exhausted or
non-billable credentials fail before the expensive release matrix.
Dispatch
Start product performance evidence as early as the release SHA exists, in
parallel with other release work:
gh workflow run marketingclaw-performance.yml \
--repo promisingcoder/marketingclaw \
--ref main \
-f target_ref=<release-sha> \
-f profile=release \
-f repeat=3 \
-f deep_profile=false \
-f live_openai_candidate=false \
-f fail_on_regression=true
- Do not wait for full release validation to start this early perf signal.
- Compare available Kova, gateway startup, and CLI startup metrics with earlier
release evidence or clawgrit reports before publish/closeout.
- Call out any regression in the release proof. Treat a major regression as a
release blocker until it is fixed, waived by the operator, or proven to be
infrastructure noise.
- Full Release Validation records blocking product-performance evidence. The
early standalone run is for overlap and faster regression discovery, but a
regression or missing child run blocks the parent validation.
Prefer the trusted workflow on main, target the exact release SHA:
- Keep trusted-workflow checks compatible with frozen release targets. If
main adds a target-owned guard script or package command after the release
branch cut, make the trusted workflow skip only when that target surface is
absent. Heal the trusted workflow before rerunning validation; do not port an
unrelated runtime refactor or mutate the release candidate just to satisfy a
newer main-only check.
gh workflow run full-release-validation.yml \
--repo promisingcoder/marketingclaw \
--ref main \
-f ref=<release-sha> \
-f provider=openai \
-f mode=both \
-f release_profile=full \
-f rerun_group=all
Use release_profile=stable unless the operator explicitly asks for the broad advisory provider/media matrix. Stable and full profiles force the release soak; the beta profile may opt in with run_release_soak=true. Use narrow rerun_group after focused fixes.
Publish with marketingclaw-release-publish.yml using release_profile=from-validation
unless a maintainer intentionally wants to cross-check a specific profile; the
publish workflow reads the effective profile from the full-validation manifest.
Watch
Use the summary helper instead of repeated raw polling:
node .agents/skills/release-marketingclaw-ci/scripts/release-ci-summary.mjs <full-release-run-id>
Then watch only when useful:
gh run watch <full-release-run-id> --repo promisingcoder/marketingclaw --exit-status
Stop watchers before ending the turn or switching strategy.
Failure Triage
- Confirm parent SHA and child run IDs.
- List failed jobs only:
gh run view <child-run-id> --repo promisingcoder/marketingclaw --json jobs \
--jq '.jobs[] | select(.conclusion=="failure" or .conclusion=="timed_out" or .conclusion=="cancelled") | [.databaseId,.name,.conclusion,.url] | @tsv'
- Fetch one failed job log. If rate-limited, note reset time and avoid more REST calls.
- For secret-looking failures, validate a real completion from the same secret source before editing code. A successful model-list request is insufficient.
Claude CLI subscription credentials are a separate native auth path; prove
them in a clean-home CLI probe, never as a substitute for a required
Anthropic API-key lane.
- For live-cache failures, inspect whether it is missing/invalid key, empty text, provider refusal, timeout, or baseline miss. Do not weaken release gates without clear provider evidence.
- Fix narrowly, run local/changed proof, commit, push, rerun the smallest matching group.
- If a required PR CI run is capacity-stalled with queued jobs and no active
jobs, do not cancel unrelated work or accept a generic manual dispatch.
From the PR head branch, dispatch the explicit exact-SHA fallback:
gh workflow run ci.yml --repo promisingcoder/marketingclaw --ref <pr-head-branch> -f target_ref=<full-pr-sha> -f include_android=true -f release_gate=true.
It runs on GitHub-hosted runners and is accepted only when its run title is
CI release gate <full-pr-sha>. Record the stalled Blacksmith run and the
fallback run in release evidence.
If Blacksmith Build Artifacts Testbox is the only remaining required gate
and remains queued without a runner, that completed exact fallback may cover
it because CI's build-artifacts job already builds, packages, and smoke
tests the artifacts. Do not use this coverage after the artifact workflow
starts or completes non-successfully.
Evidence
Record:
- release SHA
- full parent run URL
- child run IDs and conclusions: CI, Release Checks, Plugin Prerelease, NPM Telegram, Product Performance
- performance comparison result versus earlier releases when available
- targeted local proof commands
- provider-secret preflight result
- known gaps or unrelated failures
For lessons and recovery patterns, read references/release-ci-notes.md.
1---2name: release-marketingclaw-ci3description: Run, watch, debug, and summarize MarketingClaw full release CI, release checks, live provider gates, install/update proofs, and release-secret preflights.4---56# MarketingClaw Release CI78Use this with `$release-marketingclaw-maintainer` and `$marketingclaw-testing` when a release candidate needs full validation, install/update proof, live provider checks, or CI recovery.910## Guardrails1112- No version bump, tag, npm publish, GitHub release, or release promotion without explicit operator approval.13- Validate provider secrets before dispatching expensive full release matrices.14- Do not set GitHub secrets from unvalidated 1Password candidates. If a candidate returns 401/403, leave the existing secret alone and report the exact missing provider.15- Use `$one-password` for secret reads/writes: one persistent tmux session, targeted items only, no secret output.16- Watch one parent run plus compact child summaries. Avoid broad `gh run view` polling loops; REST quota is easy to burn.17- Fetch logs only for failed or currently-blocking jobs. If quota is low, stop polling and wait for reset.18- Treat live-provider flakes separately from code failures: prove key validity, provider HTTP status, retry evidence, and exact failing lane before editing code.19- A model-list response proves authentication, not billing or inference20 entitlement. Mandatory live providers must pass a real completion probe21 before release dispatch. Fix the credential first; do not add an alternate22 auth path merely to bypass a failed release credential.23- Full Release Validation parent monitors fail fast: once a required child job24 fails, the parent cancels the remaining child matrix and prints the failed25 job summary. Inspect that first red job instead of waiting for unrelated26 matrix tails.27- In a sparse worktree or Testbox source sync, first confirm `package.json`,28 `pnpm-lock.yaml`, and every source path the selected check reads. If any are29 absent, that checkout cannot validate a release dependency or Docker lane:30 stop and use the repo remote changed gate or a full task worktree. When the31 inputs are present and a release fix changes `package.json` or32 `pnpm-lock.yaml`, rebuild only the task-owned disposable box with33 `CI=true pnpm install --frozen-lockfile`, then run an explicit34 `require.resolve()` probe before Docker or focused tests. The CI flag permits35 pnpm to recreate a prewarmed modules directory without an interactive36 confirmation. Do not weaken the lockfile or label sparse-checkout failures37 as product/Docker failures.38- If the candidate is rebased or its base SHA changes after warmup, stop the39 task-owned box and warm a fresh one before testing. Testbox source sync is40 relative to the warmed source tree; continuing can mix an old base file with41 a new candidate diff and produce false lockfile or Docker failures.42- For a committed release candidate, warm the box with43 `blacksmith testbox warmup ... --ref <candidate-branch-or-sha>`. Do not rely44 on source sync to overlay committed branch changes onto the workflow's45 default ref.4647## Preflight4849Before full release validation:5051```bash52node .agents/skills/release-marketingclaw-ci/scripts/verify-provider-secrets.mjs --required openai,anthropic,fireworks53gh api rate_limit --jq '.resources.core'54git status --short --branch55git rev-parse HEAD56```57581Password service-account values are the first source for release provider59preflight. Inject those exact targeted keys first, then run the verifier; use60ambient env only when it was already intentionally injected for this release.61The script prints only provider status and HTTP class, never tokens.62The Anthropic check performs a tiny message completion so exhausted or63non-billable credentials fail before the expensive release matrix.6465## Dispatch6667Start product performance evidence as early as the release SHA exists, in68parallel with other release work:6970```bash71gh workflow run marketingclaw-performance.yml \72 --repo promisingcoder/marketingclaw \73 --ref main \74 -f target_ref=<release-sha> \75 -f profile=release \76 -f repeat=3 \77 -f deep_profile=false \78 -f live_openai_candidate=false \79 -f fail_on_regression=true80```8182- Do not wait for full release validation to start this early perf signal.83- Compare available Kova, gateway startup, and CLI startup metrics with earlier84 release evidence or clawgrit reports before publish/closeout.85- Call out any regression in the release proof. Treat a major regression as a86 release blocker until it is fixed, waived by the operator, or proven to be87 infrastructure noise.88- Full Release Validation records blocking product-performance evidence. The89 early standalone run is for overlap and faster regression discovery, but a90 regression or missing child run blocks the parent validation.9192Prefer the trusted workflow on `main`, target the exact release SHA:9394- Keep trusted-workflow checks compatible with frozen release targets. If95 `main` adds a target-owned guard script or package command after the release96 branch cut, make the trusted workflow skip only when that target surface is97 absent. Heal the trusted workflow before rerunning validation; do not port an98 unrelated runtime refactor or mutate the release candidate just to satisfy a99 newer `main`-only check.100101```bash102gh workflow run full-release-validation.yml \103 --repo promisingcoder/marketingclaw \104 --ref main \105 -f ref=<release-sha> \106 -f provider=openai \107 -f mode=both \108 -f release_profile=full \109 -f rerun_group=all110```111112Use `release_profile=stable` unless the operator explicitly asks for the broad advisory provider/media matrix. Stable and full profiles force the release soak; the beta profile may opt in with `run_release_soak=true`. Use narrow `rerun_group` after focused fixes.113Publish with `marketingclaw-release-publish.yml` using `release_profile=from-validation`114unless a maintainer intentionally wants to cross-check a specific profile; the115publish workflow reads the effective profile from the full-validation manifest.116117## Watch118119Use the summary helper instead of repeated raw polling:120121```bash122node .agents/skills/release-marketingclaw-ci/scripts/release-ci-summary.mjs <full-release-run-id>123```124125Then watch only when useful:126127```bash128gh run watch <full-release-run-id> --repo promisingcoder/marketingclaw --exit-status129```130131Stop watchers before ending the turn or switching strategy.132133## Failure Triage1341351. Confirm parent SHA and child run IDs.1362. List failed jobs only:137 ```bash138 gh run view <child-run-id> --repo promisingcoder/marketingclaw --json jobs \139 --jq '.jobs[] | select(.conclusion=="failure" or .conclusion=="timed_out" or .conclusion=="cancelled") | [.databaseId,.name,.conclusion,.url] | @tsv'140 ```1413. Fetch one failed job log. If rate-limited, note reset time and avoid more REST calls.1424. For secret-looking failures, validate a real completion from the same secret source before editing code. A successful model-list request is insufficient.143 Claude CLI subscription credentials are a separate native auth path; prove144 them in a clean-home CLI probe, never as a substitute for a required145 Anthropic API-key lane.1465. For live-cache failures, inspect whether it is missing/invalid key, empty text, provider refusal, timeout, or baseline miss. Do not weaken release gates without clear provider evidence.1476. Fix narrowly, run local/changed proof, commit, push, rerun the smallest matching group.1487. If a required PR CI run is capacity-stalled with queued jobs and no active149 jobs, do not cancel unrelated work or accept a generic manual dispatch.150 From the PR head branch, dispatch the explicit exact-SHA fallback:151 `gh workflow run ci.yml --repo promisingcoder/marketingclaw --ref <pr-head-branch> -f152target_ref=<full-pr-sha> -f include_android=true -f release_gate=true`.153 It runs on GitHub-hosted runners and is accepted only when its run title is154 `CI release gate <full-pr-sha>`. Record the stalled Blacksmith run and the155 fallback run in release evidence.156 If `Blacksmith Build Artifacts Testbox` is the only remaining required gate157 and remains queued without a runner, that completed exact fallback may cover158 it because CI's `build-artifacts` job already builds, packages, and smoke159 tests the artifacts. Do not use this coverage after the artifact workflow160 starts or completes non-successfully.161162## Evidence163164Record:165166- release SHA167- full parent run URL168- child run IDs and conclusions: CI, Release Checks, Plugin Prerelease, NPM Telegram, Product Performance169- performance comparison result versus earlier releases when available170- targeted local proof commands171- provider-secret preflight result172- known gaps or unrelated failures173174For lessons and recovery patterns, read `references/release-ci-notes.md`.