Skip to content

[DONE] 정리 3단계 PR 21 — 사이트 분석 도구 posthog-js 가 지금 메이저 안의 새 판으로 올라간다 - #64

Merged
patternflow-bot merged 2 commits into
devfrom
claude/cleanup-step3-pr21-g5rw5t
Oct 15, 2026
Merged

patternflow-bot merged 2 commits into
devfrom
claude/cleanup-step3-pr21-g5rw5t

Conversation

@patternflow-bot

@patternflow-bot patternflow-bot commented Oct 15, 2026 •

Copy link
Copy Markdown

dev / https://claude.ai/code/session_01YaNE5PiJaaaJoPyFkRUDTr

정리 3단계 계획서 표의 PR 21 이다. 사이트 방문 분석에 쓰는 posthog-js 를 1.371.4 에서 지금 메이저 안의 마지막 판 1.438.10 으로 올렸고, 고친 파일은 web/package-lock.json 하나다. 가짜 키로 두 판을 띄워 보면 PostHog 로 가는 이벤트와 세션 리플레이의 Gemini 키 가림은 같다. 대신 모든 페이지가 받는 posthog 조각이 gzip 으로 60.7 KB 에서 103.5 KB 로 커진다.

좋아지는 것: 없음

할 일

  • 계획서 표의 PR 21 행(k21)과 D1·D4·D8·발견 7, docs/rfc-cleanup.md §2.1·§2.5·§2.11·§2.13 답 4 를 읽는다
  • 표의 「merges after 20」 확인: PR 20([DONE] 정리 3단계 PR 20 — 사이트 AI 도구 @google/genai 가 지금 메이저 안의 새 판으로 올라간다 #63)이 dev 에 머지됨(70bafdc)
  • 이 묶음의 npm outdated 를 전후로 찍는다
  • npm update posthog-js 로 web/package-lock.json 만 바꾼다(package.json 그대로)
  • 사이트가 쓰는 init 옵션(defaults: '2026-01-30', maskNetworkRequestFn)이 새 판에서도 같은 값으로 풀리는지 두 꾸러미의 코드로 본다
  • npm ci 로 새 lockfile 에서 다시 깔고 typecheck, lint, check:ci, npm run build 를 돌린다. pattern-sandbox.html 해시가 같은지 본다
  • dev 의 lockfile 과 이 브랜치의 lockfile 로 같은 자리에서 빌드해 .next/static 과 미리 그린 HTML 을 파일마다 견준다
  • 가짜 키로 두 빌드를 띄우고, PostHog 호스트를 이 세션 안의 HTTPS 서버로 돌려 보내는 것을 견준다(페이지뷰, 자동 수집, 세션 리플레이, Gemini 키 가림)
  • 잠금, 글투, doc-map 을 돌린다
  • dev 를 다시 받아 본다: 70bafdc 그대로라 merge 할 것이 없다
  • 이 PR 의 CI(Web CI, Drift checks) 14e52cd success

한 일

web/package-lock.json 만 바뀌었다. +68 −260 이다. 1.438.10 은 OpenTelemetry 로그 꾸러미를 더는 걸지 않아서, @opentelemetry/ 항목 14개가 빠졌다. npm ci 가 까는 꾸러미는 807 에서 795 로 준다.

패키지 전 후 왜
posthog-js 1.371.4 1.438.10 직접
@posthog/core 1.27.3 1.59.1 posthog-js 가 거는 판이 1.27.3 에서 ^1.59.1 로
@posthog/types 1.371.4 1.416.0 1.371.4 에서 ^1.416.0 으로
@posthog/browser-common 없음 0.9.5 새로 거는 꾸러미
dompurify 3.4.1 3.4.17 ^3.3.2 에서 ^3.4.13 으로. monaco-editor 가 따로 둔 3.2.7 은 그대로다
preact 10.29.1 10.29.8 ^10.28.2 에서 ^10.29.3 으로
web-vitals 5.2.0 6.2.3 ^5.1.0 에서 ^6.2.1 로. 이 꾸러미를 거는 것은 posthog-js 하나다
web-vitals-soft-navs 없음 6.2.1 npm:web-vitals@6.2.1 별명으로 새로 건다
@opentelemetry/ 아래 9개(항목 14) 있음 없음 api-logs, core, exporter-logs-otlp-http, otlp-exporter-base, otlp-transformer, resources, sdk-logs, sdk-metrics, sdk-trace-base
@opentelemetry/api 1.9.1 1.9.1 남는다. next, drizzle-orm, @better-auth/core 의 선택 peer 라서 항목에 optional, peer 두 줄만 붙었다. npm ci 는 여전히 깐다

사이트는 src/providers/PostHogProvider.tsx 에서 posthog.init 과 posthog-js/react 의 PostHogProvider 를 쓴다. posthog.capture 는 그 파일과 src/lib/posthogEvents.ts 에서 부른다. 키는 빌드 때 NEXT_PUBLIC_POSTHOG_KEY 로 들어가고, 키가 없는 빌드는 init 을 하지 않는다. 그래도 import 가 정적이라 posthog 조각은 키와 상관없이 페이지마다 실린다.

init 옵션은 두 판의 dist/module.js 를 읽어 견줬다. defaults 는 새 판에서도 '2026-01-30' 을 받고, 그 날짜로 풀리는 값(rageclick 의 content_ignorelist, 리플레이의 strictMinimumDuration, external_scripts_inject_target: "head", localhost 를 내부 사용자로 보는 것)이 같다. 2026-05-30 부터 켜지는 새 기본값은 이 날짜로는 켜지지 않는다. maskNetworkRequestFn 은 타입에서 deprecated 지만 두 판 모두 리코더가 maskCapturedNetworkRequestFn 으로 바꿔 부른다. 사이트의 함수는 늘 요청을 돌려주므로, 새 판이 null 을 다르게 다루는 곳에는 닿지 않는다.

posthog 조각이 커진 것은 기본 묶음 자체가 커져서다. dist/module.js 가 192,848 에서 dist/module.mjs 337,589 바이트로 늘었고, 새 묶음에는 오류 정리([object DOMException] 같은 글), [NetworkMetrics], [metrics], MCP 분석 코드가 들어 있다.

증거

로컬, web/:

$ npm outdated        # 전, 이 묶음 줄만
Package       Current    Wanted    Latest
posthog-js    1.371.4  1.438.10  1.438.10

$ npm update posthog-js
$ git diff --stat
 web/package-lock.json | 328 +++++++++++---------------------------------------
 1 file changed, 68 insertions(+), 260 deletions(-)

$ npm outdated | grep posthog   # 후, 줄이 없다

$ npm ls --all   # posthog-js 아래, deduped 줄은 뺐다
+-- posthog-js@1.438.10
| +-- @posthog/browser-common@0.9.5
| +-- @posthog/core@1.59.1
| +-- @posthog/types@1.416.0
| +-- core-js@3.49.0
| +-- dompurify@3.4.17
| +-- fflate@0.4.8
| +-- preact@10.29.8
| +-- query-selector-shadow-dom@1.0.1
| +-- web-vitals-soft-navs@npm:web-vitals@6.2.1
| `-- web-vitals@6.2.3

$ git diff --name-only origin/dev...HEAD
web/package-lock.json

$ npm ci                                      # added 795 packages (전 807)
$ ls node_modules/@opentelemetry/             # api semantic-conventions
$ npm run typecheck                           # 출력 없음, exit 0
$ npm run lint -- --max-warnings=0            # 출력 없음, exit 0
$ npm run check:ci                            # exit 0
 Test Files  35 passed (35)                   # check:panels
      Tests  478 passed (478)
pattern-sandbox.html is up to date            # check:sandbox-sync
All module cache checks passed.               # check:modcache
passed   bom
passed   bom-schematic
passed   changelog
passed   editions
passed   features
passed   links-absolute
passed   markers
passed   presets
skipped  roadmap                              # 이 세션은 원래 레포를 못 읽는다. CI 는 strict 로 돈다
passed   shared

$ npm run build                               # 전도 후도 exit 0
✓ Compiled successfully in 17.8s
✓ Generating static pages using 3 workers (135/135) in 12.2s

$ sha256sum public/pattern-sandbox.html       # 전과 후가 같다
2fd57d42c5521b9de2d857b0d09b2232226ef8075d9d68baa8b1eed26b017677  public/pattern-sandbox.html

$ npm run check:human-lock
check:human-lock: no locked words changed
$ npm run check:voice
check:voice: nothing found

$ git fetch --tags && npm run doc-map         # CSV 는 git checkout 으로 되돌렸다
1095 links from 217 files → docs/investigations/2026-10-doc-map.csv
0 do not resolve
1366 Korean/English pairs → docs/investigations/2026-10-doc-parity.csv
7 en-short, 18 ko-short, 1 missing-ko, 1340 ok

빌드 견주기. 키 없이(CI 와 같이) dev 의 lockfile(1.371.4)과 이 브랜치의 lockfile(1.438.10)로 같은 자리에서 npm ci 와 npm run build 를 했다.

$ (cd .next/static && find . -type f | sort | xargs sha256sum)   # 전과 후를 diff, 빌드 id 폴더는 가림
< ab59a512…  ./chunks/046yrii25njr4.js   (posthog 조각 187,377 바이트, gzip 60,684)
> e61f3cb8…  ./chunks/2b_6171hn9tsm.js   (posthog 조각 318,880 바이트, gzip 103,501)
< 4881a3e6…  ./chunks/0m21j17c8k46u.js   (PostHogProvider 와 posthog-js/react 26,788 바이트, gzip 7,671)
> ffd2ea1e…  ./chunks/1fmj8czyx2czv.js   (같은 조각 28,053 바이트, gzip 8,130)

$ for f in server/app/**/*.html; do cmp <(가린 전) <(가린 후); done   # 빌드 id 와 두 조각 이름을 가림
120 pages, 0 differ after masking

.next/static 은 양쪽 모두 129 파일이고 바뀐 것은 둘이다. 전체는 7,406,840 에서 7,539,608 바이트로 132,768 바이트 커졌다. 두 조각은 _global-error.html 을 뺀 119 페이지가 모두 부른다. 페이지 하나가 처음 받는 JS 가 gzip 으로 43,276 바이트 늘어난다는 뜻이다.

브라우저, 이 세션의 Chromium(Playwright). 두 빌드를 NEXT_PUBLIC_POSTHOG_KEY=phc_probe_pr21 로 다시 빌드해 차례로 next start 로 띄웠다. 주소는 http://pf.probe:3100 이다. localhost 에서는 posthog 가 네트워크 기록을 켜지 않아서 다른 이름을 썼다. Chromium 이 us.i.posthog.com 과 us-assets.i.posthog.com 을 이 세션 안의 HTTPS 서버로 찾게 하고, 그 서버가 원격 설정(리플레이 켬, network_timing 켬)을 주고 받은 것을 모두 적었다. 리코더 스크립트는 각 판의 꾸러미 dist/ 에서 그대로 내줬다. /?utm_source=probe&utm_campaign=pr21 을 열어 보이는 /journal 링크를 눌렀다. 그 페이지에서 https://generativelanguage.googleapis.com/...:generateContent?key=AIzaSyPROBE-SECRET-KEY-pr21 로 fetch 하고 페이지를 떠났다.

                              1.371.4                                1.438.10
원격 설정                      GET /array/phc_probe_pr21/config.js    같다
리코더, 설문                   GET /static/lazy-recorder.js?v=1.371.4  GET /static/1.438.10/lazy-recorder.js
                              GET /static/surveys.js?v=1.371.4       GET /static/1.438.10/surveys.js
이벤트                         POST /e/ 1, POST /i/v0/e/ 1            같다, 쿼리 ?ip=0&ver=…&compression=gzip-js 가 빠졌다
                              $pageview /, $autocapture, $pageview /journal   같다
$autocapture 의 요소 사슬           Journal 링크 클릭, 1,149 글자              바이트까지 같다
리플레이                       POST /s/ 2, 198,340 바이트             POST /s/ 2, 194,364 바이트
Gemini 주소(리플레이 안)        generativelanguage.googleapis.com/(redacted)   같다
보낸 것 어디든 키 글자           없음                                   없음

이벤트 셋의 속성을 이름마다 견줬다. $current_url, $pathname, utm_source, utm_campaign, $lib, $process_person_profile: false 가 같다. 다른 것은 판 번호, 시각, id 같은 매번 바뀌는 값과 SDK 가 스스로 붙이는 값이다. 새 판은 $sdk_dist_channel: "npm" 과 광고 클릭 id 두 개(bfcid, oppref, 이번엔 null)를 더 붙이고, 옛 판이 붙이던 $sdk_debug_* 넷과 $snapshot_max_depth_exceeded 는 붙이지 않는다. posthog 는 HeadlessChrome 을 봇으로 보고 이벤트를 버려서, 두 판 모두 같은 보통 Chrome 사용자 에이전트를 주고 navigator.webdriver 를 끄고 돌렸다.

GitHub, 이 PR: 14e52cd 에서 「Web CI / build」(116370125901)와 「Drift checks / check」(116370125384, PF_DRIFT_STRICT=1, human-lock 포함)가 success.

실행법

cd web && npm ci
npm outdated              # posthog-js 줄이 없다
npm run lint -- --max-warnings=0 && npm run typecheck && npm run check:ci && npm run build
NEXT_PUBLIC_POSTHOG_KEY=phc_… npm run build && npm run start   # 브라우저 개발 도구에서 us.i.posthog.com 으로 가는 /e/ 와 /s/ 를 본다

가정

  • 기준 브랜치는 dev(머리말). 표가 PR 21 에 적은 web/package-lock.json 하나만 고쳤다. CHANGELOG.md, docs/rfc-cleanup-progress.md, doc-map CSV 는 안 고쳤다. 라벨은 PR 14 부터 20 처럼 달지 않았다.
  • 계획서 D4 로 posthog-js 는 혼자 한 묶음이다. @posthog/core, @posthog/types, @posthog/browser-common 은 함께 나오는 꾸러미지만 사이트가 직접 걸지 않고, posthog-js 가 거는 범위를 따라 이 PR 에서 함께 움직였다.
  • web-vitals 는 5 에서 6 으로 메이저가 바뀌었다. 사이트가 거는 꾸러미가 아니고 posthog-js 1.438.10 이 ^6.2.1 을 걸어서 따라온 것이라 §2.13 답 4 가 막는 메이저 업데이트로 보지 않았다. 사이트 코드는 web-vitals 를 부르지 않는다.
  • npm outdated --all 로 보면 posthog-js 아래 core-js 3.50.0 과 fflate 0.4.9 가 범위 안에 있다. npm update posthog-js 는 이미 범위를 채우는 아래 꾸러미를 옮기지 않아서 그대로 뒀다. PR 20 이 @google/genai 아래 꾸러미를 둔 것과 같다.
  • package.json 의 ^1.371.4 는 그대로다. D4 는 캐럿 범위를 lockfile 에서 움직이라고 한다.
  • posthog 조각이 페이지마다 gzip 43 KB 커지는 것은 D1 이 의존성 업데이트에 허락한 변화로 보고 그대로 올렸다. D4 는 연 날 npm outdated 가 보이는 판을 받으라고 하고, 크기를 따로 막는 규칙은 계획서에 없다. 크기가 문제라면 더 낮은 판을 고르는 일은 계획서 밖의 결정이라 창작자 몫으로 남겼다. 사이트 import 를 posthog-js 의 slim 묶음으로 바꾸는 것도 src/ 를 고치는 일이라 이 행 밖이다.
  • 이날 npm outdated 의 Latest 가 Wanted 와 같아서, 이 PR 뒤 posthog-js 는 npm latest 판이다. 1.438.10 은 10월 14일 19:18 UTC 에 나왔다.
  • 실제 PostHog 에는 보내지 않았다. 원격 설정은 이 세션이 지어서 준 것이라 운영 프로젝트의 설정과 다를 수 있다. 같은 설정을 두 판에 주고 견준 데까지 봤다. 리코더와 설문 스크립트를 받는 주소가 /static/<판>/ 꼴로 바뀌었는데, 운영에서 그 주소에 파일이 있는지는 이 세션이 PostHog 에 닿지 못해 보지 못했다.
  • 스크린샷은 레포에 올리지 않았다. 표가 이 PR 에 lockfile 하나만 허락한다. 브라우저에서 본 것은 증거 절에 적었다.
  • 펌웨어를 건드리지 않아 build.sh all 은 해당이 없다.
  • Changelog 절은 ### Web 하나로 했다.

Changelog

Web

  • posthog-js is on its latest release inside the current major. 1.438.10, in web/package-lock.json only. Pageviews and clicks reach PostHog with the same names and site properties, and session replay still shows the Gemini endpoint as (redacted). The PostHog chunk every page loads grows from 61 KB to 104 KB gzipped.

Upstream

  • What: Update posthog-js inside its current major, in web/package-lock.json only: 1.371.4 to 1.438.10. package.json is unchanged.
  • Checks: npm run typecheck, npm run lint, npm run check:ci and npm run build pass; pattern-sandbox.html is byte for byte the same, and a stubbed PostHog host receives the same events from both versions, with the Gemini key redacted in replay.
  • Docs map: none

🤖 Generated with Claude Code

https://claude.ai/code/session_01YaNE5PiJaaaJoPyFkRUDTr

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YaNE5PiJaaaJoPyFkRUDTr
npm update posthog-js, lockfile only. Step 3 k21.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YaNE5PiJaaaJoPyFkRUDTr
@patternflow-bot patternflow-bot changed the title [WIP] Patternflow 정리 3단계 PR 21 [DONE] 정리 3단계 PR 21 — 사이트 분석 도구 posthog-js 가 지금 메이저 안의 새 판으로 올라간다 Oct 15, 2026
@patternflow-bot
patternflow-bot marked this pull request as ready for review October 15, 2026 10:40
@patternflow-bot
patternflow-bot merged commit 6d7eec6 into dev Oct 15, 2026
2 checks passed
@patternflow-bot
patternflow-bot deleted the claude/cleanup-step3-pr21-g5rw5t branch October 15, 2026 10:44
engmung pushed a commit to engmung/Patternflow that referenced this pull request Oct 15, 2026
engmung pushed a commit to engmung/Patternflow that referenced this pull request Oct 15, 2026
Patternflow-lab#11
Patternflow-lab#12
Patternflow-lab#13
Patternflow-lab#15
Patternflow-lab#17
Patternflow-lab#14
Patternflow-lab#16
Patternflow-lab#19
Patternflow-lab#20
Patternflow-lab#18
Patternflow-lab#21
Patternflow-lab#23
Patternflow-lab#24
Patternflow-lab#25
Patternflow-lab#26
Patternflow-lab#28
Patternflow-lab#29
Patternflow-lab#30
Patternflow-lab#27
Patternflow-lab#31
Patternflow-lab#32
Patternflow-lab#34
Patternflow-lab#35
Patternflow-lab#33
Patternflow-lab#36
Patternflow-lab#37
Patternflow-lab#38
Patternflow-lab#39
Patternflow-lab#40
Patternflow-lab#41
Patternflow-lab#42
Patternflow-lab#43
Patternflow-lab#46
Patternflow-lab#44
Patternflow-lab#47
Patternflow-lab#48
Patternflow-lab#49
Patternflow-lab#45
Patternflow-lab#50
Patternflow-lab#51
Patternflow-lab#52
Patternflow-lab#54
Patternflow-lab#57
Patternflow-lab#55
Patternflow-lab#53
Patternflow-lab#56
Patternflow-lab#59
Patternflow-lab#58
Patternflow-lab#60
Patternflow-lab#61
Patternflow-lab#62
Patternflow-lab#63
Patternflow-lab#64
Patternflow-lab#65
Patternflow-lab#66
Patternflow-lab#67
Patternflow-lab#68
Patternflow-lab#69
Patternflow-lab#70
Patternflow-lab#72
Patternflow-lab#73
Patternflow-lab#71
Patternflow-lab#75
Patternflow-lab#74
Patternflow-lab#77
Patternflow-lab#78
Patternflow-lab#76
Patternflow-lab#79
Patternflow-lab#80
Patternflow-lab#81
Patternflow-lab#82
Patternflow-lab#84
Patternflow-lab#83
Patternflow-lab#85
Patternflow-lab#86
Patternflow-lab#87
Patternflow-lab#88
Patternflow-lab#90
Patternflow-lab#91
Patternflow-lab#89
Patternflow-lab#92
patternflow-bot added a commit that referenced this pull request Oct 16, 2026
… 않는다 (#94)

* Add horizontal desktop printed enclosure and assembly instructions. Switch username to mbchars.

* tools: case-models builds mbchars' horizontal desktop case

mbchars.py puts the remix's printed parts together from its STLs (no
assembled file exists): the three front sections where the joint bars'
36 mm insert pitch puts their lug holes, the covers on the sixteen inserts,
the USB retainer on its boss and the stands on the bottom edge, each step
checked against the README (410.28 x 176.16 x 42 mm), the board's encoder
grid, the 320 x 160 mm panel and boolean overlaps. assemble.mjs learns
ledTurn (the panel lies the long way here) and knobLook (the official knob,
printed white), and lib/looks.mjs pla_orange, the 3MF's own #F46B16. The
other three models rebuild byte-identical; the new one is 380 KB.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QGBYm64PnfneJq2ZDJ8Gs7

* web: /build's case switch and 3D preview get a fourth case, mbchars' horizontal desktop one

The card is the remix README's own facts and photos (resized to 1200 px),
the preview shows the device in the case, and the switch is four tabs, two
by two on a phone. A case too wide for the view at the one scale (this one,
41 cm across on a desktop's tall canvas) is drawn smaller by as little as
keeps it clear of the arrows; every case still fits at the one scale on a
phone, and the three upright ones on a desktop.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QGBYm64PnfneJq2ZDJ8Gs7

* docs: changelog for mbchars' horizontal desktop case and the fourth preview case

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QGBYm64PnfneJq2ZDJ8Gs7

* web: ZuperZuche's build joins the map - the first print, from Moscow

Found by accident, with the PCBs ordered ten minutes later; the 3D printer came
a month on, bought for the case, and the case was the first thing it printed.
Moscow was given, so the pin is on the city.

The blurb stops at the printer. The maker's note about making the patterns with
AI is left out on purpose, and there are no pronouns for the maker: the message
does not say.

Three photos: a pixel-art Mount Fuji beside a modular synth, a pixel-art frog
pond seen from above, and a cat plush in front of the panel.

groups.test.ts pins the number of countries on the real map; Russia is new, so
11 becomes 12.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* web: the 3D preview names whose case it is, in the build map's label

On the Build tab the name on the case's tab (Official, Besoiobiy,
SimonePDA, mbchars) stands over the device, on the build map's dark
highlight. It follows the pick at once, as the tab does, and reads
Official for a case whose model did not load. The knob hint moves under
it while it is up. Changelog also gets the line for the arrows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* web, docs: the first flash starts in download mode, /flash goes to the guide's Flash chapter, and the README is new from its first screen

The Play guide's 01 Flash (and /ko) puts hold BOOT, tap RST before Flash
Patternflow on every first flash, assumes the Wi-Fi step after
"Installation complete!" usually does not come (RST, Flash Patternflow
again, Connect to Wi-Fi), and ends on the panel's own patternflow-xxxx
network at 192.168.4.1 for when that does not take; the device simulator
draws the NETWORK screen's hotspot. The Build guide's flash card, the
Pattern tab's notes and the breadboard page give the same order. The bare
/flash, which the device's Update page and every release's FLASHING.md
point at, redirects to /guide/play#flash; /flash/manifest.json and
/flash/bin/* are untouched. flash.test.ts pins the card order and anchors.

The README opens with a one-line definition, the hero, the
photosensitivity warning, four doors (Build, Play, Make patterns, Add
sound) and First light; the story, community, facts and editions follow,
shorter. The docs that give the first flash (firmware/README.md,
PATTERN_GUIDE.md, SUPPORT.md, docs/assembly/) say the same order, the
indexes list the guide pages, the three case remixes and the bundles that
exist, and stale wording (the custom slots, "variant", the dead /flash
page) is gone. CONTRIBUTING.md gets a row for the interactive guide's
copy, and the pull request template asks for the row and the link check.

From #7 (caaf2c1).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VaFtEmtx2AkdH1wnbQpV3Z

* docs: the README opens with the fixed lines and three ways in, and First light follows the build

The opening is L1 + L2 + L3 from docs/manifesto.md (Paik moves to Where it
began, in L5's own words), with Play one in your browser, Build one and Get
one assembled under the badges. First light moves below the build, gains the
steps it was missing (unplug before seating, Origin as the sign of success,
Format storage on the first Basics install) and states the J4 rule as data
never power on the DevKit's ports. Stale lines are corrected against the
repo: sound and MQTT shipped in editions, MIDI arrived in 3.9.0, 3.10.5
fixed four requests, and the photosensitivity warning is the manifesto's
full text.

From #8 (bfc4b22).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VaFtEmtx2AkdH1wnbQpV3Z

* docs: BUILD_GUIDE flashes in the Play guide's order, and the README's campaign is still open

BUILD_GUIDE §8.1 now goes download mode first (hold BOOT, tap RST),
Flash Patternflow, the Wi-Fi as a second go after RST, the DevKit seated
with the power bank unplugged, then the panel's own patternflow-xxxx
network (K2 shows its name before the hotspot is up), then the Basics
pack: the Play guide's 01 Flash card for card. §7 no longer seats the
DevKit before it has firmware, so it is Wiring, and 7.4 names the step
that powers up. The README's First light points at §8 again, and Crowd
Supply reads as it stands: past its goal, open until 15 October; the
200% figure stays in the dated timeline. Besoiobiy's case README cites
the renumbered steps.

From #9 (16eca1b).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VaFtEmtx2AkdH1wnbQpV3Z

* ## What changed

**New journal post** — `fine` (ko + en), published 2026-10-13. Not highlighted.

Putting the blog off but not past a week, a hand-written paper diary after months, being selected for Anthropic's Claude startup program, reading and music slipping, AI making time feel more pressing, the interview shoot for the introduction video at the startup center studio, the funding ending in two days, the apartment renovation that still hasn't happened, the visually impaired artist enjoying the Patternflow at the Seoul Station teardown, and parts bought for a workshop.

**Two photos**, resized to 2000 px on the long side:
- the interview studio (faces already pixelated in the source), after the interview paragraph; also the cover, since the author prefers not to lead with a face
- the Seoul Station exhibition before the teardown, after the teardown paragraph

## Notes

- The draft pasted the Korean section twice in `_temp/blog.md`; the second copy was clean and is the one used, so the text matches the English paragraph for paragraph (13 each).
- Verified against the dev server: both language versions return 200, both images serve, and the index hero is this post with the interview photo as its thumbnail. Not in the highlighted rows.
- `dev` and `main` were identical before this commit, so the PR carries only the post.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
BODY
journal: new post "fine"

Post (ko+en), not highlighted: the paper diary, the Claude startup
program, the interview shoot for the introduction video, the
funding ending in two days, the apartment still unrenovated, and the
visually impaired artist enjoying the Patternflow at the teardown.

Two photos at 2000 px: the interview studio (faces already
pixelated), also the cover, and the exhibition before the teardown.
The draft pasted the Korean section twice; the clean second copy is
used.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs: the cleanup has a baseline

From #11

* docs: cleanup step 1 is planned

From #12

* docs: the v2 build guide moved to `docs/legacy/BUILD_GUIDE_v2.md`

From #13

* docs: the doc map lists the Korean/English pairs

From #15

* docs: the doc map reads the YAML under `.github/`

From #17

* docs: `CHANGELOG.md` is split by release into `docs/releases/`

From #14

* docs: the community files moved to `.github/` and the audio guide to

From #16

* docs: cleanup step 2 is planned

From #19

* docs: cleanup step 3 is planned

From #20

* docs: the project's writing voice is written down

From #18

* docs: cleanup step 4 is planned

From #21

* docs: the docs index and the repository map catch up with step 1 of the

From #23

* docs: cleanup step 5 is planned

From #24

* web: `check:features` fails when /features and the feature folders

From #25

* web: `check:links-absolute` fails on a GitHub link into the repository

From #26

* hardware: `check:bom` and `check:bom-schematic` hold the BOM to the

From #28

* web: `check:editions` fails when the shelf and the bundles disagree

From #29

* web: `check:presets` fails when a web preset cannot reach a panel

From #30

* web: `check:human-lock` fails a pull request that changes a word of the

From #27

* web: `check:changelog` fails when `CHANGELOG.md` and `docs/releases/`

From #31

* web: every pull request runs the drift checks and the text lock

From #32

* web: `check:roadmap` fails when a /roadmap node and its issues disagree

From #34

* docs: the contributor docs say what CI runs on every pull request

From #35

* web: `check:voice` points at the habits of generated prose, line by line

From #33

* docs: `AGENTS.md` carries the writing-voice rule and the step 2 check

From #36

* docs: the doc map is regenerated at the close of step 2 of the cleanup

From #37

* web: five of the site's twelve lint warnings are gone

From #38

* web: the seven `<img>` lint warnings carry a named exception

From #39

* docs: where the panel size lives, line by line

From #40

* web: pattern Lab's July storage keys say who wrote them and when

From #41

* web: the site's redirects and old routes say what links them

From #42

* web: web CI fails on a lint warning

From #43

* firmware: the MIDI page counts 24 detents a turn, as the encoder has

From #46

* web: the community's old formats say what wrote them and when

From #44

* firmware: the vendored HUB75 driver names the upstream commit it came

From #47

* firmware: the vendored HUB75 driver takes upstream's fix for its config

From #48

* web: a new TODO or FIXME turns the drift checks red

From #49

* web: one file holds the values the firmware and the site both carry

From #45

* docs: the any-resolution RFC has a draft

From #50

* docs: the Linux player has a draft RFC

From #51

* firmware: the firmware reads the values it shares with the site from

From #52

* web: the site's lint and test tooling is on its latest releases inside

From #54

* docs: `AGENTS.md` names `shared/`, the HUB75 driver's `UPSTREAM.md` and

From #57

* docs: the two step 5 drafts are listed in `docs/README.md`

From #55

* web: the site reads the panel size and the knob numbers from

From #53

* web: drizzle is on its latest patch releases

From #56

* docs: the repository maps catch up with step 3

From #59

* web: tailwind is on its latest 4.x release

From #58

* web: react Three is on its latest releases inside the current majors

From #60

* web: zustand is on its latest release inside the current major

From #61

* web: mediabunny is on its latest release inside the current major

From #62

* web: changes from #63

From #63

* web: posthog-js is on its latest release inside the current major

From #64

* web: better-auth is on its latest release inside the current major

From #65

* web: react is on its latest release inside the current major

From #66

* web: next is on its latest release inside the current major

From #67

* docs: the doc map is regenerated at the close of step 3 of the cleanup

From #68

* web: the guide's simulated board takes input that no hand made

From #69

* tools: a virtual panel for the contract vectors

From #70

* tools: the virtual panel answers device state over REST

From #72

* tools: the virtual panel answers the pattern routes

From #73

* tools: contract vectors have a format and a replay

From #71

* web: `check:virtual-panel` runs every preset on the virtual panel

From #75

* tools: the virtual panel speaks MQTT

From #74

* tools: the virtual panel answers `/api/mqtt`

From #77

* tools: the virtual panel speaks OSC

From #78

* docs: the REST contract has its first vectors

From #76

* docs: the MQTT contract has its first vectors

From #79

* tools: oSC has contract vectors

From #80

* docs: the REST vectors reach the rest of the core

From #81

* docs: the MQTT vectors reach the channels and the snapshot, and

From #82

* tools: the virtual panel takes the audio WebSocket

From #84

* tools: the virtual panel speaks RTP-MIDI

From #83

* tools: the audio WebSocket has contract vectors

From #85

* tools: the virtual panel sends MIDI back

From #86

* tools: mIDI has contract vectors

From #87

* tools: mIDI out and `/api/midi` have contract vectors

From #88

* docs: the maps of the tree name the virtual panel and the contract

From #90

* docs: the REST and MIDI specs say one thing where they said two

From #91

* docs: `AGENTS.md` names the virtual panel, the contract vectors and

From #89

* docs: the doc map is regenerated at the close of step 4 of the cleanup

From #92

* docs: changelog for 81 workshop fork PRs

#11
#12
#13
#15
#17
#14
#16
#19
#20
#18
#21
#23
#24
#25
#26
#28
#29
#30
#27
#31
#32
#34
#35
#33
#36
#37
#38
#39
#40
#41
#42
#43
#46
#44
#47
#48
#49
#45
#50
#51
#52
#54
#57
#55
#53
#56
#59
#58
#60
#61
#62
#63
#64
#65
#66
#67
#68
#69
#70
#72
#73
#71
#75
#74
#77
#78
#76
#79
#80
#81
#82
#84
#83
#85
#86
#87
#88
#90
#91
#89
#92

* 시작 — 정리 마지막 기록을 원래 레포 dev 위에 다시 짠다

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DpjXsYZbwT5PpwzpNCEEqq

* docs: the doc map lists the six links the cleanup's closing entry adds

The progress log's entries for steps 1 to 5 and the gate link
contract-vectors.md, the doc-parity list, the panel-geometry record and
the two RFC drafts. The cleanup RFC's status line links the log. Each of
the six resolves. The log and the RFC come over with the cleanup's
records, so until they land the map is six rows ahead of the tree.

From #93 (2f094fe).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DpjXsYZbwT5PpwzpNCEEqq

---------

Co-authored-by: Mykyta Bilous <belousnikita@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Lee Seunghun <122682380+engmung@users.noreply.github.com>
Co-authored-by: pi-hub <pi-hub@localhost>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants