Nó làm gì
untangle là đường refactor cho đống code không có ranh giới nào để cải thiện. Skill upstream
improve-codebase-architecture cải thiện những ranh giới đã có, nhưng một số repo thì không có
ranh giới nào: một module import ba mươi module khác, chu trình là chuyện thường, và mọi cú tái
cấu trúc tử tế đều là một thay đổi không ai review nổi. Upstream gọi tên khoảng trống đó nhưng
không lấp, nên đây là đường cho nó. Skill có năm nước đi: đọc đồ thị phụ thuộc thật, cắt ở chỗ đồ
thị mỏng nhất, mỗi ticket một ranh giới theo hình expand-contract, xử lý chu trình bằng một trong
ba nhát cắt, và dừng có chủ đích.
Thứ nó chặn là cú refactor big-bang, tức một branch phình lên hàng tuần, xung đột với tất cả, rồi bị bỏ hoặc bị merge mà không ai review. Mọi bước tồn tại để giữ công việc ở dạng từng mảnh ship được. Hai bước trong đó đi ngược bản năng. Bản năng thứ nhất là xông vào chỗ rối nhất, còn skill nói hãy bắt đầu ở một lá, vì một lá có thể được cấp ranh giới mà không phải dời gì khác, và nó chứng minh cách làm trên một thứ rẻ. Bản năng thứ hai là thêm cửa trước mới rồi xoá đường cũ trong cùng một ticket, còn skill tách hai việc ra, vì một ticket không merge được cho tới khi mọi caller đã chuyển chính là hình big-bang tái xuất ở tầng thấp hơn.
Khi nào Thomas gọi nó
Không ai dispatch skill này. Đây là craft do model tự gọi, được chào cho hai vai và không thuộc vai nào, nên nó được với tới khi tình huống xuất hiện chứ không nối cứng vào một phase.
| Thứ đang ở trước mặt | Gọi cái này |
|---|---|
| Một thay đổi mà bán kính ảnh hưởng cứ phình ra theo mỗi dòng đọc thêm | untangle, cho một Builder đang cố khoanh vùng một cú refactor không chịu khoanh |
| Một đợt việc là cú refactor rối tới mức không khoanh vùng nổi | untangle, cho một Shaper, trước khi cắt ticket |
| Ranh giới đã có sẵn và chỉ cần cải thiện | improve-codebase-architecture, ở upstream |
| Một ranh giới sắp được vẽ mà bên dưới chưa có lưới test | legacy-testing, trước đã |
| Chính việc tách ticket expand-contract | Trả hình dạng đó về, vì to-tickets do người dùng gọi và Shaper mới là người lái |
Cần sẵn gì
- Đồ thị import được trích ra, không phải nhớ lại. Một đồ thị bạn trích thắng một đồ thị bạn nhớ, và bất ngờ thường nằm ở chỗ module nào mới là hub thật.
- Hành vi đi ngang ranh giới được đặc tả trước, qua
legacy-testing, để cú refactor có lưới. - Một mặt ticket đủ chỗ cho mỗi ticket một ranh giới, vì cả phương pháp là một ranh giới một ticket.
- Một chỗ để ghi ghi chú kiến trúc. Skill này nêu thẳng
docs/agents/boundaries.md, và lý do nó nêu hẳn một đường dẫn nằm ngay bên dưới.
Nó để lại gì
| Chuyện gì đã xảy ra | Nó nằm lại ở đâu |
|---|---|
| Đồ thị đã đo | Chu trình, hub, lá và các cú gọi xuyên qua, được gọi tên chứ không phải đoán |
| Mỗi ranh giới | Một ticket tự ship được: đặc tả, expand, chuyển caller, contract |
| Đường đi cũ | Gỡ ở một ticket sau, kiểm bằng tìm kiếm chứ không bằng niềm tin |
| Thứ tự công việc | Suy ra từ đồ thị, và đó là thứ khiến nó cãi được trong lúc review |
| Ranh giới đã vẽ và đường nối cố tình để lại | docs/agents/boundaries.md, do Shaper đọc khi khoanh vùng cú refactor kế tiếp trên cùng đống code |
Lỗi đã biết
Có một entry trong harness/.agents/memory/recurring-failure-modes.md gọi tên skill này. Nó ở
trạng thái promoted.
- AST-051: một địa chỉ mà người gọi không dùng được thì sinh ra một thứ thay thế, không sinh
ra lỗi. Một hợp đồng gọi tên một lượt chạy bằng lệnh slash, vốn là dạng con người gõ, và một
agent không có bàn phím thì không gọi được. Hệ quả là hai Builder mỗi người tự làm một cú dọn
dẹp thủ công, cả hai lần handback đều mô tả trung thực một lượt chạy có thật, và skill thật bắn
lại sau đó trên cùng diff tìm ra một chỗ tách mà cả hai đều bỏ sót. Luật chung: một địa chỉ chỉ
đúng tương đối với người phải dùng nó. Skill này mang luật đó ở bước expand-contract, chỗ trỏ
sang
to-tickets, vốn do người dùng gọi nên model không tự với tới được.
Đang chạy đúng nếu
- Nhát cắt đầu tiên rơi vào một lá, gọn trong một thay đổi review được, trước khi động tới thứ gì khó hơn.
- Mỗi ticket vẽ đúng một ranh giới, và expand với contract nằm ở hai ticket khác nhau ở mọi chỗ mà việc chuyển caller là lớn.
- Mọi chu trình đều bị cắt bằng một trong ba nước đi đã nêu, và một cú gộp trông như đi lùi thì mang theo lý lẽ của nó ngay trong ticket.
- Công việc dừng khi những ranh giới mà việc hiện tại cần đã có, không phải khi đồ thị trở nên đẹp.
docs/agents/boundaries.mdtồn tại và nêu cả thứ đã vẽ lẫn thứ cố tình để lại.
Nó nằm ở đâu trong chuỗi
Một Builder hoặc Shaper đâm vào cú refactor không chịu khoanh vùng → untangle trích đồ thị và
chọn nhát cắt mỏng nhất → legacy-testing đặt lưới dưới ranh giới sắp vẽ → hình dạng đó quay về
Shaper, người lái to-tickets → mỗi ticket chạy vòng bình thường qua dispatch-ticket → các ranh
giới đọng lại trong docs/agents/boundaries.md cho lượt sau. Skill dừng và mang việc lên chủ dự
án khi đồ thị cho thấy kiến trúc dự định còn code thì nói khác, vì đó là một quyết định chứ không
phải một cú refactor.