

Also from Kynth Studios


Also from Kynth Studios


Also from Kynth Studios
1234567# Smoke Test89> **HARD GATE** — Do NOT run smoke-test against a URL that hasn't been deployed yet. Always run `deploy` first, then `smoke-test`.10>11> **HARD GATE** — A failed smoke test means the deployment is broken. Do NOT mark a deploy as successful until all smoke checks pass.1213Validate a deployed application is healthy by running HTTP checks against live URLs. Each check asserts HTTP status, optional body signal (regex), and optional response-time threshold.1415## Configuration1617Smoke checks live in `smoke-checks.yaml` at the project root:1819```yaml20base_url: "https://example.com"21checks:22 - name: "Homepage"23 path: "/"24 expected_status: 20025 content_signal: "welcome|ok"26 max_response_time_ms: 300027```2829| Field | Required | Default | Description |30|-------|----------|---------|-------------|31| `name` | Yes | — | Human-readable check name |32| `path` | Yes | `/` | URL path relative to base_url |33| `method` | No | `GET` | HTTP method |34| `expected_status` | No | `200` | Expected HTTP status code |35| `content_signal` | No | — | Regex or string in response body |36| `max_response_time_ms` | No | — | Fail if slower than threshold (ms) |3738Ad-hoc single-URL mode: `DEPLOY_URL=https://host bash scripts/run-smoke.sh`3940## Process4142### 1. Load checks4344```bash45SMOKE_CHECKS_FILE="${SMOKE_CHECKS_FILE:-smoke-checks.yaml}"46BASE_URL="${DEPLOY_URL:-$BASE_URL}"47test -f "$SMOKE_CHECKS_FILE" || test -n "$BASE_URL" || { echo "ERROR: no checks file or URL"; exit 1; }48```4950### 2. Run each check5152```bash53bash scripts/run-smoke.sh "${DEPLOY_URL:-}" "${SMOKE_CHECKS_FILE:-smoke-checks.yaml}"54```5556The runner performs curl requests per check, records pass/fail per assertion, and prints a summary.5758### 3. Assert results5960- Any HTTP status mismatch → FAIL61- Missing `content_signal` when configured → FAIL62- Response time over `max_response_time_ms` → FAIL63- Exit code non-zero → deployment not healthy6465### 4. Generate report6667Capture stdout from `run-smoke.sh` as evidence. Persist to `specs/verifications/smoke-<date>.log` for release-branch.6869## Integration with deploy skill7071```bash72DEPLOY_URL="$DEPLOY_URL" bash scripts/run-smoke.sh73```7475## Verify arc7677Part of **★ VERIFY ★**: `verify-work` → `validate-contracts` → `smoke-test` → `run-evals` → `audit-code`7879## Verify8081→ verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && ! grep -q 'See \[REFERENCE.md\](REFERENCE.md)$' skills/smoke-test/SKILL.md && echo OK`8283---8485# Smoke Test — Reference8687## Navigation8889| Lines | Section |90|-------|---------|91| 1 | Title |92| 3–17 | Navigation |93| 18–34 | Runner script |94| 35–46 | Configuration reference |95| 47–55 | Verification |96| 56–89 | Reference block 1 |97| 90–107 | Reference block 2 |98| 108–122 | Reference block 3 |99| 123–159 | Reference block 4 |100| 160–177 | Reference block 5 |101102## Runner script103104A ready-to-use runner is provided for standalone operation:105106```bash107bash scripts/run-smoke.sh [url] [smoke-checks-file]108```109110The runner:1111. Uses `$DEPLOY_URL`, `$SMOKE_CHECKS_FILE`, or CLI arguments1122. Runs all defined checks1133. Prints a pass/fail summary1144. Exits 0 on all pass, non-zero on any failure115116117---118119## Configuration reference120121| Variable | Default | Description |122|----------|---------|-------------|123| `SMOKE_CHECKS_FILE` | `smoke-checks.yaml` | Path to smoke checks YAML |124| `DEPLOY_URL` / `BASE_URL` | *(required)* | Base URL for all checks |125| `SMOKE_TIMEOUT` | `30` | Per-check timeout (seconds) |126| `SMOKE_RETRIES` | `0` | Number of retries on failure |127128129---130131## Verification132133→ verify: `test -f smoke-test/SKILL.md && grep -q 'name: smoke-test' smoke-test/SKILL.md && echo OK`134→ verify: `grep -qi 'smoke.checks.yaml\|checklist\|expected_status\|content_signal' smoke-test/SKILL.md && echo OK`135→ verify: `grep -ci 'pass\|fail\|summary\|report' smoke-test/SKILL.md | awk '{if($1>=2) print "OK"; else print "FAIL"}'`136→ verify: `grep -q 'smoke-test' SKILL-INDEX.md && echo OK`137138---139140## Reference block 1141142```yaml143# smoke-checks.yaml — auto-loaded if present at project root144base_url: "https://example.com"145checks:146 - name: "Homepage"147 path: "/"148 method: GET149 expected_status: 200150 content_signal: "bigpowers"151 max_response_time_ms: 3000152153 - name: "API Health"154 path: "/api/health"155 method: GET156 expected_status: 200157 content_signal: "ok|healthy"158159 - name: "API Jogos"160 path: "/api/jogos"161 method: GET162 expected_status: 200163 content_signal: "jogos|games"164165 - name: "Not Found handling"166 path: "/nonexistent"167 method: GET168 expected_status: 404169 content_signal: "not found|404"170```171172---173174## Reference block 2175176```bash177SMOKE_CHECKS_FILE="${SMOKE_CHECKS_FILE:-smoke-checks.yaml}"178BASE_URL="${DEPLOY_URL:-$BASE_URL}"179180if [ -f "$SMOKE_CHECKS_FILE" ]; then181 echo "Loaded smoke checks from $SMOKE_CHECKS_FILE"182elif [ -n "$BASE_URL" ]; then183 echo "No smoke-checks.yaml found. Using single URL check against $BASE_URL"184else185 echo "ERROR: No smoke-checks.yaml found and no DEPLOY_URL/BASE_URL set."186 exit 1187fi188```189190---191192## Reference block 3193194```bash195url="${BASE_URL}${path}"196start_time=$(python3 -c 'import time; print(int(time.time() * 1000))')197198# Perform the HTTP request199response=$(curl -s -o /tmp/smoke_body.txt -w "%{http_code}" "$url")200response_time=$(( $(python3 -c 'import time; print(int(time.time() * 1000))') - start_time ))201status=$response202body=$(cat /tmp/smoke_body.txt)203```204205---206207## Reference block 4208209```bash210checks_passed=0211checks_failed=0212failures=""213214# Assert status code215if [ "$status" -ne "${expected_status:-200}" ]; then216 echo " FAIL: expected status ${expected_status} but got $status"217 checks_failed=$((checks_failed + 1))218 failures="${failures} - $name: HTTP $status (expected ${expected_status})\n"219else220 echo " PASS: HTTP $status"221fi222223# Assert content signal224if [ -n "$content_signal" ]; then225 if echo "$body" | grep -qiE "$content_signal"; then226 echo " PASS: body contains \"$content_signal\""227 else228 echo " FAIL: body does not contain \"$content_signal\""229 checks_failed=$((checks_failed + 1))230 failures="${failures} - $name: missing content signal \"$content_signal\"\n"231 fi232fi233234# Assert response time235if [ -n "$max_response_time_ms" ] && [ "$response_time" -gt "$max_response_time_ms" ]; then236 echo " FAIL: response time ${response_time}ms exceeds ${max_response_time_ms}ms"237 checks_failed=$((checks_failed + 1))238 failures="${failures} - $name: response time ${response_time}ms (max ${max_response_time_ms}ms)\n"239fi240```241242---243244## Reference block 5245246```bash247total=$((checks_passed + checks_failed))248echo ""249echo "=== Smoke Test Summary ==="250echo "Total: $total | Passed: $checks_passed | Failed: $checks_failed"251252if [ "$checks_failed" -gt 0 ]; then253 echo ""254 echo "Failures:"255 echo -e "$failures"256 exit 1257else258 echo "All checks passed."259 exit 0260fi261```262
One repository carrying more than one format is the comparison this product exists for: does anyone actually write different content in each file, or is one a copy of the other?
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| danielvm-git/bigpowers.cursor/rules/simple-english.mdc · 139 | Cursor rules | styletypesgitdatabase+6 | 47/100 | 14 days ago | |
| danielvm-git/bigpowers.cursor/rules/assess-impact.mdc · 139 | Cursor rules | testtesting-strategydeployment | 66/100 | 14 days ago | |
| danielvm-git/bigpowers.cursor/rules/audit-plan.mdc · 139 | Cursor rules | buildteststylegit | 74/100 | 14 days ago | |
| danielvm-git/bigpowers.cursor/rules/build-epic.mdc · 139 | Cursor rules | buildgit | 58/100 | 14 days ago | |
| danielvm-git/bigpowers.cursor/rules/change-request.mdc · 139 | Cursor rules | no sections | 48/100 | 14 days ago | |
| danielvm-git/bigpowers.cursor/rules/commit-message.mdc · 139 | Cursor rules | lint-formatstyletypesgit+3 | 82/100 | 14 days ago | |
| danielvm-git/bigpowers.cursor/rules/compose-workflow.mdc · 139 | Cursor rules | styledo-notagent-behaviour | 65/100 | 14 days ago | |
| danielvm-git/bigpowers.cursor/rules/context7-mcp.mdc · 139 | Cursor rules | style | 54/100 | 14 days ago | |
| danielvm-git/bigpowers.cursor/rules/deepen-architecture.mdc · 139 | Cursor rules | testtesting-strategydo-not | 57/100 | 14 days ago | |
| danielvm-git/bigpowers.cursor/rules/define-language.mdc · 139 | Cursor rules | lint-formatdo-not | 65/100 | 14 days ago | |
| danielvm-git/bigpowers.cursor/rules/define-success.mdc · 139 | Cursor rules | no sections | 4/100 | 14 days ago | |
| danielvm-git/bigpowers.cursor/rules/delegate-task.mdc · 139 | Cursor rules | git | 62/100 | 14 days ago | |
| danielvm-git/bigpowers.cursor/rules/deploy.mdc · 139 | Cursor rules | setupbuildtestdeployment | 77/100 | 14 days ago | |
| danielvm-git/bigpowers.windsurf/rules/verify-work.md · 139 | Windsurf rules | buildtestlint-formatagent-behaviour | 74/100 | 14 days ago | |
| danielvm-git/bigpowers.cursor/rules/develop-tdd.mdc · 139 | Cursor rules | teststylearchtesting-strategy+5 | 85/100 | 14 days ago | |
| danielvm-git/bigpowers.cursor/rules/diagnose-root.mdc · 139 | Cursor rules | no sections | 39/100 | 14 days ago | |
| danielvm-git/bigpowers.cursor/rules/diagnose-stall.mdc · 139 | Cursor rules | no sections | 44/100 | 14 days ago | |
| danielvm-git/bigpowers.cursor/rules/dispatch-agents.mdc · 139 | Cursor rules | git | 54/100 | 14 days ago | |
| danielvm-git/bigpowers.cursor/rules/edit-document.mdc · 139 | Cursor rules | no sections | 39/100 | 14 days ago | |
| danielvm-git/bigpowers.cursor/rules/elaborate-spec.mdc · 139 | Cursor rules | test | 58/100 | 14 days ago |
Same format, overlapping stack, ranked by quality.
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| danielvm-git/bigpowers.windsurf/rules/organize-workspace.md · 139 | Windsurf rules | buildstylegitdeployment+2 | 89/100 | 14 days ago | |
| danielvm-git/bigpowers.windsurf/rules/guard-git.md · 139 | Windsurf rules | stylearchgitsecurity+2 | 89/100 | 14 days ago | |
| danielvm-git/bigpowers.windsurf/rules/quick-fix.md · 139 | Windsurf rules | teststylegitdeployment+1 | 85/100 | 14 days ago | |
| danielvm-git/bigpowers.windsurf/rules/develop-tdd.md · 139 | Windsurf rules | teststylearchtesting-strategy+5 | 85/100 | 14 days ago | |
| danielvm-git/bigpowers.windsurf/rules/extract-design.md · 139 | Windsurf rules | lint-formatstyledependenciesui | 82/100 | 14 days ago | |
| danielvm-git/bigpowers.windsurf/rules/commit-message.md · 139 | Windsurf rules | lint-formatstyletypesgit+3 | 82/100 | 14 days ago | |
| danielvm-git/bigpowers.windsurf/rules/session-state.md · 139 | Windsurf rules | lint-formatstyleagent-behaviour | 82/100 | 14 days ago | |
| danielvm-git/bigpowers.windsurf/rules/setup-environment.md · 139 | Windsurf rules | setupstylesecuritydo-not+1 | 81/100 | 14 days ago |
A badge carrying the measured quality of the strongest agent config file in this repository, out of 100. It reads from this index every time somebody loads your page, so it changes when the measurement changes and there is nothing to keep up to date. Free, no account, and the value is not something you or we can set by hand.
[](https://rulestack.kynth.studio/configs/danielvm-git-bigpowers-windsurf-rules-smoke-test)Would rather not hotlink us? Every badge is also served in shields.io’s endpoint schema, so shields renders the image and your readers never talk to our domain:
Published by Toolproof, the masthead over this index and eight others. The method behind the number is at toolproof.kynth.studio/methodology, and the whole thing is readable as JSON with no key at /api.