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
36 changes: 9 additions & 27 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -1,27 +1,9 @@
# CODEOWNERS — PR이 해당 경로를 수정하면 소유자에게 자동으로 리뷰 요청이 갑니다.
# 채우는 법:
# 1) GitHub Org > Teams 에서 팀 생성 (예: core-maintainers, group1 ... group6)
# 2) 아래 @CausalInferenceLab/<team> 핸들을 실제 팀 이름으로 교체
# 3) 조 폴더가 생기면 한 줄씩 추가: /cases/group3-*/ @CausalInferenceLab/group3
# 4) 팀에 저장소 Write 권한을 부여해야 리뷰 요청이 동작합니다.
# 규칙: 아래쪽 줄이 위쪽 줄보다 우선합니다.

# 기본: 운영진
* @CausalInferenceLab/mentors

# 공통 엔진
/core/ @CausalInferenceLab/core-maintainers
/tests/core/ @CausalInferenceLab/core-maintainers

# 운영/인프라
/.github/ @CausalInferenceLab/mentors
/app/ @CausalInferenceLab/mentors
/cases/_template/ @CausalInferenceLab/mentors

# 조별 케이스 (조 편성 후 주석 해제·수정)
# /cases/group1-*/ @CausalInferenceLab/group1
# /cases/group2-*/ @CausalInferenceLab/group2
# /cases/group3-*/ @CausalInferenceLab/group3
# /cases/group4-*/ @CausalInferenceLab/group4
# /cases/group5-*/ @CausalInferenceLab/group5
# /cases/group6-*/ @CausalInferenceLab/group6
# 코드 소유자: PR이 열리면 아래 사람에게 자동으로 리뷰 요청이 갑니다.
# 멘티 폴더(cases/<ID>-<주제>/)는 폴더를 만들 때 한 줄씩 추가합니다.
# 예) /cases/gildong-*/ @gildong

* @jsshin2022
/core/ @jsshin2022
/site/ @jsshin2022
/catalog/ @jsshin2022
/.github/ @jsshin2022
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/bug.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ body:
id: where
attributes:
label: 위치
placeholder: core/estimators, app/streamlit_app.py, cases/group3-.../estimate.py
placeholder: core/estimators, app/streamlit_app.py, cases/gildong-local-currency/estimate.py
validations:
required: true
- type: textarea
Expand Down
8 changes: 4 additions & 4 deletions .github/ISSUE_TEMPLATE/case-proposal.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: 케이스 제안
description: 분석할 정책/사회 문제를 제안합니다 (조 주제 후보)
description: 내가 분석할 정책·사회 문제를 제안합니다
title: "[케이스] "
labels: ["case-proposal"]
body:
Expand All @@ -8,10 +8,10 @@ body:
value: |
결과를 보기 전에 질문을 먼저 적는 것이 목표입니다. 모르는 칸은 "미정"으로 두세요.
- type: input
id: group
id: owner
attributes:
label: 조
placeholder: group3
label: 담당자 GitHub ID
placeholder: gildong
validations:
required: true
- type: textarea
Expand Down
41 changes: 41 additions & 0 deletions .github/ISSUE_TEMPLATE/site-question.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
name: 사이트 대화에서 온 질문
description: 사이트의 "궁금한 정책 이야기" 대화를 제안으로 올립니다 (보통 사이트 버튼이 자동으로 채워 줍니다)
title: "[사이트 질문] "
labels: ["from-site"]
body:
- type: markdown
attributes:
value: |
사이트 대화창에서 정리한 질문입니다. 올려 주신 질문은 **요즘 궁금해하는 주제 순위**에 반영되고,
멘토·멘티가 검토해 새 주제·데이터·분석으로 이어집니다. 개인정보나 API 키는 적지 마세요.
- type: textarea
id: question
attributes:
label: 궁금한 점
description: 처음 적은 질문
validations:
required: true
- type: input
id: topic
attributes:
label: 관련 주제
description: 사이트가 연결한 주제입니다. 맞지 않으면 고치거나 "새 주제"로 두세요.
placeholder: 부동산 거래 규제 (housing-transaction-regulation)
- type: textarea
id: conversation
attributes:
label: 대화 내용
description: 사이트 대화가 자동으로 들어갑니다. 필요 없는 부분은 지워도 됩니다.
render: markdown
- type: textarea
id: proposal
attributes:
label: 정리된 제안
description: 분석 계획 초안, 새로 찾은 데이터셋, 새 주제의 세 가지(언제·누가·무엇) 등
- type: checkboxes
id: consent
attributes:
label: 확인
options:
- label: 이 내용이 공개 저장소에 올라가는 것을 알고 있습니다. 개인정보나 비밀값은 없습니다.
required: true
7 changes: 4 additions & 3 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
## 무엇을 했나요?
<!-- 한두 줄 요약. 관련 이슈: Closes #번호 -->

## 조 / 케이스
<!-- 예: group3 / cases/group3-youth-rent -->
## 케이스
<!-- 예: cases/gildong-local-currency -->

## 체크리스트
- [ ] `plan.yaml`을 **결과를 보기 전에** 작성·커밋했습니다 (이후 변경 시 이유를 커밋 메시지에 기록)
- [ ] 데이터 출처와 **라이선스**(공공누리 유형 등)를 `plan.yaml > data_sources`에 명시했습니다
- [ ] API 키·`.env`·개인정보가 담긴 원자료·재배포 불가 데이터를 포함하지 않았습니다
- [ ] 그림/수치는 `fetch.py` → `estimate.py` 실행으로 **재현** 가능합니다
- [ ] `make check` (ruff + pytest)가 통과합니다
- [ ] 다른 조의 폴더나 `core/`를 (합의 없이) 수정하지 않았습니다
- [ ] 다른 사람의 폴더나 `core/`를 (합의 없이) 수정하지 않았습니다
- [ ] 원자료·가공 데이터 파일을 커밋하지 않았습니다 (시뮬레이션·조례 목록 제외)

## 리뷰어에게
<!-- 특히 봐줬으면 하는 부분, 막힌 부분 -->
2 changes: 2 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ jobs:
run: |
ruff check .
ruff format --check . || echo "::warning::ruff format differences (run 'ruff format .')"
- name: License check (no GPL/AGPL dependencies)
run: python scripts/check_licenses.py
- name: Pytest
run: pytest -q
- name: Example flow (offline)
Expand Down
13 changes: 11 additions & 2 deletions .github/workflows/pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,19 @@ name: pages

# main 에 반영되면 정적 대시보드(_site/)를 만들어 GitHub Pages 로 배포한다.
# 최초 1회: Settings → Pages → Build and deployment → Source: "GitHub Actions"
# 선택: Settings → Secrets → Actions 에 LAW_OC(법제처 OC) 를 넣으면 조례 목록을 자동 수집한다.
# 선택: Settings → Secrets → Actions 에 넣으면 켜지는 것 (값은 절대 레포에 적지 않는다)
# LAW_OC 법제처 조례 목록 자동 수집
# NAVER_CLIENT_ID, NAVER_CLIENT_SECRET '요즘 궁금해하는 주제' 순위에 검색 관심도 추가
on:
push:
branches: [main]
workflow_dispatch:
schedule:
- cron: "0 18 * * 0" # 매주 월요일 03:00 KST 데이터 갱신
- cron: "0 18 * * *" # 매일 03:00 KST: 순위·데이터 갱신 후 다시 공개

permissions:
contents: read
issues: read # 사이트 질문(라벨 from-site) 수를 세어 순위에 반영
pages: write
id-token: write

Expand All @@ -24,6 +27,8 @@ jobs:
runs-on: ubuntu-latest
env:
LAW_OC: ${{ secrets.LAW_OC }}
NAVER_CLIENT_ID: ${{ secrets.NAVER_CLIENT_ID }}
NAVER_CLIENT_SECRET: ${{ secrets.NAVER_CLIENT_SECRET }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
Expand All @@ -34,6 +39,10 @@ jobs:
- name: Refresh ordinance snapshots (법제처, optional)
if: ${{ env.LAW_OC != '' }}
run: python scripts/refresh_law_snapshots.py
- name: Refresh topic ranking (site questions + optional Naver DataLab)
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: python scripts/refresh_trends.py
- run: python site/build.py
- uses: actions/upload-pages-artifact@v3
with:
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ data/cache/
*.xlsx~
~$*

# Generated at build time (GitHub Actions)
catalog/snapshots/trends.json

# OS / editors
.DS_Store
Thumbs.db
Expand Down
89 changes: 46 additions & 43 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,66 +1,69 @@
# 기여 가이드 (CONTRIBUTING)
# 기여 가이드

GitHub 협업이 처음이라면 먼저 [`docs/ops/github-onboarding.md`](docs/ops/github-onboarding.md)를 따라 하세요.
GitHub가 처음이라면 [GitHub 따라 하기](docs/ops/github-onboarding.md)부터 보세요. 전체 흐름은 [멘티 참여 가이드](docs/ops/mentee-guide.md)에 있습니다.

## 1. 작업 방식: 조별 브랜치 (권장)
## 1. 한 사람, 한 폴더, 한 브랜치

| 방식 | 언제 | 비고 |
|---|---|---|
| **조직 저장소에서 브랜치** (권장) | 조직 초대를 수락한 멘티 | CI·리뷰·모니터링이 한 곳에서 보임 |
| Fork → PR | 초대 전이거나 외부 기여자 | PR 대상은 `main` |

- `main`은 보호 브랜치입니다. **직접 push 금지, PR로만 병합.**
- 브랜치 이름: `<조>/<작업>` — 예) `group3/plan`, `group3/fetch-kosis`, `group1/fix-report`
- 공통 코드(`core/`)는 `core/<작업>` 브랜치로, 먼저 이슈에서 논의한 뒤 수정합니다.
- 분석은 한 사람이 주제 하나를 맡아 `cases/<내 GitHub ID>-<주제>/` 폴더에서 합니다. 예: `cases/gildong-local-currency/`
- 브랜치 이름은 `<내 GitHub ID>/<작업>`입니다. 예: `gildong/plan`, `gildong/fetch`
- `main`에는 직접 올릴 수 없습니다. 모든 변경은 PR로 합칩니다.
- 조직 초대를 받기 전이거나 외부 기여자라면 fork 후 PR을 올려도 됩니다.

## 2. 폴더 소유권
## 2. 어디를 고치나

| 경로 | 소유 | 규칙 |
| 경로 | 누가 | 규칙 |
|---|---|---|
| `cases/<조>-<주제>/` | 해당 조 | 조 안에서 자유롭게. 다른 조 폴더는 수정하지 않음 |
| `core/` | 멘토·코어 메인테이너 | 이슈 → 합의 → PR. 테스트 필수 |
| `cases/_template/`, `app/`, `.github/`, `docs/` | 운영진 | 개선 제안은 이슈로 |
| `cases/<내ID>-<주제>/` | 폴더 주인 | 자유롭게. 남의 폴더는 고치지 않습니다 |
| `catalog/` | 누구나 | 새 데이터셋·이슈·주제 제안. 원본 페이지에서 확인한 값만 적습니다 |
| `core/`, `site/` | 멘토·메인테이너 | 먼저 이슈로 논의한 뒤 PR. 테스트 필수 |
| `.github/`, `docs/` | 운영진 | 개선 제안은 이슈로 |

소유자는 [`.github/CODEOWNERS`](.github/CODEOWNERS)로 자동 리뷰 요청됩니다.

## 3. 커밋 규칙 (Conventional Commits)
## 3. 커밋 메시지

```
<type>(<scope>): <요약, 50자 이내>
<종류>(<범위>): <요약, 50자 이내>
```

- type: `feat` 기능 · `fix` 버그 · `data` 수집/전처리 · `analysis` 추정/그림 · `docs` 문서 · `plan` plan.yaml · `test` · `chore`
- scope: 조 폴더명 또는 `core`, `app`
- 예) `plan(group3-youth-rent): 처치·대조 지역 정의`, `analysis(group3-youth-rent): DiD 1차 추정`
- 작은 단위로 자주 커밋하세요. 주 1회 이상 커밋이 활동 확인 기준입니다.
- 종류: `plan` 분석 계획 · `data` 수집 · `analysis` 추정·그림 · `docs` 문서 · `feat` 기능 · `fix` 버그 · `test` · `chore`
- 범위: 내 케이스 폴더 이름, 또는 `core`, `catalog`, `site`
- 예: `plan(gildong-local-currency): 처치·대조 지역 정의`

## 4. PR 흐름

1. 최신 `main`에서 브랜치 생성 → 작업 → `make check` 통과 확인
2. PR 생성 (템플릿 체크리스트 작성). 작업 중이면 **Draft PR**로 일찍 올리세요.
3. 리뷰: **승인 1명 + CI 통과** 시 병합 (조원 상호 리뷰 가능, `core/`는 코어 메인테이너 승인)
4. 병합 방식: **Squash merge** (PR 제목이 커밋 메시지가 되므로 규칙에 맞게)
5. 병합 후 브랜치 삭제, 로컬 `git switch main && git pull`
1. 최신 `main`에서 브랜치를 만들고 작업한 뒤 `make check`로 검사합니다.
2. PR을 올리고 템플릿 체크리스트를 채웁니다. 작업 중이면 Draft PR로 일찍 올리세요.
3. 멘토 또는 다른 멘티 1명 승인 + 자동 검사 통과 뒤 **Squash merge**로 합칩니다.
4. 합친 뒤에는 브랜치를 지우고 `git switch main && git pull`.

## 5. 분석 원칙 (리뷰에서 확인합니다)

## 5. 분석 원칙 (리뷰에서 확인)
- **`plan.yaml`을 결과보다 먼저 커밋합니다.** 나중에 바꾸면 커밋 메시지에 이유를 적습니다.
- 데이터 출처와 이용 조건(공공누리 유형 등)을 `plan.yaml`의 `data_sources`에 적습니다.
- 그림과 숫자는 `fetch.py` → `make flow` 실행으로 다시 만들 수 있어야 합니다.
- 가정이 깨지면 판정을 "판단 불가"로 두는 것도 좋은 결과입니다.

- **plan.yaml을 결과보다 먼저 커밋** (사전 등록). 이후 변경은 커밋 메시지에 이유를 적습니다.
- 데이터 출처·라이선스 명시 (공공누리 유형 등). 재배포 불가 원자료, 개인정보, API 키는 커밋 금지.
- 그림·수치는 `estimate.py` 실행으로 재현 가능해야 합니다.
- 가정이 깨지면 `abstention` 규칙에 따라 **결론을 보류**하는 것도 좋은 결과입니다.
## 6. 올리면 안 되는 것

## 6. 개발 환경
- API 키·인증값(`.env`, 법제처 OC 등). 레포 비밀값(Settings → Secrets)으로만 관리합니다.
- **원자료와 가공한 데이터 파일.** 데이터는 `fetch.py`로 각자 받게 합니다. 특히 공공누리 3·4유형(변경금지, 예: 에어코리아)과 KOSIS 자료의 가공본은 다시 배포하지 않습니다. 예외는 시뮬레이션 데이터와 법제처 조례 목록(조례는 저작권 보호 대상이 아님)입니다.
- 개인정보가 담긴 자료.
- GPL·AGPL 라이선스 패키지를 필수 의존성으로 추가하지 않습니다(예: `rdrobust`, `differences`, PolicyEngine, OpenFisca). 필요하면 선택 설치로 분리합니다. CI가 확인합니다.

## 7. 공식 결과가 아닙니다

이 프로젝트의 분석은 학습·연구용 오픈소스 결과물이며 정부·공공기관의 공식 평가나 통계가 아닙니다. 리포트와 PR 설명에 "정부 발표", "공식 결과"처럼 오해할 표현을 쓰지 않습니다.

## 8. 개발 환경

```bash
make install # 의존성 설치 (dev 포함)
make check # ruff + pytest — CI와 동일
make app # Streamlit 로컬 실행
make install # 의존성 설치
make check # 코드 검사 + 테스트 (CI와 같음)
make flow CASE=cases/<내ID>-<주제>
python site/build.py && python -m http.server -d _site # 사이트 미리보기
```

선택: `pre-commit install` 로 커밋 시 ruff 자동 실행.

## 7. 질문·제안
## 9. 질문과 제안

- 버그: 이슈 → `버그 리포트`
- 새 케이스 주제: 이슈 → `케이스 제안`
- 사이트 대화창에서 정리한 질문은 "이 대화를 제안으로 올리기" 버튼으로 이슈가 됩니다.
- 버그는 "버그 리포트", 새 분석 주제는 "케이스 제안" 이슈로 올립니다.
- 행동 강령: [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)
Loading
Loading