xây dựng đội nhân viên AI cho team IT
Tung Bui Thanh (TungDaDev)17 mins read

Team IT nào cũng vậy, ngày nào cũng có cả chục việc lặp đi lặp lại, chẳng cần sáng tạo gì: tóm tắt PR, cập nhật sprint, viết test case từ spec, gom bug report... Mấy việc này để AI làm là hợp nhất.
Giả sử bạn đang làm Tech Lead. Sáng nào cũng một vòng: review PR của 5 người, cập nhật Jira, trả lời Slack hỏi tiến độ, viết report tuần cho PM, nhắc ông QC chạy regression test cho kịp release.
Team đâu có thiếu người. Thứ còn thiếu là cách tổ chức để mấy việc lặp lại này tự chạy.
Bài này hướng dẫn dựng một đội agent AI cho team IT, mỗi agent một vai: developer, PM, QC, DevOps. Chúng tự chạy hằng ngày, bạn đi họp hay đi ngủ cũng mặc.
# kiến trúc: một engine, nhiều vai
+-----------------------------------------------+
| LLM Engine (GPT-4o) | <- shared brain
+-----------------------------------------------+
| Dev Agent | PM Agent | QC Agent | Ops Agent | <- one area per agent
+-----------------------------------------------+
| GitHub | Jira | Slack | File System | <- shared tools
+-----------------------------------------------+Tầng trên cùng là bộ não dùng chung, tầng giữa mỗi agent giữ một mảng việc, tầng dưới là bộ công cụ dùng chung.
Nguyên tắc là: một model, nhiều nhân viên. Đừng kiểu "AI này để review code, AI kia để viết test, AI nọ vì blog nào đó khen". Một engine thôi, còn mỗi agent có vai trò rõ ràng.
Các script bên dưới gọi thẳng Chat Completions API của OpenAI với gpt-4o cho dễ theo dõi. Model chỉ là ví dụ, bạn đổi sang model nào đang dùng thì sửa trường model. Riêng các model reasoning (dòng o-series, GPT-5) không nhận max_tokens mà dùng max_completion_tokens, đổi model thì nhớ đổi luôn tên trường này. Script cần curl và jq.
# setup môi trường (chạy một lần)
#!/bin/bash
# setup.sh
mkdir -p ~/ai-team/{agents,reports,memory/shared,skills,logs}
for agent in dev pm qc devops; do
mkdir -p ~/ai-team/agents/$agent/{charter,memory}
echo "✅ $agent"
done
cat > ~/ai-team/.env.example << 'EOF'
OPENAI_API_KEY=sk-...
# tích hợp tuỳ chọn
GITHUB_TOKEN=ghp_...
GITHUB_REPO=your-org/your-repo
JIRA_EMAIL=your-email@company.com
JIRA_TOKEN=...
JIRA_BASE_URL=https://yourcompany.atlassian.net
TEAM_ROOT=~/ai-team
MAX_RUNTIME_MINUTES=30
EOF
echo "✅ done — cp .env.example .env rồi điền key"chmod +x ~/ai-team/setup.sh && bash ~/ai-team/setup.sh# agent 1: Dev — review code và tóm tắt PR
Dev Agent không thay developer. Nó lo phần chuẩn bị để developer review nhanh hơn: tóm tắt thay đổi, chỉ chỗ cần để ý, liệt kê các issue có thể có theo checklist. Muốn tóm tắt được thì nó phải đọc diff thật, nên script lấy diff từng PR (GitHub trả diff thô khi gửi header Accept: application/vnd.github.diff) và bỏ qua PR nào diff quá 500 dòng.
role file
Tạo ~/ai-team/agents/dev/charter/role.md:
# Dev Agent
## owns
tóm tắt PR hàng ngày và checklist review sơ bộ.
## outcome
mỗi sáng trước 8:00, file reports/YYYY-MM-DD/pr-summary.md tồn tại
và developer có thể ưu tiên review nào cần xem trước.
## sources
- danh sách PR mở trên GitHub repo được cấp phép
- file diff của từng PR (không quá 500 dòng mỗi PR)
- labels và description của PR
## deliverables
reports/YYYY-MM-DD/
└── pr-summary.md # tóm tắt + risk level + checklist cho từng PR
## constraints
- không approve hoặc merge PR
- không comment trực tiếp lên GitHub
- không mở file ngoài repo được cấp phép
- dừng sau 30 phút
- nếu diff quá lớn → ghi "TOO LARGE — cần review thủ công"
## fences
approve / merge / comment / push / deploy
script chạy Dev Agent
Tạo ~/ai-team/run_dev.sh:
#!/bin/bash
set -e
DATE=$(date +%Y-%m-%d)
OUTPUT_DIR=~/ai-team/reports/$DATE
LOG=~/ai-team/logs/dev_$DATE.log
mkdir -p "$OUTPUT_DIR"
echo "[$DATE] Dev Agent starting..." | tee -a "$LOG"
# lấy danh sách PR đang mở (cần GITHUB_TOKEN và GITHUB_REPO trong .env)
source ~/ai-team/.env
PR_LIST=$(curl -s \
-H "Authorization: Bearer $GITHUB_TOKEN" \
-H "Accept: application/vnd.github+json" \
"https://api.github.com/repos/$GITHUB_REPO/pulls?state=open&per_page=10")
# gom title, description và diff của từng PR vào một file prompt
PROMPT_FILE=$(mktemp)
printf 'Danh sách PR hôm nay (%s):\n\n' "$DATE" > "$PROMPT_FILE"
for N in $(echo "$PR_LIST" | jq -r '.[].number'); do
echo "$PR_LIST" | jq -r --argjson n "$N" '.[] | select(.number == $n) |
"PR #\(.number): \(.title)\nAuthor: \(.user.login)\nLabels: \(.labels | map(.name) | join(", "))\nURL: \(.html_url)\n\n\(.body // "")\n"' >> "$PROMPT_FILE"
DIFF=$(curl -s \
-H "Authorization: Bearer $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.diff" \
"https://api.github.com/repos/$GITHUB_REPO/pulls/$N")
if [ "$(printf '%s\n' "$DIFF" | wc -l)" -gt 500 ]; then
echo "Diff: TOO LARGE — cần review thủ công" >> "$PROMPT_FILE"
else
printf 'Diff:\n%s\n' "$DIFF" >> "$PROMPT_FILE"
fi
printf '\n---\n\n' >> "$PROMPT_FILE"
done
printf 'Hãy tóm tắt từng PR, đánh giá risk level (low/medium/high), và tạo checklist review sơ bộ.\n' >> "$PROMPT_FILE"
ROLE=$(cat ~/ai-team/agents/dev/charter/role.md)
# prompt có thể dài vài trăm KB: đọc bằng --rawfile và đẩy body qua stdin (-d @-),
# tránh lỗi "Argument list too long" khi nhét cả prompt vào một tham số dòng lệnh
RESPONSE=$(jq -n \
--arg sys "$ROLE" \
--rawfile usr "$PROMPT_FILE" \
'{model:"gpt-4o",temperature:0.2,max_tokens:3000,
messages:[{role:"system",content:$sys},{role:"user",content:$usr}]}' |
curl -s https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d @-)
rm -f "$PROMPT_FILE"
# API lỗi thì không có .choices, "// empty" để file rỗng thay vì chứa chữ "null"
echo "$RESPONSE" | jq -r '.choices[0].message.content // empty' > "$OUTPUT_DIR/pr-summary.md"
if [ -s "$OUTPUT_DIR/pr-summary.md" ]; then
echo "[$DATE] ✅ Dev Agent done → $OUTPUT_DIR/pr-summary.md" | tee -a "$LOG"
else
echo "[$DATE] ❌ pr-summary.md trống: $(echo "$RESPONSE" | jq -r '.error.message // "không rõ lỗi"')" | tee -a "$LOG"
fioutput mẫu
# PR Summary — 2026-09-29
## PR #142 — Add Redis caching for user session [HIGH RISK]
Author: @nam.dev
Labels: backend, performance
**Thay đổi chính:**
- Thêm Redis client vào SessionService
- TTL mặc định 30 phút
**Điểm cần chú ý:**
- [ ] TTL có được config qua env chưa hay hardcode?
- [ ] Fallback khi Redis down — có không?
- [ ] Unit test cho cache miss case?
---
## PR #141 — Fix typo in API docs [LOW RISK]
Author: @linh.dev
Chỉ sửa comment và README — không cần review kỹ.# agent 2: PM — sprint report và theo dõi tiến độ
PM Agent không thay Project Manager. Nó lo phần gom số liệu: kéo data từ Jira, tính velocity, liệt kê việc đang bị block, để PM ra quyết định nhanh hơn.
role file
Tạo ~/ai-team/agents/pm/charter/role.md:
# PM Agent
## owns
báo cáo sprint hàng ngày và weekly summary.
## outcome
mỗi ngày trước 9:00, reports/YYYY-MM-DD/sprint-report.md tồn tại
với đủ: tiến độ, blocked items, items sắp due.
## sources
- Jira sprint board được cấp phép (API read-only)
- file memory/shared/sprint-goals.md
- file memory/shared/team-members.md
## deliverables
reports/YYYY-MM-DD/
├── sprint-report.md # tóm tắt ngày
└── weekly-summary.md # chỉ vào thứ Sáu
## constraints
- không cập nhật Jira ticket
- không assign task cho ai
- không gửi báo cáo qua email hay Slack
- dừng sau 20 phút
## review point
PM đọc report trước khi chia sẻ với stakeholder.
## fences
assign / update-ticket / send / delete
script chạy PM Agent
Tạo ~/ai-team/run_pm.sh:
#!/bin/bash
set -e
DATE=$(date +%Y-%m-%d)
OUTPUT_DIR=~/ai-team/reports/$DATE
LOG=~/ai-team/logs/pm_$DATE.log
mkdir -p "$OUTPUT_DIR"
source ~/ai-team/.env
# lấy issues trong sprint hiện tại từ Jira
JIRA_DATA=$(curl -s \
-u "$JIRA_EMAIL:$JIRA_TOKEN" \
-H "Accept: application/json" \
"$JIRA_BASE_URL/rest/api/3/search/jql?jql=sprint+in+openSprints()&fields=summary,status,assignee,priority,duedate&maxResults=50")
ISSUES=$(echo "$JIRA_DATA" | jq -r '.issues[] |
"\(.fields.summary) | \(.fields.status.name) | \(.fields.assignee.displayName // "Unassigned") | Due: \(.fields.duedate // "N/A")"')
SPRINT_GOALS=$(cat ~/ai-team/memory/shared/sprint-goals.md 2>/dev/null || echo "chưa có sprint goals")
TEAM=$(cat ~/ai-team/memory/shared/team-members.md 2>/dev/null || echo "")
# handoff: đọc output của Dev Agent (chạy lúc 7:30) để biết PR nào còn mở
PR_REPORT=$(cat "$OUTPUT_DIR/pr-summary.md" 2>/dev/null || echo "chưa có pr-summary hôm nay")
ROLE=$(cat ~/ai-team/agents/pm/charter/role.md)
RESPONSE=$(curl -s https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d "$(jq -n \
--arg sys "$ROLE" \
--arg usr "Ngày: $DATE\n\nSprint goals:\n$SPRINT_GOALS\n\nTeam:\n$TEAM\n\nJira issues:\n$ISSUES\n\nPR đang mở:\n$PR_REPORT\n\nTạo sprint report: tiến độ theo goal, blocked items, items sắp due trong 2 ngày tới." \
'{model:"gpt-4o",temperature:0.2,max_tokens:2000,
messages:[{role:"system",content:$sys},{role:"user",content:$usr}]}'
)")
echo "$RESPONSE" | jq -r '.choices[0].message.content // empty' > "$OUTPUT_DIR/sprint-report.md"
echo "[$DATE] ✅ PM Agent done" | tee -a "$LOG"Atlassian đã gỡ endpoint cũ /rest/api/3/search trên Jira Cloud (gọi vào sẽ nhận HTTP 410), nên script dùng /rest/api/3/search/jql. Endpoint mới phân trang bằng nextPageToken thay cho startAt, và chỉ trả về field nào bạn khai báo trong fields. Sprint vài chục ticket thì một trang 50 là đủ. Nguồn: Atlassian changelog CHANGE-2046.
output mẫu
# Sprint Report — 2026-09-29
## tiến độ theo goal
- ✅ Authentication module: 3/3 tasks done
- 🔄 Payment integration: 2/5 tasks done (40%)
- ⚠️ Reporting dashboard: 0/4 tasks done — chưa bắt đầu
## blocked items
- **PAY-23** Integrate Stripe webhook — blocked vì chưa có test API key từ DevOps
- **REP-11** Design mockup — chờ feedback từ client (3 ngày chưa reply)
## sắp due (2 ngày tới)
- PAY-21 — due 30/09 — @minh.dev — In Progress
- AUTH-15 — due 30/09 — @lan.dev — Done ✅# agent 3: QC — sinh test case và tổng hợp bug report
QC Agent nhận phần tốn thời gian nhất của QC: đọc spec rồi viết test case, gom bug report theo module, chỉ ra chỗ test coverage còn thiếu.
role file
Tạo ~/ai-team/agents/qc/charter/role.md:
# QC Agent
## owns
sinh test case từ spec và tổng hợp bug report hàng ngày.
## outcome
mỗi khi có spec mới trong specs/ → tạo file test-cases/ tương ứng.
mỗi ngày → tổng hợp reports/YYYY-MM-DD/bug-summary.md.
## sources
- thư mục specs/ (file markdown hoặc text)
- thư mục bugs/ (bug reports thô từ team)
- memory/shared/test-standards.md
## deliverables
test-cases/
└── <feature-name>-test-cases.md
reports/YYYY-MM-DD/
└── bug-summary.md
## constraints
- không cập nhật Jira
- không đánh dấu bug là fixed hay closed
- không chạy automated test (chỉ viết test case)
- dừng sau 30 phút
## fences
close-bug / mark-fixed / deploy / send
script sinh test case từ spec
Tạo ~/ai-team/run_qc_testcase.sh:
#!/bin/bash
set -e
# Truyền tên spec vào: bash run_qc_testcase.sh payment-flow
FEATURE=$1
SPEC_FILE=~/ai-team/specs/$FEATURE.md
OUTPUT=~/ai-team/test-cases/$FEATURE-test-cases.md
LOG=~/ai-team/logs/qc_$(date +%Y-%m-%d).log
if [ ! -f "$SPEC_FILE" ]; then
echo "❌ Không tìm thấy spec: $SPEC_FILE"
exit 1
fi
source ~/ai-team/.env
STANDARDS=$(cat ~/ai-team/memory/shared/test-standards.md 2>/dev/null || echo "")
ROLE=$(cat ~/ai-team/agents/qc/charter/role.md)
SPEC=$(cat "$SPEC_FILE")
RESPONSE=$(curl -s https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d "$(jq -n \
--arg sys "$ROLE" \
--arg usr "Test standards:\n$STANDARDS\n\n---\n\nSpec cần viết test case:\n\n$SPEC\n\nViết test case theo format: ID | Test scenario | Steps | Expected result | Priority" \
'{model:"gpt-4o",temperature:0.1,max_tokens:4000,
messages:[{role:"system",content:$sys},{role:"user",content:$usr}]}'
)")
echo "$RESPONSE" | jq -r '.choices[0].message.content // empty' > "$OUTPUT"
echo "[$(date +%Y-%m-%d)] ✅ Test cases generated → $OUTPUT" | tee -a "$LOG"# Dùng như sau:
bash ~/ai-team/run_qc_testcase.sh payment-flow
bash ~/ai-team/run_qc_testcase.sh user-authenticationoutput mẫu test case
# Test Cases — payment-flow
| ID | Scenario | Steps | Expected result | Priority |
| ------ | ------------------------------- | -------------------------------------------------- | ------------------------------------------------- | -------- |
| PAY-01 | Thanh toán thành công với Visa | 1. Chọn sản phẩm 2. Điền thông tin Visa 3. Confirm | Order status = PAID, email xác nhận gửi | HIGH |
| PAY-02 | Thẻ bị từ chối | 1. Điền số thẻ không hợp lệ 2. Submit | Hiển thị lỗi "Thẻ không hợp lệ", không charge | HIGH |
| PAY-03 | Timeout khi gọi payment gateway | Mock gateway timeout > 30s | Hiển thị "Thử lại sau", không tạo duplicate order | MEDIUM |script tổng hợp bug report hàng ngày
Tạo ~/ai-team/run_qc_bugs.sh:
#!/bin/bash
set -e
DATE=$(date +%Y-%m-%d)
OUTPUT_DIR=~/ai-team/reports/$DATE
LOG=~/ai-team/logs/qc_$DATE.log
mkdir -p "$OUTPUT_DIR"
source ~/ai-team/.env
# đọc tất cả bug report hôm nay từ thư mục bugs/
BUGS=$(cat ~/ai-team/bugs/$DATE-*.md 2>/dev/null || echo "không có bug report mới hôm nay")
# handoff: đọc sprint report của PM Agent để biết feature nào đang test
SPRINT_REPORT=$(cat "$OUTPUT_DIR/sprint-report.md" 2>/dev/null || echo "")
ROLE=$(cat ~/ai-team/agents/qc/charter/role.md)
RESPONSE=$(curl -s https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d "$(jq -n \
--arg sys "$ROLE" \
--arg usr "Sprint report hôm nay:\n$SPRINT_REPORT\n\nBug reports ngày $DATE:\n\n$BUGS\n\nTổng hợp theo: nhóm theo module, đánh severity, liệt kê pattern lặp lại nếu có." \
'{model:"gpt-4o",temperature:0.2,max_tokens:2000,
messages:[{role:"system",content:$sys},{role:"user",content:$usr}]}'
)")
echo "$RESPONSE" | jq -r '.choices[0].message.content // empty' > "$OUTPUT_DIR/bug-summary.md"
echo "[$DATE] ✅ QC Bug summary done" | tee -a "$LOG"# agent 4: DevOps — tổng hợp deployment và alert
DevOps Agent không thay DevOps engineer. Nó đọc log, tổng hợp lịch sử deploy, gom alert thành một report dễ đọc để engineer quyết định có cần nhảy vào không.
role file
Tạo ~/ai-team/agents/devops/charter/role.md:
# DevOps Agent
## owns
daily deployment report và alert digest.
## outcome
mỗi sáng, reports/YYYY-MM-DD/devops-report.md tồn tại
với: deployments hôm qua, alert nổi bật, service nào đang không ổn định.
## sources
- thư mục logs/deployments/
- thư mục logs/alerts/
- memory/shared/services.md (danh sách services cần monitor)
## deliverables
reports/YYYY-MM-DD/
└── devops-report.md
## constraints
- không rollback deployment
- không restart service
- không thay đổi config
- không silence alert
- dừng sau 15 phút
## fences
rollback / restart / deploy / silence-alert / config-change
script chạy DevOps Agent
Tạo ~/ai-team/run_devops.sh:
#!/bin/bash
set -e
DATE=$(date +%Y-%m-%d)
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d 2>/dev/null || date -v-1d +%Y-%m-%d)
OUTPUT_DIR=~/ai-team/reports/$DATE
LOG=~/ai-team/logs/devops_$DATE.log
mkdir -p "$OUTPUT_DIR"
source ~/ai-team/.env
# fallback đặt trước "| head": exit code của pipeline là của head, nên "... | head || echo" không bao giờ chạy nhánh echo
DEPLOYMENTS=$( { cat ~/ai-team/logs/deployments/$YESTERDAY-*.log 2>/dev/null || echo "không có deployment log"; } | head -200)
ALERTS=$( { cat ~/ai-team/logs/alerts/$YESTERDAY-*.log 2>/dev/null || echo "không có alert"; } | head -100)
SERVICES=$(cat ~/ai-team/memory/shared/services.md 2>/dev/null || echo "")
ROLE=$(cat ~/ai-team/agents/devops/charter/role.md)
RESPONSE=$(curl -s https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d "$(jq -n \
--arg sys "$ROLE" \
--arg usr "Báo cáo ngày $DATE (data từ $YESTERDAY):\n\nServices cần monitor:\n$SERVICES\n\nDeployment logs:\n$DEPLOYMENTS\n\nAlerts:\n$ALERTS\n\nTạo report: tóm tắt deployments, alert nào cần xem ngay, service nào không ổn định." \
'{model:"gpt-4o",temperature:0.2,max_tokens:2000,
messages:[{role:"system",content:$sys},{role:"user",content:$usr}]}'
)")
echo "$RESPONSE" | jq -r '.choices[0].message.content // empty' > "$OUTPUT_DIR/devops-report.md"
echo "[$DATE] ✅ DevOps Agent done" | tee -a "$LOG"output mẫu
# DevOps Report — 2026-09-29
## deployments hôm qua
| service | version | thời gian | kết quả |
| --------------- | ------- | --------- | ----------------------------------- |
| payment-service | v2.3.1 | 14:32 | ✅ success |
| user-service | v1.8.0 | 16:15 | ✅ success |
| report-service | v0.9.2 | 18:45 | ❌ failed → rollback tự động v0.9.1 |
## alerts cần xem ngay
- **HIGH** — payment-service: response time p99 tăng lên 850ms lúc 20:00-20:30 (SLA = 500ms)
→ có thể liên quan deploy v2.3.1, cần kiểm tra Redis connection pool
## service không ổn định
- report-service: 3 lần fail deploy trong tuần → cần review pipeline# handoff giữa các agent
Các agent giao việc cho nhau qua file, không qua lời nói. Agent chạy sau chỉ việc đọc file agent chạy trước vừa ghi (xem các dòng PR_REPORT, SPRINT_REPORT trong script PM và QC), nên thứ tự giờ trong cron là quan trọng.
Dev Agent (7:30) → reports/2026-09-29/pr-summary.md
DevOps Agent (7:45) → reports/2026-09-29/devops-report.md
PM Agent (8:00) → reports/2026-09-29/sprint-report.md
(đọc pr-summary để biết PR nào chưa merge)
QC Agent (8:30) → reports/2026-09-29/bug-summary.md
(đọc sprint-report để biết feature nào đang test)
bạn (9:00) → mở reports/2026-09-29/ → đọc 4 file → quyết định ngày hôm đóTạo ~/ai-team/memory/shared/services.md:
# services cần monitor
| service | repo | team owner | SLA |
| --------------- | ----------------------- | ---------- | ----------- |
| payment-service | company/payment-service | @backend | p99 < 500ms |
| user-service | company/user-service | @backend | p99 < 200ms |
| report-service | company/report-service | @data | p99 < 2s |
| web-frontend | company/web | @frontend | LCP < 2.5s |# lên lịch chạy tự động
crontab -e# daily IT team reports
30 7 * * 1-5 bash ~/ai-team/run_dev.sh >> ~/ai-team/logs/cron.log 2>&1
45 7 * * 1-5 bash ~/ai-team/run_devops.sh >> ~/ai-team/logs/cron.log 2>&1
0 8 * * 1-5 bash ~/ai-team/run_pm.sh >> ~/ai-team/logs/cron.log 2>&1
30 8 * * 1-5 bash ~/ai-team/run_qc_bugs.sh >> ~/ai-team/logs/cron.log 2>&1
# QC test case: chạy khi có spec mới (trigger thủ công hoặc file watcher)
# bash ~/ai-team/run_qc_testcase.sh <feature-name>Hai điều hay vướng với cron. Một là cron chạy với PATH tối giản, jq cài qua Homebrew (/opt/homebrew/bin) hay ở /usr/local/bin có thể không được tìm thấy, nên thêm dòng PATH=/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin ở đầu crontab. Hai là máy phải đang thức: laptop gập lại ngủ đúng lúc 7:30 thì job đó bị bỏ qua chứ không chạy bù. Muốn chạy đều thì đặt trên một server hay VM nhỏ luôn bật (trên macOS thì launchd với StartCalendarInterval sẽ chạy bù khi máy thức dậy).
kill switch: timeout cho từng agent
Bọc lệnh chính trong timeout (có sẵn trên Linux; macOS thì cài coreutils qua Homebrew rồi dùng gtimeout):
if ! timeout 1800 bash ~/ai-team/run_dev.sh; then
echo "[$(date)] TIMEOUT: Dev Agent dừng sau 30 phút" >> ~/ai-team/logs/cron.log
fi# xử lý lỗi
# xem log gần nhất
tail -50 ~/ai-team/logs/dev_$(date +%Y-%m-%d).log
# tìm agent nào đang thất bại
grep "❌" ~/ai-team/logs/cron.log | tail -20
# kiểm tra output hôm nay
ls -la ~/ai-team/reports/$(date +%Y-%m-%d)/| triệu chứng | nguyên nhân thường gặp | fix |
|---|---|---|
| output rỗng | API key hết hạn / rate limit | kiểm tra .env, thêm retry |
| nội dung không liên quan | role.md quá mơ hồ | cụ thể hóa sources và deliverables |
| GitHub/Jira không kết nối | token hết hạn | rotate token |
| agent chạy quá lâu | context quá lớn | giảm per_page hoặc giới hạn log size |
# checklist triển khai
ngày 1: chỉ một agent
- chạy
setup.sh - chọn agent ưu tiên (thường PM hoặc Dev)
- viết role.md đủ 5 trường
- chạy thử 1 lần, kiểm tra output
- đạt: output đọc hiểu được và có nội dung thật
ngày 2-3: thêm agent
- thêm Dev Agent nếu team có PR hàng ngày
- thêm QC Agent nếu team hay thiếu test case
- test handoff: PM Agent đọc output của Dev Agent
tuần 2: lên lịch
- cài cron job
- đặt timeout cho từng agent
- sáng ra mở folder đọc thay vì đi hỏi trên Slack
hàng tuần
- agent nào tạo report mà không ai đọc → xoá job đó
- agent nào output sai hoài → sửa role.md, đừng vội đổi model
# tổng kết
| agent | làm gì | không làm gì |
|---|---|---|
| Dev | tóm tắt PR, checklist review | approve, merge, comment |
| PM | sprint report, blocked items | cập nhật Jira, assign task |
| QC | sinh test case, tổng hợp bug | chạy test, close bug |
| DevOps | deployment report, alert digest | rollback, restart, deploy |
Cứ bắt đầu với một agent, một việc nhàm chán. Chạy thử. Đọc output. Nếu đọc xong bạn ra quyết định nhanh hơn thì là đang đi đúng hướng rồi.
Chỉ là những ghi chép cá nhân với hy vọng mang lại chút giá trị. Nếu thấy hữu ích, đừng ngại chia sẻ cho bạn bè & đồng nghiệp nhé!
Happy coding 😎 👍🏻 🚀 🔥.