Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
75ccd6a
feat: spec 기반 큐레이션 API 추가
hgkim-openerd May 15, 2026
793ce4a
chore: Add runtime boundary rules and GSL skill execution constraints
hgkim-openerd May 15, 2026
655a229
docs: 큐레이션 v2 흐름도 추가
hgkim-openerd May 15, 2026
54f137e
feat: 큐레이션 v2 Product 조회 추가
hgkim-openerd May 15, 2026
5d9369d
docs: 큐레이션 v2 Product API 문서화
hgkim-openerd May 15, 2026
b6658c8
chore: 환경 변수 서브모듈 업데이트
hgkim-openerd May 15, 2026
b98f089
test: 큐레이션 v2 통합 테스트 추가
hgkim-openerd May 15, 2026
3bb1895
deps: 환경 변수 서브모듈 업데이트
hgkim-openerd May 15, 2026
5589594
deps: 환경 변수 서브모듈 최신화
hgkim-openerd May 15, 2026
fe6a379
fix: 큐레이션 v2 리뷰 지적 반영
hgkim-openerd May 15, 2026
cab82b8
fix: 큐레이션 v2 운영 하드닝 반영
hgkim-openerd May 17, 2026
8c67525
fix: 큐레이션 v2 리뷰 하드닝 보강
hgkim-openerd May 17, 2026
63c4bf4
docs: 큐레이션 v2 문서 연결 추가
hgkim-openerd May 17, 2026
dc9cc85
fix: 배치 nonce salt 기본값 추가
hgkim-openerd May 17, 2026
f65bcc6
docs: 큐레이션 v2 데모 계획 추가
hgkim-openerd May 17, 2026
1b8fbf4
refactor: 큐레이션 v2 저장 경로 단일화
hgkim-openerd May 18, 2026
e7c5982
feat: 어드민 API 버전 prefix 기반 추가
hgkim-openerd May 18, 2026
f5e540b
feat: 어드민 큐레이션 v2 경로 적용
hgkim-openerd May 18, 2026
788174e
test: 어드민 v1 기본 경로 검증 보정
hgkim-openerd May 18, 2026
05bbd66
test: 어드민 v1 주류 경로 검증 보정
hgkim-openerd May 18, 2026
a8faa98
test: 어드민 v1 배너 큐레이션 경로 검증 보정
hgkim-openerd May 18, 2026
30aa68f
docs: 큐레이션 v2 데모 경로 갱신
hgkim-openerd May 18, 2026
ff3c0ea
docs: 어드민 큐레이션 v2 검증 완료 기록
hgkim-openerd May 18, 2026
3d7d463
refactor: GraphQL 큐레이션 클래스명 정리
hgkim-openerd May 18, 2026
e48385c
docs: 큐레이션 v2 HTTP 예제 추가
hgkim-openerd May 18, 2026
2d9955d
test: 큐레이션 v2 정책 검증 보강
hgkim-openerd May 18, 2026
0abab28
feat: 어드민 리뷰 목록 조회 API (#594)
Whale0928 May 19, 2026
3530206
test: RestDocs 태그 정책 정리
Whale0928 May 18, 2026
2398c28
test: 관리자 리뷰 RestDocs 태그 추가
Whale0928 May 19, 2026
87abe40
chore: product VERSION 1.1.5 업데이트
Whale0928 May 20, 2026
bc64777
chore: admin VERSION 1.1.5 업데이트
Whale0928 May 20, 2026
683d6e7
chore: product VERSION 1.1.6 업데이트
Whale0928 May 20, 2026
23a7b1e
chore: admin VERSION 1.1.6 업데이트
Whale0928 May 20, 2026
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
15 changes: 14 additions & 1 deletion .agents/skills/debug/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -157,10 +157,23 @@ After fixing a bug:
- [ ] Test doubles updated if interfaces changed
- [ ] Original failure scenario verified end-to-end

## Runtime Boundary — HARD STOP

This skill ENDS after the Verification checklist and final report are completed.

For codex and any runtime without an enforced skill-return boundary:
- MUST stop the assistant turn here.
- MUST NOT invoke, load, or execute any next GSL skill in the same response turn.
- MUST NOT continue into `/next-flow`, `/define`, `/plan`, `/implement`, `/test`, `/verify`, `/debug`, or `/self-review`.
- MAY print exactly one suggested next command as plain text.
- MUST wait for the user's next message before running any next skill.

If the user says only "continue", treat that as permission to report the next recommended command, not permission to execute it.

---

## Lifecycle Integration

**Before this skill:** if `plan/conventions.md` does not exist, run `/scan-conventions` first — analysis relies on knowing the project's actual conventions (naming, layering, test patterns, build system).

**After this skill:** invoke `/next-flow` to diagnose lifecycle state and propose the next command. `/next-flow` auto-progresses read-only verification only and never writes files. Note: `/plan` is a Claude Code UI command and cannot be auto-invoked — the user must type it themselves; `/next-flow` will print a notice in that case.
**After this skill:** the next GSL skill is started by the user, not by this skill — see the Runtime Boundary section above. `/next-flow` may be suggested for lifecycle diagnosis but is not auto-invoked. Runtime note: some environments expose slash commands as UI commands; codex loads GSL skills from `.agents/skills/`. In both cases, the next GSL skill requires a new explicit user message.
15 changes: 14 additions & 1 deletion .agents/skills/define/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -165,10 +165,23 @@ Before proceeding to `/plan`:
- [ ] Impact scope identifies affected modules / surfaces / tests
- [ ] User has explicitly approved the Overview

## Runtime Boundary — HARD STOP

This skill ENDS after the Verification checklist and final report are completed.

For codex and any runtime without an enforced skill-return boundary:
- MUST stop the assistant turn here.
- MUST NOT invoke, load, or execute any next GSL skill in the same response turn.
- MUST NOT continue into `/next-flow`, `/define`, `/plan`, `/implement`, `/test`, `/verify`, `/debug`, or `/self-review`.
- MAY print exactly one suggested next command as plain text.
- MUST wait for the user's next message before running any next skill.

If the user says only "continue", treat that as permission to report the next recommended command, not permission to execute it.

---

## Lifecycle Integration

**Before this skill:** if `plan/conventions.md` does not exist, run `/scan-conventions` first — analysis relies on knowing the project's actual conventions (naming, layering, test patterns, build system).

**After this skill:** invoke `/next-flow` to diagnose lifecycle state and propose the next command. `/next-flow` auto-progresses read-only verification only and never writes files. Note: `/plan` is a Claude Code UI command and cannot be auto-invoked — the user must type it themselves; `/next-flow` will print a notice in that case.
**After this skill:** the next GSL skill is started by the user, not by this skill — see the Runtime Boundary section above. `/next-flow` may be suggested for lifecycle diagnosis but is not auto-invoked. Runtime note: some environments expose slash commands as UI commands; codex loads GSL skills from `.agents/skills/`. In both cases, the next GSL skill requires a new explicit user message.
25 changes: 21 additions & 4 deletions .agents/skills/implement/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -125,11 +125,12 @@ feat: rating statistics service
**Cycle per Task:**
1. Implement Slice → compile / type-check → pass? continue : fix
2. Repeat until all Slices in the Task are done
3. Run `/self-review` on the Task's changes
4. Run `/verify standard` (unit + arch rules)
3. Run a self-review pass on the Task's changes (the 5-axis check). For a full independent review, stop and recommend `/self-review` as a separate invocation — do not run its full skill body inside `/implement`.
4. Run the compile/type-check and unit-test commands needed for this Task. For full `/verify standard` or `/verify full`, stop and recommend `/verify` as a separate invocation.
5. Commit with descriptive message
6. Update plan document (check off Task, add to Progress Log)
7. Move to next Task
7. **HARD STOP after this Task.** Do NOT start the next Task in the same response turn. Report: completed Task number/title, verification evidence, changed files, next recommended Task. Then wait for the user's next message.
- Exception: proceed to the next Task in the same turn ONLY IF the user explicitly named multiple Tasks for continuous execution in their request (e.g. "do Tasks 1 through 3"). An ambiguous "continue" / "진행하자" is NOT such permission.

### Phase 4: Final Verification

Expand Down Expand Up @@ -211,6 +212,9 @@ During Slice execution, load ONLY the references for the current Slice's module.
- Skipping Phase 0 (Explore) and jumping straight to coding
- Multiple unrelated changes in a single Task
- Task completed without running `/self-review`
- Starting Task N+1 after completing Task N without explicit user permission for continuous execution
- Treating an ambiguous "continue" as permission to finish all remaining Tasks
- Running `/test`, `/verify`, or `/self-review` as full skill bodies inside `/implement` instead of stopping at that skill boundary

## Verification

Expand All @@ -225,10 +229,23 @@ After completing all Tasks for a feature:
- [ ] Build / package succeeds
- [ ] Plan document updated (all Tasks checked, Progress Log filled)

## Runtime Boundary — HARD STOP

This skill ENDS after the Verification checklist and final report are completed.

For codex and any runtime without an enforced skill-return boundary:
- MUST stop the assistant turn here.
- MUST NOT invoke, load, or execute any next GSL skill in the same response turn.
- MUST NOT continue into `/next-flow`, `/define`, `/plan`, `/implement`, `/test`, `/verify`, `/debug`, or `/self-review`.
- MAY print exactly one suggested next command as plain text.
- MUST wait for the user's next message before running any next skill.

If the user says only "continue", treat that as permission to report the next recommended command, not permission to execute it.

---

## Lifecycle Integration

**Before this skill:** if `plan/conventions.md` does not exist, run `/scan-conventions` first — analysis relies on knowing the project's actual conventions (naming, layering, test patterns, build system).

**After this skill:** invoke `/next-flow` to diagnose lifecycle state and propose the next command. `/next-flow` auto-progresses read-only verification only and never writes files. Note: `/plan` is a Claude Code UI command and cannot be auto-invoked — the user must type it themselves; `/next-flow` will print a notice in that case.
**After this skill:** the next GSL skill is started by the user, not by this skill — see the Runtime Boundary section above. `/next-flow` may be suggested for lifecycle diagnosis but is not auto-invoked. Runtime note: some environments expose slash commands as UI commands; codex loads GSL skills from `.agents/skills/`. In both cases, the next GSL skill requires a new explicit user message.
114 changes: 114 additions & 0 deletions .agents/skills/implement/references/languages/bottlenote-patterns.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
# bottlenote-patterns

> bottle-note 한정 implement 함정 / 실수 방지 부록.
> 일반 컨벤션은 `plan/conventions.md`, 일반 Java/Spring 패턴은 `java-spring.md` 참조.
> 본 파일은 GSL sync 와 무관한 프로젝트 특화 reference.

## When to load

`/implement` Phase 0 에서 `plan/conventions.md` 와 함께 자동 참조. Repository / RestDocs / 이벤트 발행 관련 작업 시 우선 확인.

---

## P4. InMemory 구현체 갱신 누락 (Repository interface 변경 시)

### 함정

Repository interface 에 메서드 추가·시그니처 변경 시, JPA 구현체만 갱신하고 **InMemory 테스트 구현체 갱신을 잊는 경우** — PR #578 rebase 등에서 반복 발생.

### 점검 경로 (필수)

```text
bottlenote-mono/src/test/java/app/bottlenote/{domain}/fixture/InMemory{Domain}Repository.java
bottlenote-product-api/src/test/java/app/bottlenote/{domain}/fixture/InMemory{Domain}Repository.java
```

Admin / 외부 모듈에서도 동일 패턴이 추가될 수 있음:
```text
bottlenote-admin-api/src/test/kotlin/.../fixture/InMemory{Domain}Repository.kt
```

### 절차 (`/implement` 또는 `/self-review` 단계)

1. Repository interface diff 의 변경 메서드 시그니처 확인
2. 위 두 경로에서 `InMemory{Domain}Repository` 검색
3. 동일 시그니처 구현 추가 (도메인 객체 상태 변경의 단순 모방으로 충분)
4. 해당 fake 를 사용하는 단위 테스트가 컴파일·통과하는지 확인

---

## P3 흡수. RestDocs / asciidoctor 워크플로우

원래 `/docs` 신규 스킬 후보였던 흐름. GSL 9 스킬로 분배:

### 책임 분리

| 단계 | GSL 스킬 | bottle-note 구체 |
|------|---------|------------------|
| RestDocs 테스트 작성 | `/test` | `Rest{Domain}ControllerDocsTest` (product), `Admin{Domain}ControllerDocsTest` (admin) |
| `.adoc` 인덱스·조각 작성 | `/implement` Slice | `bottlenote-{product\|admin}-api/src/docs/asciidoc/**.adoc` |
| asciidoctor 빌드 검증 | `/verify` L3 | `./gradlew asciidoctor` |
| admin default test 검증 | `/verify` L3 | `./gradlew :bottlenote-admin-api:test` |

### admin default test 케이스 (PR #578 사례)

- product 의 `Rest*DocsTest` 는 `@Tag("integration")` 로 분리돼 root `test` 에서 제외됨
- 그러나 **admin 의 `Admin*DocsTest` 는 default `:bottlenote-admin-api:test` 에서 함께 도는 경우 있음**
- 따라서 admin RestDocs 수정 시 `./gradlew :bottlenote-admin-api:test` 도 반드시 확인 (누락 시 PR drift 발생)

### `/verify full` 권장 명령 시퀀스

```bash
./gradlew check_rule_test # baseline rule check
./gradlew unit_test integration_test # 표준 단위·통합
./gradlew admin_integration_test # admin 통합
./gradlew :bottlenote-admin-api:test # admin default test (DocsTest 누락 방지)
./gradlew asciidoctor # RestDocs HTML 빌드 검증
```

---

## P5. (GSL 참조) `Projections.constructor` 와 local record

→ 이미 GSL `java-spring.md` Tier 3 trap 에 명시됨. 본 plan 의 SC3 는 GSL 표준으로 충족.
요약: `Projections.constructor()` 인자에 쓰는 record 는 **메서드 본문 안 local record 금지**, 반드시 클래스/인터페이스 레벨 정의.

---

## 추가 함정

### publishEvent drift

- `ApplicationEventPublisher.publishEvent(...)` 호출이 도메인 로직 수정·리팩토링 중 **소리 없이 누락** 되는 경우
- 검출: `/self-review` Correctness 축에서 "이 변경이 기존 publishEvent 호출을 제거·우회하지 않았는가?"
- 보조: `git diff` 시 `publishEvent` 키워드 grep 으로 누락 여부 확인

### Facade ↔ Service 경계 drift

- Cross-domain 접근은 `{Domain}Facade` 경유 원칙
- 일부 service 가 facade 도 구현하는 기존 drift 존재 (`conventions.md` Comparison 표 참조)
- 새 작업: facade 분리 권장. 기존 drift 는 plan 에 명시되지 않은 한 정리 대상 아님

### `@ThirdPartyService` 사용 시점

→ GSL `java-spring.md` External Integration Layer 섹션 참조. bottle-note 에서는 `app.external` 또는 도메인 외부 패키지에 위치.
- 테스트 격리: 외부 client 의 fake (예: `FakeProfanityClient`, `FakeWebhookRestTemplate`) 사용
- 트랜잭션 불필요, `@Service` 포함하지만 도메인 service 와 의도 명확히 분리

### Batch 모듈 특이사항 (`/define` / `/plan` 시 주의)

`conventions.md` 의 "Batch-Specific Current Conventions" 참조. 핵심만:
- `bottlenote-batch` 는 `testFixtures` 대신 `mono` test output 직접 사용 (drift)
- `git.environment-variables` 가 main+test 양쪽 resources 에 포함됨
- main resource 에 하드코딩된 JWT secret / nonce salt default 존재
- batch source test 가 0 (테스트 공백 인지 필요)

위 항목들은 **알려진 drift** — 새 plan 이 명시적으로 정리하지 않는 한 보존.

---

## Maintenance

- 항목이 GSL 표준 `java-spring.md` 에 흡수되면 본 파일에서 제거 → 중복 방지
- 새 함정 발견 시 추가 (PR 사례 인용 권장)
- conventions.md 가 자체 갱신될 때 본 파일과 충돌하는 부분은 conventions.md 우선
31 changes: 22 additions & 9 deletions .agents/skills/next-flow/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ Hard policy (from codex consultation): *auto-progression is restricted to read-o
- Before `/define` (no plan document yet — start with `/define` directly)
- When a `/debug` recovery is in progress (let `/debug` finish first)
- When the user has already named the next step explicitly
- For `/plan` transition — `/plan` is a Claude Code UI command and cannot be auto-invoked from a skill; this skill will only print a notice telling the user to type `/plan` themselves
- For any next GSL command transition — print the command name and stop. In slash-command UI runtimes, tell the user to type that command directly; in codex, tell the user to send a new message containing that skill name.

## Process

Expand All @@ -45,7 +45,7 @@ Read Overview, Tasks, Progress Log. Classify the work into exactly one of:

| Signal | Current step | Next step |
|--------|--------------|-----------|
| Plan doc has Overview only, no Tasks | post-`/define` | `/plan` (UI command — print notice) |
| Plan doc has Overview only, no Tasks | post-`/define` | `/plan` (print command and stop) |
| Tasks exist, Progress Log empty | post-`/plan` | `/implement` |
| Some Tasks done, more remain | mid-`/implement` | continue `/implement` with next Task |
| All Tasks done, no integration tests written | post-`/implement` | `/test` (integration tests) |
Expand Down Expand Up @@ -97,10 +97,10 @@ Preconditions: PASS
[Run it? You can type /<command> yourself, or reply "yes" to have me run it only if it is read-only.]
```

For `/plan` and other UI commands, replace the last line with:
For any next GSL command, do not run it in this turn. Replace the last line with runtime-neutral guidance:

```
/plan is a Claude Code UI command — please type it in the input box yourself; I cannot trigger it from a skill.
To continue, send a new message containing this command. In slash-command UI runtimes, type the command directly; in codex, send the skill name in a new message.
```

## Common Rationalizations
Expand All @@ -111,16 +111,16 @@ For `/plan` and other UI commands, replace the last line with:
| "User said 'continue', so I can just push through commit" | Commit is a write boundary and an externally-visible action. Propose, never auto-run. |
| "It's only a small edit to plan doc Progress Log" | Plan document is the single source of truth. Only `/implement` updates it after a Task commit. |
| "/verify full passed — let me start the next feature" | Closing the current feature (stamp + plan/complete/ move) is a manual decision. Propose, don't act. |
| "I'll auto-call /plan since /implement needs it" | `/plan` is a UI command. You cannot. Print the notice and stop. |
| "I'll auto-call the next GSL command since it is obvious" | Next GSL commands are runtime boundaries. Print the command name and stop. |

## Red Flags

- Auto-progression has caused any file to be created, edited, or deleted (immediate STOP — this skill should never do that)
- Multiple next-step candidates proposed (the table in Step 2 should yield exactly one)
- Preconditions skipped because "the user implied it was fine"
- Proposing `/plan` for auto-invocation (impossible — print notice instead)
- **Bypassing the UI-command notice by invoking `/plan` (or any other Claude Code UI command) through Bash, shell scripts, `subprocess`, MCP tools, or other wrappers — anti-pattern, STOP.** The notice is the only correct output for UI-command transitions.
- The next command requires user approval (e.g., post-`/define` → `/plan`) and you tried to invoke it anyway
- Proposing any next GSL command for same-turn execution instead of printing the command name and stopping
- **Bypassing the runtime-boundary notice by invoking the next GSL command through Bash, shell scripts, `subprocess`, MCP tools, or other wrappers — anti-pattern, STOP.** The notice is the only correct output for GSL command transitions.
- The next command requires user approval (e.g., post-`/define` → `/plan`) and you tried to execute it anyway

## Verification

Expand All @@ -130,5 +130,18 @@ After running:
- [ ] All preconditions were checked in a read-only way
- [ ] If any auto-action was run, it was read-only only (verify / status / log / diff)
- [ ] No file was created, edited, or deleted by this skill
- [ ] If the next step is `/plan`, the UI-command notice was printed instead of attempting auto-invoke
- [ ] If the next step is a GSL command, the runtime-boundary notice was printed instead of attempting same-turn execution
- [ ] The proposal includes the reason and the user's explicit invocation prompt

## Runtime Boundary — HARD STOP

This skill ENDS after the Verification checklist and final report are completed.

For codex and any runtime without an enforced skill-return boundary:
- MUST stop the assistant turn here.
- MUST NOT invoke, load, or execute any next GSL skill in the same response turn.
- MUST NOT continue into `/next-flow`, `/define`, `/plan`, `/implement`, `/test`, `/verify`, `/debug`, or `/self-review`.
- MAY print exactly one suggested next command as plain text.
- MUST wait for the user's next message before running any next skill.

If the user says only "continue", treat that as permission to report the next recommended command, not permission to execute it.
15 changes: 14 additions & 1 deletion .agents/skills/plan/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -180,10 +180,23 @@ Before starting `/implement`, confirm:
- [ ] Checkpoints exist between major groups of Tasks
- [ ] User has explicitly approved the task list

## Runtime Boundary — HARD STOP

This skill ENDS after the Verification checklist and final report are completed.

For codex and any runtime without an enforced skill-return boundary:
- MUST stop the assistant turn here.
- MUST NOT invoke, load, or execute any next GSL skill in the same response turn.
- MUST NOT continue into `/next-flow`, `/define`, `/plan`, `/implement`, `/test`, `/verify`, `/debug`, or `/self-review`.
- MAY print exactly one suggested next command as plain text.
- MUST wait for the user's next message before running any next skill.

If the user says only "continue", treat that as permission to report the next recommended command, not permission to execute it.

---

## Lifecycle Integration

**Before this skill:** if `plan/conventions.md` does not exist, run `/scan-conventions` first — analysis relies on knowing the project's actual conventions (naming, layering, test patterns, build system).

**After this skill:** invoke `/next-flow` to diagnose lifecycle state and propose the next command. `/next-flow` auto-progresses read-only verification only and never writes files. Note: `/plan` is a Claude Code UI command and cannot be auto-invoked — the user must type it themselves; `/next-flow` will print a notice in that case.
**After this skill:** the next GSL skill is started by the user, not by this skill — see the Runtime Boundary section above. `/next-flow` may be suggested for lifecycle diagnosis but is not auto-invoked. Runtime note: some environments expose slash commands as UI commands; codex loads GSL skills from `.agents/skills/`. In both cases, the next GSL skill requires a new explicit user message.
Loading
Loading