Game Design — Per-Content-Type GDD (Authoring & Revision)
Own one content type's design document at
.unikit/gamedesign/content-types/CT-<slug>.md — the content / catalog axis of
the GDD (the data the game is made of: the cards, items, levels, enemies, quests),
alongside the system GDDs (the rules), the flow GDDs (the dynamics), and GAME.md
(the whole). This skill owns the content zone (gd-principles → Zone Ownership):
the full lifecycle of a CONTENT-TYPE.md lives here — create the skeleton,
fill its placeholders, and revise the approved schema (the typed
CT.fields + scale + relationships) under the delta discipline. There is no separate
editor skill.
A content type is a schema + descriptor, never the catalog of values. GD-IDS.yaml
carries the contract (the typed CT.fields, the scale, belongs_to); the bulk
instance values live in the editor, not the registry. That split is the heart of this
zone — see Schema vs values below.
A content type registers itself: this skill writes the type's own GD-IDS.yaml
content_types: and content: entries (and the resources: / tracks: / knobs:
facts it owns via a registry-check) and re-renders the ## Content Map [gen] block in
GAME.md — there is no add-content in unikit-gd-spec. It never authors a system,
never authors a flow, never edits the GAME.md one-pager content, and never adds a
system to the roster — those are unikit-gd-system, unikit-gd-flow, and
unikit-gd-spec.
Language Awareness — BLOCKING PRE-REQUISITE
BEFORE producing ANY output, silently read .unikit/system/LANGUAGE_RULES.md
and apply it to all output and artifacts (fall back to English if it is missing) —
including the rule to translate concepts, not transliterate jargon.
gd-principles → "Language" adds the game-design specifics: which IDs and stored
field values stay English (IDs like CT-*, CU-*, RES-*, field type/enum
tokens, and ref<> targets are stable machine values — never translated). Do not
announce the language setting.
Phase 0 — Bootstrap
Silently load — do not narrate:
.unikit/system/gamedesign/gd-principles.md (the core) — the collaborative
protocol, the facts registry / ID conventions, and the language rules. Plus, from
the same gamedesign/ folder, the shards this skill needs: gd-authoring.md
(the section-cycle authoring contract + the delta discipline — including
the content delta: schema vs values rule that governs this zone),
gd-lifecycle.md (the lifecycle & status spine + the content axis block:
the CT doc_status spine, belongs_to, and display precedence), and
gd-content-axis.md (the content-axis contract this zone authors against: the
CT/CU schema model, ref<> resolution, scale ↔ structure, RES/TRACK/KNOB, and
the code-reads-content boundary). This skill applies that contract; it does
not restate the mechanics. If missing, warn (unikit-ai update) and fall back to
the protocol as summarized in this file.
.unikit/gamedesign/GAME.md — pillars, loops, target aesthetics, and
non-goals the content must serve; its ## System Map [gen] is the system roster a
content type's belongs_to (and any ref<SYS>) depend on. If it does not exist,
stop — there is no master spec yet. Read .unikit/gamedesign/concepts/INDEX.md
(if it exists) to route precisely: a drafted/approved concept present →
recommend /unikit-gd-spec (build the master spec from it); no concept — or no
concepts/INDEX.md (or no concepts/ dir) at all → recommend
/unikit-gd-brainstorm first, then /unikit-gd-spec.
.unikit/gamedesign/GD-IDS.yaml — find the target type's entry under
content_types. If there is no entry, this is a new content type: a content
type registers itself, so author it here (Create — Phase 5 writes the
content_types: row). The belongs_to a new type needs may reference a system
that is not yet on the map; that crossing into the system roster routes back
to /unikit-gd-spec add-system (see the re-entry seam in Phase 4) — never write a
systems: row here.
.unikit/memory/gamedesign/RULES_INDEX.md — load the core domain rules
for this type's purpose, on demand by Load When, plus any studio library
rule on the same topic. Read the purpose from the type's name and Overview (what
the units are), not from a coarse label; when the purpose is ambiguous, confirm
the domain with one AskUserQuestion rather than guessing. Domains are opt-in and
combinable — a content type may match more than one:
| Content purpose |
Core rules to load |
| items / loot / gear |
economy, balance |
| currencies / shop wares |
economy, monetization-ethics |
| cards / units / abilities |
balance, frameworks |
| enemies / encounters |
balance |
| levels / missions / maps |
level-design |
| quests / dialogue / lore |
narrative |
| characters / NPCs |
narrative, player-motivation |
| cosmetics / battle-pass |
monetization-ethics, liveops |
| progression tracks / unlocks |
progression |
Obey the index's Rule-Loading Discipline: load by Load When, load a reference
only from its parent rule's > **References**:, and never glob the memory tree
(.unikit/memory/gamedesign/**) to discover rules.
.unikit/RULES.md (if present) — project overrides, highest priority.
Schema guard (clean break — no automatic migration). GD-IDS.yaml MUST be
version: 2. If it is still version: 1, STOP and report: the design
workspace is on the pre-v2 layout — v2 dropped the standalone markdown
system-index and now renders the system, flow, funnel, and content maps into
GAME.md (## System Map [gen] / ## Flow Map [gen] / ## Funnel [gen] /
## Content Map [gen]); there is no automatic migration. Tell the user to bump
GD-IDS.yaml to version: 2 before re-running.
One-way boundary: never read .unikit/code/, project source, or build artifacts.
Content crosses to code as a contract (the schema + descriptor), never as data —
the bulk values stay in the editor (gd-principles → One-Way Boundary).
Phase 1 — Context
Gather the facts the content type must stay consistent with (read-only):
- Known facts from
GD-IDS.yaml — pillars (the content serves them), the
systems (the belongs_to consuming system and any ref<SYS> targets), the
resources / tracks already locked (a field may ref<RES> / reference a track),
the entities / formulas a field may ref<ENT> / ref<FORM>, and the terms.
These are constraints, not suggestions.
- The consuming system's GDD — read the
belongs_to system's header and sections
A (Overview), C (Detailed Design), and G (Tuning Knobs) so the schema
serves a real consumer (the system that reads these units). A belongs_to aimed at
a missing or deprecated system is a registry gap (route it through
unikit-gd-spec add-system — Phase 4).
- Recent
unikit-gd-verify reports for this content type, if any
(.unikit/gamedesign/reviews/).
- Explore research (internal design lens) — if this type was seeded from a
unikit-gd-explore brief, discover the research deterministically (survives a
/clear): read the type's GD-IDS content_types[].research: pointer
(authoritative), falling back to the researches/INDEX.md entry whose Target: is
this CT-<slug>. Read that research's RESEARCH_BRIEF.md →
## Content Feature Plan block and use its schema / scale / catalog seeds
as the starting drafts — a seeded section is drafted silently in Generation
(Phase 4) and confirmed in the group review (Phase 5); a seed is a draft, not an
approved write. For a revision (Edit), the matching block is
## Content Improvement Plan. These explore-seeded drafts are untagged normal
authored content.
Phase 2 — Resolve Scale + Depth (no flags)
Check .unikit/gamedesign/content-types/CT-<slug>.md and read the intent in the
prompt:
- Does not exist → Create: build the skeleton (Phase 3), then run the
Decision-First flow — the scale is the first decision in Phase 4 (it shapes
section C and how the units register).
- Exists and the prompt describes a change to the approved schema (a field, a
type, the scale,
belongs_to, a ref<>: "add a rarity field", "retype condition",
"switch to curated") → Edit: classify the scale of change and apply the delta
(Revision below). Approved schema is changed only through this path.
- Exists with
[To be designed] placeholders and the intent is to continue /
fill (or no change is described) → Fill: resume from the remaining placeholders.
Approved text is never overwritten — only placeholders are filled. Skip the
skeleton sub-step (Phase 3.1); still fork-scan and run Phases 4–5 over the
placeholders.
- Exists, complete, no change described → authoring is done; nothing to write.
Offer review / verify (Handoff) and stop.
If the type name is ambiguous (matches several entries, or none) → AskUserQuestion
listing candidates. Never guess the target. Print the candidates to the screen as plain
markdown first — the question mechanism carries the options and nothing else.
Catalog churn is not an Edit here. Adding, removing, or editing the individual
content units — a curated row's field values, a bulk type's count — is
data, not a schema edit (gd-authoring → Content delta). It does not bump the
version and needs no changelog. Only a schema change (Phase 2 case 2) runs the
Revision delta tail. For a bulk type the instance values never enter GD-IDS at
all — they live in the editor.
Depth gate (Create / Fill only). Once the mode is Create or Fill, present one
depth picker — the named tiers core/standard/full, each with what it adds, not bare
letters:
AskUserQuestion: How deep should this pass go?
Options:
1. core (recommended) — the floor that gets the type to a solid, usable base: Overview,
Schema (CT.fields), Scale & Generation.
2. standard — core + Relationships & Dependencies, Validation & Edge Cases.
3. full — every section, fully specified.
The picked tier is the ephemeral scope of this pass — NOT stored
(gd-authoring / gd-lifecycle); the lasting fact is the inferred status at Phase 6.
Edit mode skips the depth gate entirely (it lies flat on the Revision flow).
Load the Mode Body
With the mode resolved (Phase 2) and the depth picked (Create / Fill only), load the
matching body on demand and follow it — do not keep both bodies in context. Create
/ Fill returns to Phase 6 (Registry & State) below; Edit returns to Handoff.
| Mode |
Reference body |
| Create / Fill |
{{skills_dir}}/{{self_name}}/references/mode-author.md — the Decision-First section-cycle: the A–F section map + core-set, Phase 3 (Skeleton + Fork-Scan), Phase 4 (Decision Interview + Generation, incl. the scale decision + the re-entry seam), Phase 5 (Group Review). |
| Edit |
{{skills_dir}}/{{self_name}}/references/mode-revise.md — a schema change: classify the scale (Tuning / Tweak / Rework / Structural-redirect), apply it, then the mandatory delta tail (catalog churn is data — handled directly, not here). |
Phase 6 — Registry & State (write content_types: / content:, then re-render the map)
After the sections are authored and accepted:
Write the GD-IDS.yaml content_types[] entry (the type's machine truth — the
content type registers itself): id: CT-<slug>, name, status: active, scale,
belongs_to (the SYS id from section D), doc_status, version, fields: (the
typed schema from section B — for a bulk type this is the SPEC each instance
follows; for curated it is the schema each content row subsets), research:
(the explore-research folder if seeded — a non-id path; owned here),
source: content-types/CT-<slug>.md, added. Then write the units:
- bulk → one
content[] row with kind: set, count, spec (the descriptor
only; the values stay in the editor).
- curated → one
content[] row per unit with kind: instance and
fields: ⊆ CT.fields (each value valid by the schema's name + type).
Get approval before the write; existing values are never changed silently; every
fact carries its source (gd-principles → Facts Registry).
Register the facts this type introduces (RES- / TRACK- / KNOB-). A field
may reference a resource (ref<RES>), a progression track, or a global
tuning knob that is not yet a registry fact. These are facts, registered by
the owning zone via a registry-check — not a profile edit:
RES-<slug> → GD-IDS.yaml resources (a currency / consumable / material),
TRACK-<slug> → tracks (a season / battle-pass / mastery ladder),
KNOB-<slug> → knobs (a cross-system balance value; a per-system tuning value
stays in that system's section G).
Before adding one, registry-check: if the fact already exists, reference it;
never duplicate or renumber. Get approval for each new fact; each carries its
source.
Status (inferred — gd-lifecycle). Set the type's status in the two places
that must agree — the CONTENT-TYPE.md header > Status: token and the
GD-IDS.yaml doc_status: detailed once the whole core-set (A/B/C) is
authored; held at skeleton while a core section carries <!-- deferred -->
(the soft floor guard; the WARN in Phase 4); detailed · partial (n/m) (rendered,
inferred from the markers) when the core is complete but ≥1 non-core section is
deferred. Set version: 1 (header + GD-IDS). Write the initial changelog block to
section F (#### v1 — <date> — initial schema with the Fields: + <field> … (new)
line and Affected (gd-verify): —) — the single current block (K1).
Regen-on-write — re-render the map (B1). As the last step, re-render GAME.md's
## Content Map [gen] block from GD-IDS (the RULES_INDEX render model):
replace only the content between <!-- gen:content-map --> /
<!-- /gen:content-map --> — never touch the authored one-pager above, and
never the ## System Map [gen] / ## Flow Map [gen] / ## Funnel [gen] blocks
(those are unikit-gd-spec / unikit-gd-flow renders).
- Content Map — one row per
content_types[] entry, grouped by scale (Bulk,
Curated): ID | Content Type | Scale | Status | Ver | Belongs (SYS) | Units | Doc.
Status mirrors doc_status (plus deprecated from the status field), with the
· partial (n/m) suffix appended when the CONTENT-TYPE.md carries ≥1
<!-- deferred --> (the canonical render format from gd-lifecycle — the same
suffix verify and the System/Flow maps use); Ver is — until skeleton; Units
is the registered count for a bulk type or the number of curated rows.
Handoff & Next Steps
Recommend the next steps (do not auto-invoke):
- ✅ Verify consistency & impact — /unikit-gd-verify CT-
- 🔍 Qualitative review (fresh session) — /unikit-gd-review content-types/CT-.md
- 🗺️ Add the consuming/another system — /unikit-gd-spec (add-system)
A review is most independent in a fresh session (the reviewer should not have
authored the doc). unikit-gd-verify is read-only — it checks the content type against
the registry and prints cross-axis staleness (a belongs_to/ref<SYS> system edit);
the ## Content Map [gen] was already re-rendered on this skill's write (B1).
Final: Compact Report
The terminal plaque (TIER A — gd-principles → Language: name leads, ids are
parenthetical copy-paste tags, status is a plain phrase):
Content type: <name> (CT-<slug>)
Scale: <bulk | curated> Belongs to: <system name> (SYS-<slug>) · Depth: <core | standard | full> (create/fill)
Action: <create | fill | edit (tuning|tweak|rework) | catalog churn>
Doc: .unikit/gamedesign/content-types/CT-<slug>.md — <ready | ready, a couple of optional blocks left | skeleton, main blocks not filled yet>, vN
Registry: <F> fields; <U> units (<count> bulk | <n> curated); +<R> resources/tracks/knobs (GD-IDS.yaml)
Map: ## Content Map [gen] re-rendered
No summary document, no report file.
Ownership Boundaries
- Owns: the full lifecycle of
content-types/CT-<slug>.md — creating the
skeleton, filling placeholders, and revising the approved schema (Tuning / Tweak
/ Rework, with the version bump + changelog; the status stays detailed); the type's
GD-IDS.yaml facts (content_types[] incl. fields, scale, belongs_to,
research:; the content[] units; and the resources / tracks / knobs facts it
registers) and its doc_status / version; the scale selection; and the
re-render of the ## Content Map [gen] block in GAME.md (the [gen] region
only).
- Not this skill: systems →
unikit-gd-system; flows → unikit-gd-flow; the
system roster, the GAME.md one-pager content (pillars, win/lose intent,
monetization stance) and its ## System Map [gen] render → unikit-gd-spec;
quality verdicts → unikit-gd-review; consistency & cross-axis impact →
unikit-gd-verify.
- Never: write, fill, or edit without approval; overwrite approved schema outside
the delta discipline; run the delta tail for catalog churn (data, not a schema edit);
skip the version bump or changelog on a schema edit (unrecorded delta); change a
GD-IDS.yaml value silently; delete or renumber an ID; write the systems: roster
or the GAME.md one-pager content; touch the ## System Map [gen] / ## Flow Map [gen] / ## Funnel [gen] blocks; read the code workspace or project source.
Quick Reference
/unikit-gd-content CT-item → select scale + create skeleton + author A–F (if no doc yet)
/unikit-gd-content item → resolve to the CT-slug; same type
/unikit-gd-content CT-item → resume filling placeholders (partial doc)
/unikit-gd-content CT-item "add a rarity field" → Tweak: edit B Schema, one approval
/unikit-gd-content item "switch to curated" → Rework: scale flip (C + header + GD-IDS)
/unikit-gd-content CT-card "retype cost to enum" → Rework: type change + data migration
1---2name: unikit-gd-content3description: >-4 Author and own ONE content type's typed schema (the CONTENT-TYPE.md) at5 .unikit/gamedesign/content-types/CT-<slug>.md — the content / catalog layer of the GDD6 (cards, items, weapons, enemies, levels, quests, loot). Use whenever the user wants to ADD7 a new kind of content or UPDATE its schema, e.g. "add a new content type", "design the8 loot content", "define the card schema", "add an enemies content type", "add a rarity9 field to items", "switch this catalog to curated". Create the skeleton, fill its typed10 field schema (CT.fields), scale, relationships, and validation, AND revise the schema under11 the delta discipline (a schema change bumps the version + changelog). Selects the scale12 (bulk | curated) and self-registers content_types/content. This owns the content SCHEMA,13 not the catalog of values — adding individual entries/units is data handled in the editor,14 not a schema edit. To add or detail a system use /unikit-gd-system; to add a flow use15 /unikit-gd-flow; to apply a multi-zone edit use /unikit-gd-apply.16argument-hint: "<content type name | CT-slug> [\"<what to change>\"] (scale inferred from doc state + intent; no flags)"17allowed-tools:18 - Read19 - Write20 - Edit21 - Glob22 - Grep23 - Bash(ls *)24 - Bash(find *)25 - Bash(wc *)26 - Bash(date *)27 - AskUserQuestion28disable-model-invocation: false29user-invocable: true30metadata:31 author: unikit32 version: "1.0"33 category: game-design34---3536# Game Design — Per-Content-Type GDD (Authoring & Revision)3738Own **one content type's design document** at39`.unikit/gamedesign/content-types/CT-<slug>.md` — the **content / catalog** axis of40the GDD (the data the game is made of: the cards, items, levels, enemies, quests),41alongside the system GDDs (the rules), the flow GDDs (the dynamics), and `GAME.md`42(the whole). This skill owns the **content zone** (`gd-principles` → Zone Ownership):43the **full lifecycle** of a `CONTENT-TYPE.md` lives here — **create** the skeleton,44**fill** its placeholders, and **revise** the approved **schema** (the typed45`CT.fields` + scale + relationships) under the delta discipline. There is no separate46editor skill.4748A content type is a **schema + descriptor, never the catalog of values**. `GD-IDS.yaml`49carries the contract (the typed `CT.fields`, the `scale`, `belongs_to`); the bulk50instance values live in the editor, not the registry. That split is the heart of this51zone — see **Schema vs values** below.5253A content type registers **itself**: this skill writes the type's own `GD-IDS.yaml`54`content_types:` and `content:` entries (and the `resources:` / `tracks:` / `knobs:`55facts it owns via a registry-check) and re-renders the `## Content Map [gen]` block in56`GAME.md` — there is **no add-content in `unikit-gd-spec`**. It never authors a system,57never authors a flow, never edits the `GAME.md` one-pager content, and never adds a58system to the roster — those are `unikit-gd-system`, `unikit-gd-flow`, and59`unikit-gd-spec`.6061## Language Awareness — BLOCKING PRE-REQUISITE6263**BEFORE producing ANY output**, silently read `.unikit/system/LANGUAGE_RULES.md`64and apply it to all output and artifacts (fall back to English if it is missing) —65including the rule to **translate concepts, not transliterate jargon**.66`gd-principles` → "Language" adds the game-design specifics: which IDs and stored67field values stay English (IDs like `CT-*`, `CU-*`, `RES-*`, field `type`/`enum`68tokens, and `ref<>` targets are stable machine values — never translated). Do not69announce the language setting.7071## Phase 0 — Bootstrap7273Silently load — do not narrate:74751. **`.unikit/system/gamedesign/gd-principles.md`** (the core) — the collaborative76 protocol, the facts registry / ID conventions, and the language rules. Plus, from77 the same `gamedesign/` folder, the shards this skill needs: **`gd-authoring.md`**78 (the **section-cycle authoring contract** + the **delta discipline** — including79 the **content delta: schema vs values** rule that governs this zone),80 **`gd-lifecycle.md`** (the lifecycle & status spine + the **content axis** block:81 the `CT` `doc_status` spine, `belongs_to`, and display precedence), and82 **`gd-content-axis.md`** (the content-axis contract this zone authors against: the83 CT/CU schema model, `ref<>` resolution, `scale` ↔ structure, RES/TRACK/KNOB, and84 the code-reads-content boundary). This skill **applies** that contract; it does85 not restate the mechanics. If missing, warn (`unikit-ai update`) and fall back to86 the protocol as summarized in this file.872. **`.unikit/gamedesign/GAME.md`** — pillars, loops, target aesthetics, and88 non-goals the content must serve; its `## System Map [gen]` is the system roster a89 content type's `belongs_to` (and any `ref<SYS>`) depend on. If it does not exist,90 **stop** — there is no master spec yet. Read `.unikit/gamedesign/concepts/INDEX.md`91 (if it exists) to route precisely: a `drafted`/`approved` concept present →92 recommend `/unikit-gd-spec` (build the master spec from it); no concept — or no93 `concepts/INDEX.md` (or no `concepts/` dir) at all → recommend94 `/unikit-gd-brainstorm` first, then `/unikit-gd-spec`.953. **`.unikit/gamedesign/GD-IDS.yaml`** — find the target type's entry under96 `content_types`. If there is **no entry**, this is a new content type: a content97 type registers itself, so author it here (Create — Phase 5 writes the98 `content_types:` row). The `belongs_to` a new type needs may reference a system99 that is **not yet on the map**; that crossing into the *system* roster routes back100 to `/unikit-gd-spec` add-system (see the re-entry seam in Phase 4) — never write a101 `systems:` row here.1024. **`.unikit/memory/gamedesign/RULES_INDEX.md`** — load the **core** domain rules103 for this type's **purpose**, on demand by `Load When`, plus any studio `library`104 rule on the same topic. Read the purpose from the type's name and Overview (what105 the units are), **not** from a coarse label; when the purpose is ambiguous, confirm106 the domain with one `AskUserQuestion` rather than guessing. Domains are opt-in and107 combinable — a content type may match more than one:108109 | Content purpose | Core rules to load |110 |-----------------|--------------------|111 | items / loot / gear | `economy`, `balance` |112 | currencies / shop wares | `economy`, `monetization-ethics` |113 | cards / units / abilities | `balance`, `frameworks` |114 | enemies / encounters | `balance` |115 | levels / missions / maps | `level-design` |116 | quests / dialogue / lore | `narrative` |117 | characters / NPCs | `narrative`, `player-motivation` |118 | cosmetics / battle-pass | `monetization-ethics`, `liveops` |119 | progression tracks / unlocks | `progression` |120121 Obey the index's **Rule-Loading Discipline**: load by `Load When`, load a reference122 only from its parent rule's `> **References**:`, and **never glob the memory tree**123 (`.unikit/memory/gamedesign/**`) to discover rules.1241255. **`.unikit/RULES.md`** (if present) — project overrides, highest priority.1266. **Schema guard (clean break — no automatic migration).** `GD-IDS.yaml` MUST be127 `version: 2`. If it is still `version: 1`, **STOP** and report: the design128 workspace is on the pre-v2 layout — v2 dropped the standalone markdown129 system-index and now renders the system, flow, funnel, and content maps into130 `GAME.md` (`## System Map [gen]` / `## Flow Map [gen]` / `## Funnel [gen]` /131 `## Content Map [gen]`); there is no automatic migration. Tell the user to bump132 `GD-IDS.yaml` to `version: 2` before re-running.133134**One-way boundary:** never read `.unikit/code/`, project source, or build artifacts.135Content crosses to code as a **contract** (the schema + descriptor), never as data —136the bulk values stay in the editor (`gd-principles` → One-Way Boundary).137138## Phase 1 — Context139140Gather the facts the content type must stay consistent with (read-only):141142- **Known facts** from `GD-IDS.yaml` — pillars (the content serves them), the143 `systems` (the `belongs_to` consuming system and any `ref<SYS>` targets), the144 `resources` / `tracks` already locked (a field may `ref<RES>` / reference a track),145 the `entities` / `formulas` a field may `ref<ENT>` / `ref<FORM>`, and the `terms`.146 These are constraints, not suggestions.147- **The consuming system's GDD** — read the `belongs_to` system's header and sections148 **A (Overview)**, **C (Detailed Design)**, and **G (Tuning Knobs)** so the schema149 serves a real consumer (the system that reads these units). A `belongs_to` aimed at150 a missing or deprecated system is a registry gap (route it through151 `unikit-gd-spec` add-system — Phase 4).152- **Recent `unikit-gd-verify` reports** for this content type, if any153 (`.unikit/gamedesign/reviews/`).154- **Explore research (internal design lens)** — if this type was seeded from a155 `unikit-gd-explore` brief, discover the research **deterministically** (survives a156 `/clear`): read the type's `GD-IDS` `content_types[].research:` pointer157 (authoritative), falling back to the `researches/INDEX.md` entry whose `Target:` is158 this `CT-<slug>`. Read that research's `RESEARCH_BRIEF.md` →159 **`## Content Feature Plan`** block and use its schema / scale / catalog **seeds**160 as the *starting drafts* — a **seeded** section is **drafted silently** in Generation161 (Phase 4) and confirmed in the group review (Phase 5); a seed is a draft, not an162 approved write. For a **revision** (Edit), the matching block is163 **`## Content Improvement Plan`**. These explore-seeded drafts are **untagged normal164 authored content**.165166## Phase 2 — Resolve Scale + Depth (no flags)167168Check `.unikit/gamedesign/content-types/CT-<slug>.md` and read the intent in the169prompt:1701711. **Does not exist** → **Create**: build the skeleton (Phase 3), then run the172 Decision-First flow — the **scale** is the first decision in Phase 4 (it shapes173 section C and how the units register).1742. **Exists** and the prompt describes a **change to the approved schema** (a field, a175 type, the scale, `belongs_to`, a `ref<>`: "add a rarity field", "retype condition",176 "switch to curated") → **Edit**: classify the scale of change and apply the delta177 (Revision below). Approved schema is changed **only** through this path.1783. **Exists with `[To be designed]` placeholders** and the intent is to continue /179 fill (or no change is described) → **Fill**: resume from the remaining placeholders.180 Approved text is **never overwritten** — only placeholders are filled. Skip the181 skeleton sub-step (Phase 3.1); still fork-scan and run Phases 4–5 over the182 placeholders.1834. **Exists, complete, no change described** → authoring is done; nothing to write.184 Offer review / verify (Handoff) and stop.185186If the type name is ambiguous (matches several entries, or none) → `AskUserQuestion`187listing candidates. Never guess the target. Print the candidates to the screen as plain188markdown first — the question mechanism carries the options and nothing else.189190> **Catalog churn is not an Edit here.** Adding, removing, or editing the individual191> content **units** — a `curated` row's field values, a `bulk` type's `count` — is192> **data, not a schema edit** (`gd-authoring` → Content delta). It does not bump the193> version and needs no changelog. Only a **schema** change (Phase 2 case 2) runs the194> Revision delta tail. For a `bulk` type the instance values never enter `GD-IDS` at195> all — they live in the editor.196197**Depth gate (Create / Fill only).** Once the mode is Create or Fill, present **one**198depth picker — the named tiers `core/standard/full`, each with what it adds, not bare199letters:200201```202AskUserQuestion: How deep should this pass go?203Options:2041. core (recommended) — the floor that gets the type to a solid, usable base: Overview,205 Schema (CT.fields), Scale & Generation.2062. standard — core + Relationships & Dependencies, Validation & Edge Cases.2073. full — every section, fully specified.208```209210The picked tier is the **ephemeral scope of this pass — NOT stored**211(`gd-authoring` / `gd-lifecycle`); the lasting fact is the inferred status at Phase 6.212**Edit** mode skips the depth gate entirely (it lies flat on the Revision flow).213214---215216## Load the Mode Body217218With the mode resolved (Phase 2) and the depth picked (Create / Fill only), load the219matching body on demand and follow it — do **not** keep both bodies in context. Create220/ Fill returns to **Phase 6** (Registry & State) below; Edit returns to **Handoff**.221222| Mode | Reference body |223|------|----------------|224| **Create / Fill** | `{{skills_dir}}/{{self_name}}/references/mode-author.md` — the Decision-First section-cycle: the A–F section map + core-set, Phase 3 (Skeleton + Fork-Scan), Phase 4 (Decision Interview + Generation, incl. the scale decision + the re-entry seam), Phase 5 (Group Review). |225| **Edit** | `{{skills_dir}}/{{self_name}}/references/mode-revise.md` — a **schema** change: classify the scale (Tuning / Tweak / Rework / Structural-redirect), apply it, then the mandatory delta tail (catalog churn is data — handled directly, not here). |226227## Phase 6 — Registry & State (write `content_types:` / `content:`, then re-render the map)228229After the sections are authored and accepted:2302311. **Write the `GD-IDS.yaml` `content_types[]` entry** (the type's machine truth — the232 content type registers itself): `id: CT-<slug>`, `name`, `status: active`, `scale`,233 `belongs_to` (the `SYS` id from section D), `doc_status`, `version`, `fields:` (the234 typed schema from section B — for a `bulk` type this is the SPEC each instance235 follows; for `curated` it is the schema each `content` row subsets), `research:`236 (the explore-research folder if seeded — a non-id path; owned here),237 `source: content-types/CT-<slug>.md`, `added`. Then write the **units**:238 - **bulk →** one `content[]` row with `kind: set`, `count`, `spec` (the descriptor239 only; the values stay in the editor).240 - **curated →** one `content[]` row per unit with `kind: instance` and241 `fields:` ⊆ `CT.fields` (each value valid by the schema's name + type).242243 Get approval before the write; existing values are never changed silently; every244 fact carries its `source` (`gd-principles` → Facts Registry).2452. **Register the facts this type introduces (`RES-` / `TRACK-` / `KNOB-`).** A field246 may reference a **resource** (`ref<RES>`), a **progression track**, or a global247 **tuning knob** that is not yet a registry fact. These are **facts, registered by248 the owning zone via a registry-check** — not a profile edit:249 - `RES-<slug>` → `GD-IDS.yaml` `resources` (a currency / consumable / material),250 - `TRACK-<slug>` → `tracks` (a season / battle-pass / mastery ladder),251 - `KNOB-<slug>` → `knobs` (a cross-system balance value; a per-system tuning value252 stays in that system's section G).253254 Before adding one, **registry-check**: if the fact already exists, reference it;255 never duplicate or renumber. Get approval for each new fact; each carries its256 `source`.2573. **Status (inferred — `gd-lifecycle`).** Set the type's status in the **two places258 that must agree** — the `CONTENT-TYPE.md` header `> Status:` token and the259 `GD-IDS.yaml` `doc_status`: `detailed` once the whole **core-set (A/B/C)** is260 authored; **held at `skeleton`** while a **core** section carries `<!-- deferred -->`261 (the soft floor guard; the WARN in Phase 4); `detailed · partial (n/m)` (rendered,262 inferred from the markers) when the core is complete but ≥1 **non-core** section is263 deferred. Set `version: 1` (header + `GD-IDS`). Write the initial changelog block to264 section F (`#### v1 — <date> — initial schema` with the `Fields: + <field> … (new)`265 line and `Affected (gd-verify): —`) — the single current block (K1).2664. **Regen-on-write — re-render the map (B1).** As the last step, re-render `GAME.md`'s267 `## Content Map [gen]` block from `GD-IDS` (the `RULES_INDEX` render model):268 replace **only** the content between `<!-- gen:content-map -->` /269 `<!-- /gen:content-map -->` — **never** touch the authored one-pager above, and270 **never** the `## System Map [gen]` / `## Flow Map [gen]` / `## Funnel [gen]` blocks271 (those are `unikit-gd-spec` / `unikit-gd-flow` renders).272 - **Content Map** — one row per `content_types[]` entry, grouped by `scale` (Bulk,273 Curated): `ID | Content Type | Scale | Status | Ver | Belongs (SYS) | Units | Doc`.274 `Status` mirrors `doc_status` (plus `deprecated` from the `status` field), with the275 **`· partial (n/m)` suffix** appended when the `CONTENT-TYPE.md` carries ≥1276 `<!-- deferred -->` (the canonical render format from `gd-lifecycle` — the same277 suffix verify and the System/Flow maps use); `Ver` is `—` until `skeleton`; `Units`278 is the registered `count` for a `bulk` type or the number of `curated` rows.279280---281282## Handoff & Next Steps283284Recommend the next steps (do not auto-invoke):285286- ✅ Verify consistency & impact — /unikit-gd-verify CT-<slug>287- 🔍 Qualitative review (fresh session) — /unikit-gd-review content-types/CT-<slug>.md288- 🗺️ Add the consuming/another system — /unikit-gd-spec (add-system)289290A review is most independent in a **fresh session** (the reviewer should not have291authored the doc). `unikit-gd-verify` is read-only — it checks the content type against292the registry and **prints** cross-axis staleness (a `belongs_to`/`ref<SYS>` system edit);293the `## Content Map [gen]` was already re-rendered on this skill's write (B1).294295## Final: Compact Report296297The terminal plaque (TIER A — `gd-principles` → Language: name leads, ids are298parenthetical copy-paste tags, status is a plain phrase):299300```301Content type: <name> (CT-<slug>)302Scale: <bulk | curated> Belongs to: <system name> (SYS-<slug>) · Depth: <core | standard | full> (create/fill)303Action: <create | fill | edit (tuning|tweak|rework) | catalog churn>304Doc: .unikit/gamedesign/content-types/CT-<slug>.md — <ready | ready, a couple of optional blocks left | skeleton, main blocks not filled yet>, vN305Registry: <F> fields; <U> units (<count> bulk | <n> curated); +<R> resources/tracks/knobs (GD-IDS.yaml)306Map: ## Content Map [gen] re-rendered307```308309No summary document, no report file.310311## Ownership Boundaries312313- **Owns:** the **full lifecycle** of `content-types/CT-<slug>.md` — creating the314 skeleton, filling placeholders, **and revising the approved schema** (Tuning / Tweak315 / Rework, with the version bump + changelog; the status stays `detailed`); the type's316 `GD-IDS.yaml` facts (`content_types[]` incl. `fields`, `scale`, `belongs_to`,317 `research:`; the `content[]` units; and the `resources` / `tracks` / `knobs` facts it318 registers) and its `doc_status` / `version`; the scale selection; and the319 **re-render** of the `## Content Map [gen]` block in `GAME.md` (the `[gen]` region320 only).321- **Not this skill:** systems → `unikit-gd-system`; flows → `unikit-gd-flow`; the322 system roster, the `GAME.md` one-pager content (pillars, win/lose intent,323 monetization stance) **and** its `## System Map [gen]` render → `unikit-gd-spec`;324 quality verdicts → `unikit-gd-review`; consistency & cross-axis impact →325 `unikit-gd-verify`.326- **Never:** write, fill, or edit without approval; overwrite approved schema outside327 the delta discipline; run the delta tail for catalog churn (data, not a schema edit);328 skip the version bump or changelog on a **schema** edit (unrecorded delta); change a329 `GD-IDS.yaml` value silently; delete or renumber an ID; write the `systems:` roster330 or the `GAME.md` one-pager content; touch the `## System Map [gen]` / `## Flow Map331 [gen]` / `## Funnel [gen]` blocks; read the code workspace or project source.332333## Quick Reference334335```336/unikit-gd-content CT-item → select scale + create skeleton + author A–F (if no doc yet)337/unikit-gd-content item → resolve to the CT-slug; same type338/unikit-gd-content CT-item → resume filling placeholders (partial doc)339/unikit-gd-content CT-item "add a rarity field" → Tweak: edit B Schema, one approval340/unikit-gd-content item "switch to curated" → Rework: scale flip (C + header + GD-IDS)341/unikit-gd-content CT-card "retype cost to enum" → Rework: type change + data migration342```