{
  "version": 1,
  "format": "json",
  "kind": "recommend-options",
  "mode": "full",
  "rules_revision": "2026-10-18",
  "calibrated_presets": "20261017",
  "input": {
    "source": "file",
    "input_file_type": "openapi",
    "document": "OpenAPI 3.1.0",
    "analysed": true
  },
  "context": {
    "output_model_type": "pydantic_v2.BaseModel",
    "target_python_version": "3.14"
  },
  "signals": {
    "all_enums": 6,
    "boolean_exclusive_bounds": 0,
    "coercible_scalars": 5,
    "component_enums": 0,
    "component_title_duplicate_groups": 0,
    "component_titles_equal_other_key": 0,
    "component_titles_equal_own_key": 0,
    "component_titles_in_duplicate_groups": 0,
    "components": 6,
    "decimal_formats": 0,
    "discriminated_unions": 0,
    "dotted_key_namespaces": 2,
    "dotted_keys": 2,
    "dotted_namespace_reference_cycles": 1,
    "duplicate_inline_enum_shapes": 0,
    "duplicate_inline_enums": 0,
    "duplicate_inline_objects": 10,
    "duplicate_inline_shapes": 2,
    "estimated_models": 26,
    "formats": 0,
    "inline_enums": 6,
    "inline_names_equal_component": 0,
    "inline_object_union_variants": 2,
    "inline_objects": 12,
    "inline_scalar_union_variants": 0,
    "inline_tagged_union_branches": 2,
    "inline_title_max_repeat": 5,
    "inline_titled_objects": 5,
    "inline_titled_union_variants": 0,
    "inline_union_variants": 2,
    "integer_range_formats": 0,
    "max_inline_depth": 1,
    "multiple_of": 0,
    "nullable_keywords": 0,
    "operations": 2,
    "parent_copy_union_branches": 0,
    "pattern_properties": 0,
    "root_is_object": 0,
    "root_title_words": 0,
    "shared_inline_enum_names": 2,
    "shared_inline_names": 4,
    "shared_inline_object_names": 2,
    "single_key_required_open": 0,
    "single_key_union_branches": 0,
    "single_value_enum_union_branches": 0,
    "single_value_enums": 0,
    "tagged_behind_ref": 0,
    "titled_components": 0,
    "unions": 1,
    "unique_items": 0,
    "unmodeled_pattern_properties": 0
  },
  "facts": {
    "schema": "OpenAPI 3.1.0",
    "scopes": "schemas",
    "shared_inline_name_examples": "status x3, owner x3, state x2, total x2",
    "inline_title_examples": "User x5",
    "duplicate_title_examples": "",
    "key_style": "PascalCase (4 of 6)",
    "root_title": "",
    "format_examples": ""
  },
  "baseline": {
    "preset": "standard-py314-20261017",
    "family": "standard",
    "configured": false,
    "covers": []
  },
  "recommendations": [
    {
      "rule": "enums.inline-value-sets-as-literal",
      "decision": "enum-shape",
      "set": {
        "enum_field_as_literal": "all"
      },
      "arguments": [
        "--enum-field-as-literal",
        "all"
      ],
      "reason": "Most enums are inline value sets of one property (inline enums: 6 of 6). As Enum classes they add one class name each, the longest and most numbered names; Literal types keep the values without a class.",
      "contested_reason": null,
      "caveats": [],
      "evidence": [
        "GitHub REST API description: 1872 -> 1538 types, names over 40 characters 370 -> 227",
        "Stripe API description: problem names 348 -> 158",
        "SchemaStore workflow schema: Type1 to Type19 disappear"
      ],
      "trial": {
        "before": "recommended - naming-strategy - enum-shape",
        "after": "recommended - naming-strategy",
        "changes": {
          "matched": 9,
          "renamed": 0,
          "renumbered": 0,
          "removed": 6,
          "added": 0,
          "examples": []
        }
      }
    },
    {
      "rule": "reuse.identical-inline-shapes",
      "decision": "reuse",
      "set": {
        "reuse_model": true,
        "collapse_reuse_models": true
      },
      "arguments": [
        "--reuse-model",
        "--collapse-reuse-models"
      ],
      "reason": "The schema repeats shapes (inline objects repeating a shape: 10, in 2 shapes; inline enums repeating a value set: 0, in 0 sets; union branches that only constrain their parent's properties, which generation copies per branch: 0). Reuse emits each shape once, and collapse refers to it instead of an empty subclass.",
      "contested_reason": null,
      "caveats": [],
      "evidence": [
        "GitHub REST API description: 3263 -> 1872 types, numbered names 1774 -> 663",
        "Stripe API description: 2512 -> 2022 types",
        "SchemaStore workflow schema: the step branches' copies With1 to With11 became one With1"
      ],
      "trial": {
        "before": "recommended - naming-strategy - reuse",
        "after": "recommended - naming-strategy",
        "changes": {
          "matched": 9,
          "renamed": 0,
          "renumbered": 0,
          "removed": 5,
          "added": 0,
          "examples": []
        }
      }
    },
    {
      "rule": "dotted-keys.flat-when-namespaces-cycle",
      "decision": "dotted-keys",
      "set": {
        "treat_dot_as_module": false
      },
      "arguments": [
        "--no-treat-dot-as-module"
      ],
      "reason": "Dotted keys (2, in 2 namespaces) reference each other in cycles (namespace groups: 1). As modules, cycle members move to _internal.py, where same-named classes of different namespaces get _1 suffixes; flat names avoid that.",
      "contested_reason": null,
      "caveats": [],
      "evidence": [
        "Stripe API description: Card_1 and Customer_1 disappear, problem names 158 -> 153",
        "Kubernetes apps/v1: no cycles, so modules stay (median name length 16 as modules, 32 flat)"
      ],
      "trial": {
        "before": "recommended - naming-strategy - dotted-keys",
        "after": "recommended - naming-strategy",
        "changes": {
          "matched": 9,
          "renamed": 2,
          "renumbered": 0,
          "removed": 3,
          "added": 0,
          "examples": [
            {
              "location": "components/schemas/billing.Invoice",
              "before": "Invoice",
              "after": "BillingInvoice"
            },
            {
              "location": "components/schemas/shipping.Shipment",
              "before": "Shipment",
              "after": "ShippingShipment"
            }
          ]
        }
      }
    },
    {
      "rule": "unions.name-variants-after-tags",
      "decision": "union-variant-names",
      "set": {
        "use_tag_as_union_variant_name": true
      },
      "arguments": [
        "--use-tag-as-union-variant-name"
      ],
      "reason": "Inline oneOf/anyOf branches can be named after a tag or key (branches with a tag value no sibling shares: 2; objects with one required key: 0); otherwise they are named after their parent and a number.",
      "contested_reason": null,
      "caveats": [],
      "evidence": [
        "OpenAI API description (59 tagged, 10 key branches): preset 797 -> 759 problem names (ThreadStreamEvent1 -> ThreadStreamEventThreadCreated)",
        "GitHub REST API description (1 tagged, 4 key branches): preset 1808 -> 1805 (Changes23 -> ChangesBody)",
        "SchemaStore workflow schema (5 tagged): 49 -> 44 (WorkflowDispatchInput1 to 5 -> WorkflowDispatchInputString, Boolean, ...)",
        "with full-path on the GitHub and OpenAI descriptions: no change in problem names; schemas without tagged or key branches: no change"
      ],
      "trial": {
        "before": "recommended - naming-strategy - union-variant-names",
        "after": "recommended - naming-strategy",
        "changes": {
          "matched": 9,
          "renamed": 2,
          "renumbered": 0,
          "removed": 0,
          "added": 0,
          "examples": [
            {
              "location": "components/schemas/Payment > oneOf 0",
              "before": "Payment1",
              "after": "PaymentCard"
            },
            {
              "location": "components/schemas/Payment > oneOf 1",
              "before": "Payment2",
              "after": "PaymentBank"
            }
          ]
        }
      }
    }
  ],
  "left_out": [
    {
      "rule": "naming.qualify-shared-inline-names",
      "decision": "naming-strategy",
      "set": {
        "naming_strategy": "full-path"
      },
      "arguments": [
        "--naming-strategy",
        "full-path"
      ],
      "reason": "Inline schemas under different parents share property names (names: 4, e.g. status x3, owner x3, state x2, total x2; inline names equal to a component name: 0). Numbered names (Status, Status1) depend on parse order and shift when the schema grows; full-path names each inline model after its parent.",
      "contested_reason": null,
      "caveats": [],
      "evidence": [
        "GitHub REST API description: numbered names 663 -> 53; locations renamed between two versions 17% -> 0.0%",
        "Petstore: Status and Status1 became OrderStatus and PetStatus",
        "Stripe API description: the expandable ID string of charge no longer displaces the charge component (ChargeModel)",
        "SchemaStore workflow and tsconfig schemas: full-path doubled or lengthened names and lost"
      ],
      "trial": {
        "before": "recommended - naming-strategy",
        "after": "recommended",
        "changes": {
          "matched": 9,
          "renamed": 4,
          "renumbered": 0,
          "removed": 0,
          "added": 0,
          "examples": [
            {
              "location": "components/schemas/Order > total",
              "before": "Total",
              "after": "OrderTotal"
            },
            {
              "location": "components/schemas/Payment > oneOf 0",
              "before": "PaymentCard",
              "after": "PaymentPaymentCard"
            },
            {
              "location": "components/schemas/Payment > oneOf 1",
              "before": "PaymentBank",
              "after": "PaymentPaymentBank"
            }
          ]
        }
      }
    }
  ],
  "consider": [],
  "validation": [],
  "policy": [
    {
      "rule": "policy.strict-scalar-types",
      "decision": "strict-types",
      "set": {
        "strict_types": [
          "int",
          "float",
          "bool"
        ]
      },
      "arguments": [
        "--strict-types",
        "int",
        "float",
        "bool"
      ],
      "reason": "Pydantic validates in lax mode, which coerces input into the 5 integer, number and boolean schemas: it accepts the string \"5\" and true as integers, \"1.5\" as a number, and \"true\" or 1 as booleans. Strict types reject such input. Whether to accept it depends on the project's clients, not on the schema; strict int also rejects 5.0, which JSON Schema counts as an integer, so leave int out to accept it.",
      "contested_reason": null,
      "caveats": [],
      "evidence": [
        "11 JSON documents for integer, number, boolean and string properties, 6 of them invalid: lax mode accepted 5 invalid ones; with int float bool, 0 accepted and 1 valid one rejected (5.0 as an integer); with float bool, 2 accepted (\"5\" and true as integers) and none rejected"
      ],
      "trial": null
    }
  ],
  "not_recommended": [
    {
      "rule": "titles.keys-when-titles-collide",
      "decision": "title-source",
      "set": {
        "use_title_as_name": false
      },
      "arguments": [
        "--use-title-as-name"
      ],
      "reason": "Titles do not identify the schemas (shared titles: 0, covering 0 components; titles equal to another component's key: 0; most repeated inline title: 5; titles that repeat their own key: 0 of 0). Titles as class names would number components, or rename them when a title changes; names from the keys avoid both.",
      "contested_reason": null,
      "caveats": [],
      "evidence": [
        "GitHub REST API description: 53 shared component titles numbered components (page-deployment became GitHubPages1, Actor2)",
        "OpenAI API description: 503 problem names with titles off, 544 with titles on",
        "Stripe API description: 17% of component titles changed in four months; class names from keys renamed 0.0% of locations"
      ],
      "trial": null
    }
  ],
  "disagreements": [],
  "trial": {
    "metrics_version": 2,
    "candidates": [
      {
        "label": "current",
        "preset": null,
        "set": {},
        "arguments": [],
        "selectable": false,
        "error": null,
        "dropped_constraint_warnings": 0,
        "metrics": {
          "types": 22,
          "component": 6,
          "inline": 16,
          "operation": 0,
          "readable": 17,
          "numbered": 5,
          "statuscode": 0,
          "generic": 0,
          "long": 0,
          "doubled": 0,
          "doubled_from_spec": 0,
          "other_problems": 0,
          "displaced": 0,
          "inline_like_component": 2,
          "union_variants": 2,
          "union_variants_parent_numbered": 2,
          "union_variants_numbered": 2,
          "median_length": 6,
          "max_length": 9,
          "problems": 5,
          "problems_percent": 22.7
        },
        "stability": null
      },
      {
        "label": "preset",
        "preset": "standard-py314-20261017",
        "set": {},
        "arguments": [],
        "selectable": true,
        "error": null,
        "dropped_constraint_warnings": 0,
        "metrics": {
          "types": 22,
          "component": 6,
          "inline": 16,
          "operation": 0,
          "readable": 17,
          "numbered": 5,
          "statuscode": 0,
          "generic": 0,
          "long": 0,
          "doubled": 0,
          "doubled_from_spec": 0,
          "other_problems": 0,
          "displaced": 0,
          "inline_like_component": 2,
          "union_variants": 2,
          "union_variants_parent_numbered": 2,
          "union_variants_numbered": 2,
          "median_length": 6,
          "max_length": 9,
          "problems": 5,
          "problems_percent": 22.7
        },
        "stability": null
      },
      {
        "label": "recommended",
        "preset": "standard-py314-20261017",
        "set": {
          "naming_strategy": "full-path",
          "enum_field_as_literal": "all",
          "reuse_model": true,
          "collapse_reuse_models": true,
          "treat_dot_as_module": false,
          "use_tag_as_union_variant_name": true
        },
        "arguments": [
          "--naming-strategy",
          "full-path",
          "--enum-field-as-literal",
          "all",
          "--reuse-model",
          "--collapse-reuse-models",
          "--no-treat-dot-as-module",
          "--use-tag-as-union-variant-name"
        ],
        "selectable": true,
        "error": null,
        "dropped_constraint_warnings": 0,
        "metrics": {
          "types": 9,
          "component": 5,
          "inline": 4,
          "operation": 0,
          "readable": 9,
          "numbered": 0,
          "statuscode": 0,
          "generic": 0,
          "long": 0,
          "doubled": 2,
          "doubled_from_spec": 0,
          "other_problems": 0,
          "displaced": 0,
          "inline_like_component": 0,
          "union_variants": 2,
          "union_variants_parent_numbered": 0,
          "union_variants_numbered": 0,
          "median_length": 10,
          "max_length": 18,
          "problems": 2,
          "problems_percent": 22.2
        },
        "stability": null
      },
      {
        "label": "recommended - naming-strategy",
        "preset": "standard-py314-20261017",
        "set": {
          "enum_field_as_literal": "all",
          "reuse_model": true,
          "collapse_reuse_models": true,
          "treat_dot_as_module": false,
          "use_tag_as_union_variant_name": true
        },
        "arguments": [
          "--enum-field-as-literal",
          "all",
          "--reuse-model",
          "--collapse-reuse-models",
          "--no-treat-dot-as-module",
          "--use-tag-as-union-variant-name"
        ],
        "selectable": true,
        "error": null,
        "dropped_constraint_warnings": 0,
        "metrics": {
          "types": 9,
          "component": 5,
          "inline": 4,
          "operation": 0,
          "readable": 9,
          "numbered": 0,
          "statuscode": 0,
          "generic": 0,
          "long": 0,
          "doubled": 0,
          "doubled_from_spec": 0,
          "other_problems": 0,
          "displaced": 0,
          "inline_like_component": 0,
          "union_variants": 2,
          "union_variants_parent_numbered": 0,
          "union_variants_numbered": 0,
          "median_length": 5,
          "max_length": 16,
          "problems": 0,
          "problems_percent": 0.0
        },
        "stability": null
      },
      {
        "label": "recommended - enum-shape",
        "preset": "standard-py314-20261017",
        "set": {
          "naming_strategy": "full-path",
          "reuse_model": true,
          "collapse_reuse_models": true,
          "treat_dot_as_module": false,
          "use_tag_as_union_variant_name": true
        },
        "arguments": [
          "--naming-strategy",
          "full-path",
          "--reuse-model",
          "--collapse-reuse-models",
          "--no-treat-dot-as-module",
          "--use-tag-as-union-variant-name"
        ],
        "selectable": true,
        "error": null,
        "dropped_constraint_warnings": 0,
        "metrics": {
          "types": 15,
          "component": 5,
          "inline": 10,
          "operation": 0,
          "readable": 15,
          "numbered": 0,
          "statuscode": 0,
          "generic": 0,
          "long": 0,
          "doubled": 2,
          "doubled_from_spec": 0,
          "other_problems": 0,
          "displaced": 0,
          "inline_like_component": 0,
          "union_variants": 2,
          "union_variants_parent_numbered": 0,
          "union_variants_numbered": 0,
          "median_length": 11,
          "max_length": 21,
          "problems": 2,
          "problems_percent": 13.3
        },
        "stability": null
      },
      {
        "label": "recommended - reuse",
        "preset": "standard-py314-20261017",
        "set": {
          "naming_strategy": "full-path",
          "enum_field_as_literal": "all",
          "treat_dot_as_module": false,
          "use_tag_as_union_variant_name": true
        },
        "arguments": [
          "--naming-strategy",
          "full-path",
          "--enum-field-as-literal",
          "all",
          "--no-treat-dot-as-module",
          "--use-tag-as-union-variant-name"
        ],
        "selectable": true,
        "error": null,
        "dropped_constraint_warnings": 0,
        "metrics": {
          "types": 17,
          "component": 5,
          "inline": 12,
          "operation": 0,
          "readable": 17,
          "numbered": 0,
          "statuscode": 0,
          "generic": 0,
          "long": 0,
          "doubled": 2,
          "doubled_from_spec": 0,
          "other_problems": 0,
          "displaced": 0,
          "inline_like_component": 0,
          "union_variants": 2,
          "union_variants_parent_numbered": 0,
          "union_variants_numbered": 0,
          "median_length": 14,
          "max_length": 25,
          "problems": 2,
          "problems_percent": 11.8
        },
        "stability": null
      },
      {
        "label": "recommended - dotted-keys",
        "preset": "standard-py314-20261017",
        "set": {
          "naming_strategy": "full-path",
          "enum_field_as_literal": "all",
          "reuse_model": true,
          "collapse_reuse_models": true,
          "use_tag_as_union_variant_name": true
        },
        "arguments": [
          "--naming-strategy",
          "full-path",
          "--enum-field-as-literal",
          "all",
          "--reuse-model",
          "--collapse-reuse-models",
          "--use-tag-as-union-variant-name"
        ],
        "selectable": true,
        "error": null,
        "dropped_constraint_warnings": 0,
        "metrics": {
          "types": 14,
          "component": 6,
          "inline": 8,
          "operation": 0,
          "readable": 14,
          "numbered": 0,
          "statuscode": 0,
          "generic": 0,
          "long": 0,
          "doubled": 2,
          "doubled_from_spec": 0,
          "other_problems": 0,
          "displaced": 0,
          "inline_like_component": 0,
          "union_variants": 2,
          "union_variants_parent_numbered": 0,
          "union_variants_numbered": 0,
          "median_length": 7,
          "max_length": 18,
          "problems": 2,
          "problems_percent": 14.3
        },
        "stability": null
      },
      {
        "label": "recommended - union-variant-names",
        "preset": "standard-py314-20261017",
        "set": {
          "naming_strategy": "full-path",
          "enum_field_as_literal": "all",
          "reuse_model": true,
          "collapse_reuse_models": true,
          "treat_dot_as_module": false
        },
        "arguments": [
          "--naming-strategy",
          "full-path",
          "--enum-field-as-literal",
          "all",
          "--reuse-model",
          "--collapse-reuse-models",
          "--no-treat-dot-as-module"
        ],
        "selectable": true,
        "error": null,
        "dropped_constraint_warnings": 0,
        "metrics": {
          "types": 9,
          "component": 5,
          "inline": 4,
          "operation": 0,
          "readable": 8,
          "numbered": 1,
          "statuscode": 0,
          "generic": 0,
          "long": 0,
          "doubled": 2,
          "doubled_from_spec": 0,
          "other_problems": 0,
          "displaced": 0,
          "inline_like_component": 0,
          "union_variants": 2,
          "union_variants_parent_numbered": 0,
          "union_variants_numbered": 1,
          "median_length": 10,
          "max_length": 16,
          "problems": 2,
          "problems_percent": 22.2
        },
        "stability": null
      },
      {
        "label": "recommended - naming-strategy - enum-shape",
        "preset": "standard-py314-20261017",
        "set": {
          "reuse_model": true,
          "collapse_reuse_models": true,
          "treat_dot_as_module": false,
          "use_tag_as_union_variant_name": true
        },
        "arguments": [
          "--reuse-model",
          "--collapse-reuse-models",
          "--no-treat-dot-as-module",
          "--use-tag-as-union-variant-name"
        ],
        "selectable": false,
        "error": null,
        "dropped_constraint_warnings": 0,
        "metrics": {
          "types": 15,
          "component": 5,
          "inline": 10,
          "operation": 0,
          "readable": 12,
          "numbered": 3,
          "statuscode": 0,
          "generic": 0,
          "long": 0,
          "doubled": 0,
          "doubled_from_spec": 0,
          "other_problems": 0,
          "displaced": 0,
          "inline_like_component": 0,
          "union_variants": 2,
          "union_variants_parent_numbered": 0,
          "union_variants_numbered": 0,
          "median_length": 6,
          "max_length": 16,
          "problems": 3,
          "problems_percent": 20.0
        },
        "stability": null
      },
      {
        "label": "recommended - naming-strategy - reuse",
        "preset": "standard-py314-20261017",
        "set": {
          "enum_field_as_literal": "all",
          "treat_dot_as_module": false,
          "use_tag_as_union_variant_name": true
        },
        "arguments": [
          "--enum-field-as-literal",
          "all",
          "--no-treat-dot-as-module",
          "--use-tag-as-union-variant-name"
        ],
        "selectable": false,
        "error": null,
        "dropped_constraint_warnings": 0,
        "metrics": {
          "types": 14,
          "component": 5,
          "inline": 9,
          "operation": 0,
          "readable": 14,
          "numbered": 0,
          "statuscode": 0,
          "generic": 0,
          "long": 0,
          "doubled": 0,
          "doubled_from_spec": 0,
          "other_problems": 0,
          "displaced": 0,
          "inline_like_component": 0,
          "union_variants": 2,
          "union_variants_parent_numbered": 0,
          "union_variants_numbered": 0,
          "median_length": 5,
          "max_length": 16,
          "problems": 0,
          "problems_percent": 0.0
        },
        "stability": null
      },
      {
        "label": "recommended - naming-strategy - dotted-keys",
        "preset": "standard-py314-20261017",
        "set": {
          "enum_field_as_literal": "all",
          "reuse_model": true,
          "collapse_reuse_models": true,
          "use_tag_as_union_variant_name": true
        },
        "arguments": [
          "--enum-field-as-literal",
          "all",
          "--reuse-model",
          "--collapse-reuse-models",
          "--use-tag-as-union-variant-name"
        ],
        "selectable": false,
        "error": null,
        "dropped_constraint_warnings": 0,
        "metrics": {
          "types": 12,
          "component": 6,
          "inline": 6,
          "operation": 0,
          "readable": 12,
          "numbered": 0,
          "statuscode": 0,
          "generic": 0,
          "long": 0,
          "doubled": 0,
          "doubled_from_spec": 0,
          "other_problems": 0,
          "displaced": 0,
          "inline_like_component": 0,
          "union_variants": 2,
          "union_variants_parent_numbered": 0,
          "union_variants_numbered": 0,
          "median_length": 5,
          "max_length": 11,
          "problems": 0,
          "problems_percent": 0.0
        },
        "stability": null
      },
      {
        "label": "recommended - naming-strategy - union-variant-names",
        "preset": "standard-py314-20261017",
        "set": {
          "enum_field_as_literal": "all",
          "reuse_model": true,
          "collapse_reuse_models": true,
          "treat_dot_as_module": false
        },
        "arguments": [
          "--enum-field-as-literal",
          "all",
          "--reuse-model",
          "--collapse-reuse-models",
          "--no-treat-dot-as-module"
        ],
        "selectable": false,
        "error": null,
        "dropped_constraint_warnings": 0,
        "metrics": {
          "types": 9,
          "component": 5,
          "inline": 4,
          "operation": 0,
          "readable": 7,
          "numbered": 2,
          "statuscode": 0,
          "generic": 0,
          "long": 0,
          "doubled": 0,
          "doubled_from_spec": 0,
          "other_problems": 0,
          "displaced": 0,
          "inline_like_component": 2,
          "union_variants": 2,
          "union_variants_parent_numbered": 2,
          "union_variants_numbered": 2,
          "median_length": 5,
          "max_length": 16,
          "problems": 2,
          "problems_percent": 22.2
        },
        "stability": null
      }
    ],
    "ranking": [
      "recommended - naming-strategy",
      "recommended - naming-strategy - reuse",
      "recommended - naming-strategy - dotted-keys",
      "recommended - naming-strategy - union-variant-names",
      "recommended - dotted-keys",
      "recommended",
      "recommended - enum-shape",
      "recommended - reuse",
      "recommended - naming-strategy - enum-shape",
      "recommended - union-variant-names",
      "current",
      "preset"
    ],
    "selected": "recommended - naming-strategy",
    "current": "current",
    "migration": {
      "matched": 9,
      "renamed": 4,
      "renumbered": 0,
      "removed": 13,
      "added": 0,
      "examples": [
        {
          "location": "components/schemas/Payment > oneOf 0",
          "before": "Payment1",
          "after": "PaymentCard"
        },
        {
          "location": "components/schemas/Payment > oneOf 1",
          "before": "Payment2",
          "after": "PaymentBank"
        },
        {
          "location": "components/schemas/billing.Invoice",
          "before": "Invoice",
          "after": "BillingInvoice"
        }
      ]
    },
    "dropped": 0,
    "remeasured": 4
  },
  "notes": [],
  "arguments": [
    "--collapse-reuse-models",
    "--enum-field-as-literal",
    "all",
    "--input",
    "api.yaml",
    "--preset",
    "standard-py314-20261017",
    "--reuse-model",
    "--target-python-version",
    "3.14",
    "--no-treat-dot-as-module",
    "--use-tag-as-union-variant-name"
  ],
  "config": {
    "tool": {
      "datamodel-codegen": {
        "collapse-reuse-models": true,
        "enum-field-as-literal": "all",
        "input": "api.yaml",
        "preset": "standard-py314-20261017",
        "reuse-model": true,
        "target-python-version": "3.14",
        "treat-dot-as-module": false,
        "use-tag-as-union-variant-name": true
      }
    }
  },
  "config_complete": true,
  "content": "Option recommendations (experimental; full mode; rules 2026-10-18)\n\nSchema  OpenAPI 3.1.0 (OpenAPI scopes: schemas)\n  components                       6, 2 operations\n  inline objects / enums           12 / 6, nesting depth 1\n  shared property names            4 (status x3, owner x3, state x2, total x2)\n  inline names = component names   0\n  repeated inline objects / enums  10 of 2 shapes / 0 of 0 value sets\n  titled components                0: 0 shared titles (none), 0 equal another key, 0 equal their own key\n  inline titles                    5 objects, most repeated 5 (User x5)\n  unions                           1 oneOf/anyOf, 0 with a discriminator, 2 inline variants\n  union branch tags                2 tagged, 0 single required key, 0 tagged only through allOf $ref, 0 copy their parent\n  component keys                   PascalCase (4 of 6); 2 dotted in 2 namespaces\n  constraint keywords              uniqueItems 0, patternProperties 0 (0 beyond a typed map), multipleOf 0, OpenAPI 3.0 nullable 0, boolean exclusive bounds 0\n  formats                          0 (none), decimal 0; int32/int64 0, ranges not enforced\n  integer/number/boolean schemas   5\n\nStart from  --preset standard-py314-20261017\n\nAdd (5 options)\n  --enum-field-as-literal all   [enums.inline-value-sets-as-literal]\n      Most enums are inline value sets of one property (inline enums: 6 of 6). As Enum classes they\n      add one class name each, the longest and most numbered names; Literal types keep the values\n      without a class.\n      measured: GitHub REST API description: 1872 -> 1538 types, names over 40 characters 370 -> 227\n      measured: Stripe API description: problem names 348 -> 158\n      measured: SchemaStore workflow schema: Type1 to Type19 disappear\n      trial: recommended - naming-strategy - enum-shape -> recommended - naming-strategy: classes 15\n      -> 9, problem names 3 -> 0; 0 of 9 classes matched by schema location renamed (0 only\n      renumbered), 6 removed, 0 added\n  --reuse-model --collapse-reuse-models   [reuse.identical-inline-shapes]\n      The schema repeats shapes (inline objects repeating a shape: 10, in 2 shapes; inline enums\n      repeating a value set: 0, in 0 sets; union branches that only constrain their parent's\n      properties, which generation copies per branch: 0). Reuse emits each shape once, and collapse\n      refers to it instead of an empty subclass.\n      measured: GitHub REST API description: 3263 -> 1872 types, numbered names 1774 -> 663\n      measured: Stripe API description: 2512 -> 2022 types\n      measured: SchemaStore workflow schema: the step branches' copies With1 to With11 became one\n      With1\n      trial: recommended - naming-strategy - reuse -> recommended - naming-strategy: classes 14 ->\n      9, problem names 0 -> 0; 0 of 9 classes matched by schema location renamed (0 only\n      renumbered), 5 removed, 0 added\n  --no-treat-dot-as-module   [dotted-keys.flat-when-namespaces-cycle]\n      Dotted keys (2, in 2 namespaces) reference each other in cycles (namespace groups: 1). As\n      modules, cycle members move to _internal.py, where same-named classes of different namespaces\n      get _1 suffixes; flat names avoid that.\n      measured: Stripe API description: Card_1 and Customer_1 disappear, problem names 158 -> 153\n      measured: Kubernetes apps/v1: no cycles, so modules stay (median name length 16 as modules, 32\n      flat)\n      trial: recommended - naming-strategy - dotted-keys -> recommended - naming-strategy: classes\n      12 -> 9, problem names 0 -> 0; 2 of 9 classes matched by schema location renamed (0 only\n      renumbered), 3 removed, 0 added, e.g.\n        Invoice -> BillingInvoice   at components/schemas/billing.Invoice\n        Shipment -> ShippingShipment   at components/schemas/shipping.Shipment\n  --use-tag-as-union-variant-name   [unions.name-variants-after-tags]\n      Inline oneOf/anyOf branches can be named after a tag or key (branches with a tag value no\n      sibling shares: 2; objects with one required key: 0); otherwise they are named after their\n      parent and a number.\n      measured: OpenAI API description (59 tagged, 10 key branches): preset 797 -> 759 problem names\n      (ThreadStreamEvent1 -> ThreadStreamEventThreadCreated)\n      measured: GitHub REST API description (1 tagged, 4 key branches): preset 1808 -> 1805\n      (Changes23 -> ChangesBody)\n      measured: SchemaStore workflow schema (5 tagged): 49 -> 44 (WorkflowDispatchInput1 to 5 ->\n      WorkflowDispatchInputString, Boolean, ...)\n      measured: with full-path on the GitHub and OpenAI descriptions: no change in problem names;\n      schemas without tagged or key branches: no change\n      trial: recommended - naming-strategy - union-variant-names -> recommended - naming-strategy:\n      classes 9 -> 9, problem names 2 -> 0; 2 of 9 classes matched by schema location renamed (0\n      only renumbered), 0 removed, 0 added, e.g.\n        Payment1 -> PaymentCard   at components/schemas/Payment > oneOf 0\n        Payment2 -> PaymentBank   at components/schemas/Payment > oneOf 1\n\nLeft out after the trial (the rules recommend these)\n  --naming-strategy full-path   [naming.qualify-shared-inline-names]\n      Inline schemas under different parents share property names (names: 4, e.g. status x3, owner\n      x3, state x2, total x2; inline names equal to a component name: 0). Numbered names (Status,\n      Status1) depend on parse order and shift when the schema grows; full-path names each inline\n      model after its parent.\n      measured: GitHub REST API description: numbered names 663 -> 53; locations renamed between two\n      versions 17% -> 0.0%\n      measured: Petstore: Status and Status1 became OrderStatus and PetStatus\n      measured: Stripe API description: the expandable ID string of charge no longer displaces the\n      charge component (ChargeModel)\n      measured: SchemaStore workflow and tsconfig schemas: full-path doubled or lengthened names and\n      lost\n      trial: recommended - naming-strategy -> recommended: classes 9 -> 9, problem names 0 -> 2; 4\n      of 9 classes matched by schema location renamed (0 only renumbered), 0 removed, 0 added, e.g.\n        Total -> OrderTotal   at components/schemas/Order > total\n        PaymentCard -> PaymentPaymentCard   at components/schemas/Payment > oneOf 0\n        PaymentBank -> PaymentPaymentBank   at components/schemas/Payment > oneOf 1\n\nOptional (policy; not in the command)\n  --strict-types int float bool   [policy.strict-scalar-types]\n      Pydantic validates in lax mode, which coerces input into the 5 integer, number and boolean\n      schemas: it accepts the string \"5\" and true as integers, \"1.5\" as a number, and \"true\" or 1 as\n      booleans. Strict types reject such input. Whether to accept it depends on the project's\n      clients, not on the schema; strict int also rejects 5.0, which JSON Schema counts as an\n      integer, so leave int out to accept it.\n      measured: 11 JSON documents for integer, number, boolean and string properties, 6 of them\n      invalid: lax mode accepted 5 invalid ones; with int float bool, 0 accepted and 1 valid one\n      rejected (5.0 as an integer); with float bool, 2 accepted (\"5\" and true as integers) and none\n      rejected\n\nNot recommended\n  --use-title-as-name   [titles.keys-when-titles-collide]\n      Titles do not identify the schemas (shared titles: 0, covering 0 components; titles equal to\n      another component's key: 0; most repeated inline title: 5; titles that repeat their own key: 0\n      of 0). Titles as class names would number components, or rename them when a title changes;\n      names from the keys avoid both.\n      measured: GitHub REST API description: 53 shared component titles numbered components\n      (page-deployment became GitHubPages1, Actor2)\n      measured: OpenAI API description: 503 problem names with titles off, 544 with titles on\n      measured: Stripe API description: 17% of component titles changed in four months; class names\n      from keys renamed 0.0% of locations\n\nTrial  12 candidates generated in memory without formatting; nothing written\n  candidate                                            classes   problems  numbered  long  doubled  displaced  median  unconstrained\n  current                                                   22  5 (22.7%)         5     0        0          0       6              0\n  preset                                                    22  5 (22.7%)         5     0        0          0       6              0\n  recommended                                                9  2 (22.2%)         0     0        2          0      10              0\n  recommended - naming-strategy                              9   0 (0.0%)         0     0        0          0       5              0   selected\n  recommended - enum-shape                                  15  2 (13.3%)         0     0        2          0      11              0\n  recommended - reuse                                       17  2 (11.8%)         0     0        2          0      14              0\n  recommended - dotted-keys                                 14  2 (14.3%)         0     0        2          0       7              0\n  recommended - union-variant-names                          9  2 (22.2%)         1     0        2          0      10              0\n  recommended - naming-strategy - enum-shape                15  3 (20.0%)         3     0        0          0       6              0\n  recommended - naming-strategy - reuse                     14   0 (0.0%)         0     0        0          0       5              0\n  recommended - naming-strategy - dotted-keys               12   0 (0.0%)         0     0        0          0       5              0\n  recommended - naming-strategy - union-variant-names        9  2 (22.2%)         2     0        0          0       5              0\n  current: the configuration as set, without the preset; never selected\n  the last 4 rows: the selected configuration without or with one option, to measure each option on\n  it; never selected\n  unconstrained: fields that dcg warns it generates without some of their constraints\n\nChanges from the current configuration (current -> recommended - naming-strategy)\n  4 of 9 classes matched by schema location renamed (0 only renumbered), 13 removed, 0 added, e.g.\n    Payment1 -> PaymentCard   at components/schemas/Payment > oneOf 0\n    Payment2 -> PaymentBank   at components/schemas/Payment > oneOf 1\n    Invoice -> BillingInvoice   at components/schemas/billing.Invoice\n\nCommand\n  datamodel-codegen --collapse-reuse-models --enum-field-as-literal all --input api.yaml --preset standard-py314-20261017 --reuse-model --target-python-version 3.14 --no-treat-dot-as-module --use-tag-as-union-variant-name\n\npyproject.toml\n  [tool.datamodel-codegen]\n  collapse-reuse-models = true\n  enum-field-as-literal = \"all\"\n  input = \"api.yaml\"\n  preset = \"standard-py314-20261017\"\n  reuse-model = true\n  target-python-version = \"3.14\"\n  treat-dot-as-module = false\n  use-tag-as-union-variant-name = true\n"
}
