Có một kiểu lỗi tôi gặp lặp đi lặp lại: mọi người trong cuộc đều nhớ rằng task đã xong. Chat nói đã deploy, handoff ghi production xanh, người vận hành cũng nhớ đã bấm nút. Nhưng edge vẫn trả artifact cũ.

Một lỗi thật: đúng trong chat, sai ở production

Trong lần gom GreenJade về monorepo, code mới đã build, commit đã push lên main và mọi người đều có lý do để nghĩ bước tiếp theo là Cloudflare tự deploy. Đó là flow từng hoạt động trước đây.

Nhưng Cloudflare Pages vẫn kết nối với repository Astro cũ. Push vào monorepo mới không thể làm production thay đổi. Intention đúng, code đúng và ký ức về pipeline cũng từng đúng. Chỉ có trạng thái hiện tại là khác.

Nếu hỏi “chúng ta định deploy từ đâu?”, câu trả lời nằm trong plan. Nếu hỏi “code mới đang ở đâu?”, câu trả lời nằm trong Git. Nếu hỏi “production đang lấy source nào?”, chỉ cấu hình Cloudflare hiện tại mới trả lời được.

- memory: push main sẽ tự deploy
+ repo: commit mới đã có trên main
+ Cloudflare: vẫn nối repository cũ
+ edge: vẫn phục vụ artifact cũ

Memory không vô dụng. Nó giúp tôi biết nên kiểm tra Git integration. Nhưng nếu biến memory thành bằng chứng, chính kinh nghiệm cũ sẽ che mất sự thật mới.

Ký ức là tái tạo, không phải playback

Trong thí nghiệm kinh điển của Elizabeth Loftus và John Palmer, cách đặt câu hỏi sau khi người tham gia xem cảnh va chạm có thể ảnh hưởng đến ước lượng tốc độ và báo cáo ký ức sau đó. Nghiên cứu này không chứng minh mọi ký ức đều sai. Nó cho thấy thông tin đến sau sự kiện có thể tham gia vào cách ký ức được báo cáo lại.

Điều này quan trọng với operation vì handoff, issue title và lời giải thích của người trước đều là thông tin đến sau. Một câu “đã deploy xong” có thể trở thành frame cho lần kiểm tra tiếp theo. Ta bắt đầu tìm bằng chứng rằng deploy đã xong thay vì hỏi trạng thái hiện tại là gì.

Đây là lúc confidence trở nên nguy hiểm. Nhớ rõ không đồng nghĩa với nhớ đúng. Một narrative mạch lạc cũng không đồng nghĩa với một causal chain đã được kiểm chứng.

Ta suy nghĩ bằng thứ nằm ngoài đầu

Jiajie Zhang và Donald Norman mô tả distributed cognitive task như một hệ gồm internal representation và external representation cùng tham gia biểu diễn cấu trúc của công việc. David Kirsh đi xa hơn: external representation không chỉ giảm gánh nặng ghi nhớ, nó còn tạo persistent referent, giúp chia sẻ object of thought, tái biểu diễn vấn đề và thay đổi chi phí của suy luận.

Trong software operation, repo, diff, deployment ID, dashboard, config và runbook không chỉ là nơi “ghi chép lại”. Chúng là một phần của hệ nhận thức đang vận hành task.

External representationNó giúp ta nghĩ gìNó không tự chứng minh gì
Git diffThay đổi dự kiến và phạm vi patchBinary đó đã chạy ở production
Deployment recordCommit nào được platform nhậnCustom domain đã phục vụ đúng content
RunbookFlow chuẩn và điểm kiểm traFlow hiện tại chưa drift
LogSự kiện được ghi tại một thời điểmKhông có lỗi ngoài vùng log
HandoffNơi nên bắt đầu điều traMọi claim bên trong đều còn đúng

Thiết kế external representation tốt không phải viết nhiều tài liệu hơn. Nó là làm cho trạng thái quan trọng có nơi tồn tại bền, có timestamp, có identity và có thể đối chiếu.

AI memory cũng không phải runtime

Không nên nói AI “nhớ sai” theo đúng nghĩa con người nhớ sai. Cơ chế khác nhau. Một model tạo output từ context nó đang nhận; một lớp memory hoặc summary chỉ đưa thêm representation vào context đó. Nó không tự trở thành sensor nối với process, database hay CDN.

Vì vậy một summary có thể hoàn toàn trung thực ở thời điểm được viết nhưng stale sau một deploy. Nó cũng có thể nén mất điều kiện, biến “local build pass” thành “đã xong” hoặc giữ conclusion mà bỏ evidence.

Tôi dùng memory của agent như một index:

  • Nó chỉ ra repo, file, command hoặc incident cần xem.
  • Nó giữ vocabulary và decision từng được chốt.
  • Nó giảm thời gian tìm lại context.

Tôi không dùng nó như attestation rằng production đang đúng. Attestation phải đến từ probe hiện tại.

$ resume-task --from memory
INDEX expected repo and deployment path found
VERIFY worktree, remote HEAD, runtime and edge
UPDATE external record after evidence agrees

Source of truth phụ thuộc câu hỏi

Không có một thứ luôn đứng đầu cho mọi câu hỏi. Repo là source of truth của code được version. Nó không phải source of truth của process đang chạy. Runtime cho biết process hiện tại, nhưng không nói đầy đủ intention ban đầu. Decision log giữ lý do, không giữ live state.

Câu hỏiNguồn ưu tiênNguồn chỉ dùng làm chỉ dẫn
Code nào đã được commit?Git object và remote refChat, handoff
Config nào đang active?Live config hoặc platform settingConfig mẫu trong repo
Process nào đang chạy?Process manager, health endpoint, service stateDeploy script
Người dùng đang nhận gì?Edge response, API result, asset hashDashboard success
Vì sao quyết định này được chọn?Decision record kèm evidenceHồi tưởng của người tham gia

Source-of-truth thinking bắt đầu bằng việc viết đúng câu hỏi. Nếu không, ta thường lấy nguồn dễ đọc nhất thay cho nguồn có authority đúng nhất.

Từ nhớ lại sang verification loop

Roediger và Karpicke cho thấy retrieval practice có thể cải thiện long-term retention tốt hơn việc chỉ đọc lại trong điều kiện thí nghiệm của họ. Tôi không dùng kết quả này để nói một lệnh health check sẽ cải thiện trí nhớ. Phép nối thực dụng là: đừng chỉ đọc lại narrative, hãy buộc claim đi qua một lần retrieval và test.

Verification loop của tôi có năm bước:

  1. Recall: viết claim hiện tại bằng một câu, không mở tài liệu.
  2. Locate: xác định external representation có authority cho câu hỏi.
  3. Probe: chạy kiểm tra read-only rẻ nhất có thể phủ định claim.
  4. Compare: tách expected, observed và inference.
  5. Update: chỉ cập nhật memory hoặc handoff sau khi evidence khớp.
claim: production đang chạy commit mới
expected: deployment source = current HEAD
observed: edge marker = old artifact
inference: pipeline hoặc alias chưa cập nhật
next probe: deployment source + custom-domain alias

Cấu trúc này ngăn một lỗi phổ biến: đổi claim ngay khi thấy một evidence thuận chiều. Ta giữ observation riêng cho đến khi causal chain đủ rõ.

Brainstorm mà không tự lừa mình

Brainstorm cần quyền được sai. Operation cần biết cái gì đang đúng. Trộn hai mode này vào cùng một tài liệu sẽ khiến giả thuyết dần biến thành “quyết định đã chốt” chỉ vì nó được đọc lại nhiều lần.

Tôi chia note thành ba nhãn:

  • Hypothesis: một giải thích có thể đúng, chưa có authority.
  • Observation: thứ đã thấy, kèm nguồn và thời điểm.
  • Decision: lựa chọn của owner, kèm lý do và điều kiện xem lại.
Nội dungNhãn đúngLỗi nếu ghi sai nhãn
“Có thể webhook chưa chạy”HypothesisBắt đầu sửa webhook khi lỗi nằm ở repository connection
“Edge trả hash cũ lúc 10:42”ObservationBiến một sample thành kết luận về toàn CDN
“Chuyển source sang monorepo”DecisionAgent tự coi suggestion là authority

Meta-thinking có ích ở đây vì nó giúp ta nhìn cách một ý nghĩ đổi status trong hệ thống, không chỉ nhìn nội dung của ý nghĩ.

Playbook phục hồi execution truth

Khi mở lại một task cũ, nhận handoff từ người khác hoặc cho AI resume qua session, tôi dùng checklist này:

  1. Đọc summary để lập bản đồ, không để kết luận của summary khóa hướng điều tra.
  2. Xác định câu hỏi đang cần current state, intention hay history.
  3. Kiểm tra worktree, remote ref và artifact trước khi sửa gì.
  4. Kiểm tra runtime hoặc edge nếu claim liên quan production.
  5. Giữ hypothesis, observation và decision thành ba lớp riêng.
  6. Đặt timestamp cho evidence dễ stale.
  7. Cập nhật handoff bằng claim có thể tái kiểm tra, không dùng “looks good”.

Tài liệu tham khảo

Đây là các nguồn cho phần cognitive science. Source-of-truth ladder và verification loop là framework vận hành tôi rút ra từ trải nghiệm làm việc với repo, runtime và agent, không phải kết luận trực tiếp của bốn nghiên cứu trên.