canary
Skill173 starsChanged 14 days agoMITView on GitHub
Canary deployment with smoke tests — deploy to a zero-traffic revision, run health checks, and promote on success. Use when the user says "canary deploy", "deploy with canary", "smoke test the deploy", or wants deployment confidence before going live.
42 other projects use a version of this.
Adopted by
Most recently taken up by
- timurgaleev/vibestacktheir own version, first seen Nov 8, 2026
- joi-fairshare/agentic-workflowtheir own version, first seen Nov 8, 2026
- trungtm78/ClaudeSkillstheir own version, first seen Oct 25, 2026
- jthorare/agentic-workflowtheir own version, first seen Oct 25, 2026
- greglas75/zuvotheir own version, first seen Oct 16, 2026
- ignavm1/claude-skillstheir own version, first seen Oct 13, 2026
Used with
Projects with it also use landing-report, pair-agent and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
ShreyRaviSkilllanding-report
Read-only queue dashboard for workspace-aware ship. Shows which VERSION slots are currently claimed by open PRs, which sibling Conductor workspaces have WIP work likely to ship soon, and what slot /ship would pick next. No mutations — just a snapshot. Use when asked to "landing report", "what's in the queue", "show me open PRs", or "which version do I claim next". (gstack)
Also in 6 projects that use this
seek888Skillpair-agent
Pair a remote AI agent with your browser. One command generates a setup key and prints instructions the other agent can follow to connect. Works with OpenClaw, Hermes, Codex, Cursor, or any agent that can make HTTP requests. The remote agent gets its own tab with scoped access (read+write by default, admin on request). Use when asked to "pair agent", "connect agent", "share browser", "remote browser", "let another agent use my browser", or "give browser access". (gstack) Voice triggers (speech-to-text aliases): "pair agent", "connect agent", "share my browser", "remote browser access".
Also in 8 projects that use this
ayudaySkillland-and-deploy
Land and deploy workflow. Merges the PR, waits for CI and deploy, verifies production health via canary checks. Takes over after /ship creates the PR. Use when: "merge", "land", "deploy", "merge and verify", "land it", "ship it to production".
Also in 13 projects that use this
ayudaySkillautoplan
Auto-review pipeline — reads the full CEO, design, and eng review skills from disk and runs them sequentially with auto-decisions using 6 decision principles. Surfaces taste decisions (close approaches, borderline scope, codex disagreements) at a final approval gate. One command, fully reviewed plan out. Use when asked to "auto review", "autoplan", "run all reviews", "review this plan automatically", or "make the decisions for me". Proactively suggest when the user has a plan file and wants to run the full review gauntlet without answering 15-30 intermediate questions.
Also in 14 projects that use this
ShreyRaviSkillplan-tune
Self-tuning question sensitivity + developer psychographic for gstack (v1: observational). Review which AskUserQuestion prompts fire across gstack skills, set per-question preferences (never-ask / always-ask / ask-only-for-one-way), inspect the dual-track profile (what you declared vs what your behavior suggests), and enable/disable question tuning. Conversational interface — no CLI syntax required.
Also in 6 projects that use this
no-sessionSkilldesign-shotgun
Design shotgun: generate multiple AI design variants, open a comparison board, collect structured feedback, and iterate. Standalone design exploration you can run anytime. Use when: "explore designs", "show me options", "design variants", "visual brainstorm", or "I don't like how this looks". Proactively suggest when the user describes a UI feature but hasn't seen what it could look like.
Also in 11 projects that use this
- +2 more from ayuday
Other versions42 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 42
- garrytan/gstack★ 141ksame name
- storybookjs/storybook★ 91ksame name
- DenchHQ/DenchClaw★ 1.7ksame name
- DenchHQ/ironclaw★ 1.7ksame name
- InternLM/WildClawBench★ 534same name
- mr-daedalium/ostack-saas★ 108same name
- lucas-flatwhite/gstack-ko★ 45same name
- osauer/canary★ 11same name
- CarbeneAI/Forge★ 9same name
- Samin12/skills★ 8same name
32 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
The file
Show its rules and text
We split this skill into the rules it gives an agent
18 rules. 0 are common, 8 are distinctive, and 10 are very specific to this project.
0
Common
Most of the 35 edited versions we read keep these.
8
Distinctive
This author's own choices. Worth a look.
10
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 17
Run this block first, with your shell tool, and read its output before you continue.
- Very specific: line 66
If the argument is a repo id defined under repos: in the primary's config, look up services[<repo-id>] and use that.
- Very specific: line 67
If the argument is a Cloud Run service name already (e.g., the user passed api and it matches services.*.cloud_run_service), use that entry.
- Very specific: line 68
If no argument: detect which repo the current cwd is inside by walking up to find a git root and matching it against repos[*].path (resolve …
- Very specific: line 70
If none of the above resolves, stop with a clear error: "Could not determine Cloud Run service.
- Very specific: line 72
Operating worktree: if the resolved repo has a feature-branch worktree (e.g., .worktrees/REQ-xxx) that matches the current /proceed …
- Very specific: line 90
If the user says "use latest" or the image was already built by CI, skip the build and use the :latest tag from Artifact Registry.
- Distinctive: line 111
Run basic health checks against the canary URL:
- Distinctive: line 120
If health checks fail after 3 retries, go to Step 6 (Rollback).
- Very specific: line 124
Run smoke tests against the canary URL.
- Distinctive: line 154
If any test fails, go to Step 6 (Rollback).
- Distinctive: line 158
All checks passed — promote the canary revision to 100% traffic:
- Distinctive: line 175
Remove the canary tag (clean up):
- Distinctive: line 193
If health checks or smoke tests fail:
- Distinctive: line 195
Delete the canary revision tag (so it's not addressable):
- Very specific: line 215
Check Cloud Run logs: gcloud run services logs read <SERVICE_NAME> --region=us-central1 --limit=50
- Very specific: line 221
If pipeline-state.json exists for the current REQ:
- Very specific: line 222
Add a canary entry to phaseHistory with the result (passed/failed)
“Common” is measured: kept by at least 6 in 10 of the 35 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
/canary — Canary Deployment with Smoke Tests
You are deploying code through a canary process: deploy a zero-traffic revision, verify it works, then promote to live traffic. This prevents broken deploys from reaching users.
Ethos
!test -s .adlc/ETHOS.md && cat .adlc/ETHOS.md || echo No ethos found — run /init, or /adlc:init on the plugin install, to vendor .adlc/ETHOS.md
Context
Run this block first, with your shell tool, and read its output before you continue. Each read prints a notice instead of failing when its file is absent.
# adlc-context
echo '--- Current directory'
pwd
echo '--- Current branch'
git branch --show-current 2>/dev/null || echo 'Not a git repo'
echo '--- GCP project'
gcloud config get-value project 2>/dev/null || echo 'No GCP project configured'
echo '--- Active Cloud Run services'
gcloud run services list --format="table(SERVICE,REGION,URL)" 2>/dev/null || echo 'gcloud not configured'Input
The target is the argument: whatever follows /canary in the invocation (on Claude Code it can also arrive as an ARGUMENTS: line appended to this text), a repo id or a Cloud Run service name. With none, Service Resolution below detects it from the current directory.
Prerequisites
gcloudCLI must be authenticated and configured with the correct project- The service must already exist on Cloud Run (this skill deploys revisions, not new services)
- A Docker image must be available (either build locally or use the latest from Artifact Registry)
Service Resolution
Service configuration lives in .adlc/config.yml in the primary repo under a services: block, keyed by repo id. This is the single source of truth — no service names, regions, or image paths should be hardcoded in this skill.
Expected config shape (primary repo .adlc/config.yml):
repos:
api:
path: ../api
web:
path: ../web
services:
api:
cloud_run_service: api
region: us-central1
image_path: us-central1-docker.pkg.dev/<gcp-project>/api/api
web:
cloud_run_service: web
region: us-central1
image_path: us-central1-docker.pkg.dev/<gcp-project>/web/webResolution order:
- If the argument is a repo id defined under
repos:in the primary's config, look upservices[<repo-id>]and use that. If the repo id has noservices:entry, stop and ask the user to add one. - If the argument is a Cloud Run service name already (e.g., the user passed
apiand it matchesservices.*.cloud_run_service), use that entry. - If no argument: detect which repo the current cwd is inside by walking up to find a git root and matching it against
repos[*].path(resolve each to an absolute path first). Then look up its service. - If the project has no
.adlc/config.yml(single-repo legacy setup) AND the current repo has a top-levelDockerfileand a single Cloud Run service name that matches the repo basename, fall back to auto-detection: service name = repo basename, region =us-central1, image path =$(gcloud config get-value project)/<service>. Surface this fallback in the logs so the user knows it's being inferred. - If none of the above resolves, stop with a clear error: "Could not determine Cloud Run service. Add a
services:block to.adlc/config.ymlor pass the service name as an argument."
Operating worktree: if the resolved repo has a feature-branch worktree (e.g., .worktrees/REQ-xxx) that matches the current /proceed pipeline, build from inside that worktree. Otherwise build from the repo's main checkout. The caller can also pass the worktree path explicitly.
Note (post-REQ-380, REQ-381): /canary is no longer auto-invoked from /proceed (REQ-380) or /bugfix (REQ-381). Operators run it manually when a production canary is needed.
Instructions
Step 1: Build and Push Image
- Determine the image tag: use the current git SHA (
git rev-parse --short HEAD) - Build the Docker image:
docker build -t <IMAGE_PATH>:canary-<SHA> ./<subdir if needed> - Push to Artifact Registry:
docker push <IMAGE_PATH>:canary-<SHA>
If the user says "use latest" or the image was already built by CI, skip the build and use the :latest tag from Artifact Registry.
Step 2: Deploy Canary Revision (Zero Traffic)
Deploy a new revision that receives NO traffic:
gcloud run deploy <SERVICE_NAME> \
--image=<IMAGE_PATH>:canary-<SHA> \
--region=us-central1 \
--no-traffic \
--tag=canary \
--format="json"This creates a tagged revision accessible at https://canary---<SERVICE_NAME>-<hash>.a.run.app without affecting production traffic.
Capture the canary URL from the output.
Step 3: Health Checks
Run basic health checks against the canary URL:
- Liveness:
curl -s -o /dev/null -w "%{http_code}" <CANARY_URL>/health- Expected:
200 - Retry up to 3 times with 5-second intervals (cold start grace period)
- Expected:
- Readiness:
curl -s -o /dev/null -w "%{http_code}" <CANARY_URL>/api/health- Expected:
200(or the service's documented readiness endpoint)
- Expected:
If health checks fail after 3 retries, go to Step 6 (Rollback).
Step 4: Smoke Tests
Run smoke tests against the canary URL. Load test definitions from the primary repo's .adlc/context/smoke-tests.md if it exists, otherwise use defaults. In cross-repo mode the primary's smoke-tests.md is the authoritative source for every service — sibling repos do not need their own copy.
Default smoke tests (API services):
GET /health -> 200
GET /api/health -> 200Custom smoke tests (from .adlc/context/smoke-tests.md):
Each entry should specify: method, path, expected status, optional body pattern.
For each test:
RESPONSE=$(curl -s -w "\n%{http_code}" <CANARY_URL><PATH>)
STATUS=$(echo "$RESPONSE" | tail -1)
BODY=$(echo "$RESPONSE" | head -n -1)Report results:
## Smoke Test Results
| Test | Method | Path | Expected | Actual | Status |
|------|--------|------|----------|--------|--------|
| Health | GET | /health | 200 | 200 | PASS |
| API Health | GET | /api/health | 200 | 200 | PASS |
Result: 2/2 passedIf any test fails, go to Step 6 (Rollback).
Step 5: Promote to Production
All checks passed — promote the canary revision to 100% traffic:
gcloud run services update-traffic <SERVICE_NAME> \
--region=us-central1 \
--to-tags=canary=100Verify promotion:
gcloud run services describe <SERVICE_NAME> \
--region=us-central1 \
--format="table(status.traffic[].percent,status.traffic[].revisionName,status.traffic[].tag)"Confirm canary revision is now serving 100% traffic.
Remove the canary tag (clean up):
gcloud run services update-traffic <SERVICE_NAME> \
--region=us-central1 \
--remove-tags=canaryReport:
Canary promoted to production.
Service: <SERVICE_NAME>
Revision: <REVISION_NAME>
URL: <PRODUCTION_URL>
All smoke tests passed.Step 6: Rollback (Failure Path)
If health checks or smoke tests fail:
- Delete the canary revision tag (so it's not addressable):
gcloud run services update-traffic <SERVICE_NAME> \ --region=us-central1 \ --remove-tags=canary - Report the failure:
CANARY FAILED — rolled back. Service: <SERVICE_NAME> Failed revision: canary-<SHA> Failures: - [list failed health checks or smoke tests] Production traffic is unchanged — still serving the previous revision. - Suggest next steps:
- Check Cloud Run logs:
gcloud run services logs read <SERVICE_NAME> --region=us-central1 --limit=50 - Investigate the failure locally
- Fix and re-run
/canary
- Check Cloud Run logs:
Step 7: Update Pipeline State (if in /proceed context)
If pipeline-state.json exists for the current REQ:
- Add a
canaryentry tophaseHistorywith the result (passed/failed) - Include: service name, revision, smoke test results, canary URL
Smoke Test Configuration
To customize smoke tests, create .adlc/context/smoke-tests.md with this format:
# Smoke Tests
## api
| Method | Path | Expected Status | Body Pattern |
|--------|------|-----------------|--------------|
| GET | /health | 200 | |
| GET | /api/health | 200 | |
| GET | /api/v1/config | 200 | "version" |
## web
| Method | Path | Expected Status | Body Pattern |
|--------|------|-----------------|--------------|
| GET | / | 200 | |
| GET | /api/health | 200 | |The keys above (api, web) are repo ids — the same ids you used under repos: in .adlc/config.yml. /canary looks up the smoke tests for the service it's deploying by matching repo id.
What This Skill Does NOT Do
- It does not create new Cloud Run services — the service must already exist
- It does not handle iOS deployments — TestFlight is already a canary-like process
- It does not modify CI/CD workflows — it's a manual deployment confidence tool
- It does not handle database migrations — run those separately before deploying
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

