pixelkiln 0.89.1 → 0.89.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -112,6 +112,14 @@ retain:
112
112
  same output bytes, which is what lets a restore reproduce a recorded hash.
113
113
  It is compared against the manifest on every `plan`: a difference is
114
114
  `recoverable`, never `stale`, because no provider work is involved;
115
+ - `terrainSettings`, `terrain` entries only: the settings the request was
116
+ sent with that `specHash` leaves out (the older mode, transition size,
117
+ view, shape, and raggedness knobs, and each terrain's description as
118
+ sent). Hashing them would have made every existing terrain entry stale,
119
+ so `plan` compares this record instead and reports `stale` naming each
120
+ changed setting. An entry from before it was recorded has none and is
121
+ taken as current. A history entry keeps its own, so a restore is
122
+ compared against the generation it brought back;
115
123
  - temporary `supersededOutputs[]` ownership hashes while a stale generation is
116
124
  being replaced;
117
125
  - provider-specific metadata under a provider-id namespace;
package/docs/ENDPOINTS.md CHANGED
@@ -406,8 +406,8 @@ normal-map` ([REVISIONS.md](./REVISIONS.md#normal-maps)).
406
406
  Called out separately because these are the most capable endpoints for level art
407
407
  and they are relevant to the disc-golf game. pixelkiln plans a top-down set
408
408
  at PixelLab's own quote (Pro 15 for tiles up to 32px, 25 at 64px; standard 4,
409
- the top of its quoted 1 to 4). Pro at 32px and the sidescroller are measured
410
- below; Pro at 64px and standard are not.
409
+ the top of its quoted 1 to 4). Every kind is measured below: Pro billed
410
+ exactly its quote at 32px and 64px, and standard billed 3, under the plan.
411
411
 
412
412
  `POST /tilesets` (top-down) and `/tilesets-sidescroller` are the current
413
413
  versions; `/create-tileset*` are the older aliases with identical schemas.
@@ -437,6 +437,32 @@ are the base tile ids, so set A's `upper` id sent as set B's
437
437
  `lower_base_tile_id` makes the two share that terrain. pixelkiln records them
438
438
  as `terrainIds` when it polls a set.
439
439
 
440
+ ### Pro at 64px, edge slope, and standard sets, measured
441
+
442
+ A second round on the same showcase project billed 46 generations in all
443
+ (balance 5055 to 5009), each set exactly as below:
444
+
445
+ - `lava-floor`: Pro, 64px, `terrainTransitionSize: 0.5`,
446
+ `terrainRaggedness: 0.4`, `terrainBoundaryAmplitude: 0.15`,
447
+ `terrainBoundarySeed: 3`, prompt `1). glowing lava texture 2). dark dungeon
448
+ stone floor texture 3). crumbling dungeon brick wall`. Billed **exactly
449
+ 25** and returned **25 tiles** covering **21** distinct corner
450
+ combinations, which confirms that Pro switches to the tall-wall layout at
451
+ 0.5, not only at 1, and that four tiles are corner twins. The third
452
+ description became the brick wall dropping into the lava.
453
+ - `swamp-marsh`: Pro, 32px, `terrainTransitionSize: 0.25`,
454
+ `terrainStepSlope: 1.5`, `terrainRaggedness: 0.8`. Billed **exactly 15**,
455
+ 16 tiles, with a ragged bank between the water and the marsh grass.
456
+ - `lake-grass` and `path-grass`: standard, 32px. Each billed **3**, under the
457
+ planned 4. `path-grass` used `connect: { upper: { of: "lake-grass",
458
+ terrain: "upper" } }`, sent `upper_base_tile_id`, and its recorded
459
+ `terrain_ids.upper` came back identical to `lake-grass`'s upper id. The
460
+ standard sets look flatter, with a hard edge, as PixelLab's tilesets
461
+ tutorial describes.
462
+
463
+ pixelkiln keeps connected sets in one style, and a style fixes
464
+ `terrainMode`, so a standard set cannot connect to a Pro set.
465
+
440
466
  ### Pro top-down and a connected pair, measured
441
467
 
442
468
  October 2026, through `pixelkiln gen` on the website's showcase project
@@ -12,7 +12,7 @@ account; [ENDPOINTS.md](./ENDPOINTS.md) contains the detailed experiments.
12
12
  | Exact fixed palette | `pixflux`, or `imagePro` for a larger or non-square canvas | 1 generation (`imagePro`: 10–25) | 1 inline image (`imagePro`: 1–64 by size) |
13
13
  | Candidate variety, richer rendering, future rotation/animation | `1dir` | 10–25 generations | 4–64 by size |
14
14
  | Ground tiles or connectable structural sets | `tiles` | 10–25 generations | variations or complete set |
15
- | Two-terrain Wang tileset for elevation (grass to water, floor to cliff), or a sidescroller platform set | `terrain` | Pro 15 at 32px and sidescroller 3 (measured); Pro 25 at 64px, standard plans at 4 (PixelLab's quotes) | 16 or 25 tiles |
15
+ | Two-terrain Wang tileset for elevation (grass to water, floor to cliff), or a sidescroller platform set | `terrain` | Pro 15 at 32px and sidescroller 3, Pro 25 at 64px, standard 3 (all measured; standard plans at 4) | 16 or 25 tiles |
16
16
  | Platform tileset for a sidescroller (stone body, grass top) | `terrain`, `terrainOrientation: "sidescroller"` | 3 generations | 16 tiles |
17
17
  | A single elevation tile — a raised mesa, a cliff block | `isometricTile` | 1 generation | 1 |
18
18
  | Larger or non-square scene or background, up to 792 wide and 688 tall | `imagePro` | 10–25 generations by canvas | 1–64 by size |
package/docs/MANIFEST.md CHANGED
@@ -155,7 +155,7 @@ One asset using the fields most projects reach for:
155
155
  | `terrainBoundarySeed` | `0` | `terrain`, with `terrainBoundaryAmplitude`. Which meander, an integer. |
156
156
  | `terrainStepSlope` | `0` | `terrain`, `pro` at `terrainTransitionSize` 0.25 only. 0 a cliff to 2 a gentle slope. |
157
157
  | `terrainConnectDiagonals` | `false` | `terrain`, `pro` only. Join the diagonal tiles' upper corners into one area. |
158
- | `terrainSpreadX` / `terrainSlopeSize` | | Deprecated: PixelLab ignores both. Still accepted. |
158
+ | `terrainSpreadX` / `terrainSlopeSize` | | Deprecated: PixelLab ignores both. Still accepted. Changing any `terrain*` field marks the set stale: the older ones (mode, transition size, view, shape style, raggedness, these two) and the descriptions as sent are recorded per lock entry as `terrainSettings` rather than hashed, compared as written (an explicit default counts as a change), and absent on sets generated before that record existed, which stay current. |
159
159
  | `mode` | `standard` | `character` only. `standard`, `v3`, `pro`, or `pro-flash`; see [Characters](./CHARACTERS.md). |
160
160
  | `directions` | `8` | `character` only. `4` or `8`; every engine but `standard` draws 8. |
161
161
  | `template` | `mannequin` | `character` only. Body template: `mannequin`, or `bear`, `cat`, `dog`, `horse`, `lion`; `custom` for `pro-flash`. |
package/docs/PIXELLAB.md CHANGED
@@ -71,7 +71,7 @@ unapproved files. See [Manifest quality profiles](./MANIFEST.md#quality-profiles
71
71
  | `pixflux` | You need a closed palette or a full-bleed background | 1 generation |
72
72
  | `1dir` | You need references or several candidates for human review | 10 to 25 generations |
73
73
  | `tiles` | You need ground variations or a connected structural set | 10 to 25 generations |
74
- | `terrain` | You need a two-terrain Wang tileset (grass to water, floor to cliff), sets that share a terrain, or a sidescroller platform set | Pro 15 at 32px and sidescroller 3 (measured); Pro 25 at 64px and standard up to 4 (PixelLab's quote) |
74
+ | `terrain` | You need a two-terrain Wang tileset (grass to water, floor to cliff), sets that share a terrain, or a sidescroller platform set | Pro 15 at 32px, 25 at 64px, standard 3, sidescroller 3 (all measured; standard plans at 4) |
75
75
  | `isometricTile` | You need one standalone isometric tile, 16 to 64px | 1 generation (measured once) |
76
76
  | `imagePro` | You need a larger or non-square scene, up to 792 wide and 688 tall, optionally held to the style's `palette` | 10 to 25 generations |
77
77
  | `imageProFlash` | You need a still on the Pro Flash model, optionally styled from one image, 16 to 256px | 5 to 9 generations (provisional quote) |
@@ -121,8 +121,9 @@ PixelLab 0.4.130 (October 2026) added four things. PixelKiln covers each:
121
121
  loop at 0.5 generations, and `pixelkiln normal-map` does it for a loose
122
122
  file. See [Controlled asset revisions](./REVISIONS.md#normal-maps).
123
123
 
124
- Each has been billed live and matched the plan: a Pro 32px set (15) and a
125
- second set connected to it (15), a sidescroller set (3), a 64×64 `imagePro`
124
+ Each has been billed live and matched the plan: Pro sets at 32px (15) and
125
+ 64px (25, 25 tiles at transition 0.5), a second set connected to the first
126
+ (15), standard sets (3 each), a sidescroller set (3), a 64×64 `imagePro`
126
127
  call with the Game Boy palette (10, every pixel one of its four colours), a
127
128
  lite described effect (1), and normal maps (0.5 each). The home page shows
128
129
  the results.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pixelkiln",
3
- "version": "0.89.1",
3
+ "version": "0.89.3",
4
4
  "description": "Manifest-driven pixel-art generation, review, recovery, and packaging with deterministic provenance.",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -84,6 +84,16 @@ and which tutorial(s) demonstrated real (not hypothetical) demand for it.
84
84
  15 up to 32px and 25 at 64px, standard 4 (the top of its quoted 1 to 4),
85
85
  sidescroller 3. What is still open is in
86
86
  [Pro tilesets](#pro-tilesets-what-is-left-after-04130) below.
87
+ - **Older terrain fields as identity.** `terrainMode`,
88
+ `terrainTransitionSize`, `terrainRaggedness`, `terrainShapeStyle`,
89
+ `terrainView`, the deprecated `terrainSpreadX`/`terrainSlopeSize`, and
90
+ the descriptions as sent (the prompt wrapped in the style's prefix and
91
+ suffix) never entered `specHash`, and hashing them would have made every
92
+ existing terrain entry stale at once. Closed without a migration: submit
93
+ records them on the entry as `terrainSettings` (kept through history and
94
+ `restore --generation`), and the plan marks a set stale naming each one
95
+ that changed. An entry from before the record has none and stays current
96
+ until it is next regenerated. The 0.4.130 fields stay hashed (when set).
87
97
  - **Pro-tier full-bleed background generation** (`generate-image-v2`, PixelLab's
88
98
  Pro image tier) at arbitrary custom aspect ratios (not just square) —
89
99
  already measured at 40 generations in `docs/ENDPOINTS.md`, but `pixflux`
@@ -444,11 +454,6 @@ connecting different tilesets") are now mostly covered; see the closed
444
454
  `/create-tileset-sidescroller` has no `mode` field, and its tile size is
445
455
  16 or 32. pixelkiln's sidescroller sets use whatever model that endpoint
446
456
  runs.
447
- - **Older terrain fields are not identity.** `terrainMode`,
448
- `terrainTransitionSize`, `terrainRaggedness`, `terrainShapeStyle`, and
449
- `terrainView` never entered `specHash`, so changing one does not mark a set stale. The 0.4.130 fields
450
- are hashed (when set). Hashing the older ones would make every existing
451
- terrain lock entry stale at once, so it needs a deliberate migration.
452
457
  - **Wall-continuation twins export as duplicates.** The 25-tile layout has
453
458
  21 distinct corner combinations. Four tiles share corners with a twin and
454
459
  differ only in `pattern_4x4`, which pixelkiln records but cannot express in
@@ -456,9 +461,12 @@ connecting different tilesets") are now mostly covered; see the closed
456
461
  - **Measured once:** a Pro 32px set billed exactly 15, and a second set
457
462
  connected to it through `lower_base_tile_id` billed exactly 15 and shared
458
463
  its sand (docs/ENDPOINTS.md). `terrainRoundness: 2` with
459
- `terrainConnectDiagonals` gave clean 45° edges. **Unexercised live:**
460
- Pro at 64px, standard sets, `upper_base_tile_id`, and the other shape
461
- controls. Sidescroller tile counts at transition
464
+ `terrainConnectDiagonals` gave clean 45° edges. A second round confirmed
465
+ Pro at 64px (exactly 25, and 25 tiles at transition 0.5), edge slope and
466
+ an uneven boundary (15 at 32px), standard sets (3 each, under the planned
467
+ 4), and connecting through `upper_base_tile_id`. **Still open:** a
468
+ standard set cannot connect to a Pro set, because connected sets share a
469
+ style and a style fixes the mode. Sidescroller tile counts at transition
462
470
  sizes other than 0.25 are assumed to be 16. The one sidescroller call
463
471
  returned `metadata.transition_size: 0.0` although 0.25 was sent.
464
472
  - **Prompting advice** lives in the skill reference: end each terrain on
@@ -24,7 +24,7 @@ providers, or before any PixelLab account operation.
24
24
  | `pixflux` | Closed palettes or full-bleed backgrounds up to 400×400 | 1 generation |
25
25
  | `1dir` | Reference-guided work or several candidates | 10–25 generations |
26
26
  | `tiles` | Ground variations or connected structures | 10–25 generations |
27
- | `terrain` | A two-terrain Wang tileset for elevation (grass-to-water, floor-to-cliff), or a sidescroller platform set | Sidescroller **3**, measured. Pro **15** at 32px, measured (a connected second set also billed 15). Pro 25 at 64px and standard 4 (quoted 1–4) are PixelLab's quotes |
27
+ | `terrain` | A two-terrain Wang tileset for elevation (grass-to-water, floor-to-cliff), or a sidescroller platform set | Sidescroller **3**, measured. Pro **15** at 32px, measured (a connected second set also billed 15). Pro **25** at 64px and standard **3** measured too; standard plans at 4, the top of PixelLab's quoted 1–4 |
28
28
  | `imagePro` | A larger or non-square background/scene, or real style transfer; takes the style `palette` as a hard constraint | **10–25 generations** by canvas (64px billed 10; a flat 40 before October 2026) |
29
29
  | `character` | A character in 4 or 8 directions, its poses (`state`), its loops (`animation`), bust `portrait`s, and `outfit` transfers onto a loop | 1 per standard base, 6 per pro-flash base at 64px (1 from a `reference`), 20–40 per pose or portrait, 1 per template loop per direction (2–4 as `skeleton-v3`), 20 per outfit (measured once) |
30
30
  | `objectPro` | A prop, creature, or vehicle that needs rotations, states, or loops but has no character rig | 6 per base at 64px (1 from a `reference`), **unmeasured**; assumed to match `character` pro-flash |
@@ -127,6 +127,16 @@ reads it:
127
127
  both now, so leave them out. Reference images, a forced palette, and the
128
128
  remaining tunables (`tileStrength`, `tilesetAdherence`) are not modeled.
129
129
 
130
+ Changing any terrain setting marks the set stale. The Pro shape controls
131
+ are in `specHash`; the older ones (`terrainMode`, `terrainTransitionSize`,
132
+ `terrainRaggedness`, `terrainShapeStyle`, `terrainView`, the deprecated
133
+ pair) and the style's `promptPrefix`/`promptSuffix` are recorded on the
134
+ lock entry as `terrainSettings` instead, and `plan` names the one that
135
+ changed ("terrainTransitionSize changed from 0.25 to 0.5"). A setting is
136
+ compared as written: adding `terrainMode: "standard"` to a style that left
137
+ it out is a change, even though it is the default. A set generated before
138
+ this record existed has none and stays current until it is regenerated.
139
+
130
140
  **Connected sets.** An asset's `connect` makes one of its terrains the very
131
141
  terrain of another set in the same style, so ocean, sand, and grass paint on
132
142
  one map: `"connect": { "lower": { "of": "coast", "terrain": "upper" } }` is
@@ -136,7 +146,8 @@ the next wave), PixelLab draws the shared terrain from its base tile, and
136
146
  regenerating the other set makes this one stale. Sharing a terrain makes it
137
147
  available, not blendable: two terrains with no set of their own between
138
148
  them still meet with a hard (in PixelLab's map tool, black) edge, so plan a
139
- set for every pair that touches.
149
+ set for every pair that touches. Connected sets share one style, and a style
150
+ fixes `terrainMode`, so a standard set cannot connect to a Pro one.
140
151
 
141
152
  **Sidescroller sets.** `terrainOrientation: "sidescroller"` switches to
142
153
  `/create-tileset-sidescroller`: a platform seen from the side. The prompt is