๐ŸŽ Get the FREE AI Skills Starter Guide โ€” Subscribe โ†’
BytesAgainBytesAgain
๐Ÿฆ€ ClawHub

Tonic System Deploy

by @tonylnng

Software deployment workflow for systems with separate UAT and PROD environments. Use when: planning a bug fix deployment, choosing between Flow 1 (UAT-first...

Versionv1.0.0
Downloads684
Installs1
TERMINAL
clawhub install tonic-system-deploy

๐Ÿ“– About This Skill


name: tonic-system-deploy description: > Software deployment workflow for systems with separate UAT and PROD environments. Use when: planning a bug fix deployment, choosing between Flow 1 (UAT-first) and Flow 2 (PROD-first), handling emergency hotfixes, executing rollbacks, or designing automated nightly deploy pipelines. Covers approval gates, human checkpoints, system automation nodes, Telegram notifications, and rollback procedures.

tonic-system-deploy

Software Deployment Workflow โ€” Dual-Environment (UAT + PROD)


Background & Design Rationale

This skill was designed for systems where:

  • Two live environments co-exist: UAT (testing/staging) and PROD (production)
  • Versions can diverge: UAT may be ahead of PROD by several releases
  • Deployments are nightly: automated pipelines run at scheduled times
  • Human approval is mandatory: no code goes to PROD without explicit admin sign-off
  • Bugs require structured triage: severity, origin environment, and version state all affect the deploy path
  • The key insight: choosing the wrong deploy flow when versions are mismatched can introduce regressions. Flow 1 assumes parity; Flow 2 handles divergence safely.


    Prerequisites โ€” Before Choosing a Flow

    Step 0: Version Check (always do this first)

    | Question | Answer โ†’ | |----------|----------| | Are UAT and PROD on the same version? | โ†’ Flow 1 | | Is UAT ahead of PROD by any version? | โ†’ Flow 2 | | Is this a critical/high severity bug? | โ†’ Emergency Hotfix (bypass pipeline) | | Do you need to undo a bad deploy? | โ†’ Rollback |

    Version Mismatch Decision Tree

    Bug found
        โ”‚
        โ”œโ”€ severity = critical/high?
        โ”‚       โ””โ”€ YES โ†’ Emergency Hotfix (skip pipeline)
        โ”‚
        โ”œโ”€ UAT version == PROD version?
        โ”‚       โ””โ”€ YES โ†’ Flow 1
        โ”‚
        โ””โ”€ UAT version > PROD version?
                โ””โ”€ YES โ†’ Flow 2
    


    Flow 1 โ€” UAT-First (Versions Aligned)

    Scenario: Bug found in UAT or PROD when both environments run the same version. Goal: Fix โ†’ validate in UAT โ†’ promote to PROD. Result: UAT and PROD converge to same patched version.

    Timeline

    Bug reported
        โ”‚
        โ”‚ ๐Ÿง‘ HUMAN: Admin reviews + confirms bug (status: confirmed)
        โ–ผ
    [confirmed] โ€” severity: low/medium only
        โ”‚
        โ”‚ ๐Ÿค– SYSTEM: Scheduled deploy time T1 (e.g. 20:00)
        โ”‚   - AI analyses root cause + records fix plan
        โ”‚   - Deploys fix to UAT environment
        โ”‚   - Status โ†’ deployed_uat
        โ–ผ
    [deployed_uat]
        โ”‚ ๐Ÿ“ฒ Telegram: "Fix deployed to UAT. Please validate."
        โ”‚
        โ”‚ ๐Ÿง‘ HUMAN: Admin logs into UAT, validates fix
        โ”‚   - Runs through affected workflows
        โ”‚   - Confirms no regression
        โ”‚   - Clicks "Approve PROD Deploy" โ†’ status: pending_prod
        โ–ผ
    [pending_prod]
        โ”‚ ๐Ÿ“ฒ Telegram: "Queued for PROD at T2."
        โ”‚
        โ”‚ ๐Ÿค– SYSTEM: Scheduled deploy time T2 (e.g. 22:00)
        โ”‚   - Deploys fix to PROD environment
        โ”‚   - Status โ†’ deployed_prod
        โ–ผ
    [deployed_prod] โœ… Flow 1 Complete
        โ”‚ ๐Ÿ“ฒ Telegram: "Deployed to PROD. Flow 1 complete."
    

    Human Checkpoints (Flow 1)

    | Checkpoint | Who | Action | Gate Condition | |------------|-----|--------|----------------| | Confirm bug | Admin/Manager | Mark as confirmed | Bug is reproducible and valid | | UAT validation | Admin/Manager | Click "Approve PROD Deploy" | Fix works, no regression in UAT |

    Automation Nodes (Flow 1)

    | Time | Node | Input Status | Output Status | Action | |------|------|-------------|---------------|--------| | T1 | Phase 1 | confirmed/planned | deployed_uat | AI analysis + UAT deploy | | T2 | Phase 2 | pending_prod | deployed_prod | PROD deploy |


    Flow 2 โ€” PROD-First (Versions Misaligned)

    Scenario: Bug found in PROD when UAT is ahead by one or more versions. Why not Flow 1? Validating a PROD fix in a newer UAT environment risks false confidence โ€” the fix may behave differently on the older PROD codebase. Goal: Fix PROD directly โ†’ validate in PROD โ†’ cherry-pick back to UAT. Result: PROD gets the fix immediately; UAT gets it merged back after PROD validation.

    Timeline

    Bug found in PROD (UAT is ahead)
        โ”‚
        โ”‚ ๐Ÿง‘ HUMAN: Admin reviews + confirms bug
        โ”‚   - Selects: found_in_env = prod, fix_flow = flow2
        โ”‚   - Status โ†’ confirmed
        โ–ผ
    [confirmed]
        โ”‚
        โ”‚ ๐Ÿค– SYSTEM: Scheduled deploy time T1 (e.g. 20:00)
        โ”‚   - AI analyses root cause + records fix plan
        โ”‚   - Skips UAT entirely
        โ”‚   - Queues for PROD deploy โ†’ status: pending_prod
        โ–ผ
    [pending_prod]
        โ”‚ ๐Ÿ“ฒ Telegram: "PROD deploy queued for T2 (Flow 2)."
        โ”‚
        โ”‚ ๐Ÿค– SYSTEM: Scheduled deploy time T2 (e.g. 22:00)
        โ”‚   - Deploys fix to PROD
        โ”‚   - Status โ†’ deployed_prod
        โ–ผ
    [deployed_prod]
        โ”‚ ๐Ÿ“ฒ Telegram: "Deployed to PROD. Please validate PROD. Approve UAT merge when ready."
        โ”‚
        โ”‚ ๐Ÿง‘ HUMAN: Admin validates fix in PROD
        โ”‚   - Confirms fix works on production data/config
        โ”‚   - No regression in PROD workflows
        โ”‚   - Clicks "Approve Merge UAT" โ†’ status: pending_uat_merge
        โ–ผ
    [pending_uat_merge]
        โ”‚ ๐Ÿ“ฒ Telegram: "UAT merge queued for T2 tonight."
        โ”‚
        โ”‚ ๐Ÿค– SYSTEM: Next T2 cycle (22:00)
        โ”‚   - Deploys/merges fix into UAT environment
        โ”‚   - Status โ†’ uat_merged
        โ–ผ
    [uat_merged] โœ… Flow 2 Complete
        โ”‚ ๐Ÿ“ฒ Telegram: "Merged to UAT. Flow 2 complete."
    

    Human Checkpoints (Flow 2)

    | Checkpoint | Who | Action | Gate Condition | |------------|-----|--------|----------------| | Confirm bug | Admin/Manager | Mark as confirmed + select flow2 | Bug confirmed in PROD, version mismatch verified | | PROD validation | Admin/Manager | Click "Approve Merge UAT" | Fix verified in PROD, no regression |

    Automation Nodes (Flow 2)

    | Time | Node | Input Status | Output Status | Action | |------|------|-------------|---------------|--------| | T1 | Phase 1 | confirmed/planned | pending_prod | AI analysis (skip UAT) | | T2 | Phase 2a | pending_prod | deployed_prod | PROD deploy | | T2 (next) | Phase 2b | pending_uat_merge | uat_merged | UAT deploy/merge |

    Flow 2 Important Note

    > T2 deadline matters. If admin approves UAT merge before T2 on the same day, the merge runs that night. If approved after T2, it runs the following night's T2. Always communicate the cutoff time to the team.


    Status Reference

    | Status | Flow | Colour | Meaning | Next Action | |--------|------|--------|---------|-------------| | submitted | Both | Grey | Bug reported, awaiting review | Admin confirms/rejects | | confirmed | Both | Blue | Valid bug, enters pipeline | T1 auto-process | | analyzing | Both | Purple | AI analysis running (transient) | Auto โ†’ planned | | planned | Both | Indigo | AI fix plan recorded | T1 auto-deploy | | deployed_uat | Flow 1 | Cyan | UAT deployed, awaiting human validation | Admin approves PROD | | pending_prod | Both | Yellow | Queued for PROD at next T2 | T2 auto-deploy | | deployed_prod | Both | Green | PROD deployed | Flow1: done; Flow2: admin approves UAT merge | | pending_uat_merge | Flow 2 | Purple | Queued for UAT merge at next T2 | T2 auto-merge | | uat_merged | Flow 2 | Teal | UAT updated with PROD fix | Flow 2 complete โœ… | | closed | Both | Emerald | Manually closed | โ€” | | rejected | Both | Red | Not a valid bug | โ€” |


    Severity Rules

    | Severity | Pipeline Eligible? | Notes | |----------|--------------------|-------| | low | โœ… Yes | Both flows | | medium | โœ… Yes | Both flows | | high | โŒ No | Emergency Hotfix only | | critical | โŒ No | Emergency Hotfix, immediate escalation |

    > Never let high/critical bugs wait for a scheduled pipeline. Treat them as emergency hotfixes.


    Emergency Hotfix (Bypass Pipeline)

    Scenario: Critical or high severity bug in PROD. Cannot wait for scheduled T1/T2.

    Process

    Critical bug found in PROD
        โ”‚
        โ”‚ ๐Ÿง‘ HUMAN: Admin confirms severity = critical/high
        โ”‚   - Does NOT enter pipeline (no confirmed status)
        โ”‚   - Opens direct hotfix branch
        โ–ผ
    Fix developed (manually or with AI assist)
        โ”‚
        โ”‚ ๐Ÿง‘ HUMAN: Admin deploys directly to PROD
        โ”‚   - Updates bug status to deployed_prod manually
        โ”‚   - Records fix details in ai_fix_diff field
        โ–ผ
    [deployed_prod] (manual)
        โ”‚ ๐Ÿ“ฒ Telegram: "Emergency hotfix deployed to PROD. [Bug title]"
        โ”‚
        โ”‚ ๐Ÿง‘ HUMAN: Validates PROD immediately
        โ”‚
        โ””โ”€ If UAT is ahead โ†’ manually cherry-pick to UAT branch
           If UAT is same version โ†’ update UAT as well
        โ–ผ
    โœ… Emergency resolved
    

    Checklist for Emergency Hotfix

  • [ ] Severity confirmed as critical/high before bypassing pipeline
  • [ ] At least one other team member notified before deploy
  • [ ] Fix deployed and validated within agreed SLA (e.g. P1: 1 hour, P2: 4 hours)
  • [ ] Post-deploy smoke test completed (login, core workflow, affected feature)
  • [ ] Bug status updated manually in system
  • [ ] Telegram/Slack notification sent to stakeholders
  • [ ] Post-incident note added to bug record (root cause, fix summary)
  • [ ] UAT updated (cherry-pick or re-sync if needed)
  • [ ] Incident review scheduled (within 48h for P1)

  • Rollback Procedure

    Scenario: A deploy (T1 or T2) introduces a regression or new failure.

    Decision: When to Rollback

    Issue detected after deploy
        โ”‚
        โ”œโ”€ Severity: minor UX glitch โ†’ Monitor, schedule fix in next pipeline
        โ”‚
        โ”œโ”€ Severity: functional regression โ†’ Rollback immediately
        โ”‚
        โ””โ”€ Severity: data corruption risk โ†’ Rollback + escalate + engage DBA
    

    Rollback Process

    Regression detected post-deploy
        โ”‚
        โ”‚ ๐Ÿง‘ HUMAN: Admin confirms rollback needed
        โ”‚   - Record: what was deployed, when, what broke
        โ–ผ
        โ”‚ ๐Ÿค– SYSTEM or ๐Ÿง‘ HUMAN: Execute rollback
        โ”‚   - Docker: docker compose down && git checkout  && docker compose up
        โ”‚   - DB migration: apply down migration if schema changed
        โ”‚   - Status of affected bugs โ†’ revert to previous status
        โ–ผ
        โ”‚ ๐Ÿ“ฒ Telegram: "Rollback executed for [version]. Monitoring."
        โ”‚
        โ”‚ ๐Ÿง‘ HUMAN: Post-rollback validation (5โ€“10 min smoke test)
        โ”‚
        โ””โ”€ Stable โ†’ document in HISTORY + schedule proper fix
           Unstable โ†’ escalate
    

    Rollback Checklist

  • [ ] Previous working commit/tag identified (git log)
  • [ ] Rollback scope defined (frontend / backend / both / DB)
  • [ ] Affected bug statuses reverted in system
  • [ ] Smoke test completed after rollback
  • [ ] Root cause of regression documented
  • [ ] Team + stakeholders notified
  • [ ] Fix plan for the reverted change recorded

  • Scheduled Deploy Times (Reference Only)

    > โš ๏ธ These times are project-specific. Adapt per project SLA and business hours.

    | Slot | Name | Phase | Typical Window | |------|------|-------|----------------| | T1 | UAT/PROD-queue Deploy | Phase 1 | Off-peak evening (e.g. 20:00) | | T2 | PROD/UAT-merge Deploy | Phase 2 | Late evening (e.g. 22:00) |

    Principles for choosing T1/T2:

  • T1 and T2 must have enough gap for human validation (minimum 1โ€“2 hours)
  • Both should be outside business hours unless urgency demands otherwise
  • For 24/7 systems: choose lowest traffic window (check metrics)
  • Emergency hotfix: no scheduled time โ€” deploy ASAP after approval

  • Telegram Notification Templates

    Use these as the standard message format for each pipeline node.

    T1 Complete โ€” Flow 1 (UAT deployed)

    ๐Ÿ”ง Bug Fix Pipeline โ€” Flow 1 ๅทฒ้ƒจ็ฝฒ UAT

    โ€ข # [] โ€ข ...</p><p style="margin:8px 0">๐Ÿ“ฆ Release: <version></p><p style="margin:8px 0">โœ… ่ซ‹้ฉ—ๆ”ถ UAT๏ผš<UAT_URL> ็ขบ่ชๅพŒ่ซ‹้ปžใ€Œๆ‰นๅ‡†ๆŽจ PRODใ€ใ€‚ ไธ‹ๆฌก T2 ๆ™‚้–“๏ผš<T2_time> </code></pre></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">T2 Complete โ€” Flow 1 (PROD deployed)</h4> <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">๐Ÿš€ Bug Fix Pipeline โ€” Flow 1 ๅทฒ้ƒจ็ฝฒ PROD</p><p style="margin:8px 0">โ€ข #<id> [<severity>] <title></p><p style="margin:8px 0">โœ… Flow 1 ๅฎŒๆˆใ€‚UAT ่ˆ‡ PROD ็‰ˆๆœฌๅทฒๅฐ้ฝŠใ€‚ </code></pre></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">T1 Complete โ€” Flow 2 (PROD queued)</h4> <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">๐Ÿ”ง Bug Fix Pipeline โ€” Flow 2 ๅทฒๆŽ’้šŠ้ƒจ็ฝฒ PROD</p><p style="margin:8px 0">โ€ข #<id> [<severity>] <title></p><p style="margin:8px 0">โณ ไปŠๆ™š T2๏ผˆ<T2_time>๏ผ‰่‡ชๅ‹•้ƒจ็ฝฒ่‡ณ PRODใ€‚ ้ƒจ็ฝฒๅพŒ่ซ‹้ฉ—ๆ”ถ๏ผŒ็ขบ่ชๅพŒ้ปžใ€Œๆ‰นๅ‡† Merge UATใ€ใ€‚ </code></pre></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">T2 Complete โ€” Flow 2 (PROD deployed, UAT pending)</h4> <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">๐Ÿš€ Bug Fix Pipeline โ€” Flow 2 ๅทฒ้ƒจ็ฝฒ PROD</p><p style="margin:8px 0">โ€ข #<id> [<severity>] <title></p><p style="margin:8px 0">โš ๏ธ ่ซ‹็™ปๅ…ฅ PROD ้ฉ—ๆ”ถใ€‚ ็ขบ่ชๆญฃๅธธๅพŒ้ปžใ€Œๆ‰นๅ‡† Merge UATใ€ใ€‚ ไธ‹ๆฌก T2 ๆ™‚้–“๏ผš<T2_time> </code></pre></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">T2 Complete โ€” Flow 2 (UAT merged)</h4> <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">โœ… Bug Fix Pipeline โ€” Flow 2 ๅฎŒๆˆ</p><p style="margin:8px 0">โ€ข #<id> [<severity>] <title></p><p style="margin:8px 0">๐ŸŽ‰ Fix ๅทฒๅŒๆญฅ่‡ณ UATใ€‚Flow 2 ๅ…จๆต็จ‹ๅฎŒๆˆใ€‚ </code></pre></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Emergency Hotfix</h4> <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">๐Ÿšจ Emergency Hotfix โ€” <PROD/UAT></p><p style="margin:8px 0">Bug: #<id> [<severity>] <title> ๆ™‚้–“๏ผš<datetime> ้ƒจ็ฝฒไบบ๏ผš<admin></p><p style="margin:8px 0">็‹€ๆ…‹๏ผšๅทฒ้ƒจ็ฝฒ๏ผŒ่ซ‹็ซ‹ๅณ้ฉ—ๆ”ถ ้œ€่ฆ่ทŸ้€ฒ๏ผš<yes/no โ€” UAT cherry-pick needed> </code></pre></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Rollback</h4> <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">โš ๏ธ Rollback ๅŸท่กŒ โ€” <environment></p><p style="margin:8px 0">ๅŽŸๅ› ๏ผš<brief reason> ๅ›žๆปพ่‡ณ๏ผš<version/commit> ๆ™‚้–“๏ผš<datetime> ๅŸท่กŒไบบ๏ผš<admin></p><p style="margin:8px 0">็‹€ๆ…‹๏ผšๅทฒๅ›žๆปพ๏ผŒๆญฃๅœจ็›ฃๆŽง ไธ‹ไธ€ๆญฅ๏ผš<scheduled fix / investigation> </code></pre></p><p style="margin:8px 0"><hr style="border:none;border-top:1px solid #1e1e3f;margin:12px 0"></p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Adapting This Workflow to a New Project</h3></p><p style="margin:8px 0">When setting up a new project with this workflow:</p><p style="margin:8px 0">1. <strong style="color:#e5e7eb">Define T1 and T2</strong> โ€” pick times based on traffic patterns and SLA 2. <strong style="color:#e5e7eb">Set severity policy</strong> โ€” confirm which severities enter pipeline vs emergency hotfix 3. <strong style="color:#e5e7eb">Configure Telegram/notification channels</strong> โ€” who receives which notifications 4. <strong style="color:#e5e7eb">Add DB columns</strong> โ€” <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">fix_flow</code>, <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">found_in_env</code>, and status enum (see Status Reference) 5. <strong style="color:#e5e7eb">Implement Phase 1 + Phase 2 cron jobs</strong> โ€” schedule at T1 and T2 6. <strong style="color:#e5e7eb">Add approval endpoints</strong> โ€” <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">approve-prod</code>, <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">approve-uat-merge</code>, batch variants 7. <strong style="color:#e5e7eb">Add status badges + action buttons</strong> โ€” frontend must reflect all statuses clearly 8. <strong style="color:#e5e7eb">Test the full cycle in UAT first</strong> โ€” simulate a bug through both flows before going live 9. <strong style="color:#e5e7eb">Document rollback steps</strong> โ€” specific to the project's tech stack and DB</p><p style="margin:8px 0"><hr style="border:none;border-top:1px solid #1e1e3f;margin:12px 0"></p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Pre-Deploy Checklist (T1 / T2)</h3></p><p style="margin:8px 0">Run before every scheduled deploy window.</p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0">[ ] <strong style="color:#e5e7eb">DB backup confirmed</strong> โ€” last backup < 24h, or trigger manual backup now</li> <li style="color:#94a3b8;margin:3px 0">[ ] <strong style="color:#e5e7eb">Monitoring alerts active</strong> โ€” error rate, response time, queue depth dashboards open</li> <li style="color:#94a3b8;margin:3px 0">[ ] <strong style="color:#e5e7eb">On-call admin reachable</strong> โ€” someone available to respond within 15 min post-deploy</li> <li style="color:#94a3b8;margin:3px 0">[ ] <strong style="color:#e5e7eb">Change freeze check</strong> โ€” not within a freeze window (see Change Freeze Policy)</li> <li style="color:#94a3b8;margin:3px 0">[ ] <strong style="color:#e5e7eb">Rollback path clear</strong> โ€” previous working commit/tag identified and noted</li> <li style="color:#94a3b8;margin:3px 0">[ ] <strong style="color:#e5e7eb">Dependent services healthy</strong> โ€” upstream/downstream APIs, DBs, message queues OK</li> <li style="color:#94a3b8;margin:3px 0">[ ] <strong style="color:#e5e7eb">Disk + memory OK</strong> โ€” server has headroom (>20% free disk, <80% memory)</li></p><p style="margin:8px 0"><hr style="border:none;border-top:1px solid #1e1e3f;margin:12px 0"></p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Post-Deploy Monitoring</h3></p><p style="margin:8px 0">After each T1 or T2 deploy, monitor for a minimum of <strong style="color:#e5e7eb">10 minutes</strong> before standing down.</p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Metrics to Watch</h4></p><p style="margin:8px 0">| Metric | Healthy Threshold | Action if Breached | |--------|------------------|--------------------| | HTTP 5xx error rate | < 0.5% | Investigate immediately, consider rollback | | API response time (p95) | < baseline + 20% | Check DB queries, cache hit rate | | Memory usage | < 85% | Check for memory leaks in new code | | CPU usage | < 80% sustained | Check for infinite loops or expensive queries | | Login / auth success rate | > 99% | Auth regression โ€” rollback candidate | | Key business flow (e.g. task create) | Working end-to-end | Smoke test immediately post-deploy |</p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Smoke Test Sequence (2โ€“3 min)</h4></p><p style="margin:8px 0">1. Login with admin account 2. Navigate to the affected feature 3. Perform the action that triggered the bug 4. Confirm fix is working 5. Check 2โ€“3 adjacent features for regression 6. Check system logs for new errors</p><p style="margin:8px 0">> If any smoke test step fails โ†’ <strong style="color:#e5e7eb">rollback immediately</strong>, do not wait.</p><p style="margin:8px 0"><hr style="border:none;border-top:1px solid #1e1e3f;margin:12px 0"></p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Multi-Service Deploy (Cross-Service Fixes)</h3></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Scenario</strong>: A bug fix requires changes to more than one service (e.g. backend API + frontend, or service A + service B).</p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Deploy Order Principle</h4></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">Always deploy in dependency order: Backend (API) first โ†’ Frontend second Shared library โ†’ Dependent services DB migration โ†’ Application code</p><p style="margin:8px 0">Never deploy in reverse order โ€” it risks breaking in-flight requests. </code></pre></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Coordination Steps</h4></p><p style="margin:8px 0">1. <strong style="color:#e5e7eb">Map dependencies</strong> โ€” list all services affected and their dependency order 2. <strong style="color:#e5e7eb">Stage the deploys</strong> โ€” do not deploy all services simultaneously 3. <strong style="color:#e5e7eb">Validate between services</strong> โ€” after each service deploy, quick health check before next 4. <strong style="color:#e5e7eb">Single rollback plan</strong> โ€” define the exact reverse order and what to check at each step 5. <strong style="color:#e5e7eb">Lock window</strong> โ€” communicate to team that a multi-service deploy is in progress (no other deploys)</p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Status Tracking for Multi-Service</h4></p><p style="margin:8px 0">Tag the bug with affected services. Use release notes to list which service each fix applies to: <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">[backend] Fix: null pointer in task update handler [frontend] Fix: error boundary not catching API timeout </code></pre></p><p style="margin:8px 0"><hr style="border:none;border-top:1px solid #1e1e3f;margin:12px 0"></p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Change Freeze Policy</h3></p><p style="margin:8px 0">Certain periods should have <strong style="color:#e5e7eb">no scheduled pipeline deploys</strong> (T1/T2 suspended). Emergency hotfixes may still be approved by escalation.</p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Recommended Freeze Windows</h4></p><p style="margin:8px 0">| Period | Recommended Action | |--------|--------------------| | Public holidays | Suspend T1/T2. Emergency hotfix requires 2-person approval. | | Lunar New Year (3 days) | Full freeze. P1 only with CTO sign-off. | | Major client go-live week | Freeze for that client's system. Other systems normal. | | End-of-month financial close | Freeze financial modules. Other modules normal. | | Planned system maintenance | Coordinate freeze window in advance, notify stakeholders. |</p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Declaring a Freeze</h4></p><p style="margin:8px 0">1. Update HEARTBEAT.md or project config with freeze start/end dates 2. Notify team via Telegram/channel 3. Pipeline cron jobs remain scheduled but agent checks freeze flag before executing 4. Emergency hotfix during freeze: requires explicit approval from admin + one other senior (two-person rule)</p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Freeze Flag (implementation)</h4></p><p style="margin:8px 0">In pipeline config or environment variable: <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">DEPLOY_FREEZE=true # hard freeze, all deploys blocked DEPLOY_FREEZE_MODULES=financial # module-specific freeze DEPLOY_FREEZE_UNTIL=2026-02-05 # auto-lift date </code></pre></p><p style="margin:8px 0"><hr style="border:none;border-top:1px solid #1e1e3f;margin:12px 0"></p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Quick Reference Card</h3></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">FLOW SELECTION: Same version? โ†’ Flow 1 UAT ahead? โ†’ Flow 2 Critical/High? โ†’ Emergency Hotfix Freeze window? โ†’ Block (escalate for emergency)</p><p style="margin:8px 0">FLOW 1: confirmed โ†’ [T1] deployed_uat โ†’ [human] pending_prod โ†’ [T2] deployed_prod โœ… FLOW 2: confirmed โ†’ [T1] pending_prod โ†’ [T2] deployed_prod โ†’ [human] pending_uat_merge โ†’ [T2] uat_merged โœ…</p><p style="margin:8px 0">ROLLBACK: detect โ†’ confirm โ†’ execute โ†’ validate โ†’ document</p><p style="margin:8px 0">SEVERITY: low/medium โ†’ pipeline eligible high/critical โ†’ emergency hotfix only</p><p style="margin:8px 0">MULTI-SERVICE: backend first โ†’ validate โ†’ frontend โ†’ validate</p><p style="margin:8px 0">PRE-DEPLOY: backup โœ“ monitoring โœ“ on-call โœ“ freeze-check โœ“ rollback-path โœ“ POST-DEPLOY: monitor 10min โ†’ smoke test โ†’ stand down </code></pre> </p></div></section></div><div class="two-col-side"></div></div></div><script> document.querySelectorAll('.copy-btn, .script-copy-btn').forEach(btn => { btn.addEventListener('click', () => { const cmd = btn.getAttribute('data-cmd'); if (!cmd) return; navigator.clipboard.writeText(cmd).then(() => { const orig = btn.textContent; btn.textContent = 'Copied!'; setTimeout(() => btn.textContent = orig, 1500); }).catch(() => {}); }); }); </script><!--$--><!--/$--></main><footer style="background:var(--bg-primary);border-top:1px solid var(--border-secondary);margin-top:60px"><div style="border-top:1px solid var(--border-light);max-width:1200px;margin:0 auto;padding:24px 20px"><div style="display:flex;justify-content:space-between;flex-wrap:wrap;gap:24px;margin-bottom:24px"><div><div style="font-weight:700;color:var(--text-muted);margin-bottom:8px">BytesAgain</div><div style="color:var(--text-muted3);font-size:.82em;max-width:200px">Discover the best AI agent skills for your workflow.</div></div><div><div style="color:var(--text-muted);font-size:.75em;text-transform:uppercase;letter-spacing:1px;margin-bottom:10px">Explore</div><div style="margin-bottom:6px"><a href="/skills" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Skills</a></div><div style="margin-bottom:6px"><a href="/articles" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Articles</a></div><div style="margin-bottom:6px"><a href="/use-case" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Cases</a></div></div><div><div style="color:var(--text-muted);font-size:.75em;text-transform:uppercase;letter-spacing:1px;margin-bottom:10px">Company</div><div style="margin-bottom:6px"><a href="/about" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">About</a></div><div style="margin-bottom:6px"><a href="/contact" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Contact</a></div><div style="margin-bottom:6px"><a href="/privacy-policy" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Privacy Policy</a></div><div style="margin-bottom:6px"><a href="/terms" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Terms</a></div><div style="margin-bottom:6px"><a href="/feedback" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Feedback</a></div></div></div><div style="border-top:1px solid var(--border-light);padding-top:16px"><div style="color:var(--text-muted4);font-size:.8em;margin-bottom:8px">ยฉ <!-- -->2026<!-- --> BytesAgain. All rights reserved.</div><div style="color:var(--text-muted5);font-size:.75em;line-height:1.6;max-width:720px">BytesAgain is an independent skill directory. We index and link to third-party content (ClawHub, GitHub, LobeHub, Dify, etc.) for informational purposes only. All trademarks, skill names, and content are the property of their respective owners. BytesAgain does not claim ownership of any indexed content.</div></div></div></footer><button style="position:fixed;bottom:28px;right:28px;z-index:1000;width:48px;height:48px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#667eea,#00d4ff);color:#fff;font-size:1.3em;box-shadow:0 4px 20px #667eea66;display:flex;align-items:center;justify-content:center;transition:transform .2s">๐Ÿ’ฌ</button><script src="/_next/static/chunks/0ze4gu236oq96.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[62894,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"LangProvider\"]\n3:I[89220,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"ThemeProvider\"]\n4:I[16988,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\ne:I[68027,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\",1]\n:HL[\"/_next/static/chunks/051nc0vy_6.rl.css?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"style\"]\n:HL[\"/_next/static/media/caa3a2e1cccd8315-s.p.09~u27dqhyhd6.woff2?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n5:Td5e,"])</script><script>self.__next_f.push([1,"[{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"BytesAgain\",\"url\":\"https://bytesagain.com\",\"description\":\"Search 60,000+ verified AI agent skills via MCP API or REST. Supports 7 languages. Free, no auth required.\",\"inLanguage\":[\"en\",\"zh\",\"es\",\"fr\",\"de\",\"ja\",\"ko\"],\"potentialAction\":{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https://bytesagain.com/skills?q={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}},{\"@context\":\"https://schema.org\",\"@type\":\"Organization\",\"name\":\"BytesAgain\",\"url\":\"https://bytesagain.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://bytesagain.com/og-image.png\"},\"description\":\"AI agent skill directory. Search 60,000+ skills, 1,000+ use cases, and community requests.\",\"foundingDate\":\"2026\",\"foundingLocation\":{\"@type\":\"Place\",\"name\":\"Global\"},\"sameAs\":[\"https://x.com/bytesagain\",\"https://github.com/bytesagain/ai-skills\",\"https://clawhub.ai/profile/bytesagain\"],\"contactPoint\":{\"@type\":\"ContactPoint\",\"email\":\"hello@bytesagain.com\",\"contactType\":\"customer support\"},\"numberOfEmployees\":{\"@type\":\"QuantitativeValue\",\"value\":1}},{\"@context\":\"https://schema.org\",\"@type\":\"WebApplication\",\"name\":\"BytesAgain AI Skills Search\",\"url\":\"https://bytesagain.com\",\"applicationCategory\":\"DeveloperApplication\",\"operatingSystem\":\"Web\",\"description\":\"Search engine and MCP API for 60,000+ AI agent skills. Semantic search, role recommendations, and use case packs.\",\"offers\":{\"@type\":\"Offer\",\"price\":\"0\",\"priceCurrency\":\"USD\"},\"featureList\":[\"Search 60,000+ AI agent skills\",\"Role-based recommendations for developers, creators, and traders\",\"1,000+ curated use case packs\",\"Free MCP API and REST API\",\"Multi-language search (EN, ZH, ES, FR, DE, JA, KO)\"],\"potentialAction\":{\"@type\":\"SearchAction\",\"target\":\"https://bytesagain.com/skills?q={search_term_string}\",\"query-input\":\"required name=search_term_string\"},\"dateModified\":\"2026-07-17\"},{\"@context\":\"https://schema.org\",\"@type\":\"FAQPage\",\"mainEntity\":[{\"@type\":\"Question\",\"name\":\"What is BytesAgain?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"BytesAgain is a curated directory of 60,000+ AI agent skills from ClawHub, GitHub, LobeHub, and Dify. Search skills by keyword in 7 languages, browse by role (developer, creator, trader, marketer) or by use case.\"}},{\"@type\":\"Question\",\"name\":\"How do I find AI skills on BytesAgain?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Use the search bar on BytesAgain.com to search by keyword in 7 languages. You can also browse by role (developer, creator, trader, marketer) or by use case. Each skill shows install instructions for Claude, Cursor, OpenClaw, Continue, and more.\"}},{\"@type\":\"Question\",\"name\":\"Is BytesAgain free?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes, BytesAgain is completely free. No registration required for searching skills. The MCP API is also free with rate limits.\"}},{\"@type\":\"Question\",\"name\":\"Does BytesAgain have an API for AI agents?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes! BytesAgain provides a free MCP SSE endpoint at /api/mcp/sse for AI agents, plus a REST API at /api/mcp?action=search\u0026q=\u003cquery\u003e. No authentication needed.\"}},{\"@type\":\"Question\",\"name\":\"Can I request a new AI skill on BytesAgain?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes! Visit the Requests page on BytesAgain.com to submit a skill request. Your request will be visible to the community and notified to the site admin.\"}}]}]"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"skill\",\"tonic-system-deploy\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"skill\",{\"children\":[[\"slug\",\"tonic-system-deploy\",\"d\",null],{\"children\":[\"__PAGE__\",{}]}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/051nc0vy_6.rl.css?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"link\",null,{\"rel\":\"llms\",\"href\":\"/llms.txt\"}],[\"$\",\"link\",null,{\"rel\":\"llms-full\",\"href\":\"/llms-full.txt\"}],[\"$\",\"script\",null,{\"async\":true,\"src\":\"https://www.googletagmanager.com/gtag/js?id=G-3C1MM9FWYF\"}],[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n window.dataLayer = window.dataLayer || [];\\n function gtag(){dataLayer.push(arguments);}\\n gtag('js', new Date());\\n gtag('config', 'G-3C1MM9FWYF');\\n \"}}]]}],[\"$\",\"body\",null,{\"className\":\"geist_9e050971-module__05dp7a__className\",\"style\":{\"margin\":0},\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[[\"$\",\"div\",null,{\"style\":{\"width\":\"100%\",\"background\":\"var(--bg-subscribe)\",\"borderBottom\":\"1px solid var(--border-primary)\",\"padding\":\"8px 20px\",\"textAlign\":\"center\",\"fontSize\":\".82em\",\"color\":\"#818cf8\"},\"children\":[\"๐ŸŽ \",[\"$\",\"strong\",null,{\"style\":{\"color\":\"var(--text-primary)\"},\"children\":\"Get the FREE AI Skills Starter Guide\"}],\" โ€” \",[\"$\",\"a\",null,{\"href\":\"/register\",\"style\":{\"color\":\"#00d4ff\",\"textDecoration\":\"underline\"},\"children\":\"Subscribe โ†’\"}]]}],[\"$\",\"$L4\",null,{}],[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"$5\"}}],\"$L6\",\"$L7\",\"$L8\"]}]}]}]]}]]}],{\"children\":[\"$L9\",{\"children\":[\"$La\",{\"children\":[\"$Lb\",{},null,false,null]},null,false,\"$@c\"]},null,false,\"$@c\"]},null,false,null],\"$Ld\",false]],\"m\":\"$undefined\",\"G\":[\"$e\",[\"$Lf\"]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"10:I[39756,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n11:I[37457,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n12:I[22016,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0ka051yepewro.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"\"]\n13:I[90940,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n14:I[16397,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n16:I[97367,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"OutletBoundary\"]\n17:\"$Sreact.suspense\"\n1a:I[97367,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"ViewportBoundary\"]\n1c:I[97367,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"MetadataBoundary\"]\n"])</script><script>self.__next_f.push([1,"6:[\"$\",\"main\",null,{\"children\":[\"$\",\"$L10\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L11\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"main\",null,{\"style\":{\"minHeight\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"background\":\"#050611\",\"color\":\"#e5e7eb\"},\"children\":[[\"$\",\"style\",null,{\"children\":\"\\n .nf-box { text-align: center; padding: 60px 32px; }\\n .nf-code { font-size: 6rem; font-weight: 900; color: #22d3ee; line-height: 1; margin: 0; }\\n .nf-title { font-size: 1.8rem; font-weight: 800; margin: 12px 0 8px; }\\n .nf-desc { color: var(--text-muted2); font-size: 1rem; margin-bottom: 32px; max-width: 440px; }\\n .nf-link { display: inline-block; padding: 12px 28px; background: linear-gradient(135deg,#34d399,#22d3ee); color: #000; font-weight: 900; border-radius: 12px; text-decoration: none; }\\n \"}],[\"$\",\"div\",null,{\"className\":\"nf-box\",\"children\":[[\"$\",\"p\",null,{\"className\":\"nf-code\",\"children\":\"404\"}],[\"$\",\"h1\",null,{\"className\":\"nf-title\",\"children\":\"Page Not Found\"}],[\"$\",\"p\",null,{\"className\":\"nf-desc\",\"children\":\"The skill or page you're looking for doesn't exist or has been moved.\"}],[\"$\",\"$L12\",null,{\"className\":\"nf-link\",\"href\":\"/\",\"children\":\"Back to BytesAgain\"}]]}]]}],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]\n"])</script><script>self.__next_f.push([1,"7:[\"$\",\"$L13\",null,{}]\n8:[\"$\",\"$L14\",null,{}]\n9:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L10\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L11\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\na:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L10\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L11\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\nb:[\"$\",\"$1\",\"c\",{\"children\":[\"$L15\",[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/12w5ognupk9fb.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L16\",null,{\"children\":[\"$\",\"$17\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@18\"}]}]]}]\n19:[]\nc:\"$W19\"\nd:[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L1a\",null,{\"children\":\"$L1b\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L1c\",null,{\"children\":[\"$\",\"$17\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L1d\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}]\nf:[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/051nc0vy_6.rl.css?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]\n"])</script><script>self.__next_f.push([1,"1b:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"1e:I[27201,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"IconMark\"]\n18:null\n"])</script><script>self.__next_f.push([1,"1d:[[\"$\",\"title\",\"0\",{\"children\":\"Tonic System Deploy โ€” AI Agent Skill | BytesAgain | BytesAgain\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Software deployment workflow for systems with separate UAT and PROD environments. Use when: planning a bug fix deployment, choosing between Flow 1 (UAT-first...\"}],[\"$\",\"meta\",\"2\",{\"name\":\"robots\",\"content\":\"index, follow\"}],[\"$\",\"meta\",\"3\",{\"name\":\"googlebot\",\"content\":\"index, follow, max-image-preview:large, max-snippet:-1\"}],[\"$\",\"meta\",\"4\",{\"name\":\"llms-txt\",\"content\":\"https://bytesagain.com/llms.txt\"}],[\"$\",\"meta\",\"5\",{\"name\":\"llms-full-txt\",\"content\":\"https://bytesagain.com/llms-full.txt\"}],[\"$\",\"link\",\"6\",{\"rel\":\"canonical\",\"href\":\"https://bytesagain.com/skill/tonic-system-deploy\"}],[\"$\",\"meta\",\"7\",{\"name\":\"baidu-site-verification\",\"content\":\"codeva-0evUqX1TFs\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:title\",\"content\":\"Tonic System Deploy โ€” AI Agent Skill | BytesAgain\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:description\",\"content\":\"Software deployment workflow for systems with separate UAT and PROD environments. Use when: planning a bug fix deployment, choosing between Flow 1 (UAT-first...\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:url\",\"content\":\"https://bytesagain.com/skill/tonic-system-deploy\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:site_name\",\"content\":\"BytesAgain\"}],[\"$\",\"meta\",\"12\",{\"property\":\"og:image\",\"content\":\"https://bytesagain.com/social-preview.png\"}],[\"$\",\"meta\",\"13\",{\"property\":\"og:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"14\",{\"property\":\"og:image:height\",\"content\":\"630\"}],[\"$\",\"meta\",\"15\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"16\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"17\",{\"name\":\"twitter:title\",\"content\":\"Tonic System Deploy โ€” AI Agent Skill | BytesAgain\"}],[\"$\",\"meta\",\"18\",{\"name\":\"twitter:description\",\"content\":\"Software deployment workflow for systems with separate UAT and PROD environments. Use when: planning a bug fix deployment, choosing between Flow 1 (UAT-first...\"}],[\"$\",\"meta\",\"19\",{\"name\":\"twitter:image\",\"content\":\"https://bytesagain.com/social-preview.png\"}],[\"$\",\"meta\",\"20\",{\"name\":\"twitter:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"21\",{\"name\":\"twitter:image:height\",\"content\":\"630\"}],[\"$\",\"link\",\"22\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0x3dzn~oxb6tn.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$L1e\",\"23\",{}]]\n"])</script><script>self.__next_f.push([1,"1f:T1562,"])</script><script>self.__next_f.push([1,"\n .skill-page { max-width: 1100px; margin: 0 auto; padding: 32px 20px 80px; }\n .two-col { display: flex; gap: 32px; align-items: flex-start; }\n .two-col-main { flex: 1; min-width: 0; }\n .two-col-side { width: 300px; flex-shrink: 0; }\n @media (max-width: 860px) {\n .two-col { flex-direction: column; }\n .two-col-side { width: 100%; }\n }\n .breadcrumb { font-size: .82em; color: var(--text-muted2); margin-bottom: 28px; }\n .breadcrumb a { color: #818cf8; text-decoration: none; }\n .breadcrumb a:hover { text-decoration: underline; }\n .skill-card { background: var(--bg-card); border: 1px solid var(--border-card); border-radius: 20px; padding: 28px; margin-bottom: 24px; }\n .skill-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 20px; flex-wrap: wrap; }\n .skill-badges { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }\n .skill-top-actions { display: flex; align-items: center; gap: 10px; margin-left: auto; }\n .badge { display: inline-flex; align-items: center; gap: 5px; font-size: .75em; font-weight: 600; padding: 4px 12px; border-radius: 999px; border: 1px solid transparent; }\n .skill-title { font-size: 1.6em; font-weight: 800; color: var(--text-primary); margin: 0 0 4px; line-height: 1.2; }\n .skill-owner { font-size: .82em; color: var(--text-muted2); margin: 0 0 14px; }\n .skill-owner span { color: #818cf8; }\n .skill-desc { font-size: .92em; color: var(--text-secondary); line-height: 1.65; margin: 0 0 16px; }\n .skill-meta { display: flex; gap: 16px; flex-wrap: wrap; margin-bottom: 18px; padding-bottom: 16px; border-bottom: 1px solid var(--border-card); }\n .meta-item { display: flex; flex-direction: column; gap: 2px; }\n .meta-label { font-size: .7em; color: var(--text-muted5); text-transform: uppercase; letter-spacing: 1px; font-weight: 600; }\n .meta-value { font-size: .92em; color: var(--text-muted2); font-weight: 600; }\n .tags-row { display: flex; gap: 6px; flex-wrap: wrap; }\n .tag { font-size: .75em; color: #6366f1; background: #6366f115; border: 1px solid #6366f130; border-radius: 6px; padding: 3px 10px; text-decoration: none; }\n .tag:hover { background: #6366f125; }\n .install-box { background: var(--bg-deep); border: 1px solid var(--border-card); border-radius: 12px; overflow: hidden; margin-bottom: 24px; }\n .install-header { display: flex; align-items: center; justify-content: space-between; padding: 10px 16px; border-bottom: 1px solid var(--border-card); }\n .install-dots { display: flex; gap: 6px; }\n .dot { width: 10px; height: 10px; border-radius: 50%; }\n .install-label { font-size: .72em; color: var(--text-muted5); font-family: monospace; letter-spacing: 1px; }\n .install-body { padding: 16px 20px; display: flex; align-items: center; justify-content: space-between; gap: 12px; }\n .install-cmd { color: var(--text-code);\n font-family: 'Courier New', monospace; font-size: 1em; }\n .copy-btn { font-size: .75em; color: #6366f1; background: #6366f115; border: 1px solid #6366f130; border-radius: 6px; padding: 5px 12px; cursor: pointer; white-space: nowrap; transition: all .15s; }\n .copy-btn:hover { background: #6366f125; }\n .btn-secondary { display: inline-flex; align-items: center; gap: 8px; padding: 13px 24px; background: transparent; border: 1px solid var(--border-card); border-radius: 10px; color: #6b7280; text-decoration: none; font-weight: 600; font-size: .95em; transition: all .15s; }\n .btn-secondary:hover { border-color: #818cf8; color: #818cf8; }\n .ours-badge { display: inline-flex; align-items: center; gap: 6px; font-size: .72em; font-weight: 700; color: #22d3ee; background: #22d3ee10; border: 1px solid #22d3ee30; border-radius: 999px; padding: 4px 14px; }\n .section-card { background: var(--bg-card); border: 1px solid var(--border-card); border-radius: 16px; padding: 22px 24px; margin-bottom: 20px; }\n .section-title { color: var(--text-primary); font-size: 1.08em; font-weight: 800; margin: 0 0 12px; display: flex; align-items: center; gap: 8px; }\n /* Script box */\n .script-header { display: flex; align-items: center; justify-content: space-between; padding: 8px 14px; background: var(--bg-input); border-bottom: 1px solid var(--border-card); }\n .script-filename { font-size: .72em; color: var(--text-muted2); font-family: 'Courier New', monospace; }\n .script-copy-btn { font-size: .72em; color: #6366f1; background: none; border: 1px solid #6366f130; border-radius: 4px; padding: 2px 10px; cursor: pointer; }\n .script-copy-btn:hover { background: #6366f115; }\n .script-body { padding: 14px 16px; font-family: 'Courier New', monospace; font-size: .82em; line-height: 1.6; color: var(--text-code); overflow-x: auto; max-height: 420px; overflow-y: auto; white-space: pre; }\n /* Articles */\n .article-card { display: block; background: var(--bg-secondary); border: 1px solid var(--border-primary); border-radius: 10px; padding: 14px 16px; text-decoration: none; transition: border-color .15s; }\n .article-card:hover { border-color: #6366f1; }\n @media (max-width: 600px) {\n .skill-card { padding: 20px; }\n .skill-title { font-size: 1.5em; }\n }\n "])</script><script>self.__next_f.push([1,"15:[[\"$\",\"style\",null,{\"children\":\"$1f\"}],\"$L20\",\"$L21\"]\n"])</script><script>self.__next_f.push([1,"22:I[78297,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/12w5ognupk9fb.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n23:T8872,"])</script><script>self.__next_f.push([1,"\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\nname: tonic-system-deploy\ndescription: \u003e\n Software deployment workflow for systems with separate UAT and PROD environments.\n Use when: planning a bug fix deployment, choosing between Flow 1 (UAT-first) and\n Flow 2 (PROD-first), handling emergency hotfixes, executing rollbacks, or designing\n automated nightly deploy pipelines. Covers approval gates, human checkpoints,\n system automation nodes, Telegram notifications, and rollback procedures.\n\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003etonic-system-deploy\u003c/h2\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eSoftware Deployment Workflow โ€” Dual-Environment (UAT + PROD)\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eBackground \u0026 Design Rationale\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eThis skill was designed for systems where:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eTwo live environments co-exist\u003c/strong\u003e: UAT (testing/staging) and PROD (production)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eVersions can diverge\u003c/strong\u003e: UAT may be ahead of PROD by several releases\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eDeployments are nightly\u003c/strong\u003e: automated pipelines run at scheduled times\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eHuman approval is mandatory\u003c/strong\u003e: no code goes to PROD without explicit admin sign-off\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eBugs require structured triage\u003c/strong\u003e: severity, origin environment, and version state all affect the deploy path\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eThe key insight: \u003cstrong style=\"color:#e5e7eb\"\u003echoosing the wrong deploy flow when versions are mismatched can introduce regressions\u003c/strong\u003e. Flow 1 assumes parity; Flow 2 handles divergence safely.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003ePrerequisites โ€” Before Choosing a Flow\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eStep 0: Version Check (always do this first)\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Question | Answer โ†’ |\n|----------|----------|\n| Are UAT and PROD on the same version? | โ†’ \u003cstrong style=\"color:#e5e7eb\"\u003eFlow 1\u003c/strong\u003e |\n| Is UAT ahead of PROD by any version? | โ†’ \u003cstrong style=\"color:#e5e7eb\"\u003eFlow 2\u003c/strong\u003e |\n| Is this a critical/high severity bug? | โ†’ \u003cstrong style=\"color:#e5e7eb\"\u003eEmergency Hotfix\u003c/strong\u003e (bypass pipeline) |\n| Do you need to undo a bad deploy? | โ†’ \u003cstrong style=\"color:#e5e7eb\"\u003eRollback\u003c/strong\u003e |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eVersion Mismatch Decision Tree\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003eBug found\n โ”‚\n โ”œโ”€ severity = critical/high?\n โ”‚ โ””โ”€ YES โ†’ Emergency Hotfix (skip pipeline)\n โ”‚\n โ”œโ”€ UAT version == PROD version?\n โ”‚ โ””โ”€ YES โ†’ Flow 1\n โ”‚\n โ””โ”€ UAT version \u003e PROD version?\n โ””โ”€ YES โ†’ Flow 2\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eFlow 1 โ€” UAT-First (Versions Aligned)\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eScenario\u003c/strong\u003e: Bug found in UAT or PROD when both environments run the same version.\n\u003cstrong style=\"color:#e5e7eb\"\u003eGoal\u003c/strong\u003e: Fix โ†’ validate in UAT โ†’ promote to PROD.\n\u003cstrong style=\"color:#e5e7eb\"\u003eResult\u003c/strong\u003e: UAT and PROD converge to same patched version.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eTimeline\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003eBug reported\n โ”‚\n โ”‚ ๐Ÿง‘ HUMAN: Admin reviews + confirms bug (status: confirmed)\n โ–ผ\n[confirmed] โ€” severity: low/medium only\n โ”‚\n โ”‚ ๐Ÿค– SYSTEM: Scheduled deploy time T1 (e.g. 20:00)\n โ”‚ - AI analyses root cause + records fix plan\n โ”‚ - Deploys fix to UAT environment\n โ”‚ - Status โ†’ deployed_uat\n โ–ผ\n[deployed_uat]\n โ”‚ ๐Ÿ“ฒ Telegram: \"Fix deployed to UAT. Please validate.\"\n โ”‚\n โ”‚ ๐Ÿง‘ HUMAN: Admin logs into UAT, validates fix\n โ”‚ - Runs through affected workflows\n โ”‚ - Confirms no regression\n โ”‚ - Clicks \"Approve PROD Deploy\" โ†’ status: pending_prod\n โ–ผ\n[pending_prod]\n โ”‚ ๐Ÿ“ฒ Telegram: \"Queued for PROD at T2.\"\n โ”‚\n โ”‚ ๐Ÿค– SYSTEM: Scheduled deploy time T2 (e.g. 22:00)\n โ”‚ - Deploys fix to PROD environment\n โ”‚ - Status โ†’ deployed_prod\n โ–ผ\n[deployed_prod] โœ… Flow 1 Complete\n โ”‚ ๐Ÿ“ฒ Telegram: \"Deployed to PROD. Flow 1 complete.\"\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eHuman Checkpoints (Flow 1)\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Checkpoint | Who | Action | Gate Condition |\n|------------|-----|--------|----------------|\n| Confirm bug | Admin/Manager | Mark as confirmed | Bug is reproducible and valid |\n| UAT validation | Admin/Manager | Click \"Approve PROD Deploy\" | Fix works, no regression in UAT |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eAutomation Nodes (Flow 1)\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Time | Node | Input Status | Output Status | Action |\n|------|------|-------------|---------------|--------|\n| T1 | Phase 1 | confirmed/planned | deployed_uat | AI analysis + UAT deploy |\n| T2 | Phase 2 | pending_prod | deployed_prod | PROD deploy |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eFlow 2 โ€” PROD-First (Versions Misaligned)\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eScenario\u003c/strong\u003e: Bug found in PROD when UAT is ahead by one or more versions.\n\u003cstrong style=\"color:#e5e7eb\"\u003eWhy not Flow 1?\u003c/strong\u003e Validating a PROD fix in a newer UAT environment risks false confidence โ€” the fix may behave differently on the older PROD codebase.\n\u003cstrong style=\"color:#e5e7eb\"\u003eGoal\u003c/strong\u003e: Fix PROD directly โ†’ validate in PROD โ†’ cherry-pick back to UAT.\n\u003cstrong style=\"color:#e5e7eb\"\u003eResult\u003c/strong\u003e: PROD gets the fix immediately; UAT gets it merged back after PROD validation.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eTimeline\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003eBug found in PROD (UAT is ahead)\n โ”‚\n โ”‚ ๐Ÿง‘ HUMAN: Admin reviews + confirms bug\n โ”‚ - Selects: found_in_env = prod, fix_flow = flow2\n โ”‚ - Status โ†’ confirmed\n โ–ผ\n[confirmed]\n โ”‚\n โ”‚ ๐Ÿค– SYSTEM: Scheduled deploy time T1 (e.g. 20:00)\n โ”‚ - AI analyses root cause + records fix plan\n โ”‚ - Skips UAT entirely\n โ”‚ - Queues for PROD deploy โ†’ status: pending_prod\n โ–ผ\n[pending_prod]\n โ”‚ ๐Ÿ“ฒ Telegram: \"PROD deploy queued for T2 (Flow 2).\"\n โ”‚\n โ”‚ ๐Ÿค– SYSTEM: Scheduled deploy time T2 (e.g. 22:00)\n โ”‚ - Deploys fix to PROD\n โ”‚ - Status โ†’ deployed_prod\n โ–ผ\n[deployed_prod]\n โ”‚ ๐Ÿ“ฒ Telegram: \"Deployed to PROD. Please validate PROD. Approve UAT merge when ready.\"\n โ”‚\n โ”‚ ๐Ÿง‘ HUMAN: Admin validates fix in PROD\n โ”‚ - Confirms fix works on production data/config\n โ”‚ - No regression in PROD workflows\n โ”‚ - Clicks \"Approve Merge UAT\" โ†’ status: pending_uat_merge\n โ–ผ\n[pending_uat_merge]\n โ”‚ ๐Ÿ“ฒ Telegram: \"UAT merge queued for T2 tonight.\"\n โ”‚\n โ”‚ ๐Ÿค– SYSTEM: Next T2 cycle (22:00)\n โ”‚ - Deploys/merges fix into UAT environment\n โ”‚ - Status โ†’ uat_merged\n โ–ผ\n[uat_merged] โœ… Flow 2 Complete\n โ”‚ ๐Ÿ“ฒ Telegram: \"Merged to UAT. Flow 2 complete.\"\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eHuman Checkpoints (Flow 2)\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Checkpoint | Who | Action | Gate Condition |\n|------------|-----|--------|----------------|\n| Confirm bug | Admin/Manager | Mark as confirmed + select flow2 | Bug confirmed in PROD, version mismatch verified |\n| PROD validation | Admin/Manager | Click \"Approve Merge UAT\" | Fix verified in PROD, no regression |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eAutomation Nodes (Flow 2)\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Time | Node | Input Status | Output Status | Action |\n|------|------|-------------|---------------|--------|\n| T1 | Phase 1 | confirmed/planned | pending_prod | AI analysis (skip UAT) |\n| T2 | Phase 2a | pending_prod | deployed_prod | PROD deploy |\n| T2 (next) | Phase 2b | pending_uat_merge | uat_merged | UAT deploy/merge |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eFlow 2 Important Note\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003e \u003cstrong style=\"color:#e5e7eb\"\u003eT2 deadline matters.\u003c/strong\u003e If admin approves UAT merge before T2 on the same day, the merge runs that night. If approved after T2, it runs the following night's T2. Always communicate the cutoff time to the team.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eStatus Reference\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Status | Flow | Colour | Meaning | Next Action |\n|--------|------|--------|---------|-------------|\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003esubmitted\u003c/code\u003e | Both | Grey | Bug reported, awaiting review | Admin confirms/rejects |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003econfirmed\u003c/code\u003e | Both | Blue | Valid bug, enters pipeline | T1 auto-process |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eanalyzing\u003c/code\u003e | Both | Purple | AI analysis running (transient) | Auto โ†’ planned |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eplanned\u003c/code\u003e | Both | Indigo | AI fix plan recorded | T1 auto-deploy |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edeployed_uat\u003c/code\u003e | Flow 1 | Cyan | UAT deployed, awaiting human validation | Admin approves PROD |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epending_prod\u003c/code\u003e | Both | Yellow | Queued for PROD at next T2 | T2 auto-deploy |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edeployed_prod\u003c/code\u003e | Both | Green | PROD deployed | Flow1: done; Flow2: admin approves UAT merge |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epending_uat_merge\u003c/code\u003e | Flow 2 | Purple | Queued for UAT merge at next T2 | T2 auto-merge |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003euat_merged\u003c/code\u003e | Flow 2 | Teal | UAT updated with PROD fix | Flow 2 complete โœ… |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eclosed\u003c/code\u003e | Both | Emerald | Manually closed | โ€” |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003erejected\u003c/code\u003e | Both | Red | Not a valid bug | โ€” |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eSeverity Rules\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Severity | Pipeline Eligible? | Notes |\n|----------|--------------------|-------|\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003elow\u003c/code\u003e | โœ… Yes | Both flows |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003emedium\u003c/code\u003e | โœ… Yes | Both flows |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ehigh\u003c/code\u003e | โŒ No | Emergency Hotfix only |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ecritical\u003c/code\u003e | โŒ No | Emergency Hotfix, immediate escalation |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003e Never let high/critical bugs wait for a scheduled pipeline. Treat them as emergency hotfixes.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eEmergency Hotfix (Bypass Pipeline)\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eScenario\u003c/strong\u003e: Critical or high severity bug in PROD. Cannot wait for scheduled T1/T2.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eProcess\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003eCritical bug found in PROD\n โ”‚\n โ”‚ ๐Ÿง‘ HUMAN: Admin confirms severity = critical/high\n โ”‚ - Does NOT enter pipeline (no confirmed status)\n โ”‚ - Opens direct hotfix branch\n โ–ผ\nFix developed (manually or with AI assist)\n โ”‚\n โ”‚ ๐Ÿง‘ HUMAN: Admin deploys directly to PROD\n โ”‚ - Updates bug status to deployed_prod manually\n โ”‚ - Records fix details in ai_fix_diff field\n โ–ผ\n[deployed_prod] (manual)\n โ”‚ ๐Ÿ“ฒ Telegram: \"Emergency hotfix deployed to PROD. [Bug title]\"\n โ”‚\n โ”‚ ๐Ÿง‘ HUMAN: Validates PROD immediately\n โ”‚\n โ””โ”€ If UAT is ahead โ†’ manually cherry-pick to UAT branch\n If UAT is same version โ†’ update UAT as well\n โ–ผ\nโœ… Emergency resolved\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eChecklist for Emergency Hotfix\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] Severity confirmed as critical/high before bypassing pipeline\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] At least one other team member notified before deploy\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] Fix deployed and validated within agreed SLA (e.g. P1: 1 hour, P2: 4 hours)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] Post-deploy smoke test completed (login, core workflow, affected feature)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] Bug status updated manually in system\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] Telegram/Slack notification sent to stakeholders\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] Post-incident note added to bug record (root cause, fix summary)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] UAT updated (cherry-pick or re-sync if needed)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] Incident review scheduled (within 48h for P1)\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eRollback Procedure\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eScenario\u003c/strong\u003e: A deploy (T1 or T2) introduces a regression or new failure.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eDecision: When to Rollback\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003eIssue detected after deploy\n โ”‚\n โ”œโ”€ Severity: minor UX glitch โ†’ Monitor, schedule fix in next pipeline\n โ”‚\n โ”œโ”€ Severity: functional regression โ†’ Rollback immediately\n โ”‚\n โ””โ”€ Severity: data corruption risk โ†’ Rollback + escalate + engage DBA\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eRollback Process\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003eRegression detected post-deploy\n โ”‚\n โ”‚ ๐Ÿง‘ HUMAN: Admin confirms rollback needed\n โ”‚ - Record: what was deployed, when, what broke\n โ–ผ\n โ”‚ ๐Ÿค– SYSTEM or ๐Ÿง‘ HUMAN: Execute rollback\n โ”‚ - Docker: docker compose down \u0026\u0026 git checkout \u003cprev_tag\u003e \u0026\u0026 docker compose up\n โ”‚ - DB migration: apply down migration if schema changed\n โ”‚ - Status of affected bugs โ†’ revert to previous status\n โ–ผ\n โ”‚ ๐Ÿ“ฒ Telegram: \"Rollback executed for [version]. Monitoring.\"\n โ”‚\n โ”‚ ๐Ÿง‘ HUMAN: Post-rollback validation (5โ€“10 min smoke test)\n โ”‚\n โ””โ”€ Stable โ†’ document in HISTORY + schedule proper fix\n Unstable โ†’ escalate\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eRollback Checklist\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] Previous working commit/tag identified (git log)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] Rollback scope defined (frontend / backend / both / DB)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] Affected bug statuses reverted in system\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] Smoke test completed after rollback\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] Root cause of regression documented\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] Team + stakeholders notified\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] Fix plan for the reverted change recorded\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eScheduled Deploy Times (Reference Only)\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003e โš ๏ธ These times are project-specific. Adapt per project SLA and business hours.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Slot | Name | Phase | Typical Window |\n|------|------|-------|----------------|\n| T1 | UAT/PROD-queue Deploy | Phase 1 | Off-peak evening (e.g. 20:00) |\n| T2 | PROD/UAT-merge Deploy | Phase 2 | Late evening (e.g. 22:00) |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003ePrinciples for choosing T1/T2:\u003c/strong\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eT1 and T2 must have enough gap for human validation (minimum 1โ€“2 hours)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eBoth should be outside business hours unless urgency demands otherwise\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eFor 24/7 systems: choose lowest traffic window (check metrics)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eEmergency hotfix: no scheduled time โ€” deploy ASAP after approval\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eTelegram Notification Templates\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eUse these as the standard message format for each pipeline node.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eT1 Complete โ€” Flow 1 (UAT deployed)\u003c/h4\u003e\n\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e๐Ÿ”ง Bug Fix Pipeline โ€” Flow 1 ๅทฒ้ƒจ็ฝฒ UAT\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eโ€ข #\u003cid\u003e [\u003cseverity\u003e] \u003ctitle\u003e\nโ€ข ...\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e๐Ÿ“ฆ Release: \u003cversion\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eโœ… ่ซ‹้ฉ—ๆ”ถ UAT๏ผš\u003cUAT_URL\u003e\n็ขบ่ชๅพŒ่ซ‹้ปžใ€Œๆ‰นๅ‡†ๆŽจ PRODใ€ใ€‚\nไธ‹ๆฌก T2 ๆ™‚้–“๏ผš\u003cT2_time\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eT2 Complete โ€” Flow 1 (PROD deployed)\u003c/h4\u003e\n\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e๐Ÿš€ Bug Fix Pipeline โ€” Flow 1 ๅทฒ้ƒจ็ฝฒ PROD\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eโ€ข #\u003cid\u003e [\u003cseverity\u003e] \u003ctitle\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eโœ… Flow 1 ๅฎŒๆˆใ€‚UAT ่ˆ‡ PROD ็‰ˆๆœฌๅทฒๅฐ้ฝŠใ€‚\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eT1 Complete โ€” Flow 2 (PROD queued)\u003c/h4\u003e\n\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e๐Ÿ”ง Bug Fix Pipeline โ€” Flow 2 ๅทฒๆŽ’้šŠ้ƒจ็ฝฒ PROD\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eโ€ข #\u003cid\u003e [\u003cseverity\u003e] \u003ctitle\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eโณ ไปŠๆ™š T2๏ผˆ\u003cT2_time\u003e๏ผ‰่‡ชๅ‹•้ƒจ็ฝฒ่‡ณ PRODใ€‚\n้ƒจ็ฝฒๅพŒ่ซ‹้ฉ—ๆ”ถ๏ผŒ็ขบ่ชๅพŒ้ปžใ€Œๆ‰นๅ‡† Merge UATใ€ใ€‚\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eT2 Complete โ€” Flow 2 (PROD deployed, UAT pending)\u003c/h4\u003e\n\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e๐Ÿš€ Bug Fix Pipeline โ€” Flow 2 ๅทฒ้ƒจ็ฝฒ PROD\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eโ€ข #\u003cid\u003e [\u003cseverity\u003e] \u003ctitle\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eโš ๏ธ ่ซ‹็™ปๅ…ฅ PROD ้ฉ—ๆ”ถใ€‚\n็ขบ่ชๆญฃๅธธๅพŒ้ปžใ€Œๆ‰นๅ‡† Merge UATใ€ใ€‚\nไธ‹ๆฌก T2 ๆ™‚้–“๏ผš\u003cT2_time\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eT2 Complete โ€” Flow 2 (UAT merged)\u003c/h4\u003e\n\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003eโœ… Bug Fix Pipeline โ€” Flow 2 ๅฎŒๆˆ\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eโ€ข #\u003cid\u003e [\u003cseverity\u003e] \u003ctitle\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e๐ŸŽ‰ Fix ๅทฒๅŒๆญฅ่‡ณ UATใ€‚Flow 2 ๅ…จๆต็จ‹ๅฎŒๆˆใ€‚\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eEmergency Hotfix\u003c/h4\u003e\n\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e๐Ÿšจ Emergency Hotfix โ€” \u003cPROD/UAT\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eBug: #\u003cid\u003e [\u003cseverity\u003e] \u003ctitle\u003e\nๆ™‚้–“๏ผš\u003cdatetime\u003e\n้ƒจ็ฝฒไบบ๏ผš\u003cadmin\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e็‹€ๆ…‹๏ผšๅทฒ้ƒจ็ฝฒ๏ผŒ่ซ‹็ซ‹ๅณ้ฉ—ๆ”ถ\n้œ€่ฆ่ทŸ้€ฒ๏ผš\u003cyes/no โ€” UAT cherry-pick needed\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eRollback\u003c/h4\u003e\n\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003eโš ๏ธ Rollback ๅŸท่กŒ โ€” \u003cenvironment\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eๅŽŸๅ› ๏ผš\u003cbrief reason\u003e\nๅ›žๆปพ่‡ณ๏ผš\u003cversion/commit\u003e\nๆ™‚้–“๏ผš\u003cdatetime\u003e\nๅŸท่กŒไบบ๏ผš\u003cadmin\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e็‹€ๆ…‹๏ผšๅทฒๅ›žๆปพ๏ผŒๆญฃๅœจ็›ฃๆŽง\nไธ‹ไธ€ๆญฅ๏ผš\u003cscheduled fix / investigation\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eAdapting This Workflow to a New Project\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eWhen setting up a new project with this workflow:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e1. \u003cstrong style=\"color:#e5e7eb\"\u003eDefine T1 and T2\u003c/strong\u003e โ€” pick times based on traffic patterns and SLA\n2. \u003cstrong style=\"color:#e5e7eb\"\u003eSet severity policy\u003c/strong\u003e โ€” confirm which severities enter pipeline vs emergency hotfix\n3. \u003cstrong style=\"color:#e5e7eb\"\u003eConfigure Telegram/notification channels\u003c/strong\u003e โ€” who receives which notifications\n4. \u003cstrong style=\"color:#e5e7eb\"\u003eAdd DB columns\u003c/strong\u003e โ€” \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003efix_flow\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003efound_in_env\u003c/code\u003e, and status enum (see Status Reference)\n5. \u003cstrong style=\"color:#e5e7eb\"\u003eImplement Phase 1 + Phase 2 cron jobs\u003c/strong\u003e โ€” schedule at T1 and T2\n6. \u003cstrong style=\"color:#e5e7eb\"\u003eAdd approval endpoints\u003c/strong\u003e โ€” \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eapprove-prod\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eapprove-uat-merge\u003c/code\u003e, batch variants\n7. \u003cstrong style=\"color:#e5e7eb\"\u003eAdd status badges + action buttons\u003c/strong\u003e โ€” frontend must reflect all statuses clearly\n8. \u003cstrong style=\"color:#e5e7eb\"\u003eTest the full cycle in UAT first\u003c/strong\u003e โ€” simulate a bug through both flows before going live\n9. \u003cstrong style=\"color:#e5e7eb\"\u003eDocument rollback steps\u003c/strong\u003e โ€” specific to the project's tech stack and DB\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003ePre-Deploy Checklist (T1 / T2)\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eRun before every scheduled deploy window.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] \u003cstrong style=\"color:#e5e7eb\"\u003eDB backup confirmed\u003c/strong\u003e โ€” last backup \u003c 24h, or trigger manual backup now\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] \u003cstrong style=\"color:#e5e7eb\"\u003eMonitoring alerts active\u003c/strong\u003e โ€” error rate, response time, queue depth dashboards open\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] \u003cstrong style=\"color:#e5e7eb\"\u003eOn-call admin reachable\u003c/strong\u003e โ€” someone available to respond within 15 min post-deploy\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] \u003cstrong style=\"color:#e5e7eb\"\u003eChange freeze check\u003c/strong\u003e โ€” not within a freeze window (see Change Freeze Policy)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] \u003cstrong style=\"color:#e5e7eb\"\u003eRollback path clear\u003c/strong\u003e โ€” previous working commit/tag identified and noted\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] \u003cstrong style=\"color:#e5e7eb\"\u003eDependent services healthy\u003c/strong\u003e โ€” upstream/downstream APIs, DBs, message queues OK\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] \u003cstrong style=\"color:#e5e7eb\"\u003eDisk + memory OK\u003c/strong\u003e โ€” server has headroom (\u003e20% free disk, \u003c80% memory)\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003ePost-Deploy Monitoring\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eAfter each T1 or T2 deploy, monitor for a minimum of \u003cstrong style=\"color:#e5e7eb\"\u003e10 minutes\u003c/strong\u003e before standing down.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eMetrics to Watch\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Metric | Healthy Threshold | Action if Breached |\n|--------|------------------|--------------------|\n| HTTP 5xx error rate | \u003c 0.5% | Investigate immediately, consider rollback |\n| API response time (p95) | \u003c baseline + 20% | Check DB queries, cache hit rate |\n| Memory usage | \u003c 85% | Check for memory leaks in new code |\n| CPU usage | \u003c 80% sustained | Check for infinite loops or expensive queries |\n| Login / auth success rate | \u003e 99% | Auth regression โ€” rollback candidate |\n| Key business flow (e.g. task create) | Working end-to-end | Smoke test immediately post-deploy |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eSmoke Test Sequence (2โ€“3 min)\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e1. Login with admin account\n2. Navigate to the affected feature\n3. Perform the action that triggered the bug\n4. Confirm fix is working\n5. Check 2โ€“3 adjacent features for regression\n6. Check system logs for new errors\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003e If any smoke test step fails โ†’ \u003cstrong style=\"color:#e5e7eb\"\u003erollback immediately\u003c/strong\u003e, do not wait.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eMulti-Service Deploy (Cross-Service Fixes)\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eScenario\u003c/strong\u003e: A bug fix requires changes to more than one service (e.g. backend API + frontend, or service A + service B).\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eDeploy Order Principle\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003eAlways deploy in dependency order:\n Backend (API) first โ†’ Frontend second\n Shared library โ†’ Dependent services\n DB migration โ†’ Application code\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eNever deploy in reverse order โ€” it risks breaking in-flight requests.\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eCoordination Steps\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e1. \u003cstrong style=\"color:#e5e7eb\"\u003eMap dependencies\u003c/strong\u003e โ€” list all services affected and their dependency order\n2. \u003cstrong style=\"color:#e5e7eb\"\u003eStage the deploys\u003c/strong\u003e โ€” do not deploy all services simultaneously\n3. \u003cstrong style=\"color:#e5e7eb\"\u003eValidate between services\u003c/strong\u003e โ€” after each service deploy, quick health check before next\n4. \u003cstrong style=\"color:#e5e7eb\"\u003eSingle rollback plan\u003c/strong\u003e โ€” define the exact reverse order and what to check at each step\n5. \u003cstrong style=\"color:#e5e7eb\"\u003eLock window\u003c/strong\u003e โ€” communicate to team that a multi-service deploy is in progress (no other deploys)\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eStatus Tracking for Multi-Service\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eTag the bug with affected services. Use release notes to list which service each fix applies to:\n\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e[backend] Fix: null pointer in task update handler\n[frontend] Fix: error boundary not catching API timeout\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eChange Freeze Policy\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eCertain periods should have \u003cstrong style=\"color:#e5e7eb\"\u003eno scheduled pipeline deploys\u003c/strong\u003e (T1/T2 suspended). Emergency hotfixes may still be approved by escalation.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eRecommended Freeze Windows\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Period | Recommended Action |\n|--------|--------------------|\n| Public holidays | Suspend T1/T2. Emergency hotfix requires 2-person approval. |\n| Lunar New Year (3 days) | Full freeze. P1 only with CTO sign-off. |\n| Major client go-live week | Freeze for that client's system. Other systems normal. |\n| End-of-month financial close | Freeze financial modules. Other modules normal. |\n| Planned system maintenance | Coordinate freeze window in advance, notify stakeholders. |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eDeclaring a Freeze\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e1. Update HEARTBEAT.md or project config with freeze start/end dates\n2. Notify team via Telegram/channel\n3. Pipeline cron jobs remain scheduled but agent checks freeze flag before executing\n4. Emergency hotfix during freeze: requires explicit approval from admin + one other senior (two-person rule)\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eFreeze Flag (implementation)\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eIn pipeline config or environment variable:\n\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003eDEPLOY_FREEZE=true # hard freeze, all deploys blocked\nDEPLOY_FREEZE_MODULES=financial # module-specific freeze\nDEPLOY_FREEZE_UNTIL=2026-02-05 # auto-lift date\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eQuick Reference Card\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003eFLOW SELECTION:\n Same version? โ†’ Flow 1\n UAT ahead? โ†’ Flow 2\n Critical/High? โ†’ Emergency Hotfix\n Freeze window? โ†’ Block (escalate for emergency)\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eFLOW 1: confirmed โ†’ [T1] deployed_uat โ†’ [human] pending_prod โ†’ [T2] deployed_prod โœ…\nFLOW 2: confirmed โ†’ [T1] pending_prod โ†’ [T2] deployed_prod โ†’ [human] pending_uat_merge โ†’ [T2] uat_merged โœ…\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eROLLBACK: detect โ†’ confirm โ†’ execute โ†’ validate โ†’ document\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eSEVERITY:\n low/medium โ†’ pipeline eligible\n high/critical โ†’ emergency hotfix only\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eMULTI-SERVICE: backend first โ†’ validate โ†’ frontend โ†’ validate\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003ePRE-DEPLOY: backup โœ“ monitoring โœ“ on-call โœ“ freeze-check โœ“ rollback-path โœ“\nPOST-DEPLOY: monitor 10min โ†’ smoke test โ†’ stand down\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/p\u003e"])</script><script>self.__next_f.push([1,"20:[\"$\",\"div\",null,{\"className\":\"skill-page\",\"children\":[[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"SoftwareApplication\\\",\\\"name\\\":\\\"Tonic System Deploy\\\",\\\"description\\\":\\\"Software deployment workflow for systems with separate UAT and PROD environments. Use when: planning a bug fix deployment, choosing between Flow 1 (UAT-first...\\\",\\\"url\\\":\\\"https://bytesagain.com/skill/tonic-system-deploy\\\",\\\"applicationCategory\\\":\\\"clawhub\\\",\\\"operatingSystem\\\":\\\"Any\\\",\\\"offers\\\":{\\\"@type\\\":\\\"Offer\\\",\\\"price\\\":\\\"0\\\",\\\"priceCurrency\\\":\\\"USD\\\"},\\\"publisher\\\":{\\\"@type\\\":\\\"Organization\\\",\\\"name\\\":\\\"BytesAgain\\\",\\\"url\\\":\\\"https://bytesagain.com\\\"}}\"}}],[\"$\",\"div\",null,{\"className\":\"breadcrumb\",\"children\":[[\"$\",\"a\",null,{\"href\":\"/\",\"children\":\"BytesAgain\"}],\" โ€บ \",[\"$\",\"a\",null,{\"href\":\"/skills\",\"children\":\"Skills\"}],\" โ€บ \",\"Tonic System Deploy\"]}],[\"$\",\"div\",null,{\"className\":\"two-col\",\"children\":[[\"$\",\"div\",null,{\"className\":\"two-col-main\",\"children\":[[\"$\",\"div\",null,{\"className\":\"skill-card\",\"children\":[[\"$\",\"div\",null,{\"className\":\"skill-header\",\"children\":[[\"$\",\"div\",null,{\"className\":\"skill-badges\",\"children\":[[\"$\",\"span\",null,{\"className\":\"badge\",\"style\":{\"color\":\"#818cf8\",\"background\":\"#818cf822\",\"borderColor\":\"#818cf844\"},\"children\":[\"๐Ÿฆ€\",\" \",\"ClawHub\"]}],false]}],[\"$\",\"div\",null,{\"className\":\"skill-top-actions\",\"children\":[\"$\",\"$L22\",null,{\"slug\":\"tonic-system-deploy\"}]}]]}],[\"$\",\"h1\",null,{\"className\":\"skill-title\",\"children\":\"Tonic System Deploy\"}],[\"$\",\"p\",null,{\"className\":\"skill-owner\",\"children\":[\"by \",[\"$\",\"span\",null,{\"children\":[\"@\",\"tonylnng\"]}]]}],[\"$\",\"p\",null,{\"className\":\"skill-desc\",\"children\":\"Software deployment workflow for systems with separate UAT and PROD environments. Use when: planning a bug fix deployment, choosing between Flow 1 (UAT-first...\"}],[\"$\",\"div\",null,{\"className\":\"skill-meta\",\"children\":[[\"$\",\"div\",null,{\"className\":\"meta-item\",\"children\":[[\"$\",\"span\",null,{\"className\":\"meta-label\",\"children\":\"Version\"}],[\"$\",\"span\",null,{\"className\":\"meta-value\",\"children\":[\"v\",\"1.0.0\"]}]]}],[\"$\",\"div\",null,{\"className\":\"meta-item\",\"children\":[[\"$\",\"span\",null,{\"className\":\"meta-label\",\"children\":\"Downloads\"}],[\"$\",\"span\",null,{\"className\":\"meta-value\",\"children\":\"684\"}]]}],[\"$\",\"div\",null,{\"className\":\"meta-item\",\"children\":[[\"$\",\"span\",null,{\"className\":\"meta-label\",\"children\":\"Installs\"}],[\"$\",\"span\",null,{\"className\":\"meta-value\",\"children\":\"1\"}]]}],false,false,[\"$\",\"div\",null,{\"className\":\"meta-item\",\"style\":{\"flexDirection\":\"row\",\"gap\":6,\"alignItems\":\"center\"},\"children\":[[\"$\",\"a\",\"clawhub\",{\"href\":\"/?q=clawhub\",\"className\":\"tag\",\"children\":[\"#\",\"clawhub\"]}]]}]]}],[\"$\",\"div\",null,{\"style\":{\"marginTop\":6},\"children\":[\"$\",\"a\",null,{\"href\":\"https://clawhub.ai/tonylnng/tonic-system-deploy\",\"target\":\"_blank\",\"rel\":\"noopener\",\"className\":\"btn-secondary\",\"style\":{\"padding\":\"6px 12px\",\"fontSize\":\".82em\",\"borderRadius\":8,\"background\":\"transparent\",\"border\":\"1px solid var(--border-card)\",\"color\":\"var(--text-muted2)\",\"textDecoration\":\"none\",\"whiteSpace\":\"nowrap\"},\"children\":[\"View on \",\"ClawHub\",\" โ†’\"]}]}]]}],[\"$\",\"div\",null,{\"className\":\"install-box\",\"children\":[[\"$\",\"div\",null,{\"className\":\"install-header\",\"children\":[[\"$\",\"div\",null,{\"className\":\"install-dots\",\"children\":[[\"$\",\"div\",null,{\"className\":\"dot\",\"style\":{\"background\":\"#ef4444\"}}],[\"$\",\"div\",null,{\"className\":\"dot\",\"style\":{\"background\":\"#eab308\"}}],[\"$\",\"div\",null,{\"className\":\"dot\",\"style\":{\"background\":\"#22c55e\"}}]]}],[\"$\",\"span\",null,{\"className\":\"install-label\",\"children\":\"TERMINAL\"}]]}],[\"$\",\"div\",null,{\"className\":\"install-body\",\"style\":{\"flexWrap\":\"wrap\"},\"children\":[[\"$\",\"code\",null,{\"className\":\"install-cmd\",\"children\":\"clawhub install tonic-system-deploy\"}],[\"$\",\"button\",null,{\"className\":\"copy-btn\",\"data-cmd\":\"clawhub install tonic-system-deploy\",\"style\":{\"fontWeight\":700},\"children\":\"Copy\"}]]}]]}],[\"$\",\"section\",null,{\"className\":\"skill-card\",\"style\":{\"marginBottom\":20},\"children\":[[\"$\",\"h2\",null,{\"style\":{\"color\":\"#f8fafc\",\"fontSize\":\"1.2em\",\"fontWeight\":800,\"margin\":\"0 0 16px\",\"display\":\"flex\",\"alignItems\":\"center\",\"gap\":8},\"children\":\"๐Ÿ“– About This Skill\"}],[\"$\",\"div\",null,{\"style\":{\"fontSize\":\".92em\",\"color\":\"#94a3b8\",\"lineHeight\":1.75},\"dangerouslySetInnerHTML\":{\"__html\":\"$23\"}}]]}],null,null,null,null,null,null,null,false,false]}],\"$L24\"]}]]}]\n"])</script><script>self.__next_f.push([1,"21:[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n document.querySelectorAll('.copy-btn, .script-copy-btn').forEach(btn =\u003e {\\n btn.addEventListener('click', () =\u003e {\\n const cmd = btn.getAttribute('data-cmd');\\n if (!cmd) return;\\n navigator.clipboard.writeText(cmd).then(() =\u003e {\\n const orig = btn.textContent;\\n btn.textContent = 'Copied!';\\n setTimeout(() =\u003e btn.textContent = orig, 1500);\\n }).catch(() =\u003e {});\\n });\\n });\\n \"}}]\n"])</script><script>self.__next_f.push([1,"25:I[71521,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/12w5ognupk9fb.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n24:[\"$\",\"div\",null,{\"className\":\"two-col-side\",\"children\":[\"$\",\"$L25\",null,{\"category\":\"clawhub\",\"currentSlug\":\"tonic-system-deploy\",\"name\":\"Tonic System Deploy\",\"tags\":[\"clawhub\"]}]}]\n"])</script></body></html>