From cm
Enforces test gates, evidence-based verification, and frontend safety checks before deployment. Blocks deploys that fail tests or lack evidence.
How this skill is triggered — by the user, by Claude, or both
Slash command
/cm:cm-quality-gateThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
- **Use before** any deployment or completion claim
Three checkpoints, one skill: Pre-deploy testing, evidence verification, frontend safety.
test:gate.Goal: Identify the framework and install the correct testing dependencies.
package.json for framework (React, Vue, Astro, etc.) and wrangler.json(c).npm install -D vitest jsdom acornvitest.config.ts or vite.config.ts with environment: 'jsdom'.{
"scripts": {
"test:gate": "vitest run --reporter=verbose"
}
}
Do not combine these files. They form the "Quality Gate."
test/frontend-safety.test.ts)Prevents white screens, template corruption, and syntax errors.
test('app.js does not contain catastrophic corruption', () => {
const code = fs.readFileSync('public/static/app.js', 'utf-8');
expect(code).not.toMatch(/=\s*'[^']*\$\{t\(/); // Bug #1
expect(code).not.toMatch(/<\s+[a-zA-Z]/); // Bug #2
});
test/api-routes.test.ts)Ensures backend endpoints respond correctly.
test/business-logic.test.ts)Tests pure functions, validations, and transformations.
test/i18n-sync.test.ts)Guarantees all language files have identical key counts.
ALWAYS run npm run test:gate before deploying. 0 failures required.
Check for skip override (explicit user words only):
Run test gate:
npm run test:gate
Parse results: total files, total tests, failures, duration
Gate decision:
| DON'T | DO |
|---|---|
| Deploy then test | Test then deploy |
| "Tests passed earlier" | Run fresh test:gate NOW |
| Skip for "small changes" | Every change gets tested |
| Run test + deploy parallel | Sequential: test → gate → deploy |
ALWAYS run the proving command before saying "fixed" or "done."
1. IDENTIFY → What command proves this claim?
2. RUN → Execute the FULL command (fresh)
3. READ → Full output, check exit code
4. VERIFY → Does output confirm the claim?
5. ONLY THEN → Make the claim
| Claim | Requires | Not Sufficient |
|---|---|---|
| Tests pass | Test output: 0 failures | "Should pass", previous run |
| Build succeeds | Build: exit 0 | Linter passing |
| Bug fixed | Test symptom: passes | Code changed, assumed fixed |
| Requirements met | Line-by-line checklist | Tests passing |
Automated via Layer 1 above.
Setting up or enhancing test suites for projects with frontend JavaScript/TypeScript.
| Layer | What it checks | Priority |
|---|---|---|
| 1. Syntax Validation | JS parses without errors (via acorn) | CRITICAL |
| 2. Function Integrity | Named functions exist and are callable | Required |
| 3. Template Safety | HTML templates have matching tags | Required |
| 4. Asset References | Referenced files actually exist | Required |
| 5. Corruption Patterns | Known bad patterns (empty functions, truncation) | Required |
| 6. Import/Export | Module references resolve | Recommended |
| 7. CSS Validation | CSS files parse correctly | Recommended |
npm install -D vitest acorn
import { parse } from 'acorn';
import { readFileSync } from 'fs';
test('app.js has valid syntax', () => {
const code = readFileSync('public/static/app.js', 'utf-8');
expect(() => parse(code, { ecmaVersion: 2022, sourceType: 'script' })).not.toThrow();
});
This single test would have prevented the March 2026 white-screen incident.
After ALL gates pass, update .cm/CONTINUITY.md:
verified or ready-to-deploy✅ Quality gate passed: [test count] tests, 0 failuresAfter ANY gate fails, FIRST run Memory Integrity Check:
.cm/meta-learnings.json if memory was the causeThen update .cm/CONTINUITY.md:
module:{failing-module} or global if systemicToken savings: Next session instantly knows if last run passed or failed without re-running the test suite just to check status.
| Skill | Relationship |
|---|---|
cm-safe-deploy | Quality gate is the primary blocker for the deploy pipeline |
cm-identity-guard | Verify identity before using quality gate to ship |
cm-tdd | TDD creates the logic for Layer 3 |
cm-safe-i18n | Leverages Layer 4 for parity checks |
cm-safe-deploy | PRE-REQUISITE for production: Security scan (Snyk + Aikido) PASS must be in deployment evidence. No production deploy without security clearance. |
| Evidence | Command | Required |
|---|---|---|
| Test suite passes | npm run test:gate | ✅ Always |
| Build succeeds | npm run build | ✅ Always |
| Security scan passes | snyk test && aikido-api-client scan-release ... | ✅ For production / public releases |
| i18n parity | Included in test:gate | ✅ If multilingual |
After all gates pass, compute a 0–100 score for the change:
cm quality score --mode WARNING
Components (each weighted): intent 30%, ownership 25%, context 20%, tests 15%, review 10%.
Inputs are derived automatically from .cm/handoff/{plan,exec,review,quality}.json when present, or can be overridden with --intent <0..1>, --ownership <0..1>, etc.
Modes:
OFF — silent (LITE projects)WARNING — print + advise (default; STANDARD projects)SOFT — warn loudly under 60 (PROFESSIONAL projects)FULL — exit 1 under 70 (ENTERPRISE projects, blocks deploy)The default mode follows the project tier from cm tier classify.
The gate is where "goal-driven execution" actually closes the loop:
Gate principle: weak criteria fail here, not in production. Reject "make it work" handoffs back to planning.
Test before deploy. Scan before release. Evidence before claims. Safety before shipping. Non-negotiable.
npx claudepluginhub tody-agent/codymaster --plugin cmRuns quality gates for linting, type checking, unit tests with coverage, spec compliance, and smoke checks at local/CI/deploy levels.
Runs parallel specialized agents to verify implementations, run tests (unit/e2e/integration/perf/LLM), grade quality (0-10 scale), and suggest improvements. Use before merging.
Final code review skill: runs stack-specific tests/lints (Next.js, Python, Swift, Kotlin), security checks, verifies spec.md criteria, audits hub files, issues ship/no-go verdict after /build or /deploy.