@koda-sl/baker-cli 0.390.0 → 0.391.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/README.md CHANGED
@@ -5648,7 +5648,7 @@ It then scaffolds a canvas that draws **only what `prompt.json` holds**; no elem
5648
5648
 
5649
5649
  **Placement formats.** The canvas delivers the platform's full placement set, each format at its exact size, collected under `final` with the format as its label. The set is derived from `--platform` (`meta` → 4:5 + 9:16, `google` → 1:1 + 4:5 + 16:9, `linkedin` → 1:1, `tiktok` → 9:16, `youtube` → 16:9); override it with `--placements <preset>` or `--placements none` for a single format. The report's `aspect_ratio` is the ratio the plates really render at (the model's nearest to the lead format), and `format_plan` says how each format is made.
5650
5650
 
5651
- **After a run** the CLI reads the finished ad back on what makes a static win, not a checklist of elements: every delivered image's pixel shape against its format, and one vision pass that reads each word against the copy `prompt.json` holds and checks one dominant idea, clipping, artifacts, the brand with the logo covered and the concept's mechanisms, with every format shown a second time at phone-feed thumbnail size (240px wide, same call): a lead message unreadable at that size is blocking. A missing logo, CTA or copy is never a finding; a logo that is drawn and broken is. stdout carries `verdict` (`ready` | `ready_with_notes` | `needs_fixes` | `not_reviewed`), `judge` (the per-plate scores) and hints that end with what the run made; the findings are stored on the run as its `review`. `needs_fixes` means the ad is not done even though every node completed.
5651
+ **After a run** the CLI reads the finished ad back on what makes a static win, not a checklist of elements: every delivered image's pixel shape against its format, and one vision pass that reads each word against the copy `prompt.json` holds and checks one dominant idea, clipping, artifacts, the brand with the logo covered and the concept's mechanisms, with every format shown a second time at phone-feed thumbnail size (240px wide, same call): a lead message unreadable at that size is blocking. A missing logo, CTA or copy is never a finding; a logo that is drawn and broken is. stdout carries `verdict` (`ready` | `ready_with_notes` | `needs_fixes` | `not_reviewed`), `judge` (the per-plate scores) and hints that end with what the run made; the findings are stored on the run as its `review`. `needs_fixes` means the ad is not done even though every node completed; its hints name the cheapest fix (overlapping or unreadable copy is fixed with a smaller `size`, a `highlight` or `sticker` treatment or shorter words, which re-draw the formats from the cached plates). **Render budget:** a static ad gets 3 renders per creative in a chat before the person reacts; the fourth exits 2 with `RENDER_BUDGET` without rendering, and `baker creatives feedback record` or `baker creatives select` on that creative opens a new round. Resuming an interrupted run does not count again, and a run that died only on an outage (timeout, network, a provider that says retry) gives its render back.
5652
5652
 
5653
5653
  The logo is never a slot to fill: use the company's committed logo in `src/brand/logos/` (per `BRAND.md`), never `baker images logo <domain>`, whose Brandfetch CDN often serves an outdated mark.
5654
5654
 
@@ -1023,6 +1023,10 @@ function runFailureCode(e) {
1023
1023
  const reasons = e instanceof LayerExecutionError ? e.failures.map((f) => f.reason) : [e];
1024
1024
  return reasons.length > 0 && reasons.every(isInputRejection) ? "input_invalid" : "runtime";
1025
1025
  }
1026
+ function failedOnlyOnTransientErrors(e) {
1027
+ const reasons = e instanceof LayerExecutionError ? e.failures.map((f) => f.reason) : [e];
1028
+ return reasons.length > 0 && reasons.every((r) => r instanceof NodeExecutionError && failureDetail(r).retryable === true);
1029
+ }
1026
1030
  function failureDetail(reason) {
1027
1031
  if (reason instanceof NodeExecutionError) {
1028
1032
  const c = reason.cause;
@@ -8069,6 +8073,9 @@ var FINDING_ADVICE = {
8069
8073
  console_error: "the composition threw in the browser, so whatever that script was driving did not happen.",
8070
8074
  page_error: "a script failed to evaluate \u2014 animations and any JS-driven layout in this composition did not run.",
8071
8075
  http_error: "an asset 404ed at render time; it will be missing from the frame, not substituted.",
8076
+ // The most common reason a static ad failed its render in production (Sept 2026), and the
8077
+ // agent answered it by re-painting all three pictures when only the composition was wrong.
8078
+ content_overlap: "two lines of copy collide. In a static ad, make one smaller (`size` in its layout region's `text` in prompt.json) or shorten it: the formats re-draw from the cached pictures. Moving a layout region instead re-paints every picture.",
8072
8079
  console_warning: "if this names a GSAP target, the element it animates does not exist, so that tween is a no-op and whatever it was meant to reveal never appears. Fix the selector or add the element before rendering."
8073
8080
  };
8074
8081
  function explainGateFinding(finding) {
@@ -10211,6 +10218,7 @@ export {
10211
10218
  LayerExecutionError,
10212
10219
  describeFailureReason,
10213
10220
  runFailureCode,
10221
+ failedOnlyOnTransientErrors,
10214
10222
  AD_FORMAT_PLATFORMS,
10215
10223
  platformFormats,
10216
10224
  resolveAdaptFormats,
@@ -10283,4 +10291,4 @@ export {
10283
10291
  defaultRegistry,
10284
10292
  createEngineFromEnv
10285
10293
  };
10286
- //# sourceMappingURL=chunk-6UE43HEQ.js.map
10294
+ //# sourceMappingURL=chunk-SZKTVOR7.js.map