🚨 How the TanStack npm attack actually happened:
1. Attacker opened a normal-looking pull request (#7378) on the TanStack repo.
2. GitHub automatically ran CI tests on that PR.
3. Code inside the PR stole the workflow's GitHub Actions Cache write token during the test run.
4. The attacker used that token to plant poisoned files in the shared build cache. The PR could be closed afterwards. The poisoned cache stays.
5. The official release workflow later pulled from the cache, baked the malicious files into the build, and signed and published 84 malicious package versions to npm.
Codex now works directly in Chrome on macOS and Windows.
It’s even better at working with apps and sites in Chrome, and now works in parallel across tabs in the background without taking over your browser.
To get started, install the Chrome plugin in the Codex app.
● AI 하네스 깎는 노인
벌써 4년 전이다. 내가 갓 스타트업을 차린 지 얼마 안 돼서 판교에 내려가 일할 때다. 서울 왔다 가는 길에, 강남역 근처 공유 오피스에서 열리는 AI 밋업에 들른 적이 있다. 강남역 사거리 뒷골목, 낡은 건물 반지하에 조그만 사무실을 열어 놓고 하네스를 깎아 파는 노인이 있었다. 이력서에는 아무런 직함도 없고, 깃허브에는 잔디 하나 없으며, 링크드인 프로필조차 없는 사람이었다. 다만 "하네스 엔지니어링"이란 간판 하나만 벽에 붙어 있었다.
Claude Code를 쓰기 시작한 지 두 달쯤 되었을 때였다. 모델은 분명 Opus급인데 결과물은 영 시원찮았다. CLAUDE.md도 대충 써 봤고 프롬프트도 이리저리 고쳐 봤지만, AI는 매번 엉뚱한 파일을 고치고, 테스트는 통과 못 하고, 코드는 점점 스파게티가 되어 갔다. 누군가 그 노인을 소개해 주었다. "하네스를 한 벌 깎아 달라"고 부탁을 했다. 값을 굉장히 비싸게 부르는 것 같았다.
"좀 싸게 해 줄 수 없습니까? CLAUDE.md 하나 만드는 건데."
했더니,
"하네스 하나 가지고 에누리하겠소? 비싸거든 GPT한테 시키우."
대단히 무뚝뚝한 노인이었다. 값을 흥정하지도 못하고 잘 깎아나 달라고만 부탁했다. 그는 잠자코 우리 코드베이스를 열심히 읽고 있었다. 처음에는 빨리 훑는 것 같더니, 해가 저물도록 이 모듈 돌려 보고 저 의존성 돌려 보고 굼뜨기 시작하더니, 마냥 늑장이다. 내가 보기에는 그만하면 코드 구조는 파악됐는데, 자꾸만 더 깊이 들어가고 있었다.
"인제 다 보셨으니 CLAUDE.md 좀 써 주시죠."
라고 했더니 통 못 들은 척 대꾸가 없다. 노인은 터미널 하나 열어 놓고 git log를 끝없이 내려가며 커밋 히스토리를 읽고 있었다. 다음 주 데모 날짜가 빠듯해 왔다. 갑갑하고 지루하고 초조할 지경이었다.
"코드 구조 다 파악하셨을 테니 이제 그만 써 주십시오."
라고 했더니, 화를 버럭 내며,
"끓을 만큼 끓어야 밥이 되지, 생쌀이 재촉한다고 밥이 되나. 코드베이스도 모르고 어떻게 하네스를 깎아. 컨텍스트도 없이 프롬프트부터 쓰는 게 요즘 것들 문제야."
한다. 나도 기가 막혀서,
"돈 내는 사람이 좋다는데 무얼 더 본다는 말이오? 노인장, 외고집이시구먼. 데모가 다음 주라니까요."
노인은 퉁명스럽게,
"다른 데 가서 맡기우. 난 안 하겠소."
하고 내뱉는다. 지금까지 기다리고 있다가 그냥 갈 수도 없고, 데모 날짜는 어차피 틀린 것 같고 해서, 될 대로 되라고 체념할 수밖에 없었다.
"그럼, 마음대로 깎아 보시오."
"글쎄, 재촉을 하면 점점 거칠고 늦어진다니까. 하네스란 제대로 만들어야지, 깎다가 놓치면 되나."
좀 누그러진 말씨다. 이번에는 키보드에서 손을 숫제 떼고 태연스럽게 창밖을 보며 아메리카노를 홀짝이고 있지 않는가. 나도 그만 지쳐 버려 구경꾼이 되고 말았다.
---
노인이 하는 일을 지켜보니 보통이 아니었다.
먼저 CLAUDE.md부터 쓰는 게 아니었다. 우리 코드의 디렉토리 구조를 한참 들여다보더니, .claude/skills/ 폴더를 만들기 시작했다. 테스트 생성 스킬, 코드 리뷰 스킬, API 문서 생성 스킬. 하나하나 SKILL.md를 써 내려가는데, 한 줄 한 줄이 규칙이었고, 한 문장 한 문장이 검증 가능한 명령이었다.
"모호한 문장은 독이오."
노인이 유일하게 자발적으로 한 말이다.
그다음에는 AGENTS.md를 썼다. Planner, Coder, Reviewer — 서브에이전트의 역할을 나누더니, 각각에게 접근 권한을 다르게 설정했다. Coder 에이전트는 src/ 폴더만 건드릴 수 있고, Reviewer는 수정 권한 없이 읽기만 가능하게 했다.
"에이전트가 실수하면, 다시는 그 실수를 못 하게 시스템을 만드는 거요."
노인의 두 번째 자발적 발언이었다.
그러고는 pre-commit hook을 걸었다. 린터, 타입 체크, 테스트가 자동으로 돌아가게 했다. AI가 코드를 짜면 커밋 전에 자동으로 검증이 되고, 실패하면 Claude가 스스로 고쳐서 다시 커밋하는 피드백 루프를 만들었다.
Constraint, Context, Verification, Feedback — 네 개의 기둥이 하나씩 세워질 때마다 노인은 한 발 물러서서 전체를 바라보았다. 마치 조각가가 덩어리에서 형상을 꺼내듯이.
얼마 후에야 하네스를 다 깎았다고 내밀었다. 사실 다 되기는 아까 전부터 다 돼 있던 하네스다.
---
(이어서)
We replaced our entire smoke-test suite with 147 deterministic E2E tests powered by aimock. 🧪
Every PR now verifies every feature across 7 LLM providers in about 2 minutes. No tokens burned. No flakiness. ✅
Here's how → https://t.co/TNLxHvS3Md
“We don't see innovative alternatives to Facebook, TikTok, or Duolingo. Instead we have 1 million Habit Tracker apps and their variations. 1 million Screen Time apps. […] They are the Temu of tech, low quality apps…”