fix các bug theo yêu cầu https://fptsoftware362-my.sharepoint.com/❌/g/personal/nampdt_fpt_com/IQAHBJ4A9xqDTLgvt2bhukJEAdRB5LRz2hbJpTivvIiBSYM?wdExp=TEAMS-TREATMENT&web=1&isSPOFile=1&ovuser=f01e930a-b52e-42b1-b70f-a8882b5d043b%2CAnhTNM1%40fpt.com&clickparams=eyJBcHBOYW1lIjoiVGVhbXMtRGVza3RvcCIsIkFwcFZlcnNpb24iOiI0OS8yNjA4MTMxOTMxNyIsIkhhc0ZlZGVyYXRlZFVzZXIiOmZhbHNlfQ%3D%3D --------- Co-authored-by: Duy Le Huu <duylh19@fpt.com> Reviewed-on: #10 Co-authored-by: Anh Tran Nguyen Minh <anhtnm1@fpt.com>
This commit was merged in pull request #10.
This commit is contained in:
@@ -0,0 +1,106 @@
|
||||
# Output Contract — `defect_record`
|
||||
|
||||
Do `ui-bug-triage` sinh ra. Giữ **đúng** thứ tự và tên mục. Không có dữ liệu thì ghi
|
||||
`unknown` hoặc `N/A` kèm lý do — **không xoá mục**.
|
||||
|
||||
---
|
||||
|
||||
```yaml
|
||||
---
|
||||
defect_id: UI-<YYYYMMDD>-<NN>
|
||||
from_agent: ui-bug-triage
|
||||
next_agent: <ui-visual-fixer | ux-flow-fixer | i18n-a11y-fixer | RETURN_TO_REPORTER>
|
||||
category: <visual | flow | i18n-a11y | not-ui>
|
||||
severity: <S1 | S2 | S3 | S4>
|
||||
confidence: <low | medium | high>
|
||||
reproducible: <yes | no | intermittent>
|
||||
security_review: <required | not-required>
|
||||
affected_files: []
|
||||
themes_verified: []
|
||||
languages_verified: []
|
||||
blocked_on: []
|
||||
---
|
||||
```
|
||||
|
||||
# 1. Tóm tắt
|
||||
|
||||
Một câu: cái gì hỏng, ở màn nào, với ai.
|
||||
|
||||
# 2. Quan sát vs kỳ vọng
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **Người dùng thấy** | |
|
||||
| **Người dùng mong** | |
|
||||
| **Người dùng suy đoán (chưa xác minh)** | |
|
||||
|
||||
# 3. Môi trường
|
||||
|
||||
| Trường | Giá trị |
|
||||
|---|---|
|
||||
| Phiên bản app / commit | |
|
||||
| OS + độ phân giải + mức scale | |
|
||||
| Theme lúc xảy ra | |
|
||||
| Ngôn ngữ lúc xảy ra | |
|
||||
| Project / workspace liên quan | (mô tả, **không** nêu tên khách hàng) |
|
||||
|
||||
# 4. Các bước tái hiện
|
||||
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
**Tỉ lệ tái hiện:** _luôn / thỉnh thoảng (n/m lần) / không_
|
||||
|
||||
# 5. Ma trận biến thể đã thử
|
||||
|
||||
| Biến thể | Đã thử | Kết quả |
|
||||
|---|---|---|
|
||||
| Theme dark | | |
|
||||
| Theme light | | |
|
||||
| Ngôn ngữ vi / ja / en | | |
|
||||
| Cửa sổ nhỏ nhất / maximize | | |
|
||||
| Đổi theme/ngôn ngữ **trước** rồi mới mở màn (bẫy P07) | | |
|
||||
|
||||
# 6. Khoanh vùng
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| Nav row | Dashboard / Schedule / Workspace / Monitoring |
|
||||
| Sub-tab / dialog | |
|
||||
| `manifest.json` slug | |
|
||||
| Widget dựng tại | `file.py:line` |
|
||||
| Control (`controls.json`) | `var`, `type`, `object_name` |
|
||||
| Đã kiểm cả `ui/` và `presentation/` | có / không |
|
||||
|
||||
# 7. Giả thuyết nguyên nhân gốc
|
||||
|
||||
| # | Giả thuyết | Mã pitfall | Đã xác minh thế nào | Còn / loại |
|
||||
|---|---|---|---|---|
|
||||
| 1 | | P__ | | |
|
||||
| 2 | | P__ | | |
|
||||
|
||||
**Kết luận:** _(một nguyên nhân + `file:line`, hoặc "chưa xác định" nếu `confidence: low`)_
|
||||
|
||||
# 8. Tác động
|
||||
|
||||
- Ai bị ảnh hưởng:
|
||||
- Chặn công việc gì:
|
||||
- Có đường vòng không:
|
||||
- Lý do chọn mức `severity` này:
|
||||
|
||||
# 9. Cân nhắc bảo mật
|
||||
|
||||
- Chạm permission / credential / monitoring bảo mật / isolation / routing? _có / không_
|
||||
- Dữ liệu người dùng gửi lên đã redact? _có / không — mô tả đã bỏ gì_
|
||||
- Có dấu hiệu ở `system/security.md` S4 không?
|
||||
|
||||
# 10. Open Questions (tối đa 3)
|
||||
|
||||
| # | Câu hỏi | Mặc định nếu không trả lời | Có chặn không |
|
||||
|---|---|---|---|
|
||||
| 1 | | | có / không |
|
||||
|
||||
# 11. Out of scope
|
||||
|
||||
Vấn đề khác phát hiện được, **không** sửa trong lần này — đề xuất issue riêng.
|
||||
@@ -0,0 +1,75 @@
|
||||
# Output Contract — `dispatch_plan`
|
||||
|
||||
Do `fix-dispatcher` sinh ra, trước khi bất kỳ agent nào khác chạy.
|
||||
Đây là thứ quyết định **effort** của cả lượt xử lý, nên nó phải chứng minh được lựa chọn
|
||||
của mình — nhưng phải ngắn. Trần: **30 dòng** cho phần người đọc.
|
||||
|
||||
---
|
||||
|
||||
```yaml
|
||||
---
|
||||
report_id: RPT-<YYYYMMDD>-<NN> # một phản ánh của người dùng = một report_id
|
||||
defects:
|
||||
- defect_id: UI-<YYYYMMDD>-<NN>
|
||||
tier: <T0 | T1 | T2 | T3 | T3-SEC>
|
||||
lane: <DIRECT | SOLO | PAIR | FULL | FULL-SEC>
|
||||
category: <visual | flow | i18n-a11y | security | not-ui>
|
||||
severity: <S1 | S2 | S3 | S4>
|
||||
confidence: <low | medium | high>
|
||||
reproducible: <yes | no | intermittent>
|
||||
security_review: <required | not-required>
|
||||
entry_agent: <fix-implementer | ui-visual-fixer | ux-flow-fixer | i18n-a11y-fixer | security-defect-fixer | ui-bug-triage | SELF | RETURN_TO_REPORTER>
|
||||
affected_files: [path/to/file.py:123]
|
||||
tier_evidence: "<dòng nào của roles/0_fix_dispatcher.md Bước 3 đã trúng>"
|
||||
budget_calls: <số lần gọi agent dự kiến>
|
||||
execution:
|
||||
parallel: [[UI-...-01, UI-...-02]] # các defect_id độc lập, chạy cùng lúc
|
||||
sequential: [UI-...-03] # phụ thuộc, hoặc T3 cần triage trước
|
||||
blocked_on: []
|
||||
---
|
||||
```
|
||||
|
||||
# 1. Phản ánh gốc
|
||||
|
||||
Nguyên văn của người báo lỗi, **đã redact** (`system/security.md`). Không diễn giải lại.
|
||||
|
||||
# 2. Tách defect
|
||||
|
||||
| defect_id | Triệu chứng người dùng thấy | Category | Tier |
|
||||
|---|---|---|---|
|
||||
| | | | |
|
||||
|
||||
Một dòng = một nguyên nhân gốc. Chỉ có một defect thì bảng có một dòng — không xoá bảng.
|
||||
|
||||
# 3. Bằng chứng chấm tier
|
||||
|
||||
Mỗi defect **một dòng**, trích đúng tiêu chí đã trúng. Không được viết "trông đơn giản".
|
||||
|
||||
| defect_id | Tier | Trúng tiêu chí | Lệnh đã dùng để xác nhận |
|
||||
|---|---|---|---|
|
||||
| | T0 | loại 1 (số đo hiển thị), 0 disqualifier | `check_loc.py`, `grep -rn` blast radius |
|
||||
| | T2 | "chạm QSS/token dùng chung" | `grep -rn "<objectName>"` |
|
||||
|
||||
Với **T0** bắt buộc có cột lệnh — Gate S và blast radius phải đo, không được ước lượng.
|
||||
|
||||
# 4. Kế hoạch chạy
|
||||
|
||||
```text
|
||||
UI-...-01 T0 DIRECT → hub sửa luôn, cổng máy §4.1
|
||||
UI-...-02 T2 PAIR → ui-visual-fixer → fix-implementer → regression-reviewer
|
||||
UI-...-03 T3 FULL → ui-bug-triage → ... (chờ triage mới biết specialist nào)
|
||||
```
|
||||
|
||||
Ngân sách tổng: `___` lần gọi agent (bảng §4 của role 0 cho phép `___`).
|
||||
|
||||
# 5. Điều đã cố ý KHÔNG làm
|
||||
|
||||
- Không gọi `ui-bug-triage` cho defect nào? Vì sao được phép bỏ (phản ánh đã tự chỉ ra
|
||||
màn hình + triệu chứng cụ thể).
|
||||
- Không gọi `regression-reviewer` cho defect nào? Chỉ hợp lệ ở T0/T1 — nêu rõ cổng nào
|
||||
thay thế.
|
||||
|
||||
# 6. Open question
|
||||
|
||||
Tối đa 3, mỗi câu kèm phương án mặc định nếu người dùng không trả lời
|
||||
(`response_policy.md` R3). Câu hỏi **chặn** thì đưa vào `blocked_on`.
|
||||
@@ -0,0 +1,114 @@
|
||||
# Output Contract — `fix_plan`
|
||||
|
||||
Do `ui-visual-fixer` / `ux-flow-fixer` / `i18n-a11y-fixer` sinh ra.
|
||||
Đây là thứ `fix-implementer` thi hành — mơ hồ chỗ nào thì chỗ đó sẽ bị đoán bừa.
|
||||
|
||||
---
|
||||
|
||||
```yaml
|
||||
---
|
||||
defect_id: UI-<YYYYMMDD>-<NN>
|
||||
from_agent: <tên specialist>
|
||||
next_agent: <fix-implementer | RETURN_TO_REPORTER>
|
||||
root_cause_file: path/to/file.py:123
|
||||
root_cause_pitfall: P__
|
||||
confidence: <medium | high>
|
||||
security_review: <required | not-required>
|
||||
loc_risk: <none | near-limit | exceeds>
|
||||
blast_radius: [] # màn/widget khác dùng chung phần bị sửa
|
||||
---
|
||||
```
|
||||
|
||||
# 1. Nguyên nhân gốc
|
||||
|
||||
**Đúng một.** Nêu `file:line`, trích đoạn code, và giải thích *tại sao dòng đó sinh ra
|
||||
triệu chứng người dùng thấy*.
|
||||
|
||||
```python
|
||||
# path/to/file.py:118
|
||||
```
|
||||
|
||||
**Vì sao đây là nguyên nhân gốc chứ không phải triệu chứng:**
|
||||
|
||||
**Các giả thuyết đã loại và lý do loại:**
|
||||
|
||||
# 2. Ràng buộc thiết kế đã kiểm
|
||||
|
||||
- [ ] Không mâu thuẫn với ràng buộc có chủ ý ở `theme_tokens.md` §4.
|
||||
- [ ] Nếu phản ánh của người dùng thực ra là thiết kế đúng: nêu ở đây và chuyển
|
||||
`next_agent: RETURN_TO_REPORTER`.
|
||||
|
||||
# 3. Phương án sửa
|
||||
|
||||
| # | File | Thay đổi | Vì sao chọn mức này |
|
||||
|---|---|---|---|
|
||||
| 1 | | | |
|
||||
|
||||
**Mức can thiệp đã chọn** (theo thang ưu tiên của role):
|
||||
|
||||
**Các phương án đã cân nhắc và bị loại:**
|
||||
|
||||
# 4. Diff dự kiến
|
||||
|
||||
```diff
|
||||
```
|
||||
|
||||
# 5. Ảnh hưởng lan toả
|
||||
|
||||
| Chỗ khác dùng chung | Đã kiểm | Kết luận |
|
||||
|---|---|---|
|
||||
| | | |
|
||||
|
||||
Lệnh đã chạy để tìm:
|
||||
|
||||
```bash
|
||||
grep -rn "<...>" --include=*.py .
|
||||
```
|
||||
|
||||
# 6. Ràng buộc kiến trúc
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| Tầng bị sửa | presentation / ui / theme / i18n |
|
||||
| Có chạm `application/` hoặc `domain/` không | không — hoặc **lý do bắt buộc phải chạm** |
|
||||
| LOC file sau khi sửa | `___ / 400` |
|
||||
| Cần tách module không | có/không — nếu có, tách thế nào |
|
||||
| File mới có được import ngay không (Gate O) | |
|
||||
|
||||
# 7. i18n
|
||||
|
||||
| Key | en | ja | vi | File |
|
||||
|---|---|---|---|---|
|
||||
| | | | | `i18n/____.py` |
|
||||
|
||||
Không thêm chuỗi mới thì ghi `N/A`.
|
||||
|
||||
# 8. Cách kiểm chứng
|
||||
|
||||
## 8.1 Test tự động
|
||||
|
||||
```python
|
||||
# tests/ui/test_____.py
|
||||
def test_...(qtbot, ctx):
|
||||
"""Regression: <triệu chứng> (defect UI-...)."""
|
||||
```
|
||||
|
||||
Test này phải **đỏ** trước khi sửa. Nếu không viết được test tự động: nêu lý do cụ thể.
|
||||
|
||||
## 8.2 Kiểm bằng mắt
|
||||
|
||||
| Trục | Giá trị phải thử | Kết quả mong đợi |
|
||||
|---|---|---|
|
||||
| Theme | dark, light | |
|
||||
| Ngôn ngữ | | |
|
||||
| Kích thước cửa sổ | nhỏ nhất, maximize | |
|
||||
| Thứ tự thao tác | có kịch bản P07 | |
|
||||
|
||||
# 9. Rủi ro
|
||||
|
||||
| Rủi ro | Khả năng | Giảm thiểu |
|
||||
|---|---|---|
|
||||
|
||||
# 10. Out of scope
|
||||
|
||||
Cố ý **không** làm trong lần này, và vì sao.
|
||||
@@ -0,0 +1,111 @@
|
||||
# Output Contract — `fix_report`
|
||||
|
||||
Do `fix-implementer` sinh ra sau khi đã áp bản vá.
|
||||
Mục tiêu duy nhất: **trung thực** (`guardrail.md` G10). Reviewer sẽ chạy lại mọi thứ.
|
||||
|
||||
---
|
||||
|
||||
```yaml
|
||||
---
|
||||
defect_id: UI-<YYYYMMDD>-<NN>
|
||||
from_agent: fix-implementer
|
||||
next_agent: regression-reviewer
|
||||
branch: fix/ui-<slug>
|
||||
commits: []
|
||||
gate_result: <all-pass | partial | fail>
|
||||
tests_added: []
|
||||
visual_check: <done | not-done>
|
||||
security_review: <required | not-required>
|
||||
---
|
||||
```
|
||||
|
||||
# 1. Đã làm gì
|
||||
|
||||
| # | File | Thay đổi | Khớp mục nào trong fix_plan |
|
||||
|---|---|---|---|
|
||||
| 1 | | | §3.1 |
|
||||
|
||||
# 2. Diff
|
||||
|
||||
```bash
|
||||
git diff main...HEAD --stat
|
||||
```
|
||||
|
||||
```
|
||||
```
|
||||
|
||||
# 3. Test regression
|
||||
|
||||
| File test | Tên test | Đỏ trước khi sửa | Xanh sau khi sửa |
|
||||
|---|---|---|---|
|
||||
| | | ✅ / ❌ | ✅ / ❌ |
|
||||
|
||||
Bằng chứng "đỏ trước":
|
||||
|
||||
```
|
||||
```
|
||||
|
||||
Bằng chứng "xanh sau":
|
||||
|
||||
```
|
||||
```
|
||||
|
||||
Nếu chưa chứng minh được "đỏ trước": **nói rõ**, đừng bỏ trống.
|
||||
|
||||
# 4. Kết quả CASAN gate
|
||||
|
||||
```bash
|
||||
python scripts/run_quality_gate.py
|
||||
```
|
||||
|
||||
Dán **output thật**, không tóm tắt:
|
||||
|
||||
```
|
||||
```
|
||||
|
||||
| Cổng | Kết quả | Ghi chú |
|
||||
|---|---|---|
|
||||
| C — Clean Architecture | | |
|
||||
| A — Secrets | | |
|
||||
| S — LOC ≤ 400 | | LOC file lớn nhất: `___/400` |
|
||||
| O — Orphan module | | |
|
||||
| A/N — pytest | | |
|
||||
|
||||
## Test vốn đã đỏ TỪ TRƯỚC bản vá này
|
||||
|
||||
| Test | Lý do đỏ | Có liên quan bản vá không |
|
||||
|---|---|---|
|
||||
|
||||
# 5. Kiểm chứng bằng mắt
|
||||
|
||||
| Trục | Đã thử | Kết quả |
|
||||
|---|---|---|
|
||||
| dark | | |
|
||||
| light | | |
|
||||
| vi / ja / en | | |
|
||||
| cửa sổ nhỏ nhất / maximize | | |
|
||||
| kịch bản P07 | | |
|
||||
|
||||
Chưa chạy được app → ghi thẳng **"chưa kiểm chứng bằng mắt"** kèm lý do. Không suy đoán
|
||||
kết quả.
|
||||
|
||||
# 6. Lệch so với fix_plan
|
||||
|
||||
| Chỗ lệch | Vì sao |
|
||||
|---|---|
|
||||
|
||||
Không lệch thì ghi "không có".
|
||||
|
||||
# 7. Chưa làm được
|
||||
|
||||
| Việc | Vì sao | Đề xuất |
|
||||
|---|---|---|
|
||||
|
||||
# 8. Out of scope — phát hiện thêm khi sửa
|
||||
|
||||
Vấn đề khác nhìn thấy nhưng **không** sửa (G1, G8). Đề xuất mở issue riêng.
|
||||
|
||||
# 9. Bảo mật
|
||||
|
||||
- Có secret/PII lọt vào code, test fixture, commit message không? _đã kiểm — có/không_
|
||||
- Cờ `security_review` còn nguyên như plan? _có/không_
|
||||
@@ -0,0 +1,88 @@
|
||||
# Output Contract — `pr_body`
|
||||
|
||||
Do `regression-reviewer` sinh ra khi verdict là PASS / PASS_WITH_NOTES.
|
||||
Khớp **đúng** `.gitea/PULL_REQUEST_TEMPLATE.md` — giữ nguyên tiêu đề mục để reviewer quen mắt.
|
||||
|
||||
Tiêu đề PR: `fix(ui): <mô tả ngắn, tiếng Anh, thể mệnh lệnh>`
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
_Nói **tại sao**, không chỉ **cái gì**. Nêu triệu chứng người dùng, nguyên nhân gốc kèm
|
||||
`file:line`, và vì sao chọn cách sửa này._
|
||||
|
||||
Root cause: `path/to/file.py:123` (pitfall P__)
|
||||
Defect: `UI-<YYYYMMDD>-<NN>`
|
||||
|
||||
## Change Type
|
||||
|
||||
- [ ] Cowork feature
|
||||
- [x] Bug fix
|
||||
- [ ] Core AI contribution
|
||||
- [ ] Test / hardening
|
||||
- [ ] Performance
|
||||
- [ ] Documentation
|
||||
|
||||
## Related Work
|
||||
|
||||
Cowork Task:
|
||||
|
||||
Core Repo: http://34.143.229.138/gitea-admin/fsg-ai-core-assets
|
||||
|
||||
Core AI Issue:
|
||||
|
||||
Core Task:
|
||||
|
||||
Related PR:
|
||||
|
||||
## Scope
|
||||
|
||||
**Cố ý bao gồm:**
|
||||
|
||||
**Cố ý KHÔNG bao gồm:** _(các phát hiện out-of-scope, kèm issue đề xuất)_
|
||||
|
||||
## Validation
|
||||
|
||||
- [ ] Unit tests
|
||||
- [ ] Integration tests
|
||||
- [ ] Manual verification
|
||||
- [ ] Regression check
|
||||
|
||||
Commands / evidence:
|
||||
|
||||
```bash
|
||||
python scripts/run_quality_gate.py
|
||||
QT_QPA_PLATFORM=offscreen pytest tests/ui/test_<...>.py -q
|
||||
```
|
||||
|
||||
```
|
||||
<output thật>
|
||||
```
|
||||
|
||||
Ma trận kiểm bằng mắt:
|
||||
|
||||
| Trục | Kết quả |
|
||||
|---|---|
|
||||
| dark / light | |
|
||||
| vi / ja / en | |
|
||||
| cửa sổ nhỏ nhất / maximize | |
|
||||
|
||||
## Security Impact
|
||||
|
||||
_Permission / credential / network / customer data impact._
|
||||
|
||||
Điền cả khi là "không có". Nếu `security-review: required`: ghi rõ tại sao, và nhắc rằng
|
||||
**CI xanh không đủ để merge** (`docs/governance/review-policy.md`).
|
||||
|
||||
## Compatibility
|
||||
|
||||
- [ ] No breaking change
|
||||
- [ ] Breaking change documented
|
||||
|
||||
## Reviewer Notes
|
||||
|
||||
_Chỉ đúng chỗ cần soi kỹ nhất. Kèm các finding `should-fix` / `nit` mà reviewer agent đã
|
||||
ghi nhận nhưng không chặn merge._
|
||||
|
||||
Ảnh `docs/screens/` cần chụp lại: _có/không — liệt kê slug_
|
||||
Reference in New Issue
Block a user