Development Workflow Change
Effective: April 2026 Team: MinuteMenu KidKare
Quick Summary
- Dev now owns testing. Write test cases, run all tests, capture screenshots, upload evidence to the ticket.
- QA now owns quality review. Review dev's test cases, add missing ones, sanity test only, give final approval.
- Low impact tickets (error message, validation, typo) — peer testing between devs, no QA needed.
- Evidence required — every ticket needs a test case checklist + screenshots before QA review.
- Nightly Playwright regression runs automatically. Failed tests assigned to dev to fix.
- Git: use rebase, not merge. Only on your own branch. Push with
--force-with-leaseafter rebase.
1. Why We Are Changing
AI coding agents made development much faster. A feature that took weeks now takes days. But QA still needs the same time to test. The team changed from 2 dev / 1 QA to 4 dev / 1 QA. QA cannot keep up if we keep the old process.
BEFORE NOW
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ 2 Devs │──│ 1 QA │ │ 4 Devs │──│ 1 QA │
└──────────┘ └──────────┘ └──────────┘ └──────────┘
│ │
Dev writes code in weeks. AI agent helps Same 1 QA
QA has time to test all. dev ship in can NOT test
days. 4x more output.
│
┌────▼──────────────────────┐
│ BOTTLENECK MOVED TO QA │
└───────────────────────────┘
The fix: devs own testing. QA owns quality review.
flowchart TB
subgraph BEFORE [BEFORE: 2 Dev / 1 QA]
D1[Dev 1]
D2[Dev 2]
Q1[QA 1]
D1 -->|all bugs| Q1
D2 -->|all bugs| Q1
end
subgraph AFTER [AFTER: 4 Dev / 1 QA]
DA[Dev 1]
DB[Dev 2]
DC[Dev 3]
DD[Dev 4]
QA[QA 1]
DA -->|reviewed output| QA
DB -->|reviewed output| QA
DC -->|reviewed output| QA
DD -->|reviewed output| QA
end
BEFORE -.->|AI Coding Agent| AFTER
2. Old Process vs New Process
Old Process
Dev QA Dev QA
┌──────┐ ┌──────────────┐ ┌──────┐ ┌──────┐
│Write │────────> │Analyze │───Bugs──> │Fix │──>│Retest│
│Code │ │Write ALL │ │Bugs │ │ALL │
│Test │ │ test cases │ │ │ │ │
│main │ │Test ALL cases│ │ │ │Round │
│cases │ │ │ │ │ │2 / 3 │
└──────┘ └──────────────┘ └──────┘ └──────┘
^ QA does everything
flowchart LR
subgraph Developer
A[Write Code] --> B[Test Main Cases]
end
subgraph QA
C[Analyze Feature] --> D[Write ALL Test Cases]
D --> E[Test ALL Cases]
E --> F{Pass?}
end
subgraph Fix Cycle
G[Log Bugs] --> H[Dev Fixes]
H --> I[QA Re-tests]
I --> J{Pass?}
J -->|No| G
end
B --> C
F -->|No| G
F -->|Yes| K[Done]
J -->|Yes| K
New Process
Dev QA
┌───────────────────────────┐ ┌──────────────────┐
│ Write Code │──────────> │ Review test cases │
│ Write test cases │ │ Add missing ones │
│ Run ALL tests │ │ Sanity test only │
│ Capture screenshots │ │ Final approval │
│ Upload evidence to ticket │ │ │
└───────────────────────────┘ └──────────────────┘
^ Dev owns testing ^ QA owns quality
flowchart LR
subgraph Developer
A[Write Code] --> B[Write Test Cases]
B --> C[Run All Tests]
C --> D[Capture Evidence]
D --> E[Upload to Ticket]
end
subgraph QA
F[Review Test Cases] --> G{Coverage OK?}
G -->|No| H[Add Missing Cases]
H --> F
G -->|Yes| I[Sanity Test Only]
I --> J[Final Approval]
end
E --> F
J --> K[Done]
Note: When QA adds missing test cases, dev runs those too and provides evidence.
3. What Changes for Each Role
┌──────────────────────────────────────────────────────────────┐
│ ROLE │ BEFORE │ NOW │
├─────────────┼────────────────────────┼───────────────────────┤
│ │ Write code │ Write code │
│ Developer │ Test main cases only │ Write test cases │
│ │ Fix bugs from QA │ Run ALL tests │
│ │ │ Capture screenshots │
│ │ │ Upload evidence │
│ │ │ Output = production │
│ │ │ ready │
├─────────────┼────────────────────────┼───────────────────────┤
│ │ Analyze feature │ Review dev test cases │
│ QA │ Write ALL test cases │ Add missing cases │
│ │ Test ALL cases │ Sanity test only │
│ │ Log bugs │ Final approval │
│ │ Retest round 2, 3 │ │
├─────────────┼────────────────────────┼───────────────────────┤
│ Key rule │ QA finds all bugs │ Dev prevents bugs │
│ │ │ QA verifies coverage │
└─────────────┴────────────────────────┴───────────────────────┘
Three Key Rules
- Dev must test and make sure code is production ready. Not "works on my machine." Fully tested, with screenshots and test case checklist in the ticket.
- QA does not run all test cases. QA reviews the dev's test list, adds what's missing, and does sanity testing only.
- QA is still the quality owner. QA reviews the test plan, can ask dev to run more tests, and gives final approval.
What "Evidence" Means
Dev must upload to the ticket:
- Test case checklist — table with: ID, description, expected result, status, screenshot
- Screenshots — one per test case, showing the actual result
Example: (this is just minimal version, QA can provide more comprehensive report template later)
| ID | Description | Expected Result | Status | Screenshot |
|---|---|---|---|---|
| TC-01 | Add new child with valid data | Child saved, shows in list | Pass | [screenshot-01.png] |
| TC-02 | Add child with missing required name | Validation error "Name is required" | Pass | [screenshot-02.png] |
| TC-03 | Add child with duplicate name | Warning dialog shown, allow save | Pass | [screenshot-03.png] |
| TC-04 | Edit existing child info | Changes saved, list updated | Pass | [screenshot-04.png] |
| TC-05 | Delete child with linked meals | Confirmation dialog, meals unlinked after confirm | Pass | [screenshot-05.png] |
| TC-06 | Delete child without linked data | Child removed from list immediately | Pass | [screenshot-06.png] |
| TC-07 | View child list with 100+ records | Page loads under 3 seconds, pagination works | Pass | [screenshot-07.png] |
4. Ticket Routing: Who Tests What?
Dev self-classifies the impact level. QA can override if they disagree.
flowchart TD
A[New Ticket] --> B{Impact Level?}
B -->|Low Impact| C[Peer Testing]
B -->|Medium/High Impact| D[Full QA Review]
C --> E[Release]
D --> F[Dev: Write test cases + run tests + evidence]
F --> G[QA: Review test cases + add missing + sanity test]
G --> H[QA: Final Approval]
H --> E
Low Impact (peer testing, no QA needed)
- Update error message text
- Add simple field validation
- Fix typo in UI
- Config or setting change
Medium / High Impact (full QA review required)
- New feature
- Bug fix that changes behavior
- Data migration or schema change
- Payment / billing changes
- Changes that touch multiple features
- Security-related changes
- ...
5. Nightly Regression Testing
The Playwright regression test suite runs every night automatically via Jenkins.
flowchart TB
A[Nightly Trigger - Jenkins] --> B[Run Playwright Regression Suite]
B --> C[Generate Report]
C --> D{Who Reviews?}
D -->|Now| E[QA + a Cuong Review Report]
D -->|Future| F[AI Agent Analyze Report]
E --> G[Assign Failed Tests to Dev]
F --> G
G --> H[Dev Fixes Failed Tests]
H --> I[Re-run Affected Tests]
Current: QA + a Cuong review the nightly report each morning and assign failed tests to devs.
Future: AI agent will analyze the report, classify failures (real bug vs flaky test vs environment issue), and auto-assign to the right dev.
6. Automation Impact Awareness
Status: Nice-to-have now. Mandatory in a few weeks once the team has enough Playwright knowledge.
When dev makes a code change, they should also think about automation impact:
┌─────────────────────────────────────────────────────────────────┐
│ DURING DEVELOPMENT │
│ │
│ 1. Make code change │
│ │
│ 2. Work with AI agent to answer: │
│ ┌──────────────────────────────────────────┐ │
│ │ - Which Playwright tests does this │ │
│ │ change affect? │ │
│ │ - Do any existing tests need updating? │ │
│ │ - Should we add new automation tests? │ │
│ │ - Re-run affected tests to verify. │ │
│ └──────────────────────────────────────────┘ │
│ │
│ 3. Update or add Playwright tests as needed │
│ │
│ 4. Include test changes in the same PR │
└─────────────────────────────────────────────────────────────────┘
7. Rollout Phases
flowchart LR
subgraph Phase 1: NOW
A1[New Dev+QA workflow]
A2[Nightly regression runs]
A3[Manual report review]
end
subgraph Phase 2: NEXT FEW WEEKS
B1[Dev identifies automation impact during coding]
B2[AI reviews nightly regression report]
B3[Dev updates affected Playwright tests]
end
subgraph Phase 3: STABLE
C1[Regular performance test runs]
C2[Full AI-driven report triage]
C3[Automation-first quality gate]
end
A1 --> B1 --> C1
Phase 1: NOW
- [X] New Dev + QA workflow (this document)
- [X] Nightly Playwright regression runs on Jenkins
- [X] Manual report review by QA + a Cuong
Phase 2: NEXT FEW WEEKS
- [ ] Dev checks automation impact during coding (with AI agent)
- [ ] AI agent reviews nightly regression report
- [ ] Dev updates affected Playwright tests with code changes
Phase 3: WHEN AUTOMATION IS STABLE
- [ ] Regular performance test runs (already available, can trigger manually)
- [ ] Full AI-driven regression report triage
- [ ] Automation-first quality gate
8. Summary
╔═══════════════════════════════════════════════════════════════════╗
║ DEVELOPMENT WORKFLOW CHANGE — SUMMARY ║
╠═══════════════════════════════════════════════════════════════════╣
║ ║
║ WHY: AI made coding faster. QA is now the bottleneck. ║
║ Team is 4 dev / 1 QA. Old process does not scale. ║
║ ║
║ WHAT CHANGES: ║
║ ┌─────────┬───────────────────────┬──────────────────────────┐ ║
║ │ │ Dev │ QA │ ║
║ ├─────────┼───────────────────────┼──────────────────────────┤ ║
║ │ Testing │ Writes + runs ALL │ Reviews test plan │ ║
║ │ │ test cases │ Adds missing cases │ ║
║ │ │ Uploads evidence │ Sanity test only │ ║
║ ├─────────┼───────────────────────┼──────────────────────────┤ ║
║ │ Quality │ Production-ready │ Final approval │ ║
║ │ │ output expected │ Quality owner │ ║
║ ├─────────┼───────────────────────┼──────────────────────────┤ ║
║ │ Low │ Peer testing │ Not involved │ ║
║ │ impact │ (dev reviews dev) │ │ ║
║ └─────────┴───────────────────────┴──────────────────────────┘ ║
║ ║
║ EVIDENCE = screenshots + test case checklist in the ticket ║
║ IMPACT = dev self-classifies, QA can override ║
║ ║
║ AUTOMATION: ║
║ - Playwright regression runs every night ║
║ - QA + a Cuong review report (AI agent later) ║
║ - Dev checks automation impact during coding (soon mandatory) ║
║ - Performance tests when automation is stable ║
║ ║
╚═══════════════════════════════════════════════════════════════════╝
9. Git Workflow: Rebase Instead of Merge
The Problem with Merge
Most of the team uses git merge to update branches. For example, merging master into a prodissue branch to get the latest changes.
This creates merge commits that clutter the history and make it hard to move branches between targets.
MERGE WORKFLOW (old)
master: A───B───C───D───E
\ \
prodissue: X───Y───M1───Z───M2
▲ ▲
merge commit merge commit
Problems:
- M1 and M2 are noise in the history
- If you merged from release-A, those merge commits
stay even if you switch to release-B
- Hard to tell which commits are yours vs merge noise
The Fix: Use Rebase
Instead of merging the base branch into your feature branch, rebase your branch onto the base branch.
REBASE WORKFLOW (new)
master: A───B───C───D───E
\
prodissue: X'──Y'──Z'
Clean. Linear. Your commits only.
Merge (old):
flowchart LR
MA[A] --> MB[B] --> MC[C] --> MD[D]
MB --> MX[X] --> MY[Y] --> MM[M merge] --> MZ[Z]
MD --> MM
Rebase (new):
flowchart LR
RA[A] --> RB[B] --> RC[C] --> RD[D] --> RX[X'] --> RY[Y'] --> RZ[Z']
Why Rebase Is Better for Us
1. Clean history. No merge commits. Easy to read git log.
2. Flexible base switching. This is the big one.
A prodissue branch can start from master. Then rebase onto release-A to test. If we decide to ship in release-B instead, just rebase onto release-B. No leftover merge commits from release-A.
SCENARIO: Change release target
Step 1: Start from master
master: A───B───C
\
prodissue: X───Y
Step 2: Rebase onto release-A to test
release-A: A───B───C───R1───R2
\
prodissue: X'──Y'
Step 3: Decision changes — ship in release-B instead
release-B: A───B───C───S1───S2
\
prodissue: X''──Y''
With merge, step 3 would carry merge commits from release-A.
With rebase, the branch is clean every time.
3. No "ghost revert" problem. This happened to our team before.
With merge: you merge prodissue A into release X. Later you revert it (no time to test). Release X ships and merges to master. Now master has both the merge AND the revert. When you try to merge prodissue A into release Y later, Git says "already merged" — it sees the original commits in the history and ignores the revert. Your changes silently disappear.
With rebase: this cannot happen. Rebase creates new commits with new SHAs every time. Git never thinks "I've seen this before."
THE GHOST REVERT PROBLEM (merge workflow)
Step 1: Merge prodissue A into release X
release-X: R1───R2───M1(merge prodissue A)
/
prodissue-A: X───Y──Z
Step 2: Revert prodissue A (no time to test)
release-X: R1───R2───M1───REVERT(M1)
Step 3: Release X merged to master
master: ...───M1───REVERT(M1)
Git remembers X, Y, Z as "already merged"
Step 4: Try to merge prodissue A into release Y
git merge prodissue-A → "Already up to date!"
Commits X, Y, Z are in history. Git skips them.
THE REVERT STAYS. YOUR CODE IS GONE.
WITH REBASE — this cannot happen:
git rebase origin/release-Y (on prodissue-A)
Creates X', Y', Z' — brand new SHAs.
Git applies them fresh. No history conflict.
4. Production-ready testing. Always rebase onto the release branch before final testing. Your code runs on top of the exact release code. No surprises after merge.
Commands
# Update your branch with latest master
git fetch origin
git rebase origin/master
# Move your branch onto a release branch for testing
git rebase origin/release/26.3.5
# Switch to a different release branch
git rebase origin/release/26.4.1
# After rebase, push to remote (required because history changed)
git push --force-with-lease
Rules
- Use
rebase, notmerge, to update your branch with latest code from master or release. - Use
--force-with-lease, not--force, when pushing after rebase. It stops you from overwriting someone else's work. - Never rebase shared branches (master, release/*). Only rebase your own feature/prodissue branches.
- Resolve conflicts commit-by-commit. Rebase replays your commits one at a time. Fix each conflict as it comes. This gives cleaner results than a single merge conflict blob.
SAFE vs UNSAFE
✓ git rebase origin/master (on your feature branch)
✓ git push --force-with-lease (after rebase)
✗ git merge origin/master (creates merge commits)
✗ git push --force (can overwrite others' work)
✗ git rebase on master or release/* (never rebase shared branches)
Quick Reference
| Task | Command |
|---|---|
| Get latest master into your branch | git fetch origin && git rebase origin/master |
| Test on a release branch | git rebase origin/release/X.Y.Z |
| Switch to different release | git rebase origin/release/A.B.C |
| Push after rebase | git push --force-with-lease |
| Abort a messy rebase | git rebase --abort |
| Continue after fixing conflict | git add . && git rebase --continue |