Tính năng
Agent chạy nhanh, nhưng chỉ đi qua chỗ bạn đã mở cửa
Tự động hoá marketing thường hỏng ở một chỗ: không ai biết cái gì đã được duyệt, cái gì chỉ là bản nháp trôi ra ngoài. Ở đây trạng thái nằm trong file, và file thì đọc được bằng mắt.
Mở bằng mắt, diff bằng git
Mỗi chiến dịch là một file Markdown: brief ở đầu, bảng danh sách bài ở giữa, quyết định và báo cáo ở cuối. Mỗi bài là một thư mục. Không có định dạng nhị phân nào ở giữa bạn và dữ liệu của bạn — mở lên là đọc được, sửa một chữ thì git chỉ ra đúng chữ đó, và không ai khoá file của ai.
campaign.md · research.md · content.md · publish.json
Ba chỗ máy không được tự quyết
Cổng 1 — chọn đề tài: script tạo bài ở trạng thái proposed với ô duyệt để trống. Không có đường nào trong mã tự đặt thành đã duyệt.
Cổng 2 — trước khi dựng: đọc bài rồi mới quyết. Cổng nằm trước khâu dựng tiếng và hình, vì đó là chỗ tốn tiền — bác ở đây thì chưa mất một giây nào.
Cổng 3 — bản thật: mở đúng trang người đọc sẽ thấy, không phải một bản markdown rồi hy vọng nó render đúng.
proposed → approved → published
Duyệt bằng điện thoại, không cần mở máy
Cổng nào tới hạn thì bot nhắn cho bạn: bấm nút để duyệt, hoặc trả lời thẳng vào tin đó bằng nhận xét tự do — không cần nhớ mã bài, không cần đúng cú pháp. Nhận xét đi vào phan-hoi.md của chính bài, bộ viết đọc rồi sửa lại.
Nhận xét không phải là gật đầu. Góp ý chỉ mở vòng sửa, không mở cổng — nhầm chiều là đăng đúng bài đang bị chê. Và chữ của người luôn đi qua file trong khối có rào, không đi qua dòng lệnh: nó là dữ liệu, không phải mệnh lệnh cho hệ thống.
duyệt từng bài · hoặc theo lô 5–10 bài một lượt
Đăng lên web của bạn, không phải web của tôi
Bộ đăng web đọc đích từ channel.yml — repo nào, thư mục nào, lệnh dựng lại mục lục nào, kiểm bằng cách nào. Không khai thì script dừng, không đoán bừa một chỗ để ghi. Đổi trang web là sửa cấu hình, không phải sửa mã.
Sau khi đẩy, script gọi lại URL và bắt buộc thấy 200 mới dám báo thành công — “đã push” không đồng nghĩa với “trang đã sống”. Và nó chỉ git add đúng những đường dẫn đã khai, không bao giờ -A: máy bạn có thể đang chạy việc khác cùng lúc.
web_target: repo · content_dir · post_cmd · verify
Dry-run là mặc định
Script đăng bài đọc autonomy trong channel.yml và thoát với mã 4 nếu chưa phải full — không gọi API. Không tìm thấy file cấu hình cũng vậy: không biết mức tự trị mà vẫn đăng là đúng kiểu lỗi tệ nhất. Ba mức: suggest chỉ đọc và đề xuất, auto_safe được viết nháp, full mới được đăng. Đổi mức là việc của người, không phải của agent.
23 cổng kiểm bằng số
Độ dài bài, số nguồn đã đối chiếu, link còn sống hay đã chết, chữ mẫu còn sót, tên công cụ nội bộ lọt ra bản công khai — mỗi thứ một cổng, trả về một con số so với một ngưỡng. Trạng thái thứ ba là “thiếu”: cổng không chạy được thì không bao giờ được tính là đạt. Không kiểm được là chưa biết, không phải đã qua.
Không đo thì không kết luận
Baseline là median của 10 nội dung gần nhất cùng định dạng, trên chính kênh của bạn — không phải “chuẩn ngành” đọc ở đâu đó. Chưa đủ mẫu thì hiện “chưa đủ mẫu”, không hiện một con số đoán.
Bộ viết là của bạn, repo không khoá CLI nào
Repo này không gọi thẳng một trợ lý AI nào. Bạn khai lệnh của mình vào runtime.writer_cmd — Claude, Codex, một script Python, hay một người thật ngồi viết cũng được. Hợp đồng chỉ có hai vế: vào là thư mục bài, ra là content.md đã điền theo neo. Không khai thì bước soạn báo chờ người viết và dừng.
Mã thoát 0 không đủ để được tính là xong. Hệ kiểm lại bài có chữ thật không — bộ viết chạy êm mà file vẫn trống thì vẫn tính là hỏng. Đó là hình dạng hỏng nguy hiểm nhất: chỉ tin mã thoát thì bài rỗng đi thẳng tới bước đăng.
writer_cmd: '<lệnh của bạn> --bai "{bai}"'
Một trạm mẫu đã điền sẵn
Thư mục examples/ là một trạm hoàn chỉnh thu nhỏ: một kênh, một chiến dịch, ba bài ở ba trạng thái — đã đăng, đã duyệt đề tài, mới đề xuất. Nó trả lời câu hỏi mà một file mẫu rỗng không trả lời được: điền xong thì trông như thế nào? Kèm cả một báo cáo cổng đang đỏ, để bạn thấy lúc hỏng nó ra sao chứ không chỉ thấy lúc mọi thứ xanh. Clone về là chạy, không cần token, không đăng gì lên đâu. Bộ dữ liệu ngân hàng giả định ở content/KPIM vẫn còn, dùng cho phần dạy học.