From 239c240b9c41133deef430ceb9180ff435fa0c83 Mon Sep 17 00:00:00 2001 From: Jinsoo Shin <59598545+jsshin2022@users.noreply.github.com> Date: Sun, 1 Nov 2026 20:59:18 +0900 Subject: [PATCH] =?UTF-8?q?polish:=20=EC=B0=B8=EC=97=AC=EC=9E=90=20?= =?UTF-8?q?=EA=B4=80=EC=A0=90=20=EC=A0=95=EB=A6=AC=20=E2=80=94=20=EC=B0=B8?= =?UTF-8?q?=EC=97=AC=20=ED=99=94=EB=A9=B4=20=EA=B8=B8=EC=9E=A1=EC=9D=B4,?= =?UTF-8?q?=20=EC=A7=84=ED=96=89=20=EB=8B=A8=EA=B3=84=20=EB=B0=94=EB=A1=9C?= =?UTF-8?q?=EC=9E=A1=EA=B8=B0,=20=EB=AC=B8=EC=84=9C=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 참여 화면 - '내 분석이 사이트에 올라가기까지' 6단계 길잡이(작업 제안 → 계획 → 수집 → 분석 → 해석 → 재현받기) - 프로젝트 찾기(내 GitHub ID·정책 이름), ?me= 로 내 카드만 보기 - 결과가 아직 없는 프로젝트는 '다음 할 일'을 펼쳐 둠, 썸네일은 추세 그림 우선 - 진행 단계 바로잡기: 자체 report.md 도 '분석'으로 보고, 분석 없이 '해석'만 켜지지 않게. 공통 make flow 가 없는 케이스에는 '결과 보기'(없는 페이지) 대신 make flow 로 옮기라는 할 일을 표시 문서·템플릿 - 1기(9.7~11.1)가 끝나 '멘티' → '참여자', 참여 가이드에 '지금부터 참여하기'와 1기 일정(지난 기록) - 판정 이름 '조건부' → '크기를 판별하지 못함', 낡은 개수(주제 8개·데이터 40개) 제거 - 케이스 템플릿·PR 템플릿에 projects.yaml 등록과 make readme - README 프로젝트 표 갱신(강남대로 버스 포함) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01EMnmZPBD5PQJW1UQAARN7q --- .github/CODEOWNERS | 2 +- .github/ISSUE_TEMPLATE/site-question.yml | 2 +- .github/PULL_REQUEST_TEMPLATE.md | 1 + CONTRIBUTING.md | 6 +-- README.md | 5 ++- apps/_template/README.md | 2 +- cases/_template/README.md | 5 ++- catalog/README.md | 6 +-- docs/ops/github-onboarding.md | 2 +- docs/ops/mentee-guide.md | 25 ++++++++--- docs/ops/monitoring.md | 6 +-- docs/ops/roadmap.md | 4 +- docs/strategy/korea-cases.md | 4 +- docs/strategy/plan-guide.md | 2 +- docs/strategy/topic-guide.md | 2 +- docs/tracks/README.md | 2 +- docs/tracks/analysis.md | 4 +- docs/tracks/ontology.md | 2 +- docs/tracks/service.md | 2 +- site/architecture.py | 8 ++-- site/ask.js | 2 +- site/build.py | 6 +-- site/projects.py | 55 ++++++++++++++++-------- site/quality.py | 2 + site/style.css | 11 +++++ 25 files changed, 110 insertions(+), 58 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 19d0ef83..501ea242 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,5 +1,5 @@ # 코드 소유자: PR이 열리면 아래 사람에게 자동으로 리뷰 요청이 갑니다 (필수 승인은 아님). -# 멘티 폴더(cases/-<주제>/)는 운영진이 첫 계획 PR을 합칠 때 한 줄씩 추가합니다. +# 참여자 폴더(cases/-<주제>/)는 운영진이 첫 계획 PR을 합칠 때 한 줄씩 추가합니다. # 예) /cases/gildong-*/ @gildong * @jsshin2022 diff --git a/.github/ISSUE_TEMPLATE/site-question.yml b/.github/ISSUE_TEMPLATE/site-question.yml index e9571c23..eb4f7d62 100644 --- a/.github/ISSUE_TEMPLATE/site-question.yml +++ b/.github/ISSUE_TEMPLATE/site-question.yml @@ -7,7 +7,7 @@ body: attributes: value: | 사이트 대화창에서 정리한 질문입니다. 올려 주신 질문은 **요즘 궁금해하는 주제 순위**에 반영되고, - 멘토·멘티가 검토해 새 주제·데이터·분석으로 이어집니다. 개인정보나 API 키는 적지 마세요. + 메인테이너·참여자가 검토해 새 주제·데이터·분석으로 이어집니다. 개인정보나 API 키는 적지 마세요. - type: textarea id: question attributes: diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 67a92ad6..384dfb28 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -8,6 +8,7 @@ - [ ] `plan.yaml`을 **결과를 보기 전에** 작성·커밋했습니다 (이후 변경 시 이유를 커밋 메시지와 `discussion.md > 계획에서 바뀐 것`에 기록) - [ ] 새 분석이면 **계획만 담은 PR을 먼저** 올렸습니다 (사이트 답 페이지에 '계획 먼저 커밋'으로 표시됩니다) - [ ] 결과 PR이면 `discussion.md > 결과를 한 문장으로`를 채웠습니다 (사이트 첫 줄에 그대로 나옵니다) +- [ ] 새 케이스면 `catalog/projects.yaml`에 한 줄, 결과·단계가 바뀌었으면 `make readme`로 README 표를 갱신했습니다 - [ ] 데이터 출처와 **라이선스**(공공누리 유형 등)를 `plan.yaml > data_sources`에 명시했습니다 - [ ] API 키·`.env`·개인정보가 담긴 원자료·재배포 불가 데이터를 포함하지 않았습니다 - [ ] 그림/수치는 `fetch.py` → `make flow` 실행으로 **재현** 가능합니다 (해석은 `discussion.md`) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 15de4597..53a3f64e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # 기여 가이드 -GitHub가 처음이라면 [GitHub 따라 하기](docs/ops/github-onboarding.md)부터 보세요. 전체 흐름은 [멘티 참여 가이드](docs/ops/mentee-guide.md)에 있습니다. +GitHub가 처음이라면 [GitHub 따라 하기](docs/ops/github-onboarding.md)부터 보세요. 전체 흐름은 [참여 가이드](docs/ops/mentee-guide.md)에 있습니다. ## 1. 한 사람, 한 작업 공간, 한 브랜치 @@ -20,7 +20,7 @@ GitHub가 처음이라면 [GitHub 따라 하기](docs/ops/github-onboarding.md) | `cases/<내ID>-<주제>/` | 폴더 주인 | 자유롭게. 남의 폴더는 고치지 않습니다 | | `apps/<내ID>-<서비스>/` | 폴더 주인 | 정적 파일만, API 키 금지. `app.yaml` 필수 | | `catalog/` | 누구나 | 새 데이터셋·이슈·주제 제안. 원본 페이지에서 확인한 값만 적습니다 | -| `core/`, `site/` | 멘토·메인테이너 | 먼저 이슈로 논의한 뒤 PR. 테스트 필수 | +| `core/`, `site/` | 메인테이너 | 먼저 이슈로 논의한 뒤 PR. 테스트 필수 | | `.github/`, `docs/` | 운영진 | 개선 제안은 이슈로 | ## 3. 커밋 메시지 @@ -37,7 +37,7 @@ GitHub가 처음이라면 [GitHub 따라 하기](docs/ops/github-onboarding.md) 1. 최신 `main`에서 브랜치를 만들고 작업한 뒤 `make check`로 검사합니다. 2. PR을 올리고 템플릿 체크리스트를 채웁니다. 작업 중이면 Draft PR로 일찍 올리세요. -3. 멘토 또는 다른 멘티 1명 승인 + 자동 검사 통과 뒤 **Squash merge**로 합칩니다. +3. 메인테이너 또는 다른 참여자 1명 승인 + 자동 검사 통과 뒤 **Squash merge**로 합칩니다. 4. 합친 뒤에는 브랜치를 지우고 `git switch main && git pull`. ## 5. 분석 원칙 (리뷰에서 확인합니다) diff --git a/README.md b/README.md index e0cfc6ba..0abe4e6f 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ ## 지금까지 만든 것 -**주제 10개 · 지금 이슈 7개 · 공공데이터 55개 · 계보 3개 · 참여자 프로젝트 9개(결과 6개) · 함께 만든 사람 10명** +**주제 11개 · 지금 이슈 7개 · 공공데이터 55개 · 계보 3개 · 참여자 프로젝트 10개(결과 6개) · 함께 만든 사람 11명** | 프로젝트 | 주제 | 누가 | 지금 | 보기 | |---|---|---|---|---| @@ -45,7 +45,8 @@ | 토지거래허가구역 지정(2020.6.23, 잠실·삼성·대치·청담) 뒤 옆 동네 아파트 ㎡당 가격(풍선효과) | 부동산 거래 규제 | [@Hyun2](https://github.com/Hyun2) | 크기를 판별하지 못함 | [결과 보기](https://causalinferencelab.github.io/policy-effect-analytics-agent/answers/hyun2-land-permit-spillover-2020.html) | | 서울 25개 자치구 출산지원금 변경과 출생등록 변화 비교 | 출산·혼인 지원 | [@ingyeoking13](https://github.com/ingyeoking13) | 판단 불가 | [결과 보기](https://causalinferencelab.github.io/policy-effect-analytics-agent/answers/ingyeoking13-seoul-birth-support.html) | | 대구시 대형마트 의무휴업일 평일 전환과 지역 소매업 판매 | 대형마트 의무휴업 | [@jgkim1008](https://github.com/jgkim1008) | 판단 불가 | [결과 보기](https://causalinferencelab.github.io/policy-effect-analytics-agent/answers/jgkim1008-daegu-mart-holiday.html) | -| 서울 기후동행카드 시범사업 전후 지하철 승차 흐름 비교 | 대중교통 요금 지원 | [@jm-git-163](https://github.com/jm-git-163) | 해석 단계 | [폴더](https://github.com/CausalInferenceLab/policy-effect-analytics-agent/tree/main/cases/jm-git-163-climate-card) | +| 강남대로 광역버스 분산 전후 일반도로 속도 변화 | 도로교통 운영 | [@sgim49697-ops](https://github.com/sgim49697-ops) | 해석 단계 | [폴더](https://github.com/CausalInferenceLab/policy-effect-analytics-agent/tree/main/cases/sgim49697-ops-gangnam-bus-2024) | +| 서울 기후동행카드 시범사업 전후 지하철 승차 흐름 비교 | 대중교통 요금 지원 | [@jm-git-163](https://github.com/jm-git-163) | 수집 단계 | [폴더](https://github.com/CausalInferenceLab/policy-effect-analytics-agent/tree/main/cases/jm-git-163-climate-card) | | 행정안전부 'AI 친화적 보고서' 도입(2026.3 시범)이 보도자료 형식·기계 판독·언론 확산에 미친 효과 | 디지털포용·무인정보단말기 접근성 | [@gyeom-yee](https://github.com/gyeom-yee) | 계획 단계 | [폴더](https://github.com/CausalInferenceLab/policy-effect-analytics-agent/tree/main/cases/gyeom-yee-public-markdown) | | 녹색교통지역 5등급 운행제한이 서울 도심 대기질에 미친 효과 | 대기질 | [@yesolee](https://github.com/yesolee) | 계획 단계 | [폴더](https://github.com/CausalInferenceLab/policy-effect-analytics-agent/tree/main/cases/yesolee-green-traffic) | | 기후동행카드 성남 편입(2025.5.3)이 성남 분당선·경강선 역 평일 승차에 미친 효과 | 대중교통 요금 지원 | 멘토 예시 | 판단 불가 | [결과 보기](https://causalinferencelab.github.io/policy-effect-analytics-agent/answers/t3-climate-card-seongnam.html) | diff --git a/apps/_template/README.md b/apps/_template/README.md index bff4208d..9350a039 100644 --- a/apps/_template/README.md +++ b/apps/_template/README.md @@ -15,7 +15,7 @@ make site # http://localhost:8000/apps/< | 주소 | 내용 | |---|---| | `api/index.json` | 목록 · 생성 시각 · 이용 조건 | -| `api/topics.json` | 주제 8개 (세 가지 확인 상태, 사건, 근거 법률과 최근 개정) | +| `api/topics.json` | 주제 (세 가지 확인 상태, 사건, 근거 법률과 최근 개정) | | `api/issues.json` | 지금 이슈인 정책 (시작일, 비교 대상, 설계, 쓰는 데이터) | | `api/datasets.json` | 데이터 지도 (역할 · 단위 · 받는 법 · 이용 조건) | | `api/legal/<주제>.json` | 법제처에서 모은 법령·행정규칙·조례 목록 | diff --git a/cases/_template/README.md b/cases/_template/README.md index 91a48798..72be0e98 100644 --- a/cases/_template/README.md +++ b/cases/_template/README.md @@ -5,7 +5,7 @@ git switch -c <내ID>/plan cp -r cases/_template cases/<내ID>-<주제> # 예: cases/gildong-local-currency (소문자-하이픈) ``` -복사한 뒤 이 README는 내 분석 메모로 바꿔도 됩니다. +복사한 뒤 이 README는 내 분석 메모로 바꿔도 됩니다. `catalog/projects.yaml`에 내 케이스를 한 줄 추가해야 사이트의 참여 화면·이슈 보드에 주제와 함께 나옵니다. ## 이 폴더의 파일 @@ -26,6 +26,9 @@ git add cases/<내ID>-<주제>/plan.yaml && git commit -m "plan(<내ID>-<주제> make flow CASE=cases/<내ID>-<주제> # 4) discussion.md 를 쓰고 다시 make flow → report.md 에 합쳐짐 + +# 5) README 의 프로젝트 표 갱신 (레포 루트에서) +make readme ``` `make flow`는 plan.yaml 이 커밋되어 있지 않으면 계산하지 않습니다(사전 등록). 연습만 하려면 `make demo`를 쓰세요. diff --git a/catalog/README.md b/catalog/README.md index 9915d68f..6c647021 100644 --- a/catalog/README.md +++ b/catalog/README.md @@ -42,10 +42,10 @@ legal: | 파일 | 무엇 | 언제 고치나 | |---|---|---| -| `topics.yaml` | 주제 8개. 키워드, 정책 시점, 세 가지 확인(언제·누가·무엇으로) | 새 주제를 제안할 때 | +| `topics.yaml` | 주제. 키워드, 정책 시점, 세 가지 확인(언제·누가·무엇으로) | 새 주제를 제안할 때 | | `issues.yaml` | 지금 이슈인 정책 7개. 시작일(공식 출처), 비교 방법, 쓸 데이터, 조심할 점 | 새 이슈를 분석하고 싶을 때 | -| `datasets.yaml` | 공공데이터 40개. 역할·단위·받는 법·이용 조건·확인 날짜 | 쓸 만한 데이터를 찾았을 때 | -| `policies.yaml` | 분석 예시가 있는 정책의 설계 정보 | 멘티가 분석 케이스를 만들 때 | +| `datasets.yaml` | 공공데이터. 역할·단위·받는 법·이용 조건·확인 날짜 | 쓸 만한 데이터를 찾았을 때 | +| `policies.yaml` | 분석 예시가 있는 정책의 설계 정보 | 참여자가 분석 케이스를 만들 때 | | `snapshots/` | 법제처에서 자동으로 모은 법령·조례 목록 (직접 고치지 않음) | 수집기가 갱신 | ## 데이터셋의 세 가지 역할 diff --git a/docs/ops/github-onboarding.md b/docs/ops/github-onboarding.md index dc77fd73..6289872e 100644 --- a/docs/ops/github-onboarding.md +++ b/docs/ops/github-onboarding.md @@ -62,7 +62,7 @@ gh pr create --draft --fill # 아직 작업 중이면 Draft 1. PR 본문 체크리스트를 채웁니다. 2. CI(초록 체크)를 기다립니다. 빨간 X면 `Details`를 눌러 로그를 확인하고, 고쳐서 다시 push 하면 PR이 자동 갱신됩니다. -3. 멘토 또는 다른 멘티 1명 **Approve** 후 **Squash and merge**. +3. 메인테이너 또는 다른 참여자 1명 **Approve** 후 **Squash and merge**. ## 6. 병합 후 정리 diff --git a/docs/ops/mentee-guide.md b/docs/ops/mentee-guide.md index 243614cb..1b233dc8 100644 --- a/docs/ops/mentee-guide.md +++ b/docs/ops/mentee-guide.md @@ -1,4 +1,4 @@ -# 멘티 참여 가이드 +# 참여 가이드 커리어 방향과 해 보고 싶은 시도에 따라 **세 가지 방식** 중 하나로 기여합니다. 각자 공용 저장소의 내 폴더에 작업을 쌓고, 합쳐지면 [사이트](https://causalinferencelab.github.io/policy-effect-analytics-agent/)에 자동으로 올라갑니다. @@ -18,7 +18,7 @@ - [참여자 프로젝트](https://causalinferencelab.github.io/policy-effect-analytics-agent/projects.html): 누가 어떤 정책을 어디까지(계획 → 수집 → 분석 → 해석) 진행했는지, 열린 PR·작업 제안까지 한 화면에 - [사이트 첫 화면](https://causalinferencelab.github.io/policy-effect-analytics-agent/): 궁금한 정책을 적으면 주제·관련 법령·데이터·분석 계획 초안을 대화로 정리해 줍니다. - [지금 이슈](https://causalinferencelab.github.io/policy-effect-analytics-agent/issues.html): 논쟁 중인 정책 7개의 분석 가이드 (기후동행카드 예시: [climate-card.md](../strategy/climate-card.md)) -- [데이터 지도](https://causalinferencelab.github.io/policy-effect-analytics-agent/data.html): 공공데이터 40개를 역할·단위·받는 법으로 정리 +- [데이터 지도](https://causalinferencelab.github.io/policy-effect-analytics-agent/data.html): 공공데이터를 역할·단위·받는 법으로 정리 - [데이터 계보](https://causalinferencelab.github.io/policy-effect-analytics-agent/lineage.html): 이슈 → 정책 → 데이터 → 지표 → 분석의 연결과 주제별 빈칸 (트랙 A) - [서비스](https://causalinferencelab.github.io/policy-effect-analytics-agent/apps.html): 공개 API와 서비스 템플릿 (트랙 C) - 주제 페이지의 **관련 법령·행정규칙**: 법제처에서 근거 법률의 개정 이력, 지정·해제 공고, 관련 조례를 자동으로 모은 목록 @@ -60,11 +60,22 @@ make demo # 예시를 연습용 폴 ## 짝 리뷰 -결과 PR에는 멘토 외에 **다른 멘티 1명**이 리뷰를 답니다. 리뷰는 세 가지만 봅니다: 처치 시점·대상이 출처와 맞는가, 대조가 처치와 비교할 만한가, 한 문장 해석이 판정을 넘지 않는가. 그리고 가능하면 직접 돌려 재현 이슈를 남깁니다. +결과 PR에는 멘토 외에 **다른 참여자 1명**이 리뷰를 답니다. 리뷰는 세 가지만 봅니다: 처치 시점·대상이 출처와 맞는가, 대조가 처치와 비교할 만한가, 한 문장 해석이 판정을 넘지 않는가. 그리고 가능하면 직접 돌려 재현 이슈를 남깁니다. 전체 점검과 계획: [roadmap.md](roadmap.md) · 외부 사용자 테스트: [user-test.md](user-test.md) · 성과 지표: [metrics.md](metrics.md) -## 주차별 목표 +## 지금부터 참여하기 + +2026년 가을 1기(9.7~11.1)는 끝났고, 지금은 누구나 같은 방식으로 이어서 참여합니다. 정해진 주차 없이 PR 하나에 한 단계씩 올리면 됩니다. + +1. [작업 제안 이슈](https://github.com/CausalInferenceLab/policy-effect-analytics-agent/issues/new?template=case-proposal.yml)에 트랙과 주제를 적습니다. [이슈 보드](https://causalinferencelab.github.io/policy-effect-analytics-agent/#topics)의 빈칸이 좋은 출발점입니다. +2. 위 6단계(트랙 B) 또는 트랙 가이드(A·C)대로 진행합니다. 결과가 나오면 `make readme`로 README 표를 갱신해 같은 PR에 넣습니다. +3. 다른 참여자의 결과 PR 하나를 리뷰하거나 재현해 줍니다. 리뷰를 주고받는 것이 이 프로젝트의 품질 규칙입니다. + +내 진행 상황은 [참여 화면](https://causalinferencelab.github.io/policy-effect-analytics-agent/projects.html?me=)에서 주소 끝에 내 GitHub ID를 붙이면 내 카드만 보입니다. + +
+1기 일정 (지난 기록) | 모임 | 주차 | 공통 | |---|---|---| @@ -78,7 +89,9 @@ make demo # 예시를 연습용 폴 | 모임 | A. 데이터 온톨로지 | B. 가설과 분석 | C. 서비스 개발 | |---|---|---|---| | 10.25(일) | 이슈 하나의 계보 YAML PR (`make lineage` 통과) | `plan.yaml` PR + `fetch.py`로 `data/panel.csv` | `apps/<내ID>-<서비스>/` 첫 화면 PR (API 하나 이상) | -| 11.1(일) 공개 | 새 데이터셋 1개 이상 추가, 계보가 사이트에 표시 | `make flow` 결과 + `discussion.md`, 다른 멘티가 재현 | 기능 1개 완성 + README, 사이트에서 열림 | +| 11.1(일) 공개 | 새 데이터셋 1개 이상 추가, 계보가 사이트에 표시 | `make flow` 결과 + `discussion.md`, 다른 참여자가 재현 | 기능 1개 완성 + README, 사이트에서 열림 | + +
트랙 B에서 지역마다 시작일이 다르거나(시차 도입) 정책 지역이 1~5곳(합성통제)이면 전용 모듈이 아직 준비 중입니다. 그 전까지는 같은 날 시작한 지역만 고르거나 무작위화 추론으로 1차 추정하고 한계에 적습니다. @@ -96,7 +109,7 @@ cp -r apps/_template apps/<내ID>-<서비스> # C (예: apps/gil - 결과가 나오거나 단계가 바뀌면 `make readme`로 README의 '지금까지 만든 것' 표를 갱신해 같은 PR에 넣습니다. - 수정은 **내 파일·폴더만** 합니다. `catalog/datasets.yaml` 추가는 누구나 PR로 합니다. `core/`·`site/`를 고쳐야 하면 먼저 이슈를 열고 따로 PR을 올립니다. - `data/` 아래 파일은 git에 올라가지 않습니다. 데이터는 `fetch.py`로 각자 받게 합니다. -- PR 하나에 한 단계만 담고, 멘토 또는 다른 멘티 1명 승인 + 자동 검사 통과 뒤 합칩니다. +- PR 하나에 한 단계만 담고, 메인테이너 또는 다른 참여자 1명 승인 + 자동 검사 통과 뒤 합칩니다. ## 같이 보는 것 (담당자 없음, 모두) diff --git a/docs/ops/monitoring.md b/docs/ops/monitoring.md index 247af85f..ceddf541 100644 --- a/docs/ops/monitoring.md +++ b/docs/ops/monitoring.md @@ -1,6 +1,6 @@ # 활동 확인 (멘토용) -원칙: **커밋과 PR이 곧 출석**입니다. 멘티마다 주 1회 이상 의미 있는 커밋과 PR 흐름이 보이면 건강한 상태입니다. +원칙: **커밋과 PR이 곧 출석**입니다. 참여자마다 주 1회 이상 의미 있는 커밋과 PR 흐름이 보이면 건강한 상태입니다. ## 로컬에서 한 번에 보기 @@ -21,11 +21,11 @@ SINCE=$(date -d '7 days ago' +%F) # 열린 PR 전체 gh pr list -R $R --state open -# 한 멘티의 브랜치 PR (브랜치 이름 = /<작업>) +# 한 참여자의 브랜치 PR (브랜치 이름 = /<작업>) gh pr list -R $R --state all --json headRefName,author,title,state \ --jq '.[] | select(.headRefName|startswith("gildong/")) | [.state,.author.login,.title] | @tsv' -# 한 멘티 폴더의 최근 커밋 +# 한 참여자 폴더의 최근 커밋 gh api "repos/$R/commits?path=cases/gildong-local-currency&since=${SINCE}T00:00:00Z" \ --jq '.[] | [.commit.author.date,.commit.author.name,.commit.message] | @tsv' diff --git a/docs/ops/roadmap.md b/docs/ops/roadmap.md index 2667aa73..ccb53436 100644 --- a/docs/ops/roadmap.md +++ b/docs/ops/roadmap.md @@ -76,7 +76,7 @@ | 문제 | 근거 | 왜 문제인가 | |---|---|---| | 쓰임새를 가정만 했다 | 사이트 대화에서 올라온 질문 0건, 외부 사용자 테스트 0회 | 목표 3("누구나 바로 쓸 수 있게")을 확인한 적이 없다 | -| 리뷰가 없다 | 멘티 PR 18건 중 리뷰 0건 | 계획·해석의 오류를 아무도 보지 않은 채 합쳐졌다 | +| 리뷰가 없다 | 참여자 PR 18건 중 리뷰 0건 | 계획·해석의 오류를 아무도 보지 않은 채 합쳐졌다 | | 사전 등록이 형식뿐이다 | 게이트는 `plan.yaml`이 커밋됐는지만 본다. 결과 6개 중 5개는 계획과 결과가 같은 날 커밋, 1개는 결과와 함께 계획 수정 (멘토 예시 포함) | 결과를 보고 계획을 맞췄는지 기록으로 구분할 수 없다 | | "판별 못함"만 나온다 | 참여자 결과 4개 모두 '크기를 판별하지 못함' 또는 '판단 불가' | 사용자가 가져갈 문장이 없다. "이 크기 이상은 아니었다"(배제 범위)는 말할 수 있는데 쓰지 않았다 | | 필요한 추정 도구를 미뤘다 | 4주차에 권장한 시차 도입·합성통제 모듈을 만들지 않고 사이트 기능에 시간을 썼다 | 실제 정책 대부분이 지역마다 시작일이 다르다 | @@ -121,7 +121,7 @@ | 지표 | 지금 | 1단계 목표 | |---|---|---| | 외부 과업 테스트 | 0명 | 5명 | -| 리뷰가 달린 멘티 PR 비율 | 0% | 결과 PR 전부 | +| 리뷰가 달린 참여자 PR 비율 | 0% | 결과 PR 전부 | | 교차 재현된 결과 | 0개 | 결과가 나온 케이스 전부 | | '계획 먼저 커밋' 결과 | 0개 | 새로 시작하는 분석 전부 | | 한 문장 해석이 있는 결과 | 3/6 | 6/6 | diff --git a/docs/strategy/korea-cases.md b/docs/strategy/korea-cases.md index 48bf3bc5..8efc896d 100644 --- a/docs/strategy/korea-cases.md +++ b/docs/strategy/korea-cases.md @@ -1,6 +1,6 @@ # 국내 정책효과 분석 사례 + 재현용 해외 교과서 사례 -> 목적: 멘티가 "누가 이미 이 질문을 어떤 방법·데이터로 풀었나"를 5분 안에 파악하고, **오픈데이터만으로 4주 안에 재현·확장 가능한지** 판단하도록 돕는다. +> 목적: 참여자가 "누가 이미 이 질문을 어떤 방법·데이터로 풀었나"를 5분 안에 파악하고, **오픈데이터만으로 4주 안에 재현·확장 가능한지** 판단하도록 돕는다. > 작성: 운영진, 2026-09-24. 링크는 모두 직접 확인한 것. "초록 미확인"은 제목/서지만 확인하고 본문을 열지 못한 경우(KCI·DBpia는 자동 접근 차단). ## 0. 한눈에 보기 @@ -112,6 +112,6 @@ | Card & Krueger (1994) NJ/PA 최저임금 | 2×2 DiD | [David Card data sets](https://davidcard.berkeley.edu/data_sets.html) | 가장 단순한 DiD 정답 케이스. estimator 단위 테스트용 | | Abadie·Diamond·Hainmueller (2010) 캘리포니아 Prop 99 | SCM + placebo-in-space | [Hainmueller Synth](https://web.stanford.edu/~jhain/synthpage.html) | 처치 단위 1개(K9·K12와 같은 구조). 순열추론 기준값 | | Callaway & Sant'Anna (2021) `mpdta` 카운티 최저임금 | staggered DiD | [`did` 패키지](https://bcallaway11.github.io/did/) | **시차 도입 시 TWFE 편향** 시연. T2·T4·T7이 모두 시차 도입이다 | -| Cheng & Hoekstra (2013) Castle doctrine | staggered DiD, 이벤트스터디 | [Mixtape 9장](https://mixtape.scunning.com/09-difference_in_differences) | 주(state) 패널 + 사전추세 그림. 한국어 멘티용 교재로도 적합 | +| Cheng & Hoekstra (2013) Castle doctrine | staggered DiD, 이벤트스터디 | [Mixtape 9장](https://mixtape.scunning.com/09-difference_in_differences) | 주(state) 패널 + 사전추세 그림. 한국어 참여자용 교재로도 적합 | 권장: `tests/golden/`에 Card-Krueger와 Prop 99를 넣고, 에이전트가 알려진 추정치를 허용 오차 안에서 재현하는지 CI로 확인한다(Develop 팀과 협의). diff --git a/docs/strategy/plan-guide.md b/docs/strategy/plan-guide.md index 8ea0e170..ec520941 100644 --- a/docs/strategy/plan-guide.md +++ b/docs/strategy/plan-guide.md @@ -19,7 +19,7 @@ | `estimator` | 방법 | `did` · `event_study` · `its` 중 하나. 시차 도입은 4주차, 합성통제는 5주차에 모듈이 추가됩니다 | | `assumptions` | 식별 가정 | 가정마다 확인 방법(`check`: `pretrend_test` · `placebo_time` · `manual`) | | `refutations` | 반증 테스트 | `placebo_time`(가짜 시작일), `placebo_outcome`, `drop_unit`, `placebo_window`(정책이 적용되지 않는 시간대) 중 하나 이상 | -| `abstention` | 판정을 낮출 조건 | 기계가 판정할 수 있는 조건만(아래 표). 걸리면 효과 수치 대신 "조건부" 또는 "판단 불가" | +| `abstention` | 판정을 낮출 조건 | 기계가 판정할 수 있는 조건만(아래 표). 걸리면 효과 수치 대신 "크기를 판별하지 못함" 또는 "판단 불가" | | `thresholds` | 기준값 | 사전추세 유의수준, 최소 클러스터 수, 최소 사전 기간 | | `data_sources` | 데이터 출처 | 기관, URL, **라이선스**(공공누리 유형), 어댑터 | diff --git a/docs/strategy/topic-guide.md b/docs/strategy/topic-guide.md index 9e1ed402..4e2a632c 100644 --- a/docs/strategy/topic-guide.md +++ b/docs/strategy/topic-guide.md @@ -1,7 +1,7 @@ # 주제 선정 가이드 (케이스 후보 8선) > 기준: ① 처치 시점·대상이 공개 자료로 명확하다. ② 결과지표가 **오픈데이터**이고 API나 파일로 받을 수 있다. ③ 대조군을 만들 수 있다. ④ 4주 안에 fetch → estimate → report까지 갈 수 있다. -> 검증 표기: ✅ 이번에 데이터 페이지를 직접 열어 확인함 / ⚠️ 존재는 확인했지만 세부(기간·컬럼·ID)는 미확인 / ❓ 미확인이므로 맡은 멘티가 1주차에 확인할 것. +> 검증 표기: ✅ 이번에 데이터 페이지를 직접 열어 확인함 / ⚠️ 존재는 확인했지만 세부(기간·컬럼·ID)는 미확인 / ❓ 미확인이므로 맡은 참여자가 1주차에 확인할 것. > 사례 근거는 [korea-cases.md](korea-cases.md) 참조. > 이 문서의 T1~T8은 **정책 후보** 번호입니다. 사이트의 '주제'(catalog/topics.yaml, 예: 부동산 거래 규제)는 이 정책들을 묶는 더 큰 단위이고, T3은 '부동산 거래 규제' 주제에 속합니다. diff --git a/docs/tracks/README.md b/docs/tracks/README.md index 65b51027..41e06eff 100644 --- a/docs/tracks/README.md +++ b/docs/tracks/README.md @@ -26,7 +26,7 @@ | 모임 | A. 데이터 온톨로지 | B. 가설과 분석 | C. 서비스 개발 | |---|---|---|---| | 10.25(일) | 이슈 하나의 계보 YAML PR (`make lineage` 통과) | `plan.yaml` PR + `fetch.py`로 `data/panel.csv` | `apps/<내ID>-<서비스>/` 첫 화면 PR (API 하나 이상 사용) | -| 11.1(일) 공개 | 새 데이터셋 1개 이상 `datasets.yaml`에 추가, 계보가 사이트에 표시 | `make flow` 결과 + `discussion.md`, 다른 멘티가 재현 | 기능 1개 완성 + README, 사이트에서 열림 | +| 11.1(일) 공개 | 새 데이터셋 1개 이상 `datasets.yaml`에 추가, 계보가 사이트에 표시 | `make flow` 결과 + `discussion.md`, 다른 참여자가 재현 | 기능 1개 완성 + README, 사이트에서 열림 | 어느 트랙이든 **작업 제안 이슈**를 먼저 열고(트랙 선택), 같은 주제를 고른 사람끼리는 이슈에서 서로를 연결합니다. diff --git a/docs/tracks/analysis.md b/docs/tracks/analysis.md index 5ae326c1..07f78c50 100644 --- a/docs/tracks/analysis.md +++ b/docs/tracks/analysis.md @@ -11,7 +11,7 @@ | 3. 수집 | 공공데이터 → 분석 단위 표 | `fetch.py` → `data/panel.csv` | ③ 품질 점검 통과 | | 4. 추정 | 규칙이 고른 방법으로 계산 | `make flow` | 사전 추세, 정책 지역 수 | | 5. 반증 | 가짜 시작일 · 가짜 지표 · 단위 빼기 | `plan.yaml`의 `refutations` | 가짜에서도 효과가 나오지 않는가 | -| 6. 해석 | 판정(효과 근거 있음 · 조건부 · 판단 불가)과 한계 | `discussion.md` | 과장 표현 점검 통과 | +| 6. 해석 | 판정(효과 근거 있음 · 크기를 판별하지 못함 · 판단 불가)과 한계 | `discussion.md` | 과장 표현 점검 통과 | 판정·추정치·그림은 사이트 주제 페이지와 `api/results.json`에 자동으로 공개되어 트랙 C의 재료가 됩니다. @@ -40,5 +40,5 @@ make demo # 예시로 한 바퀴 먼저 ## 완주 기준 -- 다른 멘티가 README만 보고 `fetch.py` → `make flow`로 같은 결과를 낸다. +- 다른 참여자가 README만 보고 `fetch.py` → `make flow`로 같은 결과를 낸다. - "판단 불가"도 좋은 결과다. 무엇 때문에 판단할 수 없고 어떤 데이터가 있으면 판단할 수 있는지 적는다. diff --git a/docs/tracks/ontology.md b/docs/tracks/ontology.md index 7381faa5..21e217b4 100644 --- a/docs/tracks/ontology.md +++ b/docs/tracks/ontology.md @@ -52,7 +52,7 @@ make site # http://l - 처음 보는 사람이 원천 데이터 페이지에서 지표 숫자까지 같은 방법으로 다시 만들 수 있다. - 정책 시작일에 출처가 있다. 법령 개정일을 그대로 처치 시점으로 쓰지 않는다. - 이용 조건이 다른 데이터(공공누리 유형, KOSIS 약관)를 섞을 때 무엇을 다시 배포할 수 없는지 적는다. -- 트랙 B 분석과 `used_by`로 이어진다 (같은 주제를 고른 B 멘티와 함께 하면 가장 좋습니다). +- 트랙 B 분석과 `used_by`로 이어진다 (같은 주제를 고른 B 참여자와 함께 하면 가장 좋습니다). ## 함께 쓰면 좋은 것 diff --git a/docs/tracks/service.md b/docs/tracks/service.md index 09d3fbcd..77fa2a24 100644 --- a/docs/tracks/service.md +++ b/docs/tracks/service.md @@ -9,7 +9,7 @@ | 주소 | 내용 | 만드는 쪽 | |---|---|---| | `api/index.json` | 목록 · 생성 시각 · 이용 조건(`terms`) | — | -| `api/topics.json` | 주제 8개: 세 가지 확인 상태, 사건, 근거 법률과 최근 개정 | 운영 | +| `api/topics.json` | 주제: 세 가지 확인 상태, 사건, 근거 법률과 최근 개정 | 운영 | | `api/issues.json` | 지금 이슈인 정책: 시작일, 비교 대상, 설계, 쓰는 데이터 | 운영 | | `api/datasets.json` | 데이터 지도: 역할 · 단위 · 받는 법 · 이용 조건 | 트랙 A | | `api/legal/<주제>.json` | 법제처에서 모은 법령·행정규칙·조례 | 자동 수집 | diff --git a/site/architecture.py b/site/architecture.py index 3072d8cd..a497de5f 100644 --- a/site/architecture.py +++ b/site/architecture.py @@ -164,7 +164,7 @@ ( "공공데이터포털 인증키", "실거래가 등 실제 데이터로 분석 (지금 예시는 시뮬레이션)", - "멘티 각자 · .env", + "참여자 각자 · .env", "warn", "각자 신청", ), @@ -263,7 +263,7 @@ ( "korean-law-mcp", "법제처 API를 AI 도구(MCP)로 묶은 서버. 인용 검증 · 시점별 법령", - "법령 조회가 겹침. 멘티가 Claude로 법령을 탐색할 때 쓰면 좋음. 우리 수집기는 재현용 스냅샷·변경 감지·효과 추정 연결에 집중", + "법령 조회가 겹침. 참여자가 Claude로 법령을 탐색할 때 쓰면 좋음. 우리 수집기는 재현용 스냅샷·변경 감지·효과 추정 연결에 집중", "MIT", ), ( @@ -349,7 +349,7 @@ def body(e) -> str:

한 장으로 보는 구조

두 개의 고리로 움직입니다. 사람들의 질문이 대화 고리로 들어와 주제와 데이터가 쌓이고, -멘티는 기여 고리의 세 트랙(A 데이터 온톨로지 · B 가설과 분석 · C 서비스 개발) 중 하나로 그 위에 쌓습니다.

+참여자는 기여 고리의 세 트랙(A 데이터 온톨로지 · B 가설과 분석 · C 서비스 개발) 중 하나로 그 위에 쌓습니다.

{_loop("대화 고리 · 질문이 쌓이는 길", LOOP_TALK, e)} @@ -368,7 +368,7 @@ def body(e) -> str:
{goals}
{decisions}
-

폴더 안내

멘티는 cases/의 내 폴더와 catalog/만 고치면 됩니다.

+

폴더 안내

참여자는 cases/의 내 폴더와 catalog/만 고치면 됩니다.

{code}
폴더하는 일누가 고치나

지금 상태

{status}
diff --git a/site/ask.js b/site/ask.js index a4c76739..377b14c5 100644 --- a/site/ask.js +++ b/site/ask.js @@ -281,7 +281,7 @@ ${JSON.stringify(compact)}`; if (cut && navigator.clipboard) navigator.clipboard.writeText(convo + (prop ? "\n\n---\n" + prop : "")).catch(() => {}); if (window.track) window.track("propose"); window.open(issueUrl(fields), "_blank", "noopener"); - say("GitHub 이슈 작성 화면을 새 창으로 열었습니다. 내용을 확인하고 제출하면 멘토와 멘티가 검토해 카탈로그와 분석에 반영합니다. (GitHub 로그인이 필요합니다)" + + say("GitHub 이슈 작성 화면을 새 창으로 열었습니다. 내용을 확인하고 제출하면 멘토와 참여자가 검토해 카탈로그와 분석에 반영합니다. (GitHub 로그인이 필요합니다)" + (cut ? " 대화가 길어 앞부분을 줄였습니다. 전체 대화는 클립보드에 복사해 두었으니 이슈 본문에 붙여 넣어 주세요." : "")); } diff --git a/site/build.py b/site/build.py index 4eee0ca0..106549dd 100644 --- a/site/build.py +++ b/site/build.py @@ -279,7 +279,7 @@ def bars_svg(counts: pd.Series, label: str) -> str: ("제안", "'제안으로 올리기'를 누르면 대화가 GitHub 이슈로 올라갑니다. 로그인만 있으면 됩니다."), ( "검토", - "멘토·멘티가 이슈를 보고 새 주제·데이터셋은 카탈로그에, 분석은 케이스 폴더에 PR로 넣습니다.", + "메인테이너·참여자가 이슈를 보고 새 주제·데이터셋은 카탈로그에, 분석은 케이스 폴더에 PR로 넣습니다.", ), ( "반영", @@ -638,7 +638,7 @@ def issues_page(issues, datasets, topics) -> str:

2025~2026년에 논쟁이 된 정책 {len(issues)}개를 골라, 누구와 누구를 비교할지, 어떤 방법을 쓸지, 어떤 데이터를 받을 수 있는지 정리했습니다. 시작일은 모두 정부 공식 자료에서 확인했습니다.

+이 목록은 참여자가 어디서부터 볼지 정하는 출발점입니다.

효과 추정 5단계

{guide}

분석 방법 고르기

방법은 데이터 모양을 보고 규칙이 정합니다. 결과를 본 뒤 사람이나 AI가 고르지 않습니다.

{designs}
@@ -963,7 +963,7 @@ def topic_page(t, policies, issues, datasets, projects=(), answers=(), lineages= f"

아직 아무도 비교해 보지 않았어요. 첫 번째 시민 데이터 과학자가 되어 볼래요? 이 주제로 질문하기 " f"분석 제안하기

" ) - pmine = [p for p in proj.by_topic(list(projects), t.id) if not p["stages"][2]] + pmine = [p for p in proj.by_topic(list(projects), t.id) if not p.get("has_flow")] if pmine: body.append( "

진행 중인 분석

" diff --git a/site/projects.py b/site/projects.py index 08fa9f0a..2d280826 100644 --- a/site/projects.py +++ b/site/projects.py @@ -52,11 +52,13 @@ def _plan(case: Path) -> dict: def stage_of(case: Path) -> list[bool]: tmpl = _template_discussion() disc = case / "discussion.md" + # 단계는 앞에서부터 이어진다: 분석(공통 make flow 또는 자체 report.md)이 없으면 해석도 아직이다 + analysed = (case / "flow_log.json").exists() or (case / "report.md").exists() return [ (case / "plan.yaml").exists() or (case / "analysis-plan.yaml").exists(), (case / "fetch.py").exists(), - (case / "flow_log.json").exists(), - disc.exists() and disc.read_text(encoding="utf-8").strip() != tmpl, + analysed, + analysed and disc.exists() and disc.read_text(encoding="utf-8").strip() != tmpl, ] @@ -112,6 +114,7 @@ def load_projects() -> list[dict]: if (case / "figures").is_dir() else [], "has_report": (case / "report.md").exists(), + "has_flow": (case / "flow_log.json").exists(), "open_prs": prs_by_case.get(case.name, []), "registered": case.name in reg, } @@ -162,21 +165,23 @@ def project_card(e, p: dict, topics_by_id: dict, up: str = "") -> str: ) todo = "" if p.get("next"): + # 아직 결과가 없는 프로젝트는 할 일을 펼쳐 둔다 (참여자가 바로 보도록) + opened = " open" if not p.get("has_flow") else "" todo = ( - '
다음 할 일 ' + f'
다음 할 일 ' f"{len(p['next'])}
    " + "".join(f"
  • {e(x)}
  • " for x in p["next"]) + "
" ) fig = "" if p["figures"]: - f = "event_study.png" if "event_study.png" in p["figures"] else p["figures"][0] + f = next((x for x in THUMB_PREF if x in p["figures"]), p["figures"][0]) fig = ( f'{e(p[' ) links = [f'폴더'] - if p["stages"][2]: + if p.get("has_flow"): links.insert(0, f'결과 보기') if p["has_report"]: links.append(f'리포트') @@ -253,7 +258,7 @@ def projects_body(e, projects, lineages, topics) -> str: it["user"] for it in act.get("proposals", []) } people.discard(MENTOR) - n_res = sum(p["stages"][2] for p in mentee) + n_res = sum(bool(p.get("has_flow")) for p in mentee) cards = "".join(project_card(e, p, tb) for p in mentee) mentor_cards = "".join(project_card(e, p, tb) for p in mentor) lin_cards = lineage_list(e, lineages, tb) @@ -269,14 +274,16 @@ def projects_body(e, projects, lineages, topics) -> str:
{len(lineages)}
데이터 계보
{JOIN.format(REPO=REPO)} +{PATH.format(REPO=REPO)} {pr_list(e, act)}

분석 프로젝트 (트랙 B)

막대는 진행 단계입니다. 판정은 파이프라인의 자동 판정이고, 해석은 각 프로젝트의 discussion.md가 우선합니다. 다음 할 일은 폴더·git 기록에서 자동으로 뽑습니다(한 문장 해석, 교차 재현, 계획 먼저 커밋 등).

+
- - -
+ + +
{cards or "

아직 없습니다.

"}

데이터 계보 (트랙 A)

이슈 → 정책 → 데이터 → 가공 → 지표의 길입니다. 빈칸은 아직 없는 데이터, 채울 곳입니다.

@@ -288,6 +295,19 @@ def projects_body(e, projects, lineages, topics) -> str: """ +PATH = """

내 분석이 사이트에 올라가기까지

+

PR 하나에 한 단계씩. 각 단계가 합쳐질 때마다 아래 내 카드의 막대가 한 칸씩 채워지고, 마지막에는 분석 결과·이슈 보드·README에 자동으로 나와요.

+
    +
  1. 작업 제안작업 제안 이슈에 트랙·주제를 적어요
  2. +
  3. 계획cp -r cases/_template cases/<내ID>-<주제> 후 plan.yaml만 담아 먼저 PR, catalog/projects.yaml에 한 줄
  4. +
  5. 수집fetch.py로 data/panel.csv 만들기 (원자료는 커밋하지 않아요)
  6. +
  7. 분석make flow CASE=cases/<내ID>-<주제> → 판정·그림·리포트가 생겨요
  8. +
  9. 해석discussion.md에 '결과를 한 문장으로'와 한계, make readme
  10. +
  11. 재현받기다른 참여자가 돌려 보고 재현 기록을 남기면 '교차 재현됨' 배지
  12. +
+

막히면 참여 가이드 · GitHub가 처음이라면. 내 카드만 보려면 주소 끝에 ?me=내GitHubID를 붙이세요.

+""" + JOIN = """

세 가지 참여 방식

커리어 방향과 해 보고 싶은 시도에 따라 하나를 고릅니다. 세 트랙은 이어져 있습니다: A가 이슈와 데이터를 이으면, B가 그 데이터로 효과를 추정하고, C가 그 결과로 서비스를 만듭니다.

@@ -303,20 +323,21 @@ def projects_body(e, projects, lineages, topics) -> str:

분석 Cycle에서 나온 데이터(공개 API)로 웹·앱 서비스를 만듭니다. 합쳐지면 이 사이트에서 바로 열립니다.

내 작업: apps/<내ID>-<서비스>/

서비스와 API 보기 · 트랙 C 가이드

-
""" FILTER_JS = """ +(()=>{let s=-9;const q=document.getElementById('proj-q'); +const apply=()=>{const t=(q.value||'').trim().toLowerCase(); + document.querySelectorAll('#proj-cards .proj').forEach(c=>{const st=+c.dataset.stage; + const okS = s===-9 ? true : (s===2 ? st>=2 : st<2); + c.hidden = !okS || (!!t && !c.textContent.toLowerCase().includes(t));});}; document.querySelectorAll('.pf').forEach(b=>b.addEventListener('click',()=>{ - document.querySelectorAll('.pf').forEach(x=>x.setAttribute('aria-pressed',x===b)); - const s=+b.dataset.s; - document.querySelectorAll('#proj-cards .proj').forEach(c=>{ - const st=+c.dataset.stage; - c.hidden = s===-9 ? false : (s===2 ? st<2 : st>=2); - }); -})); + document.querySelectorAll('.pf').forEach(x=>x.setAttribute('aria-pressed',x===b));s=+b.dataset.s;apply();})); +q.addEventListener('input',apply); +const me=new URLSearchParams(location.search).get('me');if(me){q.value=me;apply();}})(); """ diff --git a/site/quality.py b/site/quality.py index a0535967..3c1f541e 100644 --- a/site/quality.py +++ b/site/quality.py @@ -145,6 +145,8 @@ def next_steps(p: dict, a: dict | None, registered: bool) -> list[str]: todo.append("make flow 실행 → 결과 PR") elif not st[3]: todo.append("discussion.md 에 해석·한계 쓰기") + if st[2] and a is None: + todo.append("핵심 비교 하나를 plan.yaml + make flow 로 → 사이트 결과·대시보드에 자동 공개") if a is not None: if st[3] and not a.get("has_one_line"): todo.append("discussion.md 에 '## 결과를 한 문장으로' 추가") diff --git a/site/style.css b/site/style.css index 0ea3ec13..eb2b4845 100644 --- a/site/style.css +++ b/site/style.css @@ -522,3 +522,14 @@ html.js:not(.calm) .lin-svg .edges path { transition: stroke-dashoffset 1.2s eas .faces a:hover img { transform: translateY(-3px) } @media (max-width: 760px) { .personas, .shows { grid-template-columns: minmax(0, 1fr) } } @media (prefers-reduced-motion: reduce) { .show, .show:hover, .faces a:hover img { transition: none; transform: none } } + +/* ── 참여 화면: 내 분석이 사이트에 올라가기까지 ── */ +ol.path { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 10px; counter-reset: st } +ol.path li { counter-increment: st; position: relative; padding: 14px 14px 14px; border-radius: 14px; background: var(--surface); border: 1px solid var(--hair); display: flex; flex-direction: column; gap: 6px } +ol.path li::before { content: counter(st); width: 26px; height: 26px; border-radius: 50%; background: var(--ink); color: var(--paper); display: grid; place-items: center; font-weight: 800; font-size: 13px } +ol.path b { font-size: 15.5px } +ol.path span { font-size: 13.5px; color: var(--ink2); line-height: 1.55 } +ol.path code { font-size: 12px; word-break: break-all } +details.todo[open] summary { font-weight: 700; color: var(--ink) } +@media (max-width: 960px) { ol.path { grid-template-columns: repeat(2, minmax(0, 1fr)) } } +@media (max-width: 560px) { ol.path { grid-template-columns: minmax(0, 1fr) } }