@contentful/experience-design-system-cli 2.32.1-dev-build-b7d2d34.0 → 2.32.1-dev-build-71db090.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/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contentful/experience-design-system-cli",
3
- "version": "2.32.1-dev-build-b7d2d34.0",
3
+ "version": "2.32.1-dev-build-71db090.0",
4
4
  "description": "Contentful Experiences design system import CLI",
5
5
  "license": "MIT",
6
6
  "type": "module",
package/dist/src/index.js CHANGED
@@ -17899,7 +17899,7 @@ __export(CredentialsStep_exports, {
17899
17899
  });
17900
17900
  import { useState as useState15, useEffect as useEffect7, useRef as useRef3 } from "react";
17901
17901
  import { Box as Box28, Text as Text28 } from "ink";
17902
- import { jsx as jsx28, jsxs as jsxs28 } from "react/jsx-runtime";
17902
+ import { Fragment as Fragment9, jsx as jsx28, jsxs as jsxs28 } from "react/jsx-runtime";
17903
17903
  function CredentialsStep({
17904
17904
  summary,
17905
17905
  error: externalError,
@@ -18015,8 +18015,10 @@ function CredentialsStep({
18015
18015
  ] }),
18016
18016
  /* @__PURE__ */ jsxs28(Box28, { flexDirection: "column", marginTop: 1, gap: 0, children: [
18017
18017
  /* @__PURE__ */ jsx28(Text28, { children: initialSpaceId && initialCmaToken ? "Credentials pre-filled from experiences setup. Press Enter to continue or edit any field to update." : "Enter the Contentful space you want to import into." }),
18018
- !(initialSpaceId && initialCmaToken) && /* @__PURE__ */ jsx28(Text28, { dimColor: true, children: "These credentials are used both to align agent suggestions with what already exists in the space and to push your import at the end. Press S to skip and run without space context (push will be disabled)." }),
18019
- !(initialSpaceId && initialCmaToken) && /* @__PURE__ */ jsx28(Text28, { dimColor: true, children: "Tip: run experiences setup to save these to ~/.config/experiences/credentials.json so they pre-fill here automatically." })
18018
+ !(initialSpaceId && initialCmaToken) && /* @__PURE__ */ jsxs28(Fragment9, { children: [
18019
+ /* @__PURE__ */ jsx28(Text28, { dimColor: true, children: "These credentials are used both to align agent suggestions with what already exists in the space and to push your import at the end. Press S to skip and run without space context (push will be disabled)." }),
18020
+ /* @__PURE__ */ jsx28(Text28, { dimColor: true, children: "Tip: run experiences setup to save these to ~/.config/experiences/credentials.json so they pre-fill here automatically." })
18021
+ ] })
18020
18022
  ] }),
18021
18023
  /* @__PURE__ */ jsxs28(Box28, { flexDirection: "column", gap: 0, marginTop: 1, children: [
18022
18024
  renderField("Space ID", spaceId, "spaceId"),
@@ -18215,7 +18217,7 @@ var init_preview_diff = __esm({
18215
18217
  // packages/experience-design-system-cli/src/import/tui/steps/WizardPreviewStep.tsx
18216
18218
  import { useState as useState16, useMemo as useMemo3 } from "react";
18217
18219
  import { Box as Box29, Text as Text29, useStdout as useStdout3 } from "ink";
18218
- import { Fragment as Fragment9, jsx as jsx29, jsxs as jsxs29 } from "react/jsx-runtime";
18220
+ import { Fragment as Fragment10, jsx as jsx29, jsxs as jsxs29 } from "react/jsx-runtime";
18219
18221
  function buildPreviewDiffLines(preview) {
18220
18222
  const lines = [];
18221
18223
  const { components, tokens } = preview;
@@ -18392,7 +18394,7 @@ function WizardPreviewStep({
18392
18394
  ] }),
18393
18395
  /* @__PURE__ */ jsx29(Text29, { dimColor: true, children: "\u2500".repeat(40) })
18394
18396
  ] }),
18395
- hasAnything ? /* @__PURE__ */ jsxs29(Fragment9, { children: [
18397
+ hasAnything ? /* @__PURE__ */ jsxs29(Fragment10, { children: [
18396
18398
  /* @__PURE__ */ jsx29(Text29, { children: "Here's what will happen in your space:" }),
18397
18399
  hasComponents && /* @__PURE__ */ jsxs29(Box29, { flexDirection: "column", gap: 0, children: [
18398
18400
  /* @__PURE__ */ jsx29(Box29, { gap: 1, marginTop: 1, children: /* @__PURE__ */ jsx29(Text29, { bold: true, dimColor: true, children: "ComponentTypes" }) }),
@@ -18558,7 +18560,7 @@ var init_WizardPreviewStep = __esm({
18558
18560
 
18559
18561
  // packages/experience-design-system-cli/src/import/tui/steps/DoneStep.tsx
18560
18562
  import { Box as Box30, Text as Text30 } from "ink";
18561
- import { Fragment as Fragment10, jsx as jsx30, jsxs as jsxs30 } from "react/jsx-runtime";
18563
+ import { Fragment as Fragment11, jsx as jsx30, jsxs as jsxs30 } from "react/jsx-runtime";
18562
18564
  function DoneStep({
18563
18565
  componentTypes,
18564
18566
  designTokens,
@@ -18579,7 +18581,7 @@ function DoneStep({
18579
18581
  const totalPushed = componentTypes.created + componentTypes.updated + componentTypes.removed + designTokens.created + designTokens.updated + designTokens.removed;
18580
18582
  const success = totalFailed === 0;
18581
18583
  function EntityRows({ entity, label }) {
18582
- return /* @__PURE__ */ jsxs30(Fragment10, { children: [
18584
+ return /* @__PURE__ */ jsxs30(Fragment11, { children: [
18583
18585
  entity.created > 0 && /* @__PURE__ */ jsxs30(Box30, { gap: 1, children: [
18584
18586
  /* @__PURE__ */ jsx30(Text30, { color: PALETTE.success, children: "\u2713" }),
18585
18587
  /* @__PURE__ */ jsxs30(Text30, { children: [
@@ -20751,7 +20753,7 @@ var init_scope_gate_columns = __esm({
20751
20753
  // packages/experience-design-system-cli/src/import/tui/steps/ScopeGateStep.tsx
20752
20754
  import { Box as Box39, Text as Text41, useStdout as useStdout4 } from "ink";
20753
20755
  import React21, { useEffect as useEffect10, useMemo as useMemo5, useRef as useRef4, useState as useState21 } from "react";
20754
- import { Fragment as Fragment11, jsx as jsx42, jsxs as jsxs41 } from "react/jsx-runtime";
20756
+ import { Fragment as Fragment12, jsx as jsx42, jsxs as jsxs41 } from "react/jsx-runtime";
20755
20757
  function capReasonForFocusedRow(reason, width) {
20756
20758
  const safeWidth = Math.max(20, width);
20757
20759
  const budget = safeWidth * FOCUSED_REASON_MAX_LINES;
@@ -21500,7 +21502,7 @@ function ScopeGateStep({
21500
21502
  graph
21501
21503
  }
21502
21504
  ),
21503
- columnPlan.layout === "three-column" && /* @__PURE__ */ jsxs41(Fragment11, { children: [
21505
+ columnPlan.layout === "three-column" && /* @__PURE__ */ jsxs41(Fragment12, { children: [
21504
21506
  /* @__PURE__ */ jsx42(Box39, { width: 2, flexShrink: 0 }),
21505
21507
  /* @__PURE__ */ jsx42(
21506
21508
  AddedComponentsColumn,
@@ -21675,7 +21677,7 @@ function AddedComponentsColumn(props) {
21675
21677
  borderColor: focused ? PALETTE.inverse : void 0,
21676
21678
  children: [
21677
21679
  /* @__PURE__ */ jsx42(ColumnHeader, { title: "Added components", width, focused }),
21678
- entries.length === 0 ? /* @__PURE__ */ jsx42(Text41, { dimColor: true, children: "(none)" }) : /* @__PURE__ */ jsxs41(Fragment11, { children: [
21680
+ entries.length === 0 ? /* @__PURE__ */ jsx42(Text41, { dimColor: true, children: "(none)" }) : /* @__PURE__ */ jsxs41(Fragment12, { children: [
21679
21681
  window.above > 0 && /* @__PURE__ */ jsx42(Text41, { dimColor: true, children: `\u2191 ${window.above} more` }),
21680
21682
  entries.slice(window.start, window.end).map((entry, vi) => {
21681
21683
  const i = window.start + vi;
@@ -21738,7 +21740,7 @@ function AddedGroupsColumn(props) {
21738
21740
  borderColor: focused ? PALETTE.inverse : void 0,
21739
21741
  children: [
21740
21742
  /* @__PURE__ */ jsx42(ColumnHeader, { title: "Added groups", width, focused }),
21741
- entries.length === 0 ? /* @__PURE__ */ jsx42(Text41, { dimColor: true, children: "(none)" }) : /* @__PURE__ */ jsxs41(Fragment11, { children: [
21743
+ entries.length === 0 ? /* @__PURE__ */ jsx42(Text41, { dimColor: true, children: "(none)" }) : /* @__PURE__ */ jsxs41(Fragment12, { children: [
21742
21744
  window.above > 0 && /* @__PURE__ */ jsx42(Text41, { dimColor: true, children: `\u2191 ${window.above} more` }),
21743
21745
  entries.slice(window.start, window.end).map((g, vi) => {
21744
21746
  const i = window.start + vi;
@@ -22444,7 +22446,7 @@ import {
22444
22446
  CDF_PROPERTY_CATEGORIES,
22445
22447
  DESIGN_TOKEN_TYPES as DESIGN_TOKEN_TYPES2
22446
22448
  } from "@contentful/experience-design-system-types";
22447
- import { Fragment as Fragment12, jsx as jsx45, jsxs as jsxs44 } from "react/jsx-runtime";
22449
+ import { Fragment as Fragment13, jsx as jsx45, jsxs as jsxs44 } from "react/jsx-runtime";
22448
22450
  function parseToState(json) {
22449
22451
  let parsed;
22450
22452
  try {
@@ -22646,7 +22648,7 @@ function PropRow({
22646
22648
  activeField === "category" && /* @__PURE__ */ jsx45(Picker, { value: prop.category, active: true }),
22647
22649
  /* @__PURE__ */ jsx45(Text44, { dimColor: !selected, children: "req:" }),
22648
22650
  activeField === "required" ? /* @__PURE__ */ jsx45(Toggle, { value: prop.required, active: true }) : /* @__PURE__ */ jsx45(Toggle, { value: prop.required, active: false }),
22649
- prop.type === "enum" && /* @__PURE__ */ jsxs44(Fragment12, { children: [
22651
+ prop.type === "enum" && /* @__PURE__ */ jsxs44(Fragment13, { children: [
22650
22652
  /* @__PURE__ */ jsx45(Text44, { dimColor: !selected, children: "values:" }),
22651
22653
  /* @__PURE__ */ jsxs44(Text44, { color: selected ? PALETTE.warning : PALETTE.inverse, children: [
22652
22654
  "[",
@@ -22654,7 +22656,7 @@ function PropRow({
22654
22656
  "]"
22655
22657
  ] })
22656
22658
  ] }),
22657
- prop.type === "token" && /* @__PURE__ */ jsxs44(Fragment12, { children: [
22659
+ prop.type === "token" && /* @__PURE__ */ jsxs44(Fragment13, { children: [
22658
22660
  /* @__PURE__ */ jsx45(Text44, { dimColor: !selected, children: "kind:" }),
22659
22661
  activeField === "tokenKind" ? /* @__PURE__ */ jsx45(Picker, { value: prop.tokenKind || DESIGN_TOKEN_TYPES2[0], active: true }) : /* @__PURE__ */ jsx45(Text44, { color: selected ? PALETTE.success : PALETTE.inverse, children: prop.tokenKind || "\u2014" })
22660
22662
  ] })
@@ -23859,7 +23861,7 @@ var init_cycle_panel_scroll = __esm({
23859
23861
 
23860
23862
  // packages/experience-design-system-cli/src/analyze/select/tui/components/RationalePanel.tsx
23861
23863
  import { Box as Box43, Text as Text45 } from "ink";
23862
- import { Fragment as Fragment13, jsx as jsx46, jsxs as jsxs45 } from "react/jsx-runtime";
23864
+ import { Fragment as Fragment14, jsx as jsx46, jsxs as jsxs45 } from "react/jsx-runtime";
23863
23865
  function wrapText(text, innerWidth) {
23864
23866
  if (!text) return [""];
23865
23867
  const width = Math.max(1, innerWidth);
@@ -23939,7 +23941,7 @@ function RationalePanel({
23939
23941
  children: [
23940
23942
  /* @__PURE__ */ jsxs45(Box43, { children: [
23941
23943
  /* @__PURE__ */ jsx46(Text45, { bold: true, dimColor: !active, children: `RATIONALE \u2014 ${componentName}` }),
23942
- overflowed && /* @__PURE__ */ jsxs45(Fragment13, { children: [
23944
+ overflowed && /* @__PURE__ */ jsxs45(Fragment14, { children: [
23943
23945
  /* @__PURE__ */ jsx46(Box43, { flexGrow: 1 }),
23944
23946
  /* @__PURE__ */ jsx46(Text45, { dimColor: !active, children: `\u2195 ${visibleStart}-${visibleEnd}/${totalLines}` })
23945
23947
  ] })
@@ -24663,7 +24665,7 @@ var init_history = __esm({
24663
24665
  // packages/experience-design-system-cli/src/import/tui/steps/GenerateReviewStep.tsx
24664
24666
  import { useEffect as useEffect13, useMemo as useMemo7, useRef as useRef7, useState as useState26 } from "react";
24665
24667
  import { Box as Box46, Text as Text48, useStdout as useStdout6 } from "ink";
24666
- import { Fragment as Fragment14, jsx as jsx49, jsxs as jsxs48 } from "react/jsx-runtime";
24668
+ import { Fragment as Fragment15, jsx as jsx49, jsxs as jsxs48 } from "react/jsx-runtime";
24667
24669
  function sortComponentsForSidebar2(components, cycleParticipants) {
24668
24670
  const isEmpty2 = (entry) => Object.keys(entry.$properties ?? {}).length === 0 && Object.keys(entry.$slots ?? {}).length === 0;
24669
24671
  const tier = (c2) => {
@@ -26057,7 +26059,7 @@ function GenerateReviewStep({
26057
26059
  const isCursor = idx === breakCursor;
26058
26060
  return /* @__PURE__ */ jsx49(Text48, { inverse: isCursor, children: `${isCursor ? "\u25B6" : " "} remove '${edge.toComponent}' from ${edge.fromComponent}.$slots.${edge.slotName}.$allowedComponents` }, `break-${idx}`);
26059
26061
  }),
26060
- breakConfirm ? /* @__PURE__ */ jsxs48(Fragment14, { children: [
26062
+ breakConfirm ? /* @__PURE__ */ jsxs48(Fragment15, { children: [
26061
26063
  /* @__PURE__ */ jsx49(Text48, { children: " " }),
26062
26064
  /* @__PURE__ */ jsx49(Text48, { bold: true, color: PALETTE.warning, children: "Delete this slot edge? [y] confirm [n] cancel" })
26063
26065
  ] }) : /* @__PURE__ */ jsx49(Text48, { dimColor: true, children: "[\u2191\u2193/j/k] move [Enter] delete [x/Esc] close" })
@@ -26139,7 +26141,7 @@ function GenerateReviewStep({
26139
26141
  ] }),
26140
26142
  removedComponents.length > 0 && !dialogOpen && /* @__PURE__ */ jsxs48(Box46, { flexDirection: "column", borderStyle: "round", borderColor: PALETTE.error, paddingX: 1, children: [
26141
26143
  /* @__PURE__ */ jsx49(Text48, { bold: true, color: PALETTE.error, children: removedComponentsHeader(removedComponents.length, true) }),
26142
- !removedBannerCollapsed && /* @__PURE__ */ jsxs48(Fragment14, { children: [
26144
+ !removedBannerCollapsed && /* @__PURE__ */ jsxs48(Fragment15, { children: [
26143
26145
  /* @__PURE__ */ jsx49(Text48, { children: " " }),
26144
26146
  removedComponents.map((rc) => /* @__PURE__ */ jsx49(Text48, { children: removedComponentLine(rc) }, rc.id))
26145
26147
  ] })
@@ -26316,7 +26318,7 @@ function GenerateReviewStep({
26316
26318
  graph: sidebarGraph
26317
26319
  }
26318
26320
  ),
26319
- /* @__PURE__ */ jsx49(Box46, { flexGrow: 1, paddingLeft: 1, flexDirection: "column", children: selected ? /* @__PURE__ */ jsxs48(Fragment14, { children: [
26321
+ /* @__PURE__ */ jsx49(Box46, { flexGrow: 1, paddingLeft: 1, flexDirection: "column", children: selected ? /* @__PURE__ */ jsxs48(Fragment15, { children: [
26320
26322
  /* @__PURE__ */ jsxs48(Box46, { children: [
26321
26323
  /* @__PURE__ */ jsx49(Text48, { bold: true, children: selected.key }),
26322
26324
  /* @__PURE__ */ jsx49(Box46, { flexGrow: 1 }),
@@ -26485,11 +26487,11 @@ function GenerateReviewStep({
26485
26487
  autocompleteCandidates.length > 1 && /* @__PURE__ */ jsx49(Text48, { dimColor: true, children: ` possibilities: ${autocompleteCandidates.join(" \xB7 ").slice(0, 120)}` })
26486
26488
  ] }),
26487
26489
  !dialogOpen && !searchOpen && searchQuery && /* @__PURE__ */ jsx49(Box46, { children: /* @__PURE__ */ jsx49(Text48, { dimColor: true, children: `/${searchQuery} (${searchMatchCount}/${components.length} matches) \xB7 [Esc] clear` }) }),
26488
- !dialogOpen && sidebarFocused && /* @__PURE__ */ jsx49(Box46, { columnGap: 2, flexWrap: "wrap", children: panelOpen === "token-review" ? /* @__PURE__ */ jsxs48(Fragment14, { children: [
26490
+ !dialogOpen && sidebarFocused && /* @__PURE__ */ jsx49(Box46, { columnGap: 2, flexWrap: "wrap", children: panelOpen === "token-review" ? /* @__PURE__ */ jsxs48(Fragment15, { children: [
26489
26491
  legendEntry("[\u2191/\u2193]", "move"),
26490
26492
  legendEntry("[Enter]", "edit allowed"),
26491
26493
  legendEntry("[Esc]", "close")
26492
- ] }) : /* @__PURE__ */ jsxs48(Fragment14, { children: [
26494
+ ] }) : /* @__PURE__ */ jsxs48(Fragment15, { children: [
26493
26495
  legendEntry("[j/k]", "move"),
26494
26496
  legendEntry("[a]", "accept"),
26495
26497
  legendEntry("[r]", "reject"),
@@ -26657,7 +26659,7 @@ var init_GenerateReviewStep = __esm({
26657
26659
  // packages/experience-design-system-cli/src/import/tui/steps/AtomicGenerateReviewStep.tsx
26658
26660
  import { useEffect as useEffect14, useRef as useRef8, useState as useState27 } from "react";
26659
26661
  import { Box as Box47, Text as Text49, useStdout as useStdout7 } from "ink";
26660
- import { Fragment as Fragment15, jsx as jsx50, jsxs as jsxs49 } from "react/jsx-runtime";
26662
+ import { Fragment as Fragment16, jsx as jsx50, jsxs as jsxs49 } from "react/jsx-runtime";
26661
26663
  function sortComponentsForSidebar3(components) {
26662
26664
  return [...components].sort((a, b) => {
26663
26665
  const aEmpty = Object.keys(a.entry.$properties ?? {}).length === 0;
@@ -27382,7 +27384,7 @@ function AtomicGenerateReviewStep({
27382
27384
  width: sidebarWidth
27383
27385
  }
27384
27386
  ),
27385
- /* @__PURE__ */ jsx50(Box47, { flexGrow: 1, paddingLeft: 1, flexDirection: "column", children: selected ? /* @__PURE__ */ jsxs49(Fragment15, { children: [
27387
+ /* @__PURE__ */ jsx50(Box47, { flexGrow: 1, paddingLeft: 1, flexDirection: "column", children: selected ? /* @__PURE__ */ jsxs49(Fragment16, { children: [
27386
27388
  /* @__PURE__ */ jsxs49(Box47, { children: [
27387
27389
  /* @__PURE__ */ jsx50(Text49, { bold: true, children: selected.key }),
27388
27390
  /* @__PURE__ */ jsx50(Box47, { flexGrow: 1 }),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contentful/experience-design-system-cli",
3
- "version": "2.32.1-dev-build-b7d2d34.0",
3
+ "version": "2.32.1-dev-build-71db090.0",
4
4
  "description": "Contentful Experiences design system import CLI",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -40,8 +40,8 @@
40
40
  "svelte": "^5.56.4",
41
41
  "ts-morph": "^27.0.2",
42
42
  "typescript": "^5.9.3",
43
- "@contentful/experience-design-system-cli-v2": "2.32.1-dev-build-b7d2d34.0",
44
- "@contentful/experience-design-system-types": "2.32.1-dev-build-b7d2d34.0"
43
+ "@contentful/experience-design-system-types": "2.32.1-dev-build-71db090.0",
44
+ "@contentful/experience-design-system-cli-v2": "2.32.1-dev-build-71db090.0"
45
45
  },
46
46
  "devDependencies": {
47
47
  "@tsconfig/node24": "^24.0.4",
@@ -53,9 +53,9 @@
53
53
  "ink-testing-library": "^4.0.0",
54
54
  "typescript-eslint": "^8.67.0",
55
55
  "vitest": "^4.0.16",
56
- "@contentful/experience-design-system-client": "2.32.1-dev-build-b7d2d34.0",
57
- "@contentful/experience-design-system-generation": "2.32.1-dev-build-b7d2d34.0",
58
- "@contentful/experience-design-system-extraction": "2.32.1-dev-build-b7d2d34.0"
56
+ "@contentful/experience-design-system-client": "2.32.1-dev-build-71db090.0",
57
+ "@contentful/experience-design-system-extraction": "2.32.1-dev-build-71db090.0",
58
+ "@contentful/experience-design-system-generation": "2.32.1-dev-build-71db090.0"
59
59
  },
60
60
  "repository": {
61
61
  "type": "git",
@@ -556,19 +556,19 @@ invent a `values` list. The uncertain answer is `cdf_type: "string"`, every time
556
556
 
557
557
  The preamble may include an "Existing components in the target Contentful space" JSON block with a `likelyMatch` (a fuzzy-matched space component that likely corresponds to the codebase component you're classifying), an `otherComponents` list, and a rolled-up token summary. Use it to align your classifications with what the customer already has.
558
558
 
559
- ### When `likelyMatch` is present — align prop names, categories, and slot names
559
+ ### When `likelyMatch` is present — align rename intent + categories + slot names
560
560
 
561
- Your goal is **consistency**: the customer will see the diff between what you propose and what already exists, and every unnecessary rename or category flip becomes review friction.
561
+ Your goal is **consistency**: the customer will see the diff between what you propose and what already exists, and every unnecessary category flip or slot-shape mismatch becomes review friction.
562
562
 
563
- 1. **Prop names**: if the codebase has a prop whose meaning matches a `likelyMatch` design/content property (e.g. codebase `kind` ↔ space `variant`, codebase `text` ↔ space `label`), emit `classify_prop` with the **space's prop name** rather than the codebase name. In the `reason` field, always explain the rename explicitly, e.g. `"renamed from codebase prop 'kind' to match existing space prop 'variant'"`. If you can't confidently identify the correspondence, keep the codebase name.
563
+ 1. **Prop names**: `classify_prop.prop` MUST always be the codebase prop name — that's the DB lookup key. When a codebase prop looks like it corresponds to an existing space prop (e.g. codebase `kind` ↔ space `variant`, codebase `text` ↔ space `label`), keep `prop` as the codebase name and put the alignment note in `reason`, e.g. `"looks like existing space prop 'variant' — customer may want to reconcile at review"`. Never rewrite `prop` itself; reconciliation happens downstream, not in this tool call.
564
564
  2. **Categories**: match the space's category (`design` / `content`) for equivalent props, even if you'd normally categorize differently. Note the alignment in `reason`.
565
565
  3. **Slot names**: match slot IDs / names when the shape is equivalent.
566
566
  4. **Enum values**: never invent new values to bridge a mismatch. If the codebase's enum diverges from the space's, classify against your best-effort mapping and cite the divergence in `reason` — this is a signal for human review, not a green light to rewrite the space's enum.
567
- 5. **Never rename or realign silently.** Every classification influenced by the `likelyMatch` MUST cite it in `reason`.
567
+ 5. **Never realign silently.** Every classification influenced by the `likelyMatch` MUST cite it in `reason`.
568
568
 
569
569
  ### When only `otherComponents` is present (no direct match)
570
570
 
571
- Use the list to constrain slot `allowedComponents` — do not propose a slot that accepts component types the space doesn't have.
571
+ Use the list to constrain slot `allowed_components` — do not propose a slot that accepts component types the space doesn't have.
572
572
 
573
573
  ### Token binding
574
574