Hội thoại PR
Một pull request vốn đã là nơi diễn ra cuộc hội thoại về mã nguồn. Hội thoại PR
biến nó thành một bề mặt trên không gian làm việc Control Center, giống như một
cầu chat biến Slack thành một bề mặt: nhắc
đến bot GitHub App của máy chủ trong một PR, trả lời bên trong các luồng đánh
giá của nó, hoặc thêm nhãn ai-review, và công việc diễn ra ngay trong không
gian đánh giá của PR — dưới cùng cách quy kết và cùng rào chắn như bất cứ điều
gì được gõ trong ứng dụng. Một bình luận cũng phải qua cổng tư cách thành viên;
còn nhãn thì không, vì nó không có tác giả. Câu trả lời của bot quay trở lại
GitHub, đúng trong làn mà câu hỏi được đặt ra.
Ba quyết định định hình nên tính năng này, và mỗi quyết định cũng chính là quyết định mà cầu chat đã đưa ra cho chat, được phát biểu lại cho máy chủ mã: kết nối chạy theo hướng nào, điều gì cấp quyền cho một bình luận đến từ bên ngoài và mỗi bên được quy kết cho ai.
Polling chính là phương tiện truyền tải
Phần tiêu đề “Polling chính là phương tiện truyền tải”Kênh đẩy (push) duy nhất mà GitHub dành cho một app là webhook, mà webhook thì cần một URL đến — đúng thứ mà bề mặt này cố tình không bao giờ đòi hỏi. Nên việc phát hiện là một lượt quét: cứ khoảng một phút, mỗi cài đặt app chạy một tìm kiếm có bí danh để hỏi GitHub về những PR có nhắc đến bot (hoặc slug ngắn của nó) và về những PR đang mở mang nhãn đánh giá; những PR đã có không gian đánh giá thì được đọc các luồng bình luận của chúng, và mọi thứ được đối chiếu theo id bình luận với những gì đã thấy ở lượt quét trước.
Những hệ quả thiết kế đáng được gọi tên:
- Độ trễ là một khoảng quét, không phải một sự kiện. Phản hồi xác nhận 👀 đến trong khoảng một phút. Không có gì gấp gáp nào phụ thuộc vào nó.
- Đúng một lần, cho mỗi bình luận. Id bình luận là duy nhất trên toàn GitHub; mỗi id được ghi lại ngay khi nó được phân loại là đủ điều kiện, trước khi bất cứ thứ gì tác động lên nó. Một cú sập có thể làm mất việc xử lý một bình luận, nhưng không bao giờ kích hoạt nó hai lần.
- Thời gian ngoại tuyến được bắt kịp, chứ không phát lại. Tập đã thấy được lưu bền, nên một lần khởi động lại vẫn chuyển được những gì đã đến trong lúc hệ thống ngừng chạy. Ngoại lệ duy nhất là lượt quét đầu tiên: không có ký ức nào để đối chiếu, mọi thứ còn tồn đọng đều được ghi lại một cách âm thầm — một người vận hành đã gắn nhãn cho hai mươi PR trước khi máy chủ này tồn tại không được quay lại với hai mươi lượt đánh giá đang chạy.
- Nhãn là một tập hợp, không phải một sự kiện. Tìm kiếm báo cáo sự hiện diện của nhãn, nên một PR đã gắn nhãn chỉ kích hoạt một lần duy nhất, mãi mãi. Việc thêm lại một nhãn sau khi gỡ nó là vô hình đối với lượt quét; một lượt nhắc đến mới là đường chạy lại.
Tìm kiếm chạy một lần cho mỗi tài khoản cài đặt, trên máy khách của chính chủ sở hữu đó, vì token cài đặt chỉ nhìn thấy các kho mã thuộc cài đặt của chính nó — một thông tin xác thực duy nhất dùng chung toàn máy chủ sẽ âm thầm bỏ sót mọi PR thuộc các cài đặt khác của app.
Tư cách thành viên cấp quyền, chứ không phải bình luận
Phần tiêu đề “Tư cách thành viên cấp quyền, chứ không phải bình luận”Một bình luận PR đến chỉ mang theo không hơn gì tên đăng nhập của tác giả — một danh tính bên ngoài chưa được xác thực cho đến khi được chứng minh. Bot phân giải nó dựa trên một chỉ mục nghịch đảo gồm các thành viên của không gian làm việc và các tài khoản GitHub đã liên kết của họ, được dựng lại theo TTL vì người ta vẫn đăng nhập và được mời trong lúc máy chủ đang chạy.
Việc đóng lại khi không chắc chắn trông giống một cái thang, và mỗi bậc đều trả lời ngay trong luồng mà nó từ chối:
- Một tên đăng nhập không rõ — chưa được liên kết, hoặc được liên kết bởi một người không phải thành viên của không gian làm việc này — được yêu cầu đăng nhập và bảo đảm rằng mình thuộc về đây
- Một thành viên chỉ đọc (
viewerhoặcguest) được thông báo rằng vai trò của họ không thể khởi động công việc
Hai trường hợp tên đăng nhập không rõ dùng chung một câu trả lời: chỉ mục nghịch đảo chỉ trả về thành viên của không gian làm việc này, nên một tài khoản chưa liên kết và một người đã liên kết nhưng không phải thành viên là cùng một kiểu trượt. Không trường hợp nào trong số đó được đi tiếp. Một bình luận không bao giờ bị quy kết cho người không gửi nó, và lời của người lạ không bao giờ bước vào một không gian làm việc mà họ không thể nhìn thấy.
Nhãn ai-review không có tác giả để phân giải, nên nó không leo lên cái thang
này. Thêm nó sẽ khởi động việc đánh giá trong không gian làm việc đã liên kết
với kho mã đó.
Hai danh tính, là cố ý
Phần tiêu đề “Hai danh tính, là cố ý”Mỗi bên của cuộc hội thoại mang một danh tính khác nhau, và chính sự khác biệt đó làm nên tính năng:
- Trên GitHub, bot chính là máy chủ. Mọi bình luận, cảm xúc và câu trả lời mà cầu đăng lên đều dùng token cài đặt của app. Không ai bấm gì trong một máy khách, nên không thứ gì mượn tài khoản của một người — cùng nguyên tắc giữ cho webhook và polling không dùng thông tin xác thực của con người.
- Trong space, câu hỏi là của bạn. Tin nhắn được quy kết cho thành viên mà tác giả phân giải thành, và lượt chạy agent thực thi thay mặt họ: các commit ghi họ là đồng tác giả, còn núm tự chủ và rào chắn hành động của space áp dụng đúng như với một tin nhắn được gõ trong ứng dụng. Các thao tác ghi lên máy chủ mã từ lượt chạy vẫn diễn ra dưới danh nghĩa app — cùng nguyên tắc như gạch đầu dòng phía trên — chứ không dùng token cá nhân của thành viên.
Việc công bố các phát hiện của đánh giá trở lại GitHub vẫn là quyết định của con người, được đưa ra trong Control Center. Một lượt nhắc đến có thể khởi động một cuộc đánh giá; chỉ con người mới công bố nó.
Chốt chặn vòng lặp, và cái tên ngắn
Phần tiêu đề “Chốt chặn vòng lặp, và cái tên ngắn”Mọi thứ được tạo bởi một tài khoản bot đều bị loại bỏ trước khi bất kỳ cổng nào
chạy — cụ thể là bot của chúng ta, và mọi hậu tố [bot], để bot đánh giá của
một app khác cũng không thể đánh thức bot của chúng ta. Không có điều này, chính
những câu trả lời của bot sẽ đến như những bình luận mới và kích hoạt nó lặp lại
mãi mãi.
Hậu tố [bot] cũng là lý do tồn tại của dạng ngắn. GitHub cố định tên đăng nhập
của một tài khoản app thành <slug>[bot], không cung cấp tính năng tự động hoàn
thành cho nó, và không bao giờ phân giải @slug thành app — nên việc chấp nhận
slug trần là quyết định của bộ so khớp của chúng ta, và để phát hiện nó cần
một làn tìm kiếm thô trên văn bản bình luận thay vì chỉ mục nhắc đến của
GitHub. Cái giá được nói thẳng ra thay vì làm mờ đi: một người dùng trùng slug
với app sẽ vô tình gọi bot bằng mọi lượt nhắc đến dạng ngắn về chính mình.
Những cái tên app đủ đặc trưng khiến va chạm chỉ còn là giả thuyết.
Những gì được cố ý không cung cấp
Phần tiêu đề “Những gì được cố ý không cung cấp”- Không tự động công bố. Các phát hiện đáp xuống không gian đánh giá; công bố lên GitHub là một hành động riêng, do con người thực hiện
- Không có danh tính mờ. Tác giả hoặc phân giải thành đúng một thành viên, hoặc bị từ chối — không có kiểu quy kết theo phỏng đoán
- Không có webhook GitHub App. Bề mặt này không bao giờ đăng ký một webhook như vậy, nên không có URL đến nào phải phơi ra cho các bình luận PR. Những webhook khác của sản phẩm (quy trình, đồng bộ phiếu) là một thiết lập riêng và tùy chọn.
Xem thêm
Phần tiêu đề “Xem thêm”- Nói chuyện với Control Center từ một PR GitHub: hướng dẫn thực hành cho tất cả những điều trên
- Cầu chat: cũng ba quyết định đó, nhưng dành cho chat
- Tạo GitHub App: nơi danh tính của bot bắt nguồn
- Đa người dùng — danh tính, tư cách thành viên và hiện diện: những chủ thể và vai trò mà một tên đăng nhập được phân giải qua
- Rào chắn: những gì agent trả lời được phép làm
- Dùng đánh giá hỗ trợ AI: quy trình mà một lượt nhắc đến hoặc một nhãn khởi động