<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Contribute on GENIE.AI</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/contribute/</link><description>Recent content in Contribute on GENIE.AI</description><generator>Hugo</generator><language>en</language><atom:link href="https://genie-ai-7e342b.opensource.unicc.org/docs/contribute/index.xml" rel="self" type="application/rss+xml"/><item><title>How to open a MR</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/contribute/how-to-mr/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/contribute/how-to-mr/</guid><description>&lt;h2 id="goal"&gt;Goal&lt;/h2&gt;
&lt;p&gt;Open a merge request (MR) against the upstream &lt;code&gt;un/itu/genie-ai&lt;/code&gt; project on
GitLab that &lt;strong&gt;passes CI on the first push&lt;/strong&gt; and lands within a single review
cycle.&lt;/p&gt;
&lt;h2 id="branch-policy"&gt;Branch policy&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Rule&lt;/th&gt;
 &lt;th&gt;Reason&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;One MR per logical change&lt;/td&gt;
 &lt;td&gt;Easier to revert, easier to bisect&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Branch name: &lt;code&gt;&amp;lt;type&amp;gt;/&amp;lt;scope&amp;gt;-&amp;lt;summary&amp;gt;&lt;/code&gt; (e.g. &lt;code&gt;feat/admin-logs-tags&lt;/code&gt;, &lt;code&gt;fix/mobile-i18n-crash&lt;/code&gt;, &lt;code&gt;docs/clarify-rag-overrides&lt;/code&gt;)&lt;/td&gt;
 &lt;td&gt;Consistent, greppable history&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Base branch: &lt;code&gt;main&lt;/code&gt; for features; &lt;code&gt;release/X.Y&lt;/code&gt; for PATCHes&lt;/td&gt;
 &lt;td&gt;Trunk-based for features; cherry-pick for fixes&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Rebase before review&lt;/td&gt;
 &lt;td&gt;No &lt;code&gt;Merge branch 'main' into ...&lt;/code&gt; noise in the diff&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Squash-merge at landing&lt;/td&gt;
 &lt;td&gt;One commit per MR in &lt;code&gt;main&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Never&lt;/strong&gt; push directly to &lt;code&gt;main&lt;/code&gt; or &lt;code&gt;release/*&lt;/code&gt;. Branch protection rejects
the push.&lt;/p&gt;</description></item><item><title>Repo layout &amp; module map</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/contribute/repo-layout/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/contribute/repo-layout/</guid><description>&lt;h2 id="top-level-layout"&gt;Top-level layout&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;genie-ai/
├── api-gateway-solution/ # Kong configuration scripts
├── components/
│ ├── gov-chat-backend/ # Node.js / Express BFF
│ ├── gov-chat-frontend/ # Vue 3 SPA
│ └── document-repository/# Upload + ClamAV + dataprep proxy
├── configs/ # LLM prompts, OTel collector, Grafana dashboards
├── deploy/
│ └── ansible/ # Production Swarm deploy playbook
├── docs/ # Internal dev docs (NOT published)
├── genie-ai-overlay/ # OPEA Python microservices
│ ├── chatqna/ # Mega-service that orchestrates the RAG DAG
│ ├── retriever/ # ArangoDB hybrid search
│ ├── reranker/ # Cross-encoder reranker wrapper
│ ├── embedding/ # TEI embedding wrapper
│ ├── textgen/ # vLLM text-generation wrapper
│ ├── dataprep/ # Document ingestion + labeling + contextual retrieval
│ ├── core/ # Shared types, protocols, constants
│ ├── tests/ # Pytest suite (mocks comps + ArangoDB)
│ └── contracts/ # In-image contract tests (real vendored comps)
├── mobile/
│ └── genie_ai_mobile/ # Flutter app (Android + iOS)
├── secrets/ # SSL certs (NOT committed)
├── site/ # Hugo + Docsy user-facing docs site
├── tests/ # E2E tests, config validator, log assertions
├── docker-compose.yaml # Single dual-mode compose (compose + swarm)
└── env # Configuration template (committed; cp env .env)
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="components"&gt;Components&lt;/h2&gt;
&lt;h3 id="componentsgov-chat-backend"&gt;&lt;code&gt;components/gov-chat-backend/&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Node.js 22 / Express backend-for-frontend. Owns authentication
delegation to Keycloak, the chat proxy to ChatQnA, the analytics store, and
the admin surface. Tests in &lt;code&gt;__tests__/&lt;/code&gt; (Jest). Uses &lt;code&gt;createApp()&lt;/code&gt; pattern
for supertest isolation.&lt;/p&gt;</description></item><item><title>Dev workflow</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/contribute/dev-workflow/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/contribute/dev-workflow/</guid><description>&lt;h2 id="goal"&gt;Goal&lt;/h2&gt;
&lt;p&gt;Set up a local GENIE.AI dev environment so &lt;strong&gt;lint, test, and a backend hot
reload&lt;/strong&gt; all work.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Tool&lt;/th&gt;
 &lt;th&gt;Version&lt;/th&gt;
 &lt;th&gt;Why&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Node.js&lt;/td&gt;
 &lt;td&gt;22.x&lt;/td&gt;
 &lt;td&gt;Backend, frontend, doc-repo&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;npm&lt;/td&gt;
 &lt;td&gt;10.x&lt;/td&gt;
 &lt;td&gt;Bundled with Node 22&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Python&lt;/td&gt;
 &lt;td&gt;3.11&lt;/td&gt;
 &lt;td&gt;OPEA overlay development&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Docker Engine&lt;/td&gt;
 &lt;td&gt;23+ with Compose v2&lt;/td&gt;
 &lt;td&gt;Dependency stack (ArangoDB, Redis, Keycloak)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Flutter&lt;/td&gt;
 &lt;td&gt;3.10+&lt;/td&gt;
 &lt;td&gt;Mobile dev (optional)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;git&lt;/td&gt;
 &lt;td&gt;2.40+&lt;/td&gt;
 &lt;td&gt;Branch / rebase&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;glab&lt;/td&gt;
 &lt;td&gt;latest&lt;/td&gt;
 &lt;td&gt;GitLab MR / CI&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="backend-componentsgov-chat-backend"&gt;Backend (&lt;code&gt;components/gov-chat-backend/&lt;/code&gt;)&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; components/gov-chat-backend
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run dev &lt;span class="c1"&gt;# nodemon index.js (hot-reloads on save)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="c1"&gt;# full Jest suite&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run test:contract &lt;span class="c1"&gt;# route handlers only&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Lint / format:&lt;/p&gt;</description></item><item><title>Add a new doc to this site</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/contribute/add-a-doc/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/contribute/add-a-doc/</guid><description>&lt;h2 id="goal"&gt;Goal&lt;/h2&gt;
&lt;p&gt;Add a new page to this site &lt;strong&gt;without breaking the sidebar order or the
cross-link audit&lt;/strong&gt;, and have it picked up by the next Hugo build.&lt;/p&gt;
&lt;h2 id="where-docs-live"&gt;Where docs live&lt;/h2&gt;
&lt;p&gt;User-facing docs go under &lt;code&gt;site/content/en/docs/&amp;lt;section&amp;gt;/&amp;lt;slug&amp;gt;.md&lt;/code&gt;. The
15 sections are listed on the &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/"&gt;root landing&lt;/a&gt;:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Section&lt;/th&gt;
 &lt;th&gt;When to add here&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;get-started/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Quickstarts, concepts, glossary, FAQ&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;architecture/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;System design, trust boundaries, OPEA contract&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;core/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Foundational concepts shared across components&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;deploy/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Install recipes (Compose, Swarm, GPU, A40)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;operate/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Day-to-day ops (backup, scaling, updates, troubleshooting)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;observe/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Metrics, logs, traces, dashboards, alerting&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;configure/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Realm, IdP, banners, CORS / CSP, locale whitelist&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;rag-pipeline/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;RAG stages: embedding, retrieval, reranking, generation, translation&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;knowledge-base/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Ingestion, taxonomy, document lifecycle, content quality&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;backend/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;HTTP API contracts&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;frontend/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Vue SPA: auth, chat, sidebar, admin, theming&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mobile/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Flutter app&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;reference/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Canonical tables (env-vars, API, OPEA extensions, glossary)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;contribute/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Repo, workflow, MR, i18n, security triage, style&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;audit/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Internal docs-audit artifacts (weight 999, last section in nav)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Dev-internal docs go under &lt;code&gt;docs/&lt;/code&gt; — they are &lt;strong&gt;not published&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Build and run locally</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/contribute/build-and-run/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/contribute/build-and-run/</guid><description>&lt;p&gt;This guide gets you from a fresh clone to a working local stack across every
GENIE.AI component — frontend, backend, document-repository, mobile, OPEA
microservices, Kong/Nginx. It also covers the daily commands you need while
developing.&lt;/p&gt;
&lt;p&gt;For high-level orientation, see &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/project-overview/"&gt;Project Overview&lt;/a&gt;.
For code layout, see &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/reference/source-tree-analysis/"&gt;Source Tree Analysis&lt;/a&gt;.
For service-to-service contracts, see
&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/integration-architecture/"&gt;Integration Architecture&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;CI/CD pipeline, Ansible deployment, and observability dashboards live
in their own sections.&lt;/strong&gt; This page focuses on local dev. Links at the
bottom of each section point to the canonical home of each topic.&lt;/p&gt;</description></item><item><title>Release process</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/contribute/release-process/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/contribute/release-process/</guid><description>&lt;h2 id="goal"&gt;Goal&lt;/h2&gt;
&lt;p&gt;Cut a release of GENIE.AI — &lt;strong&gt;tag, changelog, publish&lt;/strong&gt; — without breaking
the deploy pipeline or the version-gated docs.&lt;/p&gt;
&lt;h2 id="versioning"&gt;Versioning&lt;/h2&gt;
&lt;p&gt;GENIE.AI follows &lt;a href="https://semver.org/"&gt;Semantic Versioning&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MAJOR&lt;/strong&gt; (&lt;code&gt;vX.0.0&lt;/code&gt;) — breaking changes (API contract change, env-var rename
with no fallback, schema migration).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MINOR&lt;/strong&gt; (&lt;code&gt;v0.X.0&lt;/code&gt;) — new features (new microservice, new admin endpoint,
new language). Backwards-compatible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PATCH&lt;/strong&gt; (&lt;code&gt;v0.0.X&lt;/code&gt;) — bug fixes, security patches, doc improvements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pre-release&lt;/strong&gt; (&lt;code&gt;v0.0.0-alpha.N&lt;/code&gt;, &lt;code&gt;v0.0.0-rc.N&lt;/code&gt;) — opt-in builds.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="standard-release-major--minor"&gt;Standard release (MAJOR / MINOR)&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gather changes since last release.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>i18n contribution</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/contribute/i18n/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/contribute/i18n/</guid><description>&lt;h2 id="goal"&gt;Goal&lt;/h2&gt;
&lt;p&gt;Add or fix a translation in the GENIE.AI web UI, mobile app, or Keycloak
login pages &lt;strong&gt;without breaking the locale whitelist or the no-duplicate-keys
invariant&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="three-translation-surfaces"&gt;Three translation surfaces&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Surface&lt;/th&gt;
 &lt;th&gt;Where&lt;/th&gt;
 &lt;th&gt;File pattern&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Web (Vue 3 SPA)&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;components/gov-chat-frontend/src/i18n/locales/&amp;lt;lang&amp;gt;.js&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;one file per locale&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Mobile (Flutter)&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;mobile/genie_ai_mobile/lib/src/localization/app_en.arb&lt;/code&gt; (source) + Flutter-generated &lt;code&gt;app_localizations_&amp;lt;lang&amp;gt;.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;ARB (English only) + generated Dart&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Keycloak email theme&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;configs/keycloak/themes/genie/email/messages/messages_&amp;lt;lang&amp;gt;.properties&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Java properties&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;

&lt;div class="callout callout-warning"&gt;
&lt;strong&gt;English is the source of truth.&lt;/strong&gt; The &lt;code&gt;nameEN&lt;/code&gt; field of every translatable
resource (service categories, services) is what the RAG pipeline retrieves
against. Do &lt;strong&gt;not&lt;/strong&gt; translate &lt;code&gt;nameEN&lt;/code&gt;.
&lt;/div&gt;
&lt;h2 id="locale-availability-whitelist"&gt;Locale availability (whitelist)&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Surface&lt;/th&gt;
 &lt;th&gt;Knob&lt;/th&gt;
 &lt;th&gt;Default&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Web&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;VUE_APP_AVAILABLE_LOCALES&lt;/code&gt; (comma-separated codes, e.g. &lt;code&gt;en,es&lt;/code&gt;)&lt;/td&gt;
 &lt;td&gt;All locales shipped&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Mobile&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;KeycloakConfig.supportedLocaleCodes&lt;/code&gt; per flavor&lt;/td&gt;
 &lt;td&gt;All locales shipped&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Keycloak&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;KEYCLOAK_SUPPORTED_LOCALES&lt;/code&gt; (JSON array, e.g. &lt;code&gt;[&amp;quot;en&amp;quot;,&amp;quot;es&amp;quot;]&lt;/code&gt;)&lt;/td&gt;
 &lt;td&gt;Curated default&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Setting a whitelist hides locales from the picker but does &lt;strong&gt;not&lt;/strong&gt; delete
the source files.&lt;/p&gt;</description></item><item><title>Security triage (CVE playbook)</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/contribute/security-triage/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/contribute/security-triage/</guid><description>&lt;h2 id="goal"&gt;Goal&lt;/h2&gt;
&lt;p&gt;Triage a CVE finding (container scanning, dependency scanning, or SAST) and
&lt;strong&gt;decide fix vs. dismiss&lt;/strong&gt; with cited evidence.&lt;/p&gt;
&lt;h2 id="triple-source-verification"&gt;Triple-source verification&lt;/h2&gt;
&lt;p&gt;For every distinct CVE, verify with &lt;strong&gt;three independent sources&lt;/strong&gt; before any
decision — a scanner or a single web page is not proof.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Installed == latest candidate.&lt;/strong&gt; Run &lt;code&gt;apt-cache policy &amp;lt;pkg&amp;gt;&lt;/code&gt; inside
the same base image. If the installed version equals the repo candidate,
no package bump helps.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trivy &lt;code&gt;fix[]&lt;/code&gt; empty?&lt;/strong&gt; Extract from the promote-stage
&lt;code&gt;gl-container-scanning-report.json&lt;/code&gt; artifact.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Debian Security Tracker&lt;/strong&gt; (&lt;code&gt;security-tracker.debian.org/tracker/&amp;lt;CVE&amp;gt;&lt;/code&gt;):
&lt;code&gt;vulnerable&lt;/code&gt; / &lt;code&gt;postponed&lt;/code&gt; vs &lt;code&gt;fixed in &amp;lt;version&amp;gt;&lt;/code&gt; per suite (bookworm
vs trixie differ).&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="classification-buckets"&gt;Classification buckets&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Bucket&lt;/th&gt;
 &lt;th&gt;Meaning&lt;/th&gt;
 &lt;th&gt;GitLab reason&lt;/th&gt;
 &lt;th&gt;Action&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;&lt;code&gt;affected-no-fix&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;We ARE affected; no upstream patch exists&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;ACCEPTABLE_RISK&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Dismiss with a comment that says so plainly&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;&lt;code&gt;not_affected&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Package present but unreachable at runtime (e.g. &lt;code&gt;linux-libc-dev&lt;/code&gt; kernel headers — the container uses the host kernel)&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;NOT_APPLICABLE&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Dismiss&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;&lt;code&gt;false_positive&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Scanner misattribution / test-only data&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;FALSE_POSITIVE&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Dismiss&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;&lt;code&gt;fixable&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;A fix exists in the distro repo or an upstream release we can pull&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Fix, do not dismiss&lt;/strong&gt; (base-image bump, &lt;code&gt;apt-get upgrade&lt;/code&gt; layer, dependency bump)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The buckets above are the container-scanning reading. For a &lt;strong&gt;SAST&lt;/strong&gt; finding whose
code ships but whose dangerous path is gated (a vendored dependency compiled into a
binary, behind a config flag the deployment flavors keep off), &lt;code&gt;NOT_APPLICABLE&lt;/code&gt;
would claim the code is unreachable — it is reachable in the dev flavors and in
any build made without the flag. Use &lt;code&gt;MITIGATING_CONTROL&lt;/code&gt; there, and say in the
comment where the code ships, where it is reachable, and which control keeps it
out of the deployment.&lt;/p&gt;</description></item><item><title>Style guide</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/contribute/style-guide/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/contribute/style-guide/</guid><description>&lt;h2 id="language-policy"&gt;Language policy&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;English only&lt;/strong&gt; for all documentation, comments, code, variable names, and
user-facing text. Exceptions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;i18n translation files under &lt;code&gt;components/gov-chat-frontend/src/i18n/locales/*.js&lt;/code&gt;
and &lt;code&gt;mobile/genie_ai_mobile/lib/src/localization/app_*.arb&lt;/code&gt; are intentionally multilingual.&lt;/li&gt;
&lt;li&gt;Translators&amp;rsquo; commit messages may use any language.&lt;/li&gt;
&lt;li&gt;Conversation with the user may be in their preferred language — this is
meta-documentation, not site content.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="voice"&gt;Voice&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Imperative&lt;/strong&gt; for steps (&amp;ldquo;Run &lt;code&gt;npm test&lt;/code&gt;&amp;rdquo;, not &amp;ldquo;You should run the
tests&amp;rdquo;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Active&lt;/strong&gt; voice preferred (&amp;ldquo;the operator scales the service&amp;rdquo;, not &amp;ldquo;the
service is scaled by the operator&amp;rdquo;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Second person&lt;/strong&gt; sparingly (&amp;ldquo;you&amp;rdquo; only when the reader is the subject of
the action).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avoid hype&lt;/strong&gt; (&amp;ldquo;blazing fast&amp;rdquo;, &amp;ldquo;next-gen&amp;rdquo;) — describe what it does and
what it enables.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No emoji&lt;/strong&gt; in technical docs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="headings"&gt;Headings&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Title case&lt;/strong&gt; for H1–H2. Sentence case for H3+.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;One H1 per page&lt;/strong&gt; (Docsy auto-derives from &lt;code&gt;title:&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avoid&lt;/strong&gt; &amp;ldquo;Introduction&amp;rdquo;, &amp;ldquo;Overview&amp;rdquo;, &amp;ldquo;Conclusion&amp;rdquo; — describe what the
section &lt;em&gt;does&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="code-blocks"&gt;Code blocks&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Always include the language tag (&lt;code&gt;bash&lt;/code&gt;, &lt;code&gt;python&lt;/code&gt;, &lt;code&gt;yaml&lt;/code&gt;, &lt;code&gt;json&lt;/code&gt;,
&lt;code&gt;typescript&lt;/code&gt;, &lt;code&gt;vue&lt;/code&gt;, &lt;code&gt;dart&lt;/code&gt;, &lt;code&gt;sql&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;For shell blocks, &lt;strong&gt;always show expected output&lt;/strong&gt; on the next line in a
comment:
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose ps
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# NAME SERVICE STATUS PORTS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# genieai-nginx-1 nginx running (healthy) 0.0.0.0:443-&amp;gt;443/tcp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;Use Docsy shortcodes (&lt;code&gt;{{&amp;lt; callout &amp;gt;}}&lt;/code&gt;, &lt;code&gt;{{&amp;lt; tabs &amp;gt;}}&lt;/code&gt;, &lt;code&gt;{{&amp;lt; cards &amp;gt;}}&lt;/code&gt;)
instead of hand-rolled HTML where possible.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="callouts"&gt;Callouts&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;type=&amp;quot;info&amp;quot;&lt;/code&gt; — prerequisites, neutral context.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;type=&amp;quot;tip&amp;quot;&lt;/code&gt; — non-obvious shortcut.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;type=&amp;quot;warning&amp;quot;&lt;/code&gt; — operationally dangerous trap (do not ignore).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="tables"&gt;Tables&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Use tables for &lt;strong&gt;parallel data&lt;/strong&gt; (env vars, error codes, model names).&lt;/li&gt;
&lt;li&gt;Avoid tables for narrative content — use a list.&lt;/li&gt;
&lt;li&gt;Always include a header row.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="links"&gt;Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Internal links&lt;/strong&gt;: absolute path (&lt;code&gt;/docs/&amp;lt;section&amp;gt;/&amp;lt;slug&amp;gt;/&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-section links&lt;/strong&gt;: prefer the most specific page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;External links&lt;/strong&gt;: full URL with scheme; HTTPS only.&lt;/li&gt;
&lt;li&gt;Never link to a heading anchor in another doc — those drift.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="frontmatter"&gt;Frontmatter&lt;/h2&gt;
&lt;p&gt;See &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/contribute/add-a-doc/"&gt;Add a new doc&lt;/a&gt;. Mandatory fields:&lt;/p&gt;</description></item></channel></rss>