Reference for the YAML template file used to define compliance controls for a Kosli flow.
A flow template defines what attestations are required for a trail and its artifacts to be compliant. You pass the template file when creating or updating a flow with kosli create flow --template-file.
The attestation type. One of: generic, jira, junit, pull_request, snyk, sonar, decision, sbom, custom:<custom-type-name> for custom attestation types, or * to match any type.
The attestation type. One of: generic, jira, junit, pull_request, snyk, sonar, decision, sbom, custom:<custom-type-name> for custom attestation types, or * to match any type.
Once the flow exists, start a trail with kosli begin trail and record attestations using the kosli attest commands. Kosli evaluates trail compliance against the template automatically.
Trail-level attestations apply to the entire trail. Artifact-level attestations apply to a specific artifact produced within the trail.
A JSON Schema is available for the flow template format. Add the following comment to the top of your template file to enable inline validation and autocomplete in VS Code (requires the YAML extension) and other schema-aware editors:
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Kosli Documentation","colors":{"primary":"#1C4BC6","light":"#ABBDFF","dark":"#1C4BC6"},"logo":{"light":"https://mintcdn.com/kosli/Cee1LAu-Jhawp1Om/logo/kosli-logo-light-main.svg?fit=max\u0026auto=format\u0026n=Cee1LAu-Jhawp1Om\u0026q=85\u0026s=fb05fdbb0c9c9ae7da266a500eac2be6","dark":"https://mintcdn.com/kosli/Cee1LAu-Jhawp1Om/logo/kosli-logo-dark-main.svg?fit=max\u0026auto=format\u0026n=Cee1LAu-Jhawp1Om\u0026q=85\u0026s=c230555c5e1d57d0f9f9630117a1467d"},"favicon":"https://mintcdn.com/kosli/CktiOOFhqneQZXyH/favicon-32x32.png?fit=max\u0026auto=format\u0026n=CktiOOFhqneQZXyH\u0026q=85\u0026s=1b16e66cd5c7266604a6a683f334f672","api":{"playground":{"display":"interactive"}},"background":{"decoration":"windows","color":{"light":"#F6F8FC","dark":"#111A26"}},"navbar":{"links":[{"href":"mailto:support@kosli.com","label":"Support"}],"primary":{"type":"button","label":"Kosli App","href":"https://app.kosli.com"}},"footer":{"socials":{"website":"https://kosli.com","github":"https://github.com/kosli-dev","linkedin":"https://linkedin.com/company/kosli-dev"},"links":[{"header":"Resources","items":[{"label":"Privacy Policy","href":"https://www.kosli.com/privacy-policy"},{"label":"Status","href":"https://status.app.kosli.com/"}]},{"header":"Learn","items":[{"label":"Labs","href":"/labs"},{"label":"Blog","href":"https://kosli.com/blog"}]},{"header":"Company","items":[{"label":"About Kosli","href":"https://www.kosli.com/about"},{"label":"Privacy","href":"https://www.kosli.com/privacy-policy"},{"label":"Community","href":"https://www.kosli.com/community"}]}]},"fonts":{"family":"IBM Plex Sans"},"styling":{"eyebrows":"breadcrumbs","codeblocks":{"theme":"dracula","languages":{"custom":["/languages/rego.json"]}},"latex":false},"integrations":{"posthog":{"apiKey":"phc_vKbCGJq5rzV4apArUzYDRwh6azCmgCPcLz8jTa9CgmGR","apiHost":"https://eu.posthog.com","sessionRecording":false},"cookies":{"key":"kosli_consent","value":"accepted"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"metadata":{"timestamp":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"kosli","hasAudioNarration":false,"actualSubdomain":"kosli","customDomains":["docs.kosli.com"],"gitSource":{"type":"github","owner":"kosli-dev","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae336289ee4546ca4eab0b0","collectionId":"7a6abc2c-4b27-47fc-bb44-0447d8a65832","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae336289ee4546ca4eab0b0"},"feedback":{"thumbs":true,"edits":false,"issues":false,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"CONTEXTUAL_FEEDBACK":{"status":"DISABLED","enabled":"DISABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"DISABLED","enabled":"DISABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae336289ee4546ca4eab0b0","clientVersion":"0.0.4021","searchFilterCounts":[{"language":"default","tag":"Reference","count":279},{"language":"default","tag":"API Reference","count":146},{"language":"default","tag":"CLI Reference","count":98},{"language":"default","tag":"Documentation","count":70},{"language":"default","tag":"Terraform Reference","count":22},{"language":"default","tag":"Tutorials","count":22},{"language":"default","tag":"Environments","count":21},{"language":"default","tag":"Attestation","count":18},{"language":"default","tag":"Administration","count":17},{"language":"default","tag":"kosli attest","count":13}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":true,"enableContextualStarterQuestions":true,"enableAskAiSearchBar":true,"deflection":{"enabled":false,"showHelpButton":false}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":"[data-component-part=step-number]>div{background-color:#cfd8ff!important;color:#111a26!important}"}],"page":{"pagePath":"template-reference/flow_template","slug":"/template-reference/flow_template","pageMetadata":{"title":"Flow Template","description":"Reference for the YAML template file used to define compliance controls for a Kosli flow.","href":"/template-reference/flow_template"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Reference for the YAML template file used to define compliance controls for a Kosli flow.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,p:`p`,pre:`pre`,span:`span`,..._provideComponents(),...props.components},{CodeBlock,Expandable,Heading,Info,ParamField}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Expandable)_missingMdxReference(`Expandable`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!ParamField)_missingMdxReference(`ParamField`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`A flow template defines what attestations are required for a trail and its artifacts to be compliant. You pass the template file when creating or updating a flow with `,_jsx(_components.a,{href:`/client_reference/kosli_create_flow`,children:_jsx(_components.code,{children:`kosli create flow --template-file`})}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`specification`,children:`Specification`}),`\n`,_jsx(ParamField,{path:`version`,type:`integer`,required:true,id:`param-version`,children:_jsxs(_components.p,{children:[`The version of the specification schema. Currently only `,_jsx(_components.code,{children:`1`}),` is supported.`]})}),`\n`,_jsxs(ParamField,{path:`trail`,type:`object`,id:`param-trail`,children:[_jsx(_components.p,{children:`The trail specification. Defines what must be attested at the trail level and what artifacts are expected.`}),_jsxs(Expandable,{title:`trail properties`,children:[_jsxs(ParamField,{path:`trail.attestations`,type:`array`,id:`param-trail-attestations`,children:[_jsx(_components.p,{children:`Attestations required at the trail level for it to be compliant.`}),_jsxs(Expandable,{title:`attestation properties`,children:[_jsx(ParamField,{path:`trail.attestations[].name`,type:`string`,required:true,id:`param-trail-attestations-name`,children:_jsx(_components.p,{children:`A unique name for the attestation within this template.`})}),_jsx(ParamField,{path:`trail.attestations[].type`,type:`string`,required:true,id:`param-trail-attestations-type`,children:_jsxs(_components.p,{children:[`The attestation type. One of: `,_jsx(_components.code,{children:`generic`}),`, `,_jsx(_components.code,{children:`jira`}),`, `,_jsx(_components.code,{children:`junit`}),`, `,_jsx(_components.code,{children:`pull_request`}),`, `,_jsx(_components.code,{children:`snyk`}),`, `,_jsx(_components.code,{children:`sonar`}),`, `,_jsx(_components.code,{children:`decision`}),`, `,_jsx(_components.code,{children:`sbom`}),`, `,_jsx(_components.code,{children:`custom:\u003ccustom-type-name>`}),` for `,_jsx(_components.a,{href:`/client_reference/kosli_create_attestation-type`,children:`custom attestation types`}),`, or `,_jsx(_components.code,{children:`*`}),` to match any type.`]})})]})]}),_jsxs(ParamField,{path:`trail.artifacts`,type:`array`,id:`param-trail-artifacts`,children:[_jsx(_components.p,{children:`Artifacts expected to be produced in the trail. Each artifact can have its own attestation requirements.`}),_jsxs(Expandable,{title:`artifact properties`,children:[_jsx(ParamField,{path:`trail.artifacts[].name`,type:`string`,required:true,id:`param-trail-artifacts-name`,children:_jsxs(_components.p,{children:[`A reference name for the artifact (e.g. `,_jsx(_components.code,{children:`frontend-app`}),`, `,_jsx(_components.code,{children:`backend`}),`).`]})}),_jsxs(ParamField,{path:`trail.artifacts[].attestations`,type:`array`,id:`param-trail-artifacts-attestations`,children:[_jsx(_components.p,{children:`Attestations required for this artifact to be compliant.`}),_jsxs(Expandable,{title:`attestation properties`,children:[_jsx(ParamField,{path:`trail.artifacts[].attestations[].name`,type:`string`,required:true,id:`param-trail-artifacts-attestations-name`,children:_jsx(_components.p,{children:`A unique name for the attestation within this artifact.`})}),_jsx(ParamField,{path:`trail.artifacts[].attestations[].type`,type:`string`,required:true,id:`param-trail-artifacts-attestations-type`,children:_jsxs(_components.p,{children:[`The attestation type. One of: `,_jsx(_components.code,{children:`generic`}),`, `,_jsx(_components.code,{children:`jira`}),`, `,_jsx(_components.code,{children:`junit`}),`, `,_jsx(_components.code,{children:`pull_request`}),`, `,_jsx(_components.code,{children:`snyk`}),`, `,_jsx(_components.code,{children:`sonar`}),`, `,_jsx(_components.code,{children:`decision`}),`, `,_jsx(_components.code,{children:`sbom`}),`, `,_jsx(_components.code,{children:`custom:\u003ccustom-type-name>`}),` for `,_jsx(_components.a,{href:`/client_reference/kosli_create_attestation-type`,children:`custom attestation types`}),`, or `,_jsx(_components.code,{children:`*`}),` to match any type.`]})})]})]})]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`example`,children:`Example`}),`\n`,_jsxs(_components.p,{children:[`Add the `,_jsx(_components.code,{children:`$schema`}),` comment to get editor validation and autocomplete:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`21`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes dracula dracula`,style:{backgroundColor:`#282A36`,\"--shiki-dark-bg\":`#282A36`,color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`21`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:`# yaml-language-server: $schema=https://docs.kosli.com/schemas/flow-template/v1.json`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:`version`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#BD93F9`,\"--shiki-dark\":`#BD93F9`},children:` 1`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:`trail`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` attestations`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` name`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` jira-ticket`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` type`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` jira`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` name`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` risk-level-assessment`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` type`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` generic`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` artifacts`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` name`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` backend`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` attestations`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` name`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` unit-tests`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` type`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` junit`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` name`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` security-scan`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` type`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` snyk`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` name`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` frontend`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` attestations`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` name`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` manual-ui-test`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` type`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` generic`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` name`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` coverage-metrics`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8BE9FD`,\"--shiki-dark\":`#8BE9FD`},children:` type`}),_jsx(_components.span,{style:{color:`#FF79C6`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` custom:coverage-metrics`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`using-the-template`,children:`Using the template`}),`\n`,_jsx(_components.p,{children:`Pass the template file when creating or updating a flow:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes dracula dracula`,style:{backgroundColor:`#282A36`,\"--shiki-dark-bg\":`#282A36`,color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#50FA7B`,\"--shiki-dark\":`#50FA7B`},children:`kosli`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` create`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` flow`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` my-flow`}),_jsx(_components.span,{style:{color:`#BD93F9`,\"--shiki-dark\":`#BD93F9`},children:` --template-file`}),_jsx(_components.span,{style:{color:`#F1FA8C`,\"--shiki-dark\":`#F1FA8C`},children:` ./flow-template.yml`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Once the flow exists, start a trail with `,_jsx(_components.a,{href:`/client_reference/kosli_begin_trail`,children:_jsx(_components.code,{children:`kosli begin trail`})}),` and record attestations using the `,_jsx(_components.a,{href:`/client_reference/kosli_attest_generic`,children:_jsx(_components.code,{children:`kosli attest`})}),` commands. Kosli evaluates trail compliance against the template automatically.`]}),`\n`,_jsx(Info,{children:_jsx(_components.p,{children:`Trail-level attestations apply to the entire trail. Artifact-level attestations apply to a specific artifact produced within the trail.`})}),`\n`,_jsx(Heading,{level:`2`,id:`editor-validation`,children:`Editor validation`}),`\n`,_jsxs(_components.p,{children:[`A `,_jsx(_components.a,{href:`https://docs.kosli.com/schemas/flow-template/v1.json`,children:`JSON Schema`}),` is available for the flow template format. Add the following comment to the top of your template file to enable inline validation and autocomplete in VS Code (requires the `,_jsx(_components.a,{href:`https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml`,children:`YAML extension`}),`) and other schema-aware editors:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes dracula dracula`,style:{backgroundColor:`#282A36`,\"--shiki-dark-bg\":`#282A36`,color:`#F8F8F2`,\"--shiki-dark\":`#F8F8F2`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6272A4`,\"--shiki-dark\":`#6272A4`},children:`# yaml-language-server: $schema=https://docs.kosli.com/schemas/flow-template/v1.json`})}),`\n`]})})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":{"theme":"dracula","languages":{"custom":["/languages/rego.json"]}},"config":{},"pageMetadata":{"title":"Flow Template","description":"Reference for the YAML template file used to define compliance controls for a Kosli flow.","href":"/template-reference/flow_template"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Specification","slug":"specification","depth":2,"children":[]},{"title":"Example","slug":"example","depth":2,"children":[]},{"title":"Using the template","slug":"using-the-template","depth":2,"children":[]},{"title":"Editor validation","slug":"editor-validation","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/kosli/a8952d14c382591c/termly.js"],"subdomain":"kosli","siteName":"Kosli Documentation","title":"Flow Template - Kosli Documentation","contextualStarterQuestions":[{"_id":"6aa91c916729a7857c6519eb","deploymentId":"694a567a82866c4f503bbfbf","questionText":"What attestation types are supported?","status":"active","generatedBy":"contextual","path":"template-reference/flow_template","createdAt":"2026-09-15T10:23:13.885Z","updatedAt":"2026-09-15T10:23:13.885Z","__v":0},{"_id":"6aa91c916729a7857c6519ec","deploymentId":"694a567a82866c4f503bbfbf","questionText":"How do I define artifact requirements?","status":"active","generatedBy":"contextual","path":"template-reference/flow_template","createdAt":"2026-09-15T10:23:13.885Z","updatedAt":"2026-09-15T10:23:13.885Z","__v":0},{"_id":"6aa91c916729a7857c6519ed","deploymentId":"694a567a82866c4f503bbfbf","questionText":"How do I create a flow template?","status":"active","generatedBy":"contextual","path":"template-reference/flow_template","createdAt":"2026-09-15T10:23:13.885Z","updatedAt":"2026-09-15T10:23:13.885Z","__v":0}],"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-15T10:23:00.016Z","gitLastModified":"2026-09-15T10:21:37.000Z","originalFileLocation":"template-reference/flow_template.md"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Reference for the YAML template file used to define compliance controls for a Kosli flow.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Kosli Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/kosli/7UeZPXzpjJmWmx3T/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/kosli/7UeZPXzpjJmWmx3T/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/kosli/7UeZPXzpjJmWmx3T/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/kosli/7UeZPXzpjJmWmx3T/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/kosli/7UeZPXzpjJmWmx3T/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/kosli/7UeZPXzpjJmWmx3T/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/kosli/7UeZPXzpjJmWmx3T/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/kosli/7UeZPXzpjJmWmx3T/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/kosli/7UeZPXzpjJmWmx3T/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Flow Template - Kosli Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Reference for the YAML template file used to define compliance controls for a Kosli flow.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Kosli Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.kosli.com/template-reference/flow_template\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://kosli.mintlify.app/_mintlify/api/og/v2?division=Templates\u0026amp;title=Flow+Template\u0026amp;description=Reference+for+the+YAML+template+file+used+to+define+compliance+controls+for+a+Kosli+flow.\u0026amp;theme=381f3588bbad67d04f5be36e\u0026amp;signature=3e6e637bbacde70f8b908ddc9992f4915ca345cac20b7023388ea392eb60a971\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Flow Template - Kosli Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Reference for the YAML template file used to define compliance controls for a Kosli flow.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://kosli.mintlify.app/_mintlify/api/og/v2?division=Templates\u0026amp;title=Flow+Template\u0026amp;description=Reference+for+the+YAML+template+file+used+to+define+compliance+controls+for+a+Kosli+flow.\u0026amp;theme=381f3588bbad67d04f5be36e\u0026amp;signature=3e6e637bbacde70f8b908ddc9992f4915ca345cac20b7023388ea392eb60a971\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/kosli/7UeZPXzpjJmWmx3T/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Kosli Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#1C4BC6\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.kosli.com/template-reference/flow_template\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/template-reference/flow_template.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.kosli.com/#organization\",\"name\":\"Kosli Documentation\",\"url\":\"https://docs.kosli.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/kosli/Cee1LAu-Jhawp1Om/logo/kosli-logo-light-main.svg?fit=max\u0026auto=format\u0026n=Cee1LAu-Jhawp1Om\u0026q=85\u0026s=fb05fdbb0c9c9ae7da266a500eac2be6\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.kosli.com#website\",\"name\":\"Kosli Documentation\",\"url\":\"https://docs.kosli.com\",\"publisher\":{\"@id\":\"https://docs.kosli.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.kosli.com/template-reference/flow_template#webpage\",\"url\":\"https://docs.kosli.com/template-reference/flow_template\",\"name\":\"Flow Template\",\"description\":\"Reference for the YAML template file used to define compliance controls for a Kosli flow.\",\"dateModified\":\"2026-09-15T10:21:37.000Z\",\"isPartOf\":{\"@id\":\"https://docs.kosli.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.kosli.com/template-reference/flow_template#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.kosli.com/template-reference/flow_template#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Kosli Documentation\",\"item\":\"https://docs.kosli.com\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Flow Template\",\"item\":\"https://docs.kosli.com/template-reference/flow_template\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.kosli.com/template-reference/flow_template#article\",\"headline\":\"Flow Template\",\"name\":\"Flow Template\",\"description\":\"Reference for the YAML template file used to define compliance controls for a Kosli flow.\",\"url\":\"https://docs.kosli.com/template-reference/flow_template\",\"mainEntityOfPage\":{\"@id\":\"https://docs.kosli.com/template-reference/flow_template#webpage\"},\"dateModified\":\"2026-09-15T10:21:37.000Z\",\"publisher\":{\"@id\":\"https://docs.kosli.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.kosli.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Kosli Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Kosli Documentation","nav":{"global":null,"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":"/understand_kosli/what_is_kosli"}]},{"tab":"Labs","pages":[{"title":"Labs","href":"/labs"}]},{"tab":"Implementation Guide","pages":[{"title":"Implementation Guide","href":"/implementation_guide/phase_1/roles_and_responsibilities/overview"}]},{"tab":"Reference","menu":[{"item":"CLI Reference","icon":"terminal","pages":[{"title":"CLI Reference","href":"/client_reference/overview"}]},{"item":"API Reference","icon":"code","pages":[{"title":"API Reference","href":"/api-reference/actions/list-actions"}]},{"item":"GitHub Action Reference","icon":"github","pages":[{"title":"GitHub Action Reference","href":"/github-action-reference/setup_cli_action"}]},{"item":"Terraform Reference","icon":"cubes","pages":[{"title":"Terraform Reference","href":"/terraform-reference"}]},{"item":"Helm Reference","icon":"layer-group","pages":[{"title":"Helm Reference","href":"/helm/k8s_reporter/overview"}]},{"item":"Template Reference","icon":"file-code","groups":[{"group":"Templates","pages":[{"title":"Flow Template","href":"/template-reference/flow_template"}]}]},{"item":"Policy Reference","icon":"scroll","pages":[{"title":"Policy Reference","href":"/policy-reference/environment_policy"}]}]},{"tab":"Changelog","icon":"clock","pages":[{"title":"Changelog","href":"/changelog"}]}]},"title":"Flow Template - Kosli Documentation","buildId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","deploymentId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","dynamics":[],"chunks":[]}