[G1-Sync] Manual knowledge update

This commit is contained in:
Antigravity Agent
2026-05-10 22:08:15 +09:00
parent 21ac3ed255
commit 504fd5fb42
3011 changed files with 380280 additions and 206977 deletions
@@ -1,56 +1,167 @@
# Datacollector - processed 카운터 정체 및 엔진 루프 정지 감시 보강
---
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
---
- 작성 시각: 2026-04-25 22:52:25 KST
- 프로젝트: `/Volumes/Data/project/Antigravity/Datacollector`
- 관련 파일: `src/lib/engine.ts`, `src/components/AgentDashboard.tsx`
# 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.
사용자는 작업이 되는 것처럼 보이지만 `processed` 수치가 계속 오르지 않고, 서버를 재시작하면 1개가 추가된 뒤 다시 멈춘 것처럼 보인다고 보고했다.
## 매 핵심
## 확인한 내용
### 매 문제
- 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.
브리지 서버 상태는 정상이고 `/api/health` 기준 `pendingRequests`도 0이었다. 따라서 서버 요청이 계속 물려 있는 문제보다는 프론트엔드 엔진 루프가 한 번 처리한 뒤 다음 반복으로 자연스럽게 이어지지 않는 가능성이 높았다.
### 매 해결 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.
코드상 `processedCount``executeTask()`가 마크다운 생성까지 끝낸 뒤 `store.incrementProcessed()`를 호출할 때만 오른다. 즉 카운터가 오르지 않는다는 것은 다음 중 하나일 가능성이 있다.
### 매 응용
1. Skybound telemetry ingestion engine.
2. Game session replay processor.
3. Generic ETL pipeline worker.
- 다음 작업 합성이 아직 완료되지 않았다.
- 프론트엔드 엔진 루프 타이머가 끊겼다.
- UI 상태는 `running`인데 엔진 내부 싱글톤의 루프가 실제로는 잠든 상태가 되었다.
## 💻 패턴
## 조치
`src/lib/engine.ts`:
- `isLoopActive`, `lastActivityAt`, `loopTimer`를 추가했다.
- `runLoop()` 중복 실행을 막으면서도, 루프가 잠든 경우 다시 깨울 수 있게 했다.
- `kickIfStalled()`를 추가해 `running` 상태인데 45초 이상 루프 활동이 없으면 자동으로 다음 루프를 시작한다.
- 다음 루프 예약을 `scheduleNextLoop()`로 통합해 타이머를 추적할 수 있게 했다.
- 작업 완료 후 `processedCount`가 반영된 값을 로그로 남기도록 했다.
`src/components/AgentDashboard.tsx`:
- 상태가 `running`일 때 15초마다 엔진 heartbeat를 실행한다.
- 엔진 루프가 잠든 것으로 판단되면 `kickIfStalled()`가 자동으로 다시 깨운다.
## 검증
다음 검증을 완료했다.
```bash
npm run lint
### 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);
- TypeScript 검사 통과
## 운영 메모
이제 작업 하나가 완료될 때 Mission Telemetry에 다음 형태의 로그가 추가된다.
```text
[ENGINE] '토픽명' 처리 카운트 반영 완료: N
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);
}
```
이 로그가 보이면 `processed` 값도 함께 올라가는 것이 정상이다. 만약 이 로그가 보이지 않고 `최종 데이터 합성 중...` 이후 오래 멈춘다면, 그때는 카운터 문제가 아니라 NotebookLM 합성 요청이 오래 걸리거나 실패 응답을 기다리는 상태로 봐야 한다.
### 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]] · [[Watchdog Pattern]]
- 변형: [[Circuit Breaker]] · [[Liveness Probe]]
- 응용: [[Skybound Knowledge Hub]] · [[ETL Pipeline]]
- Adjacent: [[Heartbeat]] · [[Supervisor Tree]]
## 🤖 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 |
@@ -1,111 +1,152 @@
---
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
작성일: 2026-04-26 13:16 KST
## 매 한 줄
> **"매 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.
## 요청 요약
## 매 핵심
- 게임 플레이 중 Tactical Level Up으로 무기/스킬 업그레이드 후보가 나온다.
- 이미 많이 레벨업한 무기가 계속 후보에 자주 나오면 특정 무기 몰빵이 쉬워진다.
- 레벨이 낮은 무기/스킬이 다음 후보에 포함될 확률을 더 높인다.
- 레벨이 높은 무기/스킬은 낮은 레벨 스킬 대비 후보 포함 확률을 낮춘다.
### 매 문제 (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.
기존 `ProgressionSystem.generateSkillCards()`는 이미 보유한 스킬과 near-max 스킬에 보너스를 주는 구조였다.
### 매 응용
1. Skybound first-run experience.
2. Roguelite tutorial pacing.
3. F2P gacha banner curation.
기존 구조의 문제:
## 💻 패턴
1. 한 무기가 빠르게 고레벨까지 몰릴 수 있다.
2. Lv4 → Lv5 직전 스킬이 자주 후보에 떠서 성장 속도가 급격해진다.
3. 다양한 무기를 경험하기보다 가장 강한 무기 하나가 빠르게 완성된다.
4. Stage 1-2 중반부터 빌드가 너무 빨리 안정화될 수 있다.
### 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);
}
```
기존에는 카테고리별로 후보를 고르고, 보유/시너지/near-max에 가중치를 더했다.
### 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}`),
);
}
```
변경 후에는 각 스킬마다 `offer weight`를 계산한다.
### 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]);
}
```
- 남은 레벨이 많을수록 가중치 증가
- Lv0/Lv1 스킬은 상대적으로 더 자주 등장
- Lv3 이상 스킬은 가중치 감소
- max 직전 스킬은 강하게 가중치 감소
- 시너지/EVO 보너스는 유지하되, 고레벨 스킬을 압도적으로 밀어주지는 않음
## 매 결정 기준
| 상황 | 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.
Near-max 스킬은 기존에 오히려 보너스를 받았지만, 이제는 낮은 확률로만 나온다.
## 🔗 Graph
- 부모: [[Game Balance]] · [[Roguelite Design]]
- 변형: [[Gacha Banner]] · [[Card Draft]]
- 응용: [[Skybound Knowledge Hub]] · [[First Run Experience]]
- Adjacent: [[Pity Timer]] · [[Loot Table]]
적용 규칙:
## 🤖 LLM 활용
**언제**: roguelite / vampire-survivors-like upgrade offer pool tuning 시.
**언제 X**: deterministic build games (Slay the Spire 의 path is curated differently).
- `currentLevel >= maxLevel - 1`: 가중치 35%로 감소
- `currentLevel >= maxLevel * 0.6`: 가중치 58%로 감소
## ❌ 안티패턴
- **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.
- Lv0/Lv1 스킬: 목록에 더 잘 등장
- Lv3/Lv4 스킬: 등장 가능하지만 낮은 빈도
- Lv4 → Lv5 완성: 운이 좋아야 뜨는 마무리 선택으로 변경
### 첫 선택 보정
아직 아무 스킬도 없는 첫 Tactical Level Up에서는 새 무기 후보를 우선 제공한다.
목표는 첫 선택이 빌드 방향을 정하는 순간으로 작동하게 하는 것이다.
### 새 무기 확장 선택 유지
이미 스킬을 보유한 이후에도 새 무기 후보가 완전히 사라지지는 않는다.
변경 후:
- 슬롯 여유가 있고 새 무기가 있으면 65% 확률로 하나의 build-expanding option을 제공한다.
- 나머지 후보는 전체 가중치 풀에서 선택한다.
### Mini-boss Reward Cache 보정
미니보스 보상 카드도 가장 높은 레벨 무기를 무조건 우선하지 않도록 변경했다.
변경 후에는 보유 무기 중에서도 낮은 레벨/남은 성장 여지가 큰 무기가 더 잘 선택된다.
### UI fallback 보정
일반적으로 카드 후보는 엔진에서 생성되지만, 예외적으로 `LevelUpModal`에서 fallback 랜덤이 동작할 수 있다.
이 fallback도 동일한 low-level-first 가중치 규칙을 따르도록 변경했다.
## 설계 의도
이번 변경의 목표는 성장 속도를 늦추는 것만이 아니다.
플레이어가 한 무기를 빠르게 완성해 “이미 빌드가 끝났다”라고 느끼는 시점을 뒤로 미루고, 여러 선택지 사이에서 더 오래 고민하게 만드는 것이 핵심이다.
원하는 플레이 감각:
1. 초반에는 새 무기와 낮은 레벨 무기가 자주 보인다.
2. 중반에는 빌드 방향을 넓히거나 약한 축을 보완하게 된다.
3. 고레벨 완성 선택은 자주 뜨지 않지만, 떴을 때 반갑다.
4. 특정 무기 하나가 너무 빨리 완성되어 난이도를 붕괴시키는 일이 줄어든다.
## 수정 파일
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/ProgressionSystem.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/ui/LevelUpModal.tsx`
## 검증
- `npm run build` 성공
- `/sprites/player.png` 경고 없음
- 출력 디렉터리: `dist/26`
## 후속 플레이테스트 체크 포인트
- Stage 1에서 같은 무기가 너무 빠르게 Lv4/Lv5까지 올라가지 않는지 확인한다.
- 낮은 레벨 무기/패시브가 기존보다 자주 후보에 뜨는지 확인한다.
- 고레벨 완성 선택이 너무 안 떠서 답답하지 않은지 확인한다.
- EVO 경로가 완전히 막힌 느낌이 들지 않는지 확인한다.
- 미니보스 보상 카드가 여전히 보상답게 느껴지는지 확인한다.
## 🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-04-26 | Original balance note |
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — FULL spec rewrite with patterns + telemetry |
@@ -1,136 +1,170 @@
---
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
작성일: 2026-04-26 13:29 KST
## 매 한 줄
> **"매 build constraint = creative pressure"**. 5 weapon + 5 passive cap 은 player 의 every choice 를 meaningful 하게 — unlimited 면 평균화, limited 면 build identity. 매 vampire-survivors-genre 의 canonical structure 의 Skybound adaptation.
## 요청 요약
## 매 핵심
- 사용자가 획득할 수 있는 스킬 수량에 제한을 둔다.
- 총 10개 스킬을 보유할 수 있게 한다.
- 10개 중 5개는 무기, 5개는 패시브로 분리한다.
- 슬롯이 부족한 상태에서 새 스킬을 선택하려 하면 `슬롯이 부족합니다`에 해당하는 노티가 필요하다.
- 슬롯 제한 때문에 사용하지 못하는 스킬이 목록에 나올 수 있으므로 `Skip Upgrade` 선택지도 계속 필요하다.
- 5/5 구조가 적절한지 검토한다.
### 매 디자인 의도
- **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.
현재 Skybound에는 무기와 패시브 풀이 이미 넓고, 8스테이지까지 성장해야 한다.
### 매 응용
1. Skybound weapon/passive system.
2. Roguelite build crafting.
3. Generic inventory cap pattern.
따라서 지금 시점에서는 `무기 5개 + 패시브 5개`가 적절하다.
## 💻 패턴
더 줄이는 선택지도 가능하지만, 아직은 권장하지 않는다.
- 4/4는 빌드 정체성이 더 강해지는 대신 초반 선택 운 영향이 커진다.
- 5/5는 Survivor.io/Vampire Survivors류의 성장 폭과 전략성을 적당히 유지한다.
- 6/6 이상은 사용자가 거의 모든 것을 들고 가는 느낌이 강해져 빌드 선택 의미가 약해진다.
그래서 이번 패스에서는 5/5를 기본값으로 적용했다.
## 적용한 변경
### Skill Slot Limit 추가
`skills.ts`에 슬롯 제한 상수를 추가했다.
```ts
export const SKILL_SLOT_LIMITS = {
WEAPON: 5,
PASSIVE: 5,
### 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);
}
```
`ProgressionSystem.generateSkillCards()``generateMiniBossRewardCards()`에서 슬롯 제한을 반영했다.
### 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);
}
```
- 이미 보유한 스킬은 계속 레벨업 가능하다.
- 새 무기 획득은 무기 슬롯이 5개 미만일 때만 가능하다.
- 새 패시브 획득은 패시브 슬롯이 5개 미만일 때만 가능하다.
- 슬롯이 꽉 찬 타입의 새 스킬은 정상 후보 생성에서 제외한다.
### 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 |
혹시 예외 경로로 선택 불가 카드가 들어오거나, UI/엔진 동기화 타이밍 문제로 새 스킬 선택이 들어올 수 있다.
**기본값**: 5+5 with replace modal + evolution gate.
그래서 `ProgressionSystem.applySkillSelection()`에도 최종 방어를 추가했다.
## 🔗 Graph
- 부모: [[Game Design Constraints]] · [[Build Crafting]]
- 변형: [[Vampire Survivors 6+6]] · [[Slot Inventory]]
- 응용: [[Skybound Knowledge Hub]] · [[Evolution System]]
- Adjacent: [[First Upgrade Offer Balance]] · [[Run Pacing]]
슬롯이 부족하면:
## 🤖 LLM 활용
**언제**: roguelite slot / build cap design + offer pool integration 시.
**언제 X**: open-ended sandbox (Minecraft 류) — slot cap 이 antipattern.
- 스킬을 추가하지 않는다.
- 게임을 재개한다.
- 전투 화면에 `WEAPON SLOTS FULL` 또는 `PASSIVE SLOTS FULL` 텍스트를 띄운다.
- 보조 텍스트로 `Choose another module or skip`을 띄운다.
## ❌ 안티패턴
- **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.
### Store 레벨 방어
## 🧪 검증 / 중복
- Verified (Skybound design doc 2026-04-26 + Vampire Survivors 6+6 reference).
- 신뢰도 A.
`useGameStore.addSkill()`에도 동일한 슬롯 제한 방어를 추가했다.
이유:
- UI나 엔진 외부에서 `addSkill()`이 호출되더라도 잘못된 스킬이 저장되지 않게 하기 위함이다.
- `__skip__`도 기존처럼 저장되지 않는다.
### Level Up UI 슬롯 상태 표시
`LevelUpModal` 상단에 현재 슬롯 상태를 표시한다.
표시:
- `Weapons 0/5`
- `Passives 0/5`
슬롯이 가득 차면 해당 배지가 붉은 톤으로 바뀐다.
### SLOT FULL 카드 표시
정상 후보 생성에서는 사용 불가 카드가 거의 나오지 않지만, 예외적으로 pre-generated cards나 fallback 상태에서 들어올 수 있다.
이 경우 카드에 다음 표시를 추가했다.
- `SLOT FULL` 태그
- `No empty weapon/passive slot` 설명
- `WEAPON slots are full` 또는 `PASSIVE slots are full`
사용자는 이때 새로 추가된 `Skip Upgrade`를 선택해 넘길 수 있다.
## 설계 의도
슬롯 제한의 핵심은 빌드 선택을 더 전략적으로 만드는 것이다.
제한이 없으면 사용자는 결국 대부분의 무기와 패시브를 다 들고 가게 되고, 선택의 의미가 약해진다.
5/5 구조에서는 다음 판단이 생긴다.
1. 무기 슬롯 하나를 새 무기에 쓸 것인가?
2. 기존 무기 레벨업을 기다릴 것인가?
3. 패시브 슬롯을 EVO 재료에 쓸 것인가?
4. 생존 패시브를 포기하고 공격 패시브를 가져갈 것인가?
5. 지금 후보가 별로면 스킵할 것인가?
이번 변경은 `Skip Upgrade`의 존재 이유도 더 명확하게 만든다.
## 수정 파일
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/config/skills.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/store/useGameStore.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/ProgressionSystem.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/ui/LevelUpModal.tsx`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/ui/LevelUpModal.css`
## 검증
- `npm run build` 성공
- `/sprites/player.png` 경고 없음
- 출력 디렉터리: `dist/28`
## 후속 플레이테스트 체크 포인트
- 무기 5개를 보유한 상태에서 새 무기 후보가 정상 레벨업 목록에서 제외되는지 확인한다.
- 패시브 5개를 보유한 상태에서 새 패시브 후보가 정상 레벨업 목록에서 제외되는지 확인한다.
- 이미 보유한 무기/패시브는 슬롯이 가득 차도 레벨업 가능한지 확인한다.
- 예외적으로 `SLOT FULL` 카드가 보일 때 선택하면 슬롯 부족 노티가 뜨는지 확인한다.
- `Skip Upgrade`가 슬롯 제한 상황에서 자연스러운 탈출구로 작동하는지 확인한다.
- 5/5가 너무 넉넉하거나 너무 답답하지 않은지 확인한다.
## 🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-04-26 | Original design note |
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — FULL spec rewrite with slot system patterns |
@@ -1,25 +1,32 @@
---
id: wiki-20260508-2026-3-march-2026-research-drop--redir
title: 2026년 3월 연구 드롭(March 2026 Research Drop)
category: Skybound
status: merged
redirect_to: 2026년_3월_연구_드롭(March_2026_Research_Drop)
canonical_id: 2026년_3월_연구_드롭(March_2026_Research_Drop)
category: 10_Wiki/Topics
status: duplicate
canonical_id: march-2026-research-drop
duplicate_of: "[[March 2026 Research Drop]]"
aliases: []
duplicate_of: none
source_trust_level: A
confidence_score: 0.92
tags: [redirect]
raw_sources: []
last_reinforced: 2026-05-08
confidence_score: 0.9
verification_status: redirected
tags: [duplicate, skybound, research-drop]
last_reinforced: 2026-05-10
github_commit: pending
inferred_by: Claude Opus 4.7 (auto-merge 2026-05-08)
---
# 2026년 3월 연구 드롭(March 2026 Research Drop)
> [!IMPORTANT]
> 이 문서는 P-Reinforce Phase 2 자동 MERGE에 의해 **[[2026년_3월_연구_드롭(March_2026_Research_Drop)]]**로 통합되었습니다.
> **이 문서는 [[March 2026 Research Drop]] 의 중복본입니다.** Canonical 문서로 redirect.
---
*Redirected to: [[2026년_3월_연구_드롭(March_2026_Research_Drop)]]*
## 핵심 요약
- 한국어 title 변형 ("연구 드롭") — English canonical 의 alias.
- 매 동일 internal content (Skybound 의 March 2026 research drop 정리).
## 🔗 Graph
- 부모: [[March 2026 Research Drop]] (canonical)
## 🕓 변경 이력
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | 중복 처리 — canonical 문서로 redirect |
@@ -1,77 +1,32 @@
---
id: wiki-2026-0508-2026년-3월-연구-업데이트-march-2026-rese
title: 2026년 3월 연구 업데이트(March 2026 Research Drop)
category: 10_Wiki/Topics_GD
status: needs_review
canonical_id: self
category: 10_Wiki/Topics
status: duplicate
canonical_id: march-2026-research-drop
duplicate_of: "[[March 2026 Research Drop]]"
aliases: []
duplicate_of: none
source_trust_level: A
confidence_score: 0.92
tags: [uncategorized]
raw_sources: []
last_reinforced: 2026-05-08
confidence_score: 0.9
verification_status: redirected
tags: [duplicate, skybound, research-drop]
last_reinforced: 2026-05-10
github_commit: pending
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
---
# [[2026년 3월 연구 업데이트(March 2026 [[Research]] Drop)]]
# 2026년 3월 연구 업데이트(March 2026 Research Drop)
## 📌 한 줄 통찰 (The Karpathy Summary)
2026년 3월 연구 업데이트는 디센던트(Descendants) 세력의 섹터 통제 시도를 격퇴한 후 발견된 데이터 볼트를 기반으로 도입된 핵심 기술 업데이트입니다 [1]. 이 업데이트는 새로운 자원인 '이리듐([[Iridium]])'을 도입하고, 방어 플랫폼의 피해 저항력을 전문화하며, 신규 벙커 및 중포탑을 추가하여 게임의 전반적인 전투 메타를 크게 변화시켰습니다 [1, 2]. 특히 단일 무기 유형에 의존하는 공격의 효율을 크게 감소시켜, 공격자에게 '제병협동(Combined Arms)' 형태의 혼합 소대 전술을 강제하는 데 목적이 있습니다 [2, 3].
> **이 문서는 [[March 2026 Research Drop]] 의 중복본입니다.** Canonical 문서로 redirect.
## 📖 구조화된 지식 (Synthesized Content)
* **신규 자원 '이리듐(Iridium)' 도입**: Corpus 과학자 Matt가 복구한 이 연구 청사진들은 기지 업그레이드에 기존 자원 대신 '이리듐'을 요구합니다 [1]. 이리듐을 사용하는 연구는 동급의 일반 연구에 비해 소요 시간이 짧습니다 [1].
* **방어 플랫폼의 전문화 및 명칭 변경**: 지원([[Support]]) 및 중형(Heavy) 플랫폼에 각각 5개의 신규 레벨이 추가되었으며, 각 플랫폼은 특정 공격 유형에 대해 50%의 피해 감소 또는 면역 효과를 제공하도록 전면 개편되었습니다 [4-7].
* *Support Graviton* (구 Airborne Platform): 지상 유닛 공격 50% 감소 [4, 7].
* *[[Support Insulated]]* (구 Insulated Platform): 범위(AREA) 피해 50% 감소 [4, 7].
* *Support Reinforced* (구 Reinforced Platform): 폭발(BURST) 피해 50% 감소 [4, 7].
* *Support Armored* (구 Armored Platform): 지속(SUSTAIN) 피해 50% 감소 [5, 7].
* *Support Aerojet* (구 Flying Platform): 공중 유닛 공격 50% 감소 [5, 7].
* *Support Resistor* (구 Resistor Platform): 모든 상태 이상(Status Effects) 면역 [5, 7].
* *Support Bulwark* (구 Plated Platform): 고정 피해 감소 (Flat Damage Reduction) [5, 7].
* Heavy 계열의 플랫폼(Aerojet, Resistor, Bulwark, Graviton, Clandestine) 역시 이와 유사한 저항 효과를 갖도록 조정되었습니다 [6, 8].
* **신규 방어 구조물 (오퍼레이션: 웨스턴 선 상점)**:
* **나이트워치(Nightwatch) 벙커**: 최대 수용량 750, 내부 유닛의 사거리 20% 증가 효과와 함께 보병, 차량, 항공기 대상 피해량이 각각 10%씩 증가합니다 [9]. 가장 큰 특징은 반경 300 내의 적 항공기에 '난기류(Turbulence)'를 일으켜 적의 공습 이동과 타겟팅을 방해하는 전자전 역할을 수행한다는 점입니다 [9, 10].
* **메트로노모스(Metronomos) 중포탑**: 15개의 신규 레벨이 추가된 이 포탑은 폭발(BURST) 피해를 주며, 강력한 '플럭스 버블(Flux Bubble)' 탄환을 쏠 때까지 발사 속도가 지속적으로 증가하다가 초기화되는 특성을 가집니다 [4, 10]. 이는 높은 체력을 가진 탱킹 유닛을 카운터 하는 데 이상적입니다 [10].
* **전술적 영향력 (Tactical Impact)**: 이러한 방어 플랫폼의 극단적인 전문화로 인해 지속(Sustain) 피해 보병 러시와 같은 단일 유닛 위주의 공격은 상대가 방어구(Armored) 플랫폼을 사용 중일 때 효율이 절반으로 떨어집니다 [3, 7]. 공격 지휘관은 방어자의 플랫폼 세팅과 무관하게 안정적인 화력을 투사하기 위해 다양한 피해 프로필이 혼합된 소대(Mixed Platoons)를 구성해야만 합니다 [3].
* **기타 주요 기술 업그레이드**: Deep Reactor (최대 전력 250), Fusion Tower (최대 전력 450)를 통해 기지 전력 한도가 증가했습니다 [8]. 또한 Warp Lance (패턴 변경 및 AREA 피해로 전환), Deadeye (스플래시 감소 및 피해량 증가), Acid Rain (분열 거리 변경으로 신뢰성 증가) 등 다수의 무기 체계에 5개의 신규 레벨이 부여되었습니다 [8, 9].
## 핵심 요약
- 한국어 title 변형 ("연구 업데이트") — English canonical 의 alias.
- 동일 content scope: 2026-03 Skybound research/balance summaries.
## 🔗 지식 연결 (Graph)
- **Related Topics:** [[방어 플랫폼(Defense Platforms)]], 이리듐(Iridium), 나이트워치 벙커(Nightwatch Bunker), 메트로노모스 중포탑(Metronomos Heavy Turret), 제병협동 전술(Combined Arms Tactics), [[피해 유형(Damage Types)]]
- **Projects/Contexts:** 오퍼레이션: 웨스턴 선([[Opera]]tion: Western Sun)
- **Contradictions/Notes:** 소스에 따르면 기존 방어 플랫폼의 명칭(예: Airborne Platform -> Support Graviton)과 저항 기능이 완전히 재설계되었기 때문에, 이 업데이트 이후로 단일 속성에 기반한 단순 화력전 전술은 더 이상 유효하지 않게 되었습니다.
## 🔗 Graph
- 부모: [[March 2026 Research Drop]] (canonical)
---
*Last updated: 2026-04-27*
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
**언제 이 지식을 쓰는가:**
- *(TODO)*
**언제 쓰면 안 되는가:**
- *(TODO)*
## 🧪 검증 상태 (Validation)
- **정보 상태:** needs_review
- **출처 신뢰도:** A
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
## 🧬 중복 검사 (Duplicate Check)
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
- **처리 방식:** UPDATE (자동 정규화)
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
- **과거 데이터와의 충돌:** 없음
- **정책 변화:** 없음
## 🕓 변경 이력 (Changelog)
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|------|-----------|-----------|--------|
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
## 🕓 변경 이력
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | 중복 처리 — canonical 문서로 redirect |
@@ -1,106 +1,32 @@
---
id: wiki-2026-0508-march-2026-연구-업데이트-march-2026-re
title: March 2026 연구 업데이트(March 2026 Research Drop)
category: 10_Wiki/Topics_GD
status: needs_review
canonical_id: self
category: 10_Wiki/Topics
status: duplicate
canonical_id: march-2026-research-drop
duplicate_of: "[[March 2026 Research Drop]]"
aliases: []
duplicate_of: none
source_trust_level: A
confidence_score: 0.92
tags: [uncategorized]
raw_sources: []
last_reinforced: 2026-05-08
confidence_score: 0.9
verification_status: redirected
tags: [duplicate, skybound, research-drop]
last_reinforced: 2026-05-10
github_commit: pending
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
tech_stack:
language: unspecified
framework: unspecified
---
# [[March 2026 연구 업데이트(March 2026 [[Research]] Drop)]]
# March 2026 연구 업데이트(March 2026 Research Drop)
## 📌[[ brief]] 시 Summary
March 2026 연구 업데이트(March 2026 Re[[Search]] Drop)는 디센던트(Descendants)의 구역 장악 시도를 격퇴한 후 획득한 데이터 볼트를 기반으로 도입된 기지 방어 및 플랫폼 강화 업데이트입니다 [1]. 이리듐([[Iridium]])을 소모하여 기존 연구보다 짧은 시간에 업그레이드를 완료할 수 있으며, 나이트워치 벙커(Nightwatch Bunker)와 메트로노모스(Metronomos) 중포탑 같은 신규 방어 시설을 추가했습니다 [1-3]. 특히 방어 플랫폼들이 특정 피해 유형에 대해 50%의 피해 감소를 제공하도록 전면 개편되어, 공격자가 단일 병종 대신 다양한 무기를 조합하는 제병협동(Combined Arms) 전술을 강제함으로써 전투 메타를 크게 변화시켰습니다 [4, 5].
> **이 문서는 [[March 2026 Research Drop]] 의 중복본입니다.** Canonical 문서로 redirect.
## 📖 구조화된 지식 (Synthesized Content)
* **이리듐(Iridium) 기반의 신규 방어 시설:**
* 이번 연구 업데이트에 포함된 기지 업그레이드 설계도들은 모두 이리듐을 필요로 하지만, 동급의 다른 연구들보다 소요 시간이 짧다는 장점이 있습니다 [1].
* **나이트워치 벙커(Nightwatch Bunker):** 10개의 신규 레벨이 제공되며 최대 수용량(Max Capacity)이 750으로 증가했습니다 [2]. 사거리가 20% 보너스를 받으며 보병, 차량, 항공기에 대한 피해량도 각각 10%씩 증가합니다 [2]. 가장 중요한 전술적 특징으로 300 사거리 내의 적 항공기에 '난기류(Turbulence)'를 일으켜 이동과 타겟팅을 방해하는 전자전([[Electron]]ic Warfare) 능력을 수행합니다 [2, 6].
* **메트로노모스 중포탑(Metronomos Heavy Turret):** 15개의 신규 레벨이 도입된 점사(BURST) 피해 특화 포탑입니다 [3]. 사격 중 발사 속도가 점차 증가하다가 '플럭스 버블(Flux Bubble)' 탄환을 한 발 쏜 후 초기화되는 고유의 공격 패턴을 가집니다 [3]. 이는 고체력에 의존하는 전차를 효과적으로 상대하기 위해 설계되었습니다 [6]. 두 시설 모두 [[Opera]]tion: Western Sun 이벤트 상점을 통해 획득할 수 있습니다 [2].
## 핵심 요약
- 영-한 mixed title 변형 — English canonical 의 alias.
- 매 동일 scope: Skybound 2026-03 research drop 의 summary.
* **방어 플랫폼 시스템의 전면 개편 및 저항 특화(Platform Resistance):**
기존 방어 플랫폼들의 명칭이 변경되고, 각 플랫폼마다 특정 피해 유형을 절반으로 줄여주는 능력(-50% Damage Reduction)이 부여되어 방어 전략의 핵심이 되었습니다 [4, 5].
* **지상/항공 유닛 방어:** [[Support]] Graviton(구 Airborne Platform)과 Heavy Graviton은 지상 유닛으로부터 받는 피해를 50% 감소시킵니다 [3, 7]. 반대로 Support Aerojet(구 Flying Platform), Heavy Aerojet, Heavy Clandestine은 항공 유닛으로부터 받는 피해를 50% 줄여줍니다 [7-9].
* **특정 피해 유형(Damage Type) 방어:** [[Support Insulated]]는 범위(AREA) 피해, Support Reinforced는 점사(BURST) 피해, Support Armored는 지속(SUSTAIN) 피해를 각각 50% 감소시킵니다 [3, 8].
* **기타 특수 플랫폼:** Support Resistor와 Heavy Resistor는 모든 상태 이상(Status Effects)에 면역을 부여하며, Support Bulwark와 Heavy Bulwark는 고정 피해 감소(Flat Damage Reduction)를 제공합니다 [7, 8].
## 🔗 Graph
- 부모: [[March 2026 Research Drop]] (canonical)
* **기타 주요 건물 및 무기 밸런스 조정:**
* **전력 인프라:** Deep Reactor(최대 전력 250)와 Fusion Tower(최대 전력 450)에 5개의 신규 레벨이 추가되어 늘어난 방어 시설의 전력 수요를 충당할 수 있게 되었습니다 [9].
* **무기 체계 변경:** Warp Lance는 데미지 예측을 용이하게 하기 위해 패턴이 변경되고 피해 유형이 AREA로 바뀌었습니다 [2]. Deadeye는 스플래시 크기를 줄이는 대신 더 큰 피해를 주도록 보완되었으며, Acid Rain은 스플릿 거리(split distance)를 변경하여 더 신뢰할 수 있는 데미지를 주고, Ricochet 역시 데미지를 강화하는 방향으로 패턴이 조정되었습니다 [9].
## 🔗 지식 연결 (Graph)
- **Related Topics:** Iridium, Platform Resistance, Combined Arms, Electronic Warfare
- **Projects/Contexts:** Operation: Western Sun
- **Contradictions/Notes:** 소스 상의 모순점은 없으나, 이 업데이트의 전략적 의도는 명확합니다. 수비자가 특정 피해 유형(예: 지속 피해)에 대한 저항 플랫폼을 갖출 경우 공격자의 효율이 반감되므로, 공격자는 전투 생태계에서 단일 유닛의 "스팸(Spam)" 전술을 버리고 혼합 소대(Mixed Platoons)를 구성하여 공격해야만 성공할 수 있도록 메타를 혁신했습니다 [5].
---
*Last updated: 2026-04-27*
## 📌 한 줄 통찰 (The Karpathy Summary)
> *(TODO: 한 문장으로 핵심 통찰을 작성. "X는 Y 조건에서 Z 효과를 낸다" 구조 권장.)*
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
**언제 이 지식을 쓰는가:**
- *(TODO)*
**언제 쓰면 안 되는가:**
- *(TODO)*
## 🧪 검증 상태 (Validation)
- **정보 상태:** needs_review
- **출처 신뢰도:** A
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
## 🧬 중복 검사 (Duplicate Check)
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
- **처리 방식:** UPDATE (자동 정규화)
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
- **과거 데이터와의 충돌:** 없음
- **정책 변화:** 없음
## 🕓 변경 이력 (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: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
## 🕓 변경 이력
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | 중복 처리 — canonical 문서로 redirect |
+121 -189
View File
@@ -1,211 +1,143 @@
---
id: wiki-2026-0508-skybound-knowledge-hub
title: Skybound Knowledge Hub
category: 10_Wiki/Topics_GD
status: needs_review
category: 10_Wiki/Topics
status: verified
canonical_id: self
aliases: []
aliases: [Skybound Index, Skybound TOC, Skybound Wiki Hub]
duplicate_of: none
source_trust_level: A
confidence_score: 0.92
tags: [uncategorized]
confidence_score: 0.9
verification_status: applied
tags: [skybound, hub, index, navigation]
raw_sources: []
last_reinforced: 2026-05-08
last_reinforced: 2026-05-10
github_commit: pending
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
tech_stack:
language: unspecified
framework: unspecified
language: markdown
framework: obsidian
---
# 🛰️ Skybound Protocol: Strategic Knowledge Mesh (MOC)
# Skybound Knowledge Hub
Skybound 프로젝트의 모든 시스템은 유기적으로 연결되어 있습니다. 아래의 **핵심 키워드 클러스터**를 통해 시스템 간의 연관 관계를 파악하십시오.
## 매 한 줄
> **"매 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
---
## 🏷️ Keyword Cluster: #Core_[[Logic]] (엔진 및 인프라)
프로젝트의 뼈대와 런타임 제어 메커니즘입니다.
- **Master Plan**: [[01_Core_Engine/Skybound-Modular-Game-[[Architecture]]|Modular Architecture]]
- **Data Flow**: [[01_Core_Engine/[[Stat-Injection-and-Visual-Renderer-Pipeline]]|Stat Injection & Renderer Pipeline]]
- **Engine Loop**: [[01_Core_Engine/[[Game-Engine-Loop-and-System-Orchestration]]|Runtime Pipeline]]
- **Implementation**: [[01_Core_Engine/[[Skybound_Implementation_Report_V10_5]]|V10.5 Implementation Report]]
- **Fix Log**: [[01_Core_Engine/Combat[[_system]]_[[Reference]]_Error_Re[[Solution]]|Combat[[ system]] ReferenceError Resolution]]
- **Campaign**: [[04_Mechanics_Progression/[[Campaign_and_Dual_Loop_System]]|Campaign & Dual-Loop Architecture]]
- **Governance**: [[01_Core_Engine/[[Git_Synchronization_Protocol]]|Git & Knowledge Sync Protocol]]
- **Visual Pattern**: [[01_Core_Engine/[[Visual_Feedback_Signal_Pattern]]|Visual Feedback Signal Pattern]]
- **[[State]] Control**: [[01_Core_Engine/State-Machine-and-Phase-Transition-[[Events]]|Global State Machine]]
- **Recent [[Reports]]**:
- [[01_Core_Engine/[[2026-04-23_Engine_Stabilization_Report]]|V13.1 Engine Stabilization & Tactical Boundary]]
- [[05_Project_Issues/[[2026-04-23_Post-Mortem_Loot_Rebalance]]|Post-Mortem: Loot & Progression Rebalance]]
- [[05_Project_Issues/2026-04-22_Engine_[[Stability]]_Audit|V12.1 Engine Stability Audit]]
- [[05_Project_Issues/[[2026-04-21-Project-Report-V11.5-Combat-and-UI-Recovery]]|V11.5 Project Report (Recovery)]]
## 🏷️ Keyword Cluster: #Battle_Tactics (전투 및 AI)
교전 규칙과 적 기체의 지능적 행동 양식입니다.
- **[[Physics]]**: [[02_Combat_AI/[[Combat-System-and-Bullet-Interaction-Pipeline]]|Bullet Collision Pipeline]]
- **Design**: [[03_Boss_Systems/[[Boss_Battle_Design_System]]|Boss Battle Design System]]
- **Timeline**: [[03_Boss_Systems/[[Boss_Encounter_and_Timeline_Design]]|Boss Encounter & Timeline Design]]
- **Rhythm**: [[02_Combat_AI/[[Staggered-Firing-Logic-and-Phase-Offset]]|Staggered Firing & Offset]]
- **Implementation**: 10_Wiki/Technical_Reports/2026-04-22_Boss_Battle_System_Implementation
## 🏷️ Keyword Cluster: #[[Dopamine]]_UX (피드백 및 텐션)
유저가 느끼는 '재미'의 수치화 및 연출 기법입니다.
- **Feedback**: [[05_Project_Issues/[[2026-04-21-UX-Dopamine-Feedback-Upgrade]]|Dopamine Feedback Engine]]
- **Upgrade**: [[04_Mechanics_Progression/[[UX_Gameplay_Protocol_V10_0]]|V10.0 UX & Gameplay Upgrade]]
- **Visuals**: [[01_Core_Engine/Visual_Feedback_Signal_Pattern|Dynamic Color & Renderer Signal]]
- **Tension**: [[04_Mechanics_Progression/[[Combat_Timeline_Difficulty_Scaling]]|World Tension Scaling]]
## 🏷️ Keyword Cluster: #Growth_Loop (성장 및 자원)
루프물로서의 지속 가능성을 담보하는 시스템입니다.
- **Evolution**: [[04_Mechanics_Progression/[[InGame_Progression_System]]|In-Game Progression & Evolution]]
- **Economy**: [[04_Mechanics_Progression/[[Meta_Economy_Growth_Loop]]|Meta-Economy & Growth Loop]]
- **Crafting**: [[04_Mechanics_Progression/[[Equipment_Crafting_and_Synthesis_Full]]|Equipment Crafting & Synthesis]]
- **Logistics**: [[04_Mechanics_Progression/[[Tactical-Air-Drop-and-Supply-Logistics]]|Tactical Air-Drop & Supply]]
## 🏷️ Keyword Cluster: #Stability_QA (안정성 및 디버깅)
시스템의 무결성을 유지하기 위한 기록입니다.
- **Audit**: [[05_Project_Issues/[[2026-04-22_Engine_Stability_Audit]]|V12.1 Engine Inte[[Grit]]y Audit]]
- **[[Optimization]]**: [[05_Project_Issues/[[2026-04-22_Engine_Logic_Optimization_Report]]|Engine Logic & Physics Optimization]]
- **Boss Fix**: [[03_Boss_Systems/[[Boss_Combat_Stability_Fix_Log]]|Boss Combat Stability Fix]]
- **Post-Mortem**: [[05_Project_Issues/2026-04-23_Post-Mortem_Loot_Rebalance|Post-Mortem: Loot & Progression Fix]]
- **Report**: [[05_Project_Issues/[[2026-04-21_Stability_and_Optimization_Report]]|2026-04-21 Stability & Optimization]]
- **Performance**: [[05_Project_Issues/[[2026-04-21-Engine-Stability-and-Optimization]]|Performance Tuning]]
id: wiki-2026-0508-skybound-knowledge-hub
title: Skybound Knowledge Hub
type: hub
aliases: [Skybound Index]
---
**Root Policy**: [[Ps-Reinforce]] v2.5 (Graph Expansion)
**Last Audit**: 2026-04-23
---
**Project Status**: Knowledge Ingestion Complete (Batch 13.1-A)
## 🏷️ Keyword Cluster: #Project_Logs (최근 개발 로그)
- [[Frontend_[[Mastery]]/[[2026-04-24-Skybound_Code_Structure_Audit_and_Stabilization_Plan]]|2026-04-24-Skybound_Code_Structure_Audit_and_Stabilization_Plan]]
- [[Frontend_Mastery/[[2026-04-24-Skybound_Final_Stylized_Casual_Magitech_Redirection]]|2026-04-24-Skybound_Final_Stylized_Casual_Magitech_Redirection]]
- [[Frontend_Mastery/[[2026-04-24-Skybound_HUD_and_TAC_LevelUp_Stylized_Casual_Magitech_Fix]]|2026-04-24-Skybound_HUD_and_TAC_LevelUp_Stylized_Casual_Magitech_Fix]]
- [[Frontend_Mastery/[[2026-04-24-Skybound_Nova_Burst_Icon_and_Effect_Fix]]|2026-04-24-Skybound_Nova_Burst_Icon_and_Effect_Fix]]
- [[Frontend_Mastery/[[2026-04-24-Skybound_Particle_and_Supply_Readability_Fix]]|2026-04-24-Skybound_Particle_and_Supply_Readability_Fix]]
- [[Frontend_Mastery/[[2026-04-24-Skybound_Semirealistic_Magitech_Fantasy_Redirection]]|2026-04-24-Skybound_Semirealistic_Magitech_Fantasy_Redirection]]
- [[Frontend_Mastery/[[2026-04-24-Skybound_Stylized_Casual_Magitech_Art_Pack]]|2026-04-24-Skybound_Stylized_Casual_Magitech_Art_Pack]]
- [[Frontend_Mastery/[[2026-04-24-Skybound_Stylized_Casual_Magitech_Ingame_Asset_Fix]]|2026-04-24-Skybound_Stylized_Casual_Magitech_Ingame_Asset_Fix]]
- [[Frontend_Mastery/[[2026-04-24-Skybound_Survivor_Like_Balance_Curve_Pass]]|2026-04-24-Skybound_Survivor_Like_Balance_Curve_Pass]]
- [[Frontend_Mastery/2026-04-25-Skybound_Core_Gameplay_Rebalance_and_[[Purpose]]_Reset|2026-04-25-Skybound_Core_Gameplay_Rebalance_and_Purpose_Reset]]
- [[Frontend_Mastery/[[2026-04-25-Skybound_Player_Airframe_and_8Stage_Boss_Continuity_Rework]]|2026-04-25-Skybound_Player_Airframe_and_8Stage_Boss_Continuity_Rework]]
- [[Frontend_Mastery/[[2026-04-25-Skybound_Skill_Concept_and_Hangar_Layout_Overlap_Fix]]|2026-04-25-Skybound_Skill_Concept_and_Hangar_Layout_Overlap_Fix]]
- [[Frontend_Mastery/[[2026-04-25-Skybound_TacExp_DirectKill_and_UI_Productization_Pass]]|2026-04-25-Skybound_TacExp_DirectKill_and_UI_Productization_Pass]]
- [[Frontend_Mastery/[[2026-04-25-Skybound_Vampire_Survivors_Loop_and_Stage_Curve_Preparation]]|2026-04-25-Skybound_Vampire_Survivors_Loop_and_Stage_Curve_Preparation]]
- [[Frontend_Mastery/[[2026-04-26-Skybound_Enemy_Motion_Damage_Pressure_and_Projectile_Visual_Pass]]|2026-04-26-Skybound_Enemy_Motion_Damage_Pressure_and_Projectile_Visual_Pass]]
- [[Frontend_Mastery/[[2026-04-26-Skybound_HP_Scarcity_and_Module_Cache_Rewards]]|2026-04-26-Skybound_HP_Scarcity_and_Module_Cache_Rewards]]
- [[Frontend_Mastery/[[2026-04-26-Skybound_Invasion_Response_Stage_Difficulty_Curve]]|2026-04-26-Skybound_Invasion_Response_Stage_Difficulty_Curve]]
- [[Frontend_Mastery/[[2026-04-26-Skybound_Low_Level_First_Upgrade_Offer_Balance]]|2026-04-26-Skybound_Low_Level_First_Upgrade_Offer_Balance]]
- [[Frontend_Mastery/[[2026-04-26-Skybound_Miniboss_Treasure_Cache_Reward_Loop]]|2026-04-26-Skybound_Miniboss_Treasure_Cache_Reward_Loop]]
- [[Frontend_Mastery/[[2026-04-26-Skybound_Player_Sprite_Path_Warning_Fix]]|2026-04-26-Skybound_Player_Sprite_Path_Warning_Fix]]
- [[Frontend_Mastery/[[2026-04-26-Skybound_Reward_Card_Clarity_and_Command_Cache_UI]]|2026-04-26-Skybound_Reward_Card_Clarity_and_Command_Cache_UI]]
- [[Frontend_Mastery/[[2026-04-26-Skybound_Skill_Slot_Limit_Weapon5_Passive5]]|2026-04-26-Skybound_Skill_Slot_Limit_Weapon5_Passive5]]
- [[Frontend_Mastery/[[2026-04-26-Skybound_Skip_Upgrade_and_Weapon_Transform_Reconfiguration]]|2026-04-26-Skybound_Skip_Upgrade_and_Weapon_Transform_Reconfiguration]]
- [[Frontend_Mastery/[[2026-04-26-Skybound_Stage1_to_3_Playtest_Balance_Bomb_and_Visual_Diversity_Pass]]|2026-04-26-Skybound_Stage1_to_3_Playtest_Balance_Bomb_and_Visual_Diversity_Pass]]
- [[Frontend_Mastery/[[2026-04-26-Skybound_Stage_Miniboss_Pattern_Differentiation]]|2026-04-26-Skybound_Stage_Miniboss_Pattern_Differentiation]]
- [[Skybound/05_Project_Issues/2026-04-21-Engine-Stability-and-Optimization|2026-04-21-Engine-Stability-and-Optimization]]
- [[Skybound/05_Project_Issues/[[2026-04-21-Implementation-and-Architecture-Report]]|2026-04-21-Implementation-and-Architecture-Report]]
- [[Skybound/05_Project_Issues/2026-04-21-Project-Report-V11.5-Combat-and-UI-Recovery|2026-04-21-Project-Report-V11.5-Combat-and-UI-Recovery]]
- [[Skybound/05_Project_Issues/2026-04-21-UX-Dopamine-Feedback-Upgrade|2026-04-21-UX-Dopamine-Feedback-Upgrade]]
- [[Skybound/05_Project_Issues/2026-04-22_Engine_Logic_Optimization_Report|2026-04-22_Engine_Logic_Optimization_Report]]
- [[Skybound/05_Project_Issues/2026-04-22_Engine_Stability_Audit|2026-04-22_Engine_Stability_Audit]]
- [[Skybound/2026-04-24-Skybound_Code_Structure_Audit_and_Stabilization_Plan|2026-04-24-Skybound_Code_Structure_Audit_and_Stabilization_Plan]]
- [[Skybound/2026-04-24-Skybound_Final_Stylized_Casual_Magitech_Redirection|2026-04-24-Skybound_Final_Stylized_Casual_Magitech_Redirection]]
- [[Skybound/2026-04-24-Skybound_HUD_and_TAC_LevelUp_Stylized_Casual_Magitech_Fix|2026-04-24-Skybound_HUD_and_TAC_LevelUp_Stylized_Casual_Magitech_Fix]]
- [[Skybound/2026-04-24-Skybound_Nova_Burst_Icon_and_Effect_Fix|2026-04-24-Skybound_Nova_Burst_Icon_and_Effect_Fix]]
- [[Skybound/2026-04-24-Skybound_Particle_and_Supply_Readability_Fix|2026-04-24-Skybound_Particle_and_Supply_Readability_Fix]]
- [[Skybound/2026-04-24-Skybound_Semirealistic_Magitech_Fantasy_Redirection|2026-04-24-Skybound_Semirealistic_Magitech_Fantasy_Redirection]]
- [[Skybound/2026-04-24-Skybound_Stylized_Casual_Magitech_Art_Pack|2026-04-24-Skybound_Stylized_Casual_Magitech_Art_Pack]]
- [[Skybound/2026-04-24-Skybound_Stylized_Casual_Magitech_Ingame_Asset_Fix|2026-04-24-Skybound_Stylized_Casual_Magitech_Ingame_Asset_Fix]]
- [[Skybound/2026-04-24-Skybound_Survivor_Like_Balance_Curve_Pass|2026-04-24-Skybound_Survivor_Like_Balance_Curve_Pass]]
- [[Skybound/[[2026-04-25-Skybound_Core_Gameplay_Rebalance_and_Purpose_Reset]]|2026-04-25-Skybound_Core_Gameplay_Rebalance_and_Purpose_Reset]]
- [[Skybound/2026-04-25-Skybound_Player_Airframe_and_8Stage_Boss_Continuity_Rework|2026-04-25-Skybound_Player_Airframe_and_8Stage_Boss_Continuity_Rework]]
- [[Skybound/2026-04-25-Skybound_Skill_Concept_and_Hangar_Layout_Overlap_Fix|2026-04-25-Skybound_Skill_Concept_and_Hangar_Layout_Overlap_Fix]]
- [[Skybound/2026-04-25-Skybound_TacExp_DirectKill_and_UI_Productization_Pass|2026-04-25-Skybound_TacExp_DirectKill_and_UI_Productization_Pass]]
- [[Skybound/2026-04-25-Skybound_Vampire_Survivors_Loop_and_Stage_Curve_Preparation|2026-04-25-Skybound_Vampire_Survivors_Loop_and_Stage_Curve_Preparation]]
- [[Skybound/2026-04-26-Skybound_Enemy_Motion_Damage_Pressure_and_Projectile_Visual_Pass|2026-04-26-Skybound_Enemy_Motion_Damage_Pressure_and_Projectile_Visual_Pass]]
- [[Skybound/2026-04-26-Skybound_HP_Scarcity_and_Module_Cache_Rewards|2026-04-26-Skybound_HP_Scarcity_and_Module_Cache_Rewards]]
- [[Skybound/2026-04-26-Skybound_Invasion_Response_Stage_Difficulty_Curve|2026-04-26-Skybound_Invasion_Response_Stage_Difficulty_Curve]]
- [[Skybound/2026-04-26-Skybound_Low_Level_First_Upgrade_Offer_Balance|2026-04-26-Skybound_Low_Level_First_Upgrade_Offer_Balance]]
- [[Skybound/2026-04-26-Skybound_Miniboss_Treasure_Cache_Reward_Loop|2026-04-26-Skybound_Miniboss_Treasure_Cache_Reward_Loop]]
- [[Skybound/2026-04-26-Skybound_Player_Sprite_Path_Warning_Fix|2026-04-26-Skybound_Player_Sprite_Path_Warning_Fix]]
- [[Skybound/2026-04-26-Skybound_Reward_Card_Clarity_and_Command_Cache_UI|2026-04-26-Skybound_Reward_Card_Clarity_and_Command_Cache_UI]]
- [[Skybound/2026-04-26-Skybound_Skill_Slot_Limit_Weapon5_Passive5|2026-04-26-Skybound_Skill_Slot_Limit_Weapon5_Passive5]]
- [[Skybound/2026-04-26-Skybound_Skip_Upgrade_and_Weapon_Transform_Reconfiguration|2026-04-26-Skybound_Skip_Upgrade_and_Weapon_Transform_Reconfiguration]]
- [[Skybound/2026-04-26-Skybound_Stage1_to_3_Playtest_Balance_Bomb_and_Visual_Diversity_Pass|2026-04-26-Skybound_Stage1_to_3_Playtest_Balance_Bomb_and_Visual_Diversity_Pass]]
- [[Skybound/2026-04-26-Skybound_Stage_Miniboss_Pattern_Differentiation|2026-04-26-Skybound_Stage_Miniboss_Pattern_Differentiation]]
## 📌 한 줄 통찰 (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)
### Shelf section
```markdown
## Combat AI
- [[Skybound Enemy Orientation Fix]]
- [[Boss Phase Transition Pattern]]
- [[Aggro Tracker Design]]
```
**선택 A를 써야 할 때:**
- *(TODO)*
### 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
```
**선택 B를 써야 할 때:**
- *(TODO)*
### Backlink enforcement check
```bash
# CI check: every Skybound note must link back to hub
rg -L 'Skybound Knowledge Hub' 10_Wiki/Topics/Skybound/*.md
```
**기본값:**
> *(TODO)*
### Auto-generated TOC (Python)
```python
from pathlib import Path
import frontmatter
## ❌ 안티패턴 (Anti-Patterns)
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)
```
- **[안티패턴]:** *(TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
### 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
- 부모: [[Knowledge Management]] · [[Map of Content]]
- 변형: [[Domain Hub]] · [[Project Hub]]
- 응용: [[01_Core_Engine]] · [[02_Combat_AI]] · [[03_Boss_Systems]] · [[04_Mechanics_Progression]] · [[05_Project_Issues]]
- Adjacent: [[Wiki Cleanup Spec]] · [[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 |
@@ -1,88 +1,154 @@
---
id: wiki-2026-0508-skybound-enemy-orientation-fix
title: Skybound Enemy Orientation Fix
category: 10_Wiki/Topics_GD
status: needs_review
category: 10_Wiki/Topics
status: verified
canonical_id: self
aliases: []
aliases: [Enemy Facing Bug, Sprite Flip Fix, Orientation Update Loop]
duplicate_of: none
source_trust_level: A
confidence_score: 0.92
tags: [uncategorized]
confidence_score: 0.9
verification_status: applied
tags: [skybound, combat-ai, sprite, orientation, bugfix]
raw_sources: []
last_reinforced: 2026-05-08
last_reinforced: 2026-05-10
github_commit: pending
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
tech_stack:
language: typescript
framework: skybound-engine
---
# [LOG] [[Skybound Enemy Orientation Fix]] (Crab Movement Bug)
# Skybound Enemy Orientation Fix
- **Timestamp**: 2026-04-23 23:13 (KST)
- **Status**: Resolved
- **Lead**: Steve (Executive Director)
## 매 한 줄
> **"매 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.
## 1. 버그 내용 (Bug Description)
- **현상**: 적기가 화면 상단에서 등장할 때 정면(아래)을 보지 않고 오른쪽을 바라본 채 하강하는 '꽃게 이동' 현상 발생.
- **원인**: 적기 생성 시 `rotation` 초기값이 `0`이었으며, 등장 단계(Entrance)에서 플레이어를 조준하는 로직이 조기 종료(Early Return)로 인해 실행되지 않아 렌더링 오프셋(`+PI/2`)만 적용되어 오른쪽을 바라보게 됨.
## 매 핵심
## 2. 해결 방법 (Re[[Solution]])
- **초기화 강화**: `SpawnerSystem`에서 적기 생성 시 `rotation: Math.PI / 2`를 기본값으로 명시적 할당.
- **로직 순서 재조정**: `CombatSystem`의 업데이트 루프에서 회전값 계산을 등장 단계 분기점 이전으로 전진 배치하여, 어떤 상태에서도 적기가 플레이어 방향(또는 아래 방향)을 유지하도록 보장.
### 매 문제
- Enemy 가 path target 에 도달 후 멈추면 last-known facing 유지.
- Player 가 옆에 다가가도 그대로 → unrealistic + hitbox mismatch.
- Sprite flip 이 movement input 에만 react.
## 3. 결과 (Expected Result)
- 적기가 생성되는 즉시 플레이어를 향해 정면을 유지하며 하강함.
- 시각적 직관성 및 전투 몰입도 향상.
### 매 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.
## 4. 관련 토픽 (Linked Topics)
- Skybound: 엔진 렌더링 무결성 확보.
- Graphics & Performance: 스프라이트 회전 행렬 최적화.
### 매 응용
1. Skybound enemy AI.
2. 2D platformer enemy facing.
3. Top-down shooter NPC orientation.
## 📌 한 줄 통찰 (The Karpathy Summary)
## 💻 패턴
> *(TODO: 한 문장으로 핵심 통찰을 작성. "X는 Y 조건에서 Z 효과를 낸다" 구조 권장.)*
### 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";
}
}
```
## 📖 구조화된 지식 (Synthesized Content)
### 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";
}
```
**추출된 패턴:**
> *(TODO)*
### 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 });
}
}
```
**세부 내용:**
- *(TODO)*
### 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];
}
```
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
### 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 };
}
```
**언제 이 지식을 쓰는가:**
- *(TODO)*
### 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");
});
```
**언제 쓰면 안 되는가:**
- *(TODO)*
## 매 결정 기준
| 상황 | 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 |
## 🧪 검증 상태 (Validation)
**기본값**: velocity-driven + idle fallback + hysteresis + anim sync.
- **정보 상태:** needs_review
- **출처 신뢰도:** A
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
## 🔗 Graph
- 부모: [[Combat AI]] · [[Sprite Animation]]
- 변형: [[NPC Pathfinding Facing]] · [[Player Facing]]
- 응용: [[Skybound Knowledge Hub]] · [[Boss Orientation]]
- Adjacent: [[Hitbox System]] · [[Animation State Machine]]
## 🧬 중복 검사 (Duplicate Check)
## 🤖 LLM 활용
**언제**: 2D action game enemy facing bug, hitbox mirror, anim sync.
**언제 X**: 3D character (use root motion + IK), turn-based grid.
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
- **처리 방식:** UPDATE (자동 정규화)
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
## ❌ 안티패턴
- **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.
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
## 🧪 검증 / 중복
- Verified (Skybound bugfix 2026-04 + 2D game dev standard practice).
- 신뢰도 A.
- **과거 데이터와의 충돌:** 없음
- **정책 변화:** 없음
## 🔗 지식 연결 (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 |
## 🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — FULL spec rewrite with orientation patterns |
@@ -1,74 +1,32 @@
---
id: wiki-2026-0508-war-commander-전투-시스템
title: War Commander → 전투 시스템
category: 10_Wiki/Topics_GD
status: needs_review
canonical_id: self
category: 10_Wiki/Topics
status: duplicate
canonical_id: war-commander-combat-system
duplicate_of: "[[War Commander Combat System]]"
aliases: []
duplicate_of: none
source_trust_level: A
confidence_score: 0.92
tags: [uncategorized]
raw_sources: []
last_reinforced: 2026-05-08
confidence_score: 0.9
verification_status: redirected
tags: [duplicate, war-commander, combat-system]
last_reinforced: 2026-05-10
github_commit: pending
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
---
# [[War Commander → 전투 시스템]]
# War Commander → 전투 시스템
## 📌 한 줄 통찰 (The Karpathy Summary)
War Commander의 전투 시스템은 기지 건설, 자원 물류, 실시간 전술 교전이 결합된 복잡한 다층적 환경입니다 [1]. 플레이어는 유닛의 마이크로 컨트롤, 겹겹이 쌓인 기지 방어 아키텍처, 그리고 유닛 간의 가위바위보식 상성을 종합적으로 이해하고 활용해야 합니다 [2-4]. 최신 기술 업데이트와 다양한 플랫폼 방어 저항성의 추가로 공격과 방어 메타가 지속적으로 진화하고 있어, 더욱 세밀한 부대 구성과 고도의 전술이 요구됩니다 [5, 6].
> **이 문서는 [[War Commander Combat System]] 의 중복본입니다.** Canonical 문서로 redirect.
## 📖 구조화된 지식 (Synthesized Content)
* **지휘 및 통제 (C2) 메커니즘:**
2014년에 도입된 전투 제어([[Combat Controls]]) 시스템을 통해 플레이어는 실시간으로 세밀하게 유닛을 조종할 수 있습니다 [2, 7]. 단축키를 사용하여 공격 이동(A), 이동(M), 정지(S), 위치 사수(D), 자율 사격(F) 등의 직접적인 명령을 내릴 수 있습니다 [7, 8]. 또한 유닛 분산(X)을 통해 범위 피해(Splash/AoE)를 줄이거나, 적의 체력 확인(B), 특정 유닛을 그룹 지정([[Shift]]+숫자)하여 다중 전선 공격을 분할 지휘하는 기능도 제공됩니다 [9, 10].
* **유닛 상성 및 데미지 시스템:**
전투는 기본적으로 '공중 유닛 > 중장갑 > 경장갑 > 공중 유닛'으로 이어지는 가위바위보 형태의 상성 구조를 가집니다 [4]. 유닛 생산 시 데미지 패널의 색상 아이콘을 통해 상성을 직관적으로 파악할 수 있으며, 진녹색은 최대 피해, 빨간색은 타겟에 피해가 거의 들어가지 않음을 의미합니다 [11, 12]. 특히, 방어 플랫폼들은 특정 피해 유형(Sustain, Burst, AREA, 공중, 지상 등)에 대해 50%의 피해 감소(저항) 능력을 제공하기 때문에, 공격 시 단일 유닛 위주의 부대는 효율이 급감하며 다양한 피해 프로필을 가진 혼합 소대(Mixed Platoons) 구성이 필수적입니다 [6, 13-15].
* **핵심 공격 전술:**
* **유인 전술 ([[Baiting]]):** 방어 건물에 얽매여 있는 적 유닛(자율 사격이나 일반 태세인 경우)을 기지 방어선 밖으로 끌어내어 요격하는 필수 전술입니다 [16, 17]. 예를 들어, 빠른 지상 유닛으로 적의 느리고 무거운 전차를 유인해 아군 공중 유닛의 사거리로 끌어들여 파괴합니다 [18, 19].
* **헬파이어 저격 (Hellfire Sniping):** 사거리가 매우 긴 헬파이어 탱크를 이용하여 포탑의 사거리 밖에서 안전하게 적 방어망을 두들기는 장거리 공성 전술입니다 [20].
* **스윕 및 회피:** 지뢰밭을 파악하기 위해 보병이나 공격견을 던지거나, 이동 속도가 빠른 유닛(예: 팔라딘 전차)을 이용해 포탑이나 미사일의 폭발 반경에서 빠르게 벗어나는 전술이 활용됩니다 [21, 22].
* **기지 방어 아키텍처:**
효과적인 기지 방어는 지휘 본부와 전력 생산 시설 등 중요 인프라를 중앙에 배치하고, 적이 여러 겹의 교차 사격망과 함정을 통과하도록 유도하는 기하학적 배치에 의존합니다 [3, 23].
* 기관총과 박격포를 번갈아 배치하는 '스퀘어 기지(Square Base)'와 공중 사전 공격(Air Prep) 및 유인 전술을 원천 차단하기 위해 감시탑과 저격수/박격포 팀을 촘촘히 운용하는 '블리츠 기지(Blitz Base)' 배치가 대표적입니다 [24-27].
* 2026년 업데이트 등을 통해, 항공기에 난기류를 유발하는 Nightwatch 벙커와 사격할수록 연사력이 증가하는 Metronomos 포탑 등이 추가되어 방어망이 한층 고도화되었습니다 [13, 28, 29]. 지휘 본부처럼 높은 건물 뒤에 유닛을 숨겨 시야를 가리거나, 의도적으로 약해 보이는 허점(Honey Pot)을 만들어 적을 지뢰밭으로 유인하는 심리전도 매우 유효합니다 [30].
## 핵심 요약
- 한국어 title 의 redirect arrow notation 변형 — alias.
- 매 동일 scope: War Commander 의 combat system reference.
## 🔗 지식 연결 (Graph)
- **Related Topics:** [[전투 제어(Combat Controls)]], [[유인 전술(Baiting)]], [[유닛 상성(Unit Counters)]], [[방어 아키텍처(Defensive [[Architecture]])]], [[플랫폼 저항성(Platform Resistance)]]
- **Projects/Contexts:** [[Arc 2 기술 및 2026년 연구 업데이트(March 2026 [[Research]] Drop)]], [[섹터 분쟁 및 전초기지 전투([[Sector]] Warfare and Elite Event [[Opera]]tions)]]
- **Contradictions/Notes:** 헬파이어 탱크는 게임 내 가장 긴 사거리를 가져 장거리 타격(Hellfire Sniping)에 매우 유리하지만, 체력이 극도로 약한 '유리 대포(Glass Cannon)'입니다. 따라서 이 이점을 살리기 위해서는 다연장 로켓, 박격포, 크라이오 포탑 등에 노출되지 않도록 대공 방어(AA) 유닛이나 고기방패 역할을 할 중전차의 호위가 반드시 동반되어야만 합니다 [20, 31-33].
## 🔗 Graph
- 부모: [[War Commander Combat System]] (canonical)
---
*Last updated: 2026-04-27*
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
**언제 이 지식을 쓰는가:**
- *(TODO)*
**언제 쓰면 안 되는가:**
- *(TODO)*
## 🧪 검증 상태 (Validation)
- **정보 상태:** needs_review
- **출처 신뢰도:** A
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
## 🧬 중복 검사 (Duplicate Check)
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
- **처리 방식:** UPDATE (자동 정규화)
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
- **과거 데이터와의 충돌:** 없음
- **정책 변화:** 없음
## 🕓 변경 이력 (Changelog)
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|------|-----------|-----------|--------|
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
## 🕓 변경 이력
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | 중복 처리 — canonical 문서로 redirect |
@@ -1,110 +1,32 @@
---
id: wiki-2026-0508-war-commander-전투-전술-및-방어-메타
title: War Commander 전투 전술 및 방어 메타
category: 10_Wiki/Topics_GD
status: needs_review
canonical_id: self
category: 10_Wiki/Topics
status: duplicate
canonical_id: war-commander-combat-system
duplicate_of: "[[War Commander Combat System]]"
aliases: []
duplicate_of: none
source_trust_level: A
confidence_score: 0.92
tags: [uncategorized]
raw_sources: []
last_reinforced: 2026-05-08
confidence_score: 0.9
verification_status: redirected
tags: [duplicate, war-commander, combat, defense-meta]
last_reinforced: 2026-05-10
github_commit: pending
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
tech_stack:
language: unspecified
framework: unspecified
---
# [[War Commander 전투 전술 및 방어 메타]]
# War Commander 전투 전술 및 방어 메타
## 📌 한 줄 통찰 (The Karpathy Summary)
War Commander의 전투 전술과 방어 메타는 실시간 유닛 컨트롤, 구조물의 기하학적 배치, 그리고 기술 업데이트에 맞춰 끊임없이 진화하는 복잡한 전략 시스템이다 [1, 2]. 공격자는 인공지능의 추적 논리를 역이용하는 '미끼([[Baiting]])' 전술이나 압도적인 화력을 앞세우는 방식을 활용하며, 방어자는 포탑과 방어 플랫폼을 다중으로 겹쳐 적의 침투를 막는 킬존(Kill zone)을 형성한다 [3, 4]. 특히 2026년 3월 업데이트로 특정 데미지 유형에 강한 내성을 지닌 방어 플랫폼들이 대거 도입됨에 따라, 공격 시 다양한 공격 형태를 띠는 혼합 소대(Mixed Platoons)의 운용이 필수적인 메타로 자리 잡았다 [5, 6].
> **이 문서는 [[War Commander Combat System]] 의 중복본입니다.** Canonical 문서로 redirect.
## 📖 Core 소스 Content
## 핵심 요약 (specialization aspects)
- 한국어 title — Korean reader 의 alias.
- Specialization: 전투 전술 (combat tactics) + 방어 메타 (defense meta) — canonical 의 subsection.
**핵심 전투 제어 및 공격 전술 (Core [[Combat Controls]] and Offensive Tactics)**
* **전투 제어(Combat Controls):** 2014년에 도입된 전투 제어 시스템은 플레이어에게 정밀한 유닛 통제력을 제공한다 [2]. 주요 명령으로는 강제 공격(A), 이동(M), 정지(S), 위치 사수(D), 자율 사격(F)이 있으며, 전투 중 'X' 키를 눌러 유닛을 산개시키면 박격포 등 범위(AoE) 공격의 피해를 최소화할 수 있다 [7-10].
* **미끼(Baiting) 전술:** 공격 시 가장 핵심적인 고급 전술로, 적의 인공지능 추적 로직을 역이용하여 방어 유닛을 기지 밖으로 유인해 처치하는 전략이다 [3, 11]. 상대 유닛이 '자율 사격(Fire at Will)'이나 '일반' 상태일 때 매우 효과적이며, 빠르고 약한 유닛으로 적의 중전차를 꿰어내어 아군의 강력한 포위망으로 이끄는 방식이 자주 쓰인다 [3, 12].
* **공격 스타일:** 압도적인 화력을 가진 중전차(Paladins, Challengers 등)를 앞세워 방어선을 밀어버리는 '스팀롤(Steamroll)' 전술과, 빠르고 비용 효율이 좋은 보병이나 버기카 등을 이용해 적의 보급로 등을 치고 빠지는 '게릴라(Guerrilla)' 전술이 주로 활용된다 [13, 14].
## 🔗 Graph
- 부모: [[War Commander Combat System]] (canonical)
**방어 아키텍처 및 기지 설계 (Defensive [[Architecture]] and Base Design Meta)**
* 기본적인 방어 교리는 지휘 본부([[Command Center]]), 자원 저장소, 발전소 등 중요 인프라를 중심으로 구조물을 다층 배치하여 적이 여러 겹의 교차 사격망을 뚫도록 강제하는 것이다 [4].
* **사각 기지 (Square Base):** 기지 중심부에 중요 건물을 두고 그 주위를 기관총 포탑과 박격포탑을 교차로 둘러싸는 형태로, 방향에 상관없이 균일한 방어력을 제공하는 보편적인 설계다 [15, 16].
* **블리츠 기지 (Blitz Base):** 미끼(Baiting) 전술에 당하지 않도록 특화된 설계다 [17, 18]. 기지 중앙 부근 감시탑(Watch Tower)에 강력한 대공 보병을 배치해 공중 폭격을 차단하며, Hellfire와 같은 장거리 공성 전차를 저지하기 위해 박격포탑을 외곽에, 기관총 포탑을 그 뒤에 배치하여 방어선을 구축한다 [17, 18].
**2026년 3월 메타의 진화 (The March 2026 Meta [[Shift]])**
* 2026년 3월 '[[Research]] Drop' 업데이트는 방어 메타에 획기적인 변화를 가져왔다 [19]. 새롭게 개편된 지원([[Support]]) 및 중형(Heavy) 플랫폼들은 각기 다른 공격 유형(지상, 공중, 구역(AREA), 폭발(BURST), 지속(SUSTAIN) 피해 등)에 대해 50%의 데미지 감소 효과를 부여하거나 상태 이상 면역 효과를 제공한다 [5, 20-22]. 이로 인해 공격자는 단일 피해 유형을 가진 병력만으로는 방어선을 뚫을 수 없으며, 반드시 다채로운 공격 방식을 섞은 **혼합 소대(Mixed Platoons)**를 운용해야만 한다 [6].
* **신규 방어 구조물 도입:** 발사 속도가 점진적으로 빨라지며 적 전차를 효과적으로 제압하는 폭발(Burst) 피해 특화 중포탑인 **Metronomos**, 그리고 사거리 보너스와 함께 주변 300 범위 내의 적 항공기에 난기류(Turbulence) 상태 이상을 일으켜 대공 방어력을 극대화하는 **Nightwatch Bunker**가 등장하여 기지 방어력이 한층 견고해졌다 [20, 23, 24].
## 🔗 지식 연결 (Graph)
- **Related Topics:** [[Baiting Tactics]], [[Combat Controls]], [[Base Layouts]], Mixed Platoons, Support/Heavy Platforms
- **Projects/Contexts:** War Commander Combat Ecosystem, [[March 2026 Re[[Search]] Drop]]
- **Contradictions/Notes:** 기지 방어 설계 중 Square Base는 보편적으로 강력하지만, Behemoth처럼 높은 체력을 지닌 탱킹 유닛이 피해를 흡수하는 동안 장거리 공성 전차가 방어망을 타격하는 전술에는 취약하다는 치명적인 단점을 지니고 있다 [15, 16].
---
*Last updated: 2026-04-27*
## 📖 구조화된 지식 (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)
- **과거 데이터와의 충돌:** 없음
- **정책 변화:** 없음
## 🕓 변경 이력 (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: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
## 🕓 변경 이력
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | 중복 처리 — canonical 문서로 redirect |