pixelkiln 0.20.0 → 0.20.2

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.
package/docs/AGENTS.md CHANGED
@@ -29,7 +29,8 @@ With the skill loaded, an agent should:
29
29
  5. Pass an explicit `--budget` within the amount the user authorized; use one
30
30
  `provider=amount` ceiling for every paid provider in a mixed run.
31
31
  6. Leave artwork selection in the local `pick` page unless the user gives a
32
- specific selection rule.
32
+ specific selection rule. Treat a ComfyUI frame set as one choice. Never keep
33
+ only its best-looking members.
33
34
  7. When a style declares `quality`, run manifest-mode `pixelkiln refine`; its
34
35
  `fixerPython` can pin the project-local interpreter. Leave
35
36
  approval to a named human reviewing the exact PNG, and require `refine check`
@@ -111,9 +111,15 @@ plan → submit → poll → pick (when needed) → fetch
111
111
  └──────── structural/inline outputs ────────┘
112
112
  ```
113
113
 
114
- Remote ids are saved immediately after submission. Generation and download
115
- failures remain separate, so paid work with a temporary CDN failure is
116
- recoverable at zero generation cost. Each stage can be rerun independently;
114
+ Remote ids are saved immediately after submission. Providers that need several
115
+ requests for one asset receive a checkpoint callback. Each accepted remote id
116
+ is written before the next request begins. An incomplete checkpoint remains
117
+ submit-actionable; a complete checkpoint is safe to poll even if the provider
118
+ is interrupted before returning. Checkpoints are reused only when provider,
119
+ generator, and resolved spec hash still match.
120
+
121
+ Generation and download failures remain separate, so paid work with a temporary
122
+ CDN failure is recoverable at zero generation cost. Each stage can be rerun independently;
117
123
  `gen` is only their everyday orchestration. Planning maps current `processing`,
118
124
  `review`, and `selected`/`download-failed` entries to `poll`, `pick`, and
119
125
  `fetch`, respectively.
@@ -200,6 +206,8 @@ uploads manifest-owned PNG/JPEG inputs by content hash, submits an input-bound
200
206
  clone, polls local history, and stores portable `comfyui://` output references
201
207
  so a lockfile does not retain a workstation hostname or input path. It supports
202
208
  `map` candidates and atomic `frames` sets from one still-image output node.
209
+ Each accepted frame prompt is checkpointed in the lockfile, so a retry resumes
210
+ at the first unsubmitted frame instead of queuing the whole set again.
203
211
  Frame-set transport, ordered review/fetch, shared-palette refinement,
204
212
  step/phase verification, approval, and packing have deterministic integration
205
213
  coverage. Live Apple MPS runs cover a small Stable
package/docs/CLI.md CHANGED
@@ -83,13 +83,17 @@ step. It does not run or approve that step on the user's behalf.
83
83
  Queue selected missing/stale generation work without polling it. Enforces the
84
84
  provider spacing and concurrency limits, validates estimates at the spending
85
85
  boundary, and saves each remote id immediately. Revision inputs are rechecked
86
- after any queue wait and before a provider request begins.
86
+ after any queue wait and before a provider request begins. For a provider that
87
+ needs several requests per asset, an unchanged incomplete checkpoint resumes
88
+ without repeating requests the provider already accepted.
87
89
 
88
90
  ### `poll`
89
91
 
90
92
  Advance submitted jobs to completed, failed, or selection-ready states. It can
91
93
  be rerun safely after an interrupted session. When work settles in another
92
94
  stage, the command prints the exact next command instead of ending silently.
95
+ An incomplete multi-request checkpoint stays blocked here; rerun `submit` to
96
+ finish it before polling.
93
97
 
94
98
  ### `pick`
95
99
 
@@ -97,8 +101,10 @@ Open the local candidate-review UI for jobs with alternatives. The page keeps
97
101
  native aspect ratios, uses exact integer zoom for small art, fits large work,
98
102
  and centers the decision surface on wide displays. A revision row shows its
99
103
  parent source beside the new candidates. A ComfyUI frame set appears as an
100
- animated ordered strip and is accepted or left unresolved as a unit. Arrow keys navigate, Enter
101
- selects, 1–9 choose directly, and 0 leaves a row unresolved. Only rows submitted
104
+ animated ordered strip and is accepted or left unresolved as a unit. Its preview
105
+ can be paused, starts paused when reduced motion is enabled, and stops while it
106
+ is offscreen. Arrow keys navigate, Enter selects, 1–9 choose directly, and 0
107
+ leaves a row unresolved. Only rows submitted
102
108
  with **Apply selections** are written to the lockfile. Closing the window applies
103
109
  nothing. See the [Getting started guide](GETTING_STARTED.md#start-a-new-project)
104
110
  for a screenshot of the interface.
package/docs/COMFYUI.md CHANGED
@@ -219,8 +219,12 @@ The frame count comes from the array, so it cannot disagree with a separate
219
219
  count field.
220
220
 
221
221
  PixelKiln submits one still workflow per value but tracks the result as one
222
- asset. A partial completion remains in progress. The review page shows an
223
- animated loop and ordered strip; accepting any frame accepts the whole set.
222
+ asset. After ComfyUI accepts a prompt, PixelKiln saves its id before submitting
223
+ the next frame. An interrupted retry continues at the first missing frame. A
224
+ changed spec starts a fresh set. Incomplete sets cannot be polled into review,
225
+ and one failed render rejects the complete set while retaining every submitted
226
+ prompt id for diagnosis. The review page shows an animated loop and ordered
227
+ strip; accepting any frame accepts the whole set.
224
228
  Fetch writes `hero-idle-frame-00.png`, `hero-idle-frame-01.png`, and so on.
225
229
  `pack` already turns those role-stable files into a sprite sheet and atlas.
226
230
 
@@ -627,8 +631,8 @@ that GPU time, electricity, hosted hardware, or model licenses are free.
627
631
 
628
632
  When `numImages` is greater than one, `pixelkiln pick` opens the same local
629
633
  candidate review used by hosted providers. A `frames` job always opens an
630
- ordered, animated whole-set review. The lockfile stores the ComfyUI
631
- prompt ID, output node, workflow hash, and selected output. Durable source
634
+ ordered, animated whole-set review. The lockfile stores every accepted ComfyUI
635
+ prompt id, the expected frame count, output node, workflow hash, and selected output. Durable source
632
636
  references use `comfyui://` rather than embedding a workstation hostname.
633
637
  `pixelkiln restore` first uses the validated local content cache, then resolves
634
638
  the portable reference against the current `COMFYUI_BASE_URL`.
package/docs/ENDPOINTS.md CHANGED
@@ -121,7 +121,7 @@ Measured on one 64×64 riso badge with an exact 4-colour palette
121
121
  | `resize` → 32px | 38 | 0.57 | cream+rust came back **gold** |
122
122
  | `image-to-pixelart` → 32px | **455** | **0.00** | opaque grey background |
123
123
 
124
- **`remove-background` is a de-fringe pass, not just a matte.** It removed the
124
+ **`remove-background` also de-fringes.** It removed the
125
125
  scattered sage-green speckles around the badge outline and left the three real
126
126
  inks untouched. Colour count went *down*, transparency went *up*. It is the one
127
127
  utility safe to run on palette-locked art.
@@ -148,8 +148,10 @@ packaging input.
148
148
 
149
149
  Keep a fixed seed for identity, or opt into a deterministic `seedStep`. Use a
150
150
  quality profile so every frame shares one palette and must agree on detected
151
- native grid step and phase. The review page animates the sequence and shows the
152
- ordered strip. After approval, `pack` emits the sprite sheet and stable
151
+ native grid step and phase. The review page animates the sequence, shows the
152
+ ordered strip, and lets the reviewer pause playback. It starts paused when the
153
+ system requests reduced motion and stops while it is offscreen. After approval,
154
+ `pack` emits the sprite sheet and stable
153
155
  `asset/frame-XX` atlas ids. See
154
156
  [Set up ComfyUI](./COMFYUI.md#generate-an-ordered-frame-set).
155
157
 
package/docs/LIBRARY.md CHANGED
@@ -57,8 +57,8 @@ and optional strength. Paths are excluded from the hash; input bytes are not.
57
57
 
58
58
  `resumeActions` groups current paid-work states into `poll`, `pick`, and
59
59
  `fetch`. It ignores stale specs and entries missing the remote id needed by
60
- their stage, so integrations can offer safe continuation without implying that
61
- a new submission is required.
60
+ their stage. It also excludes incomplete multi-request checkpoints; those
61
+ remain actionable in `buildPlan` and must return through `submit`.
62
62
 
63
63
  For custom orchestration, inspect the dependency gate directly:
64
64
 
@@ -284,6 +284,14 @@ every byte or scalar that can change provider output and must exclude
284
284
  machine-local paths or credentials. Providers that omit the hook fail closed
285
285
  when an asset declares non-empty `providerInputs`.
286
286
 
287
+ `Provider.submit` receives an optional third `SubmitContext` argument. A custom
288
+ provider that needs several remote mutations for one asset should call
289
+ `await context.checkpoint({ jobId, metadata, complete })` after each accepted
290
+ mutation and before starting the next one. PixelKiln persists that checkpoint
291
+ atomically. On an unchanged retry, `previousJobId` and `previousMetadata` let
292
+ the provider continue from the first missing request. Set `complete: true` only
293
+ when the returned job id is safe to poll as the complete asset.
294
+
287
295
  These low-level operations intentionally accept one provider. A mixed-provider
288
296
  caller should partition specs and plan items by `spec.provider`, instantiate
289
297
  each adapter independently, and preserve the provider recorded on a lock entry
package/docs/RECOVERY.md CHANGED
@@ -23,7 +23,8 @@ Use the lock state rather than guessing which stage to rerun:
23
23
 
24
24
  | State | Safe next command |
25
25
  |---|---|
26
- | `pending` or `processing` | `pixelkiln poll` |
26
+ | incomplete submission checkpoint | `pixelkiln submit` |
27
+ | complete `pending` or `processing` submission | `pixelkiln poll` |
27
28
  | `review` | `pixelkiln pick` |
28
29
  | `selected` or `download-failed` | `pixelkiln fetch` |
29
30
  | downloaded output is missing | `pixelkiln restore` |
@@ -36,6 +37,14 @@ still refused; after inspecting it, `pixelkiln fetch --force` explicitly lets
36
37
  the new result take ownership. This also recovers interrupted jobs created by
37
38
  older PixelKiln versions that could not retain the prior output hash.
38
39
 
40
+ ComfyUI frame sets submit one prompt per frame. PixelKiln saves the compound
41
+ job after every accepted prompt, before asking ComfyUI to queue the next one.
42
+ If submission stops halfway through, `plan` reports the saved checkpoint and
43
+ `pixelkiln submit` continues at the first missing frame. `poll` will not advance
44
+ an incomplete set into review. A changed prompt, workflow, input image, seed
45
+ schedule, or other spec identity starts a fresh set instead of appending to old
46
+ prompt ids.
47
+
39
48
  Provider adapters should keep expiring signed result URLs transient and store a
40
49
  provider-neutral reference that can refresh them. Once ingestion succeeds,
41
50
  PixelKiln removes credential-bearing URLs, inline data URLs, and local file URLs
package/docs/REVISIONS.md CHANGED
@@ -66,8 +66,8 @@ An inpaint revision also declares a manifest-relative mask:
66
66
  ```
67
67
 
68
68
  The mask must be a readable PNG. When the parent exists during planning, the
69
- mask must have the same dimensions. Mask meaning—white edits or black
70
- edits—belongs to the ComfyUI graph, so test the graph in ComfyUI before running
69
+ mask must have the same dimensions. The ComfyUI graph decides whether white or
70
+ black pixels mark edits, so test the graph in ComfyUI before running
71
71
  it through PixelKiln. The mask bytes and parent bytes both participate in the
72
72
  child spec hash.
73
73
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pixelkiln",
3
- "version": "0.20.0",
3
+ "version": "0.20.2",
4
4
  "description": "Manifest-driven pixel-art generation, review, recovery, and packaging with deterministic provenance.",
5
5
  "type": "module",
6
6
  "sideEffects": false,