balancelisted
Install: claude install-skill snwlee/Nereus
# balance
nereus:common 규칙을 따른다. 담당 에이전트: economy-designer.
**엔진과 무관하다** — 로블록스든 Unity든 같은 절차다.
## 왜 시뮬레이터인가
밸런싱을 체크리스트로 하면 게이트가 사람 판단에 의존해 검증이 불가능해진다.
시뮬레이터는 결정론적이라 (1) 회귀 테스트가 성립하고 (2) 수식을 고쳤을 때 무엇이 달라졌는지 보이고
(3) finish 게이트가 "밸런스가 깨졌다"를 기계적으로 판정할 수 있다.
## 1. 장르 프로파일을 먼저 고른다
```js
import { loadProfile, listProfiles } from "../../lib/profiles.mjs";
const profile = loadProfile("sim-tycoon"); // 또는 "obby-platformer"
```
쓸 수 있는 장르는 `node plugins/nereus-game/lib/profiles.mjs` 로 확인한다.
알 수 없는 장르는 **던진다**. 기본값으로 떨어지지 않는다 — 다른 장르로 밸런싱하면 수치가
그럴듯한 채로 틀리고, 그건 수치가 없는 것보다 나쁘다.
장르가 정하는 것: 핵심 루프(`loop`), 봐야 할 지표(`metrics`), **주 실패 양상**(`balance.failureMode`),
절벽 임계(`balance.cliffRatio`).
## 2. 경제를 데이터로 옮긴다
밸런싱 대상을 `{ income, stages }` 로 정규화한다. 이 형태로 못 옮기면 아직 설계가 안 끝난 것이다.
```js
const economy = {
income: { base: 10, growth: 1.1 }, // 턴당 기본 수입과 증가 계수
stages: [{ name: "1단계", cost: 50 }, { name: "2단계", cost: 300 }],
};
```
도메인별로 `stages` 가 뜻하는 것이 다르다 — 타이쿤은 업그레이드 단계, 오비는 구간,
전투는 파워 티어, 진행은 레벨 구간이다. 비용 축만 같으면 된다.
## 3. 돌린다
```js
import { simulate } from "../../lib/balance-sim.mjs";
const r = simulate({ profile, economy, turns: 60, seed: 1 });
```
`seed` 를 고정한다. 같은 입력이면 같은 출력이어야 게이트로 쓸 수 있다.
## 4. 결과를 읽는다
| 지표 | 뜻 | 대응 |
|---|---|---|
| `bottlenecks` | 시뮬 종료까지 **못 깬 단계 이름** | 그 단계 비용을 내리거나, 그 앞에 수입원을 추가한다. 타이쿤의 1순위 |
| `inflation` | 턴당 수입 증가율 − 턴당 비용 증가율 | 양수가 지속되면 후반이 무의미해진다. 비용 곡선을 가파르게 하거나 자원 싱크를 넣는다 |
| `cliffs` | 앞 단계 대비 비용 배수가 `cliffRatio` 를 넘는 단계 인덱스 | 중간 단계를