062026 1
Summary
A long non-coding ideaguying session that designed a brand-new side project — a build-heavy, active-aim action roguelite ("062026", a temporary date-name) — meant to be worked on alongside Mini Looper in the gaps while the agent runs Mini Looper tasks. The arc: a 10-idea brainstorm → picking an RoR-like → designing two example classes (Swordsman, Archer) end-to-end → inventing the "Linked Sockets" progression menu → creating the project folder + a design/unit-creation doc. No game code was written; the only artifacts are E:/a327ex/062026/design.md and memory files.
Session framing & 10-game brainstorm:
- Read
a327ex-site/logs/gamedev-progress-assessment.md(the 2026-05-31 discipline diagnosis) and the Mini Looper ideaguying log to absorb the current working style (ideaguy thoroughly before coding; focus on verbs/entities/objectives; deterministic drafting over gambling; the fun-gate). - User constraints: 1-month finishable, build-heavy, simple to learn, low randomness/gambling.
- Presented 10 distinct ideas spanning the verb space: (1) Tower Defense, (2) open-field auto-battler + merge, (3) Survivors-like, (4) Into-the-Breach tactics, (5) wand/spell crafter, (6) loadout/counter puzzle, (7) grid-inventory packing, (8) automation/wire-the-machine, (9) formation fleet shooter, (10) active-cast hero. Each with core verb / entities / objective / build / feasibility, plus an editorial triage (safest-ship vs most-novel).
Chose #10 (active-cast hero, RoR-like) + the randomness reframe:
- User wants RoR's feel (character + fixed abilities + stacking upgrades) but less run-randomness and more authorship.
- Reframe: RoR fuses build and variety into the same random items; decouple them — author the build, relocate "surprise" to a different knob. Two axes: how you author (tree / menu / shop / craft) and where surprise lives (threat / seed / menu-subset / mutator / route). Surfaced the solved-game tension (full authorship + zero variance = solved). Editorial pick: deterministic menu/tree + per-run mutator + single-roll seed.
- User deferred the surprise knob as the least-important, most-swappable decision.
Swordsman — first example unit (rolled at random via shuf):
- Grounded in SNKRX source (
SNKRX/player.lua,main.lua): crowd-scaling cleave dealingdmg + 15%·dmg per enemy hitto all in a radius-96 area, 3s cooldown, x2 at level 3. - Kit locked: Passive Outnumbered (crowd = +damage AND less damage taken when surrounded), Primary Cleave (wide crowd-scaling arc), Secondary Cross Guard, Mobility Lunge (dash + path damage), Ultimate Bladestorm (multi-hit spin).
- Skeleton forks (AskUserQuestion): control = active-aim (RoR/Hades), kit size = 4 actives, build-lines = soft full menu (opportunity cost, no hard locks).
Cross Guard secondary (the meaty iteration):
- Explored 5 secondary directions (Hook & Reel, War Banner, Skullcrusher, Glaive Throw, Guard Stance), split into "amplify the crowd identity" vs "cover the cleave's blind spots".
- User chose Guard Stance → Cross Guard: hold to block (omnidirectional), each blocked hit = +1 stack, release = an N-hit Flurry. Solves defense + single-target (multi-hit on one target), and births the hit-hard vs hit-often build dichotomy (Cleave big-hits vs Cross-Guard/Bladestorm small-hits; per-damage vs per-hit upgrades; a self-feeding Flurry→Bladestorm cooldown engine).
- Cross Guard forks (AskUserQuestion): guard limit = stack cap only; release scaling = its own lane (not crowd-scaled); defense = keep both passive + guard. I flagged that stack-cap + double-defense compound toward turtling; zero-cost mitigation = low cap + stacks only from being hit (a tuning note, not a redesign).
Level-up menu form → 10 unconventional mechanics:
- Surveyed canonical progression-menu forms (PoE tree, Hades Mirror, offer/draft, Brotato grid, RoR icon-bar, slot board); key point: deterministic full-catalogue choice rules out random-offer menus, so the real problem is presenting a full, growing, structured catalogue.
- Offered 4 forms with ASCII-mockup previews (columns/pseudo-tree, skill tree, slot board, flat grid) via AskUserQuestion. User dismissed and instead asked for 10 mechanics borrowed from genres that do not normally do level-up menus: Linked Sockets, Circuit Routing, Balance Scale, Alchemy Fusion, Constellation Sets, Worker Placement, Subtractive Sculpting, Overclock/Heat, Path-Drawing, Escalating Market.
- User chose Linked Sockets (simplest, easiest to change later).
Linked Sockets cost model:
- User's fork: flat-base + escalating-per-ability cost vs intrinsic per-gem cost. I argued they push opposite philosophies — escalating-per-ability taxes specialization (fights the committed-build identity, asymmetrically punishes single-ability builds), intrinsic cost is specialization-friendly. Recommended intrinsic cost expressed as socket cost (most 1, keystones 2-3) + per-ability socket caps (cap rather than tax), no separate currency.
- User chose Option 2 (intrinsic).
Swordsman gems:
- 5 hubs (Outnumbered / Cleave / Cross Guard / Lunge / Bladestorm), 5 sockets each, ~32 gems. Accepted the "no general gems, every gem attaches to one ability" constraint (the passive hub partially recovers it).
- 4 archetypes: Heavy (big hits), Flurry (small hits), Bulwark (defense), Maelstrom (crowd). Notation: stackable, keystone, socket cost. Full gem list + archetype socket-plans; anti-synergy = free lane separation; socket math (~12-15 gems vs 25 sockets) forces commitment to 2-3 abilities.
Archer — second example unit (projectile contrast):
- Grounded in source: fully-piercing arrow (
pierce = 1000), 2s cadence, ricochets off walls at level 3 ("Bounce Shot"). Framed as the inverse of the Swordsman (linear vs radial crowd-scaling; fragile/kiting vs tanky; gap-maker vs gap-closer). - Kit locked: Passive Through-Line (arrows pierce and gain power per enemy pierced), Primary Aimed Shot (plain piercing arrow, no draw — user removed the chargeable draw), Secondary Volley (fan of arrows), Mobility Tumble (evasive roll), Ultimate Barrage (long wide piercing barrage — user rejected the single-line "Railshot").
- User directive: keep the Archer mono-weapon (all arrows) so its gems focus purely on arrow upgrades; other ranged classes will mix carriers.
Archer archetypes:
- I proposed 4 kinetic lanes + a "keep it purely kinetic, no status/DoT — reserve affliction for a Voider class" boundary. User added Homing (5th) and refined Ricochet to wall-based bounce + wall-split (flood the arena) with a single-strong-bounce option.
- Final taxonomy: four delivery lanes answering "how does one arrow hit many?" — Penetrator (through them), Volley (many of them), Ricochet (off the walls), Homing (seeking them) — plus Harrier (control overlay). They combine; each runs a few-vs-many dial. Flagged: Ricochet needs an arena with walls; Homing is the anti-aim lane (needs a balancing cost).
Archer gems + per-ability/global resolution:
- Resolved the flagged question: gems affect their own ability EXCEPT the Through-Line passive hub, which holds global "arrow DNA" applying to all arrows (so global homing/ricochet keystones cost 3 and live there; cheap single-ability dabble versions live in the emitter hubs). Creates a cheap-narrow vs expensive-broad choice.
- ~34 gems across 5 hubs; archetype socket-plans; marquee X+Y combos: Homing+Penetrator = a single screen-clearing super-arrow (Singularity Arrow), Volley+Ricochet = split-flood (Carpet Bomb), Penetrator+Ricochet = banking sniper.
The Carrier Axis (the session's key durable insight):
- User observed the Archer has much more archetype interplay than the Swordsman because it is arrow-focused. Synthesized into a design law: single-carrier units (one delivery method) have archetypes that blend → high interplay → want global gems; multi-carrier units (Swordsman switches AoE cleave / single-target flurry) have modal archetypes → want per-ability gems. "How many carriers" and "global vs per-ability gems" are the same decision — make it consciously at the start of each unit; mix blenders and switchers across the roster.
Naming (unresolved) + project creation:
- Proposed names via AskUserQuestion (Facets / Inlay / Keystone / Loadout) — user dismissed. Gave a ~70-name list across themes (gem/socket, prism/light, lattice/weave, forge, keystone, rune, class, combat, stylized SNKRX-style coinages, compounds). User rejected them and picked a temporary date-name 062026.
- Created
E:/a327ex/062026/+design.md: game description, the Linked Sockets system, the deferred surprise knob, design principles (incl. the Carrier Axis), the 6-step unit-creation process (pick from SNKRX → identity → carriers → kit → archetypes favoring interplay → gems >5/ability), both worked units with full gems, and an open-questions section that keeps the honest gate visible (grey-box one class to fun-test the loop before scaling to 55). A banner notes it is a side project, not a second main project. - Wrote
project_062026.mdmemory + aMEMORY.mdindex pointer so future sessions land on the doc.
Method notes / process established:
- Per-unit flow: abilities first (iterate to a lock) → then gems. Numbers/effects are placeholders for implementation ("only an exercise").
- Heavy use of AskUserQuestion for skeleton forks; SNKRX source grounding before designing each unit; editorial picks plus surfaced tensions throughout. The folder
062026/is not under version control (E:/a327ex is not a git repo), sodesign.mdis local-only for now.
This is a general ideaguying session. Read Gamedev Progress Assessment and the following summaries for Mini Looper logs to get acquainted with the general way I want to work now. I'd like to work on another game while we work on Mini Looper, as I'm often waiting for the agent to do work so having 2 games going concurrently feels more productive. What I'd like to ideaguy is ideas for games that I could feasibly finish in 1 month. They have to be build-heavy, they have to be simple to learn to play, they should not rely too much on randomness/gambling as a fundamental part of the gameplay. I'm not going to be more specific than this just to see what ideas you come up with initially, try to come up with 10 different gameplay ideas. Try to focus on the core verbs that the player is doing, what entities exist and they do/have done to them, what the goal of the game is concretely, and so on, be very clear about all this, focus more on this clearness regarding gameplay entities/verbs/objectives than anything else. The theme of the game is irrelevant to me. Do this for 10 games and present me the results of your initial brainstorming.
I'll start by getting acquainted with the materials you mentioned. Let me find them.
Glob (/GamedevProgress*)
No files found
Glob (/[Pp]rogress[Aa]ssessment*)
a327ex-site\logs\gamedev-progress-assessment.md
Glob (/[Gg]amedev)
anchor.blot.im\notes\Writing and Gamedev.txt
a327ex-site\notes\writing-and-gamedev.md
a327ex-site\logs\gamedev-progress-assessment.md
Grep (Mini Looper)
Found 9 files
mini-looper\main.lua
a327ex-site\logs\mini-looper-ideaguying.md
a327ex-site\logs\mini-looper-buildings-and-resources.md
a327ex-site\logs\mini-looper-ramming-endgame-build.md
a327ex-site\logs\mini-looper-movement.md
a327ex-site\logs\mini-looper-attacks-and-enemies.md
a327ex-site\logs\gamedev-progress-assessment.md
a327ex-site\logs\mini-looper-road-and-editor.md
a327ex-site\logs\invoker-template-usage-test.md
Found them. Let me read the Gamedev Progress Assessment and the Mini Looper logs.
Read (E:\a327ex\a327ex-site\logs\gamedev-progress-assessment.md)
The top summary gives me the core diagnosis. I don't need the full Tyroller transcript — let me read the Mini Looper logs to understand the current working style. Starting with the ideaguying log since it's most relevant to this session.
Read (E:\a327ex\a327ex-site\logs\mini-looper-ideaguying.md)
I've absorbed the working context. Quick read on the "way you want to work now," so you know what I'm optimizing against:
- Build-heavy = beginning + end + constraint. The appeal is assembling a synergistic combination of mechanical pieces that compounds into a power fantasy, then testing it against pressure.
- Determinism over gambling. You distinguish drafting (known catalog, can't brick, no reroll) from gambling (unknown pool, shuffle/draw variance, reroll). So for every idea below, the build is chosen from transparent options, not rolled for. Some incidental randomness (enemy spawns) is fine; build-acquisition luck is not.
- Simple to learn = one clear primary verb.
- 1-month feasible = reuse the snkrx toolkit (auto-firing carriers, UI panels/slots/cards, effect system, the collider + marching-enemy code) and keep content small.
I deliberately spread these across the verb space — placement, drafting, active control, turn-based tactics, automation — rather than giving you ten auto-battler reskins. Each is tagged with a "closest-to" so you can place it and a feasibility read. Here's the initial brainstorm.
1. Tower Defense — place + upgrade towers on a path
- Verb: Between waves, place towers on tiles beside a fixed path and upgrade existing towers down a branching tree. During the wave, watch.
- Entities: A fixed path; enemies walking it spawn→core (HP, speed, armor type); towers (range circle, fire rate, damage type via a carrier); upgrades (branching, e.g. frost tower → "deep freeze" or "shatter aura"). Enemies take damage from towers in range; towers are bought/upgraded with kill currency.
- Objective: Stop N waves. Lose if M enemies reach the core (life counter).
- Build: Tower selection + placement (coverage/overlap) + which upgrade branch each takes. Synergy = type combos along the path (slow → high-damage window; armor-strip → DPS). Fully deterministic shop + trees.
- Fit: Closest to Bloons TD / Kingdom Rush. The simplest possible build-heavy genre — instantly legible. Feasibility: very high (reuses carriers, UI, marching enemies).
2. Open-field auto-battler + merge — buy, drag, merge, position units
- Verb: Between rounds, buy units to a bench, drag them onto a 2D arena, merge three identical units into a tier-up, and position them. Start the round and watch them auto-fight.
- Entities: Units (class tag, range, attack carrier, tier) on a free field; a bench; a shop offering a fully-visible catalog (not random rolls); enemies that march in. Units deal/take damage, get merged (3→1 higher tier), get repositioned.
- Objective: Survive N rounds of escalating waves. Lose if the field is overrun / a core falls.
- Build: Roster composition + class synergies (3 casters → chain-lightning bonus) + spatial positioning (frontline tank / backline range) + merge tiers. Transparent shop with earned gold, no reroll.
- Fit: SNKRX × TFT minus the RNG shop — your proven waters. The merge + free positioning verbs distinguish it from Mini Looper's on-rails train. Feasibility: very high.
3. Survivors-like — move to dodge, auto-attack, pick upgrades
- Verb: Move a single character (WASD); weapons auto-fire at nearest enemies. On level-up, choose an upgrade. Live skill = positioning/kiting to dodge and herd enemies into your fire.
- Entities: Your character (HP, equipped auto-firing weapons); enemies swarming toward you (HP, contact damage); XP pickups; upgrades (new weapons, evolutions, passives). Enemies take auto-fire / deal contact damage; you collect XP and select upgrades.
- Objective: Survive X minutes (or kill an end boss). Lose at 0 HP.
- Build: Weapon + passive combination and evolutions (whip + crit passive → evolved whip). Determinism fix: replace random level-up offers with a free choice from the full upgrade list (or fixed per-weapon sequences) — no offer-gambling/reroll.
- Fit: Vampire Survivors / Brotato with deterministic upgrade choice. Feasibility: very high (carriers do auto-fire directly).
4. Into-the-Breach tactics — move + attack on a grid, full information
- Verb: Each turn, move units on a small grid and choose one attack each. Enemy attacks are telegraphed a turn ahead, so you reposition/push enemies to neutralize them with full info. End turn, watch it resolve.
- Entities: A small grid; your units (move range + one weapon that damages and/or pushes); enemies that show their next-attack target tile; objective tiles (buildings) you must keep alive. Enemies get pushed/damaged/blocked; buildings take hits if you fail.
- Objective: Survive K turns per mission keeping ≥1 objective alive; clear a campaign of missions.
- Build: Squad = which units + weapons, drafted between missions from a known pool. Synergy is mechanical (one unit pushes an enemy into another's hazard / off a ledge / into a teammate's line).
- Fit: Into the Breach — the purest fit for your no-gambling constraint (full-information, zero RNG). Feasibility: medium (grid + telegraph AI is bespoke; but turn-based = no real-time physics, and small grids keep scope tight).
5. Wand / spell crafter — assemble an ordered spell, then aim it
- Verb: In a build screen, assemble a spell by slotting components in an order (a wand). In combat, aim and fire the wand — aiming + positioning are the live skill.
- Entities: Components (known catalog of projectile modifiers: trigger, multicast, fork, bounce, pierce, homing, element, detonate); the wand (ordered slots); projectiles shaped by the component order; enemies approaching. Components are arranged; projectiles aimed; enemies damaged.
- Objective: Clear each wave / a boss. Lose if overrun.
- Build: The wand = combination and order of components (multicast→fork→bounce wipes a screen). Components drafted from the known catalog between fights. Your spell is fully authored — the only randomness is enemy movement (patternable).
- Fit: Noita's wand-building minus Noita's chaos. Feasibility: medium (projectiles reuse the carrier; the component-chaining resolver is new — start with ~8 components).
6. Loadout / counter puzzle — build to beat a revealed enemy comp
- Verb: Before each encounter you see the enemy composition in full, then draft a loadout to counter it. The battle then auto-resolves (or runs as light auto-combat) and you watch whether your build wins.
- Entities: Enemy comps (fixed, fully visible — "3 armored, 1 flyer, 1 healer"); your catalog of counters (clear roles: anti-armor, anti-air, burst, sustain); the battle that resolves the matchup. You assemble a loadout; the battle damages both sides to a result.
- Objective: Beat each encounter in a ladder/campaign; a loss costs a life; clear the ladder to win.
- Build: The per-encounter loadout chosen against known info — build-as-puzzle. Full-info + deterministic resolution = zero gambling; the challenge is reading the comp and constructing the answer.
- Fit: The "solve the matchup" core of auto-chess, but enemy revealed and no RNG — a puzzle, not a gamble. Feasibility: medium-high (auto-resolve with simple rules is cheap).
7. Grid-inventory packing — pack items into a grid for adjacency synergies
- Verb: Place and rotate items inside a spatial inventory grid; adjacency + orientation create bonuses; then auto-combat uses the result. Iterate the packing between fights.
- Entities: A grid (your "backpack"); items (each a shape occupying cells, with adjacency rules: "+damage next to a gem," "arrows feed an adjacent bow"); the auto-combat reading the packed grid. Items placed/rotated/removed; adjacency bonuses computed; combat damages both sides.
- Objective: Survive a run of encounters. Lose on death.
- Build: The packed grid — same items score differently by placement. You choose items from a known offering; the packing is a deterministic spatial skill (depth is spatial, not luck).
- Fit: Backpack Hero. Feasibility: medium (grid + shape-packing + adjacency + a simple combat resolver; UI slots help).
8. Automation / wire-the-machine defense — configure a self-running system
- Verb: On a grid, place and wire components (emitters, splitters, amplifiers, redirectors) into a system that processes a flow, then run it to auto-clear a wave. Reconfigure the topology between waves.
- Entities: Components (each transforms or routes a beam/projectile/resource); the wiring/topology; enemies the running system attacks. Components placed/connected; flow propagates through the topology; enemies damaged by the output.
- Objective: Survive waves / hit a throughput target. Lose if overrun.
- Build: The machine's layout — pure topology, fully deterministic, no RNG at all. Synergy = how components feed each other (splitter → three amplifiers).
- Fit: A single-screen factory / "Opus Magnum as defense." Feasibility: medium — but a caution: automation games skew cerebral and slow-to-first-fun, and "build a system" is the closest of these ten to your B-failure-mode (it rewards engineering for its own sake). If you pick it, the grey-box has to prove the wiring itself is fun fast, or it quietly becomes infra-cosplay.
9. Formation fleet shooter — steer a formation of auto-firing units
- Verb: Steer a whole formation of auto-firing units in real time (the group moves as one body; you control its position and maybe shape/facing); units auto-fire; you reposition to aim coverage and dodge. Compose the fleet between runs.
- Entities: Your fleet (units, each auto-firing a carrier, in a formation you set); enemies (waves/patterns); the formation shape. Units fire; the fleet is steered as a body; enemies and fleet trade damage.
- Objective: Survive waves / reach the end of a gauntlet. Lose if the fleet (or flagship) is destroyed.
- Build: Fleet composition + formation shape + unit synergies (front line vs spread). Compose from a known catalog between runs; in-run is pure steering skill, no RNG.
- Fit: A build-heavy shmup / "the SNKRX snake as a free-form fleet." Distinct from #2 (real-time control) and #3 (you pilot a group whose shape matters). Feasibility: medium-high (reuses carriers; new piece is group-movement).
10. Active-cast hero — pilot a hero, time a kit of abilities
- Verb: Pilot one hero in real time — move, dash, and activate a small kit of cooldown abilities at the right moments. Skill = positioning + cast timing/sequence. Between fights, choose upgrades that reshape the kit.
- Entities: Your hero (HP, ~4 abilities each with a cooldown + a carrier effect); enemies (HP, attacks to dodge); boons/upgrades (modify an ability: "dash leaves a fire trail," "bolt forks"). You time casts; enemies are damaged/dodged; abilities are reshaped by chosen boons.
- Objective: Clear a sequence of rooms/bosses. Lose on death.
- Build: The kit + stacked boons, and the combos they enable (a boon that roots + an ability that detonates rooted targets). Determinism fix: boons offered as a free choice from the known pool, not random drops.
- Fit: Hades' boon-stacking with deterministic choice. Feasibility: high (carriers handle ability effects; new piece is the cooldown/boon system).
Editorial triage, since a flat list of ten isn't a decision:
- Safest 1-month ships (max toolkit reuse, proven genres): #1 Tower Defense, #2 Open-field auto-battler+merge, #3 Survivors. You could have a grey-box of any of these fun-testable inside a week.
- Most novel-for-you (a real second search direction, not a SNKRX echo): #4 Into-the-Breach tactics, #5 Wand crafter, #7 Grid-packing. These teach you a different verb than everything you've built this year — which is arguably the point of running a second game at all.
- Purest answer to your no-randomness constraint: #4 and #8 (both fully deterministic, full-information).
One honest second-captain note, briefly and object-level: a second concurrent game is only not a relapse if it reuses the existing toolkit as-is and goes straight through the fun-gate. The risk isn't having a second idea — it's the second game becoming a new-systems playground (which is exactly why I flagged #8 hardest, and why #4/#5/#7 carry the most "new core logic" cost). Your own constraints — 1 month, simple, build-heavy, reuse — are the guardrail here; keep them and this is fine.
Want me to go deeper on a few of these — flesh out the build/synergy layer, the pressure curve, and the thinnest grey-box slice that would fun-test each? Tell me which ones land and I'll develop them.
I'm really feeling something like 10. Just something simple like RoR, you have a character, it has fixed abilities, you have upgrades on top. But let's change things so there's less randomness to a run. In RoR you're mostly stacking random items you get over the run, what are some options we have for a game like that where we're more in charge of how progress happens but there's still some surprises happening every time?
Good — #10 it is. Let me reframe the actual problem first, because it points straight at the answer.
The thing to see: RoR fuses two jobs into one object
In RoR the random items are doing two jobs at once — they're what makes you strong (the build) and what makes each run different (the variety). That's why it feels like pulling the randomness would pull the freshness with it. It won't, if you decouple those two jobs: let the player author the build directly, and move the dice onto a different knob.
The randomness doesn't disappear — it relocates, from "what items you get" to "what you face / what's on the menu / what the rules are this run." You stay in charge of the build; the surprise comes from the context the build has to answer.
And one structural reason "some surprise" has to stay (your word was "some," not "none" — correctly): full authorship with zero variance solves itself. If you can build whatever you want against an identical run every time, players find the one optimal build and repeat it, and the level-up screen stops being a decision. So the surprise isn't flavor — it's the thing that keeps your authored build a live choice. You're not going deterministic; you're moving the dice to where they create problems to solve instead of prizes you're handed.
There are two separate axes here. Picking your game = picking one from each.
Axis 1 — how you author the build (the acquisition verb)
All of these kill acquisition-RNG; they differ in flavor and how much economy they add:
- Talent tree — earn a point per level, spend it where you choose on a fully-visible tree. Max authorship, simplest to read. (PoE-lite, class talents.)
- Level-up menu — on level-up, pick any one upgrade from your character's known list. No offer of 3, no reroll — the whole menu is always there. Closest to RoR's cadence, minus the luck.
- Shop / forge — earn currency, buy exactly the upgrades you want (or stack ones you have) from a known catalog. Adds an economy layer (prioritization under scarcity).
- Craft from parts — collect generic materials, craft specific upgrades via known recipes. You decide what to make.
For a simple-to-learn RoR-like I'd lean tree or menu — shop/craft add a second system to build and learn.
Keep two RoR mechanics — they aren't the random part:
- Stacking. Investing repeatedly into the same upgrade to intensify it (each point = +more) is a great power-fantasy engine and is fully deterministic. Keep it.
- The clock (optional). Time-as-difficulty creates a loot-vs-pressure tension with zero item-randomness. Keep it if you want stakes.
Axis 2 — where the surprise lives (the meat of your question)
Five clean places to put "some surprise," each leaving the player fully in charge of the build. Listed roughly cheapest→priciest to build:
Surprise in the threat. Build catalog is fully authored; each run the enemy / elite / boss mix and order varies. You're solving "what does this run's threat profile want from my build." Nearly free to build (you vary spawns), but on its own it's the weakest freshness — the build space doesn't change, only the target.
Surprise in the seed. Exactly one roll at the start: a random starting anchor (a keystone item, a weapon, a single mutated ability) that you then build around with full authorship. Minimal dice, maximal fresh direction — "this run I'm handed a lightning core, so I author a chain-lightning build." The most elegant low-randomness option.
Surprise in the menu. You know all ~40 upgrades, but each run only a subset (~15) is available; the rest are greyed out. You still choose deterministically among the 15 — but the subset reshuffles what's buildable, so "no crit line this run → I go burn." This is the Hades-gods model: deterministic choice, rotating option set.
Surprise in the rules. Each run rolls 1–2 mutators — "enemies leave damaging pools," "you can't stand still," "abilities cost HP instead of cooldown," "double enemy speed, double rewards." You author a build to beat that constraint. Highest freshness per unit of transparent randomness, because one rolled rule reframes the entire authored build space — and it's a problem to solve, so the player stays the author of the answer. (Hades' Heat / StS ascensions.)
Surprise in the route. A branching map (StS-style); you choose the path. Node types are known (damage shrine, shop, elite-for-loot, rest), but their arrangement varies, so you decide which known rewards to chase under a time/risk budget. Strong variety, but the priciest — it's a whole map/navigation system on top of the combat.
My editorial pick
For "authored build + fresh runs + low randomness + 1-month + simple":
Authorship = level-up menu or talent tree (Axis 1). Surprise = the rules (mutator) + the seed (Axis 2.4 + 2.2).
Reasoning: the mutator is doing the heavy lifting — it's the cheapest mechanism that both creates freshness and prevents the solved-game collapse, and because it's a constraint rather than a handout, it maximizes the "I'm in charge of progress" feeling. The seed (one roll) gives each run a fresh starting direction so even before the mutator bites, no two runs open the same. Both are trivial to build (a flag-list and a single draw) and need no map system. Threat-variety comes along nearly free as a third layer.
The tension to hold consciously: the more you crank authorship, the harder the surprise mechanism has to work to keep the build a decision. If you ever feel a run is "the same optimal path again," that's the signal your mutator/seed pool is too thin or too weak to bend the build — not that you need to add item-RNG back.
Which of the five surprise-locations feels right to you — the single-roll seed, the rotating menu, or the per-run mutator? Tell me which one(s) resonate and I'll spec a concrete progression loop around it: the exact entities, what a level-up looks like, and the thinnest grey-box that would fun-test whether "author your build vs. a shifting constraint" is actually fun.
Let's pick the surprise later, I think it's the least important of the problems. Let's try to brainstorm the actual level-up menu. For this game, let's say we'll want to have lots of classes, but the ones from SNKRX. So all units from SNKRX will be playable as individual characters, but with their own level-up skill progressions and so on. Pick one at a random and let's try to iterate on its abilities + level-up menu so we have a base of expectations to go from.
Good call — surprise is the cheap, swappable knob; the kit-and-progression is the load-bearing design. Let me ground this in the real SNKRX roster rather than my memory of it, so the unit I pick and its mechanics are accurate. Let me find the source.
Glob (SNKRX/*/.lua)
SNKRX\arena.lua
SNKRX\buy_screen.lua
SNKRX\conf.lua
SNKRX\enemies.lua
SNKRX\engine\datastructures\graph.lua
SNKRX\engine\datastructures\grid.lua
SNKRX\engine\datastructures\string.lua
SNKRX\engine\datastructures\table.lua
SNKRX\engine\external\binser.lua
SNKRX\engine\external\clipper.lua
SNKRX\engine\external\init.lua
SNKRX\engine\external\mlib.lua
SNKRX\engine\external\ripple.lua
SNKRX\engine\game\flashes.lua
SNKRX\engine\game\gameobject.lua
SNKRX\engine\game\group.lua
SNKRX\engine\game\hitfx.lua
SNKRX\engine\game\input.lua
SNKRX\engine\game\object.lua
SNKRX\engine\game\parent.lua
SNKRX\engine\game\physics.lua
SNKRX\engine\game\springs.lua
SNKRX\engine\game\state.lua
SNKRX\engine\game\steering.lua
SNKRX\engine\game\trigger.lua
SNKRX\engine\graphics\animation.lua
SNKRX\engine\graphics\camera.lua
SNKRX\engine\graphics\canvas.lua
SNKRX\engine\graphics\color.lua
SNKRX\engine\graphics\font.lua
... [26 more lines]
Glob (SNKRX/*/.md)
SNKRX\devlog.md
SNKRX\README.md
The roster and mechanics live in player.lua and the class/character tables are probably in shared.lua. Let me pull the actual definitions.
Grep (character_classes\s=\s{)
SNKRX\main.lua:455: character_classes = {
Grep (^\s(character_classes|class_color|characters|character_descriptions|character_names)\s=)
Found 1 file
SNKRX\main.lua
Read (E:\a327ex\SNKRX\main.lua)
380 ['arcanist'] = blue2[0],
381 ['illusionist'] = blue2[0],
382 ['artificer'] = blue2[0],
383 ['witch'] = purple[0],
384 ['silencer'] = blue2[0],
385 ['vulcanist'] = red[0],
386 ['warden'] = yellow[0],
387 ['psychic'] = fg[0],
388 ['miner'] = yellow2[0],
389 ['merchant'] = yellow2[0],
390 ['usurer'] = purple[0],
391 ['gambler'] = yellow2[0],
392 ['thief'] = red[0],
393 }
394
395 character_color_strings = {
396 ['vagrant'] = 'fg',
397 ['swordsman'] = 'yellow',
398 ['wizard'] = 'blue',
399 ['magician'] = 'blue',
400 ['archer'] = 'green',
401 ['scout'] = 'red',
402 ['cleric'] = 'green',
403 ['outlaw'] = 'red',
404 ['blade'] = 'yellow',
405 ['elementor'] = 'blue',
406 ['saboteur'] = 'orange',
407 ['bomber'] = 'orange',
408 ['stormweaver'] = 'blue',
409 ['sage'] = 'purple',
... [310 more lines]
I now have the full roster — 55 units, each with a class set, a base attack, and a signature effect. Before I pick, one important design observation: SNKRX units fall into three buckets — self-contained damage (archer, lich, pyromancer…), summoners (engineer, host, beastmaster…), and pure ally-buffers (squire, chronomancer, stormweaver, priest, fairy, warden…). The ally-buffers have no solo identity — their whole mechanic is boosting other units, which don't exist in a solo RoR character. Those will need the most reinvention, so I'll roll only over the units that already have a self-sufficient offensive identity.
Let me genuinely roll rather than cherry-pick a convenient one — it's a more honest test of the template.
Bash (printf '%s\n' vagrant swordsman wizard magician archer scout outlaw blade elemen...)
swordsman
Rolled swordsman — a melee Warrior whose attack is a cleave (AoE swing, +15% damage per enemy hit, so it scales with how crowded it is). Let me pull its exact implementation so I design from the real mechanic, not a guess.
Grep (swordsman)
22- self:shoot(self:angle_to_object(closest_enemy))
23- end
24- end, nil, nil, 'shoot')
25-
26: elseif self.character == 'swordsman' then
27- self.attack_sensor = Circle(self.x, self.y, 48)
28- self.t:cooldown(3, function() local enemies = self:get_objects_in_shape(self.attack_sensor, main.current.enemies); return enemies and #enemies > 0 end, function()
29- self:attack(96)
30- end, nil, nil, 'attack')
--
1188- self.vagrant_dmg_m = 1 + 0.1*number_of_active_sets
1189- self.vagrant_aspd_m = 1 + 0.1*number_of_active_sets
1190- end
1191-
1192: if self.character == 'swordsman' and self.level == 3 then
1193: self.swordsman_dmg_m = 2
1194- end
1195-
1196- if self.character == 'outlaw' and self.level == 3 then
1197- self.outlaw_aspd_m = 1.5
--
1333- end
1334-
1335- self.buff_def_a = (self.warrior_def_a or 0)
1336- self.buff_aspd_m = (self.chronomancer_aspd_m or 1)*(self.vagrant_aspd_m or 1)*(self.outlaw_aspd_m or 1)*(self.fairy_aspd_m or 1)*(self.psyker_aspd_m or 1)*(self.chronomancy_aspd_m or 1)*(self.awakening_aspd_m or 1)*(self.berserking_aspd_m or 1)*(self.reinforce_aspd_m or 1)*(self.squire_aspd_m or 1)*(self.speed_3_aspd_m or 1)*(self.last_stand_aspd_m or 1)*(self.enchanted_aspd_m or 1)*(self.explorer_aspd_m or 1)*(self.magician_aspd_m or 1)
1337: self.buff_dmg_m = (self.squire_dmg_m or 1)*(self.vagrant_dmg_m or 1)*(self.enchanter_dmg_m or 1)*(self.swordsman_dmg_m or 1)*(self.flagellant_dmg_m or 1)*(self.psyker_dmg_m or 1)*(self.ballista_dmg_m or 1)*(self.awakening_dmg_m or 1)*(self.reinforce_dmg_m or 1)*(self.payback_dmg_m or 1)*(self.immolation_dmg_m or 1)*(self.damage_4_dmg_m or 1)*(self.offensive_stance_dmg_m or 1)*(self.last_stand_dmg_m or 1)*(self.dividends_dmg_m or 1)*(self.explorer_dmg_m or 1)
1338- self.buff_def_m = (self.squire_def_m or 1)*(self.ouroboros_def_m or 1)*(self.unwavering_stance_def_m or 1)*(self.reinforce_def_m or 1)*(self.defensive_stance_def_m or 1)*(self.last_stand_def_m or 1)*(self.unrelenting_stance_def_m or 1)*(self.hardening_def_m or 1)
1339- self.buff_area_size_m = (self.nuker_area_size_m or 1)*(self.magnify_area_size_m or 1)*(self.unleash_area_size_m or 1)*(self.last_stand_area_size_m or 1)
1340- self.buff_area_dmg_m = (self.nuker_area_dmg_m or 1)*(self.amplify_area_dmg_m or 1)*(self.unleash_area_dmg_m or 1)*(self.last_stand_area_dmg_m or 1)
1341- self.buff_mvspd_m = (self.wall_rider_mvspd_m or 1)*(self.centipede_mvspd_m or 1)*(self.squire_mvspd_m or 1)*(self.last_stand_mvspd_m or 1)*(self.haste_mvspd_m or 1)
... [31 more lines]
Rolled swordsman, and it's a good roll for setting expectations — here's its real mechanic from the source (player.lua:26, player.lua:2451):
- Senses enemies within radius 48, then every 3s swings an Area of radius 96, dealing
dmg + 15%·dmg per enemy hitto every enemy in the swing. So the more enemies packed around it, the more each gets hit for. At level 3 it gets a flat ×2 damage spike.
That core — "the tighter the mob packs you, the harder you hit" — is a gift for a solo melee character, because power scales with danger. That's a built-in risk/reward fantasy to hang a kit on. Let me build it out, then extract the reusable template.
Swordsman — "The Cleaver"
I'm strawmanning this as an active-aim hero (you pilot it, RoR/Hades-style), since that's the frame you invoked. Numbers are illustrative/tunable.
The fixed kit (always have these):
- Passive — Outnumbered. Each enemy inside your swing adds +15% to that swing's damage, applied to everyone hit. And while ≥3 enemies are in melee range, you take reduced damage. The crowd is simultaneously your damage source and your armor — so the correct, exciting play (wade in) is also the strong play.
- Primary — Cleave. A wide melee arc in your facing direction, ~0.7s cadence, hits all enemies in the arc. Your bread and butter; positioning + facing decide your damage.
- Mobility — Lunge. Dash in the aim direction, damaging along the path. Gap-closer and escape — repositions you into or out of the mob. ~3s cd.
- Ultimate — Bladestorm. Spin for ~2.5s hitting everything around you each tick, Outnumbered applying per tick. The "I'm surrounded → I delete the screen" payoff — this is where the END power-fantasy gate lives. ~14s cd.
The level-up menu
On level-up (from kills) you pick one upgrade from the full, always-visible pool — no random offer, no reroll (authorship lives here; surprise lives on the knob we deferred). Most upgrades stack (re-pick to deepen, RoR-style); a few keystones are one-time and transform an ability. Organized into axes — each axis is a build-line:
A — Outnumbered (lean into the passive)
- Press the Advantage ⟳ — +per-enemy cleave bonus.
- Bloodbath ⟳ — cleave kills heal you.
- Eye of the Storm ★ — the per-enemy bonus also applies to Lunge and Bladestorm.
B — Geometry (more swing)
- Long Reach ⟳ — +arc radius. · Wide Arc ⟳ — +arc angle, → full 360° at max.
- Follow-Through ★ — cleave pulls hit enemies inward (re-packs the mob → feeds Outnumbered).
C — Tempo (speed & flow)
- Frenzy ⟳ — +swing speed.
- Momentum ★ — a cleave hitting ≥3 enemies refunds Lunge's cooldown (always moving).
D — Warrior (tank the mob)
- Ironhide ⟳ — +defense, scaling with nearby enemies.
- Riposte ★ — getting hit charges your next cleave for bonus damage (rewards facetanking).
- Second Wind ★ — survive a lethal hit + auto-Bladestorm, once per fight.
E — Edge (on-cleave status)
- Rend ⟳ — cleave applies a stacking bleed. · Stagger ⟳ — cleave briefly slows.
- Execute ★ — cleave instantly kills enemies under ~12% HP and refunds its cooldown (snowball clear).
~14 upgrades, ~6 keystones, deep stacks — you get maybe 12–15 picks a run, so you can't take it all; you commit to a line. Three builds that fall out of the same character:
- The Blender — Frenzy ×3 + Momentum + Wide Arc ×2 → a never-stopping 360° spin.
- The Anvil — Ironhide ×3 + Riposte + Press the Advantage ×3 → stand dead-center, facetank, nuke when mobbed.
- The Reaper — Rend ×3 + Execute + Stagger ×2 → bleed-and-execute the crowd.
That's the authored build, fully deterministic — and three distinct identities from one unit is the signal the menu has enough range.
The template this sets (the actual deliverable)
Every one of the 55 units slots into the same shape, which is what makes 55 of them tractable:
- Passive = the unit's SNKRX signature hook (swordsman's crowd-scaling; pyromancer's burn; lich's chaining).
- Primary = its SNKRX base attack, now player-driven.
- Mobility = a class-flavored reposition (warriors lunge, rangers roll, mages blink).
- Ultimate = the signature cranked to 11 (often the SNKRX "effect name").
- Menu = 4–5 axes × ~3 upgrades, mostly stackable + one keystone each.
And the scalability trick: the menu axes come from the unit's SNKRX classes. Warrior → {Outnumbered, Warrior-tank, Tempo}; Ranger → {pierce, range, crit, kite}; Nuker → {area, burst}; Voider → {DoT, debuff}; Conjurer → {minion count, minion buff}. So you author an axis-kit per class once, and every unit = (its signature) + (the axes of its 1–3 classes). The class system you already built is the upgrade vocabulary.
Before I flesh a second unit and prove the template generalizes, three forks define the skeleton and I don't want to guess wrong on them:
AskUserQuestion
Your questions have been answered: "How does the player drive the primary attack?"="Active-aim (RoR/Hades)", "How many active abilities should the fixed kit have?"="4 actives (RoR-complete)", "How do build-lines get enforced so runs feel like committed builds?"="Soft (full menu, opportunity cost)". You can now continue with these answers in mind.
[Request interrupted by user]
Before you continue let me actually iterate on this first one, as there are a few things I don't like. The upgrades are too simple and don't actually feel game-changing enough. There should be more upgrades in general, but many of them should actually change how you play the game. Let's first focus on the abilities themselves.
Passive: this feels good, the more enemies you hit, the more damage you do, keeps the Swordsman identity alive. Primary: great, this is the main attack, it's AoE, decent range, keeps the identity alive. Mobility: classic for a melee character, works. Ultimate: feels good too.
What are your ideas for secondary abilities?
Good — locking the kit before fattening the menu is the right order; the secondary changes what upgrades even make sense.
First, the spine of this decision, because it determines everything: your Cleave is wide, shallow, melee, and crowd-scaling. That gives it three permanent blind spots — single tough targets (the crowd bonus does nothing vs one elite), enemies you can't reach (ranged/fliers/fleers), and incoming burst (Lunge is your only "oh no" button). So a secondary either doubles down on the crowd identity (actively manufacture the mob the passive feeds on) or patches a blind spot (give the cleaver an answer it structurally lacks). Pick that axis and the candidate falls out. Here's the menu across both:
Double-down options (amplify Outnumbered)
1. Hook & Reel — manufacture the crowd.
- Do: Throw a chain at an enemy; yank it + the cluster behind it toward you, packing them into Cleave range.
- Changes play: You stop waiting for enemies to clump and start assembling them. The loop becomes gather → cleave, every fight. This is the option that turns Outnumbered from a situational bonus into the thing you actively author.
- Synergy: Stacks hard with the Follow-Through keystone (cleave also pulls in). Lunge becomes your disengage after the pull.
- Legs (game-changing upgrades): pull all nearby enemies (become a black hole) · pull-and-root · the pull itself cleaves the dragged enemies · reel yourself into a distant pack instead. → a whole "puppeteer" build choreographing the mob.
2. War Banner — build a kill-zone.
- Do: Plant a banner; nearby enemies are drawn to it (taunt) and you're buffed while standing near it.
- Changes play: Combat goes from wandering to territorial — you anchor a spot, enemies funnel in, you hold and cleave. Packs the crowd and gives you a reason to stand your ground.
- Synergy: Banner gathers → Outnumbered spikes; the "near the banner" buff can be the defense the passive already hints at.
- Legs: banner pulses damage · banner roots on contact · two banners (a corridor) · banner detonates when it expires. → a "warlord" zone-control build.
Blind-spot options (cover what Cleave can't)
3. Skullcrusher — answer the elite.
- Do: A wind-up overhead strike: big damage in a tight zone + knockdown. Committed — you're locked during the wind-up.
- Changes play: Adds a high/low rhythm — poke the crowd with Cleave, commit to Skullcrusher on the elite/boss the cleave can't dent. The wind-up vulnerability is the skill tax.
- Synergy: The knockdown keeps a tough target stuck in your crowd; pairs with Execute.
- Legs: impact shockwave (becomes AoE again) · armor-shred · charges up while you cleave · "no wind-up if you're surrounded." → a bruiser/executioner build, the inverse of wide-cleave.
4. Glaive Throw — reach the unreachable.
- Do: Hurl your blade in a spinning arc that cleaves at range and returns to you (boomerang) — hits going out and coming back.
- Changes play: The boldest warp — a pure melee unit gets a ranged tool. You can poke, peel fleers, pull ranged aggro, fight from mid-range. Real tension: stay in the mob, or zone from its edge?
- Synergy: Crowd-scaling applies on both passes; throw into a Hook-packed cluster = double cleave.
- Legs: the blade orbits you instead of returning (a persistent damage aura) · throw 2–3 · ricochets between enemies · drags enemies along its path. → a "glaive/zoner" build that plays at range.
5. Guard Stance — make facetanking a skill.
- Do: Raise your blade to block frontal damage for a window; a well-timed block parries — stuns the attacker and supercharges your next Cleave.
- Changes play: Adds a defensive/timing layer. You deliberately stand in danger to parry, alternating block ↔ cleave. Rewards reading attacks instead of just out-positioning.
- Synergy: This is where Riposte belongs; a parried→empowered cleave into a full mob is your biggest single hit.
- Legs: parry reflects projectiles · perfect-parry → free Bladestorm · 360° guard · parry heals. → a duelist/counter build.
(Flavor wildcard if you want a 6th: Blood Rite — spend your own HP to surge power. It's a steroid, not an attack, so it fits better as a passive-keystone than the secondary slot — but it's the purest expression of "low HP = high power," which your "surrounded = armored" passive is already flirting with.)
My lean: Hook & Reel. It's the one that most changes how you play — it converts your defining passive from "hope they clump" into "I decide where the mob is," and it makes the character's whole hand-verb about choreographing the crowd rather than reacting to it. Skullcrusher is the cleanest pick if you'd rather the secondary cover the elite blind spot than amplify the identity; Glaive is the choice if you want the secondary to genuinely re-shape the character into something with range.
Which axis pulls you — manufacture the crowd (Hook/Banner) or cover a blind spot (Skullcrusher/Glaive/Guard)? Or do you want to mix two of these and trim the kit elsewhere? Once the secondary's locked, I'll do the menu pass you actually want — far more upgrades, and weighted toward the ones that rewrite how the character plays.
I like 5. Let's do Cross Guard: blocks incoming attacks and each attack adds a stack, once you release the button, unleash the stack as multiple consecutive hits to nearby enemies. This solves defense + single target, as if there's only one enemy nearby it will hit him multiple times, also allowing multi-hit builds on an otherwise single hit target. This also opens up this option in the level-up changes later, where can choose to be either a big-hit build, investing in high damage but high cooldown cleave, or a multi-hit build, investing in Cross Guard, Bladestorm lower cooldown + lots of small hits, as well as perhaps changing Cleave or mostly ignoring it.
Cross Guard is a strong pick, and here's why it's strong, beyond what you said: it runs on the same engine as your passive. Outnumbered makes being mobbed your damage source; Cross Guard makes being mobbed your defense-and-counter source — every attacker swinging at you is another stack. So the whole character now has one coherent thesis: the crowd is your fuel. That's rare and clean. And you've correctly spotted that it births the menu's backbone axis (hit-often vs hit-hard). Let me firm up the mechanic, then show how far that axis reaches.
I'll assume the guard is omnidirectional (blocks from all sides) — a frontal-only guard would punish the exact "surrounded" fantasy the character is built on, so it has to soak the whole mob.
Concrete baseline to react to:
- Hold → Guard Stance: incoming hits are reduced (not fully negated), each blocked hit = +1 Brace stack, you move slower while holding.
- Release → Riposte Flurry: unleash N rapid strikes (N = stacks), each auto-targeting the nearest enemy in a radius. One enemy nearby → all N land on it (your single-target/multi-hit answer); a crowd → they spread.
The axis it creates — and it goes deeper than damage pattern:
The two builds don't just hit differently, they live differently:
- Hit-Hard (Cleave/Heavy): few enormous hits. Wants per-damage upgrades — crit, flat multipliers, execute thresholds, +area, slow-but-devastating swings. Guards rarely → plays as a glass cannon, timing big commitments.
- Hit-Often (Cross Guard/Flurry): many small hits. Wants per-hit upgrades — attack speed, +1 strike, and especially on-hit procs (bleed stacks, lifesteal, and cooldown refund per hit). That last one is your "low-cooldown Bladestorm" intuition, mechanized: Flurry lands 10 hits → Bladestorm refunds → more hits → it's a self-feeding engine. Guards constantly → plays as a sustain-tank.
So the same character is a fragile timing-duelist or a churning blender depending on the lane — that's the "upgrades change how you play" payoff you wanted, and the menu basically writes itself once we split it into per-hit vs per-damage clusters.
One honest risk: a block-to-charge button tempts passive play — hold guard, wait, dump. That's the opposite of the aggressive cleaver. The fix is to make guarding a brief, risky soak (you still bleed while holding; stacks cap fast) so it's "eat a burst, dump it" not "turtle." That's fork A below.
Three decisions lock the feel and the axis — I want your call rather than guessing:
AskUserQuestion
Your questions have been answered: "What stops you from just holding Cross Guard forever to bank infinite stacks?"="Just a stack cap", "When you release, do the Flurry hits benefit from the crowd bonus (Outnumbered)?"="No — its own lane", "Where should the character's defense live?"="Both (keep passive defense)". You can now continue with these answers in mind.
Locked. Here's the full kit as you've now defined it:
The Cleaver — complete kit
- Passive · Outnumbered — crowd = more damage and less damage taken when surrounded (you kept both).
- Primary · Cleave — wide crowd-scaling melee arc. The big-hit lane.
- Secondary · Cross Guard — hold to block (all directions, damage reduced); each blocked hit = +1 stack (capped); release = an N-hit Flurry auto-targeting the nearest enemy. Flurry scales on hit-count, not crowd.
- Mobility · Lunge — dash that damages along the path.
- Ultimate · Bladestorm — spin of many small hits. Now explicitly the multi-hit lane's ult.
The two lanes this produces (the menu's skeleton):
- Hit-Hard — Cleave-centric. Wants the crowd (passive damage bonus + per-enemy cleave). Eats per-damage upgrades: crit, multipliers, execute, area.
- Hit-Often — Cross Guard + Bladestorm. Wants to be hit (to charge stacks). Eats per-hit upgrades: attack speed, +1 strike, on-hit procs, and cooldown-refund-per-hit (the self-feeding Flurry→Bladestorm engine).
One clean consequence of your scaling choice (B): since Flurry ignores crowd size, the passive's offensive half only powers the Hit-Hard lane. So a pure multi-hit build leans on the passive's defense + guard instead — which actually sharpens the two identities rather than blurring them. Good.
One honest flag, then I'll drop it: you picked the two simplest options on guard-limit (stack cap only) and defense (keep both) — which is the right call for a cheap prototype, but they compound toward the passive/turtle failure mode I flagged earlier (guarding is free and you're tanky anyway). The zero-cost fix that doesn't add any system: tune the cap LOW (fills in ~1s of being mobbed, so there's no reason to hold longer) and only grant stacks from actually being hit (so you must be in the danger to charge). That keeps "just a stack cap" intact and self-solves the turtling — leave chip/meters on the shelf unless playtest proves you need them. Park it as a tuning note, not a redesign.
That's the kit done. The thing you actually flagged at the start — "the upgrades are too simple, I want many that change how you play" — is the next pass, and now it has real structure to hang on: per-hit vs per-damage clusters, plus keystones that transform abilities (Cleave-that-pulls, Guard-that-reflects-projectiles, Bladestorm-that-moves-with-you, Lunge-that-leaves-a-wake).
Want me to do that menu pass now — a big, lane-aware list weighted toward play-changing keystones rather than +10% stacks — or is there another ability you want to tweak first?
Let's first try to think about the design of the level-up menu in visual terms. Do we want it to be like a skill tree or something else? What are some of the best ways such menus have been done before?
Good instinct to design the form before stuffing it with content — the form decides what the content can even be. And here's the thing that narrows it fast: our earlier choices already eliminated half the famous menus. We went deterministic, full-menu, stackable — which kills every offer-based form (Slay the Spire card rewards, Hades boons, Vampire Survivors level-ups). Those are all built around randomness and scarcity of options — pick 1 of 3 you didn't choose. We're showing the whole catalogue, always. So the real question isn't "tree or not," it's: how do you present a full, growing, structured catalogue legibly? That's a spectrum from flat grid to skill tree, and the only knob that moves you along it is how much structure/gating you impose.
What our form has to do (these are the filters):
- Show the whole catalogue at once (no hidden/random offers).
- Show stacking — "owned ×3," re-pickable, investment visible at a glance.
- Express the lanes (hit-hard / hit-often / warrior / edge) and mark keystones as special.
- Be cheap to author ×55 characters — this one quietly kills the bespoke skill tree.
- Parse fast mid-run — it interrupts real-time action; you shouldn't need to re-read it every level.
How the best games have solved this (assessed through those filters):
- PoE / Diablo — the full spatial tree. The maximal "build is a shape, and you journey toward a keystone" form. Most satisfying for identity. But a hand-laid tree ×55 is a content mountain, and pathing breeds filler "+5%" nodes. Steal the lesson, not the scale: pathing to a keystone makes commitment feel earned.
- Hades — Mirror of Night. A tiny two-column tree of either/or toggles; legible, fast, respeccable, dirt-cheap to author. The cleanest "tree feel" without the cost — the best small-scale template here.
- Hades boons / StS rewards / VS level-ups — the offer. Fast and exciting, but random (cut). What's still worth stealing: thematic grouping (Hades' gods) makes a flat pool feel structured, and a visible growing collection (the StS deck, the VS weapon bar) is satisfying on its own.
- Brotato — stat list + item grid. Flat, deterministic, data-driven, scales via tabs. The cheap floor option — works, but reads like a spreadsheet and shows no structure.
- Risk of Rain 2 — the item bar. Not a choice surface at all — it's the build readout: stacking shown as a growing row of counted icons. Since we're RoR-like, this is exactly how to display "owned ×N" compactly, separate from the picking surface.
- VS slots / FTL power / Backpack Hero — finite slots. Opportunity cost made physical — limited slots you equip and swap. Different math (finite vs infinite stacking) but it makes "commit to a line" tangible and lets you respec.
The read: a full skill tree is the seductive option and also the expensive one — it's the UI version of your build-a-system trap, and ×55 it won't ship. The flat grid ships trivially but feels like a spreadsheet. The sweet spot is in between: columns by axis, each a short vertical track with its keystone gated at the foot (take ~3 in a column to unlock its keystone). That gives you the full catalogue + visible lanes + an earned path to the payoff + stacking counts — all data-driven (a spreadsheet authors it, not 55 hand-laid trees). Pair it with a compact RoR-style owned-icon bar as the persistent readout. One note: the keystone-gating is a soft prerequisite — slightly tighter than "fully open," but it's what makes keystones feel earned rather than just bought. Turn the gating to zero and you have the flat grid; turn it up and you have a tree. Same spectrum, one knob.
Here are the four real forms as rough visual mockups — which should we prototype?
AskUserQuestion
Your questions have been answered: "Which visual form for the level-up menu should we prototype first?"="Let's try to think more broadly and uniquely. Your idea for the finite slots version using Backpack Hero as an example is a great example of creative thinking, because this kind of thing is generally not applied at all to level-up menus in the way we're thinking here. Let's try to think of such mechanics and more but applied to our problem and how they might be useful. Try to think of 10 such mechanics (by such I don't mean *like* Backpack Hero, but in the sense that those mechanics are not applied to level-up upgrade menus like we want).". You can now continue with these answers in mind.
Now that's the more interesting question. The move you're pointing at: stop treating the level-up screen as a list you pick from, and treat it as its own mini-game borrowed from a genre that has nothing to do with leveling — the way Backpack Hero smuggled in inventory-Tetris. The act of upgrading becomes the decision, and it shows your build as a shape or state instead of a checklist.
The lens I'm filtering for, and the shared risk worth naming up front: each of these turns leveling into a little puzzle, and a 30-second puzzle every level murders a real-time game's pace. So the winner has to be fast to operate even if it's deep to plan — and ideally it should show your build at a glance. None of these need randomness; they're all deterministic. Ten, in three families:
Family A — Spatial budget (place limited things in space; the Backpack lineage)
Linked Sockets — from PoE gem-links / gear socketing. Your four abilities are socket-hubs; upgrades are "support gems" you slot into a limited ring of sockets around the ability they modify. Cleave gets 5 sockets, Cross Guard 5, etc. Decision: which modifiers load onto which ability — you can't socket everything, sockets are the budget. Keystone = a gem needing 2 free adjacent sockets. Your build identity is literally which ability you loaded up. Maps 1:1 to our exact kit.
Worker Placement — from Agricola / Lords of Waterdeep. Each level you get a few "effort" tokens; place them on upgrade-stations to claim them. Deep upgrades need several tokens across several levels; a claimed station locks. Decision: spread thin for breadth, or stack tokens to rush one keystone before you can afford it elsewhere.
Route Drawing — from snake / one-line puzzles. Upgrades are nodes; each level you extend one continuous line through them, with a limited total length, and it can't fork (unlike a tree) — crossing itself costs length. Only nodes your line touches are live. Decision: plot the most efficient single route to the keystones you want. Committing to a direction is physical, and it rhymes with the snake/loop motif.
Power Routing — from Zachtronics / FTL's reactor. Upgrades are inert until powered; you route a small, growing power supply through a node network; bottlenecks force you to unpower one thing to feed another (so respec is free and constant). Decision: allocate scarce power, re-route as the run shifts. (The most systems-heavy — mild B-risk.)
Family B — Combinational (upgrades reshape each other)
Alchemy Fusion — from Doodle God / Noita potions. Base upgrades can be fused by a known recipe into a stronger compound (Heavy + Frenzy → "Momentum Cleave"), consuming both. Decision: keep two reliable simple upgrades, or spend tempo to forge a hybrid that only pays off if your build wants it. Stacking becomes fusion tiers; keystones are top-tier alloys.
Constellation Sets — from star maps / Balatro hands. Upgrades are stars; lighting a set that forms a named shape (all-one-lane = a "flush," one-from-each-axis = a "straight") completes a constellation for a big set bonus. Decision: chase a constellation — committing to stars you wouldn't otherwise take — vs grab raw scattered value. Most satisfying to grow, and you already know Balatro's set-scoring cold.
Subtractive Sculpting — from carving / inverse design. Invert the whole thing: you start with every upgrade active at minimum power, and each level you delete some — the power they held flows into whatever survives. The build is defined by what you cut. Decision: what to sacrifice to concentrate. Radically unique "less is more." Risk: hardest to grok, and removing things reads as loss (a juice problem).
Family C — Managed tension / economy (a pressure you ride)
Balance Scale — from equilibrium puzzles / yin-yang. Two pans (say Hit-Hard vs Hit-Often); every upgrade adds weight to one side; tip too far past center and you eat a penalty. Decision: a big pick on one side forces a counterweight — every gain has a cost. Literally embodies our two-lane axis (needs a "commit fully, embrace the tilt" escape valve so it isn't a straitjacket).
Overclock & Heat — from reactor / overclocking sims. Each upgrade adds "heat"; the green zone is safe, but pushing into the red gives big multipliers at a cost (chip damage, sluggish cooldowns) unless you spend picks on cooling. Decision: how hard to ride the redline. Maps directly onto the Cleaver's "the crowd is danger, danger is power" identity — the menu re-tells the combat fantasy.
Escalating Market — from auction games / supply-demand. Kills give currency; every upgrade's price rises each time you buy anything in its lane (demand inflates the lane). Decision: rush a lane early while it's cheap and pay the escalating tax, or diversify to keep all prices low. Self-balancing diversification pressure, zero randomness.
For this character and our constraints, three resonate hardest: Linked Sockets (1:1 with the 4-ability kit, fast, cheap, and "which ability did you build" is the identity), Overclock & Heat (the menu literally re-tells the danger=power fantasy you built the kit around), and Constellation Sets (the most satisfying to grow, and squarely in your Balatro wheelhouse). Route Drawing is the wildcard if this game keeps any loop motif. The two I'd be wariest of prototyping first are Power Routing and Worker Placement — they're the most system to build for the least immediate fun, i.e. the B-trap in menu form.
Which of these (or which family) do you want to push on? I'll take one and actually lay the Cleaver's upgrades into it, so we can see whether the mechanic survives contact with real content.
Let's go with the simplest one and thus the easiest to change later if we feel the need, linked sockets. Details that need to be decided, do all upgrades cost the same and increase in cost in relation to how many upgrades are linked to an ability? Or do upgrades have individual costs themselves?
Before the two options, there's a hidden prior question they both smuggle in: what's the budget — sockets, a currency, or both? Your question assumes a currency exists (something the cost is denominated in). But the simplest possible model — and the one most faithful to why Linked Sockets is cheap — is that the socket itself is the cost. No separate point pool to design or earn: a gem just consumes a socket, and the whole economy is socket scarcity. That's the version that's easiest to build and easiest to rip out later, so I'd anchor there.
Now, your actual fork — and the reason it matters more than it looks: the two cost models push opposite build philosophies.
Option 1 (flat base, cost rises with how many are linked to that ability) is a specialization tax. Stacking five gems on Cross Guard costs 1+2+3+4+5; spreading five gems across five abilities costs 1+1+1+1+1. So it subsidizes generalists and punishes commitment — which is the exact opposite of the identity we built the kit around. The multi-hit build literally is "load up Cross Guard + Bladestorm"; escalating-by-depth cost penalizes that. Worse, it does so unevenly: a one-ability build (Cleave-stacking, the hit-hard lane) eats the tax far harder than a two-ability build (Cross Guard + Bladestorm), so it quietly warps which lanes are viable. It's elegant — one formula, no per-gem tuning, auto-prevents degenerate stacking — but it fights the design.
Option 2 (each gem has an intrinsic cost) is specialization-friendly. Cost tracks power, not position, so you can commit hard to one ability and just pay for what the gems are worth. It preserves "which ability did you build" as the identity. The price is a bit more authoring — you hand-price each gem — but that's one spreadsheet column, trivial ×55.
So: Option 2, and I'd express that intrinsic cost as sockets rather than inventing a currency — most gems cost 1 socket, keystones cost 2–3. That collapses your whole question into one number per gem, keeps the build identity intact, and stays as simple as Option 1.
One more thing, because I suspect the appeal of Option 1 is really a fear of degenerate one-ability stacking: the clean fix for that isn't escalating cost, it's a per-ability socket cap (Cleave has 5 sockets, full stop). Caps bound specialization without taxing it — deep but finite, which is exactly the feel we want. Escalating cost solves the same problem but throws the diversification bias in as an unwanted side effect.
If you genuinely love Option 1's self-balancing elegance and don't want to hand-price gems, there's an inversion that keeps it and reinforces commitment: escalate on breadth, not depth — a "jack-of-all-trades tax" where each new ability you touch raises costs, so going deep on one is cheap and spreading is what's expensive. Same one-formula simplicity, opposite (and on-identity) incentive.
My vote: intrinsic cost priced in sockets, per-ability caps, no separate currency. Want me to assign actual socket-costs and caps to the Cleaver's gem list so we can see if the budget math produces real build choices?
Yea, let's go with your option 2 here. Now try to create some gems, then. The main problem this system has is that we cannot have general gems that apply to the Swordsman generally and not to any individual ability, but I think that's a decent enough cost to have and keeps things simpler, so let's leave it. Assume every ability has 5 slots, so we need more than 5 gems per ability. Try to also design some gems that genuinely change how the character plays, not only stat upgrades, and try to think in terms of archetypes too, like the ones we already mentioned big hits, small hits, defense, etc. In fact think of those archetypes first and then design the gems to cover them across relevant abilities.
Archetypes first, as you said — then I'll hang gems off them. Four lanes, each a distinct fantasy with a "spine" of abilities it lives on:
- HEAVY (big hits) — few enormous blows; per-damage scaling (crit, multipliers, execute). The sledgehammer; delete elites, overkill the rest. Spine: Cleave + a re-tooled Cross Guard/Bladestorm that hit once, hard.
- FLURRY (small hits) — many hits + on-hit procs + attack speed; per-hit scaling. The blender; death by a thousand cuts. Spine: Cross Guard + Bladestorm + Lunge tempo.
- BULWARK (defense) — soak, block, counter, facetank. The immovable wall that punishes. Spine: Cross Guard block + Outnumbered defense + Lunge escapes.
- MAELSTROM (crowd) — gather + AoE; scale with enemy count. The vortex; suck them in, clear the screen. Spine: Outnumbered offense + Cleave geometry + Lunge gather + Bladestorm radius.
One assumption I made: the passive (Outnumbered) is also a 5-socket hub. It's too central to freeze, and — bonus — its gems are the closest thing to "general" Swordsman gems (the crowd engine touches damage, survival, and attack speed), so socketing the passive is the release valve for the no-general-gems cost you accepted. That makes 5 hubs × 5 = 25 sockets. Flag if you'd rather the passive stay fixed.
Notation: ⟳ stackable · ★ keystone · (n) = socket cost · [H/F/B/M] = archetype.
Outnumbered — passive hub
- Bloodlust ⟳ (1) [M] — +per-enemy damage bonus.
- Thick Hide ⟳ (1) [B] — +damage reduction per nearby enemy.
- Bloodhunger (1) [B] — heal a little per enemy your Cleave hits (the mob is your health bar).
- Adrenaline ⟳ (1) [F] — +attack speed while ≥3 enemies near.
- ★ Berserk (2) [H/M] — under 50% HP, the per-enemy bonus doubles (dive deep; low HP = power).
- ★ Event Horizon (3) [M] — nearby enemies are constantly dragged toward you. You're a walking vortex.
Cleave — primary hub
- Whetstone ⟳ (1) [H] — +Cleave damage.
- Wide Arc ⟳ (1) [M] — +arc width & radius (catch more).
- Heavy Swing (1) [H] — big damage, slower swing (commit to slow-and-hard).
- Undertow (2) [M] — Cleave drags hit enemies toward your center (re-packs the mob → feeds Outnumbered).
- Shockwave (2) [H/M] — Cleave throws a short shock past melee range (your anti-kite poke).
- ★ Execute (3) [H] — instakill enemies under ~15% HP; a kill refunds the cooldown.
- ★ Cyclone (3) [M] — Cleave becomes a 360° spin; for 2s after, the per-enemy bonus applies to all your damage.
Cross Guard — secondary hub
- Reinforced ⟳ (1) [B] — +block damage reduction.
- Rapid Stacks ⟳ (1) [F] — charge stacks faster.
- Flurry Edge ⟳ (1) [F] — +damage per Flurry hit.
- Bleed Strike (2) [F] — every Flurry hit stacks a bleed (pure hit-count scaling).
- ★ Riposte (2) [B] — release knocks back + stuns; a perfectly-timed (just-as-hit) release double-damages.
- ★ Counterweight (2) [H] — Flurry fires all stacks as one huge hit on a single target (turns your secondary into a Heavy burst).
- ★ Aegis (3) [B] — while guarding: reflect projectiles, immune to knockback, and blocked hits charge Bladestorm.
Lunge — mobility hub (the connector)
- Swift ⟳ (1) [all] — −Lunge cooldown.
- Cleaving Dash ⟳ (1) [H/M] — +Lunge path damage.
- Grapple Line (2) [M] — Lunge to an enemy yanks a cluster along with you (gather).
- Afterburn (2) [F/M] — Lunge leaves a damaging trail.
- ★ Phantom Step (2) [F/B] — 2 dash charges + fast recharge (hit-and-run spam, or panic escapes).
- ★ Seismic Landing (3) [M/H] — Lunge ends in a pull + shockwave at the landing point (engage and detonate).
Bladestorm — ultimate hub
- Overspin ⟳ (1) [F] — +duration.
- Momentum ⟳ (1) [F] — −cooldown.
- Wide Vortex ⟳ (1) [M] — +radius.
- Whirlpool (2) [M] — continuously pulls enemies inward while spinning.
- ★ Perpetual Motion (3) [F] — your hits cut its cooldown, and you move at full speed during it (a mobile, near-permanent ult).
- ★ Eye of the Storm (2) [H] — replace the spin with one massive overhead that scales with nearby enemy count.
The archetypes, as actual socket plans (this is the proof they're buildable — each pulls a distinct subset):
- HEAVY → Berserk · Cleave: Whetstone, Heavy Swing, Shockwave, ★Execute · Cross Guard: ★Counterweight · Lunge: Cleaving Dash, ★Seismic · Bladestorm: ★Eye of the Storm. Re-tools the multi-hit abilities into single big hits; ignores Flurry entirely.
- FLURRY → Adrenaline · Cross Guard: Rapid Stacks, Flurry Edge, Bleed Strike · Bladestorm: Momentum, Overspin, ★Perpetual Motion · Lunge: ★Phantom Step, Afterburn. Never touches Cleave.
- BULWARK → Thick Hide, Bloodhunger · Cross Guard: Reinforced, ★Riposte, ★Aegis · Lunge: ★Phantom Step. Aegis feeds Bladestorm; the tankiest, most reactive build.
- MAELSTROM → Bloodlust, ★Event Horizon · Cleave: Wide Arc, Undertow, ★Cyclone · Lunge: Grapple, ★Seismic · Bladestorm: Wide Vortex, Whirlpool. Ignores Cross Guard; all gather-and-clear.
Two things that fall out of this, worth noting:
- Anti-synergy does your lane-separation for free. Heavy Swing (slower) repels Flurry's attack-speed gems; Counterweight and Eye of the Storm convert away the very abilities Flurry is built on. So you'd never mix them — the gems just don't want to coexist, and the archetypes stay distinct with zero hard locks. Cross Guard is the contested hub (three archetypes fight over its 5 sockets differently); Lunge is the universal connector every build dips into.
- The socket math is the commitment. At ~12–15 gems earned per run against 25 sockets, you fill about half — concentrated in 2–3 abilities. Keystones eat 2–3 sockets each, so a run is either tall (few abilities, keystone-heavy) or wide (many abilities, stat-heavy). That choice is the build.
Where do you want to push — tune the socket-costs/caps until the budget feels right, stress-test the template by running a second unit (a ranged one, to prove it generalizes past melee), or step back and name/scope the game itself?
Great, the details of the abilities will be changed once we get to implementation, but now you're thinking in the right direction. Let's try another projectile based unit from SNKRX, do the same exercise for it and we'll iterate the same way on its abilities first, and then once we lock those down you do the gems.
Picking the Archer (Ranger) for this one — it's the canonical projectile unit, and it's the cleanest possible contrast to the Swordsman, which makes it a real test of whether the template produces distinct characters instead of reskins. Let me ground it in the source first.
Grep (character == 'archer')
106- end)
107- end
108- end
109- end
110- end, nil, nil, 'attack')
111-
112: elseif self.character == 'archer' then
113- self.attack_sensor = Circle(self.x, self.y, 160)
114- self.t:cooldown(2, function() local enemies = self:get_objects_in_shape(self.attack_sensor, main.current.enemies); return enemies and #enemies > 0 end, function()
115- local closest_enemy = self:get_closest_object_in_shape(self.attack_sensor, main.current.enemies)
116- if closest_enemy then
117- self:shoot(self:angle_to_object(closest_enemy), {pierce = 1000, ricochet = (self.level == 3 and 3 or 0)})
118- end
--
1883-
1884- if self.character == 'vagrant' or self.character == 'artificer' then
1885- shoot1:play{pitch = random:float(0.95, 1.05), volume = 0.2}
1886- elseif self.character == 'dual_gunner' then
1887- dual_gunner1:play{pitch = random:float(0.95, 1.05), volume = 0.3}
1888- dual_gunner2:play{pitch = random:float(0.95, 1.05), volume = 0.3}
1889: elseif self.character == 'archer' or self.character == 'hunter' or self.character == 'barrager' or self.character == 'corruptor' then
1890- archer1:play{pitch = random:float(0.95, 1.05), volume = 0.35}
1891- elseif self.character == 'wizard' or self.character == 'lich' or self.character == 'arcanist' then
1892- wizard1:play{pitch = random:float(0.95, 1.05), volume = 0.15}
1893- elseif self.character == 'scout' or self.character == 'outlaw' or self.character == 'blade' or self.character == 'spellblade' or self.character == 'jester' or self.character == 'assassin' or self.character == 'beastmaster' or
1894- self.character == 'thief' then
1895- _G[random:table{'scout1', 'scout2'}]:play{pitch = random:float(0.95, 1.05), volume = 0.35}
--
2226- if nx == 0 and ny == -1 then r = -math.pi/2
2227- elseif nx == 0 and ny == 1 then r = math.pi/2
... [25 more lines]
Grep ((pierce|bounce|chain).*=|ranger)
37: self:shoot(self:angle_to_object(closest_enemy), {chain = (self.level == 3 and 2 or 0)})
117: self:shoot(self:angle_to_object(closest_enemy), {pierce = 1000, ricochet = (self.level == 3 and 3 or 0)})
126: self:shoot(self:angle_to_object(closest_enemy), {chain = (self.level == 3 and 6 or 3)})
135: self:shoot(self:angle_to_object(closest_enemy), {chain = (self.level == 3 and 10 or 5)})
194: self:shoot(self:angle_to_object(closest_enemy), {pierce = 10000, v = 40})
201: self:shoot(self:angle_to_object(closest_enemy), {pierce = 10000, v = 40})
477: self:shoot(self:angle_to_object(closest_enemy), {chain = (self.level == 3 and 14 or 7), v = 140})
592: self:shoot(self:angle_to_object(closest_enemy), {pierce = 1000})
1172: if class_levels.ranger >= 1 then number_of_active_sets = number_of_active_sets + 1 end
1200: if table.any(self.classes, function(v) return v == 'ranger' end) then
1201: if main.current.ranger_level == 2 then self.chance_to_barrage = 16
1202: elseif main.current.ranger_level == 1 then self.chance_to_barrage = 8
1203: elseif main.current.ranger_level == 0 then self.chance_to_barrage = 0 end
1238: if class_levels.ranger >= 1 then number_of_active_sets = number_of_active_sets + 1 end
1648: parent = self, character = 'barrage', level = self.level, pierce = 1000, ricochet = 2}
1728: self.chain_infused = true
1729: self.t:after(duration or 2, function() self.chain_infused = false end, 'chain_infuse')
1847: local t = {group = main.current.main, x = self.x + 1.6*self.shape.w*math.cos(r), y = self.y + 1.6*self.shape.w*math.sin(r), v = 25, r = r, color = self.color, dmg = self.dmg, pierce = 1000, character = 'sage',
1961: parent = self, character = 'barrage', level = self.level, pierce = pierce or 0, ricochet = ricochet or 0, shoot_5 = shoot_5, homing = homing}
1979: self.pierce = args.pierce or 0
1980: self.chain = args.chain or 0
1982: self.chain_enemies_hit = {}
2016: self.pierce = 1000
2023: self.pierce = 1000
2032: self.pierce = 10000
[Showing results with pagination = limit: 25]
Grounded: the Archer fires a fully-piercing arrow (pierce = 1000 — it passes through the entire line of enemies it crosses), on a fast ~2s cadence, long detection range (160 vs the Swordsman's 48), and at max level the arrow ricochets off walls — that's "Bounce Shot" (player.lua:112). So the real identity is threading one arrow through a whole column of enemies.
That hands us the perfect contrast — the Archer is the Swordsman inverted:
| Swordsman | Archer | |
|---|---|---|
| wants enemies | packed around him (radial) | lined up in front (linear) |
| survives by | being surrounded (tanky) | spacing/kiting (fragile) |
| mobility | dash in (gap-closer) | roll out (gap-maker) |
| scales with | crowd density | how many it threads |
Same template, mirrored geometry. That's the proof it generalizes. Here's the kit:
Passive · Through-Line. Arrows pierce everything in their path, and the arrow gains power with every enemy it passes through — so a shot threading six lined-up enemies hits the sixth far harder than the first. (Note this inverts the usual pierce-falloff — most games weaken a piercing shot as it travels; this one builds. That inversion is the whole hook, and it's the literal mirror of Outnumbered.) Kicker to push the kiting identity: arrows also gain a little damage the farther they've flown — reward keeping your distance.
Primary · Draw Shot. Aim and fire a piercing arrow. It's a draw: tap for a quick shot, hold to charge a stronger, faster arrow that pierces harder. Charging roots you briefly — so committing to a big shot is a real exposure decision, which pairs with the fragile/kiting fantasy and gives the moment-to-moment skill (timing draws while backpedaling). (Fork: chargeable draw vs. a simpler steady tap-fire — the draw adds skill and theme but one layer of complexity.)
Mobility · Tumble. A quick evasive roll with brief i-frames, to dodge and re-space. The exact inverse of the Swordsman's Lunge — his dashes in to engage, hers rolls out to survive. Short cooldown; it's a fragile unit's lifeline.
Ultimate · Railshot ("Through and Through"). A brief draw, then one screen-long piercing mega-arrow in a wide lane that scales massively per enemy pierced — line up the swarm and erase the column. It's the inverse of Bladestorm: Bladestorm clears everything around you, Railshot clears everything in a line. (Fork: this, or Arrow Rain — a saturating AoE volley over an area. The two choices are literally the two ends of the unit's build axis, below.)
Secondary — the open slot. Like last time, this is where I want options. The Archer's blind spots are enemies that close to melee (she's squishy) and scattered enemies that won't line up. Four directions:
- Caltrops (zone + peel + herd) — drop a trap field that slows/damages; it peels melee off you and funnels enemies into the clumps/lines you want to pierce. The identity-coherent pick — it manufactures your lines the way the Swordsman's Hook would've manufactured his crowd. My lean.
- Ricochet Shot (the literal SNKRX signature) — a bolt that bounces between scattered enemies. Beautiful contrast with the primary: pierce is for lined-up enemies, bounce is for scattered ones — two tools for two crowd shapes.
- Volley (spread cover) — a fast cone of arrows; answers the "too spread to thread" gap with suppressive width.
- Hunter's Mark (focus/execute) — mark a target; marked enemies take more and your arrows home toward them; a kill on a marked target refunds. Single-target precision + a soft aim-assist.
The core axis it's all pointing at (the backbone for the eventual gems): Precision/Pierce (charged shots, long lines, crit, range — few perfect arrows, reward lining them up) vs Saturation/Spread (multishot, ricochet, rain, fire rate — many scattered shots, cover area). The Railshot-vs-Arrow-Rain ult fork is just this axis showing up early.
React to the four core abilities, and tell me which secondary direction pulls you — then once they're locked I'll do the gem pass across all five hubs, same as the Swordsman.
Primary should just be a normal shot, no draw. Secondary should be Volley, a fan of individual arrows. Ultimate should not be a line, should just be a very long and wide barrage of piercing arrows.
We want to make sure the Archer is actually just mostly using arrows because then we can make the specs focus on arrow upgrades alone. We want this class specifically to be about arrows primarily. Other ranged classes will mix between arrows and other things.
Given this, what are your proposals for archetypes? Let's get those defined first before you do the actual gems.
Quick alignment on the locked kit: Through-Line passive (arrows gain power per enemy pierced), plain piercing Primary, Volley (fan of arrows) secondary, Tumble mobility, and a long-and-wide piercing barrage ultimate. So every offensive button is arrows — single arrow, fan of arrows, wall of arrows.
The structural payoff you're after: because all three emitters fire the same projectile, the archetypes here aren't ability-bound the way the Swordsman's were (his abilities were a swing, a block, a dash, a spin — heterogeneous). Every Archer archetype is an arrow behavior that reskins across Primary/Volley/Ultimate. That quietly buys back some of the "general gem" feeling the socket system forbade — "pierce" is meaningful in all three hubs.
And it implies a principle worth stating outright, because it is your "this class is about arrows" intent made concrete: keep the Archer purely KINETIC. Every lane is about how arrows fly, multiply, and land — never status/DoT (poison, burn, bleed). Reserve affliction for a Voider/Assassin-flavored ranged class later. That boundary is what makes this read as the arrow class rather than a generic ranged DPS.
Four archetypes, all kinetic, deliberately parallel to the Swordsman's structure (two damage-shapes + a signature lane + a survival lane):
1. PENETRATOR — pierce / precision (the big-hit lane; parallels Heavy). Fewer, deadlier arrows that thread whole columns and snowball through Through-Line; crit, velocity, range, deeper pierce-scaling. Plays: you line enemies up and fire down the longest column — positioning is the whole game, and one arrow can erase a row.
2. VOLLEY — multishot / spread (the many-arrows lane; parallels Flurry). More arrows per shot, wider fans, scatter — area coverage and suppression. Plays: you spray into crowds, aim loosely, blanket a zone. The Volley secondary is home base, but it also pumps the Primary (2–3 arrows) and widens the ultimate.
3. RICOCHET — trickshot / bounce (the signature lane — literally SNKRX's "Bounce Shot"; parallels Maelstrom). Arrows carom off walls and enemies, hitting repeatedly via angles. Plays: you read the arena — bank shots off walls, set up ricochets so one arrow clears a room through geometry, not aim. Rewards spatial cleverness.
4. HARRIER — kiting / control (the survival lane; parallels Bulwark). Arrows that slow, knock back, pin/root; extra Tumbles; trap fields. Plays: you never let them close — hold the lethal distance, control the field, win untouched by attrition. This is the Archer's "defense," expressed as control-at-range instead of the Swordsman's facetank.
Two notes before we lock:
- The one I left out on purpose: Affliction/DoT (poison arrows) is the classic archer fantasy, but it breaks the purely-kinetic boundary and is better off as another class's identity. My rec is to leave it out — but if you want a fifth lane, that's the obvious candidate and I'll fold it in.
- A flag for the gem pass (not now): since every ability fires arrows, we'll have to decide whether an arrow-gem socketed in Primary boosts only Primary's arrows or all arrows. Per-ability preserves a "which delivery system do I upgrade?" choice; global makes builds cleaner. We'll settle it when we get there.
Lock these four — and tell me Affliction in or out — and I'll run the gem pass across all five hubs.
Add an additional archetype, homing, focused on arrows that seek targets, a full homing build has many piercing arrows that also constantly thread through enemies. A homing + penetrator build might have 1 super powerful arrow that seeks all enemies and kills them all. Ricochet should focus on ricochets being wall based, not enemy based, and also focus on split arrows from walls, so you get lots of arrows flooding the arena, but of course, also allowing for single powerful arrows option too with strong wall bounces.
Homing in as the fifth — and note it's still kinetic (how arrows fly, not status), so the purity boundary holds and Affliction stays out. Good, consistent.
Adding Homing and rewriting Ricochet to wall-based actually snaps the whole set into a clean taxonomy. Four of the five are now delivery lanes — four different answers to the one question "how does a single arrow hit many enemies?"
- PENETRATOR → by going through them (pierce).
- VOLLEY → by there being many of them (multishot at the bow).
- RICOCHET → by bouncing off the walls (geometry).
- HOMING → by seeking them (guidance).
…and HARRIER is the odd one out on purpose — it doesn't deliver damage, it controls the field so the delivery lanes can work. The big realization: these combine freely, and each delivery lane runs along the same few-powerful ↔ many-weak dial. So the Archer isn't four separate lanes like the Swordsman — it's a small combinatorial arrow-modifier system (Noita/PoE-flavored), and the marquee builds live at the intersections, exactly like your examples.
The five, defined:
PENETRATOR — through them. Pierce + Through-Line scaling; one arrow threads a column, harder per enemy. The precise/few end. Plays: line enemies into columns and aim down them.
VOLLEY — many of them. More arrows per shot, fans, scatter. The many end by definition. Plays: spray crowds, blanket zones, aim loosely.
RICOCHET — off the walls (not enemies, per your call). Two sub-directions that are its own few/many dial: SPLIT — each wall-hit spawns more arrows, flooding the arena — and HARD-BOUNCE — one strong arrow caroming many times for a trick-shot clear. Plays: read the arena, bank shots, turn walls into multipliers.
HOMING — seeking them. Arrows curve to targets; fire-and-forget. Expresses at both ends, which is what makes it combine so well: Homing × Volley = a swarm of seeking piercing arrows that auto-distribute and never miss (your "full homing"); Homing × Penetrator = one super-arrow that seeks every enemy, piercing and scaling through the whole screen (your "1 arrow kills them all"). Plays: trade aim for guidance — set the build, watch it hunt.
HARRIER — hold them off. Slow, knockback, pin, extra Tumbles, traps; the control overlay you layer onto any delivery lane to stay untouched. Plays: never let them close; win by attrition.
Marquee combos (since the intersections are now the point):
- Homing + Penetrator → the single screen-clearing super-arrow.
- Homing + Volley → an undodgeable cloud of threading seekers.
- Volley + Ricochet(split) → a fan where every arrow splits on every wall = total arena flood.
- Penetrator + Ricochet(hard) → one piercing arrow that banks off a wall to thread a second column — pure geometry-precision.
- Harrier + anything → the survival glue that lets a glass build live.
Two consequences worth knowing now, before gems:
- Ricochet commits us to an arena with walls. It works off the boundary at minimum, and sings with internal pillars/geometry — but it's dead in an open field. So the moment we keep Ricochet, the arena design owes it walls. Cheap to honor, but it's a real constraint to lock in consciously.
- Homing is the anti-aim lane — deliberately (accessibility + "watch your build work" spectacle, the counterweight to Penetrator's manual precision). It'll need a balancing cost — slow turn rate, lower per-arrow damage, something — so "never miss" doesn't just dominate the lanes that ask you to aim. A tuning flag for later, not a blocker.
Lock these five (and the "combinatorial modifier system" framing — it changes how I'll structure the gems, more as stackable arrow-modifiers expressing across hubs than as ability-bound upgrades), and I'll run the gem pass.
Go ahead.
Locked. First, the per-ability/global question I flagged — here's the resolution, because it shapes every gem below:
Gems affect the ability they're socketed in — except the Through-Line (passive) hub, which holds global "arrow DNA" that applies to all arrows. That's why the universal behaviors (homing, ricochet) live there and cost 3 sockets, while cheap single-ability versions of the same idea exist in the emitter hubs. So you get a clean cheap-narrow vs expensive-broad choice: make just your Primary home for 1 socket, or make everything home for a 3-socket passive keystone.
Notation as before: ⟳ stackable · ★ keystone · (n) sockets · [PEN/VOL/RIC/HOM/HAR] archetype.
Through-Line — passive hub ("arrow DNA," global)
- Deep Pierce ⟳ (1) [PEN] — +damage gained per enemy pierced.
- Fletching ⟳ (1) [—] — +flat damage to all arrows.
- Keen Eye ⟳ (1) [PEN] — +crit, rising with the arrow's travel distance.
- Long Draw ⟳ (1) [PEN] — +arrow speed & range.
- ★ Overpenetration (2) [PEN] — each enemy pierced makes the arrow bigger & faster (single arrows snowball as they thread).
- ★ Seeker's Instinct (3) [HOM] — all arrows curve toward enemies.
- ★ Ricochet Rounds (3) [RIC] — all arrows bounce off walls.
Aimed Shot — primary hub ("your main arrow")
- Broadhead ⟳ (1) [PEN] — +Primary damage.
- Rapid Nock ⟳ (1) [VOL] — +fire rate.
- Bodkin Point (1) [PEN] — Primary pierces harder, shreds armor.
- Twin Shot (2) [VOL] — Primary fires 2 arrows.
- Guided Shot (1) [HOM] — Primary homes (the cheap, single-ability dabble).
- ★ Piercing Bolt (2) [PEN] — Primary becomes one heavy, slow arrow: massive pierce + scaling.
- ★ Trick Shot (2) [RIC] — Primary ricochets off walls (single-ability).
Volley — secondary hub ("the fan")
- More Arrows ⟳ (1) [VOL] — +1 arrow per Volley.
- Wide Spread ⟳ (1) [VOL] — wider fan.
- Scattershot ⟳ (1) [VOL] — more, weaker arrows across a cone.
- Tight Spread (1) [PEN] — narrow the fan into a concentrated lance (Volley → Penetrator).
- Splinter (2) [RIC] — Volley arrows split into 2 on wall-hit (flood).
- ★ Seeking Swarm (2) [HOM] — each Volley arrow homes to a different target (auto-distribute).
- ★ Arrow Storm (2) [VOL] — a massive fan on a longer cooldown.
Barrage — ultimate hub ("the wall of arrows")
- Sustained Fire ⟳ (1) [—] — +Barrage duration.
- Munitions ⟳ (1) [—] — −Barrage cooldown.
- Wider Front ⟳ (1) [VOL] — +Barrage width.
- Suppressing Barrage (2) [HAR] — Barrage arrows knock back & slow.
- ★ Carpet Bomb (2) [RIC/VOL] — Barrage arrows split on walls → flood the whole arena.
- ★ Singularity Arrow (3) [PEN/HOM] — replace the barrage with one colossal homing piercing arrow that seeks every enemy, scaling per pierce.
Tumble — mobility hub (Harrier / control)
- Fleet Foot ⟳ (1) [—] — −Tumble cooldown.
- Evasive ⟳ (1) [HAR] — +i-frame window.
- Parting Shot (1) [—] — fire an arrow when you Tumble.
- Caltrops (2) [HAR] — Tumble drops a slowing/damaging trap field.
- Hunter's Footwork (2) [HAR] — +1 Tumble charge & fire-while-rolling.
- ★ Pinning Arrows (2) [HAR] — all arrows briefly root/slow on hit (global control).
- ★ Volley Roll (2) [VOL/HAR] — Tumble fires a Volley in the roll direction.
The five archetypes as socket-plans (proof they build, and where the combos live):
- PENETRATOR → Deep Pierce, Keen Eye, ★Overpenetration · ★Piercing Bolt, Broadhead, Bodkin · Tight Spread · ★Singularity. One heavy scaling arrow; line up columns.
- VOLLEY → More Arrows, Wide Spread, Scattershot, ★Arrow Storm · Twin Shot, Rapid Nock · Wider Front, ★Carpet Bomb. Arrows everywhere.
- RICOCHET → ★Ricochet Rounds, then split: Splinter + ★Carpet Bomb (arena flood), or hard-bounce: ★Trick Shot + ★Piercing Bolt (one strong caroming arrow).
- HOMING → ★Seeker's Instinct, then many: ★Seeking Swarm (the cloud), or few: ★Singularity + Penetrator gems (the super-arrow).
- HARRIER → Caltrops, Hunter's Footwork, ★Pinning Arrows, Evasive · Suppressing Barrage. Layer onto any damage build to stay untouched.
Your marquee combos all fall out with explicit support: Homing+Penetrator = Singularity (the one screen-clearing arrow), Volley+Ricochet = Splinter/Carpet (the flood), Penetrator+Ricochet = Trick Shot + Piercing Bolt (the banking sniper).
Three notes:
- Anti-synergy does the lane-separation for free again: Piercing Bolt (slow, heavy) repels Rapid Nock/Twin Shot (fast, many); Tight vs Wide Spread; Singularity vs Carpet Bomb are mutually-exclusive ults; and Seeker's Instinct (3) vs Ricochet Rounds (3) can't both fit the 5-socket passive — so you commit your arrows' global nature to one or the other.
- The few↔many dial is in every lane — Volley (Tight/Wide), Ricochet (Trick/Splinter), Homing (Singularity/Swarm), the ult itself (Singularity/Carpet). Every lane has a "concentrate" pole and a "multiply" pole, exactly as designed.
- Reminder: every Ricochet gem is dead weight without arena walls — we owe the arena geometry the moment we keep this lane.
Two units now have full kits, archetypes, and gems — enough to see the template holds for both a melee brawler and a pure-arrow shooter. Where to next: tune/stress these Archer gems, run a third contrasting unit (a summoner or a mage, to test the template's edges), or — the honest gate that's coming — stop designing units and grey-box one of these to check the active-aim + linked-socket loop is actually fun before we scale to 55? Your call; I'd just flag that third option is the one the shipping discipline keeps pointing at.
You have the right idea again, although I'd improve it a lot with some more creative choices, but this is only an exercise. I think we have the basics of the game down and this feels like a nice game to make to me. One thing to note is that the Archer has much more interplay between build archetypes than the Swordsman. The arrow-focused nature of it contributes to this, but it's another axis we have to consider when designing new characters. Are they characters that are focused on a single "carrier" and thus all its archetypes will have more interplay, or are they switching between carriers, such as the Swordsman which is seemingly switching between AoE and single target? We need to make this a conscious early choice in future design sessions.
Create a folder for this project, named... Ah, what should this game be named, do you think?
Before the name — that carrier observation is the sharpest thing to come out of this whole exercise, and it goes deeper than you said: the carrier axis and the global-vs-per-ability gem question are the same decision.
- Single-carrier (Archer: everything is arrows) → archetypes are modifiers on one delivery method, so they blend and combine → high interplay, the Noita/PoE-skill-gem feel. It wanted a global "arrow DNA" hub because the modifiers are shared.
- Multi-carrier (Swordsman: AoE cleave vs single-target Cross-Guard flurry) → archetypes are bolted to distinct carriers, so they're modes you switch between → lower interplay, a kit-of-tools feel. It wanted per-ability gems because each tool is its own thing.
So "how many carriers does this character have?" decides both how combinatorial the builds feel and whether its gems are global or per-ability. That's one conscious choice at the very start of each character's design, and it's a great roster-variety knob — a mix of blenders and switchers keeps the cast from feeling samey. I'll write this down as a project design principle when I set up the folder (along with a note that these two units are illustrative template tests, not final — per your "only an exercise").
Now, the name. The game's distinctive identity is building a class out of gems in sockets, so I'd name around that rather than the combat. A shortlist, with my lean — and if none land, I can also coin a stylized one in your SNKRX/BYTEPATH vein:
AskUserQuestion
Your questions have been answered: "What should we name the project (the folder, for now — renamable anytime)?"="[User dismissed — do not proceed, wait for next instruction]". You can now continue with these answers in mind.
Got it — holding off. No folder created, nothing committed. The name's yours to land on; tell me when you've got one (or want to go a different direction entirely) and I'll set it up then.
Create a big list, do not ask me via question, just list lots of viable names.
No question — here's a big spread, grouped so you can scan by flavor. Leaning on the game's real identity (build a class out of gems in sockets), but with combat and stylized options too.
Gem & socket (the mechanic) Facets · Inlay · Setting · Sockets · Socketed · Lapidary · Bezel · Cabochon · Filigree · Gemwright · Lodestone · Inset · Brilliant · Carat · Setpiece
Prism & light (one gem, many refractions = many builds) Prism · Prismatic · Spectrum · Refraction · Glint · Glimmer · Lustre · Radiance · Shard · Shards · Facetwork
Link, lattice & weave (it's linked sockets) Lattice · Linkage · Linked · Matrix · Nexus · Conflux · Confluence · Weave · Loom · Throughline · Mainline
Build & forge (assembling a character from parts) Loadout · Forge · Foundry · Kitbash · Artifice · Tinker · Temper · Synthesis · Alloy · Amalgam · Schematic · Theorycraft · Permute
Keystone & structure (the build as an arch its keystones lock) Keystone · Capstone · Cornerstone · Lodestar · Linchpin · Bastion · Vault · Pillar · Mainstay
Rune & sigil (inscribed power) Sigil · Glyph · Rune · Runed · Inscribe · Cipher · Conduit · Catalyst · Vessel · Mantle
Class & calling (the roster) Vocation · Classless · Archetype · Calling · Adept · Savant · Paragon · Warden
Combat & power (RoR-punchy) Salvo · Onslaught · Sunder · Havoc · Maelstrom · Barrage · Fray · Vanguard · Warband · Wrath · Cataclysm · Deluge · Riptide
Stylized / coined (your SNKRX / BYTEPATH / BUILDRX lineage) GEMRX · BUILDRX · SLOTRX · SOCKT · FACETX · KITRX · GMBLD · Soketta · Buildlike
Two-word / compound (more title-like) Gem Cradle · Glass Cannon · Open Socket · Cut & Set · Deep Socket · Keystone Arc · Set Piece · Arrow & Edge · Cut Gems · Live Wire
If I had to shortlist from all of it: Lattice (linked sockets literally form one, sounds like a game, build-coded), Facets (gems = archetypes, elegant), Prismatic (one kit refracted into many builds), Filigree (distinctive, gem-setting), and Sunder (if you want punchy-combat over build-cerebral). Pick one, coin a mutation of one, or tell me a direction to push and I'll generate another batch.
These are not very good. Uhhhh............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... 062026, temporary name until we figure it out. Create this folder, create a document in it detailing the process of creating a new unit. Pick unit from SNKRX, identify its identity, think about what carriers should apply to it, think about abilities and how they use those carriers, think about archetypes, favoring interplay between archetypes (archetype X + archetype Y type of builds possible), then finally create gems for all archetypes, making sure there are more than 5 gems for each ability. In this document also describe the game as it is now. Mention this is a side project so that I can work on it alongside Mini Looper while waiting for the agent to be done with its tasks from that project.
On it — folder 062026 (temp), with a full design + unit-creation doc. Let me set it up.
PowerShell
FullName
--------
E:\a327ex\062026
Read (C:\Users\adn\.claude\projects\E--a327ex\memory\MEMORY.md)
Folder's created. Now the design doc:
Write (E:\a327ex\062026\design.md)
File created successfully at: E:\a327ex\062026\design.md (file state is current in your context — no need to Read it back)
Write (C:\Users\adn.claude\projects\E--a327ex\memory\project_062026.md)
File created successfully at: C:\Users\adn\.claude\projects\E--a327ex\memory\project_062026.md (file state is current in your context — no need to Read it back)
Now the index pointer so future sessions know it exists:
Edit (C:\Users\adn.claude\projects\E--a327ex\memory\MEMORY.md)
The file C:\Users\adn\.claude\projects\E--a327ex\memory\MEMORY.md has been updated successfully. (file state is current in your context — no need to Read it back)
Done. 062026/design.md now holds the whole thing:
- The game as it stands — build-heavy active-aim roguelite, SNKRX units as solo classes, Linked-Socket gem builds, deterministic (no gambling), with the surprise knob and win/arena bits flagged as TBD.
- A "this is a side project" banner up top — its job is to be the thing you design/build in the gaps while the agent is busy on Mini Looper, with a note that it's not allowed to balloon into a second main project.
- Design principles — including the Carrier Axis (single vs multi-carrier = global vs per-ability gems) you surfaced.
- The 6-step unit-creation process — pick from SNKRX → identity → carriers → kit → archetypes (favoring X+Y interplay) → gems (>5/ability), abilities-first-then-gems.
- Both worked units — Swordsman (multi-carrier) and Archer (single-carrier) with full kits, archetypes, and gem lists as reference templates.
I also dropped a one-line pointer in your memory index so a future session lands on the doc instead of starting cold.
Two honest flags, then I'll leave it: the units/gems in there are tagged as placeholders for implementation (your "only an exercise"), and the doc's own next-steps section keeps the real gate visible — grey-box one class and check the loop is fun before designing more of the 55. Whenever you want to pick this back up, that's the thread to pull.
End this session, name it 062026 1
Skill
Launching skill: end-session
Base directory for this skill: E:\a327ex.claude\skills\end-session
End Session Workflow
This skill is invoked from the same conversation where the work was done. You already have the full session context in memory — you do NOT need to read the transcript.
Step 1: Get Session Info
Ask the user for the session title (max 30 characters). Examples: "Anchor Phase 10 Part 5", "Physics Arena Setup", "Timer System Fix", "Thalien Lune Design".
Determine the project yourself from your session context — you know which repo(s) were worked on, which files were created/modified, and where they live. No need to ask. See Step 5 for the list of known project roots; if the session touched something outside the list, infer the root from the paths you actually edited.
Step 2: Write Summary
Write the summary from your conversation memory. You have the full session context — no need to read any files.
The summary should be thorough and detailed. Each major topic deserves its own section with multiple specific bullet points. Don't compress — expand.
Purpose: These summaries serve as searchable records. Future Claude instances will grep through past logs to find how specific topics were handled. The more detail you include, the more useful the summary becomes for finding relevant context later.
Format (this is just an example structure — adapt sections to match what actually happened):
# [Title] ## Summary [1-2 sentence overview of the session's main focus] **[Topic 1 - e.g., "Spring Module Implementation"]:** - First specific detail about what was done - Second detail - include file names, function names - User correction or feedback (quote if notable) - Technical decisions and why **[Topic 2 - e.g., "Camera Research"]:** - What was researched - Key findings - How it influenced implementation **[Topic 3 - e.g., "Errors and Fixes"]:** - Specific error message encountered - Root cause identified - How it was fixed [Continue for each major topic...] --- [Rest of transcript follows]Rules: - Be thorough — If in doubt, include more detail, not less. Each topic should be as detailed as possible while still being a summary. - Think searchability — Future instances will search these logs. Include keywords, function names, error messages that someone might grep for. - One section per major topic — Don't combine unrelated work into one section - Chronological order — Sections should match conversation flow - Specific details — Error messages, file names, function names, parameter values - Include user quotes — When user gave notable feedback, quote it (e.g., "k/d variables are not intuitive at all") - Weight planning equally — Research, proposals, alternatives considered, user feedback on approach are as important as implementation - Weight problems solved — Errors, root causes, fixes, user corrections all matter - Technical specifics — Include formulas, API signatures, parameter changes when relevant
Step 3: Proceed Without Approval
Do NOT show the summary to the user for approval. Write it directly. The user can review the committed log after the fact and request a follow-up edit if anything is off.
Step 4: Convert Transcript and Write the Log File
# Find recent sessions (Claude + Cursor + Codex). Same script lives in Anchor2: python E:/a327ex/Anchor2/scripts/find-recent-session.py --limit 5 # or: python E:/a327ex/Anchor/scripts/find-recent-session.py --limit 5The script shows sessions sorted by when they ended. The first result is the current conversation (since end-session was invoked here). Use it.
Use a lowercase hyphenated slug derived from the title (e.g., "anchor-primitives-hitstop-animation").
Get the end timestamp for the Date frontmatter — this is the wall-clock time when end-session was invoked, NOT the time the JSONL started. Sessions often span multiple days, and the log should be filed under the day the work was wrapped up:
date "+%Y-%m-%d %H:%M:%S"Use this output verbatim. Do not substitute the JSONL start timestamp; the log appears in the sidebar sorted by Date, and a multi-day session with a Date pinned to day 1 will sort below sessions that ended later but started later, hiding the most recent work.
Convert the transcript to markdown:
python E:/a327ex/Anchor2/scripts/jsonl-to-markdown.py [SESSION_PATH] /tmp/session-log.md # or: python E:/a327ex/Anchor/scripts/jsonl-to-markdown.py ...The same script auto-detects Claude Code JSONL vs Cursor/Composer agent JSONL (
~/.cursor/projects/.../agent-transcripts/...) vs Codex rollouts (~/.codex/sessions/...). For Composer sessions, usefind-recent-session.py(it merges all sources) and pick the[cursor]line for the current chat.Replace the default header (
# Session YYYY-MM-DD...) at the top of/tmp/session-log.mdwith the approved title and summary, AND prepend frontmatter. The final file shape:Title: [Title] Date: YYYY-MM-DD HH:MM:SS # [Title] ## Summary [approved summary text from step 2] --- [transcript content from jsonl-to-markdown script]Frontmatter is non-negotiable. Every log file MUST start with
Title:andDate:lines. Without them, the site's sidebar shows the slug as the title and 0 (epoch) as the sort date. The backfill script ina327ex-site/deploy/backfill_metadata.pyis a safety net, not a substitute — write it correctly the first time.Then copy the final file to the log destination:
cp /tmp/session-log.md E:/a327ex/a327ex-site/logs/[slug].mdStep 4.5: Decrement the lock (if active)
Read
E:/a327ex/a327ex-site/.lock.jsonif it exists. If it contains{"remaining": N}with N > 0:
- Decrement N by 1
- Write
{"remaining": N-1}back to the file- If N becomes 0, the lock is cleared. You may leave the file at
{"remaining": 0}or delete it; both work.The lock file lives in the a327ex-site repo, so the change is staged automatically by
git add -Ain Step 6.If no lock file exists or
remainingis already 0, do nothing. (See the/lockskill for the lock's full design.)Step 5: Commit Project Repo
Identify the project repo(s) worked on this session from your own context — you already know which repos were touched and which files changed. For the common projects:
Project Root Stage command Anchor E:/a327ex/Anchorgit add docs/ framework/ engine/ scripts/ reference/Anchor2 E:/a327ex/Anchor2git add framework/ engine/ arena/ reference/ scripts/ docs/ .claude/emoji-ball-battles E:/a327ex/emoji-ball-battlesgit add -Ainvoker E:/a327ex/Invokergit add -Athalien-lune E:/a327ex/thalien-lunegit add -Aa327ex-site E:/a327ex/a327ex-sitegit add -A(this IS one of the web repos — the log file added in Step 4 is staged here automatically)For a project not listed, infer the root from the files you actually created or modified this session and stage those. If multiple candidate roots look valid, ask the user which files to stage.
cdinto the project root, stage, rungit statusto verify before committing.IMPORTANT — FULL SUMMARY IN COMMIT: The commit message MUST include the FULL summary from the log file. Read the summary back from the log file to ensure nothing is missing.
IMPORTANT — COMMIT METHOD: The summary contains backticks, special characters, and markdown that WILL break heredocs and
git commit -m. ALWAYS use the file-based method below. NEVER try a heredoc first — it will fail and produce a malformed commit that needs amending.# Skip until we hit the line "## Summary", then take everything after the next # blank line until the --- separator that precedes the transcript. awk '/^## Summary$/{found=1; next} found && NR>1 && /^---$/{exit} found' \ E:/a327ex/a327ex-site/logs/[slug].md > /tmp/commit_msg.txt # Prepend the title (plain text, no #) and append attribution sed -i "1i [Title]\n" /tmp/commit_msg.txt printf "\nGenerated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>\n" >> /tmp/commit_msg.txt git commit -F /tmp/commit_msg.txtStep 6: Push the Repos
Two pushes — project (to GitHub) and a327ex-site (to the VPS):
# Project repo to GitHub. Skip this push if the project IS a327ex-site # (handled by the second push below — don't duplicate). git push origin main # a327ex-site to the VPS (post-receive hook restarts the Lua server). cd E:/a327ex/a327ex-site git add -A git commit -m "[Title]" git push prod main 2>&1 | tail -3Failure handling: if either push fails, the other still happens. Local commits stay intact, so the user can re-push manually once they've fixed whatever blocked it. Don't roll back; the committed state on disk is the source of truth.
Step 7: Confirm
Tell the user: - Project commit hash + GitHub push result - a327ex-site commit hash + VPS push result
Format:
Logged — "[Title]". project (Anchor2): abc1234 pushed to GitHub a327ex-site: ghi9012 pushed to a327ex.com (post-receive deployed)If a push failed, surface that explicitly with the error.
Notes
- Frontmatter is non-negotiable. Every log file MUST have
Title:andDate:at the top. Enforced at write time in step 4. The backfill script is a safety net, not a substitute.- If the project IS
a327ex-site(e.g., you spent the session writing the renderer or fixing the theme), there's no separate "project repo to GitHub" push — the a327ex-site push at the end IS the project push. Don't duplicate.- Legacy note: this skill used to also dual-write to
anchor.blot.im/logs/andanchor.blot.im/context/. Post-cutover (May 2026),anchor.blot.imis a JS redirect toa327ex.comand no longer receives content. Drop those steps if you find any older docs that still reference them.ARGUMENTS: 062026 1
I have full context — writing the log. Let me find the session file and timestamp first.
Bash (python E:/a327ex/Anchor2/scripts/find-recent-session.py --limit 5)
2026-06-05T04:27:50.142Z 081fadb9-c1ff-4449-b7f2-a024fefea81f [claude] <-- MOST RECENT
C:\Users\adn\.claude\projects\E--a327ex\081fadb9-c1ff-4449-b7f2-a024fefea81f.jsonl
2026-06-05T04:12:25.797Z d28a11ef-b75f-4096-99ae-ccc3c67f513b [claude]
C:\Users\adn\.claude\projects\E--a327ex\d28a11ef-b75f-4096-99ae-ccc3c67f513b.jsonl
2026-06-05T03:46:08.708Z 229f6b97-b5d0-45bb-b66d-274589a0cb50 [claude]
C:\Users\adn\.claude\projects\E--a327ex\229f6b97-b5d0-45bb-b66d-274589a0cb50.jsonl
2026-06-05T00:51:44.279Z 3ec7c86a-d4e5-4f02-8a7e-6deb6961ef74 [claude]
C:\Users\adn\.claude\projects\E--a327ex\3ec7c86a-d4e5-4f02-8a7e-6deb6961ef74.jsonl
2026-06-04T22:38:04.405Z 19a749d1-fc04-409e-9dc3-8da75161cb61 [claude]
C:\Users\adn\.claude\projects\E--a327ex\19a749d1-fc04-409e-9dc3-8da75161cb61.jsonl
Bash (date "+%Y-%m-%d %H:%M:%S")
2026-06-05 01:28:06
Current session confirmed (081fadb9…). Converting the transcript now: