docs(10_Wiki): Topic_Business/General/Graphic/Programming을 Topics/ 하위로 이동

최상위 10_Wiki/Topic_*였던 4개 카테고리 폴더를 10_Wiki/Topics/Topic_* 로 재배치.
콘텐츠 변경 없음(순수 폴더 이동) — Topics/ 하위 나머지 폴더는 이미 지난 커밋에서
전부 정리된 상태(잔존 항목은 에이전트 운영 상태 및 사용자가 보존을 요청한
업데이트0615/무제 3.canvas 뿐).
This commit is contained in:
Antigravity Agent
2026-07-05 00:44:01 +09:00
parent e9cbf23ab5
commit 9a135bd19d
6127 changed files with 0 additions and 0 deletions
@@ -0,0 +1,125 @@
---
id: wiki-2026-0508-2026-04-21-stability-and-optimiz
title: 2026 04 21 Stability and Optimization Report
category: 10_Wiki/Topics
status: needs_review
canonical_id: self
aliases: []
duplicate_of: none
source_trust_level: A
confidence_score: 0.92
tags: [uncategorized]
raw_sources: []
last_reinforced: 2026-05-08
github_commit: pending
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
tech_stack:
language: unspecified
framework: unspecified
---
# ⚡ Skybound: [[Stability]] & [[Optimization]] Report (2026-04-21)
## 1. Executive Summary (요약)
대규모 교전 및 아이템 사용 시 발생하는 성능 저하와 런타임 크래시를 해결하기 위한 엔진 안정성 보강 작업을 수행하였습니다.
## 2. Key Optimization Areas (주요 최적화 영역)
### 💥 Particle Effect [[Management]] (이펙트 제어)
- **Problem**: 폭탄 사용 시 수천 개의 파편(Shard) 객체가 생성되어 FPS 급락.
- **[[Solution]]**:
- **Hard Cap**: 최대 파티클 개수를 500개로 제한.
- **TTL (Time To Live) Acceleration**: 파티클 소멸 속도를 6배 상향(0.1 -> 0.6)하여 자원 회수 주기를 단축.
### 🛡️ Runtime [[Robustness]] (런타임 강건성)
- **Problem**: 존재하지 않는 엔티티 배열 접근으로 인한 `TypeError`.
- **Solution**:
- `GameRenderer` 내 모든 순회 로직에 옵셔널 체이닝(`?.`) 및 기본값(`|| []`) 처리 의무화.
- 인터페이스(`types.ts`)와 실제 상태 객체 간의 동기화 정밀 검수.
### 🔄 Entity Pool Intelligence (엔티티 풀 고도화)
- **Problem**: ID(String)와 객체 참조 간의 혼선으로 인한 해제 실패.
- **Solution**:
- `EntityManager``releaseById` 메서드 추가.
- 객체 여부와 관계없이 안전하게 리소스를 반납할 수 있는 추상화 레이어 구축.
## 3. Post-Mortem (사후 분석)
- **Silo Effect**: 엔티티 매니저 도입과 같은 대규모 인프라 변경 시, 관련 인터페이스를 동시에 업데이트하지 않아 발생한 '느슨한 계약(Loose Contract)' 문제가 근본 원인이었습니다.
- **Guideline**: 시스템 간 데이터 교환 방식(ID 기반 vs 참조 기반)을 프로젝트 표준으로 확정하고 준수해야 합니다.
---
**Related Cluster**: [[05_Project_Issues/[[2026-04-21-Engine-Stability-and-Optimization]]|Performance Tuning]]
**Status**: Verified by QA 🫡
## 📌 한 줄 통찰 (The Karpathy Summary)
> *(TODO: 한 문장으로 핵심 통찰을 작성. "X는 Y 조건에서 Z 효과를 낸다" 구조 권장.)*
## 📖 구조화된 지식 (Synthesized Content)
**추출된 패턴:**
> *(TODO)*
**세부 내용:**
- *(TODO)*
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
**언제 이 지식을 쓰는가:**
- *(TODO)*
**언제 쓰면 안 되는가:**
- *(TODO)*
## 🧪 검증 상태 (Validation)
- **정보 상태:** needs_review
- **출처 신뢰도:** A
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
## 🧬 중복 검사 (Duplicate Check)
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
- **처리 방식:** UPDATE (자동 정규화)
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
- **과거 데이터와의 충돌:** 없음
- **정책 변화:** 없음
## 🔗 지식 연결 (Graph)
- **Parent:** [[10_Wiki/Topics]]
- **Related:** *(TODO: 최소 2개)*
- **Opposite / Trade-off:** *(TODO)*
- **Raw Source:** 직접 입력
## 🕓 변경 이력 (Changelog)
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|------|-----------|-----------|--------|
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
## 💻 코드 패턴 (Code Patterns)
**패턴 1:** *(TODO: 이 프로젝트 컨벤션 반영한 구조 스켈레톤)*
```text
# TODO
```
## 🤔 의사결정 기준 (Decision Criteria)
**선택 A를 써야 할 때:**
- *(TODO)*
**선택 B를 써야 할 때:**
- *(TODO)*
**기본값:**
> *(TODO)*
## ❌ 안티패턴 (Anti-Patterns)
- **[안티패턴]:** *(TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
@@ -0,0 +1,132 @@
---
id: wiki-2026-0508-2026-04-22-engine-logic-optimiza
title: 2026 04 22 Engine Logic Optimization Report
category: 10_Wiki/Topics
status: needs_review
canonical_id: self
aliases: []
duplicate_of: none
source_trust_level: A
confidence_score: 0.92
tags: [uncategorized]
raw_sources: []
last_reinforced: 2026-05-08
github_commit: pending
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
tech_stack:
language: unspecified
framework: unspecified
---
# ⚙️ Engine [[Logic]] [[Optimization]] & Modernization
**Category:** [[Architecture]] / [[Physics]]
**Status:** Completed (v12.1)
**Related:** [[01_Core_Engine/[[Game-Engine-Loop-and-System-Orchestration]]|Engine Loop]], [[03_Boss[[_system]]s/[[Boss_Encounter_and_Timeline_Design]]|Boss Encounter Design]]
---
## 1. Tactical Logical Modernization
Skybound의 초기 '무작위성' 중심 로직을 '의도된 연출' 중심으로 전환한 핵심 최적화 내역입니다.
### 🛡️ Reactive Stat Sync (실시간 스탯 동기화)
- **메커니즘**: `useGameStore.subscribe`를 통해 장비 교체나 영구 업그레이드 발생 시, 엔진의 `effectiveStats`를 런타임에 즉시 재계산.
- **효과**: "인벤토리에서 공격력을 올렸는데 왜 바로 강해지지 않는가?"라는 모순을 해결.
### 🛰️ Priority-Based Spawning (우선순위 기반 스폰)
- **Logic**: 하드캡(`MAX_ENEMIES_HARD_CAP`) 도달 시, `ELITE` 이상의 등급은 일반 적(`NORMAL`)을 **강제 퇴거(Despawn)**시키고 자리를 확보함.
- **효과**: 물량에 밀려 보스가 등장하지 못하는 치명적인 결함 방지.
---
## 2. Combat Physics & HP Revamp
### 📏 100-Base HP[[ system]]
- **구형**: 하트 5칸 기반의 단순 생명력 시스템 (회복 및 성장 가시성 낮음).
- **신규**: 100 기준의 체력 시스템으로 통합하여 퍼센트 단위 회복 및 영구 HP 업그레이드 반영이 가능하도록 구조화.
### 💥 Mutual Knockback (물리 충돌)
- 단순히 겹칠 때 대미지를 입는 방식에서 벗어나, 충돌 벡터(`vx`, `vy`)를 기반으로 서로 밀려나는 물리 작용 구현.
- **타격감**: 기체 간 충돌 시의 '묵직함' 확보.
---
## 3. Engagement Compression
- **Blitz Mode**: 보스 출현 시간을 **60초**로 단축하여 파밍 효율 극대화.
- **Standard Mode**: 보스 조우 타임라인을 **2분**으로 압축하여 검증 및 플레이 텐션 강화.
---
**Last Updated:** 2026-04-22 🫡
## 📌 한 줄 통찰 (The Karpathy Summary)
> *(TODO: 한 문장으로 핵심 통찰을 작성. "X는 Y 조건에서 Z 효과를 낸다" 구조 권장.)*
## 📖 구조화된 지식 (Synthesized Content)
**추출된 패턴:**
> *(TODO)*
**세부 내용:**
- *(TODO)*
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
**언제 이 지식을 쓰는가:**
- *(TODO)*
**언제 쓰면 안 되는가:**
- *(TODO)*
## 🧪 검증 상태 (Validation)
- **정보 상태:** needs_review
- **출처 신뢰도:** A
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
## 🧬 중복 검사 (Duplicate Check)
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
- **처리 방식:** UPDATE (자동 정규화)
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
- **과거 데이터와의 충돌:** 없음
- **정책 변화:** 없음
## 🔗 지식 연결 (Graph)
- **Parent:** [[10_Wiki/Topics]]
- **Related:** *(TODO: 최소 2개)*
- **Opposite / Trade-off:** *(TODO)*
- **Raw Source:** 직접 입력
## 🕓 변경 이력 (Changelog)
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|------|-----------|-----------|--------|
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
## 💻 코드 패턴 (Code Patterns)
**패턴 1:** *(TODO: 이 프로젝트 컨벤션 반영한 구조 스켈레톤)*
```text
# TODO
```
## 🤔 의사결정 기준 (Decision Criteria)
**선택 A를 써야 할 때:**
- *(TODO)*
**선택 B를 써야 할 때:**
- *(TODO)*
**기본값:**
> *(TODO)*
## ❌ 안티패턴 (Anti-Patterns)
- **[안티패턴]:** *(TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
@@ -0,0 +1,131 @@
---
id: wiki-2026-0508-2026-04-22-engine-stability-audi
title: 2026 04 22 Engine Stability Audit
category: 10_Wiki/Topics
status: needs_review
canonical_id: self
aliases: []
duplicate_of: none
source_trust_level: A
confidence_score: 0.92
tags: [uncategorized]
raw_sources: []
last_reinforced: 2026-05-08
github_commit: pending
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
tech_stack:
language: unspecified
framework: unspecified
---
# 🔍 Skybound 엔진 구조 정밀 감사 보고서 (V12.1)
> **카테고리**: Skybound, Software [[Reliability]], Governance & Reliability
> **상태**: ✅ 감사 완료 (Audited)
> **최종 업데이트**: 2026-04-22
---
## 📌 개요 (Overview)
엔진 안정성에 대한 의구심(코드 잘림, 상태 단절 등)이 제기됨에 따라, 전체 시스템 파이프라인(ECS-like Update, Zustand Sync, Progression Flow)을 전수 조사하여 아키텍처적 건전성을 검증함.
## 📊 감사 요약 (Audit Summary)
| 이슈 항목 | 실제 상태 | 심각도 | 판정 결과 |
| :--- | :--- | :--- | :--- |
| **#1 Engine Execution Gap** | **정상**`ctx` 객체 완전 구성됨 | 🟢 Low | 단순 파일 읽기 초과로 인한 오판 |
| **#2 [[State]]-[[Physics]] Disconnect** | **정상**`setExp/setLevel` 액션 완결 | 🟢 Low | 15프레임 Dirty Checking 동기화 확인 |
| **#3 Gimmick Manager 빈 껍데기** | **부분 유효** — 구현 완료, 타입 불일치 1건 | 🟡 Med | `spawnParticle` 인자 불일치 수정 완료 |
| **#4 Collision-to-EXP 미연결** | **정상** — Combat → Progression 연결됨 | 🟢 Low | Gem 수집부터 카드 생성까지 연결 확인 |
## 🛠️ 정밀 분석 (Detailed [[Analysis]])
### 1. 엔진 컨텍스트 (`ctx`) 및 루프 구조
- **Context Inte[[Grit]]y**: `useGameEngine.ts` 내에서 플레이어, 상태, 입력, 엔티티 매니저 및 각종 스폰 함수가 `ctx` 객체에 완전히 맵핑되어 각 시스템에 전달되고 있음.
- **Loop Flow**: `StageDirector``System [[Logic]]``Combat/Progression``Renderer` 순의 고전적 ECS 파이프라인이 매 프레임(60FPS) 정상 작동함.
### 2. 상태 관리 브릿지 (Store Sync)
- **Zustand Interface**: 엔진 내부 상태(`state.currentExp` 등)와 외부 UI 스토어(`useGameStore`) 간의 데이터 동기화는 `useGameEngine.ts`에서 15프레임마다 수행되는 브릿지 로직을 통해 효율적으로 관리됨 (불필요한 React Re-render 방지).
### 3. 실제 수정 사항 (Bug Fix)
- **GravityGimmick.ts**: `ctx.spawnParticle` 호출 시 엔진 시그니처와 불일치하는 5번째 인자(`'DIR'`)가 전달되는 문제를 식별하여 제거함. 이는 시스템 오류를 유발하지는 않으나 타입 정결성을 위해 조치됨.
## 📋 최종 결론
Skybound 엔진은 **구조적으로 건강하며, 모든 핵심 파이프라인이 완전히 구현된 상태**임. 향후 확장을 위한 아키텍처적 기반(Intent Protocol, Signal Pattern)이 견고하게 구축되어 있음을 확인함.
---
**승인인**: AI 개발부장 코다리 🫡
**관련 문서**: 02_[[Architecture]]_[[Principles]], [[Visual_Feedback_Signal_Pattern]]
## 📌 한 줄 통찰 (The Karpathy Summary)
> *(TODO: 한 문장으로 핵심 통찰을 작성. "X는 Y 조건에서 Z 효과를 낸다" 구조 권장.)*
## 📖 구조화된 지식 (Synthesized Content)
**추출된 패턴:**
> *(TODO)*
**세부 내용:**
- *(TODO)*
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
**언제 이 지식을 쓰는가:**
- *(TODO)*
**언제 쓰면 안 되는가:**
- *(TODO)*
## 🧪 검증 상태 (Validation)
- **정보 상태:** needs_review
- **출처 신뢰도:** A
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
## 🧬 중복 검사 (Duplicate Check)
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
- **처리 방식:** UPDATE (자동 정규화)
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
- **과거 데이터와의 충돌:** 없음
- **정책 변화:** 없음
## 🔗 지식 연결 (Graph)
- **Parent:** [[10_Wiki/Topics]]
- **Related:** *(TODO: 최소 2개)*
- **Opposite / Trade-off:** *(TODO)*
- **Raw Source:** 직접 입력
## 🕓 변경 이력 (Changelog)
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|------|-----------|-----------|--------|
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
## 💻 코드 패턴 (Code Patterns)
**패턴 1:** *(TODO: 이 프로젝트 컨벤션 반영한 구조 스켈레톤)*
```text
# TODO
```
## 🤔 의사결정 기준 (Decision Criteria)
**선택 A를 써야 할 때:**
- *(TODO)*
**선택 B를 써야 할 때:**
- *(TODO)*
**기본값:**
> *(TODO)*
## ❌ 안티패턴 (Anti-Patterns)
- **[안티패턴]:** *(TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
@@ -0,0 +1,167 @@
---
id: wiki-2026-0508-datacollector-engine-stalled-loop-guard
title: Datacollector Engine Processed Count and Stalled Loop Guard
category: 10_Wiki/Topics
status: verified
canonical_id: self
aliases: [Datacollector Stalled Loop, Engine Processed Counter Guard]
duplicate_of: none
source_trust_level: A
confidence_score: 0.9
verification_status: applied
tags: [skybound, datacollector, engine, watchdog, observability]
raw_sources: []
last_reinforced: 2026-05-10
github_commit: pending
tech_stack:
language: typescript
framework: node
---
# Datacollector Engine Processed Count and Stalled Loop Guard
## 매 한 줄
> **"매 long-running engine loop 의 stalled 상태 detection — processed counter delta + heartbeat watchdog"**. Skybound datacollector 의 processed 카운터 정체 issue 가 silent failure 로 이어졌고, watchdog 패턴 + structured heartbeat metric 으로 fix. 매 production-grade ingestion service 의 default pattern.
## 매 핵심
### 매 문제
- Engine main loop 이 exception 없이 중단 (외부 API stall, lock contention, GC pause).
- `processed_count` metric 이 freeze 됨에도 process alive → health-check pass.
- 결과: hours-long silent stall, downstream backlog explosion.
### 매 해결 axes
- **Counter delta watchdog**: N seconds 마다 delta == 0 면 alarm.
- **Heartbeat token**: loop iteration 마다 last_tick = now() update.
- **Bounded queue + timeout**: 매 await 에 timeout, fail-fast.
- **Structured log per iteration**: tracing 의 base.
### 매 응용
1. Skybound telemetry ingestion engine.
2. Game session replay processor.
3. Generic ETL pipeline worker.
## 💻 패턴
### Counter delta watchdog
```typescript
class StalledLoopGuard {
private lastProcessed = 0;
private lastChange = Date.now();
constructor(
private getCount: () => number,
private maxStallMs = 30_000,
private onStall: (info: { sinceMs: number; count: number }) => void,
) {}
tick() {
const cur = this.getCount();
if (cur !== this.lastProcessed) {
this.lastProcessed = cur;
this.lastChange = Date.now();
return;
}
const sinceMs = Date.now() - this.lastChange;
if (sinceMs > this.maxStallMs) {
this.onStall({ sinceMs, count: cur });
}
}
}
```
### Heartbeat token in main loop
```typescript
let lastTick = Date.now();
const heartbeat = setInterval(() => {
if (Date.now() - lastTick > 15_000) {
logger.error({ stalledMs: Date.now() - lastTick }, "engine loop stalled");
metrics.increment("engine.stall");
}
}, 5_000);
while (running) {
lastTick = Date.now();
const batch = await source.next({ timeoutMs: 10_000 });
if (!batch.length) { await sleep(250); continue; }
await Promise.all(batch.map(processOne));
processedCount += batch.length;
metrics.gauge("engine.processed", processedCount);
}
```
### Awaited timeout wrapper
```typescript
async function withTimeout<T>(p: Promise<T>, ms: number, label: string): Promise<T> {
return await Promise.race([
p,
new Promise<T>((_, rej) => setTimeout(() => rej(new Error(`timeout:${label}`)), ms)),
]);
}
```
### Stall-aware health endpoint
```typescript
app.get("/healthz", (_req, res) => {
const stalledMs = Date.now() - lastTick;
if (stalledMs > 30_000) return res.status(503).json({ ok: false, stalledMs });
res.json({ ok: true, processedCount, stalledMs });
});
```
### Auto-restart supervisor
```typescript
guard = new StalledLoopGuard(
() => processedCount,
60_000,
({ sinceMs }) => {
logger.fatal({ sinceMs }, "stall threshold exceeded — exiting for systemd restart");
process.exit(2);
},
);
setInterval(() => guard.tick(), 5_000);
```
### Stall metric for alerting (Prometheus)
```typescript
// engine_stall_seconds gauge
const stallGauge = new Gauge({ name: "engine_stall_seconds", help: "..." });
setInterval(() => {
stallGauge.set((Date.now() - lastTick) / 1000);
}, 1_000);
```
## 매 결정 기준
| 상황 | Approach |
|---|---|
| Single-process worker | heartbeat + exit(2), supervisor restart |
| Multi-tenant scheduler | per-tenant counter delta guard |
| External API source | per-call timeout + circuit breaker |
| Brief idle expected | exempt idle from stall (separate metric) |
**기본값**: heartbeat token + counter delta watchdog + supervisor restart.
## 🔗 Graph
- 부모: [[Observability]]
- 변형: [[Circuit Breaker]] · [[Liveness Probe]]
- 응용: [[Skybound Knowledge Hub]]
- Adjacent: [[Heartbeat]]
## 🤖 LLM 활용
**언제**: long-running ingestion / engine loop 의 silent stall detection 설계 시.
**언제 X**: short-lived request handler, batch jobs with natural exit.
## ❌ 안티패턴
- **Process alive == healthy**: liveness != progress. counter delta 가 truth.
- **Exception-only error path**: silent stall 은 throw 안 함.
- **Unbounded await**: timeout 없는 외부 call 은 무한 stall vector.
- **Restart without diagnostics**: stall 의 root cause 안 잡고 restart 만 하면 reoccur.
## 🧪 검증 / 중복
- Verified (Skybound production incident 2026-04-25 + watchdog pattern 의 standard literature).
- 신뢰도 A.
## 🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-04-25 | Original incident note |
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — full FULL spec rewrite with watchdog patterns |
@@ -0,0 +1,150 @@
---
id: wiki-2026-0508-skybound-low-level-first-upgrade-offer-balance
title: Skybound Low Level First Upgrade Offer Balance
category: 10_Wiki/Topics
status: verified
canonical_id: self
aliases: [First Upgrade Offer, Low Level Upgrade Pool, Skybound Onboarding Balance]
duplicate_of: none
source_trust_level: A
confidence_score: 0.9
verification_status: applied
tags: [skybound, balance, upgrade, onboarding, game-design]
raw_sources: []
last_reinforced: 2026-05-10
github_commit: pending
tech_stack:
language: typescript
framework: skybound-engine
---
# Skybound Low Level First Upgrade Offer Balance
## 매 한 줄
> **"매 first upgrade offer at low level 은 player retention 의 critical pivot"**. New player 의 첫 choice 가 dopamine arc 를 set — pool composition, rarity weight, anti-streak guard 의 tuning 의 결합이 30-day retention curve 의 ±15% delta 를 만든다. 매 modern roguelite 의 onboarding axiom.
## 매 핵심
### 매 문제 (incident 2026-04-26)
- Low-level first upgrade offer pool 이 너무 wide → new player 가 useless filler 만 받음.
- 결과: D1 retention drop, "didn't understand the game" 의 churn.
### 매 fix axes
- **Curated low-level pool**: level ≤ 3 일 때 power-fantasy 만.
- **Anti-streak guard**: 직전 offered card repeat 방지.
- **Rarity bias**: first offer 의 common-uncommon mix, no rare/legendary (saved for milestone).
- **Telemetry**: per-card pick rate per level bracket.
### 매 응용
1. Skybound first-run experience.
2. Roguelite tutorial pacing.
3. F2P gacha banner curation.
## 💻 패턴
### Curated low-level pool
```typescript
const LOW_LEVEL_POOL: UpgradeId[] = [
"damage_up", "fire_rate_up", "projectile_count", "magnet_radius", "move_speed",
];
function rollFirstOffer(level: number, history: UpgradeId[]): UpgradeId[] {
const pool = level <= 3
? LOW_LEVEL_POOL
: ALL_UPGRADES.filter((u) => u.minLevel <= level);
return sample3WithoutReplacement(pool, history);
}
```
### Anti-streak guard
```typescript
function sample3WithoutReplacement(pool: UpgradeId[], recent: UpgradeId[]): UpgradeId[] {
const recentSet = new Set(recent.slice(-6));
const filtered = pool.filter((u) => !recentSet.has(u));
const candidates = filtered.length >= 3 ? filtered : pool;
return shuffleAndTake(candidates, 3);
}
```
### Rarity bias by level
```typescript
type Rarity = "common" | "uncommon" | "rare" | "legendary";
const RARITY_WEIGHTS: Record<number, Record<Rarity, number>> = {
1: { common: 0.85, uncommon: 0.15, rare: 0, legendary: 0 },
2: { common: 0.70, uncommon: 0.28, rare: 0.02, legendary: 0 },
5: { common: 0.50, uncommon: 0.35, rare: 0.13, legendary: 0.02 },
};
function rollRarity(level: number, rng: RNG): Rarity {
const weights = RARITY_WEIGHTS[Math.min(level, 5)] ?? RARITY_WEIGHTS[5];
return weightedSample(weights, rng);
}
```
### Telemetry hook
```typescript
function recordOfferShown(level: number, options: UpgradeId[], picked: UpgradeId) {
metrics.increment(`upgrade.offer.shown.lv${level}.${picked}`);
options.filter((o) => o !== picked).forEach((skipped) =>
metrics.increment(`upgrade.offer.skipped.lv${level}.${skipped}`),
);
}
```
### Pity timer (no rare in 10 offers → guarantee)
```typescript
function applyPity(state: OfferState, rolled: Upgrade): Upgrade {
if (rolled.rarity === "common" || rolled.rarity === "uncommon") {
state.commonStreak += 1;
if (state.commonStreak >= 10) {
state.commonStreak = 0;
return pickRandom(POOL.filter((u) => u.rarity === "rare"));
}
} else {
state.commonStreak = 0;
}
return rolled;
}
```
### Reroll currency mechanic
```typescript
function rerollOffer(state: PlayerState, currentOffers: UpgradeId[]): UpgradeId[] {
if (state.rerollTokens <= 0) throw new Error("no reroll tokens");
state.rerollTokens -= 1;
return rollFirstOffer(state.level, [...state.history, ...currentOffers]);
}
```
## 매 결정 기준
| 상황 | Approach |
|---|---|
| Brand new player (D0) | curated pool + no rare/legendary |
| Returning player (level ≥ 5) | full pool + rarity bias |
| Skill-tree heavy game | gate by class/build |
| Short run (< 5 min) | tighter pool, no pity |
**기본값**: level-gated pool + anti-streak + rarity bias by level + per-card telemetry.
## 🔗 Graph
- 부모: [[게임 밸런싱|Game Balance]]
- 응용: [[Skybound Knowledge Hub]]
## 🤖 LLM 활용
**언제**: roguelite / vampire-survivors-like upgrade offer pool tuning 시.
**언제 X**: deterministic build games (Slay the Spire 의 path is curated differently).
## ❌ 안티패턴
- **Uniform pool from level 1**: new player 가 filler 받고 confused.
- **No anti-streak**: 같은 card 3번 연속 → "RNG broken" perception.
- **Legendary at level 1**: peak experience 가 too early → arc collapse.
- **No telemetry**: pick rate 없으면 tuning blind.
## 🧪 검증 / 중복
- Verified (Skybound balance pass 2026-04-26 + Vampire Survivors / Brotato design analysis).
- 신뢰도 A.
## 🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-04-26 | Original balance note |
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — FULL spec rewrite with patterns + telemetry |
@@ -0,0 +1,167 @@
---
id: wiki-2026-0508-skybound-skill-slot-limit-weapon5-passive5
title: Skybound Skill Slot Limit Weapon 5 Passive 5
category: 10_Wiki/Topics
status: verified
canonical_id: self
aliases: [Skill Slot Cap, 5+5 Build Constraint, Skybound Build Limit]
duplicate_of: none
source_trust_level: A
confidence_score: 0.9
verification_status: applied
tags: [skybound, build, slots, balance, game-design]
raw_sources: []
last_reinforced: 2026-05-10
github_commit: pending
tech_stack:
language: typescript
framework: skybound-engine
---
# Skybound Skill Slot Limit Weapon 5 Passive 5
## 매 한 줄
> **"매 build constraint = creative pressure"**. 5 weapon + 5 passive cap 은 player 의 every choice 를 meaningful 하게 — unlimited 면 평균화, limited 면 build identity. 매 vampire-survivors-genre 의 canonical structure 의 Skybound adaptation.
## 매 핵심
### 매 디자인 의도
- **Decision pressure**: 6번째 offer 시 swap-or-skip 의 active choice.
- **Build identity**: 5+5 슬롯 = recognizable archetype (DPS, support, tank, etc.).
- **Evolution gates**: weapon + passive pair → evolved form. cap 이 evolution 의 prerequisite scaffolding.
- **Run length pacing**: cap reached 시점이 mid-run pivot.
### 매 enforcement
- UI affordance: full slot → "replace?" modal.
- Server-side validation: client-trusted slot count 의 X.
- Save-state schema: fixed-size arrays of length 5.
### 매 응용
1. Skybound weapon/passive system.
2. Roguelite build crafting.
3. Generic inventory cap pattern.
## 💻 패턴
### Slot data model
```typescript
const MAX_WEAPONS = 5;
const MAX_PASSIVES = 5;
interface PlayerBuild {
weapons: (WeaponInstance | null)[]; // length === MAX_WEAPONS
passives: (PassiveInstance | null)[]; // length === MAX_PASSIVES
}
function emptyBuild(): PlayerBuild {
return {
weapons: Array(MAX_WEAPONS).fill(null),
passives: Array(MAX_PASSIVES).fill(null),
};
}
```
### Add-or-upgrade resolution
```typescript
function applyOffer(build: PlayerBuild, offer: Upgrade): "added" | "leveled" | "needs_replace" {
const slots = offer.kind === "weapon" ? build.weapons : build.passives;
const existingIdx = slots.findIndex((s) => s?.id === offer.id);
if (existingIdx >= 0) {
slots[existingIdx]!.level += 1;
return "leveled";
}
const emptyIdx = slots.findIndex((s) => s === null);
if (emptyIdx >= 0) {
slots[emptyIdx] = newInstance(offer);
return "added";
}
return "needs_replace";
}
```
### Replace flow
```typescript
function replaceSlot(
build: PlayerBuild,
kind: "weapon" | "passive",
index: number,
offer: Upgrade,
): void {
const slots = kind === "weapon" ? build.weapons : build.passives;
if (index < 0 || index >= slots.length) throw new Error("bad slot");
// optionally: track replaced item for telemetry / refund
metrics.increment(`build.replaced.${slots[index]?.id ?? "empty"}`);
slots[index] = newInstance(offer);
}
```
### Offer pool with slot awareness
```typescript
function rollOffer(build: PlayerBuild, level: number): UpgradeId[] {
const owned = new Set([
...build.weapons.filter(Boolean).map((w) => w!.id),
...build.passives.filter(Boolean).map((p) => p!.id),
]);
const weaponsFull = build.weapons.every((w) => w !== null);
const passivesFull = build.passives.every((p) => p !== null);
const eligible = ALL_UPGRADES.filter((u) => {
if (owned.has(u.id) && !u.canLevel) return false;
if (u.kind === "weapon" && weaponsFull && !owned.has(u.id)) return false;
if (u.kind === "passive" && passivesFull && !owned.has(u.id)) return false;
return u.minLevel <= level;
});
return sampleN(eligible, 3);
}
```
### Evolution gate check
```typescript
function checkEvolutions(build: PlayerBuild): EvolutionId[] {
return EVOLUTIONS.filter((evo) => {
const w = build.weapons.find((s) => s?.id === evo.weaponId);
const p = build.passives.find((s) => s?.id === evo.passiveId);
return w && w.level >= w.maxLevel && p !== undefined;
}).map((evo) => evo.id);
}
```
### Save-state validator (Zod)
```typescript
import { z } from "zod";
const BuildSchema = z.object({
weapons: z.array(WeaponSchema.nullable()).length(MAX_WEAPONS),
passives: z.array(PassiveSchema.nullable()).length(MAX_PASSIVES),
});
```
## 매 결정 기준
| 상황 | 슬롯 cap |
|---|---|
| Vampire-survivors clone | 6+6 (canonical) or 5+5 (tighter) |
| Skybound | **5+5** — pacing fits 15-min runs |
| Deck-builder | no slot cap (deck size = cap) |
| Hero shooter | per-class fixed slots |
**기본값**: 5+5 with replace modal + evolution gate.
## 🔗 Graph
- 응용: [[Skybound Knowledge Hub]]
## 🤖 LLM 활용
**언제**: roguelite slot / build cap design + offer pool integration 시.
**언제 X**: open-ended sandbox (Minecraft 류) — slot cap 이 antipattern.
## ❌ 안티패턴
- **Soft cap (warn only)**: player 가 cap 무시 → balance breaks.
- **Client-only enforcement**: cheat vector.
- **Variable cap mid-run**: build planning 의 ruin.
- **No replace UI**: cap 도달 시 offer 가 dead → frustration.
## 🧪 검증 / 중복
- Verified (Skybound design doc 2026-04-26 + Vampire Survivors 6+6 reference).
- 신뢰도 A.
## 🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-04-26 | Original design note |
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — FULL spec rewrite with slot system patterns |
@@ -0,0 +1,126 @@
---
id: wiki-2026-0508-boss-combat-stability-fix-log
title: Boss Combat Stability Fix Log
category: 10_Wiki/Topics
status: needs_review
canonical_id: self
aliases: []
duplicate_of: none
source_trust_level: A
confidence_score: 0.92
tags: [uncategorized]
raw_sources: []
last_reinforced: 2026-05-08
github_commit: pending
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
tech_stack:
language: unspecified
framework: unspecified
---
# 🕵️ Skybound: Boss Combat [[Stability]] Fix Log (2026-04-23)
## 1. Issue Overview (이슈 개요)
- **Problem**: 보스 기체의 체력이 0이 되었음에도 불구하고 파괴되지 않고 게임이 정지되거나, `STAGE_CLEAR` 페이즈로 전환되지 않는 결함 발생.
- **Occurrence**: 특정 페이즈(BOSS_INTRO) 또는 특정 무기 조합에서 보스 처치 시 간헐적 발생.
## 2. Root Cause [[Analysis]] (원인 분석)
### 🔍 [[Logic]]al Flaws
1. **Scope Restriction**: 기존 사망 판정 로직이 `BOSS` 페이즈 내부에만 존재하여, `BOSS_INTRO` 연출 도중 보스가 파괴될 경우 이를 감지하지 못함.
2. **Entity Lifecycle**: 보스 엔티티 파괴 후에도 `[[State]].boss` 참조가 남아있어, 렌더러와 AI 시스템이 유령 객체를 계속 업데이트하려고 시도함.
3. **HUD Desync**: 보스의 실제 HP와 HUD의 게이지 바 업데이트 주기가 일치하지 않아 유저에게 혼동을 줌.
## 3. Implemented Fixes (수정 사항)
### 🛠️ Core Engine Modification
- **Unified Death Check**: `StageDirectorSystem.checkBossDefeat()` 메서드로 로직을 통합하여 모든 보스 관련 페이즈에서 사망을 실시간 감지하도록 수정.
- **Explicit Nullification**: 보스 파괴 즉시 `state.boss = null`을 수행하여 시스템의 불필요한 참조를 원천 차단.
- **Feedback Reinforcement**:
- 보스 사망 시 8개의 순차적 폭발(`Explosion`) 생성.
- 화면 흔들림(`SHAKE`) 강도 증가 및 지속 시간 조정.
### 📊 HUD Synchronization
- `useGameEngine.ts` 루프 내에 HP 퍼센트(`hp / maxHp`) 동기화 로직 추가.
## 4. Verification (검증 결과)
- **Test Case 1**: 보스 등장 애니메이션 도중 처치 시 정상적으로 스테이지 클리어 전환 확인. (Pass)
- **Test Case 2**: 보스 사망 후 렌더러의 Null 참조 에러 발생 여부 확인. (Pass)
- **Test Case 3**: HUD HP 바 실시간 동기화 확인. (Pass)
---
**Related Cluster**: [[05_Project_Issues/2026-04-21_Stability_and_[[Optimization]]_Report|Stability & Optimization]]
**Status**: Resolved & Wikified 🫡
## 📌 한 줄 통찰 (The Karpathy Summary)
> *(TODO: 한 문장으로 핵심 통찰을 작성. "X는 Y 조건에서 Z 효과를 낸다" 구조 권장.)*
## 📖 구조화된 지식 (Synthesized Content)
**추출된 패턴:**
> *(TODO)*
**세부 내용:**
- *(TODO)*
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
**언제 이 지식을 쓰는가:**
- *(TODO)*
**언제 쓰면 안 되는가:**
- *(TODO)*
## 🧪 검증 상태 (Validation)
- **정보 상태:** needs_review
- **출처 신뢰도:** A
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
## 🧬 중복 검사 (Duplicate Check)
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
- **처리 방식:** UPDATE (자동 정규화)
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
- **과거 데이터와의 충돌:** 없음
- **정책 변화:** 없음
## 🔗 지식 연결 (Graph)
- **Parent:** [[10_Wiki/Topics]]
- **Related:** *(TODO: 최소 2개)*
- **Opposite / Trade-off:** *(TODO)*
- **Raw Source:** 직접 입력
## 🕓 변경 이력 (Changelog)
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|------|-----------|-----------|--------|
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
## 💻 코드 패턴 (Code Patterns)
**패턴 1:** *(TODO: 이 프로젝트 컨벤션 반영한 구조 스켈레톤)*
```text
# TODO
```
## 🤔 의사결정 기준 (Decision Criteria)
**선택 A를 써야 할 때:**
- *(TODO)*
**선택 B를 써야 할 때:**
- *(TODO)*
**기본값:**
> *(TODO)*
## ❌ 안티패턴 (Anti-Patterns)
- **[안티패턴]:** *(TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
@@ -0,0 +1,138 @@
---
id: wiki-2026-0508-campaign-and-dual-loop-system
title: Campaign and Dual Loop System
category: 10_Wiki/Topics
status: needs_review
canonical_id: self
aliases: []
duplicate_of: none
source_trust_level: A
confidence_score: 0.92
tags: [uncategorized]
raw_sources: []
last_reinforced: 2026-05-08
github_commit: pending
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
tech_stack:
language: unspecified
framework: unspecified
---
# ♾️ Campaign & Dual-Loop [[Architecture]]
**Category:** Core[[ system]] / Economy
**Status:** Implemented (v12.1)
**Related:** [[04_Mechanics_Progression/InGame_Progression[[_system]]|In-Game Progression]], [[04_Mechanics_Progression/[[Meta_Economy_Growth_Loop]]|Meta-Economy]]
---
## 1. Concept: The Dual-Loop [[Strategy]]
Skybound는 두 가지 서로 다른 성격의 플레이 루프를 유기적으로 결합하여 지속적인 동기부여와 성장을 도모한다.
### A. Blitz Loop (Farming)
- **성격**: 무한 경쟁, 자원 획득 중심.
- **목표**: 최대한 많은 [[04_Mechanics_Progression/Meta_Economy_Growth_Loop|Gold]]와 모듈 파편을 획득.
- **연계**: 여기서 벌어들인 골드는 캠페인 모드의 난이도를 낮추는 결정적인 자원이 된다.
### B. Campaign Loop (Standard)
- **성격**: 기승전결이 있는 시나리오 기반 도전.
- **목표**: 8단계의 스테이지를 클리어하여 세계관을 확장하고 고유 보상을 획득.
- **연계**: 클리어 시 더 높은 등급의 크래프팅 도면과 특수 기체(Airframe)를 해금.
---
## 2. Core Components
### 🛰️ StageManager (Orchestrator)
스테이지의 진행 상태와 모드 간의 데이터를 브릿징하는 싱글톤 시스템.
- **Stage Persistence**: 클리어한 스테이지 정보를 브라우저 Local[[Storage]]에 영구 보존.
- **Tactical [[Support]]**: Blitz에서 번 500G를 소모하여 다음 스테이지 보스의 방어력을 10% 삭감 (최대 중첩 가능).
### ⏳ Dynamic Timeline Scaling
스테이지 번호에 따라 엔진의 난이도 계수(`Difficulty Multiplier`)를 실시간 조정.
- **Scaling Formula**: `1.0 + (stageIndex * 0.35)`
- **Stage 1**: 1.0x (입문)
- **Stage 8**: 3.45x (극한의 도전)
---
## 3. Technical Implementation
- **Data Source**: `StageManager.ts`
- **UI Interaction**: `HangarOverlay.tsx`, `ResultCard.tsx`
- **[[Logic]] Guard**: `useGameEngine.ts` (일시정지 동기화 보강)
---
**Last Updated:** 2026-04-22 🫡
## 📌 한 줄 통찰 (The Karpathy Summary)
> *(TODO: 한 문장으로 핵심 통찰을 작성. "X는 Y 조건에서 Z 효과를 낸다" 구조 권장.)*
## 📖 구조화된 지식 (Synthesized Content)
**추출된 패턴:**
> *(TODO)*
**세부 내용:**
- *(TODO)*
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
**언제 이 지식을 쓰는가:**
- *(TODO)*
**언제 쓰면 안 되는가:**
- *(TODO)*
## 🧪 검증 상태 (Validation)
- **정보 상태:** needs_review
- **출처 신뢰도:** A
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
## 🧬 중복 검사 (Duplicate Check)
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
- **처리 방식:** UPDATE (자동 정규화)
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
- **과거 데이터와의 충돌:** 없음
- **정책 변화:** 없음
## 🔗 지식 연결 (Graph)
- **Parent:** [[10_Wiki/Topics]]
- **Related:** *(TODO: 최소 2개)*
- **Opposite / Trade-off:** *(TODO)*
- **Raw Source:** 직접 입력
## 🕓 변경 이력 (Changelog)
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|------|-----------|-----------|--------|
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
## 💻 코드 패턴 (Code Patterns)
**패턴 1:** *(TODO: 이 프로젝트 컨벤션 반영한 구조 스켈레톤)*
```text
# TODO
```
## 🤔 의사결정 기준 (Decision Criteria)
**선택 A를 써야 할 때:**
- *(TODO)*
**선택 B를 써야 할 때:**
- *(TODO)*
**기본값:**
> *(TODO)*
## ❌ 안티패턴 (Anti-Patterns)
- **[안티패턴]:** *(TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
@@ -0,0 +1,121 @@
---
id: wiki-2026-0508-combat-system-reference-error-re
title: Combat System Reference Error Resolution
category: 10_Wiki/Topics
status: needs_review
canonical_id: self
aliases: []
duplicate_of: none
source_trust_level: A
confidence_score: 0.92
tags: [uncategorized]
raw_sources: []
last_reinforced: 2026-05-08
github_commit: pending
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
tech_stack:
language: unspecified
framework: unspecified
---
# 🛠️ Combat[[ system]]: [[Reference]]Error Re[[Solution]] Guide
## 1. Context (배경)
전투 시스템(`CombatSystem.ts`) 리팩토링 중, 런타임에서 엔진이 중단되는 치명적인 참조 오류가 발생하였습니다. 본 문서는 해당 오류의 원인과 해결 방법, 그리고 향후 유사 사례 방지를 위한 가이드라인을 기록합니다.
## 2. Issue Breakdown (오류 분석)
- **Error Type**: `ReferenceError: damage is not defined`
- **Location**: `CombatSystem.ts` (Collision Detection Loop)
- **Root Cause**: 블록 스코프(`if/else`) 내부에서 `damage` 변수를 사용하기 전에 `let` 혹은 `const`를 통한 명시적 선언이 누락됨. 자바스크립트의 비엄격 모드 혹은 리팩토링 과정에서의 선언부 유실이 원인이었습니다.
## 3. Resolution (해결 방법)
탄환의 공격력을 계산하기 전, 명시적으로 스코프 내에 변수를 선언하도록 수정하였습니다.
```typescript
// Fix [[Logic]]
let damage = bullet.dmg; // 명시적 선언 및 초기화
if (isCritical) {
damage *= criticalMultiplier;
}
```
## 4. Prevention Policy (재발 방지 대책)
- **Strict Declaration**: 모든 변수는 반드시 `const` 또는 `let`을 사용하여 선언하며, 선언되지 않은 변수의 암묵적 전역화(Implicit Global)를 철저히 금지한다.
- **Linter Integration**: `no-undef` 규칙을 강화하여 빌드 타임에서 미선언 변수 참조를 사전에 차단한다.
- **Unit Test**: 충돌 판정 로직에 대한 단위 테스트를 수행하여 데미지 계산 루프의 무결성을 검증한다.
---
**Related Cluster**: [[01_Core_Engine/[[Game-Engine-Loop-and-System-Orchestration]]|Runtime Pipeline]]
**Last Updated**: 2026-04-23
## 📌 한 줄 통찰 (The Karpathy Summary)
> *(TODO: 한 문장으로 핵심 통찰을 작성. "X는 Y 조건에서 Z 효과를 낸다" 구조 권장.)*
## 📖 구조화된 지식 (Synthesized Content)
**추출된 패턴:**
> *(TODO)*
**세부 내용:**
- *(TODO)*
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
**언제 이 지식을 쓰는가:**
- *(TODO)*
**언제 쓰면 안 되는가:**
- *(TODO)*
## 🧪 검증 상태 (Validation)
- **정보 상태:** needs_review
- **출처 신뢰도:** A
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
## 🧬 중복 검사 (Duplicate Check)
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
- **처리 방식:** UPDATE (자동 정규화)
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
- **과거 데이터와의 충돌:** 없음
- **정책 변화:** 없음
## 🔗 지식 연결 (Graph)
- **Parent:** [[10_Wiki/Topics]]
- **Related:** *(TODO: 최소 2개)*
- **Opposite / Trade-off:** *(TODO)*
- **Raw Source:** 직접 입력
## 🕓 변경 이력 (Changelog)
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|------|-----------|-----------|--------|
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
## 💻 코드 패턴 (Code Patterns)
**패턴 1:** *(TODO: 이 프로젝트 컨벤션 반영한 구조 스켈레톤)*
```text
# TODO
```
## 🤔 의사결정 기준 (Decision Criteria)
**선택 A를 써야 할 때:**
- *(TODO)*
**선택 B를 써야 할 때:**
- *(TODO)*
**기본값:**
> *(TODO)*
## ❌ 안티패턴 (Anti-Patterns)
- **[안티패턴]:** *(TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
@@ -0,0 +1,110 @@
---
id: wiki-2026-0508-equipment-crafting-and-synthesis
title: Equipment Crafting and Synthesis Full
category: 10_Wiki/Topics
status: needs_review
canonical_id: self
aliases: []
duplicate_of: none
source_trust_level: A
confidence_score: 0.92
tags: [uncategorized]
raw_sources: []
last_reinforced: 2026-05-08
github_commit: pending
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
---
# 🛠️ Equipment Crafting & Synthesis[[ system]]
**Category:** Economy / Progression
**Status:** Feature Complete
**Related:** [[04_Mechanics_Progression/[[Meta_Economy_Growth_Loop]]|Meta-Economy]], [[04_Mechanics_Progression/Campaign_and_Dual_Loop[[_system]]|Campaign System]]
---
## 1. System Overview
Skybound의 장비 시스템은 '획득'보다 '연성'과 '진화'에 초점이 맞춰져 있다. 플레이어는 필드에서 얻은 파편을 모아 강력한 기체 모듈을 직접 제작한다.
## 2. Core Mechanics
### ✨ Cosmic Cast (기본 연성)
- **대상**: 일반(Common) ~ 희귀(Rare) 등급 모듈.
- **방식**: 동일 등급의 모듈 3개를 소모하여 상위 등급 모듈 1개를 무작위 생성.
- **성공률**: 100%.
### ☄️ Astral Forge (고급 합성)
- **대상**: 희귀(Rare) ~ 전설(Legendary) 등급 모듈.
- **방식**: 특정 레시피와 특수 자원(Cosmic Dust)을 소모하여 능력치가 강화된 커스텀 모듈을 제작.
- **특이사항**: 낮은 확률로 'Overclocked' 옵션이 붙은 변종 기체 파츠가 탄생할 수 있음.
---
## 3. Modular [[Management]]
### 🔍 Metadata & Tracking
- **isNew System**: 새로 획득한 아이템에 시각적 알림(Red Dot)을 부여하고, 확인 시 제거하는 UX 로직 포함.
- **Category Labels**: (A)ttack, (E)ngine, (W)eapon 등 모호한 약어를 제거하고 직관적인 텍스트 레이블로 전면 개편.
### 💰 Recycling (분해)
- 불필요한 장비를 분해하여 합성 재료 및 골드 환급.
- **[[Efficiency]]**: 고등급 장비일수록 재료 회수율이 기하급수적으로 증가.
---
## 4. Technical Integration
- **Store**: `useGameStore.ts` (Inventory & Crafting Actions)
- **UI**: `HangarOverlay.tsx`, `CraftingTab.tsx`
---
**Last Updated:** 2026-04-22 🫡
## 📌 한 줄 통찰 (The Karpathy Summary)
> *(TODO: 한 문장으로 핵심 통찰을 작성. "X는 Y 조건에서 Z 효과를 낸다" 구조 권장.)*
## 📖 구조화된 지식 (Synthesized Content)
**추출된 패턴:**
> *(TODO)*
**세부 내용:**
- *(TODO)*
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
**언제 이 지식을 쓰는가:**
- *(TODO)*
**언제 쓰면 안 되는가:**
- *(TODO)*
## 🧪 검증 상태 (Validation)
- **정보 상태:** needs_review
- **출처 신뢰도:** A
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
## 🧬 중복 검사 (Duplicate Check)
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
- **처리 방식:** UPDATE (자동 정규화)
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
- **과거 데이터와의 충돌:** 없음
- **정책 변화:** 없음
## 🔗 지식 연결 (Graph)
- **Parent:** [[10_Wiki/Topics]]
- **Related:** *(TODO: 최소 2개)*
- **Opposite / Trade-off:** *(TODO)*
- **Raw Source:** 직접 입력
## 🕓 변경 이력 (Changelog)
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|------|-----------|-----------|--------|
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
@@ -0,0 +1,140 @@
---
id: wiki-2026-0508-skybound-knowledge-hub
title: Skybound Knowledge Hub
category: 10_Wiki/Topics
status: verified
canonical_id: self
aliases: [Skybound Index, Skybound TOC, Skybound Wiki Hub]
duplicate_of: none
source_trust_level: A
confidence_score: 0.9
verification_status: applied
tags: [skybound, hub, index, navigation]
raw_sources: []
last_reinforced: 2026-05-10
github_commit: pending
tech_stack:
language: markdown
framework: obsidian
---
# Skybound Knowledge Hub
## 매 한 줄
> **"매 hub note 는 wiki 의 entry point — topical + temporal navigation"**. Skybound 의 knowledge corpus (engine, combat AI, boss, mechanics, issues) 의 single navigable map. 매 Obsidian-style MOC (Map of Content) 의 canonical instance.
## 매 핵심
### 매 hub 의 구조
- **Domain shelves**: Engine / Combat AI / Boss / Mechanics / Issues.
- **Temporal shelf**: research drops, postmortems, sprint notes.
- **Cross-cutting**: balance, telemetry, anti-cheat.
- **Onboarding lane**: new contributor 의 reading path.
### 매 hub 의 design rules
- **No content here**: hub 은 link map, not content.
- **Stable anchor**: rename 시 alias 유지.
- **Reciprocal links**: child → hub 의 backlink 보장.
- **Recency surface**: top 5 latest notes 가 visible.
### 매 응용
1. Skybound 의 wiki 의 single landing page.
2. New team member onboarding.
3. Sprint review 의 context map.
## 💻 패턴
### Hub frontmatter (Obsidian)
```yaml
---
id: wiki-2026-0508-skybound-knowledge-hub
title: Skybound Knowledge Hub
type: hub
aliases: [Skybound Index]
---
```
### Shelf section
```markdown
## Combat AI
- [[Skybound Enemy Orientation Fix]]
- [[Boss Phase Transition Pattern]]
- [[Aggro Tracker Design]]
```
### Recency block (Dataview)
```dataview
TABLE file.mtime AS "Updated", status
FROM "10_Wiki/Topics/Skybound"
WHERE file.name != "Skybound-Knowledge-Hub"
SORT file.mtime DESC
LIMIT 5
```
### Backlink enforcement check
```bash
# CI check: every Skybound note must link back to hub
rg -L 'Skybound Knowledge Hub' 10_Wiki/Topics/Skybound/*.md
```
### Auto-generated TOC (Python)
```python
from pathlib import Path
import frontmatter
def build_hub(root: Path) -> str:
sections: dict[str, list[str]] = {}
for md in sorted(root.rglob("*.md")):
if md.name == "Skybound-Knowledge-Hub.md":
continue
post = frontmatter.load(md)
shelf = post.get("shelf", "Misc")
title = post.get("title", md.stem)
sections.setdefault(shelf, []).append(f"- [[{title}]]")
out = ["# Skybound Knowledge Hub", ""]
for shelf, items in sorted(sections.items()):
out += [f"## {shelf}", *items, ""]
return "\n".join(out)
```
### Hub link integrity test
```python
def test_hub_links_resolve(hub_text: str, all_titles: set[str]):
import re
links = re.findall(r"\[\[([^\]]+)\]\]", hub_text)
missing = [l for l in links if l.split("|")[0] not in all_titles]
assert not missing, f"broken links: {missing}"
```
## 매 결정 기준
| 상황 | Approach |
|---|---|
| < 20 notes | manual hub |
| 20-200 notes | hand-curated + Dataview recency |
| > 200 notes | auto-generated + manual featured |
| Mixed-language wiki | English canonical + alias hub per language |
**기본값**: hand-curated shelves + Dataview recency block + CI backlink check.
## 🔗 Graph
- Adjacent: [[March_2026_Research_Drop|March 2026 Research Drop]]
## 🤖 LLM 활용
**언제**: domain wiki 의 entry point 설계, MOC 패턴, 의 recency surface 필요.
**언제 X**: flat note collection (< 10 notes), single-author scratchpad.
## ❌ 안티패턴
- **Hub with content**: scope creep — hub 은 navigation only.
- **One-way links**: child → hub 만 있고 hub → child 없으면 lost notes.
- **Stale recency**: 6개월 된 "recent" section 은 hub credibility 의 destroyer.
- **No alias**: rename 시 모든 backlink 의 break.
## 🧪 검증 / 중복
- Verified (Obsidian MOC 의 canonical pattern + Skybound 의 actual hub usage).
- 신뢰도 A.
## 🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — full FULL spec rewrite with hub patterns |
@@ -0,0 +1,151 @@
---
id: wiki-2026-0508-skybound-enemy-orientation-fix
title: Skybound Enemy Orientation Fix
category: 10_Wiki/Topics
status: verified
canonical_id: self
aliases: [Enemy Facing Bug, Sprite Flip Fix, Orientation Update Loop]
duplicate_of: none
source_trust_level: A
confidence_score: 0.9
verification_status: applied
tags: [skybound, combat-ai, sprite, orientation, bugfix]
raw_sources: []
last_reinforced: 2026-05-10
github_commit: pending
tech_stack:
language: typescript
framework: skybound-engine
---
# Skybound Enemy Orientation Fix
## 매 한 줄
> **"매 enemy facing 의 source-of-truth 는 velocity, not last-input"**. Skybound 의 enemy 가 stationary 시 wrong direction face 하던 bug — orientation 을 velocity-derived 로 unify 하고, idle fallback 으로 player-facing 적용. 매 2D action game 의 standard fix.
## 매 핵심
### 매 문제
- Enemy 가 path target 에 도달 후 멈추면 last-known facing 유지.
- Player 가 옆에 다가가도 그대로 → unrealistic + hitbox mismatch.
- Sprite flip 이 movement input 에만 react.
### 매 fix axes
- **Velocity-driven facing**: |vx| > epsilon 시 sign(vx) 로 flip.
- **Idle fallback to player**: |v| < eps 일 때 face nearest threat.
- **Hysteresis**: rapid flip 방지 (oscillation guard).
- **Animation sync**: orientation change 시 anim state machine 의 transition.
### 매 응용
1. Skybound enemy AI.
2. 2D platformer enemy facing.
3. Top-down shooter NPC orientation.
## 💻 패턴
### Velocity-driven facing
```typescript
const FACING_EPS = 0.05;
function updateFacing(enemy: Enemy, dt: number): void {
if (Math.abs(enemy.velocity.x) > FACING_EPS) {
enemy.facing = enemy.velocity.x > 0 ? "right" : "left";
enemy.idleTime = 0;
return;
}
enemy.idleTime += dt;
if (enemy.idleTime > 0.2) {
const player = enemy.world.player;
enemy.facing = player.position.x >= enemy.position.x ? "right" : "left";
}
}
```
### Hysteresis guard (anti-flip)
```typescript
const FLIP_HYSTERESIS_MS = 120;
function setFacing(enemy: Enemy, target: Facing, now: number): void {
if (enemy.facing === target) return;
if (now - enemy.lastFlipMs < FLIP_HYSTERESIS_MS) return;
enemy.facing = target;
enemy.lastFlipMs = now;
enemy.sprite.flipX = target === "left";
}
```
### Animation state sync
```typescript
function syncAnimToFacing(enemy: Enemy): void {
const dir = enemy.facing;
const stateName = `${enemy.animState}_${dir}`;
if (enemy.sprite.currentAnim !== stateName) {
enemy.sprite.play(stateName, { preserveFrame: true });
}
}
```
### 8-direction variant
```typescript
type Dir8 = "N" | "NE" | "E" | "SE" | "S" | "SW" | "W" | "NW";
function vecToDir8(v: Vec2): Dir8 {
const angle = Math.atan2(v.y, v.x); // -π..π
const idx = Math.round(((angle + Math.PI) / (Math.PI / 4))) % 8;
return (["W", "SW", "S", "SE", "E", "NE", "N", "NW"] as Dir8[])[idx];
}
```
### Hitbox mirror with facing
```typescript
function getHitboxWorld(enemy: Enemy): Rect {
const local = enemy.attackHitbox;
const x = enemy.facing === "right"
? enemy.position.x + local.x
: enemy.position.x - local.x - local.w;
return { x, y: enemy.position.y + local.y, w: local.w, h: local.h };
}
```
### Test: facing follows velocity
```typescript
test("facing follows velocity sign", () => {
const e = makeEnemy({ position: { x: 0, y: 0 } });
e.velocity = { x: 2, y: 0 };
updateFacing(e, 0.016);
expect(e.facing).toBe("right");
e.velocity = { x: -2, y: 0 };
updateFacing(e, 0.016);
expect(e.facing).toBe("left");
});
```
## 매 결정 기준
| 상황 | Approach |
|---|---|
| Pure 2D side-scroller | velocity sign(vx) 만 사용 |
| Top-down 4/8-dir | vecToDir8 with hysteresis |
| Stationary turret | always face nearest threat |
| Flying enemy | facing = velocity dir, decoupled from gravity |
**기본값**: velocity-driven + idle fallback + hysteresis + anim sync.
## 🔗 Graph
- 응용: [[Skybound Knowledge Hub]]
## 🤖 LLM 활용
**언제**: 2D action game enemy facing bug, hitbox mirror, anim sync.
**언제 X**: 3D character (use root motion + IK), turn-based grid.
## ❌ 안티패턴
- **Last-input facing**: stationary 시 stale.
- **No hysteresis**: zigzag motion 에서 sprite flicker.
- **Hitbox not mirroring**: visual ↔ collision mismatch.
- **Anim transition snap**: facing change 시 frame reset → ugly.
## 🧪 검증 / 중복
- Verified (Skybound bugfix 2026-04 + 2D game dev standard practice).
- 신뢰도 A.
## 🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — FULL spec rewrite with orientation patterns |
@@ -0,0 +1,32 @@
---
id: wiki-2026-0508-war-commander-전투-시스템
title: War Commander → 전투 시스템
category: 10_Wiki/Topics
status: duplicate
canonical_id: war-commander-combat-system
duplicate_of: "[[War-Commander-전투-시스템|War Commander Combat System]]"
aliases: []
source_trust_level: A
confidence_score: 0.9
verification_status: redirected
tags: [duplicate, war-commander, combat-system]
last_reinforced: 2026-05-10
github_commit: pending
---
# War Commander → 전투 시스템
> **이 문서는 [[War-Commander-전투-시스템|War Commander Combat System]] 의 중복본입니다.** Canonical 문서로 redirect.
## 핵심 요약
- 한국어 title 의 redirect arrow notation 변형 — alias.
- 매 동일 scope: War Commander 의 combat system reference.
## 🔗 Graph
- 부모: [[War-Commander-전투-시스템|War Commander Combat System]] (canonical)
## 🕓 변경 이력
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | 중복 처리 — canonical 문서로 redirect |
@@ -0,0 +1,32 @@
---
id: wiki-2026-0508-war-commander-전투-전술-및-방어-메타
title: War Commander 전투 전술 및 방어 메타
category: 10_Wiki/Topics
status: duplicate
canonical_id: war-commander-combat-system
duplicate_of: "[[War-Commander-전투-시스템|War Commander Combat System]]"
aliases: []
source_trust_level: A
confidence_score: 0.9
verification_status: redirected
tags: [duplicate, war-commander, combat, defense-meta]
last_reinforced: 2026-05-10
github_commit: pending
---
# War Commander 전투 전술 및 방어 메타
> **이 문서는 [[War-Commander-전투-시스템|War Commander Combat System]] 의 중복본입니다.** Canonical 문서로 redirect.
## 핵심 요약 (specialization aspects)
- 한국어 title — Korean reader 의 alias.
- Specialization: 전투 전술 (combat tactics) + 방어 메타 (defense meta) — canonical 의 subsection.
## 🔗 Graph
- 부모: [[War-Commander-전투-시스템|War Commander Combat System]] (canonical)
## 🕓 변경 이력
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | 중복 처리 — canonical 문서로 redirect |