# 추커톤 2026 결과물 제출 — AI 에이전트 가이드

> **이 문서를 읽는 에이전트에게**
> 사용자가 "https://chuseokton2026.tagg.kr/agents 에 따라 추커톤 프로젝트 제출 진행해줘"라고 요청했다면, **먼저 0단계 안내를 보여 주고** 1~6단계를 순서대로 진행하세요.
>
> **원칙: 제출 내용은 제출자의 것이에요.** 제목, 설명, 썸네일, 사용한 도구, 배운 점은 **제출자가 정합니다.**
> 에이전트는 제출자가 **요청할 때만** 초안을 만들어요. 묻지 않고 지어내거나 만들어 넣지 마세요.
> 에이전트의 역할은 안내하고, 받은 내용을 정리하고, 파일을 묶고, 보안을 점검하고, 제출하는 거예요.

추커톤은 AI & Beyond 멤버들이 추석 연휴(9/24~9/27)에 AI 에이전트를 활용해 만든 사이드 프로젝트 이벤트예요. 제출된 프로젝트는 갤러리에 공개되고, 멤버들이 우수상·인기상에 투표합니다.

- Base URL: `https://chuseokton2026.tagg.kr`
- 제출 마감: 9/28(월) 자정 (KST)
- 사람용 웹 폼: https://chuseokton2026.tagg.kr/submit

---

## 0단계: 시작 안내 (가장 먼저)

작업 폴더를 **가볍게** 훑어보세요. 파일 목록, README, 배포 설정, git remote 정도만 보면 돼요. 그다음 **다른 작업을 하기 전에** 아래 안내를 그대로 보여 주세요. `[ ]` 부분만 훑어본 결과로 채우면 돼요.
질문은 **한 번에** 모아서 물어보세요. 하나씩 나눠 여러 번 묻지 마세요.

````markdown
## 🌕 추커톤 결과물 제출을 시작할게요

제출에 필요한 항목이에요. 내용은 모두 직접 정해 주시면 되고, 원하시면 제가 초안을 만들어 드릴 수 있어요.

| # | 항목 | 필수 | 공개 | 어떻게 |
|---|---|---|---|---|
| 1 | 이름 (참가 신청 때 쓴 이름) | ✅ | 공개 | 알려 주세요 |
| 2 | 비밀번호 (4자 이상, 수정할 때 필요) | ✅ | - | 정해 주세요 |
| 3 | 프로젝트 제목 | ✅ | 공개 | 알려 주세요 |
| 4 | 프로젝트 설명 (글 / 링크 / 파일) | ✅ | 공개 | 방식과 내용을 알려 주세요 · 초안 요청 가능 |
| 5 | 썸네일 (16:9 이미지) | 선택 | 공개 | 이미지가 있으면 경로를 알려 주세요 · 제작 요청 가능 · 없으면 기본 카드 |
| 6 | 결과물 (URL / 파일, 둘 다 가능) | ✅ | 공개 | 방식을 골라 주세요 · 파일 묶기는 제가 할게요 |
| 7 | 사용한 AI 도구/에이전트 | 선택 | 공개 | 알려 주세요 |
| 8 | 만들면서 배운 점 | 선택 | 공개 | 알려 주세요 |
| 9 | 모임 발표 의향 | 선택 | 🔒 운영자만 | 예 / 아니요 |

### 진행 순서
1. **지금**: 아래 질문에 답해 주세요. 모르거나 비워 둘 항목은 "건너뛰기"라고 하시면 돼요.
2. **정리**: 답해 주신 내용으로 제출물을 정리해요. 결과물 zip은 `chuseokton-submission/` 폴더에 만들고, 원본 파일은 건드리지 않아요.
3. **보안 점검**: `.env`, API 키, 개인정보가 공개 파일에 섞이지 않았는지 확인해요.
4. **미리보기**: 제출할 내용을 모두 보여 드려요. 확인해 주시기 전에는 제출하지 않아요.
5. **제출**: 제출하고 프로젝트 페이지 주소를 알려 드려요.

제출 마감은 **9/28(월) 자정**이고, 제출한 뒤에도 같은 이름과 비밀번호로 수정할 수 있어요.

### 알려 주세요
1. 이름:
2. 비밀번호 (처음 제출이면 새로 정해 주세요):
3. 프로젝트 제목:
4. 프로젝트 설명 (하나 이상):
   - 글: 직접 적어 주세요. 초안이 필요하면 "초안 써줘"라고 해 주세요.
   - 링크: 노션·블로그·README 등 주소
   - 파일: PDF, 발표자료, 스크린샷 등 경로
5. 썸네일: 이미지 경로 / "만들어줘" / 건너뛰기
6. 결과물 (하나 이상):
   - A. URL: [찾은 주소가 있으면 보여 주고 "이 주소가 맞나요?" / 없으면 "주소가 있으면 알려 주세요"]
   - B. 프로젝트 폴더 통째로 zip ([폴더 이름], .env·node_modules·.git 등은 빼고)
   - C. 특정 파일만 (어떤 파일인지 알려 주세요)
7. 사용한 AI 도구/에이전트 (건너뛰어도 돼요):
8. 만들면서 배운 점 (건너뛰어도 돼요):
9. 모임 발표 의향 (예 / 아니요):
````

- **작업 폴더에 프로젝트가 없다면** 질문에 "프로젝트 폴더 경로"를 추가하세요.
- **6번 A**에 GitHub 주소를 보여 줄 때, 저장소가 비공개일 수 있으면 다른 사람이 열 수 있는 공개 주소인지 확인해 달라고 하세요.
- **추천하지 마세요.** 선택지만 보여 주고 제출자가 고르게 하세요.

## 1단계: 이름과 비밀번호 확인

0단계에서 받은 이름으로 확인하세요.

```bash
curl -sS https://chuseokton2026.tagg.kr/api/mine -H 'content-type: application/json' -d '{"name":"홍길동"}'
```

| 응답 | 의미 | 할 일 |
|---|---|---|
| `403` | 참가 신청자 명단에 없음 | 이름을 다시 물어보세요. 계속 안 되면 운영자(이태극)에게 문의하라고 안내하세요. |
| `{"ok":true,"existing":false}` | 첫 제출 | 0단계에서 받은 비밀번호를 쓰세요. 4자 미만이면 다시 정해 달라고 하세요. |
| `401` | 이미 제출한 적 있음 | 0단계에서 받은 비밀번호를 넣어 `{"name":"...","password":"..."}`로 다시 호출하세요. 그래도 401이면 처음 제출할 때 정한 비밀번호를 다시 물어보세요. |
| `{"ok":true,"existing":true,"project":{...}}` | 기존 제출 내용 | 이번 요청은 **수정**이에요. 기존 값을 보여 주고, 무엇을 바꿀지 물어보세요. |

비밀번호는 절대 임의로 만들지 마세요.

## 2단계: 빠진 항목 확인

필수 항목(제목, 설명 1개 이상, 결과물 1개 이상)이 비어 있으면 **그 항목만 다시** 물어보세요. 선택 항목을 건너뛰었다면 그대로 비워 두세요.

## 3단계: 제출물 정리

제출자가 준 내용을 **그대로** 쓰세요. 맞춤법이나 문장을 고치고 싶으면 먼저 물어보세요.

### 제출자가 요청했을 때만 하는 일
- **설명 초안** ("초안 써줘"): 코드와 README를 읽고 초안을 써서 **먼저 보여 주고** 승인받으세요. 갤러리 카드에는 앞 3줄이 보이니 첫 문장에 무엇인지를 한 줄로 쓰세요.
- **썸네일 제작** ("만들어줘"): 16:9, 1600×900 PNG로 만드세요. 제목과 이모지를 넣은 HTML을 헤드리스 브라우저로 캡처하면 쉬워요. 만든 이미지를 보여 주고 승인받으세요.
- **스크린샷** ("스크린샷 찍어줘"): 실행 화면을 찍어 설명 파일로 넣으세요.
- **제목·도구·배운 점 초안**: 요청받았을 때만 제안하세요.

### 에이전트가 하는 일 (묻지 않아도 됨)
- **결과물 B (폴더 zip)**: `node_modules`, `.git`, `.env*`, 빌드 결과물, 캐시, 비밀 정보를 **뺀** 폴더를 `chuseokton-submission/`에 zip으로 묶으세요. 25MB를 넘으면 큰 파일 목록을 보여 주고 뺄지 물어보세요.
- **결과물 C (특정 파일)**: 지정받은 파일을 그대로 올리세요. 최대 5개, 파일당 25MB예요. 넘으면 운영자(이태극)에게 문의하라고 안내하세요.
- **설명 글이 길 때**: `chuseokton-submission/description.txt`로 저장해서 보내세요.
- **이미지 파일**: PNG/JPG/WEBP/GIF는 프로젝트 페이지에 이미지로 바로 보여요.

## 4단계: 보안 점검 (에이전트가 직접)

제출되는 파일과 URL은 **모두 공개돼요**. 보내기 전에 확인하세요.
- `.env`, API 키, 토큰, 비밀번호, 개인 연락처, 고객 데이터가 zip·스크린샷·설명에 들어가지 않았는지
- 스크린샷에 이메일, 결제 정보, 개인 메시지가 보이지 않는지

## 5단계: 사용자 확인 (반드시)

보내기 전에 아래 형식으로 요약해서 보여 주고 **"이대로 제출할까요?"** 라고 물어보세요. 사용자가 고쳐 달라는 곳이 있으면 고친 뒤 다시 보여 주세요. **명시적으로 확인받기 전에는 절대 제출하지 마세요.**
에이전트가 초안을 만든 항목에는 `(초안)` 표시를 붙이고, 비운 선택 항목은 `(없음)`으로 표시하세요.

```
[추커톤 제출 미리보기]
이름: 홍길동 (첫 제출 / 수정)
① 제목: ...
② 설명: (글 전문)
   설명 링크: ... / 설명 파일: screenshot-1.png, ...
③ 썸네일: thumbnail.png (1600×900)
④ 결과물 URL: ... / 결과물 파일: project-source.zip (1.2MB), ...
⑤ 사용한 AI 도구: ...
⑥ 배운 점: ... / 발표 의향: 예·아니요 (운영자만 봄)
```

## 6단계: 제출 (`POST /api/submit`)

`multipart/form-data`로 보내세요.

```bash
curl -sS https://chuseokton2026.tagg.kr/api/submit \
  -F name='홍길동' \
  -F password='사용자가 정한 비밀번호' \
  -F title='제출자가 정한 제목' \
  -F 'description=<chuseokton-submission/description.txt' \
  -F description_url='https://github.com/me/songpyeon#readme' \
  -F description_files=@chuseokton-submission/screenshot-1.png \
  -F thumbnail=@chuseokton-submission/thumbnail.png \
  -F url='https://songpyeon.example.com' \
  -F files=@chuseokton-submission/project-source.zip \
  -F tools='Claude Code' \
  -F retro='에이전트로 제출까지 해 보니 폼보다 빠르다' \
  -F present=no
```

설명 글은 `description.txt`로 저장해서 **`description=<파일`**로 보내세요. `<`는 파일 내용을 텍스트 값으로 보내고, `@`로 보내면 파일 첨부가 돼서 설명이 비어요. 따옴표로 감싸야 셸이 `<`를 리다이렉트로 해석하지 않아요.

성공하면 `{"ok":true,"created":true|false,"project":{...}}`가 와요.
**제출 후** 사용자에게 다음을 알려 주세요.
- 프로젝트 페이지: `https://chuseokton2026.tagg.kr/p/<URL 인코딩한 이름>`
- 수정하려면 같은 이름과 비밀번호로 다시 요청하면 된다는 것, 사람용 폼(`/submit`)에서도 고칠 수 있다는 것

---

## 참고: API 필드 전체

| 필드 | 필수 | 공개 | 설명 |
|---|---|---|---|
| `name` | ✅ | 공개 | 참가 신청 때 쓴 이름 |
| `password` | ✅ | - | 첫 제출 때 정한 비밀번호 (4자 이상) |
| `title` | ✅ | 공개 | 프로젝트 제목 |
| `description` | ○ | 공개 | 프로젝트 설명 글 |
| `description_url` | ○ | 공개 | 설명 링크 |
| `description_files` | ○ | 공개 | 설명 파일. 필드를 반복해서 최대 5개 |
| `thumbnail` | | 공개 | 썸네일 이미지 (PNG/JPG/WEBP/GIF, 16:9) |
| `url` | △ | 공개 | 결과물 링크 |
| `files` | △ | 공개 | 결과물 파일. 필드를 반복해서 최대 5개 |
| `tools` | | 공개 | 사용한 AI 도구/에이전트 |
| `retro` | | 공개 | 만들면서 배운 점 |
| `present` | | 운영자만 | 발표 의향: `yes` / `no` |

○ 설명은 셋 중 하나 이상 필요해요. △ 결과물은 둘 중 하나 이상 필요하고, 둘 다 보내도 돼요. 파일은 모두 파일당 25MB까지예요.

## 참고: 수정할 때

- **텍스트 필드** (`title`, `description`, `description_url`, `url`, `tools`, `retro`, `present`)는 매번 전부 다시 보내세요. 빠진 필드는 빈 값이 돼요. 1단계에서 받은 `project`의 기존 값을 쓰면 돼요.
- **파일** (`files`, `description_files`, `thumbnail`):
  - 보내지 않으면 기존 파일을 유지해요.
  - 새로 보내면 그 항목의 기존 파일 전체를 교체해요.
  - 기존 파일을 비우려면 `remove_files=1`, `remove_description_files=1`, `remove_thumbnail=1`을 보내세요.
- **파일 순서 지정 / 일부만 교체**: `files_order`(또는 `description_files_order`)에 JSON 배열을 보내세요.
  - 항목은 `"id:<기존 파일 id>"`와 `"new:<이번에 보낸 파일 순번(0부터)>"` 두 가지예요.
  - 기존 파일 id는 `project.files[].url`에서 `/f/` 뒤의 값이에요.
  - 배열에 없는 기존 파일은 삭제돼요.
  - 예: `-F files=@new.pdf -F 'files_order=["new:0","id:1a2b3c.png"]'`

## 참고: 에러

실패하면 `{"ok":false,"error":"한국어 메시지"}`가 와요. `error`는 사용자에게 그대로 전달하세요.

| 상태 | 의미 |
|---|---|
| 400 | 필수 항목 누락, URL 형식 오류 등 |
| 401 | 비밀번호 불일치 (잊었다면 운영자에게 초기화 요청) |
| 403 | 참가 신청자 명단에 없는 이름 |
| 413 | 파일이 25MB 초과 |

## 참고: 조회

- `GET /api/projects`: 공개된 전체 프로젝트 목록이에요. 제출이 반영됐는지 확인할 때 쓰세요.
