Trace the change
Connect changed files to modules and dependencies across the full supported project AST.
diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml
new file mode 100644
index 0000000..6db8a04
--- /dev/null
+++ b/.github/workflows/pages.yml
@@ -0,0 +1,37 @@
+name: Publish marketing site
+
+on:
+ push:
+ branches: [master]
+ paths:
+ - "site/**"
+ - ".github/workflows/pages.yml"
+ workflow_dispatch:
+
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+concurrency:
+ group: github-pages
+ cancel-in-progress: true
+
+jobs:
+ deploy:
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out source
+ uses: actions/checkout@v4
+ - name: Configure GitHub Pages
+ uses: actions/configure-pages@v5
+ - name: Upload site artifact
+ uses: actions/upload-pages-artifact@v3
+ with:
+ path: site
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
diff --git a/AGENTS.md b/AGENTS.md
index 6084bef..33f9ad0 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -37,9 +37,11 @@ versioned with the analyzed project in .risk-gate.yaml.
10. Before declaring an integration complete, prove the real path: PR event,
configuration loading, diff, analysis, gate execution, comment, and Action
exit code.
-11. All documentation, comments, CLI messages, reports, examples, and other
- user-facing project text must be written in English. Preserve exact
- identifiers, YAML keys, API fields, exit codes, and code literals.
+11. Write documentation, comments, CLI messages, reports, examples, and other
+ user-facing project text in English, except for the marketing site in site/,
+ which must support English, Portuguese, Spanish, Japanese, and Chinese.
+ Preserve exact identifiers, YAML keys, API fields, exit codes, and code
+ literals.
## AST and language model
diff --git a/site/.nojekyll b/site/.nojekyll
new file mode 100644
index 0000000..e69de29
diff --git a/site/README.md b/site/README.md
new file mode 100644
index 0000000..a23bbd4
--- /dev/null
+++ b/site/README.md
@@ -0,0 +1,19 @@
+# Risk Gate marketing site
+
+This static, responsive landing page lives in `site/` and supports English,
+Portuguese, Spanish, Japanese, and Chinese. The language selector follows the
+browser language on first visit and remembers the visitor's choice.
+
+## GitHub Pages deployment
+
+The `Publish marketing site` workflow uploads `site/` and deploys it to GitHub
+Pages when site files change on `master`, or when manually dispatched.
+
+In the repository's **Settings → Pages**, set **Build and deployment → Source**
+to **GitHub Actions**. Merge the site and workflow to `master`; the workflow
+publishes the landing page and exposes its URL in the `github-pages`
+environment.
+
+The hero video is a locally bundled, silent MP4 with a poster image. It loops
+muted, provides native playback controls, and is not downloaded from a third
+party.
diff --git a/site/assets/app.js b/site/assets/app.js
new file mode 100644
index 0000000..87d7fda
--- /dev/null
+++ b/site/assets/app.js
@@ -0,0 +1,54 @@
+const copy = {
+ en: {
+ navHow:"How it works",navTeams:"For your team",navQuick:"Quick start",languageLabel:"Choose language",navGithub:"View on GitHub",eyebrow:"OPEN SOURCE · GITHUB ACTION",headline:"Ship with
impact in view.",subhead:"Risk Gate maps what changed to what matters. Then it runs the checks that change deserves, before it reaches production.",ctaStart:"Add to your workflow",ctaHow:"See how it works",metaRust:"Built in Rust",metaOpen:"Open source",metaRepo:"Runs in your GitHub Actions",visualTitle:"PULL REQUEST · #284",videoFallback:"Your browser does not support embedded video.",live:"LIVE FLOW",prTitle:"Checkout service update",prFiles:"8 files changed",pipeDiff:"Map changed files",pipeDiffSub:"PR diff · dependency graph",pipeRisk:"Impact detected",pipeRiskSub:"Payments → checkout → API",pipeChecks:"Run risk-matched checks",pipeChecksSub:"E2E + mutation suite",done:"DONE",highRisk:"HIGH RISK",running:"RUNNING",teamReview:"Product + Support in the loop",teamReviewSub:"One clear report, shared context",riskLevel:"CHANGE RISK",riskHigh:"HIGH",lowRisk:"LOW",dangerRisk:"DANGER",visualFoot:"Checks scale with impact. Every decision has a reason.",chipAst:"Full-project AST",chipEvidence:"Auditable evidence",scroll:"SCROLL TO EXPLORE",trustLabel:"BUILT FOR THE WAY TEAMS SHIP",trustOne:"PR-aware",trustTwo:"Risk-proportional",trustThree:"Explainable by design",trustFour:"Runs where you work",howEyebrow:"FROM DIFF TO DECISION",howTitle:"Every change has
a different blast radius.",howIntro:"A typo and a payment-flow rewrite should not face the same gate. Risk Gate traces impact through your project, then makes the next step clear.",stepOneTag:"UNDERSTAND",stepOneTitle:"Trace the change",stepOneText:"Connect changed files to modules and dependencies across the full supported project AST.",stepTwoTag:"ASSESS",stepTwoTitle:"Make risk legible",stepTwoText:"See the affected paths, risk level, and dependency chain behind every recommendation.",stepThreeTag:"RESPOND",stepThreeTitle:"Gate what matters",stepThreeText:"Run configured validations and require approvals in proportion to the risk.",gateChecks:"CHECKS",gateReview:"REVIEW",gatePassed:"POLICY MATCHED",flowCaption:"ANALYZE → EXPLAIN → VALIDATE → REPORT",teamsEyebrow:"ONE DECISION, SHARED CONTEXT",teamsTitle:"Engineering sees
the graph.
Teams see the why.",teamsText:"A pull request report gives Engineering evidence to act on, Product a clear view of customer-facing impact, and Support the context to prepare. No one has to decode a green checkmark.",teamsLink:"Explore the analysis",boardTitle:"SHARED RELEASE CONTEXT",changeLabel:"CHANGE",changeTitle:"Checkout retry logic",changeHigh:"HIGH",impactLabel:"IMPACT PATH",roleEng:"Engineering",roleEngSub:"E2E + mutation checks required",statusRunning:"Validating",roleProduct:"Product",roleProductSub:"Customer impact is visible",roleSupport:"Support",roleSupportSub:"Release context is ready",statusReady:"Informed",boardFoot:"Evidence stays attached to the pull request.",startEyebrow:"A SMALL STEP IN YOUR WORKFLOW",startTitle:"Bring risk into
the pull request.",startText:"Add a workflow, define your repository's risk map, and let your team tune the gates to fit how you ship.",startGithub:"Get started on GitHub",startNote:"Open source · Runs in your workflow · Your rules, your repository",copy:"COPY",copied:"Copied",codeReady:"Ready for your next pull request",closing:"Make the risk visible.
Make the next step clear.",footer:"Open source, built for teams that ship."
+ },
+ pt: {
+ navHow:"Como funciona",navTeams:"Para seu time",navQuick:"Comece rápido",languageLabel:"Escolha o idioma",navGithub:"Ver no GitHub",eyebrow:"CÓDIGO ABERTO · GITHUB ACTION",headline:"Publique com
impacto à vista.",subhead:"O Risk Gate relaciona o que mudou ao que importa. Depois executa as verificações adequadas antes de chegar à produção.",ctaStart:"Adicione ao workflow",ctaHow:"Veja como funciona",metaRust:"Feito em Rust",metaOpen:"Código aberto",metaRepo:"Executa no seu GitHub Actions",visualTitle:"PULL REQUEST · #284",videoFallback:"Seu navegador não suporta vídeo incorporado.",live:"FLUXO AO VIVO",prTitle:"Atualização do checkout",prFiles:"8 arquivos alterados",pipeDiff:"Mapear arquivos alterados",pipeDiffSub:"Diff do PR · grafo de dependências",pipeRisk:"Impacto identificado",pipeRiskSub:"Pagamentos → checkout → API",pipeChecks:"Executar verificações por risco",pipeChecksSub:"E2E + mutação",done:"OK",highRisk:"RISCO ALTO",running:"EXECUTANDO",teamReview:"Produto + Suporte no contexto",teamReviewSub:"Um relatório claro, contexto compartilhado",riskLevel:"RISCO DA MUDANÇA",riskHigh:"ALTO",lowRisk:"BAIXO",dangerRisk:"CRÍTICO",visualFoot:"As verificações acompanham o impacto. Toda decisão tem um motivo.",chipAst:"AST do projeto completo",chipEvidence:"Evidências auditáveis",scroll:"ROLE PARA EXPLORAR",trustLabel:"FEITO PARA O JEITO QUE OS TIMES ENTREGAM",trustOne:"Entende PRs",trustTwo:"Proporcional ao risco",trustThree:"Explicável por design",trustFour:"Roda onde você trabalha",howEyebrow:"DO DIFF À DECISÃO",howTitle:"Cada mudança tem
um raio de impacto.",howIntro:"Um ajuste de texto e uma mudança no fluxo de pagamentos não deveriam passar pela mesma barreira. O Risk Gate rastreia o impacto e deixa claro o próximo passo.",stepOneTag:"ENTENDA",stepOneTitle:"Rastreie a mudança",stepOneText:"Conecte arquivos alterados a módulos e dependências em toda a AST suportada do projeto.",stepTwoTag:"AVALIE",stepTwoTitle:"Deixe o risco claro",stepTwoText:"Veja os caminhos afetados, o nível de risco e a cadeia de dependências por trás da recomendação.",stepThreeTag:"AJA",stepThreeTitle:"Valide o que importa",stepThreeText:"Execute validações configuradas e exija aprovações proporcionais ao risco.",gateChecks:"TESTES",gateReview:"REVISÃO",gatePassed:"POLÍTICA APLICADA",flowCaption:"ANALISAR → EXPLICAR → VALIDAR → RELATAR",teamsEyebrow:"UMA DECISÃO, CONTEXTO COMPARTILHADO",teamsTitle:"Engenharia vê
o grafo.
O time entende o motivo.",teamsText:"O relatório do pull request dá evidências para Engenharia agir, visibilidade do impacto no cliente para Produto e contexto para Suporte se preparar. Ninguém precisa decifrar um sinal verde.",teamsLink:"Explore a análise",boardTitle:"CONTEXTO DE LANÇAMENTO COMPARTILHADO",changeLabel:"MUDANÇA",changeTitle:"Nova tentativa no checkout",changeHigh:"ALTO",impactLabel:"CAMINHO DO IMPACTO",roleEng:"Engenharia",roleEngSub:"Testes E2E + mutação necessários",statusRunning:"Validando",roleProduct:"Produto",roleProductSub:"Impacto no cliente visível",roleSupport:"Suporte",roleSupportSub:"Contexto da versão disponível",statusReady:"Informado",boardFoot:"As evidências ficam no pull request.",startEyebrow:"UM PEQUENO PASSO NO SEU WORKFLOW",startTitle:"Traga o risco para
o pull request.",startText:"Adicione um workflow, defina o mapa de risco do repositório e ajuste as barreiras ao jeito que seu time entrega.",startGithub:"Comece pelo GitHub",startNote:"Código aberto · No seu workflow · Suas regras, seu repositório",copy:"COPIAR",copied:"Copiado",codeReady:"Pronto para o próximo pull request",closing:"Deixe o risco visível.
Deixe claro o próximo passo.",footer:"Código aberto para times que entregam."
+ },
+ es: {
+ navHow:"Cómo funciona",navTeams:"Para tu equipo",navQuick:"Inicio rápido",languageLabel:"Elegir idioma",navGithub:"Ver en GitHub",eyebrow:"CÓDIGO ABIERTO · GITHUB ACTION",headline:"Publica con
el impacto a la vista.",subhead:"Risk Gate conecta lo que cambió con lo que importa. Después ejecuta las comprobaciones adecuadas antes de llegar a producción.",ctaStart:"Añadir al workflow",ctaHow:"Ver cómo funciona",metaRust:"Hecho en Rust",metaOpen:"Código abierto",metaRepo:"Se ejecuta en tu GitHub Actions",visualTitle:"PULL REQUEST · #284",videoFallback:"Tu navegador no admite vídeo integrado.",live:"FLUJO EN VIVO",prTitle:"Actualización del checkout",prFiles:"8 archivos modificados",pipeDiff:"Mapear archivos modificados",pipeDiffSub:"Diff del PR · grafo de dependencias",pipeRisk:"Impacto detectado",pipeRiskSub:"Pagos → checkout → API",pipeChecks:"Ejecutar pruebas según el riesgo",pipeChecksSub:"E2E + mutación",done:"LISTO",highRisk:"RIESGO ALTO",running:"EJECUTANDO",teamReview:"Producto + Soporte al tanto",teamReviewSub:"Un informe claro, contexto compartido",riskLevel:"RIESGO DEL CAMBIO",riskHigh:"ALTO",lowRisk:"BAJO",dangerRisk:"CRÍTICO",visualFoot:"Las comprobaciones escalan con el impacto. Cada decisión tiene un motivo.",chipAst:"AST del proyecto completo",chipEvidence:"Evidencia auditable",scroll:"DESPLAZA PARA EXPLORAR",trustLabel:"DISEÑADO PARA LA FORMA EN QUE LOS EQUIPOS PUBLICAN",trustOne:"Entiende PRs",trustTwo:"Proporcional al riesgo",trustThree:"Explicable por diseño",trustFour:"Se ejecuta donde trabajas",howEyebrow:"DEL DIFF A LA DECISIÓN",howTitle:"Cada cambio tiene
un radio de impacto distinto.",howIntro:"Un cambio de texto y una reescritura del flujo de pagos no deberían pasar por la misma barrera. Risk Gate rastrea el impacto y aclara el siguiente paso.",stepOneTag:"ENTENDER",stepOneTitle:"Rastrea el cambio",stepOneText:"Conecta los archivos modificados con módulos y dependencias en todo el AST compatible del proyecto.",stepTwoTag:"EVALUAR",stepTwoTitle:"Haz visible el riesgo",stepTwoText:"Consulta las rutas afectadas, el nivel de riesgo y la cadena de dependencias que fundamentan cada recomendación.",stepThreeTag:"ACTUAR",stepThreeTitle:"Valida lo importante",stepThreeText:"Ejecuta validaciones configuradas y exige aprobaciones proporcionales al riesgo.",gateChecks:"PRUEBAS",gateReview:"REVISIÓN",gatePassed:"POLÍTICA APLICADA",flowCaption:"ANALIZAR → EXPLICAR → VALIDAR → INFORMAR",teamsEyebrow:"UNA DECISIÓN, CONTEXTO COMPARTIDO",teamsTitle:"Ingeniería ve
el grafo.
El equipo entiende por qué.",teamsText:"El informe del pull request da a Ingeniería pruebas para actuar, a Producto una visión clara del impacto en los clientes y a Soporte el contexto para prepararse. Nadie tiene que descifrar una marca verde.",teamsLink:"Explorar el análisis",boardTitle:"CONTEXTO COMPARTIDO DEL LANZAMIENTO",changeLabel:"CAMBIO",changeTitle:"Reintentos en checkout",changeHigh:"ALTO",impactLabel:"RUTA DEL IMPACTO",roleEng:"Ingeniería",roleEngSub:"Se requieren pruebas E2E + mutación",statusRunning:"Validando",roleProduct:"Producto",roleProductSub:"Impacto en clientes visible",roleSupport:"Soporte",roleSupportSub:"Contexto de lanzamiento listo",statusReady:"Informado",boardFoot:"Las pruebas quedan en el pull request.",startEyebrow:"UN PEQUEÑO PASO EN TU WORKFLOW",startTitle:"Lleva el riesgo
al pull request.",startText:"Añade un workflow, define el mapa de riesgo del repositorio y ajusta las barreras a la forma de publicar de tu equipo.",startGithub:"Empieza en GitHub",startNote:"Código abierto · En tu workflow · Tus reglas, tu repositorio",copy:"COPIAR",copied:"Copiado",codeReady:"Listo para tu próximo pull request",closing:"Haz visible el riesgo.
Deja claro el siguiente paso.",footer:"Código abierto para equipos que publican."
+ },
+ ja: {
+ navHow:"仕組み",navTeams:"チームで活用",navQuick:"クイックスタート",languageLabel:"言語を選択",navGithub:"GitHubで見る",eyebrow:"オープンソース · GITHUB ACTION",headline:"影響を見据えて
安全にリリース。",subhead:"Risk Gate は変更内容と重要な領域を結び付けます。変更の影響に応じたチェックを本番反映前に実行します。",ctaStart:"ワークフローに追加",ctaHow:"仕組みを見る",metaRust:"Rust製",metaOpen:"オープンソース",metaRepo:"GitHub Actions 上で実行",visualTitle:"PULL REQUEST · #284",videoFallback:"お使いのブラウザーは埋め込み動画に対応していません。",live:"ライブフロー",prTitle:"チェックアウト機能の更新",prFiles:"8ファイルを変更",pipeDiff:"変更ファイルをマッピング",pipeDiffSub:"PR差分 · 依存関係グラフ",pipeRisk:"影響を検出",pipeRiskSub:"決済 → チェックアウト → API",pipeChecks:"リスクに応じたチェックを実行",pipeChecksSub:"E2E + ミューテーション",done:"完了",highRisk:"高リスク",running:"実行中",teamReview:"プロダクトとサポートも共有",teamReviewSub:"明確なレポートで状況を共有",riskLevel:"変更のリスク",riskHigh:"高",lowRisk:"低",dangerRisk:"重大",visualFoot:"影響に応じてチェックを調整。すべての判断に根拠があります。",chipAst:"プロジェクト全体のAST",chipEvidence:"監査可能な根拠",scroll:"スクロールして詳細を見る",trustLabel:"チームのリリース運用に合わせて設計",trustOne:"PRを解析",trustTwo:"リスクに比例",trustThree:"根拠を説明",trustFour:"GitHub内で実行",howEyebrow:"差分から判断へ",howTitle:"変更ごとに
影響範囲は異なります。",howIntro:"文言修正と決済フローの変更に同じゲートは不要です。Risk Gate がプロジェクト内の影響をたどり、次の対応を明確にします。",stepOneTag:"把握",stepOneTitle:"変更を追跡",stepOneText:"変更ファイルをモジュールや依存関係に結び付け、対応言語のプロジェクト全体のASTを解析します。",stepTwoTag:"評価",stepTwoTitle:"リスクを可視化",stepTwoText:"影響するパス、リスクレベル、判断の根拠となる依存関係を確認できます。",stepThreeTag:"対応",stepThreeTitle:"重要な変更をゲート",stepThreeText:"設定済みの検証を実行し、リスクに応じて承認を求めます。",gateChecks:"検証",gateReview:"レビュー",gatePassed:"ポリシー適用済み",flowCaption:"解析 → 説明 → 検証 → レポート",teamsEyebrow:"判断と状況をチームで共有",teamsTitle:"エンジニアには
依存グラフを。
チームには理由を。",teamsText:"PRレポートは、エンジニアに対応の根拠を、プロダクトに顧客影響を、サポートに準備のための状況を共有します。緑のチェックマークを読み解く必要はありません。",teamsLink:"解析の詳細を見る",boardTitle:"リリース状況を共有",changeLabel:"変更",changeTitle:"チェックアウトの再試行",changeHigh:"高",impactLabel:"影響経路",roleEng:"エンジニアリング",roleEngSub:"E2Eとミューテーション検証が必要",statusRunning:"検証中",roleProduct:"プロダクト",roleProductSub:"顧客への影響を確認",roleSupport:"サポート",roleSupportSub:"リリース情報を共有",statusReady:"共有済み",boardFoot:"根拠はPRに記録されます。",startEyebrow:"ワークフローに加える小さな一歩",startTitle:"リスクを
Pull Requestへ。",startText:"ワークフローを追加してリポジトリのリスクマップを定義し、チームの運用に合わせてゲートを調整します。",startGithub:"GitHubで始める",startNote:"オープンソース · ワークフローで実行 · 自分のルールとリポジトリ",copy:"コピー",copied:"コピーしました",codeReady:"次のPull Requestから利用できます",closing:"リスクを見える化。
次の対応を明確に。",footer:"リリースを続けるチームのためのオープンソース。"
+ },
+ zh: {
+ navHow:"工作原理",navTeams:"团队协作",navQuick:"快速开始",languageLabel:"选择语言",navGithub:"在 GitHub 查看",eyebrow:"开源项目 · GITHUB ACTION",headline:"看清影响,
稳妥发布。",subhead:"Risk Gate 将代码变更与关键模块关联,并在上线前执行与变更风险相匹配的检查。",ctaStart:"添加到工作流",ctaHow:"了解工作原理",metaRust:"使用 Rust 构建",metaOpen:"开源",metaRepo:"在你的 GitHub Actions 中运行",visualTitle:"PULL REQUEST · #284",videoFallback:"你的浏览器不支持嵌入式视频。",live:"实时流程",prTitle:"结账服务更新",prFiles:"修改了 8 个文件",pipeDiff:"映射变更文件",pipeDiffSub:"PR 差异 · 依赖关系图",pipeRisk:"检测到影响",pipeRiskSub:"支付 → 结账 → API",pipeChecks:"执行匹配风险的检查",pipeChecksSub:"E2E + 变异测试",done:"完成",highRisk:"高风险",running:"运行中",teamReview:"产品与支持团队同步了解",teamReviewSub:"清晰报告,共享上下文",riskLevel:"变更风险",riskHigh:"高",lowRisk:"低",dangerRisk:"严重",visualFoot:"检查随影响程度调整。每项判断都有依据。",chipAst:"完整项目 AST",chipEvidence:"可审计证据",scroll:"向下探索",trustLabel:"为团队的交付流程而设计",trustOne:"理解 PR",trustTwo:"风险匹配",trustThree:"解释清晰",trustFour:"在现有工作流中运行",howEyebrow:"从差异到决策",howTitle:"每项变更都有
不同的影响范围。",howIntro:"文案调整和支付流程重构不应经过相同的关卡。Risk Gate 会追踪项目中的影响路径,并明确下一步操作。",stepOneTag:"理解",stepOneTitle:"追踪变更",stepOneText:"在完整的受支持项目 AST 中,将变更文件与模块和依赖项关联起来。",stepTwoTag:"评估",stepTwoTitle:"让风险一目了然",stepTwoText:"查看受影响路径、风险级别,以及每项建议背后的依赖链。",stepThreeTag:"响应",stepThreeTitle:"把关关键变更",stepThreeText:"运行已配置的验证,并根据风险要求相应审批。",gateChecks:"检查",gateReview:"评审",gatePassed:"策略已匹配",flowCaption:"分析 → 解释 → 验证 → 报告",teamsEyebrow:"共享决策与上下文",teamsTitle:"工程团队看到
依赖图。
团队理解原因。",teamsText:"Pull Request 报告为工程团队提供行动依据,让产品团队看清客户影响,也帮助支持团队提前准备。无需猜测绿色勾号代表什么。",teamsLink:"了解分析过程",boardTitle:"共享发布上下文",changeLabel:"变更",changeTitle:"结账重试逻辑",changeHigh:"高",impactLabel:"影响路径",roleEng:"工程",roleEngSub:"需要 E2E + 变异检查",statusRunning:"验证中",roleProduct:"产品",roleProductSub:"客户影响清晰可见",roleSupport:"支持",roleSupportSub:"发布信息已准备",statusReady:"已同步",boardFoot:"证据会保留在 Pull Request 中。",startEyebrow:"为工作流迈出一小步",startTitle:"让风险进入
Pull Request。",startText:"添加工作流,定义仓库风险映射,并根据团队的交付方式调整关卡。",startGithub:"在 GitHub 开始使用",startNote:"开源 · 在你的工作流中运行 · 你的规则与仓库",copy:"复制",copied:"已复制",codeReady:"准备好处理下一个 Pull Request",closing:"让风险清晰可见。
让下一步明确可行。",footer:"为持续交付的团队打造的开源项目。"
+ }
+};
+const select = document.querySelector("#language");
+const supported = Object.keys(copy);
+function setLanguage(language) {
+ const lang = supported.includes(language) ? language : "en";
+ document.documentElement.lang = ({en:"en",pt:"pt-BR",es:"es",ja:"ja",zh:"zh-CN"})[lang];
+ document.querySelectorAll("[data-i18n]").forEach((node) => {
+ const key = node.dataset.i18n;
+ if (copy[lang][key]) node.innerHTML = copy[lang][key];
+ });
+ select.value = lang;
+ try { localStorage.setItem("risk-gate-language", lang); } catch (_) {}
+}
+select.addEventListener("change", () => setLanguage(select.value));
+let saved = null;
+try { saved = localStorage.getItem("risk-gate-language"); } catch (_) {}
+const browser = (navigator.language || "en").toLowerCase();
+const initial = saved && supported.includes(saved) ? saved : browser.startsWith("pt") ? "pt" : browser.startsWith("es") ? "es" : browser.startsWith("ja") ? "ja" : browser.startsWith("zh") ? "zh" : "en";
+setLanguage(initial);
+const copyButton = document.querySelector("#copy-code");
+const toast = document.querySelector("#copy-toast");
+const code = document.querySelector(".code-window code");
+async function copyWorkflow() {
+ try {
+ await navigator.clipboard.writeText(code.innerText);
+ toast.classList.add("show");
+ window.setTimeout(() => toast.classList.remove("show"), 1500);
+ } catch (_) {
+ copyButton.textContent = "⌘C";
+ window.setTimeout(() => copyButton.textContent = copy[select.value].copy, 1200);
+ }
+}
+copyButton.addEventListener("click", copyWorkflow);
+copyButton.addEventListener("keydown", (event) => { if (event.key === "Enter" || event.key === " ") { event.preventDefault(); copyWorkflow(); } });
+if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) document.querySelector(".hero-video").pause();
+
+const observer = new IntersectionObserver((entries) => entries.forEach((entry) => { if (entry.isIntersecting) { entry.target.classList.add("in-view"); observer.unobserve(entry.target); } }), { threshold: 0.15 });
+document.querySelectorAll(".step-card, .team-board, .code-window, .section-heading").forEach((element) => observer.observe(element));
diff --git a/site/assets/risk-gate-hero-poster.jpg b/site/assets/risk-gate-hero-poster.jpg
new file mode 100644
index 0000000..50e817d
Binary files /dev/null and b/site/assets/risk-gate-hero-poster.jpg differ
diff --git a/site/assets/risk-gate-hero.mp4 b/site/assets/risk-gate-hero.mp4
new file mode 100644
index 0000000..30e5638
Binary files /dev/null and b/site/assets/risk-gate-hero.mp4 differ
diff --git a/site/assets/styles.css b/site/assets/styles.css
new file mode 100644
index 0000000..6ed1bb9
--- /dev/null
+++ b/site/assets/styles.css
@@ -0,0 +1,9 @@
+:root{color-scheme:dark;--bg:#101716;--panel:#151e1b;--panel2:#19231f;--line:#26322d;--muted:#94a49c;--white:#f0f2e9;--mint:#c8f07a;--mint2:#91c854;--orange:#f3a26d;--mono:'DM Mono',monospace;--sans:'DM Sans',sans-serif;--display:Manrope,'DM Sans',sans-serif}*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:90px}body{margin:0;background:var(--bg);color:var(--white);font-family:var(--sans);font-size:15px;line-height:1.6;overflow-x:hidden}body:before{content:"";position:absolute;inset:0 0 auto;height:890px;pointer-events:none;background:radial-gradient(ellipse 50% 62% at 80% 14%,rgba(76,113,71,.2),transparent 72%),radial-gradient(ellipse 33% 42% at 14% 44%,rgba(79,120,80,.08),transparent 70%)}.grain{position:fixed;inset:0;z-index:5;pointer-events:none;opacity:.08;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 180 180' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.22'/%3E%3C/svg%3E")}.wrap{width:min(1160px,calc(100% - 56px));margin-inline:auto}.topbar{height:84px;display:flex;align-items:center;justify-content:space-between;position:relative;z-index:10;border-bottom:1px solid rgba(190,212,194,.09)}.brand{display:flex;align-items:center;gap:10px;color:var(--white);font:800 18px var(--display);letter-spacing:-1.1px;text-decoration:none}.brand-light{color:#91a399;font-weight:500}.brand-mark{width:22px;height:22px;display:flex;align-items:flex-end;gap:3px}.brand-mark i{display:block;width:5px;border-radius:4px;background:var(--mint);box-shadow:0 0 12px #c8f07745}.brand-mark i:nth-child(1){height:10px}.brand-mark i:nth-child(2){height:16px}.brand-mark i:nth-child(3){height:21px}.nav-links{display:flex;gap:35px;margin-left:120px}.nav-links a,.nav-actions a{font-size:12px;color:#acb7b1;text-decoration:none;transition:color .2s}.nav-links a:hover,.nav-actions a:hover{color:var(--mint)}.nav-actions{display:flex;align-items:center;gap:19px}#language{background:transparent;border:1px solid #304038;border-radius:5px;color:var(--white);padding:7px 8px;font:11px var(--mono);cursor:pointer}#language option{background:#15201b}.nav-cta{display:flex;align-items:center;gap:8px!important;color:var(--white)!important;padding:10px 13px;border:1px solid #36443b;border-radius:5px}.nav-cta span:last-child{color:var(--mint);font-size:15px}.hero{min-height:680px;padding:115px 0 78px;display:grid;grid-template-columns:.88fr 1.12fr;align-items:center;gap:45px;position:relative}.hero-copy{padding-bottom:18px}.eyebrow{display:flex;align-items:center;gap:10px;color:var(--mint);font:10px var(--mono);letter-spacing:1.35px}.pulse{width:7px;height:7px;background:var(--mint);border-radius:50%;box-shadow:0 0 0 4px #c8f07717;animation:pulse 2.2s infinite}.hero h1,.section h2,.team-copy h2,.quickstart-copy h2{margin:25px 0 21px;font:600 clamp(47px,5.4vw,68px)/1.04 var(--display);letter-spacing:-4.5px}.hero h1 em,.section h2 em,.team-copy h2 em,.quickstart-copy h2 em{font-style:normal;color:var(--mint)}.hero-sub{max-width:438px;color:#a9b5ad;font-size:15px;line-height:1.8}.hero-actions{display:flex;align-items:center;gap:21px;margin-top:31px}.button{display:inline-flex;align-items:center;gap:13px;text-decoration:none;font-size:12px;font-weight:700;transition:transform .2s,background .2s}.button:hover{transform:translateY(-2px)}.button-primary{padding:14px 17px;border-radius:5px;background:var(--mint);color:#101711}.button-primary span:last-child{font-size:15px}.button-quiet{color:#e3e8df}.play-icon{display:grid;place-items:center;width:28px;height:28px;border:1px solid #536058;border-radius:50%;font-size:8px;color:var(--mint);padding-left:2px}.hero-meta{display:flex;gap:20px;margin-top:35px;color:#829188;font:9px var(--mono)}.hero-meta span{display:flex;align-items:center;gap:6px}.meta-dot{width:4px;height:4px;border-radius:50%;background:#6a8570}.hero-visual{position:relative;border:1px solid #35443a;background:linear-gradient(140deg,#1b2620,#111916 71%);border-radius:9px;box-shadow:0 30px 90px #0007,0 0 70px #b5ee6810;transform:perspective(1200px) rotateY(-3deg) rotateX(1deg);animation:float 7s ease-in-out infinite}.visual-top{height:45px;padding:0 16px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #2c3931}.window-dots{display:flex;gap:5px}.window-dots i{width:6px;height:6px;border-radius:50%;background:#536157}.window-dots i:first-child{background:#db8075}.window-dots i:nth-child(2){background:#dcb968}.window-dots i:last-child{background:#79b879}.visual-label{font:9px var(--mono);letter-spacing:1px;color:#839087}.live-tag{font:8px var(--mono);letter-spacing:.8px;color:#9faea3;display:flex;align-items:center;gap:6px}.live-tag b,.code-status i{width:5px;height:5px;border-radius:50%;background:var(--mint);box-shadow:0 0 7px #c8f077}.visual-body{padding:18px 19px 14px}.pr-card{display:flex;align-items:center;gap:10px;padding:11px 12px;border:1px solid #303d34;background:#18221d;border-radius:5px}.pr-icon{display:grid;place-items:center;width:28px;height:28px;border-radius:5px;background:#29392c;color:var(--mint);font-size:18px}.pr-title{font-size:11px;font-weight:700}.pr-caption{display:flex;gap:6px;align-items:center;color:#84928a;font-size:8px;margin-top:2px}.mono{font:8px var(--mono);color:#9eb1a2}.pr-check{margin-left:auto;display:grid;place-items:center;width:20px;height:20px;border-radius:50%;background:#c8f0771e;color:var(--mint);font-size:11px}.flow-line{height:21px;width:1px;background:#475b49;margin-left:26px;position:relative}.flow-line span{position:absolute;top:0;width:4px;height:4px;left:-1.5px;border-radius:50%;background:var(--mint);animation:flow 2.2s ease-in-out infinite}.pipeline{border:1px solid #303d34;border-radius:5px;overflow:hidden}.pipe-step{height:52px;display:flex;align-items:center;gap:9px;padding:0 11px;border-bottom:1px solid #2a352e;position:relative}.pipe-step:last-child{border:0}.step-icon{width:19px;height:19px;display:grid;place-items:center;border-radius:50%;font-size:10px}.done .step-icon{background:#c8f07718;color:var(--mint)}.active .step-icon{background:#f3a26d1c;color:var(--orange)}.spin{animation:spin 2.4s linear infinite;font-size:14px}.pipe-step strong{display:block;font-size:10px;font-weight:600}.pipe-step small{display:block;color:#829087;font-size:8px;margin-top:1px}.step-state,.running,.risk-pill{margin-left:auto;font:8px var(--mono);letter-spacing:.5px}.step-state{color:#91c67b}.running{color:var(--orange)}.risk-pill{color:#ffb685;background:#f3a26d16;border:1px solid #f3a26d38;border-radius:3px;padding:3px 5px}.review-row{margin-top:10px;display:flex;align-items:center;gap:9px;padding:9px 10px;background:#202b24;border-radius:4px}.review-avatars{display:flex;padding-left:3px}.avatar{display:grid;place-items:center;width:20px;height:20px;border-radius:50%;font-size:8px;font-weight:700;border:2px solid #202b24;margin-left:-3px}.avatar-product{background:#8196df;color:white}.avatar-support{background:#c48361;color:white}.review-copy strong{display:block;font-size:9px}.review-copy small{display:block;color:#89978e;font-size:8px}.review-arrow{margin-left:auto;color:#9ab684}.risk-meter{padding:11px 2px 0}.meter-label,.meter-foot{display:flex;justify-content:space-between;font:8px var(--mono);color:#84948b;letter-spacing:.7px}.meter-value{color:var(--orange)}.meter-bars{display:flex;gap:3px;margin:6px 0 3px}.meter-bars i{height:4px;flex:1;border-radius:2px;background:#344238}.meter-bars i:first-child{background:#75ba70}.meter-bars i:nth-child(2){background:#a8c96d}.meter-bars i:nth-child(3){background:#e2c36d}.meter-bars i:nth-child(4){background:#e5a365}.meter-bars i:nth-child(5){background:#f39b6c;box-shadow:0 0 10px #f39b6c70}.meter-foot{font-size:7px;color:#6f7e74}.visual-foot{padding:10px 18px;display:flex;gap:8px;align-items:center;border-top:1px solid #2a352e;color:#aab5ad;font-size:9px}.foot-check{color:var(--mint)}.float-chip{position:absolute;padding:8px 10px;border:1px solid #3c4c40;background:#19231f;border-radius:4px;box-shadow:0 8px 20px #0006;color:#b9c8ba;font:8px var(--mono);letter-spacing:.2px;white-space:nowrap}.float-chip span:first-child{color:var(--mint);padding-right:3px}.chip-one{top:69px;right:-31px;animation:float 5s ease-in-out infinite}.chip-two{bottom:76px;left:-32px;animation:float 5s ease-in-out -2.2s infinite}.hero-scroll{position:absolute;left:0;bottom:28px;display:flex;align-items:center;gap:9px;color:#6e7d74;font:8px var(--mono);letter-spacing:1.2px}.hero-scroll span:first-child{width:1px;height:27px;background:linear-gradient(var(--mint),transparent)}.trust-strip{border-block:1px solid #26322d;background:#131a17}.trust-inner{min-height:77px;display:flex;align-items:center;justify-content:space-between;gap:30px}.trust-inner>span{font:9px var(--mono);letter-spacing:1px;color:#829087;white-space:nowrap}.trust-items{display:flex;gap:37px}.trust-items span{font-size:10px;color:#9eaaa2}.trust-items b{font:9px var(--mono);color:var(--mint);margin-right:5px}.section{padding-top:126px;padding-bottom:110px}.section-heading{display:grid;grid-template-columns:1fr .62fr;align-items:end;gap:30px;margin-bottom:53px}.eyebrow-num{color:#79916e}.section h2,.team-copy h2,.quickstart-copy h2{font-size:47px;letter-spacing:-2.8px;line-height:1.08;margin:20px 0 0}.section-heading>p{max-width:390px;color:#99a69d;font-size:13px;line-height:1.8;margin-bottom:4px}.steps-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}.step-card{padding:17px 17px 22px;background:linear-gradient(145deg,#19221d,#141b18);border:1px solid #2c3931;border-radius:6px;min-width:0;opacity:0;transform:translateY(18px);transition:opacity .7s,transform .7s}.step-card.in-view{opacity:1;transform:none}.step-card:nth-child(2){transition-delay:.13s}.step-card:nth-child(3){transition-delay:.26s}.card-index{font:9px var(--mono);color:#6e7d73;letter-spacing:.9px}.card-index span:first-child{color:#435047;margin:0 5px}.card-art{height:160px;margin:14px 0 20px;border:1px solid #2b382f;border-radius:4px;background:radial-gradient(ellipse at 50% 55%,#28372b,#161e1a 66%);position:relative;overflow:hidden}.step-card h3{font:600 16px var(--display);margin:0 0 7px;letter-spacing:-.4px}.step-card>p{font-size:11px;line-height:1.7;color:#92a097;margin:0}.graph-node{position:absolute;z-index:2;display:grid;place-items:center;width:31px;height:31px;border-radius:50%;background:#203025;border:1px solid #63854f;color:var(--mint);font:9px var(--mono);box-shadow:0 0 18px #b9f07518}.node-a{left:16%;top:44%}.node-b{left:44%;top:25%}.node-c{right:18%;top:43%;background:#302721;border-color:#a4704c;color:#ffb785}.node-d{left:44%;bottom:10%;background:#242c3a;border-color:#5c7095;color:#a8b9f5}.graph-link{position:absolute;height:1px;background:#647a57;transform-origin:left}.link-a{width:66px;left:27%;top:48%;transform:rotate(-24deg)}.link-b{width:72px;left:56%;top:36%;transform:rotate(23deg);background:#a6774a}.link-c{width:67px;left:50%;top:48%;transform:rotate(90deg);background:#637597}.graph-orbit{position:absolute;inset:22% 20%;border:1px dashed #57704d46;border-radius:50%;animation:spin 22s linear infinite}.bars-art{padding:23px 16px}.bar-row{height:24px;display:flex;align-items:center;gap:8px;color:#91a097;font:8px var(--mono)}.bar-row>span{width:28px}.bar-row i{height:5px;width:var(--w);max-width:calc(100% - 78px);border-radius:5px;background:#748f68;animation:grow 1.2s ease-out both}.bar-row b{margin-left:auto;font-size:7px;color:#8b9a8e;font-weight:400}.bar-highlight{color:#d8e3ce}.bar-highlight i{background:var(--mint);box-shadow:0 0 11px #c8f07740}.bar-highlight b{color:var(--mint)}.bar-axis{position:absolute;bottom:12px;left:16px;right:16px;display:flex;justify-content:space-between;padding-top:6px;border-top:1px solid #344138;color:#627067;font:7px var(--mono);letter-spacing:.7px}.gate-track{position:absolute;left:21px;right:21px;top:68px;height:1px;background:#536a4f}.gate-track i{position:absolute;top:-3px;width:7px;height:7px;border-radius:50%;background:var(--mint);box-shadow:0 0 12px #c8f07775}.gate-track i:nth-child(1){left:4%}.gate-track i:nth-child(2){left:50%}.gate-track i:nth-child(3){right:4%}.gate-track span{position:absolute;left:4%;top:-1px;height:3px;width:0;background:var(--mint);animation:travel 3s ease-in-out infinite}.gate-core{position:absolute;top:48px;left:calc(50% - 21px);width:42px;height:42px;display:grid;place-items:center;border:1px solid #91bb6a;border-radius:50%;background:#243322;color:var(--mint);font-size:16px;box-shadow:0 0 27px #c8f07729}.gate-label{position:absolute;top:86px;font:7px var(--mono);letter-spacing:1px;color:#819086}.gate-left{left:16px}.gate-right{right:16px}.gate-caption{position:absolute;bottom:15px;left:0;right:0;text-align:center;color:#9cba81;font:8px var(--mono);letter-spacing:.9px}.flow-caption{margin-top:27px;display:flex;align-items:center;justify-content:center;gap:15px;color:#78867c;font:8px var(--mono);letter-spacing:1.1px}.flow-rule{width:60px;height:1px;background:#334038}.team-section{padding:105px 0 112px;border-block:1px solid #26322d;background:radial-gradient(ellipse 38% 88% at 79% 54%,#263527 0%,transparent 73%),#131a17;overflow:hidden}.team-layout{display:grid;grid-template-columns:.79fr 1.21fr;gap:76px;align-items:center}.team-copy h2{margin-top:20px;font-size:43px}.team-copy>p{max-width:410px;color:#9ba8a0;font-size:12px;line-height:1.85;margin:21px 0}.text-link{display:inline-flex;align-items:center;gap:12px;padding-bottom:5px;border-bottom:1px solid #768b68;color:var(--mint);font-size:11px;text-decoration:none}.team-board{position:relative;padding:18px 20px 0;border:1px solid #3b4b3e;border-radius:7px;background:linear-gradient(140deg,#202b23,#151d19 75%);box-shadow:0 25px 65px #0005;overflow:hidden;opacity:0;transform:translateY(20px);transition:opacity .7s,transform .7s}.team-board.in-view{opacity:1;transform:none}.board-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:14px;border-bottom:1px solid #344038}.board-tag{display:flex;align-items:center;gap:7px;color:#9ca89f;font:8px var(--mono);letter-spacing:.9px}.board-tag i{width:5px;height:5px;border-radius:50%;background:var(--mint)}.board-id{font:8px var(--mono);color:#627168}.board-change{display:flex;align-items:center;gap:12px;padding:19px 1px 16px}.change-icon{display:grid;place-items:center;width:35px;height:35px;border-radius:5px;background:#2b392c;color:var(--mint);font-size:18px}.board-change>div:nth-child(2){display:grid;gap:2px}.board-change small,.impact-path>span{font:7px var(--mono);letter-spacing:1px;color:#738177}.board-change strong{font-size:12px}.change-path{font:8px var(--mono);color:#8e9c91}.change-risk{margin-left:auto;color:#ffc08e;background:#ed996c16;border:1px solid #ed996c3c;border-radius:3px;padding:4px 7px;font:8px var(--mono)}.impact-path{padding:12px 0 17px;border-top:1px solid #2e3a32}.path-chips{display:flex;align-items:center;gap:7px;margin-top:9px}.path-chips span{background:#29342b;color:#bac7bb;padding:5px 7px;border-radius:3px;font:8px var(--mono)}.path-chips b{color:#77877b;font:9px var(--mono)}.path-chips .path-warn{background:#3b3027;color:#ffbb87}.board-divider{height:1px;background:#2d3931}.team-rows{padding:5px 0}.team-row{display:flex;align-items:center;gap:10px;padding:9px 0}.team-avatar{width:25px;height:25px;border-radius:50%;display:grid;place-items:center;font-size:9px;font-weight:700}.av-eng{background:#c4ea7c;color:#1c281c}.av-prod{background:#7386c4;color:white}.av-sup{background:#ca9068;color:white}.team-row>div:nth-child(2){display:grid;gap:0}.team-row strong{font-size:9px}.team-row small{color:#85948a;font-size:8px}.team-status{margin-left:auto;display:flex;align-items:center;gap:6px;font:8px var(--mono)}.status-running{color:#e6aa7d}.status-running i{width:5px;height:5px;border-radius:50%;background:var(--orange);animation:pulse 1.8s infinite}.status-ready{color:#9ac87c}.board-footer{margin:0 -20px;padding:11px 20px;border-top:1px solid #2e3a32;background:#19221d;color:#819087;font-size:8px;display:flex;gap:7px;align-items:center}.foot-lock{color:#b3c98b}.board-orbit{position:absolute;border:1px solid #c8f07708;border-radius:50%;pointer-events:none}.orbit-a{width:370px;height:370px;right:-300px;top:20px}.orbit-b{width:270px;height:270px;right:-250px;top:70px}.quickstart-section{padding-top:125px;padding-bottom:117px;display:grid;grid-template-columns:.82fr 1.18fr;gap:75px;align-items:center}.quickstart-copy h2{font-size:45px}.quickstart-copy>p{max-width:355px;color:#9ba8a0;font-size:12px;line-height:1.8;margin:18px 0 24px}.start-note{margin-top:17px;color:#7e8d83;font-size:9px;display:flex;gap:7px;align-items:center}.start-note span:first-child{color:var(--mint)}.code-window{position:relative;border:1px solid #38463c;background:#131a17;border-radius:6px;box-shadow:0 22px 55px #0005;opacity:0;transform:translateY(18px);transition:opacity .7s,transform .7s}.code-window.in-view{opacity:1;transform:none}.code-top{height:43px;padding:0 13px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #2c3830;color:#839087;font:8px var(--mono)}.code-top .window-dots{margin-right:auto}.code-top>span:nth-child(2){margin-left:12px}.code-copy{padding:5px 7px;color:var(--mint);border:1px solid #39483b;border-radius:3px;cursor:pointer}.code-copy:hover{background:#26352a}.code-window pre{margin:0;padding:19px 20px 21px;overflow:auto;color:#c2cec4;font:9px/1.95 var(--mono)}.code-muted{color:#65766b}.code-key{color:#a7cb83}.code-val{color:#e2b785}.code-num{color:#b1a1dc}.code-expr{color:#84bcc2}.code-bottom{height:35px;display:flex;align-items:center;justify-content:space-between;padding:0 14px;border-top:1px solid #2d3931;color:#839087;font:8px var(--mono)}.code-status{display:flex;align-items:center;gap:7px}.code-status i{display:block}.code-lang{color:#718075}.code-toast{position:absolute;right:12px;top:50px;padding:5px 9px;border-radius:3px;background:var(--mint);color:#172017;font-size:9px;opacity:0;transform:translateY(-3px);transition:all .2s;pointer-events:none}.code-toast.show{opacity:1;transform:none}.closing{padding:31px 0 37px;border-top:1px solid #2a362f;border-bottom:1px solid #2a362f;display:flex;align-items:center;gap:19px}.closing-mark{display:flex;gap:3px;align-items:flex-end;height:22px}.closing-mark i{width:4px;border-radius:2px;background:var(--mint)}.closing-mark i:first-child{height:9px}.closing-mark i:nth-child(2){height:15px}.closing-mark i:last-child{height:21px}.closing p{font:600 15px/1.4 var(--display);margin:0;letter-spacing:-.2px}.closing a{margin-left:auto;display:grid;place-items:center;width:34px;height:34px;border:1px solid #445345;border-radius:50%;color:var(--mint);text-decoration:none}.footer{min-height:74px;display:flex;align-items:center;gap:24px;color:#76857b;font-size:9px}.brand-small{font-size:13px}.brand-small .brand-mark{transform:scale(.75);transform-origin:left center;width:18px}.footer>a:nth-of-type(2){color:#a6b1a9;text-decoration:none}.footer-copy{margin-left:auto;font:8px var(--mono)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@keyframes pulse{0%,100%{opacity:1;box-shadow:0 0 0 3px #c8f07715}50%{opacity:.55;box-shadow:0 0 0 7px #c8f07700}}@keyframes float{0%,100%{transform:translateY(0)}50%{transform:translateY(-7px)}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes flow{0%{transform:translateY(0);opacity:0}25%{opacity:1}100%{transform:translateY(18px);opacity:0}}@keyframes grow{from{width:0}to{width:var(--w)}}@keyframes travel{0%{width:0;left:4%}50%{width:46%;left:4%}100%{width:0;left:96%}}@media(max-width:960px){.nav-links{margin-left:0;gap:19px}.hero{grid-template-columns:.9fr 1.1fr;gap:23px;padding-top:95px}.hero h1{font-size:57px}.hero-meta{gap:10px;font-size:8px}.trust-items{gap:18px}.team-layout{gap:40px}.quickstart-section{gap:42px}}@media(max-width:720px){.wrap{width:min(100% - 36px,530px)}.topbar{height:68px}.nav-links{display:none}.nav-actions{gap:10px}.nav-cta{padding:8px 10px}.hero{padding:77px 0 85px;grid-template-columns:1fr;gap:47px}.hero h1{font-size:58px;letter-spacing:-3.4px}.hero-sub{font-size:14px;max-width:500px}.hero-visual{margin-inline:9px;transform:none}.float-chip{font-size:7px}.chip-one{right:-12px}.chip-two{left:-13px}.hero-scroll{bottom:25px}.trust-inner{padding:20px 0;align-items:flex-start;flex-direction:column;gap:17px}.trust-items{display:grid;grid-template-columns:1fr 1fr;gap:12px 18px}.section{padding:82px 0}.section-heading{grid-template-columns:1fr;gap:17px;margin-bottom:32px}.section h2,.team-copy h2,.quickstart-copy h2{font-size:39px;letter-spacing:-2px}.section-heading>p{font-size:12px}.steps-grid{grid-template-columns:1fr;gap:11px}.step-card{padding:16px}.card-art{height:150px}.flow-caption{font-size:7px;gap:8px}.flow-rule{width:21px}.team-section{padding:76px 0}.team-layout{grid-template-columns:1fr;gap:34px}.team-copy>p{font-size:12px}.team-board{padding-inline:14px}.board-footer{margin-inline:-14px;padding-inline:14px}.path-chips{gap:4px}.path-chips span{font-size:7px;padding:5px 4px}.quickstart-section{padding-top:78px;padding-bottom:75px;grid-template-columns:1fr;gap:29px}.quickstart-copy h2{font-size:40px}.code-window pre{padding:16px 12px;font-size:7.1px}.footer{flex-wrap:wrap;gap:13px;padding:17px 0}.footer-copy{width:100%;margin:0}.closing p{font-size:13px}}@media(max-width:390px){.hero h1{font-size:50px}.hero-actions{gap:14px}.button{font-size:10px}.hero-meta{flex-wrap:wrap}.visual-body{padding:14px 12px 11px}.pipe-step{padding-inline:8px;gap:7px}.pipe-step strong{font-size:9px}.pipe-step small{font-size:7px}.risk-pill,.step-state,.running{font-size:7px}.review-copy strong{font-size:8px}.review-copy small{font-size:7px}.board-change strong{font-size:10px}.path-chips{gap:3px}.path-chips span{font-size:6px}.path-chips b{font-size:7px}}@media(prefers-reduced-motion:reduce){*,*::before,*::after{scroll-behavior:auto!important;animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}
+
+/* Hero film: the artwork is a real, locally bundled MP4 with native playback controls. */
+.hero-visual{aspect-ratio:16/9;min-height:0;overflow:visible;background:#111916;transform:none;isolation:isolate}
+.hero-video{position:absolute;inset:0;width:100%;height:100%;border:1px solid #35443a;border-radius:9px;object-fit:cover;background:#101716;box-shadow:0 30px 90px #0007,0 0 70px #b5ee6810}
+.video-top{position:absolute;z-index:2;top:1px;left:1px;right:1px;height:44px;padding:0 15px;display:flex;align-items:center;justify-content:space-between;border-radius:8px 8px 0 0;background:linear-gradient(#111916e8,#11191600);pointer-events:none}
+.video-caption{position:absolute;z-index:2;bottom:1px;left:1px;right:1px;padding:27px 16px 35px;display:flex;align-items:center;gap:8px;border-radius:0 0 8px 8px;background:linear-gradient(#11191600,#111916ed);color:#c3cec5;font-size:9px;pointer-events:none}
+.hero-visual .chip-one{top:18%;right:-23px}.hero-visual .chip-two{bottom:19%;left:-23px}
+@media(max-width:720px){.hero-visual{margin-inline:10px}.hero-visual .chip-one{right:-15px}.hero-visual .chip-two{left:-15px}.video-caption{padding:20px 10px 27px;font-size:8px}}
diff --git a/site/index.html b/site/index.html
new file mode 100644
index 0000000..4ec1977
--- /dev/null
+++ b/site/index.html
@@ -0,0 +1,82 @@
+
+
+
Risk Gate maps what changed to what matters. Then it runs the checks that change deserves, before it reaches production.
+ + +A typo and a payment-flow rewrite should not face the same gate. Risk Gate traces impact through your project, then makes the next step clear.
Connect changed files to modules and dependencies across the full supported project AST.
See the affected paths, risk level, and dependency chain behind every recommendation.
Run configured validations and require approvals in proportion to the risk.
A pull request report gives Engineering evidence to act on, Product a clear view of customer-facing impact, and Support the context to prepare. No one has to decode a green checkmark.
Explore the analysis↗Add a workflow, define your repository's risk map, and let your team tune the gates to fit how you ship.
Get started on GitHub↗# .github/workflows/risk-gate.yml
+name: Risk Gate
+on:
+ pull_request:
+ types: [opened, synchronize, reopened]
+permissions:
+ contents: read
+ pull-requests: read
+ issues: write
+jobs:
+ risk-gate:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - uses: CodeArq-tech/software-risk-gate@v0.1.9
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}Make the risk visible.
Make the next step clear.