@mcptoolshop/style-dataset-lab 3.2.0 → 3.4.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.
Files changed (95) hide show
  1. package/CHANGELOG.md +58 -1
  2. package/README.es.md +40 -19
  3. package/README.fr.md +74 -53
  4. package/README.hi.md +67 -46
  5. package/README.it.md +42 -21
  6. package/README.ja.md +44 -23
  7. package/README.md +25 -4
  8. package/README.pt-BR.md +42 -21
  9. package/README.zh.md +66 -45
  10. package/bin/sdlab.js +51 -4
  11. package/lib/adapters/ai-toolkit.js +37 -5
  12. package/lib/adapters/comfyui-runner.js +114 -27
  13. package/lib/adapters/comfyui-workflows.js +10 -2
  14. package/lib/adapters/diffusers-lora.js +37 -5
  15. package/lib/adapters/generic-image-caption.js +43 -5
  16. package/lib/args.js +16 -1
  17. package/lib/batch-modes.js +29 -8
  18. package/lib/batch-runs.js +29 -1
  19. package/lib/batch-sheet-render.js +13 -3
  20. package/lib/brief-compiler.js +19 -0
  21. package/lib/candidate-sheet.js +327 -0
  22. package/lib/canon-build/build.js +146 -93
  23. package/lib/captions.js +57 -0
  24. package/lib/card.js +74 -2
  25. package/lib/comfyui.js +116 -18
  26. package/lib/config.js +116 -12
  27. package/lib/critique-engine.js +82 -3
  28. package/lib/critique-render.js +45 -0
  29. package/lib/eligibility.js +121 -9
  30. package/lib/eval-pack.js +14 -14
  31. package/lib/eval-runs.js +33 -0
  32. package/lib/export.js +122 -34
  33. package/lib/freeze-gate.js +69 -16
  34. package/lib/freeze-stamp.js +28 -3
  35. package/lib/generated-provenance.js +16 -1
  36. package/lib/implementation-packs.js +95 -17
  37. package/lib/ingest.js +396 -0
  38. package/lib/judgment-provenance.js +220 -0
  39. package/lib/measure.js +422 -0
  40. package/lib/paths.js +196 -7
  41. package/lib/reingest-selected.js +98 -16
  42. package/lib/run-manifest.js +394 -0
  43. package/lib/run-summary.js +12 -6
  44. package/lib/runtime-runs.js +45 -4
  45. package/lib/snapshot.js +121 -16
  46. package/lib/split.js +364 -48
  47. package/lib/training-manifests.js +114 -21
  48. package/lib/training-packages.js +147 -15
  49. package/lib/verifier.js +67 -0
  50. package/lib/workflow-profiles.js +24 -3
  51. package/package.json +3 -2
  52. package/runtime/comfyui/txt2img-qwen.json +38 -0
  53. package/runtime/comfyui/txt2img-standard.json +21 -0
  54. package/scripts/_resume.js +62 -0
  55. package/scripts/_shared-args.js +44 -0
  56. package/scripts/brief-compile.js +2 -1
  57. package/scripts/brief-show.js +2 -1
  58. package/scripts/canon-bind.js +2 -2
  59. package/scripts/canon-build.js +27 -20
  60. package/scripts/canon-drift.js +16 -7
  61. package/scripts/canon-freeze-status.js +14 -6
  62. package/scripts/canon-freeze.js +27 -11
  63. package/scripts/canon-unfreeze.js +17 -9
  64. package/scripts/card.js +2 -2
  65. package/scripts/compare.js +2 -2
  66. package/scripts/critique.js +48 -8
  67. package/scripts/curate.js +23 -2
  68. package/scripts/doctor.js +181 -55
  69. package/scripts/eligibility.js +42 -2
  70. package/scripts/eval-pack.js +2 -2
  71. package/scripts/eval-run.js +2 -2
  72. package/scripts/export.js +2 -2
  73. package/scripts/generate-controlnet.js +45 -25
  74. package/scripts/generate-identity.js +53 -23
  75. package/scripts/generate-ipadapter.js +44 -23
  76. package/scripts/generate.js +72 -5
  77. package/scripts/implementation-pack.js +2 -2
  78. package/scripts/ingest.js +145 -0
  79. package/scripts/init.js +73 -13
  80. package/scripts/measure.js +170 -0
  81. package/scripts/measure_image.py +458 -0
  82. package/scripts/migrate-records.js +142 -0
  83. package/scripts/painterly-test.js +4 -3
  84. package/scripts/painterly.js +7 -3
  85. package/scripts/qwen_generate.py +334 -13
  86. package/scripts/reingest.js +2 -2
  87. package/scripts/run-generate.js +3 -0
  88. package/scripts/sheet.js +142 -0
  89. package/scripts/snapshot.js +2 -2
  90. package/scripts/split.js +2 -2
  91. package/scripts/training-manifest.js +2 -2
  92. package/scripts/training-package.js +2 -2
  93. package/scripts/training-profile.js +2 -2
  94. package/scripts/workflow-list.js +2 -1
  95. package/scripts/workflow-show.js +2 -1
package/CHANGELOG.md CHANGED
@@ -4,7 +4,64 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  ## Unreleased
6
6
 
7
- ## [3.2.0] - 2026-07-06
7
+ ## [3.4.0] - 2026-08-04
8
+
9
+ **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.
10
+
11
+ 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.
12
+
13
+ ### Added
14
+
15
+ - **`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.
16
+ - **`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.
17
+ - **`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.
18
+ - **Judgment-provenance reporting** in `sdlab eligibility audit` — distinguishes judgments a person made from judgments a bulk script minted, read-only, without modifying any record.
19
+ - `--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.
20
+
21
+ ### Fixed
22
+
23
+ - **`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.
24
+ - **`--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.
25
+ - **`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.
26
+ - **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.
27
+ - **`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.
28
+ - **`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.
29
+ - **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.
30
+ - 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`.
31
+ - `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.
32
+ - Three scripts that fabricated curation rationales from a filename-prefix regex were deleted.
33
+
34
+ ### Changed
35
+
36
+ - 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.
37
+ - `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.
38
+ - `sdlab init` scaffolds a per-project `.gitignore`; generated contact sheets and re-ingest staging images are ignored.
39
+
40
+ ## [3.3.0] - 2026-07-06
41
+
42
+ **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.
43
+
44
+ ### Added
45
+
46
+ - **PIN_PER_STEP — run-manifest pinning contract** (`lib/run-manifest.js`, the single source of truth): every generation writer now records a `pinning` block so a wave is byte-for-byte replayable —
47
+ - **`comfy_workflow_sha`** — SHA-256 of the exact ComfyUI graph submitted (per-item seed + prompt normalized out, so one hash pins the whole wave's pipeline skeleton). The JS runners (`generate.js`, `comfyui-runner.js`) and the Python bridge (`scripts/qwen_generate.py`) produce a **byte-identical** hash for the same graph.
48
+ - **Model + LoRA content identity** — `unet`/`clip`/`vae`/`checkpoint` and each LoRA upgraded from a bare filename to `{name, size_bytes, sha256}`. `sha256` is opt-in via `--hash-models` (best-effort, resolved under the ComfyUI models dir, cached by `(name, size, mtime)` so multi-GB checkpoints aren't re-hashed every wave); `size_bytes` is always recorded when the file resolves. Unresolvable files record `sha256: null` with a `hash_note` — a hash is never fabricated.
49
+ - **`seed_policy`** — records the intent behind seed selection (`base+increment`, `explicit-per-item`, `fixed`, `random`), not just the values.
50
+ - New `--hash-models` flag on `sdlab generate` and `sdlab run generate` (and `scripts/qwen_generate.py`).
51
+ - **EXTERNAL_VERIFIER — judge/generator provenance** (`lib/verifier.js`): curate and critique records now carry **`judged_by_model`** (`human` / `rule-based:sdlab-critique-v1`) and **`generator_model`** (derived as `<base>:<model>`, e.g. `qwen-image:qwen_image_fp8_e4m3fn`), and a **WARN fires when the two are the same model** — the self-verification failure mode. (Today's rule-based critique engine is a different artifact class from the generator, so the warning does not fire; the fields + warning install the muscle for when an LLM critique mode enters the loop.)
52
+ - **UNCERTAINTY_GATED_HUMANS —**
53
+ - **`sdlab critique --triage`** surfaces only the candidates that need a human — `off-model` OR ≥ `--drift-threshold` (default 3) drift issues — so attention gates on uncertainty rather than on every item. The full `critique.json` is unchanged; triage is a view over it.
54
+ - **Contrastive freeze-gate refusals** — the freeze bypass prompt now leads with the default action and the system's reasoning (`Default: REFUSE — "<id>" is <status> frozen by <by> on <date>, reason: "<why>". Override with --i-know --reason ONLY if your change does not touch the watched fields [...]`), and `curate <id> borderline` prints a contrastive HOLD advisory.
55
+
56
+ ### Changed
57
+
58
+ - **Manifest `SCHEMA_VERSION` 2.2.0 → 2.3.0** — the ComfyUI run manifest now stamps `schema_version` and carries the `pinning` block. Readers still `checkManifestVersion()`-warn (never throw) on mismatch, so pre-3.3.0 manifests load fine.
59
+
60
+ ### Tests & coverage
61
+
62
+ - **400 tests, 0 failing** (368 → 400: +32 for pinning, verifier fields, triage, and contrastive freeze wording). Coverage: statements **63.53%** / branches **75.77%** / functions **69.04%**.
63
+
64
+
8
65
 
9
66
  The **canon authoring** release. A new `sdlab canon *` namespace turns a project's canon entity store into the projections training actually consumes, and wraps a witness-backed freeze spine around entries that must not drift — plus first-class Flux and Qwen-Image training paths.
10
67
 
package/README.es.md CHANGED
@@ -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
@@ -60,7 +67,7 @@ Ese último comando es el punto clave. Las salidas seleccionadas vuelven a pasar
60
67
 
61
68
  ## Creación del canon
62
69
 
63
- 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 del canon de tu proyecto en los tres proyecciones que realmente utiliza el entrenamiento y la producción, y bloquea las entradas que no deben modificarse.
70
+ Before the dataset pipeline runs, the `sdlab canon *` namespace turns your project's canon entity store into the three projections training and production actually consume — and locks the entries that must not drift.
64
71
 
65
72
  ```bash
66
73
  # Build three projections from the canon entity store:
@@ -76,7 +83,7 @@ sdlab canon freeze kael_maren --project my-project --reason "prologue portrait l
76
83
  sdlab canon drift --project my-project
77
84
  ```
78
85
 
79
- `canon build` es direccionable por contenido: su salida se identifica mediante un `canon_sha` y se almacena en caché, de modo que una reconstrucción del canon sin cambios se realiza instantáneamente. `canon freeze` registra cada congelación frente a una compilación específica y la agrega a un registro de auditoría `freeze-events.jsonl`: las entradas `frozen` rechazan explícitamente la regeneración, las entradas `soft-advisory` la rechazan por defecto (se puede omitir 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.
86
+ `canon build` es direccionable por contenido: su resultado se basa en un `canon_sha` y se almacena en caché, de modo que una versión sin cambios se vuelve a generar instantáneamente. `canon freeze` registra cada estado congelado con respecto a una versión específica y lo 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 de forma predeterminada (se puede omitir con `--i-know`). `canon drift` recalcula el hash de cada entrada supervisada y marca todo lo que haya cambiado desde la última compilación limpia.
80
87
 
81
88
  Flujo de trabajo completo en el manual: [Canon build](handbook/canon-build/), [Canon freeze](handbook/canon-freeze/) y [Two-LoRA stacking](handbook/two-lora-stacking/).
82
89
 
@@ -90,7 +97,7 @@ Siete artefactos del conjunto de datos y un entorno de trabajo de producción co
90
97
  | **Split** | Partición de entrenamiento/validación/prueba donde las familias de sujetos nunca cruzan los límites. |
91
98
  | **Export package** | Conjunto de datos autónomo: manifiesto, metadatos, imágenes, divisiones, tarjeta del conjunto de datos, sumas de comprobación. |
92
99
  | **Eval pack** | Tareas de prueba con conocimiento del canon: cobertura de carriles, desviación prohibida, ancla/oro, continuidad del sujeto. |
93
- | **Training package** | Diseño listo para el entrenamiento a través de adaptadores (`diffusers-lora`, `generic-image-caption`). La misma información, diferente formato. |
100
+ | **Training package** | Diseño listo para entrenar mediante adaptadores (`diffusers-lora`, `generic-image-caption`). La misma información, diferente formato. |
94
101
  | **Eval scorecard** | Aprobación/rechazo por tarea basada en la evaluación de las salidas generadas con respecto a los paquetes de evaluación. |
95
102
  | **Implementation pack** | Ejemplos de indicaciones, fallas conocidas, pruebas de continuidad y orientación para volver a introducir datos. |
96
103
 
@@ -113,6 +120,15 @@ Style Dataset Lab hace que la conexión sea explícita. Tu constitución define
113
120
 
114
121
  El resultado práctico: cuando tu LoRA se desvía, puedes preguntar *por qué*. Cuando tu próxima ronda de entrenamiento necesita mejores datos, sabes exactamente qué registros son casi correctos y cuál es la única regla que no cumplieron. 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
122
 
123
+ ## Probado en producción
124
+
125
+ Este no es un flujo de trabajo de demostración. Dos LoRA de estilo reales se han implementado por completo: el mismo ciclo de canon → curación → entrenamiento → implementación, en extremos opuestos del espectro de la curación.
126
+
127
+ - **[Tallow Fen](handbook/case-study-tallow-fen/)** (diseño de criaturas): un canon de bestiario creado desde cero, con aproximadamente el **34% de aprobación** en 293 registros seleccionados (169 rechazados: la puerta de entrada rechaza con firmeza). Implementado `tallow_fen_style_v3.safetensors` @ 1.5 en `qwen-image`.
128
+ - **[Rustline](handbook/case-study-rustline/)** (diseño conceptual): canon denso y preformado, con aproximadamente el **96% de aprobación** en 180 registros. Implementado `rustline_v3ckpt_1500.safetensors` @ 1.0 en `qwen-image`, reutilizado posteriormente por un segundo proyecto.
129
+
130
+ El mismo flujo de trabajo, dos perfiles de producción: la puerta de entrada de la curación es real (rechaza con firmeza los temas abiertos) y un canon disciplinado produce una alta tasa de aceptación.
131
+
116
132
  ## Cinco dominios, reglas reales
117
133
 
118
134
  No son plantillas genéricas. Cada dominio se entrega con reglas de constitución de grado de producción, definiciones de carriles, rúbricas de puntuación y vocabulario de grupo.
@@ -153,11 +169,16 @@ projects/my-project/
153
169
 
154
170
  Estas no son aspiracionales. Se aplican rigurosamente.
155
171
 
156
- - **Las instantáneas son inmutables.** La huella digital de la configuración (SHA-256) demuestra que nada ha cambiado.
157
- - **Las divisiones evitan fugas.** Las familias de sujetos (por identidad, linaje o sufijo de ID) nunca cruzan los límites de las particiones.
158
- - **Los manifiestos son contratos congelados.** Hash de exportación + huella digital de la configuración. Si algo cambia, cree uno nuevo.
159
- - **Los adaptadores no pueden modificar la verdad.** Diseño diferente, mismos registros. Sin adiciones, sin eliminaciones, sin reclasificaciones.
160
- - **Las salidas generadas vuelven a entrar mediante revisión.** No hay atajos. Curar y vincular como todo lo demás.
172
+ - **Las instantáneas son inmutables.** La huella digital de la configuración (SHA-256) demuestra que no se ha cambiado nada. Los ID se asignan atómicamente, por lo que dos ejecuciones simultáneas no pueden intercalarse en un solo directorio.
173
+ - **Las divisiones evitan fugas 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 las particiones, 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 "fugas: ninguna (verificado)" cuando ambas comprobaciones se han ejecutado y superado; una división anterior a la segunda comprobación indica exactamente eso.
174
+ - **Los manifiestos son contratos congelados.** Hash de exportación + huella digital de 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.
175
+ - **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 ola puede reproducirse byte por byte. Los ejecutores de JS y Python se mantienen con un hash idéntico mediante una prueba que los inicia a ambos. El hashing del modelo es opcional (`--hash-models`) y nunca se fabrica: un archivo irresoluble registra `sha256: null` con una nota.
176
+ - **Ningún modelo verifica su propia salida.** Los juicios registran `judged_by_model` y `generator_model`; se activa una advertencia si alguna vez son el mismo modelo.
177
+ - **Un juicio indica quién lo realizó.** `eligibility audit` distingue los juicios que escribió una persona de los juicios que generó un script masivo, por lo que una justificación que describe una categoría en lugar de una imagen no puede considerarse como curación.
178
+ - **La medición no es el 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.
179
+ - **Los adaptadores no pueden modificar la información.** Diferente diseño, los mismos registros. Sin adiciones, sin eliminaciones, sin reclasificaciones.
180
+ - **Las salidas generadas vuelven a entrar a través de la revisión.** No hay 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.
181
+ - **Los errores son visibles.** Un registro faltante, una imagen que no se puede colocar o un título que no se puede construir detiene una exportación o un paquete de entrenamiento en lugar de reducirlo silenciosamente.
161
182
 
162
183
  ## Star Freight
163
184
 
@@ -173,7 +194,7 @@ sdlab split build --project star-freight # zero subject leakage
173
194
 
174
195
  ## Formatos posteriores
175
196
 
176
- `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 qué incluir.
197
+ `sdlab` es 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.
177
198
 
178
199
  ## Instalación
179
200
 
@@ -198,9 +219,9 @@ sdlab project doctor --project test
198
219
  sdlab snapshot create --dry-run --project star-freight
199
220
  ```
200
221
 
201
- `sdlab project doctor` valida cada configuración del 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.
222
+ `sdlab project doctor` validates every project config (constitution, lanes, rubric, terminology) and reports eligibility without touching the GPU. Any command that mutates generated state accepts `--dry-run` to preview the effect first.
202
223
 
203
- Si olvidas `--project`, la CLI recurre al primer proyecto que encuentra en `projects/` e imprime una advertencia; pasa `--project` explícitamente para silenciarla.
224
+ Si olvidas `--project`, la CLI recurre al primer proyecto que encuentra debajo de `projects/` e imprime una advertencia: pasa `--project` explícitamente para silenciarla.
204
225
 
205
226
  ### Reanudando una ejecución interrumpida
206
227
 
@@ -226,22 +247,22 @@ Modos de fallo comunes y soluciones:
226
247
  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`.
227
248
 
228
249
  **`missing checkpoint` / `LoRA weight not found`**
229
- El perfil de flujo de trabajo especifica 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 referenciado o cámbialo por uno que ya tengas. Vuelve a ejecutar `sdlab project doctor --project <project>` para confirmar la solución.
250
+ El nombre de tu perfil de flujo de trabajo especifica 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 descarga el peso referenciado o cámbialo por uno que ya tengas. Vuelve a ejecutar `sdlab project doctor --project <project>` para confirmar la corrección.
230
251
 
231
252
  **Errores de `sdlab project doctor`**
232
253
  Doctor devuelve códigos de error estructurados. Algunos comunes:
233
- - `E_PROJECT_NOT_FOUND`: el directorio del proyecto no existe en `projects/`. Verifica la ortografía.
254
+ - `E_PROJECT_NOT_FOUND`: el directorio del proyecto no existe debajo de `projects/`. Verifica la ortografía.
234
255
  - `E_CONFIG_INVALID`: uno de los cinco archivos de configuración JSON falló la validación del esquema. El campo `hint` indica el archivo y el campo incorrectos.
235
- - `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 pista.
256
+ - `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.
236
257
 
237
258
  **`No --project specified, falling back to <name>`**
238
- Una advertencia leve. Pasa `--project <name>` explícitamente para seleccionar el proyecto correcto y silenciar la advertencia.
259
+ Una advertencia suave. Pasa `--project <name>` explícitamente para seleccionar el proyecto correcto y silenciar la advertencia.
239
260
 
240
- **Problemas de memoria VRAM / "Painterly"**
241
- Consulta `docs/internal/HANDOFF.md` para obtener las notas sobre el ajuste del ruido "painterly". En resumen: reduce la intensidad del ruido, disminuye el tamaño del lote o cambia a un punto de control más pequeño en tu perfil de flujo de trabajo.
261
+ **Painterly / VRAM out-of-memory issues**
262
+ See `docs/internal/HANDOFF.md` for the painterly denoise tuning notes. In short: lower the denoise strength, reduce batch size, or switch to a smaller checkpoint in your workflow profile.
242
263
 
243
- **Informar errores**
244
- Crea un problema en https://github.com/mcp-tool-shop-org/style-dataset-lab/issues con tu versión de sdlab (`sdlab --version`), la 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.
264
+ **Reporting bugs**
265
+ File an issue at https://github.com/mcp-tool-shop-org/style-dataset-lab/issues with your sdlab version (`sdlab --version`), Node version (`node -v`), the full command, and the structured error output. A bug-report template prefills the fields.
245
266
 
246
267
  ## Seguridad
247
268
 
package/README.fr.md CHANGED
@@ -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
- Écrivez vos règles visuelles. Générez des œuvres d’art. Évaluez chaque image en fonction de ces règles. Diffusez les résultats sous forme de données d’entraînement versionnées et auditables, puis mettez à profit les modèles entraînés dans des flux de travail de production réels et renvoyez les meilleurs résultats dans votre corpus.
16
+ Écrivez vos règles visuelles. Générez des œuvres d’art. Évaluez chaque image en fonction de ces règles. Diffusez les résultats sous forme de données d’entraînement versionnées et auditables, puis mettez en œuvre les modèles entraînés dans des flux de travail de production réels et renvoyez les meilleurs résultats dans votre corpus.
17
17
 
18
- Style Dataset Lab relie ce que vous avez écrit concernant votre style artistique au jeu de données à partir duquel vous effectuez réellement l’entraînement, puis boucle le processus jusqu’à la production. Vous définissez une constitution : règles de silhouette, contraintes de palette, langage des matériaux, tout ce qui compte pour votre projet. Le pipeline génère des candidats, les évalue en fonction de ces règles et regroupe les éléments approuvés dans des jeux de données reproductibles où chaque enregistrement explique pourquoi il a été inclus.
18
+ Style Dataset Lab relie ce que vous avez écrit sur votre style artistique à l’ensemble de données à partir duquel vous effectuez réellement l’entraînement, puis boucle le processus jusqu’à la production. Vous définissez une constitution : règles de silhouette, contraintes de palette, langage des matériaux, tout ce qui compte pour votre projet. Le pipeline génère des candidats, les évalue en fonction de ces règles et regroupe les œuvres approuvées dans des ensembles de données reproductibles où chaque enregistrement explique pourquoi il a été inclus.
19
19
 
20
- Ensuite, l’environnement de travail de production prend le relais : compilez des briefs de génération à partir des données du projet, exécutez-les via ComfyUI, évaluez les résultats, produisez en série des feuilles d’expression et des planches d’ambiance, sélectionnez les meilleurs résultats et réintégrez-les en tant que nouveaux candidats. La boucle se ferme : produire, sélectionner, examiner, améliorer.
20
+ Ensuite, l’environnement de travail de production prend le relais : compilez des instructions de génération à partir des éléments clés du projet, exécutez-les via ComfyUI, évaluez les résultats, produisez en série des feuilles d’expression et des planches d’ambiance, sélectionnez les meilleurs résultats et réintégrez-les en tant que nouveaux candidats. La boucle se ferme : produire, sélectionner, examiner, améliorer.
21
21
 
22
22
  ## Le pipeline
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
@@ -56,11 +63,11 @@ sdlab select --run run_2026-04-16_001 --approve 001.png,003.png
56
63
  sdlab reingest selected --selection selection_2026-04-16_001
57
64
  ```
58
65
 
59
- Cette dernière commande est essentielle. Les éléments sélectionnés repassent par le même processus d’évaluation que tous les autres. Le corpus s’enrichit et les règles sont respectées.
66
+ Cette dernière commande est essentielle. Les résultats sélectionnés repassent par le même processus d’évaluation que tous les autres éléments. Le corpus s’enrichit et les règles sont respectées.
60
67
 
61
- ## Création du canon
68
+ ## Création de contenu canonique
62
69
 
63
- Avant l’exécution du pipeline de jeu de données, l’espace de noms `sdlab canon *` transforme le référentiel d’entités canoniques de votre projet en les trois projections que l’entraînement et la production utilisent réellement, et verrouille les entrées qui ne doivent pas être modifiées.
70
+ Before the dataset pipeline runs, the `sdlab canon *` namespace turns your project's canon entity store into the three projections training and production actually consume — and locks the entries that must not drift.
64
71
 
65
72
  ```bash
66
73
  # Build three projections from the canon entity store:
@@ -76,58 +83,67 @@ sdlab canon freeze kael_maren --project my-project --reason "prologue portrait l
76
83
  sdlab canon drift --project my-project
77
84
  ```
78
85
 
79
- `canon build` est adressable par contenu : sa sortie est indexée par un `canon_sha` et mise en cache, de sorte qu’une reconstruction du canon non modifié se fait instantanément. `canon freeze` atteste de chaque blocage par rapport à une version spécifique et l’ajoute à un journal d’audit `freeze-events.jsonl` : les entrées `frozen` refusent purement et simplement la régénération, les entrées `soft-advisory` refusent par défaut (contournement avec `--i-know`). `canon drift` recalcule le hachage de chaque entrée surveillée et signale tout ce qui a changé depuis la dernière reconstruction propre.
86
+ `canon build` est adressable par contenu : sa sortie est indexée par un `canon_sha` et mise en cache, de sorte qu’une version non modifiée se reconstruit instantanément. `canon freeze` enregistre chaque « gel » par rapport à une version spécifique et l’ajoute à un historique d’audit `freeze-events.jsonl` : les entrées `frozen` refusent purement et simplement la régénération, les entrées `soft-advisory` refusent par défaut (contournement possible avec `--i-know`). `canon drift` recalcule le hachage de chaque entrée suivie et signale tout ce qui a été modifié depuis la dernière version propre.
80
87
 
81
- Flux de travail complet dans le manuel : [Canon build](handbook/canon-build/), [Canon freeze](handbook/canon-freeze/) et [Two-LoRA stacking](handbook/two-lora-stacking/).
88
+ Flux de travail complet dans le manuel : [Canon build](handbook/canon-build/), [Canon freeze](handbook/canon-freeze/) et [Empilement Two-LoRA](handbook/two-lora-stacking/).
82
89
 
83
- ## Ce que cela produit
90
+ ## Ce qu’il produit
84
91
 
85
- Sept artefacts de jeu de données et un environnement de travail de production complet. Chaque artefact est lié à ses prédécesseurs, ce qui vous permet de retracer tout enregistrement d’entraînement jusqu’à la règle qui l’a approuvé.
92
+ Sept artefacts d’ensemble de données et un environnement de travail de production complet. Chaque artefact est lié à ses prédécesseurs, ce qui vous permet de retracer tout enregistrement d’entraînement jusqu’à la règle qui l’a approuvé.
86
93
 
87
- | Artefact | Ce que c’est |
94
+ | Artefact. | Ce que c’est. |
88
95
  |----------|-----------|
89
96
  | **Snapshot** | Sélection des enregistrements figés avec empreinte de configuration. Chaque inclusion a une raison explicite. |
90
- | **Split** | Partitionnement entraînement/validation/test où les familles de sujets ne franchissent jamais les frontières. |
91
- | **Export package** | Jeu de données autonome : manifeste, métadonnées, images, partitions, fiche d’informations du jeu de données, sommes de contrôle. |
97
+ | **Split** | Partitionnement entraînement/validation/test où les familles de sujets ne se croisent jamais. |
98
+ | **Export package** | Ensemble de données autonome : manifeste, métadonnées, images, partitions, fiche d’informations sur l’ensemble de données, sommes de contrôle. |
92
99
  | **Eval pack** | Tâches de test tenant compte du canon : couverture des voies, dérive interdite, ancrage/or, continuité des sujets. |
93
- | **Training package** | Disposition prête pour l’entraîneur via des adaptateurs (`diffusers-lora`, `generic-image-caption`). Même vérité, format différent. |
94
- | **Eval scorecard** | Résultat de réussite/échec par tâche à partir de l’évaluation des résultats générés par rapport aux ensembles d’évaluation. |
95
- | **Implementation pack** | Exemples d’invites, échecs connus, tests de continuité et directives de réintégration. |
100
+ | **Training package** | Mise en page prête pour l’entraînement via des adaptateurs (`diffusers-lora`, `generic-image-caption`). Même vérité, format différent. |
101
+ | **Eval scorecard** | Résultat de réussite/échec par tâche obtenu en évaluant les résultats générés par rapport aux ensembles d’évaluation. |
102
+ | **Implementation pack** | Exemples d’invites, erreurs connues, tests de continuité et instructions pour la réintégration. |
96
103
 
97
104
  L’environnement de travail de production ajoute :
98
105
 
99
- | Surface | Ce que cela fait |
106
+ | Surface. | Ce que cela fait. |
100
107
  |---------|-------------|
101
- | **Compiled brief** | Instruction de génération déterministe à partir du profil de flux de travail + des données du projet. |
102
- | **Run** | Artefact d’exécution figé : bref + graines + sorties ComfyUI + manifeste. |
108
+ | **Compiled brief** | Instruction de génération déterministe à partir du profil de flux de travail + des éléments clés du projet. |
109
+ | **Run** | Artefact d’exécution figé : instruction + graines + résultats ComfyUI + manifeste. |
103
110
  | **Critique** | Évaluation structurée multidimensionnelle des résultats de l’exécution par rapport au canon. |
104
111
  | **Batch** | Production coordonnée multi-slots (feuilles d’expression, planches d’ambiance, ensembles de silhouettes). |
105
- | **Selection** | Artefact de décision créative : quels éléments ont été choisis, pourquoi et d’où ils proviennent. |
106
- | **Re-ingest** | Les éléments sélectionnés sont renvoyés en tant qu’enregistrements candidats avec la provenance complète de la génération. |
112
+ | **Selection** | Artefact de décision créative : quels résultats ont été choisis, pourquoi et d’où ils proviennent. |
113
+ | **Re-ingest** | Les résultats sélectionnés sont renvoyés en tant qu’enregistrements candidats avec une provenance complète de la génération. |
107
114
 
108
115
  ## Pourquoi cela existe
109
116
 
110
117
  Les données d’entraînement constituent l’artefact le plus important dans tout pipeline d’IA visuelle. Mais la plupart des données d’entraînement ne sont qu’un dossier d’images sans historique, sans suivi de l’évaluation et sans lien avec les règles de style qu’elles étaient censées suivre.
111
118
 
112
- Style Dataset Lab rend le lien explicite. Votre constitution définit les règles. Votre barème définit les dimensions d’évaluation. Vos enregistrements de sélection consignent l’évaluation. Votre liaison canonique prouve le lien. Et votre jeu de données conserve tout cela sous forme de vérité structurée, interrogeable et reproductible.
119
+ Style Dataset Lab rend le lien explicite. Votre constitution définit les règles. Votre barème définit les dimensions d’évaluation. Vos enregistrements de sélection consignent l’évaluation. Votre liaison canonique prouve le lien. Et votre ensemble de données conserve tout cela sous une forme structurée, interrogeable et reproductible.
120
+
121
+ Le résultat pratique : lorsque votre LoRA dérive, vous pouvez demander *pourquoi*. Lorsque votre prochain cycle d’entraînement a besoin de meilleures données, vous savez exactement quels enregistrements sont presque corrects et quelle règle ils ont violée. Lorsqu’un nouveau membre de l’équipe demande quel est le langage visuel du projet, la réponse n’est pas un tableau Figma, mais une constitution consultable avec 1 182 exemples notés.
122
+
123
+ ## Prouvé en production
124
+
125
+ Il ne s’agit pas d’un pipeline de démonstration. Deux LoRA de style réels ont été mis en œuvre de bout en bout grâce à celui-ci, en utilisant la même boucle canon → sélection → entraînement → diffusion, aux extrémités opposées du spectre de la sélection.
126
+
127
+ - **[Tallow Fen](handbook/case-study-tallow-fen/)** (conception de créatures) — un bestiaire entièrement nouveau, avec environ **34 % d’approbation** sur 293 enregistrements sélectionnés (169 rejetés — le système de validation est strict). Publié `tallow_fen_style_v3.safetensors` @ 1.5 sur `qwen-image`.
128
+ - **[Rustline](handbook/case-study-rustline/)** (conception de concepts) — un ensemble dense et préformaté, avec environ **96 % d’approbation** sur 180 enregistrements. Publié `rustline_v3ckpt_1500.safetensors` @ 1.0 sur `qwen-image`, réutilisé par un deuxième projet.
113
129
 
114
- Le résultat pratique : lorsque votre LoRA dérive, vous pouvez demander *pourquoi*. Lorsque votre prochain cycle d’entraînement a besoin de meilleures données, vous savez exactement quels enregistrements sont presque corrects et quelle règle unique ils ont violée. Lorsqu’un nouveau membre de l’équipe demande quelle est la langue visuelle du projet, la réponse n’est pas un tableau Figma, mais une constitution consultable avec 1 182 exemples notés.
130
+ Même pipeline, deux profils de production : la porte de sélection est réelle (elle rejette fermement les sujets ouverts) et une canonisation disciplinée donne des taux d’acceptation élevés.
115
131
 
116
132
  ## Cinq domaines, règles réelles
117
133
 
118
- Pas de modèles d’espace réservé. Chaque domaine est livré avec des règles de constitution de qualité professionnelle, des définitions de voies, des barèmes d’évaluation et un vocabulaire de groupe.
134
+ Pas de modèles génériques. Chaque domaine est livré avec des règles de constitution de qualité professionnelle, des définitions de voies, des barèmes d’évaluation et un vocabulaire de groupe.
119
135
 
120
136
  | Domaine | Voies | Ce qui est évalué |
121
137
  |--------|-------|-----------------|
122
- | **game-art** | personnage, environnement, accessoire, interface utilisateur, vaisseau, intérieur, équipement | Silhouette à l’échelle du jeu, lisibilité de la faction, usure et vieillissement |
123
- | **character-design** | portrait, corps entier, rotation, feuille d’expression, pose d’action | Proportions, logique des costumes, personnalité, clarté des gestes |
124
- | **creature-design** | concept, orthographique, étude détaillée, action, référence d’échelle, habitat | Anatomie, logique évolutive, distinction de la silhouette |
138
+ | **game-art** | personnage, environnement, accessoire, interface utilisateur, vaisseau, intérieur, équipement | Silhouette à l’échelle du jeu, identification de la faction, usure et vieillissement |
139
+ | **character-design** | portrait, corps entier, rotation, feuille d’expressions, pose d’action | Proportions, cohérence du costume, personnalité, clarté des gestes |
140
+ | **creature-design** | concept, orthographique, étude de détails, action, référence d’échelle, habitat | Anatomie, logique évolutive, distinction de la silhouette |
125
141
  | **architecture** | extérieur, intérieur, paysage urbain, détail structurel, ruine, paysage | Structure, cohérence des matériaux, perspective, cohérence de l’époque |
126
142
  | **vehicle-mech** | extérieur, cockpit, composant, schéma, feuille de silhouette, variante de dommage | Logique mécanique, langage du design, points d’accès, récit des dommages |
127
143
 
128
144
  ## Structure du projet
129
145
 
130
- Chaque projet est autonome. Cinq fichiers de configuration JSON définissent les règles ; tout le reste sont des données.
146
+ Chaque projet est autonome. Cinq fichiers de configuration JSON définissent les règles ; tout le reste est constitué de données.
131
147
 
132
148
  ```
133
149
  projects/my-project/
@@ -151,17 +167,22 @@ projects/my-project/
151
167
 
152
168
  ## Propriétés de confiance
153
169
 
154
- Il ne s’agit pas d’objectifs à atteindre. Elles sont appliquées.
170
+ Ce ne sont pas des objectifs à atteindre. Elles sont appliquées.
155
171
 
156
- - **Les instantanés sont immuables.** L’empreinte de configuration (SHA-256) prouve qu’aucun changement n’a été apporté.
157
- - **Les séparations empêchent les fuites.** Les familles de sujets (par identité, lignée ou suffixe d’ID) ne traversent jamais les limites des partitions.
158
- - **Les manifestes sont des contrats figés.** Hachage d’exportation + empreinte de configuration. Si quoi que ce soit change, créez-en un nouveau.
159
- - **Les adaptateurs ne peuvent pas modifier la vérité.** Disposition différente, mêmes enregistrements. Pas d’ajouts, pas de suppressions, pas de reclassification.
160
- - **Les résultats générés sont réintégrés via une revue.** Pas de contournement. Organisez et liez comme tout le reste.
172
+ - **Les instantanés sont immuables.** L’empreinte de configuration (SHA-256) prouve qu’aucun changement n’a été apporté. Les identifiants sont attribués de manière atomique, de sorte que deux exécutions simultanées ne peuvent pas se mélanger dans un seul répertoire.
173
+ - **Les divisions empêchent les fuites — et la vérification qui le confirme est indépendante.** Les familles d’éléments (par identité, lignée ou racine d’identifiant normalisée) ne traversent jamais les limites des partitions, et une deuxième vérification redétermine l’identité de l’élément à partir de zéro plutôt que de relire la carte utilisée par la division elle-même. Une carte de jeu de données n’indique « fuite : aucune (vérifiée) » que lorsque les deux vérifications ont été exécutées et réussies ; une division antérieure à la deuxième vérification indique exactement cela.
174
+ - **Les manifestes sont des contrats figés.** Hachage d’exportation + empreinte de configuration, et `validate` recalcule le hachage de chaque fichier répertorié par `checksums.txt` — ainsi, le remplacement d’une image dans une exportation terminée est détecté, y compris pour les manifestes créés avant l’existence de cette vérification.
175
+ - **Les exécutions définissent leur graphique exact.** Chaque génération enregistre `comfy_workflow_sha` + hachages du contenu du modèle/LoRA + politique de graines, de sorte qu’une série peut être rejouée octet par octet. Les exécutants JS et Python sont maintenus à un hachage identique au niveau de l’octet par un test qui les lance tous les deux. Le hachage des modèles est facultatif (`--hash-models`) et n’est jamais fabriqué — un fichier non résolvable enregistre `sha256: null` avec une note.
176
+ - **Aucun modèle ne vérifie sa propre sortie.** Les évaluations enregistrent `judged_by_model` et `generator_model` ; un avertissement s’affiche si elles sont identiques.
177
+ - **Une évaluation indique qui l’a créée.** `eligibility audit` distingue les évaluations écrites par une personne des évaluations générées par un script en masse, de sorte qu’une justification décrivant une catégorie plutôt qu’une image ne peut pas être considérée comme une curation.
178
+ - **La mesure n’est pas un verdict.** `sdlab measure` associe des nombres à un enregistrement. Elle ne définit jamais une évaluation, une adéquation ou une approbation — et lorsqu’une mesure est indéfinie pour une image, elle enregistre `null` plutôt qu’un nombre plausible.
179
+ - **Les adaptateurs ne peuvent pas modifier la vérité.** Mise en page différente, mêmes enregistrements. Pas d’ajouts, pas de suppressions, pas de reclassification.
180
+ - **Les sorties générées réintègrent le processus via l’examen.** Aucun contournement possible. Curater et lier comme tout le reste. Les images générées en externe entrent de la même manière via `sdlab ingest`, sans curation préalable.
181
+ - **Les échecs sont visibles.** Un enregistrement manquant, une image impossible à placer ou une légende qui ne peut pas être créée interrompent une exportation ou un ensemble d’entraînement plutôt que de le réduire silencieusement.
161
182
 
162
183
  ## Star Freight
163
184
 
164
- Le dépôt inclut un exemple complet fonctionnel : 1 182 enregistrements, 5 factions, 7 voies, 24 règles de constitution, 892 actifs approuvés, 2 profils d’entraînement. Un canon visuel RPG de science-fiction réaliste, entièrement organisé.
185
+ Le dépôt comprend un exemple complet et fonctionnel : 1 182 enregistrements, 5 factions, 7 voies, 24 règles de constitution, 892 actifs approuvés, 2 profils d’entraînement. Un canon visuel RPG de science-fiction réaliste, entièrement organisé.
165
186
 
166
187
  ```bash
167
188
  git clone https://github.com/mcp-tool-shop-org/style-dataset-lab
@@ -173,7 +194,7 @@ sdlab split build --project star-freight # zero subject leakage
173
194
 
174
195
  ## Formats en aval
175
196
 
176
- `sdlab` est propriétaire du jeu de données. La conversion de format est gérée par [`repo-dataset`](https://github.com/mcp-tool-shop-org/repo-dataset) : TRL, LLaVA, Qwen2-VL, JSONL, Parquet et plus encore. `repo-dataset` effectue le rendu ; il ne décide jamais de l’inclusion.
197
+ `sdlab` possède l’ensemble de données. La conversion de format est gérée par [`repo-dataset`](https://github.com/mcp-tool-shop-org/repo-dataset) : TRL, LLaVA, Qwen2-VL, JSONL, Parquet et plus encore. `repo-dataset` effectue le rendu ; il ne décide jamais de l’inclusion.
177
198
 
178
199
  ## Installation
179
200
 
@@ -185,7 +206,7 @@ Nécessite Node.js 20+ et [ComfyUI](https://github.com/comfyanonymous/ComfyUI) s
185
206
 
186
207
  ### Essayez-le sans ComfyUI
187
208
 
188
- Vous pouvez explorer toute la surface non liée à la génération (inspection, organisation, instantané, séparation, exportation) en utilisant le projet Star Freight inclus sans installer ComfyUI ni télécharger des poids SDXL.
209
+ Vous pouvez explorer toute la surface non liée à la génération (inspection, organisation, instantané, division, exportation) en utilisant le projet Star Freight inclus sans installer ComfyUI ni télécharger des poids SDXL.
189
210
 
190
211
  ```bash
191
212
  # Scaffold a fresh project (no ComfyUI needed)
@@ -198,9 +219,9 @@ sdlab project doctor --project test
198
219
  sdlab snapshot create --dry-run --project star-freight
199
220
  ```
200
221
 
201
- `sdlab project doctor` valide chaque configuration de projet (constitution, voies, rubriques, terminologie) et signale l’éligibilité sans toucher au GPU. Toute commande qui modifie l’état généré accepte l’option `--dry-run` pour prévisualiser d’abord l’effet.
222
+ `sdlab project doctor` validates every project config (constitution, lanes, rubric, terminology) and reports eligibility without touching the GPU. Any command that mutates generated state accepts `--dry-run` to preview the effect first.
202
223
 
203
- Si vous oubliez `--project`, l’interface de ligne de commande revient au premier projet qu’elle trouve dans `projects/` et affiche un avertissement ; passez explicitement `--project` pour le supprimer.
224
+ Si vous oubliez `--project`, l’interface en ligne de commande revient au premier projet qu’elle trouve sous `projects/` et affiche un avertissement — passez `--project` explicitement pour le supprimer.
204
225
 
205
226
  ### Reprise d’une exécution interrompue
206
227
 
@@ -216,36 +237,36 @@ sdlab generate inputs/prompts/wave1.json --project my-project --resume
216
237
  sdlab batch generate --resume batch_2026-04-22_001 --project my-project
217
238
  ```
218
239
 
219
- Les deux commandes fonctionnent car chaque emplacement écrit son entrée de manifeste de manière atomique lorsqu’il est terminé ; un plantage en cours d’exécution ne corrompt jamais l’état partiel.
240
+ Les deux commandes fonctionnent car chaque emplacement écrit son entrée de manifeste de manière atomique lorsqu’il a terminé — un plantage en cours d’exécution ne corrompt jamais l’état partiel.
220
241
 
221
242
  ## Dépannage
222
243
 
223
244
  Modes d’échec courants et solutions :
224
245
 
225
- **`ECONNREFUSED 127.0.0.1:8188` pour toute commande `sdlab generate` / `sdlab run generate` / `sdlab batch generate`**
226
- ComfyUI n’est pas en cours d’exécution. Démarrez ComfyUI (`python main.py --listen 127.0.0.1 --port 8188`) et confirmez avec `curl http://127.0.0.1:8188/system_stats`. Pour pointer vers un autre hôte/port, définissez `COMFY_URL=http://host:port`.
246
+ **`ECONNREFUSED 127.0.0.1:8188` sur n’importe quel `sdlab generate` / `sdlab run generate` / `sdlab batch generate`**
247
+ ComfyUI ne fonctionne pas. Démarrez ComfyUI (`python main.py --listen 127.0.0.1 --port 8188`) et confirmez avec `curl http://127.0.0.1:8188/system_stats`. Pour pointer vers un autre hôte/port, définissez `COMFY_URL=http://host:port`.
227
248
 
228
249
  **`missing checkpoint` / `LoRA weight not found`**
229
- Votre profil de flux de travail nomme un fichier modèle qui ne se trouve pas dans le dossier `models/checkpoints/` ou `models/loras/` de ComfyUI. Ouvrez `projects/<project>/workflows/profiles/<profile>.json`, localisez le champ `checkpoint` ou `lora`, et téléchargez soit le poids référencé, soit remplacez-le par un que vous avez déjà. Réexécutez `sdlab project doctor --project <project>` pour confirmer la correction.
250
+ Le nom de votre profil de flux de travail fait référence à un fichier de modèle qui ne se trouve pas dans le dossier `models/checkpoints/` ou `models/loras/` de ComfyUI. Ouvrez `projects/<project>/workflows/profiles/<profile>.json`, localisez le champ `checkpoint` ou `lora` et téléchargez soit le poids référencé, soit remplacez-le par celui que vous avez déjà. Relancez `sdlab project doctor --project <project>` pour confirmer la correction.
230
251
 
231
- **Erreurs de `sdlab project doctor`**
252
+ **Erreurs `sdlab project doctor`**
232
253
  Doctor renvoie des codes d’erreur structurés. Les plus courants :
233
- - `E_PROJECT_NOT_FOUND` — le répertoire du projet n’existe pas dans `projects/`. Vérifiez l’orthographe.
254
+ - `E_PROJECT_NOT_FOUND` — le répertoire du projet n’existe pas sous `projects/`. Vérifiez l’orthographe.
234
255
  - `E_CONFIG_INVALID` — l’un des cinq fichiers de configuration JSON a échoué à la validation du schéma. Le champ `hint` indique le fichier et le champ défectueux.
235
- - `E_RECORD_DRIFT` — l’empreinte de configuration d’un enregistrement ne correspond plus à sa source. Réorganisez ou reliez comme le suggère l’indice.
256
+ - `E_RECORD_DRIFT` — l’empreinte de configuration d’un enregistrement ne correspond plus à sa source. Recurez ou reliez comme le suggère l’indication.
236
257
 
237
- **`No --project specified, falling back to <name>`**
238
- Un simple avertissement. Passez explicitement `--project <name>` pour sélectionner le bon projet et supprimer l’avertissement.
258
+ **Avertissement `No --project specified, falling back to <name>`**
259
+ Un avertissement modéré. Passez `--project <name>` explicitement pour sélectionner le bon projet et supprimer l’avertissement.
239
260
 
240
- **Problèmes de mémoire VRAM / problèmes d’aspect pictural**
241
- Consultez `docs/internal/HANDOFF.md` pour les notes sur le réglage du débruitage pictural. En résumé : diminuez la force du débruitage, réduisez la taille du lot ou passez à un point de contrôle plus petit dans votre profil de flux de travail.
261
+ **Painterly / VRAM out-of-memory issues**
262
+ See `docs/internal/HANDOFF.md` for the painterly denoise tuning notes. In short: lower the denoise strength, reduce batch size, or switch to a smaller checkpoint in your workflow profile.
242
263
 
243
- **Signalement des bogues**
244
- Créez un problème sur https://github.com/mcp-tool-shop-org/style-dataset-lab/issues avec votre version de sdlab (`sdlab --version`), la version de Node (`node -v`), la commande complète et la sortie d’erreur structurée. Un modèle de rapport de bogue préremplit les champs.
264
+ **Reporting bugs**
265
+ File an issue at https://github.com/mcp-tool-shop-org/style-dataset-lab/issues with your sdlab version (`sdlab --version`), Node version (`node -v`), the full command, and the structured error output. A bug-report template prefills the fields.
245
266
 
246
267
  ## Sécurité
247
268
 
248
- Uniquement local. Pas de télémétrie, pas d’analyses, pas de requêtes externes. Les images restent sur votre GPU et votre système de fichiers.
269
+ Uniquement local. Pas de télémétrie, pas d’analyses, pas de demandes externes. Les images restent sur votre GPU et votre système de fichiers.
249
270
 
250
271
  ## Licence
251
272