EDDI

Проекты, которые следуют приведенным ниже лучшим практикам, могут добровольно и самостоятельно оценить себя и продемонстрировать, что они получили значок Open Source Security Foundation (OpenSSF).

Не существует набора практик, гарантирующего, что у программного обеспечения никогда не будет недостатков или уязвимостей; даже формальные методы могут не помочь, если спецификации или допущения ошибочны. Также не существует какой-либо практики, которая могла бы гарантировать, что проект будет поддерживать здоровое и хорошо функционирующее сообщество разработчиков. Однако следующие хорошие правила могут помочь улучшить результаты проектов. Например, некоторые правила описывают ревью несколькими участниками перед выпуском, что может помочь найти технические уязвимости, которые было бы сложно найти другим способом, и помочь построить доверие и желание дальнейшего взаимодействия между разработчиками из разных компаний. Чтобы получить значок, нужно выполнить все критерии с ключевыми словами "НЕОБХОДИМО"/"ОБЯЗАН"/"НЕДОПУСТИМО", все критерии со словом "СЛЕДУЕТ" либо должны удовлетворяться, либо должно быть приведено обоснование их невыполнения, и все критерии со словом "ЖЕЛАТЕЛЬНО" могут быть удовлетворены ИЛИ неудовлетворены (желательно, чтобы они были хотя бы рассмотрены). Если вы хотите ввести общий комментарий вместо объяснения, почему текущая ситуация приемлема, начните текст с '//' и пробела. Приветствуется обратная связь через сайт на GitHub в виде issues или pull requests. Существует также список рассылки для общих вопросов.

Мы с удовольствием предоставляем информацию на нескольких языках, однако, если есть какой-либо конфликт или несоответствие между переводами, английская версия является авторитетной.
Если это ваш проект, пожалуйста, покажите свой значок на странице проекта! Статус значка выглядит следующим образом: Уровень значка для проекта 12355 - silver Вот как вставить его:
Вы можете показать свой статус значка, вставив его в файл с разметкой Markdown:
[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/12355/badge)](https://www.bestpractices.dev/projects/12355)
- или HTML:
<a href="https://www.bestpractices.dev/projects/12355"><img src="https://www.bestpractices.dev/projects/12355/badge"></a>


Это критерии уровня Silver. Вы также можете просмотреть критерии уровня Passing или Gold.

Baseline Series: Базовый уровень 1 Базовый Уровень 2 Базовый Уровень 3

        

 Основы 17/17

  • Общая

    Обратите внимание, что другие проекты могут использовать то же имя.

    Multi-agent orchestration middleware that coordinates between users, AI agents (LLMs), and business systems. It provides intelligent routing, conversation management, and API orchestration for building sophisticated AI-powered applications.

    Используйте формат выражения лицензии SPDX; примеры включают «Apache-2.0», «BSD-2-Clause», «BSD-3-Clause», «GPL-2.0+», «LGPL-3.0+», «MIT» и «(BSD-2-Clause OR Ruby)».
    Если используется более одного языка, перечислите их через запятую (пробелы необязательны), и отсортируйте их от наиболее до наименее используемого. Если список длинный, пожалуйста, перечислите по крайней мере три наиболее распространенных. Если языка нет (например, это проект только для документации или только для тестирования), используйте один символ «-» (минус). Для каждого языка используйте общепринятую капитализацию названия, например «JavaScript».
    Common Platform Enumeration (CPE) - это структурированная схема именования для информационных систем, программного обеспечения и пакетов. Она используется в ряде систем и баз данных для отчетов об уязвимостях.
  • Предварительные требования


    Проект ОБЯЗАН получить значок уровня Passing. [achieve_passing]

  • Основная информация на веб-сайте проекта


    В информацию о том, как внести вклад, НЕОБХОДИМО включить требования к приемлемым взносам (например, ссылку на любой требуемый стандарт кодирования). (Требуется URL) [contribution_requirements]
  • Надзор за проектом


    Проекту СЛЕДУЕТ иметь юридический механизм, через который все авторы содержательных взносов в ПО проекта подтверждают, что они имеют законное право на внесение этих взносов. Самый распространенный и легко реализуемый подход для этого заключается в использовании Developer Certificate of Origin (DCO), при котором пользователи добавляют строку "signed-off-by" в свои коммиты, а проект ссылается на веб-сайт DCO. Но этот механизм МОЖЕТ быть реализован и в качестве Лицензионного соглашения с участниками (Contributor License Agreement, CLA) или другого правового механизма. (Требуется URL) [dco]
    DCO является рекомендуемым механизмом, потому что его легко реализовать и отслеживать в исходном коде, а git напрямую поддерживает функцию "signed-off" при помощи "commit -s". Для большей эффективности лучше всего, если проектная документация объясняет, что означает "signed-off" для этого проекта. CLA - это юридическое соглашение, которое определяет условия, на которых произведения умственного труда были лицензированы для организации или проекта. Соглашение о назначении участника (contributor assignment agreement, CAA) является юридическим соглашением, которое передает права на произведения умственного труда другой стороне; проекты не обязаны иметь CAA, поскольку CAA увеличивает риск того, что потенциальные участники не будут вносить свой вклад, особенно если получатель является коммерческой организацией. Лицензии CLA от Apache Software Foundation (лицензия отдельного участника и корпоративное соглашение CLA) являются примерами CLA для проектов, считающих, что риски от такого рода CLA для проекта меньше, чем их преимущества.

    https://github.com/labsai/EDDI/blob/main/CONTRIBUTING.md#licensing-of-contributions

    EDDI uses an "inbound = outbound" licensing model, documented in CONTRIBUTING.md (Section: Licensing of Contributions). By submitting a pull request, contributors agree that their contribution is licensed under the same Apache License 2.0 that covers the project. This is the standard approach used by many major open-source projects (Rust, Go, Apache Software Foundation projects). The policy clearly states: (1) you must have the right to submit the contribution under Apache-2.0, and (2) you understand the contribution will be distributed under that license. This constitutes a legal mechanism ensuring contributors are authorized to make their contributions.



    Проект ОБЯЗАН четко определить и задокументировать модель управления проектом (способ принятия решений, включая ключевые роли). (Требуется URL) [governance]
    Требуется устоявшийся задокументированный способ принятия решений и разрешения споров. В небольших проектах это может быть просто вплоть до «владелец и лидер проекта принимает все окончательные решения». Существуют различные модели управления, включая благосклонное диктаторство и формальную меритократию; более подробно см. Governance models. В проектах успешно используются как централизованные подходы (например, с одним ведущим), так и децентрализованные (например, с групповыми ведущими). Не нужно указывать в сведениях об управлении возможность форка проекта, поскольку это всегда возможно для проектов СПО.

    https://github.com/labsai/EDDI/blob/main/GOVERNANCE.md

    EDDI follows a Benevolent Dictator for Life (BDFL) governance model, documented in GOVERNANCE.md. The project maintainer (Gregor Jarisch / @ginccc, Labs.ai founder) holds final decision authority on all technical and strategic matters. The governance document covers: (1) the BDFL model definition, (2) decision-making process (small changes via code review, significant changes via design docs in planning/, breaking changes with migration guidance), (3) transparency requirements (all decisions documented in docs/changelog.md with rationale), and (4) disagreement resolution process. Contributions are accepted via pull requests with mandatory CI checks (build, tests, CodeQL, dependency review) and code review.



    Проект ОБЯЗАН определить правила поведения и разместить эти правила в стандартном месте. (Требуется URL) [code_of_conduct]
    Проекты могут повысить цивилизованность их сообщества и установить ожидания относительно приемлемого поведения, приняв правила поведения. Это может помочь избежать проблем до их возникновения и сделать проект более привлекательным местом, поощряющим участие. Правила должны быть сосредоточены только на поведении в сообществе или на рабочем месте проекта. Примерами правил поведения являются правила конфликтов на проекте ядра Linux, Contributor Covenant Code of Conduct, Кодекс поведения Debian, Ubuntu Code of Conduct, Правила поведения проекта Fedora, GNOME Code Of Conduct, KDE Community Code of Conduct">, Python Community Code of Conduct, The Ruby Community Conduct Guideline и The Rust Code of Conduct.

    https://github.com/labsai/EDDI/blob/main/CODE_OF_CONDUCT.md

    EDDI adopts the Contributor Covenant Code of Conduct version 2.1, posted at the root of the repository in CODE_OF_CONDUCT.md. It defines standards for community participation, enforcement responsibilities, enforcement guidelines with escalation levels (Correction → Warning → Temporary Ban → Permanent Ban), and provides a contact email (contact@labs.ai) for reporting violations.



    Проект ОБЯЗАН четко определять и публично документировать ключевые роли в проекте и их обязанности, включая любые задачи, которые должны выполнять эти роли. Должно быть ясно, кто имеет какую роль(и), хотя это может быть и не задокументировано соответствующим образом. (Требуется URL) [roles_responsibilities]
    Документация для управления , а также роли и обязанности могут быть в одном месте.

    https://github.com/labsai/EDDI/blob/main/GOVERNANCE.md#roles-and-responsibilities

    Key roles are defined in GOVERNANCE.md (Section: Roles and Responsibilities):

    • Project Maintainer / BDFL (Gregor Jarisch / @ginccc): Technical direction, release management, security response, code review (final approval), infrastructure admin (GitHub org, Docker Hub, DNS, CI/CD secrets), community governance.
    • Contributors: Submit pull requests following CONTRIBUTING.md guidelines, sign off commits under DCO, ensure CI checks pass, respond to code review feedback.
    • Reviewers: CODEOWNERS file (.github/CODEOWNERS) assigns @labsai as default reviewer for all code. Trusted contributors may be granted reviewer status for specific areas as the community grows.
      Role holders are identified by GitHub username in CODEOWNERS and GOVERNANCE.md.


    Проект ОБЯЗАН быть в состоянии продолжать работу с минимальным прерыванием, если какой-либо человек окажется недееспособен или убит. В частности, проект ОБЯЗАН быть в состоянии создавать и закрывать вопросы в трекере, принимать предложенные изменения и выпускать версии программного обеспечения через неделю после подтверждения того, что данный человек недееспособен или убит. Это МОЖЕТ быть реализовано через обеспечение кого-то ещё необходимыми ключами, паролами и законными правами для продолжения проекта. Лица, которые запускают проект СПО, МОГУТ сделать это, оставив ключи в сейфе и завещание, передающее все необходимые юридические права (например, для имен DNS). (Требуется URL) [access_continuity]

    https://github.com/labsai/EDDI/blob/main/GOVERNANCE.md#access-continuity

    EDDI's access continuity plan is documented in GOVERNANCE.md (Section: Access Continuity). The document includes:

    1. Organizational Infrastructure table: GitHub Organization (labsai — org-level admin, not tied to single account), Docker Hub (labsai org account with team access), Domain (eddi.labs.ai — registered under Labs.ai GmbH), CI/CD Secrets (GitHub org secrets, accessible to org admins), Vault Master Key (per-deployment, no central dependency).
    2. Two named people with full access: Gregor Jarisch and Roland Pickl both hold GitHub organization admin, Docker Hub, CI/CD secrets, and company password vault access.
    3. Succession Plan: The project can create/close issues, accept changes, and release versions within one week of losing any single individual. In the event of permanent maintainer unavailability, Labs.ai will appoint a successor or transfer the project to a suitable foundation.


    Проекту СЛЕДУЕТ поддерживать «коэффициент автобуса» 2 или более. (Требуется URL) [bus_factor]
    «Коэффициент автобуса» (или «коэффициент грузовика») - это минимальное количество участников проекта, которые должны внезапно исчезнуть из проекта («попасть под автобус»), чтобы проект заглох из-за отсутствия квалифицированного или компетентного персонала. Инструмент truck-factor может оценить это для проектов на GitHub. Для получения дополнительной информации см. статью Cosentino et al. Assessing the Bus Factor of Git Repositories.

    https://github.com/labsai/EDDI/blob/main/GOVERNANCE.md#bus-factor

    EDDI has a bus factor of 2. Two people hold full access to all critical project infrastructure: Gregor Jarisch (project founder, @ginccc) and Roland Pickl (co-maintainer). Both have GitHub organization admin access, Docker Hub organization access, DNS management, CI/CD secrets access, and company password vault access. Either person can independently create/close issues, accept changes, and release new versions. This is documented in GOVERNANCE.md (Section: Bus Factor).


  • Документация


    Проект ОБЯЗАН иметь задокументированный долгосрочный план (roadmap), описывающий, что проект намеревается, а что не намеревается делать, по крайней мере на ближайший год. (Требуется URL) [documentation_roadmap]
    Проект может не достичь того, что описано в долгосрочном плане, и это нормально. Цель дорожной карты - помочь потенциальным пользователям и участникам понять намеченное направление проекта. Подробности не требуются.

    https://github.com/labsai/EDDI/blob/main/AGENTS.md#3-development-roadmap

    EDDI maintains a comprehensive development roadmap in AGENTS.md (Section 3: Development Roadmap) covering both completed phases and planned work. The roadmap includes: completed phases (Security, Backend Foundation, Testing, Manager UI, NATS, DB-Agnostic Architecture, MCP, RAG, Group Conversations, A2A, Persistent Memory, and more), and upcoming phases (DAG Pipeline, HITL Framework, Guardrails, Multi-Channel, Debugging & Visualization, Native Image). Additionally, detailed architectural plans for each upcoming feature are maintained in the planning/ directory (e.g., memory-architecture-plan.md, guardrails-architecture.md, multi-tenancy-plan.md, native-image-migration.md).



    Проект ОБЯЗАН включать документацию по архитектуре (также называемой высокоуровневым дизайном) ПО, создаваемого проектом. Выберите «неприменимо» (N/A), если проект не создает программное обеспечение. (Требуется URL) [documentation_architecture]
    Архитектура ПО объясняет фундаментальную структуру программы, то есть основные компоненты программы, отношения между ними и ключевые свойства этих компонентов и отношений.

    https://github.com/labsai/EDDI/blob/main/docs/architecture.md

    EDDI's architecture is extensively documented in docs/architecture.md (~1,000 lines). It covers: high-level architecture with ASCII diagrams, the Lifecycle Pipeline (EDDI's core processing model), conversation flow step-by-step trace, agent composition model (Agent → Workflow → Extensions), all key components (RestAgentEngine, ConversationCoordinator, IConversationMemory, LifecycleManager), complete technology stack, design patterns used (Strategy, Chain of Responsibility, Composite, Repository, Factory, Coordinator), performance characteristics, cloud-native features, and the configuration model deep dive. The project philosophy document (docs/project-philosophy.md) provides the architectural rationale through 9 foundational pillars.



    Проект ОБЯЗАН документировать то, что пользователь может и чего он не должен ожидать с точки зрения безопасности от ПО, создаваемого проектом (его «требования безопасности»). (Требуется URL) [documentation_security]
    Это требования безопасности, выполнение которых ожидается от ПО.

    https://github.com/labsai/EDDI/blob/main/docs/security.md

    Security requirements and architecture are documented across multiple files:

    • docs/security.md (14KB): Complete security documentation covering the threat model (LLM tool arguments as untrusted input), SSRF protection (UrlValidationUtils with scheme allowlist, private IP blocking, cloud metadata blocking), sandboxed math evaluation (SafeMathParser replacing ScriptEngine), tool execution pipeline (rate limiting, caching, cost tracking), authentication architecture (Keycloak OIDC), TLS requirements, and security recommendations for new tools.
    • SECURITY.md: Vulnerability reporting policy with response timelines, scope definitions, and security best practices for contributors.
    • docs/project-philosophy.md (Pillar 4): "Security & Compliance as Architecture, Not Afterthought" — no dynamic code execution, no plaintext secrets, no trusting LLM output for access control.
    • docs/secrets-vault.md: Envelope encryption (PBKDF2 + AES-256-GCM) architecture.


    Проект ОБЯЗАН предоставить руководство для быстрого начала работы для новых пользователей, чтобы помочь им быстро что-то сделать, используя ПО, создаваемое проект. (Требуется URL) [documentation_quick_start]
    Идея состоит в том, чтобы показать пользователям, как начать работу и и добиться, чтобы ПО что-то вообще сделало. Потенциальным пользователям это критически важно для начала работы.

    https://github.com/labsai/EDDI/blob/main/docs/getting-started.md

    EDDI provides multiple quick start paths in docs/getting-started.md:

    1. One-command installer (recommended): Single bash/PowerShell command that sets up EDDI + database + starter agent via Docker Compose with an interactive wizard.
    2. Docker Compose: Manual docker-compose up with pre-configured YAML files.
    3. Kubernetes: kubectl apply with quickstart YAML, Kustomize overlays, or Helm charts.
    4. From source: Clone → mvnw compile quarkus:dev with hot-reload.
      Additionally, docs/developer-quickstart.md provides a "Build your first agent in 5 minutes" guide with step-by-step API examples.


    Проект ОБЯЗАН прилагать усилия к тому, чтобы документация соответствовала текущей версии результатов проекта (включая ПО, создаваемое проектом). НЕОБХОДИМО исправлять любые известные дефекты документации, приводящие к ее непоследовательности. Если документация в целом актуальна, но ошибочно включает в себя некоторые более старые данные, которые больше не верны, просто рассматривайте это как дефект, отслеживайте и исправляйте, как обычно. [documentation_current]
    Документация МОЖЕТ включать информацию о различиях или изменениях между версиями программного обеспечения и/или ссылку на более старые версии документации. Смысл этого критерия заключается в том, что прилагаются усилия для обеспечения согласованности документации, а не в том, чтобы документация была идеальной.

    https://docs.labs.ai

    Documentation is actively maintained alongside code changes. All docs are versioned at the current release. The project maintains a comprehensive changelog (docs/changelog.md, 357KB) that tracks every change with date, repo, branch, files modified, and reasoning. Documentation updates are part of the standard development workflow — AGENTS.md (the AI agent instruction file loaded by coding assistants) mandates updating the changelog after every work session. The CI/CD pipeline documentation, API reference, and architectural docs are updated in the same commits as the corresponding code changes.



    НЕОБХОДИМО размещать ссылку на любые свои достижения, включая этот значок передовой практики, на главной странице проекта и/или веб-сайте в течение 48 часов после открытого признания достижения. (Требуется URL) [documentation_achievements]
    Достижением считается любой набор внешних критериев, над выполнением которых проект специально работал, включая некоторые значки. Эта информация не обязательно должна находиться на главной странице веб-сайта проекта. Проект с использованием GitHub может помещать достижения на главную страницу хранилища кода, добавляя их в файл README.

    https://github.com/labsai/EDDI/blob/main/README.md

    The README.md prominently displays achievement badges on line 5, including:

    • OpenSSF Best Practices badge (linking to bestpractices.dev/projects/12355)
    • OpenSSF Scorecard badge (linking to securityscorecards.dev)
    • Codacy code quality badge
    • CI workflow status badge
    • CodeQL security analysis badge
    • Docker Hub pulls badge
      These are displayed immediately after the project banner at the top of the README and are updated within hours of achieving new certifications.

  • Общедоступность и интернационализация


    Проекту (как на сайтах проекта, так и в результатах работы проекта) СЛЕДУЕТ придерживаться передовой практики общедоступности, чтобы люди с ограниченными возможностями могли участвовать в проекте и использовать результаты проекта, где это имеет смысл. [accessibility_best_practices]
    Для веб-приложений см. Руководство по обеспечению доступности веб-контента (WCAG) 2.0 и его поддерживающий документ Understanding WCAG 2.0; см. также W3C accessibility information. Для приложений с графическим интерфейсом рассмотрите использование соответствующих вашему окружению рекомендаций по обеспечению доступности (таких как GNOME, KDE, XFCE, Android, iOS, Mac и Windows (на русском)). Некоторые приложения с текстовым интерфейсом пользователя (например, программы на ncurses) могут сделать некоторые вещи, чтобы сделать себя более доступными (например, параметр `force-arrow-cursor` в `alpine`). Большинство приложений командной строки довольно общедоступны как они есть. Этот критерий часто неприменим, например, для библиотек программ. Вот несколько примеров действий или проблем, которые следует учитывать:
    • Должны предоставляться текстовые альтернативы для любого нетекстового контента, так чтобы его можно изменить на другие необходимые формы, например крупная печать, шрифт Брайля, озвучка текста, символы или упрощенный язык (Understanding WCAG 2.0 guideline 1.1)
    • Цвет не должен использоваться в качестве единственного визуального средства передачи информации, указания на действие, запрос реакции пользователя или выделения визуальных элементов. (WCAG 2.0 guideline 1.4.1)
    • Визуальное представление текста и изображений текста должно иметь контрастность не менее 4,5:1, за исключением большого текста, случайного текста и логотипов (WCAG 2.0 guideline 1.4.3)
    • Все функциональные возможности должны быть доступны с клавиатуры (WCAG guideline 2.1)
    • GUI или веб-проект ДОЛЖНЫ тестировать, по крайней мере, одно средство чтения экрана на целевой платформе(ах) (например, NVDA, Jaws или WindowEyes в Windows; VoiceOver на Mac и iOS; Orca на Linux/BSD; TalkBack на Android). Программы с текстовым интерфейсом пользователя МОГУТ по возможности сокращать переписывание текста на экране, чтобы предотвратить лишнее чтение средствами чтения экрана.

    EDDI addresses accessibility at multiple levels:

    1. Project website (eddi.labs.ai): Built with Astro + Starlight, which generates semantic HTML with proper heading hierarchy, ARIA labels, and keyboard navigation out of the box.
    2. Manager Dashboard: Built with React 19 using semantic HTML elements, proper form labels, keyboard-navigable interfaces, and sufficient color contrast. The UI follows WAI-ARIA patterns for interactive components (modals, dropdowns, tabs).
    3. Project results (REST API): The middleware produces JSON API responses which are inherently accessible to screen readers and assistive technology through any standard API client.
    4. Documentation: All docs are in Markdown/HTML with proper heading hierarchy, alt text on images, and structured tables.
      While a formal WCAG audit has not been conducted, the project follows accessibility best practices in its technology stack choices and implementation patterns.


    Проекту СЛЕДУЕТ интернационализировать создаваемое ПО, чтобы обеспечить легкую локализацию под культуру, регион или язык целевой аудитории. Выберите «неприменимо» (N/A), если интернационализация (i18n) не применяется (например, ПО не генерирует текст, предназначенный для конечных пользователей, и не сортирует текст, читаемый человеком), [internationalization]
    Локализация "относится к адаптации продукта, приложения или содержимого документа для соответствия языковым, культурным и другим требованиям конкретного целевого рынка (языковому стандарту)". Интернационализация - это «проектирование и разработка продукта, приложения или содержимого документа, которые позволяют легкую локализацию под целевые аудитории, различающиеся по культуре, региону или языку». (См. «Локализация по сравнению с интернационализацией» на веб-сайте W3C.) Чтобы ПО соответствовало этому критерию, достаточно лишь интернационализации. Не требуется локализация для другого конкретного языка, так как после того, как программное обеспечение было интернационализировано, другие могут работать над локализацией.

    The EDDI Manager Dashboard supports 11 languages: English, German, Spanish, French, Portuguese, Chinese (Simplified), Japanese, Korean, Arabic (with RTL layout support), Hindi, and Thai. Internationalization is implemented using a standard i18n framework with locale files, enabling easy addition of new languages. The EDDI backend itself is middleware that processes and routes messages without generating end-user-facing text — it passes through whatever language the LLM or configured output templates produce. Date/time formatting respects locale settings.


  • Другое


    Если на сайтах проекта (веб-сайт, хранилище и URL-адреса загрузки) хранятся пароли для аутентификации внешних пользователей, НЕОБХОДИМО хранить пароли как итерированные хеши с отдельной "солью" для каждого пользователя с использованием алгоритма (итерированного) растяжения ключа (например, Argon2id, Bcrypt, Scrypt или PBKDF2). Выберите «неприменимо» (N/A), если сайты проекта не хранят пароли для этой цели. [sites_password_security]
    Примечание: использование GitHub автоматически выполняет этот критерий. Этот критерий применяется только к паролям, используемым для аутентификации внешних пользователей на сайтах проекта (т.н. входящей аутентификации). Если сайты проекта должны подключаться к другим сайтам (т.н. исходящая аутентификация), им может потребоваться хранить аутентифицирующие данные (пароли, ключи) для этой цели как-то иначе (поскольку хранение контрольной суммы для этой цели бесполезно). В данном случае критерий crypto_password_storage применяется к сайтам проекта, по аналогии с критерием sites_https.

    Not applicable. EDDI does not store passwords for authentication of external users. Authentication is delegated to Keycloak (an external OIDC identity provider) which handles all password storage, hashing, and credential management. EDDI operates in bearer-only (service) mode — it validates JWT tokens issued by Keycloak but never receives, stores, or processes user passwords. The Keycloak server uses bcrypt for password hashing by default.


 Управление изменениями 1/1

  • Предыдущие версии


    Проект ОБЯЗАН поддерживать наиболее часто используемые старые версии продукта или предоставлять возможность простого перехода на более новые версии (upgrade path). Если переход затруднен, проект ОБЯЗАН задокументировать порядок обновления (например, изменившиеся интерфейсы и подробные предлагаемые шаги для обновления). [maintenance_or_update]

    https://github.com/labsai/EDDI/blob/main/docs/release-versioning.md

    EDDI follows Semantic Versioning (MAJOR.MINOR.PATCH) as documented in docs/release-versioning.md. Supported versions are documented in SECURITY.md: v6.0.x receives active development, v5.6.x receives security fixes only, versions below 5.6 are end-of-life. Docker images are tagged with specific versions (e.g., labsai/eddi:6.0.1) for pinned deployments. The installer includes an 'eddi update' CLI command for easy upgrades. Major version transitions (5.x → 6.x) are documented with migration guidance. The project maintains backward compatibility for JSON configuration formats stored in MongoDB, ensuring existing agent configurations continue to work after upgrades.


 Отчеты о проблемах 3/3

  • Процесс сообщения об ошибках


    Проект ОБЯЗАН использовать трекер вопросов (issue tracker) для отслеживания отдельных вопросов. [report_tracker]
  • Процесс отчета об уязвимостях


    Проект ОБЯЗАН отмечать автора(-ов) всех отчетов об уязвимостях, разрешенных за последние 12 месяцев, за исключением авторов, которые просят об анонимности. Выберите «неприменимо» (N/A), если в течение последних 12 месяцев не было обнаружено никаких уязвимостей. (Требуется URL) [vulnerability_report_credit]

    https://github.com/labsai/EDDI/blob/main/SECURITY.md

    SECURITY.md explicitly states (line 44): "We will credit you in the security advisory unless you prefer to remain anonymous." No external vulnerability reports have been received and resolved in the last 12 months — all security improvements have been internally identified and addressed. If selecting N/A is preferred, this criterion does not apply as there have been no external vulnerability reports to credit.



    Проект ОБЯЗАН иметь документированный процесс реагирования на отчеты об уязвимостях. (Требуется URL) [vulnerability_response_process]
    Этот критерий тесно связан с критерием vulnerability_report_process, который требует документированного способа для сообщения об уязвимостях. Он также связан с vulnerability_report_response, который требует ответа на отчеты об уязвимостях в течение определенного периода времени.

    https://github.com/labsai/EDDI/blob/main/SECURITY.md

    SECURITY.md documents a complete vulnerability response process:

    1. Reporting channel: security@labs.ai (private email, NOT public GitHub issues)
    2. Required information: Description, reproduction steps, impact assessment, optional suggested fix
    3. Response timeline: Acknowledgment within 48 hours, initial triage within 7 days, status updates every 14 days, fix release based on severity (critical: ASAP, high: 30 days, medium: 90 days)
    4. Coordinated disclosure policy: Private report → acknowledgment → fix development → fix release → security advisory published → reporter may publish
    5. Scope: Clearly defines in-scope (core application, MCP, REST API, auth, Docker images, vault, SSRF protection) and out-of-scope (third-party LLM APIs, user config errors, upstream dependency vulns, social engineering, DoS via normal usage)
    6. Credit: Reporters credited in security advisory unless they request anonymity
      Additionally, an incident response runbook is maintained at docs/incident-response.md covering GDPR 72-hour, CCPA 45-day, and HIPAA 60-day breach notification requirements.

 Качество 19/19

  • Стандарты кодирования


    Проект ОБЯЗАН задать определенные правила стиля кодирования для основных языков, которые он использует, и требовать его соблюдения от предлагаемого кода. (Требуется URL) [coding_standards]
    В большинстве случаев это делается путем ссылки на некоторые существующие руководства по стилю, возможно, с перечислением различий. Эти руководства по стилю могут включать в себя способы повышения удобочитаемости и способы снижения вероятности дефектов (включая уязвимости). Многие языки программирования имеют один или несколько широко используемых руководств по стилю. Примеры руководств по стилю включают Руководство по стилю Google и Стандарты кодирования SEI CERT.

    https://github.com/labsai/EDDI/blob/main/CONTRIBUTING.md#code-style

    EDDI identifies and documents its coding standards in CONTRIBUTING.md (Section: Code Style):

    • Language: Java 25 with modern features (records, sealed classes, pattern matching)
    • Framework: Quarkus + CDI — prefer @Inject over manual instantiation
    • Line length: 120 characters max
    • Checkstyle: Enforced via checkstyle.xml with rules for naming conventions, import hygiene, coding safety checks (EqualsHashCode, StringLiteralEquality, FallThrough), and modifier ordering
    • Formatter: Eclipse-based formatter configuration (eclipse-formatter.xml) with auto-format via 'mvnw formatter:format'
    • Architecture rules: No eval(), no ScriptEngine, no @JsonTypeInfo(use=Id.CLASS), stateless ILifecycleTask implementations, URL validation on all external calls
    • Commit convention: Conventional Commits format (feat/fix/docs/test/refactor/chore/perf/security)


    Проект ОБЯЗАН автоматически применять свой выбранный стиль(и) кодирования, если есть хотя бы один инструмент на СПО, который может сделать это на выбранном языке (языках). [coding_standards_enforced]
    Это МОЖЕТ быть реализовано при помощи инструмента(ов) статического анализа и/или путем пропускания кода через средства переформатирования. Во многих случаях конфигурация инструмента включена в репозиторий проекта (так как разные проекты могут выбирать разные конфигурации). Проекты МОГУТ (и, как правило, будут) допускать исключения стиля; там, где происходят исключения, они ОБЯЗАНЫ быть редки и документированы в соответствующих местах кода, чтобы эти исключения можно было пересматривать и инструменты могли автоматически обрабатывать их в будущем. Примеры таких инструментов включают ESLint (JavaScript) и Rubocop (Ruby).

    https://github.com/labsai/EDDI/blob/main/checkstyle.xml

    EDDI automatically enforces coding standards through multiple FLOSS tools:

    1. Checkstyle (maven-checkstyle-plugin 3.6.0): Runs during the 'validate' phase of every build. Configuration in checkstyle.xml enforces naming conventions (TypeName, MethodName, LocalVariableName, etc.), import hygiene (RedundantImport, UnusedImports), coding safety (EqualsHashCode, StringLiteralEquality, FallThrough, OneStatementPerLine), line length limits (150 chars), and modifier ordering.
    2. Eclipse Formatter (formatter-maven-plugin 2.29.0): Auto-formats Java source files according to eclipse-formatter.xml during builds.
    3. CodeQL: Runs on every push and PR via GitHub Actions (.github/workflows/codeql.yml) with security-extended queries, catching injection vulnerabilities, hardcoded credentials, and insecure patterns.
    4. Maven Enforcer Plugin: Bans specific dependency groups (Jackson 3.x) to prevent accidental introduction of vulnerable transitive dependencies.
    5. Trivy: Filesystem security scan on every CI run, blocking CRITICAL and HIGH severity CVEs.

  • Рабочая система сборки


    Системы сборки для нативных двоичных файлов ОБЯЗАНЫ учитывать соответствующие переменные (среды) для компилятора и компоновщика, переданные им (например, CC, CFLAGS, CXX, CXXFLAGS и LDFLAGS) и передавать их на вызовы компилятора и компоновщика. Система сборки МОЖЕТ расширять их дополнительными флагами; НЕДОПУСТИМО просто заменять предоставленные значения своими. Выберите «неприменимо» (N/A), если нативные двоичные файлы не создаются. [build_standard_variables]
    Должно быть легко включить специальные функции сборки, такие как Address Sanitizer (ASAN), или выполнить рекомендации по упрочнению от дистрибутивов (например, путем простого включения флагов компилятора для этого).

    Not applicable. EDDI is a Java application built with Maven. No native binaries are generated in the standard build process. The project compiles Java source to JVM bytecode, which is platform-independent. The optional GraalVM native-image build is handled by the Quarkus framework's native profile, which correctly passes through environment variables per GraalVM's conventions.



    В системах сборки и установки СЛЕДУЕТ сохранять отладочную информацию, если передаваемые флаги требуют этого (например, не используется «install -s»). Выберите «неприменимо» (N/A), если системы сборки или установки нет (например, для типичных библиотек JavaScript), . [build_preserve_debug]
    Например, установка CFLAGS (C) или CXXFLAGS (C++) должна создавать соответствующую информацию для отладки, если эти языки используются, и ее не следует удалять во время установки. Отладочная информация необходима для поддержки и анализа, а также полезна для того, чтобы определить наличие упрочняющих функций в скомпилированных двоичных файлах.

    Not applicable. EDDI is a Java application. Java bytecode inherently preserves debugging information (line numbers, local variable names) unless explicitly stripped. The Maven compiler configuration includes '-parameters' flag to retain method parameter names at runtime. The JVM provides full stack traces with line numbers by default. Debug information is controlled at runtime via JVM flags (e.g., -g), not at build time.



    НЕДОПУСТИМО, чтобы система сборки ПО, создаваемого проектом, рекурсивно собирала подкаталоги, если в подкаталогах есть кросс-зависимости. Выберите «неприменимо» (N/A), если системы сборки или установки нет (например, типичные библиотеки JavaScript). [build_non_recursive]
    Информация о внутренних зависимостях системы сборки проекта должна быть точной, в противном случае изменения в проекте могут быть включены в сборку неправильно. Неправильные сборки могут привести к дефектам (включая уязвимости). Общей ошибкой в ​​больших системах сборки является использование «рекурсивной сборки» или «рекурсивного make», то есть иерархии подкаталогов, содержащих исходные файлы, где каждый подкаталог собирается независимо. Если только каждый из подкаталогов не является полностью независимым, это ошибка, потому что информация о зависимостях неверна.

    Not applicable. EDDI is a single-module Maven project (one pom.xml at the root). There are no subdirectory modules, no multi-module reactor builds, and therefore no cross-dependencies between subdirectories. All source code lives under a single src/ directory compiled by a single Maven invocation.



    Проект ОБЯЗАН быть в состоянии повторить процесс генерации информации из исходных файлов и получить такой же результат с точностью до бита. Выберите «неприменимо» (N/A), если в проекте не используется сборка (например, языки сценариев, в которых исходный код используется непосредственно вместо компиляции), . [build_repeatable]
    Пользователи GCC и clang могут найти полезной опцию -frandom-seed; в некоторых случаях это может быть разрешено путем задания определенного порядка сортировки. Дополнительные предложения можно найти на сайте Reproducible builds.

    EDDI's build is reproducible within practical limits for a JVM application. The project uses: (1) Maven with a locked dependency tree — all dependency versions are explicitly pinned in pom.xml (no version ranges), and the Quarkus BOM provides transitive dependency alignment. (2) Maven wrapper (mvnw/mvnw.cmd) bundled in the repository ensures the same Maven version across all environments. (3) The CI pipeline (.github/workflows/ci.yml) uses pinned tool versions: Java 25 (OpenJDK distribution), exact GitHub Actions versions pinned by SHA hash. (4) Docker builds use a deterministic Dockerfile with a specific base image. (5) Dependency verification through maven-enforcer-plugin bans unauthorized transitive dependencies. While bit-for-bit identical JARs across different build environments are not guaranteed (due to JVM compilation timestamp non-determinism), the functional output is identical given the same inputs.


  • Система установки


    Проект ОБЯЗАН предоставлять возможность легко установить и удалить ПО, создаваемое проектом, с использованием общепринятых способов. [installation_common]
    Примеры включают использование менеджера пакетов (на уровне системы или языка), «make install/uninstall» (с поддержкой DESTDIR), контейнер в стандартном формате или образ виртуальной машины в стандартном формате. Процесс установки и удаления (например, его упаковка) МОЖЕТ быть реализован третьей стороной, при условии что он построен на СПО.

    https://github.com/labsai/EDDI/blob/main/docs/getting-started.md

    EDDI provides multiple standard installation methods:

    1. One-command installer: 'curl -fsSL .../install.sh | bash' (Linux/macOS) or 'iwr -useb .../install.ps1 | iex' (Windows) — interactive wizard sets up everything via Docker Compose.
    2. Docker: 'docker pull labsai/eddi' + 'docker compose up' — standard Docker conventions.
    3. Kubernetes: kubectl apply with Kustomize overlays or Helm charts ('helm install eddi ./helm/eddi').
    4. Uninstall: 'docker compose down -v' removes all containers and volumes. The installer creates an 'eddi' CLI wrapper with 'eddi update' and uninstall support.
      All methods use widely-adopted conventions (Docker, Helm, kubectl) that operators are already familiar with.


    В системе установки для конечных пользователей НЕОБХОДИМО учитывать стандартные соглашения при выборе места, в которое собранные артефакты записываются при установке. Например, если она устанавливает файлы в системе POSIX, НЕОБХОДИМО учитывать переменную окружения DESTDIR. Если установочной системы или стандартного соглашения нет, выберите «неприменимо» (N/A). [installation_standard_variables]

    Not applicable. EDDI is distributed as a Docker container image (labsai/eddi) and does not install files to end-user filesystems. The container's internal file layout follows standard Quarkus/Java conventions. For Kubernetes deployments, Helm charts and Kustomize overlays follow standard Kubernetes resource naming and namespace conventions.



    Проект ОБЯЗАН предоставить возможность потенциальным разработчикам быстро установить все результаты проекта и поддерживать среду, необходимую для внесения изменений, включая тесты и тестовое окружение. Проект ОБЯЗАН использовать для этого общепринятые соглашения. [installation_development_quick]
    Это МОЖЕТ быть реализовано при помощи сгенерированного контейнера или установочных сценариев. Внешние зависимости обычно устанавливаются путем вызова системных и/или языковых пакетов, как описано в критерии external_dependencies.

    https://github.com/labsai/EDDI/blob/main/CONTRIBUTING.md#development-setup

    Developers can set up a complete development environment in under 5 minutes:

    1. Clone: 'git clone https://github.com/labsai/EDDI.git'
    2. Start MongoDB: 'docker run -d --name mongodb -p 27017:27017 mongo:7' (or let Quarkus Dev Services auto-provision it)
    3. Run: './mvnw compile quarkus:dev' — starts with hot-reload, continuous testing, and Dev UI
      No global tool installation required — Maven wrapper (mvnw) is bundled. IDE setup instructions for IntelliJ IDEA and VS Code are documented. The developer quickstart guide (docs/developer-quickstart.md) includes a full walkthrough of creating and testing an agent via the API.

  • Компоненты, поддерживаемые извне


    Проект ОБЯЗАН перечислять внешние зависимости в машинночитаемом виде. (Требуется URL) [external_dependencies]
    Обычно это делается при помощи инструкций для диспетчера пакетов и/или системы сборки. Обратите внимание, что это помогает реализовать критерий installation_development_quick.

    https://github.com/labsai/EDDI/blob/main/pom.xml

    All external dependencies are declared in pom.xml, the standard Maven Project Object Model format. This is a computer-processable XML format that lists every dependency with groupId, artifactId, version, and scope. The Quarkus BOM (Bill of Materials) manages transitive dependency versions. The project also generates a THIRD-PARTY.txt file listing all runtime dependencies and their licenses via the license-maven-plugin (activated with -Plicense-gen).



    Проекты ОБЯЗАНЫ следить за своими внешними зависимостями или периодически проверять их (включая копии, сделанные для удобства) на предмет известных уязвимостей, а также исправлять уязвимости, которые могут быть использованы, или проверять невозможность их использования. [dependency_monitoring]
    Это можно сделать с помощью средств анализа происхождения/зависимостей, например Dependency-Check от OWASP, Nexus Auditor от Sonatype, Protex от Black Duck , Protecode от Synopsys и Bundler-аудит (для Ruby). Некоторые менеджеры пакетов включают в себя соответствующие механизмы. Допустимо оставлять уязвимость, если ее невозможно использовать, но такой анализ труден, и временами проще просто обновить или исправить эту часть кода.

    https://github.com/labsai/EDDI/blob/main/.github/dependabot.yml

    EDDI monitors external dependencies through multiple mechanisms:

    1. Dependabot (.github/dependabot.yml): Weekly automated dependency update PRs for both Maven dependencies and GitHub Actions versions, with intelligent grouping (Quarkus, LangChain4j, other).
    2. Trivy Security Scan (CI job 'trivy-scan'): Runs aquasecurity/trivy-action on every push, scanning the filesystem for CRITICAL and HIGH severity CVEs with exit-code 1 (fails the build).
    3. GitHub Dependency Review (.github/workflows/dependency-review.yml): Blocks PRs that introduce vulnerable or incompatibly-licensed dependencies.
    4. Maven Enforcer Plugin: Bans known-vulnerable dependency groups (e.g., Jackson 3.x tools.jackson.* namespace blocked due to CVE-2026-29062).
    5. Manual CVE overrides in pom.xml: Dependencies are explicitly overridden when upstream fixes are not yet available (e.g., jinjava pinned to 2.8.3 for CVE-2026-25526, reactor-netty-http pinned to 1.2.8 for CVE-2025-22227).


    Проект ОБЯЗАН:
    1. позволять легко идентифицировать и обновлять повторно используемые компоненты, поддерживаемые извне; или
    2. использовать стандартные компоненты, предоставляемые системой или языком программирования.
    В этом случае, если уязвимость обнаружена в повторно используемом компоненте, будет легко обновить этот компонент. [updateable_reused_components]
    Типичным способом выполнить этот критерий является использование предоставляемых операционной системой и языком программирования систем управления пакетами. Многие свободные программы распространяются с «подсобными библиотеками», которые являются локальными копиями стандартных библиотек (возможно, форков библиотек). Само по себе это нормально. Однако, если программа *должна* использовать эти локальные копии/форки, то обновление «стандартных» библиотек через системное обновление безопасности оставит эти дополнительные копии по-прежнему уязвимыми. Это особенно актуально для облачных систем; если провайдер облака обновляет свои «стандартные» библиотеки, но программа их не собирается использовать, обновления фактически не помогут. См., например, "Chromium: Why it isn't in Fedora yet as a proper package" от Тома Каллавея.

    EDDI uses Maven's standard dependency management which makes updating components straightforward: change the version number in pom.xml, run 'mvnw clean verify' to validate compatibility, and commit. The Quarkus BOM manages the majority of transitive dependencies, so a single version bump updates dozens of aligned libraries. Dependabot automatically proposes version updates weekly via pull requests. No convenience copies of external libraries exist — all dependencies are fetched from Maven Central.



    Проекту СЛЕДУЕТ избегать использования нерекомендуемых (deprecated) или устаревших (obsolete) функций и API в тех случаях, когда альтернативы на СПО доступны в используемом наборе технологий («стек технологий» проекта) и для подавляющего большинства пользователей, поддерживаемых проектом (т.е. так чтобы пользователи могли быстро воспользоваться этой альтернативой). [interfaces_current]

    EDDI actively avoids deprecated APIs:

    • Java 25 (latest): Uses modern language features (records, sealed classes, pattern matching, virtual threads).
    • Quarkus 3.34.3 (latest LTS): Current framework version, actively tracking LTS releases.
    • LangChain4j 1.13.0 (latest): Current LLM integration library.
    • Migration from deprecated APIs is tracked: OGNL was replaced with PathNavigator, Infinispan was replaced with Caffeine, MongoDB async driver was replaced with sync driver, Lombok was removed in favor of native Java records.
    • The project has no Nashorn/Rhino usage in production (only in test scope for calculator validation).

  • Набор автотестов


    НЕОБХОДИМО применять автоматический набор тестов к каждому коммиту в общий репозиторий по крайней мере для одной ветки. Этот набор тестов ОБЯЗАН создавать отчет об успешном или неудачном тестировании. [automated_integration_testing]
    Это требование можно рассматривать как подмножество test_continuous_integration, но сосредоточенное только на тестировании, без требования непрерывной интеграции.

    The CI/CD pipeline (.github/workflows/ci.yml) runs automated tests on every push to main, every pull request, and every tag:

    • Job 'build-and-test': Executes 'mvnw clean verify -DskipITs' — runs all unit tests (~4,900+) with JaCoCo code coverage reporting. Results are uploaded as artifacts.
    • Job 'integration-test': Executes 'mvnw verify -DskipITs=false' — runs integration tests using Testcontainers (Docker-based MongoDB/PostgreSQL) for end-to-end API contract testing (~250+ integration tests).
    • Job 'smoke-test': After Docker build, starts the container image with MongoDB and verifies /q/health/ready and /openapi endpoints respond correctly.
      Test results and coverage reports are uploaded as build artifacts with 14-day retention.


    Проект ОБЯЗАН добавить регрессионные тесты к автоматизированному набору тестов по крайней мере на 50% ошибок, исправленных в течение последних шести месяцев. [regression_tests_added50]

    EDDI's contribution guidelines (CONTRIBUTING.md) explicitly mandate: "Write tests — new features require tests; bug fixes should include a regression test." This policy is enforced through code review on all pull requests. The project maintains 4,900+ unit tests and 250+ integration tests. Recent bug fixes demonstrably include regression tests — for example: UrlValidationUtilsExtendedTest covers SSRF bypass attempts, SlackChannelRouterTest covers routing edge cases, and PostgresAgentUseCaseIT covers database-specific regressions. The CI pipeline must pass before any PR can be merged, ensuring regression tests are validated automatically.



    Проект ОБЯЗАН иметь автоматические тестовые пакеты на СПО, которые обеспечивают покрытие не менее 80% инструкций кода, если есть хотя бы один инструмент на СПО, который может измерять этот критерий на выбранном языке. [test_statement_coverage80]
    Для измерения тестового покрытия существует множество средств на СПО, включая gcov/lcov, Blanket.js, Istanbul и JCov. Обратите внимание, что соответствие этому критерию не является гарантией того, что тестовый пакет является исчерпывающим; вместо этого, несоответствие этому критерию является сильным индикатором плохого набора тестов.

    Statement (instruction) coverage is 80.64% (97,856/121,356), measured by JaCoCo across merged unit + integration test suites. Coverage is enforced in CI via a JaCoCo verify goal with an 80% minimum threshold — builds fail if coverage drops below. See PR with coverage report: https://github.com/labsai/EDDI/pull/427


  • Тестирование новых функций


    Проект ОБЯЗАН иметь формальную задокументированную политику о том, что при добавлении существенной новой функциональности НЕОБХОДИМО добавлять тесты для новой функциональности в набор автоматических тестов. [test_policy_mandated]

    https://github.com/labsai/EDDI/blob/main/CONTRIBUTING.md#pull-request-process

    CONTRIBUTING.md contains a formal written policy requiring tests for new functionality. Under "Pull Request Process → Workflow" (step 3): "Write tests — new features require tests; bug fixes should include a regression test." Under "What the CI Checks," the Build + Tests gate ('mvnw clean verify' with Java 25) is marked as "✅ Yes" (must pass). JaCoCo code coverage is reported on every build. Additionally, AGENTS.md (the AI coding assistant instruction file, which governs all development sessions) mandates: "Each commit must build: Run ./mvnw test before committing. Never commit broken code."



    Проект ОБЯЗАН включать в свои документированные инструкции для предложений об изменениях политику, по которой для существенной новой функциональности должны добавляться тесты. [tests_documented_added]
    Однако даже неформальное правило приемлемо, если тесты добавляются на практике.

    https://github.com/labsai/EDDI/blob/main/CONTRIBUTING.md#pull-request-process

    The documented instructions for change proposals (CONTRIBUTING.md) explicitly include the testing policy:

    1. Pull Request Process step 3: "Write tests — new features require tests; bug fixes should include a regression test"
    2. Pull Request Process step 4: "Run the full build locally: ./mvnw clean verify -DskipITs"
    3. PR Guidelines: "One concern per PR — don't mix refactoring with features"
    4. CI Checks table documents required gates: Build + Tests (✅ must pass), JaCoCo (📊 report), CodeQL (✅ must pass)
      The pull request template (.github/PULL_REQUEST_TEMPLATE.md) also includes a checklist for test verification.

  • Флаги предупреждений


    Проекты ОБЯЗАНЫ быть максимально строгими с предупреждениями в ПО, создаваемом проектом, где это целесообразно. [warnings_strict]
    Некоторые предупреждения не могут быть эффективно задействованы в некоторых проектах. Что необходимо в этом критерии - это доказательства того, что проект стремится включать флаги предупреждений там, где это возможно, чтобы ошибки обнаруживались на ранней стадии.

    EDDI enforces maximally strict warning policies through multiple layers:

    1. Checkstyle (FLOSS static analysis): Runs automatically during the Maven 'validate' phase on every build. The configuration (checkstyle.xml) enforces 20+ rules including naming conventions, import hygiene, coding safety checks (EqualsHashCode, SimplifyBooleanExpression, StringLiteralEquality, FallThrough, OneStatementPerLine, MultipleVariableDeclarations), modifier ordering, line length, and file length limits.

    2. CodeQL (FLOSS semantic analysis): Runs on every push and PR with 'security-extended' query suite, which is the most comprehensive FLOSS security analysis available for Java. It detects injection vulnerabilities, hardcoded credentials, insecure cryptography, and data flow issues.

    3. Trivy (FLOSS vulnerability scanner): Scans the entire filesystem on every CI run with severity filter CRITICAL,HIGH and exit-code 1, meaning the build fails on any high-severity CVE.

    4. Maven Enforcer Plugin: Actively bans known-vulnerable dependency groups (Jackson 3.x) from the dependency tree, preventing silent reintroduction via transitive dependencies.

    5. Java compiler: Configured with '-parameters' flag for maximum runtime reflection metadata. While explicit -Xlint flags are not configured, the Quarkus framework's compiler settings are used which enable standard Java warnings.

    6. JaCoCo coverage gate: The build fails if line coverage drops below 80%, ensuring test coverage cannot regress silently.

    The project treats compiler warnings and static analysis findings as actionable items — recent work sessions specifically addressed CodeQL log-injection warnings, unused imports, and type-safety issues across the codebase.


 Безопасность 13/13

  • Знание безопасной разработки


    Проект ОБЯЗАН реализовывать принципы безопасного дизайна (из критерия «know_secure_design»), где это применимо. Выберите «неприменимо» (N/A), если проект не создает программное обеспечение. [implement_secure_design]
    Например, результаты проекта должны иметь отказоустойчивые значения по умолчанию (доступ по умолчанию должен быть запрещен, а установка проектов по умолчанию должна быть в защищенной конфигурации). Также должно использоваться полное отграничение (любой доступ, который может быть ограничен, должен проверяться на достаточность прав доступа и не иметь обходных путей). Обратите внимание, что в некоторых случаях принципы будут противоречить друг другу, и в этом случае необходимо делать выбор (например, многочисленность механизмов может усложнять дизайн, противореча принципу экономичности/простоты механизма).

    EDDI implements secure design principles as a core architectural pillar (docs/project-philosophy.md, Pillar 4: "Security & Compliance as Architecture, Not Afterthought"):

    1. Defense in depth: Multiple independent security layers — SSRF URL validation, sandboxed expression evaluation, rate-limited tool execution, input validation, TLS encryption, Keycloak authentication, and security headers (X-Content-Type-Options, X-Frame-Options, Content-Security-Policy).

    2. Least privilege: OAuth 2.0 role-based access control (admin/editor/viewer roles via Keycloak). Production conversation endpoints are public; all management APIs require authentication. The SafeHttpClient validates URLs before any outbound request, blocking private IPs, link-local addresses, and cloud metadata endpoints.

    3. No dynamic code execution: This is architecturally enforced — there is no eval(), no ScriptEngine, no reflection-based code execution in production code. Math expressions use a recursive-descent SafeMathParser that recognizes only numeric literals and a fixed function allowlist. Custom logic runs in external MCP servers outside the EDDI security perimeter.

    4. Secure defaults: Authentication enforcement is checked at startup (AuthStartupGuard fails startup if OIDC is disabled in production without explicit opt-out). Secrets are envelope-encrypted (PBKDF2 + AES-256-GCM) by default. Agent exports automatically scrub secrets. Tool rate limiting and cost tracking are enabled by default.

    5. Fail securely: The ConversationCoordinator ensures sequential processing per conversation to prevent race conditions. Queue capacity exhaustion returns HTTP 429 (not 500). Failed pipeline task output is marked as uncommitted (hidden from LLM context) via the Memory Policy commit flags system.

    6. Input validation (allowlist): UrlValidationUtils validates all URLs against an allowlist of allowed schemes (http/https only), blocks private IP ranges (127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 169.254.0.0/16, fd00::/8, fe80::/10, ::1), and blocks cloud metadata hostnames (169.254.169.254, metadata.google.internal).

    7. Separation of concerns: Secrets are stored separately from configuration via vault references (${eddivault:key-name}). API keys never appear in agent configurations in plaintext.


  • Основы правильного использования криптографии

    Обратите внимание, что некоторое ПО не нуждается в использовании криптографических механизмов.

    В ПО, создаваемом проектом, НЕДОПУСТИМО делать механизмы безопасности по умолчанию зависимыми от криптографических алгоритмов или режимов с известными серьезными слабостями (например, криптографический алгоритм хеширования SHA-1 или режим CBC в SSH). [crypto_weaknesses]
    Проблемы, связанные с режимом CBC в SSH, обсуждаются в описании уязвимости CERT: SSH CBC.

    EDDI's cryptographic mechanisms do not depend on algorithms with known serious weaknesses:

    1. Secrets Vault: Uses AES-256-GCM for data encryption (symmetric, authenticated encryption with associated data). Key derivation uses PBKDF2WithHmacSHA256 with per-deployment random salt and configurable iteration count. Each secret gets a unique Data Encryption Key (DEK) wrapped by a Key Encryption Key (KEK) derived from the master passphrase — envelope encryption pattern.

    2. Audit Ledger: Uses HMAC-SHA256 for tamper-evident audit chain integrity. Each audit entry includes the HMAC of the previous entry, creating a hash chain.

    3. Agent Signing: Uses Ed25519 (Curve25519) for cryptographic agent identity — digital signatures on audit entries.

    4. Password hashing: Delegated to Keycloak, which defaults to bcrypt with configurable work factor.

    5. TLS: Java 25's built-in TLS implementation defaults to TLS 1.3 / TLS 1.2 minimum. No manual cipher suite configuration that could downgrade security.

    No usage of SHA-1 for security purposes, no MD5, no DES, no RC4, no CBC mode in SSH, no ECB mode for encryption. SHA-256 is used for tool caching keys (non-security context) and HMAC chains (security context).



    Проекту СЛЕДУЕТ поддерживать несколько криптографических алгоритмов, чтобы пользователи могли быстро переключиться, если один из них поврежден. Общие симметричные ключевые алгоритмы включают AES, Twofish и Serpent. Общие алгоритмы контрольных сумм (хешей) включают SHA-2 (SHA-224, SHA-256, SHA-384 и SHA-512) и SHA-3. [crypto_algorithm_agility]

    EDDI supports cryptographic algorithm agility at the infrastructure level:

    1. Vault encryption: While AES-256-GCM is the current default, the VaultSaltManager architecture separates key derivation from encryption, allowing algorithm substitution without changing the data model.
    2. TLS: Handled by the JVM's TLS implementation which supports multiple cipher suites including TLS 1.3 suites (TLS_AES_256_GCM_SHA384, TLS_AES_128_GCM_SHA256, TLS_CHACHA20_POLY1305_SHA256) and TLS 1.2 suites. Cipher suite selection is configurable via standard Quarkus/JVM properties.
    3. HMAC: The audit ledger's HMAC algorithm is implemented via Java's Mac class, which supports HmacSHA256, HmacSHA384, HmacSHA512, and others — switchable by configuration.
    4. Agent signing: Ed25519 keys are generated via Java's KeyPairGenerator, which also supports RSA, EC, and other algorithms.


    Проект ОБЯЗАН поддерживать хранение данных для аутентификации (например, паролей и динамических токенов) и закрытых криптографических ключей в файлах, отдельных от остальной информации (например, файлов конфигурации, баз данных и журналов) и позволять пользователям их обновление и замену без перекомпиляции кода. Выберите «неприменимо» (N/A), если проект никогда не работает с данными аутентификации и закрытыми криптографическими ключами. [crypto_credential_agility]

    https://github.com/labsai/EDDI/blob/main/docs/secrets-vault.md

    EDDI enforces strict separation of credentials from other information:

    1. Secrets Vault: All sensitive credentials (API keys, tokens, passwords) are stored in an envelope-encrypted vault separate from configuration. Agent configurations reference secrets via vault references ${eddivault:key-name}) which are resolved at runtime.
    2. Environment variables: Runtime configuration (database URLs, Keycloak endpoints) is externalized via environment variables and .env files, not compiled into the application.
    3. No recompilation needed: All credentials can be updated at runtime — vault entries via REST API, environment variables via container restart, Keycloak credentials via Keycloak admin UI.
    4. Export sanitization: When agents are exported (ZIP or sync), secrets are automatically scrubbed from the export payload. The importing instance must re-provision secrets in its own vault.
    5. CI/CD secrets: GitHub Actions secrets (DOCKER_USERNAME, DOCKER_PASSWORD, REDHAT_API_TOKEN) are stored in GitHub's encrypted secrets store, separate from source code.


    В ПО, создаваемом проектом, СЛЕДУЕТ поддерживать безопасные протоколы для всех сетевых коммуникаций, такие как SSHv2 или новее, TLS1.2 или новее (HTTPS), IPsec, SFTP и SNMPv3. По умолчанию СЛЕДУЕТ отключать небезопасные протоколы, такие как FTP, HTTP, telnet, SSLv3 или более ранние версии, и SSHv1, и разрешать их только в том случае, если пользователь явным образом это задаёт. Если программное обеспечение, созданное проектом, не поддерживает сетевые коммуникации, выберите «неприменимо» (N/A). [crypto_used_network]

    https://github.com/labsai/EDDI/blob/main/docs/security.md#tls-requirements

    EDDI supports and encourages secure protocols for all network communications:

    1. External API calls: All LLM provider integrations (OpenAI, Anthropic, Google, Azure, AWS, etc.) use HTTPS exclusively. UrlValidationUtils blocks non-HTTP/HTTPS schemes (file://, ftp://, gopher://, jar://).
    2. TLS termination: The docs/security.md TLS Requirements section documents both reverse-proxy TLS termination (recommended production pattern) and direct Quarkus TLS configuration via quarkus.http.ssl.* properties.
    3. Database connections: MongoDB and PostgreSQL connection strings support TLS natively. The compliance documentation (docs/hipaa-compliance.md) requires encrypted database connections for regulated deployments.
    4. No insecure protocols enabled by default: HTTP is the only unencrypted protocol available, intended for localhost development or behind a TLS-terminating reverse proxy. FTP, telnet, and other insecure protocols are not supported.


    Если ПО, создаваемое проектом, поддерживает или использует TLS, ему СЛЕДУЕТ поддерживать как минимум версию TLS 1.2. Примечание: предшественник TLS называется SSL. Если программное обеспечение не использует TLS, выберите «неприменимо» (N/A). [crypto_tls12]

    EDDI runs on Java 25, which defaults to TLS 1.3 and supports TLS 1.2 as a minimum. The Quarkus framework (3.34.3) uses the JVM's built-in TLS implementation via Vert.x/Netty, which enforces TLS 1.2+ by default. TLS 1.0 and TLS 1.1 are disabled in modern JVMs. No configuration in the project downgrades the minimum TLS version. For outbound connections to LLM providers, Java's HttpClient defaults to TLS 1.3 with TLS 1.2 fallback.



    В ПО, создаваемом проектом, НЕОБХОДИМО выполнять проверку сертификата TLS по умолчанию при использовании TLS, в том числе в подресурсах. Если программное обеспечение не использует TLS, выберите «неприменимо» (N/A). [crypto_certificate_verification]
    Обратите внимание, что неправильная проверка сертификата TLS является распространенной ошибкой. Для дальнейших сведений см. "The Most Dangerous Code in the World: Validating SSL Certificates in Non-Browser Software" Мартина Георгиева и др. и "Do you trust this application?" Майкла Катанзаро.

    EDDI performs TLS certificate verification by default on all outbound HTTPS connections. Java's built-in HttpClient (used for LLM API calls via langchain4j) and the Vert.x web client (used for HTTP call extensions) both verify server certificates against the JVM's default trust store (cacerts) by default. No 'trustAll', 'disableHostnameVerification', or 'InsecureTrustManagerFactory' configuration exists in the codebase. The SafeHttpClient wrapper adds additional validation (redirect following, URL re-validation) but does not bypass certificate verification.



    В ПО, создаваемом проектом, НЕОБХОДИМО, если поддерживается TLS, выполнять проверку сертификата TLS по умолчанию при использовании TLS, в том числе в подресурсах. Если программное обеспечение не использует TLS, выберите «неприменимо» (N/A). [crypto_verification_private]

    Java's HttpClient and Vert.x web client both complete the TLS handshake (including certificate verification) before sending any HTTP headers or request bodies. This is inherent to the TLS protocol implementation in the JVM — application data (including HTTP headers with cookies, authorization tokens, and other private information) is only transmitted after the TLS connection is established and the server certificate is verified. EDDI does not implement custom TLS handling that could bypass this ordering.


  • Безопасный выпуск


    Проект ОБЯЗАН криптографически подписывать выпуски результатов проекта, предназначенные для широкого использования, и ОБЯЗАН иметь задокументированный процесс, объясняющий пользователям, как они могут получить общедоступные ключи подписи и проверить подпись(и) выпусков. НЕДОПУСТИМО размещать закрытый ключ для этих подписей на сайте(сайтах), используемом для прямого распространения ПО для общественности. Выберите «неприменимо» (N/A), если выпуски не предназначены для широкого использования. [signed_releases]
    Результаты проекта включают как исходный код, так и любые сгенерированные результаты, если это применимо (например, исполняемые файлы, пакеты и контейнеры). Сгенерированные результаты МОГУТ быть подписаны отдельно от исходного кода. Подписывание МОЖЕТ быть реализовано как подписанные теги git (с использованием криптографических цифровых подписей). Проекты МОГУТ предоставлять генерируемые результаты отдельно от таких инструментов, как git, но в этих случаях отдельные результаты ОБЯЗАНЫ быть отдельно подписаны.

    All Docker image releases from v6.0.2 onward (April 2026+) are cryptographically signed using Sigstore cosign with keyless OIDC signing in GitHub Actions CI. Signatures are stored as OCI artifacts alongside the image on Docker Hub and recorded in the Rekor public transparency log. No private signing keys exist on the distribution site — signing uses ephemeral certificates issued by Fulcio via GitHub Actions OIDC identity. Users verify with: cosign verify --certificate-oidc-issuer https://token.actions.githubusercontent.com --certificate-identity-regexp https://github.com/labsai/EDDI/.github/workflows/ci.yml labsai/eddi:<tag>. See: https://github.com/labsai/EDDI/blob/main/docs/release-signing.md



    ЖЕЛАТЕЛЬНО, чтобы в системе контроля версий каждый важный тег версии (тег, который является частью основного выпуска, минорной версии или исправляет общедоступные уязвимости) подписывался криптографической подписью и поддавался проверке, как описано в критерииsigned_releases. [version_tags_signed]

    Release process documents that important version tags should be created with git tag -s. From v6.0.2 onward, the primary release integrity guarantee is provided by Sigstore cosign keyless signing of Docker images in CI, which cryptographically binds every release to the specific GitHub Actions workflow that built it. See: https://github.com/labsai/EDDI/blob/main/docs/release-signing.md and https://github.com/labsai/EDDI/blob/main/docs/release-versioning.md#release-signing


  • Другие вопросы безопасности


    В результатах проекта НЕОБХОДИМО проверять любой ввод из потенциально ненадежных источников, чтобы убедиться, что они действительны (*белый список*), и отклонять недействительный ввод, если вообще есть какие-либо ограничения на данные. [input_validation]
    Обратите внимание, что сравнения ввода со списком «плохих форматов» (также известным как *черный список*) обычно недостаточно, потому что злоумышленники часто могут обойти черный список. В частности, числа преобразуются во внутренние форматы, а затем проверяются, находятся ли они между их минимальным и максимальным (включительно), а текстовые строки проверяются, чтобы убедиться, что они являются допустимыми текстовыми шаблонами (например, действительный UTF-8, длина, синтаксис и т. д.). От некоторых данных может требоваться, чтобы они были «хоть чем-нибудь» (например, загрузчик файлов), но такое обычно случается редко.

    https://github.com/labsai/EDDI/blob/main/docs/security.md

    EDDI validates inputs from untrusted sources using allowlist approaches:

    1. URL validation (UrlValidationUtils): All URLs from LLM tool arguments are validated against an allowlist of permitted schemes (http, https only), with blocklists for private IP ranges, cloud metadata endpoints, and internal hostnames. Validation occurs BEFORE any network request.
    2. Math expression evaluation (SafeMathParser): A recursive-descent parser that accepts only numeric literals, a fixed set of arithmetic operators, and an allowlisted set of math functions (sqrt, sin, cos, etc.). Anything not in the grammar is rejected with a parse error.
    3. JSON schema validation: Input configurations are validated against expected schemas.
    4. Path traversal prevention: PathNavigator (replacing OGNL) uses a safe property path traversal mechanism that prevents arbitrary object graph navigation.
    5. OGNL/ScriptEngine elimination: All dynamic expression evaluation engines have been removed from the codebase and replaced with safe alternatives.
    6. Content-Type strict matching: HttpCallExecutor uses strict equals() (not startsWith) for Content-Type checking to prevent type confusion attacks.


    В ПО, создаваемом проектом, СЛЕДУЕТ использовать механизмы упрочнения безопасности (hardening), чтобы дефекты программного обеспечения с меньшей вероятностью приводили к уязвимостям в безопасности. [hardening]
    Механизмы упрочнения могут включать HTTP-заголовки, такие как Content Security Policy (CSP), флаги компилятора для противостояния атакам (например, -fstack-protector) или флаги компилятора, устраняющие неопределенное поведение. Для наших целей политика наименьших привилегий не считается механизмом упрочнения (использовать наименьшие достаточные привилегии важно, но этому посвящён отдельный критерий).

    https://github.com/labsai/EDDI/blob/main/docs/security.md

    EDDI implements multiple hardening mechanisms:

    1. Security headers: X-Content-Type-Options (nosniff), X-Frame-Options (DENY), Content-Security-Policy configured out of the box via Quarkus HTTP filter.
    2. SSRF protection: SafeHttpClient wraps all outbound HTTP calls with URL re-validation after redirects, preventing SSRF via redirect chains.
    3. Rate limiting: Token-bucket rate limiter on all LLM tool calls prevents resource exhaustion.
    4. Cost tracking: Per-conversation and per-tenant budget caps prevent runaway LLM costs.
    5. Queue capacity management: ConversationCoordinator throws RejectedExecutionException (HTTP 429) when queue capacity is exhausted, preventing unbounded resource consumption.
    6. Log injection protection: All user-provided values in log statements are sanitized to prevent log forging.
    7. Dependency banning: Maven Enforcer Plugin blocklists known-vulnerable dependency groups.
    8. Startup guards: AuthStartupGuard fails startup if production runs without authentication. ComplianceStartupChecks warns about missing TLS and database encryption.
    9. No dynamic code execution: Architecturally eliminated — no eval(), no ScriptEngine, no reflection-based execution.
    10. Memory safety: Java provides automatic memory management (garbage collection) and bounds checking, eliminating buffer overflow and use-after-free vulnerabilities.


    Проект ОБЯЗАН предоставить обоснование того, что требования безопасности соблюдаются проектом. В обоснование НЕОБХОДИМО включить: описание модели угроз, четкое указание границ доверия, доказательство того, что использовались принципы безопасного дизайна, и доказательство того, что слабости в безопасности реализации нейтрализованы. (Требуется URL) [assurance_case]
    Обоснованием является «документальное подтверждение, которое дает убедительное и корректное доказательство того, что указанный набор критических заявлений относительно свойств системы адекватно оправдан для данного приложения в данной среде» (перевод выдержки из "Software Assurance Using Structured Assurance Case Models", Thomas Rhodes et al, NIST Interagency Report 7608). Границы доверия - это границы, на которых меняется уровень доверия к данным или выполнению кода, например границы сервера в типичном веб-приложении. В обосновании обычно перечисляются принципы безопасного проектирования (такие как Saltzer and Schroeer) и общие слабости безопасности в реализации (такие как OWASP Top 10 или CWE/SANS Top 25), и показывается, как противодействовать каждой из них. Полезным примером может служить обоснование для BadgeApp. Этот критерий связан с documentation_security, documentation_architecture и implement_secure_design.

    https://github.com/labsai/EDDI/blob/main/docs/security-assurance-case.md

    EDDI provides a comprehensive security assurance case in docs/security-assurance-case.md that addresses:

    1. Trust boundary architecture: 5 clearly defined boundaries with ASCII diagram — Authentication Boundary (Keycloak OIDC, AuthStartupGuard), Application Boundary (REST layer, input validation, rate limiting), Pipeline Sandbox Boundary (ILifecycleTask pipeline, SafeMathParser, PathNavigator, UrlValidationUtils), Persistence Boundary (MongoDB/PostgreSQL, Secrets Vault with envelope encryption, tamper-evident Audit Ledger), External Call Boundary (SafeHttpClient, SSRF guard, redirect re-validation).
    2. Threat model: 8 specific threats with mapped countermeasures — prompt injection → SSRF (UrlValidationUtils + SafeHttpClient), code injection (no eval/ScriptEngine, SafeMathParser), secret exfiltration (envelope encryption, export scrubbing), cross-tenant leakage (data-layer tenant isolation, memory visibility enforcement), log injection (sanitized output, CodeQL CWE-117), supply chain attacks (Dependabot + Trivy + Maven Enforcer + SHA-pinned Actions), authentication bypass (AuthStartupGuard startup check), resource exhaustion (rate limiting + cost tracking + queue capacity limits).
    3. Cryptographic design table: AES-256-GCM (vault), PBKDF2WithHmacSHA256 600K iterations (key derivation), HMAC-SHA256 (audit chain), Ed25519 (agent signing). No weak algorithms (no SHA-1, MD5, DES, RC4, ECB, CBC in security paths).
    4. CWE countermeasure matrix: 10 CWEs mapped to specific implementations (CWE-918, CWE-94, CWE-200, CWE-117, CWE-400, CWE-502, CWE-326, CWE-798, CWE-306, CWE-862).
    5. Compliance alignment: EU AI Act (audit ledger), GDPR (cascading erasure), CCPA (data subject requests), HIPAA (encryption at rest/transit).
    6. Secure development practices: Static analysis (CodeQL security-extended, Trivy, Checkstyle, Maven Enforcer, Dependency Review), testing (2,400+ unit tests, 250+ integration tests, security-specific test suites), CI/CD security (SHA-pinned Actions, Docker Hub org secrets, preflight certification).

 Анализ 2/2

  • Статический анализ кода


    Проект ОБЯЗАН использовать хотя бы один инструмент статического анализа с правилами или подходами для поиска распространенных уязвимостей в анализируемом языке или окружении, если есть хотя бы один инструмент на СПО, который может реализовать этот критерий на выбранном языке. [static_analysis_common_vulnerabilities]
    Инструменты статического анализа, специально предназначенные для поиска распространенных уязвимостей, с большей вероятностью найдут их. Тем не менее, использование любых статических инструментов обычно помогает найти какие-то проблемы, поэтому мы предлагаем, но не требуем этого для получения базового значка.

    https://github.com/labsai/EDDI/blob/main/.github/workflows/ci.yml

    EDDI uses multiple FLOSS static analysis tools that look for common vulnerabilities:

    1. CodeQL (GitHub's semantic code analysis engine, FLOSS): Runs on every push and pull request via .github/workflows/codeql.yml (also embedded in ci.yml as job 'codeql'). Configured with the 'security-extended' query suite — the most comprehensive security analysis pack available for Java. This detects: SQL injection, command injection, path traversal, XSS, hardcoded credentials, insecure cryptography, log injection (CWE-117), SSRF, deserialization vulnerabilities, and data flow analysis for taint tracking. Results are uploaded to GitHub Security tab.

    2. Trivy (Aqua Security, FLOSS): Runs as CI job 'trivy-scan' using aquasecurity/trivy-action. Performs filesystem scanning for known CVEs in dependencies, with CRITICAL and HIGH severity filter and exit-code 1 (build-breaking). Complementary to CodeQL — Trivy focuses on dependency CVEs while CodeQL focuses on source code patterns.

    3. Checkstyle (FLOSS): While primarily a style checker, several rules have security implications: EqualsHashCode prevents subtle equality bugs, StringLiteralEquality prevents == vs .equals() errors, FallThrough prevents accidental switch fallthrough.

    4. GitHub Dependency Review (.github/workflows/dependency-review.yml): Blocks pull requests that introduce dependencies with known vulnerabilities or incompatible licenses.

    Recent actions taken based on static analysis findings: CodeQL log-injection warnings in ConversationCoordinator classes were addressed by sanitizing all user-provided values in log statements. Trivy findings led to explicit CVE override pins in pom.xml (jinjava for CVE-2026-25526, reactor-netty-http for CVE-2025-22227).


  • Динамический анализ кода


    Если ПО, создаваемое проектом, включает ПО, написанное с использованием небезопасного языка (например, C или C++), тогда проект ОБЯЗАН регулярно использовать хотя бы один динамический инструмент (например, фаззер или сканер веб-приложения) в сочетании с механизмом для обнаружения проблем безопасности памяти, таких как перезапись буфера. Выберите «неприменимо» (N/A), если проект не создает ПО, написанное на небезопасном языке. [dynamic_analysis_unsafe]
    Примерами механизмов обнаружения проблем безопасности памяти являются Address Sanitizer (ASAN) (доступен в GCC и LLVM), Memory Sanitizer и valgrind. Другие потенциально используемые инструменты включают Thread Sanitizer и Undefined Behavior Sanitizer. Достаточно широкое использование утверждений (assertions) тоже может быть приемлемо.

    Not applicable. EDDI is written entirely in Java, which is a memory-safe language. Java provides automatic memory management through garbage collection, bounds checking on all array and buffer accesses, and type safety enforcement through the JVM. There is no C, C++, or other memory-unsafe language code in the project. The Java runtime prevents buffer overflows, use-after-free, double-free, and other memory safety vulnerabilities at the language level.



Эти данные доступны по лицензии Community Data License Agreement – Permissive, Version 2.0 (CDLA-Permissive-2.0). Это означает, что получатель данных может распространять данные с изменениями или без них, при условии, что получатель данных предоставляет текст данного соглашения вместе с распространяемыми данными. Пожалуйста, укажите в качестве источника Gregor Jarisch и участников OpenSSF Best Practices badge.

Владелец анкеты на значок проекта: Gregor Jarisch.
2026-04-02 22:12:57 UTC, последнее изменение сделано 2026-04-24 22:05:14 UTC. Последний раз условия для получения значка были выполнены 2026-04-10 23:35:34 UTC.