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,033 changes: 2,033 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.

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

Large diffs are not rendered by default.

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

Large diffs are not rendered by default.

50 changes: 50 additions & 0 deletions blog/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# 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` | 위 여덟 편을 순서대로 결합한 합본. **파생물이므로 개별 편을 고친 뒤 다시 만든다** |
| `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`를 직접 고치지 않는다. 개별 편을 고치고 다시 만든다.

## 아직 남은 것

- `site/` 브라우저판이 서버와 함께 사라졌다. 필요하면 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(방법 바꿔도 안 흔들림) ≠ 유용을 한 문장에 섞지 않는다. 상관을 인과로 올리지 않는다.
14 changes: 14 additions & 0 deletions docs/confluence_banners/blog07_banner.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<ac:structured-macro ac:name="warning"><ac:rich-text-body>
<p><strong>정정 안내 (2026-09-02 게시본 갱신)</strong></p>
<p>이 글은 2026년 7월에 쓰였고, 그 뒤 원고에서 <strong>주장 하나가 철회</strong>되었습니다. 아래 본문에는 아직 옛 서술이 남아 있으므로 이 안내를 먼저 읽어 주십시오. 지적해 주신 분은 박세진 님이고, 추적은 JIRA BIOP01-83입니다.</p>
<p><strong>철회 &mdash; "크로마틴이 전사 속도 &alpha;를 조절하는 유전자 지도"</strong></p>
<p>본문 "이게 따로 논문이 될 수 있을까" 절에 이 표현이 나오는데, <strong>크로마틴에 공을 돌린 부분이 철회되었습니다.</strong> 처리 전 크로마틴이 &alpha;를 예측한다던 초기 결과(학습에 쓰지 않은 계통에서 &rho;=+0.309)는 <strong>발현량 교란</strong>으로 판명되었습니다. 발현량만으로 맞추면 &rho;=+0.724가 나오고, 거기에 크로마틴을 더해도 성능은 &minus;0.016만큼 오히려 줄며, 발현량을 통제하면 크로마틴 몫은 &rho;=+0.112만 남습니다. 사람 뇌 데이터에서는 +0.212에서 +0.013으로 아예 사라졌습니다. 원고는 이 표현을 지우고 <strong>"기저 상태에서 &alpha;로"(baseline-to-&alpha;)</strong>로 바꾸었습니다.</p>
<p><strong>함께 정정된 것</strong></p>
<ul>
<li><strong>별도 논문이 무산된 이유</strong> &mdash; 본문은 원인을 시간 눈금 불일치 하나로만 적었습니다. 그보다 먼저 <strong>크로마틴에서 &alpha;로 가는 링크 자체가 발현량 교란으로 무너진 것</strong>이 더 근본적인 이유였고, 그 사실이 빠져 있었습니다. 자기비판을 다루는 글에서 철회 사실이 오히려 가려진 모양이 되었습니다.</li>
<li><strong>&alpha;를 헤드라인으로 세울 때의 단서</strong> &mdash; "&alpha;는 재현되고 외부 검증도 되는 유일한 값"이라는 문장에 기준선이 빠져 있었습니다. &alpha;가 실측 합성 속도와 맞는 정도(&rho;=+0.262)는 <strong>그냥 발현량으로 맞춘 것(&rho;=+0.410)보다 오히려 낮습니다.</strong> 그래서 결론은 "&alpha;를 믿어라"가 아니라 "발현량 기준선과 견주어 &alpha;를 믿어라"이며, 지금까지의 근거로는 &alpha;가 발현량 이상의 정보를 준다고 말할 수 없습니다.</li>
<li><strong>외부 검증이 한 소스에 걸려 있다는 점</strong> &mdash; 본문이 "TT-seq 등"이라 적어 복수 소스가 받치는 인상을 주는데, 실제로는 <strong>Todorovski 한 소스</strong>입니다. 두 번째 소스(Schwalb)에서는 세 방법 모두 무신호였고, 두 실측 소스끼리도 &rho;&asymp;0.15 정도로만 맞습니다. 잣대 자체의 재현성이 상한입니다.</li>
<li><strong>표지 유전자 방향 일치의 크기</strong> &mdash; "이름난 유전자에서 방향이 얼추 맞는다"는 서술에 크기가 없었습니다. 그 "얼추"는 동전 던지기보다 54.6%(유전자 560개, p=0.031) 정도로만 앞서고, 크기로는 대부분 |&rho;|&le;0.08입니다. 통계로는 잡히지만 실질적으로는 무시할 만한 일치입니다.</li>
</ul>
<p><strong>정본은 저장소 원본입니다.</strong> 이 페이지 본문 전체 교체는 순차 진행 중이며, 그 전까지 정본은 개별 편 원본 <code>07_curvature-predicts-trust.md</code>입니다. 전체 합본(<code>00_all.md</code>)도 2026-09-02에 정정본으로 다시 만들었습니다.</p>
</ac:rich-text-body></ac:structured-macro>
16 changes: 16 additions & 0 deletions docs/confluence_banners/blog08_banner.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<ac:structured-macro ac:name="warning"><ac:rich-text-body>
<p><strong>정정 안내 (2026-09-02 게시본 갱신)</strong></p>
<p>이 글은 2026년 7월에 쓰였고, 그 뒤 <strong>한국어판에서 기전 설명이 잘못된 것</strong>과 <strong>근거가 과하게 적힌 대목</strong>이 발견되었습니다. 아래 본문에는 아직 옛 서술이 남아 있으므로 이 안내를 먼저 읽어 주십시오. 지적해 주신 분은 박세진 님이고, 추적은 JIRA BIOP01-83입니다.</p>
<p><strong>정정 &mdash; 한국어판 뚜렷함 표에서 두 줄이 빠져 설명이 뒤집혀 있었습니다</strong></p>
<p>같은 페이지 영문판 표에는 네 줄이 있는데 한국어판 표에는 <strong>&alpha;와 &gamma; 두 줄만</strong> 있었습니다. 그 결과 한국어 본문이 크로마틴 여는 속도 &alpha;_c를 "평평하다, 흐릿하다"라고 서술했는데, <strong>사실과 반대이며 같은 페이지 영문 수치와도 모순됩니다.</strong> 정확한 표는 아래와 같습니다.</p>
<p><code>&alpha; 전사 속도 +7.98 (가장 뚜렷) / &alpha;_c 크로마틴 여는 속도 +7.32 / &beta; 처리 속도 +4.86 / &gamma; 분해 속도 +1.72 (가장 흐릿)</code></p>
<p>&alpha;_c는 흐릿한 값이 아닙니다. <strong>한 번의 맞춤 안에서는 뚜렷하게 정해지지만(+7.32), 프로그램을 바꾸면 순위 상관이 &rho;=0.29밖에 안 됩니다.</strong> 프로그램마다 또렷하지만 서로 다른 값에 안착하는 것입니다. 시간차는 그렇게 정해진 전환 시점들의 차이이고, 한쪽은 데이터가 느슨하게 두고 다른 쪽은 프로그램에 따라 흔들리니 그 차이에는 잡음만 남습니다. 영문판 서술이 정본에 맞고, 한국어판을 그쪽에 맞추었습니다.</p>
<p><strong>함께 정정된 것</strong></p>
<ul>
<li><strong>표지 유전자 근거를 뒤에서 되살린 대목</strong> &mdash; 본문이 "원 방법들이 예시로 보인 그림은 우리 데이터에서도 성립한다"고 단정했습니다. 같은 글 다른 절에서 marker-shuffle 음성(Mann&ndash;Whitney p=0.58)을 정확히 적어 놓고, 여기서는 단서 없이 썼습니다. <strong>상관 수준에서 재현될 뿐이고, 이 표지 집합은 무작위 집합과 구별되지 않았습니다.</strong> 그래서 이 일치를 방향의 정답으로 쓸 수 없습니다. 시도 1의 "알려진 골수 분화 생물학과도 맞는다"도 "어긋나지는 않는다"로 낮췄습니다.</li>
<li><strong>선점 주장</strong> &mdash; "그 수준에서 신뢰성이 검정된 적은 없었다"는 무제한 현재완료였습니다. <strong>그 수준의 식별성 문제는 ConsensusVelo가 먼저 제기했고, 우리 결과는 그 지적을 multiome 세팅에서 확인하는 쪽입니다.</strong> 원 방법들이 나오던 당시에 견줘 볼 독립 프로그램이 없었다는 것은 그대로 유효합니다.</li>
<li><strong>54.6%의 유의성 표기</strong> &mdash; 표에 비율만 있고 검정 결과가 없었습니다. 이항검정으로는 우연을 넘어서지만(유전자 560개, p=0.031), 초과분 4.6퍼센트포인트는 실용적으로 무시할 만합니다. 통계적으로 잡힌다고 해서 실행 규칙이 되지는 않는다는 이 글의 결론과 같은 이야기입니다.</li>
</ul>
<p><strong>잘 된 점도 함께 적어 둡니다.</strong> 이 글은 앞 편들이 범한 잘못을 대부분 피했습니다. "유전자 598개 중 0개 일치"를 아예 쓰지 않았고, 원조 MultiVelo를 부호 검정에서 제외한 근거와 marker-shuffle 음성을 자기 결과의 제약으로 명시했습니다.</p>
<p><strong>정본은 저장소 원본입니다.</strong> 이 페이지 본문 전체 교체는 순차 진행 중이며, 그 전까지 정본은 개별 편 원본 <code>08_no-rule-for-direction.md</code>입니다. 전체 합본(<code>00_all.md</code>)도 2026-09-02에 정정본으로 다시 만들었습니다.</p>
</ac:rich-text-body></ac:structured-macro>
11 changes: 10 additions & 1 deletion scripts/confluence_prepend_banner.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,11 @@ def req(method, path, body=None):
data = json.dumps(body).encode() if body else None
r = urllib.request.Request(url, data=data, method=method)
import base64
tok = base64.b64encode(f"{os.environ['ATLASSIAN_EMAIL']}:{os.environ['ATLASSIAN_API_TOKEN']}".encode()).decode()
# 토큰 변수명이 환경마다 갈린다(ATLASSIAN_API_TOKEN / ATLASSIAN_TOKEN). 둘 다 받는다.
_tok_raw = os.environ.get("ATLASSIAN_API_TOKEN") or os.environ.get("ATLASSIAN_TOKEN")
if not _tok_raw:
sys.exit("ATLASSIAN_API_TOKEN 또는 ATLASSIAN_TOKEN 이 필요합니다. `source ~/.atlassian_env` 확인.")
tok = base64.b64encode(f"{os.environ['ATLASSIAN_EMAIL']}:{_tok_raw}".encode()).decode()
r.add_header("Authorization", "Basic " + tok)
r.add_header("Content-Type", "application/json")
r.add_header("User-Agent", "kkkim-cli")
Expand All @@ -44,6 +48,11 @@ def req(method, path, body=None):
banner = open(sys.argv[2], encoding="utf-8").read().strip()
dry = "--dry" in sys.argv

# 배너를 여러 차례(다른 날짜로) 붙일 수 있으므로 마커를 인자로 덮어쓸 수 있게 한다.
# 지정하지 않으면 기존 2026-08-14 마커를 그대로 쓴다(하위호환).
if "--marker" in sys.argv:
MARKER = sys.argv[sys.argv.index("--marker") + 1]

cur = req("GET", f"/wiki/rest/api/content/{pid}?expand=body.storage,version,space")
body = cur["body"]["storage"]["value"]
ver = cur["version"]["number"]
Expand Down
Loading