keepwatching은(는) 무엇을 하나요?
렌더링이 가능한 명명된 숏폼 비디오 포맷 데이터베이스입니다. 각 포맷은 세 개의 파일로 구성됩니다: 렌더 스펙, 명시된 가설, 그리고 측정된 모든 데이터(‘아직 없음’ 포함).
이 스킬을 유용하게 만드는 규칙: 절대 리텐션 숫자를 지어내지 마세요.
포맷의 성능에 대한 모든 주장은 formats/<slug>/data.yml에서 비롯되며, 각 주장에는 n 값이 포함됩니다.
만약 n: 0이라면 정직한 답은 “테스트되지 않음”입니다. 그렇게 말하세요.
설정 – 매 세션마다 먼저 수행하세요
이 스킬은 keepwatching 레포지토리에 있는 실제 렌더러를 구동합니다. 지침만으로는 아무 것도 렌더링할 수 없으므로, 첫 번째 단계는 항상 레포지토리를 찾거나 설치하는 것입니다.
# 1. 찾기. 첫 번째로 일치하는 경로를 사용합니다. 존재하지 않으면 사용자에게 물어보세요.
KW="${KEEPWATCHING_HOME:-}"
[ -z "$KW" ] && [ -d ./keepwatching ] && KW="$PWD/keepwatching"
[ -z "$KW" ] && [ -d "$HOME/keepwatching" ] && KW="$HOME/keepwatching"
[ -z "$KW" ] && { git clone https://github.com/msertdev/keepwatching "$HOME/keepwatching" && KW="$HOME/keepwatching"; }
cd "$KW"
# 2. 일회성 설치. 다시 실행해도 안전합니다. 이미 완료된 경우 아무 작업도 하지 않습니다.
npm install && npm run setup
# 3. 다른 작업을 수행하기 전에 라이브러리가 손상되지 않았는지 확인하세요.
npx kw check
24개의 갤러리 프리뷰는 커밋되어 있으므로, npx kw gallery는 아무것도 렌더링하지 않고 몇 초 만에 페이지를 표시합니다.
npm run setup은 비디오를 렌더링할 때만 필요합니다. 포맷의 scene을 변경하면 커밋된 프리뷰가 오래된 상태가 됩니다.
npx kw gallery --no-serve && git add site/previews로 다시 렌더링하고 커밋해야 합니다.
그렇지 않으면 CI의 kw previews check가 실패합니다.
kw check가 no problems를 출력하면 준비가 완료된 것입니다. 누락된 글꼴이 있다고 보고하면
npm run setup을 다시 실행하세요. 구성이 대체 글꼴로 렌더링되는 것을 거부합니다.
대체된 글꼴은 저장소가 지금까지 측정한 모든 프레임을 조용히 변경하기 때문입니다.
두 가지 실용적인 참고 사항.
- 대부분의 에이전트 환경에서 셸 변수는 도구 호출 간에 유지되지 않습니다.
모든 명령에서
KW를 다시 계산하거나, 각 명령을 명시적인cd /absolute/path/to/keepwatching &&로 시작하세요.$KW가 유지된다고 가정하지 마세요. npm run setup은 콜드 머신에서 몇 분이 걸릴 수 있습니다. Inter(약 30MB)와 헤드리스 Chromium(약 150MB)을 다운로드합니다. 둘 다 캐시된 머신에서는 몇 초 만에 완료됩니다. 멈춘 것처럼 보이지 않도록 어떤 상황이 발생하고 있는지 사용자에게 알려주세요.
이 파일의 모든 명령은 저장소 루트가 작업 디렉터리라고 가정합니다.
사용자가 다른 프로젝트에서 작업 중인 경우 저장소 내부에서 렌더링하고
MP4를 다시 복사하세요. kw는 외부에서 실행되지 않습니다.
npm run check도 있습니다. 이것은 kw check 에 tsc --noEmit을 더한 것입니다.
engine/ 아래에서 어떤 것이든 편집했다면 이것을 사용하세요.
요청받을 네 가지 작업
1. 주제에 맞는 포맷 선택
npx kw list # 모든 포맷, 샘플 크기 및 측정된 리텐션
formats/<slug>/meta.yml에서 hypothesis, useWhen 및 avoidWhen를 읽으세요.
주제가 아닌 콘텐츠의 형태를 포맷 제품군과 일치시키세요.
아래 표의 모든 포맷은 현재
n = 0입니다. 이는 증거를 기반으로 선택된 승자가 아니라 명시된 가설을 기반으로 선택된 시작점입니다. 하나를 추천할 때 그렇게 말하세요. 표는 어떤 포맷이 어떤 형태의 콘텐츠에 적합하다고 주장하는지 알려줍니다. 어떤 포맷이 실제로 성능이 좋은지는 알려주지 않습니다.
| 콘텐츠가… | 제품군 | 시작 포맷 |
|---|---|---|
| 하나의 큰 숫자 | stat-counter | stat-counter-rise |
| 기다릴 가치가 있는 결과 | countdown | countdown-clock |
| 정렬된 항목 집합 | ranking | ranking-suspense (완료) 또는 ranking-reveal (공유) |
| 하나의 숫자에서 차이가 나는 두 가지 옵션 | comparison | split-compare |
| 두 가지 상태의 동일한 주제 | reveal | before-after |
| 널리 퍼진 잘못된 믿음 | myth-fact | myth-vs-fact |
| 하나의 강력한 문장 | cold-open | cold-open-line |
| 실제 단계가 있는 프로세스 | progress | progress-bar |
| 진정으로 확대되는 가치 | escalation | escalation-ladder |
| 순환하는 것 | reverse | loop-seam |
하나를 추천할 때는 n 값을 인용하세요.
"ranking-suspense, 아직 이 저장소에서 테스트되지 않음(n=0)"은 좋은 추천입니다.
"ranking-suspense의 리텐션은 68%입니다"는 data.yml이 그렇게 말하지 않는 한 날조입니다.
2. 비디오 렌더링
포맷을 복사하고, data 블록을 채우고, 렌더링하세요:
npx kw new my-clip --from=stat-counter-rise
# formats/my-clip/format.json 편집 -> "data": { ... }
npx kw render my-clip # -> out/my-clip/master.mp4
# 선택 사항: 인코딩하지 않고 브라우저에서 미리 보기.
# 중지할 때까지 차단되므로 무인 실행 시 건너뛰세요.
npx kw preview my-clip
레이아웃이 실제로 변경되어야 하는 경우가 아니라면 data만 편집하세요.
scene 배열은 포맷입니다. 이것을 변경하면 클립이 다른 포맷이 되며
측정값이 더 이상 전이되지 않습니다. scene을 변경한 경우 format.json에서
version을 올리세요. 변형 ID는 여기에서 파생됩니다.
길이 변경 – 가장 일반적인 요청이므로 읽어보세요.
라이브러리 포맷은 8–30초(24개 중 21개는 8~14초)로 실행됩니다.
30초짜리 세 개 – cold-open-question, countdown-clock, stat-counter-rise
–는 진행 중인 실험의 수준이며 기본 길이가 아닙니다.
포맷에 아직 없는 길이 는 scene 편집이 필요하므로 "data만 편집"에는 해당되지 않습니다.
다음 규칙을 사용하세요:
canvas.durationSec과 scene의 모든 타이밍에newDuration / oldDuration을 곱하세요. 그런 다음 끝 부분을 확인하세요: 스케일링은 최종 유지 시간을 동일한 비율로 늘리므로 비율이 클수록 엔딩이 나빠집니다.
작업 예시 – stat-counter-rise를 10초에서 30초로, 비율 3.0. 다음은
실제로 출시된 숫자이며 예시가 아닙니다:
| 필드 | 10초 | ×3 | 출시됨 |
|---|---|---|---|
canvas.durationSec | 10 | 30 | 30 |
카운터 endSec | 6.4 | 19.2 | 21.0 |
막대 endSec | 6.4 | 19.2 | 21.0 |
unit at | 6.4 | 19.2 | 21.0 |
context at / in.at | 6.5 | 19.5 | 21.6 |
source at | — | — | 25.5 — 존재하지 않았던 비트 |
posterSec | 8.4 | 25.2 | 27.5 |
스케일링만으로는 마지막 비트가 30초 클립에서 19.5초에 남았습니다: 10.5초의
정지된 카드. 21.6초로 밀어도 충분하지 않았습니다. 약 2배를 넘으면
산술은 더 이상 답이 아닙니다. 클립에는 없었던 비트가 필요합니다.
여기서는 25.5초에 인용문 행이 추가되었습니다. 이 포맷은 sources에서 항상
주장하고 있었지만 화면에 표시된 적이 없었습니다. 최종 유지 시간: 4초.
약 3초보다 길게 유지되는 최종 카드는 데드 에어입니다.
그리고 끝의 데드 에어는 완료율을 떨어뜨립니다. kw frame0은
5초의 정지 화면에서 바로 실패합니다: 3초는 제작 조언이고, 5초는 하드 한계입니다.
이미 6초의 정지된 엔딩과 함께 출시된 세 가지 포맷을 발견했습니다.
제약 조건 및 확인 사항:
durationSec × fps는 정수 프레임 수여야 합니다.- scene을 변경할 때마다
format.json에서version을 올리세요 – 타이밍 변경도 포함됩니다. 새 스캐폴드가0.1.0이고 이를 다시 타이밍 조정하면0.2.0이 됩니다. 변형 ID는version과 스펙의 해시에서 파생되므로 이는 향후 측정값을 귀속시킬 수 있게 합니다. npx kw check는 클립 끝을 넘어서는 타이밍을 잡아내고,npx kw frame0은 아무것도 그리지 않는 첫 번째 프레임과 5초 이상의 정지 실행을 잡아냅니다. 둘 다 클립이 지루하다고 말할 수는 없습니다. 이를 위해서는 렌더링 후out/<slug>/contact.png를 여세요. 클립 전체에서 균등하게 6개 프레임을 샘플링하므로 거의 동일한 타일을 한눈에 볼 수 있습니다.
소싱. kw new --from=<slug>는 의도적으로 스캐폴드를
sampleContent: placeholder로 재설정하고 부모의 sources를 삭제합니다.
부모의 인용은 부모의 숫자를 뒷받침했지 여러분의 숫자를 뒷받침하지 않습니다.
실제 숫자를 화면에 표시하는 경우 sampleContent: sourced로 설정하고
sources: 항목에 URL과 그것이 뒷받침하는 정확한 주장을 추가하세요.
소싱된 숫자는 실제로 표시될 때만 소싱된 것입니다. 카운터를 인용된 수치로
애니메이션하는 경우 claim: "final"로 표시하고 endSec까지 단위 및
"정확히"와 같은 단어를 화면에 표시하지 마세요. 그때까지는 "계산 중…"을 표시하세요.
카운트 중에 보이는 다른 모든 요소는 neutralWhileCounting: true가 필요합니다.
kw check는 그렇지 않으면 포맷을 거부합니다. 중간 값이 정직하게 사실인
카운터("지금까지의 프레임")는 claim: "running"으로 표시되며 면제됩니다.
소스로 간주되는 것: 독자가 열고 숫자를 확인할 수 있는 것 –
원본 논문 또는 영구 기록(DOI, PubMed), 표준 기관,
통계 기관, 공식 보고서. 목록 기사, 요약 블로그 또는
자신의 기억은 안 됩니다. 화면을 위해 수행한 반올림을
claim 필드에 명시하세요. kw check는 URL과 주장이 존재하는지 확인합니다.
진실인지 확인할 수는 없습니다. 따라서 그 부분은 여러분의 책임입니다.
소스를 찾을 수 없으면 대신 필러(filler) 사본을 사용하세요 – 발명된 통계는
발명된 리텐션 수치와 동일한 실패입니다.
전체 format.json 참조는 references/spec.md를 참조하세요.
3. A/B 테스트 실행
두 가지 포맷, 동일한 콘텐츠, 동일한 날짜:
npx kw new test-a --from=cold-open-line
npx kw new test-b --from=redacted-reveal
# 두 data 블록에 동일한 사본을 넣으세요
npx kw render test-a && npx kw render test-b
npx kw variant test-a # 이 문자열을 업로드에 대해 기록하세요
out/<slug>/variant.json의 variantId는 결과를 귀속시킬 수 있게 하는 것입니다.
게시된 비디오에 대해 업로드 시점에 기록하세요. 또한 메모를 잃어버린 경우를 대비해
MP4의 메타데이터 주석에도 기록됩니다.
4. 측정값 다시 읽기
# YouTube Studio / TikTok 분석에서 CSV를 measure/inbox/로 내보내기
npx kw measure # 수집 + 보고 -> measure/report.md
npx kw measure apply # 결과를 formats/*/data.yml에 쓰기
npx kw gallery # 갤러리 다시 렌더링 + 재구축
API, OAuth 없음. 정확한 내보내기 단계와
mapping.csv 형식은 references/measuring.md를 참조하세요.
결정론이 계약입니다
동일한 format.json은 모든 머신에서 영원히 동일한 프레임을 생성합니다.
이를 통해 리텐션 곡선이 렌더링이 아닌 포맷에 귀속될 수 있습니다.
엔진을 편집할 때 구성에 Date.now(), Math.random(),
requestAnimationFrame, CSS 전환 또는 CSS 애니메이션을 도입하지 마세요.
npx kw render <slug> --check-determinism은 프레임을 순서 없이 다시 찾고
픽셀이 하나라도 움직이면 실패합니다.
절대 혼합해서는 안 되는 두 가지 측정
data.yml에는 두 개의 블록이 있으며, 서로 다른 질문에 답합니다:
| 블록 | 질문 | 라이브러리 순위? |
|---|---|---|
format | 이 장면 구조의 성능은 어떻습니까? | 예 |
content_axis | 이 주제의 성능은 어떻습니까? | 아니요 |
단일 게시된 비디오는 두 레이블을 모두 가지고 있습니다. 그것은 카운트다운이고 신체에 관한 것입니다. 두 가지를 평균화하면 어느 질문에도 답하지 못하는 숫자가 생성되므로 별도로 저장되고, 별도로 보고되며, 갤러리에서 다른 색상으로 표시됩니다.
결과를 보고할 때 어떤 것인지 말하세요:
- "
countdown-clock리텐션 62% (n=6)" – 포맷 주장. - "개인/신체 주제 리텐션 68% (n=9)" – 축 주장.
- "개인/신체 카운트다운 리텐션 68%" – 둘 다 아님, 몇 개의 비디오, 어떤 포맷인지, 그리고 둘이 혼동된다고 말하지 않는 한.
measure/report.md는 모든 축에 대해 수행한 열을 출력합니다.
축이 하나의 포맷에 의해서만 수행된 경우, 해당 축 결과와 해당 포맷 결과는
두 개의 레이블을 가진 동일한 비디오입니다. 두 개의 독립적인 발견으로 제시하지 말고
그렇게 말하세요.
콘텐츠 축은 data/content-axes.yml에 선언되며
measure/mapping.csv의 선택적 content_axis 열을 통해 비디오에 연결됩니다.
이는 라이브러리의 축이 아니라 사용자 자신의 축입니다. 그들이 실제로 테스트하는
구분을 추가하세요.
**variant_id: not-in-library**는 이 저장소에 없는 포맷의 게시된 비디오를 표시합니다.
콘텐츠 축 샘플만 해당합니다. 포맷 보드나 data.yml에 도달하지 않으며,
carried by는 격차를 볼 수 있도록 이름을 지정합니다. 저장소 수준의 축 결과는
data/content-axis-results.yml에 있습니다. 이것이 모든 포맷이 여전히
n = 0인 동안 축을 측정할 수 있는 이유입니다. 그러한 포맷이 무엇인지 추측하지 마세요.
레이블은 의도적으로 그것에 대해 아무 말도 하지 않습니다.
정직성 규칙
이것들은 스타일 선호 사항이 아닙니다. 이 규칙을 어기면 저장소는 가치가 없습니다.
n: 0은 테스트되지 않음을 의미합니다. "유망함" 또는 "가능성 있음"으로 반올림하지 마세요.- n<5는 방향일 뿐, 결과가 아닙니다. 어떤 것을 제공하는지 말하세요.
- 성과가 낮은 포맷은 숫자와 함께 목록에 남습니다. 조용히 제거하지 마세요.
- 절대
data.yml을 직접 작성하지 마세요.kw measure apply만 작성합니다. 기억에서 입력한 숫자는 발명된 숫자와 구별할 수 없습니다. - 절대 포맷 숫자와 축 숫자를 병합하지 마세요. 위의 표를 참조하세요.
- 화면의 모든 숫자에는 출처가 필요합니다. 생성하는 클립은
sampleContent: sourced(URL 포함) 또는placeholder(명백한 필러 포함) 중 하나여야 합니다. 데모를 위해 그럴듯한 통계를 발명하는 것은 리텐션 수치를 발명하는 것과 동일한 실패입니다. - 시드 데이터는 한 크리에이터의 채널입니다. 플랫폼의 법칙이 아니라 시작점입니다. 구분이 중요할 때 누구의 샘플인지 말하세요.
참조 파일
references/spec.md–format.json요소 및 애니메이션 참조references/formats.md– 포맷 라이브러리, 제품군별, 가설 포함references/measuring.md– CSV 내보내기, 매핑 및 보고 루프references/authoring.md– 측정할 가치가 있는 새 포맷 작성