@koda-sl/baker-cli 0.450.0 → 0.451.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 (67) hide show
  1. package/README.md +8 -0
  2. package/dist/{canvas-XYCDLDRS.js → canvas-LSQIZ4YK.js} +12 -12
  3. package/dist/{catalog-ME44ZRZF.js → catalog-BWWRJ5RC.js} +3 -3
  4. package/dist/{chunk-P2RE52V7.js → chunk-CCTB7IA7.js} +3 -3
  5. package/dist/{chunk-D5XAVXUZ.js → chunk-DGICXFK4.js} +5 -5
  6. package/dist/{chunk-542XAHNT.js → chunk-ICGLN6VO.js} +2 -2
  7. package/dist/{chunk-J5IY3GVE.js → chunk-MCVASJR5.js} +3 -3
  8. package/dist/{chunk-GLCPTMPG.js → chunk-PHKQRZGR.js} +2 -2
  9. package/dist/{chunk-K7FZXIOZ.js → chunk-PZ7EPJRF.js} +2 -2
  10. package/dist/{chunk-PLGIETFZ.js → chunk-QDSSRRI2.js} +6 -6
  11. package/dist/{chunk-NEXCBTBZ.js → chunk-QUST75OM.js} +2 -2
  12. package/dist/{chunk-TXI5OWCF.js → chunk-U6GDJF7Y.js} +15 -9
  13. package/dist/{chunk-TXI5OWCF.js.map → chunk-U6GDJF7Y.js.map} +1 -1
  14. package/dist/{chunk-P6ICBEE4.js → chunk-W2KF4LZL.js} +3 -3
  15. package/dist/chunk-W2KF4LZL.js.map +1 -0
  16. package/dist/{chunk-TD6GIMV6.js → chunk-WHIPHGWI.js} +2 -2
  17. package/dist/{chunk-K66OLA6Y.js → chunk-ZIHEIVJC.js} +51 -24
  18. package/dist/chunk-ZIHEIVJC.js.map +1 -0
  19. package/dist/cli.js +2 -2
  20. package/dist/{creatives-D3NXWVUF.js → creatives-2CYEJXYR.js} +5 -5
  21. package/dist/{critique-3XJG44NG.js → critique-GUXOLOES.js} +3 -3
  22. package/dist/engine/index.js +2 -2
  23. package/dist/{feedback-C6CBUUDA.js → feedback-6N2BWUND.js} +2 -2
  24. package/dist/{feedback-record-FM5MW2YV.js → feedback-record-L7YINZLA.js} +5 -5
  25. package/dist/{make-ATEHKECL.js → make-RM2HEOVC.js} +10 -7
  26. package/dist/{make-ATEHKECL.js.map → make-RM2HEOVC.js.map} +1 -1
  27. package/dist/{rerun-FCZRSS3H.js → rerun-2OYJNDXC.js} +10 -10
  28. package/dist/{run-CUUAWKAZ.js → run-CECNWLTF.js} +10 -10
  29. package/dist/{scaffold-ad-AYKWASWY.js → scaffold-ad-WGYLP7HP.js} +7 -7
  30. package/dist/{scaffold-static-ad-IEZEQW4N.js → scaffold-static-ad-Z54SETYF.js} +15 -15
  31. package/dist/scaffold-static-ad-Z54SETYF.js.map +1 -0
  32. package/dist/{scaffold-video-YMN7AJS4.js → scaffold-video-63VDYVAU.js} +7 -7
  33. package/dist/{select-LSS7ZJSB.js → select-BU2KRFOE.js} +5 -5
  34. package/dist/{set-prompt-P3WR2TZX.js → set-prompt-VLLJUQQ3.js} +4 -4
  35. package/dist/{stale-7VJECYYJ.js → stale-T4S42ATQ.js} +4 -4
  36. package/dist/{sync-definition-ARIX5XWM.js → sync-definition-STAFZTLS.js} +7 -7
  37. package/dist/{translate-GGONJG62.js → translate-PL54KGE4.js} +7 -7
  38. package/dist/{validate-FSFELDFZ.js → validate-KZUQKUNF.js} +5 -5
  39. package/package.json +1 -1
  40. package/dist/chunk-K66OLA6Y.js.map +0 -1
  41. package/dist/chunk-P6ICBEE4.js.map +0 -1
  42. package/dist/scaffold-static-ad-IEZEQW4N.js.map +0 -1
  43. /package/dist/{canvas-XYCDLDRS.js.map → canvas-LSQIZ4YK.js.map} +0 -0
  44. /package/dist/{catalog-ME44ZRZF.js.map → catalog-BWWRJ5RC.js.map} +0 -0
  45. /package/dist/{chunk-P2RE52V7.js.map → chunk-CCTB7IA7.js.map} +0 -0
  46. /package/dist/{chunk-D5XAVXUZ.js.map → chunk-DGICXFK4.js.map} +0 -0
  47. /package/dist/{chunk-542XAHNT.js.map → chunk-ICGLN6VO.js.map} +0 -0
  48. /package/dist/{chunk-J5IY3GVE.js.map → chunk-MCVASJR5.js.map} +0 -0
  49. /package/dist/{chunk-GLCPTMPG.js.map → chunk-PHKQRZGR.js.map} +0 -0
  50. /package/dist/{chunk-K7FZXIOZ.js.map → chunk-PZ7EPJRF.js.map} +0 -0
  51. /package/dist/{chunk-PLGIETFZ.js.map → chunk-QDSSRRI2.js.map} +0 -0
  52. /package/dist/{chunk-NEXCBTBZ.js.map → chunk-QUST75OM.js.map} +0 -0
  53. /package/dist/{chunk-TD6GIMV6.js.map → chunk-WHIPHGWI.js.map} +0 -0
  54. /package/dist/{creatives-D3NXWVUF.js.map → creatives-2CYEJXYR.js.map} +0 -0
  55. /package/dist/{critique-3XJG44NG.js.map → critique-GUXOLOES.js.map} +0 -0
  56. /package/dist/{feedback-C6CBUUDA.js.map → feedback-6N2BWUND.js.map} +0 -0
  57. /package/dist/{feedback-record-FM5MW2YV.js.map → feedback-record-L7YINZLA.js.map} +0 -0
  58. /package/dist/{rerun-FCZRSS3H.js.map → rerun-2OYJNDXC.js.map} +0 -0
  59. /package/dist/{run-CUUAWKAZ.js.map → run-CECNWLTF.js.map} +0 -0
  60. /package/dist/{scaffold-ad-AYKWASWY.js.map → scaffold-ad-WGYLP7HP.js.map} +0 -0
  61. /package/dist/{scaffold-video-YMN7AJS4.js.map → scaffold-video-63VDYVAU.js.map} +0 -0
  62. /package/dist/{select-LSS7ZJSB.js.map → select-BU2KRFOE.js.map} +0 -0
  63. /package/dist/{set-prompt-P3WR2TZX.js.map → set-prompt-VLLJUQQ3.js.map} +0 -0
  64. /package/dist/{stale-7VJECYYJ.js.map → stale-T4S42ATQ.js.map} +0 -0
  65. /package/dist/{sync-definition-ARIX5XWM.js.map → sync-definition-STAFZTLS.js.map} +0 -0
  66. /package/dist/{translate-GGONJG62.js.map → translate-PL54KGE4.js.map} +0 -0
  67. /package/dist/{validate-FSFELDFZ.js.map → validate-KZUQKUNF.js.map} +0 -0
package/README.md CHANGED
@@ -4312,10 +4312,14 @@ A skill fills only what you did **not** pin — `--model`, `--aspect-ratio` and
4312
4312
 
4313
4313
  ## Creative Canvas
4314
4314
 
4315
+ Static-ad guidance prefers a ready company Avatar whenever an actor is needed, chosen for the buyer context. A real founder or testimonial author uses their verified likeness; if it cannot be found, use initials or no face. The shared creative instructions also call for deliberate complete-logo selection, one consistent primary CTA treatment, and deterministic rendering of recognizable interfaces. Screen guidance distinguishes laptops and notebook computers from paper notebooks beside a phone.
4316
+
4315
4317
  The creative canvas runs declarative JSON pipelines. You author a graph of nodes (text, image, video, audio, composition, control-flow), `baker canvas run` it, and every node's output drops to disk under `canvas/<run_id>/` so you can watch progress and consume the artifacts.
4316
4318
 
4317
4319
  Auth: same `BAKER_API_KEY` + `BAKER_API_URL` as the rest of the CLI.
4318
4320
 
4321
+ Static resizes, fixes and series continuations keep why the original ad works and the elements its concept depends on, alongside the previous image. Older specs carry their persuasion mechanism and its reason instead. Automatic spec repairs preserve the concept, mechanism, message, brand (including the CTA color) and native interface; they can correct the execution without changing the idea. Change those choices explicitly in `prompt.json` when the brief changes.
4322
+
4319
4323
  ### Quick start
4320
4324
 
4321
4325
  ```bash
@@ -6141,6 +6145,10 @@ baker canvas run ./static-ad.canvas.json
6141
6145
 
6142
6146
  Scaffolding runs (and bills) the two vision passes; **running** the result generates billed images. `baker canvas validate` does not check that the `[TODO]` paths exist — supply the real files before `run`.
6143
6147
 
6148
+ Size adaptations move and proportionally scale the existing composition first, keeping its background treatment, including intentional flat colour. Generation, adaptation, correction and series briefs preserve plausible anatomy, device proportions, scale, perspective and support, and reflow text while preserving letter shapes. Recognizable app controls remain native; marketing overlays stay visibly separate. Shared guidance records applicable intent and constraints briefly in `_definition.md`, then carries them into `prompt.json` (Markdown is not a render input). Direct briefs need no invented winner or fixed template; reference adaptations reason through the mechanism, transfer hypothesis and what must survive. `creatives make` returns this preparation hint before rendering. Choose the represented role and inspect existing Avatars before creating a new actor; a real founder or customer keeps their verified identity.
6149
+
6150
+ During continuations, the accepted image's screen content takes priority over geometry references unless explicitly changed. Laptop scenes receive guidance for a real laptop and consistent display, keyboard and hinge perspective.
6151
+
6144
6152
  #### `baker canvas rerun <slug> [flags]` (deprecated)
6145
6153
 
6146
6154
  Now `baker canvas run --slug <slug>`; `rerun` stays as a hidden alias for one release and prints a deprecation note. Every `canvas run` of a creative records a portable snapshot (the canvas JSON plus the local files it ingests: prompt blueprints, composition dirs, reference images) in durable storage, so `run --slug` can rebuild `src/creatives/<slug>/` in a workspace that never had it. A snapshot whose files are exactly the last one uploaded for the creative is reused without a request, and a file the store already holds is not uploaded again. Files the snapshot could not include (missing at run time, or oversized) are listed as warnings.
@@ -25,22 +25,22 @@ Subcommands:
25
25
  Full guide: __tooling__/docs/tools/baker/canvas.md`
26
26
  },
27
27
  subCommands: {
28
- run: () => import("./run-CUUAWKAZ.js").then((m) => m.runCommand),
29
- rerun: () => import("./rerun-FCZRSS3H.js").then((m) => m.rerunCommand),
30
- validate: () => import("./validate-FSFELDFZ.js").then((m) => m.validateCommand),
31
- critique: () => import("./critique-3XJG44NG.js").then((m) => m.critiqueCommand),
28
+ run: () => import("./run-CECNWLTF.js").then((m) => m.runCommand),
29
+ rerun: () => import("./rerun-2OYJNDXC.js").then((m) => m.rerunCommand),
30
+ validate: () => import("./validate-KZUQKUNF.js").then((m) => m.validateCommand),
31
+ critique: () => import("./critique-GUXOLOES.js").then((m) => m.critiqueCommand),
32
32
  "viewer-check": () => import("./viewer-check-45T2HLAH.js").then((m) => m.viewerCheckCommand),
33
- catalog: () => import("./catalog-ME44ZRZF.js").then((m) => m.catalogCommand),
33
+ catalog: () => import("./catalog-BWWRJ5RC.js").then((m) => m.catalogCommand),
34
34
  inspect: () => import("./inspect-MCMUJPXU.js").then((m) => m.inspectCommand),
35
- "scaffold-ad": () => import("./scaffold-ad-AYKWASWY.js").then((m) => m.scaffoldAdCommand),
36
- "scaffold-video": () => import("./scaffold-video-YMN7AJS4.js").then((m) => m.scaffoldVideoCommand),
37
- "scaffold-static-ad": () => import("./scaffold-static-ad-IEZEQW4N.js").then((m) => m.scaffoldStaticAdCommand),
38
- "set-prompt": () => import("./set-prompt-P3WR2TZX.js").then((m) => m.setPromptCommand),
39
- "sync-definition": () => import("./sync-definition-ARIX5XWM.js").then((m) => m.syncDefinitionCommand),
40
- stale: () => import("./stale-7VJECYYJ.js").then((m) => m.staleCommand)
35
+ "scaffold-ad": () => import("./scaffold-ad-WGYLP7HP.js").then((m) => m.scaffoldAdCommand),
36
+ "scaffold-video": () => import("./scaffold-video-63VDYVAU.js").then((m) => m.scaffoldVideoCommand),
37
+ "scaffold-static-ad": () => import("./scaffold-static-ad-Z54SETYF.js").then((m) => m.scaffoldStaticAdCommand),
38
+ "set-prompt": () => import("./set-prompt-VLLJUQQ3.js").then((m) => m.setPromptCommand),
39
+ "sync-definition": () => import("./sync-definition-STAFZTLS.js").then((m) => m.syncDefinitionCommand),
40
+ stale: () => import("./stale-T4S42ATQ.js").then((m) => m.staleCommand)
41
41
  }
42
42
  });
43
43
  export {
44
44
  canvasCommand
45
45
  };
46
- //# sourceMappingURL=canvas-XYCDLDRS.js.map
46
+ //# sourceMappingURL=canvas-LSQIZ4YK.js.map
@@ -2,8 +2,8 @@ import {
2
2
  catalogView,
3
3
  defaultRegistry,
4
4
  generateCatalog
5
- } from "./chunk-GLCPTMPG.js";
6
- import "./chunk-K66OLA6Y.js";
5
+ } from "./chunk-PHKQRZGR.js";
6
+ import "./chunk-ZIHEIVJC.js";
7
7
  import "./chunk-W3B4BHQU.js";
8
8
  import "./chunk-KFE3S63W.js";
9
9
  import "./chunk-DGCUPJZD.js";
@@ -62,4 +62,4 @@ var catalogCommand = defineCommand({
62
62
  export {
63
63
  catalogCommand
64
64
  };
65
- //# sourceMappingURL=catalog-ME44ZRZF.js.map
65
+ //# sourceMappingURL=catalog-BWWRJ5RC.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  languageTag
3
- } from "./chunk-P6ICBEE4.js";
3
+ } from "./chunk-W2KF4LZL.js";
4
4
  import {
5
5
  parseRefExpr
6
- } from "./chunk-K66OLA6Y.js";
6
+ } from "./chunk-ZIHEIVJC.js";
7
7
  import {
8
8
  AWARENESS_VALUES
9
9
  } from "./chunk-5HYSKH77.js";
@@ -301,4 +301,4 @@ export {
301
301
  buildInitialRunRecord,
302
302
  buildFailedRunRecord
303
303
  };
304
- //# sourceMappingURL=chunk-P2RE52V7.js.map
304
+ //# sourceMappingURL=chunk-CCTB7IA7.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  finalOutputLabelsFromCanvas,
3
3
  parseDefinitionStrategyFields
4
- } from "./chunk-P2RE52V7.js";
4
+ } from "./chunk-CCTB7IA7.js";
5
5
  import {
6
6
  readRenderState
7
- } from "./chunk-TD6GIMV6.js";
7
+ } from "./chunk-WHIPHGWI.js";
8
8
  import {
9
9
  STATIC_AD_ROLE,
10
10
  formatOfAdaptId,
@@ -12,7 +12,7 @@ import {
12
12
  isSignatureLine,
13
13
  sameTag,
14
14
  seriesMemberAd
15
- } from "./chunk-P6ICBEE4.js";
15
+ } from "./chunk-W2KF4LZL.js";
16
16
  import {
17
17
  fetchRunRecord
18
18
  } from "./chunk-3YOFT3AP.js";
@@ -31,7 +31,7 @@ import {
31
31
  nodesWithRole,
32
32
  relaidPictureRole,
33
33
  rolesById
34
- } from "./chunk-K66OLA6Y.js";
34
+ } from "./chunk-ZIHEIVJC.js";
35
35
  import {
36
36
  isAdSpec,
37
37
  readAdSpec
@@ -506,4 +506,4 @@ export {
506
506
  writeSeriesMemberCanvas,
507
507
  seriesRunHints
508
508
  };
509
- //# sourceMappingURL=chunk-D5XAVXUZ.js.map
509
+ //# sourceMappingURL=chunk-DGICXFK4.js.map
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  leadVersion,
7
7
  writeSeriesMemberCanvas
8
- } from "./chunk-D5XAVXUZ.js";
8
+ } from "./chunk-DGICXFK4.js";
9
9
  import {
10
10
  definitionFieldsOf,
11
11
  setDefinitionFields,
@@ -89,4 +89,4 @@ export {
89
89
  makeSeriesAd,
90
90
  seriesMadeEnvelope
91
91
  };
92
- //# sourceMappingURL=chunk-542XAHNT.js.map
92
+ //# sourceMappingURL=chunk-ICGLN6VO.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  loadCompositionMeta
3
- } from "./chunk-GLCPTMPG.js";
3
+ } from "./chunk-PHKQRZGR.js";
4
4
  import {
5
5
  parseRefExpr
6
- } from "./chunk-K66OLA6Y.js";
6
+ } from "./chunk-ZIHEIVJC.js";
7
7
  import {
8
8
  resolveAdaptFormats
9
9
  } from "./chunk-CHSNHVYF.js";
@@ -93,4 +93,4 @@ async function outputRatioWarningsFor(canvas, canvasPath) {
93
93
  export {
94
94
  outputRatioWarningsFor
95
95
  };
96
- //# sourceMappingURL=chunk-J5IY3GVE.js.map
96
+ //# sourceMappingURL=chunk-MCVASJR5.js.map
@@ -20,7 +20,7 @@ import {
20
20
  topologicalLayers,
21
21
  validateCanvas,
22
22
  validateCanvasDeep
23
- } from "./chunk-K66OLA6Y.js";
23
+ } from "./chunk-ZIHEIVJC.js";
24
24
  import {
25
25
  remoteCacheEnabledFromEnv
26
26
  } from "./chunk-W3B4BHQU.js";
@@ -5186,4 +5186,4 @@ export {
5186
5186
  defaultRegistry,
5187
5187
  createEngineFromEnv
5188
5188
  };
5189
- //# sourceMappingURL=chunk-GLCPTMPG.js.map
5189
+ //# sourceMappingURL=chunk-PHKQRZGR.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  REF_PREFIX
3
- } from "./chunk-K66OLA6Y.js";
3
+ } from "./chunk-ZIHEIVJC.js";
4
4
 
5
5
  // src/commands/canvas/node-preview.ts
6
6
  var MAX_PARAMS_PREVIEW_LENGTH = 4e3;
@@ -57,4 +57,4 @@ ${body}` : header || body || compactJson(record);
57
57
  export {
58
58
  nodeParamsPreview
59
59
  };
60
- //# sourceMappingURL=chunk-K7FZXIOZ.js.map
60
+ //# sourceMappingURL=chunk-PZ7EPJRF.js.map
@@ -1,21 +1,21 @@
1
1
  import {
2
2
  nodeParamsPreview
3
- } from "./chunk-K7FZXIOZ.js";
3
+ } from "./chunk-PZ7EPJRF.js";
4
4
  import {
5
5
  creativeSlugFromCanvasPath,
6
6
  parseDefinitionSeriesPlace,
7
7
  parseDefinitionSourceFields,
8
8
  parseDefinitionStrategyFields
9
- } from "./chunk-P2RE52V7.js";
9
+ } from "./chunk-CCTB7IA7.js";
10
10
  import {
11
11
  prepareCanvas
12
- } from "./chunk-P6ICBEE4.js";
12
+ } from "./chunk-W2KF4LZL.js";
13
13
  import {
14
14
  BackendClient
15
- } from "./chunk-GLCPTMPG.js";
15
+ } from "./chunk-PHKQRZGR.js";
16
16
  import {
17
17
  nodeDependencies
18
- } from "./chunk-K66OLA6Y.js";
18
+ } from "./chunk-ZIHEIVJC.js";
19
19
  import {
20
20
  requireCredentialsFromEnv
21
21
  } from "./chunk-W3B4BHQU.js";
@@ -204,4 +204,4 @@ export {
204
204
  resolveCanvasPath,
205
205
  syncDefinitionCommand
206
206
  };
207
- //# sourceMappingURL=chunk-PLGIETFZ.js.map
207
+ //# sourceMappingURL=chunk-QDSSRRI2.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  latestVersion
3
- } from "./chunk-TD6GIMV6.js";
3
+ } from "./chunk-WHIPHGWI.js";
4
4
  import {
5
5
  canvasOutputsRoot
6
6
  } from "./chunk-DZSIUEGH.js";
@@ -16,4 +16,4 @@ async function versionOf(slug, run) {
16
16
  export {
17
17
  versionOf
18
18
  };
19
- //# sourceMappingURL=chunk-NEXCBTBZ.js.map
19
+ //# sourceMappingURL=chunk-QUST75OM.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  nodeParamsPreview
3
- } from "./chunk-K7FZXIOZ.js";
3
+ } from "./chunk-PZ7EPJRF.js";
4
4
  import {
5
5
  outputRatioWarningsFor
6
- } from "./chunk-J5IY3GVE.js";
6
+ } from "./chunk-MCVASJR5.js";
7
7
  import {
8
8
  waitForSheet
9
9
  } from "./chunk-WN4KX7GE.js";
@@ -30,7 +30,7 @@ import {
30
30
  variantImage,
31
31
  versionRun,
32
32
  writeSeriesMemberCanvas
33
- } from "./chunk-D5XAVXUZ.js";
33
+ } from "./chunk-DGICXFK4.js";
34
34
  import {
35
35
  buildFailedRunRecord,
36
36
  buildInitialRunRecord,
@@ -39,7 +39,7 @@ import {
39
39
  finalFiles,
40
40
  finalOutputLabelsFromCanvas,
41
41
  nodeOutputsToRecord
42
- } from "./chunk-P2RE52V7.js";
42
+ } from "./chunk-CCTB7IA7.js";
43
43
  import {
44
44
  clearLegacyDirtyMarker,
45
45
  readRenderState,
@@ -48,7 +48,7 @@ import {
48
48
  recordReviewOutcome,
49
49
  recordSeriesLeadRun,
50
50
  recordSnapshot
51
- } from "./chunk-TD6GIMV6.js";
51
+ } from "./chunk-WHIPHGWI.js";
52
52
  import {
53
53
  BRAND_LOGO_ROLE,
54
54
  CLAIMS_MODEL,
@@ -76,7 +76,7 @@ import {
76
76
  uncastPeople,
77
77
  wireNamedPeople,
78
78
  wireProofBadges
79
- } from "./chunk-P6ICBEE4.js";
79
+ } from "./chunk-W2KF4LZL.js";
80
80
  import {
81
81
  advanceDefinitionStatus
82
82
  } from "./chunk-3ACMDRSE.js";
@@ -118,7 +118,7 @@ import {
118
118
  createEngineFromEnv,
119
119
  resolveConcurrency,
120
120
  ulid
121
- } from "./chunk-GLCPTMPG.js";
121
+ } from "./chunk-PHKQRZGR.js";
122
122
  import {
123
123
  BackendClient,
124
124
  LOGO_COMPOSITE_ROLE,
@@ -140,7 +140,7 @@ import {
140
140
  regenerateTargets,
141
141
  rolesById,
142
142
  staticMasterFormat
143
- } from "./chunk-K66OLA6Y.js";
143
+ } from "./chunk-ZIHEIVJC.js";
144
144
  import {
145
145
  requireCredentialsFromEnv
146
146
  } from "./chunk-W3B4BHQU.js";
@@ -2102,6 +2102,10 @@ function acceptRepair(before, answer) {
2102
2102
  const now = AdSpecSchema.safeParse(spec);
2103
2103
  if (!was.success || !now.success) return null;
2104
2104
  if (JSON.stringify(was.data) === JSON.stringify(now.data)) return null;
2105
+ for (const key of ["concept", "mechanism", "message", "brand"]) {
2106
+ if (JSON.stringify(was.data[key]) !== JSON.stringify(now.data[key])) return null;
2107
+ }
2108
+ if (was.data.native && was.data.native.surface !== now.data.native?.surface) return null;
2105
2109
  const kept = printedWords(now.data);
2106
2110
  if (!printedWords(was.data).every((text) => kept.includes(text))) return null;
2107
2111
  return { changed: parsed.data.changed, spec };
@@ -2117,6 +2121,8 @@ function buildSpecRepairPrompt(spec, findings, schema) {
2117
2121
  "- A rating or stars shown with no source: name the source only if the spec already states one anywhere; otherwise drop the stars or the rating. Never invent a source, a number or a claim.",
2118
2122
  "- A native screen's layout (where its headline, bubbles or cards sit, what it shows) is changed in its `native` block.",
2119
2123
  "- Keep every line of copy word for word: never reword, shorten or drop one. Keep the schema, the brand and everything the defects do not touch.",
2124
+ "- Preserve `concept`, `mechanism`, `message` and `brand` exactly, including the CTA colour. Fix how the ad executes its idea; never change why it works or remove its load-bearing elements to make a defect pass.",
2125
+ "- Keep a native screen on the same `native.surface`. Notes stays Notes, a review stays on its review platform. Change its layout or content only; never replace it with a physical document or a generic ad.",
2120
2126
  "",
2121
2127
  'Reply with only this JSON, naming only the fields you replace, each by its dotted path in the spec ("scene.layout", "references", "copy.2.position", "native.messages"), with its whole new value: {"changed": "<one plain sentence a marketer reads: what you changed and why>", "set": [{"path": "<dotted path>", "value": <its new value>}]}',
2122
2128
  "",
@@ -3144,4 +3150,4 @@ export {
3144
3150
  executeCanvasRun,
3145
3151
  buildBackendClient
3146
3152
  };
3147
- //# sourceMappingURL=chunk-TXI5OWCF.js.map
3153
+ //# sourceMappingURL=chunk-U6GDJF7Y.js.map