Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
142 commits
Select commit Hold shift + click to select a range
c9c5034
docs: establish Kitty project preproduction source of truth
faechaurig-coder Oct 2, 2026
c99913c
docs: add Kitty master execution plan
faechaurig-coder Oct 2, 2026
eac48b8
docs: add Kitty product bible
faechaurig-coder Oct 2, 2026
aff0e85
docs: add Kitty technical foundation
faechaurig-coder Oct 2, 2026
e0f1500
docs: add brand_direction
faechaurig-coder Oct 2, 2026
a5d5fbb
docs: add mochi_character_bible
faechaurig-coder Oct 2, 2026
764ddb6
docs: add design_system
faechaurig-coder Oct 2, 2026
a6b9bfc
docs: add vertical_slice_spec
faechaurig-coder Oct 2, 2026
3f8a4fb
feat(whiskerfolk): add index.html for Mochi vertical slice
faechaurig-coder Oct 2, 2026
4b5ddd6
feat(whiskerfolk): add styles.css for Mochi vertical slice
faechaurig-coder Oct 2, 2026
0d1d590
feat(whiskerfolk): add app.js for Mochi vertical slice
faechaurig-coder Oct 2, 2026
5cd97c2
feat(whiskerfolk): add README.md for Mochi vertical slice
faechaurig-coder Oct 2, 2026
c9e2658
chore(whiskerfolk): vendor Match3Demo.csproj
faechaurig-coder Oct 2, 2026
8bbb2ec
chore(whiskerfolk): vendor scripts/core/BoardData.cs
faechaurig-coder Oct 2, 2026
c47cdae
chore(whiskerfolk): vendor scripts/core/MatchDetector.cs
faechaurig-coder Oct 2, 2026
7e6b835
chore(whiskerfolk): vendor scripts/core/MatchResult.cs
faechaurig-coder Oct 2, 2026
b3ee846
chore(whiskerfolk): vendor scripts/core/GravitySystem.cs
faechaurig-coder Oct 2, 2026
2461306
chore(whiskerfolk): vendor scripts/core/SpawnSystem.cs
faechaurig-coder Oct 2, 2026
795c242
chore(whiskerfolk): vendor scripts/core/ValidMoveChecker.cs
faechaurig-coder Oct 2, 2026
5916572
chore(whiskerfolk): vendor scripts/core/ScoreCalculator.cs
faechaurig-coder Oct 2, 2026
731ca50
chore(whiskerfolk): vendor LICENSE
faechaurig-coder Oct 2, 2026
4a846fd
refactor(whiskerfolk): isolate puzzle namespace for BoardData.cs
faechaurig-coder Oct 2, 2026
a4f011d
refactor(whiskerfolk): isolate puzzle namespace for MatchDetector.cs
faechaurig-coder Oct 2, 2026
a907239
refactor(whiskerfolk): isolate puzzle namespace for MatchResult.cs
faechaurig-coder Oct 2, 2026
3304945
refactor(whiskerfolk): isolate puzzle namespace for GravitySystem.cs
faechaurig-coder Oct 2, 2026
892aa71
refactor(whiskerfolk): isolate puzzle namespace for SpawnSystem.cs
faechaurig-coder Oct 2, 2026
0df9ff0
refactor(whiskerfolk): isolate puzzle namespace for ValidMoveChecker.cs
faechaurig-coder Oct 2, 2026
6b48f76
refactor(whiskerfolk): isolate puzzle namespace for ScoreCalculator.cs
faechaurig-coder Oct 2, 2026
0ef77c0
feat(whiskerfolk): add project foundation
faechaurig-coder Oct 2, 2026
80554a2
feat(whiskerfolk): add CatDefinition foundation
faechaurig-coder Oct 2, 2026
f29afe9
feat(whiskerfolk): add BondState foundation
faechaurig-coder Oct 2, 2026
55ddb5c
feat(whiskerfolk): add CatState foundation
faechaurig-coder Oct 2, 2026
2180ce5
feat(whiskerfolk): add CatBehaviorController foundation
faechaurig-coder Oct 2, 2026
d393c88
feat(whiskerfolk): add RescueBeat foundation
faechaurig-coder Oct 2, 2026
8e22981
feat(whiskerfolk): add RescueArc foundation
faechaurig-coder Oct 2, 2026
0cb8c69
feat(whiskerfolk): add RescueDirector foundation
faechaurig-coder Oct 2, 2026
414f524
feat(whiskerfolk): add Objectives foundation
faechaurig-coder Oct 2, 2026
ea1e7c9
feat(whiskerfolk): add HomeObjectDefinition foundation
faechaurig-coder Oct 2, 2026
39de391
feat(whiskerfolk): add MemoryDefinition foundation
faechaurig-coder Oct 2, 2026
8f92626
feat(whiskerfolk): add IAnalyticsService foundation
faechaurig-coder Oct 2, 2026
bf13930
feat(whiskerfolk): add SaveGame foundation
faechaurig-coder Oct 2, 2026
93dee2e
test(whiskerfolk): add BoardDataTests.cs
faechaurig-coder Oct 2, 2026
28c6d4c
test(whiskerfolk): add BoardGenerationTests.cs
faechaurig-coder Oct 2, 2026
c687c7d
test(whiskerfolk): add MatchDetectorTests.cs
faechaurig-coder Oct 2, 2026
c151776
test(whiskerfolk): add GravitySystemTests.cs
faechaurig-coder Oct 2, 2026
f073892
test(whiskerfolk): add ScoreCalculatorTests.cs
faechaurig-coder Oct 2, 2026
21ec4d2
test(whiskerfolk): add SpecialTilesTests.cs
faechaurig-coder Oct 2, 2026
810d4be
test(whiskerfolk): add ValidMoveCheckerTests.cs
faechaurig-coder Oct 2, 2026
6db6341
test(whiskerfolk): add EdgeCasesTests.cs
faechaurig-coder Oct 2, 2026
a60a510
test(whiskerfolk): add ReshuffleTests.cs
faechaurig-coder Oct 2, 2026
f69a2f9
test(whiskerfolk): add SwapClearCascadeTests.cs
faechaurig-coder Oct 2, 2026
e5ab1c3
docs(whiskerfolk): add initial_roster
faechaurig-coder Oct 2, 2026
c5e06fb
docs(whiskerfolk): add monetization_blueprint
faechaurig-coder Oct 2, 2026
cf4af13
docs(whiskerfolk): add analytics_and_experiments
faechaurig-coder Oct 2, 2026
94c3125
docs(whiskerfolk): add qa_release_gates
faechaurig-coder Oct 2, 2026
1cbed6a
docs(whiskerfolk): add liveops_post_go
faechaurig-coder Oct 2, 2026
05c3669
feat(whiskerfolk): add initial eight-cat data roster
faechaurig-coder Oct 2, 2026
830f905
docs(whiskerfolk): publish phase status and honest release blockers
faechaurig-coder Oct 2, 2026
52b36f6
fix(whiskerfolk): import puzzle namespace in BoardDataTests.cs
faechaurig-coder Oct 2, 2026
9745e98
fix(whiskerfolk): import puzzle namespace in BoardGenerationTests.cs
faechaurig-coder Oct 2, 2026
677659b
fix(whiskerfolk): import puzzle namespace in MatchDetectorTests.cs
faechaurig-coder Oct 2, 2026
01d7721
fix(whiskerfolk): import puzzle namespace in GravitySystemTests.cs
faechaurig-coder Oct 2, 2026
d0d0dc9
fix(whiskerfolk): import puzzle namespace in ScoreCalculatorTests.cs
faechaurig-coder Oct 2, 2026
3b49644
fix(whiskerfolk): import puzzle namespace in SpecialTilesTests.cs
faechaurig-coder Oct 2, 2026
fa13512
fix(whiskerfolk): import puzzle namespace in ValidMoveCheckerTests.cs
faechaurig-coder Oct 2, 2026
535978d
fix(whiskerfolk): import puzzle namespace in EdgeCasesTests.cs
faechaurig-coder Oct 2, 2026
3b51c63
fix(whiskerfolk): import puzzle namespace in ReshuffleTests.cs
faechaurig-coder Oct 2, 2026
095a827
fix(whiskerfolk): import puzzle namespace in SwapClearCascadeTests.cs
faechaurig-coder Oct 2, 2026
1ae1fc1
test(whiskerfolk): add BondStateTests.cs
faechaurig-coder Oct 2, 2026
e7245a0
test(whiskerfolk): add RescueDirectorTests.cs
faechaurig-coder Oct 2, 2026
a670954
test(whiskerfolk): add ObjectiveProgressTests.cs
faechaurig-coder Oct 2, 2026
7a004ff
test(whiskerfolk): add CatBehaviorControllerTests.cs
faechaurig-coder Oct 2, 2026
77c903d
feat(whiskerfolk): add MochiActor.cs runtime
faechaurig-coder Oct 2, 2026
563a7fa
feat(whiskerfolk): add WhiskerfolkBootstrap.cs runtime
faechaurig-coder Oct 2, 2026
bd60796
feat(whiskerfolk): add Main.tscn runtime
faechaurig-coder Oct 2, 2026
f030e13
feat(whiskerfolk): wire Godot vertical slice main scene
faechaurig-coder Oct 2, 2026
a589bf7
fix(whiskerfolk): use Godot theme constant API for containers
faechaurig-coder Oct 2, 2026
e1f39ee
fix(whiskerfolk): finish Godot container theme API cleanup
faechaurig-coder Oct 2, 2026
61460cf
fix(whiskerfolk): add safe-path puzzle and align rescue state machine
faechaurig-coder Oct 2, 2026
bf04a60
feat(whiskerfolk): add safe-path puzzle to web vertical slice
faechaurig-coder Oct 2, 2026
f28eaf5
fix(whiskerfolk): add puzzle enums required by core tests
faechaurig-coder Oct 2, 2026
95ecc2e
refactor(whiskerfolk): make save collections serializable
faechaurig-coder Oct 2, 2026
7f48b24
feat(whiskerfolk): add SaveService service
faechaurig-coder Oct 2, 2026
a380595
feat(whiskerfolk): add DebugAnalyticsService service
faechaurig-coder Oct 2, 2026
79f85c4
feat(whiskerfolk): add HapticsService service
faechaurig-coder Oct 2, 2026
51b7686
feat(whiskerfolk): add AudioService service
faechaurig-coder Oct 2, 2026
7773d73
feat(whiskerfolk): add EconomyModels service
faechaurig-coder Oct 2, 2026
eee41d8
feat(whiskerfolk): add ICommerceService service
faechaurig-coder Oct 2, 2026
a07b143
feat(whiskerfolk): add BehaviorScheduler service
faechaurig-coder Oct 2, 2026
6a81226
feat(whiskerfolk): support rescue arc resume from save
faechaurig-coder Oct 2, 2026
f8ece70
feat(whiskerfolk): wire save resume analytics and haptics into vertic…
faechaurig-coder Oct 2, 2026
d9542db
fix(whiskerfolk): prevent recursive story advance helper
faechaurig-coder Oct 2, 2026
5864aa5
feat(whiskerfolk): add mochi_app_icon_direction.svg visual asset
faechaurig-coder Oct 2, 2026
29bf832
feat(whiskerfolk): add whiskerfolk_wordmark_direction.svg visual asset
faechaurig-coder Oct 2, 2026
4b0b90e
feat(whiskerfolk): add README.md visual asset
faechaurig-coder Oct 2, 2026
29cabe8
fix(whiskerfolk): correct project.godot main scene newline
faechaurig-coder Oct 2, 2026
1257f53
fix(whiskerfolk): make home resume-safe and first-arrival analytics i…
faechaurig-coder Oct 2, 2026
2651ca9
build(whiskerfolk): add export_presets.cfg
faechaurig-coder Oct 2, 2026
0eafd81
build(whiskerfolk): add .gitignore
faechaurig-coder Oct 2, 2026
51155c9
build(whiskerfolk): add ANDROID_BUILD.md
faechaurig-coder Oct 2, 2026
bf1f3b1
ci(whiskerfolk): add branch build and test workflow
faechaurig-coder Oct 2, 2026
682aaaf
refactor(whiskerfolk): separate runtime from test dependencies
faechaurig-coder Oct 2, 2026
e6a2193
test(whiskerfolk): create isolated test project
faechaurig-coder Oct 2, 2026
f6d424a
ci(whiskerfolk): run isolated test project
faechaurig-coder Oct 2, 2026
4214cb7
refactor(whiskerfolk): add engine-agnostic GridPos.cs
faechaurig-coder Oct 2, 2026
655ff66
refactor(whiskerfolk): make BoardData.cs engine-agnostic
faechaurig-coder Oct 2, 2026
492357b
refactor(whiskerfolk): make MatchResult.cs engine-agnostic
faechaurig-coder Oct 2, 2026
4e73c2b
refactor(whiskerfolk): make GravitySystem.cs engine-agnostic
faechaurig-coder Oct 2, 2026
80a4b79
refactor(whiskerfolk): make SpawnSystem.cs engine-agnostic
faechaurig-coder Oct 2, 2026
da14f08
refactor(whiskerfolk): make MatchDetector.cs engine-agnostic
faechaurig-coder Oct 2, 2026
47619d3
test(whiskerfolk): remove Godot dependency from BoardDataTests.cs
faechaurig-coder Oct 2, 2026
1249895
test(whiskerfolk): remove Godot dependency from BoardGenerationTests.cs
faechaurig-coder Oct 2, 2026
c1bea11
test(whiskerfolk): remove Godot dependency from MatchDetectorTests.cs
faechaurig-coder Oct 2, 2026
fb7037d
test(whiskerfolk): remove Godot dependency from GravitySystemTests.cs
faechaurig-coder Oct 2, 2026
beab002
test(whiskerfolk): remove Godot dependency from ScoreCalculatorTests.cs
faechaurig-coder Oct 2, 2026
5807ed4
test(whiskerfolk): remove Godot dependency from SpecialTilesTests.cs
faechaurig-coder Oct 2, 2026
23ec187
test(whiskerfolk): remove Godot dependency from ValidMoveCheckerTests.cs
faechaurig-coder Oct 2, 2026
dd89488
test(whiskerfolk): remove Godot dependency from EdgeCasesTests.cs
faechaurig-coder Oct 2, 2026
486f432
test(whiskerfolk): remove Godot dependency from ReshuffleTests.cs
faechaurig-coder Oct 2, 2026
c076260
test(whiskerfolk): remove Godot dependency from SwapClearCascadeTests.cs
faechaurig-coder Oct 2, 2026
6622944
test(whiskerfolk): make board generation deterministic pure .NET
faechaurig-coder Oct 2, 2026
3da0f52
test(whiskerfolk): replace Godot shuffle with deterministic .NET shuffle
faechaurig-coder Oct 2, 2026
2b4fb68
refactor(whiskerfolk): extract engine-agnostic core project
faechaurig-coder Oct 2, 2026
9a263eb
refactor(whiskerfolk): make Godot runtime consume core library
faechaurig-coder Oct 2, 2026
e4f7718
test(whiskerfolk): run domain tests against pure core library
faechaurig-coder Oct 2, 2026
4e631a9
test(whiskerfolk): add ProductContractTests contract tests
faechaurig-coder Oct 2, 2026
d4eeced
test(whiskerfolk): add EconomyTests contract tests
faechaurig-coder Oct 2, 2026
9c3ac17
test(whiskerfolk): add FullRescueArcTests contract tests
faechaurig-coder Oct 2, 2026
2599f4a
test(whiskerfolk): add HomeBehaviorTests contract tests
faechaurig-coder Oct 2, 2026
7631294
ci(whiskerfolk): harden static contracts and cancel stale runs
faechaurig-coder Oct 2, 2026
d58c105
fix(whiskerfolk): apply cat-specific object affinity in home scheduler
faechaurig-coder Oct 2, 2026
5d1b375
feat(whiskerfolk): add living Home behavior and replay-safe Box Moment
faechaurig-coder Oct 2, 2026
b2e65f8
feat(whiskerfolk): add Mochi microexpressions and irregular idle motion
faechaurig-coder Oct 2, 2026
b76b4af
feat(whiskerfolk): add procedural vertical-slice sound cues
faechaurig-coder Oct 2, 2026
0ae6afa
feat(whiskerfolk): wire procedural sound language through Mochi rescue
faechaurig-coder Oct 2, 2026
859c0e1
feat(whiskerfolk): handle Android back and pause-safe persistence
faechaurig-coder Oct 2, 2026
e87253d
build(whiskerfolk): let app manage Android back requests
faechaurig-coder Oct 2, 2026
6777c68
fix(whiskerfolk): correct procedural audio PI constant
faechaurig-coder Oct 2, 2026
59bcefd
docs(whiskerfolk): record green CI technical validation baseline
faechaurig-coder Oct 2, 2026
22740c0
docs(whiskerfolk): update phases with CI-validated runtime progress
faechaurig-coder Oct 2, 2026
4a6e172
deploy(whiskerfolk): add vercel.json
faechaurig-coder Oct 2, 2026
943be33
deploy(whiskerfolk): add VERCEL_DEPLOY.md
faechaurig-coder Oct 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 71 additions & 0 deletions .github/workflows/whiskerfolk-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
name: Whiskerfolk CI

on:
push:
branches:
- kitty-crush-preproduction
paths:
- 'projects/kitty-crush/**'
- '.github/workflows/whiskerfolk-ci.yml'
pull_request:
branches:
- main
paths:
- 'projects/kitty-crush/**'
- '.github/workflows/whiskerfolk-ci.yml'

concurrency:
group: whiskerfolk-ci-${{ github.ref }}
cancel-in-progress: true

jobs:
validate:
name: Static Contracts
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Validate web prototype syntax
run: node --check projects/kitty-crush/prototype-web/app.js

- name: Validate Godot main scene
run: grep -F 'run/main_scene="res://scenes/Main.tscn"' projects/kitty-crush/godot/project.godot

- name: Validate Android haptics permission
run: grep -F 'permissions/vibrate=true' projects/kitty-crush/godot/export_presets.cfg

- name: Validate third-party license retention
run: test -s projects/kitty-crush/godot/THIRD_PARTY_MATCH3_PETS_LICENSE.txt

- name: Guard runtime from test packages
run: |
if grep -qi 'xunit\|Microsoft.NET.Test.Sdk\|coverlet' projects/kitty-crush/godot/Whiskerfolk.csproj; then
echo "Test-only package leaked into runtime project."
exit 1
fi

test:
name: Build + Core Tests
runs-on: ubuntu-latest
defaults:
run:
working-directory: projects/kitty-crush/godot

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup .NET 8
uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'

- name: Restore tests
run: dotnet restore tests/Whiskerfolk.Tests.csproj

- name: Build Godot runtime
run: dotnet build Whiskerfolk.csproj --configuration Release

- name: Test engine-agnostic core
run: dotnet test tests/Whiskerfolk.Tests.csproj --configuration Release --logger "console;verbosity=normal"
74 changes: 74 additions & 0 deletions projects/kitty-crush/ANALYTICS_AND_EXPERIMENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# WHISKERFOLK — Analytics & Experimentation

## North-star research question
Does the player form a memorable relationship with Mochi before the end of session one?

## First-session funnel
1. app_start
2. first_mochi_seen
3. box_inspected
4. first_puzzle_started
5. first_puzzle_completed
6. first_trust_response
7. shelter_puzzle_completed
8. rescue_started
9. carrier_choice_completed
10. box_moment_started
11. box_moment_completed
12. home_first_entry
13. home_observation_30s
14. first_object_interaction
15. first_memory_created

## Behavioral measures
### Attachment proxies
- seconds observing Mochi with no required input;
- voluntary cat taps that are not goal-driven;
- repeat Catbook opens;
- memory opens/shares;
- placement of objects near cat-favorite zones;
- next-session time-to-first-cat-interaction.

### Puzzle measures
- first move latency;
- invalid swap rate;
- moves remaining;
- retry rate;
- cascade frequency;
- objective comprehension.

### Home measures
- time before opening secondary UI;
- number of autonomous behaviors observed;
- number of object interactions;
- object placement completion.

## Qualitative playtest
After session one ask, without showing prompts:
1. What was the cat’s name?
2. Tell me something about his personality.
3. What moment do you remember most?
4. What do you think Mochi likes?
5. Would you open this tomorrow if no new level reward were waiting?
6. What would you change in his room?
7. Did any part feel like “another match-3”?

## GO thresholds for small prototype study
These are internal decision thresholds, not market guarantees:
- ≥80% unaided Mochi name recall;
- ≥70% can state one accurate personality trait;
- ≥60% choose the Box Moment/rescue as a memorable moment rather than generic puzzle;
- ≥50% say they would return primarily to see/continue with Mochi;
- median ≥30 sec non-required Home observation;
- <20% describe the product primarily as generic match-3.

## Experiment order
A/B only after baseline exists.

1. Box Moment pacing: 12s vs 18s.
2. Direct tutorial vs environmental tutorial.
3. Objective world-change immediacy.
4. Home UI delayed vs immediately available.
5. First object: blanket vs scratcher.

Never A/B core ethical rules.
55 changes: 55 additions & 0 deletions projects/kitty-crush/BRAND_DIRECTION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# WHISKERFOLK — Brand Direction v0.1

## Working brand
**WHISKERFOLK**

Status: strong working title; not yet trademark-cleared.

## Why this name
- Cat-specific without saying "cat" generically.
- Implies a family/community of distinct characters.
- Scales beyond Mochi without losing emotional intimacy.
- Does not anchor the product to match-3.
- Supports IP, character pages, merch and social voice.

## Brand promise
**Every cat has a way of becoming part of your home.**

## Product sentence
A premium cozy mobile game where you find frightened cats, help them through tactile puzzles, earn their trust, bring them home, and discover their personalities as they begin to feel safe.

## Emotional territory
Warmth, rescue, trust, homecoming, quiet humor, tiny surprises, chosen family.

## What WHISKERFOLK is NOT
- shelter-management simulator;
- Tamagotchi obligation loop;
- gacha collector;
- generic match-3 skin;
- hyperactive kids UI;
- sad-animal guilt product.

## Verbal tone
Short, warm, observant, never babyish.

Good:
- “He came back.”
- “Mochi found the warm spot.”
- “Someone moved your blanket.”
- “He’s still deciding if you’re safe.”

Avoid:
- “OMG SO CUTE!!!”
- “Your pet is starving!”
- “Come back NOW or lose your streak.”
- generic fantasy copy.

## Logo direction
A wordmark with one subtle feline behavior cue:
- tail-like terminal stroke;
- paired whisker cuts;
- soft “W” silhouette;
- no paw-print cliché as primary mark.

## App icon direction
Mochi’s face partly emerging from a box opening. Large eyes, asymmetrical ear/mark, warm interior light, no text.
105 changes: 105 additions & 0 deletions projects/kitty-crush/DESIGN_SYSTEM.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
# WHISKERFOLK — Premium Mobile Design System v0.1

## Quality bar
Premium-casual mobile: warm, tactile, elegant, character-first.

The interface should feel expensive because it is **controlled**, not because it has more effects.

## Composition
The world occupies 80–90% of meaningful visual attention.
UI floats only where necessary.

### Home
- no dashboard grid;
- one unobtrusive top status strip at most;
- contextual controls appear after tapping cat/object;
- collections live in bottom sheets;
- primary CTA appears only when the player has a clear next rescue beat.

### Puzzle
- board dominates;
- rescue objective visible as world context above/behind board;
- moves/objective compact;
- boosters secondary;
- no casino clutter.

## Visual DNA
### Base colors
- Ink: #27312E
- Soft ink: #51605B
- Milk: #FFF9EF
- Warm paper: #F5E9D7
- Moss: #6F8F78
- Sage light: #AFC8B4
- Caramel: #C88B5A
- Peach light: #F2C7A8
- Rain blue: #7896A6
- Night blue: #273B49

### Accent rule
One emotional accent per scene.
Do not run blue, purple, pink, green and gold simultaneously.

## Shape language
- radius family: 14 / 20 / 28;
- cards only when content genuinely needs containment;
- no nested-card labyrinth;
- large soft silhouettes;
- minimal borders;
- shadows broad and low-contrast.

## Typography
Use one rounded humanist sans family with:
- Display: 700
- Title: 650
- Body: 450–500
- Caption: 550

No more than 4 text sizes on a normal screen.

## Touch
- minimum 48 dp target;
- primary tap areas 56–64 dp;
- destructive/exit actions visually separated;
- back behavior always predictable.

## Motion
### UI
- 160–220ms micro transitions;
- 280–420ms sheets;
- ease-out for entry;
- ease-in for exit;
- no gratuitous bounce.

### World
Animals use slower asymmetric timing.
The cat may pause before completing an animation.

## Particle budget
Routine:
0–8 particles.
Special:
8–24.
Signature rescue moments:
controlled cinematic particles only when motivated by environment.

## Haptic hierarchy
1. micro selection — very light
2. match — light
3. special creation — medium-soft
4. rescue success — medium
5. box latch/open — distinctive single pulse
6. affection milestone — subtle double pulse

## Accessibility
- no color-only puzzle types;
- pattern/shape distinction;
- reduced motion mode;
- haptics toggle;
- subtitles/captions for meaningful vocalization cues;
- contrast target AA where text is involved;
- respect larger system text where possible.

## Performance
Visual quality must not depend on huge overdraw or 4K assets.
Use atlases, compressed textures, pooled FX, scene culling and limited simultaneous live actors.
73 changes: 73 additions & 0 deletions projects/kitty-crush/INITIAL_ROSTER.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# WHISKERFOLK — Initial Eight-Cat Roster

Only Mochi is P0 production. Cats 2–8 remain design-ready until Mochi passes attachment validation.

## 1. Mochi — The Cautious Observer
Visual: cream coat, caramel ear/eye comma, moss-green eyes.
Rescue: rainy storefront box.
Favorite object: cardboard box.
Signature: approaches, retreats, looks back, returns.
Relationship lesson: safety is chosen, not forced.

## 2. Churro — The Confident Food Critic
Visual: long orange tabby, darker cinnamon stripes, white chin.
Rescue: bakery loading alley where he has learned delivery schedules.
Favorite object: kitchen mat / puzzle feeder.
Signature: inspects every bowl, pushes the “wrong” one aside.
Personality: social, shameless, opportunistic, dramatic about food.
Relationship lesson: affection can look like showing up every day.

## 3. Nori — The High-Ground Strategist
Visual: near-black coat with blue-green sheen and one white toe.
Rescue: rooftop/service stairwell.
Favorite object: tall shelf / window perch.
Signature: watches from above before dropping silently into the room.
Personality: independent, calm, highly observant.
Relationship lesson: proximity is not the only form of trust.

## 4. Chispa — The Kinetic Calico
Visual: compact calico with one orange “lightning” face patch.
Rescue: mechanic courtyard full of moving objects and hiding spots.
Favorite object: feather wand / rolling spring.
Signature: pounce → skid → pretend it was intentional.
Personality: fearless curiosity, short attention, comic confidence.
Relationship lesson: safety can unlock play.

## 5. Trufa — The Soft Giant
Visual: broad brown tabby, plush cheeks, tiny serious eyes.
Rescue: quiet park storage shed.
Favorite object: oversized cushion.
Signature: slowly occupies an object clearly too small for him.
Personality: patient, tactile, comfort-seeking.
Relationship lesson: calm presence can be deeply expressive.

## 6. Luma — The Sun Collector
Visual: pale silver coat, warm cream chest, amber eyes.
Rescue: greenhouse/service garden.
Favorite object: sun patch / woven mat.
Signature: relocates with the sun throughout the day.
Personality: gentle, routine-loving, easily fascinated by light.
Relationship lesson: home becomes a map of safe places.

## 7. Tinta — The Tiny Engineer
Visual: tuxedo cat with ink-black mask and white “gloves”.
Rescue: back room where she repeatedly opens a loose cabinet.
Favorite object: puzzle box / cabinet latch.
Signature: studies mechanisms, then solves them.
Personality: clever, persistent, mildly mischievous.
Relationship lesson: intelligence itself becomes character.

## 8. Pipa — The Social Bridge
Visual: tortoiseshell with a warm split-color muzzle.
Rescue: community courtyard where several cats tolerate her.
Favorite object: shared blanket.
Signature: inserts herself exactly between two cats and settles.
Personality: socially bold, adaptable, affectionate without clinginess.
Relationship lesson: later cats change earlier cats.

# Roster rules
- No duplicate silhouette.
- No “same cat, different fur”.
- Every cat changes the room behavior graph.
- Every rescue teaches a different kind of trust.
- Each cat must own one screenshot-worthy behavior.
Loading
Loading