# Agent tự dựng lại Slack thành video bằng code

[Matt Palmer](https://homus.dev/speakers/matt-palmer) · [Matt Palmer](https://homus.dev/orgs/matt-palmer)

> Cursor cloud agent có máy tính riêng dựng lại Slack thành video bằng code; pattern inner loop, outer loop và cách biến workflow thành skill.

Topics: Coding Agents, Agents, Workflow, Skills

Canonical: https://homus.dev/talks/my-agent-rebuilt-slack

## 1. Vì sao Matt mê Cursor dạo này

Matt Palmer mở đầu bằng một lời thú nhận: dạo này anh bị ám ảnh với Cursor, và lý do thì không như người ta hay nghĩ. Trong video này, anh hứa hai việc. Thứ nhất, anh sẽ đi qua cách mình đang dùng Cursor và đưa ra một ví dụ thực chiến (tactical example), để người xem có thể lấy đúng pattern đó mang về quy trình phát triển của chính mình.

Điều thú vị là ví dụ này thực ra không phải chuyện build phần mềm, dù những gì anh làm thì rất giống build phần mềm. Thứ hai, anh sẽ giải thích vì sao trao cho một agent một cái máy tính là một trong những việc mạnh nhất mà ta có thể làm trong thời đại AI agent.

![Cửa sổ Cursor: chat bên trái, desktop Linux của cloud agent bên phải](https://homus.dev/photos/fRPbHRl4W0E-0026.jpg)

Màn hình Matt mở ra: bên trái là một chat của Cursor (tiêu đề chat kết thúc bằng "motion video analysis", model trên màn hình là Claude Opus 5.5 High Fast, chạy Cloud trên branch `cursor/bootstrap-motion-skill-6974`), bên phải là tab Desktop, tức máy Linux của agent, cạnh tab PR #30.

## 2. Cloud agent có máy tính riêng và computer use

Trước mặt Matt là một chat trong Cursor, và lúc đó anh đang làm motion video. Thứ người xem thấy ở bên phải màn hình là một Linux VM. Theo Matt, mỗi Cursor cloud agent đều đi kèm một remote workspace kiểu này (theo video đăng ngày 16/10/2026). Điểm hay của remote workspace là Cursor có computer use trên toàn bộ môi trường đó: agent có thể tự làm những việc như mở Chrome, và người dùng cũng có thể giành quyền điều khiển (take control).

Matt làm đúng như vậy: anh bấm take control, mở Chrome trong máy ảo để cho người xem thấy Cursor đã làm gì ở đó. Hoá ra anh đã để Cursor chạy Slack ngay trong trình duyệt của máy ảo. Anh nói đây là gợi ý cho thứ anh sắp khoe hôm nay.

![Chrome trong máy ảo của agent đang mở Slack, workspace matts sandbox, channel launch-copy](https://homus.dev/photos/fRPbHRl4W0E-0103.jpg)

Chrome bên trong máy ảo của agent đang mở Slack: workspace "matts sandbox", channel `#launch-copy`. Matt nhờ bot Marketer viết bài ra mắt Team Bots trong Slack dưới 40 từ, và thread bên phải có bản nháp đầu tiên của bot. Nút "Take Control" nằm giữa màn hình.

Tóm lại, nhờ computer use, Cursor làm được đủ thứ rất hay và tự quản lý cái desktop này giúp anh. Từ đó Matt bắt đầu nghĩ: vậy làm sao để tạo ra một thứ như video?

## 3. Video as code: video cũng là phần mềm

Matt làm rất nhiều video, có thể người xem đã thấy vài cái. Và nhóm của anh thường tạo video asset bằng code. Ý tưởng video as code, hay rộng hơn là mọi thứ đều là code, nghĩa là mọi thứ dần trở thành phần mềm.

Nếu coi một video output là code, thì điều kiện để nó "đúng" (anh nói kèm chữ "quote unquote") gồm ba câu hỏi: nó có render được không, nó có compile được không, và nó có trông đúng như mình muốn không. Hai câu đầu máy kiểm được. Câu thứ ba thì sao? Nếu render một video, ta kiểm xem nó có trông như ý không bằng cách nhìn tận mắt (visual inspection).

![Slide Video as code: đoạn HTML có thẻ video và script animation, kèm ba điều kiện renders, compiles, looks right](https://homus.dev/photos/fRPbHRl4W0E-0143.jpg)

Slide "Video as code": một file `index.html` mở trong editor có một composition chứa video và tiêu đề, cùng một dòng animation; dấu "= software". Bên dưới là "correct if it..." với renders và compiles đã tick xanh, còn looks right là biểu tượng con mắt, cạnh một kính lúp soi vào một khung Slack.

Đoạn code trên slide, nguyên văn:

```

video as code

tl.from("h1", {y: 40, opacity: 0})

```

Theo Matt, trong quá khứ đây là việc mà agent và các AI model làm rất tệ. Còn tính đến lúc quay video (đăng ngày 16/10/2026), chúng đã giỏi hơn nhiều. Điều đó có nghĩa là ta có thể đưa các feedback loop này vào chính những video ta tạo ra bằng code: agent render, tự nhìn, tự so, rồi sửa.

Và thứ Matt muốn cho xem hôm nay chính là những video anh đã cùng các agent của mình tạo ra để tái dựng lại workspace Slack. Anh chuyển sang xem một vài bản render.

## 4. Những bản render Slack do agent làm

Matt đi qua các bản render Slack mà anh làm cùng agent, và tự nhận xét rằng chúng thực sự rất xuất sắc. Điều quan trọng nhất anh muốn nhấn mạnh: anh không hề tạo ra những asset này bằng cách decompile Slack. Tất cả những gì anh làm là:

- Nói với agent thứ mình muốn.

- Đưa cho agent một video tham chiếu (video reference).

- Mở workspace Slack ngay trên máy tính của agent.

- Bảo agent dùng những hình ảnh đó làm cảm hứng cho thứ cần làm.

Agent về cơ bản đã tự trích xuất được toàn bộ phần hình ảnh, chép lại rất nhiều yếu tố chuyển động (motion elements), rồi implement lại đúng những thuộc tính easing, những motion pattern và các chi tiết tương tự.

![Lưới nhiều khung hình nhỏ: các cảnh nói trước camera xen kẽ các bản render Slack và slide](https://homus.dev/photos/fRPbHRl4W0E-0150.jpg)

Một tấm lưới tổng hợp các cảnh của dự án: cảnh Matt nói trước camera xen kẽ với các bản render Slack (thread template, workspace, easing curves, motion patterns) và các slide về inner loop, outer loop.

Matt nhấn mạnh: tất cả những điều này hoàn toàn không làm được cách đây một năm (tính từ lúc video đăng, 16/10/2026). Nhưng cái chúng làm nổi bật thực ra là một điều sâu hơn: chúng làm lộ ra các pattern để build cùng AI. Đó là điều anh muốn nói tiếp theo, rồi sau đó sẽ quay lại thêm vài ví dụ.

## 5. Một hình dạng chung: một chat, một agent, một máy tính riêng

Điều Matt nhận ra là phần lớn các demo kiểu này đều có chung một hình dạng (a single shape). Đầu tiên, anh tương tác với một agent qua một chat. Agent đó có quyền truy cập vào máy tính riêng của nó, nơi nó toàn quyền điều khiển môi trường: nó chụp được screenshot, tương tác được với các phần tử trên màn hình.

![Slide: người dùng, one chat, agent, its own computer gồm repo, browser, apps](https://homus.dev/photos/fRPbHRl4W0E-0311.jpg)

Slide tóm hình dạng chung: người dùng đi vào một chat (one chat), chat nối tới agent, agent qua lại hai chiều với máy tính riêng của nó (its own computer), nơi có repo, browser và các app.

Cái máy đó có thể chạy trên cloud, cũng có thể chạy local. Matt thấy chạy trên cloud thật tuyệt, vì anh để nó chạy rất lâu mà không phải lo laptop đi ngủ giữa chừng. Dù vậy, anh cũng đang thử nghiệm với chiếc Mac Mini của mình và cho agent chạy trên đó; anh nói có lẽ đó là chủ đề cho một video khác. Dù chạy ở đâu, chúng vẫn có cùng một hình dạng.

Và về bản chất, thứ ta đang dựng ở đây là một inner loop và một outer loop. Matt từng dùng hai thuật ngữ này khi nói về một số loại phần mềm, nhưng ở đây nghĩa của chúng hơi khác một chút.

## 6. Inner loop: agent tự kiểm tra việc của mình

Trong inner loop, agent đang kiểm tra việc của chính nó. Nó làm một việc gì đó, rồi đối chiếu với một thứ có thật (something real). Khi thất bại, Matt lưu ý rằng ở đây có một tiêu chí thất bại: có một tiêu chí đánh giá (evaluation criteria) hoặc một mục tiêu nào đó. Agent sửa đúng chỗ đó rồi chạy tiếp.

![Slide The inner agent loop: do, check, done, chữ inner bị gạch](https://homus.dev/photos/fRPbHRl4W0E-0354.jpg)

Slide "The inner agent loop" (chữ "inner" bị gạch ngang): do, rồi check, rồi done. Ở các bước sau của slide, nhánh fix được thêm vào giữa check và do.

Đến một lúc, agent đạt tới điểm xong việc. Khi đó, nó bàn giao kết quả cho Matt để anh kiểm tra hoặc xác nhận (validate). Và đó chính là chỗ outer loop bắt đầu.

Inner loop theo cách Matt mô tả: agent làm, đối chiếu với một thứ có thật, sửa khi trượt tiêu chí, lặp lại cho tới khi xong rồi mới bàn giao.

## 7. Outer loop: con người đưa input và chấm output

Ở outer loop, phần của con người là cung cấp input: references (tham chiếu), preferences (sở thích, ý muốn) và access (quyền truy cập). Lý tưởng nhất, ta muốn trao cho inner loop mọi thứ có thể để nó tự làm được càng nhiều càng tốt.

Lấy ví dụ Slack: Matt đã phải tạo một Slack sandbox. Anh phải đưa cho agent một số credentials. Anh phải đăng nhập vào cái máy tính đó. Anh đùa rằng việc này có thể vi phạm điều khoản dịch vụ, mà cũng có thể không, nên "đừng kể với ai ở Slack HQ nhé".

![Slide The outer loop: inputs, inner loop, outputs, judge](https://homus.dev/photos/fRPbHRl4W0E-0611.jpg)

Slide "The outer loop" hoàn chỉnh: người dùng đưa inputs (references, preferences, access) vào inner loop (do, check, fix), inner loop trả ra outputs (artifacts, screenshots, analytics), và người dùng đóng vai judge, chấm output rồi quay lại vòng đầu.

Như vậy, ta cung cấp input cho inner loop, nơi agent thực hiện mọi thứ, và rồi inner loop trả output lại cho ta. Thực sự có hai vòng: một outer loop và một inner loop. Và việc mà những người thực hành (practitioners) như chúng ta có thể cố gắng làm là tự động hoá phần lớn nhất có thể của chuỗi này.

![Cursor: một agent con nhận lệnh từ agent cha để re-export asset pack, bên phải là Slack trong máy ảo](https://homus.dev/photos/fRPbHRl4W0E-0558.jpg)

Một ví dụ inner loop đang chạy: agent nhận lệnh "Sent by parent" yêu cầu re-export bộ asset Slack motion trên máy ảo sau hai lần đổi template, chỉ làm trong `/tmp` và `/opt/cursor/artifacts`, không chạy git. Agent báo hai bản render 4K đang chạy dở và sẽ đối chiếu các bản highlight theo checksum để biết cái nào cần làm mới.

## 8. The ladder: do, codify, generalize, automate

Bước đầu là làm việc đó một lần (do it once). Matt đã cho xem agent làm hết phần việc trên, nhưng điều anh chưa kể là lần đầu chính anh tự build nó, chỉ bằng vibe coding và chat qua lại với một agent. Rồi anh mới nghĩ: được rồi, làm sao biến cái này thành một skill?

![Slide The ladder: bậc Do workflow, bậc Codify skill, còn hai bậc cao hơn chưa có chữ](https://homus.dev/photos/fRPbHRl4W0E-0528.jpg)

Slide "The ladder": một đường bậc thang màu cam. Bậc đầu là Do (workflow), bậc hai là Codify (skill); hai bậc cao hơn chưa có chữ ở thời điểm này của slide, tương ứng với generalize và automate mà Matt nói tiếp.

Các bậc thang theo lời Matt:

- **Do:** làm việc đó một lần, ra một workflow.

- **Codify:** mã hoá workflow đó thành một skill. Từ đây ta có thể giao nó cho một agent để tự động hoá, hoặc thử tổng quát hoá nó.

- **Generalize:** sao lại chỉ làm cho Slack? Sao không làm cho X? Sao không làm cho những ứng dụng khác mà Matt muốn tạo visualization, muốn mô phỏng lại (mirror), hay muốn làm B-roll và asset cho video của mình? Câu hỏi lúc này là: làm sao dạy một agent làm việc này cho bất kỳ sản phẩm nào?

- **Automate:** cuối cùng, tự động hoá nó trong outer loop. Đó thực ra chính là thứ người xem đang thấy trên màn hình.

Đây là outer loop của tự động hoá, nơi Matt giờ đã có một feedback loop, một workflow được build y như một phần mềm. Và khi đã có phần mềm đó, anh chỉ việc đổ input vào inner loop và kỳ vọng nhận về output chất lượng cao để dùng được ngay.

Nên cốt lõi thực sự là các feedback loop, là tạo ra những vòng tuần hoàn tích cực (virtuous cycles), nơi ta chỉ việc xúc thông tin vào, hay nói đúng hơn là xúc context vào hệ thống, và nhận ra đúng những output mình thực sự muốn.

## 9. Khi nó hỏng: hỏi vì sao, như sửa một cái đèn

Cách làm này không hoàn hảo, và nó sẽ hỏng. Nhưng khi nó hỏng, ta phải hỏi vì sao. Ta phải lùi lại một bước và suy ngẫm, rồi về cơ bản phải làm đúng vai một kỹ sư.

Matt dùng lại một phép so sánh anh từng dùng: nếu cái đèn nhà bạn hỏng, bạn kiểm tra xem, một, nó đã cắm điện chưa, nó đã bật chưa, rồi bạn kiểm tra bóng đèn. Nếu đã kiểm hết những thứ đó, thì vấn đề nằm đâu đó giữa ổ cắm và bóng đèn. Và việc của bạn, với tư cách kỹ sư, là tìm ra vì sao nó hỏng.

Phép so sánh cái đèn của Matt: đã cắm điện, đã bật, bóng còn tốt, vậy lỗi nằm giữa ổ cắm và bóng đèn, và việc của kỹ sư là tìm ra nó.

Theo Matt (video đăng ngày 16/10/2026), công việc của kỹ sư chúng ta bây giờ là tìm ra vì sao agent thất bại. Khi agent thất bại, ta phải hỏi vì sao, phải tìm cho ra, phải debug. Rồi ta phải mã hoá cái "vì sao" đó thành một skill. Làm vậy thì mọi agent sau này đều thừa hưởng nó, và về cơ bản ta loại bỏ được cả một lớp lỗi (class of problem) đó trong tương lai.

Matt nói đây là quy trình anh đã dần học được khi build các agent này. Anh nghĩ nó sẽ là chìa khoá cho tương lai của phát triển phần mềm, nhưng không chỉ thế, mà cả làm media, và thực ra là mọi chức năng, vì về bản chất mọi chức năng đều đang dồn lại thành việc tương tác với agent và build phần mềm. Cái ta đang dựng là một meta loop, và kỹ năng cốt lõi của meta loop ấy là debugging.

## 10. Để agent tự viết skill trong lúc làm

Matt quay lại agent của mình. Agent vừa export một loạt asset, và anh mở ra xem. Điều anh đã dặn agent là: trong lúc nó build với Slack và cập nhật mấy thứ này, hãy build luôn một skill cho phép nó làm lại đúng việc đó. Tức là lấy những bài học rút ra từ việc tạo asset này và tổng quát hoá chúng, để từ nay về sau làm lại được.

Tin nhắn Matt gửi trong chat của agent, hiện trên màn hình ở đầu video:

```
Can you also make a skill for exactly what we just did? Bootstraping a motion skill from a UI? It might be in a vm or just another product you can open
```

![Cursor: agent báo đã merge PR 30 và trỏ PR 32 về main; bên phải là PR Add bootstrap-motion-skill](https://homus.dev/photos/fRPbHRl4W0E-0803.jpg)

Kết quả: một PR nháp tên "Add bootstrap-motion-skill: build a product motion skill from a live UI #32" với 29 commit. Bên trái, agent báo PR #30 đã merge, nó trỏ PR #32 về `main` và diff giờ chỉ còn 10 file của bootstrap skill; bản re-export asset pack vẫn đang chạy nền, đọc các template `slack-motion`.

Với Matt, chuyện này thật điên rồ, theo nghĩa tốt. Anh nói mình rất biết ơn công việc đang làm: anh được làm video cùng mọi người như thế này. Nhưng hơn thế, anh thấy cả cuộc đời mình đã dẫn tới đúng kiểu phát triển này, và anh giải thích vì sao.

## 11. Feedback loop ngoài phần mềm: chuyện cái cây

Với mọi việc mình làm, Matt luôn nghĩ: làm sao để làm nó tốt hơn một chút? Và cách để làm mọi thứ tốt hơn, thường là nhờ feedback loop. Ví dụ khi bạn thức dậy... rồi anh nói luôn rằng có thể trừu tượng hoá chuyện này cho bất kỳ thứ gì.

Matt có trồng cây. Nếu một cái cây chết, bạn hỏi: vì sao nó chết? Có thể mình tưới chưa đủ nước. Có thể tưới quá nhiều. Có thể nó không ở đúng môi trường. Nếu tìm ra được vì sao, bạn sửa đúng chỗ đó. Và lần sau có một cái cây khác, nó sẽ không chết theo đúng cách cũ nữa.

![Hình minh hoạ chậu cây với vòng Plant, Why, Fix và ba chữ Problem solving, Conscientiousness, Encoding](https://homus.dev/photos/fRPbHRl4W0E-0903.jpg)

Hình minh hoạ cạnh Matt: một chậu cây, vòng lặp Plant → Why? → Fix quay về Plant, và ba chữ Problem solving, Conscientiousness, Encoding.

Dạng cải thiện liên tục đó, cái feedback loop đó, theo Matt gồm giải quyết vấn đề (problem solving), sự tận tâm (conscientiousness) và mã hoá lại bài học (encoding). Chính nó làm nên một người trồng cây giỏi. Feedback loop ấy là cách ta giỏi lên ở bất cứ việc gì: tập tạ (strength training), chơi guitar, bất kỳ kỹ năng nào ta muốn giỏi.

## 12. Làm việc với agent cũng như làm việc với người

Cách còn lại để giỏi lên, theo Matt, là ở gần những người giỏi việc đó. Và chính những kỹ năng này cũng chuyển được sang kỹ thuật phần mềm, nếu bạn hiểu các công cụ; thật ra chúng vẫn luôn chuyển được như vậy.

Điều khác bây giờ (theo video đăng ngày 16/10/2026) là chúng chuyển được sang cả agent, sang chuyện thế nào là một người quản lý giỏi, một người làm việc tốt với người khác, hay một người thực hành giỏi. Nó y hệt nhau, chỉ là được phóng đại lên khi bạn làm việc với agent. Và rốt cuộc nó xoay quanh sự tận tâm (conscientiousness), sự chú ý tới chi tiết, và nói ra thì hơi lạ, nhưng là thói quen (habits).

Ý Matt muốn nói: cùng một bộ kỹ năng feedback loop dùng cho trồng cây, guitar hay tập tạ cũng là thứ làm nên người làm phần mềm giỏi, và được phóng đại khi làm việc với agent.

Matt thừa nhận anh chưa hoàn toàn chắc về những ý này. Anh vẫn đang mài giũa (workshopping) chúng một chút và thử cách trình bày. Nhưng điều anh cố làm là ghi lại những thứ này và đưa tới mọi người, để người xem hiểu anh đang build như thế nào.

## 13. Tóm lại: dựng asset như một software engineer

Matt hy vọng video này hữu ích, và nó cho thấy một workflow thực tế để tạo ra các motion asset giống những cái anh đã cho xem, giống những cái đang phát ngay bên trong Slack lúc anh nói.

![Bản render Slack phóng to: Matt Palmer nhờ Marketer viết bài ra mắt Team Bots dưới 40 từ, Marketer trả lời bản nháp đầu](https://homus.dev/photos/fRPbHRl4W0E-1015.jpg)

Một khung phóng to từ bản render (góc dưới ghi đây là crop 1:1 từ bản chụp 4K): Matt nhờ bot Marketer "draft the launch post for Team Bots in Slack", và Marketer trả lời "Here's a first pass: Team Bots are now in Slack. Add any Team Bot to a channel, mention it once, and it keeps working the thread with your whole team."

Theo Matt, workflow đó bắt đầu bằng việc tái dựng sản phẩm, cụ thể là:

- Tạo một môi trường để agent tái dựng sản phẩm đó.

- Để agent tự kiểm tra chính mình.

- Để agent chia sẻ feedback lại cho bạn qua chu trình inner loop và outer loop.

Anh tự nhận là đã nói khá nhiều. Tóm lại, hôm nay anh nói về cách dựng visual asset như một software engineer, và cách nghĩ như một software engineer với Cursor cloud agent, remote desktop và Linux VM. Anh giới thiệu mình là Matt, làm ở SpaceX AI (theo video đăng ngày 16/10/2026), rồi chào tạm biệt: "Until next time, peace."

## Nguồn và liên kết

- Tên gốc: My agent rebuilt Slack
- Sự kiện: [YouTube](https://homus.dev/events/youtube)
- Video gốc: [https://www.youtube.com/watch?v=fRPbHRl4W0E](https://www.youtube.com/watch?v=fRPbHRl4W0E)

- Kênh YouTube Matt Palmer (Matt Palmer): [youtube.com/channel/UCpe4azYvizhOPP22aSYnxwQ](https://www.youtube.com/channel/UCpe4azYvizhOPP22aSYnxwQ)

- Cursor Docs, Cloud Agents (máy ảo riêng trên cloud, computer use để điều khiển desktop và browser, artifacts và remote desktop control): [cursor.com/docs/cloud-agent](https://cursor.com/docs/cloud-agent)

- Cursor Docs, Agent Skills: [cursor.com/docs/skills](https://cursor.com/docs/skills)

Nguồn: https://homus.dev/talks/my-agent-rebuilt-slack · cập nhật 2026-10-21
