Skip to content

Commit 8e95913

Browse files
dev-wooyeon박은우
authored andcommitted
feat(content): 에세이 공개 전환과 이력서 그리드 갱신 (#114)
* feat(content): publish revised essays and resume * fix(site): address PR review feedback --------- Co-authored-by: 박은우 <noah@bag-eun-uui-MacBookAir.local>
1 parent 7802428 commit 8e95913

12 files changed

Lines changed: 787 additions & 679 deletions

File tree

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
---
2+
name: blog-title-review
3+
description: Review, generate, and choose Ark blog post titles. Use when evaluating title candidates for posts/**/index.mdx and sibling meta.json, when the user is stuck choosing a title, or when a draft needs a click-worthy but accurate title that fits the first three paragraphs.
4+
---
5+
6+
# Blog Title Review
7+
8+
## Workflow
9+
10+
1. Read `docs/blog-quality-guide.md`, the target `index.mdx`, and the sibling
11+
`meta.json` before judging a repository post. If the post is not in the
12+
workspace, use the text the user provided.
13+
2. Preserve `category`, `contentType`, `slug`, and publication state unless the
14+
user explicitly asks for edits.
15+
3. Extract a title brief before proposing titles:
16+
- target reader and reading situation
17+
- the post's concrete object, event, or tension
18+
- the emotional stake or practical promise
19+
- the strongest first-three-paragraph hook
20+
- the current title and why it works or fails
21+
4. Score existing user candidates first when they exist, then add better
22+
alternatives only when useful.
23+
5. Evaluate the title and opening as one unit. If a candidate depends on a hook
24+
that the first three paragraphs do not pay off, flag the required opening
25+
change instead of pretending the title is ready.
26+
6. Do not edit files unless the user explicitly asks for implementation.
27+
28+
## Title Principles
29+
30+
- Prefer a specific unanswered question over a complete summary.
31+
- Use concrete nouns from the post before abstract virtues.
32+
- Create tension through contrast, self-recognition, reversal, or specificity.
33+
- Let the title be click-worthy, but keep the promise payable by the intro.
34+
- Check word texture. Reject words whose military, corporate, clinical, or
35+
overly visible metaphorical register clashes with the essay's emotional tone.
36+
- Avoid titles that sound like generic self-help, corporate slogans, product
37+
reviews, or manipulative bait.
38+
- Avoid over-weighting SEO when the post is an essay; the title still needs a
39+
human reason to click.
40+
41+
## Candidate Patterns
42+
43+
Generate candidates across multiple patterns when the user needs options:
44+
45+
- Collision: combine two unlike elements that the post genuinely connects.
46+
- Confession: expose the private pressure, mistake, or need behind the post.
47+
- Reversal: turn an expected belief into the post's real conclusion.
48+
- Object-led: let a concrete object carry the emotional promise.
49+
- Direct problem: name the reader's problem in plain language.
50+
- Quiet essay: use a restrained line when click pressure would cheapen the tone.
51+
52+
## Scorecard
53+
54+
Use 1-5 scores in 0.5 increments.
55+
56+
- `click`: likelihood that the title earns a click from the intended reader.
57+
- `fit`: accuracy to the full post, not only one vivid sentence.
58+
- `introFit`: whether the first three paragraphs pay off the title.
59+
- `specificity`: concrete nouns, situations, or stakes.
60+
- `emotion`: felt tension without melodrama.
61+
- `novelty`: freshness compared with generic essay titles.
62+
- `texture`: whether the key words feel natural in the post's emotional register.
63+
- `arkTone`: fit with Ark's direct, reflective, engineering-adjacent voice.
64+
- `baitRisk`: risk of overpromising or misframing the post; lower is better.
65+
66+
When ranking titles, prioritize high `click`, `fit`, and `introFit`, then use
67+
`baitRisk` as a veto. A high-click title with high bait risk should be marked as
68+
usable only after an intro rewrite.
69+
70+
## Output Format
71+
72+
Return:
73+
74+
```markdown
75+
## Title Brief
76+
- reader:
77+
- promise:
78+
- tension:
79+
- current title:
80+
81+
## Recommendation
82+
1. `...` - ...
83+
2. `...` - ...
84+
3. `...` - ...
85+
86+
## Scorecard
87+
| Title | Click | Fit | Intro Fit | Specificity | Emotion | Novelty | Texture | Ark Tone | Bait Risk | Note |
88+
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- |
89+
90+
## Opening Adjustment
91+
...
92+
```
93+
94+
Keep the output shorter when the user asks for a quick choice. Omit
95+
`Opening Adjustment` when every recommended title already matches the opening.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
interface:
2+
display_name: "Blog Title Review"
3+
short_description: "블로그 제목 후보를 점수화해 더 쉽게 선택합니다"
4+
default_prompt: "Use $blog-title-review to evaluate title candidates for a draft blog post."

docs/README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# 문서 인덱스
22

3-
Last updated: 2026-07-13
3+
Last updated: 2026-07-18
44

55
이 인덱스는 현재 코드베이스와 함께 유지해야 하는 문서만 추적한다. 계속
66
업데이트할 문서가 아니라면 삭제하거나, 오래 남겨야 하는 결정만 ADR로 옮긴다.
@@ -16,14 +16,16 @@ Last updated: 2026-07-13
1616
## 유지 대상 문서
1717

1818
- `docs/adr/README.md`
19-
- `docs/adr/*.md`
19+
- `docs/adr/*.md` (도메인별 UI 경계와 같이 오래 유지될 결정 포함)
2020
- `docs/adr/0019-use-content-first-typography-scale.md`
2121
- `docs/adr/0020-use-runtime-daily-views-for-popular-feed.md`
2222
- `docs/adr/0021-load-heavy-mdx-visualizations-on-demand.md`
2323
- `docs/adr/0022-default-new-posts-to-private.md`
2424
- `docs/adr/0023-run-the-release-quality-gate-in-ci.md`
2525
- `docs/adr/0024-use-latest-only-home-feed.md`
2626
- `docs/adr/0025-use-node-runtime-for-og-image-route.md`
27+
- `docs/adr/0026-use-repo-local-title-review-skill.md`
28+
- `docs/adr/0027-use-resume-specific-editorial-grid.md`
2729
- `docs/blog-quality-guide.md`
2830
- `docs/database/db-schema.md`
2931
- `docs/database/supabase-view-count.sql`
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# 0026. 제목 선택은 repo-local skill로 보조한다
2+
3+
Date: 2026-07-03
4+
Status: Accepted
5+
6+
## 배경
7+
8+
블로그 글을 작성할 때 제목 선택은 매번 오래 걸리는 반복 작업이다. 제목은 본문
9+
요약만으로 충분하지 않고, 클릭할 이유와 첫 세 문단에서 지켜야 할 독자 약속을
10+
함께 평가해야 한다.
11+
12+
기존 `blog-growth-review` skill은 글 형식, 공개 가능성, 품질 점수를 다루지만
13+
제목 후보의 클릭 유도력, 낚시 위험, 도입부 연결성을 독립적으로 비교하지는
14+
않는다.
15+
16+
## 결정
17+
18+
- repo-local skill `.agents/skills/blog-title-review`를 추가한다.
19+
- 제목 후보는 `click`, `fit`, `introFit`, `specificity`, `emotion`,
20+
`novelty`, `arkTone`, `baitRisk` 축으로 비교한다.
21+
- 제목은 본문 전체뿐 아니라 첫 세 문단과 한 세트로 평가한다.
22+
- 첫 버전은 Codex skill로 운영하고, 안정된 뒤 필요할 때 `tooling/` CLI나
23+
메타데이터 보조 필드로 확장한다.
24+
25+
## 결과
26+
27+
- 제목 고민을 감으로만 하지 않고 후보별 장단점을 반복 가능한 형식으로 비교할
28+
수 있다.
29+
- 클릭 유도력이 높은 제목을 쓰더라도 도입부가 그 약속을 받는지 함께 점검한다.
30+
- 공개 UI나 콘텐츠 schema에는 아직 새 필드를 추가하지 않는다.
31+
32+
## 검토한 대안
33+
34+
- `blog-growth-review`에 제목 평가를 합치기: 글 전체 품질 리뷰와 제목 선택은
35+
초점과 출력 형식이 달라 skill이 비대해진다.
36+
- 바로 CLI를 만들기: 제목 평가는 LLM 판단과 문맥 해석 비중이 높아, 점수 축이
37+
안정되기 전에는 스크립트보다 skill이 빠르게 개선하기 쉽다.
38+
- `meta.json`에 제목 점수를 저장하기: 제목은 발행 전 의사결정 성격이 강해,
39+
현재는 영속 메타데이터보다 리뷰 출력으로 충분하다.
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# 0027. 이력서에는 콘텐츠 밀도에 맞춘 에디토리얼 그리드를 사용한다
2+
3+
Date: 2026-07-15
4+
Status: Accepted
5+
6+
## 배경
7+
8+
이력서 페이지는 기존에 넓은 소개 영역, 3열 본문, 카드에 가까운 목록 표현을 함께
9+
사용했다. 경력과 프로젝트의 정보량은 충분했지만, 채용 담당자가 이름, 전문 분야,
10+
연락처, 최근 경력을 빠르게 훑을 때 시선이 여러 블록으로 나뉘었다.
11+
12+
zero.log의 이력서 레이아웃은 얇은 개인 인덱스에서 정체성, 소개, 링크를 1:3:2
13+
그리드로 나누고, 이후의 경력 내용을 텍스트 중심으로 정리한다. Ark 이력서는
14+
프로젝트별 문제·결정·구현·결과처럼 더 높은 정보 밀도를 다뤄야 하므로 이 구조를
15+
그대로 복제할 수는 없다.
16+
17+
## 결정
18+
19+
- `resume/ui/pages/ResumePage.tsx` 안에서만 이력서 전용 에디토리얼 그리드를
20+
적용한다.
21+
- 상단은 이름 1열, 전문성과 소개 3열, 연락처 2열의 1:3:2 그리드로 구성한다.
22+
- 본문은 보조 정보 2열과 경력·프로젝트 4열을 사용한다. 모바일에서는 경력 내용이
23+
보조 정보보다 먼저 읽히도록 유지한다.
24+
- 기존 `canvas`, `ink`, `home-accent` token과 Pretendard·JetBrains Mono의 역할을
25+
재사용한다. 새 전역 token, 컴포넌트 라이브러리, 자동 모션은 추가하지 않는다.
26+
- route, metadata, 이력서 데이터 모델, 연락처 링크, 프로젝트·경력의 정보 순서는
27+
변경하지 않는다.
28+
29+
## 결과
30+
31+
- 데스크톱에서는 빠른 스캔을 위한 비대칭 헤더와 경력 중심 열을 제공한다.
32+
- 모바일과 보조기술에서는 경력 내용을 먼저 읽고, 뒤이어 프로필과 기술 정보를
33+
확인할 수 있다.
34+
- 카드를 늘리지 않고 여백, 명확한 텍스트 위계, 필요한 구분선으로 긴 이력서의
35+
밀도를 관리한다.
36+
- 홈의 에디토리얼 표현이 다른 도메인 화면으로 무분별하게 번지는 것을 막고,
37+
이력서 UI 책임은 `resume/` 도메인 안에 유지한다.
38+
39+
## 검토한 대안
40+
41+
- zero.log의 전체 화면 최소 인덱스를 그대로 복제하기: 시각적 밀도는 낮아지지만,
42+
Ark의 상세 프로젝트와 경력 근거를 충분히 전달하기 어렵다.
43+
- 기존 3열 카드형 구조를 유지하고 여백만 조정하기: 변경 위험은 낮지만, 상단의
44+
스캔 순서와 경력 중심 위계를 개선하지 못한다.
45+
- AppShell과 모든 콘텐츠 페이지에 같은 그리드를 적용하기: 전체 사이트의
46+
일관성은 생기지만, 블로그 독서와 이력서 검증은 다른 정보 구조를 필요로 한다.
47+
48+
## 검증
49+
50+
- `ResumePage` 컴포넌트 테스트로 이름, 전문 분야, 핵심 연락처, 경력·프로젝트
51+
섹션과 데스크톱 6열 그리드를 검증한다.
52+
- `npm run test:components`로 관련 도메인과 UI 회귀를 확인한다.
53+
- `npm run build`로 타입 검사와 `/resume` 정적 페이지 생성을 확인한다.

docs/adr/README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Architecture Decision Records
22

3-
Last updated: 2026-07-13
3+
Last updated: 2026-07-18
44

55
이 디렉터리는 커밋 히스토리에서 복원한 아키텍처 의사결정을 기록한다.
66
ADR은 AI 협업 가이드와 별개의 문서다. 사람이 결정했든 AI가 초안을
@@ -43,6 +43,8 @@ ADR은 AI 협업 가이드와 별개의 문서다. 사람이 결정했든 AI가
4343
| [0023](0023-run-the-release-quality-gate-in-ci.md) | Accepted | 배포 품질 gate를 CI에서 실행한다 |
4444
| [0024](0024-use-latest-only-home-feed.md) | Accepted | 홈 피드를 최신순 단일 경로로 유지한다 |
4545
| [0025](0025-use-node-runtime-for-og-image-route.md) | Accepted | OG 이미지 route에 Node.js runtime을 사용한다 |
46+
| [0026](0026-use-repo-local-title-review-skill.md) | Accepted | 제목 선택은 repo-local skill로 보조한다 |
47+
| [0027](0027-use-resume-specific-editorial-grid.md) | Accepted | 이력서에는 콘텐츠 밀도에 맞춘 에디토리얼 그리드를 사용한다 |
4648

4749
## 작성 조건
4850

0 commit comments

Comments
 (0)