Skip to content

Recover and sync the live Gradientfall development history - #2

Merged
danieltalbert merged 72 commits into
mainfrom
agent/sync-live-gradientfall-2026-07-27
Jul 28, 2026
Merged

Recover and sync the live Gradientfall development history#2
danieltalbert merged 72 commits into
mainfrom
agent/sync-live-gradientfall-2026-07-27

Conversation

@danieltalbert

Copy link
Copy Markdown
Owner

What changed

  • publishes the exact gradientfall/ subtree history from the live local monorepo through the latest July 26 development commit
  • preserves newer character, world, town, inventory, content, and visual-development work that was not present on the dedicated repository's main
  • keeps the history connected to the shared pre-split Gradientfall ancestry

Why

The live folder contained an empty nested .git directory, so Git walked up to the parent profile repository and attempted pushes against danieltalbert/danieltalbert. The dedicated Gradientfall repository therefore did not receive the newer committed game history.

Safety and validation

  • created and verified a complete Git bundle of the original parent repository before repair
  • pushed commit 192c831b677c42db9561e9018ee04ebf8a016722 as the recovered subtree tip
  • initialized the live Gradientfall folder as its own checkout of this branch
  • confirmed a clean worktree and an error-free git push --dry-run

This PR is intentionally a draft because main also has post-split documentation/artwork commits; the two histories should be integrated and validated deliberately before merge.

danieltalbert and others added 30 commits May 7, 2026 19:36
… focus

Updated personal introduction and removed placeholder text.
Godot 4 project scaffold with 240x320 pixel viewport, four autoloads,
authored content for all 20 ML worlds (definitions, questions, tutors,
minis, vocab), meta data (acts, palettes, titles, achievements,
constants), deterministic map generator, and a validation script that
asserts all content counts, answer ranges, and map connectivity.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WW4vMXx2J1G5UnBsoNkFKe
Programmatic pixel art module (terrain atlas per act, player frames,
NPC and item textures), TileMapLayer terrain built from map data,
player with axis-separated grid collision, hold-to-sprint with dust
particles, walk animation, crown swap hook, smoothed camera with map
limits, and pulsing numbered boss portals with re-arm trigger logic.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WW4vMXx2J1G5UnBsoNkFKe
Shared QuizPanel with Boss, Mini, and Glitch modes: act label, world
name, topic, zone-prep status, definition, shuffled options, retry on
wrong answers, one-shot glitch behavior, review mode without XP, vocab
loot reveal, pop-in tween, tree pause while open, and keyboard answer
shortcuts. Boss XP is 50 first-try or 25 after retry, streak-scaled
and persisted through GameState.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WW4vMXx2J1G5UnBsoNkFKe
Wanderer base class with leashed roaming, grid collision, idle pauses,
bobbing indicators, and touch trigger with re-arm. Tutors wear act
accent robes with a question mark until read; monsters animate two
frames with an exclamation mark until beaten. Two-page TutorPanel with
page-turn sound and read tracking; Main routes all entity triggers.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WW4vMXx2J1G5UnBsoNkFKe
Shard collectibles with bob, sparkle burst, blip, and persistence by
index. HUD with level and title, XP progress bar, streak multiplier
readout, progress counters, and an edge-clamped quest compass arrow
that tracks the lowest uncleared boss. Touch D-pad and RUN button on
touchscreen devices. Level-up and achievement toasts with fanfare.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WW4vMXx2J1G5UnBsoNkFKe
…eens

Golden Glitch with faster roaming, shimmer, 40 second spawn and
relocate timers gated on topic engagement, one-shot remix quiz from
the engaged pool, and despawn plus respawn on either outcome. Seven
synthesized chiptune WAVs committed with their generator script.
Title screen with Continue and New Game (erase save), victory screen
with stats after the 20th boss, and glitch sting on encounter.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WW4vMXx2J1G5UnBsoNkFKe
Floating +XP text on every gain, screen shake beat before boss panels
open, gold particle burst on quiz wins, tileable CRT scanline overlay
behind toasts (SCANLINES const in Main), and a HUD sound toggle button
next to the M key shortcut.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WW4vMXx2J1G5UnBsoNkFKe
Toasts animate through tree pause, rename a shadowed parameter, hoist
shake state to the class variable block, and wrap a long line.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WW4vMXx2J1G5UnBsoNkFKe
Twenty remix questions, one per topic, each testing the concept from a
different angle than the boss question. Cleared bosses now review with
the remix variant so replays stay a real test, and the Golden Glitch
asks the remix instead of repeating the boss question the player just
answered. Validation asserts the remix bank's counts and answer ranges.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WW4vMXx2J1G5UnBsoNkFKe
Four looping tracks composed by tools/gen_music.py (triangle bass,
square arpeggio lead, one progression and rhythm per act) committed
under assets/music. New Music autoload crossfades between tracks at
biome borders, ducks with the shared mute flag, and loops via runtime
loop points. The overworld detects act changes from the player's row
and shows an act entry banner with a spam cooldown.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WW4vMXx2J1G5UnBsoNkFKe
Toggleable minimap strip (Tab key or the new MAP button) showing the
whole descent: baked terrain texture, remaining shards, unread tutors,
unbeaten minis, portal states, the blinking player and Glitch markers,
and a camera view box.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WW4vMXx2J1G5UnBsoNkFKe
Left stick and dpad movement, A confirm, B back, X or right shoulder
sprint, Y minimap. Panels, title, and victory screens now grab focus
on open so keyboard arrows and gamepads can navigate every button.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WW4vMXx2J1G5UnBsoNkFKe
Three monster body types (blob, spiked, wisp) cycled by world id with
per-act palette tinting, and a bounds guard in the pixel map reader.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WW4vMXx2J1G5UnBsoNkFKe
Document the beyond-parity feature set (remix bank, act music,
minimap, gamepad, monster variety), prune shipped backlog items, and
bump the project version.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WW4vMXx2J1G5UnBsoNkFKe
Per-world lab names and goals in worlds.json, two lab achievements
(now 12 total), an xp_lab constant, 20 lab station placements in the
map generator with clear pockets, and validation coverage for all of
it including reachability.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WW4vMXx2J1G5UnBsoNkFKe
LabLibrary with 17 visual simulation classes covering all 20 topics:
fit a regression line by hand, rotate decision boundaries with and
without a margin goal, grow a KNN vote, drive tree split stakes, find
the test-error sweet spot, weigh Bayes evidence, stabilize a bagging
chorus, hammer boosting rounds, tune alarm thresholds for F1 and for
anomaly costs, step k-means to convergence, weave a dendrogram, spin
a PCA axis, fill a recommender matrix, tune neuron weights, ride
gradient descent learning rates, sweep a conv filter, guard an LSTM
gate, and aim attention. LabPanel hosts them with keyboard, gamepad,
and on-screen controls; LabStation terminals sit in every zone; labs
grant 30 XP once, count toward the Glitch pool, save, and appear in
the HUD and minimap.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WW4vMXx2J1G5UnBsoNkFKe
Journal panel (J key, gamepad, or LOG button) with one row per zone
showing tutor, mini, lab, boss, and shard progress plus a gold star
and running totals for fully cleared zones. A databot drone hatches
after the first boss clear and floats along behind the player.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WW4vMXx2J1G5UnBsoNkFKe
Document the depth update (labs, journal, pet), refresh the backlog,
and bump the project version.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WW4vMXx2J1G5UnBsoNkFKe
Cleared boss portals now open a turn-based card duel. The deck holds
one concept card per engaged topic, named after its vocab term with
power scaling by act depth. Playing a card asks a random question from
that topic's pool (boss, remix, or mini): correct answers strike the
boss for the card's power with a squash animation, wrong answers cost
a heart and reveal the truth. Wins pay 35 XP once per world, feed the
streak, and unlock two new achievements (14 total). Journal rows gain
an R mark. First encounters keep the classic quiz panel.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WW4vMXx2J1G5UnBsoNkFKe
Document the card-battle rematch system and its deliberate deviation
from the old review-quiz behavior, refresh the backlog, and bump the
project version.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WW4vMXx2J1G5UnBsoNkFKe
Godot's compiler rejects := inference when the right side involves
untyped container elements. Give explicit types to the boundary lab's
correctness flag, the neuron lab's activation, and the threshold lab's
precision math, and add int/float casts on the remaining container
element arithmetic in the labs so every expression has a set type.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WW4vMXx2J1G5UnBsoNkFKe
The SVM margin band loop iterated an untyped array literal, so the
loop variable poisoned the inferred type of the band midpoint. Type
the iterator explicitly. Full sweep of every := declaration and every
untyped for loop in the project found no other instance of the
pattern.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WW4vMXx2J1G5UnBsoNkFKe
…idator

Locked GDD (open-world Zelda-like ML sequel to Neural Quest), roadmap,
session contract (CLAUDE.md), content pipeline with 7 JSON schemas,
zero-dependency validator, seed content, and first ChatGPT batch brief.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…playbook

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
First end-to-end pipeline round-trip: agentic ChatGPT generated, validator
passed 12/12, reviewed for voice/canon, merged to approved. Bootstrap now has
13 dialogued NPCs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…f queue

Scaffold from scheduled run #1 boot-verified headless (Godot 4.7.1, ContentDB
22 entries, zero errors). Briefs restructured into queue/done folders, both
scheduled prompts upgraded to self-directing v2 (unconditional queue top-up
for Claude, claim-next-brief worker for ChatGPT), queue seeded with 3 briefs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
danieltalbert and others added 27 commits July 20, 2026 23:14
The profile-portfolio commit (06cc66c) deleted both project trees (164
files, ~15.9k lines) along with its README rework. Confirmed unintentional
with Danny — this restores gradientfall/ and neural-quest/ exactly as of
6fc1540 while keeping the new README + banner.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…tries), quest batch backfill, brief queue refreshed (04-07), milestone 5-7 devlog/roadmap

Content lane only, split from engine code deliberately: the M6/M7 engine
files are entangled with three in-flight visual sessions' working tree and
ride the post-visual sweep commit (see DEVLOG 2026-07-20 entry).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… the 4 canon landmarks (approved now 100 entries)

Danny reassigned batch_05 to Claude (Codex takes batch_04 monsters).
Authored to the brief: 4 canon sites + 11 invented, vistas per the iron
rule (Peaks/Forest), ML as behavior only, Thresher + Goose Conspiracy
foreshadows, single corruption nod at the Vault ruins. Validated 15/15,
merged to approved/pois/meadow_pois.json (16 POIs), brief queue->done,
WORLDBOOK POI tick 24 (16 done).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…proved now 108 entries

8 monsters, 3 fodder/4 standard/1 elite, behaviors lean melee/ranged/swarm
per the Combat v1 note. Eight ML concepts all in behavior (flock mean,
overfit route, mini-batch, centroid, single-feature classifier, k-NN,
recency bias, decision-tree elite Brackenhoof). Validated 8/8, merged to
approved/monsters/meadow_monsters.json (9 total), brief queue->done,
WORLDBOOK monster tick 8 (9 done). Proving-ground retirement condition met.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…, mountains, Knowledge charge v1 + combat

Full snapshot of the four concurrent local sessions Danny reviewed and
signed off (grass, clouds/sky, mountains, combat/UI/companion), plus the
merged content pipeline work (items/POIs/monsters) and neural-quest .uid
generation. Committed on the session branch as a safe backup.

NOTE: this tree's mountain lane (gradient_peaks.gd, 815 lines) is a parallel
development from pass-3 and DIVERGES from origin/main's remote passes 4-5
(636-line gradient_peaks.gd + peaks_approach.gd). Reconciliation to main is a
deliberate follow-up decision, not folded into this snapshot.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Captures the last on-disk edits that landed after the four-lane snapshot:
Kern mesh lib + studio look-dev, toon_soft shader, meadow_terrain, and a
grass-lane DEVLOG note (flags a non-fatal kern_visual.gd zero-surfaces
warning for the character lane).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Makes main's tip the boot-verified local working tree (Danny-approved,
all sessions): photoreal grass, volumetric sky/clouds, local mountains
(gradient_peaks.gd 815-line self-contained), Kern character model +
shaders, Combat v1, Knowledge charge v1, and the merged content pipeline.

Strategy 'ours': the remote 'richness passes 4-5' mountain implementation
(gradient_peaks 636-line, peaks_approach.gd, mountain.gdshader,
proto_mountains.py, richness4/5 progress PNGs) is SUPERSEDED at the tip but
remains in main's history (via this merge's second parent f0cfed0) and is
fully recoverable. Per Danny's explicit decision 2026-07-21.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Look-dev (all eyes-verified in the character studio):
- Skin: cel banding -> wrapped subsurface scattering w/ warm terminator
  bleed, thin-feature backlight, dual-lobe sheen.
- Head: mesh density 72x96; deeper features + eyelid folds, nasolabial and
  labiomental creases, tear troughs, orbital rims, baked crease occlusion.
- Eyes rebuilt as layered meshes (flattened almond sclera + iris disc + pupil
  + catchlight + lash lines). The analytic UV-sphere version rendered as a
  ring (degenerate pole = hole) and is gone.
- Proportions: lithe athletic V-taper torso, slimmer limbs, sloped shoulders
  (barrel + cape-wing silhouette fixed), narrower face, pointed Hylian ears.
- Cloth: twill weave, yarn-dye variation, embroidered trim, wind displacement
  on tunic/sleeves/scarf/cloak/hair. Boots: 6 lace crossings + eyelets +
  ankle strap/buckle.

Mysticism ("subtle & responsive" per Danny): one `awaken` level (0 disguised
traveller -> 1 First Model), wired to EventBus.knowledge_charge_changed, drives
a perceptron-glyph hand-mark + latent skin threads, perceptron-glyph embroidery,
gradient-shimmer irises, and orbiting data-shards. Magic lives in discrete
emitters, not surface fresnel (which floods rounded forms).

Base-mesh pipeline (GDD amendment, Danny's sign-off): hero may use an imported
CC0 rigged humanoid base (MakeHuman/MPFB). kern_bone_map maps our animation
bones onto the GameEngine rig; kern_base_model loads .glb/.gltf/.fbx/.dae,
applies the character shaders, and falls back to the procedural body when
absent, so the main line always runs. Provenance + body spec + export settings
in game/assets/models/README.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Judged on real studio renders (Godot 4.7.1), not on code reading. The last
pass's look-dev was landing on top of four render bugs that flattened it.

Fixes (before/after in docs/progress/kern_2026-07-24_*.png):
- kern_skin was the ONLY character shader not dividing diffuse by PI, so skin
  rendered PI times hotter than the clothing: a blown-out flat pink face over
  muddy garments, with no shading range left to read form. Normalised to match
  cloth/leather/hair/metal (and Godot's own built-in diffuse).
- rim/fill are added as raw EMISSION and were never PI-scaled either, so at
  rim_amount 0.20 the cool-blue cloth rim peaked ABOVE the tunic's own albedo
  in every channel. That was the grey-blue "ghost" wash over the whole costume
  - not a lighting choice. Cut cloth/leather/skin rim+fill to ~1/3.
- kern_skin bump_strength defaulted to 0.0, so the whole pore/wrinkle
  micro-detail system ran and multiplied by zero, leaving skin perfectly flat.
  Set to 0.00009 m (real pore relief is ~0.05 mm; 0.0006 reads as wet stucco).
- Eyes were 14 mm radius "a touch large" and seated 2 mm in, so the lens broke
  back out through the brow and cheek in profile. Held at the anatomical
  12.1 mm and seated deeper; oversized eyes are the loudest doll/anime tell.
- kern_mesh_lib.add_surface now drops empty bundles instead of committing them
  - that was the `surfaces.size() == 0` spam the grass lane flagged at us.

Base-mesh path (the actual blocker: kern_base.glb still does not exist, and
there is no Blender or MakeHuman on this machine):
- tools/check_base_mesh.py - zero-dep .glb/.gltf validator enforcing the same
  contract kern_bone_map.gd does at runtime: GameEngine rig names, ~1.75 m,
  +Y up, metres, T-pose (not A-pose), separate eyes, no clothing, no baked
  animation. Verified against 8 synthetic fixtures covering each failure.
- tools/export_kern_base.py - Blender script doing every error-prone export
  step identically each run. Deliberately does NOT script MPFB's internal API
  (it drifts between versions and is untestable here); it post-processes and
  exports whatever the MPFB GUI produced.
- assets/models/README.md - the ~6-click MPFB recipe plus the two commands.

HONEST STATE: Kern now reads acceptably at full-body game distance, but the
face still does not hold up at portrait range - it is a displaced lat/long
sphere and the hair is flat cards. That is the plateau the GDD amendment
already accepted; further sculpting is low-yield. The mesh is the unlock.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The blocker since the GDD §1 amendment is gone. With Blender 5.2 + MPFB
2.0.17 now on the machine, the base mesh was generated WITHOUT any GUI:

- tools/make_kern_base.py (new): drives MPFB's documented Python service
  layer (HumanService/TargetService) headlessly — creates the basemesh with
  Kern's macro build (young adult male, lean athletic), adds the 53-bone
  game_engine rig + low-poly eyes + teeth (renamed KernEyes/KernTeeth so the
  loader's surface hints match), bakes targets, deletes the helper cage,
  saves kern.blend. The CC0 system asset pack (268 MB, official MakeHuman
  mirror) was extracted into MPFB user data via MPFB's own pack loader.
- tools/export_kern_base.py: now CONVERTS A-pose rest to T-pose instead of
  just warning (MPFB rests in A; the retarget assumes T): poses each arm
  chain to +/-X, bakes the pose into the meshes by applying/re-adding the
  Armature modifiers, applies pose-as-rest. 48.7 deg droop -> 0.0.
- tools/check_base_mesh.py: up-axis check was wrong for the exact pose it
  demands — a T-posing human is legitimately WIDER (arm span 1.78 m) than
  tall, so "longest axis must be Y" false-failed. Now compares Y vs Z only.
  Fixture regression re-run: good PASS, zup FAIL, apose FAIL.

VERIFIED end to end: check_base_mesh.py PASS (53 bones, 19/19 mapped,
1.75 m, Y-up, T, eyes+teeth, no clothing, 3.5 MB); Godot import clean;
studio run logs "KernBoneMap: matched 19/19 bones" + "KernVisual: base mesh
loaded (1.75 m)"; all 21 studio shots render.

HONEST STATE: the imported body loads but the fitting pass is NOT done —
it stands in T-pose (no retarget yet), renders white (no vertex colors, the
skin shader needs an albedo fallback), and the procedural head/gear still
overlay it. That pass is next; the game still runs clean throughout because
the loader is additive.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…l engine bug

The imported body now loads, retargets, and paints (all opt-in via
`-- --kern-base`); the main game ships the fully-working procedural path.

WORKS (eyes-verified in the studio, docs/progress/kern_2026-07-24_imported_face.png):
- Bone retarget: model-space pose deltas re-expressed per imported-bone frame
  (pose = rest * (G^T · delta · G)), with a static T-pose->hanging-arms rest
  fix and a soft finger curl. 19/19 bones driven.
- Export pipeline hardened: A-pose->T-pose conversion, splayed-stance leg
  straightening, exact 1.75 m, and torso centring BAKED INTO THE GLB (the
  engine renders skinned geometry at the file's own coordinates — a runtime
  root shift provably never moves the rendered skin).
- Skin zone painting: vertex-colour zones (socket shading, nose/cheek/lip
  flush, thin ears for backlight, knuckle warmth) anchored to the imported
  eye-mesh landmarks, so any reasonable export self-calibrates. Imported
  eye/teeth textures kept (they beat procedural overrides on real UVs).
- Procedural-skin retirement (face/eyes/neck/hands hidden, hair/brows/mark
  kept) + garment refit: tunic/trouser/sleeve lofts re-measured against the
  imported body's actual cross-sections via a band-slice tool.

BLOCKED - the reason for the gate (full evidence in assets/models/README.md):
with the imported body present, meshes SKINNED to the procedural skeleton
render with broken depth — fragments lose the depth test against a body they
geometrically enclose. Geometry, skin matrices, transforms all verified
correct numerically; no_depth_test shows garments at correct positions;
RIGID geometry at identical coordinates renders perfectly; not the depth
prepass, not materials, not creation order, not vertex data. Needs the
editor frame debugger or a minimal two-skeleton repro for a Godot report.

Main line: default path renders the complete dressed procedural Kern with
today's shader fixes. Studio run verified clean, 21/21 shots.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Danny's explicit call: checkpoint everything so nothing is lost if this
machine dies. This freezes the OTHER lanes' uncommitted work as-is; their
sessions should review on resume rather than assume a finished state:

- Creature/combat lane (largest): enemy_visual.gd overhaul (+1.8k lines)
  + new creature_surface.gdshader — mid-flight creature visual rework.
- Grass/terrain lane: meadow_flora/meadow_terrain density addendums
  ("bury the ground", 5.4M blades), gradient_peaks + mountain_terrain +
  toon_soft tweaks.
- Sky lane: volumetric_sky/cloud_layer tuning + sky_preview.html sync,
  progress stills.
- Mountains lane doc: WORLD_ATLAS.md — world layout & scale PROPOSAL,
  still pending Danny's sign-off (not a locked pillar).
- DEVLOG: sky-lane entry + grass addendums; content: batch_04 inbox tweak;
  progress shots (grass ground, sky previews, in-game Kern).

VERIFIED before sweeping: headless main-scene boot is clean with all of it
live — "scaffold boot OK", ContentDB 108 entries, zero script errors.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…07-24)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…+ DEVLOG

Per Danny: nothing important may live outside the repo.
- assets_src/kern.blend committed (990 KB; outside game/ so the Godot
  importer ignores it); make_kern_base.py and the models README now point
  at the repo path instead of Documents.
- DEVLOG entry for the 2026-07-24 Kern session: shader fixes, the headless
  MPFB pipeline, the gated fitting stack, the skinned-depth engine bug with
  its falsification list, the "renderer draws skinned geometry at the glb's
  own coordinates" law, run commands and gotchas — everything that
  previously lived only in session memory / chat handoff.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Last uncommitted change in the tree, from the Kern character lane: mount
garments via the real node chain (global_transform-derived skeleton-in-model
transform) instead of `_base_root.transform`, which missed the intermediate
glTF armature nodes and left every garment offset. Also adds a `--hide-body`
debug probe (cmdline-gated, inert in normal play).

Committed as part of unifying all work onto main so future sessions start
from one clean, canonical tree. Verified: imports with no parse errors, boots
clean, meadow renders 2.8M near blades at ~32 FPS.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…inition

Fixes the previous commit, which captured the CALLER
(kern_visual.gd -> BaseModel.strip_covered_geometry) without its DEFINITION,
leaving HEAD unable to resolve the call. This adds the missing half from the
character lane: strip_covered_geometry() drops body triangles fully inside the
zones the code-built tunic/sleeves/trousers cover, which also removes the
body-vs-garment z-fighting class of bugs outright.

Caller and definition are now in the tree together; verified imports with no
parse errors.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…t work

Atomic snapshot of everything still uncommitted in the tree (kern_head.gd), so
main carries the whole working state rather than leaving edits stranded outside
version control. Committed as a full-tree snapshot rather than file-by-file,
after a clean parse, so a caller can't land without its definition.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…pies

Danny hit the exact failure this is meant to prevent: newer sessions rendered
the OLD spiky grass / gray ground, because finished work sat uncommitted and
stale copies of the project existed on disk. Everything is now unified.

- All in-flight work committed and pushed; `main` == `origin/main` is the only
  branch. Deleted the two stale branches (`claude/game-project-visibility-8bv55a`,
  `claude/new-session-j23l0w`) after verifying both were fully merged ancestors
  with nothing unique.
- CLAUDE.md gains a "one canonical workspace" section at the top: work only in
  C:\Users\danny\danieltalbert on main, plus a one-line check to run before
  building or judging visuals.
- Iron rule 1 rewritten to close the loophole that caused this: deferring a
  commit because "other lanes are mid-flight" is no longer acceptable, commits
  must be whole verified snapshots (not single files — that already put a caller
  on main without its definition), and uncommitted work is to be treated as
  nonexistent.
- The three frozen 2026-07-20 Codex snapshots on disk are each marked with
  STALE_DO_NOT_USE.md pointing at the real tree (archives kept, not deleted).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adds two sky-facing shots to the screenshot harness (sky_clouds_up /
sky_clouds_horizon). Every existing angle points at the ground, so the
volumetric cloud deck at 600-1820 m was never actually in frame — which is why
the clouds lane's work appeared to be missing.

Captures the current unified state of all four visual lanes to
docs/progress/status_2026-07-24/ for review.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…lit repo

Work had been happening in TWO repos: a standalone `danieltalbert/gradientfall`
(created by a Codex portfolio-publish) that cloud sessions then cloned, and this
monorepo where local sessions worked. Milestone 8 existed ONLY in the standalone
repo and was never in the playable line.

Ported the town system onto current main — deliberately porting only the NEW
systems, never the branch's older world files, so the photoreal grass, real
mountains, volumetric sky and Kern work here all stay intact:
- src/town/ (bootstrap_town, town_kit, town_building, town_props, npc_actor,
  npc_visual, npc_interactor) + src/ui/dialogue_ui.gd
- wiring hand-applied to the NEWER versions of the shared files: 7 dialogue/
  interaction signals on EventBus, `interact` (E / pad A) in InputSetup, a Town
  node in main.tscn, and _town.build() + _setup_dialogue() in main.gd
- three town camera angles in the screenshot harness

Integration fix: the 2.8M-blade meadow grew waist-high straight through the
square. grass_field.gdshader now takes Bootstrap's footprint and thins blades
stochastically (no hard ring) while cropping survivors short, so town reads as
trodden ground with the stone path and market stalls visible.

Verified: imports clean, boots clean, 13 buildings / 13 villagers / 38 windows /
8 lamps built in 252 ms, 32 FPS.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…t repo

Second milestone that existed only in the standalone repo. Ported the new
systems onto current main (never the branch's older world files):
- src/items/ (item_pickup, item_style), src/ui/inventory_screen.gd,
  src/world/meadow_forage.gd
- GameState gains item_count/has_item/remove_item. These are pure reads/writes
  over the existing id->count dict, so the save shape is unchanged and
  SAVE_VERSION is deliberately NOT bumped (iron rule 5).
- `inventory` (I / pad Back) in InputSetup; _setup_pack() in main.gd builds the
  pack screen and the forage after landmarks, since curios cluster on them.

Verified: imports clean; boot reports 13 villagers, 140 forage spots from 18
forageable item types, pack online.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The clouds lane's raymarched cumulus deck reported "online" but drew nothing;
only the thin cirrus veil was ever visible. Three compounding bugs, each found
by rendering a diagnostic (raw opacity / forced density) rather than reading:

1. COVERAGE NEVER REACHED THE NOISE. `local_cover` mapped so the carve
   threshold (1 - local_cover) sat near 0.69, but the shape field averages
   ~0.43 — the ridged-fBm term pulls the mean well below fBm's 0.5. Density
   was therefore ~0 everywhere except on very long horizon-grazing rays.
   Remapped so the threshold lands inside the shape distribution, making
   `cloud_coverage` behave like a real sky-fraction control.
2. THE HEIGHT PROFILE WAS FOLDED IN TWICE. `remap(shape * profile, ...)` put
   the profile inside the coverage threshold and then multiplied by it again,
   pushing nearly every sample under the cutoff. Threshold now applies to the
   shape noise alone, profile after.
3. THE DECK WAS LIT ~12x TOO DARK. Henyey-Greenstein keeps its 1/(4*pi)
   normalisation, so scattered light integrated to a dim grey veil that read as
   haze. Undone. The sun-ward light march also over-attenuated (640 m probe at
   the old coefficient drove transmittance to ~0, leaving clouds lit by blue
   ambient only) — retuned so cores shade without going black.

Also raised the primary extinction so a normal vertical crossing of the ~1.2 km
deck integrates opaque, and BASE_COVERAGE 0.48 -> 0.60 so ordinary days carry
visible cumulus instead of the weather sim rolling near-clear.

Verified on real renders: scattered sunlit cumulus across the horizon with
cirrus above. 32 FPS unchanged. Two sky-facing capture angles now exist so this
can never silently regress again — every previous angle pointed at the ground.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…er poke through

Two real quality fixes to the imported-body path (still opt-in behind
`--kern-base`; see the honest assessment below):

1. STOP RIGID-MOUNTING THE GARMENTS. Mounting them to bone attachments with
   `skin = null` was a workaround for the dual-skeleton depth bug — but it
   stops them deforming, so the cloak rendered as a flat slab and the sleeves
   as boards. `strip_covered_geometry` now deletes the enclosed body geometry
   that caused that bug, so the contested surface no longer exists and the
   garments can stay skinned to the skeleton that authored them (which the
   animation already drives). The cloak drapes properly again.
2. STRIP THE SHOULDER CAPS. The covered-zone list missed the shoulder/upper
   chest, so the bare imported body poked through the tunic yoke in-game.
   Added a tight-radius shoulder zone (the T-pose puts the hands far out along
   X, so it cannot reach them). 12918 -> 16166 tris stripped.

From the gameplay camera the imported Kern now reads well: correct silhouette,
draping cloak, visible scarf, real hands and anatomy.

STILL GATED, deliberately: in close-up the procedural HAIR is built around the
procedural skull and does not fit the imported head, leaving a patchy/balding
crown, and the mouth reads as a dark gash. Shipping it by default today would
trade a better body for a worse face. Fitting the hair to the imported skull is
the remaining task before `enabled()` can just return true.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… (Mac)

Danny is moving to a Mac for future sessions. Verified portability and closed
the gaps that would have bitten there:

- Root CLAUDE.md (there was none — only gradientfall/CLAUDE.md, which a session
  opening the repo root would not read). It names the canonical remote/branch,
  warns off the standalone `danieltalbert/gradientfall` repo and the frozen
  Codex snapshots, and documents the run/verify commands.
- `-- --grass=<0.05..1.0>` scales every blade carpet (5.4M is tuned for a
  high-end desktop GPU per GDD §10 and would crawl on a laptop).
- `-- --clouds=<0.2..1.0>` scales the cloud raymarch; PRIMARY_STEPS became a
  uniform so quality is runtime-settable. The deck is the scene's priciest
  element now that it actually renders.

Portability audit: all asset paths are `res://` or relative (ContentDB uses
globalize_path + a relative root), kern.blend/kern_base.glb and every .uid are
committed, and .gitignore only excludes the regenerable .godot/ cache. Nothing
is Windows-specific — only the Godot binary differs per platform.

HONEST PERF NOTE: this machine now reports ~32 FPS and NEITHER flag moves it —
`--no-grass` alone is also ~32, where it was 165 before the town + cloud fix
landed. So the dominant cost is something else that arrived with those changes
and still needs a real profile (town lamps are shadow-disabled, so not the
obvious suspect). Flagged as the next perf task rather than guessed at.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…g (proper fix)

CAMERA (Danny's report: "when I start the game I'm in the damn head").
Measured it rather than guessed: the SpringArm3D was fully extended
(spring=5.00, hit=5.00) yet the camera sat 1.65 m from Kern — exactly the rig
origin. Cause: `_apply_shake()` ran `_camera.position = Vector3.ZERO` EVERY
frame, not just while shaking. SpringArm3D positions its children itself (that
is what puts the camera `spring_length` behind Kern), so writing the camera's
position fought the arm and won, snapping the view back into his head. Arrived
with Combat v1's trauma shake and has been broken in normal play since.
Shake now uses Camera3D's h_offset/v_offset, which exist for exactly this and
leave the arm's transform alone. Verified: camera distance 1.65 m -> 5.57 m.

TERRAIN WINDING (the proper fix for the earlier "gray hollow ground").
The meadow's triangles were wound [a,c,b, b,c,d] — backwards, so the ground was
back-face culled and we were seeing the sky dome through it. That had been
papered over with `cull_disabled` on toon_soft.gdshader. Wound correctly now
([a,b,c, b,d,c]), so the hack is removed and normal back-face culling is back
on. create_trimesh_shape() is built from this same mesh, so the collision
surface is no longer inside-out either.

Verified: imports clean, ground renders solid warm earth with culling ENABLED,
town and clouds intact.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@danieltalbert
danieltalbert marked this pull request as ready for review July 28, 2026 06:44
@danieltalbert
danieltalbert merged commit 37fdadd into main Jul 28, 2026
1 check passed
@danieltalbert
danieltalbert deleted the agent/sync-live-gradientfall-2026-07-27 branch July 28, 2026 06:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants