{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-learn/ai-for-docs/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"redocly_category":"Learn","type":"markdown"},"seo":{"title":"Use AI to check authentication and authorization patterns","description":"Spot missing scopes, inconsistent security schemes, and thin auth error docs in OpenAPI with a model, then enforce fixes with Redocly CLI lint before merge.","siteUrl":"https://redocly.com","image":"/assets/redocly-card.f670aae34a39545a5ea633a540cb3a4a333a1f23bb2ed3c4a1b17a5fbcf0ac85.db81178d.png","lang":"en-US","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"use-ai-to-check-authentication-and-authorization-patterns","__idx":0},"children":["Use AI to check authentication and authorization patterns"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can ask a model to read your OpenAPI security model before handlers ship, then run the same file through Redocly CLI lint in the pull request. The learn article ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://redocly.com/learn/ai-for-docs/ai-reviews"},"children":["Use AI to accelerate and improve reviews"]}," covers the wider review pattern; here the focus stays on schemes, scopes, route coverage, and the error contracts integrators need when credentials fail."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"why-auth-and-authorization-drift-in-api-descriptions","__idx":1},"children":["Why auth and authorization drift in API descriptions"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Teams add endpoints faster than they update ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["components.securitySchemes"]},". One route still documents API keys while the rest moved to OAuth2. Admin paths inherit a global bearer scheme but never list the scopes a caller needs. Documentation mentions 401 and 403 in prose while the spec only declares a generic 400."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A model can compare many paths at once and ask whether each operation matches the story you tell about roles and trust boundaries. It does not replace threat modeling, but it gives you a patient reader for long YAML."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"inputs-that-keep-the-review-grounded","__idx":2},"children":["Inputs that keep the review grounded"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Paste a short auth model in plain language before the spec excerpt. Name actors (for example integrators, support staff, machine clients), which routes are public, and which actions require elevated roles."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["List invariants you already enforce in code, such as tenant isolation on every read, or that destructive verbs always require an admin scope. If the file is large, scope the excerpt to the surface you are changing and describe the rest in a sentence."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"auth-context-block-you-can-paste","__idx":3},"children":["Auth context block you can paste"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"markdown","header":{"controls":{"copy":{}}},"source":"Auth model: OAuth2 client credentials for integrators; session cookies for the dashboard.\nPublic: GET /status, GET /openapi.json\nRoles: reader (read-only), admin (write + delete)\n\nReview securitySchemes, security requirements, and auth-related responses:\n[paste OpenAPI excerpt]\n","lang":"markdown"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"prompt-skeleton-for-auth-and-authorization","__idx":4},"children":["Prompt skeleton for auth and authorization"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Keep the ask structured so findings are easy to triage."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"markdown","header":{"controls":{"copy":{}}},"source":"You are reviewing authentication and authorization for [one sentence domain].\n\nPlease list:\n1. Operations that should require credentials but have no security requirement.\n2. Mismatches between security scheme names in operations and components.securitySchemes.\n3. Missing or inconsistent OAuth scopes (or permissions) across related endpoints.\n4. Operations that share a scheme but should differ by role or scope.\n5. Missing or vague 401 and 403 responses, including whether examples match the scheme.\n6. Public routes that should explicitly document security: [] if they are intentionally open.\n\n[paste OpenAPI or notes]\n","lang":"markdown"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"signals-models-often-surface","__idx":5},"children":["Signals models often surface"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Across teams, reviews tend to cluster on a short set of themes. Orphan schemes appear when ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["components.securitySchemes"]}," defines a name operations never reference. Scope gaps show up when write endpoints document fewer scopes than read endpoints on the same resource. Error gaps cluster when only 200 responses are declared, or when 401 and 403 reuse the same schema without explaining retry versus forbidden. Inheritance confusion happens when a global ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["security"]}," block hides which routes are actually public."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Treat the list as a prioritized backlog, not a verdict. Some routes are intentionally open, and some schemes are legacy until a migration finishes."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"thin-before-and-after-on-security","__idx":6},"children":["Thin before and after on security"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Before:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"yaml","header":{"controls":{"copy":{}}},"source":"paths:\n  /reports:\n    get:\n      summary: Download usage report\n      security:\n        - bearerAuth: []\ncomponents:\n  securitySchemes:\n    BearerAuth:\n      type: http\n      scheme: bearer\n","lang":"yaml"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["After:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"yaml","header":{"controls":{"copy":{}}},"source":"paths:\n  /reports:\n    get:\n      summary: Download usage report\n      security:\n        - BearerAuth: [reports:read]\n      responses:\n        '401':\n          description: Missing or invalid bearer token\n        '403':\n          description: Caller lacks reports:read scope\ncomponents:\n  securitySchemes:\n    BearerAuth:\n      type: http\n      scheme: bearer\n      bearerFormat: JWT\n","lang":"yaml"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The second sketch does not prove your threat model is complete, but it shows how a review nudges you toward aligned names, explicit scopes, and distinct failure responses before implementation hardens the wrong shape."]},{"$$mdtype":"Tag","name":"Diagram","attributes":{"data-language":"mermaid","diagramType":"mermaid","diagramSource":"graph LR\n  A[Auth model plus OpenAPI] --> B[Model review]\n  B --> C[Human edits]\n  C --> D[redocly lint]\n  D --> E[Pull request]\n","diagramHtml":"<svg id=\"diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38\" width=\"100%\" xmlns=\"http://www.w3.org/2000/svg\" class=\"flowchart\" style=\"max-width: 1073.359375px;\" viewBox=\"0 0 1073.359375 70\" role=\"graphics-document document\" aria-roledescription=\"flowchart-v2\"><style>#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38{font-family:\"Redocly Mermaid Sans\",sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .error-icon{fill:#552222;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .error-text{fill:#552222;stroke:#552222;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .edge-thickness-normal{stroke-width:1px;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .edge-thickness-thick{stroke-width:3.5px;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .edge-pattern-solid{stroke-dasharray:0;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .edge-thickness-invisible{stroke-width:0;fill:none;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .edge-pattern-dashed{stroke-dasharray:3;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .edge-pattern-dotted{stroke-dasharray:2;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .marker{fill:#333333;stroke:#333333;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .marker.cross{stroke:#333333;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 svg{font-family:\"Redocly Mermaid Sans\",sans-serif;font-size:16px;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 p{margin:0;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .label{font-family:\"Redocly Mermaid Sans\",sans-serif;color:#333;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .cluster-label text{fill:#333;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .cluster-label span{color:#333;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .cluster-label span p{background-color:transparent;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .label text,#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 span{fill:#333;color:#333;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .node rect,#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .node circle,#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .node ellipse,#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .node polygon,#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .rough-node .label text,#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .node .label text,#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .image-shape .label,#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .icon-shape .label{text-anchor:middle;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .rough-node .label,#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .node .label,#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .image-shape .label,#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .icon-shape .label{text-align:center;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .node.clickable{cursor:pointer;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .arrowheadPath{fill:#333333;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .edgePath .path{stroke:#333333;stroke-width:1px;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .flowchart-link{stroke:#333333;fill:none;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .cluster text{fill:#333;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .cluster span{color:#333;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"Redocly Mermaid Sans\",sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 rect.text{fill:none;stroke-width:0;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .icon-shape,#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .icon-shape p,#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .icon-shape .label rect,#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 .node .neo-node{stroke:#9370DB;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 [data-look=\"neo\"].node rect,#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 [data-look=\"neo\"].cluster rect,#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 [data-look=\"neo\"].node polygon{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 [data-look=\"neo\"].node path{stroke:#9370DB;stroke-width:1px;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 [data-look=\"neo\"].node .outer-path{filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 [data-look=\"neo\"].node .neo-line path{stroke:#9370DB;filter:none;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 [data-look=\"neo\"].node circle{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 [data-look=\"neo\"].node circle .state-start{fill:#000000;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 [data-look=\"neo\"].icon-shape .icon{fill:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 [data-look=\"neo\"].icon-shape .icon-neo path{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 :root{--mermaid-font-family:\"Redocly Mermaid Sans\",sans-serif;}#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38 :root{--mermaid-font-family:\"Redocly Mermaid Sans\",sans-serif;}</style><g><marker id=\"diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38_flowchart-v2-pointEnd\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"5\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto\"><path d=\"M 0 0 L 10 5 L 0 10 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38_flowchart-v2-pointStart\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"4.5\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto\"><path d=\"M 0 5 L 10 10 L 10 0 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38_flowchart-v2-pointEnd-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 11.5 14\" refX=\"11.5\" refY=\"7\" markerUnits=\"userSpaceOnUse\" markerWidth=\"10.5\" markerHeight=\"14\" orient=\"auto\"><path d=\"M 0 0 L 11.5 7 L 0 14 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38_flowchart-v2-pointStart-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 11.5 14\" refX=\"1\" refY=\"7\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11.5\" markerHeight=\"14\" orient=\"auto\"><polygon points=\"0,7 11.5,14 11.5,0\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></polygon></marker><marker id=\"diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38_flowchart-v2-circleEnd\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"11\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38_flowchart-v2-circleStart\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"-1\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38_flowchart-v2-circleEnd-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refY=\"5\" refX=\"12.25\" markerUnits=\"userSpaceOnUse\" markerWidth=\"14\" markerHeight=\"14\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38_flowchart-v2-circleStart-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"-2\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"14\" markerHeight=\"14\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38_flowchart-v2-crossEnd\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 11 11\" refX=\"12\" refY=\"5.2\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><path d=\"M 1,1 l 9,9 M 10,1 l -9,9\" class=\"arrowMarkerPath\" style=\"stroke-width: 2; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38_flowchart-v2-crossStart\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 11 11\" refX=\"-1\" refY=\"5.2\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><path d=\"M 1,1 l 9,9 M 10,1 l -9,9\" class=\"arrowMarkerPath\" style=\"stroke-width: 2; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38_flowchart-v2-crossEnd-margin\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 15 15\" refX=\"17.7\" refY=\"7.5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto\"><path d=\"M 1,1 L 14,14 M 1,14 L 14,1\" class=\"arrowMarkerPath\" style=\"stroke-width: 2.5;\"></path></marker><marker id=\"diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38_flowchart-v2-crossStart-margin\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 15 15\" refX=\"-3.5\" refY=\"7.5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto\"><path d=\"M 1,1 L 14,14 M 1,14 L 14,1\" class=\"arrowMarkerPath\" style=\"stroke-width: 2.5; stroke-dasharray: 1, 0;\"></path></marker><g class=\"root\"><g class=\"clusters\"></g><g class=\"edgePaths\"><path d=\"M259.844,35L264.01,35C268.177,35,276.51,35,284.177,35C291.844,35,298.844,35,302.344,35L305.844,35\" id=\"diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38-L_A_B_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\";\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_A_B_0\" data-points=\"W3sieCI6MjU5Ljg0Mzc1LCJ5IjozNX0seyJ4IjoyODQuODQzNzUsInkiOjM1fSx7IngiOjMwOS44NDM3NSwieSI6MzV9XQ==\" data-look=\"classic\" marker-end=\"url(#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38_flowchart-v2-pointEnd)\"></path><path d=\"M468.969,35L473.135,35C477.302,35,485.635,35,493.302,35C500.969,35,507.969,35,511.469,35L514.969,35\" id=\"diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38-L_B_C_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\";\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_B_C_0\" data-points=\"W3sieCI6NDY4Ljk2ODc1LCJ5IjozNX0seyJ4Ijo0OTMuOTY4NzUsInkiOjM1fSx7IngiOjUxOC45Njg3NSwieSI6MzV9XQ==\" data-look=\"classic\" marker-end=\"url(#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38_flowchart-v2-pointEnd)\"></path><path d=\"M674.469,35L678.635,35C682.802,35,691.135,35,698.802,35C706.469,35,713.469,35,716.969,35L720.469,35\" id=\"diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38-L_C_D_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\";\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_C_D_0\" data-points=\"W3sieCI6Njc0LjQ2ODc1LCJ5IjozNX0seyJ4Ijo2OTkuNDY4NzUsInkiOjM1fSx7IngiOjcyNC40Njg3NSwieSI6MzV9XQ==\" data-look=\"classic\" marker-end=\"url(#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38_flowchart-v2-pointEnd)\"></path><path d=\"M866.578,35L870.745,35C874.911,35,883.245,35,890.911,35C898.578,35,905.578,35,909.078,35L912.578,35\" id=\"diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38-L_D_E_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\";\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_D_E_0\" data-points=\"W3sieCI6ODY2LjU3ODEyNSwieSI6MzV9LHsieCI6ODkxLjU3ODEyNSwieSI6MzV9LHsieCI6OTE2LjU3ODEyNSwieSI6MzV9XQ==\" data-look=\"classic\" marker-end=\"url(#diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38_flowchart-v2-pointEnd)\"></path></g><g class=\"edgeLabels\"><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_A_B_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_B_C_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_C_D_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_D_E_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g></g><g class=\"nodes\"><g class=\"node default\" id=\"diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38-flowchart-A-0\" data-look=\"classic\" transform=\"translate(133.921875, 35)\"><rect class=\"basic label-container\" style=\"\" x=\"-125.921875\" y=\"-27\" width=\"251.84375\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-95.921875, -12)\"><rect></rect><foreignObject width=\"191.84375\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>Auth model plus OpenAPI</p></span></div></foreignObject></g></g><g class=\"node default\" id=\"diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38-flowchart-B-1\" data-look=\"classic\" transform=\"translate(389.40625, 35)\"><rect class=\"basic label-container\" style=\"\" x=\"-79.5625\" y=\"-27\" width=\"159.125\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-49.5625, -12)\"><rect></rect><foreignObject width=\"99.125\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>Model review</p></span></div></foreignObject></g></g><g class=\"node default\" id=\"diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38-flowchart-C-3\" data-look=\"classic\" transform=\"translate(596.71875, 35)\"><rect class=\"basic label-container\" style=\"\" x=\"-77.75\" y=\"-27\" width=\"155.5\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-47.75, -12)\"><rect></rect><foreignObject width=\"95.5\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>Human edits</p></span></div></foreignObject></g></g><g class=\"node default\" id=\"diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38-flowchart-D-5\" data-look=\"classic\" transform=\"translate(795.5234375, 35)\"><rect class=\"basic label-container\" style=\"\" x=\"-71.0546875\" y=\"-27\" width=\"142.109375\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-41.0546875, -12)\"><rect></rect><foreignObject width=\"82.109375\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>redocly lint</p></span></div></foreignObject></g></g><g class=\"node default\" id=\"diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38-flowchart-E-7\" data-look=\"classic\" transform=\"translate(990.96875, 35)\"><rect class=\"basic label-container\" style=\"\" x=\"-74.390625\" y=\"-27\" width=\"148.78125\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-44.390625, -12)\"><rect></rect><foreignObject width=\"88.78125\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>Pull request</p></span></div></foreignObject></g></g></g></g></g><defs><filter id=\"diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38-drop-shadow\" height=\"130%\" width=\"130%\"><feDropShadow dx=\"4\" dy=\"4\" stdDeviation=\"0\" flood-opacity=\"0.06\" flood-color=\"#000000\"></feDropShadow></filter></defs><defs><filter id=\"diagram-d9710b2a465c0491894f82f04b1f46486302ed223650452a3d2010b790063e38-drop-shadow-small\" height=\"150%\" width=\"150%\"><feDropShadow dx=\"2\" dy=\"2\" stdDeviation=\"0\" flood-opacity=\"0.06\" flood-color=\"#000000\"></feDropShadow></filter></defs></svg>","diagramHtmlDark":"<svg id=\"diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171\" width=\"100%\" xmlns=\"http://www.w3.org/2000/svg\" class=\"flowchart\" style=\"max-width: 1073.359375px;\" viewBox=\"0 0 1073.359375 70\" role=\"graphics-document document\" aria-roledescription=\"flowchart-v2\"><style>#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171{font-family:\"Redocly Mermaid Sans\",sans-serif;font-size:16px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .error-icon{fill:#a44141;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .error-text{fill:#ddd;stroke:#ddd;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .edge-thickness-normal{stroke-width:1px;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .edge-thickness-thick{stroke-width:3.5px;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .edge-pattern-solid{stroke-dasharray:0;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .edge-thickness-invisible{stroke-width:0;fill:none;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .edge-pattern-dashed{stroke-dasharray:3;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .edge-pattern-dotted{stroke-dasharray:2;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .marker{fill:lightgrey;stroke:lightgrey;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .marker.cross{stroke:lightgrey;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 svg{font-family:\"Redocly Mermaid Sans\",sans-serif;font-size:16px;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 p{margin:0;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .label{font-family:\"Redocly Mermaid Sans\",sans-serif;color:#ccc;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .cluster-label text{fill:#F9FFFE;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .cluster-label span{color:#F9FFFE;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .cluster-label span p{background-color:transparent;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .label text,#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 span{fill:#ccc;color:#ccc;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .node rect,#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .node circle,#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .node ellipse,#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .node polygon,#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .rough-node .label text,#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .node .label text,#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .image-shape .label,#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .icon-shape .label{text-anchor:middle;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .rough-node .label,#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .node .label,#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .image-shape .label,#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .icon-shape .label{text-align:center;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .node.clickable{cursor:pointer;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .arrowheadPath{fill:lightgrey;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .edgePath .path{stroke:lightgrey;stroke-width:1px;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .flowchart-link{stroke:lightgrey;fill:none;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .cluster text{fill:#F9FFFE;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .cluster span{color:#F9FFFE;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"Redocly Mermaid Sans\",sans-serif;font-size:12px;background:hsl(20, 1.5873015873%, 12.3529411765%);border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 rect.text{fill:none;stroke-width:0;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .icon-shape,#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .icon-shape p,#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .icon-shape .label rect,#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .image-shape .label rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 .node .neo-node{stroke:#ccc;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 [data-look=\"neo\"].node rect,#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 [data-look=\"neo\"].cluster rect,#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 [data-look=\"neo\"].node polygon{stroke:url(#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 [data-look=\"neo\"].node path{stroke:url(#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171-gradient);stroke-width:1px;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 [data-look=\"neo\"].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 [data-look=\"neo\"].node .neo-line path{stroke:#ccc;filter:none;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 [data-look=\"neo\"].node circle{stroke:url(#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 [data-look=\"neo\"].node circle .state-start{fill:#000000;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 [data-look=\"neo\"].icon-shape .icon{fill:url(#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 [data-look=\"neo\"].icon-shape .icon-neo path{stroke:url(#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 :root{--mermaid-font-family:\"Redocly Mermaid Sans\",sans-serif;}#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171 :root{--mermaid-font-family:\"Redocly Mermaid Sans\",sans-serif;}</style><g><marker id=\"diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171_flowchart-v2-pointEnd\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"5\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto\"><path d=\"M 0 0 L 10 5 L 0 10 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171_flowchart-v2-pointStart\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"4.5\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto\"><path d=\"M 0 5 L 10 10 L 10 0 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171_flowchart-v2-pointEnd-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 11.5 14\" refX=\"11.5\" refY=\"7\" markerUnits=\"userSpaceOnUse\" markerWidth=\"10.5\" markerHeight=\"14\" orient=\"auto\"><path d=\"M 0 0 L 11.5 7 L 0 14 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171_flowchart-v2-pointStart-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 11.5 14\" refX=\"1\" refY=\"7\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11.5\" markerHeight=\"14\" orient=\"auto\"><polygon points=\"0,7 11.5,14 11.5,0\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></polygon></marker><marker id=\"diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171_flowchart-v2-circleEnd\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"11\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171_flowchart-v2-circleStart\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"-1\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171_flowchart-v2-circleEnd-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refY=\"5\" refX=\"12.25\" markerUnits=\"userSpaceOnUse\" markerWidth=\"14\" markerHeight=\"14\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171_flowchart-v2-circleStart-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"-2\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"14\" markerHeight=\"14\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171_flowchart-v2-crossEnd\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 11 11\" refX=\"12\" refY=\"5.2\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><path d=\"M 1,1 l 9,9 M 10,1 l -9,9\" class=\"arrowMarkerPath\" style=\"stroke-width: 2; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171_flowchart-v2-crossStart\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 11 11\" refX=\"-1\" refY=\"5.2\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><path d=\"M 1,1 l 9,9 M 10,1 l -9,9\" class=\"arrowMarkerPath\" style=\"stroke-width: 2; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171_flowchart-v2-crossEnd-margin\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 15 15\" refX=\"17.7\" refY=\"7.5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto\"><path d=\"M 1,1 L 14,14 M 1,14 L 14,1\" class=\"arrowMarkerPath\" style=\"stroke-width: 2.5;\"></path></marker><marker id=\"diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171_flowchart-v2-crossStart-margin\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 15 15\" refX=\"-3.5\" refY=\"7.5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto\"><path d=\"M 1,1 L 14,14 M 1,14 L 14,1\" class=\"arrowMarkerPath\" style=\"stroke-width: 2.5; stroke-dasharray: 1, 0;\"></path></marker><g class=\"root\"><g class=\"clusters\"></g><g class=\"edgePaths\"><path d=\"M259.844,35L264.01,35C268.177,35,276.51,35,284.177,35C291.844,35,298.844,35,302.344,35L305.844,35\" id=\"diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171-L_A_B_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\";\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_A_B_0\" data-points=\"W3sieCI6MjU5Ljg0Mzc1LCJ5IjozNX0seyJ4IjoyODQuODQzNzUsInkiOjM1fSx7IngiOjMwOS44NDM3NSwieSI6MzV9XQ==\" data-look=\"classic\" marker-end=\"url(#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171_flowchart-v2-pointEnd)\"></path><path d=\"M468.969,35L473.135,35C477.302,35,485.635,35,493.302,35C500.969,35,507.969,35,511.469,35L514.969,35\" id=\"diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171-L_B_C_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\";\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_B_C_0\" data-points=\"W3sieCI6NDY4Ljk2ODc1LCJ5IjozNX0seyJ4Ijo0OTMuOTY4NzUsInkiOjM1fSx7IngiOjUxOC45Njg3NSwieSI6MzV9XQ==\" data-look=\"classic\" marker-end=\"url(#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171_flowchart-v2-pointEnd)\"></path><path d=\"M674.469,35L678.635,35C682.802,35,691.135,35,698.802,35C706.469,35,713.469,35,716.969,35L720.469,35\" id=\"diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171-L_C_D_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\";\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_C_D_0\" data-points=\"W3sieCI6Njc0LjQ2ODc1LCJ5IjozNX0seyJ4Ijo2OTkuNDY4NzUsInkiOjM1fSx7IngiOjcyNC40Njg3NSwieSI6MzV9XQ==\" data-look=\"classic\" marker-end=\"url(#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171_flowchart-v2-pointEnd)\"></path><path d=\"M866.578,35L870.745,35C874.911,35,883.245,35,890.911,35C898.578,35,905.578,35,909.078,35L912.578,35\" id=\"diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171-L_D_E_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\";\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_D_E_0\" data-points=\"W3sieCI6ODY2LjU3ODEyNSwieSI6MzV9LHsieCI6ODkxLjU3ODEyNSwieSI6MzV9LHsieCI6OTE2LjU3ODEyNSwieSI6MzV9XQ==\" data-look=\"classic\" marker-end=\"url(#diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171_flowchart-v2-pointEnd)\"></path></g><g class=\"edgeLabels\"><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_A_B_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_B_C_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_C_D_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_D_E_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g></g><g class=\"nodes\"><g class=\"node default\" id=\"diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171-flowchart-A-0\" data-look=\"classic\" transform=\"translate(133.921875, 35)\"><rect class=\"basic label-container\" style=\"\" x=\"-125.921875\" y=\"-27\" width=\"251.84375\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-95.921875, -12)\"><rect></rect><foreignObject width=\"191.84375\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>Auth model plus OpenAPI</p></span></div></foreignObject></g></g><g class=\"node default\" id=\"diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171-flowchart-B-1\" data-look=\"classic\" transform=\"translate(389.40625, 35)\"><rect class=\"basic label-container\" style=\"\" x=\"-79.5625\" y=\"-27\" width=\"159.125\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-49.5625, -12)\"><rect></rect><foreignObject width=\"99.125\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>Model review</p></span></div></foreignObject></g></g><g class=\"node default\" id=\"diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171-flowchart-C-3\" data-look=\"classic\" transform=\"translate(596.71875, 35)\"><rect class=\"basic label-container\" style=\"\" x=\"-77.75\" y=\"-27\" width=\"155.5\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-47.75, -12)\"><rect></rect><foreignObject width=\"95.5\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>Human edits</p></span></div></foreignObject></g></g><g class=\"node default\" id=\"diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171-flowchart-D-5\" data-look=\"classic\" transform=\"translate(795.5234375, 35)\"><rect class=\"basic label-container\" style=\"\" x=\"-71.0546875\" y=\"-27\" width=\"142.109375\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-41.0546875, -12)\"><rect></rect><foreignObject width=\"82.109375\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>redocly lint</p></span></div></foreignObject></g></g><g class=\"node default\" id=\"diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171-flowchart-E-7\" data-look=\"classic\" transform=\"translate(990.96875, 35)\"><rect class=\"basic label-container\" style=\"\" x=\"-74.390625\" y=\"-27\" width=\"148.78125\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-44.390625, -12)\"><rect></rect><foreignObject width=\"88.78125\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>Pull request</p></span></div></foreignObject></g></g></g></g></g><defs><filter id=\"diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171-drop-shadow\" height=\"130%\" width=\"130%\"><feDropShadow dx=\"4\" dy=\"4\" stdDeviation=\"0\" flood-opacity=\"0.06\" flood-color=\"#FFFFFF\"></feDropShadow></filter></defs><defs><filter id=\"diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171-drop-shadow-small\" height=\"150%\" width=\"150%\"><feDropShadow dx=\"2\" dy=\"2\" stdDeviation=\"0\" flood-opacity=\"0.06\" flood-color=\"#FFFFFF\"></feDropShadow></filter></defs><linearGradient id=\"diagram-5b9a28fe0a8d27c2f77dd3857c5684511a8f1e2e0091a9c5c716590f70abd171-gradient\" gradientUnits=\"objectBoundingBox\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\"><stop offset=\"0%\" stop-color=\"#cccccc\" stop-opacity=\"1\"></stop><stop offset=\"100%\" stop-color=\"hsl(180, 0%, 18.3529411765%)\" stop-opacity=\"1\"></stop></linearGradient></svg>"},"children":["graph LR\n  A[Auth model plus OpenAPI] --> B[Model review]\n  B --> C[Human edits]\n  C --> D[redocly lint]\n  D --> E[Pull request]\n"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Run the loop while the document is still cheap to edit."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"where-cli-lint-takes-over","__idx":7},"children":["Where CLI lint takes over"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When you accept changes, run the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://redocly.com/docs/cli/commands/lint"},"children":["lint command"]}," against the same file the model saw. Lint applies preprocessors and rules, reports problems in OpenAPI and related formats, and does not run decorators, which keeps this step focused on spec compliance rather than publishing transforms."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://redocly.com/docs/cli/rules/built-in-rules"},"children":["built-in rules"]}," catalog includes security-related checks. The ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://redocly.com/docs/cli/rules/oas/security-defined"},"children":["security-defined rule"]}," verifies that every operation or global security requirement is defined. If an API is intentionally public, the rule documentation shows declaring an empty requirement so readers know the omission is deliberate:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"yaml","header":{"controls":{"copy":{}}},"source":"security: []\n","lang":"yaml"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In continuous integration, point the same command at pull requests so every spec edit repeats local checks. Models sometimes suggest scheme names or extensions your ruleset has not whitelisted yet, and lint surfaces those mismatches early."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If you have no local config yet, the command defaults to the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://redocly.com/docs/cli/rules/recommended"},"children":["recommended ruleset"]},". As standards mature, add ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://redocly.com/docs/cli/rules/configurable-rules"},"children":["configurable rules"]}," for org-specific auth policies, such as requiring scope text in operation descriptions or forbidding duplicate scheme types on one path. The ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://redocly.com/docs/cli/guides/configure-rules"},"children":["guide to configuring a ruleset"]}," walks through a practical baseline."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Organizations that treat OpenAPI as law usually centralize how rules are authored and shared. The ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://redocly.com/docs/cli/api-standards"},"children":["API standards and governance"]}," page describes using the same configuration locally and in automation so developers see the same violations everywhere."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"best-practices","__idx":8},"children":["Best practices"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Ship the auth model as a short checklist, not a long policy essay, in the same message as the spec excerpt."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Review one theme at a time on large files: scheme names first, then scopes, then error responses."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Log model findings as tickets with path and operation anchors so humans can accept or reject with traceability."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Combine model passes with deterministic tools so subjective completeness meets objective gates, which mirrors the guidance in ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://redocly.com/learn/ai-for-docs/ai-reviews"},"children":["Use AI to accelerate and improve reviews"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"what-this-pairing-cannot-replace","__idx":9},"children":["What this pairing cannot replace"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Models do not know your live identity provider configuration, token lifetimes, or penetration test results unless you state them. They can suggest scopes that sound reasonable but do not match what your authorization service enforces. Lint cannot judge whether a scope is too broad for a role; it checks that the document obeys the rules you configured."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"summary","__idx":10},"children":["Summary"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use a structured prompt plus a plain-language auth model to surface scheme, scope, and error gaps early, then let Redocly CLI enforce the rules your team already agreed to. Keep humans in the loop for trade-offs, and treat automation as a safety net rather than a substitute for security review."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"learn-more","__idx":11},"children":["Learn more"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When you are ready to wire the deterministic side of the loop, start with ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://redocly.com/docs/cli/"},"children":["Explore Redocly CLI"]}," for installation, first commands, and how lint fits alongside bundling and preview workflows described in the broader ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://redocly.com/docs/cli/rules"},"children":["rulesets"]}," documentation."]}]},"headings":[{"value":"Use AI to check authentication and authorization patterns","id":"use-ai-to-check-authentication-and-authorization-patterns","depth":1},{"value":"Why auth and authorization drift in API descriptions","id":"why-auth-and-authorization-drift-in-api-descriptions","depth":2},{"value":"Inputs that keep the review grounded","id":"inputs-that-keep-the-review-grounded","depth":2},{"value":"Auth context block you can paste","id":"auth-context-block-you-can-paste","depth":3},{"value":"Prompt skeleton for auth and authorization","id":"prompt-skeleton-for-auth-and-authorization","depth":2},{"value":"Signals models often surface","id":"signals-models-often-surface","depth":2},{"value":"Thin before and after on security","id":"thin-before-and-after-on-security","depth":2},{"value":"Where CLI lint takes over","id":"where-cli-lint-takes-over","depth":2},{"value":"Best practices","id":"best-practices","depth":2},{"value":"What this pairing cannot replace","id":"what-this-pairing-cannot-replace","depth":2},{"value":"Summary","id":"summary","depth":2},{"value":"Learn more","id":"learn-more","depth":2}],"frontmatter":{"seo":{"title":"Use AI to check authentication and authorization patterns","description":"Spot missing scopes, inconsistent security schemes, and thin auth error docs in OpenAPI with a model, then enforce fixes with Redocly CLI lint before merge."}},"lastModified":"2026-05-22T12:10:40.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/learn/ai-for-docs/ai-auth-authorization-patterns","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}