Create an issue first (if one doesn’t exist) - Discuss the change with the maintainers
Fork the repository and create a feature branch from dev (the default development branch; main is reserved for releases). Target dev when opening your PR.
All commits should follow a standardized format. For each package/directory you modify, include a separate commit message line describing the change in that package.
For each package you modify, update the corresponding changelog.md file with your changes. Changelog entries are used to generate release notes and communicate changes to users.
Use the following template for your PR description:
## DescriptionBrief explanation of what this PR does and why it's needed.## Type of Change- [ ] Bug fix- [ ] New feature- [ ] Breaking change- [ ] Documentation update- [ ] Refactoring## Affected PackagesList all packages/directories modified:- core/providers/openai/- transports/bifrost-http/server/- plugins/governance/## Changes Made- Specific change 1- Specific change 2- Specific change 3## TestingDescribe how you tested these changes:- [ ] Unit tests added/updated- [ ] Integration tests passed- [ ] Manual testing completed## Checklist- [ ] Code follows the project's code style- [ ] Tests are passing locally (`make test-all`)- [ ] Documentation is updated if needed- [ ] No breaking changes (or breaking changes are documented)- [ ] Commit messages follow the format: `[type]: description`- [ ] All affected packages are mentioned in commit messages## Related IssuesCloses #123Relates to #456
Before requesting review, ensure:✅ All commits follow [type]: description format
✅ All affected packages are explicitly mentioned
✅ No merge conflicts
✅ All tests pass (make test-all)
✅ Code is properly formatted (make fmt)
✅ No linting issues (make lint)
✅ Documentation is updated
✅ PR description is clear and complete
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/schema.json","name":"Bifrost","colors":{"primary":"#0C3B43","light":"#07C983"},"logo":{"light":"https://mintcdn.com/bifrost/qFMmk8bNSnvgFYDI/media/bifrost-logo.png?fit=max\u0026auto=format\u0026n=qFMmk8bNSnvgFYDI\u0026q=85\u0026s=6af701a560aee4103444fa017b226cf0","dark":"https://mintcdn.com/bifrost/qFMmk8bNSnvgFYDI/media/bifrost-logo-dark.png?fit=max\u0026auto=format\u0026n=qFMmk8bNSnvgFYDI\u0026q=85\u0026s=84d264aad5f421c526dd17893e7c5739"},"favicon":"https://mintcdn.com/bifrost/qFMmk8bNSnvgFYDI/favicon.ico?fit=max\u0026auto=format\u0026n=qFMmk8bNSnvgFYDI\u0026q=85\u0026s=a57bad8c37d798efcb53dca5d96d8b45","navbar":{"links":[{"href":"https://www.getmaxim.ai/enterprise?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Navbar#free-license","label":"Request License"}],"primary":{"type":"button","label":"Book a Demo","href":"https://www.getmaxim.ai/book-a-demo?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Navbar"}},"footer":{"socials":{"x":"https://x.com/getbifrost","linkedin":"https://linkedin.com/company/maxim-ai","github":"https://github.com/maximhq/bifrost"},"links":[{"header":"Company","items":[{"label":"Book a Demo","href":"https://www.getmaxim.ai/book-a-demo?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Partner Program","href":"https://www.getmaxim.ai/partners-program?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Careers","href":"https://www.getmaxim.ai/careers?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Contact Us","href":"mailto:[email protected]"},{"label":"Security","href":"https://docs.getbifrost.ai/security"},{"label":"Trust Center","href":"https://trust.getmaxim.ai/"},{"label":"Terms of Service","href":"https://www.getmaxim.ai/terms-of-service?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Privacy Policy","href":"https://www.getmaxim.ai/privacy-policy?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"}]},{"header":"Products","items":[{"label":"LLM Gateway","href":"https://www.getmaxim.ai/llm-gateway?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"MCP Gateway","href":"https://www.getmaxim.ai/mcp-gateway?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Governance","href":"https://www.getmaxim.ai/ai-governance?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Guardrails","href":"https://www.getmaxim.ai/ai-guardrails?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Observability","href":"https://www.getmaxim.ai/ai-observability?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Bifrost Edge","href":"https://www.getmaxim.ai/edge?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"}]},{"header":"Resources","items":[{"label":"Bifrost Enterprise","href":"https://www.getmaxim.ai/enterprise?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Performance Benchmarks","href":"https://www.getmaxim.ai/bifrost/resources/benchmarks?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"LLM Gateway Buyer's Guide","href":"https://www.getmaxim.ai/bifrost/resources/buyers-guide?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Claude Code Integration","href":"https://www.getmaxim.ai/bifrost/resources/claude-code?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Migrating from LiteLLM","href":"https://www.getmaxim.ai/bifrost/resources/migrating-from-litellm?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Blogs","href":"https://www.getmaxim.ai/bifrost/blog?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"}]},{"header":"For LLMs","items":[{"label":"llms-full.txt","href":"https://docs.getbifrost.ai/llms-full.txt"},{"label":"llms.txt","href":"https://docs.getbifrost.ai/llms.txt"},{"label":"llm-info","href":"https://www.getmaxim.ai/llm-info?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"}]}]},"styling":{"latex":true},"navigation":{"global":{"anchors":[{"anchor":"Discord","icon":"discord","href":"https://discord.gg/exN5KAydbU"},{"anchor":"GitHub","icon":"github","href":"https://github.com/maximhq/bifrost"},{"anchor":"Try Enterprise","icon":"building","href":"https://www.getmaxim.ai/bifrost/enterprise"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"bifrost","hasAudioNarration":false,"actualSubdomain":"bifrost","customDomains":["docs.getbifrost.ai"],"gitSource":{"type":"github","owner":"maximhq","repo":"bifrost","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae4cbbc6a33d8c2668416a6","collectionId":"5ee390eb-6779-42d5-80ba-9fe8180b7dc6","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae4cbbc6a33d8c2668416a6"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae4cbbc6a33d8c2668416a6","clientVersion":"0.0.4043","searchFilterCounts":[{"language":"default","tag":"API","count":690},{"language":"default","tag":"Changelogs","count":317},{"language":"default","tag":"Integrations","count":248},{"language":"default","tag":"Platform","count":237},{"language":"default","tag":"Open Source","count":164},{"language":"default","tag":"OSS","count":150},{"language":"default","tag":"Governance","count":132},{"language":"default","tag":"Enterprise","count":102},{"language":"default","tag":"Helm","count":75},{"language":"default","tag":"Inference","count":71}]},"assistantConfig":{},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":".nav-logo{height:1.5rem}div:has(>nav[aria-label=Main]){gap:1.5rem}nav[aria-label=Main]>ul{gap:1rem}nav[aria-label=Main] a[href*=book-a-demo]{padding:.4375rem .625rem}nav[aria-label=Main] a[href*=book-a-demo] svg{display:none}div:has(>nav[aria-label=Main])>*,nav[aria-label=Main]>ul>*{margin-inline:0}nav[aria-label=Main] .navbar-link a[href*=\"#free-license\"]{display:inline-flex;align-items:center;border:1px solid rgb(var(--primary-dark));border-radius:.75rem;box-sizing:border-box;padding:calc(.4375rem - 1px) .625rem;color:rgb(var(--primary-dark));background:0 0;font-size:.875rem;font-weight:500;line-height:1.25rem}nav[aria-label=Main] .navbar-link a[href*=\"#free-license\"]:hover{background-color:rgb(var(--primary-dark)/.1)}.dark nav[aria-label=Main] .navbar-link a[href*=\"#free-license\"]{border-color:rgb(var(--primary-light));color:rgb(var(--primary-light))}.dark nav[aria-label=Main] .navbar-link a[href*=\"#free-license\"]:hover{background-color:rgb(var(--primary-light)/.12)}#sidebar-group>li>button>div{line-height:normal}.footer-compliance{display:flex;align-items:center;flex-wrap:wrap;gap:.5rem;max-width:100%}.footer-compliance img{width:2.5rem;height:2.5rem;flex:none;object-fit:contain}@media (max-width:767px){footer.advanced-footer>div>div:first-child>div:first-child{flex-direction:column;align-items:flex-start;justify-content:flex-start;row-gap:1rem;width:100%;height:auto}footer.advanced-footer>div>div:first-child>div:first-child>div:last-child{justify-content:flex-start;min-width:0;max-width:100%}footer.advanced-footer a[class*=truncate],footer.advanced-footer>div>div:first-child>div:last-child,footer.advanced-footer>div>div:first-child>div:last-child>div{white-space:normal!important}}@media (min-width:768px){footer.advanced-footer>div>div:first-child{justify-content:flex-start;column-gap:3rem}footer.advanced-footer>div>div:first-child>div:first-child{min-width:0;justify-content:flex-start;align-items:flex-start;row-gap:1.25rem}footer.advanced-footer>div>div:first-child>div:first-child>div:last-child{margin-top:auto}footer.advanced-footer>div>div:first-child>div:last-child{flex:0 1 auto;justify-content:start;grid-template-columns:repeat(4,max-content)!important;column-gap:4rem!important}footer.advanced-footer>div>div:first-child>div:last-child>div{align-items:flex-start;width:auto;flex:none}footer.advanced-footer a[class*=truncate]{max-width:none!important;overflow:visible!important;text-overflow:unset!important;white-space:nowrap!important}}"}],"page":{"pagePath":"contributing/raising-a-pr","slug":"/contributing/raising-a-pr","pageMetadata":{"title":"Raising a Pull Request","description":"Guidelines for submitting high-quality pull requests to Bifrost.","icon":"code-pull-request","href":"/contributing/raising-a-pr"},"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: \"Guidelines for submitting high-quality pull requests to Bifrost.\"\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`,input:`input`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Table,Tip}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`before-you-start`,children:`Before You Start`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Create an issue first`}),` (if one doesn’t exist) - Discuss the change with the maintainers`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Fork the repository`}),` and create a feature branch from `,_jsx(_components.code,{children:`dev`}),` (the default development branch; `,_jsx(_components.code,{children:`main`}),` is reserved for releases). Target `,_jsx(_components.code,{children:`dev`}),` when opening your PR.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Set up your development environment`}),` using `,_jsx(_components.a,{href:`/contributing/setting-up-repo`,children:`these instructions`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Run tests locally`}),` to ensure everything works`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`commit-message-format`,children:`Commit Message Format`}),`\n`,_jsxs(_components.p,{children:[`All commits should follow a standardized format. `,_jsx(_components.strong,{children:`For each package/directory you modify, include a separate commit message line`}),` describing the change in that package.`]}),`\n`,_jsx(Heading,{level:`3`,id:`format`,children:`Format`}),`\n`,_jsx(CodeBlock,{numberOfLines:`4`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`[type]: description`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Additional details if needed (optional)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`3`,id:`types`,children:`Types`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`feat`}),` - New feature`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`fix`}),` - Bug fix`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`refactor`}),` - Code refactoring (no feature change, no bug fix)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`docs`}),` - Documentation changes`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`test`}),` - Test changes`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`chore`}),` - Build, dependencies, tooling changes`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`perf`}),` - Performance improvements`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`examples`,children:`Examples`}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Single Package Change:`})}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`[fix]: handle connection timeout in MCP client manager`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Multiple Packages:`}),`\nIf your change affects multiple packages, include the package name or affected module in the description:`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`7`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`7`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`[fix]: MCP client - add retry logic to connection establishment`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`This fixes intermittent connection failures by implementing exponential backoff.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Affected packages:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- core/mcp/clientmanager.go`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- core/mcp/healthmonitor.go`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Provider-Specific Changes:`})}),`\n`,_jsx(CodeBlock,{numberOfLines:`3`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`[fix]: OpenAI provider - handle streaming response errors`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`[feat]: Anthropic provider - add support for batch API`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Multiple Commits for Multiple Packages:`}),`\nIf you’re making significant changes to multiple packages, consider separate commits:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`git`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` commit`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -m`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"[feat]: Add retry mechanism to MCP core utilities\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`git`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` commit`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -m`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"[fix]: Update OpenAI integration with retry support\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`git`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` commit`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -m`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"[docs]: Document MCP resilience strategy\"`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`all-packages-modified-should-be-listed`,children:`All Packages Modified Should Be Listed`}),`\n`,_jsx(_components.p,{children:`When creating a commit, always mention which packages/components are affected:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`11`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`11`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`[feat]: Add semantic caching plugin`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Changes:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- plugins/semanticcache/ - Core caching logic`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- core/bifrost.go - Plugin registration`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- transports/bifrost-http/server.go - Cache middleware integration`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Benefits:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- Reduces API costs by 30-40%`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- Improves response latency for similar queries`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`Use a structured format that makes it easy to understand at a glance what changed and where.`})}),`\n`,_jsx(Heading,{level:`2`,id:`maintaining-changelogs`,children:`Maintaining Changelogs`}),`\n`,_jsxs(_components.p,{children:[`For each package you modify, update the corresponding `,_jsx(_components.code,{children:`changelog.md`}),` file with your changes. Changelog entries are used to generate release notes and communicate changes to users.`]}),`\n`,_jsx(Heading,{level:`3`,id:`changelog-file-locations`,children:`Changelog File Locations`}),`\n`,_jsxs(_components.p,{children:[`Each package that receives updates should have a `,_jsx(_components.code,{children:`changelog.md`}),` file:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`core/changelog.md`}),` - Core package changes`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`framework/changelog.md`}),` - Framework changes`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`transports/changelog.md`}),` - Transport layer changes`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`plugins/{plugin-name}/changelog.md`}),` - Specific plugin changes`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`changelog-entry-format`,children:`Changelog Entry Format`}),`\n`,_jsx(_components.p,{children:`Each changelog entry follows this exact format:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`[type]: description [@Your Name](https://github.com/yourname)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Required Components:`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Type`}),`: One of `,_jsx(_components.code,{children:`feat`}),`, `,_jsx(_components.code,{children:`fix`}),`, `,_jsx(_components.code,{children:`refactor`}),`, `,_jsx(_components.code,{children:`docs`}),`, `,_jsx(_components.code,{children:`test`}),`, `,_jsx(_components.code,{children:`chore`}),`, or `,_jsx(_components.code,{children:`perf`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Description`}),`: Clear, concise description (under 100 characters)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Author`}),`: Your GitHub profile link (recommended)`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`change-types-reference`,children:`Change Types Reference`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Type`}),_jsx(_components.th,{children:`Usage`}),_jsx(_components.th,{children:`Example`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`feat`})}),_jsx(_components.td,{children:`New feature`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`[feat]: add exponential backoff retry mechanism`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`fix`})}),_jsx(_components.td,{children:`Bug fix`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`[fix]: handle connection timeout in MCP client`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`refactor`})}),_jsx(_components.td,{children:`Code refactoring (no behavior change)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`[refactor]: simplify model caching`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`docs`})}),_jsx(_components.td,{children:`Documentation updates`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`[docs]: clarify semantic caching behavior`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`test`})}),_jsx(_components.td,{children:`Test additions/modifications`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`[test]: add regression tests for retry logic`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`chore`})}),_jsx(_components.td,{children:`Build, dependencies, tooling`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`[chore]: upgrade dependencies to latest versions`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`perf`})}),_jsx(_components.td,{children:`Performance improvements`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`[perf]: optimize model lookup to O(1)`})})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`changelog-examples`,children:`Changelog Examples`}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Good Examples:`})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`markdown`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`markdown`,children:_jsxs(_components.code,{language:`markdown`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`feat`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]: add exponential backoff retry mechanism [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`@prathammaxim`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`](`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-text-decoration\":`underline`,\"--shiki-dark\":`#D4D4D4`,\"--shiki-dark-text-decoration\":`underline`},children:`https://github.com/prathammaxim`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`fix`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]: handle null pointer in OpenAI response parsing [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`@contributor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`](`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-text-decoration\":`underline`,\"--shiki-dark\":`#D4D4D4`,\"--shiki-dark-text-decoration\":`underline`},children:`https://github.com/contributor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`perf`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]: optimize model lookup with hash map [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`@contributor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`](`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-text-decoration\":`underline`,\"--shiki-dark\":`#D4D4D4`,\"--shiki-dark-text-decoration\":`underline`},children:`https://github.com/contributor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Poor Examples (avoid):`})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`markdown`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`markdown`,children:_jsxs(_components.code,{language:`markdown`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` update stuff`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` minor changes`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` fix bug`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` added new thing`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`how-to-add-changelog-entries`,children:`How to Add Changelog Entries`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[`Edit the `,_jsx(_components.code,{children:`changelog.md`})]}),` file in the affected package`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Add new entry at the TOP`}),` of the file (most recent first)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Follow the exact format`}),`: `,_jsx(_components.code,{children:`[type]: description [@name](https://github.com/user)`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Include your author link`}),` (optional but recommended)`]}),`\n`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Example: Before and After`})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Before:`})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`markdown`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`markdown`,children:_jsxs(_components.code,{language:`markdown`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`feat`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]: added image generation request and response support`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`chore`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]: added case-insensitive helper methods`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`After (with new entry at top):`})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`markdown`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`markdown`,children:_jsxs(_components.code,{language:`markdown`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`fix`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]: handle connection timeout in retry logic [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`@your-name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`](`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-text-decoration\":`underline`,\"--shiki-dark\":`#D4D4D4`,\"--shiki-dark-text-decoration\":`underline`},children:`https://github.com/your-name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`feat`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]: add exponential backoff for transient errors [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`@your-name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`](`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-text-decoration\":`underline`,\"--shiki-dark\":`#D4D4D4`,\"--shiki-dark-text-decoration\":`underline`},children:`https://github.com/your-name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`feat`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]: added image generation request and response support`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`chore`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]: added case-insensitive helper methods`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`multiple-package-changes`,children:`Multiple Package Changes`}),`\n`,_jsxs(_components.p,{children:[`When your PR affects multiple packages, `,_jsxs(_components.strong,{children:[`add entries to each package’s `,_jsx(_components.code,{children:`changelog.md`})]}),`:`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Example Multi-Package Changelog:`})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`core/changelog.md:`})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`markdown`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`markdown`,children:_jsxs(_components.code,{language:`markdown`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`feat`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]: add retry executor with exponential backoff [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`@contributor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`](`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-text-decoration\":`underline`,\"--shiki-dark\":`#D4D4D4`,\"--shiki-dark-text-decoration\":`underline`},children:`https://github.com/contributor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`transports/changelog.md:`})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`markdown`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`markdown`,children:_jsxs(_components.code,{language:`markdown`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`fix`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]: apply retry logic to connection establishment [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`@contributor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`](`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-text-decoration\":`underline`,\"--shiki-dark\":`#D4D4D4`,\"--shiki-dark-text-decoration\":`underline`},children:`https://github.com/contributor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`plugins/governance/changelog.md:`})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`markdown`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`markdown`,children:_jsxs(_components.code,{language:`markdown`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`chore`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]: update core dependency to latest version`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`what-to-include-in-changelog`,children:`What to Include in Changelog`}),`\n`,_jsxs(_components.p,{children:[`✅ `,_jsx(_components.strong,{children:`Do include:`})]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Bug fixes that affect users`}),`\n`,_jsx(_components.li,{children:`New features`}),`\n`,_jsx(_components.li,{children:`Breaking changes`}),`\n`,_jsx(_components.li,{children:`Performance improvements`}),`\n`,_jsx(_components.li,{children:`Significant refactoring`}),`\n`,_jsx(_components.li,{children:`Documentation improvements`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`❌ `,_jsx(_components.strong,{children:`Don’t include:`})]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Internal code cleanup with no user impact`}),`\n`,_jsx(_components.li,{children:`Typo fixes in comments only`}),`\n`,_jsx(_components.li,{children:`Build system changes (unless significant)`}),`\n`,_jsx(_components.li,{children:`Minor test-only changes`}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`changelog-best-practices`,children:`Changelog Best Practices`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Add entries at the TOP`}),` of the `,_jsx(_components.code,{children:`changelog.md`}),` file (most recent first)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`One entry per logical change`}),` - Don’t combine unrelated changes`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Keep descriptions concise`}),` - Under 100 characters`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Use consistent format`}),` - `,_jsx(_components.code,{children:`[type]: description`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Include your GitHub link`}),` - Helps recognize contributors`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Update all affected package changelogs`}),` - Don’t forget secondary packages`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Add changelog entry with your commit`}),` - Don’t wait until the end`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`format-consistency-rules`,children:`Format Consistency Rules`}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`DO’s:`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`✅ Use square brackets: `,_jsx(_components.code,{children:`[feat]`})]}),`\n`,_jsxs(_components.li,{children:[`✅ Use colon separator: `,_jsx(_components.code,{children:`[feat]:`})]}),`\n`,_jsx(_components.li,{children:`✅ Start with lowercase (unless proper noun)`}),`\n`,_jsx(_components.li,{children:`✅ Be specific and concise`}),`\n`,_jsx(_components.li,{children:`✅ Include GitHub profile link`}),`\n`,_jsx(_components.li,{children:`✅ Add new entries at the top`}),`\n`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`DON’Ts:`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`❌ Don’t use parentheses: `,_jsx(_components.code,{children:`(feat)`}),` or braces `,_jsx(_components.code,{children:`{feat}`})]}),`\n`,_jsx(_components.li,{children:`❌ Don’t use multiple spaces`}),`\n`,_jsx(_components.li,{children:`❌ Don’t mix formats in the same file`}),`\n`,_jsx(_components.li,{children:`❌ Don’t add entries at the bottom`}),`\n`,_jsx(_components.li,{children:`❌ Don’t use vague descriptions`}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`complete-pr-example-with-changelogs`,children:`Complete PR Example with Changelogs`}),`\n`,_jsx(_components.p,{children:`If your PR adds retry logic to multiple packages:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`14`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`14`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Commit: [feat]: Add retry logic with exponential backoff`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Modified files:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- core/mcp/utils.go ← add retry executor`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- core/mcp/clientmanager.go ← use retry logic`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Update changelogs:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`1. core/changelog.md:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` [feat]: add exponential backoff retry mechanism [@your-name](https://github.com/your-name)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`2. transports/changelog.md:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` [fix]: apply retry logic to connection establishment [@your-name](https://github.com/your-name)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`3`,id:`changelog-review-checklist`,children:`Changelog Review Checklist`}),`\n`,_jsx(_components.p,{children:`Before submitting a PR, verify:`}),`\n`,_jsxs(_components.ul,{className:`contains-task-list`,children:[`\n`,_jsxs(_components.li,{className:`task-list-item`,children:[_jsx(_components.input,{type:`checkbox`,disabled:true}),` `,`All packages modified have changelog entries`]}),`\n`,_jsxs(_components.li,{className:`task-list-item`,children:[_jsx(_components.input,{type:`checkbox`,disabled:true}),` `,`Format is correct: `,_jsx(_components.code,{children:`[type]: description [@name](https://github.com/user)`})]}),`\n`,_jsxs(_components.li,{className:`task-list-item`,children:[_jsx(_components.input,{type:`checkbox`,disabled:true}),` `,`Entries are added at TOP of the file`]}),`\n`,_jsxs(_components.li,{className:`task-list-item`,children:[_jsx(_components.input,{type:`checkbox`,disabled:true}),` `,`Author GitHub link is included`]}),`\n`,_jsxs(_components.li,{className:`task-list-item`,children:[_jsx(_components.input,{type:`checkbox`,disabled:true}),` `,`Description is clear and concise (under 100 chars)`]}),`\n`,_jsxs(_components.li,{className:`task-list-item`,children:[_jsx(_components.input,{type:`checkbox`,disabled:true}),` `,`Type is one of: feat, fix, refactor, docs, test, chore, perf`]}),`\n`,_jsxs(_components.li,{className:`task-list-item`,children:[_jsx(_components.input,{type:`checkbox`,disabled:true}),` `,`Entries are added with the commit (not after)`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`pull-request-title`,children:`Pull Request Title`}),`\n`,_jsx(_components.p,{children:`Keep PR titles concise and descriptive, following the same pattern:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`[type]: Brief description of the change`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`Examples:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`[feat]: Add rate limiting to governance plugin`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`[fix]: Resolve deadlock in MCP retry logic`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`[refactor]: Simplify model caching mechanism`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`[docs]: Update contribution guidelines for commit messages`})}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`pull-request-description`,children:`Pull Request Description`}),`\n`,_jsx(_components.p,{children:`Use the following template for your PR description:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`45`,language:`markdown`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`markdown`,children:_jsxs(_components.code,{language:`markdown`,numberOfLines:`45`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Description`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Brief explanation of what this PR does and why it's needed.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Type of Change`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [ ] Bug fix`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [ ] New feature`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [ ] Breaking change`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [ ] Documentation update`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [ ] Refactoring`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Affected Packages`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`List all packages/directories modified:`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` core/providers/openai/`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` transports/bifrost-http/server/`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` plugins/governance/`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Changes Made`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Specific change 1`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Specific change 2`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Specific change 3`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Testing`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Describe how you tested these changes:`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [ ] Unit tests added/updated`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [ ] Integration tests passed`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [ ] Manual testing completed`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Checklist`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [ ] Code follows the project's code style`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [ ] Tests are passing locally (`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`make test-all`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [ ] Documentation is updated if needed`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [ ] No breaking changes (or breaking changes are documented)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [ ] Commit messages follow the format: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`[type]: description`\"})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [ ] All affected packages are mentioned in commit messages`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Related Issues`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Closes #123`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Relates to #456`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`best-practices`,children:`Best Practices`}),`\n`,_jsx(Heading,{level:`3`,id:`1-keep-prs-focused`,children:`1. Keep PRs Focused`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`One feature or fix per PR when possible`}),`\n`,_jsx(_components.li,{children:`If multiple related changes, group them logically by package`}),`\n`,_jsx(_components.li,{children:`Avoid mixing refactoring with feature changes`}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`2-commit-messages-matter`,children:`2. Commit Messages Matter`}),`\n`,_jsxs(_components.p,{children:[`❌ `,_jsx(_components.strong,{children:`Bad:`})]}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Update file`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`✅ `,_jsx(_components.strong,{children:`Good:`})]}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`[fix]: Handle null pointer in OpenAI response parsing`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`❌ `,_jsx(_components.strong,{children:`Bad:`})]}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`[feat]: Major update to semantic cache`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`✅ `,_jsx(_components.strong,{children:`Good:`})]}),`\n`,_jsx(CodeBlock,{numberOfLines:`7`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`7`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`[feat]: Add semantic cache initialization with retry logic`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Changes:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- plugins/semanticcache/ - Add retry mechanism`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- core/bifrost.go - Register cache handler`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- docs/ - Add usage documentation`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`3`,id:`3-include-all-affected-packages`,children:`3. Include All Affected Packages`}),`\n`,_jsx(_components.p,{children:`Always explicitly list which packages/directories are modified:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`7`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`7`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`[fix]: Resolve SSE connection issues`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Affected components:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- core/mcp/clientmanager.go - Add connection validation`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- core/mcp/healthmonitor.go - Improve health checks`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- core/mcp/utils.go - Fix retry context handling`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`3`,id:`4-test-thoroughly`,children:`4. Test Thoroughly`}),`\n`,_jsx(_components.p,{children:`Before opening a PR:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`11`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`11`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Run all tests`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`make`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` test-all`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Run specific test suite`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`make`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` test-core`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` PROVIDER=openai`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Format code`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`make`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` fmt`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Lint code`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`make`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` lint`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`5-small-reviewable-prs`,children:`5. Small, Reviewable PRs`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Aim for \u003c400 lines changed per PR`}),`\n`,_jsx(_components.li,{children:`If larger, break into logical commits`}),`\n`,_jsx(_components.li,{children:`Each commit should be independently reviewable`}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`6-update-documentation`,children:`6. Update Documentation`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Update relevant `,_jsx(_components.code,{children:`.mdx`}),` files in `,_jsx(_components.code,{children:`/docs`})]}),`\n`,_jsx(_components.li,{children:`Add comments for complex logic`}),`\n`,_jsx(_components.li,{children:`Update README.md if behavior changes`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`code-review-checklist`,children:`Code Review Checklist`}),`\n`,_jsx(_components.p,{children:`Before requesting review, ensure:`}),`\n`,_jsxs(_components.p,{children:[`✅ All commits follow `,_jsx(_components.code,{children:`[type]: description`}),` format\n✅ All affected packages are explicitly mentioned\n✅ No merge conflicts\n✅ All tests pass (`,_jsx(_components.code,{children:`make test-all`}),`)\n✅ Code is properly formatted (`,_jsx(_components.code,{children:`make fmt`}),`)\n✅ No linting issues (`,_jsx(_components.code,{children:`make lint`}),`)\n✅ Documentation is updated\n✅ PR description is clear and complete`]}),`\n`,_jsx(Heading,{level:`2`,id:`during-code-review`,children:`During Code Review`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Respond to feedback promptly`}),`\n`,_jsx(_components.li,{children:`Push new commits for requested changes (don’t force-push to avoid confusion)`}),`\n`,_jsx(_components.li,{children:`Mark conversations as resolved when addressed`}),`\n`,_jsx(_components.li,{children:`Ask for clarification if feedback is unclear`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`merging`,children:`Merging`}),`\n`,_jsx(_components.p,{children:`Once approved:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`The maintainer will handle the merge`}),`\n`,_jsx(_components.li,{children:`Your commits will be preserved in the history`}),`\n`,_jsxs(_components.li,{children:[`Ensure your branch is up-to-date with `,_jsx(_components.code,{children:`dev`}),` before final approval`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`common-pitfalls-to-avoid`,children:`Common Pitfalls to Avoid`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`❌ `,_jsx(_components.strong,{children:`Vague commit messages`}),` - Always be specific about what changed`]}),`\n`,_jsxs(_components.li,{children:[`❌ `,_jsx(_components.strong,{children:`Missing package information`}),` - Always list affected packages`]}),`\n`,_jsxs(_components.li,{children:[`❌ `,_jsx(_components.strong,{children:`Mixing concerns`}),` - Keep commits focused`]}),`\n`,_jsxs(_components.li,{children:[`❌ `,_jsx(_components.strong,{children:`Not running tests`}),` - Test locally before opening PR`]}),`\n`,_jsxs(_components.li,{children:[`❌ `,_jsx(_components.strong,{children:`Large PRs`}),` - Break into smaller, reviewable chunks`]}),`\n`,_jsxs(_components.li,{children:[`❌ `,_jsx(_components.strong,{children:`Not updating docs`}),` - If behavior changes, update documentation`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`examples-of-good-commits`,children:`Examples of Good Commits`}),`\n`,_jsx(Heading,{level:`3`,id:`example-1-provider-fix`,children:`Example 1: Provider Fix`}),`\n`,_jsx(CodeBlock,{numberOfLines:`15`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`15`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`[fix]: OpenAI provider - handle streaming response errors correctly`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Previously, streaming responses would sometimes fail with`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\"context deadline exceeded\" error when network latency exceeded`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`timeout threshold.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Changes:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- core/providers/openai/openai.go - Add dynamic timeout`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- core/providers/anthropic/anthropic.go - Align timeout logic`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- tests/ - Add regression tests`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Affected packages:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- core/providers/`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- core/bifrost.go (minor type update)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`3`,id:`example-2-plugin-development`,children:`Example 2: Plugin Development`}),`\n`,_jsx(CodeBlock,{numberOfLines:`16`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`16`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`[feat]: Add rate limiting to governance plugin`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Introduces token bucket algorithm for per-customer rate limiting.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Allows fine-grained control over request throughput.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Changes:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- plugins/governance/ratelimit/ - New package with core logic`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- plugins/governance/main.go - Register rate limiter`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- transports/bifrost-http/middleware.go - Apply rate limit checks`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- docs/features/governance.mdx - Add usage documentation`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Benefits:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- Prevents request storms`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- Fair resource allocation`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- Configurable per-customer`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`3`,id:`example-3-core-refactoring`,children:`Example 3: Core Refactoring`}),`\n`,_jsx(CodeBlock,{numberOfLines:`14`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`14`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`[refactor]: Simplify model caching to reduce complexity`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Consolidate three separate caching layers into unified approach.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`No behavior change - internal improvement only.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Changes:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- core/models.go - Unified cache implementation`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- core/cache/ - Remove legacy cache package`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- tests/ - Update cache tests`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Affected packages:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- core/ (main change)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`- plugins/ (minor - cache API unchanged)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`2`,id:`need-help`,children:`Need Help?`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`📚 See `,_jsx(_components.a,{href:`/contributing/code-conventions`,children:`Code Conventions`}),` for style guidelines`]}),`\n`,_jsxs(_components.li,{children:[`🏗️ Check `,_jsx(_components.a,{href:`/architecture`,children:`Architecture Docs`}),` to understand the codebase structure`]}),`\n`,_jsxs(_components.li,{children:[`💬 Ask in `,_jsx(_components.a,{href:`https://discord.gg/exN5KAydbU`,children:`Discord`}),` if unsure about the process`]}),`\n`,_jsxs(_components.li,{children:[`❓ Refer to the `,_jsx(_components.a,{href:`#changelog-review-checklist`,children:`Changelog Review Checklist`}),` above before submitting`]}),`\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":{"config":{},"pageMetadata":{"title":"Raising a Pull Request","description":"Guidelines for submitting high-quality pull requests to Bifrost.","icon":"code-pull-request","href":"/contributing/raising-a-pr"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Before You Start","slug":"before-you-start","depth":2,"children":[]},{"title":"Commit Message Format","slug":"commit-message-format","depth":2,"children":[{"title":"Format","slug":"format","depth":3,"children":[]},{"title":"Types","slug":"types","depth":3,"children":[]},{"title":"Examples","slug":"examples","depth":3,"children":[]},{"title":"All Packages Modified Should Be Listed","slug":"all-packages-modified-should-be-listed","depth":3,"children":[]}]},{"title":"Maintaining Changelogs","slug":"maintaining-changelogs","depth":2,"children":[{"title":"Changelog File Locations","slug":"changelog-file-locations","depth":3,"children":[]},{"title":"Changelog Entry Format","slug":"changelog-entry-format","depth":3,"children":[]},{"title":"Change Types Reference","slug":"change-types-reference","depth":3,"children":[]},{"title":"Changelog Examples","slug":"changelog-examples","depth":3,"children":[]},{"title":"How to Add Changelog Entries","slug":"how-to-add-changelog-entries","depth":3,"children":[]},{"title":"Multiple Package Changes","slug":"multiple-package-changes","depth":3,"children":[]},{"title":"What to Include in Changelog","slug":"what-to-include-in-changelog","depth":3,"children":[]},{"title":"Changelog Best Practices","slug":"changelog-best-practices","depth":3,"children":[]},{"title":"Format Consistency Rules","slug":"format-consistency-rules","depth":3,"children":[]},{"title":"Complete PR Example with Changelogs","slug":"complete-pr-example-with-changelogs","depth":3,"children":[]},{"title":"Changelog Review Checklist","slug":"changelog-review-checklist","depth":3,"children":[]}]},{"title":"Pull Request Title","slug":"pull-request-title","depth":2,"children":[]},{"title":"Pull Request Description","slug":"pull-request-description","depth":2,"children":[]},{"title":"Best Practices","slug":"best-practices","depth":2,"children":[{"title":"1. Keep PRs Focused","slug":"1-keep-prs-focused","depth":3,"children":[]},{"title":"2. Commit Messages Matter","slug":"2-commit-messages-matter","depth":3,"children":[]},{"title":"3. Include All Affected Packages","slug":"3-include-all-affected-packages","depth":3,"children":[]},{"title":"4. Test Thoroughly","slug":"4-test-thoroughly","depth":3,"children":[]},{"title":"5. Small, Reviewable PRs","slug":"5-small-reviewable-prs","depth":3,"children":[]},{"title":"6. Update Documentation","slug":"6-update-documentation","depth":3,"children":[]}]},{"title":"Code Review Checklist","slug":"code-review-checklist","depth":2,"children":[]},{"title":"During Code Review","slug":"during-code-review","depth":2,"children":[]},{"title":"Merging","slug":"merging","depth":2,"children":[]},{"title":"Common Pitfalls to Avoid","slug":"common-pitfalls-to-avoid","depth":2,"children":[]},{"title":"Examples of Good Commits","slug":"examples-of-good-commits","depth":2,"children":[{"title":"Example 1: Provider Fix","slug":"example-1-provider-fix","depth":3,"children":[]},{"title":"Example 2: Plugin Development","slug":"example-2-plugin-development","depth":3,"children":[]},{"title":"Example 3: Core Refactoring","slug":"example-3-core-refactoring","depth":3,"children":[]}]},{"title":"Need Help?","slug":"need-help","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/bifrost/62ad9b1aea461302/googleTag.js","/_mintlify/custom/bifrost/c4c9272fd1c525e5/jsonLd.js","/_mintlify/custom/bifrost/5a8b9314a2dac891/supportWidget.js","/_mintlify/custom/bifrost/088e287583b748b0/baseUrlSwitcher.js","/_mintlify/custom/bifrost/aa532cead633d329/tally-embed.js","/_mintlify/custom/bifrost/fe58824b4f1a0ad5/footerCompliance.js"],"subdomain":"bifrost","siteName":"Bifrost","title":"Raising a Pull Request - Bifrost","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-05-12T09:22:32.295Z","originalFileLocation":"contributing/raising-a-pr.mdx"},"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=\"Guidelines for submitting high-quality pull requests to Bifrost.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Bifrost\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/bifrost/kXIL-Qs6IzN4ZLK4/_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/bifrost/kXIL-Qs6IzN4ZLK4/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/bifrost/kXIL-Qs6IzN4ZLK4/_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/bifrost/kXIL-Qs6IzN4ZLK4/_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/bifrost/kXIL-Qs6IzN4ZLK4/_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/bifrost/kXIL-Qs6IzN4ZLK4/_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/bifrost/kXIL-Qs6IzN4ZLK4/_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/bifrost/kXIL-Qs6IzN4ZLK4/_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/bifrost/kXIL-Qs6IzN4ZLK4/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Raising a Pull Request - Bifrost\">\u003cmeta data-mint-head property=\"og:description\" content=\"Guidelines for submitting high-quality pull requests to Bifrost.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Bifrost\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.getbifrost.ai/contributing/raising-a-pr\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://bifrost.mintlify.app/_mintlify/api/og/v2?division=Contributing\u0026amp;title=Raising+a+Pull+Request\u0026amp;description=Guidelines+for+submitting+high-quality+pull+requests+to+Bifrost.\u0026amp;theme=4d1d84bec9a8c3ee0c7cd8ee\u0026amp;signature=98c0eb59abd6d3cf1b543d48ed0d4a630a17ce5ba25f065807b55719af9e4bca\">\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=\"Raising a Pull Request - Bifrost\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Guidelines for submitting high-quality pull requests to Bifrost.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://bifrost.mintlify.app/_mintlify/api/og/v2?division=Contributing\u0026amp;title=Raising+a+Pull+Request\u0026amp;description=Guidelines+for+submitting+high-quality+pull+requests+to+Bifrost.\u0026amp;theme=4d1d84bec9a8c3ee0c7cd8ee\u0026amp;signature=98c0eb59abd6d3cf1b543d48ed0d4a630a17ce5ba25f065807b55719af9e4bca\">\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/bifrost/kXIL-Qs6IzN4ZLK4/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Bifrost\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0C3B43\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.getbifrost.ai/contributing/raising-a-pr\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/contributing/raising-a-pr.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.getbifrost.ai/#organization\",\"name\":\"Bifrost\",\"url\":\"https://docs.getbifrost.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/bifrost/qFMmk8bNSnvgFYDI/media/bifrost-logo.png?fit=max\u0026auto=format\u0026n=qFMmk8bNSnvgFYDI\u0026q=85\u0026s=6af701a560aee4103444fa017b226cf0\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.getbifrost.ai#website\",\"name\":\"Bifrost\",\"url\":\"https://docs.getbifrost.ai\",\"publisher\":{\"@id\":\"https://docs.getbifrost.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.getbifrost.ai/contributing/raising-a-pr#webpage\",\"url\":\"https://docs.getbifrost.ai/contributing/raising-a-pr\",\"name\":\"Raising a Pull Request\",\"description\":\"Guidelines for submitting high-quality pull requests to Bifrost.\",\"dateModified\":\"2026-05-12T09:22:32.295Z\",\"isPartOf\":{\"@id\":\"https://docs.getbifrost.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.getbifrost.ai/contributing/raising-a-pr#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.getbifrost.ai/contributing/raising-a-pr#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Contributing\",\"item\":\"https://docs.getbifrost.ai/contributing/setting-up-repo\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Raising a Pull Request\",\"item\":\"https://docs.getbifrost.ai/contributing/raising-a-pr\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.getbifrost.ai/contributing/raising-a-pr#article\",\"headline\":\"Raising a Pull Request\",\"name\":\"Raising a Pull Request\",\"description\":\"Guidelines for submitting high-quality pull requests to Bifrost.\",\"url\":\"https://docs.getbifrost.ai/contributing/raising-a-pr\",\"mainEntityOfPage\":{\"@id\":\"https://docs.getbifrost.ai/contributing/raising-a-pr#webpage\"},\"dateModified\":\"2026-05-12T09:22:32.295Z\",\"publisher\":{\"@id\":\"https://docs.getbifrost.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.getbifrost.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Bifrost\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Bifrost","nav":{"global":{"anchors":[{"anchor":"Discord","icon":"discord","href":"https://discord.gg/exN5KAydbU"},{"anchor":"GitHub","icon":"github","href":"https://github.com/maximhq/bifrost"},{"anchor":"Try Enterprise","icon":"building","href":"https://www.getmaxim.ai/bifrost/enterprise"}]},"tabs":[{"tab":"OSS","icon":"book-open-cover","pages":[{"title":"OSS","href":"/overview"}]},{"tab":"Enterprise","icon":"building","pages":[{"title":"Enterprise","href":"/enterprise/overview"}]},{"tab":"Edge","icon":"globe","pages":[{"title":"Edge","href":"/edge/overview"}]},{"tab":"Integrations","icon":"plug","pages":[{"title":"Integrations","href":"/runbooks/claude-code-bedrock"}]},{"tab":"Deployment Guides","icon":"server","pages":[{"title":"Deployment Guides","href":"/deployment-guides/overview"}]},{"tab":"API","icon":"code","pages":[{"title":"API","href":"/api/procuring-api-keys"}]},{"tab":"Contributing","icon":"code-pull-request","groups":[{"group":"Contributing","icon":"code","pages":[{"title":"Setting up the repository","description":"Complete guide to setting up the Bifrost repository for local development.","icon":"hammer","href":"/contributing/setting-up-repo"},{"title":"Raising a Pull Request","icon":"code-pull-request","href":"/contributing/raising-a-pr"},{"title":"Code Conventions","description":"Code style and convention guidelines for contributing to Bifrost.","icon":"brush","href":"/contributing/code-conventions"},{"title":"Adding a new provider","icon":"box","href":"/contributing/adding-a-provider"},{"title":"Adding config store","icon":"database","href":"/contributing/adding-a-configstore"},{"title":"Adding a log store","icon":"database","href":"/contributing/adding-a-logstore"},{"title":"Adding a vector store","icon":"circle-nodes","href":"/contributing/adding-a-vectorstore"}]},{"group":"Core Architecture","icon":"sitemap","pages":[{"title":"Concurrency","icon":"traffic-light","href":"/architecture/core/concurrency"},{"title":"Request Flow","icon":"route","href":"/architecture/core/request-flow"},{"title":"Model Context Protocol (MCP)","icon":"toolbox","href":"/architecture/core/mcp"},{"title":"Plugins","icon":"puzzle-piece","href":"/architecture/core/plugins"}]},{"group":"Framework","icon":"screwdriver-wrench","pages":[{"title":"What is framework?","icon":"play","href":"/architecture/framework/what-is-framework"},{"title":"Model Catalog","icon":"book-open","href":"/architecture/framework/model-catalog"},{"title":"Config Store","icon":"gear","href":"/architecture/framework/config-store"},{"title":"Log Store","icon":"clipboard-list","href":"/architecture/framework/log-store"},{"title":"Vector Store","icon":"diagram-project","href":"/architecture/framework/vector-store"},{"title":"Streaming","icon":"water","href":"/architecture/framework/streaming"}]}]},{"tab":"Benchmarks","icon":"chart-line","pages":[{"title":"Benchmarks","href":"/benchmarking/getting-started"}]},{"tab":"Changelogs","icon":"bolt","menu":[{"item":"Open Source","icon":"rocket","pages":[{"title":"Open Source","href":"/changelogs/v2.4.0"}]},{"item":"Enterprise","icon":"building","pages":[{"title":"Enterprise","href":"/changelogs/ent-v2.4.0"}]},{"item":"Edge","icon":"grip","pages":[{"title":"Edge","href":"/changelogs/edge-v1.0.0"}]},{"item":"Bifrost CLI","icon":"laptop-code","pages":[{"title":"Bifrost CLI","href":"/changelogs/cli-v1.0.0"}]},{"item":"Helm","icon":"box","pages":[{"title":"Helm","href":"/changelogs/helm-v2.1.46"}]}],"pages":[{"title":"Changelogs","href":"/changelogs/v2.4.0"}]}]},"basePath":"","title":"Raising a Pull Request - Bifrost","buildId":"dpl_G9nrg4qeJSZtah1Ziwbc2n6WkLch","deploymentId":"dpl_G9nrg4qeJSZtah1Ziwbc2n6WkLch","dynamics":[],"chunks":[]}