Team Gamma · Automation, Workflows & Governance
Toàn bộ phần việc refactor 10 ngày của Team Gamma — Nam, Hiệp, Lâm. Cả ba đẩy chung vào gamma/refactor. Nam làm thêm một mục chung —
khung kiến trúc, hợp đồng dữ liệu, cổng kiểm duyệt — nằm ngoài ba nhánh; xong mục đó thì
ba người vào ba nhánh tính năng ngang nhau, không ai phải sửa chung file với ai.
Ba tài liệu refactor gọi team này là “Team Nam” (theo tên lead). Cùng một team, cùng
phạm vi R02 · R08 · R09 · R07-T06. Nhánh của team dùng tiền tố gamma/; ba tài liệu refactor viết
nam/workflow-governance-* theo tên lead — cùng một thứ.
Tóm tắt · thứ tự làm
api_key và báo Team Duy · script CASAN Check 1 · đưa 3 check vào CI ·
quyết số phận 24 checker UI. Merge xong mới chia nhánh.
app.py, config.py, theme.py,
i18n.py. ~2.700 dòng.
co4e_tab.py + co4e_canvas.py
thành 5 phần. ~2.880 dòng, file to nhất team.
Ba điều bắt buộc
app.py. N1 lắp trong bootstrap.py ngày 28/08.Nghiệm thu
Trên gamma/refactor: không file nào được sửa bởi hai người khác nhau.
Có là quy ước số 1 đang bị vi phạm.
Sáu việc dưới đây không thuộc làn nào — chúng là thứ cả ba người cùng đụng
vào. Nam làm một lần và đẩy lên gamma/refactor, rồi hai người kia
mới bắt đầu. Ước tính nửa ngày.
domain/ application/ infrastructure/
presentation/ platform/ tests/fakes/ —
hiện tại chưa tồn tại, 0 file. Mọi task của cả ba người đều ghi vào đây; để ba
người tự tạo là đụng nhau ở __init__.py ngay ngày đầu.
SecretStore, ConfigRepository, kèm
FakeSecretStore và FakeConfigRepository. Chỉ chữ ký, chưa cần
thân hàm. Đây là thứ gỡ chốt cho cả hai người kia — 156 lời gọi
ctx.config.* trong 29 file đang chờ nó.
api_key và báo Team Duy
provider_conf() còn trả api_key bên trong, hay tách hẳn sang
SecretStore? Có 5 nơi đọc trực tiếp, 3 trong số đó nằm trong
providers/ của Team Duy. Quyết một mình rồi im lặng là làm vỡ code
team bạn.
scripts/audit_security.py (CASAN Check 1)
Gamma chủ trì check này ngày 30/08. Viết ngay hôm nay thì lead tự kiểm được trong suốt
quá trình chuyển API key, thay vì tới ngày cổng mới chạy lần đầu và phát hiện vấn đề.
pytest tests -q. Ba check (secret · ≤400 dòng · import
guard) không nằm trong CI, nên tới 30/08 mới biết ai vi phạm. Đưa vào CI thì mỗi PR tự
báo.
cowork_local.config (34 chỗ) và cowork_local.app
(16 chỗ) — sẽ chết ngay khi lead đụng config.py. Đây là lưới an toàn
duy nhất cho phần UI vừa làm xong. Xem mục quy ước bên dưới.
Ba làn ngang nhau, mỗi làn khoảng 2.700 dòng phải bóc tách, cùng đẩy vào một
nhánh gamma/refactor. Nam nhận làn N1 vì đó là làn chạm tới file
dùng chung nhiều nhất. Cột “sở hữu” là danh sách file chỉ người đó được
sửa — trên nhánh chung, đây là thứ duy nhất giữ cho ba người không giẫm chân.
Nam giữ — làn chạm nhiều file dùng chung nhất
settings_dialog.py → 4 section widgetbootstrap.py + tách MainWindow → shell · tray · lifecycle (cuối sprint, lắp factory của hai người kia)~2.700 dòng · 727 settings + 1.352 app + 616 config
+ mục chung ở trên
Hiệp — 7 tab, việc lặp cần kỷ luật
monitoring_tab.py → 7 tab độc lậpCanonicalAuditLoggerMonitoringQueryService read-only, phân trangmodel_pricing ↔ usage_trackeragent_security ↔ alert~2.650 dòng · 1.545 monitoring + ~1.100 core
Lâm — canvas và luồng chạy workflow
Co4EWorkflowService thuần Pythonco4e_tab.py + co4e_canvas.py → canvas · node property · run control · chat view · agent listToolPolicyGateway của Team Hoa — dùng fake, không chờ~2.880 dòng · file to nhất của cả team
Tám điều dưới đây là luật của team, Nam chốt. Bốn điều đầu là bắt buộc — trên một nhánh chung, vi phạm không chỉ hại mình mà chặn cả hai người kia.
app.py, theme.py, i18n.py, config.py,
bootstrap.py thuộc nhánh N1 của Nam. Cần thêm chuỗi hay token màu thì
nhắn, đừng sửa — Nam thêm trong ngày. Đây là ba file duy nhất có thể gây conflict
thật, và luật này xoá hẳn khả năng đó.
Mỗi nhánh expose một hàm dựng widget với chữ ký chốt từ ngày đầu, ví dụ
build_monitoring_tab(ctx, query_service) -> QWidget. Nam gọi nó trong bootstrap.py ngày 28/08. Không ai tự sửa chỗ khởi tạo trong
app.py.
Chưa có ConfigRepository bản thật thì dùng FakeConfigRepository.
Chưa có ToolPolicyGateway của Team Hoa thì đã có fake sẵn. Báo ngay trong ngày
nếu thiếu fake nào — đó là việc của nhóm trưởng, không phải lý do dừng tay.
Cả ba đẩy vào gamma/refactor, nên không còn nhánh riêng làm vùng
đệm. Ba việc bắt buộc: git pull --rebase trước mỗi lần đẩy;
commit nhỏ và đẩy trong ngày, đừng ôm 500 dòng ba hôm; và
không bao giờ đẩy thứ làm pytest tests -q đỏ — nhánh hỏng
là hai người kia đứng hình. Lỡ đẩy nhầm thì sửa ngay hoặc
git revert, đừng để qua đêm.
Một PR cho một sub-widget hoặc một service, không dồn 7 tab vào một PR cuối tuần. Nhóm trưởng duyệt trong ngày. PR càng to thì rủi ro càng dồn về ngày 28/08.
Baseline hiện tại: 102 test xanh trong 3,4 giây. Chạy pytest tests -q
trước mỗi lần đẩy. Đây là lưới an toàn cho phần logic — giữ nó xanh suốt 10 ngày.
Hai điều kiện của CASAN Check 2 và 3. Tự kiểm trước khi đẩy — CI sẽ báo, nhưng biết sớm thì đỡ phải tách lại lần hai.
24 checker sẽ vỡ khi file bị dời. Ai dời file thì sửa checker tương ứng ngay trong commit đó — tốn thêm khoảng 15% thời gian, đổi lại giữ được lưới an toàn cho phần UI vừa làm xong. Đã chốt 21/08: đường A. Nam chịu trách nhiệm nếu đổi ý.
Cột trái là thứ phải có trong tay mới làm được, kèm nguồn. Cột phải là thứ bắt buộc giao ra, kèm người nhận. Nhãn có rồi nghĩa là mục chung đã làm xong.
Input — cần có
config.py 616 dòngui/settings_dialog.py 727 dòngapp.py 1.352 dòngapi_key — trước 26/08build_monitoring_tab() — trước 28/08build_co4e_tab() — trước 28/08Output — phải giao
SecretStore · ConfigRepository + fake → cho Hiệp và Lâmscripts/audit_security.py → cho CIinfrastructure/persistence/json/atomic_json_file.pyinfrastructure/config/ — cài đặt thật + settings facadeinfrastructure/secrets/keyring_adapter.pypresentation/settings/ — 4 widgetbootstrap.py + presentation/shell/ — 3 filedocs/architecture/security-policy.mdInput — cần có
ui/monitoring_tab.py 1.545 dòngcore/usage_tracker.py 524 · sandbox_manager.py 335core/model_pricing.py 284 · agent_security.py 272 · audit_log.py 115FakeConfigRepository — dùng được ngayOutput — phải giao
build_monitoring_tab() → cho Nam, trước 28/08FakeAuditLogger · FakeMonitoringQueryService → cho cả teampresentation/monitoring/ — 7 tab + shellapplication/monitoring/monitoring_query_service.pyinfrastructure/telemetry/audit_logger.pyinfrastructure/sandbox/sandbox_capabilities.pyInput — cần có
ui/co4e_tab.py 2.089 dòngui/co4e_canvas.py 791 · co4e_config_panel.pycore/co4e_run_manager.py 331core/co4e.py — dataclass Workflow/Node/Edge đã cóFakeConfigRepositoryToolPolicyGateway — rủi ro liên team cao nhất, lấy trong hôm nayOutput — phải giao
build_co4e_tab() → cho Nam, trước 28/08FakeCo4EWorkflowService → cho cả teamdomain/workflows/ — DTO chốt ngày đầuapplication/workflows/co4e_workflow_service.pypresentation/co4e/ — 5 phần| Điều kiện | Ngưỡng | Tự kiểm bằng |
|---|---|---|
| File mới sau khi tách | ≤ 400 dòng | wc -l |
domain/ và application/ import PySide6 | 0 | grep -r PySide6 |
| Test hiện có | 102 xanh | pytest tests -q |
| Credential lộ | 0 | python scripts/audit_security.py |
| Checker UI trong phạm vi mình dời | đã cập nhật | python tools/check_<tên>.py |
Ba hàng chạy độc lập. Hàng tô nền là lúc cả ba phải gặp nhau.
| Ngày | N1 · Nam | N2 · Hiệp | N3 · Lâm |
|---|---|---|---|
| 21/08 T6 |
Mục chung · dựng khung · interface + fake · chốt api_key · CASAN scriptMerge trước khi hai người kia bắt đầu | Chốt schema log 9 trườngGiữ nguyên định dạng cũ để 24 chỗ gọi không phải sửa | Chốt chữ ký Co4EWorkflowServiceNộp cho lead để lắp bootstrap sau |
| 22–23/08 T7–CN |
AtomicJsonFile · ConfigRepository · Typed Settings Facade | CanonicalAuditLogger · gỡ vòng lặp pricing ↔ usage | Co4EWorkflowService — CRUD & validate, test không cần Qt |
| 23/08 17:00 |
Checkpoint 1 100% DTO và fake xong · pytest xanh · không ai bị chặn |
||
| 24/08 T2 |
Tách settings: provider + connector widget | 3 tab đầu: overview · sandbox · security events | node_property_panel · agent_list_panel |
| 25/08 T3 |
Tách settings: routing + general widget | 4 tab còn lại: MCP · action logs · agent status · security settings | co4e_canvas_widget — thao tác node |
| 26/08 T4 |
Chuyển API key sang SecretStoreBáo Team Duy trước khi đụng providers/ | Lắp shell MonitoringTab · query service bản thật | Run control · chat view |
| 27/08 T5 |
Schema versioning · recovery policy | Ma trận Sandbox · gỡ vòng lặp agent_security | Lắp container Co4ETab · thay fake bằng service thật |
| 28/08 T6 |
bootstrap.py + tách MainWindowNhận factory của Hiệp và Lâm để lắp | Nộp factory · dọn file >400 dòng · cập nhật checker | Nộp factory · dọn file >400 dòng · cập nhật checker |
| 28/08 17:00 |
Checkpoint 2 Tách xong 100% god file · 0 circular import | ||
| 29/08 T7 |
Tài liệu Security Policy · integration test Settings | Integration test Monitoring | Integration test luồng Co4E đầu-cuối |
| 30/08 CN 17:00 |
CASAN Gate Nam chủ trì Check 1 — quét toàn bộ config/JSON, phải ra 0 secret plaintext. Hiệp và Lâm sửa ngay phần của mình nếu script bắt được. | ||
| 31/08 T2 15:00 |
Bàn giao Fix tồn đọng · cập nhật tài liệu kiến trúc · merge PR cuối · smoke test 5 luồng chính | ||
Không phải “đã họp xong” mà là chạy được. Ba câu hỏi, trả lời bằng lệnh.
| Câu hỏi | Cách trả lời | Khi nào |
|---|---|---|
| Hiệp có chạy được khi chưa có config bản thật? | Dựng một tab Monitoring, chạy test của nó, không import cowork_local.config dòng nào — chỉ dùng FakeConfigRepository |
21/08 |
| Lâm có chạy được khi Team Hoa chưa xong gateway? | Test Co4EWorkflowService xanh với FakeToolPolicyGateway |
23/08 |
| Ba người có đụng file nhau không? | git log --name-only --pretty=%an trên gamma/refactor —
không file nào được xuất hiện dưới hai tên khác nhau |
mỗi ngày |