[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DQRWKPQ2B348RGSD2HTCHQ":3,"skill-same:01M6DQRWKPQ2B348RGSD2HTCHQ":65},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":32,"linkOnly":33,"markdownContent":34,"markdownBody":35,"frontMatter":36,"refName":38,"commitSha":39,"skillDirectory":40,"forksCount":41,"repositoryHtmlUrl":42,"repositoryHomepageUrl":6,"ownerHtmlUrl":43,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":44,"install":45,"resources":58},"01M6DQRWKPQ2B348RGSD2HTCHQ","django-verification",null,"Verification loop for Django projects: migrations, linting, tests with coverage, security scans, and deployment readiness checks before release or PR.","AntifragileTech\u002Fantifragile-claude-code","AntifragileTech","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F174357194?v=4","01M6DQCYMK4CDSQQAN0ZC72NTV","01M6DQCYS9YPW1WKMQ5TJMPQ43",9,"MIT","https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fdev\u002Fdjango-verification\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31],"verification","django verification","django","security","pr","deployment","release","loop","verification loop","projects","coverage","migrations","tests","readiness","2026-11-10 10:12:30",false,"---\nname: django-verification\ndescription: \"Verification loop for Django projects: migrations, linting, tests with coverage, security scans, and deployment readiness checks before release or PR.\"\norigin: ECC\n---\n\n# Django Verification Loop\n\nRun before PRs, after major changes, and pre-deploy to ensure Django application quality and security.\n\n## When to Activate\n\n- Before opening a pull request for a Django project\n- After major model changes, migration updates, or dependency upgrades\n- Pre-deployment verification for staging or production\n- Running full environment → lint → test → security → deploy readiness pipeline\n- Validating migration safety and test coverage\n\n## Phase 1: Environment Check\n\n```bash\n# Verify Python version\npython --version  # Should match project requirements\n\n# Check virtual environment\nwhich python\npip list --outdated\n\n# Verify environment variables\npython -c \"import os; import environ; print('DJANGO_SECRET_KEY set' if os.environ.get('DJANGO_SECRET_KEY') else 'MISSING: DJANGO_SECRET_KEY')\"\n```\n\nIf environment is misconfigured, stop and fix.\n\n## Phase 2: Code Quality & Formatting\n\n```bash\n# Type checking\nmypy . --config-file pyproject.toml\n\n# Linting with ruff\nruff check . --fix\n\n# Formatting with black\nblack . --check\nblack .  # Auto-fix\n\n# Import sorting\nisort . --check-only\nisort .  # Auto-fix\n\n# Django-specific checks\npython manage.py check --deploy\n```\n\nCommon issues:\n- Missing type hints on public functions\n- PEP 8 formatting violations\n- Unsorted imports\n- Debug settings left in production configuration\n\n## Phase 3: Migrations\n\n```bash\n# Check for unapplied migrations\npython manage.py showmigrations\n\n# Create missing migrations\npython manage.py makemigrations --check\n\n# Dry-run migration application\npython manage.py migrate --plan\n\n# Apply migrations (test environment)\npython manage.py migrate\n\n# Check for migration conflicts\npython manage.py makemigrations --merge  # Only if conflicts exist\n```\n\nReport:\n- Number of pending migrations\n- Any migration conflicts\n- Model changes without migrations\n\n## Phase 4: Tests + Coverage\n\n```bash\n# Run all tests with pytest\npytest --cov=apps --cov-report=html --cov-report=term-missing --reuse-db\n\n# Run specific app tests\npytest apps\u002Fusers\u002Ftests\u002F\n\n# Run with markers\npytest -m \"not slow\"  # Skip slow tests\npytest -m integration  # Only integration tests\n\n# Coverage report\nopen htmlcov\u002Findex.html\n```\n\nReport:\n- Total tests: X passed, Y failed, Z skipped\n- Overall coverage: XX%\n- Per-app coverage breakdown\n\nCoverage targets:\n\n| Component | Target |\n|-----------|--------|\n| Models | 90%+ |\n| Serializers | 85%+ |\n| Views | 80%+ |\n| Services | 90%+ |\n| Overall | 80%+ |\n\n## Phase 5: Security Scan\n\n```bash\n# Dependency vulnerabilities\npip-audit\nsafety check --full-report\n\n# Django security checks\npython manage.py check --deploy\n\n# Bandit security linter\nbandit -r . -f json -o bandit-report.json\n\n# Secret scanning (if gitleaks is installed)\ngitleaks detect --source . --verbose\n\n# Environment variable check\npython -c \"from django.core.exceptions import ImproperlyConfigured; from django.conf import settings; settings.DEBUG\"\n```\n\nReport:\n- Vulnerable dependencies found\n- Security configuration issues\n- Hardcoded secrets detected\n- DEBUG mode status (should be False in production)\n\n## Phase 6: Django Management Commands\n\n```bash\n# Check for model issues\npython manage.py check\n\n# Collect static files\npython manage.py collectstatic --noinput --clear\n\n# Create superuser (if needed for tests)\necho \"from apps.users.models import User; User.objects.create_superuser('admin@example.com', 'admin')\" | python manage.py shell\n\n# Database integrity\npython manage.py check --database default\n\n# Cache verification (if using Redis)\npython -c \"from django.core.cache import cache; cache.set('test', 'value', 10); print(cache.get('test'))\"\n```\n\n## Phase 7: Performance Checks\n\n```bash\n# Django Debug Toolbar output (check for N+1 queries)\n# Run in dev mode with DEBUG=True and access a page\n# Look for duplicate queries in SQL panel\n\n# Query count analysis\ndjango-admin debugsqlshell  # If django-debug-sqlshell installed\n\n# Check for missing indexes\npython manage.py shell \u003C\u003C EOF\nfrom django.db import connection\nwith connection.cursor() as cursor:\n    cursor.execute(\"SELECT table_name, index_name FROM information_schema.statistics WHERE table_schema = 'public'\")\n    print(cursor.fetchall())\nEOF\n```\n\nReport:\n- Number of queries per page (should be \u003C 50 for typical pages)\n- Missing database indexes\n- Duplicate queries detected\n\n## Phase 8: Static Assets\n\n```bash\n# Check for npm dependencies (if using npm)\nnpm audit\nnpm audit fix\n\n# Build static files (if using webpack\u002Fvite)\nnpm run build\n\n# Verify static files\nls -la staticfiles\u002F\npython manage.py findstatic css\u002Fstyle.css\n```\n\n## Phase 9: Configuration Review\n\n```python\n# Run in Python shell to verify settings\npython manage.py shell \u003C\u003C EOF\nfrom django.conf import settings\nimport os\n\n# Critical checks\nchecks = {\n    'DEBUG is False': not settings.DEBUG,\n    'SECRET_KEY set': bool(settings.SECRET_KEY and len(settings.SECRET_KEY) > 30),\n    'ALLOWED_HOSTS set': len(settings.ALLOWED_HOSTS) > 0,\n    'HTTPS enabled': getattr(settings, 'SECURE_SSL_REDIRECT', False),\n    'HSTS enabled': getattr(settings, 'SECURE_HSTS_SECONDS', 0) > 0,\n    'Database configured': settings.DATABASES['default']['ENGINE'] != 'django.db.backends.sqlite3',\n}\n\nfor check, result in checks.items():\n    status = '✓' if result else '✗'\n    print(f\"{status} {check}\")\nEOF\n```\n\n## Phase 10: Logging Configuration\n\n```bash\n# Test logging output\npython manage.py shell \u003C\u003C EOF\nimport logging\nlogger = logging.getLogger('django')\nlogger.warning('Test warning message')\nlogger.error('Test error message')\nEOF\n\n# Check log files (if configured)\ntail -f \u002Fvar\u002Flog\u002Fdjango\u002Fdjango.log\n```\n\n## Phase 11: API Documentation (if DRF)\n\n```bash\n# Generate schema\npython manage.py generateschema --format openapi-json > schema.json\n\n# Validate schema\n# Check if schema.json is valid JSON\npython -c \"import json; json.load(open('schema.json'))\"\n\n# Access Swagger UI (if using drf-yasg)\n# Visit http:\u002F\u002Flocalhost:8000\u002Fswagger\u002F in browser\n```\n\n## Phase 12: Diff Review\n\n```bash\n# Show diff statistics\ngit diff --stat\n\n# Show actual changes\ngit diff\n\n# Show changed files\ngit diff --name-only\n\n# Check for common issues\ngit diff | grep -i \"todo\\|fixme\\|hack\\|xxx\"\ngit diff | grep \"print(\"  # Debug statements\ngit diff | grep \"DEBUG = True\"  # Debug mode\ngit diff | grep \"import pdb\"  # Debugger\n```\n\nChecklist:\n- No debugging statements (print, pdb, breakpoint())\n- No TODO\u002FFIXME comments in critical code\n- No hardcoded secrets or credentials\n- Database migrations included for model changes\n- Configuration changes documented\n- Error handling present for external calls\n- Transaction management where needed\n\n## Output Template\n\n```\nDJANGO VERIFICATION REPORT\n==========================\n\nPhase 1: Environment Check\n  ✓ Python 3.11.5\n  ✓ Virtual environment active\n  ✓ All environment variables set\n\nPhase 2: Code Quality\n  ✓ mypy: No type errors\n  ✗ ruff: 3 issues found (auto-fixed)\n  ✓ black: No formatting issues\n  ✓ isort: Imports properly sorted\n  ✓ manage.py check: No issues\n\nPhase 3: Migrations\n  ✓ No unapplied migrations\n  ✓ No migration conflicts\n  ✓ All models have migrations\n\nPhase 4: Tests + Coverage\n  Tests: 247 passed, 0 failed, 5 skipped\n  Coverage:\n    Overall: 87%\n    users: 92%\n    products: 89%\n    orders: 85%\n    payments: 91%\n\nPhase 5: Security Scan\n  ✗ pip-audit: 2 vulnerabilities found (fix required)\n  ✓ safety check: No issues\n  ✓ bandit: No security issues\n  ✓ No secrets detected\n  ✓ DEBUG = False\n\nPhase 6: Django Commands\n  ✓ collectstatic completed\n  ✓ Database integrity OK\n  ✓ Cache backend reachable\n\nPhase 7: Performance\n  ✓ No N+1 queries detected\n  ✓ Database indexes configured\n  ✓ Query count acceptable\n\nPhase 8: Static Assets\n  ✓ npm audit: No vulnerabilities\n  ✓ Assets built successfully\n  ✓ Static files collected\n\nPhase 9: Configuration\n  ✓ DEBUG = False\n  ✓ SECRET_KEY configured\n  ✓ ALLOWED_HOSTS set\n  ✓ HTTPS enabled\n  ✓ HSTS enabled\n  ✓ Database configured\n\nPhase 10: Logging\n  ✓ Logging configured\n  ✓ Log files writable\n\nPhase 11: API Documentation\n  ✓ Schema generated\n  ✓ Swagger UI accessible\n\nPhase 12: Diff Review\n  Files changed: 12\n  +450, -120 lines\n  ✓ No debug statements\n  ✓ No hardcoded secrets\n  ✓ Migrations included\n\nRECOMMENDATION: ⚠️ Fix pip-audit vulnerabilities before deploying\n\nNEXT STEPS:\n1. Update vulnerable dependencies\n2. Re-run security scan\n3. Deploy to staging for final testing\n```\n\n## Pre-Deployment Checklist\n\n- [ ] All tests passing\n- [ ] Coverage ≥ 80%\n- [ ] No security vulnerabilities\n- [ ] No unapplied migrations\n- [ ] DEBUG = False in production settings\n- [ ] SECRET_KEY properly configured\n- [ ] ALLOWED_HOSTS set correctly\n- [ ] Database backups enabled\n- [ ] Static files collected and served\n- [ ] Logging configured and working\n- [ ] Error monitoring (Sentry, etc.) configured\n- [ ] CDN configured (if applicable)\n- [ ] Redis\u002Fcache backend configured\n- [ ] Celery workers running (if applicable)\n- [ ] HTTPS\u002FSSL configured\n- [ ] Environment variables documented\n\n## Continuous Integration\n\n### GitHub Actions Example\n\n```yaml\n# .github\u002Fworkflows\u002Fdjango-verification.yml\nname: Django Verification\n\non: [push, pull_request]\n\njobs:\n  verify:\n    runs-on: ubuntu-latest\n    services:\n      postgres:\n        image: postgres:14\n        env:\n          POSTGRES_PASSWORD: postgres\n        options: >-\n          --health-cmd pg_isready\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n\n    steps:\n      - uses: actions\u002Fcheckout@v3\n\n      - name: Set up Python\n        uses: actions\u002Fsetup-python@v4\n        with:\n          python-version: '3.11'\n\n      - name: Cache pip\n        uses: actions\u002Fcache@v3\n        with:\n          path: ~\u002F.cache\u002Fpip\n          key: ${{ runner.os }}-pip-${{ hashFiles('**\u002Frequirements.txt') }}\n\n      - name: Install dependencies\n        run: |\n          pip install -r requirements.txt\n          pip install ruff black mypy pytest pytest-django pytest-cov bandit safety pip-audit\n\n      - name: Code quality checks\n        run: |\n          ruff check .\n          black . --check\n          isort . --check-only\n          mypy .\n\n      - name: Security scan\n        run: |\n          bandit -r . -f json -o bandit-report.json\n          safety check --full-report\n          pip-audit\n\n      - name: Run tests\n        env:\n          DATABASE_URL: postgres:\u002F\u002Fpostgres:postgres@localhost:5432\u002Ftest\n          DJANGO_SECRET_KEY: test-secret-key\n        run: |\n          pytest --cov=apps --cov-report=xml --cov-report=term-missing\n\n      - name: Upload coverage\n        uses: codecov\u002Fcodecov-action@v3\n```\n\n## Quick Reference\n\n| Check | Command |\n|-------|---------|\n| Environment | `python --version` |\n| Type checking | `mypy .` |\n| Linting | `ruff check .` |\n| Formatting | `black . --check` |\n| Migrations | `python manage.py makemigrations --check` |\n| Tests | `pytest --cov=apps` |\n| Security | `pip-audit && bandit -r .` |\n| Django check | `python manage.py check --deploy` |\n| Collectstatic | `python manage.py collectstatic --noinput` |\n| Diff stats | `git diff --stat` |\n\nRemember: Automated verification catches common issues but doesn't replace manual code review and testing in staging environment.\n","# Django Verification Loop\n\nRun before PRs, after major changes, and pre-deploy to ensure Django application quality and security.\n\n## When to Activate\n\n- Before opening a pull request for a Django project\n- After major model changes, migration updates, or dependency upgrades\n- Pre-deployment verification for staging or production\n- Running full environment → lint → test → security → deploy readiness pipeline\n- Validating migration safety and test coverage\n\n## Phase 1: Environment Check\n\n```bash\n# Verify Python version\npython --version  # Should match project requirements\n\n# Check virtual environment\nwhich python\npip list --outdated\n\n# Verify environment variables\npython -c \"import os; import environ; print('DJANGO_SECRET_KEY set' if os.environ.get('DJANGO_SECRET_KEY') else 'MISSING: DJANGO_SECRET_KEY')\"\n```\n\nIf environment is misconfigured, stop and fix.\n\n## Phase 2: Code Quality & Formatting\n\n```bash\n# Type checking\nmypy . --config-file pyproject.toml\n\n# Linting with ruff\nruff check . --fix\n\n# Formatting with black\nblack . --check\nblack .  # Auto-fix\n\n# Import sorting\nisort . --check-only\nisort .  # Auto-fix\n\n# Django-specific checks\npython manage.py check --deploy\n```\n\nCommon issues:\n- Missing type hints on public functions\n- PEP 8 formatting violations\n- Unsorted imports\n- Debug settings left in production configuration\n\n## Phase 3: Migrations\n\n```bash\n# Check for unapplied migrations\npython manage.py showmigrations\n\n# Create missing migrations\npython manage.py makemigrations --check\n\n# Dry-run migration application\npython manage.py migrate --plan\n\n# Apply migrations (test environment)\npython manage.py migrate\n\n# Check for migration conflicts\npython manage.py makemigrations --merge  # Only if conflicts exist\n```\n\nReport:\n- Number of pending migrations\n- Any migration conflicts\n- Model changes without migrations\n\n## Phase 4: Tests + Coverage\n\n```bash\n# Run all tests with pytest\npytest --cov=apps --cov-report=html --cov-report=term-missing --reuse-db\n\n# Run specific app tests\npytest apps\u002Fusers\u002Ftests\u002F\n\n# Run with markers\npytest -m \"not slow\"  # Skip slow tests\npytest -m integration  # Only integration tests\n\n# Coverage report\nopen htmlcov\u002Findex.html\n```\n\nReport:\n- Total tests: X passed, Y failed, Z skipped\n- Overall coverage: XX%\n- Per-app coverage breakdown\n\nCoverage targets:\n\n| Component | Target |\n|-----------|--------|\n| Models | 90%+ |\n| Serializers | 85%+ |\n| Views | 80%+ |\n| Services | 90%+ |\n| Overall | 80%+ |\n\n## Phase 5: Security Scan\n\n```bash\n# Dependency vulnerabilities\npip-audit\nsafety check --full-report\n\n# Django security checks\npython manage.py check --deploy\n\n# Bandit security linter\nbandit -r . -f json -o bandit-report.json\n\n# Secret scanning (if gitleaks is installed)\ngitleaks detect --source . --verbose\n\n# Environment variable check\npython -c \"from django.core.exceptions import ImproperlyConfigured; from django.conf import settings; settings.DEBUG\"\n```\n\nReport:\n- Vulnerable dependencies found\n- Security configuration issues\n- Hardcoded secrets detected\n- DEBUG mode status (should be False in production)\n\n## Phase 6: Django Management Commands\n\n```bash\n# Check for model issues\npython manage.py check\n\n# Collect static files\npython manage.py collectstatic --noinput --clear\n\n# Create superuser (if needed for tests)\necho \"from apps.users.models import User; User.objects.create_superuser('admin@example.com', 'admin')\" | python manage.py shell\n\n# Database integrity\npython manage.py check --database default\n\n# Cache verification (if using Redis)\npython -c \"from django.core.cache import cache; cache.set('test', 'value', 10); print(cache.get('test'))\"\n```\n\n## Phase 7: Performance Checks\n\n```bash\n# Django Debug Toolbar output (check for N+1 queries)\n# Run in dev mode with DEBUG=True and access a page\n# Look for duplicate queries in SQL panel\n\n# Query count analysis\ndjango-admin debugsqlshell  # If django-debug-sqlshell installed\n\n# Check for missing indexes\npython manage.py shell \u003C\u003C EOF\nfrom django.db import connection\nwith connection.cursor() as cursor:\n    cursor.execute(\"SELECT table_name, index_name FROM information_schema.statistics WHERE table_schema = 'public'\")\n    print(cursor.fetchall())\nEOF\n```\n\nReport:\n- Number of queries per page (should be \u003C 50 for typical pages)\n- Missing database indexes\n- Duplicate queries detected\n\n## Phase 8: Static Assets\n\n```bash\n# Check for npm dependencies (if using npm)\nnpm audit\nnpm audit fix\n\n# Build static files (if using webpack\u002Fvite)\nnpm run build\n\n# Verify static files\nls -la staticfiles\u002F\npython manage.py findstatic css\u002Fstyle.css\n```\n\n## Phase 9: Configuration Review\n\n```python\n# Run in Python shell to verify settings\npython manage.py shell \u003C\u003C EOF\nfrom django.conf import settings\nimport os\n\n# Critical checks\nchecks = {\n    'DEBUG is False': not settings.DEBUG,\n    'SECRET_KEY set': bool(settings.SECRET_KEY and len(settings.SECRET_KEY) > 30),\n    'ALLOWED_HOSTS set': len(settings.ALLOWED_HOSTS) > 0,\n    'HTTPS enabled': getattr(settings, 'SECURE_SSL_REDIRECT', False),\n    'HSTS enabled': getattr(settings, 'SECURE_HSTS_SECONDS', 0) > 0,\n    'Database configured': settings.DATABASES['default']['ENGINE'] != 'django.db.backends.sqlite3',\n}\n\nfor check, result in checks.items():\n    status = '✓' if result else '✗'\n    print(f\"{status} {check}\")\nEOF\n```\n\n## Phase 10: Logging Configuration\n\n```bash\n# Test logging output\npython manage.py shell \u003C\u003C EOF\nimport logging\nlogger = logging.getLogger('django')\nlogger.warning('Test warning message')\nlogger.error('Test error message')\nEOF\n\n# Check log files (if configured)\ntail -f \u002Fvar\u002Flog\u002Fdjango\u002Fdjango.log\n```\n\n## Phase 11: API Documentation (if DRF)\n\n```bash\n# Generate schema\npython manage.py generateschema --format openapi-json > schema.json\n\n# Validate schema\n# Check if schema.json is valid JSON\npython -c \"import json; json.load(open('schema.json'))\"\n\n# Access Swagger UI (if using drf-yasg)\n# Visit http:\u002F\u002Flocalhost:8000\u002Fswagger\u002F in browser\n```\n\n## Phase 12: Diff Review\n\n```bash\n# Show diff statistics\ngit diff --stat\n\n# Show actual changes\ngit diff\n\n# Show changed files\ngit diff --name-only\n\n# Check for common issues\ngit diff | grep -i \"todo\\|fixme\\|hack\\|xxx\"\ngit diff | grep \"print(\"  # Debug statements\ngit diff | grep \"DEBUG = True\"  # Debug mode\ngit diff | grep \"import pdb\"  # Debugger\n```\n\nChecklist:\n- No debugging statements (print, pdb, breakpoint())\n- No TODO\u002FFIXME comments in critical code\n- No hardcoded secrets or credentials\n- Database migrations included for model changes\n- Configuration changes documented\n- Error handling present for external calls\n- Transaction management where needed\n\n## Output Template\n\n```\nDJANGO VERIFICATION REPORT\n==========================\n\nPhase 1: Environment Check\n  ✓ Python 3.11.5\n  ✓ Virtual environment active\n  ✓ All environment variables set\n\nPhase 2: Code Quality\n  ✓ mypy: No type errors\n  ✗ ruff: 3 issues found (auto-fixed)\n  ✓ black: No formatting issues\n  ✓ isort: Imports properly sorted\n  ✓ manage.py check: No issues\n\nPhase 3: Migrations\n  ✓ No unapplied migrations\n  ✓ No migration conflicts\n  ✓ All models have migrations\n\nPhase 4: Tests + Coverage\n  Tests: 247 passed, 0 failed, 5 skipped\n  Coverage:\n    Overall: 87%\n    users: 92%\n    products: 89%\n    orders: 85%\n    payments: 91%\n\nPhase 5: Security Scan\n  ✗ pip-audit: 2 vulnerabilities found (fix required)\n  ✓ safety check: No issues\n  ✓ bandit: No security issues\n  ✓ No secrets detected\n  ✓ DEBUG = False\n\nPhase 6: Django Commands\n  ✓ collectstatic completed\n  ✓ Database integrity OK\n  ✓ Cache backend reachable\n\nPhase 7: Performance\n  ✓ No N+1 queries detected\n  ✓ Database indexes configured\n  ✓ Query count acceptable\n\nPhase 8: Static Assets\n  ✓ npm audit: No vulnerabilities\n  ✓ Assets built successfully\n  ✓ Static files collected\n\nPhase 9: Configuration\n  ✓ DEBUG = False\n  ✓ SECRET_KEY configured\n  ✓ ALLOWED_HOSTS set\n  ✓ HTTPS enabled\n  ✓ HSTS enabled\n  ✓ Database configured\n\nPhase 10: Logging\n  ✓ Logging configured\n  ✓ Log files writable\n\nPhase 11: API Documentation\n  ✓ Schema generated\n  ✓ Swagger UI accessible\n\nPhase 12: Diff Review\n  Files changed: 12\n  +450, -120 lines\n  ✓ No debug statements\n  ✓ No hardcoded secrets\n  ✓ Migrations included\n\nRECOMMENDATION: ⚠️ Fix pip-audit vulnerabilities before deploying\n\nNEXT STEPS:\n1. Update vulnerable dependencies\n2. Re-run security scan\n3. Deploy to staging for final testing\n```\n\n## Pre-Deployment Checklist\n\n- [ ] All tests passing\n- [ ] Coverage ≥ 80%\n- [ ] No security vulnerabilities\n- [ ] No unapplied migrations\n- [ ] DEBUG = False in production settings\n- [ ] SECRET_KEY properly configured\n- [ ] ALLOWED_HOSTS set correctly\n- [ ] Database backups enabled\n- [ ] Static files collected and served\n- [ ] Logging configured and working\n- [ ] Error monitoring (Sentry, etc.) configured\n- [ ] CDN configured (if applicable)\n- [ ] Redis\u002Fcache backend configured\n- [ ] Celery workers running (if applicable)\n- [ ] HTTPS\u002FSSL configured\n- [ ] Environment variables documented\n\n## Continuous Integration\n\n### GitHub Actions Example\n\n```yaml\n# .github\u002Fworkflows\u002Fdjango-verification.yml\nname: Django Verification\n\non: [push, pull_request]\n\njobs:\n  verify:\n    runs-on: ubuntu-latest\n    services:\n      postgres:\n        image: postgres:14\n        env:\n          POSTGRES_PASSWORD: postgres\n        options: >-\n          --health-cmd pg_isready\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n\n    steps:\n      - uses: actions\u002Fcheckout@v3\n\n      - name: Set up Python\n        uses: actions\u002Fsetup-python@v4\n        with:\n          python-version: '3.11'\n\n      - name: Cache pip\n        uses: actions\u002Fcache@v3\n        with:\n          path: ~\u002F.cache\u002Fpip\n          key: ${{ runner.os }}-pip-${{ hashFiles('**\u002Frequirements.txt') }}\n\n      - name: Install dependencies\n        run: |\n          pip install -r requirements.txt\n          pip install ruff black mypy pytest pytest-django pytest-cov bandit safety pip-audit\n\n      - name: Code quality checks\n        run: |\n          ruff check .\n          black . --check\n          isort . --check-only\n          mypy .\n\n      - name: Security scan\n        run: |\n          bandit -r . -f json -o bandit-report.json\n          safety check --full-report\n          pip-audit\n\n      - name: Run tests\n        env:\n          DATABASE_URL: postgres:\u002F\u002Fpostgres:postgres@localhost:5432\u002Ftest\n          DJANGO_SECRET_KEY: test-secret-key\n        run: |\n          pytest --cov=apps --cov-report=xml --cov-report=term-missing\n\n      - name: Upload coverage\n        uses: codecov\u002Fcodecov-action@v3\n```\n\n## Quick Reference\n\n| Check | Command |\n|-------|---------|\n| Environment | `python --version` |\n| Type checking | `mypy .` |\n| Linting | `ruff check .` |\n| Formatting | `black . --check` |\n| Migrations | `python manage.py makemigrations --check` |\n| Tests | `pytest --cov=apps` |\n| Security | `pip-audit && bandit -r .` |\n| Django check | `python manage.py check --deploy` |\n| Collectstatic | `python manage.py collectstatic --noinput` |\n| Diff stats | `git diff --stat` |\n\nRemember: Automated verification catches common issues but doesn't replace manual code review and testing in staging environment.\n",{"name":5,"origin":37,"description":7},"ECC","master","c73386b305dec167db7654e0e6feacb462d4f9dc","assets\u002Fskills\u002Fdev\u002Fdjango-verification",1,"https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code","https:\u002F\u002Fgithub.com\u002FAntifragileTech","2026-10-02 14:22:14",{"source":8,"skillName":5,"commands":46,"prompt":56,"zipAvailable":57},[47,50,53],{"tool":48,"command":49},"npx","npx skills add AntifragileTech\u002Fantifragile-claude-code --skill django-verification",{"tool":51,"command":52},"bunx","bunx skills add AntifragileTech\u002Fantifragile-claude-code --skill django-verification",{"tool":54,"command":55},"pnpm","pnpm dlx skills add AntifragileTech\u002Fantifragile-claude-code --skill django-verification","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fdev\u002Fdjango-verification\u002FSKILL.md",true,[59],{"path":60,"resourceType":61,"resourceTypeDesc":62,"sizeBytes":63,"sourceHtmlUrl":64},"agents\u002Fopenai.yaml","REFERENCE","参考文档",115,"https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fadr\u002Fagents\u002Fopenai.yaml",[66,91,106,121,134,144],{"skillNo":67,"name":68,"nameZh":6,"description":69,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":85,"publishedAt":32},"01M6DT9Q6VYA615SCXR757TZZ7","writing-skills","Use when creating new skills, editing existing skills, or verifying skills work before deployment","https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fthinking\u002Fwriting-skills\u002FSKILL.md",[72,77,80],{"categoryNo":73,"categoryName":74,"taxonomyType":75,"taxonomyTypeDesc":76},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":78,"categoryName":79,"taxonomyType":75,"taxonomyTypeDesc":76},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":81,"categoryName":82,"taxonomyType":83,"taxonomyTypeDesc":84},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[86,87,88,89,90,23],"writing skills","writing","use","editing","work",{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":99,"publishedAt":32},"01M6DT9GFHDNY90P41WGAE1TV0","writing-plans","Use when you have a spec or requirements for a multi-step task, before touching code","https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fthinking\u002Fwriting-plans\u002FSKILL.md",[97,98],{"categoryNo":78,"categoryName":79,"taxonomyType":75,"taxonomyTypeDesc":76},{"categoryNo":81,"categoryName":82,"taxonomyType":83,"taxonomyTypeDesc":84},[100,101,87,102,103,88,104,105],"plans","writing plans","requirements","task","code","spec",{"skillNo":107,"name":108,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":114,"publishedAt":32},"01M6DT9C6PFGD86WS3HY7YE3XG","docs:write-concisely","Apply writing rules to any documentation that humans will read. Makes your writing clearer, stronger, and more professional.","https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fthinking\u002Fwrite-concisely\u002FSKILL.md",[112,113],{"categoryNo":78,"categoryName":79,"taxonomyType":75,"taxonomyTypeDesc":76},{"categoryNo":81,"categoryName":82,"taxonomyType":83,"taxonomyTypeDesc":84},[115,116,117,118,119,120,87],"docs:write concisely","write","docs","read","Rules","documentation",{"skillNo":122,"name":123,"nameZh":6,"description":124,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":125,"categories":126,"keywords":127,"publishedAt":32},"01M6DT98AWQ27P0N1CG97WAG66","kaizen:why","Iterative Five Whys root cause analysis drilling from symptoms to fundamentals","https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fthinking\u002Fwhy\u002FSKILL.md",[],[123,128,129,130,131,132,133],"why","kaizen","issue","five whys","analysis","root cause analysis",{"skillNo":135,"name":136,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":138,"categories":139,"keywords":140,"publishedAt":32},"01M6DT93EH25NAX19R3WGE1P53","verification-loop","A comprehensive verification system for Claude Code sessions.","https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fthinking\u002Fverification-loop\u002FSKILL.md",[],[26,18,25,141,104,142,143],"sessions","claude code sessions","system",{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":150,"publishedAt":32},"01M6DT90GW7Z7VCN98P9DVYSNC","verification-before-completion","Use when about to claim work is complete, fixed, or passing, before committing or creating PRs - requires running verification commands and confirming output before making any success claims; evidence before assertions always","https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fthinking\u002Fverification-before-completion\u002FSKILL.md",[],[151,18,152,90,88,153,154,155],"verification before completion","commands","evidence","claim","complete"]