docs(refactor): cả ba đẩy chung gamma/refactor; đặt tên Nam, Hiệp, Lâm

Đổi mô hình: không còn nhánh riêng mỗi người, cả ba cùng đẩy vào
gamma/refactor. Ba "nhánh" thành ba "làn" — vẫn chia việc như cũ, nhưng ranh
giới file bây giờ là thứ DUY NHẤT giữ ba người không giẫm chân, vì không còn
nhánh riêng làm vùng đệm.

Thêm quy ước số 4 cho nhánh chung, xếp vào nhóm bắt buộc: pull --rebase trước
mỗi lần đẩy; commit nhỏ, đẩy trong ngày; không bao giờ đẩy thứ làm
pytest tests -q đỏ, vì nhánh hỏng là hai người kia đứng hình.

Phần nghiệm thu đổi theo: trước đây so file giữa ba nhánh, giờ không còn ba
nhánh để so. Thay bằ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.

Hai quyết định đã chốt, ghi vào GammaTeam_decisions.md:
  1. api_key: đường A — ConfigRepository ghép key từ SecretStore vào dict, 5
     nơi đọc không đổi dòng nào, không cần báo Duy và Hoa.
  2. 24 checker UI: đường A — ai dời file thì sửa checker ngay trong commit
     đó, kèm ràng buộc phải nói rõ sửa gì và chạy check_probes_bite.py sau.
     Không đưa vào CI sprint này vì chúng dựng MainWindow thật.

Baseline trong tài liệu cập nhật 90 -> 102 test.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nam Pham Dinh Thanh
2026-08-21 22:24:03 +09:00
co-authored by Claude Opus 5
parent 3138856741
commit 2627e691ce
2 changed files with 113 additions and 74 deletions
+83 -68
View File
@@ -216,21 +216,21 @@
<header class="top"> <header class="top">
<p class="eyebrow">Team Gamma · Automation, Workflows &amp; Governance</p> <p class="eyebrow">Team Gamma · Automation, Workflows &amp; Governance</p>
<h1>Một mục chung, rồi ba nhánh tính năng</h1> <h1>Một nhánh chung, ba làn không đụng nhau</h1>
<p class="lede"> <p class="lede">
Toàn bộ phần việc refactor 10 ngày của Team Gamma. Nhóm trưởng làm thêm một mục chung — 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 <code>gamma/refactor</code>. 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ì 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 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.
</p> </p>
<p class="alias"> <p class="alias">
Ba tài liệu refactor gọi team này là <b>“Team Nam”</b> (theo tên lead). Cùng một team, cùng Ba tài liệu refactor gọi team này là <b>“Team Nam”</b> (theo tên lead). Cùng một team, cùng
phạm vi R02 · R08 · R09 · R07-T06. Tên nhánh giữ tiền tố <code>nam/</code> đã thống nhất với phạm vi R02 · R08 · R09 · R07-T06. Nhánh của team dùng tiền tố <code>gamma/</code>; ba tài liệu refactor viết
Team Duy và Team Hoa — đổi sang <code>gamma/</code> sẽ lệch quy ước chung. <code>nam/workflow-governance-*</code> theo tên lead — cùng một thứ.
</p> </p>
<div class="facts"> <div class="facts">
<div class="fact"><span class="k">Thời hạn</span><span class="v mono">21/08 → 31/08</span></div> <div class="fact"><span class="k">Thời hạn</span><span class="v mono">21/08 → 31/08</span></div>
<div class="fact"><span class="k">Người</span><span class="v mono">3</span></div> <div class="fact"><span class="k">Người</span><span class="v mono">Nam · Hiệp · Lâm</span></div>
<div class="fact"><span class="k">Nhánh</span><span class="v mono">1 chung + 3 tính năng</span></div> <div class="fact"><span class="k">Nhánh</span><span class="v mono">gamma/refactor</span></div>
<div class="fact"><span class="k">Code phải bóc</span><span class="v mono">~6.500 dòng</span></div> <div class="fact"><span class="k">Code phải bóc</span><span class="v mono">~6.500 dòng</span></div>
<div class="fact"><span class="k">Cổng phải qua</span><span class="v mono">CASAN Check 1</span></div> <div class="fact"><span class="k">Cổng phải qua</span><span class="v mono">CASAN Check 1</span></div>
</div> </div>
@@ -243,27 +243,27 @@
<ul class="flow"> <ul class="flow">
<li class="f0"> <li class="f0">
<span class="b">CHUNG</span> <span class="b">CHUNG</span>
<span class="t"><b>Nhóm trưởng làm trước, nửa ngày</b> <span class="t"><b>Nam làm trước, nửa ngày</b>
<small>Dựng khung 5 thư mục (đang là 0 file) · interface + fake cho Config/Secrets · <small>Dựng khung 5 thư mục (đang là 0 file) · interface + fake cho Config/Secrets ·
chốt <code>api_key</code> và báo Team Duy · script CASAN Check 1 · đưa 3 check vào CI · chốt <code>api_key</code> 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.</small></span> quyết số phận 24 checker UI. Merge xong mới chia nhánh.</small></span>
</li> </li>
<li class="f1"> <li class="f1">
<span class="b">N1</span> <span class="b">N1</span>
<span class="t"><b>Cấu hình · Bí mật · Vỏ ứng dụng — nhóm trưởng</b> <span class="t"><b>N1 — Nam · Cấu hình, Bí mật, Vỏ ứng dụng</b>
<small>R02 (6 task) · settings 4 widget · bootstrap + MainWindow · policy doc. <small>R02 (6 task) · settings 4 widget · bootstrap + MainWindow · policy doc.
Giữ luôn <code>app.py</code>, <code>config.py</code>, <code>theme.py</code>, Giữ luôn <code>app.py</code>, <code>config.py</code>, <code>theme.py</code>,
<code>i18n.py</code>. ~2.700 dòng.</small></span> <code>i18n.py</code>. ~2.700 dòng.</small></span>
</li> </li>
<li class="f2"> <li class="f2">
<span class="b">N2</span> <span class="b">N2</span>
<span class="t"><b>Giám sát — thành viên 1</b> <span class="t"><b>N2 — Hiệp · Giám sát</b>
<small>7 tab Monitoring · CanonicalAuditLogger · MonitoringQueryService · <small>7 tab Monitoring · CanonicalAuditLogger · MonitoringQueryService ·
2 vòng lặp import · ma trận Sandbox. ~2.650 dòng.</small></span> 2 vòng lặp import · ma trận Sandbox. ~2.650 dòng.</small></span>
</li> </li>
<li class="f3"> <li class="f3">
<span class="b">N3</span> <span class="b">N3</span>
<span class="t"><b>Co4E Studio — thành viên 2</b> <span class="t"><b>N3 — Lâm · Co4E Studio</b>
<small>Co4EWorkflowService · tách <code>co4e_tab.py</code> + <code>co4e_canvas.py</code> <small>Co4EWorkflowService · tách <code>co4e_tab.py</code> + <code>co4e_canvas.py</code>
thành 5 phần. ~2.880 dòng, file to nhất team.</small></span> thành 5 phần. ~2.880 dòng, file to nhất team.</small></span>
</li> </li>
@@ -278,18 +278,18 @@
</ol> </ol>
<p class="cap" style="margin-top:20px">Nghiệm thu</p> <p class="cap" style="margin-top:20px">Nghiệm thu</p>
<p style="margin:0;font-size:14px;color:var(--muted)"> <p style="margin:0;font-size:14px;color:var(--muted)">
<code>git diff --name-only</code> giữa ba nhánh — giao của ba tập phải <b style="color:var(--ink)">rỗng</b>. Trên <code>gamma/refactor</code>: không file nào được sửa bởi hai người khác nhau.
Còn giao nhau là quy ước 1 đang bị vi phạm. Có là quy ước <b style="color:var(--ink)">số 1</b> đang bị vi phạm.
</p> </p>
</div> </div>
</section> </section>
<section class="gatebox"> <section class="gatebox">
<h2>Mục chung — nhóm trưởng làm, xong mới chia nhánh</h2> <h2>Mục chung — Nam làm, xong hai người kia mới bắt đầu</h2>
<p class="sub"> <p class="sub">
Sáu việc dưới đây không thuộc nhánh tính năng nào — chúng là thứ cả ba người cùng đụng 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. Nhóm trưởng làm một lần trên nhánh <code>nam/workflow-governance-base</code>, merge vào. Nam làm một lần và đẩy lên <code>gamma/refactor</code>, rồi hai người kia
thẳng, rồi ba người mới tách nhánh riêng. Ước tính nửa ngày. mới bắt đầu. Ước tính nửa ngày.
</p> </p>
<ol class="steps"> <ol class="steps">
<li> <li>
@@ -351,20 +351,21 @@
</ol> </ol>
</section> </section>
<h2>Ba nhánh tính năng</h2> <h2>Ba làn</h2>
<p class="sub"> <p class="sub">
Ba nhánh ngang nhau, mỗi nhánh khoảng 2.700 dòng phải bóc tách. Nhóm trưởng nhận nhánh N1 Ba làn ngang nhau, mỗi làn khoảng 2.700 dòng phải bóc tách, <b>cùng đẩy vào một
vì đó là nhánh chạm tới file dùng chung nhiều nhất. Cột “sở hữu” là danh sách file nhánh</b> <code>gamma/refactor</code>. Nam nhận làn N1 vì đó là làn chạm tới file
<em>chỉ</em> người đó được sửa. dùng chung nhiều nhất. Cột “sở hữu” là danh sách file <em>chỉ</em> 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.
</p> </p>
<div class="cards"> <div class="cards">
<div class="card lead"> <div class="card lead">
<div class="tag">Nhánh N1 · Nhóm trưởng</div> <div class="tag">Làn N1 · Nam</div>
<h3>Cấu hình, Bí mật &amp; Vỏ ứng dụng</h3> <h3>Cấu hình, Bí mật &amp; Vỏ ứng dụng</h3>
<p class="who">Nhánh chạm nhiều file dùng chung nhất — để nhóm trưởng giữ</p> <p class="who">Nam giữ — làn chạm nhiều file dùng chung nhất</p>
<div class="branch">nam/workflow-governance-config</div> <div class="branch">gamma/refactor</div>
<h4>Việc</h4> <h4>Việc</h4>
<ul> <ul>
@@ -390,10 +391,10 @@
</div> </div>
<div class="card one"> <div class="card one">
<div class="tag">Nhánh N2 · Thành viên 1</div> <div class="tag">Làn N2 · Hiệp</div>
<h3>Giám sát &amp; Quan trắc</h3> <h3>Giám sát &amp; Quan trắc</h3>
<p class="who">Hợp với người chịu được việc lặp, tách 7 tab có kỷ luật</p> <p class="who">Hiệp — 7 tab, việc lặp cần kỷ luật</p>
<div class="branch">nam/workflow-governance-monitoring</div> <div class="branch">gamma/refactor</div>
<h4>Việc</h4> <h4>Việc</h4>
<ul> <ul>
@@ -419,10 +420,10 @@
</div> </div>
<div class="card two"> <div class="card two">
<div class="tag">Nhánh N3 · Thành viên 2</div> <div class="tag">Làn N3 · Lâm</div>
<h3>Co4E Studio</h3> <h3>Co4E Studio</h3>
<p class="who">Hợp với người nắm canvas và luồng chạy workflow</p> <p class="who">Lâm — canvas và luồng chạy workflow</p>
<div class="branch">nam/workflow-governance-co4e</div> <div class="branch">gamma/refactor</div>
<h4>Việc</h4> <h4>Việc</h4>
<ul> <ul>
@@ -446,10 +447,10 @@
</div> </div>
<h2>Quy ước cho hai nhánh N2 và N3</h2> <h2>Tám quy ước</h2>
<p class="sub"> <p class="sub">
Bảy điều dưới đây là luật của team, nhóm trưởng chốt và duyệt PR theo đó. Ba điều đầu là 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
bắt buộc — vi phạm thì PR bị trả về. nhánh chung, vi phạm không chỉ hại mình mà chặn cả hai người kia.
</p> </p>
<div class="rules"> <div class="rules">
@@ -458,8 +459,8 @@
<h3>1 · Không chạm file dùng chung</h3> <h3>1 · Không chạm file dùng chung</h3>
<p> <p>
<code>app.py</code>, <code>theme.py</code>, <code>i18n.py</code>, <code>config.py</code>, <code>app.py</code>, <code>theme.py</code>, <code>i18n.py</code>, <code>config.py</code>,
<code>bootstrap.py</code> thuộc nhánh N1. Cần thêm chuỗi hay token màu thì <code>bootstrap.py</code> thuộc nhánh N1 của Nam. Cần thêm chuỗi hay token màu thì
<b>nhắn, đừng sửa</b> — lead thêm trong ngày. Đây là ba file duy nhất có thể gây conflict <b>nhắn, đừng sửa</b> — 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 đó. thật, và luật này xoá hẳn khả năng đó.
</p> </p>
</div> </div>
@@ -468,8 +469,7 @@
<h3>2 · Nộp factory, không tự lắp vào app</h3> <h3>2 · Nộp factory, không tự lắp vào app</h3>
<p> <p>
Mỗi nhánh expose một hàm dựng widget với chữ ký chốt từ ngày đầu, ví dụ Mỗi nhánh expose một hàm dựng widget với chữ ký chốt từ ngày đầu, ví dụ
<code>build_monitoring_tab(ctx, query_service) -&gt; QWidget</code>. Nhánh N1 gọi nó <code>build_monitoring_tab(ctx, query_service) -&gt; QWidget</code>. Nam gọi nó trong <code>bootstrap.py</code> ngày 28/08. Không ai tự sửa chỗ khởi tạo trong
trong <code>bootstrap.py</code> ngày 28/08. Không ai tự sửa chỗ khởi tạo trong
<code>app.py</code>. <code>app.py</code>.
</p> </p>
</div> </div>
@@ -478,13 +478,26 @@
<h3>3 · Bị chặn thì dùng fake, không ngồi đợi</h3> <h3>3 · Bị chặn thì dùng fake, không ngồi đợi</h3>
<p> <p>
Chưa có <code>ConfigRepository</code> bản thật thì dùng <code>FakeConfigRepository</code>. Chưa có <code>ConfigRepository</code> bản thật thì dùng <code>FakeConfigRepository</code>.
Chưa có <code>ToolPolicyGateway</code> của Team Hoa thì fake. <b>Báo ngay trong ngày</b> Chưa có <code>ToolPolicyGateway</code> của Team Hoa thì đã có fake sẵn. <b>Báo ngay trong ngày</b>
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. 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.
</p> </p>
</div> </div>
<div class="rule hard">
<h3>4 · Nhánh chung: kéo trước khi đẩy, đừng để nhánh đỏ</h3>
<p>
Cả ba đẩy vào <code>gamma/refactor</code>, nên không còn nhánh riêng làm vùng
đệm. Ba việc bắt buộc: <code>git pull --rebase</code> trước mỗi lần đẩy;
commit nhỏ và đẩy trong ngày, đừng ôm 500 dòng ba hôm; và
<b>không bao giờ đẩy thứ làm <code>pytest tests -q</code> đỏ</b> — nhánh hỏng
là hai người kia đứng hình. Lỡ đẩy nhầm thì sửa ngay hoặc
<code>git revert</code>, đừng để qua đêm.
</p>
</div>
<div class="rule soft"> <div class="rule soft">
<h3>4 · PR nhỏ, mỗi ngày một lần</h3> <h3>5 · Commit nhỏ, mỗi ngày một lần</h3>
<p> <p>
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 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. trưởng duyệt trong ngày. PR càng to thì rủi ro càng dồn về ngày 28/08.
@@ -492,27 +505,28 @@
</div> </div>
<div class="rule soft"> <div class="rule soft">
<h3>5 · Mỗi PR kèm test, và không làm đỏ 90 test cũ</h3> <h3>6 · Mỗi commit kèm test, và không làm đỏ 90 test cũ</h3>
<p> <p>
Baseline hiện tại: <b>90 test xanh trong 4,3 giây</b>. Chạy <code>pytest tests -q</code> Baseline hiện tại: <b>102 test xanh trong 3,4 giây</b>. Chạy <code>pytest tests -q</code>
trước khi mở PR. Đây là lưới an toàn cho phần logic — giữ nó xanh suốt 10 ngày. 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.
</p> </p>
</div> </div>
<div class="rule soft"> <div class="rule soft">
<h3>6 · File mới ≤ 400 dòng, không import PySide6 vào lõi</h3> <h3>7 · File mới ≤ 400 dòng, không import PySide6 vào lõi</h3>
<p> <p>
Hai điều kiện của CASAN Check 2 và 3. Tự kiểm trước khi mở PR — CI sẽ báo, nhưng biết 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. sớm thì đỡ phải tách lại lần hai.
</p> </p>
</div> </div>
<div class="rule soft"> <div class="rule soft">
<h3>7 · Checker UI thuộc phạm vi ai, người đó cập nhật</h3> <h3>8 · Checker UI thuộc phạm vi ai, người đó cập nhật</h3>
<p> <p>
24 checker sẽ vỡ khi file bị dời. Ai dời file thì sửa checker tương ứng ngay trong PR đó 24 checker sẽ vỡ khi file bị dời. Ai dời file thì sửa checker tương ứng ngay trong
— 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. commit đó — tốn thêm khoảng 15% thời gian, đổi lại giữ được lưới an toàn cho phần
<b>Nhóm trưởng quyết định phương án này và chịu trách nhiệm nếu đổi ý.</b> UI vừa làm xong.
<b>Đã chốt 21/08: đường A. Nam chịu trách nhiệm nếu đổi ý.</b>
</p> </p>
</div> </div>
@@ -529,7 +543,7 @@
<div class="io"> <div class="io">
<div class="iorow n1"> <div class="iorow n1">
<div class="iohead"><b>N1 · Cấu hình, Bí mật &amp; Vỏ</b><span>nhóm trưởng</span></div> <div class="iohead"><b>N1 · Cấu hình, Bí mật &amp; Vỏ</b><span>Nam · nhóm trưởng</span></div>
<div class="iogrid"> <div class="iogrid">
<div> <div>
<p class="iocap">Input — cần có</p> <p class="iocap">Input — cần có</p>
@@ -538,14 +552,14 @@
<li><span class="frm">mã cũ</span><code>ui/settings_dialog.py</code> 727 dòng</li> <li><span class="frm">mã cũ</span><code>ui/settings_dialog.py</code> 727 dòng</li>
<li><span class="frm">mã cũ</span><code>app.py</code> 1.352 dòng</li> <li><span class="frm">mã cũ</span><code>app.py</code> 1.352 dòng</li>
<li><span class="frm risk">tự chốt</span>Quyết định <code>api_key</code> — trước 26/08</li> <li><span class="frm risk">tự chốt</span>Quyết định <code>api_key</code> — trước 26/08</li>
<li><span class="frm">từ N2</span>Chữ ký <code>build_monitoring_tab()</code> — trước 28/08</li> <li><span class="frm">từ Hiệp</span>Chữ ký <code>build_monitoring_tab()</code> — trước 28/08</li>
<li><span class="frm">từ N3</span>Chữ ký <code>build_co4e_tab()</code> — trước 28/08</li> <li><span class="frm">từ Lâm</span>Chữ ký <code>build_co4e_tab()</code> — trước 28/08</li>
</ul> </ul>
</div> </div>
<div> <div>
<p class="iocap">Output — phải giao</p> <p class="iocap">Output — phải giao</p>
<ul class="iolist"> <ul class="iolist">
<li><span class="frm done">có rồi</span><code>SecretStore</code> · <code>ConfigRepository</code> + fake → <b>cho N2 và N3</b></li> <li><span class="frm done">có rồi</span><code>SecretStore</code> · <code>ConfigRepository</code> + fake → <b>cho Hiệp và Lâm</b></li>
<li><span class="frm done">có rồi</span><code>scripts/audit_security.py</code> → cho CI</li> <li><span class="frm done">có rồi</span><code>scripts/audit_security.py</code> → cho CI</li>
<li><code>infrastructure/persistence/json/atomic_json_file.py</code></li> <li><code>infrastructure/persistence/json/atomic_json_file.py</code></li>
<li><code>infrastructure/config/</code> — cài đặt thật + settings facade</li> <li><code>infrastructure/config/</code> — cài đặt thật + settings facade</li>
@@ -559,7 +573,7 @@
</div> </div>
<div class="iorow n2"> <div class="iorow n2">
<div class="iohead"><b>N2 · Giám sát</b><span>thành viên 1</span></div> <div class="iohead"><b>N2 · Giám sát</b><span>Hiệp</span></div>
<div class="iogrid"> <div class="iogrid">
<div> <div>
<p class="iocap">Input — cần có</p> <p class="iocap">Input — cần có</p>
@@ -567,14 +581,14 @@
<li><span class="frm">mã cũ</span><code>ui/monitoring_tab.py</code> 1.545 dòng</li> <li><span class="frm">mã cũ</span><code>ui/monitoring_tab.py</code> 1.545 dòng</li>
<li><span class="frm">mã cũ</span><code>core/usage_tracker.py</code> 524 · <code>sandbox_manager.py</code> 335</li> <li><span class="frm">mã cũ</span><code>core/usage_tracker.py</code> 524 · <code>sandbox_manager.py</code> 335</li>
<li><span class="frm">mã cũ</span><code>core/model_pricing.py</code> 284 · <code>agent_security.py</code> 272 · <code>audit_log.py</code> 115</li> <li><span class="frm">mã cũ</span><code>core/model_pricing.py</code> 284 · <code>agent_security.py</code> 272 · <code>audit_log.py</code> 115</li>
<li><span class="frm done">từ N1</span><code>FakeConfigRepository</code> — dùng được ngay</li> <li><span class="frm done">từ Nam</span><code>FakeConfigRepository</code> — dùng được ngay</li>
<li><span class="frm risk">tự chốt</span>Giữ nguyên 9 trường log, báo Duy và Hoa</li> <li><span class="frm risk">tự chốt</span>Giữ nguyên 9 trường log, báo Duy và Hoa</li>
</ul> </ul>
</div> </div>
<div> <div>
<p class="iocap">Output — phải giao</p> <p class="iocap">Output — phải giao</p>
<ul class="iolist"> <ul class="iolist">
<li><code>build_monitoring_tab()</code> → <b>cho N1</b>, trước 28/08</li> <li><code>build_monitoring_tab()</code> → <b>cho Nam</b>, trước 28/08</li>
<li><code>FakeAuditLogger</code> · <code>FakeMonitoringQueryService</code> → <b>cho cả team</b></li> <li><code>FakeAuditLogger</code> · <code>FakeMonitoringQueryService</code> → <b>cho cả team</b></li>
<li><code>presentation/monitoring/</code> — 7 tab + shell</li> <li><code>presentation/monitoring/</code> — 7 tab + shell</li>
<li><code>application/monitoring/monitoring_query_service.py</code></li> <li><code>application/monitoring/monitoring_query_service.py</code></li>
@@ -587,7 +601,7 @@
</div> </div>
<div class="iorow n3"> <div class="iorow n3">
<div class="iohead"><b>N3 · Co4E Studio</b><span>thành viên 2</span></div> <div class="iohead"><b>N3 · Co4E Studio</b><span>Lâm</span></div>
<div class="iogrid"> <div class="iogrid">
<div> <div>
<p class="iocap">Input — cần có</p> <p class="iocap">Input — cần có</p>
@@ -596,14 +610,14 @@
<li><span class="frm">mã cũ</span><code>ui/co4e_canvas.py</code> 791 · <code>co4e_config_panel.py</code></li> <li><span class="frm">mã cũ</span><code>ui/co4e_canvas.py</code> 791 · <code>co4e_config_panel.py</code></li>
<li><span class="frm">mã cũ</span><code>core/co4e_run_manager.py</code> 331</li> <li><span class="frm">mã cũ</span><code>core/co4e_run_manager.py</code> 331</li>
<li><span class="frm">có sẵn</span><code>core/co4e.py</code> — dataclass Workflow/Node/Edge đã có</li> <li><span class="frm">có sẵn</span><code>core/co4e.py</code> — dataclass Workflow/Node/Edge đã có</li>
<li><span class="frm done">từ N1</span><code>FakeConfigRepository</code></li> <li><span class="frm done">từ Nam</span><code>FakeConfigRepository</code></li>
<li><span class="frm risk">từ Team Hoa</span>DTO <code>ToolPolicyGateway</code> — <b>rủi ro liên team cao nhất</b>, lấy trong hôm nay</li> <li><span class="frm risk">từ Team Hoa</span>DTO <code>ToolPolicyGateway</code> — <b>rủi ro liên team cao nhất</b>, lấy trong hôm nay</li>
</ul> </ul>
</div> </div>
<div> <div>
<p class="iocap">Output — phải giao</p> <p class="iocap">Output — phải giao</p>
<ul class="iolist"> <ul class="iolist">
<li><code>build_co4e_tab()</code> → <b>cho N1</b>, trước 28/08</li> <li><code>build_co4e_tab()</code> → <b>cho Nam</b>, trước 28/08</li>
<li><code>FakeCo4EWorkflowService</code> → <b>cho cả team</b></li> <li><code>FakeCo4EWorkflowService</code> → <b>cho cả team</b></li>
<li><code>domain/workflows/</code> — DTO chốt ngày đầu</li> <li><code>domain/workflows/</code> — DTO chốt ngày đầu</li>
<li><code>application/workflows/co4e_workflow_service.py</code></li> <li><code>application/workflows/co4e_workflow_service.py</code></li>
@@ -615,14 +629,14 @@
</div> </div>
<h3>Output bắt buộc với cả ba, mỗi PR</h3> <h3>Output bắt buộc với cả ba, mỗi lần đẩy</h3>
<div class="scroll"> <div class="scroll">
<table> <table>
<thead><tr><th>Điều kiện</th><th>Ngưỡng</th><th>Tự kiểm bằng</th></tr></thead> <thead><tr><th>Điều kiện</th><th>Ngưỡng</th><th>Tự kiểm bằng</th></tr></thead>
<tbody> <tbody>
<tr><td>File mới sau khi tách</td><td class="mono">≤ 400 dòng</td><td class="mono">wc -l</td></tr> <tr><td>File mới sau khi tách</td><td class="mono">≤ 400 dòng</td><td class="mono">wc -l</td></tr>
<tr><td><code>domain/</code> và <code>application/</code> import PySide6</td><td class="mono">0</td><td class="mono">grep -r PySide6</td></tr> <tr><td><code>domain/</code> và <code>application/</code> import PySide6</td><td class="mono">0</td><td class="mono">grep -r PySide6</td></tr>
<tr><td>Test hiện có</td><td class="mono">96 xanh</td><td class="mono">pytest tests -q</td></tr> <tr><td>Test hiện có</td><td class="mono">102 xanh</td><td class="mono">pytest tests -q</td></tr>
<tr><td>Credential lộ</td><td class="mono">0</td><td class="mono">python scripts/audit_security.py</td></tr> <tr><td>Credential lộ</td><td class="mono">0</td><td class="mono">python scripts/audit_security.py</td></tr>
<tr><td>Checker UI trong phạm vi mình dời</td><td>đã cập nhật</td><td class="mono">python tools/check_&lt;tên&gt;.py</td></tr> <tr><td>Checker UI trong phạm vi mình dời</td><td>đã cập nhật</td><td class="mono">python tools/check_&lt;tên&gt;.py</td></tr>
</tbody> </tbody>
@@ -637,9 +651,9 @@
<thead> <thead>
<tr> <tr>
<th class="day">Ngày</th> <th class="day">Ngày</th>
<th>N1 · Cấu hình &amp; Vỏ</th> <th>N1 · Nam</th>
<th>N2 · Giám sát</th> <th>N2 · Hiệp</th>
<th>N3 · Co4E</th> <th>N3 · Lâm</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -685,7 +699,7 @@
</tr> </tr>
<tr> <tr>
<td class="day">28/08<br><small>T6</small></td> <td class="day">28/08<br><small>T6</small></td>
<td class="cl"><b>bootstrap.py + tách MainWindow</b><small>Nhận factory của N2 và N3 để lắp</small></td> <td class="cl"><b>bootstrap.py + tách MainWindow</b><small>Nhận factory của Hiệp và Lâm để lắp</small></td>
<td class="c1">Nộp factory · dọn file &gt;400 dòng · cập nhật checker</td> <td class="c1">Nộp factory · dọn file &gt;400 dòng · cập nhật checker</td>
<td class="c2">Nộp factory · dọn file &gt;400 dòng · cập nhật checker</td> <td class="c2">Nộp factory · dọn file &gt;400 dòng · cập nhật checker</td>
</tr> </tr>
@@ -701,7 +715,7 @@
</tr> </tr>
<tr class="mark"> <tr class="mark">
<td class="day">30/08<br><small>CN 17:00</small></td> <td class="day">30/08<br><small>CN 17:00</small></td>
<td colspan="3"><span class="pill gate">CASAN Gate</span> &nbsp; <b>Nhóm trưởng chủ trì Check 1</b> — quét toàn bộ config/JSON, phải ra 0 secret plaintext. N2 và N3 sửa ngay phần của mình nếu script bắt được.</td> <td colspan="3"><span class="pill gate">CASAN Gate</span> &nbsp; <b>Nam chủ trì Check 1</b> — 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.</td>
</tr> </tr>
<tr class="mark"> <tr class="mark">
<td class="day">31/08<br><small>T2 15:00</small></td> <td class="day">31/08<br><small>T2 15:00</small></td>
@@ -721,18 +735,19 @@
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td>N2 có chạy được khi chưa có config bản thật?</td> <td>Hiệp có chạy được khi chưa có config bản thật?</td>
<td>Dựng một tab Monitoring, chạy test của nó, <b>không import <code>cowork_local.config</code></b> dòng nào — chỉ dùng <code>FakeConfigRepository</code></td> <td>Dựng một tab Monitoring, chạy test của nó, <b>không import <code>cowork_local.config</code></b> dòng nào — chỉ dùng <code>FakeConfigRepository</code></td>
<td class="mono">21/08</td> <td class="mono">21/08</td>
</tr> </tr>
<tr> <tr>
<td>N3 có chạy được khi Team Hoa chưa xong gateway?</td> <td>Lâm có chạy được khi Team Hoa chưa xong gateway?</td>
<td>Test <code>Co4EWorkflowService</code> xanh với <code>FakeToolPolicyGateway</code></td> <td>Test <code>Co4EWorkflowService</code> xanh với <code>FakeToolPolicyGateway</code></td>
<td class="mono">23/08</td> <td class="mono">23/08</td>
</tr> </tr>
<tr> <tr>
<td>Ba nhánh có đụng file nhau không?</td> <td>Ba người có đụng file nhau không?</td>
<td><code>git diff --name-only</code> giữa ba nhánh — giao của ba tập phải <b>rỗng</b></td> <td><code>git log --name-only --pretty=%an</code> trên <code>gamma/refactor</code> —
không file nào được xuất hiện dưới hai tên khác nhau</td>
<td class="mono">mỗi ngày</td> <td class="mono">mỗi ngày</td>
</tr> </tr>
</tbody> </tbody>
+30 -6
View File
@@ -1,9 +1,15 @@
# Hai quyết định chờ nhóm trưởng chốt — Team Gamma # Quyết định của Team Gamma
Hai việc này không code được cho tới khi có người quyết. Cả hai đều ảnh hưởng Team: **Nam** (nhóm trưởng, nhánh N1) · **Hiệp** (N2) · **Lâm** (N3).
ra ngoài phạm vi một người, nên để đây thay vì chôn trong comment.
Trạng thái: **chưa chốt**. Hạn: trước khi N1 bắt đầu R02-T05 (26/08). Ghi ở đây thay vì chôn trong comment, vì cả ba đều ảnh hưởng ra ngoài phạm vi
một người.
| # | Việc | Trạng thái |
|---|---|---|
| 1 | `provider_conf()` còn trả `api_key` | **Chốt 21/08 — đường A** |
| 2 | Số phận 24 checker UI | **Chốt 21/08 — đường A** |
| 3 | DTO `ToolPolicyGateway` viết hộ Team Hoa | Đã làm, chờ Hoa xác nhận |
--- ---
@@ -53,7 +59,13 @@ họ không lên kế hoạch.
Nếu chọn B thì **phải báo Team Duy và Team Hoa trong hôm nay**, không phải lúc Nếu chọn B thì **phải báo Team Duy và Team Hoa trong hôm nay**, không phải lúc
đã sửa xong. đã sửa xong.
> Nhóm trưởng chốt: ☐ A ☐ B — ngày ____ > **Nam chốt 21/08: đường A.**
>
> Việc kèm theo: `ConfigRepository` bản thật phải đọc key từ `SecretStore` rồi
> ghép vào dict do `provider_conf()` trả về. Năm nơi đọc không đổi một dòng,
> nên **không cần báo Duy và Hoa**.
>
> Nợ kỹ thuật đã ghi: đường B (bỏ `api_key` khỏi dict) để sau sprint này.
--- ---
@@ -104,7 +116,19 @@ không có gì thay thế cho phần giao diện.
`tools/check_probes_bite.py` đã có sẵn cơ chế chứng minh checker còn cắn được; `tools/check_probes_bite.py` đã có sẵn cơ chế chứng minh checker còn cắn được;
chạy nó sau mỗi đợt sửa là bắt được ngay chuyện đó. chạy nó sau mỗi đợt sửa là bắt được ngay chuyện đó.
> Nhóm trưởng chốt: ☐ A ☐ B ☐ C — ngày ____ > **Chốt 21/08: đường A** — ai dời file thì cập nhật checker tương ứng ngay
> trong PR đó.
>
> Kèm hai ràng buộc, vì rủi ro của đường A là người sửa vội nới lỏng phép kiểm:
>
> 1. PR nào *sửa* checker phải nói rõ trong mô tả **sửa gì và vì sao**.
> 2. Sửa xong chạy `python tools/check_probes_bite.py` — nó cắm lỗi cố ý vào
> code rồi kiểm checker có bắt được không. Chính công cụ này đã từng bắt
> được một checker bị sửa thành *không thể đỏ*.
>
> Không đưa 24 checker vào CI trong sprint này: chúng dựng `MainWindow` thật,
> mỗi lần chạy tốn hàng chục giây và thỉnh thoảng sập lúc Qt dọn dẹp. Chạy tay
> theo phạm vi mình đụng là đủ.
--- ---