Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,13 @@ pipeline/hspc-velocity-benchmark/cross_dataset/BMMC_FAILED

# 블로그 정리 초안(구글드라이브/JIRA용, 로컬 md 유지) — 2026-07-04
blog_HSPC_velocity_lag.md
# blog/ 폴더 전체(canonical=/workspace/blog + 구글드라이브, 생성물 00_*_blog_all.md·심링크 build_index.py 포함) — 로컬 유지
blog/
# blog/ — 2026-09-02 정본 이전. 서버 /workspace/blog 가 GPU 반납으로 사라져
# 정정본이 로컬 백업 한 곳에만 남는 상태가 됐다(BIOP01-83). 블로그는 이미
# Confluence 로 공개된 글이므로 이 저장소를 정본으로 삼아 이력·게이트를 붙인다.
# 생성물과 낡은 내부 공지만 제외한다.
blog/site/
blog/SHARE_안내.txt
blog/**/build_index.py

# 세션 잡동사니(백업·jupyter collab db·인증 qr) — 커밋 대상 아님
.jupyter_ystore.db
Expand Down
2,041 changes: 2,041 additions & 0 deletions blog/00_all.md

Large diffs are not rendered by default.

288 changes: 288 additions & 0 deletions blog/01_lag-vs-alpha.md

Large diffs are not rendered by default.

247 changes: 247 additions & 0 deletions blog/02_five-checks.md

Large diffs are not rendered by default.

209 changes: 209 additions & 0 deletions blog/03_cross-dataset-replication.md

Large diffs are not rendered by default.

191 changes: 191 additions & 0 deletions blog/04_reproducible-harness.md

Large diffs are not rendered by default.

199 changes: 199 additions & 0 deletions blog/05_novelty-positioning.md

Large diffs are not rendered by default.

228 changes: 228 additions & 0 deletions blog/06_self-adversarial-hardening.md

Large diffs are not rendered by default.

244 changes: 244 additions & 0 deletions blog/07_curvature-predicts-trust.md

Large diffs are not rendered by default.

407 changes: 407 additions & 0 deletions blog/08_no-rule-for-direction.md

Large diffs are not rendered by default.

52 changes: 52 additions & 0 deletions blog/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# BIOP01 연구 블로그 — 정본

HSPC velocity-lag 벤치마크 연구(크로마틴에서 전사로 가는 시간차와 전사 속도)를 비전공자도 읽을 수 있게 산문으로 정리한 글이다. 영문과 국문을 한 파일에 함께 둔다.

## 이 폴더가 정본이다 (2026-09-02 이전)

원래 정본은 협업 서버 `/workspace/blog/BIOP01/`이었고 이 저장소는 `blog/` 전체를 `.gitignore`로 제외했다. GPU 서버를 반납하면서 그 경로가 사라졌고, 정정본이 개인 백업 한 곳에만 남는 상태가 됐다. 그래서 이 저장소로 정본을 옮겼다. 경위는 JIRA BIOP01-83에 있다.

블로그는 이미 Confluence로 공개된 글이므로 저장소에 두어도 새로 노출되는 것이 없다. 오히려 이력과 검수 게이트가 함께 붙는다.

## 파일

| 파일 | 내용 |
|---|---|
| `01_lag-vs-alpha.md` | 크로마틴이 전사를 미리 준비시킬까 |
| `02_five-checks.md` | 재현되지 않는 결과를 스스로 검증하기 |
| `03_cross-dataset-replication.md` | 조직과 종을 바꿔 본 재현 |
| `04_reproducible-harness.md` | 분석을 하네스로 옮기기 |
| `05_novelty-positioning.md` | 선행연구와 논문의 자리매김 |
| `06_self-adversarial-hardening.md` | 우리 결과를 스스로 공격한 세 가지 분석 |
| `07_curvature-predicts-trust.md` | 헤드라인이 될 뻔한 발견을 스스로 되돌린 이야기 |
| `08_no-rule-for-direction.md` | 크로마틴 방향 규칙을 찾다가 세 번 실패한 이야기 |
| `00_all.md` | 위 여덟 편을 순서대로 결합한 합본. **파생물이므로 개별 편을 고친 뒤 다시 만든다** |
| `make_all.py` | 합본 재생성 스크립트. `python3 blog/make_all.py`, 검사만 하려면 `--check` |
| `glossary.md` | 용어집 |

## 게시 경로

Confluence VC 스페이스가 공개본이다. 인덱스는 page 49545229이고 여덟 편이 그 자식 페이지로 붙어 있다.

정정이 생기면 본문 전체를 갈아 끼우지 않고 **상단에 정정 배너를 붙인다**. 서식 손상 위험이 적고 오독 위험은 즉시 닫힌다. 배너 원문은 `docs/confluence_banners/blog0N_banner.html`에 두고, 적용은 아래로 한다.

```
source ~/.atlassian_env
python3 scripts/confluence_prepend_banner.py <pageId> docs/confluence_banners/blog0N_banner.html \
--marker "정정 안내 (YYYY-MM-DD 게시본 갱신)" --dry
```

마커 텍스트가 이미 본문에 있으면 중복 삽입을 거부한다. 날짜가 다른 배너를 새로 붙일 때는 `--marker`로 그 배너의 문구를 넘긴다.

## 규율

- **수치와 주장은 연구 결과 원본에서만 가져온다.** 정본은 `pipeline/hspc-velocity-benchmark/results/FINDINGS.md`와 `manuscript/draft_v2.md`이며, 블로그는 그 산문 판이다.
- **원고에서 철회하거나 강등한 주장은 블로그에도 반영한다.** 2026년 8월에 이 동기화가 한 번 누락돼 철회된 주장이 공개본에 남아 있었다(BIOP01-83). 원고를 고치면 블로그도 같은 세션에서 본다.
- **영문과 국문을 함께 고친다.** 한쪽만 고치면 같은 페이지 안에서 서술이 어긋난다. 실제로 8편에서 한국어 표의 두 행이 빠져 기전 설명이 영문과 반대로 적힌 적이 있다.
- `00_all.md`를 직접 고치지 않는다. 개별 편을 고치고 `python3 blog/make_all.py`로 다시 만든다.
손으로 붙이던 때에는 개별 편을 고쳐도 합본이 따라오지 않아 7월 말 판이 한동안 남아 있었다.

## 아직 남은 것

- `site/` 브라우저판은 **다시 만들지 않는다**(2026-09-24 결정). 서버와 함께 사라졌고, 저장소에서 가리키는 곳이 한 군데도 없으며, `.gitignore`가 생성물로 제외하고 있다. 공개본은 Confluence이고 전체를 한 번에 건네야 할 때는 `00_all.md`로 충분하다. 두 벌을 유지하면 정정이 한쪽에만 들어가는 일이 또 생긴다.
- 04편 본문이 개념도 위치를 `/workspace/skills/harness-concept/`로 가리키는데, 그 경로도 서버와 함께 없어졌다. 대체 위치를 정한 뒤 문구를 고쳐야 한다.
33 changes: 33 additions & 0 deletions blog/glossary.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# BIOP01 블로그 용어집 — 한 용어 = 한 표현

> `/blog` 스킬의 초심자 재작성이 따르는 프로젝트 용어집(규율은 `~/.claude/assets/blog/beginner-natural-writing.md` 3절).
> 시리즈 전편에서 **같은 전문용어는 같은 초심자 표현**으로 옮긴다. 새 글·재작성은 이 표를 기준으로 삼는다.
> 2026-07 BIOP01 14편 재작성에서 확정.

| 원어/전문용어 | 초심자용 표현 | 비유(선택) |
|---|---|---|
| 분화 (differentiation) | 세포가 한 종류에서 다른 종류로 바뀌는 것 | |
| 크로마틴 접근성 / ATAC / 크로마틴 열림 | (유전자 주변) DNA가 열림 / 열려 있음 | 서가의 자물쇠를 푸는 일 |
| 전사 (transcription) / 유전자 발현 | 유전자가 켜져서 (RNA·단백질을) 찍어 냄 | 책을 펴서 읽는 일 |
| lag | 시간차(lag) — DNA가 열리고 나서 유전자가 켜지기까지 걸리는 시간. 첫 등장만 병기, 이후 "시간차" | |
| 전사율 α | 전사 속도(α) — 유전자가 켜졌을 때 얼마나 빠르게 찍어 내는지. 이후 "전사 속도" | |
| method (velocity method) | 계산 프로그램 / 방법 (이름은 유지: "MultiVelo라는 프로그램") | |
| robust / method-robust | 방법(프로그램)을 바꿔도 흔들리지 않는 / 튼튼한 | |
| cross-method | 프로그램(방법)을 바꿔 견줄 때 | |
| concordance / 일치도 / correlation ρ | (프로그램끼리) 답이 맞는 정도 = 일치도 (숫자 ρ는 그대로 표기) | |
| pseudotime | 분화가 얼마나 진행됐는지의 순서(실제 시계 시간 아님) — 첫 등장 시 한 번 풀이 | |
| 재현 (replication) | 다른 데이터에서도 같은 무늬가 나오는지 확인하는 일 ("가까운/먼 재현" = 조직·종의 거리) | |
| gate / preflight | 관문 (무거운 작업 전 값싼 확인으로 될지 안 될지 먼저 가르기) | |
| 음성 대조군 (negative control) / scrambled | DNA와 유전자의 연결을 일부러 끊어(뒤섞어) 결과가 무너지는지 보는 시험 | |
| permutation FDR / 다중검정 | 유전자가 수천 개라 우연히 맞아 보일 수 있어, 라벨을 마구 섞은 "가짜 데이터"와 견줘 우연을 걷어내는 통계 | |
| 동전 던지기 수준 | 방향이 우연 수준(~50/50)이라 의미 없음 | |
| bootstrap | 같은 세포를 복원추출로 다시 뽑아 값이 얼마나 흔들리는지 보는 안정성 시험 | |
| 후성유전 약물 (HDAC/DNMT/EZH2 억제제) | DNA 서열 자체가 아니라 그 열림/닫힘 상태를 건드리는 약 | |
| confound / 교란변수 (cell cycle 등) | 진짜 원인이 아닌데 결과에 끼어드는 딴 요인 (예: 세포 분열 주기) | |

## 보존 주의 (이 프로젝트의 hedge — 절대 격상 금지)

- "시간차(lag)는 **계산 프로그램을 바꾸면** 재현되지 않는다(cross-method 비robust)" ≠ "시간차가 무의미하다" ≠ "MultiVelo가 틀렸다".
- 단일 파이프라인 *안에서는* 시간차에 신호가 있다(bootstrap 안정성 등)를 지우지 않는다.
- 유전자 유형 **M1/M2**(kinetic class)는 계산 프로그램(method)이 아니다 — "프로그램"으로 옮기지 말 것.
- robust(방법 바꿔도 안 흔들림) ≠ 유용을 한 문장에 섞지 않는다. 상관을 인과로 올리지 않는다.
51 changes: 51 additions & 0 deletions blog/make_all.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#!/usr/bin/env python3
"""00_all.md 재생성 — 개별 편 01~08을 순서대로 결합한다.

README 규율: `00_all.md` 는 파생물이다. 직접 고치지 말고 개별 편을 고친 뒤 이 스크립트를 돌린다.

2026-09-24 신설. 그전에는 손으로 붙였고, 그래서 개별 편을 고쳐도 합본이 따라오지 않는 일이
있었다(7/27에 멈춰 있던 사례, BIOP01-83). 결합 규칙은 당시 산출물에서 역설계해
바이트 단위로 재현되는 것을 확인한 뒤 고정했다.

실행: python3 blog/make_all.py [--check]
--check 파일을 쓰지 않고 현재 00_all.md 와 일치하는지만 본다(종료코드 1 이면 불일치).
"""
import glob
import io
import os
import sys

HERE = os.path.dirname(os.path.abspath(__file__))
OUT = os.path.join(HERE, "00_all.md")
SEP = "\n\n---\n\n"
HEADER = (
"# BIOP01 개발 블로그 — 전체 합본\n"
"\n"
"> 생성 2026-09-02. 개별 편 `01`~`08`을 순서대로 결합한 파일이다.\n"
"> 정본은 각 개별 편이며, 이 합본은 파생물이다. 개별 편을 고치면 이 파일을 다시 만든다.\n"
"\n---\n\n"
)


def build():
parts = sorted(glob.glob(os.path.join(HERE, "0[1-8]_*.md")))
if len(parts) != 8:
sys.exit(f"개별 편이 8개가 아니다: {len(parts)}개 — {[os.path.basename(p) for p in parts]}")
bodies = [io.open(p, encoding="utf-8").read().strip() for p in parts]
return HEADER + SEP.join(bodies) + "\n", parts


def main():
text, parts = build()
if "--check" in sys.argv:
cur = io.open(OUT, encoding="utf-8").read()
if cur == text:
print(f"일치 — {len(text):,}자, 개별 {len(parts)}편")
return
sys.exit(f"불일치 — 현재 {len(cur):,}자 대 재생성 {len(text):,}자. 합본을 다시 만들 것.")
io.open(OUT, "w", encoding="utf-8").write(text)
print(f"wrote {OUT} {len(text):,}자 (개별 {len(parts)}편)")


if __name__ == "__main__":
main()
Loading