@mcptoolshop/style-dataset-lab 3.3.0 → 3.5.0
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/CHANGELOG.md +60 -0
- package/README.es.md +117 -55
- package/README.fr.md +125 -65
- package/README.hi.md +117 -68
- package/README.it.md +119 -58
- package/README.ja.md +124 -74
- package/README.md +73 -7
- package/README.pt-BR.md +128 -63
- package/README.zh.md +116 -65
- package/bin/sdlab.js +100 -4
- package/lib/adapters/ai-toolkit.js +224 -35
- package/lib/adapters/comfyui-runner.js +79 -26
- package/lib/adapters/comfyui-workflows.js +94 -11
- package/lib/adapters/diffusers-lora.js +37 -5
- package/lib/adapters/generic-image-caption.js +43 -5
- package/lib/args.js +16 -1
- package/lib/asset-ingest.js +575 -0
- package/lib/asset-masks.js +323 -0
- package/lib/asset-source.js +1176 -0
- package/lib/batch-modes.js +29 -8
- package/lib/batch-runs.js +29 -1
- package/lib/batch-sheet-render.js +13 -3
- package/lib/brief-compiler.js +19 -0
- package/lib/candidate-sheet.js +327 -0
- package/lib/canon-author.js +350 -0
- package/lib/canon-build/build.js +146 -93
- package/lib/canon-review-gate.js +205 -0
- package/lib/captions.js +57 -0
- package/lib/card.js +74 -2
- package/lib/colab-launcher-guards.js +285 -0
- package/lib/comfyui.js +116 -18
- package/lib/config.js +116 -12
- package/lib/critique-engine.js +36 -2
- package/lib/eligibility.js +121 -9
- package/lib/eval-pack.js +14 -14
- package/lib/eval-runs.js +33 -0
- package/lib/export.js +122 -34
- package/lib/freeze-gate.js +16 -3
- package/lib/freeze-stamp.js +28 -3
- package/lib/generated-provenance.js +194 -6
- package/lib/implementation-packs.js +95 -17
- package/lib/ingest.js +396 -0
- package/lib/judgment-provenance.js +220 -0
- package/lib/lane1-render.js +668 -0
- package/lib/measure.js +422 -0
- package/lib/memory-store.js +663 -0
- package/lib/model-licences.js +305 -0
- package/lib/npy-meta.js +130 -0
- package/lib/paths.js +196 -7
- package/lib/png-meta.js +512 -0
- package/lib/records.js +54 -8
- package/lib/reingest-selected.js +113 -17
- package/lib/reingest.js +27 -3
- package/lib/run-manifest.js +159 -25
- package/lib/run-summary.js +12 -6
- package/lib/runtime-runs.js +45 -4
- package/lib/snapshot.js +114 -15
- package/lib/split.js +364 -48
- package/lib/train-runs.js +214 -0
- package/lib/training-manifests.js +114 -21
- package/lib/training-packages.js +147 -15
- package/lib/verifier.js +3 -0
- package/lib/verify-chain.js +367 -0
- package/lib/workflow-profiles.js +24 -3
- package/package.json +4 -3
- package/runtime/comfyui/txt2img-qwen.json +38 -0
- package/runtime/comfyui/txt2img-standard.json +21 -0
- package/scripts/_resume.js +62 -0
- package/scripts/_shared-args.js +44 -0
- package/scripts/asset-ingest.js +160 -0
- package/scripts/brief-compile.js +2 -1
- package/scripts/brief-show.js +2 -1
- package/scripts/canon-bind.js +2 -2
- package/scripts/canon-build.js +27 -20
- package/scripts/canon-draft.js +82 -0
- package/scripts/canon-drift.js +16 -7
- package/scripts/canon-freeze-status.js +14 -6
- package/scripts/canon-freeze.js +31 -11
- package/scripts/canon-unfreeze.js +17 -9
- package/scripts/card.js +2 -2
- package/scripts/colab/REAL_SERVICE_ASSUMPTIONS.md +14 -0
- package/scripts/colab/ai-toolkit-override-py315.txt +45 -0
- package/scripts/colab/colab_window.sh +587 -0
- package/scripts/colab/lane1_render.py +970 -0
- package/scripts/colab/launch_guards.py +564 -0
- package/scripts/colab/launch_lane1_stub.sh +309 -0
- package/scripts/colab/launch_lane3_stub.sh +366 -0
- package/scripts/colab/remote_runner.py +59 -0
- package/scripts/compare.js +2 -2
- package/scripts/critique.js +16 -1
- package/scripts/curate.js +2 -2
- package/scripts/doctor.js +182 -55
- package/scripts/eligibility.js +42 -2
- package/scripts/eval-pack.js +2 -2
- package/scripts/eval-run.js +2 -2
- package/scripts/export.js +2 -2
- package/scripts/generate-controlnet.js +45 -25
- package/scripts/generate-identity.js +53 -23
- package/scripts/generate-ipadapter.js +44 -23
- package/scripts/generate.js +86 -17
- package/scripts/implementation-pack.js +2 -2
- package/scripts/ingest.js +145 -0
- package/scripts/init.js +73 -13
- package/scripts/measure.js +170 -0
- package/scripts/measure_image.py +458 -0
- package/scripts/migrate-records.js +142 -0
- package/scripts/painterly-test.js +4 -3
- package/scripts/painterly.js +7 -3
- package/scripts/qwen_generate.py +138 -20
- package/scripts/reingest.js +2 -2
- package/scripts/sheet.js +142 -0
- package/scripts/snapshot.js +2 -2
- package/scripts/split.js +2 -2
- package/scripts/training-manifest.js +2 -2
- package/scripts/training-package.js +2 -2
- package/scripts/training-profile.js +2 -2
- package/scripts/verify.js +67 -0
- package/scripts/workflow-list.js +2 -1
- package/scripts/workflow-show.js +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,66 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
## [3.5.0] - 2026-11-05
|
|
8
|
+
|
|
9
|
+
**Provenance you can prove, canon a model can draft but not decide, and the first Colab lanes.** Tests **791 → 926**.
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- **`sdlab asset ingest <dir>`** — the asset lane. Admits a 3D asset's re-rendered turnaround as provenance-carrying training data, against an `asset-source.json` contract (schema 1.3.0). Every declaration (channels, palette bands, gate thresholds, the acceptance verdict, the style register, how the renders came to exist) is proven against the actual bytes, and the whole ingest is refused on any violation. Records land uncurated with `provenance.source: "asset"`. Missing-but-optional declarations are reported as notices rather than failures. Contract: `docs/asset-lane-design.md`.
|
|
14
|
+
- **`sdlab verify --project <name>`** — walks the release provenance chain offline for each record: owner and CC-BY-4.0 licence on the record, the bound canon entry (by `canon_sha` and entry hash), the licence of every model and LoRA (SPDX id, licence URL, date read, and the file's sha256), and the workflow hash in the run manifest. A missing link fails.
|
|
15
|
+
- **`sdlab canon draft`** — a local model drafts canon entries and prompts through a loopback-only, OpenAI-compatible endpoint. Output is written with `status: "draft"`, `judgment: null`, and `drafted_by_model` / `author_model` on every path. Keys a model could use to pre-fill a ratification, judgment or status are stripped from its output.
|
|
16
|
+
- **Canon review gate and memory store.** The freeze gate refuses any model-drafted entry unless a person approved it, with a reason and the sha256 of the exact draft approved. A persistent memory store keeps every draft and decision, marking model authorship.
|
|
17
|
+
- **Run provenance in images.** Lane-1 renders stamp their generation provenance into PNG metadata. Training runs record what trained them (`lib/train-runs.js`), including Qwen LoRA support through ai-toolkit.
|
|
18
|
+
|
|
19
|
+
### Experimental
|
|
20
|
+
|
|
21
|
+
- **Colab launch kits** (`scripts/colab/`) for a lane-1 render and a lane-3 training step on your own Colab account. They pin every input by hash, check the real `colab` CLI contract, cap spend from your live balance (refusing to start if the balance can't be read), watch setup and run separately for stalls, and stop their own session on exit. **They have not yet completed a live window end to end.**
|
|
22
|
+
- The canon draft and review gate are complete, but no single command yet drives drafting, review and freeze together.
|
|
23
|
+
|
|
24
|
+
### Changed
|
|
25
|
+
|
|
26
|
+
- Every pull request now runs CI; pushes stay paths-gated. Coverage is uploaded to Codecov, and the repository carries an Atlas map checked in CI.
|
|
27
|
+
- The landing site moved to Astro 7.
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
|
|
31
|
+
- Updated `devalue` and `brace-expansion` to their patched releases.
|
|
32
|
+
- Removed home paths and an account handle from the tree.
|
|
33
|
+
|
|
34
|
+
## [3.4.0] - 2026-08-04
|
|
35
|
+
|
|
36
|
+
**Dogfood swarm.** A full health pass (bugs/security, then proactive hardening, then user-facing copy) followed by three new commands. Tests **400 → 791**. Every fix carries a test proven to fail against the unfixed code.
|
|
37
|
+
|
|
38
|
+
The through-line: this package had never been exercised outside its own repo checkout, where the workspace root and the package root happen to be the same directory. Most of what follows falls out of that.
|
|
39
|
+
|
|
40
|
+
### Added
|
|
41
|
+
|
|
42
|
+
- **`sdlab ingest <dir>`** — bring externally-generated images into a project as bare, uncurated candidate records. There was previously no path in: `reingest generated` requires a trained LoRA's manifest and `reingest selected` requires a selection only the production loop can mint. Records land with `judgment: null`, `canon: null` and `provenance.source: "external"` — it never invents a judgment, a score, or a caption.
|
|
43
|
+
- **`sdlab sheet [<dir>]`** — an HTML contact sheet over any directory of candidates, for visual triage before full-resolution review. Shows record id, curation status and prompt per tile; degrades to filename for images with no record yet. Images are referenced by relative path, so a 99-image sheet is ~110 KB and stays openable.
|
|
44
|
+
- **`sdlab measure <target>`** — deterministic palette and texture measurement attached to records as numbers. Ported from the validated salt-road audit instruments. **Measurement, not verdict**: it never sets `judgment` or `overall_fit`. Requires Python 3.9+ with Pillow/numpy/scipy; without them it fails with a clear structured error rather than degrading silently.
|
|
45
|
+
- **Judgment-provenance reporting** in `sdlab eligibility audit` — distinguishes judgments a person made from judgments a bulk script minted, read-only, without modifying any record.
|
|
46
|
+
- `--resume` on `generate:identity`, `generate:controlnet` and `generate:ipadapter`, including the seed-advances-on-skip discipline that makes a resumed run reproduce what an uninterrupted one would have produced.
|
|
47
|
+
|
|
48
|
+
### Fixed
|
|
49
|
+
|
|
50
|
+
- **`sdlab init` wrote user projects into `node_modules/`.** `REPO_ROOT` resolved from the module's own location, so for anyone installing from npm rather than cloning, every project — canon, records, judgments, snapshots, exports — landed inside the installed package, where the next `npm ci` silently destroyed it. Replaced with a workspace resolver (`SDLAB_ROOT` → walk up from cwd for `projects/` → module root if it is the checkout → cwd) that refuses any root inside `node_modules`. A separate package root now serves `templates/` and `runtime/`, which ship in the tarball and are not workspace content.
|
|
51
|
+
- **`--project` accepted a traversing value.** `--project ../../some-sibling-repo` resolved outside the sandbox and was accepted; ~26 scripts then wrote beneath it. `getProjectRoot()` now rejects separators and `..`, and every script routes through it.
|
|
52
|
+
- **`sdlab project doctor` printed a failure and exited 0** on a missing project — and `npm run verify` and the CI smoke step both gate on that exit code.
|
|
53
|
+
- **Subject leakage with an audit that certified it clean.** The split's subject-family fallback split one subject across two families (`_v1` suffix vs `v2` infix, case-sensitively), and the leakage audit re-read the same family map the assignment used, so it could not detect that class at all — while the dataset card printed "Subject leakage: None (verified)". Added an independent stem cross-check; the card now withholds "verified" unless both checks pass and the guessed-family share is immaterial. A split predating the cross-check now says so instead of claiming verification it never received.
|
|
54
|
+
- **`training-package build` produced an empty package and exited 0 on Windows** without Developer Mode: no symlink guard, and a bare `catch { continue; }` in all three adapters dropped image, caption and metadata row together.
|
|
55
|
+
- **`eval-run score` returned `overall_verdict: "pass"` for a missing eval pack** — `[].every()` is vacuously true, so a moved or deleted pack scored zero tasks as a pass.
|
|
56
|
+
- **Pinning parity between the JS and Python runners.** Float formatting diverged (`0.00005` vs `5e-05`), an explicit `null` LoRA weight defaulted differently, and the Python bridge hardcoded `sampler`/`scheduler`/`shift` **inside its own pinning receipt** — asserting values it never read.
|
|
57
|
+
- The freeze gate failed open on a malformed `status` (a capital `F` silently disabled protection). Captions fell back into curation metadata. `checksums.txt` was written and never verified. No `fetch` in the ComfyUI client carried a timeout. `--dry-run` created directories. `run generate` wrote its manifest only at the end, so an interrupted long run left no record at all and did not appear in `run list`.
|
|
58
|
+
- `migrate-records.js` was excluded from the npm tarball while still dispatched and documented — every npm user running `sdlab migrate` got `Cannot find module`. `runtime/` did not ship at all. 30 KB of Python bytecode did.
|
|
59
|
+
- Three scripts that fabricated curation rationales from a filename-prefix regex were deleted.
|
|
60
|
+
|
|
61
|
+
### Changed
|
|
62
|
+
|
|
63
|
+
- Error hints across `doctor`'s ~38 failure sites now carry a concrete next action, and `INPUT_UNKNOWN_PROJECT` names both causes (wrong directory vs missing project) rather than assuming the second.
|
|
64
|
+
- `sdlab critique` no longer presents its automatic `Next:` suggestion as a considered judgment when nothing has been reviewed — every candidate is stamped `usable` by default and nothing changes it, so the ranking was drift-count tiebreaking, not assessment.
|
|
65
|
+
- `sdlab init` scaffolds a per-project `.gitignore`; generated contact sheets and re-ingest staging images are ignored.
|
|
66
|
+
|
|
7
67
|
## [3.3.0] - 2026-07-06
|
|
8
68
|
|
|
9
69
|
**Provenance hardening.** This release closes the three weakest workflow-standards scores (PIN_PER_STEP, EXTERNAL_VERIFIER, UNCERTAINTY_GATED_HUMANS) so shipped, production LoRA work is byte-for-byte reproducible and the verifier/human-gate muscles are in place. No breaking changes — every new field is additive and optional; legacy manifests and records load unchanged.
|
package/README.es.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<a href="README.
|
|
2
|
+
<a href="README.zh.md">中文</a> | <a href="README.md">English</a> | <a href="README.fr.md">Français</a> | <a href="README.hi.md">हिन्दी</a> | <a href="README.it.md">Italiano</a> | <a href="README.pt-BR.md">Português (BR)</a>
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
<p align="center">
|
|
@@ -13,11 +13,11 @@
|
|
|
13
13
|
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue" alt="MIT License"></a>
|
|
14
14
|
</p>
|
|
15
15
|
|
|
16
|
-
Escribe tus reglas visuales. Genera arte. Evalúa cada imagen según esas reglas. Entrega los resultados como datos de entrenamiento auditables y
|
|
16
|
+
Escribe tus reglas visuales. Genera arte. Evalúa cada imagen según esas reglas. Entrega los resultados como datos de entrenamiento auditables y con versiones, y luego pon en funcionamiento los modelos entrenados en flujos de trabajo de producción reales y reintroduce las mejores salidas en tu corpus.
|
|
17
17
|
|
|
18
|
-
Style Dataset Lab conecta lo que
|
|
18
|
+
Style Dataset Lab conecta lo que escribiste sobre tu estilo artístico con el conjunto de datos del que realmente entrenas, y luego cierra el ciclo a lo largo de todo el proceso de producción. Defines una constitución: reglas de silueta, restricciones de paleta, lenguaje de materiales, lo que sea importante para tu proyecto. El flujo de trabajo genera candidatos, los evalúa según esas reglas y empaqueta el trabajo aprobado en conjuntos de datos reproducibles donde cada registro explica por qué se incluyó.
|
|
19
19
|
|
|
20
|
-
Luego, el entorno de trabajo de producción
|
|
20
|
+
Luego, el entorno de trabajo de producción se encarga de lo demás: compila resúmenes de generación a partir de la información del proyecto, ejecútalos a través de ComfyUI, evalúa las salidas, produce por lotes hojas de expresión y paneles de entorno, selecciona los mejores resultados y los vuelve a incorporar como nuevos candidatos. El ciclo se cierra: produce, selecciona, revisa, mejora.
|
|
21
21
|
|
|
22
22
|
## El flujo de trabajo
|
|
23
23
|
|
|
@@ -27,8 +27,15 @@ sdlab init my-project --domain character-design
|
|
|
27
27
|
|
|
28
28
|
# Generate candidates via ComfyUI, then review them
|
|
29
29
|
sdlab generate inputs/prompts/wave1.json --project my-project
|
|
30
|
+
sdlab sheet outputs/candidates --project my-project # HTML contact sheet to triage
|
|
30
31
|
sdlab curate <id> approved "Strong silhouette, correct faction palette"
|
|
31
32
|
|
|
33
|
+
# Already have images? Bring them in without generating anything
|
|
34
|
+
sdlab ingest ~/renders/wave1 --project my-project
|
|
35
|
+
|
|
36
|
+
# Measure what the pixels actually are — palette and texture, as numbers
|
|
37
|
+
sdlab measure outputs/candidates --project my-project
|
|
38
|
+
|
|
32
39
|
# Bind approved work to constitution rules
|
|
33
40
|
# (`sdlab bind` is a shorter alias for `canon-bind`)
|
|
34
41
|
sdlab canon-bind --project my-project
|
|
@@ -58,9 +65,56 @@ sdlab reingest selected --selection selection_2026-04-16_001
|
|
|
58
65
|
|
|
59
66
|
Ese último comando es el punto clave. Las salidas seleccionadas vuelven a pasar por el mismo proceso de revisión que todo lo demás. El corpus crece y las reglas se mantienen.
|
|
60
67
|
|
|
61
|
-
##
|
|
68
|
+
## La línea de activos: exportaciones 3D como datos de entrenamiento
|
|
69
|
+
|
|
70
|
+
`sdlab ingest` acepta las imágenes sin más. `sdlab asset ingest` requiere un **contrato**.
|
|
71
|
+
|
|
72
|
+
Cuando un activo 3D pasa su fase de aceptación, volver a renderizarlo desde N ángulos te proporciona una vista completa que es consistente *por diseño*, una propiedad que la difusión por vista no puede garantizar. La línea de activos admite esas exportaciones como datos de entrenamiento que llevan información de procedencia:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# Validate an export's manifest end to end, run the gates, write nothing
|
|
76
|
+
sdlab asset ingest ~/exports/dragon_dense --project my-project --dry-run
|
|
77
|
+
|
|
78
|
+
# Register it: records, candidates, masks, channels, receipt
|
|
79
|
+
sdlab asset ingest ~/exports/dragon_dense --project my-project
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
El directorio de exportación contiene un manifiesto `asset-source.json` (esquema **1.3.0**) que declara
|
|
83
|
+
sus canales, bandas de paleta, umbrales de aceptación, veredicto de aceptación, registro de estilo, cómo
|
|
84
|
+
se crearon los renders y su procedencia de generación. sdlab verifica cada declaración
|
|
85
|
+
frente a los bytes reales y rechaza la ingestión completa en caso de cualquier violación; nada se registra
|
|
86
|
+
si el manifiesto es incorrecto.
|
|
62
87
|
|
|
63
|
-
|
|
88
|
+
**La conexión:** sdlab proporciona el mecanismo, el activo proporciona la semántica. sdlab nunca realiza un trazado de rayos,
|
|
89
|
+
nunca renderiza y nunca aprende que un canal llamado "procedencia" es especial. Verifica,
|
|
90
|
+
mide, registra y empaqueta. El significado de los números permanece con el activo.
|
|
91
|
+
|
|
92
|
+
Lo que el contrato exige:
|
|
93
|
+
|
|
94
|
+
| etapa | lo que se verifica |
|
|
95
|
+
|---|---|
|
|
96
|
+
| **schema** | forma, identificadores, bandas de paleta bien formadas y un veredicto de aceptación que es literalmente `"accepted"` |
|
|
97
|
+
| **containment** | cada ruta de referencia se resuelve *dentro* del directorio de exportación (es una entrada no confiable) y existe |
|
|
98
|
+
| **encoding** | el IHDR de un PNG coincide con su codificación declarada; un encabezado NPY coincide con su dtype y forma declarados. Un manifiesto que "parece correcto" pero que no coincide con sus bytes es la clase de fallo que esta línea de activos está diseñada para evitar |
|
|
99
|
+
| **categorical** | los PNG indexados demuestran que PLTE ⊆ paleta declarada; los canales filtrados con `nearest` obtienen una decodificación de píxeles *exhaustiva*; los NPY categóricos obtienen un escaneo de valores exhaustivo |
|
|
100
|
+
| **gates** | la puerta de enlace de la paleta se ejecuta por cada render, a partir de las propias bandas y umbrales del manifiesto; un render fallido se rechaza de forma clara y se informa, nunca se admite en silencio |
|
|
101
|
+
|
|
102
|
+
Los registros se almacenan **sin curar** (`judgment: null`) con `provenance.source: "asset"`, llevando
|
|
103
|
+
el bloque de aceptación textualmente, hashes por archivo, cámara y orientación derivada, las mediciones de la puerta de enlace, el registro de estilo declarado y el fotograma de generación por imagen + semilla. Luego,
|
|
104
|
+
pasan por el mismo proceso de curación que cualquier otro registro.
|
|
105
|
+
|
|
106
|
+
La ingestión también informa sobre lo que un manifiesto *no* declara: un registro de estilo desconocido, una
|
|
107
|
+
`identity.subject_name` faltante, una procedencia de generación ausente, como **avisos** en lugar de
|
|
108
|
+
fallos. Se incluyen en el recibo e imprimen en la CLI. Una brecha de la que nadie está informado es una brecha
|
|
109
|
+
que nadie puede cerrar; y como un manifiesto puede *declarar* que sus renders son derivaciones deterministas sin una semilla propia, la línea de activos nunca informa sobre una brecha en una exportación que es
|
|
110
|
+
correcta.
|
|
111
|
+
|
|
112
|
+
Contrato completo, la escala de validación y el razonamiento detrás de cada campo:
|
|
113
|
+
[docs/asset-lane-design.md](docs/asset-lane-design.md).
|
|
114
|
+
|
|
115
|
+
## Autoría canónica
|
|
116
|
+
|
|
117
|
+
Antes de que se ejecute el flujo de trabajo del conjunto de datos, el espacio de nombres `sdlab canon *` convierte el almacén de entidades canónicas de tu proyecto en las tres proyecciones que realmente utilizan el entrenamiento y la producción, y bloquea las entradas que no deben cambiar.
|
|
64
118
|
|
|
65
119
|
```bash
|
|
66
120
|
# Build three projections from the canon entity store:
|
|
@@ -76,63 +130,65 @@ sdlab canon freeze kael_maren --project my-project --reason "prologue portrait l
|
|
|
76
130
|
sdlab canon drift --project my-project
|
|
77
131
|
```
|
|
78
132
|
|
|
79
|
-
|
|
133
|
+
Un modelo local también puede redactar el canon, pero nunca decide sobre él. `sdlab canon draft <class_id> --endpoint <url> --brief "<text>" --out <path>` solicita a un servidor de solo bucle, compatible con OpenAI, una entrada canónica y avisos, y los escribe con `status: "draft"`, `judgment: null` y el modelo de redacción estampados en cada salida. Un borrador no puede congelarse hasta que una persona lo ratifique: la puerta de enlace de congelación rechaza cualquier entrada redactada por un modelo sin la aprobación de un humano, una razón y el hash del borrador exacto que se aprobó.
|
|
80
134
|
|
|
81
|
-
|
|
135
|
+
`canon build` es direccionable por contenido: su salida se basa en una `canon_sha` y se almacena en caché, por lo que una reconstrucción del canon sin cambios se realiza instantáneamente. `canon freeze` da testimonio de cada congelación frente a una versión específica y se agrega a un registro de auditoría `freeze-events.jsonl`: las entradas `frozen` rechazan la regeneración por completo, las entradas `soft-advisory` la rechazan por defecto (se omite con `--i-know`). `canon drift` vuelve a calcular el hash de cada entrada observada y marca cualquier cosa que haya cambiado desde la última compilación limpia.
|
|
82
136
|
|
|
83
|
-
|
|
137
|
+
Flujo de trabajo completo en el manual: [Compilación del canon](handbook/canon-build/), [Congelación del canon](handbook/canon-freeze/) y [Apilamiento de dos LORA](handbook/two-lora-stacking/).
|
|
138
|
+
|
|
139
|
+
## Lo que produce
|
|
84
140
|
|
|
85
141
|
Siete artefactos del conjunto de datos y un entorno de trabajo de producción completo. Cada artefacto se vincula a sus predecesores para que puedas rastrear cualquier registro de entrenamiento hasta la regla que lo aprobó.
|
|
86
142
|
|
|
87
143
|
| Artefacto | Qué es |
|
|
88
144
|
|----------|-----------|
|
|
89
|
-
| **Snapshot** |
|
|
145
|
+
| **Snapshot** | Registro de selección congelado con huella digital de configuración. Cada inclusión tiene una razón explícita. |
|
|
90
146
|
| **Split** | Partición de entrenamiento/validación/prueba donde las familias de sujetos nunca cruzan los límites. |
|
|
91
147
|
| **Export package** | Conjunto de datos autónomo: manifiesto, metadatos, imágenes, divisiones, tarjeta del conjunto de datos, sumas de comprobación. |
|
|
92
|
-
| **Eval pack** | Tareas de prueba con conocimiento del canon: cobertura de
|
|
93
|
-
| **Training package** | Diseño listo para el entrenamiento
|
|
94
|
-
| **Eval scorecard** | Aprobación/rechazo por tarea
|
|
95
|
-
| **Implementation pack** | Ejemplos de indicaciones,
|
|
148
|
+
| **Eval pack** | Tareas de prueba con conocimiento del canon: cobertura de carril, deriva prohibida, ancla/oro, continuidad del sujeto. |
|
|
149
|
+
| **Training package** | Diseño listo para el entrenamiento mediante adaptadores (`diffusers-lora`, `generic-image-caption`). La misma verdad, diferente formato. |
|
|
150
|
+
| **Eval scorecard** | Aprobación/rechazo por tarea a partir de la evaluación de los resultados generados en comparación con los paquetes de evaluación. |
|
|
151
|
+
| **Implementation pack** | Ejemplos de indicaciones, fallos conocidos, pruebas de continuidad y guía para la reintroducción de datos. |
|
|
96
152
|
|
|
97
|
-
El entorno de trabajo de producción
|
|
153
|
+
El entorno de trabajo de producción añade:
|
|
98
154
|
|
|
99
155
|
| Superficie | Qué hace |
|
|
100
156
|
|---------|-------------|
|
|
101
|
-
| **Compiled brief** | Instrucción de generación determinista a partir del perfil del flujo de trabajo + la
|
|
102
|
-
| **Run** | Artefacto de ejecución congelado: resumen + semillas +
|
|
103
|
-
| **Critique** | Evaluación estructurada multidimensional de
|
|
104
|
-
| **Batch** | Producción coordinada en múltiples ranuras (hojas de expresión, paneles de entorno, paquetes de
|
|
105
|
-
| **Selection** | Artefacto de decisión creativa: qué
|
|
106
|
-
| **Re-ingest** |
|
|
157
|
+
| **Compiled brief** | Instrucción de generación determinista a partir del perfil del flujo de trabajo + la verdad del proyecto. |
|
|
158
|
+
| **Run** | Artefacto de ejecución congelado: resumen + semillas + resultados ComfyUI + manifiesto. |
|
|
159
|
+
| **Critique** | Evaluación estructurada multidimensional de los resultados de la ejecución en comparación con el canon. |
|
|
160
|
+
| **Batch** | Producción coordinada en múltiples ranuras (hojas de expresión, paneles de entorno, paquetes de siluetas). |
|
|
161
|
+
| **Selection** | Artefacto de decisión creativa: qué resultados se eligieron, por qué y de dónde provienen. |
|
|
162
|
+
| **Re-ingest** | Los resultados seleccionados se devuelven como registros candidatos con un historial completo de la generación. |
|
|
107
163
|
|
|
108
|
-
## Por qué existe
|
|
164
|
+
## Por qué esto existe
|
|
109
165
|
|
|
110
|
-
Los datos de entrenamiento son el artefacto
|
|
166
|
+
Los datos de entrenamiento son el artefacto de mayor utilidad en cualquier flujo de trabajo de IA visual. Pero la mayoría de los datos de entrenamiento son una carpeta de imágenes sin historial, sin rastro de evaluación y sin conexión con las reglas de estilo que se suponía que debían seguir.
|
|
111
167
|
|
|
112
|
-
Style Dataset Lab hace que la conexión sea explícita.
|
|
168
|
+
Style Dataset Lab hace que la conexión sea explícita. Su constitución define las reglas. Su rúbrica define las dimensiones de la evaluación. Sus registros de curación registran la evaluación. Su vinculación al canon demuestra la conexión. Y su conjunto de datos transmite todo eso como una verdad estructurada, consultable y reproducible.
|
|
113
169
|
|
|
114
|
-
El resultado práctico: cuando
|
|
170
|
+
El resultado práctico: cuando su LoRA se desvía, puede preguntar *por qué*. Cuando su próximo ciclo de entrenamiento necesita mejores datos, sabe exactamente qué registros están cerca de fallar y qué regla específica incumplieron. Cuando un nuevo miembro del equipo pregunta cuál es el lenguaje visual del proyecto, la respuesta no es un panel de Figma, sino una constitución consultable con 1182 ejemplos calificados.
|
|
115
171
|
|
|
116
172
|
## Probado en producción
|
|
117
173
|
|
|
118
|
-
|
|
174
|
+
Este no es un flujo de trabajo de demostración. Dos LoRAs de estilo reales se han implementado de principio a fin a través de él: el mismo ciclo de canon → curación → entrenamiento → implementación, en extremos opuestos del espectro de la curación.
|
|
119
175
|
|
|
120
|
-
- **[Tallow Fen](handbook/case-study-tallow-fen/)** (diseño de criaturas): un bestiario
|
|
121
|
-
- **[Rustline](handbook/case-study-rustline/)** (diseño
|
|
176
|
+
- **[Tallow Fen](handbook/case-study-tallow-fen/)** (diseño de criaturas): un canon de bestiario creado desde cero, **~34% de aprobación** en 293 registros seleccionados (169 rechazados: la puerta de entrada rechaza con dureza). Implementado `tallow_fen_style_v3.safetensors` @ 1.5 en `qwen-image`.
|
|
177
|
+
- **[Rustline](handbook/case-study-rustline/)** (diseño de conceptos): canon denso y preformado, **~96% de aprobación** en 180 registros. Implementado `rustline_v3ckpt_1500.safetensors` @ 1.0 en `qwen-image`, reutilizado posteriormente por un segundo proyecto.
|
|
122
178
|
|
|
123
|
-
|
|
179
|
+
El mismo flujo de trabajo, dos perfiles de producción: la puerta de entrada de la curación es real (rechaza con dureza los temas abiertos) y un canon disciplinado produce una alta tasa de aceptación.
|
|
124
180
|
|
|
125
181
|
## Cinco dominios, reglas reales
|
|
126
182
|
|
|
127
|
-
No son plantillas
|
|
183
|
+
No son plantillas de marcador de posición. Cada dominio se entrega con reglas de constitución de calidad de producción, definiciones de carriles, rúbricas de evaluación y vocabulario de grupo.
|
|
128
184
|
|
|
129
185
|
| Dominio | Carriles | Qué se evalúa |
|
|
130
186
|
|--------|-------|-----------------|
|
|
131
187
|
| **game-art** | personaje, entorno, accesorio, interfaz de usuario, nave, interior, equipo | Silueta a escala de juego, identificación de facción, desgaste y envejecimiento |
|
|
132
|
-
| **character-design** | retrato, cuerpo completo, rotación, hoja de expresión, pose de acción | Proporciones, lógica del
|
|
188
|
+
| **character-design** | retrato, cuerpo completo, rotación, hoja de expresión, pose de acción | Proporciones, lógica del vestuario, personalidad, claridad del gesto |
|
|
133
189
|
| **creature-design** | concepto, ortográfico, estudio de detalles, acción, referencia de escala, hábitat | Anatomía, lógica evolutiva, distinción de la silueta |
|
|
134
190
|
| **architecture** | exterior, interior, paisaje urbano, detalle estructural, ruina, paisaje | Estructura, consistencia del material, perspectiva, coherencia de la época |
|
|
135
|
-
| **vehicle-mech** | exterior, cabina, componente, esquema, hoja de silueta, variante de daño | Lógica mecánica, lenguaje de diseño, puntos de acceso, narrativa
|
|
191
|
+
| **vehicle-mech** | exterior, cabina, componente, esquema, hoja de silueta, variante de daño | Lógica mecánica, lenguaje de diseño, puntos de acceso, narrativa del daño |
|
|
136
192
|
|
|
137
193
|
## Estructura del proyecto
|
|
138
194
|
|
|
@@ -160,19 +216,23 @@ projects/my-project/
|
|
|
160
216
|
|
|
161
217
|
## Propiedades de confianza
|
|
162
218
|
|
|
163
|
-
Estas no son aspiracionales. Se aplican
|
|
219
|
+
Estas no son aspiracionales. Se aplican.
|
|
164
220
|
|
|
165
|
-
- **Las instantáneas son inmutables.** La huella digital de la configuración (SHA-256) demuestra que no se ha
|
|
166
|
-
- **
|
|
167
|
-
- **Los manifiestos son contratos congelados.**
|
|
168
|
-
- **Las ejecuciones fijan su gráfico exacto.** Cada generación registra `comfy_workflow_sha` +
|
|
169
|
-
- **Ningún modelo verifica su propia salida.** Los juicios registran `judged_by_model` y `generator_model`; se
|
|
170
|
-
- **
|
|
171
|
-
- **
|
|
221
|
+
- **Las instantáneas son inmutables.** La huella digital de la configuración (SHA-256) demuestra que no se ha realizado ningún cambio. Los ID se asignan de forma atómica, por lo que dos ejecuciones concurrentes no pueden intercalarse en un solo directorio.
|
|
222
|
+
- **Las divisiones evitan fugas de datos, y la comprobación que lo confirma es independiente.** Las familias de sujetos (por identidad, linaje o raíz de ID normalizada) nunca cruzan los límites de la partición, y una segunda comprobación vuelve a derivar la identidad del sujeto desde cero en lugar de volver a leer el mapa que utilizó la propia división. Una tarjeta de conjunto de datos solo afirma que "no hay fugas (verificado)" cuando ambas comprobaciones se han ejecutado y han tenido éxito; una división anterior a la segunda comprobación indica exactamente eso.
|
|
223
|
+
- **Los manifiestos son contratos congelados.** Hash de exportación + huella digital de la configuración, y `validate` vuelve a calcular el hash de cada archivo que enumera `checksums.txt`, por lo que reemplazar una imagen dentro de una exportación finalizada se detecta, incluso para los manifiestos creados antes de que existiera esa comprobación.
|
|
224
|
+
- **Las ejecuciones fijan su gráfico exacto.** Cada generación registra `comfy_workflow_sha` + hashes del contenido del modelo/LoRA + política de semillas, por lo que una iteración se puede reproducir byte por byte. Los ejecutores de JS y Python se ajustan a un hash idéntico en bytes mediante una prueba que inicia ambos. El hash del modelo es opcional (`--hash-models`) y nunca se fabrica; un archivo irresoluble registra `sha256: null` con una nota.
|
|
225
|
+
- **Ningún modelo verifica su propia salida.** Los juicios registran `judged_by_model` y `generator_model`; se genera una advertencia si alguna vez son el mismo modelo.
|
|
226
|
+
- **Un juicio indica quién lo realizó.** `eligibility audit` distingue los juicios escritos por una persona de los juicios generados por un script masivo, por lo que una justificación que describe una categoría en lugar de una imagen no puede considerarse como una curación.
|
|
227
|
+
- **La medición no es un veredicto.** `sdlab measure` adjunta números a un registro. Nunca establece un juicio, un ajuste o una aprobación, y cuando una medida no está definida para una imagen, registra `null` en lugar de un número plausible.
|
|
228
|
+
- **Una versión puede demostrar de dónde proviene cada imagen.** `sdlab verify --project <name>` recorre la cadena sin conexión para cada registro: el propietario y la licencia del registro, la entrada del canon a la que estaba vinculado (por hash), la licencia de cada modelo y LoRA que lo creó (ID de SPDX, URL de la licencia, la fecha en que se leyó y el hash del archivo), y el hash del flujo de trabajo en el manifiesto de la ejecución. Un enlace faltante hace que la comprobación falle en lugar de que se apruebe.
|
|
229
|
+
- **Los adaptadores no pueden modificar la verdad.** Diseño diferente, mismos registros. Sin adiciones, sin eliminaciones, sin reclasificaciones.
|
|
230
|
+
- **Las salidas generadas vuelven a entrar a través de la revisión.** Sin omisión. Curar y vincular como todo lo demás. Las imágenes generadas externamente entran de la misma manera a través de `sdlab ingest`, sin curar.
|
|
231
|
+
- **Los fallos son visibles.** Un registro faltante, una imagen que no se puede colocar o una leyenda que no se puede crear detiene una exportación o un paquete de entrenamiento en lugar de reducirlo silenciosamente.
|
|
172
232
|
|
|
173
233
|
## Star Freight
|
|
174
234
|
|
|
175
|
-
El repositorio incluye un ejemplo completo y funcional: 1.182 registros, 5 facciones, 7 rutas, 24 reglas de constitución, 892 activos aprobados, 2 perfiles de entrenamiento. Un canon visual de ciencia ficción con
|
|
235
|
+
El repositorio incluye un ejemplo completo y funcional: 1.182 registros, 5 facciones, 7 rutas, 24 reglas de constitución, 892 activos aprobados, 2 perfiles de entrenamiento. Un canon visual de ciencia ficción con un toque áspero, totalmente curado.
|
|
176
236
|
|
|
177
237
|
```bash
|
|
178
238
|
git clone https://github.com/mcp-tool-shop-org/style-dataset-lab
|
|
@@ -184,7 +244,7 @@ sdlab split build --project star-freight # zero subject leakage
|
|
|
184
244
|
|
|
185
245
|
## Formatos posteriores
|
|
186
246
|
|
|
187
|
-
`sdlab` es el propietario del conjunto de datos. La conversión de formato la gestiona [`repo-dataset`](https://github.com/mcp-tool-shop-org/repo-dataset): TRL, LLaVA, Qwen2-VL, JSONL, Parquet y más. `repo-dataset` renderiza; nunca decide
|
|
247
|
+
`sdlab` es el propietario del conjunto de datos. La conversión de formato la gestiona [`repo-dataset`](https://github.com/mcp-tool-shop-org/repo-dataset): TRL, LLaVA, Qwen2-VL, JSONL, Parquet y más. `repo-dataset` renderiza; nunca decide la inclusión.
|
|
188
248
|
|
|
189
249
|
## Instalación
|
|
190
250
|
|
|
@@ -196,7 +256,7 @@ Requiere Node.js 20+ y [ComfyUI](https://github.com/comfyanonymous/ComfyUI) en l
|
|
|
196
256
|
|
|
197
257
|
### Pruébalo sin ComfyUI
|
|
198
258
|
|
|
199
|
-
|
|
259
|
+
Puede explorar toda la superficie no relacionada con la generación (inspección, curación, instantánea, división, exportación) utilizando el proyecto Star Freight incluido sin instalar ComfyUI ni descargar ningún peso de SDXL.
|
|
200
260
|
|
|
201
261
|
```bash
|
|
202
262
|
# Scaffold a fresh project (no ComfyUI needed)
|
|
@@ -209,11 +269,11 @@ sdlab project doctor --project test
|
|
|
209
269
|
sdlab snapshot create --dry-run --project star-freight
|
|
210
270
|
```
|
|
211
271
|
|
|
212
|
-
`sdlab project doctor` valida cada configuración
|
|
272
|
+
`sdlab project doctor` valida cada configuración de proyecto (constitución, rutas, rúbrica, terminología) e informa sobre la elegibilidad sin tocar la GPU. Cualquier comando que modifique el estado generado acepta `--dry-run` para previsualizar el efecto primero.
|
|
213
273
|
|
|
214
|
-
Si olvidas `--project`, la CLI
|
|
274
|
+
Si olvidas `--project`, la CLI vuelve al primer proyecto que encuentra en `projects/` e imprime una advertencia; pasa `--project` explícitamente para silenciarla.
|
|
215
275
|
|
|
216
|
-
###
|
|
276
|
+
### Reanudación de una ejecución interrumpida
|
|
217
277
|
|
|
218
278
|
Las ejecuciones de generación largas se pueden reanudar sin rehacer el trabajo completado:
|
|
219
279
|
|
|
@@ -227,36 +287,38 @@ sdlab generate inputs/prompts/wave1.json --project my-project --resume
|
|
|
227
287
|
sdlab batch generate --resume batch_2026-04-22_001 --project my-project
|
|
228
288
|
```
|
|
229
289
|
|
|
230
|
-
Ambos comandos funcionan porque cada ranura escribe su entrada de manifiesto
|
|
290
|
+
Ambos comandos funcionan porque cada ranura escribe su entrada de manifiesto de forma atómica al finalizar; una falla a la mitad de la ejecución nunca corrompe el estado parcial.
|
|
231
291
|
|
|
232
292
|
## Solución de problemas
|
|
233
293
|
|
|
234
|
-
Modos de
|
|
294
|
+
Modos de falla comunes y soluciones:
|
|
235
295
|
|
|
236
296
|
**`ECONNREFUSED 127.0.0.1:8188` en cualquier `sdlab generate` / `sdlab run generate` / `sdlab batch generate`**
|
|
237
297
|
ComfyUI no se está ejecutando. Inicia ComfyUI (`python main.py --listen 127.0.0.1 --port 8188`) y confirma con `curl http://127.0.0.1:8188/system_stats`. Para apuntar a un host/puerto diferente, establece `COMFY_URL=http://host:port`.
|
|
238
298
|
|
|
239
299
|
**`missing checkpoint` / `LoRA weight not found`**
|
|
240
|
-
|
|
300
|
+
Tu perfil de flujo de trabajo nombra un archivo de modelo que no está en la carpeta `models/checkpoints/` o `models/loras/` de ComfyUI. Abre `projects/<project>/workflows/profiles/<profile>.json`, localiza el campo `checkpoint` o `lora` y, ya sea descarga el peso de referencia o cámbialo por uno que ya tengas. Vuelve a ejecutar `sdlab project doctor --project <project>` para confirmar la solución.
|
|
241
301
|
|
|
242
302
|
**Errores de `sdlab project doctor`**
|
|
243
303
|
Doctor devuelve códigos de error estructurados. Algunos comunes:
|
|
244
304
|
- `E_PROJECT_NOT_FOUND`: el directorio del proyecto no existe en `projects/`. Verifica la ortografía.
|
|
245
|
-
- `E_CONFIG_INVALID`: uno de los cinco archivos de configuración JSON
|
|
246
|
-
- `E_RECORD_DRIFT`: la huella digital de la configuración de un registro ya no coincide con su origen. Vuelve a curar o vuelve a vincular según lo que sugiera la
|
|
305
|
+
- `E_CONFIG_INVALID`: uno de los cinco archivos de configuración JSON no superó la validación del esquema. El campo `hint` indica el archivo y el campo incorrectos.
|
|
306
|
+
- `E_RECORD_DRIFT`: la huella digital de la configuración de un registro ya no coincide con su origen. Vuelve a curar o vuelve a vincular según lo que sugiera la indicación.
|
|
247
307
|
|
|
248
308
|
**`No --project specified, falling back to <name>`**
|
|
249
|
-
Una advertencia
|
|
309
|
+
Una advertencia suave. Pasa `--project <name>` explícitamente para seleccionar el proyecto correcto y silenciar la advertencia.
|
|
250
310
|
|
|
251
311
|
**Problemas de memoria VRAM / "Painterly"**
|
|
252
|
-
Consulta `docs/internal/HANDOFF.md` para obtener las notas
|
|
312
|
+
Consulta `docs/internal/HANDOFF.md` para obtener las notas de ajuste de la configuración de "painterly". En resumen: reduce la intensidad del ruido, reduce el tamaño del lote o cambia a un punto de control más pequeño en tu perfil de flujo de trabajo.
|
|
253
313
|
|
|
254
314
|
**Informar errores**
|
|
255
|
-
Crea un problema en https://github.com/mcp-tool-shop-org/style-dataset-lab/issues con tu versión de sdlab (`sdlab --version`),
|
|
315
|
+
Crea un problema en https://github.com/mcp-tool-shop-org/style-dataset-lab/issues con tu versión de sdlab (`sdlab --version`), versión de Node (`node -v`), el comando completo y la salida de error estructurada. Una plantilla de informe de errores rellena previamente los campos.
|
|
256
316
|
|
|
257
317
|
## Seguridad
|
|
258
318
|
|
|
259
|
-
|
|
319
|
+
Local por defecto. Sin telemetría, sin análisis y sin solicitudes externas desde la CLI de `sdlab`: las imágenes permanecen en tu GPU y sistema de archivos, y `canon draft` rechaza cualquier punto final que no sea de bucle local.
|
|
320
|
+
|
|
321
|
+
La única excepción es la opción de participación voluntaria. `scripts/colab/` contiene los kits de inicio para ejecutar un proceso de renderizado o un paso de entrenamiento LoRA en su propia cuenta de Google Colab. Solo cargan los archivos que usted indique, se ejecutan dentro de un límite de gasto que se lee del saldo actual de su cuenta de Colab y cierran su propia sesión al finalizar. Estos kits son **experimentales**: aún no han completado una prueba completa de principio a fin.
|
|
260
322
|
|
|
261
323
|
## Licencia
|
|
262
324
|
|