id: 7ebd60aeb55e483a94ad341fef7d3e5b
parent_id: fc04005dc0cf449c9802de82579564cd
item_type: 1
item_id: 088737f31c514f1da21cc42c0ab6acc1
item_updated_time: 1785523646943
title_diff: "[]"
body_diff: "[{\"diffs\":[[0,\"e quests\"],[1,\", **(+2025 evolution:) infinite tower, expeditions, town buildings meta, carnival, pity system, gear scoring, titles UX, XP lamps**\"],[0,\" |\\\n| **T\"]],\"start1\":1042,\"start2\":1042,\"length1\":16,\"length2\":147},{\"diffs\":[[0,\"r tasks\\\n\"],[1,\"- **Re-reviewed Idle Fantasy at v1.12.11 (366 stars, 810 commits, 2026-07)**: new systems captured — Infinite Tower, Expeditions, Buildings/Builder's Workshop, Carnival, pity system, gear scoring, titles UX, XP lamps, raid bosses. See [Idle Fantasy Inspirations](joplin://fea2d81f0414484fa4edf126f8ca17ed).\\\n\"],[0,\"- Analyz\"]],\"start1\":1949,\"start2\":1949,\"length1\":16,\"length2\":323},{\"diffs\":[[0,\" mapping\"],[1,\" **(+ infinite tower, expeditions, buildings, carnival, pity, gear scoring, titles, XP lamps)**\"],[0,\" |\\\n| [Lo\"]],\"start1\":5079,\"start2\":5079,\"length1\":16,\"length2\":111},{\"diffs\":[[0,\"ontend, \"],[1,\"**\"],[0,\"multi-re\"]],\"start1\":5637,\"start2\":5637,\"length1\":16,\"length2\":18},{\"diffs\":[[0,\"ti-repo \"],[-1,\"structure\"],[1,\"+ bilingual shared-repo layout**\"],[0,\", databa\"]],\"start1\":5650,\"start2\":5650,\"length1\":25,\"length2\":48},{\"diffs\":[[0,\"ith \"],[-1,\"Common\\\n\\\n```\\\ngithub.com/{org}/\"],[1,\"Bilingual Common\\\n\\\nThree repos, kept as **siblings under one parent folder** (the parent is a plain folder, not a git repo). The backend opens in **RustRover**, the frontend in **WebStorm**, the shared repo in a third window (or \\\"Attach\\\"ed in either IDE). Full rationale & codegen strategy in [Tech Stack & Architecture](joplin://980c3eb587294e4383474b94988f2f88).\\\n\\\n```\\\n~/dev/skara-brae/                  # workspace root (plain folder, NOT a git repo)\"],[0,\"\\\n├──\"]],\"start1\":9146,\"start2\":9146,\"length1\":37,\"length2\":459},{\"diffs\":[[0,\"        \"],[1,\"   \"],[0,\"# Rust b\"]],\"start1\":9626,\"start2\":9626,\"length1\":16,\"length2\":19},{\"diffs\":[[0,\"d (Axum)\"],[1,\" — opened in RustRover\"],[0,\"\\\n│   ├──\"]],\"start1\":9650,\"start2\":9650,\"length1\":16,\"length2\":38},{\"diffs\":[[0,\"        \"],[1,\"  \"],[1,\" \"],[0,\"# HTTP +\"]],\"start1\":9721,\"start2\":9721,\"length1\":16,\"length2\":19},{\"diffs\":[[0,\"sb-core/\"],[1,\"   \"],[0,\"        \"]],\"start1\":9770,\"start2\":9770,\"length1\":16,\"length2\":19},{\"diffs\":[[0,\"        \"],[1,\"   \"],[0,\"# Databa\"]],\"start1\":9885,\"start2\":9885,\"length1\":16,\"length2\":19},{\"diffs\":[[0,\"        \"],[1,\" \"],[1,\"  \"],[0,\"# JWT + \"]],\"start1\":9957,\"start2\":9957,\"length1\":16,\"length2\":19},{\"diffs\":[[0,\"        \"],[1,\"   \"],[0,\"# Server\"]],\"start1\":10022,\"start2\":10022,\"length1\":16,\"length2\":19},{\"diffs\":[[0,\"ver-\"],[-1,\"internal\"],[1,\"INTERNAL\"],[0,\" sha\"]],\"start1\":10038,\"start2\":10038,\"length1\":16,\"length2\":16},{\"diffs\":[[0,\"onstants\"],[1,\" (stays here)\"],[0,\"\\\n│   ├──\"]],\"start1\":10074,\"start2\":10074,\"length1\":16,\"length2\":29},{\"diffs\":[[0,\"rgo.toml\"],[1,\"                 # sb-common = { path = \\\"../skara-brae-common/rust\\\" }\"],[0,\"\\\n│   └──\"]],\"start1\":10126,\"start2\":10126,\"length1\":16,\"length2\":85},{\"diffs\":[[0,\"        \"],[1,\"   \"],[0,\"# Vue 3 \"]],\"start1\":10255,\"start2\":10255,\"length1\":16,\"length2\":19},{\"diffs\":[[0,\"frontend\"],[1,\" — opened in WebStorm\"],[0,\"\\\n│   ├──\"]],\"start1\":10274,\"start2\":10274,\"length1\":16,\"length2\":37},{\"diffs\":[[0,\"json\"],[-1,\"\\\n└── skara-brae-common/          # Shared between client and server\"],[1,\"               # \\\"@skara-brae/common\\\": \\\"file:../skara-brae-common/ts\\\"\\\n└── skara-brae-common/             # Cross-language shared repo (bilingual package)\"],[0,\"\\\n   \"]],\"start1\":10333,\"start2\":10333,\"length1\":75,\"length2\":161},{\"diffs\":[[0,\"├── \"],[-1,\"game-\"],[0,\"data\"]],\"start1\":10495,\"start2\":10495,\"length1\":13,\"length2\":8},{\"diffs\":[[0,\"    \"],[-1,\"# Adventure templates, item defs,\"],[1,\"        # items/ adventures/\"],[0,\" crit\"],[-1,\" \"],[1,\"-\"],[0,\"tables\"],[-1,\",\"],[1,\"/\"],[0,\" spell\"],[-1,\" lists,\"],[1,\"s/\"],[0,\" recipes\"],[-1,\", medal defs (JSON/TOML)\\\n    ├── api-types/              # Shared API request/response type definitions\\\n    └── constants/              # Game constants, formula parameters, stat caps\\\n```\"],[1,\"/\\\n    │   └── schema/                #   medals/ dungeons/ tower/ expeditions/ (*.json/*.toml)\\\n    │                              #   JSON Schema (entities) + openapi.yaml (API contract)\\\n    ├── rust/                      # thin crate \\\"sb-common\\\" (include_str! + serde) — server depends on it\\\n    ├── ts/                        # thin package \\\"@skara-brae/common\\\" (generated types + data) — client depends on it\\\n    └── codegen/                   # data/ + schema  →  rust/ and ts/ bindings\\\n```\\\n\\\n**Consumption rules:**\\\n- **Static game data** (`data/`) is the single source of truth; consumed at build time (Rust `include_str!` + `serde`; Vue Vite import). Auto-generates client tooltips *and* a community wiki.\\\n- **API contract** is **server-authoritative** — OpenAPI via `utoipa` → client TS types via `openapi-typescript`. No hand-duplicated API types.\\\n- **Entity types** defined once as JSON Schema → generated into both Rust (`typify`/`schemars`) and TS (`json-schema-to-typescript`).\\\n- `sb-shared` (server-internal Rust) ≠ `skara-brae-common` (cross-language). Don't confuse them.\\\n- **Alternative for self-contained CI**: git submodule of common inside both repos. Start with sibling + path; switch to submodules only if contributors/CI demand it.\"],[0,\"\\\n\\\n--\"]],\"start1\":10514,\"start2\":10514,\"length1\":262,\"length2\":1317},{\"diffs\":[[0,\"+ titles\"],[1,\" (with locked-title-with-requirement UX)**, **Construction skill + town Buildings meta**, **Expeditions (gathering → lore notes → unlock dungeons)**, **Fortune's Favor pity system**, **XP lamps**, **gear scoring / recommended-power indicator\"],[0,\"**\\\n- **P\"]],\"start1\":12904,\"start2\":12904,\"length1\":16,\"length2\":257},{\"diffs\":[[0,\" honours\"],[1,\", **Infinite Tower (endless scaling PvE + floor milestones)**, **Carnival (traveling seasonal minigame hub + ticket economy)**, **queue slots (parallel offline sessions)**\"],[0,\"\\\n- **Pha\"]],\"start1\":13330,\"start2\":13330,\"length1\":16,\"length2\":187},{\"diffs\":[[0,\"rnament system, \"],[1,\"**\"],[0,\"guild raids (6-1\"]],\"start1\":13717,\"start2\":13717,\"length1\":32,\"length2\":34},{\"diffs\":[[0,\"players)\"],[1,\" + raid-boss roster**\"],[0,\"\\\n\\\n---\\\n\\\n#\"]],\"start1\":13753,\"start2\":13753,\"length1\":16,\"length2\":37},{\"diffs\":[[0,\"ve cap?\\\n\"],[1,\"- [ ] **Infinite Tower**: floor milestone reward shape — permanent but bounded? Cap on stacked bonuses?\\\n- [ ] **Expeditions**: confirm 2 tiers per gathering skill? Which 5 gathering skills get expeditions first?\\\n- [ ] **Buildings meta**: confirm the building roster + tier ceilings (0–3)? Tie each to which district?\\\n- [ ] **Carnival**: confirm it as a seasonal traveling event vs. permanent district? Ticket economy tuning.\\\n- [ ] **Fortune's Favor**: N dry attempts before guaranteed high-rarity? Reset rules?\\\n\"],[0,\"- [x] ~~\"]],\"start1\":15008,\"start2\":15008,\"length1\":16,\"length2\":527},{\"diffs\":[[0,\"les, HOF\"],[1,\"\\\n- [x] ~~Shared-repo consumption (two IDEs, Rust+Vue)~~ → **Sibling bilingual package**: language-neutral `data/` + schema, build-time codegen; API contract server-authoritative via `utoipa` → `openapi-typescript`. Server path-deps `../skara-brae-common/rust`; client file-deps `../skara-brae-common/ts`. See [Tech Stack & Architecture](joplin://980c3eb587294e4383474b94988f2f88).\\\n- [x] ~~Construction skill~~ → **Make it real** (re-evaluated): backbone of the town Buildings meta, fed by crafted materials\"]],\"start1\":16230,\"start2\":16230,\"length1\":8,\"length2\":514}]"
metadata_diff: {"new":{},"deleted":[]}
encryption_cipher_text: 
encryption_applied: 0
updated_time: 2026-07-31T18:49:42.289Z
created_time: 2026-07-31T18:49:42.289Z
is_locked: 0
type_: 13